From fffc43f443ca3bd72ee00cca1aeeb96887235b9d Mon Sep 17 00:00:00 2001 From: Yana De Pauw Date: Tue, 7 Dec 2021 10:14:22 +0100 Subject: [PATCH 001/343] 85451: Add a button to export search results as CSV --- .../search-export-csv.component.html | 7 + .../search-export-csv.component.scss | 4 + .../search-export-csv.component.spec.ts | 179 ++++++++++++++++++ .../search-export-csv.component.ts | 102 ++++++++++ .../search-results.component.html | 3 + src/app/shared/shared.module.ts | 2 + src/assets/i18n/en.json5 | 5 + 7 files changed, 302 insertions(+) create mode 100644 src/app/shared/search/search-export-csv/search-export-csv.component.html create mode 100644 src/app/shared/search/search-export-csv/search-export-csv.component.scss create mode 100644 src/app/shared/search/search-export-csv/search-export-csv.component.spec.ts create mode 100644 src/app/shared/search/search-export-csv/search-export-csv.component.ts diff --git a/src/app/shared/search/search-export-csv/search-export-csv.component.html b/src/app/shared/search/search-export-csv/search-export-csv.component.html new file mode 100644 index 0000000000..7bf8704300 --- /dev/null +++ b/src/app/shared/search/search-export-csv/search-export-csv.component.html @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/src/app/shared/search/search-export-csv/search-export-csv.component.scss b/src/app/shared/search/search-export-csv/search-export-csv.component.scss new file mode 100644 index 0000000000..4b0ab3c44a --- /dev/null +++ b/src/app/shared/search/search-export-csv/search-export-csv.component.scss @@ -0,0 +1,4 @@ +.export-button { + background: var(--ds-admin-sidebar-bg); + border-color: var(--ds-admin-sidebar-bg); +} \ No newline at end of file diff --git a/src/app/shared/search/search-export-csv/search-export-csv.component.spec.ts b/src/app/shared/search/search-export-csv/search-export-csv.component.spec.ts new file mode 100644 index 0000000000..f8dc089c6a --- /dev/null +++ b/src/app/shared/search/search-export-csv/search-export-csv.component.spec.ts @@ -0,0 +1,179 @@ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { of as observableOf } from 'rxjs'; +import { TranslateModule } from '@ngx-translate/core'; +import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; +import { AuthorizationDataService } from '../../../core/data/feature-authorization/authorization-data.service'; +import { SearchExportCsvComponent } from './search-export-csv.component'; +import { ScriptDataService } from '../../../core/data/processes/script-data.service'; +import { createFailedRemoteDataObject$, createSuccessfulRemoteDataObject$ } from '../../remote-data.utils'; +import { Script } from '../../../process-page/scripts/script.model'; +import { Process } from '../../../process-page/processes/process.model'; +import { NotificationsServiceStub } from '../../testing/notifications-service.stub'; +import { NotificationsService } from '../../notifications/notifications.service'; +import { Router } from '@angular/router'; +import { By } from '@angular/platform-browser'; +import { PaginatedSearchOptions } from '../paginated-search-options.model'; +import { SearchFilter } from '../search-filter.model'; +import { getProcessDetailRoute } from '../../../process-page/process-page-routing.paths'; + +describe('SearchExportCsvComponent', () => { + let component: SearchExportCsvComponent; + let fixture: ComponentFixture; + + let scriptDataService: ScriptDataService; + let authorizationDataService: AuthorizationDataService; + let notificationsService; + let router; + + const script = Object.assign(new Script(), {id: 'metadata-export-search', name: 'metadata-export-search'}); + const process = Object.assign(new Process(), {processId: 5, scriptName: 'metadata-export-search'}); + + const searchConfig = new PaginatedSearchOptions({ + configuration: 'test-configuration', + scope: 'test-scope', + query: 'test-query', + filters: [ + new SearchFilter('f.filter1', ['filter1value1,equals', 'filter1value2,equals']), + new SearchFilter('f.filter2', ['filter2value1,contains']) + ] + }); + + function initBeforeEachAsync() { + scriptDataService = jasmine.createSpyObj('scriptDataService', { + findById: createSuccessfulRemoteDataObject$(script), + invoke: createSuccessfulRemoteDataObject$(process) + }); + authorizationDataService = jasmine.createSpyObj('authorizationService', { + isAuthorized: observableOf(true) + }); + + notificationsService = new NotificationsServiceStub(); + + router = jasmine.createSpyObj('authorizationService', ['navigateByUrl']); + TestBed.configureTestingModule({ + declarations: [SearchExportCsvComponent], + imports: [TranslateModule.forRoot(), NgbModule], + providers: [ + {provide: ScriptDataService, useValue: scriptDataService}, + {provide: AuthorizationDataService, useValue: authorizationDataService}, + {provide: NotificationsService, useValue: notificationsService}, + {provide: Router, useValue: router}, + ] + }).compileComponents(); + } + + function initBeforeEach() { + fixture = TestBed.createComponent(SearchExportCsvComponent); + component = fixture.componentInstance; + component.searchConfig = searchConfig; + fixture.detectChanges(); + } + + describe('init', () => { + describe('comp', () => { + beforeEach(waitForAsync(() => { + initBeforeEachAsync(); + })); + beforeEach(() => { + initBeforeEach(); + }); + it('should init the comp', () => { + expect(component).toBeTruthy(); + }); + }); + describe('when the user is an admin and the metadata-export-search script is present ', () => { + beforeEach(waitForAsync(() => { + initBeforeEachAsync(); + })); + beforeEach(() => { + initBeforeEach(); + }); + it('should add the button', () => { + const debugElement = fixture.debugElement.query(By.css('button.export-button')); + expect(debugElement).toBeDefined(); + }); + }); + describe('when the user is not an admin', () => { + beforeEach(waitForAsync(() => { + initBeforeEachAsync(); + (authorizationDataService.isAuthorized as jasmine.Spy).and.returnValue(observableOf(false)); + })); + beforeEach(() => { + initBeforeEach(); + }); + it('should not add the button', () => { + const debugElement = fixture.debugElement.query(By.css('button.export-button')); + expect(debugElement).toBeNull(); + }); + }); + describe('when the metadata-export-search script is not present', () => { + beforeEach(waitForAsync(() => { + initBeforeEachAsync(); + (scriptDataService.findById as jasmine.Spy).and.returnValue(createFailedRemoteDataObject$('Not found', 404)); + })); + beforeEach(() => { + initBeforeEach(); + }); + it('should should not add the button', () => { + const debugElement = fixture.debugElement.query(By.css('button.export-button')); + expect(debugElement).toBeNull(); + }); + }); + }); + describe('export', () => { + beforeEach(waitForAsync(() => { + initBeforeEachAsync(); + })); + beforeEach(() => { + initBeforeEach(); + }); + it('should call the invoke script method with the correct parameters', () => { + component.export(); + expect(scriptDataService.invoke).toHaveBeenCalledWith('metadata-export-search', + [ + {name: '-q', value: searchConfig.query}, + {name: '-s', value: searchConfig.scope}, + {name: '-c', value: searchConfig.configuration}, + {name: '-f', value: 'filter1,equals=filter1value1,filter1value2'}, + {name: '-f', value: 'filter2,contains=filter2value1'}, + ], []); + + component.searchConfig = null; + fixture.detectChanges(); + + component.export(); + expect(scriptDataService.invoke).toHaveBeenCalledWith('metadata-export-search', [], []); + + }); + it('should show a success message when the script was invoked successfully and redirect to the corresponding process page', () => { + component.export(); + + expect(notificationsService.success).toHaveBeenCalled(); + expect(router.navigateByUrl).toHaveBeenCalledWith(getProcessDetailRoute(process.processId)); + }); + it('should show an error message when the script was not invoked successfully and stay on the current page', () => { + (scriptDataService.invoke as jasmine.Spy).and.returnValue(createFailedRemoteDataObject$('Error', 500)); + + component.export(); + + expect(notificationsService.error).toHaveBeenCalled(); + expect(router.navigateByUrl).not.toHaveBeenCalled(); + }); + }); + describe('clicking the button', () => { + beforeEach(waitForAsync(() => { + initBeforeEachAsync(); + })); + beforeEach(() => { + initBeforeEach(); + }); + it('should trigger the export function', () => { + spyOn(component, 'export'); + + const debugElement = fixture.debugElement.query(By.css('button.export-button')); + debugElement.triggerEventHandler('click', null); + + expect(component.export).toHaveBeenCalled(); + }); + }); +}); diff --git a/src/app/shared/search/search-export-csv/search-export-csv.component.ts b/src/app/shared/search/search-export-csv/search-export-csv.component.ts new file mode 100644 index 0000000000..a1bdf1c7e1 --- /dev/null +++ b/src/app/shared/search/search-export-csv/search-export-csv.component.ts @@ -0,0 +1,102 @@ +import { Component, Input, OnInit } from '@angular/core'; +import { PaginatedSearchOptions } from '../paginated-search-options.model'; +import { combineLatest as observableCombineLatest, Observable } from 'rxjs'; +import { ScriptDataService } from '../../../core/data/processes/script-data.service'; +import { getFirstCompletedRemoteData } from '../../../core/shared/operators'; +import { map, tap } from 'rxjs/operators'; +import { FeatureID } from '../../../core/data/feature-authorization/feature-id'; +import { AuthorizationDataService } from '../../../core/data/feature-authorization/authorization-data.service'; +import { hasValue, isNotEmpty } from '../../empty.util'; +import { RemoteData } from '../../../core/data/remote-data'; +import { Process } from '../../../process-page/processes/process.model'; +import { getProcessDetailRoute } from '../../../process-page/process-page-routing.paths'; +import { NotificationsService } from '../../notifications/notifications.service'; +import { TranslateService } from '@ngx-translate/core'; +import { Router } from '@angular/router'; + +@Component({ + selector: 'ds-search-export-csv', + styleUrls: ['./search-export-csv.component.scss'], + templateUrl: './search-export-csv.component.html', +}) +/** + * Display a button to export the current search results as csv + */ +export class SearchExportCsvComponent implements OnInit { + + /** + * The current configuration of the search + */ + @Input() searchConfig: PaginatedSearchOptions; + + /** + * Observable used to determine whether the button should be shown + */ + shouldShowButton$: Observable; + + /** + * The message key used for the tooltip of the button + */ + tooltipMsg = 'metadata-export-search.tooltip'; + + constructor(private scriptDataService: ScriptDataService, + private authorizationDataService: AuthorizationDataService, + private notificationsService: NotificationsService, + private translateService: TranslateService, + private router: Router + ) { + } + + ngOnInit(): void { + const scriptExists$ = this.scriptDataService.findById('metadata-export-search').pipe( + getFirstCompletedRemoteData(), + map((rd) => rd.isSuccess && hasValue(rd.payload)) + ); + + const isAuthorized$ = this.authorizationDataService.isAuthorized(FeatureID.AdministratorOf); + + this.shouldShowButton$ = observableCombineLatest([scriptExists$, isAuthorized$]).pipe( + tap((v) => console.log('showbutton', v)), + map(([scriptExists, isAuthorized]: [boolean, boolean]) => scriptExists && isAuthorized) + ); + } + + /** + * Start the export of the items based on the current search configuration + */ + export() { + const parameters = []; + if (hasValue(this.searchConfig)) { + if (isNotEmpty(this.searchConfig.query)) { + parameters.push({name: '-q', value: this.searchConfig.query}); + } + if (isNotEmpty(this.searchConfig.scope)) { + parameters.push({name: '-s', value: this.searchConfig.scope}); + } + if (isNotEmpty(this.searchConfig.configuration)) { + parameters.push({name: '-c', value: this.searchConfig.configuration}); + } + if (isNotEmpty(this.searchConfig.filters)) { + this.searchConfig.filters.forEach((filter) => { + let operator = 'equals'; + if (hasValue(filter.values)) { + operator = filter.values[0].substring(filter.values[0].indexOf(',') + 1); + } + const filterValue = `${filter.key.substring(2)},${operator}=${filter.values.map((v) => v.substring(0, v.indexOf(','))).join()}`; + parameters.push({name: '-f', value: filterValue}); + }); + } + } + + this.scriptDataService.invoke('metadata-export-search', parameters, []).pipe( + getFirstCompletedRemoteData() + ).subscribe((rd: RemoteData) => { + if (rd.hasSucceeded) { + this.notificationsService.success(this.translateService.get('metadata-export-search.submit.success')); + this.router.navigateByUrl(getProcessDetailRoute(rd.payload.processId)); + } else { + this.notificationsService.error(this.translateService.get('metadata-export-search.submit.error')); + } + }); + } +} diff --git a/src/app/shared/search/search-results/search-results.component.html b/src/app/shared/search/search-results/search-results.component.html index 4e6bca094e..01c63e9c9e 100644 --- a/src/app/shared/search/search-results/search-results.component.html +++ b/src/app/shared/search/search-results/search-results.component.html @@ -1,4 +1,7 @@ +

{{ (configuration ? configuration + '.search.results.head' : 'search.results.head') | translate }}

+ +
Date: Thu, 9 Dec 2021 15:09:46 +0100 Subject: [PATCH 002/343] 85451: Fixed filter syntax --- .../search-export-csv.component.spec.ts | 7 +++++-- .../search-export-csv.component.ts | 20 +++++++++++++------ 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/app/shared/search/search-export-csv/search-export-csv.component.spec.ts b/src/app/shared/search/search-export-csv/search-export-csv.component.spec.ts index f8dc089c6a..cb0d7e6266 100644 --- a/src/app/shared/search/search-export-csv/search-export-csv.component.spec.ts +++ b/src/app/shared/search/search-export-csv/search-export-csv.component.spec.ts @@ -34,7 +34,8 @@ describe('SearchExportCsvComponent', () => { query: 'test-query', filters: [ new SearchFilter('f.filter1', ['filter1value1,equals', 'filter1value2,equals']), - new SearchFilter('f.filter2', ['filter2value1,contains']) + new SearchFilter('f.filter2', ['filter2value1,contains']), + new SearchFilter('f.filter3', ['[2000 TO 2001]'], 'equals') ] }); @@ -134,8 +135,10 @@ describe('SearchExportCsvComponent', () => { {name: '-q', value: searchConfig.query}, {name: '-s', value: searchConfig.scope}, {name: '-c', value: searchConfig.configuration}, - {name: '-f', value: 'filter1,equals=filter1value1,filter1value2'}, + {name: '-f', value: 'filter1,equals=filter1value1'}, + {name: '-f', value: 'filter1,equals=filter1value2'}, {name: '-f', value: 'filter2,contains=filter2value1'}, + {name: '-f', value: 'filter3,equals=[2000 TO 2001]'}, ], []); component.searchConfig = null; diff --git a/src/app/shared/search/search-export-csv/search-export-csv.component.ts b/src/app/shared/search/search-export-csv/search-export-csv.component.ts index a1bdf1c7e1..d499097bd3 100644 --- a/src/app/shared/search/search-export-csv/search-export-csv.component.ts +++ b/src/app/shared/search/search-export-csv/search-export-csv.component.ts @@ -3,7 +3,7 @@ import { PaginatedSearchOptions } from '../paginated-search-options.model'; import { combineLatest as observableCombineLatest, Observable } from 'rxjs'; import { ScriptDataService } from '../../../core/data/processes/script-data.service'; import { getFirstCompletedRemoteData } from '../../../core/shared/operators'; -import { map, tap } from 'rxjs/operators'; +import { map } from 'rxjs/operators'; import { FeatureID } from '../../../core/data/feature-authorization/feature-id'; import { AuthorizationDataService } from '../../../core/data/feature-authorization/authorization-data.service'; import { hasValue, isNotEmpty } from '../../empty.util'; @@ -56,7 +56,6 @@ export class SearchExportCsvComponent implements OnInit { const isAuthorized$ = this.authorizationDataService.isAuthorized(FeatureID.AdministratorOf); this.shouldShowButton$ = observableCombineLatest([scriptExists$, isAuthorized$]).pipe( - tap((v) => console.log('showbutton', v)), map(([scriptExists, isAuthorized]: [boolean, boolean]) => scriptExists && isAuthorized) ); } @@ -78,12 +77,21 @@ export class SearchExportCsvComponent implements OnInit { } if (isNotEmpty(this.searchConfig.filters)) { this.searchConfig.filters.forEach((filter) => { - let operator = 'equals'; if (hasValue(filter.values)) { - operator = filter.values[0].substring(filter.values[0].indexOf(',') + 1); + filter.values.forEach((value) => { + let operator; + let filterValue; + if (hasValue(filter.operator)) { + operator = filter.operator; + filterValue = value; + } else { + operator = value.substring(value.indexOf(',') + 1); + filterValue = value.substring(0, value.indexOf(',')); + } + const valueToAdd = `${filter.key.substring(2)},${operator}=${filterValue}`; + parameters.push({name: '-f', value: valueToAdd}); + }); } - const filterValue = `${filter.key.substring(2)},${operator}=${filter.values.map((v) => v.substring(0, v.indexOf(','))).join()}`; - parameters.push({name: '-f', value: filterValue}); }); } } From b8e9f620b6da41b4bcdd31f565096b58f1779675 Mon Sep 17 00:00:00 2001 From: Luca Giamminonni Date: Fri, 18 Feb 2022 16:40:45 +0100 Subject: [PATCH 003/343] [CST-5249] Migration of OPENAIRE correction service --- ...ations-openaire-events-page.component.html | 1 + ...ons-openaire-events-page.component.spec.ts | 26 + ...ications-openaire-events-page.component.ts | 9 + ...fications-openaire-events-page.resolver.ts | 32 + ...s-openaire-topics-page-resolver.service.ts | 32 + ...ations-openaire-topics-page.component.html | 1 + ...ons-openaire-topics-page.component.spec.ts | 26 + ...ications-openaire-topics-page.component.ts | 9 + .../admin-notifications-routing-paths.ts | 8 + .../admin-notifications-routing.module.ts | 60 + .../admin-notifications.module.ts | 29 + src/app/admin/admin-routing-paths.ts | 5 + src/app/admin/admin-routing.module.ts | 7 +- .../admin-sidebar/admin-sidebar.component.ts | 39 +- src/app/core/core.module.ts | 4 + src/app/core/data/data.service.ts | 49 +- ...openaire-broker-event-rest.service.spec.ts | 246 +++ .../openaire-broker-event-rest.service.ts | 185 ++ ...naire-broker-event-object.resource-type.ts | 9 + .../models/openaire-broker-event.model.ts | 157 ++ ...naire-broker-topic-object.resource-type.ts | 9 + .../models/openaire-broker-topic.model.ts | 58 + ...openaire-broker-topic-rest.service.spec.ts | 127 ++ .../openaire-broker-topic-rest.service.ts | 133 ++ .../openaire-broker-events.component.html | 207 ++ .../openaire-broker-events.component.spec.ts | 332 +++ .../openaire-broker-events.component.ts | 464 +++++ .../openaire-broker-events.scomponent.scss | 21 + .../project-entry-import-modal.component.html | 70 + .../project-entry-import-modal.component.scss | 3 + ...oject-entry-import-modal.component.spec.ts | 210 ++ .../project-entry-import-modal.component.ts | 274 +++ .../topics/openaire-broker-topics.actions.ts | 99 + .../openaire-broker-topics.component.html | 57 + .../openaire-broker-topics.component.scss | 0 .../openaire-broker-topics.component.spec.ts | 152 ++ .../openaire-broker-topics.component.ts | 142 ++ .../topics/openaire-broker-topics.effects.ts | 87 + .../openaire-broker-topics.reducer.spec.ts | 68 + .../topics/openaire-broker-topics.reducer.ts | 72 + .../openaire-broker-topics.service.spec.ts | 67 + .../topics/openaire-broker-topics.service.ts | 55 + .../openaire/openaire-state.service.spec.ts | 275 +++ src/app/openaire/openaire-state.service.ts | 116 ++ src/app/openaire/openaire.effects.ts | 5 + src/app/openaire/openaire.module.ts | 74 + src/app/openaire/openaire.reducer.ts | 16 + src/app/openaire/selectors.ts | 79 + src/app/shared/mocks/openaire.mock.ts | 1796 +++++++++++++++++ .../pagination/pagination.component.html | 6 +- .../shared/pagination/pagination.component.ts | 5 + src/app/shared/selector.util.ts | 27 + src/assets/i18n/en.json5 | 137 ++ 53 files changed, 6165 insertions(+), 12 deletions(-) create mode 100644 src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.html create mode 100644 src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.spec.ts create mode 100644 src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.ts create mode 100644 src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.resolver.ts create mode 100644 src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page-resolver.service.ts create mode 100644 src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.html create mode 100644 src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.spec.ts create mode 100644 src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.ts create mode 100644 src/app/admin/admin-notifications/admin-notifications-routing-paths.ts create mode 100644 src/app/admin/admin-notifications/admin-notifications-routing.module.ts create mode 100644 src/app/admin/admin-notifications/admin-notifications.module.ts create mode 100644 src/app/core/openaire/broker/events/openaire-broker-event-rest.service.spec.ts create mode 100644 src/app/core/openaire/broker/events/openaire-broker-event-rest.service.ts create mode 100644 src/app/core/openaire/broker/models/openaire-broker-event-object.resource-type.ts create mode 100644 src/app/core/openaire/broker/models/openaire-broker-event.model.ts create mode 100644 src/app/core/openaire/broker/models/openaire-broker-topic-object.resource-type.ts create mode 100644 src/app/core/openaire/broker/models/openaire-broker-topic.model.ts create mode 100644 src/app/core/openaire/broker/topics/openaire-broker-topic-rest.service.spec.ts create mode 100644 src/app/core/openaire/broker/topics/openaire-broker-topic-rest.service.ts create mode 100644 src/app/openaire/broker/events/openaire-broker-events.component.html create mode 100644 src/app/openaire/broker/events/openaire-broker-events.component.spec.ts create mode 100644 src/app/openaire/broker/events/openaire-broker-events.component.ts create mode 100644 src/app/openaire/broker/events/openaire-broker-events.scomponent.scss create mode 100644 src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.html create mode 100644 src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.scss create mode 100644 src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.spec.ts create mode 100644 src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.ts create mode 100644 src/app/openaire/broker/topics/openaire-broker-topics.actions.ts create mode 100644 src/app/openaire/broker/topics/openaire-broker-topics.component.html create mode 100644 src/app/openaire/broker/topics/openaire-broker-topics.component.scss create mode 100644 src/app/openaire/broker/topics/openaire-broker-topics.component.spec.ts create mode 100644 src/app/openaire/broker/topics/openaire-broker-topics.component.ts create mode 100644 src/app/openaire/broker/topics/openaire-broker-topics.effects.ts create mode 100644 src/app/openaire/broker/topics/openaire-broker-topics.reducer.spec.ts create mode 100644 src/app/openaire/broker/topics/openaire-broker-topics.reducer.ts create mode 100644 src/app/openaire/broker/topics/openaire-broker-topics.service.spec.ts create mode 100644 src/app/openaire/broker/topics/openaire-broker-topics.service.ts create mode 100644 src/app/openaire/openaire-state.service.spec.ts create mode 100644 src/app/openaire/openaire-state.service.ts create mode 100644 src/app/openaire/openaire.effects.ts create mode 100644 src/app/openaire/openaire.module.ts create mode 100644 src/app/openaire/openaire.reducer.ts create mode 100644 src/app/openaire/selectors.ts create mode 100644 src/app/shared/mocks/openaire.mock.ts create mode 100644 src/app/shared/selector.util.ts diff --git a/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.html b/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.html new file mode 100644 index 0000000000..5c8f8820a0 --- /dev/null +++ b/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.html @@ -0,0 +1 @@ + diff --git a/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.spec.ts b/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.spec.ts new file mode 100644 index 0000000000..ab7a08a695 --- /dev/null +++ b/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.spec.ts @@ -0,0 +1,26 @@ +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { AdminNotificationsOpenaireEventsPageComponent } from './admin-notifications-openaire-events-page.component'; + +describe('AdminNotificationsOpenaireEventsPageComponent', () => { + let component: AdminNotificationsOpenaireEventsPageComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ AdminNotificationsOpenaireEventsPageComponent ], + schemas: [NO_ERRORS_SCHEMA] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AdminNotificationsOpenaireEventsPageComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create AdminNotificationsOpenaireEventsPageComponent', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.ts b/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.ts new file mode 100644 index 0000000000..df7b21dbda --- /dev/null +++ b/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.ts @@ -0,0 +1,9 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'ds-notification-openaire-events-page', + templateUrl: './admin-notifications-openaire-events-page.component.html' +}) +export class AdminNotificationsOpenaireEventsPageComponent { + +} diff --git a/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.resolver.ts b/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.resolver.ts new file mode 100644 index 0000000000..b215013e11 --- /dev/null +++ b/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.resolver.ts @@ -0,0 +1,32 @@ +import { Injectable } from '@angular/core'; +import { Resolve, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; + +/** + * Interface for the route parameters. + */ +export interface AdminNotificationsOpenaireEventsPageParams { + pageId?: string; + pageSize?: number; + currentPage?: number; +} + +/** + * This class represents a resolver that retrieve the route data before the route is activated. + */ +@Injectable() +export class AdminNotificationsOpenaireEventsPageResolver implements Resolve { + + /** + * Method for resolving the parameters in the current route. + * @param {ActivatedRouteSnapshot} route The current ActivatedRouteSnapshot + * @param {RouterStateSnapshot} state The current RouterStateSnapshot + * @returns AdminNotificationsOpenaireEventsPageParams Emits the route parameters + */ + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): AdminNotificationsOpenaireEventsPageParams { + return { + pageId: route.queryParams.pageId, + pageSize: parseInt(route.queryParams.pageSize, 10), + currentPage: parseInt(route.queryParams.page, 10) + }; + } +} diff --git a/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page-resolver.service.ts b/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page-resolver.service.ts new file mode 100644 index 0000000000..f8e02cabbf --- /dev/null +++ b/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page-resolver.service.ts @@ -0,0 +1,32 @@ +import { Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; + +/** + * Interface for the route parameters. + */ +export interface AdminNotificationsOpenaireTopicsPageParams { + pageId?: string; + pageSize?: number; + currentPage?: number; +} + +/** + * This class represents a resolver that retrieve the route data before the route is activated. + */ +@Injectable() +export class AdminNotificationsOpenaireTopicsPageResolver implements Resolve { + + /** + * Method for resolving the parameters in the current route. + * @param {ActivatedRouteSnapshot} route The current ActivatedRouteSnapshot + * @param {RouterStateSnapshot} state The current RouterStateSnapshot + * @returns AdminNotificationsOpenaireTopicsPageParams Emits the route parameters + */ + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): AdminNotificationsOpenaireTopicsPageParams { + return { + pageId: route.queryParams.pageId, + pageSize: parseInt(route.queryParams.pageSize, 10), + currentPage: parseInt(route.queryParams.page, 10) + }; + } +} diff --git a/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.html b/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.html new file mode 100644 index 0000000000..b1616cfe78 --- /dev/null +++ b/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.html @@ -0,0 +1 @@ + diff --git a/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.spec.ts b/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.spec.ts new file mode 100644 index 0000000000..712c7ba2c3 --- /dev/null +++ b/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.spec.ts @@ -0,0 +1,26 @@ +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { AdminNotificationsOpenaireTopicsPageComponent } from './admin-notifications-openaire-topics-page.component'; + +describe('AdminNotificationsOpenaireTopicsPageComponent', () => { + let component: AdminNotificationsOpenaireTopicsPageComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ AdminNotificationsOpenaireTopicsPageComponent ], + schemas: [NO_ERRORS_SCHEMA] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AdminNotificationsOpenaireTopicsPageComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create AdminNotificationsOpenaireTopicsPageComponent', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.ts b/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.ts new file mode 100644 index 0000000000..5bf1832c59 --- /dev/null +++ b/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.ts @@ -0,0 +1,9 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'ds-notification-openairebroker-page', + templateUrl: './admin-notifications-openaire-topics-page.component.html' +}) +export class AdminNotificationsOpenaireTopicsPageComponent { + +} diff --git a/src/app/admin/admin-notifications/admin-notifications-routing-paths.ts b/src/app/admin/admin-notifications/admin-notifications-routing-paths.ts new file mode 100644 index 0000000000..ea7242adcb --- /dev/null +++ b/src/app/admin/admin-notifications/admin-notifications-routing-paths.ts @@ -0,0 +1,8 @@ +import { URLCombiner } from '../../core/url-combiner/url-combiner'; +import { getNotificationsModuleRoute } from '../admin-routing-paths'; + +export const NOTIFICATIONS_EDIT_PATH = 'openaire-broker'; + +export function getNotificationsOpenairebrokerRoute(id: string) { + return new URLCombiner(getNotificationsModuleRoute(), NOTIFICATIONS_EDIT_PATH, id).toString(); +} diff --git a/src/app/admin/admin-notifications/admin-notifications-routing.module.ts b/src/app/admin/admin-notifications/admin-notifications-routing.module.ts new file mode 100644 index 0000000000..2dfa938c4f --- /dev/null +++ b/src/app/admin/admin-notifications/admin-notifications-routing.module.ts @@ -0,0 +1,60 @@ +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; + +import { AuthenticatedGuard } from '../../core/auth/authenticated.guard'; +import { I18nBreadcrumbResolver } from '../../core/breadcrumbs/i18n-breadcrumb.resolver'; +import { I18nBreadcrumbsService } from '../../core/breadcrumbs/i18n-breadcrumbs.service'; +import { NOTIFICATIONS_EDIT_PATH } from './admin-notifications-routing-paths'; +import { AdminNotificationsOpenaireTopicsPageComponent } from './admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component'; +import { AdminNotificationsOpenaireEventsPageComponent } from './admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component'; +import { AdminNotificationsOpenaireTopicsPageResolver } from './admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page-resolver.service'; +import { AdminNotificationsOpenaireEventsPageResolver } from './admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.resolver'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + { + canActivate: [ AuthenticatedGuard ], + path: `${NOTIFICATIONS_EDIT_PATH}`, + component: AdminNotificationsOpenaireTopicsPageComponent, + pathMatch: 'full', + resolve: { + breadcrumb: I18nBreadcrumbResolver, + openaireBrokerTopicsParams: AdminNotificationsOpenaireTopicsPageResolver + }, + data: { + title: 'admin.notifications.openairebroker.page.title', + breadcrumbKey: 'admin.notifications.openairebroker', + showBreadcrumbsFluid: false + } + }, + { + canActivate: [ AuthenticatedGuard ], + path: `${NOTIFICATIONS_EDIT_PATH}/:id`, + component: AdminNotificationsOpenaireEventsPageComponent, + pathMatch: 'full', + resolve: { + breadcrumb: I18nBreadcrumbResolver, + openaireBrokerEventsParams: AdminNotificationsOpenaireEventsPageResolver + }, + data: { + title: 'admin.notifications.openaireevent.page.title', + breadcrumbKey: 'admin.notifications.openaireevent', + showBreadcrumbsFluid: false + } + } + ]) + ], + providers: [ + I18nBreadcrumbResolver, + I18nBreadcrumbsService, + AdminNotificationsOpenaireTopicsPageResolver, + AdminNotificationsOpenaireEventsPageResolver + ] +}) +/** + * Routing module for the Notifications section of the admin sidebar + */ +export class AdminNotificationsRoutingModule { + +} diff --git a/src/app/admin/admin-notifications/admin-notifications.module.ts b/src/app/admin/admin-notifications/admin-notifications.module.ts new file mode 100644 index 0000000000..9894dac233 --- /dev/null +++ b/src/app/admin/admin-notifications/admin-notifications.module.ts @@ -0,0 +1,29 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { CoreModule } from '../../core/core.module'; +import { SharedModule } from '../../shared/shared.module'; +import { AdminNotificationsRoutingModule } from './admin-notifications-routing.module'; +import { AdminNotificationsOpenaireTopicsPageComponent } from './admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component'; +import { AdminNotificationsOpenaireEventsPageComponent } from './admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component'; +import { OpenaireModule } from '../../openaire/openaire.module'; + +@NgModule({ + imports: [ + CommonModule, + SharedModule, + CoreModule.forRoot(), + AdminNotificationsRoutingModule, + OpenaireModule + ], + declarations: [ + AdminNotificationsOpenaireTopicsPageComponent, + AdminNotificationsOpenaireEventsPageComponent + ], + entryComponents: [] +}) +/** + * This module handles all components related to the notifications pages + */ +export class AdminNotificationsModule { + +} diff --git a/src/app/admin/admin-routing-paths.ts b/src/app/admin/admin-routing-paths.ts index 3168ea93c9..30f801cecb 100644 --- a/src/app/admin/admin-routing-paths.ts +++ b/src/app/admin/admin-routing-paths.ts @@ -2,7 +2,12 @@ import { URLCombiner } from '../core/url-combiner/url-combiner'; import { getAdminModuleRoute } from '../app-routing-paths'; export const REGISTRIES_MODULE_PATH = 'registries'; +export const NOTIFICATIONS_MODULE_PATH = 'notifications'; export function getRegistriesModuleRoute() { return new URLCombiner(getAdminModuleRoute(), REGISTRIES_MODULE_PATH).toString(); } + +export function getNotificationsModuleRoute() { + return new URLCombiner(getAdminModuleRoute(), NOTIFICATIONS_MODULE_PATH).toString(); +} diff --git a/src/app/admin/admin-routing.module.ts b/src/app/admin/admin-routing.module.ts index ee5cb8737b..782a7faa38 100644 --- a/src/app/admin/admin-routing.module.ts +++ b/src/app/admin/admin-routing.module.ts @@ -6,11 +6,16 @@ import { I18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.reso import { AdminWorkflowPageComponent } from './admin-workflow-page/admin-workflow-page.component'; import { I18nBreadcrumbsService } from '../core/breadcrumbs/i18n-breadcrumbs.service'; import { AdminCurationTasksComponent } from './admin-curation-tasks/admin-curation-tasks.component'; -import { REGISTRIES_MODULE_PATH } from './admin-routing-paths'; +import { REGISTRIES_MODULE_PATH, NOTIFICATIONS_MODULE_PATH } from './admin-routing-paths'; @NgModule({ imports: [ RouterModule.forChild([ + { + path: NOTIFICATIONS_MODULE_PATH, + loadChildren: () => import('./admin-notifications/admin-notifications.module') + .then((m) => m.AdminNotificationsModule), + }, { path: REGISTRIES_MODULE_PATH, loadChildren: () => import('./admin-registries/admin-registries.module') diff --git a/src/app/admin/admin-sidebar/admin-sidebar.component.ts b/src/app/admin/admin-sidebar/admin-sidebar.component.ts index c81b2e6e93..a2a7eb30b5 100644 --- a/src/app/admin/admin-sidebar/admin-sidebar.component.ts +++ b/src/app/admin/admin-sidebar/admin-sidebar.component.ts @@ -276,7 +276,7 @@ export class AdminSidebarComponent extends MenuComponent implements OnInit { // link: '' // } as LinkMenuItemModel, // icon: 'chart-bar', - // index: 8 + // index: 9 // }, /* Control Panel */ @@ -291,7 +291,7 @@ export class AdminSidebarComponent extends MenuComponent implements OnInit { // link: '' // } as LinkMenuItemModel, // icon: 'cogs', - // index: 9 + // index: 10 // }, /* Processes */ @@ -305,7 +305,7 @@ export class AdminSidebarComponent extends MenuComponent implements OnInit { link: '/processes' } as LinkMenuItemModel, icon: 'terminal', - index: 10 + index: 11 }, ]; menuList.forEach((menuSection) => this.menuService.addSection(this.menuID, Object.assign(menuSection, { @@ -464,6 +464,29 @@ export class AdminSidebarComponent extends MenuComponent implements OnInit { createSiteAdministratorMenuSections() { this.authorizationService.isAuthorized(FeatureID.AdministratorOf).subscribe((authorized) => { const menuList = [ + /* Notifications */ + { + id: 'notifications', + active: false, + visible: authorized, + model: { + type: MenuItemType.TEXT, + text: 'menu.section.notifications' + } as TextMenuItemModel, + icon: 'bell', + index: 4 + }, + { + id: 'notifications_openair_broker', + parentID: 'notifications', + active: false, + visible: authorized, + model: { + type: MenuItemType.LINK, + text: 'menu.section.notifications_openaire_broker', + link: '/admin/notifications/openaire-broker' + } as LinkMenuItemModel, + }, /* Admin Search */ { id: 'admin_search', @@ -475,7 +498,7 @@ export class AdminSidebarComponent extends MenuComponent implements OnInit { link: '/admin/search' } as LinkMenuItemModel, icon: 'search', - index: 5 + index: 6 }, /* Registries */ { @@ -487,7 +510,7 @@ export class AdminSidebarComponent extends MenuComponent implements OnInit { text: 'menu.section.registries' } as TextMenuItemModel, icon: 'list', - index: 6 + index: 7 }, { id: 'registries_metadata', @@ -523,7 +546,7 @@ export class AdminSidebarComponent extends MenuComponent implements OnInit { link: 'admin/curation-tasks' } as LinkMenuItemModel, icon: 'filter', - index: 7 + index: 8 }, /* Workflow */ @@ -537,7 +560,7 @@ export class AdminSidebarComponent extends MenuComponent implements OnInit { link: '/admin/workflow' } as LinkMenuItemModel, icon: 'user-check', - index: 11 + index: 12 }, ]; @@ -600,7 +623,7 @@ export class AdminSidebarComponent extends MenuComponent implements OnInit { text: 'menu.section.access_control' } as TextMenuItemModel, icon: 'key', - index: 4 + index: 5 }, ]; diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index 8d8a614a89..928d34c48e 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -162,6 +162,8 @@ import { SearchConfig } from './shared/search/search-filters/search-config.model import { SequenceService } from './shared/sequence.service'; import { GroupDataService } from './eperson/group-data.service'; import { SubmissionAccessesModel } from './config/models/config-submission-accesses.model'; +import { OpenaireBrokerTopicObject } from './openaire/broker/models/openaire-broker-topic.model'; +import { OpenaireBrokerEventObject } from './openaire/broker/models/openaire-broker-event.model'; /** * When not in production, endpoint responses can be mocked for testing purposes @@ -343,6 +345,8 @@ export const models = ShortLivedToken, Registration, UsageReport, + OpenaireBrokerTopicObject, + OpenaireBrokerEventObject, Root, SearchConfig, SubmissionAccessesModel diff --git a/src/app/core/data/data.service.ts b/src/app/core/data/data.service.ts index 6bad02e776..0b4f3af4b4 100644 --- a/src/app/core/data/data.service.ts +++ b/src/app/core/data/data.service.ts @@ -38,7 +38,7 @@ import { FindListOptions, PatchRequest, PutRequest, - DeleteRequest + DeleteRequest, DeleteByIDRequest, PostRequest } from './request.models'; import { RequestService } from './request.service'; import { RestRequestMethod } from './rest-request-method'; @@ -579,6 +579,53 @@ export abstract class DataService implements UpdateDa return result$; } + /** + * Perform a post on an endpoint related item with ID. Ex.: endpoint//related?item= + * @param itemId The item id + * @param relatedItemId The related item Id + * @param body The optional POST body + * @return the RestResponse as an Observable + */ + public postOnRelated(itemId: string, relatedItemId: string, body?: any) { + const requestId = this.requestService.generateRequestId(); + const hrefObs = this.getIDHrefObs(itemId); + + hrefObs.pipe( + take(1) + ).subscribe((href: string) => { + const request = new PostRequest(requestId, href + '/related?item=' + relatedItemId, body); + if (hasValue(this.responseMsToLive)) { + request.responseMsToLive = this.responseMsToLive; + } + this.requestService.send(request); + }); + + return this.rdbService.buildFromRequestUUID(requestId); + } + + /** + * Perform a delete on an endpoint related item. Ex.: endpoint//related + * @param itemId The item id + * @return the RestResponse as an Observable + */ + public deleteOnRelated(itemId: string): Observable> { + const requestId = this.requestService.generateRequestId(); + const hrefObs = this.getIDHrefObs(itemId); + + hrefObs.pipe( + find((href: string) => hasValue(href)), + map((href: string) => { + const request = new DeleteByIDRequest(requestId, href + '/related', itemId); + if (hasValue(this.responseMsToLive)) { + request.responseMsToLive = this.responseMsToLive; + } + this.requestService.send(request); + }) + ).subscribe(); + + return this.rdbService.buildFromRequestUUID(requestId); + } + /** * Delete an existing DSpace Object on the server * @param objectId The id of the object to be removed diff --git a/src/app/core/openaire/broker/events/openaire-broker-event-rest.service.spec.ts b/src/app/core/openaire/broker/events/openaire-broker-event-rest.service.spec.ts new file mode 100644 index 0000000000..2d0d236330 --- /dev/null +++ b/src/app/core/openaire/broker/events/openaire-broker-event-rest.service.spec.ts @@ -0,0 +1,246 @@ +import { HttpClient } from '@angular/common/http'; + +import { TestScheduler } from 'rxjs/testing'; +import { of as observableOf } from 'rxjs'; +import { cold, getTestScheduler } from 'jasmine-marbles'; + +import { RequestService } from '../../../data/request.service'; +import { buildPaginatedList } from '../../../data/paginated-list.model'; +import { RequestEntry } from '../../../data/request.reducer'; +import { FindListOptions } from '../../../data/request.models'; +import { RemoteDataBuildService } from '../../../cache/builders/remote-data-build.service'; +import { ObjectCacheService } from '../../../cache/object-cache.service'; +import { RestResponse } from '../../../cache/response.models'; +import { PageInfo } from '../../../shared/page-info.model'; +import { HALEndpointService } from '../../../shared/hal-endpoint.service'; +import { NotificationsService } from '../../../../shared/notifications/notifications.service'; +import { createSuccessfulRemoteDataObject } from '../../../../shared/remote-data.utils'; +import { OpenaireBrokerEventRestService } from './openaire-broker-event-rest.service'; +import { + openaireBrokerEventObjectMissingPid, + openaireBrokerEventObjectMissingPid2, + openaireBrokerEventObjectMissingProjectFound +} from '../../../../shared/mocks/openaire.mock'; +import { ReplaceOperation } from 'fast-json-patch'; + +describe('OpenaireBrokerEventRestService', () => { + let scheduler: TestScheduler; + let service: OpenaireBrokerEventRestService; + let serviceASAny: any; + let responseCacheEntry: RequestEntry; + let responseCacheEntryB: RequestEntry; + let responseCacheEntryC: RequestEntry; + let requestService: RequestService; + let rdbService: RemoteDataBuildService; + let objectCache: ObjectCacheService; + let halService: HALEndpointService; + let notificationsService: NotificationsService; + let http: HttpClient; + let comparator: any; + + const endpointURL = 'https://rest.api/rest/api/integration/nbtopics'; + const requestUUID = '8b3c913a-5a4b-438b-9181-be1a5b4a1c8a'; + const topic = 'ENRICH!MORE!PID'; + + const pageInfo = new PageInfo(); + const array = [ openaireBrokerEventObjectMissingPid, openaireBrokerEventObjectMissingPid2 ]; + const paginatedList = buildPaginatedList(pageInfo, array); + const brokerEventObjectRD = createSuccessfulRemoteDataObject(openaireBrokerEventObjectMissingPid); + const brokerEventObjectMissingProjectRD = createSuccessfulRemoteDataObject(openaireBrokerEventObjectMissingProjectFound); + const paginatedListRD = createSuccessfulRemoteDataObject(paginatedList); + + const status = 'ACCEPTED'; + const operation: ReplaceOperation[] = [ + { + path: '/status', + op: 'replace', + value: status + } + ]; + + beforeEach(() => { + scheduler = getTestScheduler(); + + responseCacheEntry = new RequestEntry(); + responseCacheEntry.request = { href: 'https://rest.api/' } as any; + responseCacheEntry.response = new RestResponse(true, 200, 'Success'); + requestService = jasmine.createSpyObj('requestService', { + generateRequestId: requestUUID, + send: true, + removeByHrefSubstring: {}, + getByHref: jasmine.createSpy('getByHref'), + getByUUID: jasmine.createSpy('getByUUID') + }); + + responseCacheEntryB = new RequestEntry(); + responseCacheEntryB.request = { href: 'https://rest.api/' } as any; + responseCacheEntryB.response = new RestResponse(true, 201, 'Created'); + + responseCacheEntryC = new RequestEntry(); + responseCacheEntryC.request = { href: 'https://rest.api/' } as any; + responseCacheEntryC.response = new RestResponse(true, 204, 'No Content'); + + rdbService = jasmine.createSpyObj('rdbService', { + buildSingle: cold('(a)', { + a: brokerEventObjectRD + }), + buildList: cold('(a)', { + a: paginatedListRD + }), + buildFromRequestUUID: jasmine.createSpy('buildFromRequestUUID') + }); + + objectCache = {} as ObjectCacheService; + halService = jasmine.createSpyObj('halService', { + getEndpoint: cold('a|', { a: endpointURL }) + }); + + notificationsService = {} as NotificationsService; + http = {} as HttpClient; + comparator = {} as any; + + service = new OpenaireBrokerEventRestService( + requestService, + rdbService, + objectCache, + halService, + notificationsService, + http, + comparator + ); + + serviceASAny = service; + + spyOn(serviceASAny.dataService, 'searchBy').and.callThrough(); + spyOn(serviceASAny.dataService, 'findById').and.callThrough(); + spyOn(serviceASAny.dataService, 'patch').and.callThrough(); + spyOn(serviceASAny.dataService, 'postOnRelated').and.callThrough(); + spyOn(serviceASAny.dataService, 'deleteOnRelated').and.callThrough(); + }); + + describe('getEventsByTopic', () => { + beforeEach(() => { + serviceASAny.requestService.getByHref.and.returnValue(observableOf(responseCacheEntry)); + serviceASAny.requestService.getByUUID.and.returnValue(observableOf(responseCacheEntry)); + serviceASAny.rdbService.buildFromRequestUUID.and.returnValue(observableOf(brokerEventObjectRD)); + }); + + it('should proxy the call to dataservice.searchBy', () => { + const options: FindListOptions = { + searchParams: [ + { + fieldName: 'topic', + fieldValue: topic + } + ] + }; + service.getEventsByTopic(topic); + expect(serviceASAny.dataService.searchBy).toHaveBeenCalledWith('findByTopic', options, true, true); + }); + + it('should return a RemoteData> for the object with the given Topic', () => { + const result = service.getEventsByTopic(topic); + const expected = cold('(a)', { + a: paginatedListRD + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('getEvent', () => { + beforeEach(() => { + serviceASAny.requestService.getByHref.and.returnValue(observableOf(responseCacheEntry)); + serviceASAny.requestService.getByUUID.and.returnValue(observableOf(responseCacheEntry)); + serviceASAny.rdbService.buildFromRequestUUID.and.returnValue(observableOf(brokerEventObjectRD)); + }); + + it('should proxy the call to dataservice.findById', () => { + service.getEvent(openaireBrokerEventObjectMissingPid.id).subscribe( + (res) => { + expect(serviceASAny.dataService.findById).toHaveBeenCalledWith(openaireBrokerEventObjectMissingPid.id, true, true); + } + ); + }); + + it('should return a RemoteData for the object with the given URL', () => { + const result = service.getEvent(openaireBrokerEventObjectMissingPid.id); + const expected = cold('(a)', { + a: brokerEventObjectRD + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('patchEvent', () => { + beforeEach(() => { + serviceASAny.requestService.getByHref.and.returnValue(observableOf(responseCacheEntry)); + serviceASAny.requestService.getByUUID.and.returnValue(observableOf(responseCacheEntry)); + serviceASAny.rdbService.buildFromRequestUUID.and.returnValue(observableOf(brokerEventObjectRD)); + }); + + it('should proxy the call to dataservice.patch', () => { + service.patchEvent(status, openaireBrokerEventObjectMissingPid).subscribe( + (res) => { + expect(serviceASAny.dataService.patch).toHaveBeenCalledWith(openaireBrokerEventObjectMissingPid, operation); + } + ); + }); + + it('should return a RemoteData with HTTP 200', () => { + const result = service.patchEvent(status, openaireBrokerEventObjectMissingPid); + const expected = cold('(a|)', { + a: createSuccessfulRemoteDataObject(openaireBrokerEventObjectMissingPid) + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('boundProject', () => { + beforeEach(() => { + serviceASAny.requestService.getByHref.and.returnValue(observableOf(responseCacheEntryB)); + serviceASAny.requestService.getByUUID.and.returnValue(observableOf(responseCacheEntryB)); + serviceASAny.rdbService.buildFromRequestUUID.and.returnValue(observableOf(brokerEventObjectMissingProjectRD)); + }); + + it('should proxy the call to dataservice.postOnRelated', () => { + service.boundProject(openaireBrokerEventObjectMissingProjectFound.id, requestUUID).subscribe( + (res) => { + expect(serviceASAny.dataService.postOnRelated).toHaveBeenCalledWith(openaireBrokerEventObjectMissingProjectFound.id, requestUUID); + } + ); + }); + + it('should return a RestResponse with HTTP 201', () => { + const result = service.boundProject(openaireBrokerEventObjectMissingProjectFound.id, requestUUID); + const expected = cold('(a|)', { + a: createSuccessfulRemoteDataObject(openaireBrokerEventObjectMissingProjectFound) + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('removeProject', () => { + beforeEach(() => { + serviceASAny.requestService.getByHref.and.returnValue(observableOf(responseCacheEntryC)); + serviceASAny.requestService.getByUUID.and.returnValue(observableOf(responseCacheEntryC)); + serviceASAny.rdbService.buildFromRequestUUID.and.returnValue(observableOf(createSuccessfulRemoteDataObject({}))); + }); + + it('should proxy the call to dataservice.deleteOnRelated', () => { + service.removeProject(openaireBrokerEventObjectMissingProjectFound.id).subscribe( + (res) => { + expect(serviceASAny.dataService.deleteOnRelated).toHaveBeenCalledWith(openaireBrokerEventObjectMissingProjectFound.id); + } + ); + }); + + it('should return a RestResponse with HTTP 204', () => { + const result = service.removeProject(openaireBrokerEventObjectMissingProjectFound.id); + const expected = cold('(a|)', { + a: createSuccessfulRemoteDataObject({}) + }); + expect(result).toBeObservable(expected); + }); + }); + +}); diff --git a/src/app/core/openaire/broker/events/openaire-broker-event-rest.service.ts b/src/app/core/openaire/broker/events/openaire-broker-event-rest.service.ts new file mode 100644 index 0000000000..6e944c8038 --- /dev/null +++ b/src/app/core/openaire/broker/events/openaire-broker-event-rest.service.ts @@ -0,0 +1,185 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Store } from '@ngrx/store'; + +import { Observable } from 'rxjs'; + +import { CoreState } from '../../../core.reducers'; +import { HALEndpointService } from '../../../shared/hal-endpoint.service'; +import { NotificationsService } from '../../../../shared/notifications/notifications.service'; +import { RemoteDataBuildService } from '../../../cache/builders/remote-data-build.service'; +import { RestResponse } from '../../../cache/response.models'; +import { ObjectCacheService } from '../../../cache/object-cache.service'; +import { dataService } from '../../../cache/builders/build-decorators'; +import { RequestService } from '../../../data/request.service'; +import { FindListOptions } from '../../../data/request.models'; +import { DataService } from '../../../data/data.service'; +import { ChangeAnalyzer } from '../../../data/change-analyzer'; +import { DefaultChangeAnalyzer } from '../../../data/default-change-analyzer.service'; +import { RemoteData } from '../../../data/remote-data'; +import { OpenaireBrokerEventObject } from '../models/openaire-broker-event.model'; +import { OPENAIRE_BROKER_EVENT_OBJECT } from '../models/openaire-broker-event-object.resource-type'; +import { FollowLinkConfig } from '../../../../shared/utils/follow-link-config.model'; +import { PaginatedList } from '../../../data/paginated-list.model'; +import { ReplaceOperation } from 'fast-json-patch'; +import { NoContent } from '../../../shared/NoContent.model'; + +/* tslint:disable:max-classes-per-file */ + +/** + * A private DataService implementation to delegate specific methods to. + */ +class DataServiceImpl extends DataService { + /** + * The REST endpoint. + */ + protected linkPath = 'nbevents'; + + /** + * Initialize service variables + * @param {RequestService} requestService + * @param {RemoteDataBuildService} rdbService + * @param {Store} store + * @param {ObjectCacheService} objectCache + * @param {HALEndpointService} halService + * @param {NotificationsService} notificationsService + * @param {HttpClient} http + * @param {ChangeAnalyzer} comparator + */ + constructor( + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected store: Store, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + protected notificationsService: NotificationsService, + protected http: HttpClient, + protected comparator: ChangeAnalyzer) { + super(); + } +} + +/** + * The service handling all OpenAIRE Broker topic REST requests. + */ +@Injectable() +@dataService(OPENAIRE_BROKER_EVENT_OBJECT) +export class OpenaireBrokerEventRestService { + /** + * A private DataService implementation to delegate specific methods to. + */ + private dataService: DataServiceImpl; + + /** + * Initialize service variables + * @param {RequestService} requestService + * @param {RemoteDataBuildService} rdbService + * @param {ObjectCacheService} objectCache + * @param {HALEndpointService} halService + * @param {NotificationsService} notificationsService + * @param {HttpClient} http + * @param {DefaultChangeAnalyzer} comparator + */ + constructor( + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + protected notificationsService: NotificationsService, + protected http: HttpClient, + protected comparator: DefaultChangeAnalyzer) { + this.dataService = new DataServiceImpl(requestService, rdbService, null, objectCache, halService, notificationsService, http, comparator); + } + + /** + * Return the list of OpenAIRE Broker events by topic. + * + * @param topic + * The OpenAIRE Broker topic + * @param options + * Find list options object. + * @param linksToFollow + * List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved. + * @return Observable>> + * The list of OpenAIRE Broker events. + */ + public getEventsByTopic(topic: string, options: FindListOptions = {}, ...linksToFollow: FollowLinkConfig[]): Observable>> { + options.searchParams = [ + { + fieldName: 'topic', + fieldValue: topic + } + ]; + return this.dataService.searchBy('findByTopic', options, true, true, ...linksToFollow); + } + + /** + * Clear findByTopic requests from cache + */ + public clearFindByTopicRequests() { + this.requestService.removeByHrefSubstring('findByTopic'); + } + + /** + * Return a single OpenAIRE Broker event. + * + * @param id + * The OpenAIRE Broker event id + * @param linksToFollow + * List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved + * @return Observable> + * The OpenAIRE Broker event. + */ + public getEvent(id: string, ...linksToFollow: FollowLinkConfig[]): Observable> { + return this.dataService.findById(id, true, true, ...linksToFollow); + } + + /** + * Save the new status of an OpenAIRE Broker event. + * + * @param status + * The new status + * @param dso OpenaireBrokerEventObject + * The event item + * @param reason + * The optional reason (not used for now; for future implementation) + * @return Observable + * The REST response. + */ + public patchEvent(status, dso, reason?: string): Observable> { + const operation: ReplaceOperation[] = [ + { + path: '/status', + op: 'replace', + value: status + } + ]; + return this.dataService.patch(dso, operation); + } + + /** + * Bound a project to an OpenAIRE Broker event publication. + * + * @param itemId + * The Id of the OpenAIRE Broker event + * @param projectId + * The project Id to bound + * @return Observable + * The REST response. + */ + public boundProject(itemId: string, projectId: string): Observable> { + return this.dataService.postOnRelated(itemId, projectId); + } + + /** + * Remove a project from an OpenAIRE Broker event publication. + * + * @param itemId + * The Id of the OpenAIRE Broker event + * @return Observable + * The REST response. + */ + public removeProject(itemId: string): Observable> { + return this.dataService.deleteOnRelated(itemId); + } +} diff --git a/src/app/core/openaire/broker/models/openaire-broker-event-object.resource-type.ts b/src/app/core/openaire/broker/models/openaire-broker-event-object.resource-type.ts new file mode 100644 index 0000000000..c0be0071eb --- /dev/null +++ b/src/app/core/openaire/broker/models/openaire-broker-event-object.resource-type.ts @@ -0,0 +1,9 @@ +import { ResourceType } from '../../../shared/resource-type'; + +/** + * The resource type for the OpenAIRE Broker event + * + * Needs to be in a separate file to prevent circular + * dependencies in webpack. + */ +export const OPENAIRE_BROKER_EVENT_OBJECT = new ResourceType('nbevent'); diff --git a/src/app/core/openaire/broker/models/openaire-broker-event.model.ts b/src/app/core/openaire/broker/models/openaire-broker-event.model.ts new file mode 100644 index 0000000000..40c65412f5 --- /dev/null +++ b/src/app/core/openaire/broker/models/openaire-broker-event.model.ts @@ -0,0 +1,157 @@ +import { Observable } from 'rxjs'; +import { autoserialize, autoserializeAs, deserialize } from 'cerialize'; +import { CacheableObject } from '../../../cache/object-cache.reducer'; +import { OPENAIRE_BROKER_EVENT_OBJECT } from './openaire-broker-event-object.resource-type'; +import { excludeFromEquals } from '../../../utilities/equals.decorators'; +import { ResourceType } from '../../../shared/resource-type'; +import { HALLink } from '../../../shared/hal-link.model'; +import { Item } from '../../../shared/item.model'; +import { ITEM } from '../../../shared/item.resource-type'; +import { link, typedObject } from '../../../cache/builders/build-decorators'; +import { RemoteData } from '../../../data/remote-data'; + +/** + * The interface representing the OpenAIRE Broker event message + */ +export interface OpenaireBrokerEventMessageObject { + /** + * The type of 'value' + */ + type: string; + + /** + * The value suggested by OpenAIRE + */ + value: string; + + /** + * The abstract suggested by OpenAIRE + */ + abstract: string; + + /** + * The project acronym suggested by OpenAIRE + */ + acronym: string; + + /** + * The project code suggested by OpenAIRE + */ + code: string; + + /** + * The project funder suggested by OpenAIRE + */ + funder: string; + + /** + * The project program suggested by OpenAIRE + */ + fundingProgram?: string; + + /** + * The project jurisdiction suggested by OpenAIRE + */ + jurisdiction: string; + + /** + * The project title suggested by OpenAIRE + */ + title: string; + + /** + * The OpenAIRE ID. + */ + openaireId: string; + +} + +/** + * The interface representing the OpenAIRE Broker event model + */ +@typedObject +export class OpenaireBrokerEventObject implements CacheableObject { + /** + * A string representing the kind of object, e.g. community, item, … + */ + static type = OPENAIRE_BROKER_EVENT_OBJECT; + + /** + * The OpenAIRE Broker event uuid inside DSpace + */ + @autoserialize + id: string; + + /** + * The universally unique identifier of this OpenAIRE Broker event + */ + @autoserializeAs(String, 'id') + uuid: string; + + /** + * The OpenAIRE Broker event original id (ex.: the source archive OAI-PMH identifier) + */ + @autoserialize + originalId: string; + + /** + * The title of the article to which the suggestion refers + */ + @autoserialize + title: string; + + /** + * Reliability of the suggestion (of the data inside 'message') + */ + @autoserialize + trust: number; + + /** + * The timestamp OpenAIRE Broker event was saved in DSpace + */ + @autoserialize + eventDate: string; + + /** + * The OpenAIRE Broker event status (ACCEPTED, REJECTED, DISCARDED, PENDING) + */ + @autoserialize + status: string; + + /** + * The suggestion data. Data may vary depending on the topic + */ + @autoserialize + message: OpenaireBrokerEventMessageObject; + + /** + * The type of this ConfigObject + */ + @excludeFromEquals + @autoserialize + type: ResourceType; + + /** + * The links to all related resources returned by the rest api. + */ + @deserialize + _links: { + self: HALLink, + target: HALLink, + related: HALLink + }; + + /** + * The related publication DSpace item + * Will be undefined unless the {@item HALLink} has been resolved. + */ + @link(ITEM) + target?: Observable>; + + /** + * The related project for this Event + * Will be undefined unless the {@related HALLink} has been resolved. + */ + @link(ITEM) + related?: Observable>; +} diff --git a/src/app/core/openaire/broker/models/openaire-broker-topic-object.resource-type.ts b/src/app/core/openaire/broker/models/openaire-broker-topic-object.resource-type.ts new file mode 100644 index 0000000000..58ceb4e671 --- /dev/null +++ b/src/app/core/openaire/broker/models/openaire-broker-topic-object.resource-type.ts @@ -0,0 +1,9 @@ +import { ResourceType } from '../../../shared/resource-type'; + +/** + * The resource type for the OpenAIRE Broker topic + * + * Needs to be in a separate file to prevent circular + * dependencies in webpack. + */ +export const OPENAIRE_BROKER_TOPIC_OBJECT = new ResourceType('nbtopic'); diff --git a/src/app/core/openaire/broker/models/openaire-broker-topic.model.ts b/src/app/core/openaire/broker/models/openaire-broker-topic.model.ts new file mode 100644 index 0000000000..3f286e5fea --- /dev/null +++ b/src/app/core/openaire/broker/models/openaire-broker-topic.model.ts @@ -0,0 +1,58 @@ +import { autoserialize, deserialize } from 'cerialize'; + +import { CacheableObject } from '../../../cache/object-cache.reducer'; +import { OPENAIRE_BROKER_TOPIC_OBJECT } from './openaire-broker-topic-object.resource-type'; +import { excludeFromEquals } from '../../../utilities/equals.decorators'; +import { ResourceType } from '../../../shared/resource-type'; +import { HALLink } from '../../../shared/hal-link.model'; +import { typedObject } from '../../../cache/builders/build-decorators'; + +/** + * The interface representing the OpenAIRE Broker topic model + */ +@typedObject +export class OpenaireBrokerTopicObject implements CacheableObject { + /** + * A string representing the kind of object, e.g. community, item, … + */ + static type = OPENAIRE_BROKER_TOPIC_OBJECT; + + /** + * The OpenAIRE Broker topic id + */ + @autoserialize + id: string; + + /** + * The OpenAIRE Broker topic name to display + */ + @autoserialize + name: string; + + /** + * The date of the last udate from OpenAIRE + */ + @autoserialize + lastEvent: string; + + /** + * The total number of suggestions provided by OpenAIRE for this topic + */ + @autoserialize + totalEvents: number; + + /** + * The type of this ConfigObject + */ + @excludeFromEquals + @autoserialize + type: ResourceType; + + /** + * The links to all related resources returned by the rest api. + */ + @deserialize + _links: { + self: HALLink, + }; +} diff --git a/src/app/core/openaire/broker/topics/openaire-broker-topic-rest.service.spec.ts b/src/app/core/openaire/broker/topics/openaire-broker-topic-rest.service.spec.ts new file mode 100644 index 0000000000..87aa0b42f0 --- /dev/null +++ b/src/app/core/openaire/broker/topics/openaire-broker-topic-rest.service.spec.ts @@ -0,0 +1,127 @@ +import { HttpClient } from '@angular/common/http'; + +import { TestScheduler } from 'rxjs/testing'; +import { of as observableOf } from 'rxjs'; +import { cold, getTestScheduler } from 'jasmine-marbles'; + +import { RequestService } from '../../../data/request.service'; +import { buildPaginatedList } from '../../../data/paginated-list.model'; +import { RequestEntry } from '../../../data/request.reducer'; +import { RemoteDataBuildService } from '../../../cache/builders/remote-data-build.service'; +import { ObjectCacheService } from '../../../cache/object-cache.service'; +import { RestResponse } from '../../../cache/response.models'; +import { PageInfo } from '../../../shared/page-info.model'; +import { HALEndpointService } from '../../../shared/hal-endpoint.service'; +import { NotificationsService } from '../../../../shared/notifications/notifications.service'; +import { createSuccessfulRemoteDataObject } from '../../../../shared/remote-data.utils'; +import { OpenaireBrokerTopicRestService } from './openaire-broker-topic-rest.service'; +import { + openaireBrokerTopicObjectMoreAbstract, + openaireBrokerTopicObjectMorePid +} from '../../../../shared/mocks/openaire.mock'; + +describe('OpenaireBrokerTopicRestService', () => { + let scheduler: TestScheduler; + let service: OpenaireBrokerTopicRestService; + let responseCacheEntry: RequestEntry; + let requestService: RequestService; + let rdbService: RemoteDataBuildService; + let objectCache: ObjectCacheService; + let halService: HALEndpointService; + let notificationsService: NotificationsService; + let http: HttpClient; + let comparator: any; + + const endpointURL = 'https://rest.api/rest/api/integration/nbtopics'; + const requestUUID = '8b3c913a-5a4b-438b-9181-be1a5b4a1c8a'; + + const pageInfo = new PageInfo(); + const array = [ openaireBrokerTopicObjectMorePid, openaireBrokerTopicObjectMoreAbstract ]; + const paginatedList = buildPaginatedList(pageInfo, array); + const brokerTopicObjectRD = createSuccessfulRemoteDataObject(openaireBrokerTopicObjectMorePid); + const paginatedListRD = createSuccessfulRemoteDataObject(paginatedList); + + beforeEach(() => { + scheduler = getTestScheduler(); + + responseCacheEntry = new RequestEntry(); + responseCacheEntry.response = new RestResponse(true, 200, 'Success'); + requestService = jasmine.createSpyObj('requestService', { + generateRequestId: requestUUID, + send: true, + removeByHrefSubstring: {}, + getByHref: observableOf(responseCacheEntry), + getByUUID: observableOf(responseCacheEntry), + }); + + rdbService = jasmine.createSpyObj('rdbService', { + buildSingle: cold('(a)', { + a: brokerTopicObjectRD + }), + buildList: cold('(a)', { + a: paginatedListRD + }), + }); + + objectCache = {} as ObjectCacheService; + halService = jasmine.createSpyObj('halService', { + getEndpoint: cold('a|', { a: endpointURL }) + }); + + notificationsService = {} as NotificationsService; + http = {} as HttpClient; + comparator = {} as any; + + service = new OpenaireBrokerTopicRestService( + requestService, + rdbService, + objectCache, + halService, + notificationsService, + http, + comparator + ); + + spyOn((service as any).dataService, 'findAllByHref').and.callThrough(); + spyOn((service as any).dataService, 'findByHref').and.callThrough(); + }); + + describe('getTopics', () => { + it('should proxy the call to dataservice.findAllByHref', (done) => { + service.getTopics().subscribe( + (res) => { + expect((service as any).dataService.findAllByHref).toHaveBeenCalledWith(endpointURL, {}, true, true); + } + ); + done(); + }); + + it('should return a RemoteData> for the object with the given URL', () => { + const result = service.getTopics(); + const expected = cold('(a)', { + a: paginatedListRD + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('getTopic', () => { + it('should proxy the call to dataservice.findByHref', (done) => { + service.getTopic(openaireBrokerTopicObjectMorePid.id).subscribe( + (res) => { + expect((service as any).dataService.findByHref).toHaveBeenCalledWith(endpointURL + '/' + openaireBrokerTopicObjectMorePid.id, true, true); + } + ); + done(); + }); + + it('should return a RemoteData for the object with the given URL', () => { + const result = service.getTopic(openaireBrokerTopicObjectMorePid.id); + const expected = cold('(a)', { + a: brokerTopicObjectRD + }); + expect(result).toBeObservable(expected); + }); + }); + +}); diff --git a/src/app/core/openaire/broker/topics/openaire-broker-topic-rest.service.ts b/src/app/core/openaire/broker/topics/openaire-broker-topic-rest.service.ts new file mode 100644 index 0000000000..3fe3917485 --- /dev/null +++ b/src/app/core/openaire/broker/topics/openaire-broker-topic-rest.service.ts @@ -0,0 +1,133 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Store } from '@ngrx/store'; + +import { Observable } from 'rxjs'; +import { mergeMap, take } from 'rxjs/operators'; + +import { CoreState } from '../../../core.reducers'; +import { HALEndpointService } from '../../../shared/hal-endpoint.service'; +import { NotificationsService } from '../../../../shared/notifications/notifications.service'; +import { RemoteDataBuildService } from '../../../cache/builders/remote-data-build.service'; +import { ObjectCacheService } from '../../../cache/object-cache.service'; +import { dataService } from '../../../cache/builders/build-decorators'; +import { RequestService } from '../../../data/request.service'; +import { FindListOptions } from '../../../data/request.models'; +import { DataService } from '../../../data/data.service'; +import { ChangeAnalyzer } from '../../../data/change-analyzer'; +import { DefaultChangeAnalyzer } from '../../../data/default-change-analyzer.service'; +import { RemoteData } from '../../../data/remote-data'; +import { OpenaireBrokerTopicObject } from '../models/openaire-broker-topic.model'; +import { OPENAIRE_BROKER_TOPIC_OBJECT } from '../models/openaire-broker-topic-object.resource-type'; +import { FollowLinkConfig } from '../../../../shared/utils/follow-link-config.model'; +import { PaginatedList } from '../../../data/paginated-list.model'; + +/* tslint:disable:max-classes-per-file */ + +/** + * A private DataService implementation to delegate specific methods to. + */ +class DataServiceImpl extends DataService { + /** + * The REST endpoint. + */ + protected linkPath = 'nbtopics'; + + /** + * Initialize service variables + * @param {RequestService} requestService + * @param {RemoteDataBuildService} rdbService + * @param {Store} store + * @param {ObjectCacheService} objectCache + * @param {HALEndpointService} halService + * @param {NotificationsService} notificationsService + * @param {HttpClient} http + * @param {ChangeAnalyzer} comparator + */ + constructor( + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected store: Store, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + protected notificationsService: NotificationsService, + protected http: HttpClient, + protected comparator: ChangeAnalyzer) { + super(); + } +} + +/** + * The service handling all OpenAIRE Broker topic REST requests. + */ +@Injectable() +@dataService(OPENAIRE_BROKER_TOPIC_OBJECT) +export class OpenaireBrokerTopicRestService { + /** + * A private DataService implementation to delegate specific methods to. + */ + private dataService: DataServiceImpl; + + /** + * Initialize service variables + * @param {RequestService} requestService + * @param {RemoteDataBuildService} rdbService + * @param {ObjectCacheService} objectCache + * @param {HALEndpointService} halService + * @param {NotificationsService} notificationsService + * @param {HttpClient} http + * @param {DefaultChangeAnalyzer} comparator + */ + constructor( + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + protected notificationsService: NotificationsService, + protected http: HttpClient, + protected comparator: DefaultChangeAnalyzer) { + this.dataService = new DataServiceImpl(requestService, rdbService, null, objectCache, halService, notificationsService, http, comparator); + } + + /** + * Return the list of OpenAIRE Broker topics. + * + * @param options + * Find list options object. + * @param linksToFollow + * List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved. + * @return Observable>> + * The list of OpenAIRE Broker topics. + */ + public getTopics(options: FindListOptions = {}, ...linksToFollow: FollowLinkConfig[]): Observable>> { + return this.dataService.getBrowseEndpoint(options, 'nbtopics').pipe( + take(1), + mergeMap((href: string) => this.dataService.findAllByHref(href, options, true, true, ...linksToFollow)), + ); + } + + /** + * Clear FindAll topics requests from cache + */ + public clearFindAllTopicsRequests() { + this.requestService.setStaleByHrefSubstring('nbtopics'); + } + + /** + * Return a single OpenAIRE Broker topic. + * + * @param id + * The OpenAIRE Broker topic id + * @param linksToFollow + * List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved. + * @return Observable> + * The OpenAIRE Broker topic. + */ + public getTopic(id: string, ...linksToFollow: FollowLinkConfig[]): Observable> { + const options = {}; + return this.dataService.getBrowseEndpoint(options, 'nbtopics').pipe( + take(1), + mergeMap((href: string) => this.dataService.findByHref(href + '/' + id, true, true, ...linksToFollow)) + ); + } +} diff --git a/src/app/openaire/broker/events/openaire-broker-events.component.html b/src/app/openaire/broker/events/openaire-broker-events.component.html new file mode 100644 index 0000000000..05d7722291 --- /dev/null +++ b/src/app/openaire/broker/events/openaire-broker-events.component.html @@ -0,0 +1,207 @@ +
+
+
+

{{'openaire.events.title'| translate}}

+

{{'openaire.broker.events.description'| translate}}

+

+ + + {{'openaire.broker.events.back' | translate}} + +

+
+
+
+
+

+ {{'openaire.broker.events.topic' | translate}} {{this.showTopic}} +

+ + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
{{'openaire.broker.event.table.trust' | translate}}{{'openaire.broker.event.table.publication' | translate}}{{'openaire.broker.event.table.details' | translate}}{{'openaire.broker.event.table.project-details' | translate}}{{'openaire.broker.event.table.actions' | translate}}
{{eventElement?.event?.trust}} + {{eventElement.title}} + {{eventElement.title}} + +

{{'openaire.broker.event.table.pidtype' | translate}} {{eventElement.event.message.type}}

+

{{'openaire.broker.event.table.pidvalue' | translate}}
+ + {{eventElement.event.message.value}} + + {{eventElement.event.message.value}} +

+
+

{{'openaire.broker.event.table.subjectValue' | translate}}
{{eventElement.event.message.value}}

+
+

+ {{'openaire.broker.event.table.abstract' | translate}}
+ {{eventElement.event.message.abstract}} +

+ +
+

+ {{'openaire.broker.event.table.suggestedProject' | translate}} +

+

+ {{'openaire.broker.event.table.project' | translate}}
+ {{eventElement.event.message.title}} +

+

+ {{'openaire.broker.event.table.acronym' | translate}} {{eventElement.event.message.acronym}}
+ {{'openaire.broker.event.table.code' | translate}} {{eventElement.event.message.code}}
+ {{'openaire.broker.event.table.funder' | translate}} {{eventElement.event.message.funder}}
+ {{'openaire.broker.event.table.fundingProgram' | translate}} {{eventElement.event.message.fundingProgram}}
+ {{'openaire.broker.event.table.jurisdiction' | translate}} {{eventElement.event.message.jurisdiction}} +

+
+
+ {{(eventElement.hasProject ? 'openaire.broker.event.project.found' : 'openaire.broker.event.project.notFound') | translate}} + {{eventElement.handle}} +
+ + +
+
+
+
+ + + + +
+
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + diff --git a/src/app/openaire/broker/events/openaire-broker-events.component.spec.ts b/src/app/openaire/broker/events/openaire-broker-events.component.spec.ts new file mode 100644 index 0000000000..267f6a8242 --- /dev/null +++ b/src/app/openaire/broker/events/openaire-broker-events.component.spec.ts @@ -0,0 +1,332 @@ +import { Component, NO_ERRORS_SCHEMA } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { CommonModule } from '@angular/common'; +import { ComponentFixture, inject, TestBed, waitForAsync } from '@angular/core/testing'; +import { TranslateModule, TranslateService } from '@ngx-translate/core'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; +import { of as observableOf } from 'rxjs'; +import { OpenaireBrokerEventRestService } from '../../../core/openaire/broker/events/openaire-broker-event-rest.service'; +import { OpenaireBrokerEventsComponent } from './openaire-broker-events.component'; +import { + getMockOpenaireBrokerEventRestService, + ItemMockPid10, + ItemMockPid8, + ItemMockPid9, + openaireBrokerEventObjectMissingProjectFound, + openaireBrokerEventObjectMissingProjectNotFound, + OpenaireMockDspaceObject +} from '../../../shared/mocks/openaire.mock'; +import { NotificationsServiceStub } from '../../../shared/testing/notifications-service.stub'; +import { NotificationsService } from '../../../shared/notifications/notifications.service'; +import { getMockTranslateService } from '../../../shared/mocks/translate.service.mock'; +import { createTestComponent } from '../../../shared/testing/utils.test'; +import { ActivatedRouteStub } from '../../../shared/testing/active-router.stub'; +import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; +import { OpenaireBrokerEventObject } from '../../../core/openaire/broker/models/openaire-broker-event.model'; +import { OpenaireBrokerEventData } from '../project-entry-import-modal/project-entry-import-modal.component'; +import { TestScheduler } from 'rxjs/testing'; +import { getTestScheduler } from 'jasmine-marbles'; +import { followLink } from '../../../shared/utils/follow-link-config.model'; +import { PageInfo } from '../../../core/shared/page-info.model'; +import { buildPaginatedList } from '../../../core/data/paginated-list.model'; +import { + createNoContentRemoteDataObject$, + createSuccessfulRemoteDataObject, + createSuccessfulRemoteDataObject$ +} from '../../../shared/remote-data.utils'; +import { FindListOptions } from '../../../core/data/request.models'; +import { SortDirection, SortOptions } from '../../../core/cache/models/sort-options.model'; +import { PaginationService } from '../../../core/pagination/pagination.service'; +import { PaginationServiceStub } from '../../../shared/testing/pagination-service.stub'; + +describe('OpenaireBrokerEventsComponent test suite', () => { + let fixture: ComponentFixture; + let comp: OpenaireBrokerEventsComponent; + let compAsAny: any; + let scheduler: TestScheduler; + + const modalStub = { + open: () => ( {result: new Promise((res, rej) => 'do')} ), + close: () => null, + dismiss: () => null + }; + const openaireBrokerEventRestServiceStub: any = getMockOpenaireBrokerEventRestService(); + const activatedRouteParams = { + openaireBrokerEventsParams: { + currentPage: 0, + pageSize: 10 + } + }; + const activatedRouteParamsMap = { + id: 'ENRICH!MISSING!PROJECT' + }; + + const events: OpenaireBrokerEventObject[] = [ + openaireBrokerEventObjectMissingProjectFound, + openaireBrokerEventObjectMissingProjectNotFound + ]; + const paginationService = new PaginationServiceStub(); + + function getOpenAireBrokerEventData1(): OpenaireBrokerEventData { + return { + event: openaireBrokerEventObjectMissingProjectFound, + id: openaireBrokerEventObjectMissingProjectFound.id, + title: openaireBrokerEventObjectMissingProjectFound.title, + hasProject: true, + projectTitle: openaireBrokerEventObjectMissingProjectFound.message.title, + projectId: ItemMockPid10.id, + handle: ItemMockPid10.handle, + reason: null, + isRunning: false, + target: ItemMockPid8 + }; + } + + function getOpenAireBrokerEventData2(): OpenaireBrokerEventData { + return { + event: openaireBrokerEventObjectMissingProjectNotFound, + id: openaireBrokerEventObjectMissingProjectNotFound.id, + title: openaireBrokerEventObjectMissingProjectNotFound.title, + hasProject: false, + projectTitle: null, + projectId: null, + handle: null, + reason: null, + isRunning: false, + target: ItemMockPid9 + }; + } + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [ + CommonModule, + TranslateModule.forRoot(), + ], + declarations: [ + OpenaireBrokerEventsComponent, + TestComponent, + ], + providers: [ + { provide: ActivatedRoute, useValue: new ActivatedRouteStub(activatedRouteParamsMap, activatedRouteParams) }, + { provide: OpenaireBrokerEventRestService, useValue: openaireBrokerEventRestServiceStub }, + { provide: NgbModal, useValue: modalStub }, + { provide: NotificationsService, useValue: new NotificationsServiceStub() }, + { provide: TranslateService, useValue: getMockTranslateService() }, + { provide: PaginationService, useValue: paginationService }, + OpenaireBrokerEventsComponent + ], + schemas: [NO_ERRORS_SCHEMA] + }).compileComponents().then(); + scheduler = getTestScheduler(); + })); + + // First test to check the correct component creation + describe('', () => { + let testComp: TestComponent; + let testFixture: ComponentFixture; + + // synchronous beforeEach + beforeEach(() => { + const html = ` + `; + testFixture = createTestComponent(html, TestComponent) as ComponentFixture; + testComp = testFixture.componentInstance; + }); + + afterEach(() => { + testFixture.destroy(); + }); + + it('should create OpenaireBrokerEventsComponent', inject([OpenaireBrokerEventsComponent], (app: OpenaireBrokerEventsComponent) => { + expect(app).toBeDefined(); + })); + }); + + describe('Main tests', () => { + beforeEach(() => { + fixture = TestBed.createComponent(OpenaireBrokerEventsComponent); + comp = fixture.componentInstance; + compAsAny = comp; + }); + + afterEach(() => { + fixture.destroy(); + comp = null; + compAsAny = null; + }); + + describe('setEventUpdated', () => { + it('should update events', () => { + const expected = [ + getOpenAireBrokerEventData1(), + getOpenAireBrokerEventData2() + ]; + scheduler.schedule(() => { + compAsAny.setEventUpdated(events); + }); + scheduler.flush(); + + expect(comp.eventsUpdated$.value).toEqual(expected); + }); + }); + + describe('modalChoice', () => { + beforeEach(() => { + spyOn(comp, 'executeAction'); + spyOn(comp, 'openModal'); + }); + + it('should call executeAction if a project is present', () => { + const action = 'ACCEPTED'; + comp.modalChoice(action, getOpenAireBrokerEventData1(), modalStub); + expect(comp.executeAction).toHaveBeenCalledWith(action, getOpenAireBrokerEventData1()); + }); + + it('should call openModal if a project is not present', () => { + const action = 'ACCEPTED'; + comp.modalChoice(action, getOpenAireBrokerEventData2(), modalStub); + expect(comp.openModal).toHaveBeenCalledWith(action, getOpenAireBrokerEventData2(), modalStub); + }); + }); + + describe('openModal', () => { + it('should call modalService.open', () => { + const action = 'ACCEPTED'; + comp.selectedReason = null; + spyOn(compAsAny.modalService, 'open').and.returnValue({ result: new Promise((res, rej) => 'do' ) }); + spyOn(comp, 'executeAction'); + + comp.openModal(action, getOpenAireBrokerEventData1(), modalStub); + expect(compAsAny.modalService.open).toHaveBeenCalled(); + }); + }); + + describe('openModalLookup', () => { + it('should call modalService.open', () => { + spyOn(comp, 'boundProject'); + spyOn(compAsAny.modalService, 'open').and.returnValue( + { + componentInstance: { + externalSourceEntry: null, + label: null, + importedObject: observableOf({ + indexableObject: OpenaireMockDspaceObject + }) + } + } + ); + scheduler.schedule(() => { + comp.openModalLookup(getOpenAireBrokerEventData1()); + }); + scheduler.flush(); + + expect(compAsAny.modalService.open).toHaveBeenCalled(); + expect(compAsAny.boundProject).toHaveBeenCalled(); + }); + }); + + describe('executeAction', () => { + it('should call getOpenaireBrokerEvents on 200 response from REST', () => { + const action = 'ACCEPTED'; + spyOn(compAsAny, 'getOpenaireBrokerEvents'); + openaireBrokerEventRestServiceStub.patchEvent.and.returnValue(createSuccessfulRemoteDataObject$({})); + + scheduler.schedule(() => { + comp.executeAction(action, getOpenAireBrokerEventData1()); + }); + scheduler.flush(); + + expect(compAsAny.getOpenaireBrokerEvents).toHaveBeenCalled(); + }); + }); + + describe('boundProject', () => { + it('should populate the project data inside "eventData"', () => { + const eventData = getOpenAireBrokerEventData2(); + const projectId = 'UUID-23943-34u43-38344'; + const projectName = 'Test Project'; + const projectHandle = '1000/1000'; + openaireBrokerEventRestServiceStub.boundProject.and.returnValue(createSuccessfulRemoteDataObject$({})); + + scheduler.schedule(() => { + comp.boundProject(eventData, projectId, projectName, projectHandle); + }); + scheduler.flush(); + + expect(eventData.hasProject).toEqual(true); + expect(eventData.projectId).toEqual(projectId); + expect(eventData.projectTitle).toEqual(projectName); + expect(eventData.handle).toEqual(projectHandle); + }); + }); + + describe('removeProject', () => { + it('should remove the project data inside "eventData"', () => { + const eventData = getOpenAireBrokerEventData1(); + openaireBrokerEventRestServiceStub.removeProject.and.returnValue(createNoContentRemoteDataObject$()); + + scheduler.schedule(() => { + comp.removeProject(eventData); + }); + scheduler.flush(); + + expect(eventData.hasProject).toEqual(false); + expect(eventData.projectId).toBeNull(); + expect(eventData.projectTitle).toBeNull(); + expect(eventData.handle).toBeNull(); + }); + }); + + describe('getOpenaireBrokerEvents', () => { + it('should call the "openaireBrokerEventRestService.getEventsByTopic" to take data and "setEventUpdated" to populate eventData', () => { + comp.paginationConfig = new PaginationComponentOptions(); + comp.paginationConfig.currentPage = 1; + comp.paginationConfig.pageSize = 20; + comp.paginationSortConfig = new SortOptions('trust', SortDirection.DESC); + comp.topic = activatedRouteParamsMap.id; + const options: FindListOptions = Object.assign(new FindListOptions(), { + currentPage: comp.paginationConfig.currentPage, + elementsPerPage: comp.paginationConfig.pageSize + }); + + const pageInfo = new PageInfo({ + elementsPerPage: comp.paginationConfig.pageSize, + totalElements: 0, + totalPages: 1, + currentPage: comp.paginationConfig.currentPage + }); + const array = [ + openaireBrokerEventObjectMissingProjectFound, + openaireBrokerEventObjectMissingProjectNotFound, + ]; + const paginatedList = buildPaginatedList(pageInfo, array); + const paginatedListRD = createSuccessfulRemoteDataObject(paginatedList); + openaireBrokerEventRestServiceStub.getEventsByTopic.and.returnValue(observableOf(paginatedListRD)); + spyOn(compAsAny, 'setEventUpdated'); + + scheduler.schedule(() => { + compAsAny.getOpenaireBrokerEvents(); + }); + scheduler.flush(); + + expect(compAsAny.openaireBrokerEventRestService.getEventsByTopic).toHaveBeenCalledWith( + activatedRouteParamsMap.id, + options, + followLink('target'),followLink('related') + ); + expect(compAsAny.setEventUpdated).toHaveBeenCalled(); + }); + }); + + }); +}); + +// declare a test component +@Component({ + selector: 'ds-test-cmp', + template: `` +}) +class TestComponent { + +} diff --git a/src/app/openaire/broker/events/openaire-broker-events.component.ts b/src/app/openaire/broker/events/openaire-broker-events.component.ts new file mode 100644 index 0000000000..14ad175e80 --- /dev/null +++ b/src/app/openaire/broker/events/openaire-broker-events.component.ts @@ -0,0 +1,464 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; + +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; +import { TranslateService } from '@ngx-translate/core'; +import { BehaviorSubject, from, Observable, of as observableOf, Subscription } from 'rxjs'; +import { distinctUntilChanged, map, mergeMap, scan, switchMap, take } from 'rxjs/operators'; + +import { SortDirection, SortOptions } from '../../../core/cache/models/sort-options.model'; +import { PaginatedList } from '../../../core/data/paginated-list.model'; +import { RemoteData } from '../../../core/data/remote-data'; +import { FindListOptions } from '../../../core/data/request.models'; +import { + OpenaireBrokerEventMessageObject, + OpenaireBrokerEventObject +} from '../../../core/openaire/broker/models/openaire-broker-event.model'; +import { OpenaireBrokerEventRestService } from '../../../core/openaire/broker/events/openaire-broker-event-rest.service'; +import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; +import { Metadata } from '../../../core/shared/metadata.utils'; +import { followLink } from '../../../shared/utils/follow-link-config.model'; +import { hasValue } from '../../../shared/empty.util'; +import { ItemSearchResult } from '../../../shared/object-collection/shared/item-search-result.model'; +import { NotificationsService } from '../../../shared/notifications/notifications.service'; +import { + OpenaireBrokerEventData, + ProjectEntryImportModalComponent +} from '../project-entry-import-modal/project-entry-import-modal.component'; +import { getFirstCompletedRemoteData } from '../../../core/shared/operators'; +import { PaginationService } from '../../../core/pagination/pagination.service'; +import { combineLatest } from 'rxjs/internal/observable/combineLatest'; +import { Item } from '../../../core/shared/item.model'; + +/** + * Component to display the OpenAIRE Broker event list. + */ +@Component({ + selector: 'ds-openaire-broker-events', + templateUrl: './openaire-broker-events.component.html', + styleUrls: ['./openaire-broker-events.scomponent.scss'], +}) +export class OpenaireBrokerEventsComponent implements OnInit { + /** + * The pagination system configuration for HTML listing. + * @type {PaginationComponentOptions} + */ + public paginationConfig: PaginationComponentOptions = Object.assign(new PaginationComponentOptions(), { + id: 'bep', + currentPage: 1, + pageSize: 10, + pageSizeOptions: [5, 10, 20, 40, 60] + }); + /** + * The OpenAIRE Broker event list sort options. + * @type {SortOptions} + */ + public paginationSortConfig: SortOptions = new SortOptions('trust', SortDirection.DESC); + /** + * Array to save the presence of a project inside an OpenAIRE Broker event. + * @type {OpenaireBrokerEventData[]>} + */ + public eventsUpdated$: BehaviorSubject = new BehaviorSubject([]); + /** + * The total number of OpenAIRE Broker events. + * @type {Observable} + */ + public totalElements$: Observable; + /** + * The topic of the OpenAIRE Broker events; suitable for displaying. + * @type {string} + */ + public showTopic: string; + /** + * The topic of the OpenAIRE Broker events; suitable for HTTP calls. + * @type {string} + */ + public topic: string; + /** + * The rejected/ignore reason. + * @type {string} + */ + public selectedReason: string; + /** + * Contains the information about the loading status of the page. + * @type {Observable} + */ + public isEventPageLoading: BehaviorSubject = new BehaviorSubject(false); + /** + * Contains the information about the loading status of the events inside the pagination component. + * @type {Observable} + */ + public isEventLoading: BehaviorSubject = new BehaviorSubject(false); + /** + * The modal reference. + * @type {any} + */ + public modalRef: any; + /** + * Used to store the status of the 'Show more' button of the abstracts. + * @type {boolean} + */ + public showMore = false; + /** + * The FindListOptions object + */ + protected defaultConfig: FindListOptions = Object.assign(new FindListOptions(), {sort: this.paginationSortConfig}); + /** + * Array to track all the component subscriptions. Useful to unsubscribe them with 'onDestroy'. + * @type {Array} + */ + protected subs: Subscription[] = []; + + /** + * Initialize the component variables. + * @param {ActivatedRoute} activatedRoute + * @param {NgbModal} modalService + * @param {NotificationsService} notificationsService + * @param {OpenaireBrokerEventRestService} openaireBrokerEventRestService + * @param {PaginationService} paginationService + * @param {TranslateService} translateService + */ + constructor( + private activatedRoute: ActivatedRoute, + private modalService: NgbModal, + private notificationsService: NotificationsService, + private openaireBrokerEventRestService: OpenaireBrokerEventRestService, + private paginationService: PaginationService, + private translateService: TranslateService + ) { + } + + /** + * Component initialization. + */ + ngOnInit(): void { + this.isEventPageLoading.next(true); + + this.activatedRoute.paramMap.pipe( + map((params) => params.get('id')), + take(1) + ).subscribe((id: string) => { + const regEx = /!/g; + this.showTopic = id.replace(regEx, '/'); + this.topic = id; + this.isEventPageLoading.next(false); + this.getOpenaireBrokerEvents(); + }); + } + + /** + * Check if table have a detail column + */ + public hasDetailColumn(): boolean { + return (this.showTopic.indexOf('/PROJECT') !== -1 || + this.showTopic.indexOf('/PID') !== -1 || + this.showTopic.indexOf('/SUBJECT') !== -1 || + this.showTopic.indexOf('/ABSTRACT') !== -1 + ); + } + + /** + * Open a modal or run the executeAction directly based on the presence of the project. + * + * @param {string} action + * the action (can be: ACCEPTED, REJECTED, DISCARDED, PENDING) + * @param {OpenaireBrokerEventData} eventData + * the OpenAIRE Broker event data + * @param {any} content + * Reference to the modal + */ + public modalChoice(action: string, eventData: OpenaireBrokerEventData, content: any): void { + if (eventData.hasProject) { + this.executeAction(action, eventData); + } else { + this.openModal(action, eventData, content); + } + } + + /** + * Open the selected modal and performs the action if needed. + * + * @param {string} action + * the action (can be: ACCEPTED, REJECTED, DISCARDED, PENDING) + * @param {OpenaireBrokerEventData} eventData + * the OpenAIRE Broker event data + * @param {any} content + * Reference to the modal + */ + public openModal(action: string, eventData: OpenaireBrokerEventData, content: any): void { + this.modalService.open(content, { ariaLabelledBy: 'modal-basic-title' }).result.then( + (result) => { + if (result === 'do') { + eventData.reason = this.selectedReason; + this.executeAction(action, eventData); + } + this.selectedReason = null; + }, + (_reason) => { + this.selectedReason = null; + } + ); + } + + /** + * Open a modal where the user can select the project. + * + * @param {OpenaireBrokerEventData} eventData + * the OpenAIRE Broker event item data + */ + public openModalLookup(eventData: OpenaireBrokerEventData): void { + this.modalRef = this.modalService.open(ProjectEntryImportModalComponent, { + size: 'lg' + }); + const modalComp = this.modalRef.componentInstance; + modalComp.externalSourceEntry = eventData; + modalComp.label = 'project'; + this.subs.push( + modalComp.importedObject.pipe(take(1)) + .subscribe((object: ItemSearchResult) => { + const projectTitle = Metadata.first(object.indexableObject.metadata, 'dc.title'); + this.boundProject( + eventData, + object.indexableObject.id, + projectTitle.value, + object.indexableObject.handle + ); + }) + ); + } + + /** + * Performs the choosen action calling the REST service. + * + * @param {string} action + * the action (can be: ACCEPTED, REJECTED, DISCARDED, PENDING) + * @param {OpenaireBrokerEventData} eventData + * the OpenAIRE Broker event data + */ + public executeAction(action: string, eventData: OpenaireBrokerEventData): void { + eventData.isRunning = true; + this.subs.push( + this.openaireBrokerEventRestService.patchEvent(action, eventData.event, eventData.reason).pipe(getFirstCompletedRemoteData()) + .subscribe((rd: RemoteData) => { + if (rd.isSuccess && rd.statusCode === 200) { + this.notificationsService.success( + this.translateService.instant('openaire.broker.event.action.saved') + ); + this.getOpenaireBrokerEvents(); + } else { + this.notificationsService.error( + this.translateService.instant('openaire.broker.event.action.error') + ); + } + eventData.isRunning = false; + }) + ); + } + + /** + * Bound a project to the publication described in the OpenAIRE Broker event calling the REST service. + * + * @param {OpenaireBrokerEventData} eventData + * the OpenAIRE Broker event item data + * @param {string} projectId + * the project Id to bound + * @param {string} projectTitle + * the project title + * @param {string} projectHandle + * the project handle + */ + public boundProject(eventData: OpenaireBrokerEventData, projectId: string, projectTitle: string, projectHandle: string): void { + eventData.isRunning = true; + this.subs.push( + this.openaireBrokerEventRestService.boundProject(eventData.id, projectId).pipe(getFirstCompletedRemoteData()) + .subscribe((rd: RemoteData) => { + if (rd.isSuccess) { + this.notificationsService.success( + this.translateService.instant('openaire.broker.event.project.bounded') + ); + eventData.hasProject = true; + eventData.projectTitle = projectTitle; + eventData.handle = projectHandle; + eventData.projectId = projectId; + } else { + this.notificationsService.error( + this.translateService.instant('openaire.broker.event.project.error') + ); + } + eventData.isRunning = false; + }) + ); + } + + /** + * Remove the bounded project from the publication described in the OpenAIRE Broker event calling the REST service. + * + * @param {OpenaireBrokerEventData} eventData + * the OpenAIRE Broker event data + */ + public removeProject(eventData: OpenaireBrokerEventData): void { + eventData.isRunning = true; + this.subs.push( + this.openaireBrokerEventRestService.removeProject(eventData.id).pipe(getFirstCompletedRemoteData()) + .subscribe((rd: RemoteData) => { + if (rd.isSuccess) { + this.notificationsService.success( + this.translateService.instant('openaire.broker.event.project.removed') + ); + eventData.hasProject = false; + eventData.projectTitle = null; + eventData.handle = null; + eventData.projectId = null; + } else { + this.notificationsService.error( + this.translateService.instant('openaire.broker.event.project.error') + ); + } + eventData.isRunning = false; + }) + ); + } + + /** + * Check if the event has a valid href. + * @param event + */ + public hasPIDHref(event: OpenaireBrokerEventMessageObject): boolean { + return this.getPIDHref(event) !== null; + } + + /** + * Get the event pid href. + * @param event + */ + public getPIDHref(event: OpenaireBrokerEventMessageObject): string { + return this.computePIDHref(event); + } + + + /** + * Dispatch the OpenAIRE Broker events retrival. + */ + public getOpenaireBrokerEvents(): void { + this.paginationService.getFindListOptions(this.paginationConfig.id, this.defaultConfig).pipe( + distinctUntilChanged(), + switchMap((options: FindListOptions) => this.openaireBrokerEventRestService.getEventsByTopic( + this.topic, + options, + followLink('target'), followLink('related') + )), + getFirstCompletedRemoteData(), + ).subscribe((rd: RemoteData>) => { + if (rd.hasSucceeded) { + this.isEventLoading.next(false); + this.totalElements$ = observableOf(rd.payload.totalElements); + this.setEventUpdated(rd.payload.page); + } else { + throw new Error('Can\'t retrieve OpenAIRE Broker events from the Broker events REST service'); + } + this.openaireBrokerEventRestService.clearFindByTopicRequests(); + }); + } + + /** + * Unsubscribe from all subscriptions. + */ + ngOnDestroy(): void { + this.subs + .filter((sub) => hasValue(sub)) + .forEach((sub) => sub.unsubscribe()); + } + + /** + * Set the project status for the OpenAIRE Broker events. + * + * @param {OpenaireBrokerEventObject[]} events + * the OpenAIRE Broker event item + */ + protected setEventUpdated(events: OpenaireBrokerEventObject[]): void { + this.subs.push( + from(events).pipe( + mergeMap((event: OpenaireBrokerEventObject) => { + const related$ = event.related.pipe( + getFirstCompletedRemoteData(), + ); + const target$ = event.target.pipe( + getFirstCompletedRemoteData() + ); + return combineLatest([related$, target$]).pipe( + map(([relatedItemRD, targetItemRD]: [RemoteData, RemoteData]) => { + const data: OpenaireBrokerEventData = { + event: event, + id: event.id, + title: event.title, + hasProject: false, + projectTitle: null, + projectId: null, + handle: null, + reason: null, + isRunning: false, + target: (targetItemRD?.hasSucceeded) ? targetItemRD.payload : null, + }; + if (relatedItemRD?.hasSucceeded && relatedItemRD?.payload?.id) { + data.hasProject = true; + data.projectTitle = event.message.title; + data.projectId = relatedItemRD?.payload?.id; + data.handle = relatedItemRD?.payload?.handle; + } + return data; + }) + ); + }), + scan((acc: any, value: any) => [...acc, value], []), + take(events.length) + ).subscribe( + (eventsReduced) => { + this.eventsUpdated$.next(eventsReduced); + } + ) + ); + } + + protected computePIDHref(event: OpenaireBrokerEventMessageObject) { + const type = event.type.toLowerCase(); + const pid = event.value; + let prefix = null; + switch (type) { + case 'arxiv': { + prefix = 'https://arxiv.org/abs/'; + break; + } + case 'handle': { + prefix = 'https://hdl.handle.net/'; + break; + } + case 'urn': { + prefix = ''; + break; + } + case 'doi': { + prefix = 'https://doi.org/'; + break; + } + case 'pmc': { + prefix = 'https://www.ncbi.nlm.nih.gov/pmc/articles/'; + break; + } + case 'pmid': { + prefix = 'https://pubmed.ncbi.nlm.nih.gov/'; + break; + } + case 'ncid': { + prefix = 'https://ci.nii.ac.jp/ncid/'; + break; + } + default: { + break; + } + } + if (prefix === null) { + return null; + } + return prefix + pid; + } +} diff --git a/src/app/openaire/broker/events/openaire-broker-events.scomponent.scss b/src/app/openaire/broker/events/openaire-broker-events.scomponent.scss new file mode 100644 index 0000000000..b38da70f37 --- /dev/null +++ b/src/app/openaire/broker/events/openaire-broker-events.scomponent.scss @@ -0,0 +1,21 @@ +.button-rows { + min-width: 200px; +} + +.button-width { + width: 100%; +} + +.abstract-container { + height: 76px; + overflow: hidden; +} + +.text-ellipsis { + text-overflow: ellipsis; +} + +.show { + overflow: visible; + height: auto; +} diff --git a/src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.html b/src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.html new file mode 100644 index 0000000000..1090fd22fc --- /dev/null +++ b/src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.html @@ -0,0 +1,70 @@ + + + diff --git a/src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.scss b/src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.scss new file mode 100644 index 0000000000..7db9839e38 --- /dev/null +++ b/src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.scss @@ -0,0 +1,3 @@ +.modal-footer { + justify-content: space-between; +} diff --git a/src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.spec.ts b/src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.spec.ts new file mode 100644 index 0000000000..e19d0a7c86 --- /dev/null +++ b/src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.spec.ts @@ -0,0 +1,210 @@ +import { CommonModule } from '@angular/common'; +import { Component, NO_ERRORS_SCHEMA } from '@angular/core'; +import { async, ComponentFixture, inject, TestBed } from '@angular/core/testing'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; +import { TranslateModule } from '@ngx-translate/core'; +import { of as observableOf } from 'rxjs'; +import { SearchService } from '../../../core/shared/search/search.service'; +import { Item } from '../../../core/shared/item.model'; +import { createTestComponent } from '../../../shared/testing/utils.test'; +import { ImportType, ProjectEntryImportModalComponent } from './project-entry-import-modal.component'; +import { SelectableListService } from '../../../shared/object-list/selectable-list/selectable-list.service'; +import { getMockSearchService } from '../../../shared/mocks/search-service.mock'; +import { PaginatedSearchOptions } from '../../../shared/search/models/paginated-search-options.model'; +import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; +import { createSuccessfulRemoteDataObject } from '../../../shared/remote-data.utils'; +import { buildPaginatedList } from '../../../core/data/paginated-list.model'; +import { PageInfo } from '../../../core/shared/page-info.model'; +import { + ItemMockPid10, + openaireBrokerEventObjectMissingProjectFound, + OpenaireMockDspaceObject +} from '../../../shared/mocks/openaire.mock'; + +const eventData = { + event: openaireBrokerEventObjectMissingProjectFound, + id: openaireBrokerEventObjectMissingProjectFound.id, + title: openaireBrokerEventObjectMissingProjectFound.title, + hasProject: true, + projectTitle: openaireBrokerEventObjectMissingProjectFound.message.title, + projectId: ItemMockPid10.id, + handle: ItemMockPid10.handle, + reason: null, + isRunning: false +}; + +const searchString = 'Test project to search'; +const pagination = Object.assign( + new PaginationComponentOptions(), { + id: 'openaire-project-bound', + pageSize: 3 + } +); +const searchOptions = Object.assign(new PaginatedSearchOptions( + { + configuration: 'funding', + query: searchString, + pagination: pagination + } +)); +const pageInfo = new PageInfo({ + elementsPerPage: 3, + totalElements: 1, + totalPages: 1, + currentPage: 1 +}); +const array = [ + OpenaireMockDspaceObject, +]; +const paginatedList = buildPaginatedList(pageInfo, array); +const paginatedListRD = createSuccessfulRemoteDataObject(paginatedList); + +describe('ProjectEntryImportModalComponent test suite', () => { + let fixture: ComponentFixture; + let comp: ProjectEntryImportModalComponent; + let compAsAny: any; + + const modalStub = jasmine.createSpyObj('modal', ['close', 'dismiss']); + const uuid = '123e4567-e89b-12d3-a456-426614174003'; + const searchServiceStub: any = getMockSearchService(); + + + beforeEach(async (() => { + TestBed.configureTestingModule({ + imports: [ + CommonModule, + TranslateModule.forRoot(), + ], + declarations: [ + ProjectEntryImportModalComponent, + TestComponent, + ], + providers: [ + { provide: NgbActiveModal, useValue: modalStub }, + { provide: SearchService, useValue: searchServiceStub }, + { provide: SelectableListService, useValue: jasmine.createSpyObj('selectableListService', ['deselect', 'select', 'deselectAll']) }, + ProjectEntryImportModalComponent + ], + schemas: [NO_ERRORS_SCHEMA] + }).compileComponents().then(); + })); + + // First test to check the correct component creation + describe('', () => { + let testComp: TestComponent; + let testFixture: ComponentFixture; + + // synchronous beforeEach + beforeEach(() => { + searchServiceStub.search.and.returnValue(observableOf(paginatedListRD)); + const html = ` + `; + testFixture = createTestComponent(html, TestComponent) as ComponentFixture; + testComp = testFixture.componentInstance; + }); + + afterEach(() => { + testFixture.destroy(); + }); + + it('should create ProjectEntryImportModalComponent', inject([ProjectEntryImportModalComponent], (app: ProjectEntryImportModalComponent) => { + expect(app).toBeDefined(); + })); + }); + + describe('Main tests', () => { + beforeEach(() => { + fixture = TestBed.createComponent(ProjectEntryImportModalComponent); + comp = fixture.componentInstance; + compAsAny = comp; + + }); + + describe('close', () => { + it('should close the modal', () => { + comp.close(); + expect(modalStub.close).toHaveBeenCalled(); + }); + }); + + describe('search', () => { + it('should call SearchService.search', () => { + + (searchServiceStub as any).search.and.returnValue(observableOf(paginatedListRD)); + comp.pagination = pagination; + + comp.search(searchString); + expect(comp.searchService.search).toHaveBeenCalledWith(searchOptions); + }); + }); + + describe('bound', () => { + it('should call close, deselectAllLists and importedObject.emit', () => { + spyOn(comp, 'deselectAllLists'); + spyOn(comp, 'close'); + spyOn(comp.importedObject, 'emit'); + comp.selectedEntity = OpenaireMockDspaceObject; + comp.bound(); + + expect(comp.importedObject.emit).toHaveBeenCalled(); + expect(comp.deselectAllLists).toHaveBeenCalled(); + expect(comp.close).toHaveBeenCalled(); + }); + }); + + describe('selectEntity', () => { + const entity = Object.assign(new Item(), { uuid: uuid }); + beforeEach(() => { + comp.selectEntity(entity); + }); + + it('should set selected entity', () => { + expect(comp.selectedEntity).toBe(entity); + }); + + it('should set the import type to local entity', () => { + expect(comp.selectedImportType).toEqual(ImportType.LocalEntity); + }); + }); + + describe('deselectEntity', () => { + const entity = Object.assign(new Item(), { uuid: uuid }); + beforeEach(() => { + comp.selectedImportType = ImportType.LocalEntity; + comp.selectedEntity = entity; + comp.deselectEntity(); + }); + + it('should remove the selected entity', () => { + expect(comp.selectedEntity).toBeUndefined(); + }); + + it('should set the import type to none', () => { + expect(comp.selectedImportType).toEqual(ImportType.None); + }); + }); + + describe('deselectAllLists', () => { + it('should call SelectableListService.deselectAll', () => { + comp.deselectAllLists(); + expect(compAsAny.selectService.deselectAll).toHaveBeenCalledWith(comp.entityListId); + expect(compAsAny.selectService.deselectAll).toHaveBeenCalledWith(comp.authorityListId); + }); + }); + + afterEach(() => { + fixture.destroy(); + comp = null; + compAsAny = null; + }); + }); +}); + +// declare a test component +@Component({ + selector: 'ds-test-cmp', + template: `` +}) +class TestComponent { + eventData = eventData; +} diff --git a/src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.ts b/src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.ts new file mode 100644 index 0000000000..5d8cb20c6d --- /dev/null +++ b/src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.ts @@ -0,0 +1,274 @@ +import { Component, EventEmitter, Input, OnInit } from '@angular/core'; +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; +import { Observable, of as observableOf, Subscription } from 'rxjs'; +import { RemoteData } from '../../../core/data/remote-data'; +import { PaginatedList } from '../../../core/data/paginated-list.model'; +import { SearchResult } from '../../../shared/search/models/search-result.model'; +import { PaginatedSearchOptions } from '../../../shared/search/models/paginated-search-options.model'; +import { CollectionElementLinkType } from '../../../shared/object-collection/collection-element-link.type'; +import { Context } from '../../../core/shared/context.model'; +import { SelectableListService } from '../../../shared/object-list/selectable-list/selectable-list.service'; +import { ListableObject } from '../../../shared/object-collection/shared/listable-object.model'; +import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; +import { SearchService } from '../../../core/shared/search/search.service'; +import { DSpaceObject } from '../../../core/shared/dspace-object.model'; +import { OpenaireBrokerEventObject } from '../../../core/openaire/broker/models/openaire-broker-event.model'; +import { hasValue, isNotEmpty } from '../../../shared/empty.util'; +import { Item } from '../../../core/shared/item.model'; + +/** + * The possible types of import for the external entry + */ +export enum ImportType { + None = 'None', + LocalEntity = 'LocalEntity', + LocalAuthority = 'LocalAuthority', + NewEntity = 'NewEntity', + NewAuthority = 'NewAuthority' +} + +/** + * The data type passed from the parent page + */ +export interface OpenaireBrokerEventData { + /** + * The OpenAIRE Broker event + */ + event: OpenaireBrokerEventObject; + /** + * The OpenAIRE Broker event Id (uuid) + */ + id: string; + /** + * The publication title + */ + title: string; + /** + * Contains the boolean that indicates if a project is present + */ + hasProject: boolean; + /** + * The project title, if present + */ + projectTitle: string; + /** + * The project id (uuid), if present + */ + projectId: string; + /** + * The project handle, if present + */ + handle: string; + /** + * The reject/discard reason + */ + reason: string; + /** + * Contains the boolean that indicates if there is a running operation (REST call) + */ + isRunning: boolean; + /** + * The related publication DSpace item + */ + target?: Item; +} + +@Component({ + selector: 'ds-project-entry-import-modal', + styleUrls: ['./project-entry-import-modal.component.scss'], + templateUrl: './project-entry-import-modal.component.html' +}) +/** + * Component to display a modal window for linking a project to an OpenAIRE Broker event + * Shows information about the selected project and a selectable list. + */ +export class ProjectEntryImportModalComponent implements OnInit { + /** + * The external source entry + */ + @Input() externalSourceEntry: OpenaireBrokerEventData; + /** + * The number of results per page + */ + pageSize = 3; + /** + * The prefix for every i18n key within this modal + */ + labelPrefix = 'openaire.broker.event.modal.'; + /** + * The search configuration to retrieve project + */ + configuration = 'funding'; + /** + * The label to use for all messages (added to the end of relevant i18n keys) + */ + label: string; + /** + * The project title from the parent object + */ + projectTitle: string; + /** + * The search results + */ + localEntitiesRD$: Observable>>>; + /** + * Information about the data loading status + */ + isLoading$ = observableOf(true); + /** + * Search options to use for fetching projects + */ + searchOptions: PaginatedSearchOptions; + /** + * The context we're currently in (submission) + */ + context = Context.EntitySearchModalWithNameVariants; + /** + * List ID for selecting local entities + */ + entityListId = 'openaire-project-bound'; + /** + * List ID for selecting local authorities + */ + authorityListId = 'openaire-project-bound-authority'; + /** + * ImportType enum + */ + importType = ImportType; + /** + * The type of link to render in listable elements + */ + linkTypes = CollectionElementLinkType; + /** + * The type of import the user currently has selected + */ + selectedImportType = ImportType.None; + /** + * The selected local entity + */ + selectedEntity: ListableObject; + /** + * An project has been selected, send it to the parent component + */ + importedObject: EventEmitter = new EventEmitter(); + /** + * Pagination options + */ + pagination: PaginationComponentOptions; + /** + * Array to track all the component subscriptions. Useful to unsubscribe them with 'onDestroy'. + * @type {Array} + */ + protected subs: Subscription[] = []; + + /** + * Initialize the component variables. + * @param {NgbActiveModal} modal + * @param {SearchService} searchService + * @param {SelectableListService} selectService + */ + constructor(public modal: NgbActiveModal, + public searchService: SearchService, + private selectService: SelectableListService) { } + + /** + * Component intitialization. + */ + public ngOnInit(): void { + this.pagination = Object.assign(new PaginationComponentOptions(), { id: 'openaire-project-bound', pageSize: this.pageSize }); + this.projectTitle = (this.externalSourceEntry.projectTitle !== null) ? this.externalSourceEntry.projectTitle : this.externalSourceEntry.event.message.title; + this.searchOptions = Object.assign(new PaginatedSearchOptions( + { + configuration: this.configuration, + query: this.projectTitle, + pagination: this.pagination + } + )); + this.localEntitiesRD$ = this.searchService.search(this.searchOptions); + this.subs.push( + this.localEntitiesRD$.subscribe( + () => this.isLoading$ = observableOf(false) + ) + ); + } + + /** + * Close the modal. + */ + public close(): void { + this.deselectAllLists(); + this.modal.close(); + } + + /** + * Perform a project search by title. + */ + public search(searchTitle): void { + if (isNotEmpty(searchTitle)) { + const filterRegEx = /[:]/g; + this.isLoading$ = observableOf(true); + this.searchOptions = Object.assign(new PaginatedSearchOptions( + { + configuration: this.configuration, + query: (searchTitle) ? searchTitle.replace(filterRegEx, '') : searchTitle, + pagination: this.pagination + } + )); + this.localEntitiesRD$ = this.searchService.search(this.searchOptions); + this.subs.push( + this.localEntitiesRD$.subscribe( + () => this.isLoading$ = observableOf(false) + ) + ); + } + } + + /** + * Perform the bound of the project. + */ + public bound(): void { + if (this.selectedEntity !== undefined) { + this.importedObject.emit(this.selectedEntity); + } + this.selectedImportType = ImportType.None; + this.deselectAllLists(); + this.close(); + } + + /** + * Deselected a local entity + */ + public deselectEntity(): void { + this.selectedEntity = undefined; + if (this.selectedImportType === ImportType.LocalEntity) { + this.selectedImportType = ImportType.None; + } + } + + /** + * Selected a local entity + * @param entity + */ + public selectEntity(entity): void { + this.selectedEntity = entity; + this.selectedImportType = ImportType.LocalEntity; + } + + /** + * Deselect every element from both entity and authority lists + */ + public deselectAllLists(): void { + this.selectService.deselectAll(this.entityListId); + this.selectService.deselectAll(this.authorityListId); + } + + /** + * Unsubscribe from all subscriptions. + */ + ngOnDestroy(): void { + this.deselectAllLists(); + this.subs + .filter((sub) => hasValue(sub)) + .forEach((sub) => sub.unsubscribe()); + } +} diff --git a/src/app/openaire/broker/topics/openaire-broker-topics.actions.ts b/src/app/openaire/broker/topics/openaire-broker-topics.actions.ts new file mode 100644 index 0000000000..fd98c6acb8 --- /dev/null +++ b/src/app/openaire/broker/topics/openaire-broker-topics.actions.ts @@ -0,0 +1,99 @@ +import { Action } from '@ngrx/store'; +import { type } from '../../../shared/ngrx/type'; +import { OpenaireBrokerTopicObject } from '../../../core/openaire/broker/models/openaire-broker-topic.model'; + +/** + * For each action type in an action group, make a simple + * enum object for all of this group's action types. + * + * The 'type' utility function coerces strings into string + * literal types and runs a simple check to guarantee all + * action types in the application are unique. + */ +export const OpenaireBrokerTopicActionTypes = { + ADD_TOPICS: type('dspace/integration/openaire/broker/topic/ADD_TOPICS'), + RETRIEVE_ALL_TOPICS: type('dspace/integration/openaire/broker/topic/RETRIEVE_ALL_TOPICS'), + RETRIEVE_ALL_TOPICS_ERROR: type('dspace/integration/openaire/broker/topic/RETRIEVE_ALL_TOPICS_ERROR'), +}; + +/* tslint:disable:max-classes-per-file */ + +/** + * An ngrx action to retrieve all the OpenAIRE Broker topics. + */ +export class RetrieveAllTopicsAction implements Action { + type = OpenaireBrokerTopicActionTypes.RETRIEVE_ALL_TOPICS; + payload: { + elementsPerPage: number; + currentPage: number; + }; + + /** + * Create a new RetrieveAllTopicsAction. + * + * @param elementsPerPage + * the number of topics per page + * @param currentPage + * The page number to retrieve + */ + constructor(elementsPerPage: number, currentPage: number) { + this.payload = { + elementsPerPage, + currentPage + }; + } +} + +/** + * An ngrx action for retrieving 'all OpenAIRE Broker topics' error. + */ +export class RetrieveAllTopicsErrorAction implements Action { + type = OpenaireBrokerTopicActionTypes.RETRIEVE_ALL_TOPICS_ERROR; +} + +/** + * An ngrx action to load the OpenAIRE Broker topic objects. + * Called by the ??? effect. + */ +export class AddTopicsAction implements Action { + type = OpenaireBrokerTopicActionTypes.ADD_TOPICS; + payload: { + topics: OpenaireBrokerTopicObject[]; + totalPages: number; + currentPage: number; + totalElements: number; + }; + + /** + * Create a new AddTopicsAction. + * + * @param topics + * the list of topics + * @param totalPages + * the total available pages of topics + * @param currentPage + * the current page + * @param totalElements + * the total available OpenAIRE Broker topics + */ + constructor(topics: OpenaireBrokerTopicObject[], totalPages: number, currentPage: number, totalElements: number) { + this.payload = { + topics, + totalPages, + currentPage, + totalElements + }; + } + +} + +/* tslint:enable:max-classes-per-file */ + +/** + * Export a type alias of all actions in this action group + * so that reducers can easily compose action types. + */ +export type OpenaireBrokerTopicsActions + = AddTopicsAction + |RetrieveAllTopicsAction + |RetrieveAllTopicsErrorAction; diff --git a/src/app/openaire/broker/topics/openaire-broker-topics.component.html b/src/app/openaire/broker/topics/openaire-broker-topics.component.html new file mode 100644 index 0000000000..d8321bc932 --- /dev/null +++ b/src/app/openaire/broker/topics/openaire-broker-topics.component.html @@ -0,0 +1,57 @@ +
+
+
+

{{'openaire.broker.title'| translate}}

+

{{'openaire.broker.topics.description'| translate}}

+
+
+
+
+

{{'openaire.broker.topics'| translate}}

+ + + + + + + +
+ + + + + + + + + + + + + + + +
{{'openaire.broker.table.topic' | translate}}{{'openaire.broker.table.last-event' | translate}}{{'openaire.broker.table.actions' | translate}}
{{topicElement.name}}{{topicElement.lastEvent}} +
+ +
+
+
+
+
+
+
+
diff --git a/src/app/openaire/broker/topics/openaire-broker-topics.component.scss b/src/app/openaire/broker/topics/openaire-broker-topics.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/openaire/broker/topics/openaire-broker-topics.component.spec.ts b/src/app/openaire/broker/topics/openaire-broker-topics.component.spec.ts new file mode 100644 index 0000000000..00ea772ff9 --- /dev/null +++ b/src/app/openaire/broker/topics/openaire-broker-topics.component.spec.ts @@ -0,0 +1,152 @@ +import { CommonModule } from '@angular/common'; +import { Component, NO_ERRORS_SCHEMA } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { TranslateModule } from '@ngx-translate/core'; +import { of as observableOf } from 'rxjs'; +import { ComponentFixture, inject, TestBed, waitForAsync } from '@angular/core/testing'; +import { createTestComponent } from '../../../shared/testing/utils.test'; +import { + getMockOpenaireStateService, + openaireBrokerTopicObjectMoreAbstract, + openaireBrokerTopicObjectMorePid +} from '../../../shared/mocks/openaire.mock'; +import { OpenaireBrokerTopicsComponent } from './openaire-broker-topics.component'; +import { OpenaireStateService } from '../../openaire-state.service'; +import { cold } from 'jasmine-marbles'; +import { PaginationServiceStub } from '../../../shared/testing/pagination-service.stub'; +import { PaginationService } from '../../../core/pagination/pagination.service'; + +describe('OpenaireBrokerTopicsComponent test suite', () => { + let fixture: ComponentFixture; + let comp: OpenaireBrokerTopicsComponent; + let compAsAny: any; + const mockOpenaireStateService = getMockOpenaireStateService(); + const activatedRouteParams = { + openaireBrokerTopicsParams: { + currentPage: 0, + pageSize: 5 + } + }; + const paginationService = new PaginationServiceStub(); + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [ + CommonModule, + TranslateModule.forRoot(), + ], + declarations: [ + OpenaireBrokerTopicsComponent, + TestComponent, + ], + providers: [ + { provide: OpenaireStateService, useValue: mockOpenaireStateService }, + { provide: ActivatedRoute, useValue: { data: observableOf(activatedRouteParams), params: observableOf({}) } }, + { provide: PaginationService, useValue: paginationService }, + OpenaireBrokerTopicsComponent + ], + schemas: [NO_ERRORS_SCHEMA] + }).compileComponents().then(() => { + mockOpenaireStateService.getOpenaireBrokerTopics.and.returnValue(observableOf([ + openaireBrokerTopicObjectMorePid, + openaireBrokerTopicObjectMoreAbstract + ])); + mockOpenaireStateService.getOpenaireBrokerTopicsTotalPages.and.returnValue(observableOf(1)); + mockOpenaireStateService.getOpenaireBrokerTopicsCurrentPage.and.returnValue(observableOf(0)); + mockOpenaireStateService.getOpenaireBrokerTopicsTotals.and.returnValue(observableOf(2)); + mockOpenaireStateService.isOpenaireBrokerTopicsLoaded.and.returnValue(observableOf(true)); + mockOpenaireStateService.isOpenaireBrokerTopicsLoading.and.returnValue(observableOf(false)); + mockOpenaireStateService.isOpenaireBrokerTopicsProcessing.and.returnValue(observableOf(false)); + }); + })); + + // First test to check the correct component creation + describe('', () => { + let testComp: TestComponent; + let testFixture: ComponentFixture; + + // synchronous beforeEach + beforeEach(() => { + const html = ` + `; + testFixture = createTestComponent(html, TestComponent) as ComponentFixture; + testComp = testFixture.componentInstance; + }); + + afterEach(() => { + testFixture.destroy(); + }); + + it('should create OpenaireBrokerTopicsComponent', inject([OpenaireBrokerTopicsComponent], (app: OpenaireBrokerTopicsComponent) => { + expect(app).toBeDefined(); + })); + }); + + describe('Main tests running with two topics', () => { + beforeEach(() => { + fixture = TestBed.createComponent(OpenaireBrokerTopicsComponent); + comp = fixture.componentInstance; + compAsAny = comp; + + }); + + afterEach(() => { + fixture.destroy(); + comp = null; + compAsAny = null; + }); + + it(('Should init component properly'), () => { + comp.ngOnInit(); + fixture.detectChanges(); + + expect(comp.topics$).toBeObservable(cold('(a|)', { + a: [ + openaireBrokerTopicObjectMorePid, + openaireBrokerTopicObjectMoreAbstract + ] + })); + expect(comp.totalElements$).toBeObservable(cold('(a|)', { + a: 2 + })); + }); + + it(('Should set data properly after the view init'), () => { + spyOn(compAsAny, 'getOpenaireBrokerTopics'); + + comp.ngAfterViewInit(); + fixture.detectChanges(); + + expect(compAsAny.getOpenaireBrokerTopics).toHaveBeenCalled(); + }); + + it(('isTopicsLoading should return FALSE'), () => { + expect(comp.isTopicsLoading()).toBeObservable(cold('(a|)', { + a: false + })); + }); + + it(('isTopicsProcessing should return FALSE'), () => { + expect(comp.isTopicsProcessing()).toBeObservable(cold('(a|)', { + a: false + })); + }); + + it(('getOpenaireBrokerTopics should call the service to dispatch a STATE change'), () => { + comp.ngOnInit(); + fixture.detectChanges(); + + compAsAny.openaireStateService.dispatchRetrieveOpenaireBrokerTopics(comp.paginationConfig.pageSize, comp.paginationConfig.currentPage).and.callThrough(); + expect(compAsAny.openaireStateService.dispatchRetrieveOpenaireBrokerTopics).toHaveBeenCalledWith(comp.paginationConfig.pageSize, comp.paginationConfig.currentPage); + }); + }); +}); + +// declare a test component +@Component({ + selector: 'ds-test-cmp', + template: `` +}) +class TestComponent { + +} diff --git a/src/app/openaire/broker/topics/openaire-broker-topics.component.ts b/src/app/openaire/broker/topics/openaire-broker-topics.component.ts new file mode 100644 index 0000000000..408e21d946 --- /dev/null +++ b/src/app/openaire/broker/topics/openaire-broker-topics.component.ts @@ -0,0 +1,142 @@ +import { Component, OnInit } from '@angular/core'; + +import { Observable, Subscription } from 'rxjs'; +import { distinctUntilChanged, take } from 'rxjs/operators'; + +import { SortOptions } from '../../../core/cache/models/sort-options.model'; +import { OpenaireBrokerTopicObject } from '../../../core/openaire/broker/models/openaire-broker-topic.model'; +import { hasValue } from '../../../shared/empty.util'; +import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; +import { OpenaireStateService } from '../../openaire-state.service'; +import { AdminNotificationsOpenaireTopicsPageParams } from '../../../admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page-resolver.service'; +import { PaginationService } from '../../../core/pagination/pagination.service'; + +/** + * Component to display the OpenAIRE Broker topic list. + */ +@Component({ + selector: 'ds-openaire-broker-topic', + templateUrl: './openaire-broker-topics.component.html', + styleUrls: ['./openaire-broker-topics.component.scss'], +}) +export class OpenaireBrokerTopicsComponent implements OnInit { + /** + * The pagination system configuration for HTML listing. + * @type {PaginationComponentOptions} + */ + public paginationConfig: PaginationComponentOptions = Object.assign(new PaginationComponentOptions(), { + id: 'btp', + pageSize: 10, + pageSizeOptions: [5, 10, 20, 40, 60] + }); + /** + * The OpenAIRE Broker topic list sort options. + * @type {SortOptions} + */ + public paginationSortConfig: SortOptions; + /** + * The OpenAIRE Broker topic list. + */ + public topics$: Observable; + /** + * The total number of OpenAIRE Broker topics. + */ + public totalElements$: Observable; + /** + * Array to track all the component subscriptions. Useful to unsubscribe them with 'onDestroy'. + * @type {Array} + */ + protected subs: Subscription[] = []; + + /** + * Initialize the component variables. + * @param {PaginationService} paginationService + * @param {OpenaireStateService} openaireStateService + */ + constructor( + private paginationService: PaginationService, + private openaireStateService: OpenaireStateService, + ) { } + + /** + * Component initialization. + */ + ngOnInit(): void { + this.topics$ = this.openaireStateService.getOpenaireBrokerTopics(); + this.totalElements$ = this.openaireStateService.getOpenaireBrokerTopicsTotals(); + } + + /** + * First OpenAIRE Broker topics loading after view initialization. + */ + ngAfterViewInit(): void { + this.subs.push( + this.openaireStateService.isOpenaireBrokerTopicsLoaded().pipe( + take(1) + ).subscribe(() => { + this.getOpenaireBrokerTopics(); + }) + ); + } + + /** + * Returns the information about the loading status of the OpenAIRE Broker topics (if it's running or not). + * + * @return Observable + * 'true' if the topics are loading, 'false' otherwise. + */ + public isTopicsLoading(): Observable { + return this.openaireStateService.isOpenaireBrokerTopicsLoading(); + } + + /** + * Returns the information about the processing status of the OpenAIRE Broker topics (if it's running or not). + * + * @return Observable + * 'true' if there are operations running on the topics (ex.: a REST call), 'false' otherwise. + */ + public isTopicsProcessing(): Observable { + return this.openaireStateService.isOpenaireBrokerTopicsProcessing(); + } + + /** + * Dispatch the OpenAIRE Broker topics retrival. + */ + public getOpenaireBrokerTopics(): void { + this.paginationService.getCurrentPagination(this.paginationConfig.id, this.paginationConfig).pipe( + distinctUntilChanged(), + ).subscribe((options: PaginationComponentOptions) => { + this.openaireStateService.dispatchRetrieveOpenaireBrokerTopics( + options.pageSize, + options.currentPage + ); + }); + } + + /** + * Update pagination Config from route params + * + * @param eventsRouteParams + */ + protected updatePaginationFromRouteParams(eventsRouteParams: AdminNotificationsOpenaireTopicsPageParams) { + if (eventsRouteParams.currentPage) { + this.paginationConfig.currentPage = eventsRouteParams.currentPage; + } + if (eventsRouteParams.pageSize) { + if (this.paginationConfig.pageSizeOptions.includes(eventsRouteParams.pageSize)) { + this.paginationConfig.pageSize = eventsRouteParams.pageSize; + } else { + this.paginationConfig.pageSize = this.paginationConfig.pageSizeOptions[0]; + } + } + } + + /** + * Unsubscribe from all subscriptions. + */ + ngOnDestroy(): void { + this.subs + .filter((sub) => hasValue(sub)) + .forEach((sub) => sub.unsubscribe()); + } +} diff --git a/src/app/openaire/broker/topics/openaire-broker-topics.effects.ts b/src/app/openaire/broker/topics/openaire-broker-topics.effects.ts new file mode 100644 index 0000000000..b590b122f5 --- /dev/null +++ b/src/app/openaire/broker/topics/openaire-broker-topics.effects.ts @@ -0,0 +1,87 @@ +import { Injectable } from '@angular/core'; +import { Store } from '@ngrx/store'; +import { Actions, Effect, ofType } from '@ngrx/effects'; +import { TranslateService } from '@ngx-translate/core'; +import { catchError, map, switchMap, tap, withLatestFrom } from 'rxjs/operators'; +import { of as observableOf } from 'rxjs'; +import { + AddTopicsAction, + OpenaireBrokerTopicActionTypes, + RetrieveAllTopicsAction, + RetrieveAllTopicsErrorAction, +} from './openaire-broker-topics.actions'; + +import { OpenaireBrokerTopicObject } from '../../../core/openaire/broker/models/openaire-broker-topic.model'; +import { PaginatedList } from '../../../core/data/paginated-list.model'; +import { OpenaireBrokerTopicsService } from './openaire-broker-topics.service'; +import { NotificationsService } from '../../../shared/notifications/notifications.service'; +import { OpenaireBrokerTopicRestService } from '../../../core/openaire/broker/topics/openaire-broker-topic-rest.service'; + +/** + * Provides effect methods for the OpenAIRE Broker topics actions. + */ +@Injectable() +export class OpenaireBrokerTopicsEffects { + + /** + * Retrieve all OpenAIRE Broker topics managing pagination and errors. + */ + @Effect() retrieveAllTopics$ = this.actions$.pipe( + ofType(OpenaireBrokerTopicActionTypes.RETRIEVE_ALL_TOPICS), + withLatestFrom(this.store$), + switchMap(([action, currentState]: [RetrieveAllTopicsAction, any]) => { + return this.openaireBrokerTopicService.getTopics( + action.payload.elementsPerPage, + action.payload.currentPage + ).pipe( + map((topics: PaginatedList) => + new AddTopicsAction(topics.page, topics.totalPages, topics.currentPage, topics.totalElements) + ), + catchError((error: Error) => { + if (error) { + console.error(error.message); + } + return observableOf(new RetrieveAllTopicsErrorAction()); + }) + ); + }) + ); + + /** + * Show a notification on error. + */ + @Effect({ dispatch: false }) retrieveAllTopicsErrorAction$ = this.actions$.pipe( + ofType(OpenaireBrokerTopicActionTypes.RETRIEVE_ALL_TOPICS_ERROR), + tap(() => { + this.notificationsService.error(null, this.translate.get('openaire.broker.topic.error.service.retrieve')); + }) + ); + + /** + * Clear find all topics requests from cache. + */ + @Effect({ dispatch: false }) addTopicsAction$ = this.actions$.pipe( + ofType(OpenaireBrokerTopicActionTypes.ADD_TOPICS), + tap(() => { + this.openaireBrokerTopicDataService.clearFindAllTopicsRequests(); + }) + ); + + /** + * Initialize the effect class variables. + * @param {Actions} actions$ + * @param {Store} store$ + * @param {TranslateService} translate + * @param {NotificationsService} notificationsService + * @param {OpenaireBrokerTopicsService} openaireBrokerTopicService + * @param {OpenaireBrokerTopicRestService} openaireBrokerTopicDataService + */ + constructor( + private actions$: Actions, + private store$: Store, + private translate: TranslateService, + private notificationsService: NotificationsService, + private openaireBrokerTopicService: OpenaireBrokerTopicsService, + private openaireBrokerTopicDataService: OpenaireBrokerTopicRestService + ) { } +} diff --git a/src/app/openaire/broker/topics/openaire-broker-topics.reducer.spec.ts b/src/app/openaire/broker/topics/openaire-broker-topics.reducer.spec.ts new file mode 100644 index 0000000000..b4ee60558b --- /dev/null +++ b/src/app/openaire/broker/topics/openaire-broker-topics.reducer.spec.ts @@ -0,0 +1,68 @@ +import { + AddTopicsAction, + RetrieveAllTopicsAction, + RetrieveAllTopicsErrorAction +} from './openaire-broker-topics.actions'; +import { openaireBrokerTopicsReducer, OpenaireBrokerTopicState } from './openaire-broker-topics.reducer'; +import { + openaireBrokerTopicObjectMoreAbstract, + openaireBrokerTopicObjectMorePid +} from '../../../shared/mocks/openaire.mock'; + +describe('openaireBrokerTopicsReducer test suite', () => { + let openaireBrokerTopicInitialState: OpenaireBrokerTopicState; + const elementPerPage = 3; + const currentPage = 0; + + beforeEach(() => { + openaireBrokerTopicInitialState = { + topics: [], + processing: false, + loaded: false, + totalPages: 0, + currentPage: 0, + totalElements: 0 + }; + }); + + it('Action RETRIEVE_ALL_TOPICS should set the State property "processing" to TRUE', () => { + const expectedState = openaireBrokerTopicInitialState; + expectedState.processing = true; + + const action = new RetrieveAllTopicsAction(elementPerPage, currentPage); + const newState = openaireBrokerTopicsReducer(openaireBrokerTopicInitialState, action); + + expect(newState).toEqual(expectedState); + }); + + it('Action RETRIEVE_ALL_TOPICS_ERROR should change the State to initial State but processing, loaded, and currentPage', () => { + const expectedState = openaireBrokerTopicInitialState; + expectedState.processing = false; + expectedState.loaded = true; + expectedState.currentPage = 0; + + const action = new RetrieveAllTopicsErrorAction(); + const newState = openaireBrokerTopicsReducer(openaireBrokerTopicInitialState, action); + + expect(newState).toEqual(expectedState); + }); + + it('Action ADD_TOPICS should populate the State with OpenAIRE Broker topics', () => { + const expectedState = { + topics: [ openaireBrokerTopicObjectMorePid, openaireBrokerTopicObjectMoreAbstract ], + processing: false, + loaded: true, + totalPages: 1, + currentPage: 0, + totalElements: 2 + }; + + const action = new AddTopicsAction( + [ openaireBrokerTopicObjectMorePid, openaireBrokerTopicObjectMoreAbstract ], + 1, 0, 2 + ); + const newState = openaireBrokerTopicsReducer(openaireBrokerTopicInitialState, action); + + expect(newState).toEqual(expectedState); + }); +}); diff --git a/src/app/openaire/broker/topics/openaire-broker-topics.reducer.ts b/src/app/openaire/broker/topics/openaire-broker-topics.reducer.ts new file mode 100644 index 0000000000..6ae596117f --- /dev/null +++ b/src/app/openaire/broker/topics/openaire-broker-topics.reducer.ts @@ -0,0 +1,72 @@ +import { OpenaireBrokerTopicObject } from '../../../core/openaire/broker/models/openaire-broker-topic.model'; +import { OpenaireBrokerTopicActionTypes, OpenaireBrokerTopicsActions } from './openaire-broker-topics.actions'; + +/** + * The interface representing the OpenAIRE Broker topic state. + */ +export interface OpenaireBrokerTopicState { + topics: OpenaireBrokerTopicObject[]; + processing: boolean; + loaded: boolean; + totalPages: number; + currentPage: number; + totalElements: number; +} + +/** + * Used for the OpenAIRE Broker topic state initialization. + */ +const openaireBrokerTopicInitialState: OpenaireBrokerTopicState = { + topics: [], + processing: false, + loaded: false, + totalPages: 0, + currentPage: 0, + totalElements: 0 +}; + +/** + * The OpenAIRE Broker Topic Reducer + * + * @param state + * the current state initialized with openaireBrokerTopicInitialState + * @param action + * the action to perform on the state + * @return OpenaireBrokerTopicState + * the new state + */ +export function openaireBrokerTopicsReducer(state = openaireBrokerTopicInitialState, action: OpenaireBrokerTopicsActions): OpenaireBrokerTopicState { + switch (action.type) { + case OpenaireBrokerTopicActionTypes.RETRIEVE_ALL_TOPICS: { + return Object.assign({}, state, { + topics: [], + processing: true + }); + } + + case OpenaireBrokerTopicActionTypes.ADD_TOPICS: { + return Object.assign({}, state, { + topics: action.payload.topics, + processing: false, + loaded: true, + totalPages: action.payload.totalPages, + currentPage: state.currentPage, + totalElements: action.payload.totalElements + }); + } + + case OpenaireBrokerTopicActionTypes.RETRIEVE_ALL_TOPICS_ERROR: { + return Object.assign({}, state, { + processing: false, + loaded: true, + totalPages: 0, + currentPage: 0, + totalElements: 0 + }); + } + + default: { + return state; + } + } +} diff --git a/src/app/openaire/broker/topics/openaire-broker-topics.service.spec.ts b/src/app/openaire/broker/topics/openaire-broker-topics.service.spec.ts new file mode 100644 index 0000000000..3daed2c3bf --- /dev/null +++ b/src/app/openaire/broker/topics/openaire-broker-topics.service.spec.ts @@ -0,0 +1,67 @@ +import { TestBed } from '@angular/core/testing'; +import { of as observableOf } from 'rxjs'; +import { OpenaireBrokerTopicsService } from './openaire-broker-topics.service'; +import { SortDirection, SortOptions } from '../../../core/cache/models/sort-options.model'; +import { OpenaireBrokerTopicRestService } from '../../../core/openaire/broker/topics/openaire-broker-topic-rest.service'; +import { PageInfo } from '../../../core/shared/page-info.model'; +import { FindListOptions } from '../../../core/data/request.models'; +import { + getMockOpenaireBrokerTopicRestService, + openaireBrokerTopicObjectMoreAbstract, + openaireBrokerTopicObjectMorePid +} from '../../../shared/mocks/openaire.mock'; +import { createSuccessfulRemoteDataObject } from '../../../shared/remote-data.utils'; +import { cold } from 'jasmine-marbles'; +import { buildPaginatedList } from '../../../core/data/paginated-list.model'; + +describe('OpenaireBrokerTopicsService', () => { + let service: OpenaireBrokerTopicsService; + let restService: OpenaireBrokerTopicRestService; + let serviceAsAny: any; + let restServiceAsAny: any; + + const pageInfo = new PageInfo(); + const array = [ openaireBrokerTopicObjectMorePid, openaireBrokerTopicObjectMoreAbstract ]; + const paginatedList = buildPaginatedList(pageInfo, array); + const paginatedListRD = createSuccessfulRemoteDataObject(paginatedList); + const elementsPerPage = 3; + const currentPage = 0; + + beforeEach(async () => { + TestBed.configureTestingModule({ + providers: [ + { provide: OpenaireBrokerTopicRestService, useClass: getMockOpenaireBrokerTopicRestService }, + { provide: OpenaireBrokerTopicsService, useValue: service } + ] + }).compileComponents(); + }); + + beforeEach(() => { + restService = TestBed.get(OpenaireBrokerTopicRestService); + restServiceAsAny = restService; + restServiceAsAny.getTopics.and.returnValue(observableOf(paginatedListRD)); + service = new OpenaireBrokerTopicsService(restService); + serviceAsAny = service; + }); + + describe('getTopics', () => { + it('Should proxy the call to openaireBrokerTopicRestService.getTopics', () => { + const sortOptions = new SortOptions('name', SortDirection.ASC); + const findListOptions: FindListOptions = { + elementsPerPage: elementsPerPage, + currentPage: currentPage, + sort: sortOptions + }; + const result = service.getTopics(elementsPerPage, currentPage); + expect((service as any).openaireBrokerTopicRestService.getTopics).toHaveBeenCalledWith(findListOptions); + }); + + it('Should return a paginated list of OpenAIRE Broker topics', () => { + const expected = cold('(a|)', { + a: paginatedList + }); + const result = service.getTopics(elementsPerPage, currentPage); + expect(result).toBeObservable(expected); + }); + }); +}); diff --git a/src/app/openaire/broker/topics/openaire-broker-topics.service.ts b/src/app/openaire/broker/topics/openaire-broker-topics.service.ts new file mode 100644 index 0000000000..17f189922f --- /dev/null +++ b/src/app/openaire/broker/topics/openaire-broker-topics.service.ts @@ -0,0 +1,55 @@ +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs'; +import { find, map } from 'rxjs/operators'; +import { OpenaireBrokerTopicRestService } from '../../../core/openaire/broker/topics/openaire-broker-topic-rest.service'; +import { SortDirection, SortOptions } from '../../../core/cache/models/sort-options.model'; +import { FindListOptions } from '../../../core/data/request.models'; +import { RemoteData } from '../../../core/data/remote-data'; +import { PaginatedList } from '../../../core/data/paginated-list.model'; +import { OpenaireBrokerTopicObject } from '../../../core/openaire/broker/models/openaire-broker-topic.model'; + +/** + * The service handling all OpenAIRE Broker topic requests to the REST service. + */ +@Injectable() +export class OpenaireBrokerTopicsService { + + /** + * Initialize the service variables. + * @param {OpenaireBrokerTopicRestService} openaireBrokerTopicRestService + */ + constructor( + private openaireBrokerTopicRestService: OpenaireBrokerTopicRestService + ) { } + + /** + * Return the list of OpenAIRE Broker topics managing pagination and errors. + * + * @param elementsPerPage + * The number of the topics per page + * @param currentPage + * The page number to retrieve + * @return Observable> + * The list of OpenAIRE Broker topics. + */ + public getTopics(elementsPerPage, currentPage): Observable> { + const sortOptions = new SortOptions('name', SortDirection.ASC); + + const findListOptions: FindListOptions = { + elementsPerPage: elementsPerPage, + currentPage: currentPage, + sort: sortOptions + }; + + return this.openaireBrokerTopicRestService.getTopics(findListOptions).pipe( + find((rd: RemoteData>) => !rd.isResponsePending), + map((rd: RemoteData>) => { + if (rd.hasSucceeded) { + return rd.payload; + } else { + throw new Error('Can\'t retrieve OpenAIRE Broker topics from the Broker topics REST service'); + } + }) + ); + } +} diff --git a/src/app/openaire/openaire-state.service.spec.ts b/src/app/openaire/openaire-state.service.spec.ts new file mode 100644 index 0000000000..874d4b4e1a --- /dev/null +++ b/src/app/openaire/openaire-state.service.spec.ts @@ -0,0 +1,275 @@ +import { TestBed } from '@angular/core/testing'; +import { Store, StoreModule } from '@ngrx/store'; +import { provideMockStore } from '@ngrx/store/testing'; +import { cold } from 'jasmine-marbles'; +import { openaireReducers } from './openaire.reducer'; +import { OpenaireStateService } from './openaire-state.service'; +import { + openaireBrokerTopicObjectMissingPid, + openaireBrokerTopicObjectMoreAbstract, + openaireBrokerTopicObjectMorePid +} from '../shared/mocks/openaire.mock'; +import { RetrieveAllTopicsAction } from './broker/topics/openaire-broker-topics.actions'; + +describe('OpenaireStateService', () => { + let service: OpenaireStateService; + let serviceAsAny: any; + let store: any; + let initialState: any; + + function init(mode: string) { + if (mode === 'empty') { + initialState = { + openaire: { + brokerTopic: { + topics: [], + processing: false, + loaded: false, + totalPages: 0, + currentPage: 0, + totalElements: 0, + totalLoadedPages: 0 + } + } + }; + } else { + initialState = { + openaire: { + brokerTopic: { + topics: [ + openaireBrokerTopicObjectMorePid, + openaireBrokerTopicObjectMoreAbstract, + openaireBrokerTopicObjectMissingPid + ], + processing: false, + loaded: true, + totalPages: 1, + currentPage: 1, + totalElements: 3, + totalLoadedPages: 1 + } + } + }; + } + } + + describe('Testing methods with empty topic objects', () => { + beforeEach(async () => { + init('empty'); + TestBed.configureTestingModule({ + imports: [ + StoreModule.forRoot({ openaire: openaireReducers } as any), + ], + providers: [ + provideMockStore({ initialState }), + { provide: OpenaireStateService, useValue: service } + ] + }).compileComponents(); + }); + + beforeEach(() => { + store = TestBed.get(Store); + service = new OpenaireStateService(store); + serviceAsAny = service; + spyOn(store, 'dispatch'); + }); + + describe('getOpenaireBrokerTopics', () => { + it('Should return an empty array', () => { + const result = service.getOpenaireBrokerTopics(); + const expected = cold('(a)', { + a: [] + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('getOpenaireBrokerTopicsTotalPages', () => { + it('Should return zero (0)', () => { + const result = service.getOpenaireBrokerTopicsTotalPages(); + const expected = cold('(a)', { + a: 0 + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('getOpenaireBrokerTopicsCurrentPage', () => { + it('Should return minus one (0)', () => { + const result = service.getOpenaireBrokerTopicsCurrentPage(); + const expected = cold('(a)', { + a: 0 + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('getOpenaireBrokerTopicsTotals', () => { + it('Should return zero (0)', () => { + const result = service.getOpenaireBrokerTopicsTotals(); + const expected = cold('(a)', { + a: 0 + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('isOpenaireBrokerTopicsLoading', () => { + it('Should return TRUE', () => { + const result = service.isOpenaireBrokerTopicsLoading(); + const expected = cold('(a)', { + a: true + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('isOpenaireBrokerTopicsLoaded', () => { + it('Should return FALSE', () => { + const result = service.isOpenaireBrokerTopicsLoaded(); + const expected = cold('(a)', { + a: false + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('isOpenaireBrokerTopicsProcessing', () => { + it('Should return FALSE', () => { + const result = service.isOpenaireBrokerTopicsProcessing(); + const expected = cold('(a)', { + a: false + }); + expect(result).toBeObservable(expected); + }); + }); + }); + + describe('Testing methods with topic objects', () => { + beforeEach(async () => { + init('full'); + TestBed.configureTestingModule({ + imports: [ + StoreModule.forRoot({ openaire: openaireReducers } as any), + ], + providers: [ + provideMockStore({ initialState }), + { provide: OpenaireStateService, useValue: service } + ] + }).compileComponents(); + }); + + beforeEach(() => { + store = TestBed.get(Store); + service = new OpenaireStateService(store); + serviceAsAny = service; + spyOn(store, 'dispatch'); + }); + + describe('getOpenaireBrokerTopics', () => { + it('Should return an array of topics', () => { + const result = service.getOpenaireBrokerTopics(); + const expected = cold('(a)', { + a: [ + openaireBrokerTopicObjectMorePid, + openaireBrokerTopicObjectMoreAbstract, + openaireBrokerTopicObjectMissingPid + ] + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('getOpenaireBrokerTopicsTotalPages', () => { + it('Should return one (1)', () => { + const result = service.getOpenaireBrokerTopicsTotalPages(); + const expected = cold('(a)', { + a: 1 + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('getOpenaireBrokerTopicsCurrentPage', () => { + it('Should return minus zero (1)', () => { + const result = service.getOpenaireBrokerTopicsCurrentPage(); + const expected = cold('(a)', { + a: 1 + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('getOpenaireBrokerTopicsTotals', () => { + it('Should return three (3)', () => { + const result = service.getOpenaireBrokerTopicsTotals(); + const expected = cold('(a)', { + a: 3 + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('isOpenaireBrokerTopicsLoading', () => { + it('Should return FALSE', () => { + const result = service.isOpenaireBrokerTopicsLoading(); + const expected = cold('(a)', { + a: false + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('isOpenaireBrokerTopicsLoaded', () => { + it('Should return TRUE', () => { + const result = service.isOpenaireBrokerTopicsLoaded(); + const expected = cold('(a)', { + a: true + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('isOpenaireBrokerTopicsProcessing', () => { + it('Should return FALSE', () => { + const result = service.isOpenaireBrokerTopicsProcessing(); + const expected = cold('(a)', { + a: false + }); + expect(result).toBeObservable(expected); + }); + }); + }); + + describe('Testing the topic dispatch methods', () => { + beforeEach(async () => { + init('full'); + TestBed.configureTestingModule({ + imports: [ + StoreModule.forRoot({ openaire: openaireReducers } as any), + ], + providers: [ + provideMockStore({ initialState }), + { provide: OpenaireStateService, useValue: service } + ] + }).compileComponents(); + }); + + beforeEach(() => { + store = TestBed.get(Store); + service = new OpenaireStateService(store); + serviceAsAny = service; + spyOn(store, 'dispatch'); + }); + + describe('dispatchRetrieveOpenaireBrokerTopics', () => { + it('Should call store.dispatch', () => { + const elementsPerPage = 3; + const currentPage = 1; + const action = new RetrieveAllTopicsAction(elementsPerPage, currentPage); + service.dispatchRetrieveOpenaireBrokerTopics(elementsPerPage, currentPage); + expect(serviceAsAny.store.dispatch).toHaveBeenCalledWith(action); + }); + }); + }); +}); diff --git a/src/app/openaire/openaire-state.service.ts b/src/app/openaire/openaire-state.service.ts new file mode 100644 index 0000000000..10dd739ae5 --- /dev/null +++ b/src/app/openaire/openaire-state.service.ts @@ -0,0 +1,116 @@ +import { Injectable } from '@angular/core'; +import { select, Store } from '@ngrx/store'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { + getOpenaireBrokerTopicsCurrentPageSelector, + getOpenaireBrokerTopicsTotalPagesSelector, + getOpenaireBrokerTopicsTotalsSelector, + isOpenaireBrokerTopicsLoadedSelector, + openaireBrokerTopicsObjectSelector, + sOpenaireBrokerTopicsProcessingSelector +} from './selectors'; +import { OpenaireBrokerTopicObject } from '../core/openaire/broker/models/openaire-broker-topic.model'; +import { OpenaireState } from './openaire.reducer'; +import { RetrieveAllTopicsAction } from './broker/topics/openaire-broker-topics.actions'; + +/** + * The service handling the OpenAIRE State. + */ +@Injectable() +export class OpenaireStateService { + + /** + * Initialize the service variables. + * @param {Store} store + */ + constructor(private store: Store) { } + + // OpenAIRE Broker topics + // -------------------------------------------------------------------------- + + /** + * Returns the list of OpenAIRE Broker topics from the state. + * + * @return Observable + * The list of OpenAIRE Broker topics. + */ + public getOpenaireBrokerTopics(): Observable { + return this.store.pipe(select(openaireBrokerTopicsObjectSelector())); + } + + /** + * Returns the information about the loading status of the OpenAIRE Broker topics (if it's running or not). + * + * @return Observable + * 'true' if the topics are loading, 'false' otherwise. + */ + public isOpenaireBrokerTopicsLoading(): Observable { + return this.store.pipe( + select(isOpenaireBrokerTopicsLoadedSelector), + map((loaded: boolean) => !loaded) + ); + } + + /** + * Returns the information about the loading status of the OpenAIRE Broker topics (whether or not they were loaded). + * + * @return Observable + * 'true' if the topics are loaded, 'false' otherwise. + */ + public isOpenaireBrokerTopicsLoaded(): Observable { + return this.store.pipe(select(isOpenaireBrokerTopicsLoadedSelector)); + } + + /** + * Returns the information about the processing status of the OpenAIRE Broker topics (if it's running or not). + * + * @return Observable + * 'true' if there are operations running on the topics (ex.: a REST call), 'false' otherwise. + */ + public isOpenaireBrokerTopicsProcessing(): Observable { + return this.store.pipe(select(sOpenaireBrokerTopicsProcessingSelector)); + } + + /** + * Returns, from the state, the total available pages of the OpenAIRE Broker topics. + * + * @return Observable + * The number of the OpenAIRE Broker topics pages. + */ + public getOpenaireBrokerTopicsTotalPages(): Observable { + return this.store.pipe(select(getOpenaireBrokerTopicsTotalPagesSelector)); + } + + /** + * Returns the current page of the OpenAIRE Broker topics, from the state. + * + * @return Observable + * The number of the current OpenAIRE Broker topics page. + */ + public getOpenaireBrokerTopicsCurrentPage(): Observable { + return this.store.pipe(select(getOpenaireBrokerTopicsCurrentPageSelector)); + } + + /** + * Returns the total number of the OpenAIRE Broker topics. + * + * @return Observable + * The number of the OpenAIRE Broker topics. + */ + public getOpenaireBrokerTopicsTotals(): Observable { + return this.store.pipe(select(getOpenaireBrokerTopicsTotalsSelector)); + } + + /** + * Dispatch a request to change the OpenAIRE Broker topics state, retrieving the topics from the server. + * + * @param elementsPerPage + * The number of the topics per page. + * @param currentPage + * The number of the current page. + */ + public dispatchRetrieveOpenaireBrokerTopics(elementsPerPage: number, currentPage: number): void { + this.store.dispatch(new RetrieveAllTopicsAction(elementsPerPage, currentPage)); + } +} diff --git a/src/app/openaire/openaire.effects.ts b/src/app/openaire/openaire.effects.ts new file mode 100644 index 0000000000..9861c1a921 --- /dev/null +++ b/src/app/openaire/openaire.effects.ts @@ -0,0 +1,5 @@ +import { OpenaireBrokerTopicsEffects } from './broker/topics/openaire-broker-topics.effects'; + +export const openaireEffects = [ + OpenaireBrokerTopicsEffects +]; diff --git a/src/app/openaire/openaire.module.ts b/src/app/openaire/openaire.module.ts new file mode 100644 index 0000000000..ac5d4e7287 --- /dev/null +++ b/src/app/openaire/openaire.module.ts @@ -0,0 +1,74 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { Action, StoreConfig, StoreModule } from '@ngrx/store'; +import { EffectsModule } from '@ngrx/effects'; + +import { CoreModule } from '../core/core.module'; +import { SharedModule } from '../shared/shared.module'; +import { storeModuleConfig } from '../app.reducer'; +import { OpenaireBrokerTopicsComponent } from './broker/topics/openaire-broker-topics.component'; +import { OpenaireBrokerEventsComponent } from './broker/events/openaire-broker-events.component'; +import { OpenaireStateService } from './openaire-state.service'; +import { openaireReducers, OpenaireState } from './openaire.reducer'; +import { openaireEffects } from './openaire.effects'; +import { OpenaireBrokerTopicsService } from './broker/topics/openaire-broker-topics.service'; +import { OpenaireBrokerTopicRestService } from '../core/openaire/broker/topics/openaire-broker-topic-rest.service'; +import { OpenaireBrokerEventRestService } from '../core/openaire/broker/events/openaire-broker-event-rest.service'; +import { ProjectEntryImportModalComponent } from './broker/project-entry-import-modal/project-entry-import-modal.component'; +import { TranslateModule } from '@ngx-translate/core'; +import { SearchModule } from '../shared/search/search.module'; + +const MODULES = [ + CommonModule, + SharedModule, + CoreModule.forRoot(), + StoreModule.forFeature('openaire', openaireReducers, storeModuleConfig as StoreConfig), + EffectsModule.forFeature(openaireEffects), + TranslateModule +]; + +const COMPONENTS = [ + OpenaireBrokerTopicsComponent, + OpenaireBrokerEventsComponent +]; + +const DIRECTIVES = [ ]; + +const ENTRY_COMPONENTS = [ + ProjectEntryImportModalComponent +]; + +const PROVIDERS = [ + OpenaireStateService, + OpenaireBrokerTopicsService, + OpenaireBrokerTopicRestService, + OpenaireBrokerEventRestService +]; + +@NgModule({ + imports: [ + ...MODULES, + SearchModule + ], + declarations: [ + ...COMPONENTS, + ...DIRECTIVES, + ...ENTRY_COMPONENTS + ], + providers: [ + ...PROVIDERS + ], + entryComponents: [ + ...ENTRY_COMPONENTS + ], + exports: [ + ...COMPONENTS, + ...DIRECTIVES + ] +}) + +/** + * This module handles all components that are necessary for the OpenAIRE components + */ +export class OpenaireModule { +} diff --git a/src/app/openaire/openaire.reducer.ts b/src/app/openaire/openaire.reducer.ts new file mode 100644 index 0000000000..9ead098329 --- /dev/null +++ b/src/app/openaire/openaire.reducer.ts @@ -0,0 +1,16 @@ +import { ActionReducerMap, createFeatureSelector } from '@ngrx/store'; + +import { openaireBrokerTopicsReducer, OpenaireBrokerTopicState, } from './broker/topics/openaire-broker-topics.reducer'; + +/** + * The OpenAIRE State + */ +export interface OpenaireState { + 'brokerTopic': OpenaireBrokerTopicState; +} + +export const openaireReducers: ActionReducerMap = { + brokerTopic: openaireBrokerTopicsReducer, +}; + +export const openaireSelector = createFeatureSelector('openaire'); diff --git a/src/app/openaire/selectors.ts b/src/app/openaire/selectors.ts new file mode 100644 index 0000000000..fc3508eef4 --- /dev/null +++ b/src/app/openaire/selectors.ts @@ -0,0 +1,79 @@ +import { createSelector, MemoizedSelector } from '@ngrx/store'; +import { subStateSelector } from '../shared/selector.util'; +import { openaireSelector, OpenaireState } from './openaire.reducer'; +import { OpenaireBrokerTopicObject } from '../core/openaire/broker/models/openaire-broker-topic.model'; +import { OpenaireBrokerTopicState } from './broker/topics/openaire-broker-topics.reducer'; + +/** + * Returns the OpenAIRE state. + * @function _getOpenaireState + * @param {AppState} state Top level state. + * @return {OpenaireState} + */ +const _getOpenaireState = (state: any) => state.openaire; + +// OpenAIRE Broker topics +// ---------------------------------------------------------------------------- + +/** + * Returns the OpenAIRE Broker topics State. + * @function openaireBrokerTopicsStateSelector + * @return {OpenaireBrokerTopicState} + */ +export function openaireBrokerTopicsStateSelector(): MemoizedSelector { + return subStateSelector(openaireSelector, 'brokerTopic'); +} + +/** + * Returns the OpenAIRE Broker topics list. + * @function openaireBrokerTopicsObjectSelector + * @return {OpenaireBrokerTopicObject[]} + */ +export function openaireBrokerTopicsObjectSelector(): MemoizedSelector { + return subStateSelector(openaireBrokerTopicsStateSelector(), 'topics'); +} + +/** + * Returns true if the OpenAIRE Broker topics are loaded. + * @function isOpenaireBrokerTopicsLoadedSelector + * @return {boolean} + */ +export const isOpenaireBrokerTopicsLoadedSelector = createSelector(_getOpenaireState, + (state: OpenaireState) => state.brokerTopic.loaded +); + +/** + * Returns true if the deduplication sets are processing. + * @function isDeduplicationSetsProcessingSelector + * @return {boolean} + */ +export const sOpenaireBrokerTopicsProcessingSelector = createSelector(_getOpenaireState, + (state: OpenaireState) => state.brokerTopic.processing +); + +/** + * Returns the total available pages of OpenAIRE Broker topics. + * @function getOpenaireBrokerTopicsTotalPagesSelector + * @return {number} + */ +export const getOpenaireBrokerTopicsTotalPagesSelector = createSelector(_getOpenaireState, + (state: OpenaireState) => state.brokerTopic.totalPages +); + +/** + * Returns the current page of OpenAIRE Broker topics. + * @function getOpenaireBrokerTopicsCurrentPageSelector + * @return {number} + */ +export const getOpenaireBrokerTopicsCurrentPageSelector = createSelector(_getOpenaireState, + (state: OpenaireState) => state.brokerTopic.currentPage +); + +/** + * Returns the total number of OpenAIRE Broker topics. + * @function getOpenaireBrokerTopicsTotalsSelector + * @return {number} + */ +export const getOpenaireBrokerTopicsTotalsSelector = createSelector(_getOpenaireState, + (state: OpenaireState) => state.brokerTopic.totalElements +); diff --git a/src/app/shared/mocks/openaire.mock.ts b/src/app/shared/mocks/openaire.mock.ts new file mode 100644 index 0000000000..908aae1f67 --- /dev/null +++ b/src/app/shared/mocks/openaire.mock.ts @@ -0,0 +1,1796 @@ +import { of as observableOf } from 'rxjs'; +import { ResourceType } from '../../core/shared/resource-type'; +import { OpenaireBrokerTopicObject } from '../../core/openaire/broker/models/openaire-broker-topic.model'; +import { OpenaireBrokerEventObject } from '../../core/openaire/broker/models/openaire-broker-event.model'; +import { OpenaireBrokerTopicRestService } from '../../core/openaire/broker/topics/openaire-broker-topic-rest.service'; +import { OpenaireBrokerEventRestService } from '../../core/openaire/broker/events/openaire-broker-event-rest.service'; +import { DSpaceObject } from '../../core/shared/dspace-object.model'; +import { OpenaireStateService } from '../../openaire/openaire-state.service'; +import { Item } from '../../core/shared/item.model'; +import { + createNoContentRemoteDataObject$, + createSuccessfulRemoteDataObject, + createSuccessfulRemoteDataObject$ +} from '../remote-data.utils'; +import { SearchResult } from '../search/models/search-result.model'; + +// REST Mock --------------------------------------------------------------------- +// ------------------------------------------------------------------------------- + +// Items +// ------------------------------------------------------------------------------- + +const ItemMockPid1: Item = Object.assign( + new Item(), + { + handle: '10077/21486', + lastModified: '2017-04-24T19:44:08.178+0000', + isArchived: true, + isDiscoverable: true, + isWithdrawn: false, + _links:{ + self: { + href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357' + } + }, + id: 'ITEM4567-e89b-12d3-a456-426614174001', + uuid: 'ITEM4567-e89b-12d3-a456-426614174001', + type: 'item', + metadata: { + 'dc.creator': [ + { + language: 'en_US', + value: 'Doe, Jane' + } + ], + 'dc.date.accessioned': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.available': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.issued': [ + { + language: null, + value: '1650-06-26' + } + ], + 'dc.identifier.issn': [ + { + language: 'en_US', + value: '123456789' + } + ], + 'dc.identifier.uri': [ + { + language: null, + value: 'http://dspace7.4science.it/xmlui/handle/10673/6' + } + ], + 'dc.description.abstract': [ + { + language: 'en_US', + value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!' + } + ], + 'dc.description.provenance': [ + { + language: 'en', + value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).' + } + ], + 'dc.language': [ + { + language: 'en_US', + value: 'en' + } + ], + 'dc.rights': [ + { + language: 'en_US', + value: '© Jane Doe' + } + ], + 'dc.subject': [ + { + language: 'en_US', + value: 'keyword1' + }, + { + language: 'en_US', + value: 'keyword2' + }, + { + language: 'en_US', + value: 'keyword3' + } + ], + 'dc.title': [ + { + language: 'en_US', + value: 'Index nominum et rerum' + } + ], + 'dc.type': [ + { + language: 'en_US', + value: 'text' + } + ] + } + } +); + +const ItemMockPid2: Item = Object.assign( + new Item(), + { + handle: '10077/21486', + lastModified: '2017-04-24T19:44:08.178+0000', + isArchived: true, + isDiscoverable: true, + isWithdrawn: false, + _links:{ + self: { + href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357' + } + }, + id: 'ITEM4567-e89b-12d3-a456-426614174004', + uuid: 'ITEM4567-e89b-12d3-a456-426614174004', + type: 'item', + metadata: { + 'dc.creator': [ + { + language: 'en_US', + value: 'Doe, Jane' + } + ], + 'dc.date.accessioned': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.available': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.issued': [ + { + language: null, + value: '1650-06-26' + } + ], + 'dc.identifier.issn': [ + { + language: 'en_US', + value: '123456789' + } + ], + 'dc.identifier.uri': [ + { + language: null, + value: 'http://dspace7.4science.it/xmlui/handle/10673/6' + } + ], + 'dc.description.abstract': [ + { + language: 'en_US', + value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!' + } + ], + 'dc.description.provenance': [ + { + language: 'en', + value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).' + } + ], + 'dc.language': [ + { + language: 'en_US', + value: 'en' + } + ], + 'dc.rights': [ + { + language: 'en_US', + value: '© Jane Doe' + } + ], + 'dc.subject': [ + { + language: 'en_US', + value: 'keyword1' + }, + { + language: 'en_US', + value: 'keyword2' + }, + { + language: 'en_US', + value: 'keyword3' + } + ], + 'dc.title': [ + { + language: 'en_US', + value: 'UNA NUOVA RILETTURA DELL\u0027 ARISTOTELE DI FRANZ BRENTANO ALLA LUCE DI ALCUNI INEDITI' + } + ], + 'dc.type': [ + { + language: 'en_US', + value: 'text' + } + ] + } + } +); + +const ItemMockPid3: Item = Object.assign( + new Item(), + { + handle: '10077/21486', + lastModified: '2017-04-24T19:44:08.178+0000', + isArchived: true, + isDiscoverable: true, + isWithdrawn: false, + _links:{ + self: { + href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357' + } + }, + id: 'ITEM4567-e89b-12d3-a456-426614174005', + uuid: 'ITEM4567-e89b-12d3-a456-426614174005', + type: 'item', + metadata: { + 'dc.creator': [ + { + language: 'en_US', + value: 'Doe, Jane' + } + ], + 'dc.date.accessioned': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.available': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.issued': [ + { + language: null, + value: '1650-06-26' + } + ], + 'dc.identifier.issn': [ + { + language: 'en_US', + value: '123456789' + } + ], + 'dc.identifier.uri': [ + { + language: null, + value: 'http://dspace7.4science.it/xmlui/handle/10673/6' + } + ], + 'dc.description.abstract': [ + { + language: 'en_US', + value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!' + } + ], + 'dc.description.provenance': [ + { + language: 'en', + value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).' + } + ], + 'dc.language': [ + { + language: 'en_US', + value: 'en' + } + ], + 'dc.rights': [ + { + language: 'en_US', + value: '© Jane Doe' + } + ], + 'dc.subject': [ + { + language: 'en_US', + value: 'keyword1' + }, + { + language: 'en_US', + value: 'keyword2' + }, + { + language: 'en_US', + value: 'keyword3' + } + ], + 'dc.title': [ + { + language: 'en_US', + value: 'Sustainable development' + } + ], + 'dc.type': [ + { + language: 'en_US', + value: 'text' + } + ] + } + } +); + +const ItemMockPid4: Item = Object.assign( + new Item(), + { + handle: '10077/21486', + lastModified: '2017-04-24T19:44:08.178+0000', + isArchived: true, + isDiscoverable: true, + isWithdrawn: false, + _links:{ + self: { + href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357' + } + }, + id: 'ITEM4567-e89b-12d3-a456-426614174006', + uuid: 'ITEM4567-e89b-12d3-a456-426614174006', + type: 'item', + metadata: { + 'dc.creator': [ + { + language: 'en_US', + value: 'Doe, Jane' + } + ], + 'dc.date.accessioned': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.available': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.issued': [ + { + language: null, + value: '1650-06-26' + } + ], + 'dc.identifier.issn': [ + { + language: 'en_US', + value: '123456789' + } + ], + 'dc.identifier.uri': [ + { + language: null, + value: 'http://dspace7.4science.it/xmlui/handle/10673/6' + } + ], + 'dc.description.abstract': [ + { + language: 'en_US', + value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!' + } + ], + 'dc.description.provenance': [ + { + language: 'en', + value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).' + } + ], + 'dc.language': [ + { + language: 'en_US', + value: 'en' + } + ], + 'dc.rights': [ + { + language: 'en_US', + value: '© Jane Doe' + } + ], + 'dc.subject': [ + { + language: 'en_US', + value: 'keyword1' + }, + { + language: 'en_US', + value: 'keyword2' + }, + { + language: 'en_US', + value: 'keyword3' + } + ], + 'dc.title': [ + { + language: 'en_US', + value: 'Reply to Critics' + } + ], + 'dc.type': [ + { + language: 'en_US', + value: 'text' + } + ] + } + } +); + +const ItemMockPid5: Item = Object.assign( + new Item(), + { + handle: '10077/21486', + lastModified: '2017-04-24T19:44:08.178+0000', + isArchived: true, + isDiscoverable: true, + isWithdrawn: false, + _links:{ + self: { + href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357' + } + }, + id: 'ITEM4567-e89b-12d3-a456-426614174007', + uuid: 'ITEM4567-e89b-12d3-a456-426614174007', + type: 'item', + metadata: { + 'dc.creator': [ + { + language: 'en_US', + value: 'Doe, Jane' + } + ], + 'dc.date.accessioned': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.available': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.issued': [ + { + language: null, + value: '1650-06-26' + } + ], + 'dc.identifier.issn': [ + { + language: 'en_US', + value: '123456789' + } + ], + 'dc.identifier.uri': [ + { + language: null, + value: 'http://dspace7.4science.it/xmlui/handle/10673/6' + } + ], + 'dc.description.abstract': [ + { + language: 'en_US', + value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!' + } + ], + 'dc.description.provenance': [ + { + language: 'en', + value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).' + } + ], + 'dc.language': [ + { + language: 'en_US', + value: 'en' + } + ], + 'dc.rights': [ + { + language: 'en_US', + value: '© Jane Doe' + } + ], + 'dc.subject': [ + { + language: 'en_US', + value: 'keyword1' + }, + { + language: 'en_US', + value: 'keyword2' + }, + { + language: 'en_US', + value: 'keyword3' + } + ], + 'dc.title': [ + { + language: 'en_US', + value: 'PROGETTAZIONE, SINTESI E VALUTAZIONE DELL\u0027ATTIVITA\u0027 ANTIMICOBATTERICA ED ANTIFUNGINA DI NUOVI DERIVATI ETEROCICLICI' + } + ], + 'dc.type': [ + { + language: 'en_US', + value: 'text' + } + ] + } + } +); + +const ItemMockPid6: Item = Object.assign( + new Item(), + { + handle: '10077/21486', + lastModified: '2017-04-24T19:44:08.178+0000', + isArchived: true, + isDiscoverable: true, + isWithdrawn: false, + _links:{ + self: { + href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357' + } + }, + id: 'ITEM4567-e89b-12d3-a456-426614174008', + uuid: 'ITEM4567-e89b-12d3-a456-426614174008', + type: 'item', + metadata: { + 'dc.creator': [ + { + language: 'en_US', + value: 'Doe, Jane' + } + ], + 'dc.date.accessioned': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.available': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.issued': [ + { + language: null, + value: '1650-06-26' + } + ], + 'dc.identifier.issn': [ + { + language: 'en_US', + value: '123456789' + } + ], + 'dc.identifier.uri': [ + { + language: null, + value: 'http://dspace7.4science.it/xmlui/handle/10673/6' + } + ], + 'dc.description.abstract': [ + { + language: 'en_US', + value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!' + } + ], + 'dc.description.provenance': [ + { + language: 'en', + value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).' + } + ], + 'dc.language': [ + { + language: 'en_US', + value: 'en' + } + ], + 'dc.rights': [ + { + language: 'en_US', + value: '© Jane Doe' + } + ], + 'dc.subject': [ + { + language: 'en_US', + value: 'keyword1' + }, + { + language: 'en_US', + value: 'keyword2' + }, + { + language: 'en_US', + value: 'keyword3' + } + ], + 'dc.title': [ + { + language: 'en_US', + value: 'Donald Davidson' + } + ], + 'dc.type': [ + { + language: 'en_US', + value: 'text' + } + ] + } + } +); + +const ItemMockPid7: Item = Object.assign( + new Item(), + { + handle: '10077/21486', + lastModified: '2017-04-24T19:44:08.178+0000', + isArchived: true, + isDiscoverable: true, + isWithdrawn: false, + _links:{ + self: { + href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357' + } + }, + id: 'ITEM4567-e89b-12d3-a456-426614174009', + uuid: 'ITEM4567-e89b-12d3-a456-426614174009', + type: 'item', + metadata: { + 'dc.creator': [ + { + language: 'en_US', + value: 'Doe, Jane' + } + ], + 'dc.date.accessioned': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.available': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.issued': [ + { + language: null, + value: '1650-06-26' + } + ], + 'dc.identifier.issn': [ + { + language: 'en_US', + value: '123456789' + } + ], + 'dc.identifier.uri': [ + { + language: null, + value: 'http://dspace7.4science.it/xmlui/handle/10673/6' + } + ], + 'dc.description.abstract': [ + { + language: 'en_US', + value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!' + } + ], + 'dc.description.provenance': [ + { + language: 'en', + value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).' + } + ], + 'dc.language': [ + { + language: 'en_US', + value: 'en' + } + ], + 'dc.rights': [ + { + language: 'en_US', + value: '© Jane Doe' + } + ], + 'dc.subject': [ + { + language: 'en_US', + value: 'keyword1' + }, + { + language: 'en_US', + value: 'keyword2' + }, + { + language: 'en_US', + value: 'keyword3' + } + ], + 'dc.title': [ + { + language: 'en_US', + value: 'Missing abstract article' + } + ], + 'dc.type': [ + { + language: 'en_US', + value: 'text' + } + ] + } + } +); + +export const ItemMockPid8: Item = Object.assign( + new Item(), + { + handle: '10077/21486', + lastModified: '2017-04-24T19:44:08.178+0000', + isArchived: true, + isDiscoverable: true, + isWithdrawn: false, + _links:{ + self: { + href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357' + } + }, + id: 'ITEM4567-e89b-12d3-a456-426614174002', + uuid: 'ITEM4567-e89b-12d3-a456-426614174002', + type: 'item', + metadata: { + 'dc.creator': [ + { + language: 'en_US', + value: 'Doe, Jane' + } + ], + 'dc.date.accessioned': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.available': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.issued': [ + { + language: null, + value: '1650-06-26' + } + ], + 'dc.identifier.issn': [ + { + language: 'en_US', + value: '123456789' + } + ], + 'dc.identifier.uri': [ + { + language: null, + value: 'http://dspace7.4science.it/xmlui/handle/10673/6' + } + ], + 'dc.description.abstract': [ + { + language: 'en_US', + value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!' + } + ], + 'dc.description.provenance': [ + { + language: 'en', + value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).' + } + ], + 'dc.language': [ + { + language: 'en_US', + value: 'en' + } + ], + 'dc.rights': [ + { + language: 'en_US', + value: '© Jane Doe' + } + ], + 'dc.subject': [ + { + language: 'en_US', + value: 'keyword1' + }, + { + language: 'en_US', + value: 'keyword2' + }, + { + language: 'en_US', + value: 'keyword3' + } + ], + 'dc.title': [ + { + language: 'en_US', + value: 'Egypt, crossroad of translations and literary interweavings (3rd-6th centuries). A reconsideration of earlier Coptic literature' + } + ], + 'dc.type': [ + { + language: 'en_US', + value: 'text' + } + ] + } + } +); + +export const ItemMockPid9: Item = Object.assign( + new Item(), + { + handle: '10077/21486', + lastModified: '2017-04-24T19:44:08.178+0000', + isArchived: true, + isDiscoverable: true, + isWithdrawn: false, + _links:{ + self: { + href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357' + } + }, + id: 'ITEM4567-e89b-12d3-a456-426614174003', + uuid: 'ITEM4567-e89b-12d3-a456-426614174003', + type: 'item', + metadata: { + 'dc.creator': [ + { + language: 'en_US', + value: 'Doe, Jane' + } + ], + 'dc.date.accessioned': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.available': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.issued': [ + { + language: null, + value: '1650-06-26' + } + ], + 'dc.identifier.issn': [ + { + language: 'en_US', + value: '123456789' + } + ], + 'dc.identifier.uri': [ + { + language: null, + value: 'http://dspace7.4science.it/xmlui/handle/10673/6' + } + ], + 'dc.description.abstract': [ + { + language: 'en_US', + value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!' + } + ], + 'dc.description.provenance': [ + { + language: 'en', + value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).' + } + ], + 'dc.language': [ + { + language: 'en_US', + value: 'en' + } + ], + 'dc.rights': [ + { + language: 'en_US', + value: '© Jane Doe' + } + ], + 'dc.subject': [ + { + language: 'en_US', + value: 'keyword1' + }, + { + language: 'en_US', + value: 'keyword2' + }, + { + language: 'en_US', + value: 'keyword3' + } + ], + 'dc.title': [ + { + language: 'en_US', + value: 'Morocco, crossroad of translations and literary interweavings (3rd-6th centuries). A reconsideration of earlier Coptic literature' + } + ], + 'dc.type': [ + { + language: 'en_US', + value: 'text' + } + ] + } + } +); + +export const ItemMockPid10: Item = Object.assign( + new Item(), + { + handle: '10713/29832', + lastModified: '2017-04-24T19:44:08.178+0000', + isArchived: true, + isDiscoverable: true, + isWithdrawn: false, + _links:{ + self: { + href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357' + } + }, + id: 'P23e4567-e89b-12d3-a456-426614174002', + uuid: 'P23e4567-e89b-12d3-a456-426614174002', + type: 'item', + metadata: { + 'dc.creator': [ + { + language: 'en_US', + value: 'Doe, Jane' + } + ], + 'dc.date.accessioned': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.available': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.issued': [ + { + language: null, + value: '1650-06-26' + } + ], + 'dc.identifier.issn': [ + { + language: 'en_US', + value: '123456789' + } + ], + 'dc.identifier.uri': [ + { + language: null, + value: 'http://dspace7.4science.it/xmlui/handle/10673/6' + } + ], + 'dc.description.abstract': [ + { + language: 'en_US', + value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!' + } + ], + 'dc.description.provenance': [ + { + language: 'en', + value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).' + } + ], + 'dc.language': [ + { + language: 'en_US', + value: 'en' + } + ], + 'dc.rights': [ + { + language: 'en_US', + value: '© Jane Doe' + } + ], + 'dc.subject': [ + { + language: 'en_US', + value: 'keyword1' + }, + { + language: 'en_US', + value: 'keyword2' + }, + { + language: 'en_US', + value: 'keyword3' + } + ], + 'dc.title': [ + { + language: 'en_US', + value: 'Tracking Papyrus and Parchment Paths: An Archaeological Atlas of Coptic Literature.\nLiterary Texts in their Geographical Context: Production, Copying, Usage, Dissemination and Storage' + } + ], + 'dc.type': [ + { + language: 'en_US', + value: 'text' + } + ] + } + } +); + +export const OpenaireMockDspaceObject: SearchResult = Object.assign( + new SearchResult(), + { + handle: '10713/29832', + lastModified: '2017-04-24T19:44:08.178+0000', + isArchived: true, + isDiscoverable: true, + isWithdrawn: false, + _links:{ + self: { + href: 'https://rest.api/rest/api/core/items/0ec7ff22-f211-40ab-a69e-c819b0b1f357' + } + }, + id: 'P23e4567-e89b-12d3-a456-426614174002', + uuid: 'P23e4567-e89b-12d3-a456-426614174002', + type: 'item', + metadata: { + 'dc.creator': [ + { + language: 'en_US', + value: 'Doe, Jane' + } + ], + 'dc.date.accessioned': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.available': [ + { + language: null, + value: '1650-06-26T19:58:25Z' + } + ], + 'dc.date.issued': [ + { + language: null, + value: '1650-06-26' + } + ], + 'dc.identifier.issn': [ + { + language: 'en_US', + value: '123456789' + } + ], + 'dc.identifier.uri': [ + { + language: null, + value: 'http://dspace7.4science.it/xmlui/handle/10673/6' + } + ], + 'dc.description.abstract': [ + { + language: 'en_US', + value: 'This is really just a sample abstract. If it was a real abstract it would contain useful information about this test document. Sorry though, nothing useful in this paragraph. You probably shouldn\'t have even bothered to read it!' + } + ], + 'dc.description.provenance': [ + { + language: 'en', + value: 'Made available in DSpace on 2012-06-26T19:58:25Z (GMT). No. of bitstreams: 2\r\ntest_ppt.ppt: 12707328 bytes, checksum: a353fc7d29b3c558c986f7463a41efd3 (MD5)\r\ntest_ppt.pptx: 12468572 bytes, checksum: 599305edb4ebee329667f2c35b14d1d6 (MD5)' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T09:17:34Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2013-06-13T11:04:16Z (GMT).' + }, + { + language: 'en', + value: 'Restored into DSpace on 2017-04-24T19:44:08Z (GMT).' + } + ], + 'dc.language': [ + { + language: 'en_US', + value: 'en' + } + ], + 'dc.rights': [ + { + language: 'en_US', + value: '© Jane Doe' + } + ], + 'dc.subject': [ + { + language: 'en_US', + value: 'keyword1' + }, + { + language: 'en_US', + value: 'keyword2' + }, + { + language: 'en_US', + value: 'keyword3' + } + ], + 'dc.title': [ + { + language: 'en_US', + value: 'Tracking Papyrus and Parchment Paths: An Archaeological Atlas of Coptic Literature.\nLiterary Texts in their Geographical Context: Production, Copying, Usage, Dissemination and Storage' + } + ], + 'dc.type': [ + { + language: 'en_US', + value: 'text' + } + ] + } + } +); + +// Topics +// ------------------------------------------------------------------------------- + +export const openaireBrokerTopicObjectMorePid: OpenaireBrokerTopicObject = { + type: new ResourceType('nbtopic'), + id: 'ENRICH!MORE!PID', + name: 'ENRICH/MORE/PID', + lastEvent: '2020/10/09 10:11 UTC', + totalEvents: 33, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbtopics/ENRICH!MORE!PID' + } + } +}; + +export const openaireBrokerTopicObjectMoreAbstract: OpenaireBrokerTopicObject = { + type: new ResourceType('nbtopic'), + id: 'ENRICH!MORE!ABSTRACT', + name: 'ENRICH/MORE/ABSTRACT', + lastEvent: '2020/09/08 21:14 UTC', + totalEvents: 5, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbtopics/ENRICH!MORE!ABSTRACT' + } + } +}; + +export const openaireBrokerTopicObjectMissingPid: OpenaireBrokerTopicObject = { + type: new ResourceType('nbtopic'), + id: 'ENRICH!MISSING!PID', + name: 'ENRICH/MISSING/PID', + lastEvent: '2020/10/01 07:36 UTC', + totalEvents: 4, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbtopics/ENRICH!MISSING!PID' + } + } +}; + +export const openaireBrokerTopicObjectMissingAbstract: OpenaireBrokerTopicObject = { + type: new ResourceType('nbtopic'), + id: 'ENRICH!MISSING!ABSTRACT', + name: 'ENRICH/MISSING/ABSTRACT', + lastEvent: '2020/10/08 16:14 UTC', + totalEvents: 71, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbtopics/ENRICH!MISSING!ABSTRACT' + } + } +}; + +export const openaireBrokerTopicObjectMissingAcm: OpenaireBrokerTopicObject = { + type: new ResourceType('nbtopic'), + id: 'ENRICH!MISSING!SUBJECT!ACM', + name: 'ENRICH/MISSING/SUBJECT/ACM', + lastEvent: '2020/09/21 17:51 UTC', + totalEvents: 18, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbtopics/ENRICH!MISSING!SUBJECT!ACM' + } + } +}; + +export const openaireBrokerTopicObjectMissingProject: OpenaireBrokerTopicObject = { + type: new ResourceType('nbtopic'), + id: 'ENRICH!MISSING!PROJECT', + name: 'ENRICH/MISSING/PROJECT', + lastEvent: '2020/09/17 10:28 UTC', + totalEvents: 6, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbtopics/ENRICH!MISSING!PROJECT' + } + } +}; + +// Events +// ------------------------------------------------------------------------------- + +export const openaireBrokerEventObjectMissingPid: OpenaireBrokerEventObject = { + id: '123e4567-e89b-12d3-a456-426614174001', + uuid: '123e4567-e89b-12d3-a456-426614174001', + type: new ResourceType('nbevent'), + originalId: 'oai:www.openstarts.units.it:10077/21486', + title: 'Index nominum et rerum', + trust: 0.375, + eventDate: '2020/10/09 10:11 UTC', + status: 'PENDING', + message: { + type: 'doi', + value: '10.18848/1447-9494/cgp/v15i09/45934', + abstract: null, + openaireId: null, + acronym: null, + code: null, + funder: null, + fundingProgram: null, + jurisdiction: null, + title: null + }, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174001', + }, + target: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174001/target' + }, + related: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174001/related' + } + }, + target: observableOf(createSuccessfulRemoteDataObject(ItemMockPid1)), + related: observableOf(createSuccessfulRemoteDataObject(ItemMockPid10)) +}; + +export const openaireBrokerEventObjectMissingPid2: OpenaireBrokerEventObject = { + id: '123e4567-e89b-12d3-a456-426614174004', + uuid: '123e4567-e89b-12d3-a456-426614174004', + type: new ResourceType('openaireBrokerEvent'), + originalId: 'oai:www.openstarts.units.it:10077/21486', + title: 'UNA NUOVA RILETTURA DELL\u0027 ARISTOTELE DI FRANZ BRENTANO ALLA LUCE DI ALCUNI INEDITI', + trust: 1.0, + eventDate: '2020/10/09 10:11 UTC', + status: 'PENDING', + message: { + type: 'urn', + value: 'http://thesis2.sba.units.it/store/handle/item/12238', + abstract: null, + openaireId: null, + acronym: null, + code: null, + funder: null, + fundingProgram: null, + jurisdiction: null, + title: null + }, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174004' + }, + target: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174004/target' + }, + related: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174004/related' + } + }, + target: observableOf(createSuccessfulRemoteDataObject(ItemMockPid2)), + related: observableOf(createSuccessfulRemoteDataObject(ItemMockPid10)) +}; + +export const openaireBrokerEventObjectMissingPid3: OpenaireBrokerEventObject = { + id: '123e4567-e89b-12d3-a456-426614174005', + uuid: '123e4567-e89b-12d3-a456-426614174005', + type: new ResourceType('openaireBrokerEvent'), + originalId: 'oai:www.openstarts.units.it:10077/554', + title: 'Sustainable development', + trust: 0.375, + eventDate: '2020/10/09 10:11 UTC', + status: 'PENDING', + message: { + type: 'doi', + value: '10.4324/9780203408889', + abstract: null, + openaireId: null, + acronym: null, + code: null, + funder: null, + fundingProgram: null, + jurisdiction: null, + title: null + }, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174005' + }, + target: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174005/target' + }, + related: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174005/related' + } + }, + target: observableOf(createSuccessfulRemoteDataObject(ItemMockPid3)), + related: observableOf(createSuccessfulRemoteDataObject(ItemMockPid10)) +}; + +export const openaireBrokerEventObjectMissingPid4: OpenaireBrokerEventObject = { + id: '123e4567-e89b-12d3-a456-426614174006', + uuid: '123e4567-e89b-12d3-a456-426614174006', + type: new ResourceType('openaireBrokerEvent'), + originalId: 'oai:www.openstarts.units.it:10077/10787', + title: 'Reply to Critics', + trust: 1.0, + eventDate: '2020/10/09 10:11 UTC', + status: 'PENDING', + message: { + type: 'doi', + value: '10.1080/13698230.2018.1430104', + abstract: null, + openaireId: null, + acronym: null, + code: null, + funder: null, + fundingProgram: null, + jurisdiction: null, + title: null + }, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174006' + }, + target: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174006/target' + }, + related: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174006/related' + } + }, + target: observableOf(createSuccessfulRemoteDataObject(ItemMockPid4)), + related: observableOf(createSuccessfulRemoteDataObject(ItemMockPid10)) +}; + +export const openaireBrokerEventObjectMissingPid5: OpenaireBrokerEventObject = { + id: '123e4567-e89b-12d3-a456-426614174007', + uuid: '123e4567-e89b-12d3-a456-426614174007', + type: new ResourceType('openaireBrokerEvent'), + originalId: 'oai:www.openstarts.units.it:10077/11339', + title: 'PROGETTAZIONE, SINTESI E VALUTAZIONE DELL\u0027ATTIVITA\u0027 ANTIMICOBATTERICA ED ANTIFUNGINA DI NUOVI DERIVATI ETEROCICLICI', + trust: 0.375, + eventDate: '2020/10/09 10:11 UTC', + status: 'PENDING', + message: { + type: 'urn', + value: 'http://thesis2.sba.units.it/store/handle/item/12477', + abstract: null, + openaireId: null, + acronym: null, + code: null, + funder: null, + fundingProgram: null, + jurisdiction: null, + title: null + }, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174007' + }, + target: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174007/target' + }, + related: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174007/related' + } + }, + target: observableOf(createSuccessfulRemoteDataObject(ItemMockPid5)), + related: observableOf(createSuccessfulRemoteDataObject(ItemMockPid10)) +}; + +export const openaireBrokerEventObjectMissingPid6: OpenaireBrokerEventObject = { + id: '123e4567-e89b-12d3-a456-426614174008', + uuid: '123e4567-e89b-12d3-a456-426614174008', + type: new ResourceType('openaireBrokerEvent'), + originalId: 'oai:www.openstarts.units.it:10077/29860', + title: 'Donald Davidson', + trust: 0.375, + eventDate: '2020/10/09 10:11 UTC', + status: 'PENDING', + message: { + type: 'doi', + value: '10.1111/j.1475-4975.2004.00098.x', + abstract: null, + openaireId: null, + acronym: null, + code: null, + funder: null, + fundingProgram: null, + jurisdiction: null, + title: null + }, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174008' + }, + target: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174008/target' + }, + related: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174008/related' + } + }, + target: observableOf(createSuccessfulRemoteDataObject(ItemMockPid6)), + related: observableOf(createSuccessfulRemoteDataObject(ItemMockPid10)) +}; + +export const openaireBrokerEventObjectMissingAbstract: OpenaireBrokerEventObject = { + id: '123e4567-e89b-12d3-a456-426614174009', + uuid: '123e4567-e89b-12d3-a456-426614174009', + type: new ResourceType('openaireBrokerEvent'), + originalId: 'oai:www.openstarts.units.it:10077/21110', + title: 'Missing abstract article', + trust: 0.751, + eventDate: '2020/10/09 10:11 UTC', + status: 'PENDING', + message: { + type: null, + value: null, + abstract: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla scelerisque vestibulum tellus sed lacinia. Aenean vitae sapien a quam congue ultrices. Sed vehicula sollicitudin ligula, vitae lacinia velit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla scelerisque vestibulum tellus sed lacinia. Aenean vitae sapien a quam congue ultrices. Sed vehicula sollicitudin ligula, vitae lacinia velit.', + openaireId: null, + acronym: null, + code: null, + funder: null, + fundingProgram: null, + jurisdiction: null, + title: null + }, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174009' + }, + target: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174009/target' + }, + related: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174009/related' + } + }, + target: observableOf(createSuccessfulRemoteDataObject(ItemMockPid7)), + related: observableOf(createSuccessfulRemoteDataObject(ItemMockPid10)) +}; + +export const openaireBrokerEventObjectMissingProjectFound: OpenaireBrokerEventObject = { + id: '123e4567-e89b-12d3-a456-426614174002', + uuid: '123e4567-e89b-12d3-a456-426614174002', + type: new ResourceType('openaireBrokerEvent'), + originalId: 'oai:www.openstarts.units.it:10077/21838', + title: 'Egypt, crossroad of translations and literary interweavings (3rd-6th centuries). A reconsideration of earlier Coptic literature', + trust: 1.0, + eventDate: '2020/10/09 10:11 UTC', + status: 'PENDING', + message: { + type: null, + value: null, + abstract: null, + openaireId: null, + acronym: 'PAThs', + code: '687567', + funder: 'EC', + fundingProgram: 'H2020', + jurisdiction: 'EU', + title: 'Tracking Papyrus and Parchment Paths: An Archaeological Atlas of Coptic Literature.\nLiterary Texts in their Geographical Context: Production, Copying, Usage, Dissemination and Storage' + }, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174002' + }, + target: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174002/target' + }, + related: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174002/related' + } + }, + target: createSuccessfulRemoteDataObject$(ItemMockPid8), + related: createSuccessfulRemoteDataObject$(ItemMockPid10) +}; + +export const openaireBrokerEventObjectMissingProjectNotFound: OpenaireBrokerEventObject = { + id: '123e4567-e89b-12d3-a456-426614174003', + uuid: '123e4567-e89b-12d3-a456-426614174003', + type: new ResourceType('openaireBrokerEvent'), + originalId: 'oai:www.openstarts.units.it:10077/21838', + title: 'Morocco, crossroad of translations and literary interweavings (3rd-6th centuries). A reconsideration of earlier Coptic literature', + trust: 1.0, + eventDate: '2020/10/09 10:11 UTC', + status: 'PENDING', + message: { + type: null, + value: null, + abstract: null, + openaireId: null, + acronym: 'PAThs', + code: '687567B', + funder: 'EC', + fundingProgram: 'H2021', + jurisdiction: 'EU', + title: 'Tracking Unknown Papyrus and Parchment Paths: An Archaeological Atlas of Coptic Literature.\nLiterary Texts in their Geographical Context: Production, Copying, Usage, Dissemination and Storage' + }, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174003' + }, + target: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174003/target' + }, + related: { + href: 'https://rest.api/rest/api/integration/nbevents/123e4567-e89b-12d3-a456-426614174003/related' + } + }, + target: createSuccessfulRemoteDataObject$(ItemMockPid9), + related: createNoContentRemoteDataObject$() +}; + +// Classes +// ------------------------------------------------------------------------------- + +/** + * Mock for [[OpenaireStateService]] + */ +export function getMockOpenaireStateService(): any { + return jasmine.createSpyObj('OpenaireStateService', { + getOpenaireBrokerTopics: jasmine.createSpy('getOpenaireBrokerTopics'), + isOpenaireBrokerTopicsLoading: jasmine.createSpy('isOpenaireBrokerTopicsLoading'), + isOpenaireBrokerTopicsLoaded: jasmine.createSpy('isOpenaireBrokerTopicsLoaded'), + isOpenaireBrokerTopicsProcessing: jasmine.createSpy('isOpenaireBrokerTopicsProcessing'), + getOpenaireBrokerTopicsTotalPages: jasmine.createSpy('getOpenaireBrokerTopicsTotalPages'), + getOpenaireBrokerTopicsCurrentPage: jasmine.createSpy('getOpenaireBrokerTopicsCurrentPage'), + getOpenaireBrokerTopicsTotals: jasmine.createSpy('getOpenaireBrokerTopicsTotals'), + dispatchRetrieveOpenaireBrokerTopics: jasmine.createSpy('dispatchRetrieveOpenaireBrokerTopics'), + dispatchMarkUserSuggestionsAsVisitedAction: jasmine.createSpy('dispatchMarkUserSuggestionsAsVisitedAction') + }); +} + +/** + * Mock for [[OpenaireBrokerTopicRestService]] + */ +export function getMockOpenaireBrokerTopicRestService(): OpenaireBrokerTopicRestService { + return jasmine.createSpyObj('OpenaireBrokerTopicRestService', { + getTopics: jasmine.createSpy('getTopics'), + getTopic: jasmine.createSpy('getTopic'), + }); +} + +/** + * Mock for [[OpenaireBrokerEventRestService]] + */ +export function getMockOpenaireBrokerEventRestService(): OpenaireBrokerEventRestService { + return jasmine.createSpyObj('OpenaireBrokerEventRestService', { + getEventsByTopic: jasmine.createSpy('getEventsByTopic'), + getEvent: jasmine.createSpy('getEvent'), + patchEvent: jasmine.createSpy('patchEvent'), + boundProject: jasmine.createSpy('boundProject'), + removeProject: jasmine.createSpy('removeProject'), + clearFindByTopicRequests: jasmine.createSpy('.clearFindByTopicRequests') + }); +} + +/** + * Mock for [[OpenaireBrokerEventRestService]] + */ +export function getMockSuggestionsService(): any { + return jasmine.createSpyObj('SuggestionsService', { + getTargets: jasmine.createSpy('getTargets'), + getSuggestions: jasmine.createSpy('getSuggestions'), + clearSuggestionRequests: jasmine.createSpy('clearSuggestionRequests'), + deleteReviewedSuggestion: jasmine.createSpy('deleteReviewedSuggestion'), + retrieveCurrentUserSuggestions: jasmine.createSpy('retrieveCurrentUserSuggestions'), + getTargetUuid: jasmine.createSpy('getTargetUuid'), + }); +} diff --git a/src/app/shared/pagination/pagination.component.html b/src/app/shared/pagination/pagination.component.html index 2a9aa1a062..e980e73313 100644 --- a/src/app/shared/pagination/pagination.component.html +++ b/src/app/shared/pagination/pagination.component.html @@ -11,8 +11,10 @@
- - + + + +
diff --git a/src/app/shared/pagination/pagination.component.ts b/src/app/shared/pagination/pagination.component.ts index 8f1c6bf26f..50210c4794 100644 --- a/src/app/shared/pagination/pagination.component.ts +++ b/src/app/shared/pagination/pagination.component.ts @@ -93,6 +93,11 @@ export class PaginationComponent implements OnDestroy, OnInit { */ @Input() public hideGear = false; + /** + * Option for hiding the gear + */ + @Input() public hideSortOptions = false; + /** * Option for hiding the pager when there is less than 2 pages */ diff --git a/src/app/shared/selector.util.ts b/src/app/shared/selector.util.ts new file mode 100644 index 0000000000..2343e12f1a --- /dev/null +++ b/src/app/shared/selector.util.ts @@ -0,0 +1,27 @@ +import { createSelector, MemoizedSelector, Selector } from '@ngrx/store'; +import { hasValue } from './empty.util'; + +/** + * Export a function to return a subset of the state by key + */ +export function keySelector(parentSelector: Selector, subState: string, key: string): MemoizedSelector { + return createSelector(parentSelector, (state: T) => { + if (hasValue(state) && hasValue(state[subState])) { + return state[subState][key]; + } else { + return undefined; + } + }); +} +/** + * Export a function to return a subset of the state + */ +export function subStateSelector(parentSelector: Selector, subState: string): MemoizedSelector { + return createSelector(parentSelector, (state: T) => { + if (hasValue(state) && hasValue(state[subState])) { + return state[subState]; + } else { + return undefined; + } + }); +} diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index f742273edb..360e50790a 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -479,7 +479,13 @@ "admin.access-control.groups.form.return": "Back", + "admin.notifications.openairebroker.breadcrumbs": "OpenAIRE Broker", + "admin.notifications.openairebroker.page.title": "OpenAIRE Broker", + + "admin.notifications.openaireevent.breadcrumbs": "OpenAIRE Broker Suggestions", + + "admin.notifications.openaireevent.page.title": "OpenAIRE Broker Suggestions", "admin.search.breadcrumbs": "Administrative Search", @@ -2408,6 +2414,7 @@ + "menu.header.admin": "Management", "menu.header.image.logo": "Repository logo", @@ -2510,6 +2517,8 @@ "menu.section.icon.unpin": "Unpin sidebar", + "menu.section.icon.notifications": "Notifications menu section", + "menu.section.import": "Import", @@ -2533,6 +2542,12 @@ "menu.section.new_process": "Process", + "menu.section.notifications": "Notifications", + + "menu.section.notifications_openaire_broker": "OpenAIRE Broker", + + "menu.section.notifications_reciter": "Publication Claim", + "menu.section.pin": "Pin sidebar", @@ -2698,6 +2713,126 @@ "none.listelement.badge": "Item", + "openaire.broker.title": "OpenAIRE Broker", + + "openaire.broker.topics.description": "Below you can see all the topics received from the subscriptions to OpenAIRE.", + + "openaire.broker.topics": "Current Topics", + + "openaire.broker.table.topic": "Topic", + + "openaire.broker.table.last-event": "Last Event", + + "openaire.broker.table.actions": "Actions", + + "openaire.broker.button.detail": "Show details", + + "openaire.broker.noTopics": "No topics found.", + + "openaire.broker.topic.error.service.retrieve": "An error occurred while loading the OpenAIRE Broker topics", + + "openaire.broker.loading": "Loading ...", + + "openaire.events.title": "OpenAIRE Broker Suggestions", + + "openaire.broker.events.description": "Below the list of all the suggestions, received from OpenAIRE, for the selected topic.", + + "openaire.broker.events.topic": "Topic:", + + "openaire.broker.noEvents": "No suggestions found.", + + "openaire.broker.event.table.trust": "Trust", + + "openaire.broker.event.table.publication": "Publication", + + "openaire.broker.event.table.details": "Details", + + "openaire.broker.event.table.project-details": "Project details", + + "openaire.broker.event.table.actions": "Actions", + + "openaire.broker.event.action.accept": "Accept suggestion", + + "openaire.broker.event.action.ignore": "Ignore suggestion", + + "openaire.broker.event.action.reject": "Reject suggestion", + + "openaire.broker.event.action.import": "Import project and accept suggestion", + + "openaire.broker.event.table.pidtype": "PID Type:", + + "openaire.broker.event.table.pidvalue": "PID Value:", + + "openaire.broker.event.table.subjectValue": "Subject Value:", + + "openaire.broker.event.table.abstract": "Abstract:", + + "openaire.broker.event.table.suggestedProject": "OpenAIRE Suggested Project data", + + "openaire.broker.event.table.project": "Project title:", + + "openaire.broker.event.table.acronym": "Acronym:", + + "openaire.broker.event.table.code": "Code:", + + "openaire.broker.event.table.funder": "Funder:", + + "openaire.broker.event.table.fundingProgram": "Funding program:", + + "openaire.broker.event.table.jurisdiction": "Jurisdiction:", + + "openaire.broker.events.back": "Back to topics", + + "openaire.broker.event.table.less": "Show less", + + "openaire.broker.event.table.more": "Show more", + + "openaire.broker.event.project.found": "Bound to the local record:", + + "openaire.broker.event.project.notFound": "No local record found", + + "openaire.broker.event.sure": "Are you sure?", + + "openaire.broker.event.ignore.description": "This operation can't be undone. Ignore this suggestion?", + + "openaire.broker.event.reject.description": "This operation can't be undone. Reject this suggestion?", + + "openaire.broker.event.accept.description": "No DSpace project selected. A new project will be created based on the suggestion data.", + + "openaire.broker.event.action.cancel": "Cancel", + + "openaire.broker.event.action.saved": "Your decision has been saved successfully.", + + "openaire.broker.event.action.error": "An error has occurred. Your decision has not been saved.", + + "openaire.broker.event.modal.project.title": "Choose a project to bound", + + "openaire.broker.event.modal.project.publication": "Publication:", + + "openaire.broker.event.modal.project.bountToLocal": "Bound to the local record:", + + "openaire.broker.event.modal.project.select": "Project search", + + "openaire.broker.event.modal.project.search": "Search", + + "openaire.broker.event.modal.project.clear": "Clear", + + "openaire.broker.event.modal.project.cancel": "Cancel", + + "openaire.broker.event.modal.project.bound": "Bound project", + + "openaire.broker.event.modal.project.placeholder": "Enter a project name", + + "openaire.broker.event.modal.project.notFound": "No project found.", + + "openaire.broker.event.project.bounded": "The project has been linked successfully.", + + "openaire.broker.event.project.removed": "The project has been successfully unlinked.", + + "openaire.broker.event.project.error": "An error has occurred. No operation performed.", + + "openaire.broker.event.reason": "Reason", + "orgunit.listelement.badge": "Organizational Unit", @@ -3362,7 +3497,9 @@ "search.filters.filter.submitter.label": "Search submitter", + "search.filters.filter.funding.head": "Funding", + "search.filters.filter.funding.placeholder": "Funding", "search.filters.entityType.JournalIssue": "Journal Issue", From 4ca51387d1e60b7068eeed2f13ed105922a15455 Mon Sep 17 00:00:00 2001 From: Luca Giamminonni Date: Fri, 18 Feb 2022 19:01:30 +0100 Subject: [PATCH 004/343] [CST-5246] Correction service should support multiple providers --- ...ications-broker-events-page.component.html | 1 + ...tions-broker-events-page.component.spec.ts | 26 ++++ ...ifications-broker-events-page.component.ts | 9 ++ ...ifications-broker-events-page.resolver.ts} | 8 +- ...ns-broker-topics-page-resolver.service.ts} | 8 +- ...ications-broker-topics-page.component.html | 1 + ...tions-broker-topics-page.component.spec.ts | 26 ++++ ...ifications-broker-topics-page.component.ts | 9 ++ ...ations-openaire-events-page.component.html | 1 - ...ons-openaire-events-page.component.spec.ts | 26 ---- ...ications-openaire-events-page.component.ts | 9 -- ...ations-openaire-topics-page.component.html | 1 - ...ons-openaire-topics-page.component.spec.ts | 26 ---- ...ications-openaire-topics-page.component.ts | 9 -- .../admin-notifications-routing-paths.ts | 4 +- .../admin-notifications-routing.module.ts | 28 ++-- .../admin-notifications.module.ts | 12 +- .../admin-sidebar/admin-sidebar.component.ts | 4 +- src/app/core/core.module.ts | 8 +- ...cations-broker-event-rest.service.spec.ts} | 54 ++++---- ...otifications-broker-event-rest.service.ts} | 56 ++++---- ...ions-broker-event-object.resource-type.ts} | 4 +- .../notifications-broker-event.model.ts} | 49 ++++--- ...ions-broker-topic-object.resource-type.ts} | 4 +- .../notifications-broker-topic.model.ts} | 16 +-- ...cations-broker-topic-rest.service.spec.ts} | 28 ++-- ...otifications-broker-topic-rest.service.ts} | 38 ++--- ...otifications-broker-events.component.html} | 94 ++++++------- ...fications-broker-events.component.spec.ts} | 114 +++++++-------- .../notifications-broker-events.component.ts} | 130 +++++++++--------- ...tifications-broker-events.scomponent.scss} | 0 .../project-entry-import-modal.component.html | 0 .../project-entry-import-modal.component.scss | 0 ...oject-entry-import-modal.component.spec.ts | 20 +-- .../project-entry-import-modal.component.ts | 29 ++-- .../notifications-broker-topics.actions.ts} | 30 ++-- ...otifications-broker-topics.component.html} | 22 +-- ...otifications-broker-topics.component.scss} | 0 ...fications-broker-topics.component.spec.ts} | 66 ++++----- .../notifications-broker-topics.component.ts} | 54 ++++---- .../notifications-broker-topics.effects.ts} | 38 ++--- ...otifications-broker-topics.reducer.spec.ts | 68 +++++++++ .../notifications-broker-topics.reducer.ts | 72 ++++++++++ ...tifications-broker-topics.service.spec.ts} | 34 ++--- .../notifications-broker-topics.service.ts | 55 ++++++++ .../notifications-state.service.spec.ts} | 112 +++++++-------- .../notifications-state.service.ts | 116 ++++++++++++++++ .../notifications/notifications.effects.ts | 5 + .../notifications.module.ts} | 34 ++--- .../notifications/notifications.reducer.ts | 16 +++ src/app/notifications/selectors.ts | 79 +++++++++++ .../openaire-broker-topics.reducer.spec.ts | 68 --------- .../topics/openaire-broker-topics.reducer.ts | 72 ---------- .../topics/openaire-broker-topics.service.ts | 55 -------- src/app/openaire/openaire-state.service.ts | 116 ---------------- src/app/openaire/openaire.effects.ts | 5 - src/app/openaire/openaire.reducer.ts | 16 --- src/app/openaire/selectors.ts | 79 ----------- ...openaire.mock.ts => notifications.mock.ts} | 94 ++++++------- src/assets/i18n/en.json5 | 130 +++++++++--------- 60 files changed, 1150 insertions(+), 1138 deletions(-) create mode 100644 src/app/admin/admin-notifications/admin-notifications-broker-events-page/admin-notifications-broker-events-page.component.html create mode 100644 src/app/admin/admin-notifications/admin-notifications-broker-events-page/admin-notifications-broker-events-page.component.spec.ts create mode 100644 src/app/admin/admin-notifications/admin-notifications-broker-events-page/admin-notifications-broker-events-page.component.ts rename src/app/admin/admin-notifications/{admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.resolver.ts => admin-notifications-broker-events-page/admin-notifications-broker-events-page.resolver.ts} (72%) rename src/app/admin/admin-notifications/{admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page-resolver.service.ts => admin-notifications-broker-topics-page/admin-notifications-broker-topics-page-resolver.service.ts} (72%) create mode 100644 src/app/admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page.component.html create mode 100644 src/app/admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page.component.spec.ts create mode 100644 src/app/admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page.component.ts delete mode 100644 src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.html delete mode 100644 src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.spec.ts delete mode 100644 src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.ts delete mode 100644 src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.html delete mode 100644 src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.spec.ts delete mode 100644 src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.ts rename src/app/core/{openaire/broker/events/openaire-broker-event-rest.service.spec.ts => notifications/broker/events/notifications-broker-event-rest.service.spec.ts} (78%) rename src/app/core/{openaire/broker/events/openaire-broker-event-rest.service.ts => notifications/broker/events/notifications-broker-event-rest.service.ts} (73%) rename src/app/core/{openaire/broker/models/openaire-broker-event-object.resource-type.ts => notifications/broker/models/notifications-broker-event-object.resource-type.ts} (53%) rename src/app/core/{openaire/broker/models/openaire-broker-event.model.ts => notifications/broker/models/notifications-broker-event.model.ts} (61%) rename src/app/core/{openaire/broker/models/openaire-broker-topic-object.resource-type.ts => notifications/broker/models/notifications-broker-topic-object.resource-type.ts} (53%) rename src/app/core/{openaire/broker/models/openaire-broker-topic.model.ts => notifications/broker/models/notifications-broker-topic.model.ts} (64%) rename src/app/core/{openaire/broker/topics/openaire-broker-topic-rest.service.spec.ts => notifications/broker/topics/notifications-broker-topic-rest.service.spec.ts} (77%) rename src/app/core/{openaire/broker/topics/openaire-broker-topic-rest.service.ts => notifications/broker/topics/notifications-broker-topic-rest.service.ts} (75%) rename src/app/{openaire/broker/events/openaire-broker-events.component.html => notifications/broker/events/notifications-broker-events.component.html} (60%) rename src/app/{openaire/broker/events/openaire-broker-events.component.spec.ts => notifications/broker/events/notifications-broker-events.component.spec.ts} (66%) rename src/app/{openaire/broker/events/openaire-broker-events.component.ts => notifications/broker/events/notifications-broker-events.component.ts} (71%) rename src/app/{openaire/broker/events/openaire-broker-events.scomponent.scss => notifications/broker/events/notifications-broker-events.scomponent.scss} (100%) rename src/app/{openaire => notifications}/broker/project-entry-import-modal/project-entry-import-modal.component.html (100%) rename src/app/{openaire => notifications}/broker/project-entry-import-modal/project-entry-import-modal.component.scss (100%) rename src/app/{openaire => notifications}/broker/project-entry-import-modal/project-entry-import-modal.component.spec.ts (92%) rename src/app/{openaire => notifications}/broker/project-entry-import-modal/project-entry-import-modal.component.ts (89%) rename src/app/{openaire/broker/topics/openaire-broker-topics.actions.ts => notifications/broker/topics/notifications-broker-topics.actions.ts} (60%) rename src/app/{openaire/broker/topics/openaire-broker-topics.component.html => notifications/broker/topics/notifications-broker-topics.component.html} (66%) rename src/app/{openaire/broker/topics/openaire-broker-topics.component.scss => notifications/broker/topics/notifications-broker-topics.component.scss} (100%) rename src/app/{openaire/broker/topics/openaire-broker-topics.component.spec.ts => notifications/broker/topics/notifications-broker-topics.component.spec.ts} (53%) rename src/app/{openaire/broker/topics/openaire-broker-topics.component.ts => notifications/broker/topics/notifications-broker-topics.component.ts} (60%) rename src/app/{openaire/broker/topics/openaire-broker-topics.effects.ts => notifications/broker/topics/notifications-broker-topics.effects.ts} (57%) create mode 100644 src/app/notifications/broker/topics/notifications-broker-topics.reducer.spec.ts create mode 100644 src/app/notifications/broker/topics/notifications-broker-topics.reducer.ts rename src/app/{openaire/broker/topics/openaire-broker-topics.service.spec.ts => notifications/broker/topics/notifications-broker-topics.service.spec.ts} (56%) create mode 100644 src/app/notifications/broker/topics/notifications-broker-topics.service.ts rename src/app/{openaire/openaire-state.service.spec.ts => notifications/notifications-state.service.spec.ts} (59%) create mode 100644 src/app/notifications/notifications-state.service.ts create mode 100644 src/app/notifications/notifications.effects.ts rename src/app/{openaire/openaire.module.ts => notifications/notifications.module.ts} (50%) create mode 100644 src/app/notifications/notifications.reducer.ts create mode 100644 src/app/notifications/selectors.ts delete mode 100644 src/app/openaire/broker/topics/openaire-broker-topics.reducer.spec.ts delete mode 100644 src/app/openaire/broker/topics/openaire-broker-topics.reducer.ts delete mode 100644 src/app/openaire/broker/topics/openaire-broker-topics.service.ts delete mode 100644 src/app/openaire/openaire-state.service.ts delete mode 100644 src/app/openaire/openaire.effects.ts delete mode 100644 src/app/openaire/openaire.reducer.ts delete mode 100644 src/app/openaire/selectors.ts rename src/app/shared/mocks/{openaire.mock.ts => notifications.mock.ts} (92%) diff --git a/src/app/admin/admin-notifications/admin-notifications-broker-events-page/admin-notifications-broker-events-page.component.html b/src/app/admin/admin-notifications/admin-notifications-broker-events-page/admin-notifications-broker-events-page.component.html new file mode 100644 index 0000000000..89ef1bfc88 --- /dev/null +++ b/src/app/admin/admin-notifications/admin-notifications-broker-events-page/admin-notifications-broker-events-page.component.html @@ -0,0 +1 @@ + diff --git a/src/app/admin/admin-notifications/admin-notifications-broker-events-page/admin-notifications-broker-events-page.component.spec.ts b/src/app/admin/admin-notifications/admin-notifications-broker-events-page/admin-notifications-broker-events-page.component.spec.ts new file mode 100644 index 0000000000..57a79e017b --- /dev/null +++ b/src/app/admin/admin-notifications/admin-notifications-broker-events-page/admin-notifications-broker-events-page.component.spec.ts @@ -0,0 +1,26 @@ +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { AdminNotificationsBrokerEventsPageComponent } from './admin-notifications-broker-events-page.component'; + +describe('AdminNotificationsBrokerEventsPageComponent', () => { + let component: AdminNotificationsBrokerEventsPageComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ AdminNotificationsBrokerEventsPageComponent ], + schemas: [NO_ERRORS_SCHEMA] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AdminNotificationsBrokerEventsPageComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create AdminNotificationsBrokerEventsPageComponent', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/admin/admin-notifications/admin-notifications-broker-events-page/admin-notifications-broker-events-page.component.ts b/src/app/admin/admin-notifications/admin-notifications-broker-events-page/admin-notifications-broker-events-page.component.ts new file mode 100644 index 0000000000..f014b4d133 --- /dev/null +++ b/src/app/admin/admin-notifications/admin-notifications-broker-events-page/admin-notifications-broker-events-page.component.ts @@ -0,0 +1,9 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'ds-notifications-broker-events-page', + templateUrl: './admin-notifications-broker-events-page.component.html' +}) +export class AdminNotificationsBrokerEventsPageComponent { + +} diff --git a/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.resolver.ts b/src/app/admin/admin-notifications/admin-notifications-broker-events-page/admin-notifications-broker-events-page.resolver.ts similarity index 72% rename from src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.resolver.ts rename to src/app/admin/admin-notifications/admin-notifications-broker-events-page/admin-notifications-broker-events-page.resolver.ts index b215013e11..dcf530858c 100644 --- a/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.resolver.ts +++ b/src/app/admin/admin-notifications/admin-notifications-broker-events-page/admin-notifications-broker-events-page.resolver.ts @@ -4,7 +4,7 @@ import { Resolve, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/r /** * Interface for the route parameters. */ -export interface AdminNotificationsOpenaireEventsPageParams { +export interface AdminNotificationsBrokerEventsPageParams { pageId?: string; pageSize?: number; currentPage?: number; @@ -14,15 +14,15 @@ export interface AdminNotificationsOpenaireEventsPageParams { * This class represents a resolver that retrieve the route data before the route is activated. */ @Injectable() -export class AdminNotificationsOpenaireEventsPageResolver implements Resolve { +export class AdminNotificationsBrokerEventsPageResolver implements Resolve { /** * Method for resolving the parameters in the current route. * @param {ActivatedRouteSnapshot} route The current ActivatedRouteSnapshot * @param {RouterStateSnapshot} state The current RouterStateSnapshot - * @returns AdminNotificationsOpenaireEventsPageParams Emits the route parameters + * @returns AdminNotificationsBrokerEventsPageParams Emits the route parameters */ - resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): AdminNotificationsOpenaireEventsPageParams { + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): AdminNotificationsBrokerEventsPageParams { return { pageId: route.queryParams.pageId, pageSize: parseInt(route.queryParams.pageSize, 10), diff --git a/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page-resolver.service.ts b/src/app/admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page-resolver.service.ts similarity index 72% rename from src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page-resolver.service.ts rename to src/app/admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page-resolver.service.ts index f8e02cabbf..d4fd354d92 100644 --- a/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page-resolver.service.ts +++ b/src/app/admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page-resolver.service.ts @@ -4,7 +4,7 @@ import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/r /** * Interface for the route parameters. */ -export interface AdminNotificationsOpenaireTopicsPageParams { +export interface AdminNotificationsBrokerTopicsPageParams { pageId?: string; pageSize?: number; currentPage?: number; @@ -14,15 +14,15 @@ export interface AdminNotificationsOpenaireTopicsPageParams { * This class represents a resolver that retrieve the route data before the route is activated. */ @Injectable() -export class AdminNotificationsOpenaireTopicsPageResolver implements Resolve { +export class AdminNotificationsBrokerTopicsPageResolver implements Resolve { /** * Method for resolving the parameters in the current route. * @param {ActivatedRouteSnapshot} route The current ActivatedRouteSnapshot * @param {RouterStateSnapshot} state The current RouterStateSnapshot - * @returns AdminNotificationsOpenaireTopicsPageParams Emits the route parameters + * @returns AdminNotificationsBrokerTopicsPageParams Emits the route parameters */ - resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): AdminNotificationsOpenaireTopicsPageParams { + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): AdminNotificationsBrokerTopicsPageParams { return { pageId: route.queryParams.pageId, pageSize: parseInt(route.queryParams.pageSize, 10), diff --git a/src/app/admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page.component.html b/src/app/admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page.component.html new file mode 100644 index 0000000000..dbdae2e6b9 --- /dev/null +++ b/src/app/admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page.component.html @@ -0,0 +1 @@ + diff --git a/src/app/admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page.component.spec.ts b/src/app/admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page.component.spec.ts new file mode 100644 index 0000000000..c21e0ce73b --- /dev/null +++ b/src/app/admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page.component.spec.ts @@ -0,0 +1,26 @@ +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { AdminNotificationsBrokerTopicsPageComponent } from './admin-notifications-broker-topics-page.component'; + +describe('AdminNotificationsBrokerTopicsPageComponent', () => { + let component: AdminNotificationsBrokerTopicsPageComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ AdminNotificationsBrokerTopicsPageComponent ], + schemas: [NO_ERRORS_SCHEMA] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AdminNotificationsBrokerTopicsPageComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create AdminNotificationsBrokerTopicsPageComponent', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page.component.ts b/src/app/admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page.component.ts new file mode 100644 index 0000000000..4f60ffd3fd --- /dev/null +++ b/src/app/admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page.component.ts @@ -0,0 +1,9 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'ds-notification-broker-page', + templateUrl: './admin-notifications-broker-topics-page.component.html' +}) +export class AdminNotificationsBrokerTopicsPageComponent { + +} diff --git a/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.html b/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.html deleted file mode 100644 index 5c8f8820a0..0000000000 --- a/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.spec.ts b/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.spec.ts deleted file mode 100644 index ab7a08a695..0000000000 --- a/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.spec.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { NO_ERRORS_SCHEMA } from '@angular/core'; -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { AdminNotificationsOpenaireEventsPageComponent } from './admin-notifications-openaire-events-page.component'; - -describe('AdminNotificationsOpenaireEventsPageComponent', () => { - let component: AdminNotificationsOpenaireEventsPageComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ AdminNotificationsOpenaireEventsPageComponent ], - schemas: [NO_ERRORS_SCHEMA] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(AdminNotificationsOpenaireEventsPageComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create AdminNotificationsOpenaireEventsPageComponent', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.ts b/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.ts deleted file mode 100644 index df7b21dbda..0000000000 --- a/src/app/admin/admin-notifications/admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'ds-notification-openaire-events-page', - templateUrl: './admin-notifications-openaire-events-page.component.html' -}) -export class AdminNotificationsOpenaireEventsPageComponent { - -} diff --git a/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.html b/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.html deleted file mode 100644 index b1616cfe78..0000000000 --- a/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.spec.ts b/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.spec.ts deleted file mode 100644 index 712c7ba2c3..0000000000 --- a/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.spec.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { NO_ERRORS_SCHEMA } from '@angular/core'; -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { AdminNotificationsOpenaireTopicsPageComponent } from './admin-notifications-openaire-topics-page.component'; - -describe('AdminNotificationsOpenaireTopicsPageComponent', () => { - let component: AdminNotificationsOpenaireTopicsPageComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ AdminNotificationsOpenaireTopicsPageComponent ], - schemas: [NO_ERRORS_SCHEMA] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(AdminNotificationsOpenaireTopicsPageComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create AdminNotificationsOpenaireTopicsPageComponent', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.ts b/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.ts deleted file mode 100644 index 5bf1832c59..0000000000 --- a/src/app/admin/admin-notifications/admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'ds-notification-openairebroker-page', - templateUrl: './admin-notifications-openaire-topics-page.component.html' -}) -export class AdminNotificationsOpenaireTopicsPageComponent { - -} diff --git a/src/app/admin/admin-notifications/admin-notifications-routing-paths.ts b/src/app/admin/admin-notifications/admin-notifications-routing-paths.ts index ea7242adcb..469cbb980f 100644 --- a/src/app/admin/admin-notifications/admin-notifications-routing-paths.ts +++ b/src/app/admin/admin-notifications/admin-notifications-routing-paths.ts @@ -1,8 +1,8 @@ import { URLCombiner } from '../../core/url-combiner/url-combiner'; import { getNotificationsModuleRoute } from '../admin-routing-paths'; -export const NOTIFICATIONS_EDIT_PATH = 'openaire-broker'; +export const NOTIFICATIONS_EDIT_PATH = 'notifications-broker'; -export function getNotificationsOpenairebrokerRoute(id: string) { +export function getNotificationsBrokerbrokerRoute(id: string) { return new URLCombiner(getNotificationsModuleRoute(), NOTIFICATIONS_EDIT_PATH, id).toString(); } diff --git a/src/app/admin/admin-notifications/admin-notifications-routing.module.ts b/src/app/admin/admin-notifications/admin-notifications-routing.module.ts index 2dfa938c4f..f1f46ca4f1 100644 --- a/src/app/admin/admin-notifications/admin-notifications-routing.module.ts +++ b/src/app/admin/admin-notifications/admin-notifications-routing.module.ts @@ -5,10 +5,10 @@ import { AuthenticatedGuard } from '../../core/auth/authenticated.guard'; import { I18nBreadcrumbResolver } from '../../core/breadcrumbs/i18n-breadcrumb.resolver'; import { I18nBreadcrumbsService } from '../../core/breadcrumbs/i18n-breadcrumbs.service'; import { NOTIFICATIONS_EDIT_PATH } from './admin-notifications-routing-paths'; -import { AdminNotificationsOpenaireTopicsPageComponent } from './admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component'; -import { AdminNotificationsOpenaireEventsPageComponent } from './admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component'; -import { AdminNotificationsOpenaireTopicsPageResolver } from './admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page-resolver.service'; -import { AdminNotificationsOpenaireEventsPageResolver } from './admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.resolver'; +import { AdminNotificationsBrokerTopicsPageComponent } from './admin-notifications-broker-topics-page/admin-notifications-broker-topics-page.component'; +import { AdminNotificationsBrokerEventsPageComponent } from './admin-notifications-broker-events-page/admin-notifications-broker-events-page.component'; +import { AdminNotificationsBrokerTopicsPageResolver } from './admin-notifications-broker-topics-page/admin-notifications-broker-topics-page-resolver.service'; +import { AdminNotificationsBrokerEventsPageResolver } from './admin-notifications-broker-events-page/admin-notifications-broker-events-page.resolver'; @NgModule({ imports: [ @@ -16,30 +16,30 @@ import { AdminNotificationsOpenaireEventsPageResolver } from './admin-notificati { canActivate: [ AuthenticatedGuard ], path: `${NOTIFICATIONS_EDIT_PATH}`, - component: AdminNotificationsOpenaireTopicsPageComponent, + component: AdminNotificationsBrokerTopicsPageComponent, pathMatch: 'full', resolve: { breadcrumb: I18nBreadcrumbResolver, - openaireBrokerTopicsParams: AdminNotificationsOpenaireTopicsPageResolver + openaireBrokerTopicsParams: AdminNotificationsBrokerTopicsPageResolver }, data: { - title: 'admin.notifications.openairebroker.page.title', - breadcrumbKey: 'admin.notifications.openairebroker', + title: 'admin.notifications.broker.page.title', + breadcrumbKey: 'admin.notifications.broker', showBreadcrumbsFluid: false } }, { canActivate: [ AuthenticatedGuard ], path: `${NOTIFICATIONS_EDIT_PATH}/:id`, - component: AdminNotificationsOpenaireEventsPageComponent, + component: AdminNotificationsBrokerEventsPageComponent, pathMatch: 'full', resolve: { breadcrumb: I18nBreadcrumbResolver, - openaireBrokerEventsParams: AdminNotificationsOpenaireEventsPageResolver + openaireBrokerEventsParams: AdminNotificationsBrokerEventsPageResolver }, data: { - title: 'admin.notifications.openaireevent.page.title', - breadcrumbKey: 'admin.notifications.openaireevent', + title: 'admin.notifications.event.page.title', + breadcrumbKey: 'admin.notifications.event', showBreadcrumbsFluid: false } } @@ -48,8 +48,8 @@ import { AdminNotificationsOpenaireEventsPageResolver } from './admin-notificati providers: [ I18nBreadcrumbResolver, I18nBreadcrumbsService, - AdminNotificationsOpenaireTopicsPageResolver, - AdminNotificationsOpenaireEventsPageResolver + AdminNotificationsBrokerTopicsPageResolver, + AdminNotificationsBrokerEventsPageResolver ] }) /** diff --git a/src/app/admin/admin-notifications/admin-notifications.module.ts b/src/app/admin/admin-notifications/admin-notifications.module.ts index 9894dac233..350e9de800 100644 --- a/src/app/admin/admin-notifications/admin-notifications.module.ts +++ b/src/app/admin/admin-notifications/admin-notifications.module.ts @@ -3,9 +3,9 @@ import { NgModule } from '@angular/core'; import { CoreModule } from '../../core/core.module'; import { SharedModule } from '../../shared/shared.module'; import { AdminNotificationsRoutingModule } from './admin-notifications-routing.module'; -import { AdminNotificationsOpenaireTopicsPageComponent } from './admin-notifications-openaire-topics-page/admin-notifications-openaire-topics-page.component'; -import { AdminNotificationsOpenaireEventsPageComponent } from './admin-notifications-openaire-events-page/admin-notifications-openaire-events-page.component'; -import { OpenaireModule } from '../../openaire/openaire.module'; +import { AdminNotificationsBrokerTopicsPageComponent } from './admin-notifications-broker-topics-page/admin-notifications-broker-topics-page.component'; +import { AdminNotificationsBrokerEventsPageComponent } from './admin-notifications-broker-events-page/admin-notifications-broker-events-page.component'; +import { NotificationsModule } from '../../notifications/notifications.module'; @NgModule({ imports: [ @@ -13,11 +13,11 @@ import { OpenaireModule } from '../../openaire/openaire.module'; SharedModule, CoreModule.forRoot(), AdminNotificationsRoutingModule, - OpenaireModule + NotificationsModule ], declarations: [ - AdminNotificationsOpenaireTopicsPageComponent, - AdminNotificationsOpenaireEventsPageComponent + AdminNotificationsBrokerTopicsPageComponent, + AdminNotificationsBrokerEventsPageComponent ], entryComponents: [] }) diff --git a/src/app/admin/admin-sidebar/admin-sidebar.component.ts b/src/app/admin/admin-sidebar/admin-sidebar.component.ts index a2a7eb30b5..3e989f16f3 100644 --- a/src/app/admin/admin-sidebar/admin-sidebar.component.ts +++ b/src/app/admin/admin-sidebar/admin-sidebar.component.ts @@ -483,8 +483,8 @@ export class AdminSidebarComponent extends MenuComponent implements OnInit { visible: authorized, model: { type: MenuItemType.LINK, - text: 'menu.section.notifications_openaire_broker', - link: '/admin/notifications/openaire-broker' + text: 'menu.section.notifications_broker', + link: '/admin/notifications/notifications-broker' } as LinkMenuItemModel, }, /* Admin Search */ diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index 928d34c48e..f5a959592f 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -162,8 +162,8 @@ import { SearchConfig } from './shared/search/search-filters/search-config.model import { SequenceService } from './shared/sequence.service'; import { GroupDataService } from './eperson/group-data.service'; import { SubmissionAccessesModel } from './config/models/config-submission-accesses.model'; -import { OpenaireBrokerTopicObject } from './openaire/broker/models/openaire-broker-topic.model'; -import { OpenaireBrokerEventObject } from './openaire/broker/models/openaire-broker-event.model'; +import { NotificationsBrokerTopicObject } from './notifications/broker/models/notifications-broker-topic.model'; +import { NotificationsBrokerEventObject } from './notifications/broker/models/notifications-broker-event.model'; /** * When not in production, endpoint responses can be mocked for testing purposes @@ -345,8 +345,8 @@ export const models = ShortLivedToken, Registration, UsageReport, - OpenaireBrokerTopicObject, - OpenaireBrokerEventObject, + NotificationsBrokerTopicObject, + NotificationsBrokerEventObject, Root, SearchConfig, SubmissionAccessesModel diff --git a/src/app/core/openaire/broker/events/openaire-broker-event-rest.service.spec.ts b/src/app/core/notifications/broker/events/notifications-broker-event-rest.service.spec.ts similarity index 78% rename from src/app/core/openaire/broker/events/openaire-broker-event-rest.service.spec.ts rename to src/app/core/notifications/broker/events/notifications-broker-event-rest.service.spec.ts index 2d0d236330..16d55479ae 100644 --- a/src/app/core/openaire/broker/events/openaire-broker-event-rest.service.spec.ts +++ b/src/app/core/notifications/broker/events/notifications-broker-event-rest.service.spec.ts @@ -15,17 +15,17 @@ import { PageInfo } from '../../../shared/page-info.model'; import { HALEndpointService } from '../../../shared/hal-endpoint.service'; import { NotificationsService } from '../../../../shared/notifications/notifications.service'; import { createSuccessfulRemoteDataObject } from '../../../../shared/remote-data.utils'; -import { OpenaireBrokerEventRestService } from './openaire-broker-event-rest.service'; +import { NotificationsBrokerEventRestService } from './notifications-broker-event-rest.service'; import { - openaireBrokerEventObjectMissingPid, - openaireBrokerEventObjectMissingPid2, - openaireBrokerEventObjectMissingProjectFound -} from '../../../../shared/mocks/openaire.mock'; + notificationsBrokerEventObjectMissingPid, + notificationsBrokerEventObjectMissingPid2, + notificationsBrokerEventObjectMissingProjectFound +} from '../../../../shared/mocks/notifications.mock'; import { ReplaceOperation } from 'fast-json-patch'; -describe('OpenaireBrokerEventRestService', () => { +describe('NotificationsBrokerEventRestService', () => { let scheduler: TestScheduler; - let service: OpenaireBrokerEventRestService; + let service: NotificationsBrokerEventRestService; let serviceASAny: any; let responseCacheEntry: RequestEntry; let responseCacheEntryB: RequestEntry; @@ -43,10 +43,10 @@ describe('OpenaireBrokerEventRestService', () => { const topic = 'ENRICH!MORE!PID'; const pageInfo = new PageInfo(); - const array = [ openaireBrokerEventObjectMissingPid, openaireBrokerEventObjectMissingPid2 ]; + const array = [ notificationsBrokerEventObjectMissingPid, notificationsBrokerEventObjectMissingPid2 ]; const paginatedList = buildPaginatedList(pageInfo, array); - const brokerEventObjectRD = createSuccessfulRemoteDataObject(openaireBrokerEventObjectMissingPid); - const brokerEventObjectMissingProjectRD = createSuccessfulRemoteDataObject(openaireBrokerEventObjectMissingProjectFound); + const brokerEventObjectRD = createSuccessfulRemoteDataObject(notificationsBrokerEventObjectMissingPid); + const brokerEventObjectMissingProjectRD = createSuccessfulRemoteDataObject(notificationsBrokerEventObjectMissingProjectFound); const paginatedListRD = createSuccessfulRemoteDataObject(paginatedList); const status = 'ACCEPTED'; @@ -99,7 +99,7 @@ describe('OpenaireBrokerEventRestService', () => { http = {} as HttpClient; comparator = {} as any; - service = new OpenaireBrokerEventRestService( + service = new NotificationsBrokerEventRestService( requestService, rdbService, objectCache, @@ -138,7 +138,7 @@ describe('OpenaireBrokerEventRestService', () => { expect(serviceASAny.dataService.searchBy).toHaveBeenCalledWith('findByTopic', options, true, true); }); - it('should return a RemoteData> for the object with the given Topic', () => { + it('should return a RemoteData> for the object with the given Topic', () => { const result = service.getEventsByTopic(topic); const expected = cold('(a)', { a: paginatedListRD @@ -155,15 +155,15 @@ describe('OpenaireBrokerEventRestService', () => { }); it('should proxy the call to dataservice.findById', () => { - service.getEvent(openaireBrokerEventObjectMissingPid.id).subscribe( + service.getEvent(notificationsBrokerEventObjectMissingPid.id).subscribe( (res) => { - expect(serviceASAny.dataService.findById).toHaveBeenCalledWith(openaireBrokerEventObjectMissingPid.id, true, true); + expect(serviceASAny.dataService.findById).toHaveBeenCalledWith(notificationsBrokerEventObjectMissingPid.id, true, true); } ); }); - it('should return a RemoteData for the object with the given URL', () => { - const result = service.getEvent(openaireBrokerEventObjectMissingPid.id); + it('should return a RemoteData for the object with the given URL', () => { + const result = service.getEvent(notificationsBrokerEventObjectMissingPid.id); const expected = cold('(a)', { a: brokerEventObjectRD }); @@ -179,17 +179,17 @@ describe('OpenaireBrokerEventRestService', () => { }); it('should proxy the call to dataservice.patch', () => { - service.patchEvent(status, openaireBrokerEventObjectMissingPid).subscribe( + service.patchEvent(status, notificationsBrokerEventObjectMissingPid).subscribe( (res) => { - expect(serviceASAny.dataService.patch).toHaveBeenCalledWith(openaireBrokerEventObjectMissingPid, operation); + expect(serviceASAny.dataService.patch).toHaveBeenCalledWith(notificationsBrokerEventObjectMissingPid, operation); } ); }); it('should return a RemoteData with HTTP 200', () => { - const result = service.patchEvent(status, openaireBrokerEventObjectMissingPid); + const result = service.patchEvent(status, notificationsBrokerEventObjectMissingPid); const expected = cold('(a|)', { - a: createSuccessfulRemoteDataObject(openaireBrokerEventObjectMissingPid) + a: createSuccessfulRemoteDataObject(notificationsBrokerEventObjectMissingPid) }); expect(result).toBeObservable(expected); }); @@ -203,17 +203,17 @@ describe('OpenaireBrokerEventRestService', () => { }); it('should proxy the call to dataservice.postOnRelated', () => { - service.boundProject(openaireBrokerEventObjectMissingProjectFound.id, requestUUID).subscribe( + service.boundProject(notificationsBrokerEventObjectMissingProjectFound.id, requestUUID).subscribe( (res) => { - expect(serviceASAny.dataService.postOnRelated).toHaveBeenCalledWith(openaireBrokerEventObjectMissingProjectFound.id, requestUUID); + expect(serviceASAny.dataService.postOnRelated).toHaveBeenCalledWith(notificationsBrokerEventObjectMissingProjectFound.id, requestUUID); } ); }); it('should return a RestResponse with HTTP 201', () => { - const result = service.boundProject(openaireBrokerEventObjectMissingProjectFound.id, requestUUID); + const result = service.boundProject(notificationsBrokerEventObjectMissingProjectFound.id, requestUUID); const expected = cold('(a|)', { - a: createSuccessfulRemoteDataObject(openaireBrokerEventObjectMissingProjectFound) + a: createSuccessfulRemoteDataObject(notificationsBrokerEventObjectMissingProjectFound) }); expect(result).toBeObservable(expected); }); @@ -227,15 +227,15 @@ describe('OpenaireBrokerEventRestService', () => { }); it('should proxy the call to dataservice.deleteOnRelated', () => { - service.removeProject(openaireBrokerEventObjectMissingProjectFound.id).subscribe( + service.removeProject(notificationsBrokerEventObjectMissingProjectFound.id).subscribe( (res) => { - expect(serviceASAny.dataService.deleteOnRelated).toHaveBeenCalledWith(openaireBrokerEventObjectMissingProjectFound.id); + expect(serviceASAny.dataService.deleteOnRelated).toHaveBeenCalledWith(notificationsBrokerEventObjectMissingProjectFound.id); } ); }); it('should return a RestResponse with HTTP 204', () => { - const result = service.removeProject(openaireBrokerEventObjectMissingProjectFound.id); + const result = service.removeProject(notificationsBrokerEventObjectMissingProjectFound.id); const expected = cold('(a|)', { a: createSuccessfulRemoteDataObject({}) }); diff --git a/src/app/core/openaire/broker/events/openaire-broker-event-rest.service.ts b/src/app/core/notifications/broker/events/notifications-broker-event-rest.service.ts similarity index 73% rename from src/app/core/openaire/broker/events/openaire-broker-event-rest.service.ts rename to src/app/core/notifications/broker/events/notifications-broker-event-rest.service.ts index 6e944c8038..7f4761009d 100644 --- a/src/app/core/openaire/broker/events/openaire-broker-event-rest.service.ts +++ b/src/app/core/notifications/broker/events/notifications-broker-event-rest.service.ts @@ -17,8 +17,8 @@ import { DataService } from '../../../data/data.service'; import { ChangeAnalyzer } from '../../../data/change-analyzer'; import { DefaultChangeAnalyzer } from '../../../data/default-change-analyzer.service'; import { RemoteData } from '../../../data/remote-data'; -import { OpenaireBrokerEventObject } from '../models/openaire-broker-event.model'; -import { OPENAIRE_BROKER_EVENT_OBJECT } from '../models/openaire-broker-event-object.resource-type'; +import { NotificationsBrokerEventObject } from '../models/notifications-broker-event.model'; +import { NOTIFICATIONS_BROKER_EVENT_OBJECT } from '../models/notifications-broker-event-object.resource-type'; import { FollowLinkConfig } from '../../../../shared/utils/follow-link-config.model'; import { PaginatedList } from '../../../data/paginated-list.model'; import { ReplaceOperation } from 'fast-json-patch'; @@ -29,7 +29,7 @@ import { NoContent } from '../../../shared/NoContent.model'; /** * A private DataService implementation to delegate specific methods to. */ -class DataServiceImpl extends DataService { +class DataServiceImpl extends DataService { /** * The REST endpoint. */ @@ -44,7 +44,7 @@ class DataServiceImpl extends DataService { * @param {HALEndpointService} halService * @param {NotificationsService} notificationsService * @param {HttpClient} http - * @param {ChangeAnalyzer} comparator + * @param {ChangeAnalyzer} comparator */ constructor( protected requestService: RequestService, @@ -54,17 +54,17 @@ class DataServiceImpl extends DataService { protected halService: HALEndpointService, protected notificationsService: NotificationsService, protected http: HttpClient, - protected comparator: ChangeAnalyzer) { + protected comparator: ChangeAnalyzer) { super(); } } /** - * The service handling all OpenAIRE Broker topic REST requests. + * The service handling all Notifications Broker topic REST requests. */ @Injectable() -@dataService(OPENAIRE_BROKER_EVENT_OBJECT) -export class OpenaireBrokerEventRestService { +@dataService(NOTIFICATIONS_BROKER_EVENT_OBJECT) +export class NotificationsBrokerEventRestService { /** * A private DataService implementation to delegate specific methods to. */ @@ -78,7 +78,7 @@ export class OpenaireBrokerEventRestService { * @param {HALEndpointService} halService * @param {NotificationsService} notificationsService * @param {HttpClient} http - * @param {DefaultChangeAnalyzer} comparator + * @param {DefaultChangeAnalyzer} comparator */ constructor( protected requestService: RequestService, @@ -87,23 +87,23 @@ export class OpenaireBrokerEventRestService { protected halService: HALEndpointService, protected notificationsService: NotificationsService, protected http: HttpClient, - protected comparator: DefaultChangeAnalyzer) { + protected comparator: DefaultChangeAnalyzer) { this.dataService = new DataServiceImpl(requestService, rdbService, null, objectCache, halService, notificationsService, http, comparator); } /** - * Return the list of OpenAIRE Broker events by topic. + * Return the list of Notifications Broker events by topic. * * @param topic - * The OpenAIRE Broker topic + * The Notifications Broker topic * @param options * Find list options object. * @param linksToFollow * List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved. - * @return Observable>> - * The list of OpenAIRE Broker events. + * @return Observable>> + * The list of Notifications Broker events. */ - public getEventsByTopic(topic: string, options: FindListOptions = {}, ...linksToFollow: FollowLinkConfig[]): Observable>> { + public getEventsByTopic(topic: string, options: FindListOptions = {}, ...linksToFollow: FollowLinkConfig[]): Observable>> { options.searchParams = [ { fieldName: 'topic', @@ -121,32 +121,32 @@ export class OpenaireBrokerEventRestService { } /** - * Return a single OpenAIRE Broker event. + * Return a single Notifications Broker event. * * @param id - * The OpenAIRE Broker event id + * The Notifications Broker event id * @param linksToFollow * List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved - * @return Observable> - * The OpenAIRE Broker event. + * @return Observable> + * The Notifications Broker event. */ - public getEvent(id: string, ...linksToFollow: FollowLinkConfig[]): Observable> { + public getEvent(id: string, ...linksToFollow: FollowLinkConfig[]): Observable> { return this.dataService.findById(id, true, true, ...linksToFollow); } /** - * Save the new status of an OpenAIRE Broker event. + * Save the new status of a Notifications Broker event. * * @param status * The new status - * @param dso OpenaireBrokerEventObject + * @param dso NotificationsBrokerEventObject * The event item * @param reason * The optional reason (not used for now; for future implementation) * @return Observable * The REST response. */ - public patchEvent(status, dso, reason?: string): Observable> { + public patchEvent(status, dso, reason?: string): Observable> { const operation: ReplaceOperation[] = [ { path: '/status', @@ -158,24 +158,24 @@ export class OpenaireBrokerEventRestService { } /** - * Bound a project to an OpenAIRE Broker event publication. + * Bound a project to a Notifications Broker event publication. * * @param itemId - * The Id of the OpenAIRE Broker event + * The Id of the Notifications Broker event * @param projectId * The project Id to bound * @return Observable * The REST response. */ - public boundProject(itemId: string, projectId: string): Observable> { + public boundProject(itemId: string, projectId: string): Observable> { return this.dataService.postOnRelated(itemId, projectId); } /** - * Remove a project from an OpenAIRE Broker event publication. + * Remove a project from a Notifications Broker event publication. * * @param itemId - * The Id of the OpenAIRE Broker event + * The Id of the Notifications Broker event * @return Observable * The REST response. */ diff --git a/src/app/core/openaire/broker/models/openaire-broker-event-object.resource-type.ts b/src/app/core/notifications/broker/models/notifications-broker-event-object.resource-type.ts similarity index 53% rename from src/app/core/openaire/broker/models/openaire-broker-event-object.resource-type.ts rename to src/app/core/notifications/broker/models/notifications-broker-event-object.resource-type.ts index c0be0071eb..2493ae02d1 100644 --- a/src/app/core/openaire/broker/models/openaire-broker-event-object.resource-type.ts +++ b/src/app/core/notifications/broker/models/notifications-broker-event-object.resource-type.ts @@ -1,9 +1,9 @@ import { ResourceType } from '../../../shared/resource-type'; /** - * The resource type for the OpenAIRE Broker event + * The resource type for the Notifications Broker event * * Needs to be in a separate file to prevent circular * dependencies in webpack. */ -export const OPENAIRE_BROKER_EVENT_OBJECT = new ResourceType('nbevent'); +export const NOTIFICATIONS_BROKER_EVENT_OBJECT = new ResourceType('nbevent'); diff --git a/src/app/core/openaire/broker/models/openaire-broker-event.model.ts b/src/app/core/notifications/broker/models/notifications-broker-event.model.ts similarity index 61% rename from src/app/core/openaire/broker/models/openaire-broker-event.model.ts rename to src/app/core/notifications/broker/models/notifications-broker-event.model.ts index 40c65412f5..ed73168e6d 100644 --- a/src/app/core/openaire/broker/models/openaire-broker-event.model.ts +++ b/src/app/core/notifications/broker/models/notifications-broker-event.model.ts @@ -1,7 +1,7 @@ import { Observable } from 'rxjs'; import { autoserialize, autoserializeAs, deserialize } from 'cerialize'; import { CacheableObject } from '../../../cache/object-cache.reducer'; -import { OPENAIRE_BROKER_EVENT_OBJECT } from './openaire-broker-event-object.resource-type'; +import { NOTIFICATIONS_BROKER_EVENT_OBJECT } from './notifications-broker-event-object.resource-type'; import { excludeFromEquals } from '../../../utilities/equals.decorators'; import { ResourceType } from '../../../shared/resource-type'; import { HALLink } from '../../../shared/hal-link.model'; @@ -11,85 +11,92 @@ import { link, typedObject } from '../../../cache/builders/build-decorators'; import { RemoteData } from '../../../data/remote-data'; /** - * The interface representing the OpenAIRE Broker event message + * The interface representing the Notifications Broker event message */ -export interface OpenaireBrokerEventMessageObject { +export interface NotificationsBrokerEventMessageObject { + +} + +/** + * The interface representing the Notifications Broker event message + */ +export interface OpenaireBrokerEventMessageObject{ /** * The type of 'value' */ type: string; /** - * The value suggested by OpenAIRE + * The value suggested by Notifications */ value: string; /** - * The abstract suggested by OpenAIRE + * The abstract suggested by Notifications */ abstract: string; /** - * The project acronym suggested by OpenAIRE + * The project acronym suggested by Notifications */ acronym: string; /** - * The project code suggested by OpenAIRE + * The project code suggested by Notifications */ code: string; /** - * The project funder suggested by OpenAIRE + * The project funder suggested by Notifications */ funder: string; /** - * The project program suggested by OpenAIRE + * The project program suggested by Notifications */ fundingProgram?: string; /** - * The project jurisdiction suggested by OpenAIRE + * The project jurisdiction suggested by Notifications */ jurisdiction: string; /** - * The project title suggested by OpenAIRE + * The project title suggested by Notifications */ title: string; /** - * The OpenAIRE ID. + * The OPENAIRE ID. */ openaireId: string; } /** - * The interface representing the OpenAIRE Broker event model + * The interface representing the Notifications Broker event model */ @typedObject -export class OpenaireBrokerEventObject implements CacheableObject { +export class NotificationsBrokerEventObject implements CacheableObject { /** * A string representing the kind of object, e.g. community, item, … */ - static type = OPENAIRE_BROKER_EVENT_OBJECT; + static type = NOTIFICATIONS_BROKER_EVENT_OBJECT; /** - * The OpenAIRE Broker event uuid inside DSpace + * The Notifications Broker event uuid inside DSpace */ @autoserialize id: string; /** - * The universally unique identifier of this OpenAIRE Broker event + * The universally unique identifier of this Notifications Broker event */ @autoserializeAs(String, 'id') uuid: string; /** - * The OpenAIRE Broker event original id (ex.: the source archive OAI-PMH identifier) + * The Notifications Broker event original id (ex.: the source archive OAI-PMH identifier) */ @autoserialize originalId: string; @@ -107,19 +114,19 @@ export class OpenaireBrokerEventObject implements CacheableObject { trust: number; /** - * The timestamp OpenAIRE Broker event was saved in DSpace + * The timestamp Notifications Broker event was saved in DSpace */ @autoserialize eventDate: string; /** - * The OpenAIRE Broker event status (ACCEPTED, REJECTED, DISCARDED, PENDING) + * The Notifications Broker event status (ACCEPTED, REJECTED, DISCARDED, PENDING) */ @autoserialize status: string; /** - * The suggestion data. Data may vary depending on the topic + * The suggestion data. Data may vary depending on the source */ @autoserialize message: OpenaireBrokerEventMessageObject; diff --git a/src/app/core/openaire/broker/models/openaire-broker-topic-object.resource-type.ts b/src/app/core/notifications/broker/models/notifications-broker-topic-object.resource-type.ts similarity index 53% rename from src/app/core/openaire/broker/models/openaire-broker-topic-object.resource-type.ts rename to src/app/core/notifications/broker/models/notifications-broker-topic-object.resource-type.ts index 58ceb4e671..e7012eee4f 100644 --- a/src/app/core/openaire/broker/models/openaire-broker-topic-object.resource-type.ts +++ b/src/app/core/notifications/broker/models/notifications-broker-topic-object.resource-type.ts @@ -1,9 +1,9 @@ import { ResourceType } from '../../../shared/resource-type'; /** - * The resource type for the OpenAIRE Broker topic + * The resource type for the Notifications Broker topic * * Needs to be in a separate file to prevent circular * dependencies in webpack. */ -export const OPENAIRE_BROKER_TOPIC_OBJECT = new ResourceType('nbtopic'); +export const NOTIFICATIONS_BROKER_TOPIC_OBJECT = new ResourceType('nbtopic'); diff --git a/src/app/core/openaire/broker/models/openaire-broker-topic.model.ts b/src/app/core/notifications/broker/models/notifications-broker-topic.model.ts similarity index 64% rename from src/app/core/openaire/broker/models/openaire-broker-topic.model.ts rename to src/app/core/notifications/broker/models/notifications-broker-topic.model.ts index 3f286e5fea..d1f2e6ff50 100644 --- a/src/app/core/openaire/broker/models/openaire-broker-topic.model.ts +++ b/src/app/core/notifications/broker/models/notifications-broker-topic.model.ts @@ -1,42 +1,42 @@ import { autoserialize, deserialize } from 'cerialize'; import { CacheableObject } from '../../../cache/object-cache.reducer'; -import { OPENAIRE_BROKER_TOPIC_OBJECT } from './openaire-broker-topic-object.resource-type'; +import { NOTIFICATIONS_BROKER_TOPIC_OBJECT } from './notifications-broker-topic-object.resource-type'; import { excludeFromEquals } from '../../../utilities/equals.decorators'; import { ResourceType } from '../../../shared/resource-type'; import { HALLink } from '../../../shared/hal-link.model'; import { typedObject } from '../../../cache/builders/build-decorators'; /** - * The interface representing the OpenAIRE Broker topic model + * The interface representing the Notifications Broker topic model */ @typedObject -export class OpenaireBrokerTopicObject implements CacheableObject { +export class NotificationsBrokerTopicObject implements CacheableObject { /** * A string representing the kind of object, e.g. community, item, … */ - static type = OPENAIRE_BROKER_TOPIC_OBJECT; + static type = NOTIFICATIONS_BROKER_TOPIC_OBJECT; /** - * The OpenAIRE Broker topic id + * The Notifications Broker topic id */ @autoserialize id: string; /** - * The OpenAIRE Broker topic name to display + * The Notifications Broker topic name to display */ @autoserialize name: string; /** - * The date of the last udate from OpenAIRE + * The date of the last udate from Notifications */ @autoserialize lastEvent: string; /** - * The total number of suggestions provided by OpenAIRE for this topic + * The total number of suggestions provided by Notifications for this topic */ @autoserialize totalEvents: number; diff --git a/src/app/core/openaire/broker/topics/openaire-broker-topic-rest.service.spec.ts b/src/app/core/notifications/broker/topics/notifications-broker-topic-rest.service.spec.ts similarity index 77% rename from src/app/core/openaire/broker/topics/openaire-broker-topic-rest.service.spec.ts rename to src/app/core/notifications/broker/topics/notifications-broker-topic-rest.service.spec.ts index 87aa0b42f0..06931e2032 100644 --- a/src/app/core/openaire/broker/topics/openaire-broker-topic-rest.service.spec.ts +++ b/src/app/core/notifications/broker/topics/notifications-broker-topic-rest.service.spec.ts @@ -14,15 +14,15 @@ import { PageInfo } from '../../../shared/page-info.model'; import { HALEndpointService } from '../../../shared/hal-endpoint.service'; import { NotificationsService } from '../../../../shared/notifications/notifications.service'; import { createSuccessfulRemoteDataObject } from '../../../../shared/remote-data.utils'; -import { OpenaireBrokerTopicRestService } from './openaire-broker-topic-rest.service'; +import { NotificationsBrokerTopicRestService } from './notifications-broker-topic-rest.service'; import { - openaireBrokerTopicObjectMoreAbstract, - openaireBrokerTopicObjectMorePid -} from '../../../../shared/mocks/openaire.mock'; + notificationsBrokerTopicObjectMoreAbstract, + notificationsBrokerTopicObjectMorePid +} from '../../../../shared/mocks/notifications.mock'; -describe('OpenaireBrokerTopicRestService', () => { +describe('NotificationsBrokerTopicRestService', () => { let scheduler: TestScheduler; - let service: OpenaireBrokerTopicRestService; + let service: NotificationsBrokerTopicRestService; let responseCacheEntry: RequestEntry; let requestService: RequestService; let rdbService: RemoteDataBuildService; @@ -36,9 +36,9 @@ describe('OpenaireBrokerTopicRestService', () => { const requestUUID = '8b3c913a-5a4b-438b-9181-be1a5b4a1c8a'; const pageInfo = new PageInfo(); - const array = [ openaireBrokerTopicObjectMorePid, openaireBrokerTopicObjectMoreAbstract ]; + const array = [ notificationsBrokerTopicObjectMorePid, notificationsBrokerTopicObjectMoreAbstract ]; const paginatedList = buildPaginatedList(pageInfo, array); - const brokerTopicObjectRD = createSuccessfulRemoteDataObject(openaireBrokerTopicObjectMorePid); + const brokerTopicObjectRD = createSuccessfulRemoteDataObject(notificationsBrokerTopicObjectMorePid); const paginatedListRD = createSuccessfulRemoteDataObject(paginatedList); beforeEach(() => { @@ -72,7 +72,7 @@ describe('OpenaireBrokerTopicRestService', () => { http = {} as HttpClient; comparator = {} as any; - service = new OpenaireBrokerTopicRestService( + service = new NotificationsBrokerTopicRestService( requestService, rdbService, objectCache, @@ -96,7 +96,7 @@ describe('OpenaireBrokerTopicRestService', () => { done(); }); - it('should return a RemoteData> for the object with the given URL', () => { + it('should return a RemoteData> for the object with the given URL', () => { const result = service.getTopics(); const expected = cold('(a)', { a: paginatedListRD @@ -107,16 +107,16 @@ describe('OpenaireBrokerTopicRestService', () => { describe('getTopic', () => { it('should proxy the call to dataservice.findByHref', (done) => { - service.getTopic(openaireBrokerTopicObjectMorePid.id).subscribe( + service.getTopic(notificationsBrokerTopicObjectMorePid.id).subscribe( (res) => { - expect((service as any).dataService.findByHref).toHaveBeenCalledWith(endpointURL + '/' + openaireBrokerTopicObjectMorePid.id, true, true); + expect((service as any).dataService.findByHref).toHaveBeenCalledWith(endpointURL + '/' + notificationsBrokerTopicObjectMorePid.id, true, true); } ); done(); }); - it('should return a RemoteData for the object with the given URL', () => { - const result = service.getTopic(openaireBrokerTopicObjectMorePid.id); + it('should return a RemoteData for the object with the given URL', () => { + const result = service.getTopic(notificationsBrokerTopicObjectMorePid.id); const expected = cold('(a)', { a: brokerTopicObjectRD }); diff --git a/src/app/core/openaire/broker/topics/openaire-broker-topic-rest.service.ts b/src/app/core/notifications/broker/topics/notifications-broker-topic-rest.service.ts similarity index 75% rename from src/app/core/openaire/broker/topics/openaire-broker-topic-rest.service.ts rename to src/app/core/notifications/broker/topics/notifications-broker-topic-rest.service.ts index 3fe3917485..9f0b93cfb3 100644 --- a/src/app/core/openaire/broker/topics/openaire-broker-topic-rest.service.ts +++ b/src/app/core/notifications/broker/topics/notifications-broker-topic-rest.service.ts @@ -17,8 +17,8 @@ import { DataService } from '../../../data/data.service'; import { ChangeAnalyzer } from '../../../data/change-analyzer'; import { DefaultChangeAnalyzer } from '../../../data/default-change-analyzer.service'; import { RemoteData } from '../../../data/remote-data'; -import { OpenaireBrokerTopicObject } from '../models/openaire-broker-topic.model'; -import { OPENAIRE_BROKER_TOPIC_OBJECT } from '../models/openaire-broker-topic-object.resource-type'; +import { NotificationsBrokerTopicObject } from '../models/notifications-broker-topic.model'; +import { NOTIFICATIONS_BROKER_TOPIC_OBJECT } from '../models/notifications-broker-topic-object.resource-type'; import { FollowLinkConfig } from '../../../../shared/utils/follow-link-config.model'; import { PaginatedList } from '../../../data/paginated-list.model'; @@ -27,7 +27,7 @@ import { PaginatedList } from '../../../data/paginated-list.model'; /** * A private DataService implementation to delegate specific methods to. */ -class DataServiceImpl extends DataService { +class DataServiceImpl extends DataService { /** * The REST endpoint. */ @@ -42,7 +42,7 @@ class DataServiceImpl extends DataService { * @param {HALEndpointService} halService * @param {NotificationsService} notificationsService * @param {HttpClient} http - * @param {ChangeAnalyzer} comparator + * @param {ChangeAnalyzer} comparator */ constructor( protected requestService: RequestService, @@ -52,17 +52,17 @@ class DataServiceImpl extends DataService { protected halService: HALEndpointService, protected notificationsService: NotificationsService, protected http: HttpClient, - protected comparator: ChangeAnalyzer) { + protected comparator: ChangeAnalyzer) { super(); } } /** - * The service handling all OpenAIRE Broker topic REST requests. + * The service handling all Notifications Broker topic REST requests. */ @Injectable() -@dataService(OPENAIRE_BROKER_TOPIC_OBJECT) -export class OpenaireBrokerTopicRestService { +@dataService(NOTIFICATIONS_BROKER_TOPIC_OBJECT) +export class NotificationsBrokerTopicRestService { /** * A private DataService implementation to delegate specific methods to. */ @@ -76,7 +76,7 @@ export class OpenaireBrokerTopicRestService { * @param {HALEndpointService} halService * @param {NotificationsService} notificationsService * @param {HttpClient} http - * @param {DefaultChangeAnalyzer} comparator + * @param {DefaultChangeAnalyzer} comparator */ constructor( protected requestService: RequestService, @@ -85,21 +85,21 @@ export class OpenaireBrokerTopicRestService { protected halService: HALEndpointService, protected notificationsService: NotificationsService, protected http: HttpClient, - protected comparator: DefaultChangeAnalyzer) { + protected comparator: DefaultChangeAnalyzer) { this.dataService = new DataServiceImpl(requestService, rdbService, null, objectCache, halService, notificationsService, http, comparator); } /** - * Return the list of OpenAIRE Broker topics. + * Return the list of Notifications Broker topics. * * @param options * Find list options object. * @param linksToFollow * List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved. - * @return Observable>> - * The list of OpenAIRE Broker topics. + * @return Observable>> + * The list of Notifications Broker topics. */ - public getTopics(options: FindListOptions = {}, ...linksToFollow: FollowLinkConfig[]): Observable>> { + public getTopics(options: FindListOptions = {}, ...linksToFollow: FollowLinkConfig[]): Observable>> { return this.dataService.getBrowseEndpoint(options, 'nbtopics').pipe( take(1), mergeMap((href: string) => this.dataService.findAllByHref(href, options, true, true, ...linksToFollow)), @@ -114,16 +114,16 @@ export class OpenaireBrokerTopicRestService { } /** - * Return a single OpenAIRE Broker topic. + * Return a single Notifications Broker topic. * * @param id - * The OpenAIRE Broker topic id + * The Notifications Broker topic id * @param linksToFollow * List of {@link FollowLinkConfig} that indicate which {@link HALLink}s should be automatically resolved. - * @return Observable> - * The OpenAIRE Broker topic. + * @return Observable> + * The Notifications Broker topic. */ - public getTopic(id: string, ...linksToFollow: FollowLinkConfig[]): Observable> { + public getTopic(id: string, ...linksToFollow: FollowLinkConfig[]): Observable> { const options = {}; return this.dataService.getBrowseEndpoint(options, 'nbtopics').pipe( take(1), diff --git a/src/app/openaire/broker/events/openaire-broker-events.component.html b/src/app/notifications/broker/events/notifications-broker-events.component.html similarity index 60% rename from src/app/openaire/broker/events/openaire-broker-events.component.html rename to src/app/notifications/broker/events/notifications-broker-events.component.html index 05d7722291..a9f51cefd0 100644 --- a/src/app/openaire/broker/events/openaire-broker-events.component.html +++ b/src/app/notifications/broker/events/notifications-broker-events.component.html @@ -1,12 +1,12 @@
-

{{'openaire.events.title'| translate}}

-

{{'openaire.broker.events.description'| translate}}

+

{{'notifications.events.title'| translate}}

+

{{'notifications.broker.events.description'| translate}}

- + - {{'openaire.broker.events.back' | translate}} + {{'notifications.broker.events.back' | translate}}

@@ -14,31 +14,31 @@

- {{'openaire.broker.events.topic' | translate}} {{this.showTopic}} + {{'notifications.broker.events.topic' | translate}} {{this.showTopic}}

- + + (paginationChange)="getNotificationsBrokerEvents()"> - +
- - - - - + + + + + @@ -51,8 +51,8 @@ {{eventElement.title}} @@ -140,9 +140,9 @@ @@ -150,58 +150,58 @@ diff --git a/src/app/openaire/broker/events/openaire-broker-events.component.spec.ts b/src/app/notifications/broker/events/notifications-broker-events.component.spec.ts similarity index 66% rename from src/app/openaire/broker/events/openaire-broker-events.component.spec.ts rename to src/app/notifications/broker/events/notifications-broker-events.component.spec.ts index 267f6a8242..40be083567 100644 --- a/src/app/openaire/broker/events/openaire-broker-events.component.spec.ts +++ b/src/app/notifications/broker/events/notifications-broker-events.component.spec.ts @@ -5,25 +5,25 @@ import { ComponentFixture, inject, TestBed, waitForAsync } from '@angular/core/t import { TranslateModule, TranslateService } from '@ngx-translate/core'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { of as observableOf } from 'rxjs'; -import { OpenaireBrokerEventRestService } from '../../../core/openaire/broker/events/openaire-broker-event-rest.service'; -import { OpenaireBrokerEventsComponent } from './openaire-broker-events.component'; +import { NotificationsBrokerEventRestService } from '../../../core/notifications/broker/events/notifications-broker-event-rest.service'; +import { NotificationsBrokerEventsComponent } from './notifications-broker-events.component'; import { - getMockOpenaireBrokerEventRestService, + getMockNotificationsBrokerEventRestService, ItemMockPid10, ItemMockPid8, ItemMockPid9, - openaireBrokerEventObjectMissingProjectFound, - openaireBrokerEventObjectMissingProjectNotFound, - OpenaireMockDspaceObject -} from '../../../shared/mocks/openaire.mock'; + notificationsBrokerEventObjectMissingProjectFound, + notificationsBrokerEventObjectMissingProjectNotFound, + NotificationsMockDspaceObject +} from '../../../shared/mocks/notifications.mock'; import { NotificationsServiceStub } from '../../../shared/testing/notifications-service.stub'; import { NotificationsService } from '../../../shared/notifications/notifications.service'; import { getMockTranslateService } from '../../../shared/mocks/translate.service.mock'; import { createTestComponent } from '../../../shared/testing/utils.test'; import { ActivatedRouteStub } from '../../../shared/testing/active-router.stub'; import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; -import { OpenaireBrokerEventObject } from '../../../core/openaire/broker/models/openaire-broker-event.model'; -import { OpenaireBrokerEventData } from '../project-entry-import-modal/project-entry-import-modal.component'; +import { NotificationsBrokerEventObject } from '../../../core/notifications/broker/models/notifications-broker-event.model'; +import { NotificationsBrokerEventData } from '../project-entry-import-modal/project-entry-import-modal.component'; import { TestScheduler } from 'rxjs/testing'; import { getTestScheduler } from 'jasmine-marbles'; import { followLink } from '../../../shared/utils/follow-link-config.model'; @@ -39,9 +39,9 @@ import { SortDirection, SortOptions } from '../../../core/cache/models/sort-opti import { PaginationService } from '../../../core/pagination/pagination.service'; import { PaginationServiceStub } from '../../../shared/testing/pagination-service.stub'; -describe('OpenaireBrokerEventsComponent test suite', () => { - let fixture: ComponentFixture; - let comp: OpenaireBrokerEventsComponent; +describe('NotificationsBrokerEventsComponent test suite', () => { + let fixture: ComponentFixture; + let comp: NotificationsBrokerEventsComponent; let compAsAny: any; let scheduler: TestScheduler; @@ -50,9 +50,9 @@ describe('OpenaireBrokerEventsComponent test suite', () => { close: () => null, dismiss: () => null }; - const openaireBrokerEventRestServiceStub: any = getMockOpenaireBrokerEventRestService(); + const notificationsBrokerEventRestServiceStub: any = getMockNotificationsBrokerEventRestService(); const activatedRouteParams = { - openaireBrokerEventsParams: { + notificationsBrokerEventsParams: { currentPage: 0, pageSize: 10 } @@ -61,19 +61,19 @@ describe('OpenaireBrokerEventsComponent test suite', () => { id: 'ENRICH!MISSING!PROJECT' }; - const events: OpenaireBrokerEventObject[] = [ - openaireBrokerEventObjectMissingProjectFound, - openaireBrokerEventObjectMissingProjectNotFound + const events: NotificationsBrokerEventObject[] = [ + notificationsBrokerEventObjectMissingProjectFound, + notificationsBrokerEventObjectMissingProjectNotFound ]; const paginationService = new PaginationServiceStub(); - function getOpenAireBrokerEventData1(): OpenaireBrokerEventData { + function getNotificationsBrokerEventData1(): NotificationsBrokerEventData { return { - event: openaireBrokerEventObjectMissingProjectFound, - id: openaireBrokerEventObjectMissingProjectFound.id, - title: openaireBrokerEventObjectMissingProjectFound.title, + event: notificationsBrokerEventObjectMissingProjectFound, + id: notificationsBrokerEventObjectMissingProjectFound.id, + title: notificationsBrokerEventObjectMissingProjectFound.title, hasProject: true, - projectTitle: openaireBrokerEventObjectMissingProjectFound.message.title, + projectTitle: notificationsBrokerEventObjectMissingProjectFound.message.title, projectId: ItemMockPid10.id, handle: ItemMockPid10.handle, reason: null, @@ -82,11 +82,11 @@ describe('OpenaireBrokerEventsComponent test suite', () => { }; } - function getOpenAireBrokerEventData2(): OpenaireBrokerEventData { + function getNotificationsBrokerEventData2(): NotificationsBrokerEventData { return { - event: openaireBrokerEventObjectMissingProjectNotFound, - id: openaireBrokerEventObjectMissingProjectNotFound.id, - title: openaireBrokerEventObjectMissingProjectNotFound.title, + event: notificationsBrokerEventObjectMissingProjectNotFound, + id: notificationsBrokerEventObjectMissingProjectNotFound.id, + title: notificationsBrokerEventObjectMissingProjectNotFound.title, hasProject: false, projectTitle: null, projectId: null, @@ -104,17 +104,17 @@ describe('OpenaireBrokerEventsComponent test suite', () => { TranslateModule.forRoot(), ], declarations: [ - OpenaireBrokerEventsComponent, + NotificationsBrokerEventsComponent, TestComponent, ], providers: [ { provide: ActivatedRoute, useValue: new ActivatedRouteStub(activatedRouteParamsMap, activatedRouteParams) }, - { provide: OpenaireBrokerEventRestService, useValue: openaireBrokerEventRestServiceStub }, + { provide: NotificationsBrokerEventRestService, useValue: notificationsBrokerEventRestServiceStub }, { provide: NgbModal, useValue: modalStub }, { provide: NotificationsService, useValue: new NotificationsServiceStub() }, { provide: TranslateService, useValue: getMockTranslateService() }, { provide: PaginationService, useValue: paginationService }, - OpenaireBrokerEventsComponent + NotificationsBrokerEventsComponent ], schemas: [NO_ERRORS_SCHEMA] }).compileComponents().then(); @@ -129,7 +129,7 @@ describe('OpenaireBrokerEventsComponent test suite', () => { // synchronous beforeEach beforeEach(() => { const html = ` - `; + `; testFixture = createTestComponent(html, TestComponent) as ComponentFixture; testComp = testFixture.componentInstance; }); @@ -138,14 +138,14 @@ describe('OpenaireBrokerEventsComponent test suite', () => { testFixture.destroy(); }); - it('should create OpenaireBrokerEventsComponent', inject([OpenaireBrokerEventsComponent], (app: OpenaireBrokerEventsComponent) => { + it('should create NotificationsBrokerEventsComponent', inject([NotificationsBrokerEventsComponent], (app: NotificationsBrokerEventsComponent) => { expect(app).toBeDefined(); })); }); describe('Main tests', () => { beforeEach(() => { - fixture = TestBed.createComponent(OpenaireBrokerEventsComponent); + fixture = TestBed.createComponent(NotificationsBrokerEventsComponent); comp = fixture.componentInstance; compAsAny = comp; }); @@ -159,8 +159,8 @@ describe('OpenaireBrokerEventsComponent test suite', () => { describe('setEventUpdated', () => { it('should update events', () => { const expected = [ - getOpenAireBrokerEventData1(), - getOpenAireBrokerEventData2() + getNotificationsBrokerEventData1(), + getNotificationsBrokerEventData2() ]; scheduler.schedule(() => { compAsAny.setEventUpdated(events); @@ -179,14 +179,14 @@ describe('OpenaireBrokerEventsComponent test suite', () => { it('should call executeAction if a project is present', () => { const action = 'ACCEPTED'; - comp.modalChoice(action, getOpenAireBrokerEventData1(), modalStub); - expect(comp.executeAction).toHaveBeenCalledWith(action, getOpenAireBrokerEventData1()); + comp.modalChoice(action, getNotificationsBrokerEventData1(), modalStub); + expect(comp.executeAction).toHaveBeenCalledWith(action, getNotificationsBrokerEventData1()); }); it('should call openModal if a project is not present', () => { const action = 'ACCEPTED'; - comp.modalChoice(action, getOpenAireBrokerEventData2(), modalStub); - expect(comp.openModal).toHaveBeenCalledWith(action, getOpenAireBrokerEventData2(), modalStub); + comp.modalChoice(action, getNotificationsBrokerEventData2(), modalStub); + expect(comp.openModal).toHaveBeenCalledWith(action, getNotificationsBrokerEventData2(), modalStub); }); }); @@ -197,7 +197,7 @@ describe('OpenaireBrokerEventsComponent test suite', () => { spyOn(compAsAny.modalService, 'open').and.returnValue({ result: new Promise((res, rej) => 'do' ) }); spyOn(comp, 'executeAction'); - comp.openModal(action, getOpenAireBrokerEventData1(), modalStub); + comp.openModal(action, getNotificationsBrokerEventData1(), modalStub); expect(compAsAny.modalService.open).toHaveBeenCalled(); }); }); @@ -211,13 +211,13 @@ describe('OpenaireBrokerEventsComponent test suite', () => { externalSourceEntry: null, label: null, importedObject: observableOf({ - indexableObject: OpenaireMockDspaceObject + indexableObject: NotificationsMockDspaceObject }) } } ); scheduler.schedule(() => { - comp.openModalLookup(getOpenAireBrokerEventData1()); + comp.openModalLookup(getNotificationsBrokerEventData1()); }); scheduler.flush(); @@ -227,27 +227,27 @@ describe('OpenaireBrokerEventsComponent test suite', () => { }); describe('executeAction', () => { - it('should call getOpenaireBrokerEvents on 200 response from REST', () => { + it('should call getNotificationsBrokerEvents on 200 response from REST', () => { const action = 'ACCEPTED'; - spyOn(compAsAny, 'getOpenaireBrokerEvents'); - openaireBrokerEventRestServiceStub.patchEvent.and.returnValue(createSuccessfulRemoteDataObject$({})); + spyOn(compAsAny, 'getNotificationsBrokerEvents'); + notificationsBrokerEventRestServiceStub.patchEvent.and.returnValue(createSuccessfulRemoteDataObject$({})); scheduler.schedule(() => { - comp.executeAction(action, getOpenAireBrokerEventData1()); + comp.executeAction(action, getNotificationsBrokerEventData1()); }); scheduler.flush(); - expect(compAsAny.getOpenaireBrokerEvents).toHaveBeenCalled(); + expect(compAsAny.getNotificationsBrokerEvents).toHaveBeenCalled(); }); }); describe('boundProject', () => { it('should populate the project data inside "eventData"', () => { - const eventData = getOpenAireBrokerEventData2(); + const eventData = getNotificationsBrokerEventData2(); const projectId = 'UUID-23943-34u43-38344'; const projectName = 'Test Project'; const projectHandle = '1000/1000'; - openaireBrokerEventRestServiceStub.boundProject.and.returnValue(createSuccessfulRemoteDataObject$({})); + notificationsBrokerEventRestServiceStub.boundProject.and.returnValue(createSuccessfulRemoteDataObject$({})); scheduler.schedule(() => { comp.boundProject(eventData, projectId, projectName, projectHandle); @@ -263,8 +263,8 @@ describe('OpenaireBrokerEventsComponent test suite', () => { describe('removeProject', () => { it('should remove the project data inside "eventData"', () => { - const eventData = getOpenAireBrokerEventData1(); - openaireBrokerEventRestServiceStub.removeProject.and.returnValue(createNoContentRemoteDataObject$()); + const eventData = getNotificationsBrokerEventData1(); + notificationsBrokerEventRestServiceStub.removeProject.and.returnValue(createNoContentRemoteDataObject$()); scheduler.schedule(() => { comp.removeProject(eventData); @@ -278,8 +278,8 @@ describe('OpenaireBrokerEventsComponent test suite', () => { }); }); - describe('getOpenaireBrokerEvents', () => { - it('should call the "openaireBrokerEventRestService.getEventsByTopic" to take data and "setEventUpdated" to populate eventData', () => { + describe('getNotificationsBrokerEvents', () => { + it('should call the "notificationsBrokerEventRestService.getEventsByTopic" to take data and "setEventUpdated" to populate eventData', () => { comp.paginationConfig = new PaginationComponentOptions(); comp.paginationConfig.currentPage = 1; comp.paginationConfig.pageSize = 20; @@ -297,20 +297,20 @@ describe('OpenaireBrokerEventsComponent test suite', () => { currentPage: comp.paginationConfig.currentPage }); const array = [ - openaireBrokerEventObjectMissingProjectFound, - openaireBrokerEventObjectMissingProjectNotFound, + notificationsBrokerEventObjectMissingProjectFound, + notificationsBrokerEventObjectMissingProjectNotFound, ]; const paginatedList = buildPaginatedList(pageInfo, array); const paginatedListRD = createSuccessfulRemoteDataObject(paginatedList); - openaireBrokerEventRestServiceStub.getEventsByTopic.and.returnValue(observableOf(paginatedListRD)); + notificationsBrokerEventRestServiceStub.getEventsByTopic.and.returnValue(observableOf(paginatedListRD)); spyOn(compAsAny, 'setEventUpdated'); scheduler.schedule(() => { - compAsAny.getOpenaireBrokerEvents(); + compAsAny.getNotificationsBrokerEvents(); }); scheduler.flush(); - expect(compAsAny.openaireBrokerEventRestService.getEventsByTopic).toHaveBeenCalledWith( + expect(compAsAny.notificationsBrokerEventRestService.getEventsByTopic).toHaveBeenCalledWith( activatedRouteParamsMap.id, options, followLink('target'),followLink('related') diff --git a/src/app/openaire/broker/events/openaire-broker-events.component.ts b/src/app/notifications/broker/events/notifications-broker-events.component.ts similarity index 71% rename from src/app/openaire/broker/events/openaire-broker-events.component.ts rename to src/app/notifications/broker/events/notifications-broker-events.component.ts index 14ad175e80..b416664fca 100644 --- a/src/app/openaire/broker/events/openaire-broker-events.component.ts +++ b/src/app/notifications/broker/events/notifications-broker-events.component.ts @@ -11,10 +11,10 @@ import { PaginatedList } from '../../../core/data/paginated-list.model'; import { RemoteData } from '../../../core/data/remote-data'; import { FindListOptions } from '../../../core/data/request.models'; import { - OpenaireBrokerEventMessageObject, - OpenaireBrokerEventObject -} from '../../../core/openaire/broker/models/openaire-broker-event.model'; -import { OpenaireBrokerEventRestService } from '../../../core/openaire/broker/events/openaire-broker-event-rest.service'; + NotificationsBrokerEventObject, + OpenaireBrokerEventMessageObject +} from '../../../core/notifications/broker/models/notifications-broker-event.model'; +import { NotificationsBrokerEventRestService } from '../../../core/notifications/broker/events/notifications-broker-event-rest.service'; import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; import { Metadata } from '../../../core/shared/metadata.utils'; import { followLink } from '../../../shared/utils/follow-link-config.model'; @@ -22,7 +22,7 @@ import { hasValue } from '../../../shared/empty.util'; import { ItemSearchResult } from '../../../shared/object-collection/shared/item-search-result.model'; import { NotificationsService } from '../../../shared/notifications/notifications.service'; import { - OpenaireBrokerEventData, + NotificationsBrokerEventData, ProjectEntryImportModalComponent } from '../project-entry-import-modal/project-entry-import-modal.component'; import { getFirstCompletedRemoteData } from '../../../core/shared/operators'; @@ -31,14 +31,14 @@ import { combineLatest } from 'rxjs/internal/observable/combineLatest'; import { Item } from '../../../core/shared/item.model'; /** - * Component to display the OpenAIRE Broker event list. + * Component to display the Notifications Broker event list. */ @Component({ - selector: 'ds-openaire-broker-events', - templateUrl: './openaire-broker-events.component.html', - styleUrls: ['./openaire-broker-events.scomponent.scss'], + selector: 'ds-notifications-broker-events', + templateUrl: './notifications-broker-events.component.html', + styleUrls: ['./notifications-broker-events.scomponent.scss'], }) -export class OpenaireBrokerEventsComponent implements OnInit { +export class NotificationsBrokerEventsComponent implements OnInit { /** * The pagination system configuration for HTML listing. * @type {PaginationComponentOptions} @@ -50,27 +50,27 @@ export class OpenaireBrokerEventsComponent implements OnInit { pageSizeOptions: [5, 10, 20, 40, 60] }); /** - * The OpenAIRE Broker event list sort options. + * The Notifications Broker event list sort options. * @type {SortOptions} */ public paginationSortConfig: SortOptions = new SortOptions('trust', SortDirection.DESC); /** - * Array to save the presence of a project inside an OpenAIRE Broker event. - * @type {OpenaireBrokerEventData[]>} + * Array to save the presence of a project inside an Notifications Broker event. + * @type {NotificationsBrokerEventData[]>} */ - public eventsUpdated$: BehaviorSubject = new BehaviorSubject([]); + public eventsUpdated$: BehaviorSubject = new BehaviorSubject([]); /** - * The total number of OpenAIRE Broker events. + * The total number of Notifications Broker events. * @type {Observable} */ public totalElements$: Observable; /** - * The topic of the OpenAIRE Broker events; suitable for displaying. + * The topic of the Notifications Broker events; suitable for displaying. * @type {string} */ public showTopic: string; /** - * The topic of the OpenAIRE Broker events; suitable for HTTP calls. + * The topic of the Notifications Broker events; suitable for HTTP calls. * @type {string} */ public topic: string; @@ -114,7 +114,7 @@ export class OpenaireBrokerEventsComponent implements OnInit { * @param {ActivatedRoute} activatedRoute * @param {NgbModal} modalService * @param {NotificationsService} notificationsService - * @param {OpenaireBrokerEventRestService} openaireBrokerEventRestService + * @param {NotificationsBrokerEventRestService} notificationsBrokerEventRestService * @param {PaginationService} paginationService * @param {TranslateService} translateService */ @@ -122,7 +122,7 @@ export class OpenaireBrokerEventsComponent implements OnInit { private activatedRoute: ActivatedRoute, private modalService: NgbModal, private notificationsService: NotificationsService, - private openaireBrokerEventRestService: OpenaireBrokerEventRestService, + private notificationsBrokerEventRestService: NotificationsBrokerEventRestService, private paginationService: PaginationService, private translateService: TranslateService ) { @@ -142,7 +142,7 @@ export class OpenaireBrokerEventsComponent implements OnInit { this.showTopic = id.replace(regEx, '/'); this.topic = id; this.isEventPageLoading.next(false); - this.getOpenaireBrokerEvents(); + this.getNotificationsBrokerEvents(); }); } @@ -162,12 +162,12 @@ export class OpenaireBrokerEventsComponent implements OnInit { * * @param {string} action * the action (can be: ACCEPTED, REJECTED, DISCARDED, PENDING) - * @param {OpenaireBrokerEventData} eventData - * the OpenAIRE Broker event data + * @param {NotificationsBrokerEventData} eventData + * the Notifications Broker event data * @param {any} content * Reference to the modal */ - public modalChoice(action: string, eventData: OpenaireBrokerEventData, content: any): void { + public modalChoice(action: string, eventData: NotificationsBrokerEventData, content: any): void { if (eventData.hasProject) { this.executeAction(action, eventData); } else { @@ -180,12 +180,12 @@ export class OpenaireBrokerEventsComponent implements OnInit { * * @param {string} action * the action (can be: ACCEPTED, REJECTED, DISCARDED, PENDING) - * @param {OpenaireBrokerEventData} eventData - * the OpenAIRE Broker event data + * @param {NotificationsBrokerEventData} eventData + * the Notifications Broker event data * @param {any} content * Reference to the modal */ - public openModal(action: string, eventData: OpenaireBrokerEventData, content: any): void { + public openModal(action: string, eventData: NotificationsBrokerEventData, content: any): void { this.modalService.open(content, { ariaLabelledBy: 'modal-basic-title' }).result.then( (result) => { if (result === 'do') { @@ -203,10 +203,10 @@ export class OpenaireBrokerEventsComponent implements OnInit { /** * Open a modal where the user can select the project. * - * @param {OpenaireBrokerEventData} eventData - * the OpenAIRE Broker event item data + * @param {NotificationsBrokerEventData} eventData + * the Notifications Broker event item data */ - public openModalLookup(eventData: OpenaireBrokerEventData): void { + public openModalLookup(eventData: NotificationsBrokerEventData): void { this.modalRef = this.modalService.open(ProjectEntryImportModalComponent, { size: 'lg' }); @@ -232,22 +232,22 @@ export class OpenaireBrokerEventsComponent implements OnInit { * * @param {string} action * the action (can be: ACCEPTED, REJECTED, DISCARDED, PENDING) - * @param {OpenaireBrokerEventData} eventData - * the OpenAIRE Broker event data + * @param {NotificationsBrokerEventData} eventData + * the Notifications Broker event data */ - public executeAction(action: string, eventData: OpenaireBrokerEventData): void { + public executeAction(action: string, eventData: NotificationsBrokerEventData): void { eventData.isRunning = true; this.subs.push( - this.openaireBrokerEventRestService.patchEvent(action, eventData.event, eventData.reason).pipe(getFirstCompletedRemoteData()) - .subscribe((rd: RemoteData) => { + this.notificationsBrokerEventRestService.patchEvent(action, eventData.event, eventData.reason).pipe(getFirstCompletedRemoteData()) + .subscribe((rd: RemoteData) => { if (rd.isSuccess && rd.statusCode === 200) { this.notificationsService.success( - this.translateService.instant('openaire.broker.event.action.saved') + this.translateService.instant('notifications.broker.event.action.saved') ); - this.getOpenaireBrokerEvents(); + this.getNotificationsBrokerEvents(); } else { this.notificationsService.error( - this.translateService.instant('openaire.broker.event.action.error') + this.translateService.instant('notifications.broker.event.action.error') ); } eventData.isRunning = false; @@ -256,10 +256,10 @@ export class OpenaireBrokerEventsComponent implements OnInit { } /** - * Bound a project to the publication described in the OpenAIRE Broker event calling the REST service. + * Bound a project to the publication described in the Notifications Broker event calling the REST service. * - * @param {OpenaireBrokerEventData} eventData - * the OpenAIRE Broker event item data + * @param {NotificationsBrokerEventData} eventData + * the Notifications Broker event item data * @param {string} projectId * the project Id to bound * @param {string} projectTitle @@ -267,14 +267,14 @@ export class OpenaireBrokerEventsComponent implements OnInit { * @param {string} projectHandle * the project handle */ - public boundProject(eventData: OpenaireBrokerEventData, projectId: string, projectTitle: string, projectHandle: string): void { + public boundProject(eventData: NotificationsBrokerEventData, projectId: string, projectTitle: string, projectHandle: string): void { eventData.isRunning = true; this.subs.push( - this.openaireBrokerEventRestService.boundProject(eventData.id, projectId).pipe(getFirstCompletedRemoteData()) - .subscribe((rd: RemoteData) => { + this.notificationsBrokerEventRestService.boundProject(eventData.id, projectId).pipe(getFirstCompletedRemoteData()) + .subscribe((rd: RemoteData) => { if (rd.isSuccess) { this.notificationsService.success( - this.translateService.instant('openaire.broker.event.project.bounded') + this.translateService.instant('notifications.broker.event.project.bounded') ); eventData.hasProject = true; eventData.projectTitle = projectTitle; @@ -282,7 +282,7 @@ export class OpenaireBrokerEventsComponent implements OnInit { eventData.projectId = projectId; } else { this.notificationsService.error( - this.translateService.instant('openaire.broker.event.project.error') + this.translateService.instant('notifications.broker.event.project.error') ); } eventData.isRunning = false; @@ -291,19 +291,19 @@ export class OpenaireBrokerEventsComponent implements OnInit { } /** - * Remove the bounded project from the publication described in the OpenAIRE Broker event calling the REST service. + * Remove the bounded project from the publication described in the Notifications Broker event calling the REST service. * - * @param {OpenaireBrokerEventData} eventData - * the OpenAIRE Broker event data + * @param {NotificationsBrokerEventData} eventData + * the Notifications Broker event data */ - public removeProject(eventData: OpenaireBrokerEventData): void { + public removeProject(eventData: NotificationsBrokerEventData): void { eventData.isRunning = true; this.subs.push( - this.openaireBrokerEventRestService.removeProject(eventData.id).pipe(getFirstCompletedRemoteData()) - .subscribe((rd: RemoteData) => { + this.notificationsBrokerEventRestService.removeProject(eventData.id).pipe(getFirstCompletedRemoteData()) + .subscribe((rd: RemoteData) => { if (rd.isSuccess) { this.notificationsService.success( - this.translateService.instant('openaire.broker.event.project.removed') + this.translateService.instant('notifications.broker.event.project.removed') ); eventData.hasProject = false; eventData.projectTitle = null; @@ -311,7 +311,7 @@ export class OpenaireBrokerEventsComponent implements OnInit { eventData.projectId = null; } else { this.notificationsService.error( - this.translateService.instant('openaire.broker.event.project.error') + this.translateService.instant('notifications.broker.event.project.error') ); } eventData.isRunning = false; @@ -337,26 +337,26 @@ export class OpenaireBrokerEventsComponent implements OnInit { /** - * Dispatch the OpenAIRE Broker events retrival. + * Dispatch the Notifications Broker events retrival. */ - public getOpenaireBrokerEvents(): void { + public getNotificationsBrokerEvents(): void { this.paginationService.getFindListOptions(this.paginationConfig.id, this.defaultConfig).pipe( distinctUntilChanged(), - switchMap((options: FindListOptions) => this.openaireBrokerEventRestService.getEventsByTopic( + switchMap((options: FindListOptions) => this.notificationsBrokerEventRestService.getEventsByTopic( this.topic, options, followLink('target'), followLink('related') )), getFirstCompletedRemoteData(), - ).subscribe((rd: RemoteData>) => { + ).subscribe((rd: RemoteData>) => { if (rd.hasSucceeded) { this.isEventLoading.next(false); this.totalElements$ = observableOf(rd.payload.totalElements); this.setEventUpdated(rd.payload.page); } else { - throw new Error('Can\'t retrieve OpenAIRE Broker events from the Broker events REST service'); + throw new Error('Can\'t retrieve Notifications Broker events from the Broker events REST service'); } - this.openaireBrokerEventRestService.clearFindByTopicRequests(); + this.notificationsBrokerEventRestService.clearFindByTopicRequests(); }); } @@ -370,15 +370,15 @@ export class OpenaireBrokerEventsComponent implements OnInit { } /** - * Set the project status for the OpenAIRE Broker events. + * Set the project status for the Notifications Broker events. * - * @param {OpenaireBrokerEventObject[]} events - * the OpenAIRE Broker event item + * @param {NotificationsBrokerEventObject[]} events + * the Notifications Broker event item */ - protected setEventUpdated(events: OpenaireBrokerEventObject[]): void { + protected setEventUpdated(events: NotificationsBrokerEventObject[]): void { this.subs.push( from(events).pipe( - mergeMap((event: OpenaireBrokerEventObject) => { + mergeMap((event: NotificationsBrokerEventObject) => { const related$ = event.related.pipe( getFirstCompletedRemoteData(), ); @@ -387,7 +387,7 @@ export class OpenaireBrokerEventsComponent implements OnInit { ); return combineLatest([related$, target$]).pipe( map(([relatedItemRD, targetItemRD]: [RemoteData, RemoteData]) => { - const data: OpenaireBrokerEventData = { + const data: NotificationsBrokerEventData = { event: event, id: event.id, title: event.title, diff --git a/src/app/openaire/broker/events/openaire-broker-events.scomponent.scss b/src/app/notifications/broker/events/notifications-broker-events.scomponent.scss similarity index 100% rename from src/app/openaire/broker/events/openaire-broker-events.scomponent.scss rename to src/app/notifications/broker/events/notifications-broker-events.scomponent.scss diff --git a/src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.html b/src/app/notifications/broker/project-entry-import-modal/project-entry-import-modal.component.html similarity index 100% rename from src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.html rename to src/app/notifications/broker/project-entry-import-modal/project-entry-import-modal.component.html diff --git a/src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.scss b/src/app/notifications/broker/project-entry-import-modal/project-entry-import-modal.component.scss similarity index 100% rename from src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.scss rename to src/app/notifications/broker/project-entry-import-modal/project-entry-import-modal.component.scss diff --git a/src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.spec.ts b/src/app/notifications/broker/project-entry-import-modal/project-entry-import-modal.component.spec.ts similarity index 92% rename from src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.spec.ts rename to src/app/notifications/broker/project-entry-import-modal/project-entry-import-modal.component.spec.ts index e19d0a7c86..7cac576844 100644 --- a/src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.spec.ts +++ b/src/app/notifications/broker/project-entry-import-modal/project-entry-import-modal.component.spec.ts @@ -17,16 +17,16 @@ import { buildPaginatedList } from '../../../core/data/paginated-list.model'; import { PageInfo } from '../../../core/shared/page-info.model'; import { ItemMockPid10, - openaireBrokerEventObjectMissingProjectFound, - OpenaireMockDspaceObject -} from '../../../shared/mocks/openaire.mock'; + notificationsBrokerEventObjectMissingProjectFound, + NotificationsMockDspaceObject +} from '../../../shared/mocks/notifications.mock'; const eventData = { - event: openaireBrokerEventObjectMissingProjectFound, - id: openaireBrokerEventObjectMissingProjectFound.id, - title: openaireBrokerEventObjectMissingProjectFound.title, + event: notificationsBrokerEventObjectMissingProjectFound, + id: notificationsBrokerEventObjectMissingProjectFound.id, + title: notificationsBrokerEventObjectMissingProjectFound.title, hasProject: true, - projectTitle: openaireBrokerEventObjectMissingProjectFound.message.title, + projectTitle: notificationsBrokerEventObjectMissingProjectFound.message.title, projectId: ItemMockPid10.id, handle: ItemMockPid10.handle, reason: null, @@ -36,7 +36,7 @@ const eventData = { const searchString = 'Test project to search'; const pagination = Object.assign( new PaginationComponentOptions(), { - id: 'openaire-project-bound', + id: 'notifications-project-bound', pageSize: 3 } ); @@ -54,7 +54,7 @@ const pageInfo = new PageInfo({ currentPage: 1 }); const array = [ - OpenaireMockDspaceObject, + NotificationsMockDspaceObject, ]; const paginatedList = buildPaginatedList(pageInfo, array); const paginatedListRD = createSuccessfulRemoteDataObject(paginatedList); @@ -143,7 +143,7 @@ describe('ProjectEntryImportModalComponent test suite', () => { spyOn(comp, 'deselectAllLists'); spyOn(comp, 'close'); spyOn(comp.importedObject, 'emit'); - comp.selectedEntity = OpenaireMockDspaceObject; + comp.selectedEntity = NotificationsMockDspaceObject; comp.bound(); expect(comp.importedObject.emit).toHaveBeenCalled(); diff --git a/src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.ts b/src/app/notifications/broker/project-entry-import-modal/project-entry-import-modal.component.ts similarity index 89% rename from src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.ts rename to src/app/notifications/broker/project-entry-import-modal/project-entry-import-modal.component.ts index 5d8cb20c6d..64672fa1fa 100644 --- a/src/app/openaire/broker/project-entry-import-modal/project-entry-import-modal.component.ts +++ b/src/app/notifications/broker/project-entry-import-modal/project-entry-import-modal.component.ts @@ -12,7 +12,11 @@ import { ListableObject } from '../../../shared/object-collection/shared/listabl import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; import { SearchService } from '../../../core/shared/search/search.service'; import { DSpaceObject } from '../../../core/shared/dspace-object.model'; -import { OpenaireBrokerEventObject } from '../../../core/openaire/broker/models/openaire-broker-event.model'; +import { + NotificationsBrokerEventObject, + NotificationsBrokerEventMessageObject, + OpenaireBrokerEventMessageObject, +} from '../../../core/notifications/broker/models/notifications-broker-event.model'; import { hasValue, isNotEmpty } from '../../../shared/empty.util'; import { Item } from '../../../core/shared/item.model'; @@ -30,13 +34,13 @@ export enum ImportType { /** * The data type passed from the parent page */ -export interface OpenaireBrokerEventData { +export interface NotificationsBrokerEventData { /** - * The OpenAIRE Broker event + * The Notifications Broker event */ - event: OpenaireBrokerEventObject; + event: NotificationsBrokerEventObject; /** - * The OpenAIRE Broker event Id (uuid) + * The Notifications Broker event Id (uuid) */ id: string; /** @@ -79,14 +83,14 @@ export interface OpenaireBrokerEventData { templateUrl: './project-entry-import-modal.component.html' }) /** - * Component to display a modal window for linking a project to an OpenAIRE Broker event + * Component to display a modal window for linking a project to an Notifications Broker event * Shows information about the selected project and a selectable list. */ export class ProjectEntryImportModalComponent implements OnInit { /** * The external source entry */ - @Input() externalSourceEntry: OpenaireBrokerEventData; + @Input() externalSourceEntry: NotificationsBrokerEventData; /** * The number of results per page */ @@ -94,7 +98,7 @@ export class ProjectEntryImportModalComponent implements OnInit { /** * The prefix for every i18n key within this modal */ - labelPrefix = 'openaire.broker.event.modal.'; + labelPrefix = 'notifications.broker.event.modal.'; /** * The search configuration to retrieve project */ @@ -126,11 +130,11 @@ export class ProjectEntryImportModalComponent implements OnInit { /** * List ID for selecting local entities */ - entityListId = 'openaire-project-bound'; + entityListId = 'notifications-project-bound'; /** * List ID for selecting local authorities */ - authorityListId = 'openaire-project-bound-authority'; + authorityListId = 'notifications-project-bound-authority'; /** * ImportType enum */ @@ -175,8 +179,9 @@ export class ProjectEntryImportModalComponent implements OnInit { * Component intitialization. */ public ngOnInit(): void { - this.pagination = Object.assign(new PaginationComponentOptions(), { id: 'openaire-project-bound', pageSize: this.pageSize }); - this.projectTitle = (this.externalSourceEntry.projectTitle !== null) ? this.externalSourceEntry.projectTitle : this.externalSourceEntry.event.message.title; + this.pagination = Object.assign(new PaginationComponentOptions(), { id: 'notifications-project-bound', pageSize: this.pageSize }); + this.projectTitle = (this.externalSourceEntry.projectTitle !== null) ? this.externalSourceEntry.projectTitle + : (this.externalSourceEntry.event.message as OpenaireBrokerEventMessageObject).title; this.searchOptions = Object.assign(new PaginatedSearchOptions( { configuration: this.configuration, diff --git a/src/app/openaire/broker/topics/openaire-broker-topics.actions.ts b/src/app/notifications/broker/topics/notifications-broker-topics.actions.ts similarity index 60% rename from src/app/openaire/broker/topics/openaire-broker-topics.actions.ts rename to src/app/notifications/broker/topics/notifications-broker-topics.actions.ts index fd98c6acb8..622ecc8141 100644 --- a/src/app/openaire/broker/topics/openaire-broker-topics.actions.ts +++ b/src/app/notifications/broker/topics/notifications-broker-topics.actions.ts @@ -1,6 +1,6 @@ import { Action } from '@ngrx/store'; import { type } from '../../../shared/ngrx/type'; -import { OpenaireBrokerTopicObject } from '../../../core/openaire/broker/models/openaire-broker-topic.model'; +import { NotificationsBrokerTopicObject } from '../../../core/notifications/broker/models/notifications-broker-topic.model'; /** * For each action type in an action group, make a simple @@ -10,19 +10,19 @@ import { OpenaireBrokerTopicObject } from '../../../core/openaire/broker/models/ * literal types and runs a simple check to guarantee all * action types in the application are unique. */ -export const OpenaireBrokerTopicActionTypes = { - ADD_TOPICS: type('dspace/integration/openaire/broker/topic/ADD_TOPICS'), - RETRIEVE_ALL_TOPICS: type('dspace/integration/openaire/broker/topic/RETRIEVE_ALL_TOPICS'), - RETRIEVE_ALL_TOPICS_ERROR: type('dspace/integration/openaire/broker/topic/RETRIEVE_ALL_TOPICS_ERROR'), +export const NotificationsBrokerTopicActionTypes = { + ADD_TOPICS: type('dspace/integration/notifications/broker/topic/ADD_TOPICS'), + RETRIEVE_ALL_TOPICS: type('dspace/integration/notifications/broker/topic/RETRIEVE_ALL_TOPICS'), + RETRIEVE_ALL_TOPICS_ERROR: type('dspace/integration/notifications/broker/topic/RETRIEVE_ALL_TOPICS_ERROR'), }; /* tslint:disable:max-classes-per-file */ /** - * An ngrx action to retrieve all the OpenAIRE Broker topics. + * An ngrx action to retrieve all the Notifications Broker topics. */ export class RetrieveAllTopicsAction implements Action { - type = OpenaireBrokerTopicActionTypes.RETRIEVE_ALL_TOPICS; + type = NotificationsBrokerTopicActionTypes.RETRIEVE_ALL_TOPICS; payload: { elementsPerPage: number; currentPage: number; @@ -45,20 +45,20 @@ export class RetrieveAllTopicsAction implements Action { } /** - * An ngrx action for retrieving 'all OpenAIRE Broker topics' error. + * An ngrx action for retrieving 'all Notifications Broker topics' error. */ export class RetrieveAllTopicsErrorAction implements Action { - type = OpenaireBrokerTopicActionTypes.RETRIEVE_ALL_TOPICS_ERROR; + type = NotificationsBrokerTopicActionTypes.RETRIEVE_ALL_TOPICS_ERROR; } /** - * An ngrx action to load the OpenAIRE Broker topic objects. + * An ngrx action to load the Notifications Broker topic objects. * Called by the ??? effect. */ export class AddTopicsAction implements Action { - type = OpenaireBrokerTopicActionTypes.ADD_TOPICS; + type = NotificationsBrokerTopicActionTypes.ADD_TOPICS; payload: { - topics: OpenaireBrokerTopicObject[]; + topics: NotificationsBrokerTopicObject[]; totalPages: number; currentPage: number; totalElements: number; @@ -74,9 +74,9 @@ export class AddTopicsAction implements Action { * @param currentPage * the current page * @param totalElements - * the total available OpenAIRE Broker topics + * the total available Notifications Broker topics */ - constructor(topics: OpenaireBrokerTopicObject[], totalPages: number, currentPage: number, totalElements: number) { + constructor(topics: NotificationsBrokerTopicObject[], totalPages: number, currentPage: number, totalElements: number) { this.payload = { topics, totalPages, @@ -93,7 +93,7 @@ export class AddTopicsAction implements Action { * Export a type alias of all actions in this action group * so that reducers can easily compose action types. */ -export type OpenaireBrokerTopicsActions +export type NotificationsBrokerTopicsActions = AddTopicsAction |RetrieveAllTopicsAction |RetrieveAllTopicsErrorAction; diff --git a/src/app/openaire/broker/topics/openaire-broker-topics.component.html b/src/app/notifications/broker/topics/notifications-broker-topics.component.html similarity index 66% rename from src/app/openaire/broker/topics/openaire-broker-topics.component.html rename to src/app/notifications/broker/topics/notifications-broker-topics.component.html index d8321bc932..02371a8a6b 100644 --- a/src/app/openaire/broker/topics/openaire-broker-topics.component.html +++ b/src/app/notifications/broker/topics/notifications-broker-topics.component.html @@ -1,34 +1,34 @@
-

{{'openaire.broker.title'| translate}}

-

{{'openaire.broker.topics.description'| translate}}

+

{{'notifications.broker.title'| translate}}

+

{{'notifications.broker.topics.description'| translate}}

-

{{'openaire.broker.topics'| translate}}

+

{{'notifications.broker.topics'| translate}}

- + + (paginationChange)="getNotificationsBrokerTopics()"> - +
{{'openaire.broker.event.table.trust' | translate}}{{'openaire.broker.event.table.publication' | translate}}{{'openaire.broker.event.table.details' | translate}}{{'openaire.broker.event.table.project-details' | translate}}{{'openaire.broker.event.table.actions' | translate}}{{'notifications.broker.event.table.trust' | translate}}{{'notifications.broker.event.table.publication' | translate}}{{'notifications.broker.event.table.details' | translate}}{{'notifications.broker.event.table.project-details' | translate}}{{'notifications.broker.event.table.actions' | translate}}
-

{{'openaire.broker.event.table.pidtype' | translate}} {{eventElement.event.message.type}}

-

{{'openaire.broker.event.table.pidvalue' | translate}}
+

{{'notifications.broker.event.table.pidtype' | translate}} {{eventElement.event.message.type}}

+

{{'notifications.broker.event.table.pidvalue' | translate}}
{{eventElement.event.message.value}} @@ -60,37 +60,37 @@

-

{{'openaire.broker.event.table.subjectValue' | translate}}
{{eventElement.event.message.value}}

+

{{'notifications.broker.event.table.subjectValue' | translate}}
{{eventElement.event.message.value}}

- {{'openaire.broker.event.table.abstract' | translate}}
+ {{'notifications.broker.event.table.abstract' | translate}}
{{eventElement.event.message.abstract}}

- {{'openaire.broker.event.table.suggestedProject' | translate}} + {{'notifications.broker.event.table.suggestedProject' | translate}}

- {{'openaire.broker.event.table.project' | translate}}
+ {{'notifications.broker.event.table.project' | translate}}
{{eventElement.event.message.title}}

- {{'openaire.broker.event.table.acronym' | translate}} {{eventElement.event.message.acronym}}
- {{'openaire.broker.event.table.code' | translate}} {{eventElement.event.message.code}}
- {{'openaire.broker.event.table.funder' | translate}} {{eventElement.event.message.funder}}
- {{'openaire.broker.event.table.fundingProgram' | translate}} {{eventElement.event.message.fundingProgram}}
- {{'openaire.broker.event.table.jurisdiction' | translate}} {{eventElement.event.message.jurisdiction}} + {{'notifications.broker.event.table.acronym' | translate}} {{eventElement.event.message.acronym}}
+ {{'notifications.broker.event.table.code' | translate}} {{eventElement.event.message.code}}
+ {{'notifications.broker.event.table.funder' | translate}} {{eventElement.event.message.funder}}
+ {{'notifications.broker.event.table.fundingProgram' | translate}} {{eventElement.event.message.fundingProgram}}
+ {{'notifications.broker.event.table.jurisdiction' | translate}} {{eventElement.event.message.jurisdiction}}


- {{(eventElement.hasProject ? 'openaire.broker.event.project.found' : 'openaire.broker.event.project.notFound') | translate}} + {{(eventElement.hasProject ? 'notifications.broker.event.project.found' : 'notifications.broker.event.project.notFound') | translate}} {{eventElement.handle}}
- - - + + + @@ -39,7 +39,7 @@
{{'openaire.broker.table.topic' | translate}}{{'openaire.broker.table.last-event' | translate}}{{'openaire.broker.table.actions' | translate}}{{'notifications.broker.table.topic' | translate}}{{'notifications.broker.table.last-event' | translate}}{{'notifications.broker.table.actions' | translate}}
+ + + + + + + + + + + + + + +
{{'notifications.broker.table.source' | translate}}{{'notifications.broker.table.last-event' | translate}}{{'notifications.broker.table.actions' | translate}}
{{sourceElement.id}}{{sourceElement.lastEvent}} +
+ +
+
+
+
+
+
+
+
+ diff --git a/src/app/notifications/broker/source/notifications-broker-source.component.scss b/src/app/notifications/broker/source/notifications-broker-source.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/notifications/broker/source/notifications-broker-source.component.spec.ts b/src/app/notifications/broker/source/notifications-broker-source.component.spec.ts new file mode 100644 index 0000000000..7d18c726c5 --- /dev/null +++ b/src/app/notifications/broker/source/notifications-broker-source.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { NotificationsBrokerSourceComponent } from './notifications-broker-source.component'; + +describe('NotificationsBrokerSourceComponent', () => { + let component: NotificationsBrokerSourceComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ NotificationsBrokerSourceComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(NotificationsBrokerSourceComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/notifications/broker/source/notifications-broker-source.component.ts b/src/app/notifications/broker/source/notifications-broker-source.component.ts new file mode 100644 index 0000000000..070e03f396 --- /dev/null +++ b/src/app/notifications/broker/source/notifications-broker-source.component.ts @@ -0,0 +1,139 @@ +import { Component, OnInit } from '@angular/core'; +import { PaginationService } from '../../../core/pagination/pagination.service'; +import { Observable, Subscription } from 'rxjs'; +import { distinctUntilChanged, take } from 'rxjs/operators'; +import { SortOptions } from '../../../core/cache/models/sort-options.model'; +import { NotificationsBrokerSourceObject } from '../../../core/notifications/broker/models/notifications-broker-source.model'; +import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; +import { NotificationsStateService } from '../../notifications-state.service'; +import { AdminNotificationsBrokerSourcePageParams } from '../../../admin/admin-notifications/admin-notifications-broker-source-page-component/admin-notifications-broker-source-page-resolver.service'; +import { hasValue } from '../../../shared/empty.util'; + +@Component({ + selector: 'ds-notifications-broker-source', + templateUrl: './notifications-broker-source.component.html', + styleUrls: ['./notifications-broker-source.component.scss'] +}) +export class NotificationsBrokerSourceComponent implements OnInit { + + /** + * The pagination system configuration for HTML listing. + * @type {PaginationComponentOptions} + */ + public paginationConfig: PaginationComponentOptions = Object.assign(new PaginationComponentOptions(), { + id: 'btp', + pageSize: 10, + pageSizeOptions: [5, 10, 20, 40, 60] + }); + /** + * The Notifications Broker source list sort options. + * @type {SortOptions} + */ + public paginationSortConfig: SortOptions; + /** + * The Notifications Broker source list. + */ + public sources$: Observable; + /** + * The total number of Notifications Broker sources. + */ + public totalElements$: Observable; + /** + * Array to track all the component subscriptions. Useful to unsubscribe them with 'onDestroy'. + * @type {Array} + */ + protected subs: Subscription[] = []; + + /** + * Initialize the component variables. + * @param {PaginationService} paginationService + * @param {NotificationsStateService} notificationsStateService + */ + constructor( + private paginationService: PaginationService, + private notificationsStateService: NotificationsStateService, + ) { } + + /** + * Component initialization. + */ + ngOnInit(): void { + this.sources$ = this.notificationsStateService.getNotificationsBrokerSource(); + this.totalElements$ = this.notificationsStateService.getNotificationsBrokerSourceTotals(); + } + + /** + * First Notifications Broker source loading after view initialization. + */ + ngAfterViewInit(): void { + this.subs.push( + this.notificationsStateService.isNotificationsBrokerSourceLoaded().pipe( + take(1) + ).subscribe(() => { + this.getNotificationsBrokerSource(); + }) + ); + } + + /** + * Returns the information about the loading status of the Notifications Broker source (if it's running or not). + * + * @return Observable + * 'true' if the source are loading, 'false' otherwise. + */ + public isSourceLoading(): Observable { + return this.notificationsStateService.isNotificationsBrokerSourceLoading(); + } + + /** + * Returns the information about the processing status of the Notifications Broker source (if it's running or not). + * + * @return Observable + * 'true' if there are operations running on the source (ex.: a REST call), 'false' otherwise. + */ + public isSourceProcessing(): Observable { + return this.notificationsStateService.isNotificationsBrokerSourceProcessing(); + } + + /** + * Dispatch the Notifications Broker source retrival. + */ + public getNotificationsBrokerSource(): void { + this.paginationService.getCurrentPagination(this.paginationConfig.id, this.paginationConfig).pipe( + distinctUntilChanged(), + ).subscribe((options: PaginationComponentOptions) => { + this.notificationsStateService.dispatchRetrieveNotificationsBrokerSource( + options.pageSize, + options.currentPage + ); + }); + } + + /** + * Update pagination Config from route params + * + * @param eventsRouteParams + */ + protected updatePaginationFromRouteParams(eventsRouteParams: AdminNotificationsBrokerSourcePageParams) { + if (eventsRouteParams.currentPage) { + this.paginationConfig.currentPage = eventsRouteParams.currentPage; + } + if (eventsRouteParams.pageSize) { + if (this.paginationConfig.pageSizeOptions.includes(eventsRouteParams.pageSize)) { + this.paginationConfig.pageSize = eventsRouteParams.pageSize; + } else { + this.paginationConfig.pageSize = this.paginationConfig.pageSizeOptions[0]; + } + } + } + + /** + * Unsubscribe from all subscriptions. + */ + ngOnDestroy(): void { + this.subs + .filter((sub) => hasValue(sub)) + .forEach((sub) => sub.unsubscribe()); + } + +} diff --git a/src/app/notifications/broker/source/notifications-broker-source.effects.ts b/src/app/notifications/broker/source/notifications-broker-source.effects.ts new file mode 100644 index 0000000000..bd8b3f00cd --- /dev/null +++ b/src/app/notifications/broker/source/notifications-broker-source.effects.ts @@ -0,0 +1,87 @@ +import { Injectable } from '@angular/core'; +import { Store } from '@ngrx/store'; +import { Actions, Effect, ofType } from '@ngrx/effects'; +import { TranslateService } from '@ngx-translate/core'; +import { catchError, map, switchMap, tap, withLatestFrom } from 'rxjs/operators'; +import { of as observableOf } from 'rxjs'; +import { + AddSourceAction, + NotificationsBrokerSourceActionTypes, + RetrieveAllSourceAction, + RetrieveAllSourceErrorAction, +} from './notifications-broker-source.actions'; + +import { NotificationsBrokerSourceObject } from '../../../core/notifications/broker/models/notifications-broker-source.model'; +import { PaginatedList } from '../../../core/data/paginated-list.model'; +import { NotificationsBrokerSourceService } from './notifications-broker-source.service'; +import { NotificationsService } from '../../../shared/notifications/notifications.service'; +import { NotificationsBrokerSourceRestService } from '../../../core/notifications/broker/source/notifications-broker-source-rest.service'; + +/** + * Provides effect methods for the Notifications Broker source actions. + */ +@Injectable() +export class NotificationsBrokerSourceEffects { + + /** + * Retrieve all Notifications Broker source managing pagination and errors. + */ + @Effect() retrieveAllSource$ = this.actions$.pipe( + ofType(NotificationsBrokerSourceActionTypes.RETRIEVE_ALL_SOURCE), + withLatestFrom(this.store$), + switchMap(([action, currentState]: [RetrieveAllSourceAction, any]) => { + return this.notificationsBrokerSourceService.getSources( + action.payload.elementsPerPage, + action.payload.currentPage + ).pipe( + map((sources: PaginatedList) => + new AddSourceAction(sources.page, sources.totalPages, sources.currentPage, sources.totalElements) + ), + catchError((error: Error) => { + if (error) { + console.error(error.message); + } + return observableOf(new RetrieveAllSourceErrorAction()); + }) + ); + }) + ); + + /** + * Show a notification on error. + */ + @Effect({ dispatch: false }) retrieveAllSourceErrorAction$ = this.actions$.pipe( + ofType(NotificationsBrokerSourceActionTypes.RETRIEVE_ALL_SOURCE_ERROR), + tap(() => { + this.notificationsService.error(null, this.translate.get('notifications.broker.source.error.service.retrieve')); + }) + ); + + /** + * Clear find all source requests from cache. + */ + @Effect({ dispatch: false }) addSourceAction$ = this.actions$.pipe( + ofType(NotificationsBrokerSourceActionTypes.ADD_SOURCE), + tap(() => { + this.notificationsBrokerSourceDataService.clearFindAllSourceRequests(); + }) + ); + + /** + * Initialize the effect class variables. + * @param {Actions} actions$ + * @param {Store} store$ + * @param {TranslateService} translate + * @param {NotificationsService} notificationsService + * @param {NotificationsBrokerSourceService} notificationsBrokerSourceService + * @param {NotificationsBrokerSourceRestService} notificationsBrokerSourceDataService + */ + constructor( + private actions$: Actions, + private store$: Store, + private translate: TranslateService, + private notificationsService: NotificationsService, + private notificationsBrokerSourceService: NotificationsBrokerSourceService, + private notificationsBrokerSourceDataService: NotificationsBrokerSourceRestService + ) { } +} diff --git a/src/app/notifications/broker/source/notifications-broker-source.reducer.ts b/src/app/notifications/broker/source/notifications-broker-source.reducer.ts new file mode 100644 index 0000000000..5395796380 --- /dev/null +++ b/src/app/notifications/broker/source/notifications-broker-source.reducer.ts @@ -0,0 +1,72 @@ +import { NotificationsBrokerSourceObject } from '../../../core/notifications/broker/models/notifications-broker-source.model'; +import { NotificationsBrokerSourceActionTypes, NotificationsBrokerSourceActions } from './notifications-broker-source.actions'; + +/** + * The interface representing the Notifications Broker source state. + */ +export interface NotificationsBrokerSourceState { + source: NotificationsBrokerSourceObject[]; + processing: boolean; + loaded: boolean; + totalPages: number; + currentPage: number; + totalElements: number; +} + +/** + * Used for the Notifications Broker source state initialization. + */ +const notificationsBrokerSourceInitialState: NotificationsBrokerSourceState = { + source: [], + processing: false, + loaded: false, + totalPages: 0, + currentPage: 0, + totalElements: 0 +}; + +/** + * The Notifications Broker Source Reducer + * + * @param state + * the current state initialized with notificationsBrokerSourceInitialState + * @param action + * the action to perform on the state + * @return NotificationsBrokerSourceState + * the new state + */ +export function notificationsBrokerSourceReducer(state = notificationsBrokerSourceInitialState, action: NotificationsBrokerSourceActions): NotificationsBrokerSourceState { + switch (action.type) { + case NotificationsBrokerSourceActionTypes.RETRIEVE_ALL_SOURCE: { + return Object.assign({}, state, { + source: [], + processing: true + }); + } + + case NotificationsBrokerSourceActionTypes.ADD_SOURCE: { + return Object.assign({}, state, { + source: action.payload.source, + processing: false, + loaded: true, + totalPages: action.payload.totalPages, + currentPage: state.currentPage, + totalElements: action.payload.totalElements + }); + } + + case NotificationsBrokerSourceActionTypes.RETRIEVE_ALL_SOURCE_ERROR: { + return Object.assign({}, state, { + processing: false, + loaded: true, + totalPages: 0, + currentPage: 0, + totalElements: 0 + }); + } + + default: { + return state; + } + } +} diff --git a/src/app/notifications/broker/source/notifications-broker-source.service.ts b/src/app/notifications/broker/source/notifications-broker-source.service.ts new file mode 100644 index 0000000000..e80643049c --- /dev/null +++ b/src/app/notifications/broker/source/notifications-broker-source.service.ts @@ -0,0 +1,55 @@ +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs'; +import { find, map } from 'rxjs/operators'; +import { NotificationsBrokerSourceRestService } from '../../../core/notifications/broker/source/notifications-broker-source-rest.service'; +import { SortDirection, SortOptions } from '../../../core/cache/models/sort-options.model'; +import { FindListOptions } from '../../../core/data/request.models'; +import { RemoteData } from '../../../core/data/remote-data'; +import { PaginatedList } from '../../../core/data/paginated-list.model'; +import { NotificationsBrokerSourceObject } from '../../../core/notifications/broker/models/notifications-broker-source.model'; + +/** + * The service handling all Notifications Broker source requests to the REST service. + */ +@Injectable() +export class NotificationsBrokerSourceService { + + /** + * Initialize the service variables. + * @param {NotificationsBrokerSourceRestService} notificationsBrokerSourceRestService + */ + constructor( + private notificationsBrokerSourceRestService: NotificationsBrokerSourceRestService + ) { } + + /** + * Return the list of Notifications Broker source managing pagination and errors. + * + * @param elementsPerPage + * The number of the source per page + * @param currentPage + * The page number to retrieve + * @return Observable> + * The list of Notifications Broker source. + */ + public getSources(elementsPerPage, currentPage): Observable> { + const sortOptions = new SortOptions('name', SortDirection.ASC); + + const findListOptions: FindListOptions = { + elementsPerPage: elementsPerPage, + currentPage: currentPage, + sort: sortOptions + }; + + return this.notificationsBrokerSourceRestService.getSources(findListOptions).pipe( + find((rd: RemoteData>) => !rd.isResponsePending), + map((rd: RemoteData>) => { + if (rd.hasSucceeded) { + return rd.payload; + } else { + throw new Error('Can\'t retrieve Notifications Broker source from the Broker source REST service'); + } + }) + ); + } +} diff --git a/src/app/notifications/broker/topics/notifications-broker-topics.component.html b/src/app/notifications/broker/topics/notifications-broker-topics.component.html index 02371a8a6b..8b27778ee9 100644 --- a/src/app/notifications/broker/topics/notifications-broker-topics.component.html +++ b/src/app/notifications/broker/topics/notifications-broker-topics.component.html @@ -2,7 +2,7 @@

{{'notifications.broker.title'| translate}}

-

{{'notifications.broker.topics.description'| translate}}

+

{{'notifications.broker.topics.description'| translate:{source: sourceId} }}

diff --git a/src/app/notifications/broker/topics/notifications-broker-topics.component.ts b/src/app/notifications/broker/topics/notifications-broker-topics.component.ts index 3bedf6b9d0..f33d3c2fb1 100644 --- a/src/app/notifications/broker/topics/notifications-broker-topics.component.ts +++ b/src/app/notifications/broker/topics/notifications-broker-topics.component.ts @@ -1,7 +1,7 @@ import { Component, OnInit } from '@angular/core'; import { Observable, Subscription } from 'rxjs'; -import { distinctUntilChanged, take } from 'rxjs/operators'; +import { distinctUntilChanged, map, take } from 'rxjs/operators'; import { SortOptions } from '../../../core/cache/models/sort-options.model'; import { NotificationsBrokerTopicObject } from '../../../core/notifications/broker/models/notifications-broker-topic.model'; @@ -10,6 +10,8 @@ import { PaginationComponentOptions } from '../../../shared/pagination/paginatio import { NotificationsStateService } from '../../notifications-state.service'; import { AdminNotificationsBrokerTopicsPageParams } from '../../../admin/admin-notifications/admin-notifications-broker-topics-page/admin-notifications-broker-topics-page-resolver.service'; import { PaginationService } from '../../../core/pagination/pagination.service'; +import { ActivatedRoute } from '@angular/router'; +import { NotificationsBrokerTopicsService } from './notifications-broker-topics.service'; /** * Component to display the Notifications Broker topic list. @@ -48,6 +50,12 @@ export class NotificationsBrokerTopicsComponent implements OnInit { */ protected subs: Subscription[] = []; + /** + * This property represents a sourceId which is used to retrive a topic + * @type {string} + */ + public sourceId: string; + /** * Initialize the component variables. * @param {PaginationService} paginationService @@ -55,8 +63,18 @@ export class NotificationsBrokerTopicsComponent implements OnInit { */ constructor( private paginationService: PaginationService, + private activatedRoute: ActivatedRoute, private notificationsStateService: NotificationsStateService, - ) { } + private notificationsBrokerTopicsService: NotificationsBrokerTopicsService + ) { + this.activatedRoute.paramMap.pipe( + map((params) => params.get('sourceId')), + take(1) + ).subscribe((id: string) => { + this.sourceId = id; + this.notificationsBrokerTopicsService.setSourceId(this.sourceId); + }); + } /** * Component initialization. diff --git a/src/app/notifications/broker/topics/notifications-broker-topics.service.ts b/src/app/notifications/broker/topics/notifications-broker-topics.service.ts index b04229e0d9..80c52a70a9 100644 --- a/src/app/notifications/broker/topics/notifications-broker-topics.service.ts +++ b/src/app/notifications/broker/topics/notifications-broker-topics.service.ts @@ -7,6 +7,7 @@ import { FindListOptions } from '../../../core/data/request.models'; import { RemoteData } from '../../../core/data/remote-data'; import { PaginatedList } from '../../../core/data/paginated-list.model'; import { NotificationsBrokerTopicObject } from '../../../core/notifications/broker/models/notifications-broker-topic.model'; +import { RequestParam } from '../../../core/cache/models/request-param.model'; /** * The service handling all Notifications Broker topic requests to the REST service. @@ -22,6 +23,11 @@ export class NotificationsBrokerTopicsService { private notificationsBrokerTopicRestService: NotificationsBrokerTopicRestService ) { } + /** + * sourceId used to get topics + */ + sourceId: string; + /** * Return the list of Notifications Broker topics managing pagination and errors. * @@ -38,7 +44,8 @@ export class NotificationsBrokerTopicsService { const findListOptions: FindListOptions = { elementsPerPage: elementsPerPage, currentPage: currentPage, - sort: sortOptions + sort: sortOptions, + searchParams: [new RequestParam('source', this.sourceId)] }; return this.notificationsBrokerTopicRestService.getTopics(findListOptions).pipe( @@ -52,4 +59,12 @@ export class NotificationsBrokerTopicsService { }) ); } + + /** + * set sourceId which is used to get topics + * @param sourceId string + */ + setSourceId(sourceId: string) { + this.sourceId = sourceId; + } } diff --git a/src/app/notifications/notifications-state.service.ts b/src/app/notifications/notifications-state.service.ts index c81c924465..cbee503acd 100644 --- a/src/app/notifications/notifications-state.service.ts +++ b/src/app/notifications/notifications-state.service.ts @@ -8,11 +8,19 @@ import { getNotificationsBrokerTopicsTotalsSelector, isNotificationsBrokerTopicsLoadedSelector, notificationsBrokerTopicsObjectSelector, - isNotificationsBrokerTopicsProcessingSelector + isNotificationsBrokerTopicsProcessingSelector, + notificationsBrokerSourceObjectSelector, + isNotificationsBrokerSourceLoadedSelector, + isNotificationsBrokerSourceProcessingSelector, + getNotificationsBrokerSourceTotalPagesSelector, + getNotificationsBrokerSourceCurrentPageSelector, + getNotificationsBrokerSourceTotalsSelector } from './selectors'; import { NotificationsBrokerTopicObject } from '../core/notifications/broker/models/notifications-broker-topic.model'; import { NotificationsState } from './notifications.reducer'; import { RetrieveAllTopicsAction } from './broker/topics/notifications-broker-topics.actions'; +import { NotificationsBrokerSourceObject } from '../core/notifications/broker/models/notifications-broker-source.model'; +import { RetrieveAllSourceAction } from './broker/source/notifications-broker-source.actions'; /** * The service handling the Notifications State. @@ -113,4 +121,92 @@ export class NotificationsStateService { public dispatchRetrieveNotificationsBrokerTopics(elementsPerPage: number, currentPage: number): void { this.store.dispatch(new RetrieveAllTopicsAction(elementsPerPage, currentPage)); } + + // Notifications Broker source + // -------------------------------------------------------------------------- + + /** + * Returns the list of Notifications Broker source from the state. + * + * @return Observable + * The list of Notifications Broker source. + */ + public getNotificationsBrokerSource(): Observable { + return this.store.pipe(select(notificationsBrokerSourceObjectSelector())); + } + + /** + * Returns the information about the loading status of the Notifications Broker source (if it's running or not). + * + * @return Observable + * 'true' if the source are loading, 'false' otherwise. + */ + public isNotificationsBrokerSourceLoading(): Observable { + return this.store.pipe( + select(isNotificationsBrokerSourceLoadedSelector), + map((loaded: boolean) => !loaded) + ); + } + + /** + * Returns the information about the loading status of the Notifications Broker source (whether or not they were loaded). + * + * @return Observable + * 'true' if the source are loaded, 'false' otherwise. + */ + public isNotificationsBrokerSourceLoaded(): Observable { + return this.store.pipe(select(isNotificationsBrokerSourceLoadedSelector)); + } + + /** + * Returns the information about the processing status of the Notifications Broker source (if it's running or not). + * + * @return Observable + * 'true' if there are operations running on the source (ex.: a REST call), 'false' otherwise. + */ + public isNotificationsBrokerSourceProcessing(): Observable { + return this.store.pipe(select(isNotificationsBrokerSourceProcessingSelector)); + } + + /** + * Returns, from the state, the total available pages of the Notifications Broker source. + * + * @return Observable + * The number of the Notifications Broker source pages. + */ + public getNotificationsBrokerSourceTotalPages(): Observable { + return this.store.pipe(select(getNotificationsBrokerSourceTotalPagesSelector)); + } + + /** + * Returns the current page of the Notifications Broker source, from the state. + * + * @return Observable + * The number of the current Notifications Broker source page. + */ + public getNotificationsBrokerSourceCurrentPage(): Observable { + return this.store.pipe(select(getNotificationsBrokerSourceCurrentPageSelector)); + } + + /** + * Returns the total number of the Notifications Broker source. + * + * @return Observable + * The number of the Notifications Broker source. + */ + public getNotificationsBrokerSourceTotals(): Observable { + return this.store.pipe(select(getNotificationsBrokerSourceTotalsSelector)); + } + + /** + * Dispatch a request to change the Notifications Broker source state, retrieving the source from the server. + * + * @param elementsPerPage + * The number of the source per page. + * @param currentPage + * The number of the current page. + */ + public dispatchRetrieveNotificationsBrokerSource(elementsPerPage: number, currentPage: number): void { + this.store.dispatch(new RetrieveAllSourceAction(elementsPerPage, currentPage)); + } } diff --git a/src/app/notifications/notifications.effects.ts b/src/app/notifications/notifications.effects.ts index cbc76a5b3e..39ecded797 100644 --- a/src/app/notifications/notifications.effects.ts +++ b/src/app/notifications/notifications.effects.ts @@ -1,5 +1,7 @@ +import { NotificationsBrokerSourceEffects } from './broker/source/notifications-broker-source.effects'; import { NotificationsBrokerTopicsEffects } from './broker/topics/notifications-broker-topics.effects'; export const notificationsEffects = [ - NotificationsBrokerTopicsEffects + NotificationsBrokerTopicsEffects, + NotificationsBrokerSourceEffects ]; diff --git a/src/app/notifications/notifications.module.ts b/src/app/notifications/notifications.module.ts index 4b0ba3cfd1..63224fdd81 100644 --- a/src/app/notifications/notifications.module.ts +++ b/src/app/notifications/notifications.module.ts @@ -17,6 +17,9 @@ import { NotificationsBrokerEventRestService } from '../core/notifications/broke import { ProjectEntryImportModalComponent } from './broker/project-entry-import-modal/project-entry-import-modal.component'; import { TranslateModule } from '@ngx-translate/core'; import { SearchModule } from '../shared/search/search.module'; +import { NotificationsBrokerSourceComponent } from './broker/source/notifications-broker-source.component'; +import { NotificationsBrokerSourceService } from './broker/source/notifications-broker-source.service'; +import { NotificationsBrokerSourceRestService } from '../core/notifications/broker/source/notifications-broker-source-rest.service'; const MODULES = [ CommonModule, @@ -29,7 +32,8 @@ const MODULES = [ const COMPONENTS = [ NotificationsBrokerTopicsComponent, - NotificationsBrokerEventsComponent + NotificationsBrokerEventsComponent, + NotificationsBrokerSourceComponent ]; const DIRECTIVES = [ ]; @@ -41,7 +45,9 @@ const ENTRY_COMPONENTS = [ const PROVIDERS = [ NotificationsStateService, NotificationsBrokerTopicsService, + NotificationsBrokerSourceService, NotificationsBrokerTopicRestService, + NotificationsBrokerSourceRestService, NotificationsBrokerEventRestService ]; diff --git a/src/app/notifications/notifications.reducer.ts b/src/app/notifications/notifications.reducer.ts index b3dc54d524..27bebbea20 100644 --- a/src/app/notifications/notifications.reducer.ts +++ b/src/app/notifications/notifications.reducer.ts @@ -1,5 +1,5 @@ import { ActionReducerMap, createFeatureSelector } from '@ngrx/store'; - +import { notificationsBrokerSourceReducer, NotificationsBrokerSourceState } from './broker/source/notifications-broker-source.reducer'; import { notificationsBrokerTopicsReducer, NotificationsBrokerTopicState, } from './broker/topics/notifications-broker-topics.reducer'; /** @@ -7,10 +7,12 @@ import { notificationsBrokerTopicsReducer, NotificationsBrokerTopicState, } from */ export interface NotificationsState { 'brokerTopic': NotificationsBrokerTopicState; + 'brokerSource': NotificationsBrokerSourceState; } export const notificationsReducers: ActionReducerMap = { brokerTopic: notificationsBrokerTopicsReducer, + brokerSource: notificationsBrokerSourceReducer }; export const notificationsSelector = createFeatureSelector('notifications'); diff --git a/src/app/notifications/selectors.ts b/src/app/notifications/selectors.ts index 7474aa3adc..0436a35eb3 100644 --- a/src/app/notifications/selectors.ts +++ b/src/app/notifications/selectors.ts @@ -3,6 +3,8 @@ import { subStateSelector } from '../shared/selector.util'; import { notificationsSelector, NotificationsState } from './notifications.reducer'; import { NotificationsBrokerTopicObject } from '../core/notifications/broker/models/notifications-broker-topic.model'; import { NotificationsBrokerTopicState } from './broker/topics/notifications-broker-topics.reducer'; +import { NotificationsBrokerSourceState } from './broker/source/notifications-broker-source.reducer'; +import { NotificationsBrokerSourceObject } from '../core/notifications/broker/models/notifications-broker-source.model'; /** * Returns the Notifications state. @@ -77,3 +79,69 @@ export const getNotificationsBrokerTopicsCurrentPageSelector = createSelector(_g export const getNotificationsBrokerTopicsTotalsSelector = createSelector(_getNotificationsState, (state: NotificationsState) => state.brokerTopic.totalElements ); + +// Notifications Broker source +// ---------------------------------------------------------------------------- + +/** + * Returns the Notifications Broker source State. + * @function notificationsBrokerSourceStateSelector + * @return {NotificationsBrokerSourceState} + */ + export function notificationsBrokerSourceStateSelector(): MemoizedSelector { + return subStateSelector(notificationsSelector, 'brokerSource'); +} + +/** + * Returns the Notifications Broker source list. + * @function notificationsBrokerSourceObjectSelector + * @return {NotificationsBrokerSourceObject[]} + */ +export function notificationsBrokerSourceObjectSelector(): MemoizedSelector { + return subStateSelector(notificationsBrokerSourceStateSelector(), 'source'); +} + +/** + * Returns true if the Notifications Broker source are loaded. + * @function isNotificationsBrokerSourceLoadedSelector + * @return {boolean} + */ +export const isNotificationsBrokerSourceLoadedSelector = createSelector(_getNotificationsState, + (state: NotificationsState) => state.brokerSource.loaded +); + +/** + * Returns true if the deduplication sets are processing. + * @function isDeduplicationSetsProcessingSelector + * @return {boolean} + */ +export const isNotificationsBrokerSourceProcessingSelector = createSelector(_getNotificationsState, + (state: NotificationsState) => state.brokerSource.processing +); + +/** + * Returns the total available pages of Notifications Broker source. + * @function getNotificationsBrokerSourceTotalPagesSelector + * @return {number} + */ +export const getNotificationsBrokerSourceTotalPagesSelector = createSelector(_getNotificationsState, + (state: NotificationsState) => state.brokerSource.totalPages +); + +/** + * Returns the current page of Notifications Broker source. + * @function getNotificationsBrokerSourceCurrentPageSelector + * @return {number} + */ +export const getNotificationsBrokerSourceCurrentPageSelector = createSelector(_getNotificationsState, + (state: NotificationsState) => state.brokerSource.currentPage +); + +/** + * Returns the total number of Notifications Broker source. + * @function getNotificationsBrokerSourceTotalsSelector + * @return {number} + */ +export const getNotificationsBrokerSourceTotalsSelector = createSelector(_getNotificationsState, + (state: NotificationsState) => state.brokerSource.totalElements +); diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 674254e605..e04792273b 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -487,6 +487,8 @@ "admin.notifications.broker.page.title": "Notifications Broker", + "admin.notifications.source.breadcrumbs": "Notifications Source", + "admin.search.breadcrumbs": "Administrative Search", "admin.search.collection.edit": "Edit", @@ -2713,14 +2715,20 @@ "none.listelement.badge": "Item", - "notifications.broker.title": "{{source}} Broker", + "notifications.broker.title": "Broker Title", "notifications.broker.topics.description": "Below you can see all the topics received from the subscriptions to {{source}}.", + "notifications.broker.source.description": "Below you can see all the sources.", + "notifications.broker.topics": "Current Topics", + "notifications.broker.source": "Current Sources", + "notifications.broker.table.topic": "Topic", + "notifications.broker.table.source": "Source", + "notifications.broker.table.last-event": "Last Event", "notifications.broker.table.actions": "Actions", @@ -2729,10 +2737,14 @@ "notifications.broker.noTopics": "No topics found.", + "notifications.broker.noSource": "No sources found.", + "notifications.events.title": "{{source}} Broker Suggestions", "notifications.broker.topic.error.service.retrieve": "An error occurred while loading the Notifications Broker topics", + "notifications.broker.source.error.service.retrieve": "An error occurred while loading the Notifications Broker source", + "notifications.broker.events.description": "Below the list of all the suggestions, received from {{source}}, for the selected topic.", "notifications.broker.loading": "Loading ...", From 00f7fa97f1462d5370a50025c63e2dd97cc27d74 Mon Sep 17 00:00:00 2001 From: Pratik Rajkotiya Date: Thu, 10 Mar 2022 11:49:12 +0530 Subject: [PATCH 006/343] [CST-5337] test cases done. --- config/config.yml | 4 +- ...tions-broker-source-page.component.spec.ts | 6 +- ...cations-broker-source-rest.service.spec.ts | 127 +++ ...ifications-broker-source.component.spec.ts | 159 +++- ...otifications-broker-source.reducer.spec.ts | 68 ++ ...otifications-broker-source.service.spec.ts | 68 ++ ...ifications-broker-topics.component.spec.ts | 15 +- .../notifications-broker-topics.component.ts | 9 +- ...otifications-broker-topics.service.spec.ts | 5 +- .../notifications-state.service.spec.ts | 732 ++++++++++++------ src/app/shared/mocks/notifications.mock.ts | 58 ++ 11 files changed, 986 insertions(+), 265 deletions(-) create mode 100644 src/app/core/notifications/broker/source/notifications-broker-source-rest.service.spec.ts create mode 100644 src/app/notifications/broker/source/notifications-broker-source.reducer.spec.ts create mode 100644 src/app/notifications/broker/source/notifications-broker-source.service.spec.ts diff --git a/config/config.yml b/config/config.yml index b5eecd112f..3866797f5d 100644 --- a/config/config.yml +++ b/config/config.yml @@ -1,5 +1,5 @@ rest: - ssl: true - host: api7.dspace.org + ssl: false + host: localhost:8080 port: 443 nameSpace: /server diff --git a/src/app/admin/admin-notifications/admin-notifications-broker-source-page-component/admin-notifications-broker-source-page.component.spec.ts b/src/app/admin/admin-notifications/admin-notifications-broker-source-page-component/admin-notifications-broker-source-page.component.spec.ts index c4a3611c58..f6d3eb20fe 100644 --- a/src/app/admin/admin-notifications/admin-notifications-broker-source-page-component/admin-notifications-broker-source-page.component.spec.ts +++ b/src/app/admin/admin-notifications/admin-notifications-broker-source-page-component/admin-notifications-broker-source-page.component.spec.ts @@ -1,3 +1,4 @@ +import { NO_ERRORS_SCHEMA } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { AdminNotificationsBrokerSourcePageComponent } from './admin-notifications-broker-source-page.component'; @@ -8,7 +9,8 @@ describe('AdminNotificationsBrokerSourcePageComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ AdminNotificationsBrokerSourcePageComponent ] + declarations: [ AdminNotificationsBrokerSourcePageComponent ], + schemas: [NO_ERRORS_SCHEMA] }) .compileComponents(); }); @@ -19,7 +21,7 @@ describe('AdminNotificationsBrokerSourcePageComponent', () => { fixture.detectChanges(); }); - it('should create', () => { + it('should create AdminNotificationsBrokerSourcePageComponent', () => { expect(component).toBeTruthy(); }); }); diff --git a/src/app/core/notifications/broker/source/notifications-broker-source-rest.service.spec.ts b/src/app/core/notifications/broker/source/notifications-broker-source-rest.service.spec.ts new file mode 100644 index 0000000000..984f44bd15 --- /dev/null +++ b/src/app/core/notifications/broker/source/notifications-broker-source-rest.service.spec.ts @@ -0,0 +1,127 @@ +import { HttpClient } from '@angular/common/http'; + +import { TestScheduler } from 'rxjs/testing'; +import { of as observableOf } from 'rxjs'; +import { cold, getTestScheduler } from 'jasmine-marbles'; + +import { RequestService } from '../../../data/request.service'; +import { buildPaginatedList } from '../../../data/paginated-list.model'; +import { RequestEntry } from '../../../data/request.reducer'; +import { RemoteDataBuildService } from '../../../cache/builders/remote-data-build.service'; +import { ObjectCacheService } from '../../../cache/object-cache.service'; +import { RestResponse } from '../../../cache/response.models'; +import { PageInfo } from '../../../shared/page-info.model'; +import { HALEndpointService } from '../../../shared/hal-endpoint.service'; +import { NotificationsService } from '../../../../shared/notifications/notifications.service'; +import { createSuccessfulRemoteDataObject } from '../../../../shared/remote-data.utils'; +import { NotificationsBrokerSourceRestService } from './notifications-broker-source-rest.service'; +import { + notificationsBrokerSourceObjectMoreAbstract, + notificationsBrokerSourceObjectMorePid +} from '../../../../shared/mocks/notifications.mock'; + +describe('NotificationsBrokerSourceRestService', () => { + let scheduler: TestScheduler; + let service: NotificationsBrokerSourceRestService; + let responseCacheEntry: RequestEntry; + let requestService: RequestService; + let rdbService: RemoteDataBuildService; + let objectCache: ObjectCacheService; + let halService: HALEndpointService; + let notificationsService: NotificationsService; + let http: HttpClient; + let comparator: any; + + const endpointURL = 'https://rest.api/rest/api/integration/nbsources'; + const requestUUID = '8b3c913a-5a4b-438b-9181-be1a5b4a1c8a'; + + const pageInfo = new PageInfo(); + const array = [ notificationsBrokerSourceObjectMorePid, notificationsBrokerSourceObjectMoreAbstract ]; + const paginatedList = buildPaginatedList(pageInfo, array); + const brokerSourceObjectRD = createSuccessfulRemoteDataObject(notificationsBrokerSourceObjectMorePid); + const paginatedListRD = createSuccessfulRemoteDataObject(paginatedList); + + beforeEach(() => { + scheduler = getTestScheduler(); + + responseCacheEntry = new RequestEntry(); + responseCacheEntry.response = new RestResponse(true, 200, 'Success'); + requestService = jasmine.createSpyObj('requestService', { + generateRequestId: requestUUID, + send: true, + removeByHrefSubstring: {}, + getByHref: observableOf(responseCacheEntry), + getByUUID: observableOf(responseCacheEntry), + }); + + rdbService = jasmine.createSpyObj('rdbService', { + buildSingle: cold('(a)', { + a: brokerSourceObjectRD + }), + buildList: cold('(a)', { + a: paginatedListRD + }), + }); + + objectCache = {} as ObjectCacheService; + halService = jasmine.createSpyObj('halService', { + getEndpoint: cold('a|', { a: endpointURL }) + }); + + notificationsService = {} as NotificationsService; + http = {} as HttpClient; + comparator = {} as any; + + service = new NotificationsBrokerSourceRestService( + requestService, + rdbService, + objectCache, + halService, + notificationsService, + http, + comparator + ); + + spyOn((service as any).dataService, 'findAllByHref').and.callThrough(); + spyOn((service as any).dataService, 'findByHref').and.callThrough(); + }); + + describe('getSources', () => { + it('should proxy the call to dataservice.findAllByHref', (done) => { + service.getSources().subscribe( + (res) => { + expect((service as any).dataService.findAllByHref).toHaveBeenCalledWith(endpointURL, {}, true, true); + } + ); + done(); + }); + + it('should return a RemoteData> for the object with the given URL', () => { + const result = service.getSources(); + const expected = cold('(a)', { + a: paginatedListRD + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('getSource', () => { + it('should proxy the call to dataservice.findByHref', (done) => { + service.getSource(notificationsBrokerSourceObjectMorePid.id).subscribe( + (res) => { + expect((service as any).dataService.findByHref).toHaveBeenCalledWith(endpointURL + '/' + notificationsBrokerSourceObjectMorePid.id, true, true); + } + ); + done(); + }); + + it('should return a RemoteData for the object with the given URL', () => { + const result = service.getSource(notificationsBrokerSourceObjectMorePid.id); + const expected = cold('(a)', { + a: brokerSourceObjectRD + }); + expect(result).toBeObservable(expected); + }); + }); + +}); diff --git a/src/app/notifications/broker/source/notifications-broker-source.component.spec.ts b/src/app/notifications/broker/source/notifications-broker-source.component.spec.ts index 7d18c726c5..6c0ad42ce8 100644 --- a/src/app/notifications/broker/source/notifications-broker-source.component.spec.ts +++ b/src/app/notifications/broker/source/notifications-broker-source.component.spec.ts @@ -1,25 +1,152 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; - +import { CommonModule } from '@angular/common'; +import { Component, NO_ERRORS_SCHEMA } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { TranslateModule } from '@ngx-translate/core'; +import { of as observableOf } from 'rxjs'; +import { ComponentFixture, inject, TestBed, waitForAsync } from '@angular/core/testing'; +import { createTestComponent } from '../../../shared/testing/utils.test'; +import { + getMockNotificationsStateService, + notificationsBrokerSourceObjectMoreAbstract, + notificationsBrokerSourceObjectMorePid +} from '../../../shared/mocks/notifications.mock'; import { NotificationsBrokerSourceComponent } from './notifications-broker-source.component'; +import { NotificationsStateService } from '../../notifications-state.service'; +import { cold } from 'jasmine-marbles'; +import { PaginationServiceStub } from '../../../shared/testing/pagination-service.stub'; +import { PaginationService } from '../../../core/pagination/pagination.service'; -describe('NotificationsBrokerSourceComponent', () => { - let component: NotificationsBrokerSourceComponent; +describe('NotificationsBrokerSourceComponent test suite', () => { let fixture: ComponentFixture; + let comp: NotificationsBrokerSourceComponent; + let compAsAny: any; + const mockNotificationsStateService = getMockNotificationsStateService(); + const activatedRouteParams = { + notificationsBrokerSourceParams: { + currentPage: 0, + pageSize: 5 + } + }; + const paginationService = new PaginationServiceStub(); - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [ NotificationsBrokerSourceComponent ] - }) - .compileComponents(); + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + imports: [ + CommonModule, + TranslateModule.forRoot(), + ], + declarations: [ + NotificationsBrokerSourceComponent, + TestComponent, + ], + providers: [ + { provide: NotificationsStateService, useValue: mockNotificationsStateService }, + { provide: ActivatedRoute, useValue: { data: observableOf(activatedRouteParams), params: observableOf({}) } }, + { provide: PaginationService, useValue: paginationService }, + NotificationsBrokerSourceComponent + ], + schemas: [NO_ERRORS_SCHEMA] + }).compileComponents().then(() => { + mockNotificationsStateService.getNotificationsBrokerSource.and.returnValue(observableOf([ + notificationsBrokerSourceObjectMorePid, + notificationsBrokerSourceObjectMoreAbstract + ])); + mockNotificationsStateService.getNotificationsBrokerSourceTotalPages.and.returnValue(observableOf(1)); + mockNotificationsStateService.getNotificationsBrokerSourceCurrentPage.and.returnValue(observableOf(0)); + mockNotificationsStateService.getNotificationsBrokerSourceTotals.and.returnValue(observableOf(2)); + mockNotificationsStateService.isNotificationsBrokerSourceLoaded.and.returnValue(observableOf(true)); + mockNotificationsStateService.isNotificationsBrokerSourceLoading.and.returnValue(observableOf(false)); + mockNotificationsStateService.isNotificationsBrokerSourceProcessing.and.returnValue(observableOf(false)); + }); + })); + + // First test to check the correct component creation + describe('', () => { + let testComp: TestComponent; + let testFixture: ComponentFixture; + + // synchronous beforeEach + beforeEach(() => { + const html = ` + `; + testFixture = createTestComponent(html, TestComponent) as ComponentFixture; + testComp = testFixture.componentInstance; + }); + + afterEach(() => { + testFixture.destroy(); + }); + + it('should create NotificationsBrokerSourceComponent', inject([NotificationsBrokerSourceComponent], (app: NotificationsBrokerSourceComponent) => { + expect(app).toBeDefined(); + })); }); - beforeEach(() => { - fixture = TestBed.createComponent(NotificationsBrokerSourceComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); + describe('Main tests running with two Source', () => { + beforeEach(() => { + fixture = TestBed.createComponent(NotificationsBrokerSourceComponent); + comp = fixture.componentInstance; + compAsAny = comp; - it('should create', () => { - expect(component).toBeTruthy(); + }); + + afterEach(() => { + fixture.destroy(); + comp = null; + compAsAny = null; + }); + + it(('Should init component properly'), () => { + comp.ngOnInit(); + fixture.detectChanges(); + + expect(comp.sources$).toBeObservable(cold('(a|)', { + a: [ + notificationsBrokerSourceObjectMorePid, + notificationsBrokerSourceObjectMoreAbstract + ] + })); + expect(comp.totalElements$).toBeObservable(cold('(a|)', { + a: 2 + })); + }); + + it(('Should set data properly after the view init'), () => { + spyOn(compAsAny, 'getNotificationsBrokerSource'); + + comp.ngAfterViewInit(); + fixture.detectChanges(); + + expect(compAsAny.getNotificationsBrokerSource).toHaveBeenCalled(); + }); + + it(('isSourceLoading should return FALSE'), () => { + expect(comp.isSourceLoading()).toBeObservable(cold('(a|)', { + a: false + })); + }); + + it(('isSourceProcessing should return FALSE'), () => { + expect(comp.isSourceProcessing()).toBeObservable(cold('(a|)', { + a: false + })); + }); + + it(('getNotificationsBrokerSource should call the service to dispatch a STATE change'), () => { + comp.ngOnInit(); + fixture.detectChanges(); + + compAsAny.notificationsStateService.dispatchRetrieveNotificationsBrokerSource(comp.paginationConfig.pageSize, comp.paginationConfig.currentPage).and.callThrough(); + expect(compAsAny.notificationsStateService.dispatchRetrieveNotificationsBrokerSource).toHaveBeenCalledWith(comp.paginationConfig.pageSize, comp.paginationConfig.currentPage); + }); }); }); + +// declare a test component +@Component({ + selector: 'ds-test-cmp', + template: `` +}) +class TestComponent { + +} diff --git a/src/app/notifications/broker/source/notifications-broker-source.reducer.spec.ts b/src/app/notifications/broker/source/notifications-broker-source.reducer.spec.ts new file mode 100644 index 0000000000..74bc77d3ec --- /dev/null +++ b/src/app/notifications/broker/source/notifications-broker-source.reducer.spec.ts @@ -0,0 +1,68 @@ +import { + AddSourceAction, + RetrieveAllSourceAction, + RetrieveAllSourceErrorAction + } from './notifications-broker-source.actions'; + import { notificationsBrokerSourceReducer, NotificationsBrokerSourceState } from './notifications-broker-source.reducer'; + import { + notificationsBrokerSourceObjectMoreAbstract, + notificationsBrokerSourceObjectMorePid + } from '../../../shared/mocks/notifications.mock'; + + describe('notificationsBrokerSourceReducer test suite', () => { + let notificationsBrokerSourceInitialState: NotificationsBrokerSourceState; + const elementPerPage = 3; + const currentPage = 0; + + beforeEach(() => { + notificationsBrokerSourceInitialState = { + source: [], + processing: false, + loaded: false, + totalPages: 0, + currentPage: 0, + totalElements: 0 + }; + }); + + it('Action RETRIEVE_ALL_SOURCE should set the State property "processing" to TRUE', () => { + const expectedState = notificationsBrokerSourceInitialState; + expectedState.processing = true; + + const action = new RetrieveAllSourceAction(elementPerPage, currentPage); + const newState = notificationsBrokerSourceReducer(notificationsBrokerSourceInitialState, action); + + expect(newState).toEqual(expectedState); + }); + + it('Action RETRIEVE_ALL_SOURCE_ERROR should change the State to initial State but processing, loaded, and currentPage', () => { + const expectedState = notificationsBrokerSourceInitialState; + expectedState.processing = false; + expectedState.loaded = true; + expectedState.currentPage = 0; + + const action = new RetrieveAllSourceErrorAction(); + const newState = notificationsBrokerSourceReducer(notificationsBrokerSourceInitialState, action); + + expect(newState).toEqual(expectedState); + }); + + it('Action ADD_SOURCE should populate the State with Notifications Broker source', () => { + const expectedState = { + source: [ notificationsBrokerSourceObjectMorePid, notificationsBrokerSourceObjectMoreAbstract ], + processing: false, + loaded: true, + totalPages: 1, + currentPage: 0, + totalElements: 2 + }; + + const action = new AddSourceAction( + [ notificationsBrokerSourceObjectMorePid, notificationsBrokerSourceObjectMoreAbstract ], + 1, 0, 2 + ); + const newState = notificationsBrokerSourceReducer(notificationsBrokerSourceInitialState, action); + + expect(newState).toEqual(expectedState); + }); + }); diff --git a/src/app/notifications/broker/source/notifications-broker-source.service.spec.ts b/src/app/notifications/broker/source/notifications-broker-source.service.spec.ts new file mode 100644 index 0000000000..e94804cbf6 --- /dev/null +++ b/src/app/notifications/broker/source/notifications-broker-source.service.spec.ts @@ -0,0 +1,68 @@ +import { TestBed } from '@angular/core/testing'; +import { of as observableOf } from 'rxjs'; +import { NotificationsBrokerSourceService } from './notifications-broker-source.service'; +import { SortDirection, SortOptions } from '../../../core/cache/models/sort-options.model'; +import { PageInfo } from '../../../core/shared/page-info.model'; +import { FindListOptions } from '../../../core/data/request.models'; +import { + getMockNotificationsBrokerSourceRestService, + notificationsBrokerSourceObjectMoreAbstract, + notificationsBrokerSourceObjectMorePid +} from '../../../shared/mocks/notifications.mock'; +import { createSuccessfulRemoteDataObject } from '../../../shared/remote-data.utils'; +import { cold } from 'jasmine-marbles'; +import { buildPaginatedList } from '../../../core/data/paginated-list.model'; +import { NotificationsBrokerSourceRestService } from '../../../core/notifications/broker/source/notifications-broker-source-rest.service'; +import { RequestParam } from '../../../core/cache/models/request-param.model'; + +describe('NotificationsBrokerSourceService', () => { + let service: NotificationsBrokerSourceService; + let restService: NotificationsBrokerSourceRestService; + let serviceAsAny: any; + let restServiceAsAny: any; + + const pageInfo = new PageInfo(); + const array = [ notificationsBrokerSourceObjectMorePid, notificationsBrokerSourceObjectMoreAbstract ]; + const paginatedList = buildPaginatedList(pageInfo, array); + const paginatedListRD = createSuccessfulRemoteDataObject(paginatedList); + const elementsPerPage = 3; + const currentPage = 0; + + beforeEach(async () => { + TestBed.configureTestingModule({ + providers: [ + { provide: NotificationsBrokerSourceRestService, useClass: getMockNotificationsBrokerSourceRestService }, + { provide: NotificationsBrokerSourceService, useValue: service } + ] + }).compileComponents(); + }); + + beforeEach(() => { + restService = TestBed.get(NotificationsBrokerSourceRestService); + restServiceAsAny = restService; + restServiceAsAny.getSources.and.returnValue(observableOf(paginatedListRD)); + service = new NotificationsBrokerSourceService(restService); + serviceAsAny = service; + }); + + describe('getSources', () => { + it('Should proxy the call to notificationsBrokerSourceRestService.getSources', () => { + const sortOptions = new SortOptions('name', SortDirection.ASC); + const findListOptions: FindListOptions = { + elementsPerPage: elementsPerPage, + currentPage: currentPage, + sort: sortOptions + }; + const result = service.getSources(elementsPerPage, currentPage); + expect((service as any).notificationsBrokerSourceRestService.getSources).toHaveBeenCalledWith(findListOptions); + }); + + it('Should return a paginated list of Notifications Broker Source', () => { + const expected = cold('(a|)', { + a: paginatedList + }); + const result = service.getSources(elementsPerPage, currentPage); + expect(result).toBeObservable(expected); + }); + }); +}); diff --git a/src/app/notifications/broker/topics/notifications-broker-topics.component.spec.ts b/src/app/notifications/broker/topics/notifications-broker-topics.component.spec.ts index 5bbe3b2907..dbb8137321 100644 --- a/src/app/notifications/broker/topics/notifications-broker-topics.component.spec.ts +++ b/src/app/notifications/broker/topics/notifications-broker-topics.component.spec.ts @@ -1,8 +1,8 @@ import { CommonModule } from '@angular/common'; import { Component, NO_ERRORS_SCHEMA } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; +import { ActivatedRoute, Router } from '@angular/router'; import { TranslateModule } from '@ngx-translate/core'; -import { of as observableOf } from 'rxjs'; +import { of as observableOf, of } from 'rxjs'; import { ComponentFixture, inject, TestBed, waitForAsync } from '@angular/core/testing'; import { createTestComponent } from '../../../shared/testing/utils.test'; import { @@ -15,6 +15,7 @@ import { NotificationsStateService } from '../../notifications-state.service'; import { cold } from 'jasmine-marbles'; import { PaginationServiceStub } from '../../../shared/testing/pagination-service.stub'; import { PaginationService } from '../../../core/pagination/pagination.service'; +import { NotificationsBrokerTopicsService } from './notifications-broker-topics.service'; describe('NotificationsBrokerTopicsComponent test suite', () => { let fixture: ComponentFixture; @@ -41,9 +42,15 @@ describe('NotificationsBrokerTopicsComponent test suite', () => { ], providers: [ { provide: NotificationsStateService, useValue: mockNotificationsStateService }, - { provide: ActivatedRoute, useValue: { data: observableOf(activatedRouteParams), params: observableOf({}) } }, + { provide: ActivatedRoute, useValue: { data: observableOf(activatedRouteParams), snapshot: { + paramMap: { + get: () => 'openaire', + }, + }}}, { provide: PaginationService, useValue: paginationService }, - NotificationsBrokerTopicsComponent + NotificationsBrokerTopicsComponent, + // tslint:disable-next-line: no-empty + { provide: NotificationsBrokerTopicsService, useValue: { setSourceId: (sourceId: string) => { } }} ], schemas: [NO_ERRORS_SCHEMA] }).compileComponents().then(() => { diff --git a/src/app/notifications/broker/topics/notifications-broker-topics.component.ts b/src/app/notifications/broker/topics/notifications-broker-topics.component.ts index f33d3c2fb1..a740ca5c1e 100644 --- a/src/app/notifications/broker/topics/notifications-broker-topics.component.ts +++ b/src/app/notifications/broker/topics/notifications-broker-topics.component.ts @@ -67,19 +67,14 @@ export class NotificationsBrokerTopicsComponent implements OnInit { private notificationsStateService: NotificationsStateService, private notificationsBrokerTopicsService: NotificationsBrokerTopicsService ) { - this.activatedRoute.paramMap.pipe( - map((params) => params.get('sourceId')), - take(1) - ).subscribe((id: string) => { - this.sourceId = id; - this.notificationsBrokerTopicsService.setSourceId(this.sourceId); - }); } /** * Component initialization. */ ngOnInit(): void { + this.sourceId = this.activatedRoute.snapshot.paramMap.get('sourceId'); + this.notificationsBrokerTopicsService.setSourceId(this.sourceId); this.topics$ = this.notificationsStateService.getNotificationsBrokerTopics(); this.totalElements$ = this.notificationsStateService.getNotificationsBrokerTopicsTotals(); } diff --git a/src/app/notifications/broker/topics/notifications-broker-topics.service.spec.ts b/src/app/notifications/broker/topics/notifications-broker-topics.service.spec.ts index 3b780fc173..e5616df320 100644 --- a/src/app/notifications/broker/topics/notifications-broker-topics.service.spec.ts +++ b/src/app/notifications/broker/topics/notifications-broker-topics.service.spec.ts @@ -13,6 +13,7 @@ import { import { createSuccessfulRemoteDataObject } from '../../../shared/remote-data.utils'; import { cold } from 'jasmine-marbles'; import { buildPaginatedList } from '../../../core/data/paginated-list.model'; +import { RequestParam } from '../../../core/cache/models/request-param.model'; describe('NotificationsBrokerTopicsService', () => { let service: NotificationsBrokerTopicsService; @@ -50,8 +51,10 @@ describe('NotificationsBrokerTopicsService', () => { const findListOptions: FindListOptions = { elementsPerPage: elementsPerPage, currentPage: currentPage, - sort: sortOptions + sort: sortOptions, + searchParams: [new RequestParam('source', 'ENRICH!MORE!ABSTRACT')] }; + service.setSourceId('ENRICH!MORE!ABSTRACT'); const result = service.getTopics(elementsPerPage, currentPage); expect((service as any).notificationsBrokerTopicRestService.getTopics).toHaveBeenCalledWith(findListOptions); }); diff --git a/src/app/notifications/notifications-state.service.spec.ts b/src/app/notifications/notifications-state.service.spec.ts index 97d958e243..91048a93ef 100644 --- a/src/app/notifications/notifications-state.service.spec.ts +++ b/src/app/notifications/notifications-state.service.spec.ts @@ -5,11 +5,15 @@ import { cold } from 'jasmine-marbles'; import { notificationsReducers } from './notifications.reducer'; import { NotificationsStateService } from './notifications-state.service'; import { + notificationsBrokerSourceObjectMissingPid, + notificationsBrokerSourceObjectMoreAbstract, + notificationsBrokerSourceObjectMorePid, notificationsBrokerTopicObjectMissingPid, notificationsBrokerTopicObjectMoreAbstract, notificationsBrokerTopicObjectMorePid } from '../shared/mocks/notifications.mock'; import { RetrieveAllTopicsAction } from './broker/topics/notifications-broker-topics.actions'; +import { RetrieveAllSourceAction } from './broker/source/notifications-broker-source.actions'; describe('NotificationsStateService', () => { let service: NotificationsStateService; @@ -17,259 +21,521 @@ describe('NotificationsStateService', () => { let store: any; let initialState: any; - function init(mode: string) { - if (mode === 'empty') { - initialState = { - notifications: { - brokerTopic: { - topics: [], - processing: false, - loaded: false, - totalPages: 0, - currentPage: 0, - totalElements: 0, - totalLoadedPages: 0 + describe('Topis State', () => { + function init(mode: string) { + if (mode === 'empty') { + initialState = { + notifications: { + brokerTopic: { + topics: [], + processing: false, + loaded: false, + totalPages: 0, + currentPage: 0, + totalElements: 0, + totalLoadedPages: 0 + } } - } - }; - } else { - initialState = { - notifications: { - brokerTopic: { - topics: [ + }; + } else { + initialState = { + notifications: { + brokerTopic: { + topics: [ + notificationsBrokerTopicObjectMorePid, + notificationsBrokerTopicObjectMoreAbstract, + notificationsBrokerTopicObjectMissingPid + ], + processing: false, + loaded: true, + totalPages: 1, + currentPage: 1, + totalElements: 3, + totalLoadedPages: 1 + } + } + }; + } + } + + describe('Testing methods with empty topic objects', () => { + beforeEach(async () => { + init('empty'); + TestBed.configureTestingModule({ + imports: [ + StoreModule.forRoot({ notifications: notificationsReducers } as any), + ], + providers: [ + provideMockStore({ initialState }), + { provide: NotificationsStateService, useValue: service } + ] + }).compileComponents(); + }); + + beforeEach(() => { + store = TestBed.get(Store); + service = new NotificationsStateService(store); + serviceAsAny = service; + spyOn(store, 'dispatch'); + }); + + describe('getNotificationsBrokerTopics', () => { + it('Should return an empty array', () => { + const result = service.getNotificationsBrokerTopics(); + const expected = cold('(a)', { + a: [] + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('getNotificationsBrokerTopicsTotalPages', () => { + it('Should return zero (0)', () => { + const result = service.getNotificationsBrokerTopicsTotalPages(); + const expected = cold('(a)', { + a: 0 + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('getNotificationsBrokerTopicsCurrentPage', () => { + it('Should return minus one (0)', () => { + const result = service.getNotificationsBrokerTopicsCurrentPage(); + const expected = cold('(a)', { + a: 0 + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('getNotificationsBrokerTopicsTotals', () => { + it('Should return zero (0)', () => { + const result = service.getNotificationsBrokerTopicsTotals(); + const expected = cold('(a)', { + a: 0 + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('isNotificationsBrokerTopicsLoading', () => { + it('Should return TRUE', () => { + const result = service.isNotificationsBrokerTopicsLoading(); + const expected = cold('(a)', { + a: true + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('isNotificationsBrokerTopicsLoaded', () => { + it('Should return FALSE', () => { + const result = service.isNotificationsBrokerTopicsLoaded(); + const expected = cold('(a)', { + a: false + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('isNotificationsBrokerTopicsProcessing', () => { + it('Should return FALSE', () => { + const result = service.isNotificationsBrokerTopicsProcessing(); + const expected = cold('(a)', { + a: false + }); + expect(result).toBeObservable(expected); + }); + }); + }); + + describe('Testing methods with topic objects', () => { + beforeEach(async () => { + init('full'); + TestBed.configureTestingModule({ + imports: [ + StoreModule.forRoot({ notifications: notificationsReducers } as any), + ], + providers: [ + provideMockStore({ initialState }), + { provide: NotificationsStateService, useValue: service } + ] + }).compileComponents(); + }); + + beforeEach(() => { + store = TestBed.get(Store); + service = new NotificationsStateService(store); + serviceAsAny = service; + spyOn(store, 'dispatch'); + }); + + describe('getNotificationsBrokerTopics', () => { + it('Should return an array of topics', () => { + const result = service.getNotificationsBrokerTopics(); + const expected = cold('(a)', { + a: [ notificationsBrokerTopicObjectMorePid, notificationsBrokerTopicObjectMoreAbstract, notificationsBrokerTopicObjectMissingPid - ], - processing: false, - loaded: true, - totalPages: 1, - currentPage: 1, - totalElements: 3, - totalLoadedPages: 1 - } - } - }; - } - } - - describe('Testing methods with empty topic objects', () => { - beforeEach(async () => { - init('empty'); - TestBed.configureTestingModule({ - imports: [ - StoreModule.forRoot({ notifications: notificationsReducers } as any), - ], - providers: [ - provideMockStore({ initialState }), - { provide: NotificationsStateService, useValue: service } - ] - }).compileComponents(); - }); - - beforeEach(() => { - store = TestBed.get(Store); - service = new NotificationsStateService(store); - serviceAsAny = service; - spyOn(store, 'dispatch'); - }); - - describe('getNotificationsBrokerTopics', () => { - it('Should return an empty array', () => { - const result = service.getNotificationsBrokerTopics(); - const expected = cold('(a)', { - a: [] + ] + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('getNotificationsBrokerTopicsTotalPages', () => { + it('Should return one (1)', () => { + const result = service.getNotificationsBrokerTopicsTotalPages(); + const expected = cold('(a)', { + a: 1 + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('getNotificationsBrokerTopicsCurrentPage', () => { + it('Should return minus zero (1)', () => { + const result = service.getNotificationsBrokerTopicsCurrentPage(); + const expected = cold('(a)', { + a: 1 + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('getNotificationsBrokerTopicsTotals', () => { + it('Should return three (3)', () => { + const result = service.getNotificationsBrokerTopicsTotals(); + const expected = cold('(a)', { + a: 3 + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('isNotificationsBrokerTopicsLoading', () => { + it('Should return FALSE', () => { + const result = service.isNotificationsBrokerTopicsLoading(); + const expected = cold('(a)', { + a: false + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('isNotificationsBrokerTopicsLoaded', () => { + it('Should return TRUE', () => { + const result = service.isNotificationsBrokerTopicsLoaded(); + const expected = cold('(a)', { + a: true + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('isNotificationsBrokerTopicsProcessing', () => { + it('Should return FALSE', () => { + const result = service.isNotificationsBrokerTopicsProcessing(); + const expected = cold('(a)', { + a: false + }); + expect(result).toBeObservable(expected); }); - expect(result).toBeObservable(expected); }); }); - describe('getNotificationsBrokerTopicsTotalPages', () => { - it('Should return zero (0)', () => { - const result = service.getNotificationsBrokerTopicsTotalPages(); - const expected = cold('(a)', { - a: 0 - }); - expect(result).toBeObservable(expected); - }); - }); - - describe('getNotificationsBrokerTopicsCurrentPage', () => { - it('Should return minus one (0)', () => { - const result = service.getNotificationsBrokerTopicsCurrentPage(); - const expected = cold('(a)', { - a: 0 - }); - expect(result).toBeObservable(expected); - }); - }); - - describe('getNotificationsBrokerTopicsTotals', () => { - it('Should return zero (0)', () => { - const result = service.getNotificationsBrokerTopicsTotals(); - const expected = cold('(a)', { - a: 0 - }); - expect(result).toBeObservable(expected); - }); - }); - - describe('isNotificationsBrokerTopicsLoading', () => { - it('Should return TRUE', () => { - const result = service.isNotificationsBrokerTopicsLoading(); - const expected = cold('(a)', { - a: true - }); - expect(result).toBeObservable(expected); - }); - }); - - describe('isNotificationsBrokerTopicsLoaded', () => { - it('Should return FALSE', () => { - const result = service.isNotificationsBrokerTopicsLoaded(); - const expected = cold('(a)', { - a: false - }); - expect(result).toBeObservable(expected); - }); - }); - - describe('isNotificationsBrokerTopicsProcessing', () => { - it('Should return FALSE', () => { - const result = service.isNotificationsBrokerTopicsProcessing(); - const expected = cold('(a)', { - a: false - }); - expect(result).toBeObservable(expected); - }); - }); - }); - - describe('Testing methods with topic objects', () => { - beforeEach(async () => { - init('full'); - TestBed.configureTestingModule({ - imports: [ - StoreModule.forRoot({ notifications: notificationsReducers } as any), - ], - providers: [ - provideMockStore({ initialState }), - { provide: NotificationsStateService, useValue: service } - ] - }).compileComponents(); - }); - - beforeEach(() => { - store = TestBed.get(Store); - service = new NotificationsStateService(store); - serviceAsAny = service; - spyOn(store, 'dispatch'); - }); - - describe('getNotificationsBrokerTopics', () => { - it('Should return an array of topics', () => { - const result = service.getNotificationsBrokerTopics(); - const expected = cold('(a)', { - a: [ - notificationsBrokerTopicObjectMorePid, - notificationsBrokerTopicObjectMoreAbstract, - notificationsBrokerTopicObjectMissingPid + describe('Testing the topic dispatch methods', () => { + beforeEach(async () => { + init('full'); + TestBed.configureTestingModule({ + imports: [ + StoreModule.forRoot({ notifications: notificationsReducers } as any), + ], + providers: [ + provideMockStore({ initialState }), + { provide: NotificationsStateService, useValue: service } ] - }); - expect(result).toBeObservable(expected); + }).compileComponents(); }); - }); - describe('getNotificationsBrokerTopicsTotalPages', () => { - it('Should return one (1)', () => { - const result = service.getNotificationsBrokerTopicsTotalPages(); - const expected = cold('(a)', { - a: 1 - }); - expect(result).toBeObservable(expected); + beforeEach(() => { + store = TestBed.get(Store); + service = new NotificationsStateService(store); + serviceAsAny = service; + spyOn(store, 'dispatch'); }); - }); - describe('getNotificationsBrokerTopicsCurrentPage', () => { - it('Should return minus zero (1)', () => { - const result = service.getNotificationsBrokerTopicsCurrentPage(); - const expected = cold('(a)', { - a: 1 + describe('dispatchRetrieveNotificationsBrokerTopics', () => { + it('Should call store.dispatch', () => { + const elementsPerPage = 3; + const currentPage = 1; + const action = new RetrieveAllTopicsAction(elementsPerPage, currentPage); + service.dispatchRetrieveNotificationsBrokerTopics(elementsPerPage, currentPage); + expect(serviceAsAny.store.dispatch).toHaveBeenCalledWith(action); }); - expect(result).toBeObservable(expected); - }); - }); - - describe('getNotificationsBrokerTopicsTotals', () => { - it('Should return three (3)', () => { - const result = service.getNotificationsBrokerTopicsTotals(); - const expected = cold('(a)', { - a: 3 - }); - expect(result).toBeObservable(expected); - }); - }); - - describe('isNotificationsBrokerTopicsLoading', () => { - it('Should return FALSE', () => { - const result = service.isNotificationsBrokerTopicsLoading(); - const expected = cold('(a)', { - a: false - }); - expect(result).toBeObservable(expected); - }); - }); - - describe('isNotificationsBrokerTopicsLoaded', () => { - it('Should return TRUE', () => { - const result = service.isNotificationsBrokerTopicsLoaded(); - const expected = cold('(a)', { - a: true - }); - expect(result).toBeObservable(expected); - }); - }); - - describe('isNotificationsBrokerTopicsProcessing', () => { - it('Should return FALSE', () => { - const result = service.isNotificationsBrokerTopicsProcessing(); - const expected = cold('(a)', { - a: false - }); - expect(result).toBeObservable(expected); }); }); }); - describe('Testing the topic dispatch methods', () => { - beforeEach(async () => { - init('full'); - TestBed.configureTestingModule({ - imports: [ - StoreModule.forRoot({ notifications: notificationsReducers } as any), - ], - providers: [ - provideMockStore({ initialState }), - { provide: NotificationsStateService, useValue: service } - ] - }).compileComponents(); - }); + describe('Source State', () => { + function init(mode: string) { + if (mode === 'empty') { + initialState = { + notifications: { + brokerSource: { + source: [], + processing: false, + loaded: false, + totalPages: 0, + currentPage: 0, + totalElements: 0, + totalLoadedPages: 0 + } + } + }; + } else { + initialState = { + notifications: { + brokerSource: { + source: [ + notificationsBrokerSourceObjectMorePid, + notificationsBrokerSourceObjectMoreAbstract, + notificationsBrokerSourceObjectMissingPid + ], + processing: false, + loaded: true, + totalPages: 1, + currentPage: 1, + totalElements: 3, + totalLoadedPages: 1 + } + } + }; + } + } - beforeEach(() => { - store = TestBed.get(Store); - service = new NotificationsStateService(store); - serviceAsAny = service; - spyOn(store, 'dispatch'); - }); + describe('Testing methods with empty source objects', () => { + beforeEach(async () => { + init('empty'); + TestBed.configureTestingModule({ + imports: [ + StoreModule.forRoot({ notifications: notificationsReducers } as any), + ], + providers: [ + provideMockStore({ initialState }), + { provide: NotificationsStateService, useValue: service } + ] + }).compileComponents(); + }); - describe('dispatchRetrieveNotificationsBrokerTopics', () => { - it('Should call store.dispatch', () => { - const elementsPerPage = 3; - const currentPage = 1; - const action = new RetrieveAllTopicsAction(elementsPerPage, currentPage); - service.dispatchRetrieveNotificationsBrokerTopics(elementsPerPage, currentPage); - expect(serviceAsAny.store.dispatch).toHaveBeenCalledWith(action); + beforeEach(() => { + store = TestBed.get(Store); + service = new NotificationsStateService(store); + serviceAsAny = service; + spyOn(store, 'dispatch'); + }); + + describe('getNotificationsBrokerSource', () => { + it('Should return an empty array', () => { + const result = service.getNotificationsBrokerSource(); + const expected = cold('(a)', { + a: [] + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('getNotificationsBrokerSourceTotalPages', () => { + it('Should return zero (0)', () => { + const result = service.getNotificationsBrokerSourceTotalPages(); + const expected = cold('(a)', { + a: 0 + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('getNotificationsBrokerSourcesCurrentPage', () => { + it('Should return minus one (0)', () => { + const result = service.getNotificationsBrokerSourceCurrentPage(); + const expected = cold('(a)', { + a: 0 + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('getNotificationsBrokerSourceTotals', () => { + it('Should return zero (0)', () => { + const result = service.getNotificationsBrokerSourceTotals(); + const expected = cold('(a)', { + a: 0 + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('isNotificationsBrokerSourceLoading', () => { + it('Should return TRUE', () => { + const result = service.isNotificationsBrokerSourceLoading(); + const expected = cold('(a)', { + a: true + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('isNotificationsBrokerSourceLoaded', () => { + it('Should return FALSE', () => { + const result = service.isNotificationsBrokerSourceLoaded(); + const expected = cold('(a)', { + a: false + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('isNotificationsBrokerSourceProcessing', () => { + it('Should return FALSE', () => { + const result = service.isNotificationsBrokerSourceProcessing(); + const expected = cold('(a)', { + a: false + }); + expect(result).toBeObservable(expected); + }); }); }); - }); + + describe('Testing methods with Source objects', () => { + beforeEach(async () => { + init('full'); + TestBed.configureTestingModule({ + imports: [ + StoreModule.forRoot({ notifications: notificationsReducers } as any), + ], + providers: [ + provideMockStore({ initialState }), + { provide: NotificationsStateService, useValue: service } + ] + }).compileComponents(); + }); + + beforeEach(() => { + store = TestBed.get(Store); + service = new NotificationsStateService(store); + serviceAsAny = service; + spyOn(store, 'dispatch'); + }); + + describe('getNotificationsBrokerSource', () => { + it('Should return an array of Source', () => { + const result = service.getNotificationsBrokerSource(); + const expected = cold('(a)', { + a: [ + notificationsBrokerSourceObjectMorePid, + notificationsBrokerSourceObjectMoreAbstract, + notificationsBrokerSourceObjectMissingPid + ] + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('getNotificationsBrokerSourceTotalPages', () => { + it('Should return one (1)', () => { + const result = service.getNotificationsBrokerSourceTotalPages(); + const expected = cold('(a)', { + a: 1 + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('getNotificationsBrokerSourceCurrentPage', () => { + it('Should return minus zero (1)', () => { + const result = service.getNotificationsBrokerSourceCurrentPage(); + const expected = cold('(a)', { + a: 1 + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('getNotificationsBrokerSourceTotals', () => { + it('Should return three (3)', () => { + const result = service.getNotificationsBrokerSourceTotals(); + const expected = cold('(a)', { + a: 3 + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('isNotificationsBrokerSourceLoading', () => { + it('Should return FALSE', () => { + const result = service.isNotificationsBrokerSourceLoading(); + const expected = cold('(a)', { + a: false + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('isNotificationsBrokerSourceLoaded', () => { + it('Should return TRUE', () => { + const result = service.isNotificationsBrokerSourceLoaded(); + const expected = cold('(a)', { + a: true + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('isNotificationsBrokerSourceProcessing', () => { + it('Should return FALSE', () => { + const result = service.isNotificationsBrokerSourceProcessing(); + const expected = cold('(a)', { + a: false + }); + expect(result).toBeObservable(expected); + }); + }); + }); + + describe('Testing the Source dispatch methods', () => { + beforeEach(async () => { + init('full'); + TestBed.configureTestingModule({ + imports: [ + StoreModule.forRoot({ notifications: notificationsReducers } as any), + ], + providers: [ + provideMockStore({ initialState }), + { provide: NotificationsStateService, useValue: service } + ] + }).compileComponents(); + }); + + beforeEach(() => { + store = TestBed.get(Store); + service = new NotificationsStateService(store); + serviceAsAny = service; + spyOn(store, 'dispatch'); + }); + + describe('dispatchRetrieveNotificationsBrokerSource', () => { + it('Should call store.dispatch', () => { + const elementsPerPage = 3; + const currentPage = 1; + const action = new RetrieveAllSourceAction(elementsPerPage, currentPage); + service.dispatchRetrieveNotificationsBrokerSource(elementsPerPage, currentPage); + expect(serviceAsAny.store.dispatch).toHaveBeenCalledWith(action); + }); + }); + }); + }); + + }); diff --git a/src/app/shared/mocks/notifications.mock.ts b/src/app/shared/mocks/notifications.mock.ts index 2e9303c3a3..8af034ea32 100644 --- a/src/app/shared/mocks/notifications.mock.ts +++ b/src/app/shared/mocks/notifications.mock.ts @@ -13,6 +13,7 @@ import { createSuccessfulRemoteDataObject$ } from '../remote-data.utils'; import { SearchResult } from '../search/models/search-result.model'; +import { NotificationsBrokerSourceObject } from '../../core/notifications/broker/models/notifications-broker-source.model'; // REST Mock --------------------------------------------------------------------- // ------------------------------------------------------------------------------- @@ -1329,6 +1330,45 @@ export const NotificationsMockDspaceObject: SearchResult = Object. } ); +// Sources +// ------------------------------------------------------------------------------- + +export const notificationsBrokerSourceObjectMorePid: NotificationsBrokerSourceObject = { + type: new ResourceType('nbsource'), + id: 'ENRICH!MORE!PID', + lastEvent: '2020/10/09 10:11 UTC', + totalEvents: 33, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbsources/ENRICH!MORE!PID' + } + } +}; + +export const notificationsBrokerSourceObjectMoreAbstract: NotificationsBrokerSourceObject = { + type: new ResourceType('nbsource'), + id: 'ENRICH!MORE!ABSTRACT', + lastEvent: '2020/09/08 21:14 UTC', + totalEvents: 5, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbsources/ENRICH!MORE!ABSTRACT' + } + } +}; + +export const notificationsBrokerSourceObjectMissingPid: NotificationsBrokerSourceObject = { + type: new ResourceType('nbsource'), + id: 'ENRICH!MISSING!PID', + lastEvent: '2020/10/01 07:36 UTC', + totalEvents: 4, + _links: { + self: { + href: 'https://rest.api/rest/api/integration/nbsources/ENRICH!MISSING!PID' + } + } +}; + // Topics // ------------------------------------------------------------------------------- @@ -1753,10 +1793,28 @@ export function getMockNotificationsStateService(): any { getNotificationsBrokerTopicsCurrentPage: jasmine.createSpy('getNotificationsBrokerTopicsCurrentPage'), getNotificationsBrokerTopicsTotals: jasmine.createSpy('getNotificationsBrokerTopicsTotals'), dispatchRetrieveNotificationsBrokerTopics: jasmine.createSpy('dispatchRetrieveNotificationsBrokerTopics'), + getNotificationsBrokerSource: jasmine.createSpy('getNotificationsBrokerSource'), + isNotificationsBrokerSourceLoading: jasmine.createSpy('isNotificationsBrokerSourceLoading'), + isNotificationsBrokerSourceLoaded: jasmine.createSpy('isNotificationsBrokerSourceLoaded'), + isNotificationsBrokerSourceProcessing: jasmine.createSpy('isNotificationsBrokerSourceProcessing'), + getNotificationsBrokerSourceTotalPages: jasmine.createSpy('getNotificationsBrokerSourceTotalPages'), + getNotificationsBrokerSourceCurrentPage: jasmine.createSpy('getNotificationsBrokerSourceCurrentPage'), + getNotificationsBrokerSourceTotals: jasmine.createSpy('getNotificationsBrokerSourceTotals'), + dispatchRetrieveNotificationsBrokerSource: jasmine.createSpy('dispatchRetrieveNotificationsBrokerSource'), dispatchMarkUserSuggestionsAsVisitedAction: jasmine.createSpy('dispatchMarkUserSuggestionsAsVisitedAction') }); } +/** + * Mock for [[NotificationsBrokerSourceRestService]] + */ + export function getMockNotificationsBrokerSourceRestService(): NotificationsBrokerTopicRestService { + return jasmine.createSpyObj('NotificationsBrokerSourceRestService', { + getSources: jasmine.createSpy('getSources'), + getSource: jasmine.createSpy('getSource'), + }); +} + /** * Mock for [[NotificationsBrokerTopicRestService]] */ From d63bf55458bd9cab6a417107c14325b3add16b85 Mon Sep 17 00:00:00 2001 From: Pratik Rajkotiya Date: Thu, 10 Mar 2022 11:56:39 +0530 Subject: [PATCH 007/343] [CST-5337] change end point. --- config/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/config.yml b/config/config.yml index 3866797f5d..b5eecd112f 100644 --- a/config/config.yml +++ b/config/config.yml @@ -1,5 +1,5 @@ rest: - ssl: false - host: localhost:8080 + ssl: true + host: api7.dspace.org port: 443 nameSpace: /server From 2ffb72320221b923d0064fec6fc47a04d34606ac Mon Sep 17 00:00:00 2001 From: Sufiyan Shaikh Date: Thu, 10 Mar 2022 13:04:22 +0530 Subject: [PATCH 008/343] [CST-5329] Add validate only check in the Import > Metadata page --- .../metadata-import-page.component.html | 4 +++ .../metadata-import-page.component.spec.ts | 25 ++++++++++++++++++- .../metadata-import-page.component.ts | 8 ++++++ src/assets/i18n/en.json5 | 2 ++ 4 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/app/admin/admin-import-metadata-page/metadata-import-page.component.html b/src/app/admin/admin-import-metadata-page/metadata-import-page.component.html index 42a04b0de6..c70bc45947 100644 --- a/src/app/admin/admin-import-metadata-page/metadata-import-page.component.html +++ b/src/app/admin/admin-import-metadata-page/metadata-import-page.component.html @@ -1,6 +1,10 @@

{{'admin.metadata-import.page.help' | translate}}

+

+ + {{'admin.metadata-import.page.validateOnly' | translate}} +

{ comp.setFile(fileMock); }); - describe('if proceed button is pressed', () => { + describe('if proceed button is pressed without validate only', () => { beforeEach(fakeAsync(() => { + comp.validateOnly = false; const proceed = fixture.debugElement.query(By.css('#proceedButton')).nativeElement; proceed.click(); fixture.detectChanges(); @@ -107,6 +108,28 @@ describe('MetadataImportPageComponent', () => { }); }); + describe('if proceed button is pressed with validate only', () => { + beforeEach(fakeAsync(() => { + comp.validateOnly = true; + const proceed = fixture.debugElement.query(By.css('#proceedButton')).nativeElement; + proceed.click(); + fixture.detectChanges(); + })); + it('metadata-import script is invoked with -f fileName and the mockFile and -v validate-only', () => { + const parameterValues: ProcessParameter[] = [ + Object.assign(new ProcessParameter(), { name: '-f', value: 'filename.txt' }), + Object.assign(new ProcessParameter(), { name: '-v', value: true }), + ]; + expect(scriptService.invoke).toHaveBeenCalledWith(METADATA_IMPORT_SCRIPT_NAME, parameterValues, [fileMock]); + }); + it('success notification is shown', () => { + expect(notificationService.success).toHaveBeenCalled(); + }); + it('redirected to process page', () => { + expect(router.navigateByUrl).toHaveBeenCalledWith('/processes/45'); + }); + }); + describe('if proceed is pressed; but script invoke fails', () => { beforeEach(fakeAsync(() => { jasmine.getEnv().allowRespy(true); diff --git a/src/app/admin/admin-import-metadata-page/metadata-import-page.component.ts b/src/app/admin/admin-import-metadata-page/metadata-import-page.component.ts index 3bdcca3084..deb16c0d73 100644 --- a/src/app/admin/admin-import-metadata-page/metadata-import-page.component.ts +++ b/src/app/admin/admin-import-metadata-page/metadata-import-page.component.ts @@ -30,6 +30,11 @@ export class MetadataImportPageComponent { */ fileObject: File; + /** + * The validate only flag + */ + validateOnly = true; + public constructor(private location: Location, protected translate: TranslateService, protected notificationsService: NotificationsService, @@ -62,6 +67,9 @@ export class MetadataImportPageComponent { const parameterValues: ProcessParameter[] = [ Object.assign(new ProcessParameter(), { name: '-f', value: this.fileObject.name }), ]; + if (this.validateOnly) { + parameterValues.push(Object.assign(new ProcessParameter(), { name: '-v', value: true })); + } this.scriptDataService.invoke(METADATA_IMPORT_SCRIPT_NAME, parameterValues, [this.fileObject]).pipe( getFirstCompletedRemoteData(), diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index f33a195cfe..426fcb12d2 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -538,6 +538,8 @@ "admin.metadata-import.page.error.addFile": "Select file first!", + "admin.metadata-import.page.validateOnly": "Validate Only", + From 027b281d7a61031370a62f1388d23b8369410808 Mon Sep 17 00:00:00 2001 From: Sufiyan Shaikh Date: Thu, 10 Mar 2022 14:45:53 +0530 Subject: [PATCH 009/343] [CST-5329] Add validate only check in the Import > Metadata page --- .../metadata-import-page.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/admin/admin-import-metadata-page/metadata-import-page.component.html b/src/app/admin/admin-import-metadata-page/metadata-import-page.component.html index c70bc45947..fb96c4becd 100644 --- a/src/app/admin/admin-import-metadata-page/metadata-import-page.component.html +++ b/src/app/admin/admin-import-metadata-page/metadata-import-page.component.html @@ -3,7 +3,7 @@

{{'admin.metadata-import.page.help' | translate}}

- {{'admin.metadata-import.page.validateOnly' | translate}} + {{'admin.metadata-import.page.validateOnly' | translate}}

Date: Thu, 17 Mar 2022 16:53:59 +0100 Subject: [PATCH 010/343] [CST-5337] Fixed notifications labels --- src/assets/i18n/en.json5 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 72d22fb502..873fad622c 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -2716,11 +2716,11 @@ "none.listelement.badge": "Item", - "notifications.broker.title": "Broker Title", + "notifications.broker.title": "Notifications", "notifications.broker.topics.description": "Below you can see all the topics received from the subscriptions to {{source}}.", - "notifications.broker.source.description": "Below you can see all the sources.", + "notifications.broker.source.description": "Below you can see all the notification's sources.", "notifications.broker.topics": "Current Topics", @@ -2740,13 +2740,13 @@ "notifications.broker.noSource": "No sources found.", - "notifications.events.title": "{{source}} Broker Suggestions", + "notifications.events.title": "Broker Suggestions", "notifications.broker.topic.error.service.retrieve": "An error occurred while loading the Notifications Broker topics", "notifications.broker.source.error.service.retrieve": "An error occurred while loading the Notifications Broker source", - "notifications.broker.events.description": "Below the list of all the suggestions, received from {{source}}, for the selected topic.", + "notifications.broker.events.description": "Below the list of all the suggestions for the selected topic.", "notifications.broker.loading": "Loading ...", From 55431f1e06fb325e477bf98ae226461d5393d9b0 Mon Sep 17 00:00:00 2001 From: Yana De Pauw Date: Fri, 18 Mar 2022 12:04:48 +0100 Subject: [PATCH 011/343] 85451: Fix config example issue and author filters --- config/config.example.yml | 2 +- .../search/search-export-csv/search-export-csv.component.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/config/config.example.yml b/config/config.example.yml index a066838ee5..ecb2a3cfb9 100644 --- a/config/config.example.yml +++ b/config/config.example.yml @@ -16,7 +16,7 @@ ui: # The REST API server settings # NOTE: these must be 'synced' with the 'dspace.server.url' setting in your backend's local.cfg. - +rest: ssl: true host: api7.dspace.org port: 443 diff --git a/src/app/shared/search/search-export-csv/search-export-csv.component.ts b/src/app/shared/search/search-export-csv/search-export-csv.component.ts index 78e352e556..6ad105342f 100644 --- a/src/app/shared/search/search-export-csv/search-export-csv.component.ts +++ b/src/app/shared/search/search-export-csv/search-export-csv.component.ts @@ -85,8 +85,8 @@ export class SearchExportCsvComponent implements OnInit { operator = filter.operator; filterValue = value; } else { - operator = value.substring(value.indexOf(',') + 1); - filterValue = value.substring(0, value.indexOf(',')); + operator = value.substring(value.lastIndexOf(',') + 1); + filterValue = value.substring(0, value.lastIndexOf(',')); } const valueToAdd = `${filter.key.substring(2)},${operator}=${filterValue}`; parameters.push({name: '-f', value: valueToAdd}); From 1697d1396e2643a201edfd7a0470393e02a0c156 Mon Sep 17 00:00:00 2001 From: Bruno Roemers Date: Mon, 21 Mar 2022 10:23:44 +0100 Subject: [PATCH 012/343] 88599: Support versioning of entities --- .../item-pages/journal-issue/journal-issue.component.html | 3 +++ .../item-pages/journal-issue/journal-issue.component.ts | 4 ++-- .../item-pages/journal-volume/journal-volume.component.html | 3 +++ .../item-pages/journal-volume/journal-volume.component.ts | 4 ++-- .../item-pages/journal/journal.component.html | 3 +++ .../journal-entities/item-pages/journal/journal.component.ts | 4 ++-- .../item-pages/org-unit/org-unit.component.html | 3 +++ .../item-pages/org-unit/org-unit.component.ts | 4 ++-- .../research-entities/item-pages/person/person.component.html | 3 +++ .../research-entities/item-pages/person/person.component.ts | 4 ++-- .../item-pages/project/project.component.html | 3 +++ .../research-entities/item-pages/project/project.component.ts | 4 ++-- .../simple/item-types/publication/publication.component.html | 3 +++ .../simple/item-types/publication/publication.component.ts | 4 ++-- 14 files changed, 35 insertions(+), 14 deletions(-) diff --git a/src/app/entity-groups/journal-entities/item-pages/journal-issue/journal-issue.component.html b/src/app/entity-groups/journal-entities/item-pages/journal-issue/journal-issue.component.html index 5847be7dd2..9b96d2a1b2 100644 --- a/src/app/entity-groups/journal-entities/item-pages/journal-issue/journal-issue.component.html +++ b/src/app/entity-groups/journal-entities/item-pages/journal-issue/journal-issue.component.html @@ -3,6 +3,9 @@ {{'journalissue.page.titleprefix' | translate}}
+
diff --git a/src/app/entity-groups/journal-entities/item-pages/journal-issue/journal-issue.component.ts b/src/app/entity-groups/journal-entities/item-pages/journal-issue/journal-issue.component.ts index f96379dafd..f5e9dc9b2b 100644 --- a/src/app/entity-groups/journal-entities/item-pages/journal-issue/journal-issue.component.ts +++ b/src/app/entity-groups/journal-entities/item-pages/journal-issue/journal-issue.component.ts @@ -1,7 +1,7 @@ import { Component } from '@angular/core'; -import { ItemComponent } from '../../../../item-page/simple/item-types/shared/item.component'; import { ViewMode } from '../../../../core/shared/view-mode.model'; import { listableObjectComponent } from '../../../../shared/object-collection/shared/listable-object/listable-object.decorator'; +import { VersionedItemComponent } from '../../../../item-page/simple/item-types/versioned-item/versioned-item.component'; @listableObjectComponent('JournalIssue', ViewMode.StandalonePage) @Component({ @@ -12,5 +12,5 @@ import { listableObjectComponent } from '../../../../shared/object-collection/sh /** * The component for displaying metadata and relations of an item of the type Journal Issue */ -export class JournalIssueComponent extends ItemComponent { +export class JournalIssueComponent extends VersionedItemComponent { } diff --git a/src/app/entity-groups/journal-entities/item-pages/journal-volume/journal-volume.component.html b/src/app/entity-groups/journal-entities/item-pages/journal-volume/journal-volume.component.html index a0a25766ef..07ecb33ced 100644 --- a/src/app/entity-groups/journal-entities/item-pages/journal-volume/journal-volume.component.html +++ b/src/app/entity-groups/journal-entities/item-pages/journal-volume/journal-volume.component.html @@ -3,6 +3,9 @@ {{'journalvolume.page.titleprefix' | translate}}
+
diff --git a/src/app/entity-groups/journal-entities/item-pages/journal-volume/journal-volume.component.ts b/src/app/entity-groups/journal-entities/item-pages/journal-volume/journal-volume.component.ts index eeb93e7070..cc09be7959 100644 --- a/src/app/entity-groups/journal-entities/item-pages/journal-volume/journal-volume.component.ts +++ b/src/app/entity-groups/journal-entities/item-pages/journal-volume/journal-volume.component.ts @@ -1,7 +1,7 @@ import { Component } from '@angular/core'; -import { ItemComponent } from '../../../../item-page/simple/item-types/shared/item.component'; import { ViewMode } from '../../../../core/shared/view-mode.model'; import { listableObjectComponent } from '../../../../shared/object-collection/shared/listable-object/listable-object.decorator'; +import { VersionedItemComponent } from '../../../../item-page/simple/item-types/versioned-item/versioned-item.component'; @listableObjectComponent('JournalVolume', ViewMode.StandalonePage) @Component({ @@ -12,5 +12,5 @@ import { listableObjectComponent } from '../../../../shared/object-collection/sh /** * The component for displaying metadata and relations of an item of the type Journal Volume */ -export class JournalVolumeComponent extends ItemComponent { +export class JournalVolumeComponent extends VersionedItemComponent { } diff --git a/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.html b/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.html index af3ac85959..b1b35db724 100644 --- a/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.html +++ b/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.html @@ -3,6 +3,9 @@ {{'journal.page.titleprefix' | translate}}
+
diff --git a/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.ts b/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.ts index 3fe0903145..acfd31d8f6 100644 --- a/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.ts +++ b/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.ts @@ -1,7 +1,7 @@ import { Component } from '@angular/core'; -import { ItemComponent } from '../../../../item-page/simple/item-types/shared/item.component'; import { ViewMode } from '../../../../core/shared/view-mode.model'; import { listableObjectComponent } from '../../../../shared/object-collection/shared/listable-object/listable-object.decorator'; +import { VersionedItemComponent } from '../../../../item-page/simple/item-types/versioned-item/versioned-item.component'; @listableObjectComponent('Journal', ViewMode.StandalonePage) @Component({ @@ -12,5 +12,5 @@ import { listableObjectComponent } from '../../../../shared/object-collection/sh /** * The component for displaying metadata and relations of an item of the type Journal */ -export class JournalComponent extends ItemComponent { +export class JournalComponent extends VersionedItemComponent { } diff --git a/src/app/entity-groups/research-entities/item-pages/org-unit/org-unit.component.html b/src/app/entity-groups/research-entities/item-pages/org-unit/org-unit.component.html index c9ea8fb549..7c8ce67b88 100644 --- a/src/app/entity-groups/research-entities/item-pages/org-unit/org-unit.component.html +++ b/src/app/entity-groups/research-entities/item-pages/org-unit/org-unit.component.html @@ -3,6 +3,9 @@ {{'orgunit.page.titleprefix' | translate}}
+
diff --git a/src/app/entity-groups/research-entities/item-pages/org-unit/org-unit.component.ts b/src/app/entity-groups/research-entities/item-pages/org-unit/org-unit.component.ts index ab756db562..cbf8497f35 100644 --- a/src/app/entity-groups/research-entities/item-pages/org-unit/org-unit.component.ts +++ b/src/app/entity-groups/research-entities/item-pages/org-unit/org-unit.component.ts @@ -1,7 +1,7 @@ import { Component } from '@angular/core'; -import { ItemComponent } from '../../../../item-page/simple/item-types/shared/item.component'; import { ViewMode } from '../../../../core/shared/view-mode.model'; import { listableObjectComponent } from '../../../../shared/object-collection/shared/listable-object/listable-object.decorator'; +import { VersionedItemComponent } from '../../../../item-page/simple/item-types/versioned-item/versioned-item.component'; @listableObjectComponent('OrgUnit', ViewMode.StandalonePage) @Component({ @@ -12,5 +12,5 @@ import { listableObjectComponent } from '../../../../shared/object-collection/sh /** * The component for displaying metadata and relations of an item of the type Organisation Unit */ -export class OrgUnitComponent extends ItemComponent { +export class OrgUnitComponent extends VersionedItemComponent { } diff --git a/src/app/entity-groups/research-entities/item-pages/person/person.component.html b/src/app/entity-groups/research-entities/item-pages/person/person.component.html index 5c2fd227fd..6e71f775d6 100644 --- a/src/app/entity-groups/research-entities/item-pages/person/person.component.html +++ b/src/app/entity-groups/research-entities/item-pages/person/person.component.html @@ -3,6 +3,9 @@ {{'person.page.titleprefix' | translate}}
+
diff --git a/src/app/entity-groups/research-entities/item-pages/person/person.component.ts b/src/app/entity-groups/research-entities/item-pages/person/person.component.ts index 8b104cc9b1..ad2863034a 100644 --- a/src/app/entity-groups/research-entities/item-pages/person/person.component.ts +++ b/src/app/entity-groups/research-entities/item-pages/person/person.component.ts @@ -1,7 +1,7 @@ import { Component } from '@angular/core'; -import { ItemComponent } from '../../../../item-page/simple/item-types/shared/item.component'; import { ViewMode } from '../../../../core/shared/view-mode.model'; import { listableObjectComponent } from '../../../../shared/object-collection/shared/listable-object/listable-object.decorator'; +import { VersionedItemComponent } from '../../../../item-page/simple/item-types/versioned-item/versioned-item.component'; @listableObjectComponent('Person', ViewMode.StandalonePage) @Component({ @@ -12,5 +12,5 @@ import { listableObjectComponent } from '../../../../shared/object-collection/sh /** * The component for displaying metadata and relations of an item of the type Person */ -export class PersonComponent extends ItemComponent { +export class PersonComponent extends VersionedItemComponent { } diff --git a/src/app/entity-groups/research-entities/item-pages/project/project.component.html b/src/app/entity-groups/research-entities/item-pages/project/project.component.html index 8f2ff6adcd..243dae8b43 100644 --- a/src/app/entity-groups/research-entities/item-pages/project/project.component.html +++ b/src/app/entity-groups/research-entities/item-pages/project/project.component.html @@ -3,6 +3,9 @@ {{'project.page.titleprefix' | translate}}
+
diff --git a/src/app/entity-groups/research-entities/item-pages/project/project.component.ts b/src/app/entity-groups/research-entities/item-pages/project/project.component.ts index e53d8afd69..066427fc0d 100644 --- a/src/app/entity-groups/research-entities/item-pages/project/project.component.ts +++ b/src/app/entity-groups/research-entities/item-pages/project/project.component.ts @@ -1,7 +1,7 @@ import { Component } from '@angular/core'; -import { ItemComponent } from '../../../../item-page/simple/item-types/shared/item.component'; import { ViewMode } from '../../../../core/shared/view-mode.model'; import { listableObjectComponent } from '../../../../shared/object-collection/shared/listable-object/listable-object.decorator'; +import { VersionedItemComponent } from '../../../../item-page/simple/item-types/versioned-item/versioned-item.component'; @listableObjectComponent('Project', ViewMode.StandalonePage) @Component({ @@ -12,5 +12,5 @@ import { listableObjectComponent } from '../../../../shared/object-collection/sh /** * The component for displaying metadata and relations of an item of the type Project */ -export class ProjectComponent extends ItemComponent { +export class ProjectComponent extends VersionedItemComponent { } diff --git a/src/app/item-page/simple/item-types/publication/publication.component.html b/src/app/item-page/simple/item-types/publication/publication.component.html index bace9fcd0a..667dee96f5 100644 --- a/src/app/item-page/simple/item-types/publication/publication.component.html +++ b/src/app/item-page/simple/item-types/publication/publication.component.html @@ -12,6 +12,9 @@ {{'publication.page.titleprefix' | translate}}
+
diff --git a/src/app/item-page/simple/item-types/publication/publication.component.ts b/src/app/item-page/simple/item-types/publication/publication.component.ts index 5ace8d0473..ba5037a104 100644 --- a/src/app/item-page/simple/item-types/publication/publication.component.ts +++ b/src/app/item-page/simple/item-types/publication/publication.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, Component } from '@angular/core'; -import { ItemComponent } from '../shared/item.component'; import { ViewMode } from '../../../../core/shared/view-mode.model'; import { listableObjectComponent } from '../../../../shared/object-collection/shared/listable-object/listable-object.decorator'; +import { VersionedItemComponent } from '../versioned-item/versioned-item.component'; /** * Component that represents a publication Item page @@ -14,6 +14,6 @@ import { listableObjectComponent } from '../../../../shared/object-collection/sh templateUrl: './publication.component.html', changeDetection: ChangeDetectionStrategy.OnPush, }) -export class PublicationComponent extends ItemComponent { +export class PublicationComponent extends VersionedItemComponent { } From c5110f89bc17290b6e224f9366cfa14dfa431d58 Mon Sep 17 00:00:00 2001 From: reetagithub <51482276+reetagithub@users.noreply.github.com> Date: Thu, 24 Mar 2022 11:18:18 +0200 Subject: [PATCH 013/343] Update fi.json5 Modified some keys to harmonize the translations of term 'administrative'. Also, translated "Administer Workflow" to a verb instead of a noun. --- src/assets/i18n/fi.json5 | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/assets/i18n/fi.json5 b/src/assets/i18n/fi.json5 index 02f020a45d..860062fa67 100644 --- a/src/assets/i18n/fi.json5 +++ b/src/assets/i18n/fi.json5 @@ -107,7 +107,7 @@ "admin.registries.bitstream-formats.edit.head": "Tiedostoformaatti: {{ format }}", // "admin.registries.bitstream-formats.edit.internal.hint": "Formats marked as internal are hidden from the user, and used for administrative purposes.", - "admin.registries.bitstream-formats.edit.internal.hint": "Sisäisiksi merkittyjä formaatteja käytetään hallinnollisiin tarkoituksiin, ja ne on piilotettu käyttäjiltä.", + "admin.registries.bitstream-formats.edit.internal.hint": "Sisäisiksi merkittyjä formaatteja käytetään ylläpitotarkoituksiin, ja ne on piilotettu käyttäjiltä.", // "admin.registries.bitstream-formats.edit.internal.label": "Internal", "admin.registries.bitstream-formats.edit.internal.label": "Sisäinen", @@ -662,7 +662,7 @@ // "admin.search.breadcrumbs": "Administrative Search", - "admin.search.breadcrumbs": "Hallinnollinen haku", + "admin.search.breadcrumbs": "Ylläpitäjän haku", // "admin.search.collection.edit": "Edit", "admin.search.collection.edit": "Muokkaa", @@ -692,19 +692,19 @@ "admin.search.item.withdraw": "Poista käytöstä", // "admin.search.title": "Administrative Search", - "admin.search.title": "Hallinnollinen haku", + "admin.search.title": "Ylläpitäjän haku", // "administrativeView.search.results.head": "Administrative Search", - "administrativeView.search.results.head": "Hallinnollinen haku", + "administrativeView.search.results.head": "Ylläpitäjän haku", // "admin.workflow.breadcrumbs": "Administer Workflow", - "admin.workflow.breadcrumbs": "Hallinnointityönkulku", + "admin.workflow.breadcrumbs": "Hallinnoi työnkulkua", // "admin.workflow.title": "Administer Workflow", - "admin.workflow.title": "Hallinnointityönkulku", + "admin.workflow.title": "Hallinnoi työnkulkua", // "admin.workflow.item.workflow": "Workflow", "admin.workflow.item.workflow": "Työnkulku", @@ -2954,7 +2954,7 @@ // "menu.section.admin_search": "Admin Search", - "menu.section.admin_search": "Admin-haku", + "menu.section.admin_search": "Ylläpitäjän haku", @@ -3033,7 +3033,7 @@ "menu.section.icon.access_control": "Pääsyoikeudet", // "menu.section.icon.admin_search": "Admin search menu section", - "menu.section.icon.admin_search": "Admin-haku", + "menu.section.icon.admin_search": "Ylläpitäjän haku", // "menu.section.icon.control_panel": "Control Panel menu section", "menu.section.icon.control_panel": "Hallintapaneeli", @@ -3168,7 +3168,7 @@ // "menu.section.workflow": "Administer Workflow", - "menu.section.workflow": "Hallinnointityönkulku", + "menu.section.workflow": "Hallinnoi työnkulkua", // "mydspace.description": "", @@ -5079,7 +5079,7 @@ // "workflowAdmin.search.results.head": "Administer Workflow", - "workflowAdmin.search.results.head": "Hallinnointityönkulku", + "workflowAdmin.search.results.head": "Hallinnoi työnkulkua", From 46a0ea10f40539463abb05fbcbbe1aa8da62f444 Mon Sep 17 00:00:00 2001 From: Pratik Rajkotiya Date: Fri, 25 Mar 2022 18:28:26 +0530 Subject: [PATCH 014/343] [CST-5535] WIP --- src/app/health-page/health.module.ts | 12 +++++++++ src/app/health-page/health.routing.module.ts | 25 ++++++++++++++++++ .../health-page/health/health.component.html | 1 + .../health-page/health/health.component.scss | 0 .../health/health.component.spec.ts | 25 ++++++++++++++++++ .../health-page/health/health.component.ts | 26 +++++++++++++++++++ 6 files changed, 89 insertions(+) create mode 100644 src/app/health-page/health.module.ts create mode 100644 src/app/health-page/health.routing.module.ts create mode 100644 src/app/health-page/health/health.component.html create mode 100644 src/app/health-page/health/health.component.scss create mode 100644 src/app/health-page/health/health.component.spec.ts create mode 100644 src/app/health-page/health/health.component.ts diff --git a/src/app/health-page/health.module.ts b/src/app/health-page/health.module.ts new file mode 100644 index 0000000000..46a6642168 --- /dev/null +++ b/src/app/health-page/health.module.ts @@ -0,0 +1,12 @@ +import { NgModule } from '@angular/core'; +import { HealthComponent } from './health/health.component'; + + +@NgModule({ + declarations: [ + HealthComponent + ] + }) + export class HealthModule { + + } \ No newline at end of file diff --git a/src/app/health-page/health.routing.module.ts b/src/app/health-page/health.routing.module.ts new file mode 100644 index 0000000000..70ed2a0e43 --- /dev/null +++ b/src/app/health-page/health.routing.module.ts @@ -0,0 +1,25 @@ +import { RouterModule } from '@angular/router'; +import { NgModule } from '@angular/core'; +import { AuthenticatedGuard } from '../core/auth/authenticated.guard'; +import { HealthComponent } from './health/health.component'; + +@NgModule({ + imports: [ + RouterModule.forChild([ + { + path: '', + canActivate: [AuthenticatedGuard], + children: [ + { + path: '', + component: HealthComponent, + }, + ] + }, + + ]) + ] +}) +export class HealthPageRoutingModule { + +} diff --git a/src/app/health-page/health/health.component.html b/src/app/health-page/health/health.component.html new file mode 100644 index 0000000000..f96dc0a28f --- /dev/null +++ b/src/app/health-page/health/health.component.html @@ -0,0 +1 @@ +

health works!

diff --git a/src/app/health-page/health/health.component.scss b/src/app/health-page/health/health.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/health-page/health/health.component.spec.ts b/src/app/health-page/health/health.component.spec.ts new file mode 100644 index 0000000000..9423481b32 --- /dev/null +++ b/src/app/health-page/health/health.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HealthComponent } from './health.component'; + +describe('HealthComponent', () => { + let component: HealthComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ HealthComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(HealthComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/health-page/health/health.component.ts b/src/app/health-page/health/health.component.ts new file mode 100644 index 0000000000..46ff73cc09 --- /dev/null +++ b/src/app/health-page/health/health.component.ts @@ -0,0 +1,26 @@ +import { Component, OnInit } from '@angular/core'; +import { DspaceRestService } from '../../core/dspace-rest/dspace-rest.service'; +import { HALEndpointService } from '../../core/shared/hal-endpoint.service'; + +@Component({ + selector: 'ds-health', + templateUrl: './health.component.html', + styleUrls: ['./health.component.scss'] +}) +export class HealthComponent implements OnInit { + + constructor(protected halService: HALEndpointService, + protected restService: DspaceRestService) { + } + + ngOnInit(): void { + this.halService.getRootHref(); + console.log('this.halService.getRootHref()',); + this.restService.get(this.halService.getRootHref() + '/actuator' + '/health').subscribe((data)=>{ + console.log(data); + + }) + + } + +} From 108f6e60f932e459982e2c8d54b9497d6424c8f5 Mon Sep 17 00:00:00 2001 From: Pratik Rajkotiya Date: Fri, 25 Mar 2022 18:37:25 +0530 Subject: [PATCH 015/343] [CST-5535] WIP --- server.ts | 14 ++++++++++++++ .../admin/admin-sidebar/admin-sidebar.component.ts | 12 ++++++++++++ src/app/app-routing.module.ts | 5 +++++ src/assets/i18n/en.json5 | 2 ++ 4 files changed, 33 insertions(+) diff --git a/server.ts b/server.ts index da3b877bc1..57ab3cb69f 100644 --- a/server.ts +++ b/server.ts @@ -157,6 +157,20 @@ export function app() { */ server.use('/iiif', express.static(IIIF_VIEWER, {index:false})); + /** + * Checking server status + */ + server.get('/app/health', async (req,res) => { + try { + const serverStatus = await https.get(`${environment.rest.baseUrl}/actuator/health`); + res.send(serverStatus); + } catch (error) { + res.send({ + error: error.message + }); + } + }); + // Register the ngApp callback function to handle incoming requests server.get('*', ngApp); diff --git a/src/app/admin/admin-sidebar/admin-sidebar.component.ts b/src/app/admin/admin-sidebar/admin-sidebar.component.ts index dc9d2a817f..431a8785da 100644 --- a/src/app/admin/admin-sidebar/admin-sidebar.component.ts +++ b/src/app/admin/admin-sidebar/admin-sidebar.component.ts @@ -308,6 +308,18 @@ export class AdminSidebarComponent extends MenuComponent implements OnInit { icon: 'terminal', index: 10 }, + { + id: 'health', + active: false, + visible: isSiteAdmin, + model: { + type: MenuItemType.LINK, + text: 'menu.section.health', + link: '/health' + } as LinkMenuItemModel, + icon: 'heartbeat', + index: 11 + }, ]; menuList.forEach((menuSection) => this.menuService.addSection(this.menuID, Object.assign(menuSection, { shouldPersistOnRouteChange: true diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 88f7791b1b..6456547355 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -208,6 +208,11 @@ import { ServerCheckGuard } from './core/server-check/server-check.guard'; loadChildren: () => import('./statistics-page/statistics-page-routing.module') .then((m) => m.StatisticsPageRoutingModule) }, + { + path: 'health', + loadChildren: () => import('./health-page/health.routing.module') + .then((m) => m.HealthPageRoutingModule) + }, { path: ACCESS_CONTROL_MODULE_PATH, loadChildren: () => import('./access-control/access-control.module').then((m) => m.AccessControlModule), diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index f33a195cfe..ba0508bdb5 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -2543,6 +2543,8 @@ "menu.section.processes": "Processes", + "menu.section.health": "Health", + "menu.section.registries": "Registries", From 392d0e366d3209ef8e50071b5b8a0bba2c6e35bb Mon Sep 17 00:00:00 2001 From: Pratik Rajkotiya Date: Tue, 5 Apr 2022 18:46:58 +0530 Subject: [PATCH 016/343] [CST-5535] test cases added. --- package.json | 1 + src/app/app-routing.module.ts | 4 +- src/app/health-page/health-data.service.ts | 32 ++++ src/app/health-page/health.module.ts | 15 +- src/app/health-page/health.routing.module.ts | 3 + .../health-page/health/health.component.html | 40 ++++- .../health-page/health/health.component.scss | 8 + .../health/health.component.spec.ts | 141 +++++++++++++++++- .../health-page/health/health.component.ts | 100 +++++++++++-- src/assets/i18n/en.json5 | 6 + yarn.lock | 5 + 11 files changed, 334 insertions(+), 21 deletions(-) create mode 100644 src/app/health-page/health-data.service.ts diff --git a/package.json b/package.json index 99ab1d2e07..95f659e9eb 100644 --- a/package.json +++ b/package.json @@ -57,6 +57,7 @@ "@angular/core": "~11.2.14", "@angular/forms": "~11.2.14", "@angular/localize": "11.2.14", + "@angular/material": "9.2.0", "@angular/platform-browser": "~11.2.14", "@angular/platform-browser-dynamic": "~11.2.14", "@angular/platform-server": "~11.2.14", diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 6456547355..80310774c8 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -210,8 +210,8 @@ import { ServerCheckGuard } from './core/server-check/server-check.guard'; }, { path: 'health', - loadChildren: () => import('./health-page/health.routing.module') - .then((m) => m.HealthPageRoutingModule) + loadChildren: () => import('./health-page/health.module') + .then((m) => m.HealthModule) }, { path: ACCESS_CONTROL_MODULE_PATH, diff --git a/src/app/health-page/health-data.service.ts b/src/app/health-page/health-data.service.ts new file mode 100644 index 0000000000..bd905006aa --- /dev/null +++ b/src/app/health-page/health-data.service.ts @@ -0,0 +1,32 @@ +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs'; +import { map, switchMap } from 'rxjs/operators'; +import { DspaceRestService } from '../core/dspace-rest/dspace-rest.service'; +import { RawRestResponse } from '../core/dspace-rest/raw-rest-response.model'; +import { HALEndpointService } from '../core/shared/hal-endpoint.service'; + +@Injectable({ + providedIn: 'root' +}) +export class HealthDataService { + constructor(protected halService: HALEndpointService, + protected restService: DspaceRestService) { + } + /** + * @returns health data + */ + getHealth(): Observable { + return this.halService.getEndpoint('/actuator').pipe( + map((restURL: string) => restURL + '/health'), + switchMap((endpoint: string) => this.restService.get(endpoint))); + } + + /** + * @returns information of server + */ + getInfo(): Observable { + return this.halService.getEndpoint('/actuator').pipe( + map((restURL: string) => restURL + '/info'), + switchMap((endpoint: string) => this.restService.get(endpoint))); + } +} diff --git a/src/app/health-page/health.module.ts b/src/app/health-page/health.module.ts index 46a6642168..8731b77f77 100644 --- a/src/app/health-page/health.module.ts +++ b/src/app/health-page/health.module.ts @@ -1,12 +1,23 @@ +import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; +import { HealthPageRoutingModule } from './health.routing.module'; import { HealthComponent } from './health/health.component'; +import { MatExpansionModule } from '@angular/material/expansion'; +import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; +import { TranslateModule } from '@ngx-translate/core'; @NgModule({ + imports: [ + CommonModule, + HealthPageRoutingModule, + MatExpansionModule, + NgbModule, + TranslateModule + ], declarations: [ HealthComponent ] }) export class HealthModule { - - } \ No newline at end of file + } diff --git a/src/app/health-page/health.routing.module.ts b/src/app/health-page/health.routing.module.ts index 70ed2a0e43..a8d94d9d1f 100644 --- a/src/app/health-page/health.routing.module.ts +++ b/src/app/health-page/health.routing.module.ts @@ -2,12 +2,15 @@ import { RouterModule } from '@angular/router'; import { NgModule } from '@angular/core'; import { AuthenticatedGuard } from '../core/auth/authenticated.guard'; import { HealthComponent } from './health/health.component'; +import { I18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.resolver'; @NgModule({ imports: [ RouterModule.forChild([ { path: '', + resolve: { breadcrumb: I18nBreadcrumbResolver }, + data: { breadcrumbKey: 'health' }, canActivate: [AuthenticatedGuard], children: [ { diff --git a/src/app/health-page/health/health.component.html b/src/app/health-page/health/health.component.html index f96dc0a28f..05f77225fb 100644 --- a/src/app/health-page/health/health.component.html +++ b/src/app/health-page/health/health.component.html @@ -1 +1,39 @@ -

health works!

+
+ +
+
+ + + + diff --git a/src/app/health-page/health/health.component.scss b/src/app/health-page/health/health.component.scss index e69de29bb2..c085111079 100644 --- a/src/app/health-page/health/health.component.scss +++ b/src/app/health-page/health/health.component.scss @@ -0,0 +1,8 @@ +.mat-expansion-panel-header { + padding-left: 0px; +} + +.circle-red { + color:red; + align-items: center; +} \ No newline at end of file diff --git a/src/app/health-page/health/health.component.spec.ts b/src/app/health-page/health/health.component.spec.ts index 9423481b32..845360f059 100644 --- a/src/app/health-page/health/health.component.spec.ts +++ b/src/app/health-page/health/health.component.spec.ts @@ -1,14 +1,138 @@ +import { CommonModule } from '@angular/common'; import { ComponentFixture, TestBed } from '@angular/core/testing'; - +import { MatExpansionModule } from '@angular/material/expansion'; +import { By } from '@angular/platform-browser'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { NgbNavModule } from '@ng-bootstrap/ng-bootstrap'; +import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; +import { of } from 'rxjs'; +import { TranslateLoaderMock } from '../../shared/mocks/translate-loader.mock'; +import { HealthDataService } from '../health-data.service'; +import { HealthPageRoutingModule } from '../health.routing.module'; import { HealthComponent } from './health.component'; -describe('HealthComponent', () => { + function getHealth() { + return of({ + 'payload':{ + 'status':'UP_WITH_ISSUES', + 'components':{ + 'db':{ + 'status':'UP', + 'components':{ + 'dataSource':{ + 'status':'UP', + 'details':{ + 'database':'PostgreSQL', + 'result':1, + 'validationQuery':'SELECT 1' + } + }, + 'dspaceDataSource':{ + 'status':'UP', + 'details':{ + 'database':'PostgreSQL', + 'result':1, + 'validationQuery':'SELECT 1' + } + } + } + }, + 'geoIp':{ + 'status':'UP_WITH_ISSUES', + 'details':{ + 'reason':'The GeoLite Database file is missing (/var/lib/GeoIP/GeoLite2-City.mmdb)! Solr Statistics cannot generate location based reports! Please see the DSpace installation instructions for instructions to install this file.' + } + }, + 'solrOaiCore':{ + 'status':'UP', + 'details':{ + 'status':0, + 'detectedPathType':'particular core' + } + }, + 'solrSearchCore':{ + 'status':'UP', + 'details':{ + 'status':0, + 'detectedPathType':'particular core' + } + }, + 'solrStatisticsCore':{ + 'status':'UP', + 'details':{ + 'status':0, + 'detectedPathType':'particular core' + } + } + } + }, + 'statusCode':200, + 'statusText':'OK' + }); + } + + function getInfo() { + return of({ + 'payload':{ + 'app':{ + 'name':'DSpace at My University', + 'version':'7.3', + 'dir':'/Users/pratikrajkotiya/Documents/Project/FrontEnd/dspace-cris-install', + 'url':'http://localhost:8080/server', + 'db':'jdbc:postgresql://localhost:5432/4science', + 'solr':{ + 'server':'http://localhost:8983/solr', + 'prefix':'' + }, + 'mail':{ + 'server':'smtp.example.com', + 'from-address':'dspace-noreply@myu.edu', + 'feedback-recipient':'dspace-help@myu.edu', + 'mail-admin':'dspace-help@myu.edu', + 'mail-helpdesk':'dspace-help@myu.edu', + 'alert-recipient':'dspace-help@myu.edu' + }, + 'cors':{ + 'allowed-origins':'http://localhost:4000' + }, + 'ui':{ + 'url':'http://localhost:4000' + } + } + }, + 'statusCode':200, + 'statusText':'OK' + }); + } + +function getMockHealthDataService() { + return jasmine.createSpyObj('healthDataService', { + getHealth: getHealth(), + getInfo: getInfo() + }); +} + +fdescribe('HealthComponent', () => { let component: HealthComponent; let fixture: ComponentFixture; beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ HealthComponent ] + imports: [ + NgbNavModule, + CommonModule, + HealthPageRoutingModule, + MatExpansionModule, + BrowserAnimationsModule, + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useClass: TranslateLoaderMock + } + }), + ], + declarations: [ HealthComponent ], + providers:[{ provide: HealthDataService, useValue: getMockHealthDataService() }] }) .compileComponents(); }); @@ -22,4 +146,15 @@ describe('HealthComponent', () => { it('should create', () => { expect(component).toBeTruthy(); }); + + it('should render health tab.', () => { + const healthTab = fixture.debugElement.query(By.css('#health')); + expect(healthTab).toBeTruthy(); + }); + + it('should render info tab.', () => { + const infoTab = fixture.debugElement.query(By.css('#info')); + expect(infoTab).toBeFalsy(); + }); + }); diff --git a/src/app/health-page/health/health.component.ts b/src/app/health-page/health/health.component.ts index 46ff73cc09..89aa6611f6 100644 --- a/src/app/health-page/health/health.component.ts +++ b/src/app/health-page/health/health.component.ts @@ -1,26 +1,100 @@ import { Component, OnInit } from '@angular/core'; -import { DspaceRestService } from '../../core/dspace-rest/dspace-rest.service'; -import { HALEndpointService } from '../../core/shared/hal-endpoint.service'; +import { HealthDataService } from '../health-data.service'; + +enum HealthStatus { + UP = 'UP', + UP_WITH_ISSUES = 'UP_WITH_ISSUES', + DOWN = 'DOWN' +} @Component({ selector: 'ds-health', templateUrl: './health.component.html', styleUrls: ['./health.component.scss'] }) export class HealthComponent implements OnInit { - - constructor(protected halService: HALEndpointService, - protected restService: DspaceRestService) { - } + healthArr: string[]; + serverInfoArr: string[]; + healthGlobalStatus: string; + activeId ='Health'; + constructor(private healthDataService: HealthDataService) { } ngOnInit(): void { - this.halService.getRootHref(); - console.log('this.halService.getRootHref()',); - this.restService.get(this.halService.getRootHref() + '/actuator' + '/health').subscribe((data)=>{ - console.log(data); - - }) - + this.healthDataService.getHealth().subscribe((data) => { + this.healthArr = this.getHealth(data.payload.components); + this.healthGlobalStatus = data.payload.status; + }); + + this.healthDataService.getInfo().subscribe((data) => { + this.serverInfoArr = this.getInfo(data.payload, null, []); + }); + } + + /** + * @param obj represents a info + * @param key represents a nested key of info + * @param arr represents a key value pair or only key + * @returns {{arr}} of key value pair or only key + */ + getInfo(obj, key, arr) { + if (typeof obj === 'object' && key !== null) { + arr.push({style: {'font-weight': 'bold' ,'font-size.px': key === 'app' ? '30' : '20' }, value: key}); + } + if (typeof obj !== 'object') { + arr.push({style: {'font-size.px': '15'}, value: `${key} = ${obj}`}); + return obj; + } + // tslint:disable-next-line: forin + for (const objKey in obj) { + this.getInfo(obj[objKey], objKey, arr); + } + return arr; + } + + /** + * @param subCompObj represent nested sub component + * @param superCompkey represents a key of super component + * @returns linear components array + */ + getHealthSubComponents(subCompObj, superCompkey) { + const subCompArr = []; + // tslint:disable-next-line: forin + for (const key in subCompObj) { + subCompArr.push({ ...subCompObj[key], components: superCompkey + '.' + key }); + } + return subCompArr; + } + + /** + * @param componentsObj represent health data + * @returns linear components array + */ + getHealth(componentsObj) { + let componentsArr = []; + for (const key in componentsObj) { + if (componentsObj[key].hasOwnProperty('components')) { + componentsArr.push({ ...componentsObj[key], components: key }); + // tslint:disable-next-line: no-string-literal + componentsArr = [...componentsArr, ...this.getHealthSubComponents(componentsObj[key]['components'], key)]; + } else { + componentsArr.push({ ...componentsObj[key], components: key }); + } + } + return componentsArr; + } + + /** + * @param status of perticular block + * @returns {{ string }} class respective status + */ + getHealthIconClass(status: string): string { + if (status === HealthStatus.UP) { + return 'fa fa-check-circle text-success ml-2 mt-1'; + } else if (status === HealthStatus.UP_WITH_ISSUES) { + return 'fa fa-exclamation-triangle text-warning ml-2 mt-1'; + } else { + return 'fa fa-times-circle circle-red ml-2 mt-1'; + } } } diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index ba0508bdb5..5326c2f84e 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -2909,7 +2909,13 @@ "profile.title": "Update Profile", + "health.breadcrumbs": "Health", + "health-page.health" : "Health", + + "health-page.info" : "Info", + + "health-page.status" : "Status", "project.listelement.badge": "Research Project", diff --git a/yarn.lock b/yarn.lock index 420ff76478..593dd53d36 100644 --- a/yarn.lock +++ b/yarn.lock @@ -397,6 +397,11 @@ glob "7.1.2" yargs "^16.2.0" +"@angular/material@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@angular/material/-/material-9.2.0.tgz#1b6f0a2e115f93885d7fc2dc4b258d8c9cf6821f" + integrity sha512-KKzEIVh6/m56m+Ao8p4PK0SyEr0574l3VP2swj1qPag3u+FYgemmXCGTaChrKdDsez+zeTCPXImBGXzE6NQ80Q== + "@angular/platform-browser-dynamic@~11.2.14": version "11.2.14" resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-11.2.14.tgz#3c7fff1a1daacba5390acf033d28c377ec281166" From d7c3a20f2a29244a0059dacd1a275256587e3b45 Mon Sep 17 00:00:00 2001 From: Pratik Rajkotiya <“pratik.rajkotiya@4science.com”> Date: Tue, 5 Apr 2022 18:52:40 +0530 Subject: [PATCH 017/343] [CST-5535] remove fdescibe. --- src/app/health-page/health/health.component.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/health-page/health/health.component.spec.ts b/src/app/health-page/health/health.component.spec.ts index 845360f059..4515aef2cb 100644 --- a/src/app/health-page/health/health.component.spec.ts +++ b/src/app/health-page/health/health.component.spec.ts @@ -112,7 +112,7 @@ function getMockHealthDataService() { }); } -fdescribe('HealthComponent', () => { +describe('HealthComponent', () => { let component: HealthComponent; let fixture: ComponentFixture; From e68e605211fa01678eaa4ce1f019ebba5d1777c1 Mon Sep 17 00:00:00 2001 From: Luca Giamminonni Date: Wed, 14 Apr 2021 15:17:18 +0200 Subject: [PATCH 018/343] [CST-5309] Added LoginOrcid component --- src/app/core/auth/models/auth.method-type.ts | 3 +- src/app/core/auth/models/auth.method.ts | 5 + .../methods/orcid/log-in-orcid.component.html | 3 + .../orcid/log-in-orcid.component.spec.ts | 155 ++++++++++++++++++ .../methods/orcid/log-in-orcid.component.ts | 110 +++++++++++++ src/app/shared/shared.module.ts | 3 + src/assets/i18n/en.json5 | 2 + 7 files changed, 280 insertions(+), 1 deletion(-) create mode 100644 src/app/shared/log-in/methods/orcid/log-in-orcid.component.html create mode 100644 src/app/shared/log-in/methods/orcid/log-in-orcid.component.spec.ts create mode 100644 src/app/shared/log-in/methods/orcid/log-in-orcid.component.ts diff --git a/src/app/core/auth/models/auth.method-type.ts b/src/app/core/auth/models/auth.method-type.ts index 9d999c4c3f..594d6d8b39 100644 --- a/src/app/core/auth/models/auth.method-type.ts +++ b/src/app/core/auth/models/auth.method-type.ts @@ -4,5 +4,6 @@ export enum AuthMethodType { Ldap = 'ldap', Ip = 'ip', X509 = 'x509', - Oidc = 'oidc' + Oidc = 'oidc', + Orcid = 'orcid' } diff --git a/src/app/core/auth/models/auth.method.ts b/src/app/core/auth/models/auth.method.ts index 5a362e8606..0579ae0cd1 100644 --- a/src/app/core/auth/models/auth.method.ts +++ b/src/app/core/auth/models/auth.method.ts @@ -34,6 +34,11 @@ export class AuthMethod { this.location = location; break; } + case 'orcid': { + this.authMethodType = AuthMethodType.Orcid; + this.location = location; + break; + } default: { break; diff --git a/src/app/shared/log-in/methods/orcid/log-in-orcid.component.html b/src/app/shared/log-in/methods/orcid/log-in-orcid.component.html new file mode 100644 index 0000000000..6f5453fd60 --- /dev/null +++ b/src/app/shared/log-in/methods/orcid/log-in-orcid.component.html @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/src/app/shared/log-in/methods/orcid/log-in-orcid.component.spec.ts b/src/app/shared/log-in/methods/orcid/log-in-orcid.component.spec.ts new file mode 100644 index 0000000000..001f0a4959 --- /dev/null +++ b/src/app/shared/log-in/methods/orcid/log-in-orcid.component.spec.ts @@ -0,0 +1,155 @@ +import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; + +import { provideMockStore } from '@ngrx/store/testing'; +import { Store, StoreModule } from '@ngrx/store'; +import { TranslateModule } from '@ngx-translate/core'; + +import { EPerson } from '../../../../core/eperson/models/eperson.model'; +import { EPersonMock } from '../../../testing/eperson.mock'; +import { authReducer } from '../../../../core/auth/auth.reducer'; +import { AuthService } from '../../../../core/auth/auth.service'; +import { AuthServiceStub } from '../../../testing/auth-service.stub'; +import { storeModuleConfig } from '../../../../app.reducer'; +import { AuthMethod } from '../../../../core/auth/models/auth.method'; +import { AuthMethodType } from '../../../../core/auth/models/auth.method-type'; +import { LogInOrcidComponent } from './log-in-orcid.component'; +import { NativeWindowService } from '../../../../core/services/window.service'; +import { RouterStub } from '../../../testing/router.stub'; +import { ActivatedRouteStub } from '../../../testing/active-router.stub'; +import { NativeWindowMockFactory } from '../../../mocks/mock-native-window-ref'; +import { HardRedirectService } from '../../../../core/services/hard-redirect.service'; + + +describe('LogInOrcidComponent', () => { + + let component: LogInOrcidComponent; + let fixture: ComponentFixture; + let page: Page; + let user: EPerson; + let componentAsAny: any; + let setHrefSpy; + let orcidBaseUrl; + let location; + let initialState: any; + let hardRedirectService: HardRedirectService; + + beforeEach(() => { + user = EPersonMock; + orcidBaseUrl = 'dspace-rest.test/orcid?redirectUrl='; + location = orcidBaseUrl + 'http://dspace-angular.test/home'; + + hardRedirectService = jasmine.createSpyObj('hardRedirectService', { + getCurrentRoute: {}, + redirect: {} + }); + + initialState = { + core: { + auth: { + authenticated: false, + loaded: false, + blocking: false, + loading: false, + authMethods: [] + } + } + }; + }); + + beforeEach(waitForAsync(() => { + // refine the test module by declaring the test component + TestBed.configureTestingModule({ + imports: [ + StoreModule.forRoot({ auth: authReducer }, storeModuleConfig), + TranslateModule.forRoot() + ], + declarations: [ + LogInOrcidComponent + ], + providers: [ + { provide: AuthService, useClass: AuthServiceStub }, + { provide: 'authMethodProvider', useValue: new AuthMethod(AuthMethodType.Orcid, location) }, + { provide: 'isStandalonePage', useValue: true }, + { provide: NativeWindowService, useFactory: NativeWindowMockFactory }, + { provide: Router, useValue: new RouterStub() }, + { provide: ActivatedRoute, useValue: new ActivatedRouteStub() }, + { provide: HardRedirectService, useValue: hardRedirectService }, + provideMockStore({ initialState }), + ], + schemas: [ + CUSTOM_ELEMENTS_SCHEMA + ] + }) + .compileComponents(); + + })); + + beforeEach(() => { + // create component and test fixture + fixture = TestBed.createComponent(LogInOrcidComponent); + + // get test component from the fixture + component = fixture.componentInstance; + componentAsAny = component; + + // create page + page = new Page(component, fixture); + setHrefSpy = spyOnProperty(componentAsAny._window.nativeWindow.location, 'href', 'set').and.callThrough(); + + }); + + it('should set the properly a new redirectUrl', () => { + const currentUrl = 'http://dspace-angular.test/collections/12345'; + componentAsAny._window.nativeWindow.location.href = currentUrl; + + fixture.detectChanges(); + + expect(componentAsAny.injectedAuthMethodModel.location).toBe(location); + expect(componentAsAny._window.nativeWindow.location.href).toBe(currentUrl); + + component.redirectToOrcid(); + + expect(setHrefSpy).toHaveBeenCalledWith(currentUrl); + + }); + + it('should not set a new redirectUrl', () => { + const currentUrl = 'http://dspace-angular.test/home'; + componentAsAny._window.nativeWindow.location.href = currentUrl; + + fixture.detectChanges(); + + expect(componentAsAny.injectedAuthMethodModel.location).toBe(location); + expect(componentAsAny._window.nativeWindow.location.href).toBe(currentUrl); + + component.redirectToOrcid(); + + expect(setHrefSpy).toHaveBeenCalledWith(currentUrl); + + }); + +}); + +/** + * I represent the DOM elements and attach spies. + * + * @class Page + */ +class Page { + + public emailInput: HTMLInputElement; + public navigateSpy: jasmine.Spy; + public passwordInput: HTMLInputElement; + + constructor(private component: LogInOrcidComponent, private fixture: ComponentFixture) { + // use injector to get services + const injector = fixture.debugElement.injector; + const store = injector.get(Store); + + // add spies + this.navigateSpy = spyOn(store, 'dispatch'); + } + +} diff --git a/src/app/shared/log-in/methods/orcid/log-in-orcid.component.ts b/src/app/shared/log-in/methods/orcid/log-in-orcid.component.ts new file mode 100644 index 0000000000..df234bcbb4 --- /dev/null +++ b/src/app/shared/log-in/methods/orcid/log-in-orcid.component.ts @@ -0,0 +1,110 @@ +import { Component, Inject, OnInit, } from '@angular/core'; + +import { Observable } from 'rxjs'; +import { select, Store } from '@ngrx/store'; + +import { renderAuthMethodFor } from '../log-in.methods-decorator'; +import { AuthMethodType } from '../../../../core/auth/models/auth.method-type'; +import { AuthMethod } from '../../../../core/auth/models/auth.method'; + +import { CoreState } from '../../../../core/core.reducers'; +import { isAuthenticated, isAuthenticationLoading } from '../../../../core/auth/selectors'; +import { NativeWindowRef, NativeWindowService } from '../../../../core/services/window.service'; +import { isNotNull, isEmpty } from '../../../empty.util'; +import { AuthService } from '../../../../core/auth/auth.service'; +import { HardRedirectService } from '../../../../core/services/hard-redirect.service'; +import { take } from 'rxjs/operators'; +import { URLCombiner } from '../../../../core/url-combiner/url-combiner'; + +@Component({ + selector: 'ds-log-in-orcid', + templateUrl: './log-in-orcid.component.html', +}) +@renderAuthMethodFor(AuthMethodType.Orcid) +export class LogInOrcidComponent implements OnInit { + + /** + * The authentication method data. + * @type {AuthMethod} + */ + public authMethod: AuthMethod; + + /** + * True if the authentication is loading. + * @type {boolean} + */ + public loading: Observable; + + /** + * The orcid authentication location url. + * @type {string} + */ + public location: string; + + /** + * Whether user is authenticated. + * @type {Observable} + */ + public isAuthenticated: Observable; + + /** + * @constructor + * @param {AuthMethod} injectedAuthMethodModel + * @param {boolean} isStandalonePage + * @param {NativeWindowRef} _window + * @param {AuthService} authService + * @param {HardRedirectService} hardRedirectService + * @param {Store} store + */ + constructor( + @Inject('authMethodProvider') public injectedAuthMethodModel: AuthMethod, + @Inject('isStandalonePage') public isStandalonePage: boolean, + @Inject(NativeWindowService) protected _window: NativeWindowRef, + private authService: AuthService, + private hardRedirectService: HardRedirectService, + private store: Store + ) { + this.authMethod = injectedAuthMethodModel; + } + + ngOnInit(): void { + // set isAuthenticated + this.isAuthenticated = this.store.pipe(select(isAuthenticated)); + + // set loading + this.loading = this.store.pipe(select(isAuthenticationLoading)); + + // set location + this.location = decodeURIComponent(this.injectedAuthMethodModel.location); + + } + + redirectToOrcid() { + + this.authService.getRedirectUrl().pipe(take(1)).subscribe((redirectRoute) => { + if (!this.isStandalonePage) { + redirectRoute = this.hardRedirectService.getCurrentRoute(); + } else if (isEmpty(redirectRoute)) { + redirectRoute = '/'; + } + const correctRedirectUrl = new URLCombiner(this._window.nativeWindow.origin, redirectRoute).toString(); + + let orcidServerUrl = this.location; + const myRegexp = /\?redirectUrl=(.*)/g; + const match = myRegexp.exec(this.location); + const redirectUrlFromServer = (match && match[1]) ? match[1] : null; + + // Check whether the current page is different from the redirect url received from rest + if (isNotNull(redirectUrlFromServer) && redirectUrlFromServer !== correctRedirectUrl) { + // change the redirect url with the current page url + const newRedirectUrl = `?redirectUrl=${correctRedirectUrl}`; + orcidServerUrl = this.location.replace(/\?redirectUrl=(.*)/g, newRedirectUrl); + } + + // redirect to orcid authentication url + this.hardRedirectService.redirect(orcidServerUrl); + }); + + } + +} diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index 7b799bfaea..574d890ede 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -173,6 +173,7 @@ import { BitstreamRequestACopyPageComponent } from './bitstream-request-a-copy-p import { DsSelectComponent } from './ds-select/ds-select.component'; import { LogInOidcComponent } from './log-in/methods/oidc/log-in-oidc.component'; import { ThemedItemListPreviewComponent } from './object-list/my-dspace-result-list-element/item-list-preview/themed-item-list-preview.component'; +import { LogInOrcidComponent } from './log-in/methods/orcid/log-in-orcid.component'; const MODULES = [ // Do NOT include UniversalModule, HttpModule, or JsonpModule here @@ -306,6 +307,7 @@ const COMPONENTS = [ LogInShibbolethComponent, LogInOidcComponent, + LogInOrcidComponent, LogInPasswordComponent, LogInContainerComponent, ItemVersionsComponent, @@ -378,6 +380,7 @@ const ENTRY_COMPONENTS = [ LogInPasswordComponent, LogInShibbolethComponent, LogInOidcComponent, + LogInOrcidComponent, BundleListElementComponent, ClaimedTaskActionsApproveComponent, ClaimedTaskActionsRejectComponent, diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index c3c68a6882..fe034ac34a 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -2389,6 +2389,8 @@ "login.form.oidc": "Log in with OIDC", + "login.form.orcid": "Log in with ORCID", + "login.form.password": "Password", "login.form.shibboleth": "Log in with Shibboleth", From cc08a2829ec05e211d4604173c6fd4a1c37893c0 Mon Sep 17 00:00:00 2001 From: Pratik Rajkotiya Date: Wed, 13 Apr 2022 17:48:26 +0530 Subject: [PATCH 019/343] [CST-5668] ORCID Authorizations added. --- .../data/feature-authorization/feature-id.ts | 1 + .../item-pages/person/person.component.html | 1 + src/app/item-page/item-page-routing-paths.ts | 1 + src/app/item-page/item-page-routing.module.ts | 10 +- src/app/item-page/item-page.module.ts | 6 + .../orcid-auth/orcid-auth.component.html | 71 +++++++ .../orcid-auth/orcid-auth.component.scss | 0 .../orcid-auth/orcid-auth.component.ts | 98 +++++++++ .../orcid-page/orcid-page.component.html | 1 + .../orcid-page/orcid-page.component.scss | 0 .../orcid-page/orcid-page.component.ts | 9 + .../item-page/orcid-page/orcid-page.guard.ts | 31 +++ .../dso-page-orcid-button.component.html | 5 + .../dso-page-orcid-button.component.scss | 0 .../dso-page-orcid-button.component.spec.ts | 76 +++++++ .../dso-page-orcid-button.component.ts | 43 ++++ src/app/shared/shared.module.ts | 2 + src/assets/i18n/en.json5 | 191 ++++++++++++++++++ src/assets/images/orcid.logo.icon.svg | 21 ++ src/styles/_global-styles.scss | 11 + 20 files changed, 577 insertions(+), 1 deletion(-) create mode 100644 src/app/item-page/orcid-page/orcid-auth/orcid-auth.component.html create mode 100644 src/app/item-page/orcid-page/orcid-auth/orcid-auth.component.scss create mode 100644 src/app/item-page/orcid-page/orcid-auth/orcid-auth.component.ts create mode 100644 src/app/item-page/orcid-page/orcid-page.component.html create mode 100644 src/app/item-page/orcid-page/orcid-page.component.scss create mode 100644 src/app/item-page/orcid-page/orcid-page.component.ts create mode 100644 src/app/item-page/orcid-page/orcid-page.guard.ts create mode 100644 src/app/shared/dso-page/dso-page-orcid-button/dso-page-orcid-button.component.html create mode 100644 src/app/shared/dso-page/dso-page-orcid-button/dso-page-orcid-button.component.scss create mode 100644 src/app/shared/dso-page/dso-page-orcid-button/dso-page-orcid-button.component.spec.ts create mode 100644 src/app/shared/dso-page/dso-page-orcid-button/dso-page-orcid-button.component.ts create mode 100644 src/assets/images/orcid.logo.icon.svg diff --git a/src/app/core/data/feature-authorization/feature-id.ts b/src/app/core/data/feature-authorization/feature-id.ts index 029c75d9cb..1576c37a83 100644 --- a/src/app/core/data/feature-authorization/feature-id.ts +++ b/src/app/core/data/feature-authorization/feature-id.ts @@ -28,4 +28,5 @@ export enum FeatureID { CanCreateVersion = 'canCreateVersion', CanViewUsageStatistics = 'canViewUsageStatistics', CanSendFeedback = 'canSendFeedback', + CanSynchronizeWithORCID = 'canSynchronizeWithORCID' } diff --git a/src/app/entity-groups/research-entities/item-pages/person/person.component.html b/src/app/entity-groups/research-entities/item-pages/person/person.component.html index 5c2fd227fd..31ad9b2463 100644 --- a/src/app/entity-groups/research-entities/item-pages/person/person.component.html +++ b/src/app/entity-groups/research-entities/item-pages/person/person.component.html @@ -3,6 +3,7 @@ {{'person.page.titleprefix' | translate}}
+
diff --git a/src/app/item-page/item-page-routing-paths.ts b/src/app/item-page/item-page-routing-paths.ts index 74ad0aae07..9da2f91431 100644 --- a/src/app/item-page/item-page-routing-paths.ts +++ b/src/app/item-page/item-page-routing-paths.ts @@ -50,3 +50,4 @@ export const ITEM_EDIT_PATH = 'edit'; export const ITEM_EDIT_VERSIONHISTORY_PATH = 'versionhistory'; export const ITEM_VERSION_PATH = 'version'; export const UPLOAD_BITSTREAM_PATH = 'bitstreams/new'; +export const ORCID_PATH = 'orcid'; \ No newline at end of file diff --git a/src/app/item-page/item-page-routing.module.ts b/src/app/item-page/item-page-routing.module.ts index 7d7912bb42..011d7bd83d 100644 --- a/src/app/item-page/item-page-routing.module.ts +++ b/src/app/item-page/item-page-routing.module.ts @@ -7,7 +7,7 @@ import { VersionResolver } from './version-page/version.resolver'; import { DSOBreadcrumbsService } from '../core/breadcrumbs/dso-breadcrumbs.service'; import { LinkService } from '../core/cache/builders/link.service'; import { UploadBitstreamComponent } from './bitstreams/upload/upload-bitstream.component'; -import { ITEM_EDIT_PATH, UPLOAD_BITSTREAM_PATH } from './item-page-routing-paths'; +import { ITEM_EDIT_PATH, ORCID_PATH, UPLOAD_BITSTREAM_PATH } from './item-page-routing-paths'; import { ItemPageAdministratorGuard } from './item-page-administrator.guard'; import { MenuItemType } from '../shared/menu/initial-menus-state'; import { LinkMenuItemModel } from '../shared/menu/menu-item/models/link.model'; @@ -16,6 +16,8 @@ import { ThemedFullItemPageComponent } from './full/themed-full-item-page.compon import { VersionPageComponent } from './version-page/version-page/version-page.component'; import { BitstreamRequestACopyPageComponent } from '../shared/bitstream-request-a-copy-page/bitstream-request-a-copy-page.component'; import { REQUEST_COPY_MODULE_PATH } from '../app-routing-paths'; +import { OrcidPageComponent } from './orcid-page/orcid-page.component'; +import { OrcidPageGuard } from './orcid-page/orcid-page.guard'; @NgModule({ imports: [ @@ -50,6 +52,11 @@ import { REQUEST_COPY_MODULE_PATH } from '../app-routing-paths'; { path: REQUEST_COPY_MODULE_PATH, component: BitstreamRequestACopyPageComponent, + }, + { + path: ORCID_PATH, + component: OrcidPageComponent, + canActivate: [OrcidPageGuard] } ], data: { @@ -88,6 +95,7 @@ import { REQUEST_COPY_MODULE_PATH } from '../app-routing-paths'; LinkService, ItemPageAdministratorGuard, VersionResolver, + OrcidPageGuard ] }) diff --git a/src/app/item-page/item-page.module.ts b/src/app/item-page/item-page.module.ts index 80cb1f61a2..f584164c97 100644 --- a/src/app/item-page/item-page.module.ts +++ b/src/app/item-page/item-page.module.ts @@ -34,6 +34,9 @@ import { MiradorViewerComponent } from './mirador-viewer/mirador-viewer.componen import { VersionPageComponent } from './version-page/version-page/version-page.component'; import { VersionedItemComponent } from './simple/item-types/versioned-item/versioned-item.component'; import { ThemedFileSectionComponent } from './simple/field-components/file-section/themed-file-section.component'; +import { OrcidAuthComponent } from './orcid-page/orcid-auth/orcid-auth.component'; +import { OrcidPageComponent } from './orcid-page/orcid-page.component'; +import { NgbAccordionModule } from '@ng-bootstrap/ng-bootstrap'; const ENTRY_COMPONENTS = [ @@ -67,6 +70,8 @@ const DECLARATIONS = [ MediaViewerImageComponent, MiradorViewerComponent, VersionPageComponent, + OrcidPageComponent, + OrcidAuthComponent ]; @NgModule({ @@ -79,6 +84,7 @@ const DECLARATIONS = [ JournalEntitiesModule.withEntryComponents(), ResearchEntitiesModule.withEntryComponents(), NgxGalleryModule, + NgbAccordionModule ], declarations: [ ...DECLARATIONS, diff --git a/src/app/item-page/orcid-page/orcid-auth/orcid-auth.component.html b/src/app/item-page/orcid-page/orcid-auth/orcid-auth.component.html new file mode 100644 index 0000000000..8e538b66aa --- /dev/null +++ b/src/app/item-page/orcid-page/orcid-auth/orcid-auth.component.html @@ -0,0 +1,71 @@ +
+ + + +
+ +
+
+
+
+ + +
+
+
{{ 'person.page.orcid.granted-authorizations'| translate }}
+
+
+
    +
  • {{getAuthorizationDescription(auth) | translate}}
  • +
+
+
+
+
+
{{ 'person.page.orcid.missing-authorizations'| translate }}
+
+
+
+ {{'person.page.orcid.no-missing-authorizations-message' | translate}} +
+
+ {{'person.page.orcid.missing-authorizations-message' | translate}} +
    +
  • {{getAuthorizationDescription(auth) | translate }}
  • +
+
+
+
+
+
+
+ {{ 'person.page.orcid.remove-orcid-message' | translate}} +
+
+
+ + +
+
+
+ + +
+
orcid-logo
+
{{ getOrcidNotLinkedMessage() | async }}
+
+
+
+ +
+
+
+
\ No newline at end of file diff --git a/src/app/item-page/orcid-page/orcid-auth/orcid-auth.component.scss b/src/app/item-page/orcid-page/orcid-auth/orcid-auth.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/item-page/orcid-page/orcid-auth/orcid-auth.component.ts b/src/app/item-page/orcid-page/orcid-auth/orcid-auth.component.ts new file mode 100644 index 0000000000..9651215dc6 --- /dev/null +++ b/src/app/item-page/orcid-page/orcid-auth/orcid-auth.component.ts @@ -0,0 +1,98 @@ +import { Component, Inject, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { TranslateService } from '@ngx-translate/core'; +import { BehaviorSubject, Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { ConfigurationDataService } from '../../../core/data/configuration-data.service'; +import { ItemDataService } from '../../../core/data/item-data.service'; +import { RemoteData } from '../../../core/data/remote-data'; +import { ResearcherProfileService } from '../../../core/profile/researcher-profile.service'; +import { NativeWindowRef, NativeWindowService } from '../../../core/services/window.service'; +import { Item } from '../../../core/shared/item.model'; +import { getFirstCompletedRemoteData, getFirstSucceededRemoteDataPayload } from '../../../core/shared/operators'; +import { NotificationsService } from '../../../shared/notifications/notifications.service'; + +@Component({ + selector: 'ds-orcid-auth', + templateUrl: './orcid-auth.component.html', + styleUrls: ['./orcid-auth.component.scss'] +}) +export class OrcidAuthComponent implements OnInit { + + missingAuthorizations$ = new BehaviorSubject([]); + + unlinkProcessing = false; + + item: Item + + constructor( + private configurationService: ConfigurationDataService, + private researcherProfileService: ResearcherProfileService, + protected translateService: TranslateService, + private notificationsService: NotificationsService, + private itemService: ItemDataService, + private route: ActivatedRoute, + @Inject(NativeWindowService) private _window: NativeWindowRef, + ) { + this.itemService.findById(this.route.snapshot.paramMap.get('id'), true, true).pipe(getFirstCompletedRemoteData()).subscribe((data: RemoteData) => { + this.item = data.payload; + }); + } + + ngOnInit() { + const scopes = this.getOrcidAuthorizations(); + return this.configurationService.findByPropertyName('orcid.scope') + .pipe(getFirstSucceededRemoteDataPayload(), + map((configurationProperty) => configurationProperty.values), + map((allScopes) => allScopes.filter((scope) => !scopes.includes(scope)))) + .subscribe((missingScopes) => this.missingAuthorizations$.next(missingScopes)); + } + + getOrcidAuthorizations(): string[] { + return this.item.allMetadataValues('cris.orcid.scope'); + } + + isLinkedToOrcid(): boolean { + return this.researcherProfileService.isLinkedToOrcid(this.item); + } + + getOrcidNotLinkedMessage(): Observable { + const orcid = this.item.firstMetadataValue('person.identifier.orcid'); + if (orcid) { + return this.translateService.get('person.page.orcid.orcid-not-linked-message', { 'orcid': orcid }); + } else { + return this.translateService.get('person.page.orcid.no-orcid-message'); + } + } + + getAuthorizationDescription(scope: string) { + return 'person.page.orcid.scope.' + scope.substring(1).replace('/', '-'); + } + + onlyAdminCanDisconnectProfileFromOrcid(): Observable { + return this.researcherProfileService.onlyAdminCanDisconnectProfileFromOrcid(); + } + + ownerCanDisconnectProfileFromOrcid(): Observable { + return this.researcherProfileService.ownerCanDisconnectProfileFromOrcid(); + } + + linkOrcid(): void { + this.researcherProfileService.getOrcidAuthorizeUrl(this.item).subscribe((authorizeUrl) => { + this._window.nativeWindow.location.href = authorizeUrl; + }); + } + + unlinkOrcid(): void { + this.unlinkProcessing = true; + this.researcherProfileService.unlinkOrcid(this.item).subscribe((remoteData) => { + this.unlinkProcessing = false; + if (remoteData.isSuccess) { + this.notificationsService.success(this.translateService.get('person.page.orcid.unlink.success')); + } else { + this.notificationsService.error(this.translateService.get('person.page.orcid.unlink.error')); + } + }); + } + +} diff --git a/src/app/item-page/orcid-page/orcid-page.component.html b/src/app/item-page/orcid-page/orcid-page.component.html new file mode 100644 index 0000000000..ba9f445ec2 --- /dev/null +++ b/src/app/item-page/orcid-page/orcid-page.component.html @@ -0,0 +1 @@ + diff --git a/src/app/item-page/orcid-page/orcid-page.component.scss b/src/app/item-page/orcid-page/orcid-page.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/item-page/orcid-page/orcid-page.component.ts b/src/app/item-page/orcid-page/orcid-page.component.ts new file mode 100644 index 0000000000..32b47e069f --- /dev/null +++ b/src/app/item-page/orcid-page/orcid-page.component.ts @@ -0,0 +1,9 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'ds-orcid-page', + templateUrl: './orcid-page.component.html', + styleUrls: ['./orcid-page.component.scss'] +}) +export class OrcidPageComponent { +} diff --git a/src/app/item-page/orcid-page/orcid-page.guard.ts b/src/app/item-page/orcid-page/orcid-page.guard.ts new file mode 100644 index 0000000000..97c528e9ae --- /dev/null +++ b/src/app/item-page/orcid-page/orcid-page.guard.ts @@ -0,0 +1,31 @@ +import { Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, Router, RouterStateSnapshot } from '@angular/router'; +import { Observable, of as observableOf } from 'rxjs'; +import { AuthService } from '../../core/auth/auth.service'; +import { AuthorizationDataService } from '../../core/data/feature-authorization/authorization-data.service'; +import { DsoPageSingleFeatureGuard } from '../../core/data/feature-authorization/feature-authorization-guard/dso-page-single-feature.guard'; +import { FeatureID } from '../../core/data/feature-authorization/feature-id'; +import { Item } from '../../core/shared/item.model'; +import { ItemPageResolver } from '../item-page.resolver'; + +@Injectable({ + providedIn: 'root' +}) +/** + * Guard for preventing unauthorized access to certain {@link Item} pages requiring administrator rights + */ +export class OrcidPageGuard extends DsoPageSingleFeatureGuard { + constructor(protected resolver: ItemPageResolver, + protected authorizationService: AuthorizationDataService, + protected router: Router, + protected authService: AuthService) { + super(resolver, authorizationService, router, authService); + } + + /** + * Check administrator authorization rights + */ + getFeatureID(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { + return observableOf(FeatureID.CanSynchronizeWithORCID); + } +} diff --git a/src/app/shared/dso-page/dso-page-orcid-button/dso-page-orcid-button.component.html b/src/app/shared/dso-page/dso-page-orcid-button/dso-page-orcid-button.component.html new file mode 100644 index 0000000000..7a3383fd1a --- /dev/null +++ b/src/app/shared/dso-page/dso-page-orcid-button/dso-page-orcid-button.component.html @@ -0,0 +1,5 @@ +ORCID + diff --git a/src/app/shared/dso-page/dso-page-orcid-button/dso-page-orcid-button.component.scss b/src/app/shared/dso-page/dso-page-orcid-button/dso-page-orcid-button.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/shared/dso-page/dso-page-orcid-button/dso-page-orcid-button.component.spec.ts b/src/app/shared/dso-page/dso-page-orcid-button/dso-page-orcid-button.component.spec.ts new file mode 100644 index 0000000000..9de3333b7f --- /dev/null +++ b/src/app/shared/dso-page/dso-page-orcid-button/dso-page-orcid-button.component.spec.ts @@ -0,0 +1,76 @@ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { DSpaceObject } from '../../../core/shared/dspace-object.model'; +import { Item } from '../../../core/shared/item.model'; +import { AuthorizationDataService } from '../../../core/data/feature-authorization/authorization-data.service'; +import { of as observableOf } from 'rxjs'; +import { TranslateModule } from '@ngx-translate/core'; +import { RouterTestingModule } from '@angular/router/testing'; +import { FeatureID } from '../../../core/data/feature-authorization/feature-id'; +import { By } from '@angular/platform-browser'; +import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; +import { DsoPageOrcidButtonComponent } from './dso-page-orcid-button.component'; + +describe('DsoPageOrcidButtonComponent', () => { + let component: DsoPageOrcidButtonComponent; + let fixture: ComponentFixture; + + let authorizationService: AuthorizationDataService; + let dso: DSpaceObject; + + beforeEach(waitForAsync(() => { + dso = Object.assign(new Item(), { + id: 'test-item', + _links: { + self: { href: 'test-item-selflink' } + } + }); + authorizationService = jasmine.createSpyObj('authorizationService', { + isAuthorized: observableOf(true) + }); + TestBed.configureTestingModule({ + declarations: [DsoPageOrcidButtonComponent], + imports: [TranslateModule.forRoot(), RouterTestingModule.withRoutes([]), NgbModule], + providers: [ + { provide: AuthorizationDataService, useValue: authorizationService } + ] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DsoPageOrcidButtonComponent); + component = fixture.componentInstance; + component.dso = dso; + component.pageRoute = 'test'; + fixture.detectChanges(); + }); + + it('should check the authorization of the current user', () => { + expect(authorizationService.isAuthorized).toHaveBeenCalledWith(FeatureID.CanEditOrcid, dso.self); + }); + + describe('when the user is authorized', () => { + beforeEach(() => { + (authorizationService.isAuthorized as jasmine.Spy).and.returnValue(observableOf(true)); + component.ngOnInit(); + fixture.detectChanges(); + }); + + it('should render a link', () => { + const link = fixture.debugElement.query(By.css('a')); + expect(link).not.toBeNull(); + }); + }); + + describe('when the user is not authorized', () => { + beforeEach(() => { + (authorizationService.isAuthorized as jasmine.Spy).and.returnValue(observableOf(false)); + component.ngOnInit(); + fixture.detectChanges(); + }); + + it('should not render a link', () => { + const link = fixture.debugElement.query(By.css('a')); + expect(link).toBeNull(); + }); + }); +}); diff --git a/src/app/shared/dso-page/dso-page-orcid-button/dso-page-orcid-button.component.ts b/src/app/shared/dso-page/dso-page-orcid-button/dso-page-orcid-button.component.ts new file mode 100644 index 0000000000..9f244da7c9 --- /dev/null +++ b/src/app/shared/dso-page/dso-page-orcid-button/dso-page-orcid-button.component.ts @@ -0,0 +1,43 @@ +import { Component, Input, OnInit } from '@angular/core'; +import { BehaviorSubject } from 'rxjs'; +import { take } from 'rxjs/operators'; +import { AuthorizationDataService } from 'src/app/core/data/feature-authorization/authorization-data.service'; +import { FeatureID } from 'src/app/core/data/feature-authorization/feature-id'; +import { DSpaceObject } from 'src/app/core/shared/dspace-object.model'; + +@Component({ + selector: 'ds-dso-page-orcid-button', + templateUrl: './dso-page-orcid-button.component.html', + styleUrls: ['./dso-page-orcid-button.component.scss'] +}) +export class DsoPageOrcidButtonComponent implements OnInit { + /** + * The DSpaceObject to display a button to the edit page for + */ + @Input() dso: DSpaceObject; + + /** + * The prefix of the route to the edit page (before the object's UUID, e.g. "items") + */ + @Input() pageRoute: string; + + /** + * A message for the tooltip on the button + * Supports i18n keys + */ + @Input() tooltipMsg: string; + + /** + * Whether or not the current user is authorized to edit the DSpaceObject + */ + isAuthorized: BehaviorSubject = new BehaviorSubject(false); + + constructor(protected authorizationService: AuthorizationDataService) { } + + ngOnInit() { + this.authorizationService.isAuthorized(FeatureID.CanSynchronizeWithORCID, this.dso.self).pipe(take(1)).subscribe((isAuthorized: boolean) => { + this.isAuthorized.next(isAuthorized); + }); + } + +} diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index 01649ee947..fcd80683b7 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -174,6 +174,7 @@ import { DsSelectComponent } from './ds-select/ds-select.component'; import { LogInOidcComponent } from './log-in/methods/oidc/log-in-oidc.component'; import { ThemedItemListPreviewComponent } from './object-list/my-dspace-result-list-element/item-list-preview/themed-item-list-preview.component'; import { ClaimItemSelectorComponent } from './dso-selector/modal-wrappers/claim-item-selector/claim-item-selector.component'; +import { DsoPageOrcidButtonComponent } from './dso-page/dso-page-orcid-button/dso-page-orcid-button.component'; const MODULES = [ // Do NOT include UniversalModule, HttpModule, or JsonpModule here @@ -414,6 +415,7 @@ const SHARED_ITEM_PAGE_COMPONENTS = [ GenericItemPageFieldComponent, MetadataRepresentationListComponent, RelatedItemsComponent, + DsoPageOrcidButtonComponent ]; diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index d0ff85ba51..8ef1135910 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -4208,4 +4208,195 @@ "researcherprofile.success.claim.body" : "Profile claimed with success", "researcherprofile.success.claim.title" : "Success", + + "person.page.orcid": "ORCID", + + "person.page.orcid.create": "Create an ORCID ID", + + "person.page.orcid.granted-authorizations": "Granted authorizations", + + "person.page.orcid.grant-authorizations" : "Grant authorizations", + + "person.page.orcid.link": "Connect to ORCID ID", + + "person.page.orcid.orcid-not-linked-message": "The ORCID iD of this profile ({{ orcid }}) has not yet been connected to an account on the ORCID registry or the connection is expired.", + + "person.page.orcid.unlink": "Disconnect from ORCID", + + "person.page.orcid.unlink.processing": "Processing...", + + "person.page.orcid.missing-authorizations": "Missing authorizations", + + "person.page.orcid.missing-authorizations-message": "The following authorizations are missing:", + + "person.page.orcid.no-missing-authorizations-message": "Great! This box is empty, so you have granted all access rights to use all functions offers by your institution.", + + "person.page.orcid.no-orcid-message": "No ORCID iD associated yet. By clicking on the button below it is possible to link this profile with an ORCID account.", + + "person.page.orcid.profile-preferences": "Profile preferences", + + "person.page.orcid.funding-preferences": "Funding preferences", + + "person.page.orcid.publications-preferences": "Publication preferences", + + "person.page.orcid.remove-orcid-message": "If you need to remove your ORCID, please contact the repository administrator", + + "person.page.orcid.save.preference.changes": "Update settings", + + "person.page.orcid.sync-profile.affiliation" : "Affiliation", + + "person.page.orcid.sync-profile.biographical" : "Biographical data", + + "person.page.orcid.sync-profile.education" : "Education", + + "person.page.orcid.sync-profile.identifiers" : "Identifiers", + + "person.page.orcid.sync-fundings.all" : "All fundings", + + "person.page.orcid.sync-fundings.mine" : "My fundings", + + "person.page.orcid.sync-fundings.my_selected" : "Selected fundings", + + "person.page.orcid.sync-fundings.disabled" : "Disabled", + + "person.page.orcid.sync-publications.all" : "All publications", + + "person.page.orcid.sync-publications.mine" : "My publications", + + "person.page.orcid.sync-publications.my_selected" : "Selected publications", + + "person.page.orcid.sync-publications.disabled" : "Disabled", + + "person.page.orcid.sync-queue.discard" : "Discard the change and do not synchronize with the ORCID registry", + + "person.page.orcid.sync-queue.discard.error": "The discarding of the ORCID queue record failed", + + "person.page.orcid.sync-queue.discard.success": "The ORCID queue record have been discarded successfully", + + "person.page.orcid.sync-queue.empty-message": "The ORCID queue registry is empty", + + "person.page.orcid.sync-queue.description" : "Description", + + "person.page.orcid.sync-queue.description.affiliation": "Affiliations", + + "person.page.orcid.sync-queue.description.country": "Country", + + "person.page.orcid.sync-queue.description.education": "Educations", + + "person.page.orcid.sync-queue.description.external_ids": "External ids", + + "person.page.orcid.sync-queue.description.other_names": "Other names", + + "person.page.orcid.sync-queue.description.qualification": "Qualifications", + + "person.page.orcid.sync-queue.description.researcher_urls": "Researcher urls", + + "person.page.orcid.sync-queue.description.keywords": "Keywords", + + "person.page.orcid.sync-queue.tooltip.insert": "Add a new entry in the ORCID registry", + + "person.page.orcid.sync-queue.tooltip.update": "Update this entry on the ORCID registry", + + "person.page.orcid.sync-queue.tooltip.delete": "Remove this entry from the ORCID registry", + + "person.page.orcid.sync-queue.tooltip.publication": "Publication", + + "person.page.orcid.sync-queue.tooltip.funding": "Funding", + + "person.page.orcid.sync-queue.tooltip.affiliation": "Affiliation", + + "person.page.orcid.sync-queue.tooltip.education": "Education", + + "person.page.orcid.sync-queue.tooltip.qualification": "Qualification", + + "person.page.orcid.sync-queue.tooltip.other_names": "Other name", + + "person.page.orcid.sync-queue.tooltip.country": "Country", + + "person.page.orcid.sync-queue.tooltip.keywords": "Keyword", + + "person.page.orcid.sync-queue.tooltip.external_ids": "External identifier", + + "person.page.orcid.sync-queue.tooltip.researcher_urls": "Researcher url", + + "person.page.orcid.sync-queue.send" : "Synchronize with ORCID registry", + + "person.page.orcid.sync-queue.send.unauthorized-error.title": "The submission to ORCID failed for missing authorizations.", + + "person.page.orcid.sync-queue.send.unauthorized-error.content": "Click here to grant again the required permissions. If the problem persists, contact the administrator", + + "person.page.orcid.sync-queue.send.bad-request-error": "The submission to ORCID failed because the resource sent to ORCID registry is not valid", + + "person.page.orcid.sync-queue.send.error": "The submission to ORCID failed", + + "person.page.orcid.sync-queue.send.conflict-error": "The submission to ORCID failed because the resource is already present on the ORCID registry", + + "person.page.orcid.sync-queue.send.not-found-warning": "The resource does not exists anymore on the ORCID registry.", + + "person.page.orcid.sync-queue.send.success": "The submission to ORCID was completed successfully", + + "person.page.orcid.sync-queue.send.validation-error": "The data that you want to synchronize with ORCID is not valid", + + "person.page.orcid.sync-queue.send.validation-error.amount-currency.required": "The amount's currency is required", + + "person.page.orcid.sync-queue.send.validation-error.external-id.required": "The resource to be sent requires at least one identifier", + + "person.page.orcid.sync-queue.send.validation-error.title.required": "The title is required", + + "person.page.orcid.sync-queue.send.validation-error.type.required": "The type is required", + + "person.page.orcid.sync-queue.send.validation-error.start-date.required": "The start date is required", + + "person.page.orcid.sync-queue.send.validation-error.funder.required": "The funder is required", + + "person.page.orcid.sync-queue.send.validation-error.organization.required": "The organization is required", + + "person.page.orcid.sync-queue.send.validation-error.organization.name-required": "The organization's name is required", + + "person.page.orcid.sync-queue.send.validation-error.organization.address-required": "The organization to be sent requires an address", + + "person.page.orcid.sync-queue.send.validation-error.organization.city-required": "The address of the organization to be sent requires a city", + + "person.page.orcid.sync-queue.send.validation-error.organization.country-required": "The address of the organization to be sent requires a country", + + "person.page.orcid.sync-queue.send.validation-error.disambiguated-organization.required": "An identifier to disambiguate organizations is required. Supported ids are GRID, Ringgold, Legal Entity identifiers (LEIs) and Crossref Funder Registry identifiers", + + "person.page.orcid.sync-queue.send.validation-error.disambiguated-organization.value-required": "The organization's identifiers requires a value", + + "person.page.orcid.sync-queue.send.validation-error.disambiguation-source.required": "The organization's identifiers requires a source", + + "person.page.orcid.sync-queue.send.validation-error.disambiguation-source.invalid": "The source of one of the organization identifiers is invalid. Supported sources are RINGGOLD, GRID, LEI and FUNDREF", + + "person.page.orcid.synchronization-mode": "Synchronization mode", + + "person.page.orcid.synchronization-mode.batch": "Batch", + + "person.page.orcid.synchronization-mode.label": "Synchronization mode", + + "person.page.orcid.synchronization-mode-message": "Enable 'Manual' Synchronization mode to disable batch synchronization, so you must send your data to ORCID Registry manually", + + "person.page.orcid.synchronization-settings-update.success": "The synchronization settings have been updated successfully", + + "person.page.orcid.synchronization-settings-update.error": "The update of the synchronization settings failed", + + "person.page.orcid.synchronization-mode.manual": "Manual", + + "person.page.orcid.scope.authenticate": "Get your ORCID iD", + + "person.page.orcid.scope.read-limited": "Read your information with visibility set to Trusted Parties", + + "person.page.orcid.scope.activities-update": "Add/update your research activities", + + "person.page.orcid.scope.person-update": "Add/update other information about you", + + "person.page.orcid.unlink.success": "The disconnection between the profile and the ORCID registry was successful", + + "person.page.orcid.unlink.error": "An error occurred while disconnecting between the profile and the ORCID registry. Try again", + + "person.orcid.sync.setting": "ORCID Synchronization settings", + + "person.orcid.registry.queue": "ORCID Registry Queue", + + "person.orcid.registry.auth": "ORCID Authorizations", + } diff --git a/src/assets/images/orcid.logo.icon.svg b/src/assets/images/orcid.logo.icon.svg new file mode 100644 index 0000000000..8aec5959e5 --- /dev/null +++ b/src/assets/images/orcid.logo.icon.svg @@ -0,0 +1,21 @@ + + + + Orcid logo + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/styles/_global-styles.scss b/src/styles/_global-styles.scss index cf251204e2..7d9550c0fd 100644 --- a/src/styles/_global-styles.scss +++ b/src/styles/_global-styles.scss @@ -97,4 +97,15 @@ ngb-modal-backdrop { } .researcher-profile-switch .switch.checked{ color: #fff; +} + +.custom-accordion .card-header button { + -webkit-box-shadow: none!important; + box-shadow: none!important; + width: 100%; +} +.custom-accordion .card:first-of-type { + border-bottom: var(--bs-card-border-width) solid var(--bs-card-border-color)!important; + border-bottom-left-radius: var(--bs-card-border-radius)!important; + border-bottom-right-radius: var(--bs-card-border-radius)!important; } \ No newline at end of file From dd4ff5e40c456da430b90d1c868fe5ce8adc81b6 Mon Sep 17 00:00:00 2001 From: Pratik Rajkotiya Date: Wed, 13 Apr 2022 17:54:29 +0530 Subject: [PATCH 020/343] [CST-5338] ORCID Settings added. --- src/app/item-page/item-page.module.ts | 4 +- .../orcid-page/orcid-page.component.html | 1 + .../orcid-sync/orcid-setting.component.html | 82 +++++++++++ .../orcid-sync/orcid-setting.component.scss | 0 .../orcid-sync/orcid-setting.component.ts | 139 ++++++++++++++++++ 5 files changed, 225 insertions(+), 1 deletion(-) create mode 100644 src/app/item-page/orcid-page/orcid-sync/orcid-setting.component.html create mode 100644 src/app/item-page/orcid-page/orcid-sync/orcid-setting.component.scss create mode 100644 src/app/item-page/orcid-page/orcid-sync/orcid-setting.component.ts diff --git a/src/app/item-page/item-page.module.ts b/src/app/item-page/item-page.module.ts index f584164c97..2c4b57b249 100644 --- a/src/app/item-page/item-page.module.ts +++ b/src/app/item-page/item-page.module.ts @@ -37,6 +37,7 @@ import { ThemedFileSectionComponent } from './simple/field-components/file-secti import { OrcidAuthComponent } from './orcid-page/orcid-auth/orcid-auth.component'; import { OrcidPageComponent } from './orcid-page/orcid-page.component'; import { NgbAccordionModule } from '@ng-bootstrap/ng-bootstrap'; +import { OrcidSettingComponent } from './orcid-page/orcid-sync/orcid-setting.component'; const ENTRY_COMPONENTS = [ @@ -71,7 +72,8 @@ const DECLARATIONS = [ MiradorViewerComponent, VersionPageComponent, OrcidPageComponent, - OrcidAuthComponent + OrcidAuthComponent, + OrcidSettingComponent ]; @NgModule({ diff --git a/src/app/item-page/orcid-page/orcid-page.component.html b/src/app/item-page/orcid-page/orcid-page.component.html index ba9f445ec2..4e62a8d51c 100644 --- a/src/app/item-page/orcid-page/orcid-page.component.html +++ b/src/app/item-page/orcid-page/orcid-page.component.html @@ -1 +1,2 @@ + diff --git a/src/app/item-page/orcid-page/orcid-sync/orcid-setting.component.html b/src/app/item-page/orcid-page/orcid-sync/orcid-setting.component.html new file mode 100644 index 0000000000..793e7570ed --- /dev/null +++ b/src/app/item-page/orcid-page/orcid-sync/orcid-setting.component.html @@ -0,0 +1,82 @@ +
+ + + +
+
+
+ {{ 'person.page.orcid.synchronization-mode-message' | translate}} +
+
+
+
{{ 'person.page.orcid.synchronization-mode'| translate }}
+
+
+
+ + +
+
+
+
+
+
+
+
{{ 'person.page.orcid.publications-preferences'| translate }}
+
+
+
+
+ + +
+
+
+
+
+
+
{{ 'person.page.orcid.funding-preferences'| translate }}
+
+
+
+
+ + +
+
+
+
+
+
+
{{ 'person.page.orcid.profile-preferences'| translate }}
+
+
+
+
+ + +
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
\ No newline at end of file diff --git a/src/app/item-page/orcid-page/orcid-sync/orcid-setting.component.scss b/src/app/item-page/orcid-page/orcid-sync/orcid-setting.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/item-page/orcid-page/orcid-sync/orcid-setting.component.ts b/src/app/item-page/orcid-page/orcid-sync/orcid-setting.component.ts new file mode 100644 index 0000000000..87385f0780 --- /dev/null +++ b/src/app/item-page/orcid-page/orcid-sync/orcid-setting.component.ts @@ -0,0 +1,139 @@ +import { Component, OnInit } from '@angular/core'; +import { FormGroup } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; +import { TranslateService } from '@ngx-translate/core'; +import { Operation } from 'fast-json-patch'; +import { switchMap } from 'rxjs/operators'; +import { AuthService } from '../../../core/auth/auth.service'; +import { ItemDataService } from '../../../core/data/item-data.service'; +import { RemoteData } from '../../../core/data/remote-data'; +import { ResearcherProfileService } from '../../../core/profile/researcher-profile.service'; +import { Item } from '../../../core/shared/item.model'; +import { getFinishedRemoteData, getFirstCompletedRemoteData } from '../../../core/shared/operators'; +import { NotificationsService } from '../../../shared/notifications/notifications.service'; + +@Component({ + selector: 'ds-orcid-setting', + templateUrl: './orcid-setting.component.html', + styleUrls: ['./orcid-setting.component.scss'] +}) +export class OrcidSettingComponent implements OnInit { + + messagePrefix = 'person.page.orcid'; + + currentSyncMode: string; + + currentSyncPublications: string; + + currentSyncFundings: string; + + syncModes: { value: string, label: string }[]; + + syncPublicationOptions: { value: string, label: string }[]; + + syncFundingOptions: {value: string, label: string}[]; + + syncProfileOptions: { value: string, label: string, checked: boolean }[]; + + item: Item; + + constructor(private researcherProfileService: ResearcherProfileService, + protected translateService: TranslateService, + private notificationsService: NotificationsService, + public authService: AuthService, + private route: ActivatedRoute, + private itemService: ItemDataService + ) { + this.itemService.findById(this.route.snapshot.paramMap.get('id'), true, true).pipe(getFirstCompletedRemoteData()).subscribe((data: RemoteData) => { + this.item = data.payload; + }); + } + + ngOnInit() { + this.syncModes = [ + { + label: this.messagePrefix + '.synchronization-mode.batch', + value: 'BATCH' + }, + { + label: this.messagePrefix + '.synchronization-mode.manual', + value: 'MANUAL' + } + ]; + + this.syncPublicationOptions = ['DISABLED', 'ALL'] + .map((value) => { + return { + label: this.messagePrefix + '.sync-publications.' + value.toLowerCase(), + value: value, + }; + }); + + this.syncFundingOptions = ['DISABLED', 'ALL'] + .map((value) => { + return { + label: this.messagePrefix + '.sync-fundings.' + value.toLowerCase(), + value: value, + }; + }); + + const syncProfilePreferences = this.item.allMetadataValues('cris.orcid.sync-profile'); + + this.syncProfileOptions = ['AFFILIATION', 'EDUCATION', 'BIOGRAPHICAL', 'IDENTIFIERS'] + .map((value) => { + return { + label: this.messagePrefix + '.sync-profile.' + value.toLowerCase(), + value: value, + checked: syncProfilePreferences.includes(value) + }; + }); + + this.currentSyncMode = this.getCurrentPreference('cris.orcid.sync-mode', ['BATCH, MANUAL'], 'MANUAL'); + this.currentSyncPublications = this.getCurrentPreference('cris.orcid.sync-publications', ['DISABLED', 'ALL'], 'DISABLED'); + this.currentSyncFundings = this.getCurrentPreference('cris.orcid.sync-fundings', ['DISABLED', 'ALL'], 'DISABLED'); + } + + onSubmit(form: FormGroup) { + const operations: Operation[] = []; + this.fillOperationsFor(operations, '/orcid/mode', form.value.syncMode); + this.fillOperationsFor(operations, '/orcid/publications', form.value.syncPublications); + this.fillOperationsFor(operations, '/orcid/fundings', form.value.syncFundings); + + const syncProfileValue = this.syncProfileOptions + .map((syncProfileOption => syncProfileOption.value)) + .filter((value) => form.value['syncProfile_' + value]) + .join(','); + + this.fillOperationsFor(operations, '/orcid/profile', syncProfileValue); + + if (operations.length === 0) { + return; + } + + this.researcherProfileService.findById(this.item.firstMetadata('cris.owner').authority).pipe( + switchMap((profile) => this.researcherProfileService.patch(profile, operations)), + getFinishedRemoteData() + ).subscribe((remoteData) => { + if (remoteData.isSuccess) { + this.notificationsService.success(this.translateService.get(this.messagePrefix + '.synchronization-settings-update.success')); + } else { + this.notificationsService.error(this.translateService.get(this.messagePrefix + '.synchronization-settings-update.error')); + } + }); + } + + fillOperationsFor(operations: Operation[], path: string, currentValue: string) { + operations.push({ + path: path, + op: 'replace', + value: currentValue + }); + } + + getCurrentPreference(metadataField: string, allowedValues: string[], defaultValue: string): string { + const currentPreference = this.item.firstMetadataValue(metadataField); + return (currentPreference && allowedValues.includes(currentPreference)) ? currentPreference : defaultValue; + } + + +} From a9162eb9205c920f1d64857851117514a8c2beca Mon Sep 17 00:00:00 2001 From: Pratik Rajkotiya Date: Wed, 13 Apr 2022 18:20:16 +0530 Subject: [PATCH 021/343] [CST-5339] ORCID queue added. --- src/app/core/core.module.ts | 12 +- .../core/orcid/model/orcid-history.model.ts | 89 +++++++ .../model/orcid-history.resource-type.ts | 9 + src/app/core/orcid/model/orcid-queue.model.ts | 68 +++++ .../orcid/model/orcid-queue.resource-type.ts | 9 + src/app/core/orcid/orcid-history.service.ts | 95 +++++++ src/app/core/orcid/orcid-queue.service.ts | 124 +++++++++ src/app/item-page/item-page.module.ts | 4 +- .../orcid-page/orcid-page.component.html | 1 + .../orcid-queue/orcid-queue.component.html | 59 +++++ .../orcid-queue/orcid-queue.component.scss | 0 .../orcid-queue/orcid-queue.component.ts | 250 ++++++++++++++++++ 12 files changed, 717 insertions(+), 3 deletions(-) create mode 100644 src/app/core/orcid/model/orcid-history.model.ts create mode 100644 src/app/core/orcid/model/orcid-history.resource-type.ts create mode 100644 src/app/core/orcid/model/orcid-queue.model.ts create mode 100644 src/app/core/orcid/model/orcid-queue.resource-type.ts create mode 100644 src/app/core/orcid/orcid-history.service.ts create mode 100644 src/app/core/orcid/orcid-queue.service.ts create mode 100644 src/app/item-page/orcid-page/orcid-queue/orcid-queue.component.html create mode 100644 src/app/item-page/orcid-page/orcid-queue/orcid-queue.component.scss create mode 100644 src/app/item-page/orcid-page/orcid-queue/orcid-queue.component.ts diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index 7e97c78b3b..3f2737f30d 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -165,6 +165,10 @@ import { SubmissionAccessesModel } from './config/models/config-submission-acces import { ResearcherProfileService } from './profile/researcher-profile.service'; import { ProfileClaimService } from '../profile-page/profile-claim/profile-claim.service'; import { ResearcherProfile } from './profile/model/researcher-profile.model'; +import { OrcidQueueService } from './orcid/orcid-queue.service'; +import { OrcidHistoryService } from './orcid/orcid-history.service'; +import { OrcidQueue } from './orcid/model/orcid-queue.model'; +import { OrcidHistory } from './orcid/model/orcid-history.model'; /** * When not in production, endpoint responses can be mocked for testing purposes @@ -290,7 +294,9 @@ const PROVIDERS = [ GroupDataService, FeedbackDataService, ResearcherProfileService, - ProfileClaimService + ProfileClaimService, + OrcidQueueService, + OrcidHistoryService, ]; /** @@ -351,7 +357,9 @@ export const models = Root, SearchConfig, SubmissionAccessesModel, - ResearcherProfile + ResearcherProfile, + OrcidQueue, + OrcidHistory, ]; @NgModule({ diff --git a/src/app/core/orcid/model/orcid-history.model.ts b/src/app/core/orcid/model/orcid-history.model.ts new file mode 100644 index 0000000000..207a0c4df9 --- /dev/null +++ b/src/app/core/orcid/model/orcid-history.model.ts @@ -0,0 +1,89 @@ +import { autoserialize, deserialize } from 'cerialize'; +import { typedObject } from '../../cache/builders/build-decorators'; +import { CacheableObject } from '../../cache/object-cache.reducer'; +import { HALLink } from '../../shared/hal-link.model'; +import { ResourceType } from '../../shared/resource-type'; +import { excludeFromEquals } from '../../utilities/equals.decorators'; +import { ORCID_HISTORY } from './orcid-history.resource-type'; + +/** + * Class the represents a Orcid History. + */ +@typedObject +export class OrcidHistory extends CacheableObject { + + static type = ORCID_HISTORY; + + /** + * The object type + */ + @excludeFromEquals + @autoserialize + type: ResourceType; + + /** + * The identifier of this Orcid History record + */ + @autoserialize + id: number; + + /** + * The name of the related entity + */ + @autoserialize + entityName: string; + + /** + * The identifier of the owner of this Orcid History record. + */ + @autoserialize + ownerId: string; + + /** + * The identifier of the entity related to this Orcid History record. + */ + @autoserialize + entityId: string; + + /** + * The type of the entity related to this Orcid History record. + */ + @autoserialize + entityType: string; + + /** + * The response status coming from ORCID api. + */ + @autoserialize + status: number; + + /** + * The putCode assigned by ORCID to the entity. + */ + @autoserialize + putCode: string; + + /** + * The last send attempt timestamp. + */ + lastAttempt: string; + + /** + * The success send attempt timestamp. + */ + successAttempt: string; + + /** + * The response coming from ORCID. + */ + responseMessage: string; + + /** + * The {@link HALLink}s for this Orcid History record + */ + @deserialize + _links: { + self: HALLink, + }; + +} diff --git a/src/app/core/orcid/model/orcid-history.resource-type.ts b/src/app/core/orcid/model/orcid-history.resource-type.ts new file mode 100644 index 0000000000..45da8cbf68 --- /dev/null +++ b/src/app/core/orcid/model/orcid-history.resource-type.ts @@ -0,0 +1,9 @@ +import { ResourceType } from '../../shared/resource-type'; + +/** + * The resource type for OrcidHistory + * + * Needs to be in a separate file to prevent circular + * dependencies in webpack. + */ +export const ORCID_HISTORY = new ResourceType('orcidhistory'); diff --git a/src/app/core/orcid/model/orcid-queue.model.ts b/src/app/core/orcid/model/orcid-queue.model.ts new file mode 100644 index 0000000000..52ab8676ad --- /dev/null +++ b/src/app/core/orcid/model/orcid-queue.model.ts @@ -0,0 +1,68 @@ +import { autoserialize, deserialize } from 'cerialize'; +import { typedObject } from '../../cache/builders/build-decorators'; +import { CacheableObject } from '../../cache/object-cache.reducer'; +import { HALLink } from '../../shared/hal-link.model'; +import { ResourceType } from '../../shared/resource-type'; +import { excludeFromEquals } from '../../utilities/equals.decorators'; +import { ORCID_QUEUE } from './orcid-queue.resource-type'; + +/** + * Class the represents a Orcid Queue. + */ +@typedObject +export class OrcidQueue extends CacheableObject { + + static type = ORCID_QUEUE; + + /** + * The object type + */ + @excludeFromEquals + @autoserialize + type: ResourceType; + + /** + * The identifier of this Orcid Queue record + */ + @autoserialize + id: number; + + /** + * The record description. + */ + @autoserialize + description: string; + + /** + * The identifier of the owner of this Orcid Queue record. + */ + @autoserialize + ownerId: string; + + /** + * The identifier of the entity related to this Orcid Queue record. + */ + @autoserialize + entityId: string; + + /** + * The type of this Orcid Queue record. + */ + @autoserialize + recordType: string; + + /** + * The operation related to this Orcid Queue record. + */ + @autoserialize + operation: string; + + /** + * The {@link HALLink}s for this Orcid Queue record + */ + @deserialize + _links: { + self: HALLink, + }; + +} diff --git a/src/app/core/orcid/model/orcid-queue.resource-type.ts b/src/app/core/orcid/model/orcid-queue.resource-type.ts new file mode 100644 index 0000000000..a7f40d70ec --- /dev/null +++ b/src/app/core/orcid/model/orcid-queue.resource-type.ts @@ -0,0 +1,9 @@ +import { ResourceType } from '../../shared/resource-type'; + +/** + * The resource type for OrcidQueue + * + * Needs to be in a separate file to prevent circular + * dependencies in webpack. + */ +export const ORCID_QUEUE = new ResourceType('orcidqueue'); diff --git a/src/app/core/orcid/orcid-history.service.ts b/src/app/core/orcid/orcid-history.service.ts new file mode 100644 index 0000000000..03eb497956 --- /dev/null +++ b/src/app/core/orcid/orcid-history.service.ts @@ -0,0 +1,95 @@ +/* tslint:disable:max-classes-per-file */ + +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { Store } from '@ngrx/store'; +import { Observable } from 'rxjs'; +import { catchError, distinctUntilChanged, map, switchMap, tap } from 'rxjs/operators'; +import { isNotEmpty } from '../../shared/empty.util'; +import { NotificationsService } from '../../shared/notifications/notifications.service'; +import { createFailedRemoteDataObject$ } from '../../shared/remote-data.utils'; +import { dataService } from '../cache/builders/build-decorators'; +import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; +import { ObjectCacheService } from '../cache/object-cache.service'; +import { RestResponse } from '../cache/response.models'; +import { CoreState } from '../core.reducers'; +import { DataService } from '../data/data.service'; +import { DefaultChangeAnalyzer } from '../data/default-change-analyzer.service'; +import { ItemDataService } from '../data/item-data.service'; +import { RemoteData } from '../data/remote-data'; +import { PostRequest, RestRequest } from '../data/request.models'; +import { RequestService } from '../data/request.service'; +import { HALEndpointService } from '../shared/hal-endpoint.service'; +import { getFinishedRemoteData, getResponseFromEntry, sendRequest } from '../shared/operators'; +import { OrcidHistory } from './model/orcid-history.model'; +import { ORCID_HISTORY } from './model/orcid-history.resource-type'; +import { OrcidQueue } from './model/orcid-queue.model'; +import { HttpOptions } from '../dspace-rest/dspace-rest.service'; + +/** + * A private DataService implementation to delegate specific methods to. + */ +class OrcidHistoryServiceImpl extends DataService { + public linkPath = 'orcidhistories'; + + constructor( + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected store: Store, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + protected notificationsService: NotificationsService, + protected http: HttpClient, + protected comparator: DefaultChangeAnalyzer) { + super(); + } + +} + +/** + * A service that provides methods to make REST requests with Orcid History endpoint. + */ +@Injectable() +@dataService(ORCID_HISTORY) +export class OrcidHistoryService { + + dataService: OrcidHistoryServiceImpl; + + responseMsToLive: number = 10 * 1000; + + constructor( + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected store: Store, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + protected notificationsService: NotificationsService, + protected http: HttpClient, + protected comparator: DefaultChangeAnalyzer, + protected itemService: ItemDataService ) { + + this.dataService = new OrcidHistoryServiceImpl(requestService, rdbService, store, objectCache, halService, + notificationsService, http, comparator); + + } + + sendToORCID(orcidQueue: OrcidQueue): Observable> { + const requestId = this.requestService.generateRequestId(); + return this.getEndpoint().pipe( + map((endpointURL: string) => { + const options: HttpOptions = Object.create({}); + let headers = new HttpHeaders(); + headers = headers.append('Content-Type', 'text/uri-list'); + options.headers = headers; + return new PostRequest(requestId, endpointURL, orcidQueue._links.self.href, options); + }), + sendRequest(this.requestService), + switchMap((request: RestRequest) => this.rdbService.buildFromRequestUUID(request.uuid) as Observable>) + ); + } + + getEndpoint(): Observable { + return this.halService.getEndpoint(this.dataService.linkPath); + } + +} diff --git a/src/app/core/orcid/orcid-queue.service.ts b/src/app/core/orcid/orcid-queue.service.ts new file mode 100644 index 0000000000..7cf43a9aa0 --- /dev/null +++ b/src/app/core/orcid/orcid-queue.service.ts @@ -0,0 +1,124 @@ +/* tslint:disable:max-classes-per-file */ + +import { DataService } from '../data/data.service'; +import { OrcidQueue } from './model/orcid-queue.model'; +import { RequestService } from '../data/request.service'; +import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; +import { Store } from '@ngrx/store'; +import { CoreState } from '../core.reducers'; +import { ObjectCacheService } from '../cache/object-cache.service'; +import { HALEndpointService } from '../shared/hal-endpoint.service'; +import { NotificationsService } from '../../shared/notifications/notifications.service'; +import { HttpClient } from '@angular/common/http'; +import { DefaultChangeAnalyzer } from '../data/default-change-analyzer.service'; +import { Injectable } from '@angular/core'; +import { dataService } from '../cache/builders/build-decorators'; +import { ORCID_QUEUE } from './model/orcid-queue.resource-type'; +import { ItemDataService } from '../data/item-data.service'; +import { combineLatest, Observable } from 'rxjs'; +import { RemoteData } from '../data/remote-data'; +import { PaginatedList } from '../data/paginated-list.model'; +import { RequestParam } from '../cache/models/request-param.model'; +import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model'; +import { NoContent } from '../shared/NoContent.model'; +import { ConfigurationDataService } from '../data/configuration-data.service'; +import { map } from 'rxjs/operators'; +import { getFirstSucceededRemoteDataPayload } from '../shared/operators'; +import { environment } from '../../../environments/environment'; +import { Router } from '@angular/router'; + +/** + * A private DataService implementation to delegate specific methods to. + */ +class OrcidQueueServiceImpl extends DataService { + public linkPath = 'orcidqueues'; + + constructor( + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected store: Store, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + protected notificationsService: NotificationsService, + protected http: HttpClient, + protected comparator: DefaultChangeAnalyzer) { + super(); + } + +} + +/** + * A service that provides methods to make REST requests with Orcid Queue endpoint. + */ +@Injectable() +@dataService(ORCID_QUEUE) +export class OrcidQueueService { + + dataService: OrcidQueueServiceImpl; + + responseMsToLive: number = 10 * 1000; + + constructor( + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected store: Store, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + protected notificationsService: NotificationsService, + protected http: HttpClient, + protected comparator: DefaultChangeAnalyzer, + protected configurationService: ConfigurationDataService, + protected router: Router, + protected itemService: ItemDataService ) { + + this.dataService = new OrcidQueueServiceImpl(requestService, rdbService, store, objectCache, halService, + notificationsService, http, comparator); + + } + + /** + * @param itemId It represent a Id of owner + * @param paginationOptions + * @returns { OrcidQueue } + */ + searchByOwnerId(itemId: string, paginationOptions: PaginationComponentOptions): Observable>> { + return this.dataService.searchBy('findByOwner', { + searchParams: [new RequestParam('ownerId', itemId)], + elementsPerPage: paginationOptions.pageSize, + currentPage: paginationOptions.currentPage + },false, + true); + } + + /** + * @param orcidQueueId represents a id of orcid queue + * @returns { NoContent } + */ + deleteById(orcidQueueId: number): Observable> { + return this.dataService.delete(orcidQueueId + ''); + } + + /** + * This method will set linkPath to stale + */ + clearFindByOwnerRequests() { + this.requestService.setStaleByHrefSubstring(this.dataService.linkPath + '/search/findByOwner'); + } + + /** + * @param profileId represent a uuid of that user + * @returns orcid authorized url of that user + */ + getOrcidAuthorizeUrl(profileId: string): Observable { + return combineLatest([ + this.configurationService.findByPropertyName('orcid.authorize-url').pipe(getFirstSucceededRemoteDataPayload()), + this.configurationService.findByPropertyName('orcid.application-client-id').pipe(getFirstSucceededRemoteDataPayload()), + this.configurationService.findByPropertyName('orcid.scope').pipe(getFirstSucceededRemoteDataPayload())] + ).pipe( + map(([authorizeUrl, clientId, scopes]) => { + const redirectUri = environment.rest.baseUrl + '/api/cris/orcid/' + profileId + '/?url=' + encodeURIComponent(this.router.url); + return authorizeUrl.values[0] + '?client_id=' + clientId.values[0] + '&redirect_uri=' + redirectUri + '&response_type=code&scope=' + + scopes.values.join(' '); + })); + } +} diff --git a/src/app/item-page/item-page.module.ts b/src/app/item-page/item-page.module.ts index 2c4b57b249..9c471a5aa7 100644 --- a/src/app/item-page/item-page.module.ts +++ b/src/app/item-page/item-page.module.ts @@ -38,6 +38,7 @@ import { OrcidAuthComponent } from './orcid-page/orcid-auth/orcid-auth.component import { OrcidPageComponent } from './orcid-page/orcid-page.component'; import { NgbAccordionModule } from '@ng-bootstrap/ng-bootstrap'; import { OrcidSettingComponent } from './orcid-page/orcid-sync/orcid-setting.component'; +import { OrcidQueueComponent } from './orcid-page/orcid-queue/orcid-queue.component'; const ENTRY_COMPONENTS = [ @@ -73,7 +74,8 @@ const DECLARATIONS = [ VersionPageComponent, OrcidPageComponent, OrcidAuthComponent, - OrcidSettingComponent + OrcidSettingComponent, + OrcidQueueComponent ]; @NgModule({ diff --git a/src/app/item-page/orcid-page/orcid-page.component.html b/src/app/item-page/orcid-page/orcid-page.component.html index 4e62a8d51c..33c1dd158d 100644 --- a/src/app/item-page/orcid-page/orcid-page.component.html +++ b/src/app/item-page/orcid-page/orcid-page.component.html @@ -1,2 +1,3 @@ + diff --git a/src/app/item-page/orcid-page/orcid-queue/orcid-queue.component.html b/src/app/item-page/orcid-page/orcid-queue/orcid-queue.component.html new file mode 100644 index 0000000000..81e30bc013 --- /dev/null +++ b/src/app/item-page/orcid-page/orcid-queue/orcid-queue.component.html @@ -0,0 +1,59 @@ +
+ + + +
+ + +
+ {{ 'person.page.orcid.sync-queue.empty-message' | translate}} +
+ + +
+ + + + + + + + + + + + + +
{{'person.page.orcid.sync-queue.description' | translate}}
+ {{ entry.description }} + +
+ + + + +
+
+
+
+
+
+
+
+
diff --git a/src/app/item-page/orcid-page/orcid-queue/orcid-queue.component.scss b/src/app/item-page/orcid-page/orcid-queue/orcid-queue.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/item-page/orcid-page/orcid-queue/orcid-queue.component.ts b/src/app/item-page/orcid-page/orcid-queue/orcid-queue.component.ts new file mode 100644 index 0000000000..01639a427c --- /dev/null +++ b/src/app/item-page/orcid-page/orcid-queue/orcid-queue.component.ts @@ -0,0 +1,250 @@ +import { Component, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { TranslateService } from '@ngx-translate/core'; +import { BehaviorSubject, combineLatest, Observable, Subscription } from 'rxjs'; +import { switchMap, tap } from 'rxjs/operators'; +import { PaginatedList } from '../../../core/data/paginated-list.model'; +import { RemoteData } from '../../../core/data/remote-data'; +import { OrcidHistory } from '../../../core/orcid/model/orcid-history.model'; +import { OrcidQueue } from '../../../core/orcid/model/orcid-queue.model'; +import { OrcidHistoryService } from '../../../core/orcid/orcid-history.service'; +import { OrcidQueueService } from '../../../core/orcid/orcid-queue.service'; +import { PaginationService } from '../../../core/pagination/pagination.service'; +import { getFinishedRemoteData, getFirstCompletedRemoteData } from '../../../core/shared/operators'; +import { hasValue } from '../../../shared/empty.util'; +import { NotificationsService } from '../../../shared/notifications/notifications.service'; +import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model'; + +@Component({ + selector: 'ds-orcid-queue', + templateUrl: './orcid-queue.component.html', + styleUrls: ['./orcid-queue.component.scss'] +}) +export class OrcidQueueComponent implements OnInit { + /** + * Pagination config used to display the list + */ + public paginationOptions: PaginationComponentOptions = Object.assign(new PaginationComponentOptions(), { + id: 'oqp', + pageSize: 5 + }); + + /** + * A boolean representing if results are loading + */ + public processing$ = new BehaviorSubject(false); + + /** + * A list of orcid queue records + */ + private list$: BehaviorSubject>> = new BehaviorSubject>>({} as any); + + /** + * Array to track all subscriptions and unsubscribe them onDestroy + * @type {Array} + */ + private subs: Subscription[] = []; + constructor(private orcidQueueService: OrcidQueueService, + protected translateService: TranslateService, + private paginationService: PaginationService, + private route: ActivatedRoute, + private notificationsService: NotificationsService, + private orcidHistoryService: OrcidHistoryService, + ) { } + + ngOnInit(): void { + this.updateList(); + } + + updateList() { + this.subs.push( + this.paginationService.getCurrentPagination(this.paginationOptions.id, this.paginationOptions).pipe( + tap(() => this.processing$.next(true)), + switchMap((config: PaginationComponentOptions) => this.orcidQueueService.searchByOwnerId(this.route.snapshot.paramMap.get('id'), config)), + getFirstCompletedRemoteData() + ).subscribe((result: RemoteData>) => { + this.processing$.next(false); + this.list$.next(result); + this.orcidQueueService.clearFindByOwnerRequests(); + }) + ); + } + + + /** + * Return the list of orcid queue records + */ + getList(): Observable>> { + return this.list$.asObservable(); + } + + getIconClass(orcidQueue: OrcidQueue): string { + if (!orcidQueue.recordType) { + return 'fa fa-user'; + } + switch (orcidQueue.recordType.toLowerCase()) { + case 'publication': + return 'fa fa-book'; + case 'funding': + return 'fa fa-wallet'; + case 'education': + return 'fa fa-school'; + case 'affiliation': + return 'fa fa-university'; + case 'country': + return 'fas fa-globe-europe'; + case 'external_ids': + case 'researcher_urls': + return 'fas fa-external-link-alt'; + default: + return 'fa fa-user'; + } + } + + getIconTooltip(orcidQueue: OrcidQueue): string { + if (!orcidQueue.recordType) { + return ''; + } + + return 'person.page.orcid.sync-queue.tooltip.' + orcidQueue.recordType.toLowerCase(); + } + + getOperationBadgeClass(orcidQueue: OrcidQueue): string { + + if (!orcidQueue.operation) { + return ''; + } + + switch (orcidQueue.operation.toLowerCase()) { + case 'insert': + return 'badge badge-pill badge-success'; + case 'update': + return 'badge badge-pill badge-primary'; + case 'delete': + return 'badge badge-pill badge-danger'; + default: + return ''; + } + } + + getOperationTooltip(orcidQueue: OrcidQueue): string { + if (!orcidQueue.operation) { + return ''; + } + + return 'person.page.orcid.sync-queue.tooltip.' + orcidQueue.operation.toLowerCase(); + } + + getOperationClass(orcidQueue: OrcidQueue): string { + + if (!orcidQueue.operation) { + return ''; + } + + switch (orcidQueue.operation.toLowerCase()) { + case 'insert': + return 'fas fa-plus'; + case 'update': + return 'fas fa-edit'; + case 'delete': + return 'fas fa-trash-alt'; + default: + return ''; + } + } + + discardEntry(orcidQueue: OrcidQueue) { + this.processing$.next(true); + this.subs.push(this.orcidQueueService.deleteById(orcidQueue.id).pipe( + getFinishedRemoteData() + ).subscribe((remoteData) => { + this.processing$.next(false); + if (remoteData.isSuccess) { + this.notificationsService.success(this.translateService.get('person.page.orcid.sync-queue.discard.success')); + this.updateList(); + } else { + this.notificationsService.error(this.translateService.get('person.page.orcid.sync-queue.discard.error')); + } + })); + } + + send( orcidQueue: OrcidQueue ) { + this.processing$.next(true); + this.subs.push(this.orcidHistoryService.sendToORCID(orcidQueue).pipe( + getFinishedRemoteData() + ).subscribe((remoteData) => { + this.processing$.next(false); + if (remoteData.isSuccess) { + this.handleOrcidHistoryRecordCreation(remoteData.payload); + } else if (remoteData.statusCode === 422) { + this.handleValidationErrors(remoteData); + } else { + this.notificationsService.error(this.translateService.get('person.page.orcid.sync-queue.send.error')); + } + })); + } + + handleOrcidHistoryRecordCreation(orcidHistory: OrcidHistory) { + switch (orcidHistory.status) { + case 200: + case 201: + case 204: + this.notificationsService.success(this.translateService.get('person.page.orcid.sync-queue.send.success')); + this.updateList(); + break; + case 400: + this.notificationsService.error(this.translateService.get('person.page.orcid.sync-queue.send.bad-request-error'), null, { timeOut: -1 }); + break; + case 401: + combineLatest([ + this.translateService.get('person.page.orcid.sync-queue.send.unauthorized-error.title'), + this.getUnauthorizedErrorContent()], + ).subscribe(([title, content]) => { + this.notificationsService.error(title, content, { timeOut: -1}, true); + }); + break; + case 404: + this.notificationsService.warning(this.translateService.get('person.page.orcid.sync-queue.send.not-found-warning')); + break; + case 409: + this.notificationsService.error(this.translateService.get('person.page.orcid.sync-queue.send.conflict-error'), null, { timeOut: -1 }); + break; + default: + this.notificationsService.error(this.translateService.get('person.page.orcid.sync-queue.send.error'), null, { timeOut: -1 }); + } + } + + handleValidationErrors(remoteData: RemoteData) { + const translations = [this.translateService.get('person.page.orcid.sync-queue.send.validation-error')]; + const errorMessage = remoteData.errorMessage; + if (errorMessage && errorMessage.indexOf('Error codes:') > 0) { + errorMessage.substring(errorMessage.indexOf(':') + 1).trim().split(',') + .forEach((error) => translations.push(this.translateService.get('person.page.orcid.sync-queue.send.validation-error.' + error))); + } + combineLatest(translations).subscribe((messages) => { + const title = messages.shift(); + const content = '
    ' + messages.map((message) => '
  • ' + message + '
  • ').join('') + '
'; + this.notificationsService.error(title, content, { timeOut: -1 }, true); + }); + } + + private getUnauthorizedErrorContent(): Observable { + return this.orcidQueueService.getOrcidAuthorizeUrl(this.route.snapshot.paramMap.get('id')).pipe( + switchMap((authorizeUrl) => this.translateService.get('person.page.orcid.sync-queue.send.unauthorized-error.content', { orcid : authorizeUrl})) + ); + } + + /** + * Unsubscribe from all subscriptions + */ + ngOnDestroy(): void { + this.list$ = null; + this.subs.filter((subscription) => hasValue(subscription)) + .forEach((subscription) => subscription.unsubscribe()); + } + + isProfileRecord(orcidQueue: OrcidQueue): boolean { + return orcidQueue.recordType !== 'Publication' && orcidQueue.recordType !== 'Project'; + } + +} From 004f95b6dc6d6e260fb944dec7e865dd14aa209e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Apr 2022 14:16:56 +0000 Subject: [PATCH 022/343] Bump minimist from 1.2.5 to 1.2.6 Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6. - [Release notes](https://github.com/substack/minimist/releases) - [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6) --- updated-dependencies: - dependency-name: minimist dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 00c93618d9..a2dd9dbc2c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8555,9 +8555,9 @@ minimatch@^3.0.2, minimatch@^3.0.4: brace-expansion "^1.1.7" minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + version "1.2.6" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" + integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== minipass-collect@^1.0.2: version "1.0.2" From 5dd7efcbab6811f4220f912e203945ad48896878 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Apr 2022 14:17:06 +0000 Subject: [PATCH 023/343] Bump moment from 2.29.1 to 2.29.2 Bumps [moment](https://github.com/moment/moment) from 2.29.1 to 2.29.2. - [Release notes](https://github.com/moment/moment/releases) - [Changelog](https://github.com/moment/moment/blob/develop/CHANGELOG.md) - [Commits](https://github.com/moment/moment/compare/2.29.1...2.29.2) --- updated-dependencies: - dependency-name: moment dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 9cb6195c57..4b513beca3 100644 --- a/package.json +++ b/package.json @@ -103,7 +103,7 @@ "mirador": "^3.3.0", "mirador-dl-plugin": "^0.13.0", "mirador-share-plugin": "^0.11.0", - "moment": "^2.29.1", + "moment": "^2.29.2", "morgan": "^1.10.0", "ng-mocks": "^13.1.1", "ng2-file-upload": "1.4.0", diff --git a/yarn.lock b/yarn.lock index 00c93618d9..beca9a8577 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8716,10 +8716,10 @@ mkdirp@^1.0.3, mkdirp@^1.0.4: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -moment@^2.29.1: - version "2.29.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" - integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== +moment@^2.29.2: + version "2.29.2" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.2.tgz#00910c60b20843bcba52d37d58c628b47b1f20e4" + integrity sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg== morgan@^1.10.0: version "1.10.0" From 728bce56a44b2ec09593bea3b8d602256b6ae302 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Apr 2022 14:18:00 +0000 Subject: [PATCH 024/343] Bump node-forge from 1.2.1 to 1.3.1 Bumps [node-forge](https://github.com/digitalbazaar/forge) from 1.2.1 to 1.3.1. - [Release notes](https://github.com/digitalbazaar/forge/releases) - [Changelog](https://github.com/digitalbazaar/forge/blob/main/CHANGELOG.md) - [Commits](https://github.com/digitalbazaar/forge/compare/v1.2.1...v1.3.1) --- updated-dependencies: - dependency-name: node-forge dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 00c93618d9..d85955dccf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8908,9 +8908,9 @@ node-fetch@^2.6.1: whatwg-url "^5.0.0" node-forge@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.2.1.tgz#82794919071ef2eb5c509293325cec8afd0fd53c" - integrity sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w== + version "1.3.1" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== node-gyp-build@^4.2.2: version "4.3.0" From 5add939a1d5989f59f0eb35d96e83472f6e0c5f5 Mon Sep 17 00:00:00 2001 From: Rezart Vata Date: Thu, 21 Apr 2022 12:33:38 +0200 Subject: [PATCH 025/343] [CST-5270] Insertion of submission section with mock & section layout --- .../models/sherpa-policies-details.model.ts | 60 ++++++ ...spaceitem-section-sherpa-policies.model.ts | 22 ++ .../models/workspaceitem-sections.model.ts | 2 + .../objects/submission-objects.effects.ts | 111 ++++++++-- src/app/submission/sections/sections-type.ts | 1 + .../content-accordion.component.html | 30 +++ .../content-accordion.component.scss | 33 +++ .../content-accordion.component.spec.ts | 25 +++ .../content-accordion.component.ts | 15 ++ .../section-sherpa-policies.component.html | 45 ++++ .../section-sherpa-policies.component.scss | 31 +++ .../section-sherpa-policies.component.spec.ts | 204 ++++++++++++++++++ .../section-sherpa-policies.component.ts | 79 +++++++ .../section-sherpa-policies.service.ts | 42 ++++ src/app/submission/submission.module.ts | 10 +- 15 files changed, 694 insertions(+), 16 deletions(-) create mode 100644 src/app/core/submission/models/sherpa-policies-details.model.ts create mode 100644 src/app/core/submission/models/workspaceitem-section-sherpa-policies.model.ts create mode 100644 src/app/submission/sections/sherpa-policies/content-accordion/content-accordion.component.html create mode 100644 src/app/submission/sections/sherpa-policies/content-accordion/content-accordion.component.scss create mode 100644 src/app/submission/sections/sherpa-policies/content-accordion/content-accordion.component.spec.ts create mode 100644 src/app/submission/sections/sherpa-policies/content-accordion/content-accordion.component.ts create mode 100644 src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.html create mode 100644 src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.scss create mode 100644 src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.spec.ts create mode 100644 src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.ts create mode 100644 src/app/submission/sections/sherpa-policies/section-sherpa-policies.service.ts diff --git a/src/app/core/submission/models/sherpa-policies-details.model.ts b/src/app/core/submission/models/sherpa-policies-details.model.ts new file mode 100644 index 0000000000..84f3735403 --- /dev/null +++ b/src/app/core/submission/models/sherpa-policies-details.model.ts @@ -0,0 +1,60 @@ +/** + * An interface to represent an access condition. + */ +export class SherpaPoliciesDetailsObject { + + /** + * The sherpa policies uri + */ + uri: string; + + /** + * The sherpa policies details + */ + journals: Journals; +} + + +export interface Journals { + titles: string[]; + url: string; + issns: string[]; + romeoPub: string; + zetoPub: string; + inDOAJ: boolean; + publisher: Publisher; + policies: Policies; + urls: string[]; + openAccessProhibited: boolean; +} + +export interface Publisher { + name: string; + relationshipType: string; + country: string; + uri: string; + identifier: string; + paidAccessDescription: string; + paidAccessUrl: string; +} + +export interface Policies { + openAccessPermitted: boolean; + uri: string; + internalMoniker: string; + permittedVersions: PermittedVersions; +} + +export interface PermittedVersions { + articleVersion: string; + conditions: string[]; + prerequisites: string[]; + locations: string[]; + licenses: string[]; + embargo: Embargo; +} + +export interface Embargo { + units: any; + amount: any; +} diff --git a/src/app/core/submission/models/workspaceitem-section-sherpa-policies.model.ts b/src/app/core/submission/models/workspaceitem-section-sherpa-policies.model.ts new file mode 100644 index 0000000000..d7666befe7 --- /dev/null +++ b/src/app/core/submission/models/workspaceitem-section-sherpa-policies.model.ts @@ -0,0 +1,22 @@ +import { SherpaPoliciesDetailsObject } from './sherpa-policies-details.model'; + +/** + * An interface to represent the submission's item accesses condition. + */ +export interface WorkspaceitemSectionSherpaPoliciesObject { + + /** + * The access condition id + */ + id: string; + + /** + * The sherpa policies retrievalTime + */ + retrievalTime: string; + + /** + * The sherpa policies details + */ + details: SherpaPoliciesDetailsObject; +} diff --git a/src/app/core/submission/models/workspaceitem-sections.model.ts b/src/app/core/submission/models/workspaceitem-sections.model.ts index 084da3f088..1112d740ed 100644 --- a/src/app/core/submission/models/workspaceitem-sections.model.ts +++ b/src/app/core/submission/models/workspaceitem-sections.model.ts @@ -3,6 +3,7 @@ import { WorkspaceitemSectionFormObject } from './workspaceitem-section-form.mod import { WorkspaceitemSectionLicenseObject } from './workspaceitem-section-license.model'; import { WorkspaceitemSectionUploadObject } from './workspaceitem-section-upload.model'; import { WorkspaceitemSectionCcLicenseObject } from './workspaceitem-section-cc-license.model'; +import { WorkspaceitemSectionSherpaPoliciesObject } from './workspaceitem-section-sherpa-policies.model'; /** * An interface to represent submission's section object. @@ -21,4 +22,5 @@ export type WorkspaceitemSectionDataType | WorkspaceitemSectionLicenseObject | WorkspaceitemSectionCcLicenseObject | WorkspaceitemSectionAccessesObject + | WorkspaceitemSectionSherpaPoliciesObject | string; diff --git a/src/app/submission/objects/submission-objects.effects.ts b/src/app/submission/objects/submission-objects.effects.ts index e8de418436..f1750cb30f 100644 --- a/src/app/submission/objects/submission-objects.effects.ts +++ b/src/app/submission/objects/submission-objects.effects.ts @@ -1,3 +1,4 @@ +import { WorkspaceitemSectionSherpaPoliciesObject } from './../../core/submission/models/workspaceitem-section-sherpa-policies.model'; import { Injectable } from '@angular/core'; import { Actions, Effect, ofType } from '@ngrx/effects'; import { Store } from '@ngrx/store'; @@ -51,6 +52,7 @@ import { SubmissionObjectDataService } from '../../core/submission/submission-ob import { followLink } from '../../shared/utils/follow-link-config.model'; import parseSectionErrorPaths, { SectionErrorPath } from '../utils/parseSectionErrorPaths'; import { FormState } from '../../shared/form/form.reducer'; +import { SUBMISSION_SECTION_TYPE } from 'src/app/core/config/models/config-type'; @Injectable() export class SubmissionObjectEffects { @@ -63,7 +65,7 @@ export class SubmissionObjectEffects { map((action: InitSubmissionFormAction) => { const definition = action.payload.submissionDefinition; const mappedActions = []; - definition.sections.page.forEach((sectionDefinition: any) => { + definition.sections.page.forEach((sectionDefinition: any, index) => { const selfLink = sectionDefinition._links.self.href || sectionDefinition._links.self; const sectionId = selfLink.substr(selfLink.lastIndexOf('/') + 1); const config = sectionDefinition._links.config ? (sectionDefinition._links.config.href || sectionDefinition._links.config) : ''; @@ -75,6 +77,7 @@ export class SubmissionObjectEffects { sectionData = action.payload.item.metadata; } const sectionErrors = isNotEmpty(action.payload.errors) ? (action.payload.errors[sectionId] || null) : null; + mappedActions.push( new InitSectionAction( action.payload.submissionId, @@ -89,7 +92,87 @@ export class SubmissionObjectEffects { sectionErrors ) ); + + if (index === definition.sections.page.length - 1) { + mappedActions.push( + new InitSectionAction( + action.payload.submissionId, + 'sherpaPolicies', + 'submit.progressbar.sherpaPolicies', + 'submit.progressbar.sherpaPolicies', + true, + SectionsType.SherpaPolicies, + { main: null, other: 'READONLY' }, + true, + { + 'id': 'sherpaPolicies', + 'retrievalTime': '2022-01-11T09:43:53Z', + 'details': { + 'uri': 'https://www.nature.com/natsynth/', + 'journals': { + 'titles': [ + 'Nature Synthesis' + ], + 'url': 'http://europepmc.org/', + 'issns': [ + '2731-0582', + '2731-0583', + '2731-0584', + ], + 'romeoPub': 'Self archiving and license to publish', + 'zetoPub': 'Self archiving and license to publish', + 'inDOAJ': true, + 'publisher': { + 'name': 'Europe PMC', + 'relationshipType': 'Stest', + 'country': 'gb', + 'uri': 'https://v2.sherpa.ac.uk/id/publication/40863', + 'identifier': '123123123', + 'paidAccessDescription': 'test test sss', + 'paidAccessUrl': 'https://www.nature.com/nature-portfolio/editorial-policies/preprints-and-conference-proceedings' + }, + 'policies': { + 'openAccessPermitted': true, + 'uri': 'https://v2.sherpa.ac.uk/id/publisher_policy/3286', + 'internalMoniker': 'Default Policy', + 'permittedVersions': { + 'articleVersion': 'submitted', + 'conditions': [ + 'Must link to publisher version', + 'Published source must be acknowledged and DOI cited', + 'Post-prints are subject to Springer Nature re-use terms', + 'Non-commercial use only' + ], + 'prerequisites': [], + 'locations': [ + 'authors_homepage', + 'funder_designated_location', + 'institutional_repository', + 'preprint_repository' + ], + 'licenses': [], + 'embargo': { + 'units': 'months', + 'amount': 6 + } + } + }, + 'urls': [ + 'https://www.nature.com/neuro/editorial-policies/self-archiving-and-license-to-publish', + 'https://www.nature.com/nature-portfolio/editorial-policies/preprints-and-conference-proceedings', + 'https://www.springernature.com/gp/open-research/policies/accepted-manuscript-terms' + ], + 'openAccessProhibited': true + } + } + } as WorkspaceitemSectionSherpaPoliciesObject, + null + ) + ); + } + }); + console.log(mappedActions); return { action: action, definition: definition, mappedActions: mappedActions }; }), mergeMap((result) => { @@ -125,8 +208,8 @@ export class SubmissionObjectEffects { this.submissionService.getSubmissionObjectLinkName(), action.payload.submissionId, 'sections').pipe( - map((response: SubmissionObject[]) => new SaveSubmissionFormSuccessAction(action.payload.submissionId, response, action.payload.isManual)), - catchError(() => observableOf(new SaveSubmissionFormErrorAction(action.payload.submissionId)))); + map((response: SubmissionObject[]) => new SaveSubmissionFormSuccessAction(action.payload.submissionId, response, action.payload.isManual)), + catchError(() => observableOf(new SaveSubmissionFormErrorAction(action.payload.submissionId)))); })); /** @@ -139,8 +222,8 @@ export class SubmissionObjectEffects { this.submissionService.getSubmissionObjectLinkName(), action.payload.submissionId, 'sections').pipe( - map((response: SubmissionObject[]) => new SaveForLaterSubmissionFormSuccessAction(action.payload.submissionId, response)), - catchError(() => observableOf(new SaveSubmissionFormErrorAction(action.payload.submissionId)))); + map((response: SubmissionObject[]) => new SaveForLaterSubmissionFormSuccessAction(action.payload.submissionId, response)), + catchError(() => observableOf(new SaveSubmissionFormErrorAction(action.payload.submissionId)))); })); /** @@ -179,8 +262,8 @@ export class SubmissionObjectEffects { action.payload.submissionId, 'sections', action.payload.sectionId).pipe( - map((response: SubmissionObject[]) => new SaveSubmissionSectionFormSuccessAction(action.payload.submissionId, response)), - catchError(() => observableOf(new SaveSubmissionSectionFormErrorAction(action.payload.submissionId)))); + map((response: SubmissionObject[]) => new SaveSubmissionSectionFormSuccessAction(action.payload.submissionId, response)), + catchError(() => observableOf(new SaveSubmissionSectionFormErrorAction(action.payload.submissionId)))); })); /** @@ -317,13 +400,13 @@ export class SubmissionObjectEffects { tap(() => this.notificationsService.error(null, this.translate.get('submission.sections.general.discard_error_notice')))); constructor(private actions$: Actions, - private notificationsService: NotificationsService, - private operationsService: SubmissionJsonPatchOperationsService, - private sectionService: SectionsService, - private store$: Store, - private submissionService: SubmissionService, - private submissionObjectService: SubmissionObjectDataService, - private translate: TranslateService) { + private notificationsService: NotificationsService, + private operationsService: SubmissionJsonPatchOperationsService, + private sectionService: SectionsService, + private store$: Store, + private submissionService: SubmissionService, + private submissionObjectService: SubmissionObjectDataService, + private translate: TranslateService) { } /** diff --git a/src/app/submission/sections/sections-type.ts b/src/app/submission/sections/sections-type.ts index d13aef1da1..f998ef4554 100644 --- a/src/app/submission/sections/sections-type.ts +++ b/src/app/submission/sections/sections-type.ts @@ -6,4 +6,5 @@ export enum SectionsType { CcLicense = 'cclicense', collection = 'collection', AccessesCondition = 'accessCondition', + SherpaPolicies = 'sherpaPolicies', } diff --git a/src/app/submission/sections/sherpa-policies/content-accordion/content-accordion.component.html b/src/app/submission/sections/sherpa-policies/content-accordion/content-accordion.component.html new file mode 100644 index 0000000000..8aa4a7ef9f --- /dev/null +++ b/src/app/submission/sections/sherpa-policies/content-accordion/content-accordion.component.html @@ -0,0 +1,30 @@ + + + + Publication information +
+ + +
+
+ +
+
+
+

Title

+
+
+
+
+
+
+

ISSNs

+
+
+
+
+
+ +
+
+
\ No newline at end of file diff --git a/src/app/submission/sections/sherpa-policies/content-accordion/content-accordion.component.scss b/src/app/submission/sections/sherpa-policies/content-accordion/content-accordion.component.scss new file mode 100644 index 0000000000..73d0f259cc --- /dev/null +++ b/src/app/submission/sections/sherpa-policies/content-accordion/content-accordion.component.scss @@ -0,0 +1,33 @@ +:host ::ng-deep { + .card { + border: none; + margin-bottom: 20px; + border-bottom: 1px solid rgba(0, 0, 0, 0.125); + + .card-header { + border: none; + background-color: transparent; + border-top: 1px solid rgba(0, 0, 0, 0.125); + + button { + text-align: left; + padding: 0px; + width: 100%; + color: #000; + font-weight: normal; + + .fas { + background: #fff; + color: #000; + margin-right: 10px; + height: 1.25em; + display: flex; + align-items: center; + justify-content: center; + font-size: 12px; + } + } + } + } + +} \ No newline at end of file diff --git a/src/app/submission/sections/sherpa-policies/content-accordion/content-accordion.component.spec.ts b/src/app/submission/sections/sherpa-policies/content-accordion/content-accordion.component.spec.ts new file mode 100644 index 0000000000..3b4d18a633 --- /dev/null +++ b/src/app/submission/sections/sherpa-policies/content-accordion/content-accordion.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ContentAccordionComponent } from './content-accordion.component'; + +describe('ContentAccordionComponent', () => { + let component: ContentAccordionComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ ContentAccordionComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(ContentAccordionComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/submission/sections/sherpa-policies/content-accordion/content-accordion.component.ts b/src/app/submission/sections/sherpa-policies/content-accordion/content-accordion.component.ts new file mode 100644 index 0000000000..09e1d174d1 --- /dev/null +++ b/src/app/submission/sections/sherpa-policies/content-accordion/content-accordion.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'ds-content-accordion', + templateUrl: './content-accordion.component.html', + styleUrls: ['./content-accordion.component.scss'] +}) +export class ContentAccordionComponent implements OnInit { + + constructor() { } + + ngOnInit(): void { + } + +} diff --git a/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.html b/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.html new file mode 100644 index 0000000000..a8014f0d6e --- /dev/null +++ b/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.html @@ -0,0 +1,45 @@ + + + +
+ + +
+ Publication information +
+ +
+
+
+

Title

+
+
+

{{title}}

+
+
+
+
+

ISSNs

+
+
+

{{issn}}

+
+
+
+ +
+
+ + +
+ + +
+ Publisher Policy +
+ + + + +
+
\ No newline at end of file diff --git a/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.scss b/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.scss new file mode 100644 index 0000000000..8c1bfc2580 --- /dev/null +++ b/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.scss @@ -0,0 +1,31 @@ +:host ::ng-deep { + .card { + border: none; + margin-bottom: 20px; + border-bottom: 1px solid rgba(0, 0, 0, 0.125); + + .card-header { + border: none; + background-color: transparent; + border-top: 1px solid rgba(0, 0, 0, 0.125); + + button { + text-align: left; + padding: 0px; + width: auto; + font-weight: bold; + + .fas { + background: #207698; + color: #fff; + margin-right: 10px; + height: 1.25em; + display: flex; + align-items: center; + justify-content: center; + } + } + } + } + +} \ No newline at end of file diff --git a/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.spec.ts b/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.spec.ts new file mode 100644 index 0000000000..5509cab4bb --- /dev/null +++ b/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.spec.ts @@ -0,0 +1,204 @@ +import { FormService } from '../../../shared/form/form.service'; +import { ComponentFixture, inject, TestBed } from '@angular/core/testing'; + +import { SubmissionSectionAccessesComponent } from './section-accesses.component'; +import { SectionsService } from '../sections.service'; +import { SectionsServiceStub } from '../../../shared/testing/sections-service.stub'; + +import { FormBuilderService } from '../../../shared/form/builder/form-builder.service'; +import { getMockFormBuilderService } from '../../../shared/mocks/form-builder-service.mock'; +import { SubmissionAccessesConfigService } from '../../../core/config/submission-accesses-config.service'; +import { + getSubmissionAccessesConfigNotChangeDiscoverableService, + getSubmissionAccessesConfigService +} from '../../../shared/mocks/section-accesses-config.service.mock'; +import { SectionAccessesService } from './section-accesses.service'; +import { SectionFormOperationsService } from '../form/section-form-operations.service'; +import { JsonPatchOperationsBuilder } from '../../../core/json-patch/builder/json-patch-operations-builder'; +import { TranslateModule, TranslateService } from '@ngx-translate/core'; +import { SubmissionJsonPatchOperationsService } from '../../../core/submission/submission-json-patch-operations.service'; +import { getSectionAccessesService } from '../../../shared/mocks/section-accesses.service.mock'; +import { getMockFormOperationsService } from '../../../shared/mocks/form-operations-service.mock'; +import { getMockTranslateService } from '../../../shared/mocks/translate.service.mock'; +import { SubmissionJsonPatchOperationsServiceStub } from '../../../shared/testing/submission-json-patch-operations-service.stub'; +import { BrowserModule } from '@angular/platform-browser'; + +import { of as observableOf } from 'rxjs'; +import { Store } from '@ngrx/store'; +import { FormComponent } from '../../../shared/form/form.component'; +import { + DynamicCheckboxModel, + DynamicDatePickerModel, + DynamicFormArrayModel, + DynamicSelectModel +} from '@ng-dynamic-forms/core'; +import { AppState } from '../../../app.reducer'; +import { getMockFormService } from '../../../shared/mocks/form-service.mock'; +import { mockAccessesFormData } from '../../../shared/mocks/submission.mock'; +import { accessConditionChangeEvent, checkboxChangeEvent } from '../../../shared/testing/form-event.stub'; + +describe('SubmissionSectionAccessesComponent', () => { + let component: SubmissionSectionAccessesComponent; + let fixture: ComponentFixture; + + const sectionsServiceStub = new SectionsServiceStub(); + // const pathCombiner = new JsonPatchOperationPathCombiner('sections', sectionId, 'files', fileIndex); + + const builderService: FormBuilderService = getMockFormBuilderService(); + const submissionAccessesConfigService = getSubmissionAccessesConfigService(); + const sectionAccessesService = getSectionAccessesService(); + const sectionFormOperationsService = getMockFormOperationsService(); + const operationsBuilder = jasmine.createSpyObj('operationsBuilder', { + add: undefined, + remove: undefined, + replace: undefined, + }); + + let formService: any; + + const storeStub = jasmine.createSpyObj('store', ['dispatch']); + + const sectionData = { + header: 'submit.progressbar.accessCondition', + config: 'http://localhost:8080/server/api/config/submissionaccessoptions/AccessConditionDefaultConfiguration', + mandatory: true, + sectionType: 'accessCondition', + collapsed: false, + enabled: true, + data: { + discoverable: true, + accessConditions: [] + }, + errorsToShow: [], + serverValidationErrors: [], + isLoading: false, + isValid: true + }; + + describe('First with canChangeDiscoverable true', () => { + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ + BrowserModule, + TranslateModule.forRoot() + ], + declarations: [SubmissionSectionAccessesComponent, FormComponent], + providers: [ + { provide: SectionsService, useValue: sectionsServiceStub }, + { provide: FormBuilderService, useValue: builderService }, + { provide: SubmissionAccessesConfigService, useValue: submissionAccessesConfigService }, + { provide: SectionAccessesService, useValue: sectionAccessesService }, + { provide: SectionFormOperationsService, useValue: sectionFormOperationsService }, + { provide: JsonPatchOperationsBuilder, useValue: operationsBuilder }, + { provide: TranslateService, useValue: getMockTranslateService() }, + { provide: FormService, useValue: getMockFormService() }, + { provide: Store, useValue: storeStub }, + { provide: SubmissionJsonPatchOperationsService, useValue: SubmissionJsonPatchOperationsServiceStub }, + { provide: 'sectionDataProvider', useValue: sectionData }, + { provide: 'submissionIdProvider', useValue: '1508' }, + ] + }) + .compileComponents(); + }); + + beforeEach(inject([Store], (store: Store) => { + fixture = TestBed.createComponent(SubmissionSectionAccessesComponent); + component = fixture.componentInstance; + formService = TestBed.inject(FormService); + formService.validateAllFormFields.and.callFake(() => null); + formService.isValid.and.returnValue(observableOf(true)); + formService.getFormData.and.returnValue(observableOf(mockAccessesFormData)); + fixture.detectChanges(); + })); + + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should have created formModel', () => { + expect(component.formModel).toBeTruthy(); + }); + + it('should have formModel length should be 2', () => { + expect(component.formModel.length).toEqual(2); + }); + + it('formModel should have 1 model type checkbox and 1 model type array', () => { + expect(component.formModel[0] instanceof DynamicCheckboxModel).toBeTrue(); + expect(component.formModel[1] instanceof DynamicFormArrayModel).toBeTrue(); + }); + + it('formModel type array should have formgroup with 1 input and 2 datepickers', () => { + const formModel: any = component.formModel[1]; + const formGroup = formModel.groupFactory()[0].group; + expect(formGroup[0] instanceof DynamicSelectModel).toBeTrue(); + expect(formGroup[1] instanceof DynamicDatePickerModel).toBeTrue(); + expect(formGroup[2] instanceof DynamicDatePickerModel).toBeTrue(); + }); + + it('when checkbox changed it should call operationsBuilder replace function', () => { + component.onChange(checkboxChangeEvent); + fixture.detectChanges(); + + expect(operationsBuilder.replace).toHaveBeenCalled(); + }); + + it('when dropdown select changed it should call operationsBuilder add function', () => { + component.onChange(accessConditionChangeEvent); + fixture.detectChanges(); + expect(operationsBuilder.add).toHaveBeenCalled(); + }); + }); + + describe('when canDescoverable is false', () => { + + + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ + BrowserModule, + TranslateModule.forRoot() + ], + declarations: [SubmissionSectionAccessesComponent, FormComponent], + providers: [ + { provide: SectionsService, useValue: sectionsServiceStub }, + { provide: FormBuilderService, useValue: builderService }, + { provide: SubmissionAccessesConfigService, useValue: getSubmissionAccessesConfigNotChangeDiscoverableService() }, + { provide: SectionAccessesService, useValue: sectionAccessesService }, + { provide: SectionFormOperationsService, useValue: sectionFormOperationsService }, + { provide: JsonPatchOperationsBuilder, useValue: operationsBuilder }, + { provide: TranslateService, useValue: getMockTranslateService() }, + { provide: FormService, useValue: getMockFormService() }, + { provide: Store, useValue: storeStub }, + { provide: SubmissionJsonPatchOperationsService, useValue: SubmissionJsonPatchOperationsServiceStub }, + { provide: 'sectionDataProvider', useValue: sectionData }, + { provide: 'submissionIdProvider', useValue: '1508' }, + ] + }) + .compileComponents(); + }); + + beforeEach(inject([Store], (store: Store) => { + fixture = TestBed.createComponent(SubmissionSectionAccessesComponent); + component = fixture.componentInstance; + formService = TestBed.inject(FormService); + formService.validateAllFormFields.and.callFake(() => null); + formService.isValid.and.returnValue(observableOf(true)); + formService.getFormData.and.returnValue(observableOf(mockAccessesFormData)); + fixture.detectChanges(); + })); + + + it('should have formModel length should be 1', () => { + expect(component.formModel.length).toEqual(1); + }); + + it('formModel should have only 1 model type array', () => { + expect(component.formModel[0] instanceof DynamicFormArrayModel).toBeTrue(); + }); + + }); +}); diff --git a/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.ts b/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.ts new file mode 100644 index 0000000000..5704d1abbb --- /dev/null +++ b/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.ts @@ -0,0 +1,79 @@ +import { WorkspaceitemSectionSherpaPoliciesObject } from './../../../core/submission/models/workspaceitem-section-sherpa-policies.model'; +import { SectionSherpaPoliciesService } from './section-sherpa-policies.service'; +import { Component, Inject, ViewChild } from '@angular/core'; +import { FormControl } from '@angular/forms'; + +import { filter, map, mergeMap, take } from 'rxjs/operators'; +import { combineLatest, Observable, of, Subscription } from 'rxjs'; +import { TranslateService } from '@ngx-translate/core'; + +import { renderSectionFor } from '../sections-decorator'; +import { SectionsType } from '../sections-type'; +import { SectionDataObject } from '../models/section-data.model'; +import { SectionsService } from '../sections.service'; +import { SectionModelComponent } from '../models/section.model'; +import { NgbAccordionConfig } from '@ng-bootstrap/ng-bootstrap'; + +/** + * This component represents a section for managing item's access conditions. + */ +@Component({ + selector: 'ds-section-sherpa-policies', + templateUrl: './section-sherpa-policies.component.html', + styleUrls: ['./section-sherpa-policies.component.scss'] +}) +@renderSectionFor(SectionsType.SherpaPolicies) +export class SubmissionSectionSherpaPoliciesComponent extends SectionModelComponent { + + /** + * The accesses section data + * @type {WorkspaceitemSectionAccessesObject} + */ + public sherpaPoliciesData: WorkspaceitemSectionSherpaPoliciesObject; + + + /** + * Initialize instance variables + * + * @param {SectionsService} sectionService + * @param {SectionDataObject} injectedSectionData + * @param {SectionSherpaPoliciesService} sectionSherpaPoliciesService + * @param {string} injectedSubmissionId + */ + constructor( + protected sectionService: SectionsService, + private sectionSherpaPoliciesService: SectionSherpaPoliciesService, + @Inject('sectionDataProvider') public injectedSectionData: SectionDataObject, + @Inject('submissionIdProvider') public injectedSubmissionId: string) { + super(undefined, injectedSectionData, injectedSubmissionId); + } + + /** + * Unsubscribe from all subscriptions + */ + // tslint:disable-next-line:no-empty + onSectionDestroy() { + + } + + /** + * Initialize all instance variables and retrieve collection default access conditions + */ + protected onSectionInit(): void { + this.sectionSherpaPoliciesService.getSherpaPoliciesData(this.submissionId, this.sectionData.id).subscribe((sherpaPolicies: WorkspaceitemSectionSherpaPoliciesObject) => { + console.log(sherpaPolicies); + this.sherpaPoliciesData = sherpaPolicies; + }); + } + + /** + * Get section status + * + * @return Observable + * the section status + */ + protected getSectionStatus(): Observable { + return of(true); + } + +} diff --git a/src/app/submission/sections/sherpa-policies/section-sherpa-policies.service.ts b/src/app/submission/sections/sherpa-policies/section-sherpa-policies.service.ts new file mode 100644 index 0000000000..c81caca41e --- /dev/null +++ b/src/app/submission/sections/sherpa-policies/section-sherpa-policies.service.ts @@ -0,0 +1,42 @@ +import { WorkspaceitemSectionSherpaPoliciesObject } from './../../../core/submission/models/workspaceitem-section-sherpa-policies.model'; +import { Injectable } from '@angular/core'; + +import { Observable } from 'rxjs'; +import { distinctUntilChanged, filter } from 'rxjs/operators'; +import { Store } from '@ngrx/store'; + +import { SubmissionState } from '../../submission.reducers'; +import { isNotUndefined } from '../../../shared/empty.util'; +import { submissionSectionDataFromIdSelector } from '../../selectors'; + +/** + * A service that provides methods to handle submission item's accesses condition state. + */ +@Injectable() +export class SectionSherpaPoliciesService { + + /** + * Initialize service variables + * + * @param {Store} store + */ + constructor(private store: Store) { } + + + /** + * Return item's accesses condition state. + * + * @param submissionId + * The submission id + * @param sectionId + * The section id + * @returns {Observable} + * Emits bitstream's metadata + */ + public getSherpaPoliciesData(submissionId: string, sectionId: string): Observable { + + return this.store.select(submissionSectionDataFromIdSelector(submissionId, sectionId)).pipe( + filter((state) => isNotUndefined(state)), + distinctUntilChanged()); + } +} diff --git a/src/app/submission/submission.module.ts b/src/app/submission/submission.module.ts index 939d1bff29..f1cedc8953 100644 --- a/src/app/submission/submission.module.ts +++ b/src/app/submission/submission.module.ts @@ -1,3 +1,4 @@ +import { SectionSherpaPoliciesService } from './sections/sherpa-policies/section-sherpa-policies.service'; import { NgModule } from '@angular/core'; import { CoreModule } from '../core/core.module'; import { SharedModule } from '../shared/shared.module'; @@ -42,6 +43,8 @@ import { NgbAccordionModule, NgbModalModule } from '@ng-bootstrap/ng-bootstrap'; import { SubmissionSectionAccessesComponent } from './sections/accesses/section-accesses.component'; import { SubmissionAccessesConfigService } from '../core/config/submission-accesses-config.service'; import { SectionAccessesService } from './sections/accesses/section-accesses.service'; +import { SubmissionSectionSherpaPoliciesComponent } from './sections/sherpa-policies/section-sherpa-policies.component'; +import { ContentAccordionComponent } from './sections/sherpa-policies/content-accordion/content-accordion.component'; const ENTRY_COMPONENTS = [ // put only entry components that use custom decorator @@ -50,7 +53,8 @@ const ENTRY_COMPONENTS = [ SubmissionSectionLicenseComponent, SubmissionSectionCcLicensesComponent, SubmissionSectionAccessesComponent, - SubmissionSectionUploadFileEditComponent + SubmissionSectionUploadFileEditComponent, + SubmissionSectionSherpaPoliciesComponent, ]; const DECLARATIONS = [ @@ -75,6 +79,7 @@ const DECLARATIONS = [ SubmissionImportExternalSearchbarComponent, SubmissionImportExternalPreviewComponent, SubmissionImportExternalCollectionComponent, + ContentAccordionComponent, ]; @NgModule({ @@ -97,7 +102,8 @@ const DECLARATIONS = [ SectionsService, SubmissionUploadsConfigService, SubmissionAccessesConfigService, - SectionAccessesService + SectionAccessesService, + SectionSherpaPoliciesService ] }) From da2cba5827d22be7bb8df4a53d14fd488bc0eb80 Mon Sep 17 00:00:00 2001 From: Rezart Vata Date: Thu, 21 Apr 2022 18:48:19 +0200 Subject: [PATCH 026/343] [CST-5270] Added some information from mock json to the layout --- .../content-accordion.component.html | 48 ++++++++++-- .../content-accordion.component.scss | 2 +- .../content-accordion.component.ts | 10 +-- .../section-sherpa-policies.component.html | 78 ++++++++++++++++++- 4 files changed, 122 insertions(+), 16 deletions(-) diff --git a/src/app/submission/sections/sherpa-policies/content-accordion/content-accordion.component.html b/src/app/submission/sections/sherpa-policies/content-accordion/content-accordion.component.html index 8aa4a7ef9f..2a453ec408 100644 --- a/src/app/submission/sections/sherpa-policies/content-accordion/content-accordion.component.html +++ b/src/app/submission/sections/sherpa-policies/content-accordion/content-accordion.component.html @@ -1,26 +1,60 @@ - - + + - Publication information + {{id.replace('-',' ') | titlecase}}
- - + +
-

Title

+

Article Version

+ {{data.articleVersion}}
-

ISSNs

+

Conditions

+

{{condition}}

+
+
+
+
+

Prerequisites

+
+
+

{{prerequisite}}

+
+
+
+
+

Location

+
+
+

{{location}}

+
+
+
+
+

License

+
+
+

{{license}}

+
+
+
+
+

Embargo

+
+
+

{{data.embargo.amount}} {{data.embargo.units}}

diff --git a/src/app/submission/sections/sherpa-policies/content-accordion/content-accordion.component.scss b/src/app/submission/sections/sherpa-policies/content-accordion/content-accordion.component.scss index 73d0f259cc..b18e7d3781 100644 --- a/src/app/submission/sections/sherpa-policies/content-accordion/content-accordion.component.scss +++ b/src/app/submission/sections/sherpa-policies/content-accordion/content-accordion.component.scss @@ -14,7 +14,7 @@ padding: 0px; width: 100%; color: #000; - font-weight: normal; + font-weight: 600; .fas { background: #fff; diff --git a/src/app/submission/sections/sherpa-policies/content-accordion/content-accordion.component.ts b/src/app/submission/sections/sherpa-policies/content-accordion/content-accordion.component.ts index 09e1d174d1..95f85e0732 100644 --- a/src/app/submission/sections/sherpa-policies/content-accordion/content-accordion.component.ts +++ b/src/app/submission/sections/sherpa-policies/content-accordion/content-accordion.component.ts @@ -1,15 +1,13 @@ -import { Component, OnInit } from '@angular/core'; +import { Component, Input } from '@angular/core'; @Component({ selector: 'ds-content-accordion', templateUrl: './content-accordion.component.html', styleUrls: ['./content-accordion.component.scss'] }) -export class ContentAccordionComponent implements OnInit { +export class ContentAccordionComponent { - constructor() { } - - ngOnInit(): void { - } + @Input() id: string; + @Input() data: any; } diff --git a/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.html b/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.html index a8014f0d6e..dbb33ee806 100644 --- a/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.html +++ b/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.html @@ -25,6 +25,50 @@

{{issn}}

+ + +
+
+

romeoPub

+
+
+

+ {{sherpaPoliciesData.details.journals.romeoPub}} +

+
+
+
+
+

zetoPub

+
+
+

+ {{sherpaPoliciesData.details.journals.zetoPub}} +

+
+
@@ -38,8 +82,38 @@ Publisher Policy - - +
+
+
+

+ Open Access pathways permitted by this journal's policy are listed below by article version. + Click on a pathway for a more detailed view +

+
+
+ + + +
+
+

+ For more information, please see the following links: +

+ +
+
+ + +
+ + + +
\ No newline at end of file From 459da211bede61fb6f2170b96a80293885bdac6c Mon Sep 17 00:00:00 2001 From: nibou230 Date: Wed, 13 Apr 2022 13:03:37 -0400 Subject: [PATCH 027/343] Display the access status badges --- config/config.example.yml | 2 + src/app/core/core.module.ts | 4 +- src/app/core/data/item-data.service.ts | 22 +++ .../access-status-badge.component.html | 3 + .../access-status-badge.component.spec.ts | 160 ++++++++++++++++++ .../access-status-badge.component.ts | 45 +++++ .../access-status.model.ts | 23 +++ .../access-status.resource-type.ts | 9 + ...-search-result-list-element.component.html | 5 +- ...em-search-result-list-element.component.ts | 6 + src/app/shared/shared.module.ts | 2 + src/assets/i18n/en.json5 | 10 ++ src/assets/i18n/fr.json5 | 15 ++ src/config/default-app-config.ts | 5 +- src/config/ui-server-config.interface.ts | 2 + src/environments/environment.test.ts | 4 +- 16 files changed, 313 insertions(+), 4 deletions(-) create mode 100644 src/app/shared/object-list/access-status-badge/access-status-badge.component.html create mode 100644 src/app/shared/object-list/access-status-badge/access-status-badge.component.spec.ts create mode 100644 src/app/shared/object-list/access-status-badge/access-status-badge.component.ts create mode 100644 src/app/shared/object-list/access-status-badge/access-status.model.ts create mode 100644 src/app/shared/object-list/access-status-badge/access-status.resource-type.ts diff --git a/config/config.example.yml b/config/config.example.yml index 771c7b1653..724d7f8a64 100644 --- a/config/config.example.yml +++ b/config/config.example.yml @@ -13,6 +13,8 @@ ui: rateLimiter: windowMs: 60000 # 1 minute max: 500 # limit each IP to 500 requests per windowMs + # Show the file access status in items lists + showAccessStatuses: false # The REST API server settings # NOTE: these must be 'synced' with the 'dspace.server.url' setting in your backend's local.cfg. diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index e9e242dbc0..b90a3edd46 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -163,6 +163,7 @@ import { SequenceService } from './shared/sequence.service'; import { CoreState } from './core-state.model'; import { GroupDataService } from './eperson/group-data.service'; import { SubmissionAccessesModel } from './config/models/config-submission-accesses.model'; +import { AccessStatusObject } from '../shared/object-list/access-status-badge/access-status.model'; /** * When not in production, endpoint responses can be mocked for testing purposes @@ -346,7 +347,8 @@ export const models = UsageReport, Root, SearchConfig, - SubmissionAccessesModel + SubmissionAccessesModel, + AccessStatusObject ]; @NgModule({ diff --git a/src/app/core/data/item-data.service.ts b/src/app/core/data/item-data.service.ts index cb5d7a3d57..9a2dc5a8af 100644 --- a/src/app/core/data/item-data.service.ts +++ b/src/app/core/data/item-data.service.ts @@ -36,6 +36,7 @@ import { sendRequest } from '../shared/request.operators'; import { RestRequest } from './rest-request.model'; import { CoreState } from '../core-state.model'; import { FindListOptions } from './find-list-options.model'; +import { AccessStatusObject } from 'src/app/shared/object-list/access-status-badge/access-status.model'; @Injectable() @dataService(ITEM) @@ -291,6 +292,27 @@ export class ItemDataService extends DataService { ); } + /** + * Get the the access status + * @param itemId + */ + public getAccessStatus(itemId: string): Observable> { + const requestId = this.requestService.generateRequestId(); + const href$ = this.halService.getEndpoint('accessStatus').pipe( + map((href) => href.replace('{?uuid}', `?uuid=${itemId}`)) + ); + + href$.pipe( + find((href: string) => hasValue(href)), + map((href: string) => { + const request = new GetRequest(requestId, href); + this.requestService.send(request); + }) + ).subscribe(); + + return this.rdbService.buildFromRequestUUID(requestId); + } + /** * Invalidate the cache of the item * @param itemUUID diff --git a/src/app/shared/object-list/access-status-badge/access-status-badge.component.html b/src/app/shared/object-list/access-status-badge/access-status-badge.component.html new file mode 100644 index 0000000000..a7b3edc9b3 --- /dev/null +++ b/src/app/shared/object-list/access-status-badge/access-status-badge.component.html @@ -0,0 +1,3 @@ +
+ {{ status | translate }} +
diff --git a/src/app/shared/object-list/access-status-badge/access-status-badge.component.spec.ts b/src/app/shared/object-list/access-status-badge/access-status-badge.component.spec.ts new file mode 100644 index 0000000000..da0677a5de --- /dev/null +++ b/src/app/shared/object-list/access-status-badge/access-status-badge.component.spec.ts @@ -0,0 +1,160 @@ +import { Item } from '../../../core/shared/item.model'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { TranslateModule } from '@ngx-translate/core'; +import { TruncatePipe } from '../../utils/truncate.pipe'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { AccessStatusBadgeComponent } from './access-status-badge.component'; +import { createSuccessfulRemoteDataObject$ } from '../../remote-data.utils'; +import { By } from '@angular/platform-browser'; +import { ItemDataService } from 'src/app/core/data/item-data.service'; +import { AccessStatusObject } from './access-status.model'; + +describe('ItemAccessStatusBadgeComponent', () => { + let component: AccessStatusBadgeComponent; + let fixture: ComponentFixture; + + let unknownStatus: AccessStatusObject; + let metadataOnlyStatus: AccessStatusObject; + let openAccessStatus: AccessStatusObject; + let embargoStatus: AccessStatusObject; + let restrictedStatus: AccessStatusObject; + + let itemDataService: ItemDataService; + + let item: Item; + + function init() { + unknownStatus = Object.assign(new AccessStatusObject(), { + status: 'unknown' + }); + + metadataOnlyStatus = Object.assign(new AccessStatusObject(), { + status: 'metadata.only' + }); + + openAccessStatus = Object.assign(new AccessStatusObject(), { + status: 'open.access' + }); + + embargoStatus = Object.assign(new AccessStatusObject(), { + status: 'embargo' + }); + + restrictedStatus = Object.assign(new AccessStatusObject(), { + status: 'restricted' + }); + + itemDataService = jasmine.createSpyObj('itemDataService', { + getAccessStatus: createSuccessfulRemoteDataObject$(unknownStatus) + }); + + item = Object.assign(new Item(), { + uuid: 'item-uuid' + }); + } + + function initTestBed() { + TestBed.configureTestingModule({ + imports: [TranslateModule.forRoot()], + declarations: [AccessStatusBadgeComponent, TruncatePipe], + schemas: [NO_ERRORS_SCHEMA], + providers: [ + {provide: ItemDataService, useValue: itemDataService} + ] + }).compileComponents(); + } + + function initFixtureAndComponent() { + fixture = TestBed.createComponent(AccessStatusBadgeComponent); + component = fixture.componentInstance; + component.uuid = item.uuid; + fixture.detectChanges(); + } + + function lookForAccessStatusBadge(status: string) { + const badge = fixture.debugElement.query(By.css('span.badge')); + expect(badge.nativeElement.textContent).toEqual(`access-status.${status.toLowerCase()}.listelement.badge`); + } + + describe('init', () => { + beforeEach(waitForAsync(() => { + init(); + initTestBed(); + })); + beforeEach(() => { + initFixtureAndComponent(); + }); + it('should init the component', () => { + expect(component).toBeTruthy(); + }); + }); + + describe('When the getAccessStatus method returns unknown', () => { + beforeEach(waitForAsync(() => { + init(); + initTestBed(); + })); + beforeEach(() => { + initFixtureAndComponent(); + }); + it('should show the unknown badge', () => { + lookForAccessStatusBadge('unknown'); + }); + }); + + describe('When the getAccessStatus method returns metadata.only', () => { + beforeEach(waitForAsync(() => { + init(); + (itemDataService.getAccessStatus as jasmine.Spy).and.returnValue(createSuccessfulRemoteDataObject$(metadataOnlyStatus)); + initTestBed(); + })); + beforeEach(() => { + initFixtureAndComponent(); + }); + it('should show the metadata only badge', () => { + lookForAccessStatusBadge('metadata.only'); + }); + }); + + describe('When the getAccessStatus method returns open.access', () => { + beforeEach(waitForAsync(() => { + init(); + (itemDataService.getAccessStatus as jasmine.Spy).and.returnValue(createSuccessfulRemoteDataObject$(openAccessStatus)); + initTestBed(); + })); + beforeEach(() => { + initFixtureAndComponent(); + }); + it('should show the open access badge', () => { + lookForAccessStatusBadge('open.access'); + }); + }); + + describe('When the getAccessStatus method returns embargo', () => { + beforeEach(waitForAsync(() => { + init(); + (itemDataService.getAccessStatus as jasmine.Spy).and.returnValue(createSuccessfulRemoteDataObject$(embargoStatus)); + initTestBed(); + })); + beforeEach(() => { + initFixtureAndComponent(); + }); + it('should show the embargo badge', () => { + lookForAccessStatusBadge('embargo'); + }); + }); + + describe('When the getAccessStatus method returns restricted', () => { + beforeEach(waitForAsync(() => { + init(); + (itemDataService.getAccessStatus as jasmine.Spy).and.returnValue(createSuccessfulRemoteDataObject$(restrictedStatus)); + initTestBed(); + })); + beforeEach(() => { + initFixtureAndComponent(); + }); + it('should show the restricted badge', () => { + lookForAccessStatusBadge('restricted'); + }); + }); +}); diff --git a/src/app/shared/object-list/access-status-badge/access-status-badge.component.ts b/src/app/shared/object-list/access-status-badge/access-status-badge.component.ts new file mode 100644 index 0000000000..b181ae4104 --- /dev/null +++ b/src/app/shared/object-list/access-status-badge/access-status-badge.component.ts @@ -0,0 +1,45 @@ +import { Component, Input } from '@angular/core'; +import { map } from 'rxjs/operators'; +import { Observable } from 'rxjs'; +import { getFirstSucceededRemoteDataPayload } from 'src/app/core/shared/operators'; +import { ItemDataService } from 'src/app/core/data/item-data.service'; +import { AccessStatusObject } from './access-status.model'; +import { hasValue } from '../../empty.util'; + +@Component({ + selector: 'ds-access-status-badge', + templateUrl: './access-status-badge.component.html' +}) +/** + * Component rendering the access status of an item as a badge + */ +export class AccessStatusBadgeComponent { + + private _uuid: string; + private _accessStatus$: Observable; + + /** + * Initialize instance variables + * + * @param {ItemDataService} itemDataService + */ + constructor(private itemDataService: ItemDataService) { } + + ngOnInit(): void { + this._accessStatus$ = this.itemDataService + .getAccessStatus(this._uuid) + .pipe( + getFirstSucceededRemoteDataPayload(), + map((accessStatus: AccessStatusObject) => hasValue(accessStatus.status) ? accessStatus.status : 'unknown'), + map((status: string) => `access-status.${status.toLowerCase()}.listelement.badge`) + ); + } + + @Input() set uuid(uuid: string) { + this._uuid = uuid; + } + + get accessStatus$(): Observable { + return this._accessStatus$; + } +} diff --git a/src/app/shared/object-list/access-status-badge/access-status.model.ts b/src/app/shared/object-list/access-status-badge/access-status.model.ts new file mode 100644 index 0000000000..6cdcafdbd8 --- /dev/null +++ b/src/app/shared/object-list/access-status-badge/access-status.model.ts @@ -0,0 +1,23 @@ +import { autoserialize } from 'cerialize'; +import { typedObject } from 'src/app/core/cache/builders/build-decorators'; +import { ResourceType } from 'src/app/core/shared/resource-type'; +import { excludeFromEquals } from 'src/app/core/utilities/equals.decorators'; +import { ACCESS_STATUS } from './access-status.resource-type'; + +@typedObject +export class AccessStatusObject { + static type = ACCESS_STATUS; + + /** + * The type for this AccessStatusObject + */ + @excludeFromEquals + @autoserialize + type: ResourceType; + + /** + * The access status value + */ + @autoserialize + status: string; +} diff --git a/src/app/shared/object-list/access-status-badge/access-status.resource-type.ts b/src/app/shared/object-list/access-status-badge/access-status.resource-type.ts new file mode 100644 index 0000000000..ead2afc0b1 --- /dev/null +++ b/src/app/shared/object-list/access-status-badge/access-status.resource-type.ts @@ -0,0 +1,9 @@ +import { ResourceType } from 'src/app/core/shared/resource-type'; + +/** + * The resource type for Access Status + * + * Needs to be in a separate file to prevent circular + * dependencies in webpack. + */ +export const ACCESS_STATUS = new ResourceType('accessStatus'); diff --git a/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component.html b/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component.html index 8898632eb5..8bea795cca 100644 --- a/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component.html +++ b/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component.html @@ -1,4 +1,7 @@ - +
+ + +
Date: Wed, 20 Apr 2022 09:12:59 -0400 Subject: [PATCH 028/343] Adapt the service to a LinkedRepository result --- src/app/core/data/item-data.service.spec.ts | 36 ++++++++++++++++--- src/app/core/data/item-data.service.ts | 30 +++++++++------- .../data/version-history-data.service.spec.ts | 2 +- .../access-status.model.ts | 14 ++++++-- .../testing/hal-endpoint-service.stub.ts | 6 +++- 5 files changed, 67 insertions(+), 21 deletions(-) diff --git a/src/app/core/data/item-data.service.spec.ts b/src/app/core/data/item-data.service.spec.ts index cc1e3b6e20..e85ddb2f38 100644 --- a/src/app/core/data/item-data.service.spec.ts +++ b/src/app/core/data/item-data.service.spec.ts @@ -10,12 +10,13 @@ import { ObjectCacheService } from '../cache/object-cache.service'; import { RestResponse } from '../cache/response.models'; import { ExternalSourceEntry } from '../shared/external-source-entry.model'; import { ItemDataService } from './item-data.service'; -import { DeleteRequest, PostRequest } from './request.models'; +import { DeleteRequest, GetRequest, PostRequest } from './request.models'; import { RequestService } from './request.service'; import { getMockRemoteDataBuildService } from '../../shared/mocks/remote-data-build.service.mock'; import { CoreState } from '../core-state.model'; import { RequestEntry } from './request-entry.model'; import { FindListOptions } from './find-list-options.model'; +import { HALEndpointServiceStub } from 'src/app/shared/testing/hal-endpoint-service.stub'; describe('ItemDataService', () => { let scheduler: TestScheduler; @@ -36,13 +37,11 @@ describe('ItemDataService', () => { }) as RequestService; const rdbService = getMockRemoteDataBuildService(); - const itemEndpoint = 'https://rest.api/core/items'; + const itemEndpoint = 'https://rest.api/core'; const store = {} as Store; const objectCache = {} as ObjectCacheService; - const halEndpointService = jasmine.createSpyObj('halService', { - getEndpoint: observableOf(itemEndpoint) - }); + const halEndpointService: any = new HALEndpointServiceStub(itemEndpoint); const bundleService = jasmine.createSpyObj('bundleService', { findByHref: {} }); @@ -185,6 +184,33 @@ describe('ItemDataService', () => { }); }); + describe('getAccessStatusEndpoint', () => { + beforeEach(() => { + service = initTestService(); + }); + it('should retrieve the access status endpoint', () => { + const itemId = '3de6ea60-ec39-419b-ae6f-065930ac1429'; + const result = service.getAccessStatusEndpoint(itemId); + result.subscribe(((value) => { + expect(value).toEqual(`${itemEndpoint}/items/${itemId}/accessStatus`); + })); + }); + }); + + describe('getAccessStatus', () => { + beforeEach(() => { + service = initTestService(); + }); + it('should send a GET request', (done) => { + const itemId = '3de6ea60-ec39-419b-ae6f-065930ac1429'; + const result = service.getAccessStatus(itemId); + result.subscribe(() => { + expect(requestService.send).toHaveBeenCalledWith(jasmine.any(GetRequest)); + done(); + }); + }); + }); + describe('when cache is invalidated', () => { beforeEach(() => { service = initTestService(); diff --git a/src/app/core/data/item-data.service.ts b/src/app/core/data/item-data.service.ts index 9a2dc5a8af..c7f0f541f8 100644 --- a/src/app/core/data/item-data.service.ts +++ b/src/app/core/data/item-data.service.ts @@ -292,25 +292,31 @@ export class ItemDataService extends DataService { ); } + /** + * Get the endpoint for an item's access status + * @param itemId + */ + public getAccessStatusEndpoint(itemId: string): Observable { + return this.halService.getEndpoint(this.linkPath).pipe( + switchMap((url: string) => this.halService.getEndpoint('accessStatus', `${url}/${itemId}`)) + ); + } + /** * Get the the access status * @param itemId */ public getAccessStatus(itemId: string): Observable> { - const requestId = this.requestService.generateRequestId(); - const href$ = this.halService.getEndpoint('accessStatus').pipe( - map((href) => href.replace('{?uuid}', `?uuid=${itemId}`)) - ); + const hrefObs = this.getAccessStatusEndpoint(itemId); - href$.pipe( - find((href: string) => hasValue(href)), - map((href: string) => { - const request = new GetRequest(requestId, href); - this.requestService.send(request); - }) - ).subscribe(); + hrefObs.pipe( + take(1) + ).subscribe((href) => { + const request = new GetRequest(this.requestService.generateRequestId(), href); + this.requestService.send(request); + }); - return this.rdbService.buildFromRequestUUID(requestId); + return this.rdbService.buildSingle(hrefObs); } /** diff --git a/src/app/core/data/version-history-data.service.spec.ts b/src/app/core/data/version-history-data.service.spec.ts index 207093b4d5..26ed370026 100644 --- a/src/app/core/data/version-history-data.service.spec.ts +++ b/src/app/core/data/version-history-data.service.spec.ts @@ -151,7 +151,7 @@ describe('VersionHistoryDataService', () => { describe('when getVersionsEndpoint is called', () => { it('should return the correct value', () => { service.getVersionsEndpoint(versionHistoryId).subscribe((res) => { - expect(res).toBe(url + '/versions'); + expect(res).toBe(url + '/versionhistories/version-history-id/versions'); }); }); }); diff --git a/src/app/shared/object-list/access-status-badge/access-status.model.ts b/src/app/shared/object-list/access-status-badge/access-status.model.ts index 6cdcafdbd8..31de1a3a38 100644 --- a/src/app/shared/object-list/access-status-badge/access-status.model.ts +++ b/src/app/shared/object-list/access-status-badge/access-status.model.ts @@ -1,11 +1,13 @@ -import { autoserialize } from 'cerialize'; +import { autoserialize, deserialize } from 'cerialize'; import { typedObject } from 'src/app/core/cache/builders/build-decorators'; +import { CacheableObject } from 'src/app/core/cache/object-cache.reducer'; +import { HALLink } from 'src/app/core/shared/hal-link.model'; import { ResourceType } from 'src/app/core/shared/resource-type'; import { excludeFromEquals } from 'src/app/core/utilities/equals.decorators'; import { ACCESS_STATUS } from './access-status.resource-type'; @typedObject -export class AccessStatusObject { +export class AccessStatusObject implements CacheableObject { static type = ACCESS_STATUS; /** @@ -20,4 +22,12 @@ export class AccessStatusObject { */ @autoserialize status: string; + + /** + * The {@link HALLink}s for this AccessStatusObject + */ + @deserialize + _links: { + self: HALLink; + }; } diff --git a/src/app/shared/testing/hal-endpoint-service.stub.ts b/src/app/shared/testing/hal-endpoint-service.stub.ts index 19f95d577c..753efcdb5d 100644 --- a/src/app/shared/testing/hal-endpoint-service.stub.ts +++ b/src/app/shared/testing/hal-endpoint-service.stub.ts @@ -1,9 +1,13 @@ import { of as observableOf } from 'rxjs'; +import { hasValue } from '../empty.util'; export class HALEndpointServiceStub { constructor(private url: string) {} - getEndpoint(path: string) { + getEndpoint(path: string, startHref?: string) { + if (hasValue(startHref)) { + return observableOf(startHref + '/' + path); + } return observableOf(this.url + '/' + path); } } From a2a241b906d457164f2954733f8481792e341269 Mon Sep 17 00:00:00 2001 From: nibou230 Date: Thu, 21 Apr 2022 12:32:11 -0400 Subject: [PATCH 029/343] Added the badge to some components for coherence --- ...m-search-result-grid-element.component.html | 1 + ...tem-search-result-grid-element.component.ts | 6 ++++++ .../access-status-badge.component.html | 4 ++-- .../access-status-badge.component.ts | 18 +++++++++++++----- .../item-list-preview.component.html | 5 ++++- .../item-list-preview.component.ts | 9 +++++++++ ...m-search-result-list-element.component.html | 2 +- 7 files changed, 36 insertions(+), 9 deletions(-) diff --git a/src/app/shared/object-grid/search-result-grid-element/item-search-result/item/item-search-result-grid-element.component.html b/src/app/shared/object-grid/search-result-grid-element/item-search-result/item/item-search-result-grid-element.component.html index 7fdb505d43..c4bb444d44 100644 --- a/src/app/shared/object-grid/search-result-grid-element/item-search-result/item/item-search-result-grid-element.component.html +++ b/src/app/shared/object-grid/search-result-grid-element/item-search-result/item/item-search-result-grid-element.component.html @@ -18,6 +18,7 @@
+

diff --git a/src/app/shared/object-grid/search-result-grid-element/item-search-result/item/item-search-result-grid-element.component.ts b/src/app/shared/object-grid/search-result-grid-element/item-search-result/item/item-search-result-grid-element.component.ts index a628c1e7e8..77fc25ff29 100644 --- a/src/app/shared/object-grid/search-result-grid-element/item-search-result/item/item-search-result-grid-element.component.ts +++ b/src/app/shared/object-grid/search-result-grid-element/item-search-result/item/item-search-result-grid-element.component.ts @@ -6,6 +6,7 @@ import { SearchResultGridElementComponent } from '../../search-result-grid-eleme import { Item } from '../../../../../core/shared/item.model'; import { ItemSearchResult } from '../../../../object-collection/shared/item-search-result.model'; import { getItemPageRoute } from '../../../../../item-page/item-page-routing-paths'; +import { environment } from 'src/environments/environment'; @listableObjectComponent('PublicationSearchResult', ViewMode.GridElement) @listableObjectComponent(ItemSearchResult, ViewMode.GridElement) @@ -23,9 +24,14 @@ export class ItemSearchResultGridElementComponent extends SearchResultGridElemen * Route to the item's page */ itemPageRoute: string; + /** + * Whether to show the access status badge or not + */ + showAccessStatus: boolean; ngOnInit(): void { super.ngOnInit(); this.itemPageRoute = getItemPageRoute(this.dso); + this.showAccessStatus = environment.ui.showAccessStatuses; } } diff --git a/src/app/shared/object-list/access-status-badge/access-status-badge.component.html b/src/app/shared/object-list/access-status-badge/access-status-badge.component.html index a7b3edc9b3..8fc3a82740 100644 --- a/src/app/shared/object-list/access-status-badge/access-status-badge.component.html +++ b/src/app/shared/object-list/access-status-badge/access-status-badge.component.html @@ -1,3 +1,3 @@ -
- {{ status | translate }} +
+ {{ accessStatus | translate }}
diff --git a/src/app/shared/object-list/access-status-badge/access-status-badge.component.ts b/src/app/shared/object-list/access-status-badge/access-status-badge.component.ts index b181ae4104..bf76a429f7 100644 --- a/src/app/shared/object-list/access-status-badge/access-status-badge.component.ts +++ b/src/app/shared/object-list/access-status-badge/access-status-badge.component.ts @@ -1,7 +1,7 @@ import { Component, Input } from '@angular/core'; -import { map } from 'rxjs/operators'; -import { Observable } from 'rxjs'; -import { getFirstSucceededRemoteDataPayload } from 'src/app/core/shared/operators'; +import { catchError, map } from 'rxjs/operators'; +import { Observable, of as observableOf } from 'rxjs'; +import { getFirstCompletedRemoteData } from 'src/app/core/shared/operators'; import { ItemDataService } from 'src/app/core/data/item-data.service'; import { AccessStatusObject } from './access-status.model'; import { hasValue } from '../../empty.util'; @@ -29,9 +29,17 @@ export class AccessStatusBadgeComponent { this._accessStatus$ = this.itemDataService .getAccessStatus(this._uuid) .pipe( - getFirstSucceededRemoteDataPayload(), + getFirstCompletedRemoteData(), + map((accessStatusRD) => { + if (accessStatusRD.statusCode !== 401 && hasValue(accessStatusRD.payload)) { + return accessStatusRD.payload; + } else { + return []; + } + }), map((accessStatus: AccessStatusObject) => hasValue(accessStatus.status) ? accessStatus.status : 'unknown'), - map((status: string) => `access-status.${status.toLowerCase()}.listelement.badge`) + map((status: string) => `access-status.${status.toLowerCase()}.listelement.badge`), + catchError(() => observableOf('access-status.unknown.listelement.badge')) ); } diff --git a/src/app/shared/object-list/my-dspace-result-list-element/item-list-preview/item-list-preview.component.html b/src/app/shared/object-list/my-dspace-result-list-element/item-list-preview/item-list-preview.component.html index c518d39bd9..4801e66a26 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/item-list-preview/item-list-preview.component.html +++ b/src/app/shared/object-list/my-dspace-result-list-element/item-list-preview/item-list-preview.component.html @@ -2,7 +2,10 @@ - +
+ + +

diff --git a/src/app/shared/object-list/my-dspace-result-list-element/item-list-preview/item-list-preview.component.ts b/src/app/shared/object-list/my-dspace-result-list-element/item-list-preview/item-list-preview.component.ts index 840960d51f..6b2290c711 100644 --- a/src/app/shared/object-list/my-dspace-result-list-element/item-list-preview/item-list-preview.component.ts +++ b/src/app/shared/object-list/my-dspace-result-list-element/item-list-preview/item-list-preview.component.ts @@ -1,4 +1,5 @@ import { Component, Input } from '@angular/core'; +import { environment } from 'src/environments/environment'; import { Item } from '../../../../core/shared/item.model'; import { fadeInOut } from '../../../animations/fade'; @@ -36,4 +37,12 @@ export class ItemListPreviewComponent { */ @Input() showSubmitter = false; + /** + * Whether to show the access status badge or not + */ + showAccessStatus: boolean; + + ngOnInit(): void { + this.showAccessStatus = environment.ui.showAccessStatuses; + } } diff --git a/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component.html b/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component.html index 8bea795cca..8e216bb82c 100644 --- a/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component.html +++ b/src/app/shared/object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component.html @@ -1,6 +1,6 @@
- +
From 9f50b4997cbe0b6a93c701ceff93596af0b9922b Mon Sep 17 00:00:00 2001 From: nibou230 Date: Thu, 21 Apr 2022 14:30:23 -0400 Subject: [PATCH 030/343] Changed the import for CacheableObject --- .../object-list/access-status-badge/access-status.model.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/shared/object-list/access-status-badge/access-status.model.ts b/src/app/shared/object-list/access-status-badge/access-status.model.ts index 31de1a3a38..69b5e920d0 100644 --- a/src/app/shared/object-list/access-status-badge/access-status.model.ts +++ b/src/app/shared/object-list/access-status-badge/access-status.model.ts @@ -1,6 +1,6 @@ import { autoserialize, deserialize } from 'cerialize'; import { typedObject } from 'src/app/core/cache/builders/build-decorators'; -import { CacheableObject } from 'src/app/core/cache/object-cache.reducer'; +import { CacheableObject } from 'src/app/core/cache/cacheable-object.model'; import { HALLink } from 'src/app/core/shared/hal-link.model'; import { ResourceType } from 'src/app/core/shared/resource-type'; import { excludeFromEquals } from 'src/app/core/utilities/equals.decorators'; From 361bb7f7dc4e4fb3b220f16f34e54b0d605f6824 Mon Sep 17 00:00:00 2001 From: Kim Shepherd Date: Thu, 3 Feb 2022 14:05:31 +1300 Subject: [PATCH 031/343] [TLC-254] Port submission field type binding from DSpace-CRIS 7 --- src/app/core/core.module.ts | 2 + src/app/shared/empty.util.ts | 26 ++ ...amic-form-control-container.component.html | 3 +- ...c-form-control-container.component.spec.ts | 10 + ...ynamic-form-control-container.component.ts | 26 +- .../ds-dynamic-type-bind-relation.service.ts | 222 ++++++++++++++++++ .../dynamic-form-array.component.html | 12 +- .../dynamic-form-array.component.ts | 3 + .../models/date-picker/date-picker.model.ts | 37 +++ .../models/ds-dynamic-input.model.ts | 18 +- .../models/ds-dynamic-row-array-model.ts | 28 ++- .../dynamic-form-group.component.html | 12 +- .../dynamic-form-group.component.ts | 5 +- .../form/builder/form-builder.service.ts | 157 ++++++++++++- .../form/builder/models/form-field.model.ts | 6 + .../form/builder/parsers/date-field-parser.ts | 6 +- .../form/builder/parsers/field-parser.ts | 41 +++- 17 files changed, 585 insertions(+), 29 deletions(-) create mode 100644 src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-type-bind-relation.service.ts diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index e9e242dbc0..71c3230a38 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -137,6 +137,7 @@ import { SiteAdministratorGuard } from './data/feature-authorization/feature-aut import { Registration } from './shared/registration.model'; import { MetadataSchemaDataService } from './data/metadata-schema-data.service'; import { MetadataFieldDataService } from './data/metadata-field-data.service'; +import { DsDynamicTypeBindRelationService } from '../shared/form/builder/ds-dynamic-form-ui/ds-dynamic-type-bind-relation.service'; import { TokenResponseParsingService } from './auth/token-response-parsing.service'; import { SubmissionCcLicenseDataService } from './submission/submission-cc-license-data.service'; import { SubmissionCcLicence } from './submission/models/submission-cc-license.model'; @@ -250,6 +251,7 @@ const PROVIDERS = [ ClaimedTaskDataService, PoolTaskDataService, BitstreamDataService, + DsDynamicTypeBindRelationService, EntityTypeService, ContentSourceResponseParsingService, ItemTemplateDataService, diff --git a/src/app/shared/empty.util.ts b/src/app/shared/empty.util.ts index d79c520fda..355314550a 100644 --- a/src/app/shared/empty.util.ts +++ b/src/app/shared/empty.util.ts @@ -177,3 +177,29 @@ export const isNotEmptyOperator = () => export const ensureArrayHasValue = () => (source: Observable): Observable => source.pipe(map((arr: T[]): T[] => Array.isArray(arr) ? arr : [])); + +/** + * Verifies that a object keys are all empty or not. + * isObjectEmpty(); // true + * isObjectEmpty(null); // true + * isObjectEmpty(undefined); // true + * isObjectEmpty(''); // true + * isObjectEmpty([]); // true + * isObjectEmpty({}); // true + * isObjectEmpty({name: null}); // true + * isObjectEmpty({ name: 'Adam Hawkins', surname : null}); // false + */ +export function isObjectEmpty(obj?: any): boolean { + + if (typeof(obj) !== 'object') { + return true; + } + + for (const key in obj) { + if (obj.hasOwnProperty(key) && isNotEmpty(obj[key])) { + return false; + } + } + return true; +} + diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-form-control-container.component.html b/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-form-control-container.component.html index 55e354ea7a..7eef1d8655 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-form-control-container.component.html +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-form-control-container.component.html @@ -1,4 +1,5 @@
- +
diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-form-control-container.component.spec.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-form-control-container.component.spec.ts index b67e6f9e46..785b0958d5 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-form-control-container.component.spec.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-form-control-container.component.spec.ts @@ -65,6 +65,7 @@ import { DsDynamicFormArrayComponent } from './models/array-group/dynamic-form-a import { DsDynamicFormGroupComponent } from './models/form-group/dynamic-form-group.component'; import { DsDynamicRelationGroupComponent } from './models/relation-group/dynamic-relation-group.components'; import { DsDatePickerInlineComponent } from './models/date-picker-inline/dynamic-date-picker-inline.component'; +import { DsDynamicTypeBindRelationService } from './ds-dynamic-type-bind-relation.service'; import { RelationshipService } from '../../../../core/data/relationship.service'; import { SelectableListService } from '../../../object-list/selectable-list/selectable-list.service'; import { ItemDataService } from '../../../../core/data/item-data.service'; @@ -79,6 +80,13 @@ import { SubmissionService } from '../../../../submission/submission.service'; import { FormBuilderService } from '../form-builder.service'; import { NgxMaskModule } from 'ngx-mask'; +function getMockDsDynamicTypeBindRelationService(): DsDynamicTypeBindRelationService { + return jasmine.createSpyObj('DsDynamicTypeBindRelationService', { + getRelatedFormModel: jasmine.createSpy('getRelatedFormModel'), + isFormControlToBeHidden: jasmine.createSpy('isFormControlToBeHidden') + }); +} + describe('DsDynamicFormControlContainerComponent test suite', () => { const vocabularyOptions: VocabularyOptions = { @@ -142,6 +150,7 @@ describe('DsDynamicFormControlContainerComponent test suite', () => { submissionId: '1234', id: 'relationGroup', formConfiguration: [], + isInlineGroup: false, mandatoryField: '', name: 'relationGroup', relationFields: [], @@ -200,6 +209,7 @@ describe('DsDynamicFormControlContainerComponent test suite', () => { providers: [ DsDynamicFormControlContainerComponent, DynamicFormService, + { provide: DsDynamicTypeBindRelationService, useValue: getMockDsDynamicTypeBindRelationService() }, { provide: RelationshipService, useValue: {} }, { provide: SelectableListService, useValue: {} }, { provide: ItemDataService, useValue: {} }, diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-form-control-container.component.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-form-control-container.component.ts index c3359fd65a..8d27a3bace 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-form-control-container.component.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-form-control-container.component.ts @@ -76,11 +76,13 @@ import { DsDynamicLookupComponent } from './models/lookup/dynamic-lookup.compone import { DsDynamicFormGroupComponent } from './models/form-group/dynamic-form-group.component'; import { DsDynamicFormArrayComponent } from './models/array-group/dynamic-form-array.component'; import { DsDynamicRelationGroupComponent } from './models/relation-group/dynamic-relation-group.components'; +import { DynamicRelationGroupModel } from './models/relation-group/dynamic-relation-group.model'; import { DsDatePickerInlineComponent } from './models/date-picker-inline/dynamic-date-picker-inline.component'; import { DYNAMIC_FORM_CONTROL_TYPE_CUSTOM_SWITCH } from './models/custom-switch/custom-switch.model'; import { CustomSwitchComponent } from './models/custom-switch/custom-switch.component'; import { find, map, startWith, switchMap, take } from 'rxjs/operators'; import { combineLatest as observableCombineLatest, Observable, Subscription } from 'rxjs'; +import { DsDynamicTypeBindRelationService } from './ds-dynamic-type-bind-relation.service'; import { SearchResult } from '../../../search/models/search-result.model'; import { DSpaceObject } from '../../../../core/shared/dspace-object.model'; import { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap'; @@ -194,8 +196,10 @@ export class DsDynamicFormControlContainerComponent extends DynamicFormControlCo @ContentChildren(DynamicTemplateDirective) contentTemplateList: QueryList; // eslint-disable-next-line @angular-eslint/no-input-rename @Input('templates') inputTemplateList: QueryList; - + @Input() hasMetadataModel: any; @Input() formId: string; + @Input() formGroup: FormGroup; + @Input() formModel: DynamicFormControlModel[]; @Input() asBootstrapFormGroup = false; @Input() bindId = true; @Input() context: any | null = null; @@ -237,6 +241,7 @@ export class DsDynamicFormControlContainerComponent extends DynamicFormControlCo protected dynamicFormComponentService: DynamicFormComponentService, protected layoutService: DynamicFormLayoutService, protected validationService: DynamicFormValidationService, + protected typeBindRelationService: DsDynamicTypeBindRelationService, protected translateService: TranslateService, protected relationService: DynamicFormRelationService, private modalService: NgbModal, @@ -343,6 +348,9 @@ export class DsDynamicFormControlContainerComponent extends DynamicFormControlCo if (this.model && this.model.placeholder) { this.model.placeholder = this.translateService.instant(this.model.placeholder); } + if (this.model.typeBindRelations && this.model.typeBindRelations.length > 0) { + this.subscriptions.push(...this.typeBindRelationService.subscribeRelations(this.model, this.control)); + } } } @@ -357,6 +365,22 @@ export class DsDynamicFormControlContainerComponent extends DynamicFormControlCo this.showErrorMessagesPreviousStage = this.showErrorMessages; } + protected createFormControlComponent(): void { + super.createFormControlComponent(); + if (this.componentType !== null) { + let index; + + if (this.context && this.context instanceof DynamicFormArrayGroupModel) { + index = this.context.index; + } + const instance = this.dynamicFormComponentService.getFormControlRef(this.model, index); + if (instance) { + (instance as any).formModel = this.formModel; + (instance as any).formGroup = this.formGroup; + } + } + } + /** * Since Form Control Components created dynamically have 'OnPush' change detection strategy, * changes are not propagated. So use this method to force an update diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-type-bind-relation.service.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-type-bind-relation.service.ts new file mode 100644 index 0000000000..3ec6909c07 --- /dev/null +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-type-bind-relation.service.ts @@ -0,0 +1,222 @@ +import { Inject, Injectable, Injector, Optional } from '@angular/core'; +import { FormControl } from '@angular/forms'; + +import { Subscription } from 'rxjs'; +import { startWith } from 'rxjs/operators'; + +import { + AND_OPERATOR, + DYNAMIC_MATCHERS, + DynamicFormControlCondition, + DynamicFormControlMatcher, + DynamicFormControlModel, + DynamicFormControlRelation, + DynamicFormRelationService, + OR_OPERATOR +} from '@ng-dynamic-forms/core'; + +import { isNotUndefined, isUndefined } from '../../../empty.util'; +import { FormBuilderService } from '../form-builder.service'; +import { FormFieldMetadataValueObject } from '../models/form-field-metadata-value.model'; +import { DYNAMIC_FORM_CONTROL_TYPE_RELATION_GROUP } from './ds-dynamic-form-constants'; + +/** + * Service to manage type binding for submission input fields + * Any form component with the typeBindRelations DynamicFormControlRelation property can be controlled this way + */ +@Injectable() +export class DsDynamicTypeBindRelationService { + + constructor(@Optional() @Inject(DYNAMIC_MATCHERS) private dynamicMatchers: DynamicFormControlMatcher[], + protected dynamicFormRelationService: DynamicFormRelationService, + protected formBuilderService: FormBuilderService, + protected injector: Injector) { + + } + + /** + * Return the string value of the type bind model + * @param bindModelValue + * @private + */ + private static getTypeBindValue(bindModelValue: string | FormFieldMetadataValueObject): string { + let value; + if (isUndefined(bindModelValue) || typeof bindModelValue === 'string') { + value = bindModelValue; + } else if (bindModelValue.hasAuthority()) { + value = bindModelValue.authority; + } else { + value = bindModelValue.value; + } + + return value; + } + + /** + * Get models for this bind type + * @param model + */ + public getRelatedFormModel(model: DynamicFormControlModel): DynamicFormControlModel[] { + + const models: DynamicFormControlModel[] = []; + + (model as any).typeBindRelations.forEach((relGroup) => relGroup.when.forEach((rel) => { + + if (model.id === rel.id) { + throw new Error(`FormControl ${model.id} cannot depend on itself`); + } + + const bindModel: DynamicFormControlModel = this.formBuilderService.getTypeBindModel(); + + if (model && !models.some((modelElement) => modelElement === bindModel)) { + models.push(bindModel); + } + })); + + return models; + } + + /** + * Return true if the type bind relation (eg. {MATCH_VISIBLE, OR, ['book', 'book part']}) matches the value in + * matcher.match (or matcher.opposingMatch? not sure what that is), which in this case would be the current dc.type + * of the submission item + * @param relation type bind relation (eg. {MATCH_VISIBLE, OR, ['book', 'book part']}) + * @param matcher contains 'match' value and an onChange() event listener + */ + public matchesCondition(relation: DynamicFormControlRelation, matcher: DynamicFormControlMatcher): boolean { + + // Default to OR for operator (OR is explicitly set in field-parser.ts anyway) + const operator = relation.operator || OR_OPERATOR; + + + return relation.when.reduce((hasAlreadyMatched: boolean, condition: DynamicFormControlCondition, index: number) => { + // Get the DynamicFormControlModel (typeBindModel) from the form builder service, set in the form builder + // in the form model at init time in formBuilderService.modelFromConfiguration (called by other form components + // like relation group component and submission section form component). + // This model (DynamicRelationGroupModel) contains eg. mandatory field, formConfiguration, relationFields, + // submission scope, form/section type and other high level properties + const bindModel: any = this.formBuilderService.getTypeBindModel(); + + let values: string[]; + let bindModelValue = bindModel.value; + + // If the form type is RELATION, map values to the mandatory field for the model? Don't totally understand + // what is going on here + if (bindModel.type === DYNAMIC_FORM_CONTROL_TYPE_RELATION_GROUP) { + bindModelValue = bindModel.value.map((entry) => entry[bindModel.mandatoryField]); + } + // If we have an array of values, map the bindModelValue[] back to values[], looking up + // the type bind value for each in the static method here (this just handles cases where authority should + // be used, or where the entry doesn't have .value but is a string itself, etc) + // If values isn't an array, make it a single element array with the looked-up type bind value. + if (Array.isArray(bindModelValue)) { + values = [...bindModelValue.map((entry) => DsDynamicTypeBindRelationService.getTypeBindValue(entry))]; + } else { + values = [DsDynamicTypeBindRelationService.getTypeBindValue(bindModelValue)]; + } + + // If bind model evaluates to 'true' (is not undefined, is not null, is not false etc, + // AND the relation match (type bind) is equal to the matcher match (item publication type), then the return + // value is initialised as false. I'm not sure why the negation is used here! + // Perhaps as a fail-safe for a bad mind model but an exact match of the strings in relation and matcher + // passed to this method. + let returnValue = (!(bindModel && relation.match === matcher.match)); + + // Iterate the type bind values parsed and mapped from our form/relation group model + for (const value of values) { + if (bindModel && relation.match === matcher.match) { + // If we're not at the first array element, and we're using the AND operator, and we have not + // yet matched anything, return false. This is just a kind of short-hand put in here for some kind of + // optimisation, I guess, since the AND requires all values to match, and if we're on index > 0 but haven't + // matched then we've already failed. But surely it's simpler and just as optimal to break on the first + // non-match if using the AND operator?! + // In the case of default type bind usage, we always use OR anyway. + if (index > 0 && operator === AND_OPERATOR && !hasAlreadyMatched) { + return false; + } + // If we're not at the first array element, and we're using the OR operator (almost always the case) + // and we've already matched then there is no need to continue, just return true. + if (index > 0 && operator === OR_OPERATOR && hasAlreadyMatched) { + return true; + } + + // Do the actual match. Does condition.value (the item publication type) match the field model + // type bind currently being inspected? + returnValue = condition.value === value; + + // If return value is already true, break. + if (returnValue) { + break; + } + } + + // Here we have tests using 'opposingMatch' which I'm not certain about yet + // It looks like a negation of sorts? Or a 'not equals' comparison used in combination I think? + if (bindModel && relation.match === matcher.opposingMatch) { + // If we're not at the first element, using AND, and already matched, just return true here + if (index > 0 && operator === AND_OPERATOR && hasAlreadyMatched) { + return true; + } + + // If we're not at the first element, using OR, and we have NOT already matched, return false + if (index > 0 && operator === OR_OPERATOR && !hasAlreadyMatched) { + return false; + } + + // Negated comparison + returnValue = !(condition.value === value); + + // Break if already false + if (!returnValue) { + break; + } + } + } + return returnValue; + }, false); + } + + /** + * Return an array of subscriptions to a calling component + * @param model + * @param control + */ + subscribeRelations(model: DynamicFormControlModel, control: FormControl): Subscription[] { + + const relatedModels = this.getRelatedFormModel(model); + const subscriptions: Subscription[] = []; + + Object.values(relatedModels).forEach((relatedModel: any) => { + + if (isNotUndefined(relatedModel)) { + const initValue = (isUndefined(relatedModel.value) || typeof relatedModel.value === 'string') ? relatedModel.value : + (Array.isArray(relatedModel.value) ? relatedModel.value : relatedModel.value.value); + + const valueChanges = relatedModel.valueChanges.pipe( + startWith(initValue) + ); + + // Build up the subscriptions to watch for changes; + // I still don't fully understand what is happening here, or the triggers in various form usage that + // cause which / what to fire change events, why the matcher has onChange() instead of a field value or + // form model, etc. + subscriptions.push(valueChanges.subscribe(() => { + // Iterate each matcher + this.dynamicMatchers.forEach((matcher) => { + + // Find the relation + const relation = this.dynamicFormRelationService.findRelationByMatcher((model as any).typeBindRelations, matcher); + + // If the relation is defined, get matchesCondition result and pass it to the onChange event listener + if (relation !== undefined) { + const hasMatch = this.matchesCondition(relation, matcher); + matcher.onChange(hasMatch, model, control, this.injector); + } + }); + })); + } + }); + + return subscriptions; + } +} diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/models/array-group/dynamic-form-array.component.html b/src/app/shared/form/builder/ds-dynamic-form-ui/models/array-group/dynamic-form-array.component.html index bc41ade088..29df7a34c4 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/models/array-group/dynamic-form-array.component.html +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/models/array-group/dynamic-form-array.component.html @@ -1,6 +1,7 @@
@@ -13,15 +14,17 @@ cdkDrag cdkDragHandle [cdkDragDisabled]="dragDisabled" - [cdkDragPreviewClass]="'ds-submission-reorder-dragging'"> + [cdkDragPreviewClass]="'ds-submission-reorder-dragging'" + [class.grey-background]="model.isInlineGroupArray"> -
- +
+
- - -
diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/models/array-group/dynamic-form-array.component.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/models/array-group/dynamic-form-array.component.ts index 921b159718..01bba74cc8 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/models/array-group/dynamic-form-array.component.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/models/array-group/dynamic-form-array.component.ts @@ -6,6 +6,7 @@ import { DynamicFormControlCustomEvent, DynamicFormControlEvent, DynamicFormControlLayout, + DynamicFormControlModel, DynamicFormLayout, DynamicFormLayoutService, DynamicFormValidationService, @@ -22,6 +23,8 @@ import { DynamicRowArrayModel } from '../ds-dynamic-row-array-model'; }) export class DsDynamicFormArrayComponent extends DynamicFormArrayComponent { + @Input() bindId = true; + @Input() formModel: DynamicFormControlModel[]; @Input() formLayout: DynamicFormLayout; @Input() group: FormGroup; @Input() layout: DynamicFormControlLayout; diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/models/date-picker/date-picker.model.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/models/date-picker/date-picker.model.ts index 1c053ffc80..94b66b288a 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/models/date-picker/date-picker.model.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/models/date-picker/date-picker.model.ts @@ -2,20 +2,35 @@ import { DynamicDateControlModel, DynamicDatePickerModelConfig, DynamicFormControlLayout, + DynamicFormControlModel, + DynamicFormControlRelation, serializable } from '@ng-dynamic-forms/core'; +import {BehaviorSubject, Subject} from 'rxjs'; +import {isEmpty, isNotEmpty, isNotUndefined} from '../../../../../empty.util'; +import {MetadataValue} from '../../../../../../core/shared/metadata.models'; export const DYNAMIC_FORM_CONTROL_TYPE_DSDATEPICKER = 'DATE'; export interface DynamicDsDateControlModelConfig extends DynamicDatePickerModelConfig { legend?: string; + typeBindRelations?: DynamicFormControlRelation[]; + securityLevel?: number; + securityConfigLevel?: number[]; + toggleSecurityVisibility?: boolean; } /** * Dynamic Date Picker Model class */ export class DynamicDsDatePickerModel extends DynamicDateControlModel { + @serializable() hiddenUpdates: Subject; + @serializable() typeBindRelations: DynamicFormControlRelation[]; @serializable() readonly type: string = DYNAMIC_FORM_CONTROL_TYPE_DSDATEPICKER; + @serializable() metadataValue: MetadataValue; + @serializable() securityLevel?: number; + @serializable() securityConfigLevel?: number[]; + @serializable() toggleSecurityVisibility = true; malformedDate: boolean; legend: string; hasLanguages = false; @@ -25,6 +40,28 @@ export class DynamicDsDatePickerModel extends DynamicDateControlModel { super(config, layout); this.malformedDate = false; this.legend = config.legend; + this.metadataValue = (config as any).metadataValue; + this.typeBindRelations = config.typeBindRelations ? config.typeBindRelations : []; + this.hiddenUpdates = new BehaviorSubject(this.hidden); + this.hiddenUpdates.subscribe((hidden: boolean) => { + this.hidden = hidden; + const parentModel = this.getRootParent(this); + if (parentModel && isNotUndefined(parentModel.hidden)) { + parentModel.hidden = hidden; + } + }); + } + + private getRootParent(model: any): DynamicFormControlModel { + if (isEmpty(model) || isEmpty(model.parent)) { + return model; + } else { + return this.getRootParent(model.parent); + } + } + + get hasSecurityLevel(): boolean { + return isNotEmpty(this.securityLevel); } } diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/models/ds-dynamic-input.model.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/models/ds-dynamic-input.model.ts index 290e29dc65..a9adb9a8e9 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/models/ds-dynamic-input.model.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/models/ds-dynamic-input.model.ts @@ -1,14 +1,15 @@ import { - DynamicFormControlLayout, + DynamicFormControlLayout, DynamicFormControlModel, + DynamicFormControlRelation, DynamicInputModel, DynamicInputModelConfig, serializable } from '@ng-dynamic-forms/core'; -import { Subject } from 'rxjs'; +import {BehaviorSubject, Subject} from 'rxjs'; import { LanguageCode } from '../../models/form-field-language-value.model'; import { VocabularyOptions } from '../../../../../core/submission/vocabularies/models/vocabulary-options.model'; -import { hasValue } from '../../../../empty.util'; +import {hasValue, isEmpty, isNotUndefined} from '../../../../empty.util'; import { FormFieldMetadataValueObject } from '../../models/form-field-metadata-value.model'; import { RelationshipOptions } from '../../models/relationship-options.model'; @@ -18,12 +19,14 @@ export interface DsDynamicInputModelConfig extends DynamicInputModelConfig { language?: string; place?: number; value?: any; + typeBindRelations?: DynamicFormControlRelation[]; relationship?: RelationshipOptions; repeatable: boolean; metadataFields: string[]; submissionId: string; hasSelectableMetadata: boolean; metadataValue?: FormFieldMetadataValueObject; + isModelOfInnerForm?: boolean; } @@ -33,12 +36,17 @@ export class DsDynamicInputModel extends DynamicInputModel { @serializable() private _languageCodes: LanguageCode[]; @serializable() private _language: string; @serializable() languageUpdates: Subject; + @serializable() place: number; + @serializable() typeBindRelations: DynamicFormControlRelation[]; + @serializable() typeBindHidden = false; @serializable() relationship?: RelationshipOptions; @serializable() repeatable?: boolean; @serializable() metadataFields: string[]; @serializable() submissionId: string; @serializable() hasSelectableMetadata: boolean; @serializable() metadataValue: FormFieldMetadataValueObject; + @serializable() isModelOfInnerForm: boolean; + constructor(config: DsDynamicInputModelConfig, layout?: DynamicFormControlLayout) { super(config, layout); @@ -51,6 +59,8 @@ export class DsDynamicInputModel extends DynamicInputModel { this.submissionId = config.submissionId; this.hasSelectableMetadata = config.hasSelectableMetadata; this.metadataValue = config.metadataValue; + this.place = config.place; + this.isModelOfInnerForm = (hasValue(config.isModelOfInnerForm) ? config.isModelOfInnerForm : false); this.language = config.language; if (!this.language) { @@ -71,6 +81,8 @@ export class DsDynamicInputModel extends DynamicInputModel { this.language = lang; }); + this.typeBindRelations = config.typeBindRelations ? config.typeBindRelations : []; + this.vocabularyOptions = config.vocabularyOptions; } diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/models/ds-dynamic-row-array-model.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/models/ds-dynamic-row-array-model.ts index d0b07de885..e4b18a4feb 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/models/ds-dynamic-row-array-model.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/models/ds-dynamic-row-array-model.ts @@ -1,5 +1,12 @@ -import { DynamicFormArrayModel, DynamicFormArrayModelConfig, DynamicFormControlLayout, serializable } from '@ng-dynamic-forms/core'; +import { + DynamicFormArrayModel, + DynamicFormArrayModelConfig, + DynamicFormControlLayout, + DynamicFormControlRelation, + serializable +} from '@ng-dynamic-forms/core'; import { RelationshipOptions } from '../../models/relationship-options.model'; +import { isNotUndefined } from '../../../../empty.util'; export interface DynamicRowArrayModelConfig extends DynamicFormArrayModelConfig { notRepeatable: boolean; @@ -10,6 +17,9 @@ export interface DynamicRowArrayModelConfig extends DynamicFormArrayModelConfig metadataFields: string[]; hasSelectableMetadata: boolean; isDraggable: boolean; + showButtons: boolean; + typeBindRelations?: DynamicFormControlRelation[]; + isInlineGroupArray?: boolean; } export class DynamicRowArrayModel extends DynamicFormArrayModel { @@ -21,17 +31,29 @@ export class DynamicRowArrayModel extends DynamicFormArrayModel { @serializable() metadataFields: string[]; @serializable() hasSelectableMetadata: boolean; @serializable() isDraggable: boolean; + @serializable() showButtons = true; + @serializable() typeBindRelations: DynamicFormControlRelation[]; isRowArray = true; + isInlineGroupArray = false; constructor(config: DynamicRowArrayModelConfig, layout?: DynamicFormControlLayout) { super(config, layout); - this.notRepeatable = config.notRepeatable; - this.required = config.required; + if (isNotUndefined(config.notRepeatable)) { + this.notRepeatable = config.notRepeatable; + } + if (isNotUndefined(config.required)) { + this.required = config.required; + } + if (isNotUndefined(config.showButtons)) { + this.showButtons = config.showButtons; + } this.submissionId = config.submissionId; this.relationshipConfig = config.relationshipConfig; this.metadataKey = config.metadataKey; this.metadataFields = config.metadataFields; this.hasSelectableMetadata = config.hasSelectableMetadata; this.isDraggable = config.isDraggable; + this.typeBindRelations = config.typeBindRelations ? config.typeBindRelations : []; + this.isInlineGroupArray = config.isInlineGroupArray ? config.isInlineGroupArray : false; } } diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/models/form-group/dynamic-form-group.component.html b/src/app/shared/form/builder/ds-dynamic-form-ui/models/form-group/dynamic-form-group.component.html index 843ed95530..933590b459 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/models/form-group/dynamic-form-group.component.html +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/models/form-group/dynamic-form-group.component.html @@ -1,8 +1,13 @@ +
-
- - +
+
diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/models/form-group/dynamic-form-group.component.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/models/form-group/dynamic-form-group.component.ts index 789d5eb87c..9d8d73eab5 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/models/form-group/dynamic-form-group.component.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/models/form-group/dynamic-form-group.component.ts @@ -5,7 +5,9 @@ import { DynamicFormControlCustomEvent, DynamicFormControlEvent, DynamicFormControlLayout, - DynamicFormGroupModel, DynamicFormLayout, + DynamicFormControlModel, + DynamicFormGroupModel, + DynamicFormLayout, DynamicFormLayoutService, DynamicFormValidationService, DynamicTemplateDirective @@ -18,6 +20,7 @@ import { }) export class DsDynamicFormGroupComponent extends DynamicFormControlComponent { + @Input() formModel: DynamicFormControlModel[]; @Input() formLayout: DynamicFormLayout; @Input() group: FormGroup; @Input() layout: DynamicFormControlLayout; diff --git a/src/app/shared/form/builder/form-builder.service.ts b/src/app/shared/form/builder/form-builder.service.ts index 85d70f20dc..33703abf94 100644 --- a/src/app/shared/form/builder/form-builder.service.ts +++ b/src/app/shared/form/builder/form-builder.service.ts @@ -1,5 +1,5 @@ import { Injectable } from '@angular/core'; -import { AbstractControl, FormGroup } from '@angular/forms'; +import { AbstractControl, FormArray, FormControl, FormGroup } from '@angular/forms'; import { DYNAMIC_FORM_CONTROL_TYPE_ARRAY, @@ -7,6 +7,7 @@ import { DYNAMIC_FORM_CONTROL_TYPE_GROUP, DYNAMIC_FORM_CONTROL_TYPE_INPUT, DYNAMIC_FORM_CONTROL_TYPE_RADIO_GROUP, + DynamicFormArrayGroupModel, DynamicFormArrayModel, DynamicFormComponentService, DynamicFormControlEvent, @@ -19,7 +20,7 @@ import { } from '@ng-dynamic-forms/core'; import { isObject, isString, mergeWith } from 'lodash'; -import { hasValue, isEmpty, isNotEmpty, isNotNull, isNotUndefined, isNull } from '../../empty.util'; +import { hasValue, isEmpty, isNotEmpty, isNotNull, isNotUndefined, isNull, isObjectEmpty } from '../../empty.util'; import { DynamicQualdropModel } from './ds-dynamic-form-ui/models/ds-dynamic-qualdrop.model'; import { SubmissionFormsModel } from '../../../core/config/models/config-submission-forms.model'; import { DYNAMIC_FORM_CONTROL_TYPE_TAG } from './ds-dynamic-form-ui/models/tag/dynamic-tag.model'; @@ -36,12 +37,43 @@ import { VIRTUAL_METADATA_PREFIX } from '../../../core/shared/metadata.models'; @Injectable() export class FormBuilderService extends DynamicFormService { + private typeBindModel: DynamicFormControlModel; + + /** + * This map contains the active forms model + */ + private formModels: Map; + + /** + * This map contains the active forms control groups + */ + private formGroups: Map; + constructor( componentService: DynamicFormComponentService, validationService: DynamicFormValidationService, protected rowParser: RowParser ) { super(componentService, validationService); + this.formModels = new Map(); + this.formGroups = new Map(); + } + + createDynamicFormControlEvent(control: FormControl, group: FormGroup, model: DynamicFormControlModel, type: string): DynamicFormControlEvent { + const $event = { + value: (model as any).value, + autoSave: false + }; + const context: DynamicFormArrayGroupModel = (model?.parent instanceof DynamicFormArrayGroupModel) ? model?.parent : null; + return {$event, context, control: control, group: group, model: model, type}; + } + + getTypeBindModel() { + return this.typeBindModel; + } + + setTypeBindModel(model: DynamicFormControlModel) { + this.typeBindModel = model; } findById(id: string, groupModel: DynamicFormControlModel[], arrayIndex = null): DynamicFormControlModel | null { @@ -223,10 +255,11 @@ export class FormBuilderService extends DynamicFormService { return result; } - modelFromConfiguration(submissionId: string, json: string | SubmissionFormsModel, scopeUUID: string, sectionData: any = {}, submissionScope?: string, readOnly = false): DynamicFormControlModel[] | never { - let rows: DynamicFormControlModel[] = []; - const rawData = typeof json === 'string' ? JSON.parse(json, parseReviver) : json; - + modelFromConfiguration(submissionId: string, json: string | SubmissionFormsModel, scopeUUID: string, sectionData: any = {}, + submissionScope?: string, readOnly = false, typeBindModel = null, + isInnerForm = false, securityConfig: any = null): DynamicFormControlModel[] | never { + let rows: DynamicFormControlModel[] = []; + const rawData = typeof json === 'string' ? JSON.parse(json, parseReviver) : json; if (rawData.rows && !isEmpty(rawData.rows)) { rawData.rows.forEach((currentRow) => { const rowParsed = this.rowParser.parse(submissionId, currentRow, scopeUUID, sectionData, submissionScope, readOnly); @@ -240,6 +273,13 @@ export class FormBuilderService extends DynamicFormService { }); } + if (isNull(typeBindModel)) { + typeBindModel = this.findById('dc_type', rows); + } + + if (typeBindModel !== null) { + this.setTypeBindModel(typeBindModel); + } return rows; } @@ -309,6 +349,10 @@ export class FormBuilderService extends DynamicFormService { return isNotEmpty(fieldModel) ? formGroup.get(this.getPath(fieldModel)) : null; } + getFormControlByModel(formGroup: FormGroup, fieldModel: DynamicFormControlModel): AbstractControl { + return isNotEmpty(fieldModel) ? formGroup.get(this.getPath(fieldModel)) : null; + } + /** * Note (discovered while debugging) this is not the ID as used in the form, * but the first part of the path needed in a patch operation: @@ -328,6 +372,82 @@ export class FormBuilderService extends DynamicFormService { return (tempModel.id !== tempModel.name) ? tempModel.name : tempModel.id; } + /** + * Add new form model to formModels map + * @param id id of model + * @param model model + */ + addFormModel(id: string, model: DynamicFormControlModel[]): void { + this.formModels.set(id, model); + } + + /** + * If present, remove form model from formModels map + * @param id id of model + */ + removeFormModel(id: string): void { + if (this.formModels.has(id)) { + this.formModels.delete(id); + } + } + + /** + * Add new form model to formModels map + * @param id id of model + * @param formGroup FormGroup + */ + addFormGroups(id: string, formGroup: FormGroup): void { + this.formGroups.set(id, formGroup); + } + + /** + * If present, remove form model from formModels map + * @param id id of model + */ + removeFormGroup(id: string): void { + if (this.formGroups.has(id)) { + this.formGroups.delete(id); + } + } + + /** + * This method searches a field in all forms instantiated + * by form.component and, if found, it updates its value + * + * @param fieldId id of field to update + * @param value new value to set + * @return the model updated if found + */ + updateModelValue(fieldId: string, value: FormFieldMetadataValueObject): DynamicFormControlModel { + let returnModel = null; + this.formModels.forEach((models, formId) => { + const fieldModel: any = this.findById(fieldId, models); + if (hasValue(fieldModel)) { + if (isNotEmpty(value)) { + if (fieldModel.repeatable && isNotEmpty(fieldModel.value)) { + // if model is repeatable and has already a value add a new field instead of replacing it + const formGroup = this.formGroups.get(formId); + const arrayContext = fieldModel.parent?.context; + if (isNotEmpty(formGroup) && isNotEmpty(arrayContext)) { + const formArrayControl = this.getFormControlByModel(formGroup, arrayContext) as FormArray; + const index = arrayContext?.groups?.length; + this.insertFormArrayGroup(index, formArrayControl, arrayContext); + const newAddedModel: any = this.findById(fieldId, models, index); + this.detectChanges(); + newAddedModel.value = value; + returnModel = newAddedModel; + } + } else { + fieldModel.value = value; + returnModel = fieldModel; + } + } + return; + } + }); + return returnModel; + } + /** * Calculate the metadata list related to the event. * @param event @@ -400,4 +520,29 @@ export class FormBuilderService extends DynamicFormService { return Object.keys(result); } + /** + * Add new formbuilder in forma array by copying current formBuilder index + * @param index index of formBuilder selected to be copied + * @param formArray formArray of the inline group forms + * @param formArrayModel formArrayModel model of forms that will be created + */ + copyFormArrayGroup(index: number, formArray: FormArray, formArrayModel: DynamicFormArrayModel) { + + const groupModel = formArrayModel.insertGroup(index); + const previousGroup = formArray.controls[index] as FormGroup; + const newGroup = this.createFormGroup(groupModel.group, null, groupModel); + const previousKey = Object.keys(previousGroup.getRawValue())[0]; + const newKey = Object.keys(newGroup.getRawValue())[0]; + + if (!isObjectEmpty(previousGroup.getRawValue()[previousKey])) { + newGroup.get(newKey).setValue(previousGroup.getRawValue()[previousKey]); + } + + formArray.insert(index, newGroup); + + return newGroup; + } + + + } diff --git a/src/app/shared/form/builder/models/form-field.model.ts b/src/app/shared/form/builder/models/form-field.model.ts index 95ee980aeb..be3150bae3 100644 --- a/src/app/shared/form/builder/models/form-field.model.ts +++ b/src/app/shared/form/builder/models/form-field.model.ts @@ -113,6 +113,12 @@ export class FormFieldModel { @autoserialize style: string; + /** + * Containing types to bind for this field + */ + @autoserialize + typeBind: string[]; + /** * Containing the value for this metadata field */ diff --git a/src/app/shared/form/builder/parsers/date-field-parser.ts b/src/app/shared/form/builder/parsers/date-field-parser.ts index aef0219579..c67c2c7695 100644 --- a/src/app/shared/form/builder/parsers/date-field-parser.ts +++ b/src/app/shared/form/builder/parsers/date-field-parser.ts @@ -1,7 +1,7 @@ import { FieldParser } from './field-parser'; import { - DynamicDsDateControlModelConfig, - DynamicDsDatePickerModel + DynamicDsDatePickerModel, + DynamicDsDateControlModelConfig } from '../ds-dynamic-form-ui/models/date-picker/date-picker.model'; import { isNotEmpty } from '../../../empty.util'; import { DS_DATE_PICKER_SEPARATOR } from '../ds-dynamic-form-ui/models/date-picker/date-picker.component'; @@ -13,7 +13,7 @@ export class DateFieldParser extends FieldParser { let malformedDate = false; const inputDateModelConfig: DynamicDsDateControlModelConfig = this.initModel(null, false, true); inputDateModelConfig.legend = this.configData.label; - + inputDateModelConfig.disabled = inputDateModelConfig.readOnly; inputDateModelConfig.toggleIcon = 'fas fa-calendar'; this.setValues(inputDateModelConfig as any, fieldValue); // Init Data and validity check diff --git a/src/app/shared/form/builder/parsers/field-parser.ts b/src/app/shared/form/builder/parsers/field-parser.ts index da304ca267..838816ebb1 100644 --- a/src/app/shared/form/builder/parsers/field-parser.ts +++ b/src/app/shared/form/builder/parsers/field-parser.ts @@ -1,7 +1,7 @@ import { Inject, InjectionToken } from '@angular/core'; import { uniqueId } from 'lodash'; -import { DynamicFormControlLayout } from '@ng-dynamic-forms/core'; +import {DynamicFormControlLayout, DynamicFormControlRelation, MATCH_VISIBLE, OR_OPERATOR} from '@ng-dynamic-forms/core'; import { hasValue, isNotEmpty, isNotNull, isNotUndefined } from '../../../empty.util'; import { FormFieldModel } from '../models/form-field.model'; @@ -67,6 +67,7 @@ export abstract class FieldParser { metadataFields: this.getAllFieldIds(), hasSelectableMetadata: isNotEmpty(this.configData.selectableMetadata), isDraggable, + typeBindRelations: isNotEmpty(this.configData.typeBind) ? this.getTypeBindRelations(this.configData.typeBind) : null, groupFactory: () => { let model; if ((arrayCounter === 0)) { @@ -275,7 +276,7 @@ export abstract class FieldParser { // Set label this.setLabel(controlModel, label); if (hint) { - controlModel.hint = this.configData.hints; + controlModel.hint = this.configData.hints || ' '; } controlModel.placeholder = this.configData.label; @@ -292,9 +293,45 @@ export abstract class FieldParser { (controlModel as DsDynamicInputModel).languageCodes = this.configData.languageCodes; } + // If typeBind is configured + if (isNotEmpty(this.configData.typeBind)) { + (controlModel as DsDynamicInputModel).typeBindRelations = this.getTypeBindRelations(this.configData.typeBind); + } + return controlModel; } + /** + * Get the type bind values from the REST data for a specific field + * The return value is any[] in the method signature but in reality it's + * returning the 'relation' that'll be used for a dynamic matcher when filtering + * fields in type bind, made up of a 'match' outcome (make this field visible), an 'operator' + * (OR) and a 'when' condition (the bindValues array). + * @param configuredTypeBindValues array of types from the submission definition (CONFIG_DATA) + * @private + * @return DynamicFormControlRelation[] array with one relation in it, for type bind matching to show a field + */ + private getTypeBindRelations(configuredTypeBindValues: string[]): DynamicFormControlRelation[] { + const bindValues = []; + configuredTypeBindValues.forEach((value) => { + bindValues.push({ + id: 'dc_type', + value: value + }); + }); + // match: MATCH_VISIBLE means that if true, the field / component will be visible + // operator: OR means that all the values in the 'when' condition will be compared with OR, not AND + // when: the list of values to match against, in this case the list of strings from ... + // Example: Field [x] will be VISIBLE if dc_type = book OR dc_type = book_part + // + // The opposing match value will be the dc.type for the workspace item + return [{ + match: MATCH_VISIBLE, + operator: OR_OPERATOR, + when: bindValues + }]; + } + protected hasRegex() { return hasValue(this.configData.input.regex); } From be7f21eb3225dba4eb5c6edec4fc096e05bd0ec7 Mon Sep 17 00:00:00 2001 From: Kim Shepherd Date: Thu, 17 Feb 2022 11:50:40 +1300 Subject: [PATCH 032/343] [TLC-254] Make the item type field configurable (default dc.type) --- config/config.example.yml | 5 +++++ src/app/shared/form/builder/form-builder.service.ts | 10 +++++++++- src/app/shared/form/builder/parsers/field-parser.ts | 12 ++++++++++-- src/config/default-app-config.ts | 3 +++ src/config/submission-config.interface.ts | 5 +++++ src/environments/environment.test.ts | 3 +++ 6 files changed, 35 insertions(+), 3 deletions(-) diff --git a/config/config.example.yml b/config/config.example.yml index 771c7b1653..fb0b4fd589 100644 --- a/config/config.example.yml +++ b/config/config.example.yml @@ -77,6 +77,11 @@ submission: # NOTE: after how many time (milliseconds) submission is saved automatically # eg. timer: 5 * (1000 * 60); // 5 minutes timer: 0 + typeBind: + # NOTE: which field to use when matching to type-bind configuration, + # eg. dc.type, local.publicationType + # default: dc.type + field: dc.type icons: metadata: # NOTE: example of configuration diff --git a/src/app/shared/form/builder/form-builder.service.ts b/src/app/shared/form/builder/form-builder.service.ts index 33703abf94..12d7585a1c 100644 --- a/src/app/shared/form/builder/form-builder.service.ts +++ b/src/app/shared/form/builder/form-builder.service.ts @@ -33,6 +33,7 @@ import { dateToString, isNgbDateStruct } from '../../date.util'; import { DYNAMIC_FORM_CONTROL_TYPE_RELATION_GROUP } from './ds-dynamic-form-ui/ds-dynamic-form-constants'; import { CONCAT_GROUP_SUFFIX, DynamicConcatModel } from './ds-dynamic-form-ui/models/ds-dynamic-concat.model'; import { VIRTUAL_METADATA_PREFIX } from '../../../core/shared/metadata.models'; +import { environment } from '../../../../environments/environment'; @Injectable() export class FormBuilderService extends DynamicFormService { @@ -49,6 +50,11 @@ export class FormBuilderService extends DynamicFormService { */ private formGroups: Map; + /** + * This is the field to use for type binding + */ + private typeField: string; + constructor( componentService: DynamicFormComponentService, validationService: DynamicFormValidationService, @@ -57,6 +63,8 @@ export class FormBuilderService extends DynamicFormService { super(componentService, validationService); this.formModels = new Map(); this.formGroups = new Map(); + // Replace . with _ in configured type field here, to make configuration more simple and user-friendly + this.typeField = environment.submission.typeBind.field.replace('\.', '_'); } createDynamicFormControlEvent(control: FormControl, group: FormGroup, model: DynamicFormControlModel, type: string): DynamicFormControlEvent { @@ -274,7 +282,7 @@ export class FormBuilderService extends DynamicFormService { } if (isNull(typeBindModel)) { - typeBindModel = this.findById('dc_type', rows); + typeBindModel = this.findById(this.typeField, rows); } if (typeBindModel !== null) { diff --git a/src/app/shared/form/builder/parsers/field-parser.ts b/src/app/shared/form/builder/parsers/field-parser.ts index 838816ebb1..6e1c03efe0 100644 --- a/src/app/shared/form/builder/parsers/field-parser.ts +++ b/src/app/shared/form/builder/parsers/field-parser.ts @@ -17,6 +17,7 @@ import { RelationshipOptions } from '../models/relationship-options.model'; import { VocabularyOptions } from '../../../../core/submission/vocabularies/models/vocabulary-options.model'; import { ParserType } from './parser-type'; import { isNgbDateStruct } from '../../../date.util'; +import { environment } from '../../../../../environments/environment'; export const SUBMISSION_ID: InjectionToken = new InjectionToken('submissionId'); export const CONFIG_DATA: InjectionToken = new InjectionToken('configData'); @@ -26,6 +27,11 @@ export const PARSER_OPTIONS: InjectionToken = new InjectionToken< export abstract class FieldParser { protected fieldId: string; + /** + * This is the field to use for type binding + * @protected + */ + protected typeField: string; constructor( @Inject(SUBMISSION_ID) protected submissionId: string, @@ -33,6 +39,8 @@ export abstract class FieldParser { @Inject(INIT_FORM_VALUES) protected initFormValues: any, @Inject(PARSER_OPTIONS) protected parserOptions: ParserOptions ) { + // Replace . with _ in configured type field here, to make configuration more simple and user-friendly + this.typeField = environment.submission.typeBind.field.replace('\.', '_'); } public abstract modelFactory(fieldValue?: FormFieldMetadataValueObject, label?: boolean): any; @@ -315,14 +323,14 @@ export abstract class FieldParser { const bindValues = []; configuredTypeBindValues.forEach((value) => { bindValues.push({ - id: 'dc_type', + id: this.typeField, value: value }); }); // match: MATCH_VISIBLE means that if true, the field / component will be visible // operator: OR means that all the values in the 'when' condition will be compared with OR, not AND // when: the list of values to match against, in this case the list of strings from ... - // Example: Field [x] will be VISIBLE if dc_type = book OR dc_type = book_part + // Example: Field [x] will be VISIBLE if item type = book OR item type = book_part // // The opposing match value will be the dc.type for the workspace item return [{ diff --git a/src/config/default-app-config.ts b/src/config/default-app-config.ts index dc54c2fcb0..7a4a5047ba 100644 --- a/src/config/default-app-config.ts +++ b/src/config/default-app-config.ts @@ -110,6 +110,9 @@ export class DefaultAppConfig implements AppConfig { */ timer: 0 }, + typeBind: { + field: 'dc.type' + }, icons: { metadata: [ /** diff --git a/src/config/submission-config.interface.ts b/src/config/submission-config.interface.ts index ce275b9bf8..a63af45e38 100644 --- a/src/config/submission-config.interface.ts +++ b/src/config/submission-config.interface.ts @@ -5,6 +5,10 @@ interface AutosaveConfig extends Config { timer: number; } +interface TypeBindConfig extends Config { + field: string; +} + interface IconsConfig extends Config { metadata: MetadataIconConfig[]; authority: { @@ -24,5 +28,6 @@ export interface ConfidenceIconConfig extends Config { export interface SubmissionConfig extends Config { autosave: AutosaveConfig; + typeBind: TypeBindConfig; icons: IconsConfig; } diff --git a/src/environments/environment.test.ts b/src/environments/environment.test.ts index 7c24ef8f05..95237f4b7c 100644 --- a/src/environments/environment.test.ts +++ b/src/environments/environment.test.ts @@ -100,6 +100,9 @@ export const environment: BuildConfig = { // NOTE: every how many minutes submission is saved automatically timer: 5 }, + typeBind: { + field: 'dc.type' + }, icons: { metadata: [ { From 61d64d5e5ea0bbaa42117b1531cd76d9307e353e Mon Sep 17 00:00:00 2001 From: Kim Shepherd Date: Thu, 17 Feb 2022 14:35:44 +1300 Subject: [PATCH 033/343] [TLC-254] Updating references in tests to reflect row array model changes --- .../ds-dynamic-form-control-container.component.spec.ts | 1 - src/app/shared/form/builder/form-builder.service.spec.ts | 7 +++++-- .../sections/form/section-form-operations.service.spec.ts | 4 +++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-form-control-container.component.spec.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-form-control-container.component.spec.ts index 785b0958d5..34d23ef719 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-form-control-container.component.spec.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-form-control-container.component.spec.ts @@ -150,7 +150,6 @@ describe('DsDynamicFormControlContainerComponent test suite', () => { submissionId: '1234', id: 'relationGroup', formConfiguration: [], - isInlineGroup: false, mandatoryField: '', name: 'relationGroup', relationFields: [], diff --git a/src/app/shared/form/builder/form-builder.service.spec.ts b/src/app/shared/form/builder/form-builder.service.spec.ts index 4055c84921..fe9d0a7bc6 100644 --- a/src/app/shared/form/builder/form-builder.service.spec.ts +++ b/src/app/shared/form/builder/form-builder.service.spec.ts @@ -197,7 +197,7 @@ describe('FormBuilderService test suite', () => { repeatable: false, metadataFields: [], submissionId: '1234', - hasSelectableMetadata: false + hasSelectableMetadata: false, }), new DynamicScrollableDropdownModel({ @@ -233,6 +233,7 @@ describe('FormBuilderService test suite', () => { hints: 'Enter the name of the author.', input: { type: 'onebox' }, label: 'Authors', + typeBind: [], languageCodes: [], mandatory: 'true', mandatoryMessage: 'Required field!', @@ -304,7 +305,9 @@ describe('FormBuilderService test suite', () => { required: false, metadataKey: 'dc.contributor.author', metadataFields: ['dc.contributor.author'], - hasSelectableMetadata: true + hasSelectableMetadata: true, + showButtons: true, + typeBindRelations: [] }, ), ]; diff --git a/src/app/submission/sections/form/section-form-operations.service.spec.ts b/src/app/submission/sections/form/section-form-operations.service.spec.ts index d5798b82c8..65ddbe0cb0 100644 --- a/src/app/submission/sections/form/section-form-operations.service.spec.ts +++ b/src/app/submission/sections/form/section-form-operations.service.spec.ts @@ -814,7 +814,9 @@ describe('SectionFormOperationsService test suite', () => { required: false, metadataKey: 'dc.contributor.author', metadataFields: ['dc.contributor.author'], - hasSelectableMetadata: true + hasSelectableMetadata: true, + showButtons: true, + typeBindRelations: [] } ); spyOn(serviceAsAny, 'getFieldPathSegmentedFromChangeEvent').and.returnValue('path'); From f97a87702ccfa7f2cb95acb04b1a89a7403ca40f Mon Sep 17 00:00:00 2001 From: Kim Shepherd Date: Fri, 25 Feb 2022 12:21:22 +1300 Subject: [PATCH 034/343] [TLC-254] Hidden fields can collapse in row, revert drag-handle problem apply d-none class to form-control container when model is hidden css rule for ds-form-control-container.d-none forces collapse drag-handle fix from 9019b809 was recent and is applied manually here too --- .../ds-dynamic-form-ui/ds-dynamic-form.component.html | 1 + .../models/array-group/dynamic-form-array.component.html | 5 +++-- .../models/form-group/dynamic-form-group.component.html | 1 + src/styles/_global-styles.scss | 7 +++++++ 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-form.component.html b/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-form.component.html index 2a18565178..4c1ea2dd96 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-form.component.html +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-form.component.html @@ -3,6 +3,7 @@ [group]="formGroup" [hasErrorMessaging]="model.hasErrorMessages" [hidden]="model.hidden" + [class.d-none]="model.hidden" [layout]="formLayout" [model]="model" [templates]="templates" diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/models/array-group/dynamic-form-array.component.html b/src/app/shared/form/builder/ds-dynamic-form-ui/models/array-group/dynamic-form-array.component.html index 29df7a34c4..d518d59da2 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/models/array-group/dynamic-form-array.component.html +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/models/array-group/dynamic-form-array.component.html @@ -17,8 +17,8 @@ [cdkDragPreviewClass]="'ds-submission-reorder-dragging'" [class.grey-background]="model.isInlineGroupArray"> -
- +
+
+ diff --git a/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.scss b/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.scss index 8c1bfc2580..5a8e0e3c34 100644 --- a/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.scss +++ b/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.scss @@ -28,4 +28,9 @@ } } +} + +.refresh-container { + display: flex; + justify-content: right; } \ No newline at end of file diff --git a/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.ts b/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.ts index 662f066663..f5eaaa773a 100644 --- a/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.ts +++ b/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.ts @@ -1,14 +1,18 @@ +import { JsonPatchOperationPathCombiner } from './../../../core/json-patch/builder/json-patch-operation-path-combiner'; +import { JsonPatchOperationsBuilder } from './../../../core/json-patch/builder/json-patch-operations-builder'; import { WorkspaceitemSectionSherpaPoliciesObject } from './../../../core/submission/models/workspaceitem-section-sherpa-policies.model'; import { SectionSherpaPoliciesService } from './section-sherpa-policies.service'; import { Component, Inject, ViewChildren, QueryList } from '@angular/core'; -import { Observable, of } from 'rxjs'; +import { Observable, of, Subscription } from 'rxjs'; import { renderSectionFor } from '../sections-decorator'; import { SectionsType } from '../sections-type'; import { SectionDataObject } from '../models/section-data.model'; import { SectionsService } from '../sections.service'; import { SectionModelComponent } from '../models/section.model'; +import { SubmissionService } from '../../submission.service'; +import { hasValue } from '../../../shared/empty.util'; /** * This component represents a section for managing item's access conditions. @@ -29,6 +33,17 @@ export class SubmissionSectionSherpaPoliciesComponent extends SectionModelCompon */ public sherpaPoliciesData: WorkspaceitemSectionSherpaPoliciesObject; + /** + * The [[JsonPatchOperationPathCombiner]] object + * @type {JsonPatchOperationPathCombiner} + */ + protected pathCombiner: JsonPatchOperationPathCombiner; + + /** + * Array to track all subscriptions and unsubscribe them onDestroy + * @type {Array} + */ + protected subs: Subscription[] = []; /** * Initialize instance variables @@ -36,11 +51,15 @@ export class SubmissionSectionSherpaPoliciesComponent extends SectionModelCompon * @param {SectionsService} sectionService * @param {SectionDataObject} injectedSectionData * @param {SectionSherpaPoliciesService} sectionSherpaPoliciesService + * @param {JsonPatchOperationsBuilder} operationsBuilder + * @param {SubmissionService} submissionService * @param {string} injectedSubmissionId */ constructor( protected sectionService: SectionsService, private sectionSherpaPoliciesService: SectionSherpaPoliciesService, + protected operationsBuilder: JsonPatchOperationsBuilder, + private submissionService: SubmissionService, @Inject('sectionDataProvider') public injectedSectionData: SectionDataObject, @Inject('submissionIdProvider') public injectedSubmissionId: string) { super(undefined, injectedSectionData, injectedSubmissionId); @@ -49,11 +68,15 @@ export class SubmissionSectionSherpaPoliciesComponent extends SectionModelCompon /** * Unsubscribe from all subscriptions */ - // tslint:disable-next-line:no-empty onSectionDestroy() { - + this.subs + .filter((subscription) => hasValue(subscription)) + .forEach((subscription) => subscription.unsubscribe()); } + /** + * Expand all primary accordions + */ ngAfterViewInit() { this.acc.forEach(accordion => { accordion.expandAll(); @@ -65,9 +88,12 @@ export class SubmissionSectionSherpaPoliciesComponent extends SectionModelCompon * Initialize all instance variables and retrieve collection default access conditions */ protected onSectionInit(): void { - this.sectionSherpaPoliciesService.getSherpaPoliciesData(this.submissionId, this.sectionData.id).subscribe((sherpaPolicies: WorkspaceitemSectionSherpaPoliciesObject) => { - this.sherpaPoliciesData = sherpaPolicies; - }); + this.pathCombiner = new JsonPatchOperationPathCombiner('sections', this.sectionData.id); + this.subs.push( + this.sectionSherpaPoliciesService.getSherpaPoliciesData(this.submissionId, this.sectionData.id).subscribe((sherpaPolicies: WorkspaceitemSectionSherpaPoliciesObject) => { + this.sherpaPoliciesData = sherpaPolicies; + }) + ); } /** @@ -80,4 +106,12 @@ export class SubmissionSectionSherpaPoliciesComponent extends SectionModelCompon return of(true); } + /** + * Refresh sherpa information + */ + refresh() { + this.operationsBuilder.remove(this.pathCombiner.getPath('retrievalTime')); + this.submissionService.dispatchSaveSection(this.submissionId, this.sectionData.id); + } + } diff --git a/src/app/submission/sections/sherpa-policies/section-sherpa-policies.service.ts b/src/app/submission/sections/sherpa-policies/section-sherpa-policies.service.ts index c81caca41e..4ddf4509cb 100644 --- a/src/app/submission/sections/sherpa-policies/section-sherpa-policies.service.ts +++ b/src/app/submission/sections/sherpa-policies/section-sherpa-policies.service.ts @@ -10,7 +10,7 @@ import { isNotUndefined } from '../../../shared/empty.util'; import { submissionSectionDataFromIdSelector } from '../../selectors'; /** - * A service that provides methods to handle submission item's accesses condition state. + * A service that provides methods to handle submission item's sherpa policies state. */ @Injectable() export class SectionSherpaPoliciesService { @@ -24,7 +24,7 @@ export class SectionSherpaPoliciesService { /** - * Return item's accesses condition state. + * Return item's sherpa policies state. * * @param submissionId * The submission id diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 59079e34eb..3c2ad2505f 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -4022,6 +4022,7 @@ "submission.sections.sherpa.publisher.policy.conditions": "Conditions", + "submission.sections.sherpa.publisher.policy.refresh": "Refresh", "submission.sections.sherpa.record.information": "Record Information", From c2f57b448db1bc4716378e8ffcbb67f47390355d Mon Sep 17 00:00:00 2001 From: Kim Shepherd Date: Wed, 27 Apr 2022 14:28:35 +1200 Subject: [PATCH 066/343] [TLC-254] Ensure matchers injected in testbed providers --- .../ds-dynamic-type-bind-relation.service.spec.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-type-bind-relation.service.spec.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-type-bind-relation.service.spec.ts index c65e3c6574..1a1f27c0b4 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-type-bind-relation.service.spec.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-type-bind-relation.service.spec.ts @@ -8,7 +8,7 @@ import { OR_OPERATOR, HIDDEN_MATCHER, DISABLED_MATCHER, - REQUIRED_MATCHER, + REQUIRED_MATCHER, HIDDEN_MATCHER_PROVIDER, REQUIRED_MATCHER_PROVIDER, DISABLED_MATCHER_PROVIDER, } from '@ng-dynamic-forms/core'; import { @@ -34,7 +34,8 @@ describe('DSDynamicTypeBindRelationService test suite', () => { { provide: FormBuilderService, useValue: getMockFormBuilderService() }, { provide: DsDynamicTypeBindRelationService, useClass: DsDynamicTypeBindRelationService }, { provide: DynamicFormRelationService }, - { provide: Injector } + { provide: Injector }, + DISABLED_MATCHER_PROVIDER, HIDDEN_MATCHER_PROVIDER, REQUIRED_MATCHER_PROVIDER ] }).compileComponents().then(); }); @@ -64,7 +65,6 @@ describe('DSDynamicTypeBindRelationService test suite', () => { 'boundType', null, 'bound-auth-key', 'Bound Type' ); const bindType = service.getTypeBindValue(mockMetadataValueObject); - console.dir(bindType); expect(bindType).toBe('bound-auth-key'); }); it('Should get passed string returned directly as string passed instead of metadata', () => { @@ -97,7 +97,8 @@ describe('DSDynamicTypeBindRelationService test suite', () => { testModel.typeBindRelations = getTypeBindRelations(['boundType']); const dcTypeControl = new FormControl(); dcTypeControl.setValue('boundType'); - expect(service.subscribeRelations(testModel, dcTypeControl)).toHaveSize(1); + let subscriptions = service.subscribeRelations(testModel, dcTypeControl); + expect(subscriptions).toHaveSize(1); }); it('Expect hasMatch to be true (ie. this should be hidden)', () => { From 8cd07de4fc39b61f990e6c3fc892e7d93c945cbd Mon Sep 17 00:00:00 2001 From: Kim Shepherd Date: Wed, 27 Apr 2022 14:58:52 +1200 Subject: [PATCH 067/343] [TLC-254] Remove chaff from test --- .../ds-dynamic-type-bind-relation.service.spec.ts | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-type-bind-relation.service.spec.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-type-bind-relation.service.spec.ts index 1a1f27c0b4..f8bc7ea886 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-type-bind-relation.service.spec.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-type-bind-relation.service.spec.ts @@ -1,14 +1,12 @@ -import {inject, TestBed, waitForAsync} from '@angular/core/testing'; +import {inject, TestBed} from '@angular/core/testing'; import { DynamicFormControlRelation, - DynamicFormControlMatcher, DynamicFormRelationService, MATCH_VISIBLE, OR_OPERATOR, HIDDEN_MATCHER, - DISABLED_MATCHER, - REQUIRED_MATCHER, HIDDEN_MATCHER_PROVIDER, REQUIRED_MATCHER_PROVIDER, DISABLED_MATCHER_PROVIDER, + HIDDEN_MATCHER_PROVIDER, REQUIRED_MATCHER_PROVIDER, DISABLED_MATCHER_PROVIDER, } from '@ng-dynamic-forms/core'; import { @@ -24,7 +22,6 @@ import {Injector} from '@angular/core'; describe('DSDynamicTypeBindRelationService test suite', () => { let service: DsDynamicTypeBindRelationService; let dynamicFormRelationService: DynamicFormRelationService; - let dynamicFormControlMatchers: DynamicFormControlMatcher[]; let injector: Injector; beforeEach(() => { @@ -34,7 +31,6 @@ describe('DSDynamicTypeBindRelationService test suite', () => { { provide: FormBuilderService, useValue: getMockFormBuilderService() }, { provide: DsDynamicTypeBindRelationService, useClass: DsDynamicTypeBindRelationService }, { provide: DynamicFormRelationService }, - { provide: Injector }, DISABLED_MATCHER_PROVIDER, HIDDEN_MATCHER_PROVIDER, REQUIRED_MATCHER_PROVIDER ] }).compileComponents().then(); @@ -43,13 +39,9 @@ describe('DSDynamicTypeBindRelationService test suite', () => { beforeEach(inject([DsDynamicTypeBindRelationService, DynamicFormRelationService], (relationService: DsDynamicTypeBindRelationService, formRelationService: DynamicFormRelationService, - mockInjector: Injector, ) => { service = relationService; dynamicFormRelationService = formRelationService; - dynamicFormControlMatchers = []; - injector = mockInjector; - dynamicFormControlMatchers = [HIDDEN_MATCHER, REQUIRED_MATCHER, DISABLED_MATCHER]; })); describe('Test getTypeBindValue method', () => { From 0812377b58c88f552677d3e4868fa21382a5d680 Mon Sep 17 00:00:00 2001 From: Sufiyan Shaikh <“sufiyan.shaikh@4science.com”> Date: Wed, 27 Apr 2022 11:50:53 +0530 Subject: [PATCH 068/343] [DSC-516] Test cases changes --- ...item-admin-search-result-grid-element.component.spec.ts | 2 ++ .../truncatable-part/truncatable-part.component.spec.ts | 7 +++++-- .../truncatable-part/truncatable-part.component.ts | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/app/admin/admin-search-page/admin-search-results/admin-search-result-grid-element/item-search-result/item-admin-search-result-grid-element.component.spec.ts b/src/app/admin/admin-search-page/admin-search-results/admin-search-result-grid-element/item-search-result/item-admin-search-result-grid-element.component.spec.ts index dedada5f5f..148cfb13cb 100644 --- a/src/app/admin/admin-search-page/admin-search-results/admin-search-result-grid-element/item-search-result/item-admin-search-result-grid-element.component.spec.ts +++ b/src/app/admin/admin-search-page/admin-search-results/admin-search-result-grid-element/item-search-result/item-admin-search-result-grid-element.component.spec.ts @@ -18,6 +18,7 @@ import { ItemAdminSearchResultGridElementComponent } from './item-admin-search-r import { createSuccessfulRemoteDataObject$ } from '../../../../../shared/remote-data.utils'; import { getMockThemeService } from '../../../../../shared/mocks/theme-service.mock'; import { ThemeService } from '../../../../../shared/theme-support/theme.service'; +import { NativeWindowRef, NativeWindowService } from '../../../../../core/services/window.service'; describe('ItemAdminSearchResultGridElementComponent', () => { let component: ItemAdminSearchResultGridElementComponent; @@ -52,6 +53,7 @@ describe('ItemAdminSearchResultGridElementComponent', () => { SharedModule ], providers: [ + { provide: NativeWindowService, useValue: new NativeWindowRef() }, { provide: TruncatableService, useValue: mockTruncatableService }, { provide: BitstreamDataService, useValue: mockBitstreamDataService }, { provide: ThemeService, useValue: mockThemeService }, diff --git a/src/app/shared/truncatable/truncatable-part/truncatable-part.component.spec.ts b/src/app/shared/truncatable/truncatable-part/truncatable-part.component.spec.ts index 09109ee400..09d603e6b7 100644 --- a/src/app/shared/truncatable/truncatable-part/truncatable-part.component.spec.ts +++ b/src/app/shared/truncatable/truncatable-part/truncatable-part.component.spec.ts @@ -9,6 +9,7 @@ import { getMockTranslateService } from '../../mocks/translate.service.mock'; import { TranslateLoaderMock } from '../../mocks/translate-loader.mock'; import { mockTruncatableService } from '../../mocks/mock-trucatable.service'; import { By } from '@angular/platform-browser'; +import { NativeWindowRef, NativeWindowService } from '../../../core/services/window.service'; describe('TruncatablePartComponent', () => { let comp: TruncatablePartComponent; @@ -29,7 +30,7 @@ describe('TruncatablePartComponent', () => { }; beforeEach(waitForAsync(() => { translateService = getMockTranslateService(); - TestBed.configureTestingModule({ + void TestBed.configureTestingModule({ imports: [NoopAnimationsModule, TranslateModule.forRoot({ loader: { @@ -40,6 +41,7 @@ describe('TruncatablePartComponent', () => { ], declarations: [TruncatablePartComponent], providers: [ + { provide: NativeWindowService, useValue: new NativeWindowRef() }, { provide: TruncatableService, useValue: truncatableServiceStub }, ], schemas: [NO_ERRORS_SCHEMA] @@ -110,7 +112,7 @@ describe('TruncatablePartComponent', () => { let truncatableService; beforeEach(waitForAsync(() => { translateService = getMockTranslateService(); - TestBed.configureTestingModule({ + void TestBed.configureTestingModule({ imports: [ NoopAnimationsModule, TranslateModule.forRoot({ @@ -122,6 +124,7 @@ describe('TruncatablePartComponent', () => { ], declarations: [TruncatablePartComponent], providers: [ + { provide: NativeWindowService, useValue: new NativeWindowRef() }, { provide: TruncatableService, useValue: mockTruncatableService }, ], schemas: [NO_ERRORS_SCHEMA] diff --git a/src/app/shared/truncatable/truncatable-part/truncatable-part.component.ts b/src/app/shared/truncatable/truncatable-part/truncatable-part.component.ts index fe8279ee07..7fe36e950a 100644 --- a/src/app/shared/truncatable/truncatable-part/truncatable-part.component.ts +++ b/src/app/shared/truncatable/truncatable-part/truncatable-part.component.ts @@ -2,7 +2,7 @@ import { Component, Inject, Input, OnDestroy, OnInit, PLATFORM_ID } from '@angul import { TruncatableService } from '../truncatable.service'; import { hasValue } from '../../empty.util'; import { DOCUMENT, isPlatformBrowser } from '@angular/common'; -import { NativeWindowRef, NativeWindowService } from 'src/app/core/services/window.service'; +import { NativeWindowRef, NativeWindowService } from '../../../core/services/window.service'; @Component({ selector: 'ds-truncatable-part', From 3bc5ee0253c8699bed716b60c5f9ea2c85ed2d83 Mon Sep 17 00:00:00 2001 From: Art Lowel Date: Tue, 26 Apr 2022 11:15:42 +0200 Subject: [PATCH 069/343] pages loading twice poc Cherry-picked from original branch started from Angular 13 PR --- .gitignore | 2 + package.json | 2 +- src/app/app-routing.module.ts | 10 +- src/app/app.component.ts | 29 +- src/app/app.module.ts | 51 +- src/app/core/auth/auth.reducer.ts | 7 +- src/app/core/core.module.ts | 2 - src/app/core/services/api.service.ts | 24 - src/app/menu.resolver.spec.ts | 16 + src/app/menu.resolver.ts | 89 + src/app/navbar/navbar.component.ts | 66 +- src/app/root.module.ts | 98 + src/app/shared/menu/menu.service.ts | 8 +- src/modules/app/browser-app.module.ts | 24 +- src/modules/app/server-app.module.ts | 11 +- .../dspace-browser-transfer-state.service.ts | 9 +- .../dspace-server-transfer-state.service.ts | 4 +- .../dspace-transfer-state.service.ts | 2 +- .../ngx-translate-state.ts | 15 + .../translate-browser.loader.ts | 44 + .../translate-json5-http.loader.ts | 15 - .../translate-json5-universal.loader.ts | 17 - .../translate-server.loader.ts | 52 + src/themes/custom/theme.module.ts | 2 + src/themes/dspace/eager-theme.module.ts | 53 + src/themes/dspace/entry-components.ts | 2 - .../{theme.module.ts => lazy-theme.module.ts} | 50 +- src/themes/eager-themes.module.ts | 15 + src/themes/themed-entry-component.module.ts | 23 - webpack/webpack.browser.ts | 27 +- yarn.lock | 30380 ++++++++-------- 31 files changed, 15697 insertions(+), 15452 deletions(-) delete mode 100644 src/app/core/services/api.service.ts create mode 100644 src/app/menu.resolver.spec.ts create mode 100644 src/app/menu.resolver.ts create mode 100644 src/app/root.module.ts create mode 100644 src/ngx-translate-loaders/ngx-translate-state.ts create mode 100644 src/ngx-translate-loaders/translate-browser.loader.ts delete mode 100644 src/ngx-translate-loaders/translate-json5-http.loader.ts delete mode 100644 src/ngx-translate-loaders/translate-json5-universal.loader.ts create mode 100644 src/ngx-translate-loaders/translate-server.loader.ts create mode 100644 src/themes/dspace/eager-theme.module.ts delete mode 100644 src/themes/dspace/entry-components.ts rename src/themes/dspace/{theme.module.ts => lazy-theme.module.ts} (71%) create mode 100644 src/themes/eager-themes.module.ts delete mode 100644 src/themes/themed-entry-component.module.ts diff --git a/.gitignore b/.gitignore index 026110f222..5801f19566 100644 --- a/.gitignore +++ b/.gitignore @@ -36,3 +36,5 @@ package-lock.json .env /nbproject/ + +junit.xml diff --git a/package.json b/package.json index 278afdf6c3..4a9d2f144f 100644 --- a/package.json +++ b/package.json @@ -142,7 +142,7 @@ "@types/node": "^14.14.9", "axe-core": "^4.3.3", "codelyzer": "^6.0.0", - "compression-webpack-plugin": "^3.0.1", + "compression-webpack-plugin": "^6.1.1", "copy-webpack-plugin": "^6.4.1", "cross-env": "^7.0.3", "css-loader": "3.4.0", diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 88f7791b1b..f0869d9fb6 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -1,5 +1,5 @@ import { NgModule } from '@angular/core'; -import { RouterModule } from '@angular/router'; +import { RouterModule, NoPreloading } from '@angular/router'; import { AuthBlockingGuard } from './core/auth/auth-blocking.guard'; import { AuthenticatedGuard } from './core/auth/authenticated.guard'; @@ -30,6 +30,7 @@ import { ThemedForbiddenComponent } from './forbidden/themed-forbidden.component import { GroupAdministratorGuard } from './core/data/feature-authorization/feature-authorization-guard/group-administrator.guard'; import { ThemedPageInternalServerErrorComponent } from './page-internal-server-error/themed-page-internal-server-error.component'; import { ServerCheckGuard } from './core/server-check/server-check.guard'; +import { MenuResolver } from './menu.resolver'; @NgModule({ imports: [ @@ -39,6 +40,7 @@ import { ServerCheckGuard } from './core/server-check/server-check.guard'; path: '', canActivate: [AuthBlockingGuard], canActivateChild: [ServerCheckGuard], + resolve: [MenuResolver], children: [ { path: '', redirectTo: '/home', pathMatch: 'full' }, { @@ -217,6 +219,12 @@ import { ServerCheckGuard } from './core/server-check/server-check.guard'; ] } ], { + // enableTracing: true, + useHash: false, + scrollPositionRestoration: 'enabled', + anchorScrolling: 'enabled', + initialNavigation: 'enabledBlocking', + preloadingStrategy: NoPreloading, onSameUrlNavigation: 'reload', }) ], diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 669411d9aa..ea2fb9fde6 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -72,7 +72,7 @@ export class AppComponent implements OnInit, AfterViewInit { /** * Whether or not the app is in the process of rerouting */ - isRouteLoading$: BehaviorSubject = new BehaviorSubject(true); + isRouteLoading$: BehaviorSubject = new BehaviorSubject(false); /** * Whether or not the theme is in the process of being swapped @@ -121,7 +121,7 @@ export class AppComponent implements OnInit, AfterViewInit { this.themeService.getThemeName$().subscribe((themeName: string) => { if (isPlatformBrowser(this.platformId)) { // the theme css will never download server side, so this should only happen on the browser - this.isThemeCSSLoading$.next(true); + this.distinctNext(this.isThemeCSSLoading$, true); } if (hasValue(themeName)) { this.loadGlobalThemeConfig(themeName); @@ -200,8 +200,8 @@ export class AppComponent implements OnInit, AfterViewInit { this.router.events.subscribe((event) => { if (event instanceof NavigationStart) { resolveEndFound = false; - this.isRouteLoading$.next(true); - this.isThemeLoading$.next(true); + this.distinctNext(this.isRouteLoading$, true); + this.distinctNext(this.isThemeLoading$, true); } else if (event instanceof ResolveEnd) { resolveEndFound = true; const activatedRouteSnapShot: ActivatedRouteSnapshot = event.state.root; @@ -214,16 +214,16 @@ export class AppComponent implements OnInit, AfterViewInit { } }) ).subscribe((changed) => { - this.isThemeLoading$.next(changed); + this.distinctNext(this.isThemeLoading$, changed); }); } else if ( event instanceof NavigationEnd || event instanceof NavigationCancel ) { if (!resolveEndFound) { - this.isThemeLoading$.next(false); + this.distinctNext(this.isThemeLoading$, false); } - this.isRouteLoading$.next(false); + this.distinctNext(this.isRouteLoading$, false); } }); } @@ -281,7 +281,7 @@ export class AppComponent implements OnInit, AfterViewInit { }); } // the fact that this callback is used, proves we're on the browser. - this.isThemeCSSLoading$.next(false); + this.distinctNext(this.isThemeCSSLoading$, false); }; head.appendChild(link); } @@ -376,4 +376,17 @@ export class AppComponent implements OnInit, AfterViewInit { } }); } + + /** + * Use nextValue to update a given BehaviorSubject, only if it differs from its current value + * + * @param bs a BehaviorSubject + * @param nextValue the next value for that BehaviorSubject + * @protected + */ + protected distinctNext(bs: BehaviorSubject, nextValue: T): void { + if (bs.getValue() !== nextValue) { + bs.next(nextValue); + } + } } diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 67bccd9105..a1db89b60d 100755 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -16,10 +16,6 @@ import { } from '@ng-dynamic-forms/core'; import { TranslateModule } from '@ngx-translate/core'; import { ScrollToModule } from '@nicky-lenaers/ngx-scroll-to'; - -import { AdminSidebarSectionComponent } from './admin/admin-sidebar/admin-sidebar-section/admin-sidebar-section.component'; -import { AdminSidebarComponent } from './admin/admin-sidebar/admin-sidebar.component'; -import { ExpandableAdminSidebarSectionComponent } from './admin/admin-sidebar/expandable-admin-sidebar-section/expandable-admin-sidebar-section.component'; import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; import { appEffects } from './app.effects'; @@ -28,36 +24,18 @@ import { appReducers, AppState, storeModuleConfig } from './app.reducer'; import { CheckAuthenticationTokenAction } from './core/auth/auth.actions'; import { CoreModule } from './core/core.module'; import { ClientCookieService } from './core/services/client-cookie.service'; -import { FooterComponent } from './footer/footer.component'; -import { HeaderNavbarWrapperComponent } from './header-nav-wrapper/header-navbar-wrapper.component'; -import { HeaderComponent } from './header/header.component'; import { NavbarModule } from './navbar/navbar.module'; -import { PageNotFoundComponent } from './pagenotfound/pagenotfound.component'; import { DSpaceRouterStateSerializer } from './shared/ngrx/dspace-router-state-serializer'; -import { NotificationComponent } from './shared/notifications/notification/notification.component'; -import { NotificationsBoardComponent } from './shared/notifications/notifications-board/notifications-board.component'; import { SharedModule } from './shared/shared.module'; -import { BreadcrumbsComponent } from './breadcrumbs/breadcrumbs.component'; import { environment } from '../environments/environment'; -import { ForbiddenComponent } from './forbidden/forbidden.component'; import { AuthInterceptor } from './core/auth/auth.interceptor'; import { LocaleInterceptor } from './core/locale/locale.interceptor'; import { XsrfInterceptor } from './core/xsrf/xsrf.interceptor'; import { LogInterceptor } from './core/log/log.interceptor'; -import { RootComponent } from './root/root.component'; -import { ThemedRootComponent } from './root/themed-root.component'; -import { ThemedEntryComponentModule } from '../themes/themed-entry-component.module'; -import { ThemedPageNotFoundComponent } from './pagenotfound/themed-pagenotfound.component'; -import { ThemedForbiddenComponent } from './forbidden/themed-forbidden.component'; -import { ThemedHeaderComponent } from './header/themed-header.component'; -import { ThemedFooterComponent } from './footer/themed-footer.component'; -import { ThemedBreadcrumbsComponent } from './breadcrumbs/themed-breadcrumbs.component'; -import { ThemedHeaderNavbarWrapperComponent } from './header-nav-wrapper/themed-header-navbar-wrapper.component'; -import { IdleModalComponent } from './shared/idle-modal/idle-modal.component'; -import { ThemedPageInternalServerErrorComponent } from './page-internal-server-error/themed-page-internal-server-error.component'; -import { PageInternalServerErrorComponent } from './page-internal-server-error/page-internal-server-error.component'; +import { EagerThemesModule } from '../themes/eager-themes.module'; import { APP_CONFIG, AppConfig } from '../config/app-config.interface'; +import { RootModule } from './root.module'; export function getConfig() { return environment; @@ -92,7 +70,8 @@ const IMPORTS = [ EffectsModule.forRoot(appEffects), StoreModule.forRoot(appReducers, storeModuleConfig), StoreRouterConnectingModule.forRoot(), - ThemedEntryComponentModule.withEntryComponents(), + EagerThemesModule, + RootModule, ]; IMPORTS.push( @@ -164,28 +143,6 @@ const PROVIDERS = [ const DECLARATIONS = [ AppComponent, - RootComponent, - ThemedRootComponent, - HeaderComponent, - ThemedHeaderComponent, - HeaderNavbarWrapperComponent, - ThemedHeaderNavbarWrapperComponent, - AdminSidebarComponent, - AdminSidebarSectionComponent, - ExpandableAdminSidebarSectionComponent, - FooterComponent, - ThemedFooterComponent, - PageNotFoundComponent, - ThemedPageNotFoundComponent, - NotificationComponent, - NotificationsBoardComponent, - BreadcrumbsComponent, - ThemedBreadcrumbsComponent, - ForbiddenComponent, - ThemedForbiddenComponent, - IdleModalComponent, - ThemedPageInternalServerErrorComponent, - PageInternalServerErrorComponent ]; const EXPORTS = [ diff --git a/src/app/core/auth/auth.reducer.ts b/src/app/core/auth/auth.reducer.ts index 2fc79a8861..6f47a3c20c 100644 --- a/src/app/core/auth/auth.reducer.ts +++ b/src/app/core/auth/auth.reducer.ts @@ -92,11 +92,15 @@ export function authReducer(state: any = initialState, action: AuthActions): Aut }); case AuthActionTypes.AUTHENTICATED: + return Object.assign({}, state, { + loading: true, + blocking: true + }); + case AuthActionTypes.CHECK_AUTHENTICATION_TOKEN: case AuthActionTypes.CHECK_AUTHENTICATION_TOKEN_COOKIE: return Object.assign({}, state, { loading: true, - blocking: true }); case AuthActionTypes.AUTHENTICATED_ERROR: @@ -210,7 +214,6 @@ export function authReducer(state: any = initialState, action: AuthActions): Aut case AuthActionTypes.RETRIEVE_AUTH_METHODS: return Object.assign({}, state, { loading: true, - blocking: true }); case AuthActionTypes.RETRIEVE_AUTH_METHODS_SUCCESS: diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index 8d8a614a89..433b8e98d6 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -75,7 +75,6 @@ import { RegistryService } from './registry/registry.service'; import { RoleService } from './roles/role.service'; import { FeedbackDataService } from './feedback/feedback-data.service'; -import { ApiService } from './services/api.service'; import { ServerResponseService } from './services/server-response.service'; import { NativeWindowFactory, NativeWindowService } from './services/window.service'; import { BitstreamFormat } from './shared/bitstream-format.model'; @@ -186,7 +185,6 @@ const DECLARATIONS = []; const EXPORTS = []; const PROVIDERS = [ - ApiService, AuthenticatedGuard, CommunityDataService, CollectionDataService, diff --git a/src/app/core/services/api.service.ts b/src/app/core/services/api.service.ts deleted file mode 100644 index 4f8474e0c1..0000000000 --- a/src/app/core/services/api.service.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { throwError as observableThrowError } from 'rxjs'; -import { catchError } from 'rxjs/operators'; - -import { Injectable } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; - -@Injectable() -export class ApiService { - constructor(public _http: HttpClient) { - - } - - /** - * whatever domain/feature method name - */ - get(url: string, options?: any) { - return this._http.get(url, options).pipe( - catchError((err) => { - console.log('Error: ', err); - return observableThrowError(err); - })); - } - -} diff --git a/src/app/menu.resolver.spec.ts b/src/app/menu.resolver.spec.ts new file mode 100644 index 0000000000..76adc49bc9 --- /dev/null +++ b/src/app/menu.resolver.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { MenuResolver } from './menu.resolver'; + +describe('MenuResolver', () => { + let resolver: MenuResolver; + + beforeEach(() => { + TestBed.configureTestingModule({}); + resolver = TestBed.inject(MenuResolver); + }); + + it('should be created', () => { + expect(resolver).toBeTruthy(); + }); +}); diff --git a/src/app/menu.resolver.ts b/src/app/menu.resolver.ts new file mode 100644 index 0000000000..12af6236fe --- /dev/null +++ b/src/app/menu.resolver.ts @@ -0,0 +1,89 @@ +import { Injectable } from '@angular/core'; +import { Resolve, RouterStateSnapshot, ActivatedRouteSnapshot } from '@angular/router'; +import { Observable } from 'rxjs'; +import { MenuItemType, MenuID } from './shared/menu/initial-menus-state'; +import { LinkMenuItemModel } from './shared/menu/menu-item/models/link.model'; +import { getFirstCompletedRemoteData } from './core/shared/operators'; +import { PaginatedList } from './core/data/paginated-list.model'; +import { BrowseDefinition } from './core/shared/browse-definition.model'; +import { RemoteData } from './core/data/remote-data'; +import { TextMenuItemModel } from './shared/menu/menu-item/models/text.model'; +import { BrowseService } from './core/browse/browse.service'; +import { MenuService } from './shared/menu/menu.service'; +import { MenuState } from './shared/menu/menu.reducer'; +import { find, map } from 'rxjs/operators'; +import { hasValue } from './shared/empty.util'; + +@Injectable({ + providedIn: 'root' +}) +export class MenuResolver implements Resolve { + constructor( + protected menuService: MenuService, + public browseService: BrowseService, + ) { + } + + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { + this.createPublicMenu(); + return this.menuService.getMenu(MenuID.PUBLIC).pipe( + find((menu: MenuState) => hasValue(menu)), + map(() => true) + ); + } + + createPublicMenu() { + const menuList: any[] = [ + /* Communities & Collections tree */ + { + id: `browse_global_communities_and_collections`, + active: false, + visible: true, + index: 0, + model: { + type: MenuItemType.LINK, + text: `menu.section.browse_global_communities_and_collections`, + link: `/community-list` + } as LinkMenuItemModel + } + ]; + // Read the different Browse-By types from config and add them to the browse menu + this.browseService.getBrowseDefinitions() + .pipe(getFirstCompletedRemoteData>()) + .subscribe((browseDefListRD: RemoteData>) => { + if (browseDefListRD.hasSucceeded) { + browseDefListRD.payload.page.forEach((browseDef: BrowseDefinition) => { + menuList.push({ + id: `browse_global_by_${browseDef.id}`, + parentID: 'browse_global', + active: false, + visible: true, + model: { + type: MenuItemType.LINK, + text: `menu.section.browse_global_by_${browseDef.id}`, + link: `/browse/${browseDef.id}` + } as LinkMenuItemModel + }); + }); + menuList.push( + /* Browse */ + { + id: 'browse_global', + active: false, + visible: true, + index: 1, + model: { + type: MenuItemType.TEXT, + text: 'menu.section.browse_global' + } as TextMenuItemModel, + } + ); + } + menuList.forEach((menuSection) => this.menuService.addSection(MenuID.PUBLIC, Object.assign(menuSection, { + shouldPersistOnRouteChange: true + }))); + }); + + } + +} diff --git a/src/app/navbar/navbar.component.ts b/src/app/navbar/navbar.component.ts index 836f94781a..5e32b6e72c 100644 --- a/src/app/navbar/navbar.component.ts +++ b/src/app/navbar/navbar.component.ts @@ -2,15 +2,9 @@ import { Component, Injector } from '@angular/core'; import { slideMobileNav } from '../shared/animations/slide'; import { MenuComponent } from '../shared/menu/menu.component'; import { MenuService } from '../shared/menu/menu.service'; -import { MenuID, MenuItemType } from '../shared/menu/initial-menus-state'; -import { TextMenuItemModel } from '../shared/menu/menu-item/models/text.model'; -import { LinkMenuItemModel } from '../shared/menu/menu-item/models/link.model'; +import { MenuID } from '../shared/menu/initial-menus-state'; import { HostWindowService } from '../shared/host-window.service'; import { BrowseService } from '../core/browse/browse.service'; -import { getFirstCompletedRemoteData } from '../core/shared/operators'; -import { PaginatedList } from '../core/data/paginated-list.model'; -import { BrowseDefinition } from '../core/shared/browse-definition.model'; -import { RemoteData } from '../core/data/remote-data'; import { ActivatedRoute } from '@angular/router'; import { AuthorizationDataService } from '../core/data/feature-authorization/authorization-data.service'; @@ -41,64 +35,6 @@ export class NavbarComponent extends MenuComponent { } ngOnInit(): void { - this.createMenu(); super.ngOnInit(); } - - /** - * Initialize all menu sections and items for this menu - */ - createMenu() { - const menuList: any[] = [ - /* Communities & Collections tree */ - { - id: `browse_global_communities_and_collections`, - active: false, - visible: true, - index: 0, - model: { - type: MenuItemType.LINK, - text: `menu.section.browse_global_communities_and_collections`, - link: `/community-list` - } as LinkMenuItemModel - } - ]; - // Read the different Browse-By types from config and add them to the browse menu - this.browseService.getBrowseDefinitions() - .pipe(getFirstCompletedRemoteData>()) - .subscribe((browseDefListRD: RemoteData>) => { - if (browseDefListRD.hasSucceeded) { - browseDefListRD.payload.page.forEach((browseDef: BrowseDefinition) => { - menuList.push({ - id: `browse_global_by_${browseDef.id}`, - parentID: 'browse_global', - active: false, - visible: true, - model: { - type: MenuItemType.LINK, - text: `menu.section.browse_global_by_${browseDef.id}`, - link: `/browse/${browseDef.id}` - } as LinkMenuItemModel - }); - }); - menuList.push( - /* Browse */ - { - id: 'browse_global', - active: false, - visible: true, - index: 1, - model: { - type: MenuItemType.TEXT, - text: 'menu.section.browse_global' - } as TextMenuItemModel, - } - ); - } - menuList.forEach((menuSection) => this.menuService.addSection(this.menuID, Object.assign(menuSection, { - shouldPersistOnRouteChange: true - }))); - }); - - } } diff --git a/src/app/root.module.ts b/src/app/root.module.ts new file mode 100644 index 0000000000..e6c7cb4111 --- /dev/null +++ b/src/app/root.module.ts @@ -0,0 +1,98 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; + +import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; + +import { + AdminSidebarSectionComponent +} from './admin/admin-sidebar/admin-sidebar-section/admin-sidebar-section.component'; +import { AdminSidebarComponent } from './admin/admin-sidebar/admin-sidebar.component'; +import { + ExpandableAdminSidebarSectionComponent +} from './admin/admin-sidebar/expandable-admin-sidebar-section/expandable-admin-sidebar-section.component'; +import { FooterComponent } from './footer/footer.component'; +import { HeaderNavbarWrapperComponent } from './header-nav-wrapper/header-navbar-wrapper.component'; +import { HeaderComponent } from './header/header.component'; +import { NavbarModule } from './navbar/navbar.module'; +import { PageNotFoundComponent } from './pagenotfound/pagenotfound.component'; +import { NotificationComponent } from './shared/notifications/notification/notification.component'; +import { + NotificationsBoardComponent +} from './shared/notifications/notifications-board/notifications-board.component'; +import { SharedModule } from './shared/shared.module'; +import { BreadcrumbsComponent } from './breadcrumbs/breadcrumbs.component'; +import { ForbiddenComponent } from './forbidden/forbidden.component'; +import { RootComponent } from './root/root.component'; +import { ThemedRootComponent } from './root/themed-root.component'; +import { ThemedPageNotFoundComponent } from './pagenotfound/themed-pagenotfound.component'; +import { ThemedForbiddenComponent } from './forbidden/themed-forbidden.component'; +import { ThemedHeaderComponent } from './header/themed-header.component'; +import { ThemedFooterComponent } from './footer/themed-footer.component'; +import { ThemedBreadcrumbsComponent } from './breadcrumbs/themed-breadcrumbs.component'; +import { + ThemedHeaderNavbarWrapperComponent +} from './header-nav-wrapper/themed-header-navbar-wrapper.component'; +import { IdleModalComponent } from './shared/idle-modal/idle-modal.component'; +import { + ThemedPageInternalServerErrorComponent +} from './page-internal-server-error/themed-page-internal-server-error.component'; +import { + PageInternalServerErrorComponent +} from './page-internal-server-error/page-internal-server-error.component'; + +const IMPORTS = [ + CommonModule, + SharedModule.withEntryComponents(), + NavbarModule, + NgbModule, +]; + +const PROVIDERS = [ +]; + +const DECLARATIONS = [ + RootComponent, + ThemedRootComponent, + HeaderComponent, + ThemedHeaderComponent, + HeaderNavbarWrapperComponent, + ThemedHeaderNavbarWrapperComponent, + AdminSidebarComponent, + AdminSidebarSectionComponent, + ExpandableAdminSidebarSectionComponent, + FooterComponent, + ThemedFooterComponent, + PageNotFoundComponent, + ThemedPageNotFoundComponent, + NotificationComponent, + NotificationsBoardComponent, + BreadcrumbsComponent, + ThemedBreadcrumbsComponent, + ForbiddenComponent, + ThemedForbiddenComponent, + IdleModalComponent, + ThemedPageInternalServerErrorComponent, + PageInternalServerErrorComponent +]; + +const EXPORTS = [ +]; + +@NgModule({ + imports: [ + ...IMPORTS + ], + providers: [ + ...PROVIDERS + ], + declarations: [ + ...DECLARATIONS, + ], + exports: [ + ...EXPORTS, + ...DECLARATIONS, + ] +}) +export class RootModule { + +} diff --git a/src/app/shared/menu/menu.service.ts b/src/app/shared/menu/menu.service.ts index ac713f4194..b4e5ada82a 100644 --- a/src/app/shared/menu/menu.service.ts +++ b/src/app/shared/menu/menu.service.ts @@ -37,7 +37,7 @@ const menuByIDSelector = (menuID: MenuID): MemoizedSelector return keySelector(menuID, menusStateSelector); }; -const menuSectionStateSelector = (state: MenuState) => state.sections; +const menuSectionStateSelector = (state: MenuState) => hasValue(state) ? state.sections : {}; const menuSectionByIDSelector = (id: string): MemoizedSelector => { return menuKeySelector(id, menuSectionStateSelector); @@ -164,7 +164,7 @@ export class MenuService { */ isMenuCollapsed(menuID: MenuID): Observable { return this.getMenu(menuID).pipe( - map((state: MenuState) => state.collapsed) + map((state: MenuState) => hasValue(state) ? state.collapsed : undefined) ); } @@ -175,7 +175,7 @@ export class MenuService { */ isMenuPreviewCollapsed(menuID: MenuID): Observable { return this.getMenu(menuID).pipe( - map((state: MenuState) => state.previewCollapsed) + map((state: MenuState) => hasValue(state) ? state.previewCollapsed : undefined) ); } @@ -186,7 +186,7 @@ export class MenuService { */ isMenuVisible(menuID: MenuID): Observable { return this.getMenu(menuID).pipe( - map((state: MenuState) => state.visible) + map((state: MenuState) => hasValue(state) ? state.visible : undefined) ); } diff --git a/src/modules/app/browser-app.module.ts b/src/modules/app/browser-app.module.ts index 88a59eb157..20c68898ae 100644 --- a/src/modules/app/browser-app.module.ts +++ b/src/modules/app/browser-app.module.ts @@ -2,11 +2,10 @@ import { HttpClient, HttpClientModule } from '@angular/common/http'; import { APP_INITIALIZER, NgModule } from '@angular/core'; import { BrowserModule, makeStateKey, TransferState } from '@angular/platform-browser'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { RouterModule, NoPreloading } from '@angular/router'; import { REQUEST } from '@nguniversal/express-engine/tokens'; import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; -import { TranslateJson5HttpLoader } from '../../ngx-translate-loaders/translate-json5-http.loader'; +import { TranslateBrowserLoader } from '../../ngx-translate-loaders/translate-browser.loader'; import { IdlePreloadModule } from 'angular-idle-preload'; @@ -42,8 +41,8 @@ import { environment } from '../../environments/environment'; export const REQ_KEY = makeStateKey('req'); -export function createTranslateLoader(http: HttpClient) { - return new TranslateJson5HttpLoader(http, 'assets/i18n/', '.json5'); +export function createTranslateLoader(transferState: TransferState, http: HttpClient) { + return new TranslateBrowserLoader(transferState, http, 'assets/i18n/', '.json5'); } export function getRequest(transferState: TransferState): any { @@ -59,13 +58,6 @@ export function getRequest(transferState: TransferState): any { HttpClientModule, // forRoot ensures the providers are only created once IdlePreloadModule.forRoot(), - RouterModule.forRoot([], { - // enableTracing: true, - useHash: false, - scrollPositionRestoration: 'enabled', - anchorScrolling: 'enabled', - preloadingStrategy: NoPreloading - }), StatisticsModule.forRoot(), Angulartics2RouterlessModule.forRoot(), BrowserAnimationsModule, @@ -74,7 +66,7 @@ export function getRequest(transferState: TransferState): any { loader: { provide: TranslateLoader, useFactory: (createTranslateLoader), - deps: [HttpClient] + deps: [TransferState, HttpClient] } }), AppModule @@ -92,9 +84,11 @@ export function getRequest(transferState: TransferState): any { // extend environment with app config for browser extendEnvironmentWithAppConfig(environment, appConfig); } - dspaceTransferState.transfer(); - correlationIdService.initCorrelationId(); - return () => true; + return () => + dspaceTransferState.transfer().then((b: boolean) => { + correlationIdService.initCorrelationId(); + return b; + }); }, deps: [TransferState, DSpaceTransferState, CorrelationIdService], multi: true diff --git a/src/modules/app/server-app.module.ts b/src/modules/app/server-app.module.ts index 01a5548948..4f8569962c 100644 --- a/src/modules/app/server-app.module.ts +++ b/src/modules/app/server-app.module.ts @@ -15,7 +15,7 @@ import { AppComponent } from '../../app/app.component'; import { AppModule } from '../../app/app.module'; import { DSpaceServerTransferStateModule } from '../transfer-state/dspace-server-transfer-state.module'; import { DSpaceTransferState } from '../transfer-state/dspace-transfer-state.service'; -import { TranslateJson5UniversalLoader } from '../../ngx-translate-loaders/translate-json5-universal.loader'; +import { TranslateServerLoader } from '../../ngx-translate-loaders/translate-server.loader'; import { CookieService } from '../../app/core/services/cookie.service'; import { ServerCookieService } from '../../app/core/services/server-cookie.service'; import { AuthService } from '../../app/core/auth/auth.service'; @@ -37,8 +37,8 @@ import { AppConfig, APP_CONFIG_STATE } from '../../config/app-config.interface'; import { environment } from '../../environments/environment'; -export function createTranslateLoader() { - return new TranslateJson5UniversalLoader('dist/server/assets/i18n/', '.json5'); +export function createTranslateLoader(transferState: TransferState) { + return new TranslateServerLoader(transferState, 'dist/server/assets/i18n/', '.json5'); } @NgModule({ @@ -47,16 +47,13 @@ export function createTranslateLoader() { BrowserModule.withServerTransition({ appId: 'dspace-angular' }), - RouterModule.forRoot([], { - useHash: false - }), NoopAnimationsModule, DSpaceServerTransferStateModule, TranslateModule.forRoot({ loader: { provide: TranslateLoader, useFactory: (createTranslateLoader), - deps: [] + deps: [TransferState] } }), ServerModule, diff --git a/src/modules/transfer-state/dspace-browser-transfer-state.service.ts b/src/modules/transfer-state/dspace-browser-transfer-state.service.ts index ae3306c3fb..fd7c1e3e97 100644 --- a/src/modules/transfer-state/dspace-browser-transfer-state.service.ts +++ b/src/modules/transfer-state/dspace-browser-transfer-state.service.ts @@ -1,12 +1,19 @@ import { Injectable } from '@angular/core'; +import { coreSelector } from 'src/app/core/core.selectors'; import { StoreAction, StoreActionTypes } from '../../app/store.actions'; import { DSpaceTransferState } from './dspace-transfer-state.service'; +import { find, map } from 'rxjs/operators'; +import { isNotEmpty } from '../../app/shared/empty.util'; @Injectable() export class DSpaceBrowserTransferState extends DSpaceTransferState { - transfer() { + async transfer(): Promise { const state = this.transferState.get(DSpaceTransferState.NGRX_STATE, null); this.transferState.remove(DSpaceTransferState.NGRX_STATE); this.store.dispatch(new StoreAction(StoreActionTypes.REHYDRATE, state)); + return this.store.select(coreSelector).pipe( + find((core: any) => isNotEmpty(core)), + map(() => true) + ).toPromise(); } } diff --git a/src/modules/transfer-state/dspace-server-transfer-state.service.ts b/src/modules/transfer-state/dspace-server-transfer-state.service.ts index ac8c817d84..96b1e4be38 100644 --- a/src/modules/transfer-state/dspace-server-transfer-state.service.ts +++ b/src/modules/transfer-state/dspace-server-transfer-state.service.ts @@ -5,7 +5,7 @@ import { DSpaceTransferState } from './dspace-transfer-state.service'; @Injectable() export class DSpaceServerTransferState extends DSpaceTransferState { - transfer() { + transfer(): Promise { this.transferState.onSerialize(DSpaceTransferState.NGRX_STATE, () => { let state; this.store.pipe(take(1)).subscribe((saveState: any) => { @@ -14,5 +14,7 @@ export class DSpaceServerTransferState extends DSpaceTransferState { return state; }); + + return new Promise(() => true); } } diff --git a/src/modules/transfer-state/dspace-transfer-state.service.ts b/src/modules/transfer-state/dspace-transfer-state.service.ts index 05b1109f17..32761866fb 100644 --- a/src/modules/transfer-state/dspace-transfer-state.service.ts +++ b/src/modules/transfer-state/dspace-transfer-state.service.ts @@ -14,5 +14,5 @@ export abstract class DSpaceTransferState { ) { } - abstract transfer(): void; + abstract transfer(): Promise; } diff --git a/src/ngx-translate-loaders/ngx-translate-state.ts b/src/ngx-translate-loaders/ngx-translate-state.ts new file mode 100644 index 0000000000..4e6c2f496b --- /dev/null +++ b/src/ngx-translate-loaders/ngx-translate-state.ts @@ -0,0 +1,15 @@ +import { makeStateKey } from '@angular/platform-browser'; + +/** + * Represents ngx-translate messages in different languages in the TransferState + */ +export class NgxTranslateState { + [lang: string]: { + [key: string]: string + } +} + +/** + * The key to store the NgxTranslateState as part of the TransferState + */ +export const NGX_TRANSLATE_STATE = makeStateKey('NGX_TRANSLATE_STATE'); diff --git a/src/ngx-translate-loaders/translate-browser.loader.ts b/src/ngx-translate-loaders/translate-browser.loader.ts new file mode 100644 index 0000000000..217f301bd5 --- /dev/null +++ b/src/ngx-translate-loaders/translate-browser.loader.ts @@ -0,0 +1,44 @@ +import { TranslateLoader } from '@ngx-translate/core'; +import { HttpClient } from '@angular/common/http'; +import { TransferState } from '@angular/platform-browser'; +import { NGX_TRANSLATE_STATE, NgxTranslateState } from './ngx-translate-state'; +import { hasValue } from '../app/shared/empty.util'; +import { map } from 'rxjs/operators'; +import { of as observableOf, Observable } from 'rxjs'; +import * as JSON5 from 'json5'; + +/** + * A TranslateLoader for ngx-translate to retrieve i18n messages from the TransferState, or download + * them if they're not available there + */ +export class TranslateBrowserLoader implements TranslateLoader { + constructor( + protected transferState: TransferState, + protected http: HttpClient, + protected prefix?: string, + protected suffix?: string + ) { + } + + /** + * Return the i18n messages for a given language, first try to find them in the TransferState + * retrieve them using HttpClient if they're not available there + * + * @param lang the language code + */ + getTranslation(lang: string): Observable { + // Get the ngx-translate messages from the transfer state, to speed up the initial page load + // client side + const state = this.transferState.get(NGX_TRANSLATE_STATE, {}); + const messages = state[lang]; + if (hasValue(messages)) { + return observableOf(messages); + } else { + // If they're not available on the transfer state (e.g. when running in dev mode), retrieve + // them using HttpClient + return this.http.get('' + this.prefix + lang + this.suffix, { responseType: 'text' }).pipe( + map((json: any) => JSON5.parse(json)) + ); + } + } +} diff --git a/src/ngx-translate-loaders/translate-json5-http.loader.ts b/src/ngx-translate-loaders/translate-json5-http.loader.ts deleted file mode 100644 index b6759408ce..0000000000 --- a/src/ngx-translate-loaders/translate-json5-http.loader.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { HttpClient } from '@angular/common/http'; -import { TranslateLoader } from '@ngx-translate/core'; -import { map } from 'rxjs/operators'; -import * as JSON5 from 'json5'; - -export class TranslateJson5HttpLoader implements TranslateLoader { - constructor(private http: HttpClient, public prefix?: string, public suffix?: string) { - } - - getTranslation(lang: string): any { - return this.http.get('' + this.prefix + lang + this.suffix, {responseType: 'text'}).pipe( - map((json: any) => JSON5.parse(json)) - ); - } -} diff --git a/src/ngx-translate-loaders/translate-json5-universal.loader.ts b/src/ngx-translate-loaders/translate-json5-universal.loader.ts deleted file mode 100644 index c557fb9a3e..0000000000 --- a/src/ngx-translate-loaders/translate-json5-universal.loader.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { TranslateLoader } from '@ngx-translate/core'; -import { Observable } from 'rxjs'; -import * as JSON5 from 'json5' -import * as fs from 'fs'; - -export class TranslateJson5UniversalLoader implements TranslateLoader { - - constructor(private prefix: string = 'dist/assets/i18n/', private suffix: string = '.json') { } - - public getTranslation(lang: string): Observable { - return Observable.create((observer: any) => { - observer.next(JSON5.parse(fs.readFileSync(`${this.prefix}${lang}${this.suffix}`, 'utf8'))); - observer.complete(); - }); - } - -} diff --git a/src/ngx-translate-loaders/translate-server.loader.ts b/src/ngx-translate-loaders/translate-server.loader.ts new file mode 100644 index 0000000000..7d118cb893 --- /dev/null +++ b/src/ngx-translate-loaders/translate-server.loader.ts @@ -0,0 +1,52 @@ +import { TranslateLoader } from '@ngx-translate/core'; +import { Observable, of as observableOf } from 'rxjs'; +import * as fs from 'fs'; +import { TransferState } from '@angular/platform-browser'; +import { NGX_TRANSLATE_STATE, NgxTranslateState } from './ngx-translate-state'; + +import * as JSON5 from 'json5'; + +/** + * A TranslateLoader for ngx-translate to parse json5 files server-side, and store them in the + * TransferState + */ +export class TranslateServerLoader implements TranslateLoader { + + constructor( + protected transferState: TransferState, + protected prefix: string = 'dist/assets/i18n/', + protected suffix: string = '.json' + ) { + } + + /** + * Return the i18n messages for a given language, and store them in the TransferState + * + * @param lang the language code + */ + public getTranslation(lang: string): Observable { + // Retrieve the file for the given language, and parse it + const messages = JSON5.parse(fs.readFileSync(`${this.prefix}${lang}${this.suffix}`, 'utf8')); + // Store the parsed messages in the transfer state so they'll be available immediately when the + // app loads on the client + this.storeInTransferState(lang, messages); + // Return the parsed messages to translate things server side + return observableOf(messages); + } + + /** + * Store the i18n messages for the given language code in the transfer state, so they can be + * retrieved client side + * + * @param lang the language code + * @param messages the i18n messages + * @protected + */ + protected storeInTransferState(lang: string, messages) { + const prevState = this.transferState.get(NGX_TRANSLATE_STATE, {}); + const nextState = Object.assign({}, prevState, { + [lang]: messages + }); + this.transferState.set(NGX_TRANSLATE_STATE, nextState); + } +} diff --git a/src/themes/custom/theme.module.ts b/src/themes/custom/theme.module.ts index e2e97b9087..453f366b28 100644 --- a/src/themes/custom/theme.module.ts +++ b/src/themes/custom/theme.module.ts @@ -84,6 +84,7 @@ import { SearchModule } from '../../app/shared/search/search.module'; import { ResourcePoliciesModule } from '../../app/shared/resource-policies/resource-policies.module'; import { ComcolModule } from '../../app/shared/comcol/comcol.module'; import { FeedbackComponent } from './app/info/feedback/feedback.component'; +import { RootModule } from '../../app/root.module'; const DECLARATIONS = [ FileSectionComponent, @@ -136,6 +137,7 @@ const DECLARATIONS = [ AdminSearchModule, AdminWorkflowModuleModule, AppModule, + RootModule, BitstreamFormatsModule, BrowseByModule, CollectionFormModule, diff --git a/src/themes/dspace/eager-theme.module.ts b/src/themes/dspace/eager-theme.module.ts new file mode 100644 index 0000000000..3f043d32de --- /dev/null +++ b/src/themes/dspace/eager-theme.module.ts @@ -0,0 +1,53 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { SharedModule } from '../../app/shared/shared.module'; +import { HomeNewsComponent } from './app/home-page/home-news/home-news.component'; +import { NavbarComponent } from './app/navbar/navbar.component'; +import { HeaderComponent } from './app/header/header.component'; +import { + HeaderNavbarWrapperComponent +} from './app/header-nav-wrapper/header-navbar-wrapper.component'; +import { SearchModule } from '../../app/shared/search/search.module'; +import { RootModule } from '../../app/root.module'; +import { NavbarModule } from '../../app/navbar/navbar.module'; + +/** + * Add components that use a custom decorator to ENTRY_COM&PONENTS as well as DECLARATIONS. This will + * ensure that decorator gets picked up when the app loads + */ +const ENTRY_COMPONENTS = [ +]; + +const DECLARATIONS = [ + HomeNewsComponent, + HeaderComponent, + HeaderNavbarWrapperComponent, + NavbarComponent +]; + +@NgModule({ + imports: [ + CommonModule, + SharedModule, + SearchModule, + FormsModule, + RootModule, + NavbarModule, + ], + declarations: DECLARATIONS, + providers: [ + ...ENTRY_COMPONENTS.map((component) => ({ provide: component })) + ] +}) +/** + * This module is included in the main bundle that gets downloaded at first page load. So it should + * contain only the themed components that have to be available immediately for the first page load, + * and the minimal set of imports required to make them work. Anything you can cut from it will make + * the initial page load faster, but may cause the page to flicker as components that were already + * rendered server side need to be lazy-loaded again client side + * + * Themed EntryComponents should also be added here + */ +export class EagerThemeModule { +} diff --git a/src/themes/dspace/entry-components.ts b/src/themes/dspace/entry-components.ts deleted file mode 100644 index 2386ecb130..0000000000 --- a/src/themes/dspace/entry-components.ts +++ /dev/null @@ -1,2 +0,0 @@ -export const ENTRY_COMPONENTS = [ -]; diff --git a/src/themes/dspace/theme.module.ts b/src/themes/dspace/lazy-theme.module.ts similarity index 71% rename from src/themes/dspace/theme.module.ts rename to src/themes/dspace/lazy-theme.module.ts index 2a774eb9c8..c87a2b67a2 100644 --- a/src/themes/dspace/theme.module.ts +++ b/src/themes/dspace/lazy-theme.module.ts @@ -2,10 +2,16 @@ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { AdminRegistriesModule } from '../../app/admin/admin-registries/admin-registries.module'; import { AdminSearchModule } from '../../app/admin/admin-search-page/admin-search.module'; -import { AdminWorkflowModuleModule } from '../../app/admin/admin-workflow-page/admin-workflow.module'; -import { BitstreamFormatsModule } from '../../app/admin/admin-registries/bitstream-formats/bitstream-formats.module'; +import { + AdminWorkflowModuleModule +} from '../../app/admin/admin-workflow-page/admin-workflow.module'; +import { + BitstreamFormatsModule +} from '../../app/admin/admin-registries/bitstream-formats/bitstream-formats.module'; import { BrowseByModule } from '../../app/browse-by/browse-by.module'; -import { CollectionFormModule } from '../../app/collection-page/collection-form/collection-form.module'; +import { + CollectionFormModule +} from '../../app/collection-page/collection-form/collection-form.module'; import { CommunityFormModule } from '../../app/community-page/community-form/community-form.module'; import { CoreModule } from '../../app/core/core.module'; import { DragDropModule } from '@angular/cdk/drag-drop'; @@ -13,14 +19,18 @@ import { EditItemPageModule } from '../../app/item-page/edit-item-page/edit-item import { FormsModule } from '@angular/forms'; import { HttpClientModule } from '@angular/common/http'; import { IdlePreloadModule } from 'angular-idle-preload'; -import { JournalEntitiesModule } from '../../app/entity-groups/journal-entities/journal-entities.module'; +import { + JournalEntitiesModule +} from '../../app/entity-groups/journal-entities/journal-entities.module'; import { MyDspaceSearchModule } from '../../app/my-dspace-page/my-dspace-search.module'; import { MenuModule } from '../../app/shared/menu/menu.module'; import { NavbarModule } from '../../app/navbar/navbar.module'; import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; import { ProfilePageModule } from '../../app/profile-page/profile-page.module'; import { RegisterEmailFormModule } from '../../app/register-email-form/register-email-form.module'; -import { ResearchEntitiesModule } from '../../app/entity-groups/research-entities/research-entities.module'; +import { + ResearchEntitiesModule +} from '../../app/entity-groups/research-entities/research-entities.module'; import { ScrollToModule } from '@nicky-lenaers/ngx-scroll-to'; import { SearchPageModule } from '../../app/search-page/search-page.module'; import { SharedModule } from '../../app/shared/shared.module'; @@ -28,7 +38,6 @@ import { StatisticsModule } from '../../app/statistics/statistics.module'; import { StoreModule } from '@ngrx/store'; import { StoreRouterConnectingModule } from '@ngrx/router-store'; import { TranslateModule } from '@ngx-translate/core'; -import { HomeNewsComponent } from './app/home-page/home-news/home-news.component'; import { HomePageModule } from '../../app/home-page/home-page.module'; import { AppModule } from '../../app/app.module'; import { ItemPageModule } from '../../app/item-page/item-page.module'; @@ -40,18 +49,14 @@ import { CommunityPageModule } from '../../app/community-page/community-page.mod import { CollectionPageModule } from '../../app/collection-page/collection-page.module'; import { SubmissionModule } from '../../app/submission/submission.module'; import { MyDSpacePageModule } from '../../app/my-dspace-page/my-dspace-page.module'; -import { NavbarComponent } from './app/navbar/navbar.component'; -import { HeaderComponent } from './app/header/header.component'; -import { HeaderNavbarWrapperComponent } from './app/header-nav-wrapper/header-navbar-wrapper.component'; import { SearchModule } from '../../app/shared/search/search.module'; -import { ResourcePoliciesModule } from '../../app/shared/resource-policies/resource-policies.module'; +import { + ResourcePoliciesModule +} from '../../app/shared/resource-policies/resource-policies.module'; import { ComcolModule } from '../../app/shared/comcol/comcol.module'; +import { RootModule } from '../../app/root.module'; const DECLARATIONS = [ - HomeNewsComponent, - HeaderComponent, - HeaderNavbarWrapperComponent, - NavbarComponent ]; @NgModule({ @@ -60,6 +65,7 @@ const DECLARATIONS = [ AdminSearchModule, AdminWorkflowModuleModule, AppModule, + RootModule, BitstreamFormatsModule, BrowseByModule, CollectionFormModule, @@ -105,12 +111,12 @@ const DECLARATIONS = [ declarations: DECLARATIONS }) - /** - * This module serves as an index for all the components in this theme. - * It should import all other modules, so the compiler knows where to find any components referenced - * from a component in this theme - * It is purposefully not exported, it should never be imported anywhere else, its only purpose is - * to give lazily loaded components a context in which they can be compiled successfully - */ -class ThemeModule { +/** + * This module serves as an index for all the components in this theme. + * It should import all other modules, so the compiler knows where to find any components referenced + * from a component in this theme + * It is purposefully not exported, it should never be imported anywhere else, its only purpose is + * to give lazily loaded components a context in which they can be compiled successfully + */ +class LazyThemeModule { } diff --git a/src/themes/eager-themes.module.ts b/src/themes/eager-themes.module.ts new file mode 100644 index 0000000000..7af4a0edc6 --- /dev/null +++ b/src/themes/eager-themes.module.ts @@ -0,0 +1,15 @@ +import { NgModule } from '@angular/core'; +import { EagerThemeModule as DSpaceEagerThemeModule } from './dspace/eager-theme.module'; + +/** + * This module only serves to ensure themed entry components are discoverable. It's kept separate + * from the theme modules to ensure only the minimal number of theme components is loaded ahead of + * time + */ +@NgModule({ + imports: [ + DSpaceEagerThemeModule + ], +}) +export class EagerThemesModule { +} diff --git a/src/themes/themed-entry-component.module.ts b/src/themes/themed-entry-component.module.ts deleted file mode 100644 index 41cdf62269..0000000000 --- a/src/themes/themed-entry-component.module.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { NgModule } from '@angular/core'; -import { ENTRY_COMPONENTS as CUSTOM } from './custom/entry-components'; - -const ENTRY_COMPONENTS = [ - ...CUSTOM, -]; - - -/** - * This module only serves to ensure themed entry components are discoverable. It's kept separate - * from the theme modules to ensure only the minimal number of theme components is loaded ahead of - * time - */ -@NgModule() -export class ThemedEntryComponentModule { - static withEntryComponents() { - return { - ngModule: ThemedEntryComponentModule, - providers: ENTRY_COMPONENTS.map((component) => ({provide: component})) - }; - } - -} diff --git a/webpack/webpack.browser.ts b/webpack/webpack.browser.ts index a71d749347..400da57bf0 100644 --- a/webpack/webpack.browser.ts +++ b/webpack/webpack.browser.ts @@ -3,14 +3,39 @@ import { join } from 'path'; import { buildAppConfig } from '../src/config/config.server'; import { commonExports } from './webpack.common'; +const CompressionPlugin = require('compression-webpack-plugin'); +const zlib = require('zlib'); + module.exports = Object.assign({}, commonExports, { target: 'web', node: { module: 'empty' }, + plugins: [ + ...commonExports.plugins, + new CompressionPlugin({ + filename: '[path][base].gz', + algorithm: 'gzip', + test: /\.(js|css|html|svg)$/, + threshold: 10240, + minRatio: 0.8, + }), + new CompressionPlugin({ + filename: '[path][base].br', + algorithm: 'brotliCompress', + test: /\.(js|css|html|svg)$/, + compressionOptions: { + params: { + [zlib.constants.BROTLI_PARAM_QUALITY]: 11, + }, + }, + threshold: 10240, + minRatio: 0.8, + }), + ], devServer: { before(app, server) { buildAppConfig(join(process.cwd(), 'src/assets/config.json')); } - } + } }); diff --git a/yarn.lock b/yarn.lock index 0f8ef0a6e6..7f55750ba8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1,15193 +1,15187 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@angular-builders/custom-webpack@10.0.1": - version "10.0.1" - resolved "https://registry.yarnpkg.com/@angular-builders/custom-webpack/-/custom-webpack-10.0.1.tgz#9126c260ecfeb88c3ba6865e51b486bbe301e504" - integrity sha512-YDy5zEKVwXdoXLjmbsY6kGaEbmunQxaPipxrwLUc9hIjRLU2WcrX9vopf1R9Pgj4POad73IPBNGu+ibqNRFIEQ== - dependencies: - "@angular-devkit/architect" ">=0.1000.0 < 0.1100.0" - "@angular-devkit/build-angular" ">=0.1000.0 < 0.1100.0" - "@angular-devkit/core" "^10.0.0" - lodash "^4.17.15" - ts-node "^9.0.0" - webpack-merge "^4.2.2" - -"@angular-devkit/architect@0.1002.3", "@angular-devkit/architect@>=0.1000.0 < 0.1100.0": - version "0.1002.3" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1002.3.tgz#fe8f3209ee6686efa0306410de27820b6606df52" - integrity sha512-7ainXRNO1njZ6bBbJXGpMzCh0OYrzuIRe/+zRj0ncV1YfEsJb2yWBuiza0+y2Ljco7hdd4wr+7eJm7cfn+NvAw== - dependencies: - "@angular-devkit/core" "10.2.3" - rxjs "6.6.2" - -"@angular-devkit/architect@0.1102.15", "@angular-devkit/architect@^0.1102.3": - version "0.1102.15" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1102.15.tgz#c5af92136f7f1c7b6fcacc3294b8d60250ad25ec" - integrity sha512-d6MKQc54HEsWVsFPipoPD7H3kNpsdpksDJyx4D9YWA2NYLbby9HTgBtp1x53glb0ipKRzzYGIr5BurFIMmxYzA== - dependencies: - "@angular-devkit/core" "11.2.15" - rxjs "6.6.3" - -"@angular-devkit/architect@^0.1202.10": - version "0.1202.13" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1202.13.tgz#b9b883d62f628a6b31ce071da91e268f61da00ef" - integrity sha512-LXgiidXwBgyWPqqWK4xR1/kCPQTMTzG5w+s7+LvENUZwbcdl6CKrOMjfgjo6WPr6yeq+WWQvPCD4pZ6nXRTm7A== - dependencies: - "@angular-devkit/core" "12.2.13" - rxjs "6.6.7" - -"@angular-devkit/build-angular@>=0.1000.0 < 0.1100.0": - version "0.1002.3" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-0.1002.3.tgz#f23c872dd953d1a3ba623e132d2abeab0635649f" - integrity sha512-NjM8H2AUpLjcf+3mKYd99VbFgN4kwT++IBmR9BRQkqOZ4fD63g8jLPzC0KTsWGIVkZtR9Qc88YW/5sC8C3SVFQ== - dependencies: - "@angular-devkit/architect" "0.1002.3" - "@angular-devkit/build-optimizer" "0.1002.3" - "@angular-devkit/build-webpack" "0.1002.3" - "@angular-devkit/core" "10.2.3" - "@babel/core" "7.11.1" - "@babel/generator" "7.11.0" - "@babel/plugin-transform-runtime" "7.11.0" - "@babel/preset-env" "7.11.0" - "@babel/runtime" "7.11.2" - "@babel/template" "7.10.4" - "@jsdevtools/coverage-istanbul-loader" "3.0.5" - "@ngtools/webpack" "10.2.3" - autoprefixer "9.8.6" - babel-loader "8.1.0" - browserslist "^4.9.1" - cacache "15.0.5" - caniuse-lite "^1.0.30001032" - circular-dependency-plugin "5.2.0" - copy-webpack-plugin "6.0.3" - core-js "3.6.4" - css-loader "4.2.2" - cssnano "4.1.10" - file-loader "6.0.0" - find-cache-dir "3.3.1" - glob "7.1.6" - jest-worker "26.3.0" - karma-source-map-support "1.4.0" - less-loader "6.2.0" - license-webpack-plugin "2.3.0" - loader-utils "2.0.0" - mini-css-extract-plugin "0.10.0" - minimatch "3.0.4" - open "7.2.0" - parse5 "6.0.1" - parse5-htmlparser2-tree-adapter "6.0.1" - pnp-webpack-plugin "1.6.4" - postcss "7.0.32" - postcss-import "12.0.1" - postcss-loader "3.0.0" - raw-loader "4.0.1" - regenerator-runtime "0.13.7" - resolve-url-loader "3.1.2" - rimraf "3.0.2" - rollup "2.26.5" - rxjs "6.6.2" - sass "1.26.10" - sass-loader "10.0.1" - semver "7.3.2" - source-map "0.7.3" - source-map-loader "1.0.2" - source-map-support "0.5.19" - speed-measure-webpack-plugin "1.3.3" - style-loader "1.2.1" - stylus "0.54.8" - stylus-loader "3.0.2" - terser "5.3.0" - terser-webpack-plugin "4.1.0" - tree-kill "1.2.2" - webpack "4.44.1" - webpack-dev-middleware "3.7.2" - webpack-dev-server "3.11.0" - webpack-merge "4.2.2" - webpack-sources "1.4.3" - webpack-subresource-integrity "1.4.1" - worker-plugin "5.0.0" - -"@angular-devkit/build-angular@~0.1102.15": - version "0.1102.15" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-0.1102.15.tgz#171b831a1e27eab397e08b34bcd6625dac5da17c" - integrity sha512-qE5BF8tluirGIcPdSJechTCqmfRNKNwez8HgG6iR2hKbMcAVx8IYYdr1XKnQifZhGF8C1FSnJzOoR9IUfm3MmA== - dependencies: - "@angular-devkit/architect" "0.1102.15" - "@angular-devkit/build-optimizer" "0.1102.15" - "@angular-devkit/build-webpack" "0.1102.15" - "@angular-devkit/core" "11.2.15" - "@babel/core" "7.12.10" - "@babel/generator" "7.12.11" - "@babel/plugin-transform-async-to-generator" "7.12.1" - "@babel/plugin-transform-runtime" "7.12.10" - "@babel/preset-env" "7.12.11" - "@babel/runtime" "7.12.5" - "@babel/template" "7.12.7" - "@discoveryjs/json-ext" "0.5.2" - "@jsdevtools/coverage-istanbul-loader" "3.0.5" - "@ngtools/webpack" "11.2.15" - ansi-colors "4.1.1" - autoprefixer "10.2.4" - babel-loader "8.2.2" - browserslist "^4.9.1" - cacache "15.0.5" - caniuse-lite "^1.0.30001032" - circular-dependency-plugin "5.2.2" - copy-webpack-plugin "6.3.2" - core-js "3.8.3" - critters "0.0.12" - css-loader "5.0.1" - cssnano "5.0.2" - file-loader "6.2.0" - find-cache-dir "3.3.1" - glob "7.1.6" - https-proxy-agent "5.0.0" - inquirer "7.3.3" - jest-worker "26.6.2" - karma-source-map-support "1.4.0" - less "4.1.1" - less-loader "7.3.0" - license-webpack-plugin "2.3.11" - loader-utils "2.0.0" - mini-css-extract-plugin "1.3.5" - minimatch "3.0.4" - open "7.4.0" - ora "5.3.0" - parse5-html-rewriting-stream "6.0.1" - pnp-webpack-plugin "1.6.4" - postcss "8.2.15" - postcss-import "14.0.0" - postcss-loader "4.2.0" - raw-loader "4.0.2" - regenerator-runtime "0.13.7" - resolve-url-loader "4.0.0" - rimraf "3.0.2" - rollup "2.38.4" - rxjs "6.6.3" - sass "1.32.6" - sass-loader "10.1.1" - semver "7.3.4" - source-map "0.7.3" - source-map-loader "1.1.3" - source-map-support "0.5.19" - speed-measure-webpack-plugin "1.4.2" - style-loader "2.0.0" - stylus "0.54.8" - stylus-loader "4.3.3" - terser "5.5.1" - terser-webpack-plugin "4.2.3" - text-table "0.2.0" - tree-kill "1.2.2" - webpack "4.44.2" - webpack-dev-middleware "3.7.2" - webpack-dev-server "3.11.2" - webpack-merge "5.7.3" - webpack-sources "2.2.0" - webpack-subresource-integrity "1.5.2" - worker-plugin "5.0.0" - -"@angular-devkit/build-optimizer@0.1002.3": - version "0.1002.3" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-optimizer/-/build-optimizer-0.1002.3.tgz#797822cdde3e0e9892670ac515c6f4a7caa0854b" - integrity sha512-/0KbxVmmvt3S7ghk5zUH8/PWjW8ki0uSmPsnjopY8jRgAxuXN/7PXZbqswItNlUBoEj34hj2UADBUJVic7fcnQ== - dependencies: - loader-utils "2.0.0" - source-map "0.7.3" - tslib "2.0.1" - typescript "4.0.2" - webpack-sources "1.4.3" - -"@angular-devkit/build-optimizer@0.1102.15": - version "0.1102.15" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-optimizer/-/build-optimizer-0.1102.15.tgz#f99416ea3468b1747d0521ee6b7115e4880dbba0" - integrity sha512-MFW4H25BE1tW6kC7DhNbAjNUNd/w71vO1g8P8OG1mWUVSKkv2W+WhPjwLqZ3TlHbSXiV9OEiOFR29Gt5+5wE/Q== - dependencies: - loader-utils "2.0.0" - source-map "0.7.3" - tslib "2.1.0" - typescript "4.1.5" - webpack-sources "2.2.0" - -"@angular-devkit/build-webpack@0.1002.3": - version "0.1002.3" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1002.3.tgz#763ae9c4c4b0854679e7bf1b4d0f467dd2b31c61" - integrity sha512-ngvPPA3VuYGYV275PM6X0pVI0Nl/uWx4eu2S6SUFe6mniN4BQkUHAyeCUMIbM3hkau/NAcF9xUs5AvZ9GDpvPw== - dependencies: - "@angular-devkit/architect" "0.1002.3" - "@angular-devkit/core" "10.2.3" - rxjs "6.6.2" - -"@angular-devkit/build-webpack@0.1102.15": - version "0.1102.15" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1102.15.tgz#d911bf7146cb9a84d4b6e122be3efe66fb04aa8f" - integrity sha512-/eNooHvpSCU4o+dKb/hy776J8Yb9mgZHCTu4O4+9JNUtgN2Ic1po091TiZP1AEBZ5aH0FtTLy8B580ddj/lsYw== - dependencies: - "@angular-devkit/architect" "0.1102.15" - "@angular-devkit/core" "11.2.15" - rxjs "6.6.3" - -"@angular-devkit/core@10.2.3", "@angular-devkit/core@^10.0.0": - version "10.2.3" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-10.2.3.tgz#499978929e58532f6f0caab8bd860c882d926eea" - integrity sha512-pMM1v9Xjqx6YLOQxQYs0D+03H6XPDZLS8cyEtoQX2iYdh8qlKHZVbJa2WsfzwMoIPtgcXfQAXn113VEgrQPLFA== - dependencies: - ajv "6.12.4" - fast-json-stable-stringify "2.1.0" - magic-string "0.25.7" - rxjs "6.6.2" - source-map "0.7.3" - -"@angular-devkit/core@11.2.15", "@angular-devkit/core@^11.2.3": - version "11.2.15" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-11.2.15.tgz#3e6d0308e049e47a3b21e42a0f2e8d5c31842665" - integrity sha512-6pGblUHg2Hv730cHhUhauTUNbjuviAgn6n23rfYIlfEPV5uxyZib6AUTS1DTcK7ITA0D1PscSsLicMiGaqQ8OA== - dependencies: - ajv "6.12.6" - fast-json-stable-stringify "2.1.0" - magic-string "0.25.7" - rxjs "6.6.3" - source-map "0.7.3" - -"@angular-devkit/core@12.2.13", "@angular-devkit/core@^12.2.10": - version "12.2.13" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-12.2.13.tgz#db3929d1bfce71010b37fb7c4e6c33ef80a4f35f" - integrity sha512-9csMF0p+lTvlWnutxxTZ/+pDRMIbXk/TV4MGLbcqUPPfeG3dCRwErns73xLuMTwp9qO/KCLkFqNaM6cGOoqsDA== - dependencies: - ajv "8.6.2" - ajv-formats "2.1.0" - fast-json-stable-stringify "2.1.0" - magic-string "0.25.7" - rxjs "6.6.7" - source-map "0.7.3" - -"@angular-devkit/schematics@11.2.15": - version "11.2.15" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-11.2.15.tgz#a2fb129870c3c8e7b283981743999470bfd4a28e" - integrity sha512-cFxtpdpwr9N2gtfIG9VyIMacDNsSuRyiV4pToNl/pyHy0z4zif4j32HydXandylHlrYKG4rBMq0UTD/WzHaUcw== - dependencies: - "@angular-devkit/core" "11.2.15" - ora "5.3.0" - rxjs "6.6.3" - -"@angular-devkit/schematics@12.2.13", "@angular-devkit/schematics@^12.2.10": - version "12.2.13" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-12.2.13.tgz#6464d86fa3ccd0efb5ead46c793cef9ec45c7758" - integrity sha512-LQTv72R5Ma1uowMEeii2wIoDWI4bYQyZvunqPy9jRveBTjli2yVwwcOziGCVyttwlYs46bSdxThgeEvVIako2w== - dependencies: - "@angular-devkit/core" "12.2.13" - ora "5.4.1" - rxjs "6.6.7" - -"@angular/animations@~11.2.14": - version "11.2.14" - resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-11.2.14.tgz#cf119ea779bf11bd3759f1355c85e4e8e9e7bb03" - integrity sha512-Heq/nNrCmb3jbkusu+BQszOecfFI/31Oxxj+CDQkqqYpBcswk6bOJLoEE472o+vmgxaXbgeflU9qbIiCQhpMFA== - dependencies: - tslib "^2.0.0" - -"@angular/cdk@^11.2.13": - version "11.2.13" - resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-11.2.13.tgz#d54c9187e3b8cf3f8ba190b1edddc08ed2b740de" - integrity sha512-FkE4iCwoLbQxLDUOjV1I7M/6hmpyb7erAjEdWgch7nGRNxF1hqX5Bqf1lvLFKPNCbx5NRI5K7YVAdIUQUR8vug== - dependencies: - tslib "^2.0.0" - optionalDependencies: - parse5 "^5.0.0" - -"@angular/cli@~11.2.15": - version "11.2.15" - resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-11.2.15.tgz#1bff50345bac813a03f4ce373d91e57702919651" - integrity sha512-Hg6L0v5lyDzZBELpXTsphJq6kWdW+yH5oUHiZzMjyZmc7qHB94zXZV9oLpMz4JbBEI4stTF6V31pgClyj4pUyQ== - dependencies: - "@angular-devkit/architect" "0.1102.15" - "@angular-devkit/core" "11.2.15" - "@angular-devkit/schematics" "11.2.15" - "@schematics/angular" "11.2.15" - "@schematics/update" "0.1102.15" - "@yarnpkg/lockfile" "1.1.0" - ansi-colors "4.1.1" - debug "4.3.1" - ini "2.0.0" - inquirer "7.3.3" - jsonc-parser "3.0.0" - npm-package-arg "8.1.0" - npm-pick-manifest "6.1.0" - open "7.4.0" - ora "5.3.0" - pacote "11.2.4" - resolve "1.19.0" - rimraf "3.0.2" - semver "7.3.4" - symbol-observable "3.0.0" - universal-analytics "0.4.23" - uuid "8.3.2" - -"@angular/common@~11.2.14": - version "11.2.14" - resolved "https://registry.yarnpkg.com/@angular/common/-/common-11.2.14.tgz#52887277b0ae0438e584f9ae97b417ee51a694b5" - integrity sha512-ZSLV/3j7eCTyLf/8g4yBFLWySjiLz3vLJAGWscYoUpnJWMnug1VRu6zoF/COxCbtORgE+Wz6K0uhfS6MziBGVw== - dependencies: - tslib "^2.0.0" - -"@angular/compiler-cli@~11.2.14": - version "11.2.14" - resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-11.2.14.tgz#fdd22aeec25aa2477595bed631d19e977254ecc5" - integrity sha512-A7ltnCp03/EVqK/Q3tVUDsokgz5GHW3dSPGl0Csk7Ys5uBB9ibHTmVt4eiXA4jt0+6Bk+mKxwe5BEDqLvwYFAg== - dependencies: - "@babel/core" "^7.8.6" - "@babel/types" "^7.8.6" - 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 "^16.2.0" - -"@angular/compiler@9.0.0": - version "9.0.0" - resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-9.0.0.tgz#87e0bef4c369b6cadae07e3a4295778fc93799d5" - integrity sha512-ctjwuntPfZZT2mNj2NDIVu51t9cvbhl/16epc5xEwyzyDt76pX9UgwvY+MbXrf/C/FWwdtmNtfP698BKI+9leQ== - -"@angular/compiler@~11.2.14": - version "11.2.14" - resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-11.2.14.tgz#9d3ea26b4d2d858aab935f69af9e201f53453a0f" - integrity sha512-XBOK3HgA+/y6Cz7kOX4zcJYmgJ264XnfcbXUMU2cD7Ac+mbNhLPKohWrEiSWalfcjnpf5gRfufQrQP7lpAGu0A== - dependencies: - tslib "^2.0.0" - -"@angular/core@9.0.0": - version "9.0.0" - resolved "https://registry.yarnpkg.com/@angular/core/-/core-9.0.0.tgz#227dc53e1ac81824f998c6e76000b7efc522641e" - integrity sha512-6Pxgsrf0qF9iFFqmIcWmjJGkkCaCm6V5QNnxMy2KloO3SDq6QuMVRbN9RtC8Urmo25LP+eZ6ZgYqFYpdD8Hd9w== - -"@angular/core@~11.2.14": - version "11.2.14" - resolved "https://registry.yarnpkg.com/@angular/core/-/core-11.2.14.tgz#3ebe298c79d5413dc670d56b7f503bd4d788d4a8" - integrity sha512-vpR4XqBGitk1Faph37CSpemwIYTmJ3pdIVNoHKP6jLonpWu+0azkchf0f7oD8/2ivj2F81opcIw0tcsy/D/5Vg== - dependencies: - tslib "^2.0.0" - -"@angular/forms@~11.2.14": - version "11.2.14" - resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-11.2.14.tgz#dc858408f7647f4fd033996a03aa74df18a02079" - integrity sha512-4LWqY6KEIk1AZQFnk+4PJSOCamlD4tumuVN06gO4D0dZo9Cx+GcvW6pM6N0CPubRvPs3sScCnu20WT11HNWC1w== - dependencies: - tslib "^2.0.0" - -"@angular/language-service@~11.2.14": - version "11.2.14" - resolved "https://registry.yarnpkg.com/@angular/language-service/-/language-service-11.2.14.tgz#452369cdffe76ac6d07836596fb47f9e69a6d119" - integrity sha512-3+0F0X4r1WeNOV6VmaMzYnJENPVmLX2/MX3/lugwZPNYKVXl/oGyh/4PB8ktntIj0tnxQuErzqRSeucNStNGRw== - -"@angular/localize@11.2.14": - version "11.2.14" - resolved "https://registry.yarnpkg.com/@angular/localize/-/localize-11.2.14.tgz#8b37eb0b59835d5ad616775c914577d8e05e1c5c" - integrity sha512-ssMuquxxqxA98LgEICEO/3JdmSflWxu5rlm/HPo28bnGiZ4IzDamZjJ1cu4S6RgsonJ1drB3Z8wkidXfEYZiWA== - dependencies: - "@babel/core" "7.8.3" - glob "7.1.2" - yargs "^16.2.0" - -"@angular/platform-browser-dynamic@~11.2.14": - version "11.2.14" - resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-11.2.14.tgz#3c7fff1a1daacba5390acf033d28c377ec281166" - integrity sha512-TWTPdFs6iBBcp+/YMsgCRQwdHpWGq8KjeJDJ2tfatGgBD3Gqt2YaHOMST1zPW6RkrmupytTejuVqXzeaKWFxuw== - dependencies: - tslib "^2.0.0" - -"@angular/platform-browser@~11.2.14": - version "11.2.14" - resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-11.2.14.tgz#e52ad7a54a42a865033a17e57e213013919f1b1d" - integrity sha512-fb7b7ss/gRoP8wLAN17W62leMgjynuyjEPU2eUoAAazsG9f2cgM+z3rK29GYncDVyYQxZUZYnjSqvL6GSXx86A== - dependencies: - tslib "^2.0.0" - -"@angular/platform-server@~11.2.14": - version "11.2.14" - resolved "https://registry.yarnpkg.com/@angular/platform-server/-/platform-server-11.2.14.tgz#19b0e2e287178b57a761123bdb4b1aafd2493741" - integrity sha512-VSJ4FSyMPVCE3EGfD4hIK1fZu+KFYi04uL4Co8vchzBQFpXPFABpCS/lGd7rOyvLnKRmUvl4NGS72gQdS00IUw== - dependencies: - domino "^2.1.2" - tslib "^2.0.0" - xhr2 "^0.2.0" - -"@angular/router@~11.2.14": - version "11.2.14" - resolved "https://registry.yarnpkg.com/@angular/router/-/router-11.2.14.tgz#4a8eb6d010a1a45c8e7f0c3b5b705959bdb69294" - integrity sha512-3aYBmj+zrEL9yf/ntIQxHIYaWShZOBKP3U07X2mX+TPMpGlvHDnR7L6bWhQVZwewzMMz7YVR16ldg50IFuAlfA== - dependencies: - tslib "^2.0.0" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.8.3": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.0.tgz#0dfc80309beec8411e65e706461c408b0bb9b431" - integrity sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA== - dependencies: - "@babel/highlight" "^7.16.0" - -"@babel/compat-data@^7.11.0", "@babel/compat-data@^7.12.7", "@babel/compat-data@^7.16.0": - version "7.16.4" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.4.tgz#081d6bbc336ec5c2435c6346b2ae1fb98b5ac68e" - integrity sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q== - -"@babel/core@7.11.1": - version "7.11.1" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.1.tgz#2c55b604e73a40dc21b0e52650b11c65cf276643" - integrity sha512-XqF7F6FWQdKGGWAzGELL+aCO1p+lRY5Tj5/tbT3St1G8NaH70jhhDIKknIZaDans0OQBG5wRAldROLHSt44BgQ== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.11.0" - "@babel/helper-module-transforms" "^7.11.0" - "@babel/helpers" "^7.10.4" - "@babel/parser" "^7.11.1" - "@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" - -"@babel/core@7.12.10": - version "7.12.10" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.10.tgz#b79a2e1b9f70ed3d84bbfb6d8c4ef825f606bccd" - integrity sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.12.10" - "@babel/helper-module-transforms" "^7.12.1" - "@babel/helpers" "^7.12.5" - "@babel/parser" "^7.12.10" - "@babel/template" "^7.12.7" - "@babel/traverse" "^7.12.10" - "@babel/types" "^7.12.10" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.1" - json5 "^2.1.2" - lodash "^4.17.19" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/core@7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.8.3.tgz#30b0ebb4dd1585de6923a0b4d179e0b9f5d82941" - integrity sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA== - dependencies: - "@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/core@^7.7.5", "@babel/core@^7.8.6": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.0.tgz#c4ff44046f5fe310525cc9eb4ef5147f0c5374d4" - integrity sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ== - dependencies: - "@babel/code-frame" "^7.16.0" - "@babel/generator" "^7.16.0" - "@babel/helper-compilation-targets" "^7.16.0" - "@babel/helper-module-transforms" "^7.16.0" - "@babel/helpers" "^7.16.0" - "@babel/parser" "^7.16.0" - "@babel/template" "^7.16.0" - "@babel/traverse" "^7.16.0" - "@babel/types" "^7.16.0" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.1.2" - semver "^6.3.0" - source-map "^0.5.0" - -"@babel/generator@7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.0.tgz#4b90c78d8c12825024568cbe83ee6c9af193585c" - integrity sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ== - dependencies: - "@babel/types" "^7.11.0" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/generator@7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.11.tgz#98a7df7b8c358c9a37ab07a24056853016aba3af" - integrity sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA== - dependencies: - "@babel/types" "^7.12.11" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/generator@^7.11.0", "@babel/generator@^7.12.10", "@babel/generator@^7.16.0", "@babel/generator@^7.8.3": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.0.tgz#d40f3d1d5075e62d3500bccb67f3daa8a95265b2" - integrity sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew== - dependencies: - "@babel/types" "^7.16.0" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/helper-annotate-as-pure@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz#9a1f0ebcda53d9a2d00108c4ceace6a5d5f1f08d" - integrity sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.0.tgz#f1a686b92da794020c26582eb852e9accd0d7882" - integrity sha512-9KuleLT0e77wFUku6TUkqZzCEymBdtuQQ27MhEKzf9UOOJu3cYj98kyaDAzxpC7lV6DGiZFuC8XqDsq8/Kl6aQ== - dependencies: - "@babel/helper-explode-assignable-expression" "^7.16.0" - "@babel/types" "^7.16.0" - -"@babel/helper-compilation-targets@^7.10.4", "@babel/helper-compilation-targets@^7.12.5", "@babel/helper-compilation-targets@^7.16.0": - version "7.16.3" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz#5b480cd13f68363df6ec4dc8ac8e2da11363cbf0" - integrity sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA== - dependencies: - "@babel/compat-data" "^7.16.0" - "@babel/helper-validator-option" "^7.14.5" - browserslist "^4.17.5" - semver "^6.3.0" - -"@babel/helper-create-class-features-plugin@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.0.tgz#090d4d166b342a03a9fec37ef4fd5aeb9c7c6a4b" - integrity sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.0" - "@babel/helper-function-name" "^7.16.0" - "@babel/helper-member-expression-to-functions" "^7.16.0" - "@babel/helper-optimise-call-expression" "^7.16.0" - "@babel/helper-replace-supers" "^7.16.0" - "@babel/helper-split-export-declaration" "^7.16.0" - -"@babel/helper-create-regexp-features-plugin@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.0.tgz#06b2348ce37fccc4f5e18dcd8d75053f2a7c44ff" - integrity sha512-3DyG0zAFAZKcOp7aVr33ddwkxJ0Z0Jr5V99y3I690eYLpukJsJvAbzTy1ewoCqsML8SbIrjH14Jc/nSQ4TvNPA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.0" - regexpu-core "^4.7.1" - -"@babel/helper-explode-assignable-expression@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.0.tgz#753017337a15f46f9c09f674cff10cee9b9d7778" - integrity sha512-Hk2SLxC9ZbcOhLpg/yMznzJ11W++lg5GMbxt1ev6TXUiJB0N42KPC+7w8a+eWGuqDnUYuwStJoZHM7RgmIOaGQ== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-function-name@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz#b7dd0797d00bbfee4f07e9c4ea5b0e30c8bb1481" - integrity sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog== - dependencies: - "@babel/helper-get-function-arity" "^7.16.0" - "@babel/template" "^7.16.0" - "@babel/types" "^7.16.0" - -"@babel/helper-get-function-arity@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz#0088c7486b29a9cb5d948b1a1de46db66e089cfa" - integrity sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-hoist-variables@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz#4c9023c2f1def7e28ff46fc1dbcd36a39beaa81a" - integrity sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-member-expression-to-functions@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz#29287040efd197c77636ef75188e81da8bccd5a4" - integrity sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.12.1", "@babel/helper-module-imports@^7.12.5", "@babel/helper-module-imports@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz#90538e60b672ecf1b448f5f4f5433d37e79a3ec3" - integrity sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-module-transforms@^7.11.0", "@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz#1c82a8dd4cb34577502ebd2909699b194c3e9bb5" - integrity sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA== - dependencies: - "@babel/helper-module-imports" "^7.16.0" - "@babel/helper-replace-supers" "^7.16.0" - "@babel/helper-simple-access" "^7.16.0" - "@babel/helper-split-export-declaration" "^7.16.0" - "@babel/helper-validator-identifier" "^7.15.7" - "@babel/template" "^7.16.0" - "@babel/traverse" "^7.16.0" - "@babel/types" "^7.16.0" - -"@babel/helper-optimise-call-expression@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz#cecdb145d70c54096b1564f8e9f10cd7d193b338" - integrity sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" - integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== - -"@babel/helper-remap-async-to-generator@^7.12.1", "@babel/helper-remap-async-to-generator@^7.16.0", "@babel/helper-remap-async-to-generator@^7.16.4": - version "7.16.4" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.4.tgz#5d7902f61349ff6b963e07f06a389ce139fbfe6e" - integrity sha512-vGERmmhR+s7eH5Y/cp8PCVzj4XEjerq8jooMfxFdA5xVtAk9Sh4AQsrWgiErUEBjtGrBtOFKDUcWQFW4/dFwMA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.0" - "@babel/helper-wrap-function" "^7.16.0" - "@babel/types" "^7.16.0" - -"@babel/helper-replace-supers@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz#73055e8d3cf9bcba8ddb55cad93fedc860f68f17" - integrity sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.16.0" - "@babel/helper-optimise-call-expression" "^7.16.0" - "@babel/traverse" "^7.16.0" - "@babel/types" "^7.16.0" - -"@babel/helper-simple-access@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz#21d6a27620e383e37534cf6c10bba019a6f90517" - integrity sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" - integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-split-export-declaration@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz#29672f43663e936df370aaeb22beddb3baec7438" - integrity sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw== - dependencies: - "@babel/types" "^7.16.0" - -"@babel/helper-validator-identifier@^7.15.7": - version "7.15.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" - integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== - -"@babel/helper-validator-option@^7.12.11", "@babel/helper-validator-option@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" - integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== - -"@babel/helper-wrap-function@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.0.tgz#b3cf318afce774dfe75b86767cd6d68f3482e57c" - integrity sha512-VVMGzYY3vkWgCJML+qVLvGIam902mJW0FvT7Avj1zEe0Gn7D93aWdLblYARTxEw+6DhZmtzhBM2zv0ekE5zg1g== - dependencies: - "@babel/helper-function-name" "^7.16.0" - "@babel/template" "^7.16.0" - "@babel/traverse" "^7.16.0" - "@babel/types" "^7.16.0" - -"@babel/helpers@^7.10.4", "@babel/helpers@^7.12.5", "@babel/helpers@^7.16.0", "@babel/helpers@^7.8.3": - version "7.16.3" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.3.tgz#27fc64f40b996e7074dc73128c3e5c3e7f55c43c" - integrity sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w== - dependencies: - "@babel/template" "^7.16.0" - "@babel/traverse" "^7.16.3" - "@babel/types" "^7.16.0" - -"@babel/highlight@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.0.tgz#6ceb32b2ca4b8f5f361fb7fd821e3fddf4a1725a" - integrity sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g== - dependencies: - "@babel/helper-validator-identifier" "^7.15.7" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.10.3", "@babel/parser@^7.10.4", "@babel/parser@^7.11.1", "@babel/parser@^7.12.10", "@babel/parser@^7.12.7", "@babel/parser@^7.16.0", "@babel/parser@^7.16.3", "@babel/parser@^7.8.3": - version "7.16.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.4.tgz#d5f92f57cf2c74ffe9b37981c0e72fee7311372e" - integrity sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng== - -"@babel/plugin-proposal-async-generator-functions@^7.10.4", "@babel/plugin-proposal-async-generator-functions@^7.12.1": - version "7.16.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.4.tgz#e606eb6015fec6fa5978c940f315eae4e300b081" - integrity sha512-/CUekqaAaZCQHleSK/9HajvcD/zdnJiKRiuUFq8ITE+0HsPzquf53cpFiqAwl/UfmJbR6n5uGPQSPdrmKOvHHg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-remap-async-to-generator" "^7.16.4" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@babel/plugin-proposal-class-properties@^7.10.4", "@babel/plugin-proposal-class-properties@^7.12.1": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.0.tgz#c029618267ddebc7280fa286e0f8ca2a278a2d1a" - integrity sha512-mCF3HcuZSY9Fcx56Lbn+CGdT44ioBMMvjNVldpKtj8tpniETdLjnxdHI1+sDWXIM1nNt+EanJOZ3IG9lzVjs7A== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-proposal-dynamic-import@^7.10.4", "@babel/plugin-proposal-dynamic-import@^7.12.1": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.0.tgz#783eca61d50526202f9b296095453977e88659f1" - integrity sha512-QGSA6ExWk95jFQgwz5GQ2Dr95cf7eI7TKutIXXTb7B1gCLTCz5hTjFTQGfLFBBiC5WSNi7udNwWsqbbMh1c4yQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - -"@babel/plugin-proposal-export-namespace-from@^7.10.4", "@babel/plugin-proposal-export-namespace-from@^7.12.1": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.0.tgz#9c01dee40b9d6b847b656aaf4a3976a71740f222" - integrity sha512-CjI4nxM/D+5wCnhD11MHB1AwRSAYeDT+h8gCdcVJZ/OK7+wRzFsf7PFPWVpVpNRkHMmMkQWAHpTq+15IXQ1diA== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-proposal-json-strings@^7.10.4", "@babel/plugin-proposal-json-strings@^7.12.1": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.0.tgz#cae35a95ed1d2a7fa29c4dc41540b84a72e9ab25" - integrity sha512-kouIPuiv8mSi5JkEhzApg5Gn6hFyKPnlkO0a9YSzqRurH8wYzSlf6RJdzluAsbqecdW5pBvDJDfyDIUR/vLxvg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-json-strings" "^7.8.3" - -"@babel/plugin-proposal-logical-assignment-operators@^7.11.0", "@babel/plugin-proposal-logical-assignment-operators@^7.12.1": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.0.tgz#a711b8ceb3ffddd3ef88d3a49e86dbd3cc7db3fd" - integrity sha512-pbW0fE30sVTYXXm9lpVQQ/Vc+iTeQKiXlaNRZPPN2A2VdlWyAtsUrsQ3xydSlDW00TFMK7a8m3cDTkBF5WnV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - -"@babel/plugin-proposal-nullish-coalescing-operator@^7.10.4", "@babel/plugin-proposal-nullish-coalescing-operator@^7.12.1": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.0.tgz#44e1cce08fe2427482cf446a91bb451528ed0596" - integrity sha512-3bnHA8CAFm7cG93v8loghDYyQ8r97Qydf63BeYiGgYbjKKB/XP53W15wfRC7dvKfoiJ34f6Rbyyx2btExc8XsQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-proposal-numeric-separator@^7.10.4", "@babel/plugin-proposal-numeric-separator@^7.12.7": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.0.tgz#5d418e4fbbf8b9b7d03125d3a52730433a373734" - integrity sha512-FAhE2I6mjispy+vwwd6xWPyEx3NYFS13pikDBWUAFGZvq6POGs5eNchw8+1CYoEgBl9n11I3NkzD7ghn25PQ9Q== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-proposal-object-rest-spread@^7.11.0", "@babel/plugin-proposal-object-rest-spread@^7.12.1": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.0.tgz#5fb32f6d924d6e6712810362a60e12a2609872e6" - integrity sha512-LU/+jp89efe5HuWJLmMmFG0+xbz+I2rSI7iLc1AlaeSMDMOGzWlc5yJrMN1d04osXN4sSfpo4O+azkBNBes0jg== - dependencies: - "@babel/compat-data" "^7.16.0" - "@babel/helper-compilation-targets" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.16.0" - -"@babel/plugin-proposal-optional-catch-binding@^7.10.4", "@babel/plugin-proposal-optional-catch-binding@^7.12.1": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.0.tgz#5910085811ab4c28b00d6ebffa4ab0274d1e5f16" - integrity sha512-kicDo0A/5J0nrsCPbn89mTG3Bm4XgYi0CZtvex9Oyw7gGZE3HXGD0zpQNH+mo+tEfbo8wbmMvJftOwpmPy7aVw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - -"@babel/plugin-proposal-optional-chaining@^7.11.0", "@babel/plugin-proposal-optional-chaining@^7.12.7": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.0.tgz#56dbc3970825683608e9efb55ea82c2a2d6c8dc0" - integrity sha512-Y4rFpkZODfHrVo70Uaj6cC1JJOt3Pp0MdWSwIKtb8z1/lsjl9AmnB7ErRFV+QNGIfcY1Eruc2UMx5KaRnXjMyg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - -"@babel/plugin-proposal-private-methods@^7.10.4", "@babel/plugin-proposal-private-methods@^7.12.1": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.0.tgz#b4dafb9c717e4301c5776b30d080d6383c89aff6" - integrity sha512-IvHmcTHDFztQGnn6aWq4t12QaBXTKr1whF/dgp9kz84X6GUcwq9utj7z2wFCUfeOup/QKnOlt2k0zxkGFx9ubg== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-proposal-unicode-property-regex@^7.10.4", "@babel/plugin-proposal-unicode-property-regex@^7.12.1", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.0.tgz#890482dfc5ea378e42e19a71e709728cabf18612" - integrity sha512-ti7IdM54NXv29cA4+bNNKEMS4jLMCbJgl+Drv+FgYy0erJLAxNAIXcNjNjrRZEcWq0xJHsNVwQezskMFpF8N9g== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-async-generators@^7.8.0", "@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.10.4", "@babel/plugin-syntax-class-properties@^7.12.1": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-dynamic-import@^7.8.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" - integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-export-namespace-from@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" - integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-syntax-json-strings@^7.8.0", "@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.0", "@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.0", "@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-top-level-await@^7.10.4", "@babel/plugin-syntax-top-level-await@^7.12.1": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-arrow-functions@^7.10.4", "@babel/plugin-transform-arrow-functions@^7.12.1": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.0.tgz#951706f8b449c834ed07bd474c0924c944b95a8e" - integrity sha512-vIFb5250Rbh7roWARvCLvIJ/PtAU5Lhv7BtZ1u24COwpI9Ypjsh+bZcKk6rlIyalK+r0jOc1XQ8I4ovNxNrWrA== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-async-to-generator@7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz#3849a49cc2a22e9743cbd6b52926d30337229af1" - integrity sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A== - dependencies: - "@babel/helper-module-imports" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-remap-async-to-generator" "^7.12.1" - -"@babel/plugin-transform-async-to-generator@^7.10.4", "@babel/plugin-transform-async-to-generator@^7.12.1": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.0.tgz#df12637f9630ddfa0ef9d7a11bc414d629d38604" - integrity sha512-PbIr7G9kR8tdH6g8Wouir5uVjklETk91GMVSUq+VaOgiinbCkBP6Q7NN/suM/QutZkMJMvcyAriogcYAdhg8Gw== - dependencies: - "@babel/helper-module-imports" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-remap-async-to-generator" "^7.16.0" - -"@babel/plugin-transform-block-scoped-functions@^7.10.4", "@babel/plugin-transform-block-scoped-functions@^7.12.1": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.0.tgz#c618763233ad02847805abcac4c345ce9de7145d" - integrity sha512-V14As3haUOP4ZWrLJ3VVx5rCnrYhMSHN/jX7z6FAt5hjRkLsb0snPCmJwSOML5oxkKO4FNoNv7V5hw/y2bjuvg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-block-scoping@^7.10.4", "@babel/plugin-transform-block-scoping@^7.12.11": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.0.tgz#bcf433fb482fe8c3d3b4e8a66b1c4a8e77d37c16" - integrity sha512-27n3l67/R3UrXfizlvHGuTwsRIFyce3D/6a37GRxn28iyTPvNXaW4XvznexRh1zUNLPjbLL22Id0XQElV94ruw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-classes@^7.10.4", "@babel/plugin-transform-classes@^7.12.1": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.0.tgz#54cf5ff0b2242c6573d753cd4bfc7077a8b282f5" - integrity sha512-HUxMvy6GtAdd+GKBNYDWCIA776byUQH8zjnfjxwT1P1ARv/wFu8eBDpmXQcLS/IwRtrxIReGiplOwMeyO7nsDQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.0" - "@babel/helper-function-name" "^7.16.0" - "@babel/helper-optimise-call-expression" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-replace-supers" "^7.16.0" - "@babel/helper-split-export-declaration" "^7.16.0" - globals "^11.1.0" - -"@babel/plugin-transform-computed-properties@^7.10.4", "@babel/plugin-transform-computed-properties@^7.12.1": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.0.tgz#e0c385507d21e1b0b076d66bed6d5231b85110b7" - integrity sha512-63l1dRXday6S8V3WFY5mXJwcRAnPYxvFfTlt67bwV1rTyVTM5zrp0DBBb13Kl7+ehkCVwIZPumPpFP/4u70+Tw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-destructuring@^7.10.4", "@babel/plugin-transform-destructuring@^7.12.1": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.0.tgz#ad3d7e74584ad5ea4eadb1e6642146c590dee33c" - integrity sha512-Q7tBUwjxLTsHEoqktemHBMtb3NYwyJPTJdM+wDwb0g8PZ3kQUIzNvwD5lPaqW/p54TXBc/MXZu9Jr7tbUEUM8Q== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-dotall-regex@^7.10.4", "@babel/plugin-transform-dotall-regex@^7.12.1", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.0.tgz#50bab00c1084b6162d0a58a818031cf57798e06f" - integrity sha512-FXlDZfQeLILfJlC6I1qyEwcHK5UpRCFkaoVyA1nk9A1L1Yu583YO4un2KsLBsu3IJb4CUbctZks8tD9xPQubLw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-duplicate-keys@^7.10.4", "@babel/plugin-transform-duplicate-keys@^7.12.1": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.0.tgz#8bc2e21813e3e89e5e5bf3b60aa5fc458575a176" - integrity sha512-LIe2kcHKAZOJDNxujvmp6z3mfN6V9lJxubU4fJIGoQCkKe3Ec2OcbdlYP+vW++4MpxwG0d1wSDOJtQW5kLnkZQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-exponentiation-operator@^7.10.4", "@babel/plugin-transform-exponentiation-operator@^7.12.1": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.0.tgz#a180cd2881e3533cef9d3901e48dad0fbeff4be4" - integrity sha512-OwYEvzFI38hXklsrbNivzpO3fh87skzx8Pnqi4LoSYeav0xHlueSoCJrSgTPfnbyzopo5b3YVAJkFIcUpK2wsw== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-for-of@^7.10.4", "@babel/plugin-transform-for-of@^7.12.1": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.0.tgz#f7abaced155260e2461359bbc7c7248aca5e6bd2" - integrity sha512-5QKUw2kO+GVmKr2wMYSATCTTnHyscl6sxFRAY+rvN7h7WB0lcG0o4NoV6ZQU32OZGVsYUsfLGgPQpDFdkfjlJQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-function-name@^7.10.4", "@babel/plugin-transform-function-name@^7.12.1": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.0.tgz#02e3699c284c6262236599f751065c5d5f1f400e" - integrity sha512-lBzMle9jcOXtSOXUpc7tvvTpENu/NuekNJVova5lCCWCV9/U1ho2HH2y0p6mBg8fPm/syEAbfaaemYGOHCY3mg== - dependencies: - "@babel/helper-function-name" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-literals@^7.10.4", "@babel/plugin-transform-literals@^7.12.1": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.0.tgz#79711e670ffceb31bd298229d50f3621f7980cac" - integrity sha512-gQDlsSF1iv9RU04clgXqRjrPyyoJMTclFt3K1cjLmTKikc0s/6vE3hlDeEVC71wLTRu72Fq7650kABrdTc2wMQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-member-expression-literals@^7.10.4", "@babel/plugin-transform-member-expression-literals@^7.12.1": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.0.tgz#5251b4cce01eaf8314403d21aedb269d79f5e64b" - integrity sha512-WRpw5HL4Jhnxw8QARzRvwojp9MIE7Tdk3ez6vRyUk1MwgjJN0aNpRoXainLR5SgxmoXx/vsXGZ6OthP6t/RbUg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-modules-amd@^7.10.4", "@babel/plugin-transform-modules-amd@^7.12.1": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.0.tgz#09abd41e18dcf4fd479c598c1cef7bd39eb1337e" - integrity sha512-rWFhWbCJ9Wdmzln1NmSCqn7P0RAD+ogXG/bd9Kg5c7PKWkJtkiXmYsMBeXjDlzHpVTJ4I/hnjs45zX4dEv81xw== - dependencies: - "@babel/helper-module-transforms" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-commonjs@^7.10.4", "@babel/plugin-transform-modules-commonjs@^7.12.1": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.0.tgz#add58e638c8ddc4875bd9a9ecb5c594613f6c922" - integrity sha512-Dzi+NWqyEotgzk/sb7kgQPJQf7AJkQBWsVp1N6JWc1lBVo0vkElUnGdr1PzUBmfsCCN5OOFya3RtpeHk15oLKQ== - dependencies: - "@babel/helper-module-transforms" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-simple-access" "^7.16.0" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-systemjs@^7.10.4", "@babel/plugin-transform-modules-systemjs@^7.12.1": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.0.tgz#a92cf240afeb605f4ca16670453024425e421ea4" - integrity sha512-yuGBaHS3lF1m/5R+6fjIke64ii5luRUg97N2wr+z1sF0V+sNSXPxXDdEEL/iYLszsN5VKxVB1IPfEqhzVpiqvg== - dependencies: - "@babel/helper-hoist-variables" "^7.16.0" - "@babel/helper-module-transforms" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-validator-identifier" "^7.15.7" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-umd@^7.10.4", "@babel/plugin-transform-modules-umd@^7.12.1": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.0.tgz#195f26c2ad6d6a391b70880effce18ce625e06a7" - integrity sha512-nx4f6no57himWiHhxDM5pjwhae5vLpTK2zCnDH8+wNLJy0TVER/LJRHl2bkt6w9Aad2sPD5iNNoUpY3X9sTGDg== - dependencies: - "@babel/helper-module-transforms" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.10.4", "@babel/plugin-transform-named-capturing-groups-regex@^7.12.1": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.0.tgz#d3db61cc5d5b97986559967cd5ea83e5c32096ca" - integrity sha512-LogN88uO+7EhxWc8WZuQ8vxdSyVGxhkh8WTC3tzlT8LccMuQdA81e9SGV6zY7kY2LjDhhDOFdQVxdGwPyBCnvg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.0" - -"@babel/plugin-transform-new-target@^7.10.4", "@babel/plugin-transform-new-target@^7.12.1": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.0.tgz#af823ab576f752215a49937779a41ca65825ab35" - integrity sha512-fhjrDEYv2DBsGN/P6rlqakwRwIp7rBGLPbrKxwh7oVt5NNkIhZVOY2GRV+ULLsQri1bDqwDWnU3vhlmx5B2aCw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-object-super@^7.10.4", "@babel/plugin-transform-object-super@^7.12.1": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.0.tgz#fb20d5806dc6491a06296ac14ea8e8d6fedda72b" - integrity sha512-fds+puedQHn4cPLshoHcR1DTMN0q1V9ou0mUjm8whx9pGcNvDrVVrgw+KJzzCaiTdaYhldtrUps8DWVMgrSEyg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-replace-supers" "^7.16.0" - -"@babel/plugin-transform-parameters@^7.10.4", "@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.16.0": - version "7.16.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.3.tgz#fa9e4c874ee5223f891ee6fa8d737f4766d31d15" - integrity sha512-3MaDpJrOXT1MZ/WCmkOFo7EtmVVC8H4EUZVrHvFOsmwkk4lOjQj8rzv8JKUZV4YoQKeoIgk07GO+acPU9IMu/w== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-property-literals@^7.10.4", "@babel/plugin-transform-property-literals@^7.12.1": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.0.tgz#a95c552189a96a00059f6776dc4e00e3690c78d1" - integrity sha512-XLldD4V8+pOqX2hwfWhgwXzGdnDOThxaNTgqagOcpBgIxbUvpgU2FMvo5E1RyHbk756WYgdbS0T8y0Cj9FKkWQ== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-regenerator@^7.10.4", "@babel/plugin-transform-regenerator@^7.12.1": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.0.tgz#eaee422c84b0232d03aea7db99c97deeaf6125a4" - integrity sha512-JAvGxgKuwS2PihiSFaDrp94XOzzTUeDeOQlcKzVAyaPap7BnZXK/lvMDiubkPTdotPKOIZq9xWXWnggUMYiExg== - dependencies: - regenerator-transform "^0.14.2" - -"@babel/plugin-transform-reserved-words@^7.10.4", "@babel/plugin-transform-reserved-words@^7.12.1": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.0.tgz#fff4b9dcb19e12619394bda172d14f2d04c0379c" - integrity sha512-Dgs8NNCehHSvXdhEhln8u/TtJxfVwGYCgP2OOr5Z3Ar+B+zXicEOKNTyc+eca2cuEOMtjW6m9P9ijOt8QdqWkg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-runtime@7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.11.0.tgz#e27f78eb36f19448636e05c33c90fd9ad9b8bccf" - integrity sha512-LFEsP+t3wkYBlis8w6/kmnd6Kb1dxTd+wGJ8MlxTGzQo//ehtqlVL4S9DNUa53+dtPSQobN2CXx4d81FqC58cw== - dependencies: - "@babel/helper-module-imports" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - resolve "^1.8.1" - semver "^5.5.1" - -"@babel/plugin-transform-runtime@7.12.10": - version "7.12.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.10.tgz#af0fded4e846c4b37078e8e5d06deac6cd848562" - integrity sha512-xOrUfzPxw7+WDm9igMgQCbO3cJKymX7dFdsgRr1eu9n3KjjyU4pptIXbXPseQDquw+W+RuJEJMHKHNsPNNm3CA== - dependencies: - "@babel/helper-module-imports" "^7.12.5" - "@babel/helper-plugin-utils" "^7.10.4" - semver "^5.5.1" - -"@babel/plugin-transform-shorthand-properties@^7.10.4", "@babel/plugin-transform-shorthand-properties@^7.12.1": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.0.tgz#090372e3141f7cc324ed70b3daf5379df2fa384d" - integrity sha512-iVb1mTcD8fuhSv3k99+5tlXu5N0v8/DPm2mO3WACLG6al1CGZH7v09HJyUb1TtYl/Z+KrM6pHSIJdZxP5A+xow== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-spread@^7.11.0", "@babel/plugin-transform-spread@^7.12.1": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.0.tgz#d21ca099bbd53ab307a8621e019a7bd0f40cdcfb" - integrity sha512-Ao4MSYRaLAQczZVp9/7E7QHsCuK92yHRrmVNRe/SlEJjhzivq0BSn8mEraimL8wizHZ3fuaHxKH0iwzI13GyGg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" - -"@babel/plugin-transform-sticky-regex@^7.10.4", "@babel/plugin-transform-sticky-regex@^7.12.7": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.0.tgz#c35ea31a02d86be485f6aa510184b677a91738fd" - integrity sha512-/ntT2NljR9foobKk4E/YyOSwcGUXtYWv5tinMK/3RkypyNBNdhHUaq6Orw5DWq9ZcNlS03BIlEALFeQgeVAo4Q== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-template-literals@^7.10.4", "@babel/plugin-transform-template-literals@^7.12.1": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.0.tgz#a8eced3a8e7b8e2d40ec4ec4548a45912630d302" - integrity sha512-Rd4Ic89hA/f7xUSJQk5PnC+4so50vBoBfxjdQAdvngwidM8jYIBVxBZ/sARxD4e0yMXRbJVDrYf7dyRtIIKT6Q== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-typeof-symbol@^7.10.4", "@babel/plugin-transform-typeof-symbol@^7.12.10": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.0.tgz#8b19a244c6f8c9d668dca6a6f754ad6ead1128f2" - integrity sha512-++V2L8Bdf4vcaHi2raILnptTBjGEFxn5315YU+e8+EqXIucA+q349qWngCLpUYqqv233suJ6NOienIVUpS9cqg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-unicode-escapes@^7.10.4", "@babel/plugin-transform-unicode-escapes@^7.12.1": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.0.tgz#1a354064b4c45663a32334f46fa0cf6100b5b1f3" - integrity sha512-VFi4dhgJM7Bpk8lRc5CMaRGlKZ29W9C3geZjt9beuzSUrlJxsNwX7ReLwaL6WEvsOf2EQkyIJEPtF8EXjB/g2A== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-unicode-regex@^7.10.4", "@babel/plugin-transform-unicode-regex@^7.12.1": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.0.tgz#293b80950177c8c85aede87cef280259fb995402" - integrity sha512-jHLK4LxhHjvCeZDWyA9c+P9XH1sOxRd1RO9xMtDVRAOND/PczPqizEtVdx4TQF/wyPaewqpT+tgQFYMnN/P94A== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.16.0" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/preset-env@7.11.0": - version "7.11.0" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.11.0.tgz#860ee38f2ce17ad60480c2021ba9689393efb796" - integrity sha512-2u1/k7rG/gTh02dylX2kL3S0IJNF+J6bfDSp4DI2Ma8QN6Y9x9pmAax59fsCk6QUQG0yqH47yJWA+u1I1LccAg== - dependencies: - "@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-env@7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.12.11.tgz#55d5f7981487365c93dbbc84507b1c7215e857f9" - integrity sha512-j8Tb+KKIXKYlDBQyIOy4BLxzv1NUOwlHfZ74rvW+Z0Gp4/cI2IMDPBWAgWceGcE7aep9oL/0K9mlzlMGxA8yNw== - dependencies: - "@babel/compat-data" "^7.12.7" - "@babel/helper-compilation-targets" "^7.12.5" - "@babel/helper-module-imports" "^7.12.5" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-validator-option" "^7.12.11" - "@babel/plugin-proposal-async-generator-functions" "^7.12.1" - "@babel/plugin-proposal-class-properties" "^7.12.1" - "@babel/plugin-proposal-dynamic-import" "^7.12.1" - "@babel/plugin-proposal-export-namespace-from" "^7.12.1" - "@babel/plugin-proposal-json-strings" "^7.12.1" - "@babel/plugin-proposal-logical-assignment-operators" "^7.12.1" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.12.1" - "@babel/plugin-proposal-numeric-separator" "^7.12.7" - "@babel/plugin-proposal-object-rest-spread" "^7.12.1" - "@babel/plugin-proposal-optional-catch-binding" "^7.12.1" - "@babel/plugin-proposal-optional-chaining" "^7.12.7" - "@babel/plugin-proposal-private-methods" "^7.12.1" - "@babel/plugin-proposal-unicode-property-regex" "^7.12.1" - "@babel/plugin-syntax-async-generators" "^7.8.0" - "@babel/plugin-syntax-class-properties" "^7.12.1" - "@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.12.1" - "@babel/plugin-transform-arrow-functions" "^7.12.1" - "@babel/plugin-transform-async-to-generator" "^7.12.1" - "@babel/plugin-transform-block-scoped-functions" "^7.12.1" - "@babel/plugin-transform-block-scoping" "^7.12.11" - "@babel/plugin-transform-classes" "^7.12.1" - "@babel/plugin-transform-computed-properties" "^7.12.1" - "@babel/plugin-transform-destructuring" "^7.12.1" - "@babel/plugin-transform-dotall-regex" "^7.12.1" - "@babel/plugin-transform-duplicate-keys" "^7.12.1" - "@babel/plugin-transform-exponentiation-operator" "^7.12.1" - "@babel/plugin-transform-for-of" "^7.12.1" - "@babel/plugin-transform-function-name" "^7.12.1" - "@babel/plugin-transform-literals" "^7.12.1" - "@babel/plugin-transform-member-expression-literals" "^7.12.1" - "@babel/plugin-transform-modules-amd" "^7.12.1" - "@babel/plugin-transform-modules-commonjs" "^7.12.1" - "@babel/plugin-transform-modules-systemjs" "^7.12.1" - "@babel/plugin-transform-modules-umd" "^7.12.1" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.1" - "@babel/plugin-transform-new-target" "^7.12.1" - "@babel/plugin-transform-object-super" "^7.12.1" - "@babel/plugin-transform-parameters" "^7.12.1" - "@babel/plugin-transform-property-literals" "^7.12.1" - "@babel/plugin-transform-regenerator" "^7.12.1" - "@babel/plugin-transform-reserved-words" "^7.12.1" - "@babel/plugin-transform-shorthand-properties" "^7.12.1" - "@babel/plugin-transform-spread" "^7.12.1" - "@babel/plugin-transform-sticky-regex" "^7.12.7" - "@babel/plugin-transform-template-literals" "^7.12.1" - "@babel/plugin-transform-typeof-symbol" "^7.12.10" - "@babel/plugin-transform-unicode-escapes" "^7.12.1" - "@babel/plugin-transform-unicode-regex" "^7.12.1" - "@babel/preset-modules" "^0.1.3" - "@babel/types" "^7.12.11" - core-js-compat "^3.8.0" - semver "^5.5.0" - -"@babel/preset-modules@^0.1.3": - version "0.1.5" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" - integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== - dependencies: - "@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@7.11.2": - version "7.11.2" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.11.2.tgz#f549c13c754cc40b87644b9fa9f09a6a95fe0736" - integrity sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/runtime@7.12.5": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" - integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.14.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": - version "7.16.3" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.3.tgz#b86f0db02a04187a3c17caa77de69840165d42d5" - integrity sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/template@7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" - integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/parser" "^7.10.4" - "@babel/types" "^7.10.4" - -"@babel/template@7.12.7": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.7.tgz#c817233696018e39fbb6c491d2fb684e05ed43bc" - integrity sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/parser" "^7.12.7" - "@babel/types" "^7.12.7" - -"@babel/template@^7.10.4", "@babel/template@^7.12.7", "@babel/template@^7.16.0", "@babel/template@^7.8.3": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.0.tgz#d16a35ebf4cd74e202083356fab21dd89363ddd6" - integrity sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A== - dependencies: - "@babel/code-frame" "^7.16.0" - "@babel/parser" "^7.16.0" - "@babel/types" "^7.16.0" - -"@babel/traverse@^7.10.3", "@babel/traverse@^7.11.0", "@babel/traverse@^7.12.10", "@babel/traverse@^7.16.0", "@babel/traverse@^7.16.3", "@babel/traverse@^7.8.3": - version "7.16.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.3.tgz#f63e8a938cc1b780f66d9ed3c54f532ca2d14787" - integrity sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag== - dependencies: - "@babel/code-frame" "^7.16.0" - "@babel/generator" "^7.16.0" - "@babel/helper-function-name" "^7.16.0" - "@babel/helper-hoist-variables" "^7.16.0" - "@babel/helper-split-export-declaration" "^7.16.0" - "@babel/parser" "^7.16.3" - "@babel/types" "^7.16.0" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.10.3", "@babel/types@^7.10.4", "@babel/types@^7.11.0", "@babel/types@^7.12.10", "@babel/types@^7.12.11", "@babel/types@^7.12.7", "@babel/types@^7.16.0", "@babel/types@^7.4.4", "@babel/types@^7.8.3", "@babel/types@^7.8.6": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.0.tgz#db3b313804f96aadd0b776c4823e127ad67289ba" - integrity sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg== - dependencies: - "@babel/helper-validator-identifier" "^7.15.7" - to-fast-properties "^2.0.0" - -"@csstools/convert-colors@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" - integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw== - -"@cypress/request@^2.88.6": - version "2.88.10" - resolved "https://registry.yarnpkg.com/@cypress/request/-/request-2.88.10.tgz#b66d76b07f860d3a4b8d7a0604d020c662752cce" - integrity sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg== - dependencies: - 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" - http-signature "~1.3.6" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - 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 "^8.3.2" - -"@cypress/schematic@^1.5.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@cypress/schematic/-/schematic-1.6.0.tgz#7178702e94ec717b7ffc6b18b4d9ff7cd8a48d44" - integrity sha512-ENHceK21AANBCthaiQ4gJGEvHsqJ9wS3b9PjnlD4MKOMzqwU/WMrJAs/Xnxa6PGh3btB2w0xNN+0beeaf0KiCA== - dependencies: - "@angular-devkit/architect" "^0.1202.10" - "@angular-devkit/core" "^12.2.10" - "@angular-devkit/schematics" "^12.2.10" - "@schematics/angular" "^12.2.10" - jsonc-parser "^3.0.0" - rxjs "~6.6.0" - -"@cypress/xvfb@^1.2.4": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@cypress/xvfb/-/xvfb-1.2.4.tgz#2daf42e8275b39f4aa53c14214e557bd14e7748a" - integrity sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q== - dependencies: - debug "^3.1.0" - lodash.once "^4.1.1" - -"@discoveryjs/json-ext@0.5.2": - version "0.5.2" - resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz#8f03a22a04de437254e8ce8cc84ba39689288752" - integrity sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg== - -"@discoveryjs/json-ext@^0.5.0": - version "0.5.6" - resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz#d5e0706cf8c6acd8c6032f8d54070af261bbbb2f" - integrity sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA== - -"@edsilv/http-status-codes@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@edsilv/http-status-codes/-/http-status-codes-1.0.3.tgz#a1b767c552ac43f2983ab2b9ee20e9c73b79960b" - integrity sha512-HLK2FS5sZqxPqD53D6hhZxC6C8THTVwlyZDZ7J0iWsrB8JmMA69m/CQuNKZc1kki9WSVeck2fXna26NL0SE7cg== - -"@emotion/hash@^0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" - integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== - -"@fortawesome/fontawesome-free@^5.5.0": - version "5.15.4" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.4.tgz#ecda5712b61ac852c760d8b3c79c96adca5554e5" - integrity sha512-eYm8vijH/hpzr/6/1CJ/V/Eb1xQFW2nnUKArb3z+yUWv7HTwj6M7SP957oMjfZjAHU6qpoNc2wQvIxBLWYa/Jg== - -"@gar/promisify@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.2.tgz#30aa825f11d438671d585bd44e7fd564535fc210" - integrity sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw== - -"@iiif/vocabulary@^1.0.20": - version "1.0.22" - resolved "https://registry.yarnpkg.com/@iiif/vocabulary/-/vocabulary-1.0.22.tgz#743d6cb1914e090137c56a4e44decbe7f8b21bdc" - integrity sha512-KOIZgRpDERMK4YGeSwPBNjpJETapMWp8pvEvSGUQkuTlqkiNLirZH65CIcEENZEL5A6mxrYLJX6okDYq7W1+RA== - -"@istanbuljs/schema@^0.1.2": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== - -"@jsdevtools/coverage-istanbul-loader@3.0.5": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.5.tgz#2a4bc65d0271df8d4435982db4af35d81754ee26" - integrity sha512-EUCPEkaRPvmHjWAAZkWMT7JDzpw7FKB00WTISaiXsbNOd5hCHg77XLA8sLYLFDo1zepYLo2w7GstN8YBqRXZfA== - dependencies: - convert-source-map "^1.7.0" - istanbul-lib-instrument "^4.0.3" - loader-utils "^2.0.0" - merge-source-map "^1.1.0" - schema-utils "^2.7.0" - -"@kolkov/ngx-gallery@^1.2.3": - version "1.2.3" - resolved "https://registry.yarnpkg.com/@kolkov/ngx-gallery/-/ngx-gallery-1.2.3.tgz#bb15d4b64a5c03905677aa4ca741835aabe41f43" - integrity sha512-Dpnhwq3DGPSXrNt65gexo+/Smb2L0bne14A0WONN04+racETtcY33fqFvNWfRw5Nvk2Eza+sq95eEA0NbgF/6g== - -"@material-ui/core@^4.11.0": - version "4.12.3" - resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-4.12.3.tgz#80d665caf0f1f034e52355c5450c0e38b099d3ca" - integrity sha512-sdpgI/PL56QVsEJldwEe4FFaFTLUqN+rd7sSZiRCdx2E/C7z5yK0y/khAWVBH24tXwto7I1hCzNWfJGZIYJKnw== - dependencies: - "@babel/runtime" "^7.4.4" - "@material-ui/styles" "^4.11.4" - "@material-ui/system" "^4.12.1" - "@material-ui/types" "5.1.0" - "@material-ui/utils" "^4.11.2" - "@types/react-transition-group" "^4.2.0" - clsx "^1.0.4" - hoist-non-react-statics "^3.3.2" - popper.js "1.16.1-lts" - prop-types "^15.7.2" - react-is "^16.8.0 || ^17.0.0" - react-transition-group "^4.4.0" - -"@material-ui/icons@^4.9.1": - version "4.11.2" - resolved "https://registry.yarnpkg.com/@material-ui/icons/-/icons-4.11.2.tgz#b3a7353266519cd743b6461ae9fdfcb1b25eb4c5" - integrity sha512-fQNsKX2TxBmqIGJCSi3tGTO/gZ+eJgWmMJkgDiOfyNaunNaxcklJQFaFogYcFl0qFuaEz1qaXYXboa/bUXVSOQ== - dependencies: - "@babel/runtime" "^7.4.4" - -"@material-ui/lab@^4.0.0-alpha.53": - version "4.0.0-alpha.60" - resolved "https://registry.yarnpkg.com/@material-ui/lab/-/lab-4.0.0-alpha.60.tgz#5ad203aed5a8569b0f1753945a21a05efa2234d2" - integrity sha512-fadlYsPJF+0fx2lRuyqAuJj7hAS1tLDdIEEdov5jlrpb5pp4b+mRDUqQTUxi4inRZHS1bEXpU8QWUhO6xX88aA== - dependencies: - "@babel/runtime" "^7.4.4" - "@material-ui/utils" "^4.11.2" - clsx "^1.0.4" - prop-types "^15.7.2" - react-is "^16.8.0 || ^17.0.0" - -"@material-ui/styles@^4.11.4": - version "4.11.4" - resolved "https://registry.yarnpkg.com/@material-ui/styles/-/styles-4.11.4.tgz#eb9dfccfcc2d208243d986457dff025497afa00d" - integrity sha512-KNTIZcnj/zprG5LW0Sao7zw+yG3O35pviHzejMdcSGCdWbiO8qzRgOYL8JAxAsWBKOKYwVZxXtHWaB5T2Kvxew== - dependencies: - "@babel/runtime" "^7.4.4" - "@emotion/hash" "^0.8.0" - "@material-ui/types" "5.1.0" - "@material-ui/utils" "^4.11.2" - clsx "^1.0.4" - csstype "^2.5.2" - hoist-non-react-statics "^3.3.2" - jss "^10.5.1" - jss-plugin-camel-case "^10.5.1" - jss-plugin-default-unit "^10.5.1" - jss-plugin-global "^10.5.1" - jss-plugin-nested "^10.5.1" - jss-plugin-props-sort "^10.5.1" - jss-plugin-rule-value-function "^10.5.1" - jss-plugin-vendor-prefixer "^10.5.1" - prop-types "^15.7.2" - -"@material-ui/system@^4.12.1": - version "4.12.1" - resolved "https://registry.yarnpkg.com/@material-ui/system/-/system-4.12.1.tgz#2dd96c243f8c0a331b2bb6d46efd7771a399707c" - integrity sha512-lUdzs4q9kEXZGhbN7BptyiS1rLNHe6kG9o8Y307HCvF4sQxbCgpL2qi+gUk+yI8a2DNk48gISEQxoxpgph0xIw== - dependencies: - "@babel/runtime" "^7.4.4" - "@material-ui/utils" "^4.11.2" - csstype "^2.5.2" - prop-types "^15.7.2" - -"@material-ui/types@5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@material-ui/types/-/types-5.1.0.tgz#efa1c7a0b0eaa4c7c87ac0390445f0f88b0d88f2" - integrity sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A== - -"@material-ui/utils@^4.11.2": - version "4.11.2" - resolved "https://registry.yarnpkg.com/@material-ui/utils/-/utils-4.11.2.tgz#f1aefa7e7dff2ebcb97d31de51aecab1bb57540a" - integrity sha512-Uul8w38u+PICe2Fg2pDKCaIG7kOyhowZ9vjiC1FsVwPABTW8vPPKfF6OvxRq3IiBaI1faOJmgdvMG7rMJARBhA== - dependencies: - "@babel/runtime" "^7.4.4" - prop-types "^15.7.2" - react-is "^16.8.0 || ^17.0.0" - -"@ng-bootstrap/ng-bootstrap@9.1.3": - version "9.1.3" - resolved "https://registry.yarnpkg.com/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-9.1.3.tgz#f48f42ad96ba75b50f1b87caa0dabcf5299a078c" - integrity sha512-Sl4lis1F5uSPrd4WsLEMX8b3fqzeHr4rgTFhocpx/IedZPaPdGec4a91TjdqcM/fNwzoXj1AdGrcMLpFFOxmvw== - dependencies: - tslib "^2.0.0" - -"@ng-dynamic-forms/core@^13.0.0": - version "13.0.0" - resolved "https://registry.yarnpkg.com/@ng-dynamic-forms/core/-/core-13.0.0.tgz#aee226839ffa1f648429cbdee56e4d8d9c56b76c" - integrity sha512-RBP7i+q9EUDlHcmqcd1e27zuJhk+8NOU9mC7xlHPcmhFzxV58Gzr/n0nb5IzF+FIQlcJqP/BspyksaCCbRStZw== - dependencies: - tslib "^2.0.0" - -"@ng-dynamic-forms/ui-ng-bootstrap@^13.0.0": - version "13.0.0" - resolved "https://registry.yarnpkg.com/@ng-dynamic-forms/ui-ng-bootstrap/-/ui-ng-bootstrap-13.0.0.tgz#cef62c1dfbf6d7aa700eab04f8c337dd0e15250f" - integrity sha512-0l/hfuFXadp6/PKeGdrN0bFBM/xwBSvZX6HeT9Q/Sp19s99jdKphu6ZfG2SHWxY4tXC0nzB+Xcmqc38vi0iZAg== - dependencies: - tslib "^2.0.0" - -"@ngrx/effects@^11.1.1": - version "11.1.1" - resolved "https://registry.yarnpkg.com/@ngrx/effects/-/effects-11.1.1.tgz#82abd97df8c1cdf1d9bd0bf720289591230d260c" - integrity sha512-KLfGSjlmlPUMlMEQkdD6tnJCs/dLSBJC6hZhCnobpDrBR9YMpoDDjM1t0Veg+Z50dL6AGO/T4dllRjd3BJuWiw== - dependencies: - tslib "^2.0.0" - -"@ngrx/router-store@^11.1.1": - version "11.1.1" - resolved "https://registry.yarnpkg.com/@ngrx/router-store/-/router-store-11.1.1.tgz#a4ce866b3247ceb7903f81b4af6a960d869729cf" - integrity sha512-KE3O43wCf0VGFFIilusgSc4G5+CA++5wYL9xvdc8/BVr6sXXmOklrhyRVU/reQqy7HdYzbIofLKox5mXE/smdA== - dependencies: - tslib "^2.0.0" - -"@ngrx/store-devtools@^11.1.1": - version "11.1.1" - resolved "https://registry.yarnpkg.com/@ngrx/store-devtools/-/store-devtools-11.1.1.tgz#bdefc5c03dcac6fc21fcc9e33a4a3a3464f3e2d6" - integrity sha512-YvTMy8HUMUiiyrzKn4KhrQzkAg2yBfLgd1PHR0yPjyzj7RCaYZHwhq6sP0+AiFMBi1Lat8Wczy7SwwLTa6aZ3w== - dependencies: - tslib "^2.0.0" - -"@ngrx/store@^11.1.1": - version "11.1.1" - resolved "https://registry.yarnpkg.com/@ngrx/store/-/store-11.1.1.tgz#e971d767ae5caa8984daad23cda38c6fd94dc888" - integrity sha512-tkeKoyYo631hLJ1I8+bm9EWoi7E0A3i4IMjvf956Vpu5IdMnP6d0HW3lKU/ruhFD5YOXAHcUgEIWyfxxILABag== - dependencies: - tslib "^2.0.0" - -"@ngtools/webpack@10.2.3": - version "10.2.3" - resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-10.2.3.tgz#e4e410d1d647b6e21a69ab20c00c110464f623ea" - integrity sha512-h7JJMMca1bHY/0Prpxu2P3bvnC6pUKmBAfqN0h0HaRN9LTU9IDWtDRTIL1Aqhs/tcTUio/DowVKnVi2CWHAOmg== - dependencies: - "@angular-devkit/core" "10.2.3" - enhanced-resolve "4.3.0" - webpack-sources "1.4.3" - -"@ngtools/webpack@11.2.15": - version "11.2.15" - resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-11.2.15.tgz#217973459112178940aa689a25ab9e3a4cb35a6f" - integrity sha512-uy+ekGlgReO/4N5Ifmd4Dh1s0BTvbvMnjTrSUzmPnaeCjg4zjosA3gcdv+33duQ1Y2ythDSnf2MPYRN9q3tzgQ== - dependencies: - "@angular-devkit/core" "11.2.15" - enhanced-resolve "5.7.0" - webpack-sources "2.2.0" - -"@nguniversal/builders@~11.2.1": - version "11.2.1" - resolved "https://registry.yarnpkg.com/@nguniversal/builders/-/builders-11.2.1.tgz#42fbe12ee56f4e700f9feae292e431f57779512b" - integrity sha512-TSN12ykp2UbHoAAXrtesALaAkIs8KQ0qHmnVEEWeHqOU6/lDGYg3DHtnEpVW3kzPz0FirgudYfO3K+auer6v7g== - dependencies: - "@angular-devkit/architect" "^0.1102.3" - "@angular-devkit/core" "^11.2.3" - "@nguniversal/common" "11.2.1" - browser-sync "^2.26.7" - guess-parser "^0.4.12" - http-proxy-middleware "^1.0.0" - ora "^5.1.0" - rxjs "^6.5.5" - tree-kill "^1.2.2" - -"@nguniversal/common@11.2.1": - version "11.2.1" - resolved "https://registry.yarnpkg.com/@nguniversal/common/-/common-11.2.1.tgz#c2f6a6ee9fee43121bf3cb5da43b76a45ce9f8eb" - integrity sha512-2PYo38yBCIE5GdURFj9s5b18bY/SwX3WHmNRoMaR6Aj8uE0j2kVpmyqQgdHTyvf93pgpIbRyo7x1J6MFFXPQAA== - dependencies: - critters "0.0.7" - tslib "^2.0.0" - -"@nguniversal/express-engine@11.2.1": - version "11.2.1" - resolved "https://registry.yarnpkg.com/@nguniversal/express-engine/-/express-engine-11.2.1.tgz#015b2bc0b87b947195ee880221fb9789b5674f76" - integrity sha512-Y2t4qkyeI5xaegZeI1fJDcMUvQ4AZbKxvEibahapEX5ixN7dxq+iB6xKnSIOG+WYaP3l4c6sExhlKo/oxNXMqA== - dependencies: - "@nguniversal/common" "11.2.1" - tslib "^2.0.0" - -"@ngx-translate/core@^13.0.0": - version "13.0.0" - resolved "https://registry.yarnpkg.com/@ngx-translate/core/-/core-13.0.0.tgz#60547cb8a0845a2a0abfde6b0bf5ec6516a63fd6" - integrity sha512-+tzEp8wlqEnw0Gc7jtVRAJ6RteUjXw6JJR4O65KlnxOmJrCGPI0xjV/lKRnQeU0w4i96PQs/jtpL921Wrb7PWg== - dependencies: - tslib "^2.0.0" - -"@nicky-lenaers/ngx-scroll-to@^9.0.0": - version "9.0.0" - resolved "https://registry.yarnpkg.com/@nicky-lenaers/ngx-scroll-to/-/ngx-scroll-to-9.0.0.tgz#c8b455e9968a6116323862d081762880f3492efc" - integrity sha512-eS0vyx8qX4UTMluRYc+sQF/vJHCnAKiufWrwQRme0VURwp+RdOoZDZpYrOPTxPfx6CVj72arTeV9auDYa0WKtA== - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@npmcli/ci-detect@^1.0.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@npmcli/ci-detect/-/ci-detect-1.4.0.tgz#18478bbaa900c37bfbd8a2006a6262c62e8b0fe1" - integrity sha512-3BGrt6FLjqM6br5AhWRKTr3u5GIVkjRYeAFrMp3HjnfICrg4xOrVRwFavKT6tsp++bq5dluL5t8ME/Nha/6c1Q== - -"@npmcli/fs@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.0.0.tgz#589612cfad3a6ea0feafcb901d29c63fd52db09f" - integrity sha512-8ltnOpRR/oJbOp8vaGUnipOi3bqkcW+sLHFlyXIr08OGHmVJLB1Hn7QtGXbYcpVtH1gAYZTlmDXtE4YV0+AMMQ== - dependencies: - "@gar/promisify" "^1.0.1" - semver "^7.3.5" - -"@npmcli/git@^2.0.1": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-2.1.0.tgz#2fbd77e147530247d37f325930d457b3ebe894f6" - integrity sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw== - dependencies: - "@npmcli/promise-spawn" "^1.3.2" - lru-cache "^6.0.0" - mkdirp "^1.0.4" - npm-pick-manifest "^6.1.1" - promise-inflight "^1.0.1" - promise-retry "^2.0.1" - semver "^7.3.5" - which "^2.0.2" - -"@npmcli/installed-package-contents@^1.0.5": - version "1.0.7" - resolved "https://registry.yarnpkg.com/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz#ab7408c6147911b970a8abe261ce512232a3f4fa" - integrity sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw== - dependencies: - npm-bundled "^1.1.1" - npm-normalize-package-bin "^1.0.1" - -"@npmcli/move-file@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" - integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== - dependencies: - mkdirp "^1.0.4" - rimraf "^3.0.2" - -"@npmcli/node-gyp@^1.0.2": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-1.0.3.tgz#a912e637418ffc5f2db375e93b85837691a43a33" - integrity sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA== - -"@npmcli/promise-spawn@^1.2.0", "@npmcli/promise-spawn@^1.3.2": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz#42d4e56a8e9274fba180dabc0aea6e38f29274f5" - integrity sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg== - dependencies: - infer-owner "^1.0.4" - -"@npmcli/run-script@^1.3.0": - version "1.8.6" - resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-1.8.6.tgz#18314802a6660b0d4baa4c3afe7f1ad39d8c28b7" - integrity sha512-e42bVZnC6VluBZBAFEr3YrdqSspG3bgilyg4nSLBJ7TRGNCzxHa92XAHxQBLYg0BmgwO4b2mf3h/l5EkEWRn3g== - dependencies: - "@npmcli/node-gyp" "^1.0.2" - "@npmcli/promise-spawn" "^1.3.2" - node-gyp "^7.1.0" - read-package-json-fast "^2.0.1" - -"@polka/url@^1.0.0-next.20": - version "1.0.0-next.21" - resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1" - integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== - -"@react-dnd/asap@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@react-dnd/asap/-/asap-4.0.0.tgz#b300eeed83e9801f51bd66b0337c9a6f04548651" - integrity sha512-0XhqJSc6pPoNnf8DhdsPHtUhRzZALVzYMTzRwV4VI6DJNJ/5xxfL9OQUwb8IH5/2x7lSf7nAZrnzUD+16VyOVQ== - -"@react-dnd/invariant@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@react-dnd/invariant/-/invariant-2.0.0.tgz#09d2e81cd39e0e767d7da62df9325860f24e517e" - integrity sha512-xL4RCQBCBDJ+GRwKTFhGUW8GXa4yoDfJrPbLblc3U09ciS+9ZJXJ3Qrcs/x2IODOdIE5kQxvMmE2UKyqUictUw== - -"@react-dnd/shallowequal@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@react-dnd/shallowequal/-/shallowequal-2.0.0.tgz#a3031eb54129f2c66b2753f8404266ec7bf67f0a" - integrity sha512-Pc/AFTdwZwEKJxFJvlxrSmGe/di+aAOBn60sremrpLo6VI/6cmiUYNNwlI5KNYttg7uypzA3ILPMPgxB2GYZEg== - -"@redux-saga/core@^1.1.3": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@redux-saga/core/-/core-1.1.3.tgz#3085097b57a4ea8db5528d58673f20ce0950f6a4" - integrity sha512-8tInBftak8TPzE6X13ABmEtRJGjtK17w7VUs7qV17S8hCO5S3+aUTWZ/DBsBJPdE8Z5jOPwYALyvofgq1Ws+kg== - dependencies: - "@babel/runtime" "^7.6.3" - "@redux-saga/deferred" "^1.1.2" - "@redux-saga/delay-p" "^1.1.2" - "@redux-saga/is" "^1.1.2" - "@redux-saga/symbols" "^1.1.2" - "@redux-saga/types" "^1.1.0" - redux "^4.0.4" - typescript-tuple "^2.2.1" - -"@redux-saga/deferred@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@redux-saga/deferred/-/deferred-1.1.2.tgz#59937a0eba71fff289f1310233bc518117a71888" - integrity sha512-908rDLHFN2UUzt2jb4uOzj6afpjgJe3MjICaUNO3bvkV/kN/cNeI9PMr8BsFXB/MR8WTAZQq/PlTq8Kww3TBSQ== - -"@redux-saga/delay-p@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@redux-saga/delay-p/-/delay-p-1.1.2.tgz#8f515f4b009b05b02a37a7c3d0ca9ddc157bb355" - integrity sha512-ojc+1IoC6OP65Ts5+ZHbEYdrohmIw1j9P7HS9MOJezqMYtCDgpkoqB5enAAZrNtnbSL6gVCWPHaoaTY5KeO0/g== - dependencies: - "@redux-saga/symbols" "^1.1.2" - -"@redux-saga/is@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@redux-saga/is/-/is-1.1.2.tgz#ae6c8421f58fcba80faf7cadb7d65b303b97e58e" - integrity sha512-OLbunKVsCVNTKEf2cH4TYyNbbPgvmZ52iaxBD4I1fTif4+MTXMa4/Z07L83zW/hTCXwpSZvXogqMqLfex2Tg6w== - dependencies: - "@redux-saga/symbols" "^1.1.2" - "@redux-saga/types" "^1.1.0" - -"@redux-saga/symbols@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@redux-saga/symbols/-/symbols-1.1.2.tgz#216a672a487fc256872b8034835afc22a2d0595d" - integrity sha512-EfdGnF423glv3uMwLsGAtE6bg+R9MdqlHEzExnfagXPrIiuxwr3bdiAwz3gi+PsrQ3yBlaBpfGLtDG8rf3LgQQ== - -"@redux-saga/types@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@redux-saga/types/-/types-1.1.0.tgz#0e81ce56b4883b4b2a3001ebe1ab298b84237204" - integrity sha512-afmTuJrylUU/0OtqzaRkbyYFFNgCF73Bvel/sw90pvGrWIZ+vyoIJqA6eMSoA6+nb443kTmulmBtC9NerXboNg== - -"@researchgate/react-intersection-observer@^1.0.0": - version "1.3.5" - resolved "https://registry.yarnpkg.com/@researchgate/react-intersection-observer/-/react-intersection-observer-1.3.5.tgz#0321d2dd609aaacdb9bace8004d99c72824fb142" - integrity sha512-aYlsex5Dd6BAHMJvJrUoFp8gzgMSL27xFvrxkVYW0bV1RMAapVsO+QeYLtTaSF/QCflktODodvv+wJm49oMnnQ== - -"@scarf/scarf@^1.1.0": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@scarf/scarf/-/scarf-1.1.1.tgz#d8b9f20037b3a37dbf8dcdc4b3b72f9285bfce35" - integrity sha512-VGbKDbk1RFIaSmdVb0cNjjWJoRWRI/Weo23AjRCC2nryO0iAS8pzsToJfPVPtVs74WHw4L1UTADNdIYRLkirZQ== - -"@schematics/angular@11.2.15": - version "11.2.15" - resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-11.2.15.tgz#9e9770746d46d85b6c28106aec23b9cf8981cb52" - integrity sha512-btVLsvIfjMdvBRuww0GkR2Bg1APmw+Kq9+2EqKhD8K7f56s3NEmVpECgSIi4UM0Eybx+2MtKYWeud0p0CdUQ7w== - dependencies: - "@angular-devkit/core" "11.2.15" - "@angular-devkit/schematics" "11.2.15" - jsonc-parser "3.0.0" - -"@schematics/angular@^12.2.10": - version "12.2.13" - resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-12.2.13.tgz#5bf3e7b699a42d7fd7f7aa12bbe4534e671e7201" - integrity sha512-TrigQ9TCmAedf1J5PSSSfTC+sScYrITeAUN8a9rlkjZNvff8hHVyQaiZmhqL+egKQL828mhkqpnFUDd4QsPBIw== - dependencies: - "@angular-devkit/core" "12.2.13" - "@angular-devkit/schematics" "12.2.13" - jsonc-parser "3.0.0" - -"@schematics/update@0.1102.15": - version "0.1102.15" - resolved "https://registry.yarnpkg.com/@schematics/update/-/update-0.1102.15.tgz#fa6674552858d9a1c12e2c43443fc9f3d92a4f70" - integrity sha512-pC+nqfwfyDqAQYtnNKG15j6eV6XfmCML2DAIHUtTarbHtQjhBkxtdKxXnPqZW9Usa1xFaryET/7yp21uhZ2Nrw== - dependencies: - "@angular-devkit/core" "11.2.15" - "@angular-devkit/schematics" "11.2.15" - "@yarnpkg/lockfile" "1.1.0" - ini "2.0.0" - npm-package-arg "^8.0.0" - pacote "11.2.4" - semver "7.3.4" - semver-intersect "1.4.0" - -"@sindresorhus/is@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" - integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== - -"@szmarczak/http-timer@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" - integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== - dependencies: - defer-to-connect "^1.0.1" - -"@tootallnate/once@1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" - integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== - -"@trysound/sax@0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" - integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== - -"@types/body-parser@*": - version "1.19.2" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" - integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== - dependencies: - "@types/connect" "*" - "@types/node" "*" - -"@types/circular-json@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@types/circular-json/-/circular-json-0.4.0.tgz#7401f7e218cfe87ad4c43690da5658b9acaf51be" - integrity sha512-7+kYB7x5a7nFWW1YPBh3KxhwKfiaI4PbZ1RvzBU91LZy7lWJO822CI+pqzSre/DZ7KsCuMKdHnLHHFu8AyXbQg== - -"@types/connect@*": - version "3.4.35" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" - integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== - dependencies: - "@types/node" "*" - -"@types/deep-freeze@0.1.2": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@types/deep-freeze/-/deep-freeze-0.1.2.tgz#68e5379291910e82c2f0d1629732163c2aa662cc" - integrity sha512-M6x29Vk4681dght4IMnPIcF1SNmeEm0c4uatlTFhp+++H1oDK1THEIzuCC2WeCBVhX+gU0NndsseDS3zaCtlcQ== - -"@types/express-serve-static-core@^4.17.18": - version "4.17.26" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.26.tgz#5d9a8eeecb9d5f9d7fc1d85f541512a84638ae88" - integrity sha512-zeu3tpouA043RHxW0gzRxwCHchMgftE8GArRsvYT0ByDMbn19olQHx5jLue0LxWY6iYtXb7rXmuVtSkhy9YZvQ== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - -"@types/express@^4.17.9": - version "4.17.13" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034" - integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.18" - "@types/qs" "*" - "@types/serve-static" "*" - -"@types/file-saver@^2.0.1": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/file-saver/-/file-saver-2.0.4.tgz#aaf9b96296150d737b2fefa535ced05ed8013d84" - integrity sha512-sPZYQEIF/SOnLAvaz9lTuydniP+afBMtElRTdYkeV1QtEgvtJ7qolCPjly6O32QI8CbEmP5O/fztMXEDWfEcrg== - -"@types/glob@^7.1.1": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" - integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== - dependencies: - "@types/minimatch" "*" - "@types/node" "*" - -"@types/hoist-non-react-statics@^3.3.0", "@types/hoist-non-react-statics@^3.3.1": - version "3.3.1" - resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" - integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== - dependencies: - "@types/react" "*" - hoist-non-react-statics "^3.3.0" - -"@types/html-minifier-terser@^5.0.0": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz#693b316ad323ea97eed6b38ed1a3cc02b1672b57" - integrity sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w== - -"@types/http-proxy@^1.17.5": - version "1.17.7" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.7.tgz#30ea85cc2c868368352a37f0d0d3581e24834c6f" - integrity sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w== - dependencies: - "@types/node" "*" - -"@types/jasmine@*": - version "3.10.2" - resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-3.10.2.tgz#1b9f9ba9ad7bfd7d322f7ed9d8753220b1c84b52" - integrity sha512-qs4xjVm4V/XjM6owGm/x6TNmhGl5iKX8dkTdsgdgl9oFnqgzxLepnS7rN9Tdo7kDmnFD/VEqKrW57cGD2odbEg== - -"@types/jasmine@~3.6.0": - version "3.6.11" - resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-3.6.11.tgz#4b1d77aa9dfc757407cb9e277216d8e83553f09d" - integrity sha512-S6pvzQDvMZHrkBz2Mcn/8Du7cpr76PlRJBAoHnSDNbulULsH5dp0Gns+WRyNX5LHejz/ljxK4/vIHK/caHt6SQ== - -"@types/jasminewd2@~2.0.8": - version "2.0.10" - resolved "https://registry.yarnpkg.com/@types/jasminewd2/-/jasminewd2-2.0.10.tgz#ae31c237aa6421bde30f1058b1d20f4577e54443" - integrity sha512-J7mDz7ovjwjc+Y9rR9rY53hFWKATcIkrr9DwQWmOas4/pnIPJTXawnzjwpHm3RSxz/e3ZVUvQ7cRbd5UQLo10g== - dependencies: - "@types/jasmine" "*" - -"@types/js-cookie@2.2.6": - version "2.2.6" - resolved "https://registry.yarnpkg.com/@types/js-cookie/-/js-cookie-2.2.6.tgz#f1a1cb35aff47bc5cfb05cb0c441ca91e914c26f" - integrity sha512-+oY0FDTO2GYKEV0YPvSshGq9t7YozVkgvXLty7zogQNuCxBhT9/3INX9Q7H1aRZ4SUDRXAKlJuA4EA5nTt7SNw== - -"@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.9" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" - integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== - -"@types/lodash@^4.14.165": - version "4.14.177" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.177.tgz#f70c0d19c30fab101cad46b52be60363c43c4578" - integrity sha512-0fDwydE2clKe9MNfvXHBHF9WEahRuj+msTuQqOmAApNORFvhMYZKNGGJdCzuhheVjMps/ti0Ak/iJPACMaevvw== - -"@types/mime@^1": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" - integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== - -"@types/minimatch@*": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" - integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== - -"@types/node@*": - version "16.11.12" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.12.tgz#ac7fb693ac587ee182c3780c26eb65546a1a3c10" - integrity sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw== - -"@types/node@^14.14.31", "@types/node@^14.14.9": - version "14.18.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.0.tgz#98df2397f6936bfbff4f089e40e06fa5dd88d32a" - integrity sha512-0GeIl2kmVMXEnx8tg1SlG6Gg8vkqirrW752KqolYo1PHevhhZN3bhJ67qHj+bQaINhX0Ra3TlWwRvMCd9iEfNQ== - -"@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" - integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== - -"@types/prop-types@*": - version "15.7.4" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11" - integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ== - -"@types/q@^0.0.32": - version "0.0.32" - resolved "https://registry.yarnpkg.com/@types/q/-/q-0.0.32.tgz#bd284e57c84f1325da702babfc82a5328190c0c5" - integrity sha1-vShOV8hPEyXacCur/IKlMoGQwMU= - -"@types/q@^1.5.1": - version "1.5.5" - resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.5.tgz#75a2a8e7d8ab4b230414505d92335d1dcb53a6df" - integrity sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ== - -"@types/qs@*": - version "6.9.7" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" - integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== - -"@types/range-parser@*": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" - integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== - -"@types/react-redux@^7.1.20": - version "7.1.20" - resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.20.tgz#42f0e61ababb621e12c66c96dda94c58423bd7df" - integrity sha512-q42es4c8iIeTgcnB+yJgRTTzftv3eYYvCZOh1Ckn2eX/3o5TdsQYKUWpLoLuGlcY/p+VAhV9IOEZJcWk/vfkXw== - dependencies: - "@types/hoist-non-react-statics" "^3.3.0" - "@types/react" "*" - hoist-non-react-statics "^3.3.0" - redux "^4.0.0" - -"@types/react-transition-group@^4.2.0": - version "4.4.4" - resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.4.tgz#acd4cceaa2be6b757db61ed7b432e103242d163e" - integrity sha512-7gAPz7anVK5xzbeQW9wFBDg7G++aPLAFY0QaSMOou9rJZpbuI58WAuJrgu+qR92l61grlnCUe7AFX8KGahAgug== - dependencies: - "@types/react" "*" - -"@types/react@*": - version "17.0.37" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.37.tgz#6884d0aa402605935c397ae689deed115caad959" - integrity sha512-2FS1oTqBGcH/s0E+CjrCCR9+JMpsu9b69RTFO+40ua43ZqP5MmQ4iUde/dMjWR909KxZwmOQIFq6AV6NjEG5xg== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/retry@^0.12.0": - version "0.12.1" - resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.1.tgz#d8f1c0d0dc23afad6dc16a9e993a0865774b4065" - integrity sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g== - -"@types/scheduler@*": - version "0.16.2" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" - integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== - -"@types/selenium-webdriver@^3.0.0": - version "3.0.19" - resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-3.0.19.tgz#28ecede76f15b13553b4e86074d4cf9a0bbe49c4" - integrity sha512-OFUilxQg+rWL2FMxtmIgCkUDlJB6pskkpvmew7yeXfzzsOBb5rc+y2+DjHm+r3r1ZPPcJefK3DveNSYWGiy68g== - -"@types/serve-static@*": - version "1.13.10" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9" - integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ== - dependencies: - "@types/mime" "^1" - "@types/node" "*" - -"@types/sinonjs__fake-timers@^6.0.2": - version "6.0.4" - resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.4.tgz#0ecc1b9259b76598ef01942f547904ce61a6a77d" - integrity sha512-IFQTJARgMUBF+xVd2b+hIgXWrZEjND3vJtRCvIelcFB5SIXfjV4bOHbHJ0eXKh+0COrBRc8MqteKAz/j88rE0A== - -"@types/sizzle@^2.3.2": - version "2.3.3" - resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.3.tgz#ff5e2f1902969d305225a047c8a0fd5c915cebef" - integrity sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ== - -"@types/source-list-map@*": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" - integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== - -"@types/stacktrace-js@^0.0.33": - version "0.0.33" - resolved "https://registry.yarnpkg.com/@types/stacktrace-js/-/stacktrace-js-0.0.33.tgz#9b027370ca161b89798f308af77438802546cb39" - integrity sha512-aqJ6QM9QThNL4dHBhwl1f9B0oDqiREkYLn9RldghUKsGeFWWGlCsqsRWxbh+hDvvmptMFqc4aIfFIGz9BBu8Qg== - -"@types/tapable@^1", "@types/tapable@^1.0.5": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.8.tgz#b94a4391c85666c7b73299fd3ad79d4faa435310" - integrity sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ== - -"@types/uglify-js@*": - version "3.13.1" - resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.13.1.tgz#5e889e9e81e94245c75b6450600e1c5ea2878aea" - integrity sha512-O3MmRAk6ZuAKa9CHgg0Pr0+lUOqoMLpc9AS4R8ano2auvsg7IE8syF3Xh/NPr26TWklxYcqoEEFdzLLs1fV9PQ== - dependencies: - source-map "^0.6.1" - -"@types/webpack-sources@*": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-3.2.0.tgz#16d759ba096c289034b26553d2df1bf45248d38b" - integrity sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg== - dependencies: - "@types/node" "*" - "@types/source-list-map" "*" - source-map "^0.7.3" - -"@types/webpack-sources@^0.1.5": - version "0.1.9" - resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-0.1.9.tgz#da69b06eb34f6432e6658acb5a6893c55d983920" - integrity sha512-bvzMnzqoK16PQIC8AYHNdW45eREJQMd6WG/msQWX5V2+vZmODCOPb4TJcbgRljTZZTwTM4wUMcsI8FftNA7new== - dependencies: - "@types/node" "*" - "@types/source-list-map" "*" - source-map "^0.6.1" - -"@types/webpack@^4.41.8": - version "4.41.32" - resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.32.tgz#a7bab03b72904070162b2f169415492209e94212" - integrity sha512-cb+0ioil/7oz5//7tZUSwbrSAN/NWHrQylz5cW8G0dWTcF/g+/dSdMlKVZspBYuMAN1+WnwHrkxiRrLcwd0Heg== - dependencies: - "@types/node" "*" - "@types/tapable" "^1" - "@types/uglify-js" "*" - "@types/webpack-sources" "*" - anymatch "^3.0.0" - source-map "^0.6.0" - -"@types/yauzl@^2.9.1": - version "2.9.2" - resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.9.2.tgz#c48e5d56aff1444409e39fa164b0b4d4552a7b7a" - integrity sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA== - dependencies: - "@types/node" "*" - -"@webassemblyjs/ast@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" - integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== - dependencies: - "@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@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" - integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== - -"@webassemblyjs/helper-api-error@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" - integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== - -"@webassemblyjs/helper-buffer@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" - integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== - -"@webassemblyjs/helper-code-frame@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" - integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== - dependencies: - "@webassemblyjs/wast-printer" "1.9.0" - -"@webassemblyjs/helper-fsm@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" - integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== - -"@webassemblyjs/helper-module-context@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" - integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== - dependencies: - "@webassemblyjs/ast" "1.9.0" - -"@webassemblyjs/helper-wasm-bytecode@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" - integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== - -"@webassemblyjs/helper-wasm-section@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" - integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== - dependencies: - "@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@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" - integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" - integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" - integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== - -"@webassemblyjs/wasm-edit@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" - integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== - dependencies: - "@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@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" - integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== - dependencies: - "@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@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" - integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== - dependencies: - "@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@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" - integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== - dependencies: - "@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@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" - integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== - dependencies: - "@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@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" - integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/wast-parser" "1.9.0" - "@xtuc/long" "4.2.2" - -"@webpack-cli/configtest@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.1.0.tgz#8342bef0badfb7dfd3b576f2574ab80c725be043" - integrity sha512-ttOkEkoalEHa7RaFYpM0ErK1xc4twg3Am9hfHhL7MVqlHebnkYd2wuI/ZqTDj0cVzZho6PdinY0phFZV3O0Mzg== - -"@webpack-cli/info@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.4.0.tgz#b9179c3227ab09cbbb149aa733475fcf99430223" - integrity sha512-F6b+Man0rwE4n0409FyAJHStYA5OIZERxmnUfLVwv0mc0V1wLad3V7jqRlMkgKBeAq07jUvglacNaa6g9lOpuw== - dependencies: - envinfo "^7.7.3" - -"@webpack-cli/serve@^1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.6.0.tgz#2c275aa05c895eccebbfc34cfb223c6e8bd591a2" - integrity sha512-ZkVeqEmRpBV2GHvjjUZqEai2PpUbuq8Bqd//vEYsp63J8WyexI8ppCqVS3Zs0QADf6aWuPdU+0XsPI647PVlQA== - -"@wessberg/ts-evaluator@0.0.27": - version "0.0.27" - resolved "https://registry.yarnpkg.com/@wessberg/ts-evaluator/-/ts-evaluator-0.0.27.tgz#06e8b901d5e84f11199b9f84577c6426ae761767" - integrity sha512-7gOpVm3yYojUp/Yn7F4ZybJRxyqfMNf0LXK5KJiawbPfL0XTsJV+0mgrEDjOIR6Bi0OYk2Cyg4tjFu1r8MCZaA== - dependencies: - chalk "^4.1.0" - jsdom "^16.4.0" - object-path "^0.11.5" - tslib "^2.0.3" - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - -"@yarnpkg/lockfile@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" - integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== - -abab@^2.0.3, abab@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" - integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: - version "1.3.7" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" - integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== - dependencies: - mime-types "~2.1.24" - negotiator "0.6.2" - -acorn-globals@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" - integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== - dependencies: - acorn "^7.1.1" - acorn-walk "^7.1.1" - -acorn-walk@^7.1.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" - integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== - -acorn-walk@^8.0.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - -acorn@^6.4.1: - version "6.4.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" - integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== - -acorn@^7.1.1: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - -acorn@^8.0.4, acorn@^8.2.4: - version "8.6.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.6.0.tgz#e3692ba0eb1a0c83eaa4f37f5fa7368dd7142895" - integrity sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw== - -adjust-sourcemap-loader@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz#5ae12fb5b7b1c585e80bbb5a63ec163a1a45e61e" - integrity sha512-YBrGyT2/uVQ/c6Rr+t6ZJXniY03YtHGMJQYal368burRGYKqhx9qGTWqcBU5s1CwYY9E/ri63RYyG1IacMZtqw== - dependencies: - loader-utils "^2.0.0" - regex-parser "^2.2.11" - -adjust-sourcemap-loader@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz#fc4a0fd080f7d10471f30a7320f25560ade28c99" - integrity sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A== - dependencies: - loader-utils "^2.0.0" - regex-parser "^2.2.11" - -adm-zip@^0.4.9: - version "0.4.16" - resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365" - integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg== - -after@0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" - integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8= - -agent-base@6, agent-base@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -agent-base@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" - integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg== - dependencies: - es6-promisify "^5.0.0" - -agentkeepalive@^4.1.3: - version "4.1.4" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.1.4.tgz#d928028a4862cb11718e55227872e842a44c945b" - integrity sha512-+V/rGa3EuU74H6wR04plBb7Ks10FbtUQgRj/FQOG7uUIEuaINI+AiqJR1k6t3SVNs7o7ZjIdus6706qqzVq8jQ== - dependencies: - debug "^4.1.0" - depd "^1.1.2" - humanize-ms "^1.2.1" - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ajv-errors@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" - integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== - -ajv-formats@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.0.tgz#96eaf83e38d32108b66d82a9cb0cfa24886cdfeb" - integrity sha512-USH2jBb+C/hIpwD2iRjp0pe0k+MvzG0mlSn/FIdCgQhUb9ALPRjt2KIQdfZDS9r0ZIeUAg7gOu9KL0PFqGqr5Q== - dependencies: - ajv "^8.0.0" - -ajv-formats@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" - integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== - dependencies: - ajv "^8.0.0" - -ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: - version "3.5.2" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" - integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== - -ajv-keywords@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" - integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== - dependencies: - fast-deep-equal "^3.1.3" - -ajv@6.12.4: - version "6.12.4" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.4.tgz#0614facc4522127fa713445c6bfd3ebd376e2234" - integrity sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ== - dependencies: - 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@6.12.6, ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - 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@8.6.2: - version "8.6.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.6.2.tgz#2fb45e0e5fcbc0813326c1c3da535d1881bb0571" - integrity sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -ajv@^8.0.0, ajv@^8.8.0: - version "8.8.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.8.2.tgz#01b4fef2007a28bf75f0b7fc009f62679de4abbb" - integrity sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -alphanum-sort@^1.0.0, alphanum-sort@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" - integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= - -angular-idle-preload@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/angular-idle-preload/-/angular-idle-preload-3.0.0.tgz#decace34d9fac1cb00000727a6dc5caafdb84e4d" - integrity sha512-W3P2m2B6MHdt1DVunH6H3VWkAZrG3ZwxGcPjedVvIyRhg/LmMtILoizHSxTXw3fsKIEdAPwGObXGpML9WD1jJA== - -angular2-text-mask@9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/angular2-text-mask/-/angular2-text-mask-9.0.0.tgz#70490170a8096241fc3ce9482ed6a758ddbce8ea" - integrity sha512-iALcnhJPS1zvX48d86rgUgDe/crX6XfhZrXC4Gdlo2/YwZW7u7KJZY6/b3ieSCIWVq/E6p+wDCzeo3E6leRjDA== - dependencies: - text-mask-core "^5.0.0" - -angulartics2@^10.0.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/angulartics2/-/angulartics2-10.1.0.tgz#2988f95f25cf6a8dd630d63ea604eb6643e076c3" - integrity sha512-MnwQxRXJkfbBF7417Cs7L/SIuTRNWHCOBnGolZXHFz5ogw1e51KdCKUaUkfgBogR7JpXP279FU9UDkzerIS3xw== - dependencies: - tslib "^2.0.0" - -ansi-align@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" - integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== - dependencies: - string-width "^4.1.0" - -ansi-colors@4.1.1, ansi-colors@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== - -ansi-colors@^3.0.0: - version "3.2.4" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" - integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== - -ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-html-community@^0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" - integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== - -ansi-html@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" - integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - -ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= - -ansi-styles@^3.2.0, ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - -anymatch@^3.0.0, anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -app-root-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-3.0.0.tgz#210b6f43873227e18a4b810a032283311555d5ad" - integrity sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw== - -aproba@^1.0.3, aproba@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== - -arch@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" - integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== - -are-we-there-yet@~1.1.2: - version "1.1.7" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146" - integrity sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g== - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -aria-query@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-3.0.0.tgz#65b3fcc1ca1155a8c9ae64d6eee297f15d5133cc" - integrity sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w= - dependencies: - ast-types-flow "0.0.7" - commander "^2.11.0" - -arity-n@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/arity-n/-/arity-n-1.0.4.tgz#d9e76b11733e08569c0847ae7b39b2860b30b745" - integrity sha1-2edrEXM+CFacCEeuezmyhgswt0U= - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= - -array-flatten@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" - integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== - -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= - dependencies: - array-uniq "^1.0.1" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -array-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= - -arraybuffer.slice@~0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" - integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog== - -arrify@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= - -asn1.js@^5.2.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" - integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - safer-buffer "^2.1.0" - -asn1@~0.2.3: - version "0.2.6" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" - integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= - -assert@^1.1.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" - integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== - dependencies: - object-assign "^4.1.1" - util "0.10.3" - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= - -ast-types-flow@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" - integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= - -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== - -async-each-series@0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/async-each-series/-/async-each-series-0.1.1.tgz#7617c1917401fd8ca4a28aadce3dbae98afeb432" - integrity sha1-dhfBkXQB/Yykooqtzj266Yr+tDI= - -async-each@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" - integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== - -async-limiter@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" - integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== - -async@1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= - -async@^2.6.2: - version "2.6.3" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" - integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== - dependencies: - lodash "^4.17.14" - -async@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.2.tgz#2eb7671034bb2194d45d30e31e24ec7e7f9670cd" - integrity sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= - -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - -autoprefixer@10.2.4: - version "10.2.4" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.2.4.tgz#c0e7cf24fcc6a1ae5d6250c623f0cb8beef2f7e1" - integrity sha512-DCCdUQiMD+P/as8m3XkeTUkUKuuRqLGcwD0nll7wevhqoJfMRpJlkFd1+MQh1pvupjiQuip42lc/VFvfUTMSKw== - dependencies: - browserslist "^4.16.1" - caniuse-lite "^1.0.30001181" - colorette "^1.2.1" - fraction.js "^4.0.13" - normalize-range "^0.1.2" - postcss-value-parser "^4.1.0" - -autoprefixer@9.8.6: - version "9.8.6" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f" - integrity sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg== - dependencies: - browserslist "^4.12.0" - caniuse-lite "^1.0.30001109" - colorette "^1.2.1" - normalize-range "^0.1.2" - num2fraction "^1.2.2" - postcss "^7.0.32" - postcss-value-parser "^4.1.0" - -autoprefixer@^9.6.1: - version "9.8.8" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.8.tgz#fd4bd4595385fa6f06599de749a4d5f7a474957a" - integrity sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA== - dependencies: - browserslist "^4.12.0" - caniuse-lite "^1.0.30001109" - normalize-range "^0.1.2" - num2fraction "^1.2.2" - picocolors "^0.2.1" - postcss "^7.0.32" - postcss-value-parser "^4.1.0" - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= - -aws4@^1.8.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" - integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== - -axe-core@^4.3.3: - version "4.3.5" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.3.5.tgz#78d6911ba317a8262bfee292aeafcc1e04b49cc5" - integrity sha512-WKTW1+xAzhMS5dJsxWkliixlO/PqC4VhmO9T4juNYcaTg9jzWiJsou6m5pxWYGfigWbwzJWeFY6z47a+4neRXA== - -axios@0.21.4: - version "0.21.4" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" - integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== - dependencies: - follow-redirects "^1.14.0" - -axobject-query@2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.0.2.tgz#ea187abe5b9002b377f925d8bf7d1c561adf38f9" - integrity sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww== - dependencies: - ast-types-flow "0.0.7" - -babel-loader@8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3" - integrity sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw== - dependencies: - find-cache-dir "^2.1.0" - loader-utils "^1.4.0" - mkdirp "^0.5.3" - pify "^4.0.1" - schema-utils "^2.6.5" - -babel-loader@8.2.2: - version "8.2.2" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.2.tgz#9363ce84c10c9a40e6c753748e1441b60c8a0b81" - integrity sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g== - dependencies: - find-cache-dir "^3.3.1" - loader-utils "^1.4.0" - make-dir "^3.1.0" - schema-utils "^2.6.5" - -babel-plugin-dynamic-import-node@^2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" - integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== - dependencies: - object.assign "^4.1.0" - -babel-runtime@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - -backo2@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" - integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base64-arraybuffer@0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz#9818c79e059b1355f97e0428a017c838e90ba812" - integrity sha1-mBjHngWbE1X5fgQooBfIOOkLqBI= - -base64-js@^1.0.2, base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -base64id@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" - integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - 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" - -basic-auth@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" - integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== - dependencies: - safe-buffer "5.1.2" - -batch-processor@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/batch-processor/-/batch-processor-1.0.0.tgz#75c95c32b748e0850d10c2b168f6bdbe9891ace8" - integrity sha1-dclcMrdI4IUNEMKxaPa9vpiRrOg= - -batch@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" - integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= - -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= - dependencies: - tweetnacl "^0.14.3" - -bent@~7.3.6: - version "7.3.12" - resolved "https://registry.yarnpkg.com/bent/-/bent-7.3.12.tgz#e0a2775d4425e7674c64b78b242af4f49da6b035" - integrity sha512-T3yrKnVGB63zRuoco/7Ybl7BwwGZR0lceoVG5XmQyMIH9s19SV5m+a8qam4if0zQuAmOQTyPTPmsQBdAorGK3w== - dependencies: - bytesish "^0.4.1" - caseless "~0.12.0" - is-stream "^2.0.0" - -big.js@^3.1.3: - version "3.2.0" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" - integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q== - -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== - -binary-extensions@^1.0.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" - integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -bindings@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" - integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== - dependencies: - file-uri-to-path "1.0.0" - -bl@^4.0.3, bl@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - -blob-util@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/blob-util/-/blob-util-2.0.2.tgz#3b4e3c281111bb7f11128518006cdc60b403a1eb" - integrity sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ== - -blob@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" - integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig== - -blocking-proxy@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/blocking-proxy/-/blocking-proxy-1.0.1.tgz#81d6fd1fe13a4c0d6957df7f91b75e98dac40cb2" - integrity sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA== - dependencies: - minimist "^1.2.0" - -bluebird@^3.5.5, bluebird@^3.7.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== - -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -bn.js@^5.0.0, bn.js@^5.1.1: - version "5.2.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" - integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== - -body-parser@1.19.0, body-parser@^1.19.0: - version "1.19.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" - integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== - dependencies: - 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" - -bonjour@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" - integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= - dependencies: - array-flatten "^2.1.0" - deep-equal "^1.0.1" - dns-equal "^1.0.0" - dns-txt "^2.0.2" - multicast-dns "^6.0.1" - multicast-dns-service-types "^1.1.0" - -boolbase@^1.0.0, boolbase@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= - -bootstrap@4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.3.1.tgz#280ca8f610504d99d7b6b4bfc4b68cec601704ac" - integrity sha512-rXqOmH1VilAt2DyPzluTi2blhk17bO7ef+zLLPlWvG494pDxcM234pJ8wTc/6R40UWizAIIMgxjvxZg5kmsbag== - -boxen@^5.0.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" - integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== - dependencies: - ansi-align "^3.0.0" - camelcase "^6.2.0" - chalk "^4.1.0" - cli-boxes "^2.2.1" - string-width "^4.2.2" - type-fest "^0.20.2" - widest-line "^3.1.0" - wrap-ansi "^7.0.0" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^2.3.1, braces@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - 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" - -braces@^3.0.1, braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -brorand@^1.0.1, brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= - -browser-process-hrtime@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" - integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== - -browser-sync-client@^2.27.7: - version "2.27.7" - resolved "https://registry.yarnpkg.com/browser-sync-client/-/browser-sync-client-2.27.7.tgz#e09dce1add876984cf8232de95d2332d29401a64" - integrity sha512-wKg9UP9a4sCIkBBAXUdbkdWFJzfSAQizGh+nC19W9y9zOo9s5jqeYRFUUbs7x5WKhjtspT+xetVp9AtBJ6BmWg== - dependencies: - etag "1.8.1" - fresh "0.5.2" - mitt "^1.1.3" - rxjs "^5.5.6" - -browser-sync-ui@^2.27.7: - version "2.27.7" - resolved "https://registry.yarnpkg.com/browser-sync-ui/-/browser-sync-ui-2.27.7.tgz#38cd65f7ba058544310591ad8ac2e7fdf29934f2" - integrity sha512-Bt4OQpx9p18OIzk0KKyu7jqlvmjacasUlk8ARY3uuIyiFWSBiRgr2i6XY8dEMF14DtbooaEBOpHEu9VCYvMcCw== - dependencies: - async-each-series "0.1.1" - connect-history-api-fallback "^1" - immutable "^3" - server-destroy "1.0.1" - socket.io-client "^2.4.0" - stream-throttle "^0.1.3" - -browser-sync@^2.26.7: - version "2.27.7" - resolved "https://registry.yarnpkg.com/browser-sync/-/browser-sync-2.27.7.tgz#65ec55d6c6e33283e505e06e5113bc32d9d0a8f0" - integrity sha512-9ElnnA/u+s2Jd+IgY+2SImB+sAEIteHsMG0NR96m7Ph/wztpvJCUpyC2on1KqmG9iAp941j+5jfmd34tEguGbg== - dependencies: - browser-sync-client "^2.27.7" - browser-sync-ui "^2.27.7" - bs-recipes "1.3.4" - bs-snippet-injector "^2.0.1" - chokidar "^3.5.1" - connect "3.6.6" - connect-history-api-fallback "^1" - dev-ip "^1.0.1" - easy-extender "^2.3.4" - eazy-logger "3.1.0" - etag "^1.8.1" - fresh "^0.5.2" - fs-extra "3.0.1" - http-proxy "^1.18.1" - immutable "^3" - localtunnel "^2.0.1" - micromatch "^4.0.2" - 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.4.0" - ua-parser-js "1.0.2" - yargs "^15.4.1" - -browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== - dependencies: - 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@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" - integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" - integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" - integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== - dependencies: - bn.js "^5.0.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" - integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== - dependencies: - 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" - -browserify-zlib@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" - integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== - dependencies: - pako "~1.0.5" - -browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.16.0, browserslist@^4.16.1, browserslist@^4.16.6, browserslist@^4.17.5, browserslist@^4.18.1, browserslist@^4.6.4, browserslist@^4.9.1: - version "4.18.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.18.1.tgz#60d3920f25b6860eb917c6c7b185576f4d8b017f" - integrity sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ== - dependencies: - caniuse-lite "^1.0.30001280" - electron-to-chromium "^1.3.896" - escalade "^3.1.1" - node-releases "^2.0.1" - picocolors "^1.0.0" - -browserstack@^1.5.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/browserstack/-/browserstack-1.6.1.tgz#e051f9733ec3b507659f395c7a4765a1b1e358b3" - integrity sha512-GxtFjpIaKdbAyzHfFDKixKO8IBT7wR3NjbzrGc78nNs/Ciys9wU3/nBtsqsWv5nDSrdI5tz0peKuzCPuNXNUiw== - dependencies: - https-proxy-agent "^2.2.1" - -bs-recipes@1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/bs-recipes/-/bs-recipes-1.3.4.tgz#0d2d4d48a718c8c044769fdc4f89592dc8b69585" - integrity sha1-DS1NSKcYyMBEdp/cT4lZLci2lYU= - -bs-snippet-injector@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/bs-snippet-injector/-/bs-snippet-injector-2.0.1.tgz#61b5393f11f52559ed120693100343b6edb04dd5" - integrity sha1-YbU5PxH1JVntEgaTEANDtu2wTdU= - -buffer-crc32@~0.2.3: - version "0.2.13" - resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" - integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer-indexof@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" - integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== - -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= - -buffer@^4.3.0: - version "4.9.2" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" - integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" - -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -builtin-modules@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= - -builtin-status-codes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= - -builtins@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" - integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og= - -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= - -bytes@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" - integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== - -bytes@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.1.tgz#3f018291cb4cbad9accb6e6970bca9c8889e879a" - integrity sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg== - -bytesish@^0.4.1: - version "0.4.4" - resolved "https://registry.yarnpkg.com/bytesish/-/bytesish-0.4.4.tgz#f3b535a0f1153747427aee27256748cff92347e6" - integrity sha512-i4uu6M4zuMUiyfZN4RU2+i9+peJh//pXhd9x1oSe1LBkZ3LEbCoygu8W0bXTukU1Jme2txKuotpCZRaC3FLxcQ== - -cacache@15.0.5: - version "15.0.5" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.0.5.tgz#69162833da29170d6732334643c60e005f5f17d0" - integrity sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A== - dependencies: - "@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" - -cacache@^12.0.2: - version "12.0.4" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" - integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== - dependencies: - 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" - -cacache@^13.0.1: - version "13.0.1" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-13.0.1.tgz#a8000c21697089082f85287a1aec6e382024a71c" - integrity sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w== - dependencies: - chownr "^1.1.2" - figgy-pudding "^3.5.1" - fs-minipass "^2.0.0" - glob "^7.1.4" - graceful-fs "^4.2.2" - infer-owner "^1.0.4" - lru-cache "^5.1.1" - minipass "^3.0.0" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.2" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - p-map "^3.0.0" - promise-inflight "^1.0.1" - rimraf "^2.7.1" - ssri "^7.0.0" - unique-filename "^1.1.1" - -cacache@^15.0.4, cacache@^15.0.5: - version "15.3.0" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" - integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== - dependencies: - "@npmcli/fs" "^1.0.0" - "@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.1" - tar "^6.0.2" - unique-filename "^1.1.1" - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - 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" - -cacheable-request@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" - integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== - dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" - keyv "^3.0.0" - lowercase-keys "^2.0.0" - normalize-url "^4.1.0" - responselike "^1.0.2" - -cachedir@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.3.0.tgz#0c75892a052198f0b21c7c1804d8331edfcae0e8" - integrity sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw== - -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -caller-callsite@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" - integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= - dependencies: - callsites "^2.0.0" - -caller-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" - integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= - dependencies: - caller-callsite "^2.0.0" - -callsites@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" - integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camel-case@^4.1.1: - version "4.1.2" - resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" - integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== - dependencies: - pascal-case "^3.1.2" - tslib "^2.0.3" - -camelcase@5.3.1, camelcase@^5.0.0, camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.0.0, camelcase@^6.2.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.1.tgz#250fd350cfd555d0d2160b1d51510eaf8326e86e" - integrity sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA== - -caniuse-api@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" - integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== - dependencies: - browserslist "^4.0.0" - caniuse-lite "^1.0.0" - lodash.memoize "^4.1.2" - lodash.uniq "^4.5.0" - -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001032, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001165, caniuse-lite@^1.0.30001181, caniuse-lite@^1.0.30001280: - version "1.0.30001285" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001285.tgz#fe1e52229187e11d6670590790d669b9e03315b7" - integrity sha512-KAOkuUtcQ901MtmvxfKD+ODHH9YVDYnBt+TGYSz2KIfnq22CiArbUxXPN9067gNbgMlnNYRSwho8OPXZPALB9Q== - -canonical-path@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/canonical-path/-/canonical-path-1.0.0.tgz#fcb470c23958def85081856be7a86e904f180d1d" - integrity sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg== - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= - -cerialize@0.1.18: - version "0.1.18" - resolved "https://registry.yarnpkg.com/cerialize/-/cerialize-0.1.18.tgz#d0f4f1b61cec7e4ed16a3eda0cac2bc99787414d" - integrity sha512-C/hp4UoPrMK060251Pt/21axF9aL4ceJlg3+pThB68VghhRjOzBzy4f8R9AirXdNB4gpqgaV2deU3UaexInL5w== - dependencies: - typescript "^2.5.0" - -chalk@^1.1.1, chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= - dependencies: - 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" - -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.0.0, chalk@^4.1.0, chalk@~4.1.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - -charenc@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" - integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc= - -check-more-types@^2.24.0: - version "2.24.0" - resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600" - integrity sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA= - -"chokidar@>=2.0.0 <4.0.0", chokidar@^3.0.0, chokidar@^3.3.0, chokidar@^3.4.1, chokidar@^3.4.2, chokidar@^3.5.1, chokidar@^3.5.2: - version "3.5.2" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" - integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -chokidar@^2.1.8: - version "2.1.8" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" - integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== - dependencies: - anymatch "^2.0.0" - async-each "^1.0.1" - braces "^2.3.2" - 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" - optionalDependencies: - fsevents "^1.2.7" - -chownr@^1.1.1, chownr@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== - -chownr@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" - integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== - -chrome-trace-event@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" - integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== - -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - -ci-info@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.0.tgz#b4ed1fb6818dea4803a55c623041f9165d2066b2" - integrity sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw== - -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -circular-dependency-plugin@5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/circular-dependency-plugin/-/circular-dependency-plugin-5.2.0.tgz#e09dbc2dd3e2928442403e2d45b41cea06bc0a93" - integrity sha512-7p4Kn/gffhQaavNfyDFg7LS5S/UT1JAjyGd4UqR2+jzoYF02eDkj0Ec3+48TsIa4zghjLY87nQHIh/ecK9qLdw== - -circular-dependency-plugin@5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/circular-dependency-plugin/-/circular-dependency-plugin-5.2.2.tgz#39e836079db1d3cf2f988dc48c5188a44058b600" - integrity sha512-g38K9Cm5WRwlaH6g03B9OEz/0qRizI+2I7n+Gz+L5DxXJAPAiWQvwlYNm1V1jkdpUv95bOe/ASm2vfi/G560jQ== - -circular-json@^0.5.0: - version "0.5.9" - resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.5.9.tgz#932763ae88f4f7dead7a0d09c8a51a4743a53b1d" - integrity sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ== - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -classnames@^2.2.5, classnames@^2.2.6: - version "2.3.1" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" - integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== - -clean-css@^4.2.3: - version "4.2.4" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.4.tgz#733bf46eba4e607c6891ea57c24a989356831178" - integrity sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A== - dependencies: - source-map "~0.6.0" - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cli-boxes@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" - integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== - -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-progress@^3.8.0: - version "3.9.1" - resolved "https://registry.yarnpkg.com/cli-progress/-/cli-progress-3.9.1.tgz#a22eba6a20f53289fdd05d5ee8cb2cc8c28f866e" - integrity sha512-AXxiCe2a0Lm0VN+9L0jzmfQSkcZm5EYspfqXKaSIQKqIk+0hnkZ3/v1E9B39mkD6vYhKih3c/RPsJBSwq9O99Q== - dependencies: - colors "^1.1.2" - string-width "^4.2.0" - -cli-spinners@^2.5.0: - version "2.6.1" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" - integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== - -cli-table3@~0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.0.tgz#b7b1bc65ca8e7b5cef9124e13dc2b21e2ce4faee" - integrity sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ== - dependencies: - object-assign "^4.1.0" - string-width "^4.2.0" - optionalDependencies: - colors "^1.1.2" - -cli-truncate@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" - integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== - dependencies: - slice-ansi "^3.0.0" - string-width "^4.2.0" - -cli-width@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" - integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== - -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== - dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" - -cliui@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" - integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^6.2.0" - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -clone-deep@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" - integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== - dependencies: - is-plain-object "^2.0.4" - kind-of "^6.0.2" - shallow-clone "^3.0.0" - -clone-response@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" - integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= - dependencies: - mimic-response "^1.0.0" - -clone@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= - -clone@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" - integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= - -clsx@^1.0.4: - version "1.1.1" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" - integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== - -coa@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" - integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== - dependencies: - "@types/q" "^1.5.1" - chalk "^2.4.1" - q "^1.1.2" - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= - -codelyzer@^6.0.0: - version "6.0.2" - resolved "https://registry.yarnpkg.com/codelyzer/-/codelyzer-6.0.2.tgz#25d72eae641e8ff13ffd7d99b27c9c7ad5d7e135" - integrity sha512-v3+E0Ucu2xWJMOJ2fA/q9pDT/hlxHftHGPUay1/1cTgyPV5JTHFdO9hqo837Sx2s9vKBMTt5gO+lhF95PO6J+g== - dependencies: - "@angular/compiler" "9.0.0" - "@angular/core" "9.0.0" - app-root-path "^3.0.0" - 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" - rxjs "^6.5.3" - semver-dsl "^1.0.1" - source-map "^0.5.7" - sprintf-js "^1.1.2" - tslib "^1.10.0" - zone.js "~0.10.3" - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.9.0, color-convert@^1.9.3: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -color-name@^1.0.0, color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -color-string@^1.6.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.0.tgz#63b6ebd1bec11999d1df3a79a7569451ac2be8aa" - integrity sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ== - dependencies: - color-name "^1.0.0" - simple-swizzle "^0.2.2" - -color@^3.0.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" - integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== - dependencies: - color-convert "^1.9.3" - color-string "^1.6.0" - -colord@^2.9.1: - version "2.9.1" - resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.1.tgz#c961ea0efeb57c9f0f4834458f26cb9cc4a3f90e" - integrity sha512-4LBMSt09vR0uLnPVkOUBnmxgoaeN4ewRbx801wY/bXcltXfpR/G46OdWn96XpYmCWuYvO46aBZP4NgX8HpNAcw== - -colorette@^1.2.1, colorette@^1.2.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" - integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== - -colorette@^2.0.10, colorette@^2.0.14, colorette@^2.0.16: - version "2.0.16" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" - integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== - -colors@1.4.0, colors@^1.1.2, colors@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" - integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== - -combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -commander@^2.11.0, commander@^2.12.1, commander@^2.2.0, commander@^2.20.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commander@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" - integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== - -commander@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" - integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== - -commander@^7.0.0, commander@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - -common-tags@^1.8.0: - version "1.8.2" - resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" - integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= - -component-bind@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" - integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E= - -component-emitter@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" - integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= - -component-emitter@^1.2.1, component-emitter@~1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - -component-inherit@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" - integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM= - -compose-function@3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/compose-function/-/compose-function-3.0.3.tgz#9ed675f13cc54501d30950a486ff6a7ba3ab185f" - integrity sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8= - dependencies: - arity-n "^1.0.4" - -compressible@~2.0.16: - version "2.0.18" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" - integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== - dependencies: - mime-db ">= 1.43.0 < 2" - -compression-webpack-plugin@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/compression-webpack-plugin/-/compression-webpack-plugin-3.1.0.tgz#9f510172a7b5fae5aad3b670652e8bd7997aeeca" - integrity sha512-iqTHj3rADN4yHwXMBrQa/xrncex/uEQy8QHlaTKxGchT/hC0SdlJlmL/5eRqffmWq2ep0/Romw6Ld39JjTR/ug== - dependencies: - cacache "^13.0.1" - find-cache-dir "^3.0.0" - neo-async "^2.5.0" - schema-utils "^2.6.1" - serialize-javascript "^2.1.2" - webpack-sources "^1.0.1" - -compression@^1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== - dependencies: - 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" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -concat-stream@^1.5.0: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -configstore@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" - integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== - dependencies: - dot-prop "^5.2.0" - graceful-fs "^4.1.2" - make-dir "^3.0.0" - unique-string "^2.0.0" - write-file-atomic "^3.0.0" - xdg-basedir "^4.0.0" - -connect-history-api-fallback@^1, connect-history-api-fallback@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" - integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== - -connect@3.6.6: - version "3.6.6" - resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.6.tgz#09eff6c55af7236e137135a72574858b6786f524" - integrity sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ= - dependencies: - debug "2.6.9" - finalhandler "1.1.0" - parseurl "~1.3.2" - utils-merge "1.0.1" - -connect@^3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" - integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== - dependencies: - debug "2.6.9" - finalhandler "1.1.2" - parseurl "~1.3.3" - utils-merge "1.0.1" - -console-browserify@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" - integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== - -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= - -constants-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" - integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= - -content-disposition@0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" - integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== - dependencies: - safe-buffer "5.1.2" - -content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== - -convert-source-map@1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" - integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== - dependencies: - safe-buffer "~5.1.1" - -convert-source-map@^0.3.3: - version "0.3.5" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190" - integrity sha1-8dgClQr33SYxof6+BZZVDIarMZA= - -convert-source-map@^1.5.1, convert-source-map@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" - -cookie-parser@1.4.5: - version "1.4.5" - resolved "https://registry.yarnpkg.com/cookie-parser/-/cookie-parser-1.4.5.tgz#3e572d4b7c0c80f9c61daf604e4336831b5d1d49" - integrity sha512-f13bPUj/gG/5mDr+xLmSxxDsB9DQiTIfhJS/sqjrmfAWiAN+x2O4i/XguTL9yDZ+/IFDanJ+5x7hC4CXT9Tdzw== - dependencies: - cookie "0.4.0" - cookie-signature "1.0.6" - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= - -cookie@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" - integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== - -cookie@~0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" - integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== - -copy-anything@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/copy-anything/-/copy-anything-2.0.3.tgz#842407ba02466b0df844819bbe3baebbe5d45d87" - integrity sha512-GK6QUtisv4fNS+XcI7shX0Gx9ORg7QqIznyfho79JTnX1XhLiyZHfftvGiziqzRiEi/Bjhgpi+D2o7HxJFPnDQ== - dependencies: - is-what "^3.12.0" - -copy-concurrently@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" - integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== - dependencies: - aproba "^1.1.1" - fs-write-stream-atomic "^1.0.8" - iferr "^0.1.5" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.0" - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= - -copy-to-clipboard@^3: - version "3.3.1" - resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz#115aa1a9998ffab6196f93076ad6da3b913662ae" - integrity sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw== - dependencies: - toggle-selection "^1.0.6" - -copy-webpack-plugin@6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-6.0.3.tgz#2b3d2bfc6861b96432a65f0149720adbd902040b" - integrity sha512-q5m6Vz4elsuyVEIUXr7wJdIdePWTubsqVbEMvf1WQnHGv0Q+9yPRu7MtYFPt+GBOXRav9lvIINifTQ1vSCs+eA== - dependencies: - cacache "^15.0.4" - fast-glob "^3.2.4" - 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 "^3.0.1" - schema-utils "^2.7.0" - serialize-javascript "^4.0.0" - webpack-sources "^1.4.3" - -copy-webpack-plugin@6.3.2: - version "6.3.2" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-6.3.2.tgz#0e920a6c181a5052aa6e2861b164bda03f83afeb" - integrity sha512-MgJ1uouLIbDg4ST1GzqrGQyKoXY5iPqi6fghFqarijam7FQcBa/r6Rg0VkoIuzx75Xq8iAMghyOueMkWUQ5OaA== - dependencies: - cacache "^15.0.5" - fast-glob "^3.2.4" - 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 "^3.0.2" - schema-utils "^3.0.0" - serialize-javascript "^5.0.1" - webpack-sources "^1.4.3" - -copy-webpack-plugin@^6.4.1: - version "6.4.1" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-6.4.1.tgz#138cd9b436dbca0a6d071720d5414848992ec47e" - integrity sha512-MXyPCjdPVx5iiWyl40Va3JGh27bKzOTNY3NjUTrosD2q7dR/cLD0013uqJ3BpFbUjyONINjb6qI7nDIJujrMbA== - dependencies: - cacache "^15.0.5" - fast-glob "^3.2.4" - 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 "^3.0.2" - schema-utils "^3.0.0" - serialize-javascript "^5.0.1" - webpack-sources "^1.4.3" - -core-js-compat@^3.6.2, core-js-compat@^3.8.0: - version "3.19.3" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.19.3.tgz#de75e5821c5ce924a0a1e7b7d5c2cb973ff388aa" - integrity sha512-59tYzuWgEEVU9r+SRgceIGXSSUn47JknoiXW6Oq7RW8QHjXWz3/vp8pa7dbtuVu40sewz3OP3JmQEcDdztrLhA== - dependencies: - browserslist "^4.18.1" - semver "7.0.0" - -core-js@3.6.4: - version "3.6.4" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.4.tgz#440a83536b458114b9cb2ac1580ba377dc470647" - integrity sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw== - -core-js@3.8.3: - version "3.8.3" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.8.3.tgz#c21906e1f14f3689f93abcc6e26883550dd92dd0" - integrity sha512-KPYXeVZYemC2TkNEkX/01I+7yd+nX3KddKwZ1Ww7SKWdI2wQprSgLmrTddT8nw92AjEklTsPBoSdQBhbI1bQ6Q== - -core-js@^2.4.0: - version "2.6.12" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" - integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== - -core-js@^3.7.0: - version "3.19.3" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.19.3.tgz#6df8142a996337503019ff3235a7022d7cdf4559" - integrity sha512-LeLBMgEGSsG7giquSzvgBrTS7V5UL6ks3eQlUSbN8dJStlLFiRzUm5iqsRyzUB8carhfKjkJ2vzKqE6z1Vga9g== - -core-util-is@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cosmiconfig@^5.0.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" - integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== - dependencies: - import-fresh "^2.0.0" - is-directory "^0.3.1" - js-yaml "^3.13.1" - parse-json "^4.0.0" - -cosmiconfig@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" - integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== - dependencies: - "@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" - -cosmiconfig@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" - integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.2.1" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.10.0" - -create-ecdh@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" - integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== - dependencies: - bn.js "^4.1.0" - elliptic "^6.5.3" - -create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== - dependencies: - 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@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - -critters@0.0.12: - version "0.0.12" - resolved "https://registry.yarnpkg.com/critters/-/critters-0.0.12.tgz#32baa87526e053a41b67e19921673ed92264e2ab" - integrity sha512-ujxKtKc/mWpjrOKeaACTaQ1aP0O31M0ZPWhfl85jZF1smPU4Ivb9va5Ox2poif4zVJQQo0LCFlzGtEZAsCAPcw== - dependencies: - chalk "^4.1.0" - css-select "^4.1.3" - parse5 "^6.0.1" - parse5-htmlparser2-tree-adapter "^6.0.1" - postcss "^8.3.7" - pretty-bytes "^5.3.0" - -critters@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/critters/-/critters-0.0.7.tgz#548b470360f4f3c51e622de3b7aa733c8f0b17bf" - integrity sha512-qUF2SaAWFYjNPdCcPpu68p2DnHiosia84yx5mPTlUMQjkjChR+n6sO1/I7yn2U2qNDgSPTd2SoaTIDQcUL+EwQ== - dependencies: - chalk "^4.1.0" - css "^3.0.0" - parse5 "^6.0.1" - parse5-htmlparser2-tree-adapter "^6.0.1" - pretty-bytes "^5.3.0" - -cross-env@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" - integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== - dependencies: - cross-spawn "^7.0.1" - -cross-spawn@^6.0.0: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -crypt@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" - integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs= - -crypto-browserify@^3.11.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== - dependencies: - 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@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" - integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== - -css-blank-pseudo@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz#dfdefd3254bf8a82027993674ccf35483bfcb3c5" - integrity sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w== - dependencies: - postcss "^7.0.5" - -css-box-model@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/css-box-model/-/css-box-model-1.2.1.tgz#59951d3b81fd6b2074a62d49444415b0d2b4d7c1" - integrity sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw== - dependencies: - tiny-invariant "^1.0.6" - -css-color-names@0.0.4, css-color-names@^0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" - integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= - -css-declaration-sorter@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" - integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA== - dependencies: - postcss "^7.0.1" - timsort "^0.3.0" - -css-declaration-sorter@^6.0.3: - version "6.1.3" - resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.1.3.tgz#e9852e4cf940ba79f509d9425b137d1f94438dc2" - integrity sha512-SvjQjNRZgh4ULK1LDJ2AduPKUKxIqmtU7ZAyi47BTV+M90Qvxr9AB6lKlLbDUfXqI9IQeYA8LbAsCZPpJEV3aA== - dependencies: - timsort "^0.3.0" - -css-has-pseudo@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz#3c642ab34ca242c59c41a125df9105841f6966ee" - integrity sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ== - dependencies: - postcss "^7.0.6" - postcss-selector-parser "^5.0.0-rc.4" - -css-loader@3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.4.0.tgz#9fb263436783117a41d014e45e8eaeba54dd6670" - integrity sha512-JornYo4RAXl1Mzt0lOSVPmArzAMV3rGY2VuwtaDc732WTWjdwTaeS19nCGWMcSCf305Q396lhhDAJEWWM0SgPQ== - dependencies: - 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.23" - postcss-modules-extract-imports "^2.0.0" - postcss-modules-local-by-default "^3.0.2" - postcss-modules-scope "^2.1.1" - postcss-modules-values "^3.0.0" - postcss-value-parser "^4.0.2" - schema-utils "^2.6.0" - -css-loader@4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-4.2.2.tgz#b668b3488d566dc22ebcf9425c5f254a05808c89" - integrity sha512-omVGsTkZPVwVRpckeUnLshPp12KsmMSLqYxs12+RzM9jRR5Y+Idn/tBffjXRvOE+qW7if24cuceFJqYR5FmGBg== - dependencies: - camelcase "^6.0.0" - cssesc "^3.0.0" - icss-utils "^4.1.1" - loader-utils "^2.0.0" - postcss "^7.0.32" - postcss-modules-extract-imports "^2.0.0" - postcss-modules-local-by-default "^3.0.3" - postcss-modules-scope "^2.2.0" - postcss-modules-values "^3.0.0" - postcss-value-parser "^4.1.0" - schema-utils "^2.7.0" - semver "^7.3.2" - -css-loader@5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-5.0.1.tgz#9e4de0d6636a6266a585bd0900b422c85539d25f" - integrity sha512-cXc2ti9V234cq7rJzFKhirb2L2iPy8ZjALeVJAozXYz9te3r4eqLSixNAbMDJSgJEQywqXzs8gonxaboeKqwiw== - dependencies: - camelcase "^6.2.0" - cssesc "^3.0.0" - icss-utils "^5.0.0" - loader-utils "^2.0.0" - postcss "^8.1.4" - postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.0" - postcss-modules-scope "^3.0.0" - postcss-modules-values "^4.0.0" - postcss-value-parser "^4.1.0" - schema-utils "^3.0.0" - semver "^7.3.2" - -css-parse@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/css-parse/-/css-parse-2.0.0.tgz#a468ee667c16d81ccf05c58c38d2a97c780dbfd4" - integrity sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q= - dependencies: - css "^2.0.0" - -css-prefers-color-scheme@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz#6f830a2714199d4f0d0d0bb8a27916ed65cff1f4" - integrity sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg== - dependencies: - postcss "^7.0.5" - -css-select-base-adapter@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" - integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== - -css-select@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" - integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== - dependencies: - boolbase "^1.0.0" - css-what "^3.2.1" - domutils "^1.7.0" - nth-check "^1.0.2" - -css-select@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.1.3.tgz#a70440f70317f2669118ad74ff105e65849c7067" - integrity sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA== - dependencies: - boolbase "^1.0.0" - css-what "^5.0.0" - domhandler "^4.2.0" - domutils "^2.6.0" - nth-check "^2.0.0" - -css-selector-tokenizer@^0.7.1: - version "0.7.3" - resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz#735f26186e67c749aaf275783405cf0661fae8f1" - integrity sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg== - dependencies: - cssesc "^3.0.0" - fastparse "^1.1.2" - -css-tree@1.0.0-alpha.37: - version "1.0.0-alpha.37" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" - integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== - dependencies: - mdn-data "2.0.4" - source-map "^0.6.1" - -css-tree@^1.1.2, css-tree@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" - integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== - dependencies: - mdn-data "2.0.14" - source-map "^0.6.1" - -css-vendor@^2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/css-vendor/-/css-vendor-2.0.8.tgz#e47f91d3bd3117d49180a3c935e62e3d9f7f449d" - integrity sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ== - dependencies: - "@babel/runtime" "^7.8.3" - is-in-browser "^1.0.2" - -css-what@^3.2.1: - version "3.4.2" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" - integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== - -css-what@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.1.0.tgz#3f7b707aadf633baf62c2ceb8579b545bb40f7fe" - integrity sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw== - -css@^2.0.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" - integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw== - dependencies: - inherits "^2.0.3" - source-map "^0.6.1" - source-map-resolve "^0.5.2" - urix "^0.1.0" - -css@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/css/-/css-3.0.0.tgz#4447a4d58fdd03367c516ca9f64ae365cee4aa5d" - integrity sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ== - dependencies: - inherits "^2.0.4" - source-map "^0.6.1" - source-map-resolve "^0.6.0" - -cssauron@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/cssauron/-/cssauron-1.4.0.tgz#a6602dff7e04a8306dc0db9a551e92e8b5662ad8" - integrity sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg= - dependencies: - through X.X.X - -cssdb@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0" - integrity sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ== - -cssesc@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" - integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg== - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -cssnano-preset-default@^4.0.7, cssnano-preset-default@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz#920622b1fc1e95a34e8838203f1397a504f2d3ff" - integrity sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ== - dependencies: - 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.3" - postcss-unique-selectors "^4.0.1" - -cssnano-preset-default@^5.0.1: - version "5.1.8" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.1.8.tgz#7525feb1b72f7b06e57f55064cbdae341d79dea2" - integrity sha512-zWMlP0+AMPBVE852SqTrP0DnhTcTA2C1wAF92TKZ3Va+aUVqLIhkqKlnJIXXdqXD7RN+S1ujuWmNpvrJBiM/vg== - dependencies: - css-declaration-sorter "^6.0.3" - cssnano-utils "^2.0.1" - postcss-calc "^8.0.0" - postcss-colormin "^5.2.1" - postcss-convert-values "^5.0.2" - postcss-discard-comments "^5.0.1" - postcss-discard-duplicates "^5.0.1" - postcss-discard-empty "^5.0.1" - postcss-discard-overridden "^5.0.1" - postcss-merge-longhand "^5.0.4" - postcss-merge-rules "^5.0.3" - postcss-minify-font-values "^5.0.1" - postcss-minify-gradients "^5.0.3" - postcss-minify-params "^5.0.2" - postcss-minify-selectors "^5.1.0" - postcss-normalize-charset "^5.0.1" - postcss-normalize-display-values "^5.0.1" - postcss-normalize-positions "^5.0.1" - postcss-normalize-repeat-style "^5.0.1" - postcss-normalize-string "^5.0.1" - postcss-normalize-timing-functions "^5.0.1" - postcss-normalize-unicode "^5.0.1" - postcss-normalize-url "^5.0.3" - postcss-normalize-whitespace "^5.0.1" - postcss-ordered-values "^5.0.2" - postcss-reduce-initial "^5.0.2" - postcss-reduce-transforms "^5.0.1" - postcss-svgo "^5.0.3" - postcss-unique-selectors "^5.0.2" - -cssnano-util-get-arguments@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" - integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= - -cssnano-util-get-match@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" - integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= - -cssnano-util-raw-cache@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" - integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== - dependencies: - postcss "^7.0.0" - -cssnano-util-same-parent@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" - integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== - -cssnano-utils@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-2.0.1.tgz#8660aa2b37ed869d2e2f22918196a9a8b6498ce2" - integrity sha512-i8vLRZTnEH9ubIyfdZCAdIdgnHAUeQeByEeQ2I7oTilvP9oHO6RScpeq3GsFUVqeB8uZgOQ9pw8utofNn32hhQ== - -cssnano@4.1.10: - version "4.1.10" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2" - integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ== - dependencies: - cosmiconfig "^5.0.0" - cssnano-preset-default "^4.0.7" - is-resolvable "^1.0.0" - postcss "^7.0.0" - -cssnano@5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.0.2.tgz#3f6de4fd5ecb7b5fb636c1a606de5f38cd241493" - integrity sha512-8JK3EnPsjQsULme9/e5M2hF564f/480hwsdcHvQ7ZtAIMfQ1O3SCfs+b8Mjf5KJxhYApyRshR2QSovEJi2K72Q== - dependencies: - cosmiconfig "^7.0.0" - cssnano-preset-default "^5.0.1" - is-resolvable "^1.1.0" - -cssnano@^4.1.10: - version "4.1.11" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.11.tgz#c7b5f5b81da269cb1fd982cb960c1200910c9a99" - integrity sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g== - dependencies: - cosmiconfig "^5.0.0" - cssnano-preset-default "^4.0.8" - is-resolvable "^1.0.0" - postcss "^7.0.0" - -csso@^4.0.2, csso@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" - integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== - dependencies: - css-tree "^1.1.2" - -cssom@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" - integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== - -cssom@~0.3.6: - version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== - -cssstyle@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" - integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== - dependencies: - cssom "~0.3.6" - -csstype@^2.5.2: - version "2.6.19" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.19.tgz#feeb5aae89020bb389e1f63669a5ed490e391caa" - integrity sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ== - -csstype@^3.0.2: - version "3.0.10" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.10.tgz#2ad3a7bed70f35b965707c092e5f30b327c290e5" - integrity sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA== - -custom-event@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" - integrity sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU= - -cyclist@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" - integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= - -cypress-axe@^0.13.0: - version "0.13.0" - resolved "https://registry.yarnpkg.com/cypress-axe/-/cypress-axe-0.13.0.tgz#3234e1a79a27701f2451fcf2f333eb74204c7966" - integrity sha512-fCIy7RiDCm7t30U3C99gGwQrUO307EYE1QqXNaf9ToK4DVqW8y5on+0a/kUHMrHdlls2rENF6TN9ZPpPpwLrnw== - -cypress@8.6.0: - version "8.6.0" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-8.6.0.tgz#8d02fa58878b37cfc45bbfce393aa974fa8a8e22" - integrity sha512-F7qEK/6Go5FsqTueR+0wEw2vOVKNgk5847Mys8vsWkzPoEKdxs+7N9Y1dit+zhaZCLtMPyrMwjfA53ZFy+lSww== - dependencies: - "@cypress/request" "^2.88.6" - "@cypress/xvfb" "^1.2.4" - "@types/node" "^14.14.31" - "@types/sinonjs__fake-timers" "^6.0.2" - "@types/sizzle" "^2.3.2" - arch "^2.2.0" - blob-util "^2.0.2" - bluebird "^3.7.2" - cachedir "^2.3.0" - chalk "^4.1.0" - check-more-types "^2.24.0" - cli-cursor "^3.1.0" - cli-table3 "~0.6.0" - commander "^5.1.0" - common-tags "^1.8.0" - dayjs "^1.10.4" - debug "^4.3.2" - enquirer "^2.3.6" - eventemitter2 "^6.4.3" - execa "4.1.0" - executable "^4.1.1" - extract-zip "2.0.1" - figures "^3.2.0" - fs-extra "^9.1.0" - getos "^3.2.1" - is-ci "^3.0.0" - is-installed-globally "~0.4.0" - lazy-ass "^1.6.0" - listr2 "^3.8.3" - lodash "^4.17.21" - log-symbols "^4.0.0" - minimist "^1.2.5" - ospath "^1.2.2" - pretty-bytes "^5.6.0" - proxy-from-env "1.0.0" - ramda "~0.27.1" - request-progress "^3.0.0" - supports-color "^8.1.1" - tmp "~0.2.1" - untildify "^4.0.0" - url "^0.11.0" - yauzl "^2.10.0" - -d@1, d@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" - integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== - dependencies: - es5-ext "^0.10.50" - type "^1.0.1" - -damerau-levenshtein@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz#64368003512a1a6992593741a09a9d31a836f55d" - integrity sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw== - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= - dependencies: - assert-plus "^1.0.0" - -data-urls@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" - integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== - dependencies: - abab "^2.0.3" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.0.0" - -date-format@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/date-format/-/date-format-2.1.0.tgz#31d5b5ea211cf5fd764cd38baf9d033df7e125cf" - integrity sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA== - -date-format@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/date-format/-/date-format-3.0.0.tgz#eb8780365c7d2b1511078fb491e6479780f3ad95" - integrity sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w== - -dayjs@^1.10.4: - version "1.10.7" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.10.7.tgz#2cf5f91add28116748440866a0a1d26f3a6ce468" - integrity sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig== - -debug-loader@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/debug-loader/-/debug-loader-0.0.1.tgz#44dc37e09e3c39e6af334681960f70a534a9d056" - integrity sha1-RNw34J48OeavM0aBlg9wpTSp0FY= - dependencies: - loader-utils "^0.2.12" - -debug@2.6.9, debug@^2.2.0, debug@^2.3.3: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.2: - version "4.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" - integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== - dependencies: - ms "2.1.2" - -debug@4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" - integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== - dependencies: - ms "2.1.2" - -debug@4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" - integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== - dependencies: - ms "2.1.2" - -debug@^3.1.0, debug@^3.1.1, debug@^3.2.5, debug@^3.2.6, debug@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debug@~3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== - dependencies: - ms "2.0.0" - -debug@~4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== - dependencies: - ms "^2.1.1" - -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - -decimal.js@^10.2.1: - version "10.3.1" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" - integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== - -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= - -decompress-response@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= - dependencies: - mimic-response "^1.0.0" - -deep-equal@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" - integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== - dependencies: - 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@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -deep-freeze@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/deep-freeze/-/deep-freeze-0.0.1.tgz#3a0b0005de18672819dfd38cd31f91179c893e84" - integrity sha1-OgsABd4YZygZ39OM0x+RF5yJPoQ= - -deep-is@~0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -deepmerge@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== - -default-gateway@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" - integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA== - dependencies: - execa "^1.0.0" - ip-regex "^2.1.0" - -default-gateway@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" - integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== - dependencies: - execa "^5.0.0" - -defaults@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" - integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= - dependencies: - clone "^1.0.2" - -defer-to-connect@^1.0.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" - integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== - -define-lazy-prop@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" - integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== - -define-properties@^1.1.2, define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -del@^2.2.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" - integrity sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag= - dependencies: - globby "^5.0.0" - is-path-cwd "^1.0.0" - is-path-in-cwd "^1.0.0" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - rimraf "^2.2.8" - -del@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" - integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== - dependencies: - "@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" - -del@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/del/-/del-6.0.0.tgz#0b40d0332cea743f1614f818be4feb717714c952" - integrity sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ== - dependencies: - globby "^11.0.1" - graceful-fs "^4.2.4" - is-glob "^4.0.1" - is-path-cwd "^2.2.0" - is-path-inside "^3.0.2" - p-map "^4.0.0" - rimraf "^3.0.2" - slash "^3.0.0" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= - -depd@^1.1.2, depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= - -depd@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -dependency-graph@^0.7.2: - version "0.7.2" - resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-0.7.2.tgz#91db9de6eb72699209d88aea4c1fd5221cac1c49" - integrity sha512-KqtH4/EZdtdfWX0p6MGP9jljvxSY6msy/pRUD4jgNwVpv3v1QmNLlsB3LDSSUg79BRVSn7jI1QPRtArGABovAQ== - -dependency-graph@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-0.9.0.tgz#11aed7e203bc8b00f48356d92db27b265c445318" - integrity sha512-9YLIBURXj4DJMFALxXw9K3Y3rwb5Fk0X5/8ipCzaN84+gKxoHK43tVKRNakCQbiEx07E8Uwhuq21BpUagFhZ8w== - -des.js@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" - integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= - -detect-node@^2.0.4: - version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" - integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== - -dev-ip@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/dev-ip/-/dev-ip-1.0.1.tgz#a76a3ed1855be7a012bb8ac16cb80f3c00dc28f0" - integrity sha1-p2o+0YVb56ASu4rBbLgPPADcKPA= - -di@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" - integrity sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw= - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -dlv@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" - integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== - -dnd-core@^10.0.2: - version "10.0.2" - resolved "https://registry.yarnpkg.com/dnd-core/-/dnd-core-10.0.2.tgz#051dc119682ea1185622f954667670d3d5f6a574" - integrity sha512-PrxEjxF0+6Y1n1n1Z9hSWZ1tvnDXv9syL+BccV1r1RC08uWNsyetf8AnWmUF3NgYPwy0HKQJwTqGkZK+1NlaFA== - dependencies: - "@react-dnd/asap" "^4.0.0" - "@react-dnd/invariant" "^2.0.0" - redux "^4.0.4" - -dnd-multi-backend@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/dnd-multi-backend/-/dnd-multi-backend-5.1.1.tgz#0032761795c3df6a479989f002d8a7d92ad58094" - integrity sha512-+bdMsGAC1wlne4+AwTvr6eQ6Bp3St6hn0wp0BcpUMOMVTNM0S+n0Ha8S/qbpYK7XY+i0j439v+yaKO9g9aFvQg== - -dns-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" - integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= - -dns-packet@^1.3.1: - version "1.3.4" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f" - integrity sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA== - dependencies: - ip "^1.1.0" - safe-buffer "^5.0.1" - -dns-txt@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" - integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= - dependencies: - buffer-indexof "^1.0.0" - -dom-converter@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" - integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== - dependencies: - utila "~0.4" - -dom-helpers@^5.0.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" - integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== - dependencies: - "@babel/runtime" "^7.8.7" - csstype "^3.0.2" - -dom-serialize@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" - integrity sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs= - dependencies: - custom-event "~1.0.0" - ent "~2.2.0" - extend "^3.0.0" - void-elements "^2.0.0" - -dom-serializer@0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" - integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== - dependencies: - domelementtype "^2.0.1" - entities "^2.0.0" - -dom-serializer@^1.0.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" - integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.2.0" - entities "^2.0.0" - -domain-browser@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" - integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== - -domelementtype@1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" - integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== - -domelementtype@^2.0.1, domelementtype@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" - integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== - -domexception@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" - integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== - dependencies: - webidl-conversions "^5.0.0" - -domhandler@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-3.3.0.tgz#6db7ea46e4617eb15cf875df68b2b8524ce0037a" - integrity sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA== - dependencies: - domelementtype "^2.0.1" - -domhandler@^4.0.0, domhandler@^4.2.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.0.tgz#16c658c626cf966967e306f966b431f77d4a5626" - integrity sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g== - dependencies: - domelementtype "^2.2.0" - -domino@^2.1.2: - version "2.1.6" - resolved "https://registry.yarnpkg.com/domino/-/domino-2.1.6.tgz#fe4ace4310526e5e7b9d12c7de01b7f485a57ffe" - integrity sha512-3VdM/SXBZX2omc9JF9nOPCtDaYQ67BGp5CoLpIQlO2KCAPETs8TcDHacF26jXadGbvUteZzRTeos2fhID5+ucQ== - -dompurify@^2.0.11: - version "2.3.4" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.3.4.tgz#1cf5cf0105ccb4debdf6db162525bd41e6ddacc6" - integrity sha512-6BVcgOAVFXjI0JTjEvZy901Rghm+7fDQOrNIcxB4+gdhj6Kwp6T9VBhBY/AbagKHJocRkDYGd6wvI+p4/10xtQ== - -domutils@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" - integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== - dependencies: - dom-serializer "0" - domelementtype "1" - -domutils@^2.0.0, domutils@^2.5.2, domutils@^2.6.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" - integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== - dependencies: - dom-serializer "^1.0.1" - domelementtype "^2.2.0" - domhandler "^4.2.0" - -dot-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" - integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -dot-prop@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" - integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== - dependencies: - is-obj "^2.0.0" - -dotenv@^8.2.0: - version "8.6.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" - integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== - -duplexer3@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= - -duplexer@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" - integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== - -duplexify@^3.4.2, duplexify@^3.6.0: - version "3.7.1" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" - integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== - dependencies: - end-of-stream "^1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" - -easy-extender@^2.3.4: - version "2.3.4" - resolved "https://registry.yarnpkg.com/easy-extender/-/easy-extender-2.3.4.tgz#298789b64f9aaba62169c77a2b3b64b4c9589b8f" - integrity sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q== - dependencies: - lodash "^4.17.10" - -eazy-logger@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/eazy-logger/-/eazy-logger-3.1.0.tgz#b169eb56df714608fa114f164c8a2956bec9f0f3" - integrity sha512-/snsn2JqBtUSSstEl4R0RKjkisGHAhvYj89i7r3ytNUKW12y178KDZwXLXIgwDqLW6E/VRMT9qfld7wvFae8bQ== - dependencies: - tfunk "^4.0.0" - -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= - -electron-to-chromium@^1.3.896: - version "1.4.12" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.12.tgz#5f73d1278c6205fc41d7a0ebd75563046b77c5d8" - integrity sha512-zjfhG9Us/hIy8AlQ5OzfbR/C4aBv1Dg/ak4GX35CELYlJ4tDAtoEcQivXvyBdqdNQ+R6PhlgQqV8UNPJmhkJog== - -element-resize-detector@^1.2.1: - version "1.2.3" - resolved "https://registry.yarnpkg.com/element-resize-detector/-/element-resize-detector-1.2.3.tgz#5078d9b99398fe4c589f8c8df94ff99e5d413ff3" - integrity sha512-+dhNzUgLpq9ol5tyhoG7YLoXL3ssjfFW+0gpszXPwRU6NjGr1fVHMEAF8fVzIiRJq57Nre0RFeIjJwI8Nh2NmQ== - dependencies: - batch-processor "1.0.0" - -elliptic@^6.5.3: - version "6.5.4" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" - integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" - -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emojis-list@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" - integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= - -emojis-list@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" - integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== - -encodeurl@~1.0.1, encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= - -encoding@^0.1.12: - version "0.1.13" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" - integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== - dependencies: - iconv-lite "^0.6.2" - -end-of-stream@^1.0.0, end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -engine.io-client@~3.5.0: - version "3.5.2" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.5.2.tgz#0ef473621294004e9ceebe73cef0af9e36f2f5fa" - integrity sha512-QEqIp+gJ/kMHeUun7f5Vv3bteRHppHH/FMBQX/esFj/fuYfjyUKWGMo3VCvIP/V8bE9KcjHmRZrhIz2Z9oNsDA== - dependencies: - component-emitter "~1.3.0" - component-inherit "0.0.3" - debug "~3.1.0" - engine.io-parser "~2.2.0" - has-cors "1.1.0" - indexof "0.0.1" - parseqs "0.0.6" - parseuri "0.0.6" - ws "~7.4.2" - xmlhttprequest-ssl "~1.6.2" - yeast "0.1.2" - -engine.io-parser@~2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.2.1.tgz#57ce5611d9370ee94f99641b589f94c97e4f5da7" - integrity sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg== - dependencies: - after "0.8.2" - arraybuffer.slice "~0.0.7" - base64-arraybuffer "0.1.4" - blob "0.0.5" - has-binary2 "~1.0.2" - -engine.io@~3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.5.0.tgz#9d6b985c8a39b1fe87cd91eb014de0552259821b" - integrity sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA== - dependencies: - accepts "~1.3.4" - base64id "2.0.0" - cookie "~0.4.1" - debug "~4.1.0" - engine.io-parser "~2.2.0" - ws "~7.4.2" - -enhanced-resolve@4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz#3b806f3bfafc1ec7de69551ef93cca46c1704126" - integrity sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ== - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.5.0" - tapable "^1.0.0" - -enhanced-resolve@5.7.0: - version "5.7.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.7.0.tgz#525c5d856680fbd5052de453ac83e32049958b5c" - integrity sha512-6njwt/NsZFUKhM6j9U8hzVyD4E4r0x7NQzhTCbcWOJ0IQjNSAoalWmb0AE51Wn+fwan5qVESWi7t2ToBxs9vrw== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -enhanced-resolve@^4.0.0, enhanced-resolve@^4.3.0, enhanced-resolve@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" - integrity sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg== - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.5.0" - tapable "^1.0.0" - -enquirer@^2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" - integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== - dependencies: - ansi-colors "^4.1.1" - -ent@~2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" - integrity sha1-6WQhkyWiHQX0RGai9obtbOX13R0= - -entities@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" - integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== - -env-paths@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" - integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== - -envinfo@^7.7.3: - version "7.8.1" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" - integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== - -err-code@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960" - integrity sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA= - -err-code@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" - integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== - -errno@^0.1.1, errno@^0.1.3, errno@~0.1.7: - version "0.1.8" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" - integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== - dependencies: - prr "~1.0.1" - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -error-stack-parser@^2.0.1: - version "2.0.6" - resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.0.6.tgz#5a99a707bd7a4c58a797902d48d82803ede6aad8" - integrity sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ== - dependencies: - stackframe "^1.1.1" - -es-abstract@^1.17.2, es-abstract@^1.19.1: - version "1.19.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" - integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== - dependencies: - call-bind "^1.0.2" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - get-intrinsic "^1.1.1" - get-symbol-description "^1.0.0" - has "^1.0.3" - has-symbols "^1.0.2" - internal-slot "^1.0.3" - is-callable "^1.2.4" - is-negative-zero "^2.0.1" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.1" - is-string "^1.0.7" - is-weakref "^1.0.1" - object-inspect "^1.11.0" - object-keys "^1.1.1" - object.assign "^4.1.2" - string.prototype.trimend "^1.0.4" - string.prototype.trimstart "^1.0.4" - unbox-primitive "^1.0.1" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -es5-ext@^0.10.35, es5-ext@^0.10.50: - version "0.10.53" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" - integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== - dependencies: - es6-iterator "~2.0.3" - es6-symbol "~3.1.3" - next-tick "~1.0.0" - -es6-iterator@2.0.3, es6-iterator@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= - dependencies: - d "1" - es5-ext "^0.10.35" - es6-symbol "^3.1.1" - -es6-promise@^4.0.3: - version "4.2.8" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" - integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== - -es6-promisify@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" - integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= - dependencies: - es6-promise "^4.0.3" - -es6-promisify@^6.0.0: - version "6.1.1" - resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-6.1.1.tgz#46837651b7b06bf6fff893d03f29393668d01621" - integrity sha512-HBL8I3mIki5C1Cc9QjKUenHtnG0A5/xA8Q/AllRcfiwl2CZFXGK7ddBiCoRwAix4i2KxcQfjtIVcrVbB3vbmwg== - -es6-symbol@^3.1.1, es6-symbol@~3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" - integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== - dependencies: - d "^1.0.1" - ext "^1.1.2" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-goat@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" - integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= - -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -escodegen@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== - dependencies: - esprima "^4.0.1" - estraverse "^5.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -eslint-scope@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" - integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -esprima@^4.0.0, esprima@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esrecurse@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -etag@1.8.1, etag@^1.8.1, etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= - -eventemitter2@^6.4.3: - version "6.4.5" - resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.5.tgz#97380f758ae24ac15df8353e0cc27f8b95644655" - integrity sha512-bXE7Dyc1i6oQElDG0jMRZJrRAn9QR2xyyFGmBdZleNmyQX0FqGYmhZIrIrpPfm/w//LTo4tVQGOGQcGCb5q9uw== - -eventemitter3@^4.0.0: - version "4.0.7" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - -events@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -eventsource@^1.0.7: - version "1.1.0" - resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.1.0.tgz#00e8ca7c92109e94b0ddf32dac677d841028cfaf" - integrity sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg== - dependencies: - original "^1.0.0" - -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - -execa@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" - integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== - dependencies: - 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" - -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - 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" - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -executable@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c" - integrity sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg== - dependencies: - pify "^2.2.0" - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= - dependencies: - 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" - -express-rate-limit@^5.1.3: - version "5.5.1" - resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-5.5.1.tgz#110c23f6a65dfa96ab468eda95e71697bc6987a2" - integrity sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg== - -express@^4.17.1: - version "4.17.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" - integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== - dependencies: - 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" - -ext@^1.1.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/ext/-/ext-1.6.0.tgz#3871d50641e874cc172e2b53f919842d19db4c52" - integrity sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg== - dependencies: - type "^2.5.0" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extend@^3.0.0, extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - 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" - -extract-zip@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" - integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== - dependencies: - debug "^4.1.1" - get-stream "^5.1.0" - yauzl "^2.10.0" - optionalDependencies: - "@types/yauzl" "^2.9.1" - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= - -extsprintf@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" - integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^3.1.1, fast-glob@^3.2.4: - version "3.2.7" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" - integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-patch@^3.0.0-1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/fast-json-patch/-/fast-json-patch-3.1.0.tgz#ec8cd9b9c4c564250ec8b9140ef7a55f70acaee6" - integrity sha512-IhpytlsVTRndz0hU5t0/MGzS/etxLlfrpG5V5M9mVbuj9TrJLWaMfsox9REM5rkuGX0T+5qjpe8XA1o0gZ42nA== - -fast-json-stable-stringify@2.1.0, fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= - -fast-memoize@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/fast-memoize/-/fast-memoize-2.5.2.tgz#79e3bb6a4ec867ea40ba0e7146816f6cdce9b57e" - integrity sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw== - -fastest-levenshtein@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" - integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== - -fastparse@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" - integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== - -fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== - dependencies: - reusify "^1.0.4" - -faye-websocket@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" - integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ= - dependencies: - websocket-driver ">=0.5.1" - -faye-websocket@^0.11.3, faye-websocket@~0.11.1: - version "0.11.4" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" - integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== - dependencies: - websocket-driver ">=0.5.1" - -fd-slicer@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" - integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= - dependencies: - pend "~1.2.0" - -figgy-pudding@^3.5.1: - version "3.5.2" - resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" - integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== - -figures@^3.0.0, figures@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - -file-loader@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.0.0.tgz#97bbfaab7a2460c07bcbd72d3a6922407f67649f" - integrity sha512-/aMOAYEFXDdjG0wytpTL5YQLfZnnTmLNjn+AIrJ/6HVnTfDqLsVKUUwkDf4I4kgex36BvjuXEn/TX9B/1ESyqQ== - dependencies: - loader-utils "^2.0.0" - schema-utils "^2.6.5" - -file-loader@6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" - integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== - dependencies: - loader-utils "^2.0.0" - schema-utils "^3.0.0" - -file-saver@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/file-saver/-/file-saver-2.0.5.tgz#d61cfe2ce059f414d899e9dd6d4107ee25670c38" - integrity sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA== - -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== - -filesize@^6.1.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.4.0.tgz#914f50471dd66fdca3cefe628bd0cde4ef769bcd" - integrity sha512-mjFIpOHC4jbfcTfoh4rkWpI31mF7viw9ikj/JyLoKzqlwG/YsefKfvYlYhdYdg/9mtK2z1AzgN/0LvVQ3zdlSQ== - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -finalhandler@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" - integrity sha1-zgtoVbRYU+eRsvzGgARtiCU91/U= - dependencies: - 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" - -finalhandler@1.1.2, finalhandler@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" - integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "~2.3.0" - parseurl "~1.3.3" - statuses "~1.5.0" - unpipe "~1.0.0" - -find-cache-dir@3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" - integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== - dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" - -find-cache-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" - integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== - dependencies: - commondir "^1.0.1" - make-dir "^2.0.0" - pkg-dir "^3.0.0" - -find-cache-dir@^3.0.0, find-cache-dir@^3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" - integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== - dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -flatted@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" - integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== - -flatten@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" - integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== - -flush-write-stream@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" - integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== - dependencies: - inherits "^2.0.3" - readable-stream "^2.3.6" - -follow-redirects@^1.0.0, follow-redirects@^1.14.0: - version "1.14.5" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.5.tgz#f09a5848981d3c772b5392309778523f8d85c381" - integrity sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA== - -font-awesome@4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/font-awesome/-/font-awesome-4.7.0.tgz#8fa8cf0411a1a31afd07b06d2902bb9fc815a133" - integrity sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM= - -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= - -fork-ts-checker-webpack-plugin@^6.0.3: - version "6.5.0" - resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.0.tgz#0282b335fa495a97e167f69018f566ea7d2a2b5e" - integrity sha512-cS178Y+xxtIjEUorcHddKS7yCMlrDPV31mt47blKKRfMd70Kxu5xruAFE2o9sDY6wVC5deuob/u/alD04YYHnw== - dependencies: - "@babel/code-frame" "^7.8.3" - "@types/json-schema" "^7.0.5" - chalk "^4.1.0" - chokidar "^3.4.2" - cosmiconfig "^6.0.0" - deepmerge "^4.2.2" - fs-extra "^9.0.0" - glob "^7.1.6" - memfs "^3.1.2" - minimatch "^3.0.4" - schema-utils "2.7.0" - semver "^7.3.2" - tapable "^1.0.0" - -form-data@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" - integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fraction.js@^4.0.13: - version "4.1.2" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.1.2.tgz#13e420a92422b6cf244dff8690ed89401029fbe8" - integrity sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA== - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= - dependencies: - map-cache "^0.2.2" - -fresh@0.5.2, fresh@^0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= - -from2@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" - -fs-extra@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" - integrity sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE= - dependencies: - graceful-fs "^4.1.2" - jsonfile "^3.0.0" - universalify "^0.1.0" - -fs-extra@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.2.tgz#f91704c53d1b461f893452b0c307d9997647ab6b" - integrity sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s= - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@^0.22.1: - version "0.22.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.22.1.tgz#5fd6f8049dc976ca19eb2355d658173cabcce056" - integrity sha1-X9b4BJ3JdsoZ6yNV1lgXPKvM4FY= - dependencies: - graceful-fs "^4.1.2" - jsonfile "^2.1.0" - rimraf "^2.2.8" - -fs-extra@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@^9.0.0, fs-extra@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-minipass@^2.0.0, fs-minipass@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" - integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== - dependencies: - minipass "^3.0.0" - -fs-monkey@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" - integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== - -fs-write-stream-atomic@^1.0.8: - version "1.0.10" - resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" - integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= - dependencies: - graceful-fs "^4.1.2" - iferr "^0.1.5" - imurmurhash "^0.1.4" - readable-stream "1 || 2" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fscreen@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fscreen/-/fscreen-1.2.0.tgz#1a8c88e06bc16a07b473ad96196fb06d6657f59e" - integrity sha512-hlq4+BU0hlPmwsFjwGGzZ+OZ9N/wq9Ljg/sq3pX+2CD7hrJsX9tJgWWK/wiNTFM212CLHWhicOoqwXyZGGetJg== - -fsevents@^1.2.7: - version "1.2.13" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" - integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== - dependencies: - bindings "^1.5.0" - nan "^2.12.1" - -fsevents@~2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" - integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== - -fsevents@~2.3.1, fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - -gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.1, get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" - integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - -get-stdin@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" - integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== - -get-stream@^4.0.0, get-stream@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-stream@^5.0.0, get-stream@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= - -getos@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/getos/-/getos-3.2.1.tgz#0134d1f4e00eb46144c5a9c0ac4dc087cbb27dc5" - integrity sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q== - dependencies: - async "^3.2.0" - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= - dependencies: - assert-plus "^1.0.0" - -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - -glob-parent@^5.1.1, glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob@7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" - integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ== - dependencies: - 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@7.1.6: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - dependencies: - 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@^7.0.3, glob@^7.0.6, glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== - dependencies: - 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" - -global-dirs@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686" - integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA== - dependencies: - ini "2.0.0" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globby@^11.0.0, globby@^11.0.1: - version "11.0.4" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" - integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== - dependencies: - 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" - -globby@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" - integrity sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0= - dependencies: - array-union "^1.0.1" - arrify "^1.0.0" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -globby@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" - integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= - dependencies: - array-union "^1.0.1" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -got@^9.6.0: - version "9.6.0" - resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" - integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== - dependencies: - "@sindresorhus/is" "^0.14.0" - "@szmarczak/http-timer" "^1.1.2" - cacheable-request "^6.0.0" - decompress-response "^3.3.0" - duplexer3 "^0.1.4" - get-stream "^4.1.0" - lowercase-keys "^1.0.1" - mimic-response "^1.0.1" - p-cancelable "^1.0.0" - to-readable-stream "^1.0.0" - url-parse-lax "^3.0.0" - -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.3, graceful-fs@^4.2.4, graceful-fs@^4.2.6: - version "4.2.8" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" - integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== - -guess-parser@^0.4.12: - version "0.4.22" - resolved "https://registry.yarnpkg.com/guess-parser/-/guess-parser-0.4.22.tgz#c26ab9e21b69bbc761960c5a1511476ae85428eb" - integrity sha512-KcUWZ5ACGaBM69SbqwVIuWGoSAgD+9iJnchR9j/IarVI1jHVeXv+bUXBIMeqVMSKt3zrn0Dgf9UpcOEpPBLbSg== - dependencies: - "@wessberg/ts-evaluator" "0.0.27" - -gzip-size@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" - integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== - dependencies: - duplexer "^0.1.2" - -handle-thing@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" - integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== - -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= - -har-validator@~5.1.3: - version "5.1.5" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" - integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== - dependencies: - ajv "^6.12.3" - har-schema "^2.0.0" - -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= - dependencies: - ansi-regex "^2.0.0" - -has-bigints@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" - integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== - -has-binary2@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d" - integrity sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw== - dependencies: - isarray "2.0.1" - -has-cors@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" - integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-symbols@^1.0.1, has-symbols@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" - integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== - -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has-yarn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" - integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== - -has@^1.0.0, has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hash-base@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" - integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== - dependencies: - inherits "^2.0.4" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -he@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -hex-color-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" - integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== - -hmac-drbg@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" - integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== - dependencies: - react-is "^16.7.0" - -hosted-git-info@^3.0.6: - version "3.0.8" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.8.tgz#6e35d4cc87af2c5f816e4cb9ce350ba87a3f370d" - integrity sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw== - dependencies: - lru-cache "^6.0.0" - -hosted-git-info@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.0.2.tgz#5e425507eede4fea846b7262f0838456c4209961" - integrity sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg== - dependencies: - lru-cache "^6.0.0" - -hpack.js@^2.1.6: - version "2.1.6" - resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" - integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= - dependencies: - inherits "^2.0.1" - obuf "^1.0.0" - readable-stream "^2.0.1" - wbuf "^1.1.0" - -hsl-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" - integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= - -hsla-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" - integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= - -html-encoding-sniffer@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" - integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== - dependencies: - whatwg-encoding "^1.0.5" - -html-entities@^1.3.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc" - integrity sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA== - -html-entities@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.2.tgz#760b404685cb1d794e4f4b744332e3b00dcfe488" - integrity sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ== - -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - -html-loader@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/html-loader/-/html-loader-1.3.2.tgz#5a72ebba420d337083497c9aba7866c9e1aee340" - integrity sha512-DEkUwSd0sijK5PF3kRWspYi56XP7bTNkyg5YWSzBdjaSDmvCufep5c4Vpb3PBf6lUL0YPtLwBfy9fL0t5hBAGA== - dependencies: - html-minifier-terser "^5.1.1" - htmlparser2 "^4.1.0" - loader-utils "^2.0.0" - schema-utils "^3.0.0" - -html-minifier-terser@^5.0.1, html-minifier-terser@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#922e96f1f3bb60832c2634b79884096389b1f054" - integrity sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg== - dependencies: - 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" - -html-parse-stringify@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz#dfc1017347ce9f77c8141a507f233040c59c55d2" - integrity sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg== - dependencies: - void-elements "3.1.0" - -html-webpack-plugin@^4.5.0: - version "4.5.2" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.5.2.tgz#76fc83fa1a0f12dd5f7da0404a54e2699666bc12" - integrity sha512-q5oYdzjKUIPQVjOosjgvCHQOv9Ett9CYYHlgvJeXG0qQvdSojnBq4vAdQBwn1+yGveAwHCoe/rMR86ozX3+c2A== - dependencies: - "@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.20" - pretty-error "^2.1.1" - tapable "^1.1.3" - util.promisify "1.0.0" - -htmlparser2@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-4.1.0.tgz#9a4ef161f2e4625ebf7dfbe6c0a2f52d18a59e78" - integrity sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q== - dependencies: - domelementtype "^2.0.1" - domhandler "^3.0.0" - domutils "^2.0.0" - entities "^2.0.0" - -htmlparser2@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" - integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.0.0" - domutils "^2.5.2" - entities "^2.0.0" - -http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" - integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== - -http-deceiver@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" - integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= - -http-errors@1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" - integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - -http-errors@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" - integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.1" - -http-errors@~1.6.2: - version "1.6.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" - integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - -http-errors@~1.7.2: - version "1.7.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" - integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - -http-parser-js@>=0.5.1: - version "0.5.5" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.5.tgz#d7c30d5d3c90d865b4a2e870181f9d6f22ac7ac5" - integrity sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA== - -http-proxy-agent@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" - integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== - dependencies: - "@tootallnate/once" "1" - agent-base "6" - debug "4" - -http-proxy-middleware@0.19.1: - version "0.19.1" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" - integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q== - dependencies: - http-proxy "^1.17.0" - is-glob "^4.0.0" - lodash "^4.17.11" - micromatch "^3.1.10" - -http-proxy-middleware@^1.0.0, http-proxy-middleware@^1.0.5: - version "1.3.1" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-1.3.1.tgz#43700d6d9eecb7419bf086a128d0f7205d9eb665" - integrity sha512-13eVVDYS4z79w7f1+NPllJtOQFx/FdUW4btIvVRMaRlUY9VGstAbo5MOhLEuUgZFRHn3x50ufn25zkj/boZnEg== - dependencies: - "@types/http-proxy" "^1.17.5" - http-proxy "^1.18.1" - is-glob "^4.0.1" - is-plain-obj "^3.0.0" - micromatch "^4.0.2" - -http-proxy-middleware@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.1.tgz#7ef3417a479fb7666a571e09966c66a39bd2c15f" - integrity sha512-cfaXRVoZxSed/BmkA7SwBVNI9Kj7HFltaE5rqYOub5kWzWZ+gofV2koVN1j2rMW7pEfSSlCHGJ31xmuyFyfLOg== - dependencies: - "@types/http-proxy" "^1.17.5" - http-proxy "^1.18.1" - is-glob "^4.0.1" - is-plain-obj "^3.0.0" - micromatch "^4.0.2" - -http-proxy@^1.17.0, http-proxy@^1.18.1: - version "1.18.1" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" - integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== - dependencies: - eventemitter3 "^4.0.0" - follow-redirects "^1.0.0" - requires-port "^1.0.0" - -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -http-signature@~1.3.6: - version "1.3.6" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.3.6.tgz#cb6fbfdf86d1c974f343be94e87f7fc128662cf9" - integrity sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw== - dependencies: - assert-plus "^1.0.0" - jsprim "^2.0.2" - sshpk "^1.14.1" - -https-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" - integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= - -https-proxy-agent@5.0.0, https-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" - integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== - dependencies: - agent-base "6" - debug "4" - -https-proxy-agent@^2.2.1: - version "2.2.4" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b" - integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg== - dependencies: - agent-base "^4.3.0" - debug "^3.1.0" - -https@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/https/-/https-1.0.0.tgz#3c37c7ae1a8eeb966904a2ad1e975a194b7ed3a4" - integrity sha1-PDfHrhqO65ZpBKKtHpdaGUt+06Q= - -human-signals@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" - integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -humanize-ms@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" - integrity sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0= - dependencies: - ms "^2.0.0" - -hyphenate-style-name@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" - integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== - -i18next@^19.5.0: - version "19.9.2" - resolved "https://registry.yarnpkg.com/i18next/-/i18next-19.9.2.tgz#ea5a124416e3c5ab85fddca2c8e3c3669a8da397" - integrity sha512-0i6cuo6ER6usEOtKajUUDj92zlG+KArFia0857xxiEHAQcUwh/RtOQocui1LPJwunSYT574Pk64aNva1kwtxZg== - dependencies: - "@babel/runtime" "^7.12.0" - -icomcom-react@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/icomcom-react/-/icomcom-react-1.0.1.tgz#6c513655bc576621930e31d19ddb718c3b7439f4" - integrity sha512-Xbz81qZ+er8RYZ6DFMmXxCl9YjxNWngNfPANTSOvzYNrQDieYvBZi+nv1MspI/ze+PAzfHUrmDcUii5RGCUifg== - dependencies: - prop-types "^15.6.0" - -iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -iconv-lite@^0.6.2: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -icss-utils@^4.0.0, icss-utils@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" - integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== - dependencies: - postcss "^7.0.14" - -icss-utils@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" - integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== - -ieee754@^1.1.13, ieee754@^1.1.4: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -iferr@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" - integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= - -ignore-by-default@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" - integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk= - -ignore-walk@^3.0.3: - version "3.0.4" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.4.tgz#c9a09f69b7c7b479a5d74ac1a3c0d4236d2a6335" - integrity sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ== - dependencies: - minimatch "^3.0.4" - -ignore@^5.1.4: - version "5.1.9" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.9.tgz#9ec1a5cbe8e1446ec60d4420060d43aa6e7382fb" - integrity sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ== - -image-size@~0.5.0: - version "0.5.5" - resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" - integrity sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w= - -immediate@~3.0.5: - version "3.0.6" - resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" - integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps= - -immutability-helper@^3.0.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/immutability-helper/-/immutability-helper-3.1.1.tgz#2b86b2286ed3b1241c9e23b7b21e0444f52f77b7" - integrity sha512-Q0QaXjPjwIju/28TsugCHNEASwoCcJSyJV3uO1sOIQGI0jKgm9f41Lvz0DZj3n46cNCyAZTsEYoY4C2bVRUzyQ== - -immutable@^3: - version "3.8.2" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" - integrity sha1-wkOZUUVbs5kT2vKBN28VMOEErfM= - -import-cwd@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" - integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk= - dependencies: - import-from "^2.1.0" - -import-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-3.0.0.tgz#20845547718015126ea9b3676b7592fb8bd4cf92" - integrity sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg== - dependencies: - import-from "^3.0.0" - -import-fresh@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" - integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= - dependencies: - caller-path "^2.0.0" - resolve-from "^3.0.0" - -import-fresh@^3.1.0, import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-from@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" - integrity sha1-M1238qev/VOqpHHUuAId7ja387E= - dependencies: - resolve-from "^3.0.0" - -import-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/import-from/-/import-from-3.0.0.tgz#055cfec38cd5a27d8057ca51376d7d3bf0891966" - integrity sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ== - dependencies: - resolve-from "^5.0.0" - -import-lazy@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" - integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= - -import-local@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" - integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== - dependencies: - pkg-dir "^3.0.0" - resolve-cwd "^2.0.0" - -import-local@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.3.tgz#4d51c2c495ca9393da259ec66b62e022920211e0" - integrity sha512-bE9iaUY3CXH8Cwfan/abDKAxe1KGT9kyGsBPqf6DMK/z0a2OzAsrukeYNgIH6cH5Xr452jb1TUL8rSfCLjZ9uA== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -indexes-of@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" - integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= - -indexof@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" - integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= - -infer-owner@^1.0.3, infer-owner@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" - integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inherits@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= - -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= - -ini@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" - integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== - -ini@^1.3.4, ini@~1.3.0: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -inquirer@7.3.3: - version "7.3.3" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" - integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.19" - mute-stream "0.0.8" - run-async "^2.4.0" - rxjs "^6.6.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - -internal-ip@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" - integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg== - dependencies: - default-gateway "^4.2.0" - ipaddr.js "^1.9.0" - -internal-slot@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" - integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== - dependencies: - get-intrinsic "^1.1.0" - has "^1.0.3" - side-channel "^1.0.4" - -interpret@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" - integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== - -intersection-observer@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/intersection-observer/-/intersection-observer-0.10.0.tgz#4d11d63c1ff67e21e62987be24d55218da1a1a69" - integrity sha512-fn4bQ0Xq8FTej09YC/jqKZwtijpvARlRp6wxL5WTA6yPe2YWSJ5RJh7Nm79rK2qB0wr6iDQzH60XGq5V/7u8YQ== - -invariant@^2.2.2, invariant@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - -ip-regex@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" - integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= - -ip@^1.1.0, ip@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" - integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= - -ipaddr.js@1.9.1, ipaddr.js@^1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -ipaddr.js@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" - integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== - -is-absolute-url@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" - integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= - -is-absolute-url@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" - integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" - -is-arguments@^1.0.4: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= - -is-arrayish@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" - integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= - dependencies: - binary-extensions "^1.0.0" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-buffer@^1.1.5, is-buffer@~1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-callable@^1.1.4, is-callable@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" - integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== - -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== - dependencies: - ci-info "^2.0.0" - -is-ci@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" - integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== - dependencies: - ci-info "^3.2.0" - -is-color-stop@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" - integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= - dependencies: - css-color-names "^0.0.4" - hex-color-regex "^1.1.0" - hsl-regex "^1.0.0" - hsla-regex "^1.0.0" - rgb-regex "^1.0.1" - rgba-regex "^1.0.0" - -is-core-module@^2.1.0, is-core-module@^2.2.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548" - integrity sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw== - dependencies: - has "^1.0.3" - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-directory@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" - integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= - -is-docker@^2.0.0, is-docker@^2.1.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^2.1.0, is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= - dependencies: - is-extglob "^2.1.0" - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-in-browser@^1.0.2, is-in-browser@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/is-in-browser/-/is-in-browser-1.1.3.tgz#56ff4db683a078c6082eb95dad7dc62e1d04f835" - integrity sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU= - -is-installed-globally@^0.4.0, is-installed-globally@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" - integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== - dependencies: - global-dirs "^3.0.0" - is-path-inside "^3.0.2" - -is-interactive@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" - integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== - -is-lambda@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" - integrity sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU= - -is-negative-zero@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" - integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== - -is-npm@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8" - integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== - -is-number-like@^1.0.3: - version "1.0.8" - resolved "https://registry.yarnpkg.com/is-number-like/-/is-number-like-1.0.8.tgz#2e129620b50891042e44e9bbbb30593e75cfbbe3" - integrity sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA== - dependencies: - lodash.isfinite "^3.3.2" - -is-number-object@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" - integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== - dependencies: - has-tostringtag "^1.0.0" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= - dependencies: - kind-of "^3.0.2" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" - integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== - -is-path-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" - integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= - -is-path-cwd@^2.0.0, is-path-cwd@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" - integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== - -is-path-in-cwd@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" - integrity sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ== - dependencies: - is-path-inside "^1.0.0" - -is-path-in-cwd@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" - integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ== - dependencies: - is-path-inside "^2.1.0" - -is-path-inside@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" - integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= - dependencies: - path-is-inside "^1.0.1" - -is-path-inside@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" - integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== - dependencies: - path-is-inside "^1.0.2" - -is-path-inside@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-plain-obj@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= - -is-plain-obj@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" - integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== - -is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-potential-custom-element-name@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" - integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== - -is-regex@^1.0.4, is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-resolvable@^1.0.0, is-resolvable@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" - integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== - -is-shared-array-buffer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" - integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== - -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-typedarray@^1.0.0, is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= - -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - -is-weakref@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.1.tgz#842dba4ec17fa9ac9850df2d6efbc1737274f2a2" - integrity sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ== - dependencies: - call-bind "^1.0.0" - -is-what@^3.12.0: - version "3.14.1" - resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" - integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA== - -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is-wsl@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" - integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= - -is-wsl@^2.1.1, is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -is-yarn-global@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" - integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== - -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isarray@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e" - integrity sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4= - -isbinaryfile@^4.0.6: - version "4.0.8" - resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.8.tgz#5d34b94865bd4946633ecc78a026fc76c5b11fcf" - integrity sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= - -isomorphic-unfetch@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz#87341d5f4f7b63843d468438128cb087b7c3e98f" - integrity sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q== - dependencies: - node-fetch "^2.6.1" - unfetch "^4.2.0" - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= - -istanbul-lib-coverage@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" - integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA== - -istanbul-lib-coverage@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" - integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== - -istanbul-lib-instrument@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" - integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== - dependencies: - "@babel/core" "^7.7.5" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.0.0" - semver "^6.3.0" - -istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^3.0.6: - version "3.0.6" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz#284997c48211752ec486253da97e3879defba8c8" - integrity sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^2.0.5" - make-dir "^2.1.0" - rimraf "^2.6.3" - source-map "^0.6.1" - -istanbul-reports@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.1.tgz#7085857f17d2441053c6ce5c3b8fdf6882289397" - integrity sha512-q1kvhAXWSsXfMjCdNHNPKZZv94OlspKnoGv+R9RGbnqOOQ0VbNfLFgQDVgi7hHenKsndGq3/o0OBdzDXthWcNw== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -jasmine-core@^3.6.0: - version "3.10.1" - resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-3.10.1.tgz#7aa6fa2b834a522315c651a128d940eca553989a" - integrity sha512-ooZWSDVAdh79Rrj4/nnfklL3NQVra0BcuhcuWoAwwi+znLDoUeH87AFfeX8s+YeYi6xlv5nveRyaA1v7CintfA== - -jasmine-core@~2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.8.0.tgz#bcc979ae1f9fd05701e45e52e65d3a5d63f1a24e" - integrity sha1-vMl5rh+f0FcB5F5S5l06XWPxok4= - -jasmine-core@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-3.6.0.tgz#491f3bb23941799c353ceb7a45b38a950ebc5a20" - integrity sha512-8uQYa7zJN8hq9z+g8z1bqCfdC8eoDAeVnM5sfqs7KHv9/ifoJ500m018fpFc7RDaO6SWCLCXwo/wPSNcdYTgcw== - -jasmine-marbles@0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/jasmine-marbles/-/jasmine-marbles-0.6.0.tgz#f78dc1a3bc452976de10ee8b47c73d616532a954" - integrity sha512-1uzgjEesEeCb+r+v46qn5x326TiGqk5SUZa+A3O+XnMCjG/pGcUOhL9Xsg5L7gLC6RFHyWGTkB5fei4rcvIOiQ== - dependencies: - lodash "^4.5.0" - -jasmine-spec-reporter@~5.0.0: - version "5.0.2" - resolved "https://registry.yarnpkg.com/jasmine-spec-reporter/-/jasmine-spec-reporter-5.0.2.tgz#b61288ab074ad440dc2477c4d42840b0e74a6b95" - integrity sha512-6gP1LbVgJ+d7PKksQBc2H0oDGNRQI3gKUsWlswKaQ2fif9X5gzhQcgM5+kiJGCQVurOG09jqNhk7payggyp5+g== - dependencies: - colors "1.4.0" - -jasmine@2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/jasmine/-/jasmine-2.8.0.tgz#6b089c0a11576b1f16df11b80146d91d4e8b8a3e" - integrity sha1-awicChFXax8W3xG4AUbZHU6Lij4= - dependencies: - exit "^0.1.2" - glob "^7.0.6" - jasmine-core "~2.8.0" - -jasminewd2@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/jasminewd2/-/jasminewd2-2.2.0.tgz#e37cf0b17f199cce23bea71b2039395246b4ec4e" - integrity sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4= - -jest-worker@26.3.0: - version "26.3.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.3.0.tgz#7c8a97e4f4364b4f05ed8bca8ca0c24de091871f" - integrity sha512-Vmpn2F6IASefL+DVBhPzI2J9/GJUsqzomdeN+P+dK8/jKxbh8R3BtFnx3FIta7wYlPU62cpJMJQo4kuOowcMnw== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^7.0.0" - -jest-worker@26.6.2, jest-worker@^26.3.0, jest-worker@^26.5.0: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" - integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^7.0.0" - -jest-worker@^25.4.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.5.0.tgz#2611d071b79cea0f43ee57a3d118593ac1547db1" - integrity sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw== - dependencies: - merge-stream "^2.0.0" - supports-color "^7.0.0" - -js-cookie@2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8" - integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ== - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= - -jsdom@^16.4.0: - version "16.7.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" - integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== - dependencies: - abab "^2.0.5" - acorn "^8.2.4" - acorn-globals "^6.0.0" - cssom "^0.4.4" - cssstyle "^2.3.0" - data-urls "^2.0.0" - decimal.js "^10.2.1" - domexception "^2.0.1" - escodegen "^2.0.0" - form-data "^3.0.0" - html-encoding-sniffer "^2.0.1" - http-proxy-agent "^4.0.1" - https-proxy-agent "^5.0.0" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.0" - parse5 "6.0.1" - saxes "^5.0.1" - symbol-tree "^3.2.4" - tough-cookie "^4.0.0" - 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.5.0" - ws "^7.4.6" - xml-name-validator "^3.0.0" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= - -json-buffer@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" - integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= - -json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-parse-even-better-errors@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -json-schema@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" - integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= - -json3@^3.3.2, json3@^3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" - integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== - -json5@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= - -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== - dependencies: - minimist "^1.2.0" - -json5@^2.1.0, json5@^2.1.2, json5@^2.1.3: - version "2.2.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" - integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== - dependencies: - minimist "^1.2.5" - -jsonc-parser@3.0.0, jsonc-parser@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.0.0.tgz#abdd785701c7e7eaca8a9ec8cf070ca51a745a22" - integrity sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA== - -jsonfile@^2.1.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" - integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= - optionalDependencies: - graceful-fs "^4.1.6" - -jsonfile@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" - integrity sha1-pezG9l9T9mLEQVx2daAzHQmS7GY= - optionalDependencies: - graceful-fs "^4.1.6" - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= - optionalDependencies: - graceful-fs "^4.1.6" - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -jsonparse@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" - integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= - -jsonschema@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.0.tgz#1afa34c4bc22190d8e42271ec17ac8b3404f87b2" - integrity sha512-/YgW6pRMr6M7C+4o8kS+B/2myEpHCrxO4PEWnqJNBFMjn7EWXqlQ4tGwL6xTHeRplwuZmcAncdvfOad1nT2yMw== - -jsprim@^1.2.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" - integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.4.0" - verror "1.10.0" - -jsprim@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-2.0.2.tgz#77ca23dbcd4135cd364800d22ff82c2185803d4d" - integrity sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ== - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.4.0" - verror "1.10.0" - -jss-plugin-camel-case@^10.5.1: - version "10.8.2" - resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.8.2.tgz#8d7f915c8115afaff8cbde08faf610ec9892fba6" - integrity sha512-2INyxR+1UdNuKf4v9It3tNfPvf7IPrtkiwzofeKuMd5D58/dxDJVUQYRVg/n460rTlHUfsEQx43hDrcxi9dSPA== - dependencies: - "@babel/runtime" "^7.3.1" - hyphenate-style-name "^1.0.3" - jss "10.8.2" - -jss-plugin-default-unit@^10.5.1: - version "10.8.2" - resolved "https://registry.yarnpkg.com/jss-plugin-default-unit/-/jss-plugin-default-unit-10.8.2.tgz#c66f12e02e0815d911b85c02c2a979ee7b4ce69a" - integrity sha512-UZ7cwT9NFYSG+SEy7noRU50s4zifulFdjkUNKE+u6mW7vFP960+RglWjTgMfh79G6OENZmaYnjHV/gcKV4nSxg== - dependencies: - "@babel/runtime" "^7.3.1" - jss "10.8.2" - -jss-plugin-global@^10.5.1: - version "10.8.2" - resolved "https://registry.yarnpkg.com/jss-plugin-global/-/jss-plugin-global-10.8.2.tgz#1a35632a693cf50113bcc5ffe6b51969df79c4ec" - integrity sha512-UaYMSPsYZ7s/ECGoj4KoHC2jwQd5iQ7K+FFGnCAILdQrv7hPmvM2Ydg45ThT/sH46DqktCRV2SqjRuxeBH8nRA== - dependencies: - "@babel/runtime" "^7.3.1" - jss "10.8.2" - -jss-plugin-nested@^10.5.1: - version "10.8.2" - resolved "https://registry.yarnpkg.com/jss-plugin-nested/-/jss-plugin-nested-10.8.2.tgz#79f3c7f75ea6a36ae72fe52e777035bb24d230c7" - integrity sha512-acRvuPJOb930fuYmhkJaa994EADpt8TxI63Iyg96C8FJ9T2xRyU5T6R1IYKRwUiqZo+2Sr7fdGzRTDD4uBZaMA== - dependencies: - "@babel/runtime" "^7.3.1" - jss "10.8.2" - tiny-warning "^1.0.2" - -jss-plugin-props-sort@^10.5.1: - version "10.8.2" - resolved "https://registry.yarnpkg.com/jss-plugin-props-sort/-/jss-plugin-props-sort-10.8.2.tgz#e25a7471868652c394562b6dc5433dcaea7dff6f" - integrity sha512-wqdcjayKRWBZnNpLUrXvsWqh+5J5YToAQ+8HNBNw0kZxVvCDwzhK2Nx6AKs7p+5/MbAh2PLgNW5Ym/ysbVAuqQ== - dependencies: - "@babel/runtime" "^7.3.1" - jss "10.8.2" - -jss-plugin-rule-value-function@^10.5.1: - version "10.8.2" - resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.8.2.tgz#55354b55f1b2968a15976729968f767f02d64049" - integrity sha512-bW0EKAs+0HXpb6BKJhrn94IDdiWb0CnSluTkh0rGEgyzY/nmD1uV/Wf6KGlesGOZ9gmJzQy+9FFdxIUID1c9Ug== - dependencies: - "@babel/runtime" "^7.3.1" - jss "10.8.2" - tiny-warning "^1.0.2" - -jss-plugin-vendor-prefixer@^10.5.1: - version "10.8.2" - resolved "https://registry.yarnpkg.com/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.8.2.tgz#ebb4a482642f34091e454901e21176441dd5f475" - integrity sha512-DeGv18QsSiYLSVIEB2+l0af6OToUe0JB+trpzUxyqD2QRC/5AzzDrCrYffO5AHZ81QbffYvSN/pkfZaTWpRXlg== - dependencies: - "@babel/runtime" "^7.3.1" - css-vendor "^2.0.8" - jss "10.8.2" - -jss-rtl@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/jss-rtl/-/jss-rtl-0.3.0.tgz#386961615956f9655bd5e9ec7e9d08bef223e4af" - integrity sha512-rg9jJmP1bAyhNOAp+BDZgOP/lMm4+oQ76qGueupDQ68Wq+G+6SGvCZvhIEg8OHSONRWOwFT6skCI+APGi8DgmA== - dependencies: - rtl-css-js "^1.13.1" - -jss@10.8.2, jss@^10.3.0, jss@^10.5.1: - version "10.8.2" - resolved "https://registry.yarnpkg.com/jss/-/jss-10.8.2.tgz#4b2a30b094b924629a64928236017a52c7c97505" - integrity sha512-FkoUNxI329CKQ9OQC8L72MBF9KPf5q8mIupAJ5twU7G7XREW7ahb+7jFfrjZ4iy1qvhx1HwIWUIvkZBDnKkEdQ== - dependencies: - "@babel/runtime" "^7.3.1" - csstype "^3.0.2" - is-in-browser "^1.1.3" - tiny-warning "^1.0.2" - -jszip@^3.1.3: - version "3.7.1" - resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.7.1.tgz#bd63401221c15625a1228c556ca8a68da6fda3d9" - integrity sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg== - dependencies: - lie "~3.3.0" - pako "~1.0.2" - readable-stream "~2.3.6" - set-immediate-shim "~1.0.1" - -jwt-decode@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-3.1.2.tgz#3fb319f3675a2df0c2895c8f5e9fa4b67b04ed59" - integrity sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A== - -karma-chrome-launcher@~3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz#805a586799a4d05f4e54f72a204979f3f3066738" - integrity sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg== - dependencies: - which "^1.2.1" - -karma-coverage-istanbul-reporter@~3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-3.0.3.tgz#f3b5303553aadc8e681d40d360dfdc19bc7e9fe9" - integrity sha512-wE4VFhG/QZv2Y4CdAYWDbMmcAHeS926ZIji4z+FkB2aF/EposRb6DP6G5ncT/wXhqUfAb/d7kZrNKPonbvsATw== - dependencies: - istanbul-lib-coverage "^3.0.0" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^3.0.6" - istanbul-reports "^3.0.2" - minimatch "^3.0.4" - -karma-jasmine-html-reporter@^1.5.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.7.0.tgz#52c489a74d760934a1089bfa5ea4a8fcb84cc28b" - integrity sha512-pzum1TL7j90DTE86eFt48/s12hqwQuiD+e5aXx2Dc9wDEn2LfGq6RoAxEZZjFiN0RDSCOnosEKRZWxbQ+iMpQQ== - -karma-jasmine@~4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/karma-jasmine/-/karma-jasmine-4.0.1.tgz#b99e073b6d99a5196fc4bffc121b89313b0abd82" - integrity sha512-h8XDAhTiZjJKzfkoO1laMH+zfNlra+dEQHUAjpn5JV1zCPtOIVWGQjLBrqhnzQa/hrU2XrZwSyBa6XjEBzfXzw== - dependencies: - jasmine-core "^3.6.0" - -karma-mocha-reporter@2.2.5: - version "2.2.5" - resolved "https://registry.yarnpkg.com/karma-mocha-reporter/-/karma-mocha-reporter-2.2.5.tgz#15120095e8ed819186e47a0b012f3cd741895560" - integrity sha1-FRIAlejtgZGG5HoLAS8810GJVWA= - dependencies: - chalk "^2.1.0" - log-symbols "^2.1.0" - strip-ansi "^4.0.0" - -karma-source-map-support@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz#58526ceccf7e8730e56effd97a4de8d712ac0d6b" - integrity sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A== - dependencies: - source-map-support "^0.5.5" - -karma@^5.2.3: - version "5.2.3" - resolved "https://registry.yarnpkg.com/karma/-/karma-5.2.3.tgz#3264024219bad2728e92542e0058a2492d7a46e4" - integrity sha512-tHdyFADhVVPBorIKCX8A37iLHxc6RBRphkSoQ+MLKdAtFn1k97tD8WUGi1KlEtDZKL3hui0qhsY9HXUfSNDYPQ== - dependencies: - body-parser "^1.19.0" - braces "^3.0.2" - chokidar "^3.4.2" - colors "^1.4.0" - connect "^3.7.0" - di "^0.0.1" - dom-serialize "^2.2.1" - glob "^7.1.6" - graceful-fs "^4.2.4" - http-proxy "^1.18.1" - isbinaryfile "^4.0.6" - lodash "^4.17.19" - log4js "^6.2.1" - mime "^2.4.5" - minimatch "^3.0.4" - qjobs "^1.2.0" - range-parser "^1.2.1" - rimraf "^3.0.2" - socket.io "^2.3.0" - source-map "^0.6.1" - tmp "0.2.1" - ua-parser-js "0.7.22" - yargs "^15.3.1" - -keyv@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" - integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== - dependencies: - json-buffer "3.0.0" - -killable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" - integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -klaro@^0.7.10: - version "0.7.18" - resolved "https://registry.yarnpkg.com/klaro/-/klaro-0.7.18.tgz#fef3a05fcd656451b941e11459f37d6c336e84c0" - integrity sha512-Q5nehkGeZuFerisW4oeeB1ax6dHDszWckR70EcxKvhFiJQ61CM0WBSo20yLbdvz8N9MFsOFu4RNCO9JsbkCxgQ== - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -klona@^2.0.3, klona@^2.0.4: - version "2.0.5" - resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" - integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== - -last-call-webpack-plugin@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555" - integrity sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w== - dependencies: - lodash "^4.17.5" - webpack-sources "^1.1.0" - -latest-version@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" - integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== - dependencies: - package-json "^6.3.0" - -lazy-ass@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513" - integrity sha1-eZllXoZGwX8In90YfRUNMyTVRRM= - -less-loader@6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-6.2.0.tgz#8b26f621c155b342eefc24f5bd6e9dc40c42a719" - integrity sha512-Cl5h95/Pz/PWub/tCBgT1oNMFeH1WTD33piG80jn5jr12T4XbxZcjThwNXDQ7AG649WEynuIzO4b0+2Tn9Qolg== - dependencies: - clone "^2.1.2" - less "^3.11.3" - loader-utils "^2.0.0" - schema-utils "^2.7.0" - -less-loader@7.3.0: - version "7.3.0" - resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-7.3.0.tgz#f9d6d36d18739d642067a05fb5bd70c8c61317e5" - integrity sha512-Mi8915g7NMaLlgi77mgTTQvK022xKRQBIVDSyfl3ErTuBhmZBQab0mjeJjNNqGbdR+qrfTleKXqbGI4uEFavxg== - dependencies: - klona "^2.0.4" - loader-utils "^2.0.0" - schema-utils "^3.0.0" - -less@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/less/-/less-4.1.1.tgz#15bf253a9939791dc690888c3ff424f3e6c7edba" - integrity sha512-w09o8tZFPThBscl5d0Ggp3RcrKIouBoQscnOMgFH3n5V3kN/CXGHNfCkRPtxJk6nKryDXaV9aHLK55RXuH4sAw== - dependencies: - copy-anything "^2.0.1" - parse-node-version "^1.0.1" - tslib "^1.10.0" - optionalDependencies: - errno "^0.1.1" - graceful-fs "^4.1.2" - image-size "~0.5.0" - make-dir "^2.1.0" - mime "^1.4.1" - needle "^2.5.2" - source-map "~0.6.0" - -less@^3.11.3: - version "3.13.1" - resolved "https://registry.yarnpkg.com/less/-/less-3.13.1.tgz#0ebc91d2a0e9c0c6735b83d496b0ab0583077909" - integrity sha512-SwA1aQXGUvp+P5XdZslUOhhLnClSLIjWvJhmd+Vgib5BFIr9lMNlQwmwUNOjXThF/A0x+MCYYPeWEfeWiLRnTw== - dependencies: - copy-anything "^2.0.1" - tslib "^1.10.0" - optionalDependencies: - errno "^0.1.1" - graceful-fs "^4.1.2" - image-size "~0.5.0" - make-dir "^2.1.0" - mime "^1.4.1" - native-request "^1.0.5" - source-map "~0.6.0" - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -levenary@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/levenary/-/levenary-1.1.1.tgz#842a9ee98d2075aa7faeedbe32679e9205f46f77" - integrity sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ== - dependencies: - leven "^3.1.0" - -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -license-webpack-plugin@2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/license-webpack-plugin/-/license-webpack-plugin-2.3.0.tgz#c00f70d5725ba0408de208acb9e66612cc2eceda" - integrity sha512-JK/DXrtN6UeYQSgkg5q1+pgJ8aiKPL9tnz9Wzw+Ikkf+8mJxG56x6t8O+OH/tAeF/5NREnelTEMyFtbJNkjH4w== - dependencies: - "@types/webpack-sources" "^0.1.5" - webpack-sources "^1.2.0" - -license-webpack-plugin@2.3.11: - version "2.3.11" - resolved "https://registry.yarnpkg.com/license-webpack-plugin/-/license-webpack-plugin-2.3.11.tgz#0d93188a31fce350a44c86212badbaf33dcd29d8" - integrity sha512-0iVGoX5vx0WDy8dmwTTpOOMYiGqILyUbDeVMFH52AjgBlS58lHwOlFMSoqg5nY8Kxl6+FRKyUZY/UdlQaOyqDw== - dependencies: - "@types/webpack-sources" "^0.1.5" - webpack-sources "^1.2.0" - -lie@~3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" - integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== - dependencies: - immediate "~3.0.5" - -lilconfig@^2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.4.tgz#f4507d043d7058b380b6a8f5cb7bcd4b34cee082" - integrity sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA== - -limiter@^1.0.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/limiter/-/limiter-1.1.5.tgz#8f92a25b3b16c6131293a0cc834b4a838a2aa7c2" - integrity sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -listr2@^3.8.3: - version "3.13.5" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.13.5.tgz#105a813f2eb2329c4aae27373a281d610ee4985f" - integrity sha512-3n8heFQDSk+NcwBn3CgxEibZGaRzx+pC64n3YjpMD1qguV4nWus3Al+Oo3KooqFKTQEJ1v7MmnbnyyNspgx3NA== - dependencies: - cli-truncate "^2.1.0" - colorette "^2.0.16" - log-update "^4.0.0" - p-map "^4.0.0" - rfdc "^1.3.0" - rxjs "^7.4.0" - through "^2.3.8" - wrap-ansi "^7.0.0" - -loader-runner@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" - integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== - -loader-utils@1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" - integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== - dependencies: - big.js "^5.2.2" - emojis-list "^2.0.0" - json5 "^1.0.1" - -loader-utils@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" - integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^2.1.2" - -loader-utils@^0.2.12: - version "0.2.17" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" - integrity sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g= - dependencies: - big.js "^3.1.3" - emojis-list "^2.0.0" - json5 "^0.5.0" - object-assign "^4.0.1" - -loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" - integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^1.0.1" - -loader-utils@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.2.tgz#d6e3b4fb81870721ae4e0868ab11dd638368c129" - integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^2.1.2" - -localtunnel@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/localtunnel/-/localtunnel-2.0.2.tgz#528d50087151c4790f89c2db374fe7b0a48501f0" - integrity sha512-n418Cn5ynvJd7m/N1d9WVJISLJF/ellZnfsLnx8WBWGzxv/ntNcFkJ1o6se5quUhCplfLGBNL5tYHiq5WF3Nug== - dependencies: - axios "0.21.4" - debug "4.3.2" - openurl "1.1.1" - yargs "17.1.1" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -lodash.clonedeep@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" - integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= - -lodash.difference@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c" - integrity sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw= - -lodash.forown@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.forown/-/lodash.forown-4.4.0.tgz#85115cf04f73ef966eced52511d3893cc46683af" - integrity sha1-hRFc8E9z75ZuztUlEdOJPMRmg68= - -lodash.get@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= - -lodash.groupby@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.groupby/-/lodash.groupby-4.6.0.tgz#0b08a1dcf68397c397855c3239783832df7403d1" - integrity sha1-Cwih3PaDl8OXhVwyOXg4Mt90A9E= - -lodash.isfinite@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz#fb89b65a9a80281833f0b7478b3a5104f898ebb3" - integrity sha1-+4m2WpqAKBgz8LdHizpRBPiY67M= - -lodash.memoize@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= - -lodash.once@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" - integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= - -lodash.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= - -lodash.uniq@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= - -lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.5, lodash@^4.5.0, lodash@^4.7.0: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-symbols@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" - integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== - dependencies: - chalk "^2.0.1" - -log-symbols@^4.0.0, log-symbols@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -log-update@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" - integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== - dependencies: - ansi-escapes "^4.3.0" - cli-cursor "^3.1.0" - slice-ansi "^4.0.0" - wrap-ansi "^6.2.0" - -log4js@^6.2.1: - version "6.3.0" - resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.3.0.tgz#10dfafbb434351a3e30277a00b9879446f715bcb" - integrity sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw== - dependencies: - date-format "^3.0.0" - debug "^4.1.1" - flatted "^2.0.1" - rfdc "^1.1.4" - streamroller "^2.2.4" - -loglevel@^1.6.8: - version "1.8.0" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.0.tgz#e7ec73a57e1e7b419cb6c6ac06bf050b67356114" - integrity sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA== - -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lower-case@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" - integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== - dependencies: - tslib "^2.0.3" - -lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" - integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== - -lowercase-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" - integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -magic-string@0.25.7, magic-string@^0.25.0: - version "0.25.7" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" - integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== - dependencies: - sourcemap-codec "^1.4.4" - -make-dir@^2.0.0, make-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" - integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== - dependencies: - pify "^4.0.1" - semver "^5.6.0" - -make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -make-fetch-happen@^8.0.9: - version "8.0.14" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-8.0.14.tgz#aaba73ae0ab5586ad8eaa68bd83332669393e222" - integrity sha512-EsS89h6l4vbfJEtBZnENTOFk8mCRpY5ru36Xe5bcX1KYIli2mkSHqoFsp5O1wMDvTJJzxe/4THpCTtygjeeGWQ== - dependencies: - agentkeepalive "^4.1.3" - cacache "^15.0.5" - http-cache-semantics "^4.1.0" - http-proxy-agent "^4.0.1" - https-proxy-agent "^5.0.0" - is-lambda "^1.0.1" - lru-cache "^6.0.0" - minipass "^3.1.3" - minipass-collect "^1.0.2" - minipass-fetch "^1.3.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - promise-retry "^2.0.1" - socks-proxy-agent "^5.0.0" - ssri "^8.0.0" - -manifesto.js@^4.2.0: - version "4.2.4" - resolved "https://registry.yarnpkg.com/manifesto.js/-/manifesto.js-4.2.4.tgz#996cb3bd638883ea8f447ad00b958f23aeb0a184" - integrity sha512-Kfa3RSFnWeLTmzpkRQu/WM1275cx859rzwQO0wiRVo3Kl3yjbyV7QPzZkLCqgaL76gOarfYe28t1EDytgGpL9A== - dependencies: - "@edsilv/http-status-codes" "^1.0.3" - "@iiif/vocabulary" "^1.0.20" - isomorphic-unfetch "^3.0.0" - lodash "^4.17.21" - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= - dependencies: - object-visit "^1.0.0" - -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -md5@^2.2.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" - integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g== - dependencies: - charenc "0.0.2" - crypt "0.0.2" - is-buffer "~1.1.6" - -mdn-data@2.0.14: - version "2.0.14" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" - integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== - -mdn-data@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" - integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= - -memfs@^3.1.2, memfs@^3.2.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.0.tgz#8bc12062b973be6b295d4340595736a656f0a257" - integrity sha512-o/RfP0J1d03YwsAxyHxAYs2kyJp55AFkMazlFAZFR2I2IXkxiUTXRabJ6RmNNCQ83LAD2jy52Khj0m3OffpNdA== - dependencies: - fs-monkey "1.0.3" - -"memoize-one@>=3.1.1 <6", memoize-one@^5.1.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" - integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== - -memory-fs@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" - integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -memory-fs@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" - integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= - -merge-source-map@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" - integrity sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw== - dependencies: - source-map "^0.6.1" - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -merge@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" - integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= - -micromatch@^3.1.10, micromatch@^3.1.4: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - 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" - -micromatch@^4.0.2, micromatch@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" - integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== - dependencies: - braces "^3.0.1" - picomatch "^2.2.3" - -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" - integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - -mime-db@1.51.0, "mime-db@>= 1.43.0 < 2": - version "1.51.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" - integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== - -mime-types@^2.1.12, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: - version "2.1.34" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" - integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== - dependencies: - mime-db "1.51.0" - -mime@1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" - integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== - -mime@1.6.0, mime@^1.4.1: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mime@^2.4.4, mime@^2.4.5: - version "2.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" - integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -mimic-response@^1.0.0, mimic-response@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" - integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== - -mini-css-extract-plugin@0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.10.0.tgz#a0e6bfcad22a9c73f6c882a3c7557a98e2d3d27d" - integrity sha512-QgKgJBjaJhxVPwrLNqqwNS0AGkuQQ31Hp4xGXEK/P7wehEg6qmNtReHKai3zRXqY60wGVWLYcOMJK2b98aGc3A== - dependencies: - loader-utils "^1.1.0" - normalize-url "1.9.1" - schema-utils "^1.0.0" - webpack-sources "^1.1.0" - -mini-css-extract-plugin@1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-1.3.5.tgz#252166e78879c106e0130f229d44e0cbdfcebed3" - integrity sha512-tvmzcwqJJXau4OQE5vT72pRT18o2zF+tQJp8CWchqvfQnTlflkzS+dANYcRdyPRWUWRkfmeNTKltx0NZI/b5dQ== - dependencies: - loader-utils "^2.0.0" - schema-utils "^3.0.0" - webpack-sources "^1.1.0" - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= - -minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.0, minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - -minipass-collect@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" - integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== - dependencies: - minipass "^3.0.0" - -minipass-fetch@^1.3.0, minipass-fetch@^1.3.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-1.4.1.tgz#d75e0091daac1b0ffd7e9d41629faff7d0c1f1b6" - integrity sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw== - dependencies: - minipass "^3.1.0" - minipass-sized "^1.0.3" - minizlib "^2.0.0" - optionalDependencies: - encoding "^0.1.12" - -minipass-flush@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" - integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== - dependencies: - minipass "^3.0.0" - -minipass-json-stream@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz#7edbb92588fbfc2ff1db2fc10397acb7b6b44aa7" - integrity sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg== - dependencies: - jsonparse "^1.3.1" - minipass "^3.0.0" - -minipass-pipeline@^1.2.2, minipass-pipeline@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" - integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== - dependencies: - minipass "^3.0.0" - -minipass-sized@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" - integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== - dependencies: - minipass "^3.0.0" - -minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3: - version "3.1.5" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.5.tgz#71f6251b0a33a49c01b3cf97ff77eda030dff732" - integrity sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw== - dependencies: - yallist "^4.0.0" - -minizlib@^2.0.0, minizlib@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" - integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== - dependencies: - minipass "^3.0.0" - yallist "^4.0.0" - -mirador-dl-plugin@^0.13.0: - version "0.13.0" - resolved "https://registry.yarnpkg.com/mirador-dl-plugin/-/mirador-dl-plugin-0.13.0.tgz#9a6cb0fa3c566a2a1ebe1ad9caa1ff590ff22689" - integrity sha512-I/6etIvpTtO1zgjxx2uEUFoyB9NxQ43JWg8CMkKmZqblW7AAeFqRn1/zUlQH7N8KFZft9Rah6D8qxtuNAo9jmA== - -mirador-share-plugin@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/mirador-share-plugin/-/mirador-share-plugin-0.11.0.tgz#13e2f654e38839044382acad42d9329e91a8cd5e" - integrity sha512-fHcdDXyrtfy5pn1zdQNX9BvE5Tjup66eQwyNippE5PMaP8ImUcrFaSL+mStdn+v6agsHcsdRqLhseZ0XWgEuAw== - -mirador@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/mirador/-/mirador-3.3.0.tgz#7a957a1db1a5388b2b8cafab00db4eb9f97557b9" - integrity sha512-BmGfRnWJ45B+vtiAwcFT7n9nKialfejE9UvuUK0NorO37ShArpsKr3yVSD4jQASwSR4DRRpPEG21jOk4WN7H3w== - dependencies: - "@material-ui/core" "^4.11.0" - "@material-ui/icons" "^4.9.1" - "@material-ui/lab" "^4.0.0-alpha.53" - "@researchgate/react-intersection-observer" "^1.0.0" - classnames "^2.2.6" - clsx "^1.0.4" - deepmerge "^4.2.2" - dompurify "^2.0.11" - i18next "^19.5.0" - icomcom-react "^1.0.1" - intersection-observer "^0.10.0" - isomorphic-unfetch "^3.0.0" - jss "^10.3.0" - jss-rtl "^0.3.0" - lodash "^4.17.11" - manifesto.js "^4.2.0" - normalize-url "^4.5.0" - openseadragon "^2.4.2" - prop-types "^15.6.2" - re-reselect "^4.0.0" - react-aria-live "^2.0.5" - react-beautiful-dnd "^13.0.0" - react-copy-to-clipboard "^5.0.1" - react-dnd "^10.0.2" - react-dnd-html5-backend "^10.0.2" - react-dnd-multi-backend "^5.0.0" - react-dnd-touch-backend "^10.0.2" - react-full-screen "^0.2.4" - react-i18next "^11.7.0" - react-image "^4.0.1" - react-mosaic-component "^4.0.1" - react-redux "^7.1.0" - react-resize-observer "^1.1.1" - react-rnd "^10.1" - react-sizeme "^2.6.7" - react-virtualized-auto-sizer "^1.0.2" - react-window "^1.8.5" - redux "^4.0.5" - redux-devtools-extension "^2.13.2" - redux-saga "^1.1.3" - redux-thunk "^2.3.0" - reselect "^4.0.0" - uuid "^8.1.0" - -mississippi@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" - integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== - dependencies: - 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@^1.1.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mitt/-/mitt-1.2.0.tgz#cb24e6569c806e31bd4e3995787fe38a04fdf90d" - integrity sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw== - -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - -mkdirp@^1.0.3, mkdirp@^1.0.4, mkdirp@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -moment@^2.29.1: - version "2.29.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" - integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== - -morgan@^1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.10.0.tgz#091778abc1fc47cd3509824653dae1faab6b17d7" - integrity sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ== - dependencies: - basic-auth "~2.0.1" - debug "2.6.9" - depd "~2.0.0" - on-finished "~2.3.0" - on-headers "~1.0.2" - -move-concurrently@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" - integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= - dependencies: - 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" - -mrmime@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.0.tgz#14d387f0585a5233d291baba339b063752a2398b" - integrity sha512-a70zx7zFfVO7XpnQ2IX1Myh9yY4UYvfld/dikWRnsXxbyvMcfz+u6UfgNAtH+k2QqtJuzVpv6eLTx1G2+WKZbQ== - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@^2.0.0, ms@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -multicast-dns-service-types@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" - integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= - -multicast-dns@^6.0.1: - version "6.2.3" - resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" - integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== - dependencies: - dns-packet "^1.3.1" - thunky "^1.0.2" - -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - -nan@^2.12.1: - version "2.15.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" - integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== - -nanoid@^3.1.23, nanoid@^3.1.30: - version "3.1.30" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.30.tgz#63f93cc548d2a113dc5dfbc63bfa09e2b9b64362" - integrity sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ== - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - 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" - -native-request@^1.0.5: - version "1.1.0" - resolved "https://registry.yarnpkg.com/native-request/-/native-request-1.1.0.tgz#acdb30fe2eefa3e1bc8c54b3a6852e9c5c0d3cb0" - integrity sha512-uZ5rQaeRn15XmpgE0xoPL8YWqcX90VtCFglYwAgkvKM5e8fog+vePLAhHxuuv/gRkrQxIeh5U3q9sMNUrENqWw== - -needle@^2.5.2: - version "2.9.1" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.9.1.tgz#22d1dffbe3490c2b83e301f7709b6736cd8f2684" - integrity sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ== - dependencies: - debug "^3.2.6" - iconv-lite "^0.4.4" - sax "^1.2.4" - -negotiator@0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" - integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== - -neo-async@^2.5.0, neo-async@^2.6.1, neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -next-tick@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" - integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= - -ng-mocks@11.11.2: - version "11.11.2" - resolved "https://registry.yarnpkg.com/ng-mocks/-/ng-mocks-11.11.2.tgz#5deaae4364da233a32035652f1302d4e7ba60884" - integrity sha512-TRcHriSjHgkKnpbK1TMpIv6qhRmif/BCRGLgZrwi8Y/7/eZrIeDQ4bqW+i9cotKxyv0bAnMuaM09t/Q5rzaKTg== - -ng2-file-upload@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ng2-file-upload/-/ng2-file-upload-1.4.0.tgz#8dea28d573234c52af474ad2a4001b335271e5c4" - integrity sha512-3J/KPU/tyh/ad6TFeUbrxX+SihUj0iOEt2Zsg4EX7mB3GFiQscXOfcUOxCkBtPWWWaqt3azrYbVGzsYa3/7NzQ== - dependencies: - tslib "^1.9.0" - -ng2-nouislider@^1.8.3: - version "1.8.3" - resolved "https://registry.yarnpkg.com/ng2-nouislider/-/ng2-nouislider-1.8.3.tgz#c9c1ec77b6b5a909f87368ba799914208baa13a6" - integrity sha512-Vl8tHCcJ/ioJLAs2t6FBC35sZq1P/O5ZdqdFwYxOCOMVbILGWNg+2gWZIjFstvv9pqb/mVvVUYe6qGG/mA/RBQ== - -ngx-infinite-scroll@^10.0.1: - version "10.0.1" - resolved "https://registry.yarnpkg.com/ngx-infinite-scroll/-/ngx-infinite-scroll-10.0.1.tgz#6f51f2f8775a7c50d1dd8bad125d4e748abbe880" - integrity sha512-7is0eJZ9kJPsaHohRmMhJ/QFHAW9jp9twO5HcHRvFM/Yl/R8QCiokgjwmH0/CR3MuxUanxfHZMfO3PbYTwlBEg== - dependencies: - "@scarf/scarf" "^1.1.0" - opencollective-postinstall "^2.0.2" - -ngx-moment@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ngx-moment/-/ngx-moment-5.0.0.tgz#6500432a2fcda75fb236a632850e599db23c8177" - integrity sha512-LPpGPo4ccdh8RWnDbJdLTLGGGcwbRYMbn/j4PXM24754J7MZ0tgnBM+ncaVbwefUSSEMme8yMkNIxFiVxgOOvQ== - dependencies: - tslib "^2.0.0" - -ngx-pagination@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ngx-pagination/-/ngx-pagination-5.0.0.tgz#a4b4c150a70aef17ccd825e4543e174a974bbd14" - integrity sha512-Ur0pTWRe2ZXoJ8impEzo0IZKxY5aEcQfSmL5uBqW1rHI2J6nfzgZAHsSLagKHFGchXq0PkRlDVVMcIaNxYJwvQ== - -ngx-sortablejs@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/ngx-sortablejs/-/ngx-sortablejs-11.1.0.tgz#14e50c48db908c1cb4b37722b28c2d3867c6140a" - integrity sha512-eM4dHwWSmXDcvF5gUmyMMQ0qqcqBXWCSZ9IRpqx4UkBKfo4N7pk/QuYh5io2fXVHWVFDaxW1yhn2FNpqxV6Jqw== - dependencies: - tslib "^2.0.0" - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -no-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" - integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== - dependencies: - lower-case "^2.0.2" - tslib "^2.0.3" - -node-fetch@^2.6.1: - version "2.6.6" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.6.tgz#1751a7c01834e8e1697758732e9efb6eeadfaf89" - integrity sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA== - dependencies: - whatwg-url "^5.0.0" - -node-forge@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" - integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== - -node-gyp@^7.1.0: - version "7.1.2" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-7.1.2.tgz#21a810aebb187120251c3bcec979af1587b188ae" - integrity sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ== - dependencies: - env-paths "^2.2.0" - glob "^7.1.4" - graceful-fs "^4.2.3" - nopt "^5.0.0" - npmlog "^4.1.2" - request "^2.88.2" - rimraf "^3.0.2" - semver "^7.3.2" - tar "^6.0.2" - which "^2.0.2" - -node-libs-browser@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" - integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== - dependencies: - 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" - -node-releases@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" - integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== - -nodemon@^2.0.15: - version "2.0.15" - resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.15.tgz#504516ce3b43d9dc9a955ccd9ec57550a31a8d4e" - integrity sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA== - dependencies: - chokidar "^3.5.2" - debug "^3.2.7" - ignore-by-default "^1.0.1" - minimatch "^3.0.4" - pstree.remy "^1.1.8" - semver "^5.7.1" - supports-color "^5.5.0" - touch "^3.1.0" - undefsafe "^2.0.5" - update-notifier "^5.1.0" - -nopt@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" - integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== - dependencies: - abbrev "1" - -nopt@~1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" - integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4= - dependencies: - abbrev "1" - -normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= - dependencies: - remove-trailing-separator "^1.0.1" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= - -normalize-url@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" - integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= - dependencies: - object-assign "^4.0.1" - prepend-http "^1.0.0" - query-string "^4.1.0" - sort-keys "^1.0.0" - -normalize-url@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" - integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== - -normalize-url@^4.1.0, normalize-url@^4.5.0: - version "4.5.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" - integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== - -normalize-url@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" - integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== - -nouislider@^14.6.3: - version "14.7.0" - resolved "https://registry.yarnpkg.com/nouislider/-/nouislider-14.7.0.tgz#a71db0587c92567b6da1df57d251d3696d942362" - integrity sha512-4RtQ1+LHJKesDCNJrXkQcwXAWCrC2aggdLYMstS/G5fEWL+fXZbUA9pwVNHFghMGuFGRATlDLNInRaPeRKzpFQ== - -npm-bundled@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.2.tgz#944c78789bd739035b70baa2ca5cc32b8d860bc1" - integrity sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ== - dependencies: - npm-normalize-package-bin "^1.0.1" - -npm-install-checks@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-4.0.0.tgz#a37facc763a2fde0497ef2c6d0ac7c3fbe00d7b4" - integrity sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w== - dependencies: - semver "^7.1.1" - -npm-normalize-package-bin@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" - integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== - -npm-package-arg@8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-8.1.0.tgz#b5f6319418c3246a1c38e1a8fbaa06231bc5308f" - integrity sha512-/ep6QDxBkm9HvOhOg0heitSd7JHA1U7y1qhhlRlteYYAi9Pdb/ZV7FW5aHpkrpM8+P+4p/jjR8zCyKPBMBjSig== - dependencies: - hosted-git-info "^3.0.6" - semver "^7.0.0" - validate-npm-package-name "^3.0.0" - -npm-package-arg@^8.0.0, npm-package-arg@^8.0.1, npm-package-arg@^8.1.2: - version "8.1.5" - resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-8.1.5.tgz#3369b2d5fe8fdc674baa7f1786514ddc15466e44" - integrity sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q== - dependencies: - hosted-git-info "^4.0.1" - semver "^7.3.4" - validate-npm-package-name "^3.0.0" - -npm-packlist@^2.1.4: - version "2.2.2" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-2.2.2.tgz#076b97293fa620f632833186a7a8f65aaa6148c8" - integrity sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg== - dependencies: - glob "^7.1.6" - ignore-walk "^3.0.3" - npm-bundled "^1.1.1" - npm-normalize-package-bin "^1.0.1" - -npm-pick-manifest@6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-6.1.0.tgz#2befed87b0fce956790f62d32afb56d7539c022a" - integrity sha512-ygs4k6f54ZxJXrzT0x34NybRlLeZ4+6nECAIbr2i0foTnijtS1TJiyzpqtuUAJOps/hO0tNDr8fRV5g+BtRlTw== - dependencies: - npm-install-checks "^4.0.0" - npm-package-arg "^8.0.0" - semver "^7.0.0" - -npm-pick-manifest@^6.0.0, npm-pick-manifest@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz#7b5484ca2c908565f43b7f27644f36bb816f5148" - integrity sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA== - dependencies: - npm-install-checks "^4.0.0" - npm-normalize-package-bin "^1.0.1" - npm-package-arg "^8.1.2" - semver "^7.3.4" - -npm-registry-fetch@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-9.0.0.tgz#86f3feb4ce00313bc0b8f1f8f69daae6face1661" - integrity sha512-PuFYYtnQ8IyVl6ib9d3PepeehcUeHN9IO5N/iCRhyg9tStQcqGQBRVHmfmMWPDERU3KwZoHFvbJ4FPXPspvzbA== - dependencies: - "@npmcli/ci-detect" "^1.0.0" - lru-cache "^6.0.0" - make-fetch-happen "^8.0.9" - minipass "^3.1.3" - minipass-fetch "^1.3.0" - minipass-json-stream "^1.0.1" - minizlib "^2.0.0" - npm-package-arg "^8.0.0" - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= - dependencies: - path-key "^2.0.0" - -npm-run-path@^4.0.0, npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -npmlog@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - -nth-check@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" - integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== - dependencies: - boolbase "~1.0.0" - -nth-check@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2" - integrity sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w== - dependencies: - boolbase "^1.0.0" - -num2fraction@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" - integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= - -nwsapi@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" - integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== - -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== - -object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-inspect@^1.11.0, object-inspect@^1.9.0: - version "1.11.1" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.1.tgz#d4bd7d7de54b9a75599f59a00bd698c1f1c6549b" - integrity sha512-If7BjFlpkzzBeV1cqgT3OSWT3azyoxDGajR+iGnFBfVV2EWyDyWaZZW2ERDjUaY2QM8i5jI3Sj7mhsM4DDAqWA== - -object-is@^1.0.1: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" - integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -object-keys@^1.0.12, object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object-path@^0.11.5: - version "0.11.8" - resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.8.tgz#ed002c02bbdd0070b78a27455e8ae01fc14d4742" - integrity sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA== - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= - dependencies: - isobject "^3.0.0" - -object.assign@^4.1.0, object.assign@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" - integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - has-symbols "^1.0.1" - object-keys "^1.1.1" - -object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0: - version "2.1.3" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz#b223cf38e17fefb97a63c10c91df72ccb386df9e" - integrity sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= - dependencies: - isobject "^3.0.1" - -object.values@^1.1.0: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" - integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - -obuf@^1.0.0, obuf@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" - integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== - -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= - dependencies: - ee-first "1.1.1" - -on-headers@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" - integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -onetime@^5.1.0, onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -open@7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/open/-/open-7.2.0.tgz#212959bd7b0ce2e8e3676adc76e3cf2f0a2498b4" - integrity sha512-4HeyhxCvBTI5uBePsAdi55C5fmqnWZ2e2MlmvWi5KW5tdH5rxoiv/aMtbeVxKZc3eWkT1GymMnLG8XC4Rq4TDQ== - dependencies: - is-docker "^2.0.0" - is-wsl "^2.1.1" - -open@7.4.0: - version "7.4.0" - resolved "https://registry.yarnpkg.com/open/-/open-7.4.0.tgz#ad95b98f871d9acb0ec8fecc557082cc9986626b" - integrity sha512-PGoBCX/lclIWlpS/R2PQuIR4NJoXh6X5AwVzE7WXnWRGvHg7+4TBCgsujUgiPpm0K1y4qvQeWnCWVTpTKZBtvA== - dependencies: - is-docker "^2.0.0" - is-wsl "^2.1.1" - -open@^8.0.9: - version "8.4.0" - resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" - integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== - dependencies: - define-lazy-prop "^2.0.0" - is-docker "^2.1.1" - is-wsl "^2.2.0" - -opencollective-postinstall@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259" - integrity sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q== - -opener@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" - integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== - -openseadragon@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/openseadragon/-/openseadragon-2.4.2.tgz#f25d833d0ab9941599d65a3e2b44bec546c9f15c" - integrity sha512-398KbZwRtOYA6OmeWRY4Q0737NTacQ9Q6whmr9Lp1MNQO3p0eBz5LIASRne+4gwequcSM1vcHcjfy3dIndQziw== - -openurl@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/openurl/-/openurl-1.1.1.tgz#3875b4b0ef7a52c156f0db41d4609dbb0f94b387" - integrity sha1-OHW0sO96UsFW8NtB1GCduw+Us4c= - -opn@5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/opn/-/opn-5.3.0.tgz#64871565c863875f052cfdf53d3e3cb5adb53b1c" - integrity sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g== - dependencies: - is-wsl "^1.1.0" - -opn@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" - integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== - dependencies: - is-wsl "^1.1.0" - -optimize-css-assets-webpack-plugin@^5.0.4: - version "5.0.8" - resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.8.tgz#cbccdcf5a6ef61d4f8cc78cf083a67446e5f402a" - integrity sha512-mgFS1JdOtEGzD8l+EuISqL57cKO+We9GcoiQEmdCWRqqck+FGNmYJtx9qfAPzEz+lRrlThWMuGDaRkI/yWNx/Q== - dependencies: - cssnano "^4.1.10" - last-call-webpack-plugin "^3.0.0" - -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - 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@5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/ora/-/ora-5.3.0.tgz#fb832899d3a1372fe71c8b2c534bbfe74961bb6f" - integrity sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g== - dependencies: - bl "^4.0.3" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-spinners "^2.5.0" - is-interactive "^1.0.0" - log-symbols "^4.0.0" - strip-ansi "^6.0.0" - wcwidth "^1.0.1" - -ora@5.4.1, ora@^5.1.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" - integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== - dependencies: - bl "^4.1.0" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-spinners "^2.5.0" - is-interactive "^1.0.0" - is-unicode-supported "^0.1.0" - log-symbols "^4.1.0" - strip-ansi "^6.0.0" - wcwidth "^1.0.1" - -original@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" - integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg== - dependencies: - url-parse "^1.4.3" - -os-browserify@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" - integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= - -os-tmpdir@^1.0.1, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - -ospath@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/ospath/-/ospath-1.2.2.tgz#1276639774a3f8ef2572f7fe4280e0ea4550c07b" - integrity sha1-EnZjl3Sj+O8lcvf+QoDg6kVQwHs= - -p-cancelable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" - integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= - -p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.1, p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-map@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" - integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== - -p-map@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" - integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== - dependencies: - aggregate-error "^3.0.0" - -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" - -p-retry@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" - integrity sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w== - dependencies: - retry "^0.12.0" - -p-retry@^4.5.0: - version "4.6.1" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.1.tgz#8fcddd5cdf7a67a0911a9cf2ef0e5df7f602316c" - integrity sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA== - dependencies: - "@types/retry" "^0.12.0" - retry "^0.13.1" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -package-json@^6.3.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" - integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== - dependencies: - got "^9.6.0" - registry-auth-token "^4.0.0" - registry-url "^5.0.0" - semver "^6.2.0" - -pacote@11.2.4: - version "11.2.4" - resolved "https://registry.yarnpkg.com/pacote/-/pacote-11.2.4.tgz#dc7ca740a573ed86a3bf863511d22c1d413ec82f" - integrity sha512-GfTeVQGJ6WyBQbQD4t3ocHbyOmTQLmWjkCKSZPmKiGFKYKNUaM5U2gbLzUW8WG1XmS9yQFnsTFA0k3o1+q4klQ== - dependencies: - "@npmcli/git" "^2.0.1" - "@npmcli/installed-package-contents" "^1.0.5" - "@npmcli/promise-spawn" "^1.2.0" - "@npmcli/run-script" "^1.3.0" - cacache "^15.0.5" - chownr "^2.0.0" - fs-minipass "^2.1.0" - infer-owner "^1.0.4" - minipass "^3.1.3" - mkdirp "^1.0.3" - npm-package-arg "^8.0.1" - npm-packlist "^2.1.4" - npm-pick-manifest "^6.0.0" - npm-registry-fetch "^9.0.0" - promise-retry "^1.1.1" - read-package-json-fast "^1.1.3" - rimraf "^3.0.2" - ssri "^8.0.0" - tar "^6.1.0" - -pako@~1.0.2, pako@~1.0.5: - version "1.0.11" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" - integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== - -parallel-transform@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" - integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== - dependencies: - cyclist "^1.0.1" - inherits "^2.0.3" - readable-stream "^2.1.5" - -param-case@^3.0.3: - version "3.0.4" - resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" - integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-asn1@^5.0.0, parse-asn1@^5.1.5: - version "5.1.6" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" - integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== - dependencies: - asn1.js "^5.2.0" - browserify-aes "^1.0.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - safe-buffer "^5.1.1" - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -parse-json@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse-node-version@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" - integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== - -parse5-html-rewriting-stream@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-6.0.1.tgz#de1820559317ab4e451ea72dba05fddfd914480b" - integrity sha512-vwLQzynJVEfUlURxgnf51yAJDQTtVpNyGD8tKi2Za7m+akukNHxCcUQMAa/mUGLhCeicFdpy7Tlvj8ZNKadprg== - dependencies: - parse5 "^6.0.1" - parse5-sax-parser "^6.0.1" - -parse5-htmlparser2-tree-adapter@6.0.1, parse5-htmlparser2-tree-adapter@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" - integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== - dependencies: - parse5 "^6.0.1" - -parse5-sax-parser@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5-sax-parser/-/parse5-sax-parser-6.0.1.tgz#98b4d366b5b266a7cd90b4b58906667af882daba" - integrity sha512-kXX+5S81lgESA0LsDuGjAlBybImAChYRMT+/uKCEXFBFOeEhS52qUCydGhU3qLRD8D9DVjaUo821WK7DM4iCeg== - dependencies: - parse5 "^6.0.1" - -parse5@6.0.1, parse5@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -parse5@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" - integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== - -parseqs@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.6.tgz#8e4bb5a19d1cdc844a08ac974d34e273afa670d5" - integrity sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w== - -parseuri@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.6.tgz#e1496e829e3ac2ff47f39a4dd044b32823c4a25a" - integrity sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow== - -parseurl@~1.3.2, parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -pascal-case@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" - integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= - -path-browserify@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" - integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== - -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-is-inside@^1.0.1, path-is-inside@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= - -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -pbkdf2@^3.0.3: - version "3.1.2" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" - integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -pem@1.14.4: - version "1.14.4" - resolved "https://registry.yarnpkg.com/pem/-/pem-1.14.4.tgz#a68c70c6e751ccc5b3b5bcd7af78b0aec1177ff9" - integrity sha512-v8lH3NpirgiEmbOqhx0vwQTxwi0ExsiWBGYh0jYNq7K6mQuO4gI6UEFlr6fLAdv9TPXRt6GqiwE37puQdIDS8g== - dependencies: - es6-promisify "^6.0.0" - md5 "^2.2.1" - os-tmpdir "^1.0.1" - which "^2.0.2" - -pend@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" - integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= - -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= - -picocolors@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" - integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" - integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== - -pify@^2.0.0, pify@^2.2.0, pify@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= - -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= - -pkg-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" - integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== - dependencies: - find-up "^3.0.0" - -pkg-dir@^4.1.0, pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -pnp-webpack-plugin@1.6.4: - version "1.6.4" - resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" - integrity sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg== - dependencies: - ts-pnp "^1.1.6" - -popper.js@1.16.1-lts: - version "1.16.1-lts" - resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1-lts.tgz#cf6847b807da3799d80ee3d6d2f90df8a3f50b05" - integrity sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA== - -portfinder@^1.0.26, portfinder@^1.0.28: - version "1.0.28" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" - integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA== - dependencies: - async "^2.6.2" - debug "^3.1.1" - mkdirp "^0.5.5" - -portscanner@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/portscanner/-/portscanner-2.1.1.tgz#eabb409e4de24950f5a2a516d35ae769343fbb96" - integrity sha1-6rtAnk3iSVD1oqUW01rnaTQ/u5Y= - dependencies: - async "1.5.2" - is-number-like "^1.0.3" - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= - -postcss-apply@0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/postcss-apply/-/postcss-apply-0.11.0.tgz#4bef9b443e4bfeeec5b094c7008bfe25dca5f40d" - integrity sha512-Y/uBl3p0H3jby+N3kvSNyuyLKZaCElCMMFWXSfEL9llEeCKupJ9Wit5Ms7TsAXFINexkWWwjiYfqPZ1nedi1Jw== - dependencies: - babel-runtime "^6.26.0" - balanced-match "^1.0.0" - postcss "^7.0.2" - -postcss-attribute-case-insensitive@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz#d93e46b504589e94ac7277b0463226c68041a880" - integrity sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA== - dependencies: - postcss "^7.0.2" - postcss-selector-parser "^6.0.2" - -postcss-calc@^7.0.1: - version "7.0.5" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.5.tgz#f8a6e99f12e619c2ebc23cf6c486fdc15860933e" - integrity sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg== - dependencies: - postcss "^7.0.27" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.0.2" - -postcss-calc@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.0.0.tgz#a05b87aacd132740a5db09462a3612453e5df90a" - integrity sha512-5NglwDrcbiy8XXfPM11F3HeC6hoT9W7GUH/Zi5U/p7u3Irv4rHhdDcIZwG0llHXV4ftsBjpfWMXAnXNl4lnt8g== - dependencies: - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.0.2" - -postcss-cli@^8.3.0: - version "8.3.1" - resolved "https://registry.yarnpkg.com/postcss-cli/-/postcss-cli-8.3.1.tgz#865dad08300ac59ae9cecb7066780aa81c767a77" - integrity sha512-leHXsQRq89S3JC9zw/tKyiVV2jAhnfQe0J8VI4eQQbUjwIe0XxVqLrR+7UsahF1s9wi4GlqP6SJ8ydf44cgF2Q== - dependencies: - chalk "^4.0.0" - chokidar "^3.3.0" - dependency-graph "^0.9.0" - fs-extra "^9.0.0" - get-stdin "^8.0.0" - globby "^11.0.0" - postcss-load-config "^3.0.0" - postcss-reporter "^7.0.0" - pretty-hrtime "^1.0.3" - read-cache "^1.0.0" - slash "^3.0.0" - yargs "^16.0.0" - -postcss-color-functional-notation@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz#5efd37a88fbabeb00a2966d1e53d98ced93f74e0" - integrity sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g== - dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-color-gray@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz#532a31eb909f8da898ceffe296fdc1f864be8547" - integrity sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw== - dependencies: - "@csstools/convert-colors" "^1.4.0" - postcss "^7.0.5" - postcss-values-parser "^2.0.0" - -postcss-color-hex-alpha@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz#a8d9ca4c39d497c9661e374b9c51899ef0f87388" - integrity sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw== - dependencies: - postcss "^7.0.14" - postcss-values-parser "^2.0.1" - -postcss-color-mod-function@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz#816ba145ac11cc3cb6baa905a75a49f903e4d31d" - integrity sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ== - dependencies: - "@csstools/convert-colors" "^1.4.0" - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-color-rebeccapurple@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz#c7a89be872bb74e45b1e3022bfe5748823e6de77" - integrity sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g== - dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-colormin@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" - integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw== - dependencies: - browserslist "^4.0.0" - color "^3.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-colormin@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.2.1.tgz#6e444a806fd3c578827dbad022762df19334414d" - integrity sha512-VVwMrEYLcHYePUYV99Ymuoi7WhKrMGy/V9/kTS0DkCoJYmmjdOMneyhzYUxcNgteKDVbrewOkSM7Wje/MFwxzA== - dependencies: - browserslist "^4.16.6" - caniuse-api "^3.0.0" - colord "^2.9.1" - postcss-value-parser "^4.1.0" - -postcss-convert-values@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" - integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ== - dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-convert-values@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.0.2.tgz#879b849dc3677c7d6bc94b6a2c1a3f0808798059" - integrity sha512-KQ04E2yadmfa1LqXm7UIDwW1ftxU/QWZmz6NKnHnUvJ3LEYbbcX6i329f/ig+WnEByHegulocXrECaZGLpL8Zg== - dependencies: - postcss-value-parser "^4.1.0" - -postcss-custom-media@^7.0.8: - version "7.0.8" - resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz#fffd13ffeffad73621be5f387076a28b00294e0c" - integrity sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg== - dependencies: - postcss "^7.0.14" - -postcss-custom-properties@^8.0.11: - version "8.0.11" - resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz#2d61772d6e92f22f5e0d52602df8fae46fa30d97" - integrity sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA== - dependencies: - postcss "^7.0.17" - postcss-values-parser "^2.0.1" - -postcss-custom-selectors@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz#64858c6eb2ecff2fb41d0b28c9dd7b3db4de7fba" - integrity sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w== - dependencies: - postcss "^7.0.2" - postcss-selector-parser "^5.0.0-rc.3" - -postcss-dir-pseudo-class@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz#6e3a4177d0edb3abcc85fdb6fbb1c26dabaeaba2" - integrity sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw== - dependencies: - postcss "^7.0.2" - postcss-selector-parser "^5.0.0-rc.3" - -postcss-discard-comments@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" - integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== - dependencies: - postcss "^7.0.0" - -postcss-discard-comments@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.0.1.tgz#9eae4b747cf760d31f2447c27f0619d5718901fe" - integrity sha512-lgZBPTDvWrbAYY1v5GYEv8fEO/WhKOu/hmZqmCYfrpD6eyDWWzAOsl2rF29lpvziKO02Gc5GJQtlpkTmakwOWg== - -postcss-discard-duplicates@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" - integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== - dependencies: - postcss "^7.0.0" - -postcss-discard-duplicates@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.1.tgz#68f7cc6458fe6bab2e46c9f55ae52869f680e66d" - integrity sha512-svx747PWHKOGpAXXQkCc4k/DsWo+6bc5LsVrAsw+OU+Ibi7klFZCyX54gjYzX4TH+f2uzXjRviLARxkMurA2bA== - -postcss-discard-empty@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" - integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== - dependencies: - postcss "^7.0.0" - -postcss-discard-empty@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.0.1.tgz#ee136c39e27d5d2ed4da0ee5ed02bc8a9f8bf6d8" - integrity sha512-vfU8CxAQ6YpMxV2SvMcMIyF2LX1ZzWpy0lqHDsOdaKKLQVQGVP1pzhrI9JlsO65s66uQTfkQBKBD/A5gp9STFw== - -postcss-discard-overridden@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" - integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg== - dependencies: - postcss "^7.0.0" - -postcss-discard-overridden@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.0.1.tgz#454b41f707300b98109a75005ca4ab0ff2743ac6" - integrity sha512-Y28H7y93L2BpJhrdUR2SR2fnSsT+3TVx1NmVQLbcnZWwIUpJ7mfcTC6Za9M2PG6w8j7UQRfzxqn8jU2VwFxo3Q== - -postcss-double-position-gradients@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz#fc927d52fddc896cb3a2812ebc5df147e110522e" - integrity sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA== - dependencies: - postcss "^7.0.5" - postcss-values-parser "^2.0.0" - -postcss-env-function@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-2.0.2.tgz#0f3e3d3c57f094a92c2baf4b6241f0b0da5365d7" - integrity sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw== - dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-focus-visible@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz#477d107113ade6024b14128317ade2bd1e17046e" - integrity sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g== - dependencies: - postcss "^7.0.2" - -postcss-focus-within@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz#763b8788596cee9b874c999201cdde80659ef680" - integrity sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w== - dependencies: - postcss "^7.0.2" - -postcss-font-variant@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz#42d4c0ab30894f60f98b17561eb5c0321f502641" - integrity sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA== - dependencies: - postcss "^7.0.2" - -postcss-gap-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz#431c192ab3ed96a3c3d09f2ff615960f902c1715" - integrity sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg== - dependencies: - postcss "^7.0.2" - -postcss-image-set-function@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz#28920a2f29945bed4c3198d7df6496d410d3f288" - integrity sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw== - dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-import@12.0.1, postcss-import@^12.0.1: - version "12.0.1" - resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-12.0.1.tgz#cf8c7ab0b5ccab5649024536e565f841928b7153" - integrity sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw== - dependencies: - postcss "^7.0.1" - postcss-value-parser "^3.2.3" - read-cache "^1.0.0" - resolve "^1.1.7" - -postcss-import@14.0.0: - version "14.0.0" - resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-14.0.0.tgz#3ed1dadac5a16650bde3f4cdea6633b9c3c78296" - integrity sha512-gFDDzXhqr9ELmnLHgCC3TbGfA6Dm/YMb/UN8/f7Uuq4fL7VTk2vOIj6hwINEwbokEmp123bLD7a5m+E+KIetRg== - dependencies: - postcss-value-parser "^4.0.0" - read-cache "^1.0.0" - resolve "^1.1.7" - -postcss-initial@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.4.tgz#9d32069a10531fe2ecafa0b6ac750ee0bc7efc53" - integrity sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg== - dependencies: - postcss "^7.0.2" - -postcss-lab-function@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz#bb51a6856cd12289ab4ae20db1e3821ef13d7d2e" - integrity sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg== - dependencies: - "@csstools/convert-colors" "^1.4.0" - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-load-config@^2.0.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.2.tgz#c5ea504f2c4aef33c7359a34de3573772ad7502a" - integrity sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw== - dependencies: - cosmiconfig "^5.0.0" - import-cwd "^2.0.0" - -postcss-load-config@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-3.1.0.tgz#d39c47091c4aec37f50272373a6a648ef5e97829" - integrity sha512-ipM8Ds01ZUophjDTQYSVP70slFSYg3T0/zyfII5vzhN6V57YSxMgG5syXuwi5VtS8wSf3iL30v0uBdoIVx4Q0g== - dependencies: - import-cwd "^3.0.0" - lilconfig "^2.0.3" - yaml "^1.10.2" - -postcss-loader@3.0.0, postcss-loader@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d" - integrity sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA== - dependencies: - loader-utils "^1.1.0" - postcss "^7.0.0" - postcss-load-config "^2.0.0" - schema-utils "^1.0.0" - -postcss-loader@4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-4.2.0.tgz#f6993ea3e0f46600fb3ee49bbd010448123a7db4" - integrity sha512-mqgScxHqbiz1yxbnNcPdKYo/6aVt+XExURmEbQlviFVWogDbM4AJ0A/B+ZBpYsJrTRxKw7HyRazg9x0Q9SWwLA== - dependencies: - cosmiconfig "^7.0.0" - klona "^2.0.4" - loader-utils "^2.0.0" - schema-utils "^3.0.0" - semver "^7.3.4" - -postcss-logical@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-3.0.0.tgz#2495d0f8b82e9f262725f75f9401b34e7b45d5b5" - integrity sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA== - dependencies: - postcss "^7.0.2" - -postcss-media-minmax@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz#b75bb6cbc217c8ac49433e12f22048814a4f5ed5" - integrity sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw== - dependencies: - postcss "^7.0.2" - -postcss-merge-longhand@^4.0.11: - version "4.0.11" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" - integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw== - dependencies: - css-color-names "0.0.4" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - stylehacks "^4.0.0" - -postcss-merge-longhand@^5.0.4: - version "5.0.4" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.0.4.tgz#41f4f3270282ea1a145ece078b7679f0cef21c32" - integrity sha512-2lZrOVD+d81aoYkZDpWu6+3dTAAGkCKbV5DoRhnIR7KOULVrI/R7bcMjhrH9KTRy6iiHKqmtG+n/MMj1WmqHFw== - dependencies: - postcss-value-parser "^4.1.0" - stylehacks "^5.0.1" - -postcss-merge-rules@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" - integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ== - dependencies: - 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" - -postcss-merge-rules@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.0.3.tgz#b5cae31f53129812a77e3eb1eeee448f8cf1a1db" - integrity sha512-cEKTMEbWazVa5NXd8deLdCnXl+6cYG7m2am+1HzqH0EnTdy8fRysatkaXb2dEnR+fdaDxTvuZ5zoBdv6efF6hg== - dependencies: - browserslist "^4.16.6" - caniuse-api "^3.0.0" - cssnano-utils "^2.0.1" - postcss-selector-parser "^6.0.5" - -postcss-minify-font-values@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" - integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg== - dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-minify-font-values@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.0.1.tgz#a90cefbfdaa075bd3dbaa1b33588bb4dc268addf" - integrity sha512-7JS4qIsnqaxk+FXY1E8dHBDmraYFWmuL6cgt0T1SWGRO5bzJf8sUoelwa4P88LEWJZweHevAiDKxHlofuvtIoA== - dependencies: - postcss-value-parser "^4.1.0" - -postcss-minify-gradients@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" - integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q== - dependencies: - cssnano-util-get-arguments "^4.0.0" - is-color-stop "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-minify-gradients@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.0.3.tgz#f970a11cc71e08e9095e78ec3a6b34b91c19550e" - integrity sha512-Z91Ol22nB6XJW+5oe31+YxRsYooxOdFKcbOqY/V8Fxse1Y3vqlNRpi1cxCqoACZTQEhl+xvt4hsbWiV5R+XI9Q== - dependencies: - colord "^2.9.1" - cssnano-utils "^2.0.1" - postcss-value-parser "^4.1.0" - -postcss-minify-params@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" - integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg== - dependencies: - 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" - -postcss-minify-params@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.0.2.tgz#1b644da903473fbbb18fbe07b8e239883684b85c" - integrity sha512-qJAPuBzxO1yhLad7h2Dzk/F7n1vPyfHfCCh5grjGfjhi1ttCnq4ZXGIW77GSrEbh9Hus9Lc/e/+tB4vh3/GpDg== - dependencies: - alphanum-sort "^1.0.2" - browserslist "^4.16.6" - cssnano-utils "^2.0.1" - postcss-value-parser "^4.1.0" - -postcss-minify-selectors@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" - integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g== - dependencies: - alphanum-sort "^1.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" - -postcss-minify-selectors@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.1.0.tgz#4385c845d3979ff160291774523ffa54eafd5a54" - integrity sha512-NzGBXDa7aPsAcijXZeagnJBKBPMYLaJJzB8CQh6ncvyl2sIndLVWfbcDi0SBjRWk5VqEjXvf8tYwzoKf4Z07og== - dependencies: - alphanum-sort "^1.0.2" - postcss-selector-parser "^6.0.5" - -postcss-modules-extract-imports@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" - integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== - dependencies: - postcss "^7.0.5" - -postcss-modules-extract-imports@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" - integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== - -postcss-modules-local-by-default@^3.0.2, postcss-modules-local-by-default@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0" - integrity sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw== - dependencies: - icss-utils "^4.1.1" - postcss "^7.0.32" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.1.0" - -postcss-modules-local-by-default@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" - integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== - dependencies: - icss-utils "^5.0.0" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.1.0" - -postcss-modules-scope@^2.1.1, postcss-modules-scope@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" - integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ== - dependencies: - postcss "^7.0.6" - postcss-selector-parser "^6.0.0" - -postcss-modules-scope@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" - integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== - dependencies: - postcss-selector-parser "^6.0.4" - -postcss-modules-values@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" - integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg== - dependencies: - icss-utils "^4.0.0" - postcss "^7.0.6" - -postcss-modules-values@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" - integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== - dependencies: - icss-utils "^5.0.0" - -postcss-nesting@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-7.0.1.tgz#b50ad7b7f0173e5b5e3880c3501344703e04c052" - integrity sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg== - dependencies: - postcss "^7.0.2" - -postcss-normalize-charset@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" - integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== - dependencies: - postcss "^7.0.0" - -postcss-normalize-charset@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.0.1.tgz#121559d1bebc55ac8d24af37f67bd4da9efd91d0" - integrity sha512-6J40l6LNYnBdPSk+BHZ8SF+HAkS4q2twe5jnocgd+xWpz/mx/5Sa32m3W1AA8uE8XaXN+eg8trIlfu8V9x61eg== - -postcss-normalize-display-values@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" - integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ== - dependencies: - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-display-values@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.0.1.tgz#62650b965981a955dffee83363453db82f6ad1fd" - integrity sha512-uupdvWk88kLDXi5HEyI9IaAJTE3/Djbcrqq8YgjvAVuzgVuqIk3SuJWUisT2gaJbZm1H9g5k2w1xXilM3x8DjQ== - dependencies: - cssnano-utils "^2.0.1" - postcss-value-parser "^4.1.0" - -postcss-normalize-positions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" - integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA== - dependencies: - cssnano-util-get-arguments "^4.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-positions@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.0.1.tgz#868f6af1795fdfa86fbbe960dceb47e5f9492fe5" - integrity sha512-rvzWAJai5xej9yWqlCb1OWLd9JjW2Ex2BCPzUJrbaXmtKtgfL8dBMOOMTX6TnvQMtjk3ei1Lswcs78qKO1Skrg== - dependencies: - postcss-value-parser "^4.1.0" - -postcss-normalize-repeat-style@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" - integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q== - dependencies: - cssnano-util-get-arguments "^4.0.0" - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-repeat-style@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.0.1.tgz#cbc0de1383b57f5bb61ddd6a84653b5e8665b2b5" - integrity sha512-syZ2itq0HTQjj4QtXZOeefomckiV5TaUO6ReIEabCh3wgDs4Mr01pkif0MeVwKyU/LHEkPJnpwFKRxqWA/7O3w== - dependencies: - cssnano-utils "^2.0.1" - postcss-value-parser "^4.1.0" - -postcss-normalize-string@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" - integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA== - dependencies: - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-string@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.0.1.tgz#d9eafaa4df78c7a3b973ae346ef0e47c554985b0" - integrity sha512-Ic8GaQ3jPMVl1OEn2U//2pm93AXUcF3wz+OriskdZ1AOuYV25OdgS7w9Xu2LO5cGyhHCgn8dMXh9bO7vi3i9pA== - dependencies: - postcss-value-parser "^4.1.0" - -postcss-normalize-timing-functions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" - integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A== - dependencies: - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-timing-functions@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.0.1.tgz#8ee41103b9130429c6cbba736932b75c5e2cb08c" - integrity sha512-cPcBdVN5OsWCNEo5hiXfLUnXfTGtSFiBU9SK8k7ii8UD7OLuznzgNRYkLZow11BkQiiqMcgPyh4ZqXEEUrtQ1Q== - dependencies: - cssnano-utils "^2.0.1" - postcss-value-parser "^4.1.0" - -postcss-normalize-unicode@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" - integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg== - dependencies: - browserslist "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-unicode@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.0.1.tgz#82d672d648a411814aa5bf3ae565379ccd9f5e37" - integrity sha512-kAtYD6V3pK0beqrU90gpCQB7g6AOfP/2KIPCVBKJM2EheVsBQmx/Iof+9zR9NFKLAx4Pr9mDhogB27pmn354nA== - dependencies: - browserslist "^4.16.0" - postcss-value-parser "^4.1.0" - -postcss-normalize-url@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" - integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA== - dependencies: - is-absolute-url "^2.0.0" - normalize-url "^3.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-url@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.0.3.tgz#42eca6ede57fe69075fab0f88ac8e48916ef931c" - integrity sha512-qWiUMbvkRx3kc1Dp5opzUwc7MBWZcSDK2yofCmdvFBCpx+zFPkxBC1FASQ59Pt+flYfj/nTZSkmF56+XG5elSg== - dependencies: - is-absolute-url "^3.0.3" - normalize-url "^6.0.1" - postcss-value-parser "^4.1.0" - -postcss-normalize-whitespace@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" - integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA== - dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-normalize-whitespace@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.0.1.tgz#b0b40b5bcac83585ff07ead2daf2dcfbeeef8e9a" - integrity sha512-iPklmI5SBnRvwceb/XH568yyzK0qRVuAG+a1HFUsFRf11lEJTiQQa03a4RSCQvLKdcpX7XsI1Gen9LuLoqwiqA== - dependencies: - postcss-value-parser "^4.1.0" - -postcss-ordered-values@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" - integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw== - dependencies: - cssnano-util-get-arguments "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-ordered-values@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.0.2.tgz#1f351426977be00e0f765b3164ad753dac8ed044" - integrity sha512-8AFYDSOYWebJYLyJi3fyjl6CqMEG/UVworjiyK1r573I56kb3e879sCJLGvR3merj+fAdPpVplXKQZv+ey6CgQ== - dependencies: - cssnano-utils "^2.0.1" - postcss-value-parser "^4.1.0" - -postcss-overflow-shorthand@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz#31ecf350e9c6f6ddc250a78f0c3e111f32dd4c30" - integrity sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g== - dependencies: - postcss "^7.0.2" - -postcss-page-break@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-2.0.0.tgz#add52d0e0a528cabe6afee8b46e2abb277df46bf" - integrity sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ== - dependencies: - postcss "^7.0.2" - -postcss-place@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-4.0.1.tgz#e9f39d33d2dc584e46ee1db45adb77ca9d1dcc62" - integrity sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg== - dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-preset-env@6.7.0: - version "6.7.0" - resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz#c34ddacf8f902383b35ad1e030f178f4cdf118a5" - integrity sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg== - dependencies: - autoprefixer "^9.6.1" - browserslist "^4.6.4" - caniuse-lite "^1.0.30000981" - css-blank-pseudo "^0.1.4" - css-has-pseudo "^0.10.0" - css-prefers-color-scheme "^3.1.1" - cssdb "^4.4.0" - postcss "^7.0.17" - postcss-attribute-case-insensitive "^4.0.1" - postcss-color-functional-notation "^2.0.1" - postcss-color-gray "^5.0.0" - postcss-color-hex-alpha "^5.0.3" - postcss-color-mod-function "^3.0.3" - postcss-color-rebeccapurple "^4.0.1" - postcss-custom-media "^7.0.8" - postcss-custom-properties "^8.0.11" - postcss-custom-selectors "^5.1.2" - postcss-dir-pseudo-class "^5.0.0" - postcss-double-position-gradients "^1.0.0" - postcss-env-function "^2.0.2" - postcss-focus-visible "^4.0.0" - postcss-focus-within "^3.0.0" - postcss-font-variant "^4.0.0" - postcss-gap-properties "^2.0.0" - postcss-image-set-function "^3.0.1" - postcss-initial "^3.0.0" - postcss-lab-function "^2.0.1" - postcss-logical "^3.0.0" - postcss-media-minmax "^4.0.0" - postcss-nesting "^7.0.0" - postcss-overflow-shorthand "^2.0.0" - postcss-page-break "^2.0.0" - postcss-place "^4.0.1" - postcss-pseudo-class-any-link "^6.0.0" - postcss-replace-overflow-wrap "^3.0.0" - postcss-selector-matches "^4.0.0" - postcss-selector-not "^4.0.0" - -postcss-pseudo-class-any-link@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz#2ed3eed393b3702879dec4a87032b210daeb04d1" - integrity sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew== - dependencies: - postcss "^7.0.2" - postcss-selector-parser "^5.0.0-rc.3" - -postcss-reduce-initial@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" - integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA== - dependencies: - browserslist "^4.0.0" - caniuse-api "^3.0.0" - has "^1.0.0" - postcss "^7.0.0" - -postcss-reduce-initial@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.0.2.tgz#fa424ce8aa88a89bc0b6d0f94871b24abe94c048" - integrity sha512-v/kbAAQ+S1V5v9TJvbGkV98V2ERPdU6XvMcKMjqAlYiJ2NtsHGlKYLPjWWcXlaTKNxooId7BGxeraK8qXvzKtw== - dependencies: - browserslist "^4.16.6" - caniuse-api "^3.0.0" - -postcss-reduce-transforms@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" - integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg== - dependencies: - cssnano-util-get-match "^4.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - -postcss-reduce-transforms@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.1.tgz#93c12f6a159474aa711d5269923e2383cedcf640" - integrity sha512-a//FjoPeFkRuAguPscTVmRQUODP+f3ke2HqFNgGPwdYnpeC29RZdCBvGRGTsKpMURb/I3p6jdKoBQ2zI+9Q7kA== - dependencies: - cssnano-utils "^2.0.1" - postcss-value-parser "^4.1.0" - -postcss-replace-overflow-wrap@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz#61b360ffdaedca84c7c918d2b0f0d0ea559ab01c" - integrity sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw== - dependencies: - postcss "^7.0.2" - -postcss-reporter@^7.0.0: - version "7.0.4" - resolved "https://registry.yarnpkg.com/postcss-reporter/-/postcss-reporter-7.0.4.tgz#640de7ef30fa89374bc0d5029c307ad2ecda25c3" - integrity sha512-jY/fnpGSin7kwJeunXbY35STp5O3VIxSFdjee5JkoPQ+FfGH5JW3N+Xe9oAPcL9UkjWjkK+JC72o8XH4XXKdhw== - dependencies: - lodash.difference "^4.5.0" - lodash.forown "^4.4.0" - lodash.get "^4.4.2" - lodash.groupby "^4.6.0" - lodash.sortby "^4.7.0" - picocolors "^1.0.0" - -postcss-responsive-type@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/postcss-responsive-type/-/postcss-responsive-type-1.0.0.tgz#bb2d57d830beb9586ec4fda7994f07e37953aad8" - integrity sha1-uy1X2DC+uVhuxP2nmU8H43lTqtg= - dependencies: - postcss "^6.0.6" - -postcss-selector-matches@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz#71c8248f917ba2cc93037c9637ee09c64436fcff" - integrity sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww== - dependencies: - balanced-match "^1.0.0" - postcss "^7.0.2" - -postcss-selector-not@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz#263016eef1cf219e0ade9a913780fc1f48204cbf" - integrity sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ== - dependencies: - balanced-match "^1.0.0" - postcss "^7.0.2" - -postcss-selector-parser@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270" - integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA== - dependencies: - dot-prop "^5.2.0" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" - integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ== - dependencies: - cssesc "^2.0.0" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5: - version "6.0.6" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz#2c5bba8174ac2f6981ab631a42ab0ee54af332ea" - integrity sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-svgo@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.3.tgz#343a2cdbac9505d416243d496f724f38894c941e" - integrity sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw== - dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - svgo "^1.0.0" - -postcss-svgo@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.0.3.tgz#d945185756e5dfaae07f9edb0d3cae7ff79f9b30" - integrity sha512-41XZUA1wNDAZrQ3XgWREL/M2zSw8LJPvb5ZWivljBsUQAGoEKMYm6okHsTjJxKYI4M75RQEH4KYlEM52VwdXVA== - dependencies: - postcss-value-parser "^4.1.0" - svgo "^2.7.0" - -postcss-unique-selectors@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" - integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg== - dependencies: - alphanum-sort "^1.0.0" - postcss "^7.0.0" - uniqs "^2.0.0" - -postcss-unique-selectors@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.0.2.tgz#5d6893daf534ae52626708e0d62250890108c0c1" - integrity sha512-w3zBVlrtZm7loQWRPVC0yjUwwpty7OM6DnEHkxcSQXO1bMS3RJ+JUS5LFMSDZHJcvGsRwhZinCWVqn8Kej4EDA== - dependencies: - alphanum-sort "^1.0.2" - postcss-selector-parser "^6.0.5" - -postcss-value-parser@^3.0.0, postcss-value-parser@^3.2.3: - version "3.3.1" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" - integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== - -postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f" - integrity sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg== - dependencies: - flatten "^1.0.2" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss@7.0.21: - version "7.0.21" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.21.tgz#06bb07824c19c2021c5d056d5b10c35b989f7e17" - integrity sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ== - dependencies: - chalk "^2.4.2" - source-map "^0.6.1" - supports-color "^6.1.0" - -postcss@7.0.32: - version "7.0.32" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.32.tgz#4310d6ee347053da3433db2be492883d62cec59d" - integrity sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw== - dependencies: - chalk "^2.4.2" - source-map "^0.6.1" - supports-color "^6.1.0" - -postcss@8.2.15: - version "8.2.15" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.2.15.tgz#9e66ccf07292817d226fc315cbbf9bc148fbca65" - integrity sha512-2zO3b26eJD/8rb106Qu2o7Qgg52ND5HPjcyQiK2B98O388h43A448LCslC0dI2P97wCAQRJsFvwTRcXxTKds+Q== - dependencies: - colorette "^1.2.2" - nanoid "^3.1.23" - source-map "^0.6.1" - -postcss@^6.0.6: - version "6.0.23" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" - integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== - dependencies: - chalk "^2.4.1" - source-map "^0.6.1" - supports-color "^5.4.0" - -postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.23, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.35, postcss@^7.0.5, postcss@^7.0.6: - version "7.0.39" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" - integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== - dependencies: - picocolors "^0.2.1" - source-map "^0.6.1" - -postcss@^8.1.4, postcss@^8.3.7: - version "8.4.4" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.4.tgz#d53d4ec6a75fd62557a66bb41978bf47ff0c2869" - integrity sha512-joU6fBsN6EIer28Lj6GDFoC/5yOZzLCfn0zHAn/MYXI7aPt4m4hK5KC5ovEZXy+lnCjmYIbQWngvju2ddyEr8Q== - dependencies: - nanoid "^3.1.30" - picocolors "^1.0.0" - source-map-js "^1.0.1" - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= - -prepend-http@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= - -prepend-http@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" - integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= - -pretty-bytes@^5.3.0, pretty-bytes@^5.6.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" - integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== - -pretty-error@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.2.tgz#be89f82d81b1c86ec8fdfbc385045882727f93b6" - integrity sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw== - dependencies: - lodash "^4.17.20" - renderkid "^2.0.4" - -pretty-hrtime@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" - integrity sha1-t+PqQkNaTJsnWdmeDyAesZWALuE= - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= - -promise-inflight@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= - -promise-retry@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-1.1.1.tgz#6739e968e3051da20ce6497fb2b50f6911df3d6d" - integrity sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0= - dependencies: - err-code "^1.0.0" - retry "^0.10.0" - -promise-retry@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" - integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== - dependencies: - err-code "^2.0.2" - retry "^0.12.0" - -prompts@~2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2: - version "15.7.2" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" - integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.8.1" - -protractor-istanbul-plugin@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/protractor-istanbul-plugin/-/protractor-istanbul-plugin-2.0.0.tgz#f6271d2a5d6382488e86ff9fb7770f46a8b2c5e2" - integrity sha1-9icdKl1jgkiOhv+ft3cPRqiyxeI= - dependencies: - fs-extra "^0.22.1" - merge "^1.2.0" - q "^1.4.1" - uuid "^2.0.1" - -protractor@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/protractor/-/protractor-7.0.0.tgz#c3e263608bd72e2c2dc802b11a772711a4792d03" - integrity sha512-UqkFjivi4GcvUQYzqGYNe0mLzfn5jiLmO8w9nMhQoJRLhy2grJonpga2IWhI6yJO30LibWXJJtA4MOIZD2GgZw== - dependencies: - "@types/q" "^0.0.32" - "@types/selenium-webdriver" "^3.0.0" - blocking-proxy "^1.0.0" - browserstack "^1.5.1" - chalk "^1.1.3" - glob "^7.0.3" - jasmine "2.8.0" - jasminewd2 "^2.1.0" - q "1.4.1" - saucelabs "^1.5.0" - selenium-webdriver "3.6.0" - source-map-support "~0.4.0" - webdriver-js-extender "2.1.0" - webdriver-manager "^12.1.7" - yargs "^15.3.1" - -proxy-addr@~2.0.5: - version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - -proxy-from-env@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" - integrity sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4= - -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= - -psl@^1.1.28, psl@^1.1.33: - version "1.8.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== - -pstree.remy@^1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" - integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== - -public-encrypt@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" - integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - safe-buffer "^5.1.2" - -pump@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" - integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pumpify@^1.3.3: - version "1.5.1" - resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" - integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== - dependencies: - duplexify "^3.6.0" - inherits "^2.0.3" - pump "^2.0.0" - -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= - -punycode@^1.2.4: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= - -punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -pupa@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62" - integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== - dependencies: - escape-goat "^2.0.0" - -q@1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" - integrity sha1-VXBbzZPF82c1MMLCy8DCs63cKG4= - -q@^1.1.2, q@^1.4.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= - -qjobs@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071" - integrity sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg== - -qs@6.2.3: - version "6.2.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.3.tgz#1cfcb25c10a9b2b483053ff39f5dfc9233908cfe" - integrity sha1-HPyyXBCpsrSDBT/zn138kjOQjP4= - -qs@6.7.0: - version "6.7.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" - integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== - -qs@~6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== - -query-string@^4.1.0: - version "4.3.4" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" - integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s= - dependencies: - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" - -querystring-es3@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= - -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= - -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -raf-schd@^4.0.2: - version "4.0.3" - resolved "https://registry.yarnpkg.com/raf-schd/-/raf-schd-4.0.3.tgz#5d6c34ef46f8b2a0e880a8fcdb743efc5bfdbc1a" - integrity sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ== - -ramda@~0.27.1: - version "0.27.1" - resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.27.1.tgz#66fc2df3ef873874ffc2da6aa8984658abacf5c9" - integrity sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw== - -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -randomfill@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" - integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== - dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - -range-parser@^1.2.1, range-parser@~1.2.0, range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" - integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== - dependencies: - bytes "3.1.0" - http-errors "1.7.2" - iconv-lite "0.4.24" - unpipe "1.0.0" - -raw-body@^2.3.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.2.tgz#baf3e9c21eebced59dd6533ac872b71f7b61cb32" - integrity sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ== - dependencies: - bytes "3.1.1" - http-errors "1.8.1" - iconv-lite "0.4.24" - unpipe "1.0.0" - -raw-loader@0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa" - integrity sha1-DD0L6u2KAclm2Xh793goElKpeao= - -raw-loader@4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-4.0.1.tgz#14e1f726a359b68437e183d5a5b7d33a3eba6933" - integrity sha512-baolhQBSi3iNh1cglJjA0mYzga+wePk7vdEX//1dTFd+v4TsQlQE0jitJSNF1OIP82rdYulH7otaVmdlDaJ64A== - dependencies: - loader-utils "^2.0.0" - schema-utils "^2.6.5" - -raw-loader@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-4.0.2.tgz#1aac6b7d1ad1501e66efdac1522c73e59a584eb6" - integrity sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA== - dependencies: - loader-utils "^2.0.0" - schema-utils "^3.0.0" - -rc@^1.2.8: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -re-reselect@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/re-reselect/-/re-reselect-4.0.0.tgz#9ddec4c72c4d952f68caa5aa4b76a9ed38b75cac" - integrity sha512-wuygyq8TXUlSdVXv2kigXxQNOgdb9m7LbIjwfTNGSpaY1riLd5e+VeQjlQMyUtrk0oiyhi1AqIVynworl3qxHA== - -re-resizable@6.9.1: - version "6.9.1" - resolved "https://registry.yarnpkg.com/re-resizable/-/re-resizable-6.9.1.tgz#6be082b55d02364ca4bfee139e04feebdf52441c" - integrity sha512-KRYAgr9/j1PJ3K+t+MBhlQ+qkkoLDJ1rs0z1heIWvYbCW/9Vq4djDU+QumJ3hQbwwtzXF6OInla6rOx6hhgRhQ== - dependencies: - fast-memoize "^2.5.1" - -react-aria-live@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/react-aria-live/-/react-aria-live-2.0.5.tgz#333480cb898d6963421bd86fe3cbd0ce54e37f08" - integrity sha512-rXiH1HNKJrr/UfVeGwA2aKY43r5WbjLs+AYB6/kJF1qny2hwxzQc1qewQmUpdQ5h8HAOTD8O/XlGcEHjqlCl0g== - dependencies: - uuid "^3.2.1" - -react-beautiful-dnd@^13.0.0: - version "13.1.0" - resolved "https://registry.yarnpkg.com/react-beautiful-dnd/-/react-beautiful-dnd-13.1.0.tgz#ec97c81093593526454b0de69852ae433783844d" - integrity sha512-aGvblPZTJowOWUNiwd6tNfEpgkX5OxmpqxHKNW/4VmvZTNTbeiq7bA3bn5T+QSF2uibXB0D1DmJsb1aC/+3cUA== - dependencies: - "@babel/runtime" "^7.9.2" - css-box-model "^1.2.0" - memoize-one "^5.1.1" - raf-schd "^4.0.2" - react-redux "^7.2.0" - redux "^4.0.4" - use-memo-one "^1.1.1" - -react-copy-to-clipboard@^5.0.1: - version "5.0.4" - resolved "https://registry.yarnpkg.com/react-copy-to-clipboard/-/react-copy-to-clipboard-5.0.4.tgz#42ec519b03eb9413b118af92d1780c403a5f19bf" - integrity sha512-IeVAiNVKjSPeGax/Gmkqfa/+PuMTBhutEvFUaMQLwE2tS0EXrAdgOpWDX26bWTXF3HrioorR7lr08NqeYUWQCQ== - dependencies: - copy-to-clipboard "^3" - prop-types "^15.5.8" - -react-dnd-html5-backend@^10.0.2: - version "10.0.2" - resolved "https://registry.yarnpkg.com/react-dnd-html5-backend/-/react-dnd-html5-backend-10.0.2.tgz#15cb9d2b923f43576a136df854e288cb5969784c" - integrity sha512-ny17gUdInZ6PIGXdzfwPhoztRdNVVvjoJMdG80hkDBamJBeUPuNF2Wv4D3uoQJLjXssX1+i9PhBqc7EpogClwQ== - dependencies: - dnd-core "^10.0.2" - -react-dnd-multi-backend@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/react-dnd-multi-backend/-/react-dnd-multi-backend-5.1.1.tgz#1ddb243cea74e41efa3932e6403bb84d0a8cd11b" - integrity sha512-u085U6tIAfkFzaBhe0AhZZIhs9Ta1sRcp+S/A7JR81B1TjtPVLYIoTyqCO91wG1Iz5+MEVL88aYuRPayMY4HXQ== - dependencies: - dnd-multi-backend "^5.1.1" - prop-types "^15.7.2" - react-dnd-preview "^5.1.1" - -react-dnd-preview@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/react-dnd-preview/-/react-dnd-preview-5.1.1.tgz#90c4ad49e90d9abe39728b762d72132b8589b784" - integrity sha512-RryrwRRfF22kL8CQcYqDHt4WLbytRbVNXYnjPkyZKfGsXfQnY0j8OtxokTee4Ba3OkcSiSYQbLhDRFw9wiJj5g== - dependencies: - prop-types "^15.7.2" - -react-dnd-touch-backend@^10.0.2: - version "10.0.2" - resolved "https://registry.yarnpkg.com/react-dnd-touch-backend/-/react-dnd-touch-backend-10.0.2.tgz#90cb916655539b838d49b8895e1813f8b874b3b4" - integrity sha512-+lW/Ern0dKyHToD0oP+Wc/ZD6l7qJazosLqbjzL7OnPlig6WxdlrHkJylOLkeAdZj41fIJJ551Lb57pIL0CcPw== - dependencies: - "@react-dnd/invariant" "^2.0.0" - dnd-core "^10.0.2" - -react-dnd@^10.0.2: - version "10.0.2" - resolved "https://registry.yarnpkg.com/react-dnd/-/react-dnd-10.0.2.tgz#a6ad8eb3d9f2c573031f7ce05012e5c767a0b1fc" - integrity sha512-SC2Ymvntynhoqtf5zaFhZscm9xenCoMofilxPdlwUlaelAzmbl9fw82C4ZJ//+lNm3kWAKXjGDZg2/aWjKEAtg== - dependencies: - "@react-dnd/shallowequal" "^2.0.0" - "@types/hoist-non-react-statics" "^3.3.1" - dnd-core "^10.0.2" - hoist-non-react-statics "^3.3.0" - -react-dom@^16.14.0: - version "16.14.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.14.0.tgz#7ad838ec29a777fb3c75c3a190f661cf92ab8b89" - integrity sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.2" - scheduler "^0.19.1" - -react-draggable@4.4.3: - version "4.4.3" - resolved "https://registry.yarnpkg.com/react-draggable/-/react-draggable-4.4.3.tgz#0727f2cae5813e36b0e4962bf11b2f9ef2b406f3" - integrity sha512-jV4TE59MBuWm7gb6Ns3Q1mxX8Azffb7oTtDtBgFkxRvhDp38YAARmRplrj0+XGkhOJB5XziArX+4HUUABtyZ0w== - dependencies: - classnames "^2.2.5" - prop-types "^15.6.0" - -react-full-screen@^0.2.4: - version "0.2.5" - resolved "https://registry.yarnpkg.com/react-full-screen/-/react-full-screen-0.2.5.tgz#bc79a5cdb9640d8b9b09e11a17fa54f6e6fa5789" - integrity sha512-LNkxjLWmiR+AwemSVdn/miUcBy8tHA6mDVS1qz1AM/DHNEtQbzkh5ok9A6g99502OqutQq1zBvCBGLV8rsB2tw== - dependencies: - "@types/react" "*" - fscreen "^1.0.1" - -react-i18next@^11.7.0: - version "11.14.3" - resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-11.14.3.tgz#b44b5c4d1aadac5211be011827a2830be60f2522" - integrity sha512-Hf2aanbKgYxPjG8ZdKr+PBz9sY6sxXuZWizxCYyJD2YzvJ0W9JTQcddVEjDaKyBoCyd3+5HTerdhc9ehFugc6g== - dependencies: - "@babel/runtime" "^7.14.5" - html-parse-stringify "^3.0.1" - -react-image@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/react-image/-/react-image-4.0.3.tgz#6fa722877660b67295298a914bff1ed87ad2cf83" - integrity sha512-19MUK9u1qaw9xys8XEsVkSpVhHctEBUeYFvrLTe1PN+4w5Co13AN2WA7xtBshPM6SthsOj77SlDrEAeOaJpf7g== - -react-is@^16.7.0, react-is@^16.8.1: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -"react-is@^16.8.0 || ^17.0.0", react-is@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" - integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== - -react-mosaic-component@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/react-mosaic-component/-/react-mosaic-component-4.1.1.tgz#48a34e5e5c16654075212666c2aebeb488bab9f2" - integrity sha512-HVlLvfYQ/AKmoKvw95Orx3Qyc7SNuS/QlAy+SkAVit1g9ipzXBGYoBg7RMXP5sF5w47CgYxA+1gT+fYRVf73jA== - dependencies: - classnames "^2.2.6" - immutability-helper "^3.0.1" - lodash "^4.17.11" - prop-types "^15.7.2" - react-dnd "^10.0.2" - react-dnd-html5-backend "^10.0.2" - react-dnd-multi-backend "^5.0.0" - react-dnd-touch-backend "^10.0.2" - uuid "^3.3.2" - -react-redux@^7.1.0, react-redux@^7.2.0: - version "7.2.6" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.6.tgz#49633a24fe552b5f9caf58feb8a138936ddfe9aa" - integrity sha512-10RPdsz0UUrRL1NZE0ejTkucnclYSgXp5q+tB5SWx2qeG2ZJQJyymgAhwKy73yiL/13btfB6fPr+rgbMAaZIAQ== - dependencies: - "@babel/runtime" "^7.15.4" - "@types/react-redux" "^7.1.20" - hoist-non-react-statics "^3.3.2" - loose-envify "^1.4.0" - prop-types "^15.7.2" - react-is "^17.0.2" - -react-resize-observer@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/react-resize-observer/-/react-resize-observer-1.1.1.tgz#641dfa2e0f4bd2549a8ab4bbbaf43b68f3dcaf76" - integrity sha512-3R+90Hou90Mr3wJYc+unsySC8Pn91V4nmjO32NKvUvjphRUbq9HisyLg7bDyGBE7xlMrrM6Fax7iNQaFdc/FYA== - -react-rnd@^10.1: - version "10.3.5" - resolved "https://registry.yarnpkg.com/react-rnd/-/react-rnd-10.3.5.tgz#b66e5e06f1eb6823e72eb4b552081b4b9241b139" - integrity sha512-LWJP+l5bp76sDPKrKM8pwGJifI6i3B5jHK4ONACczVMbR8ycNGA75ORRqpRuXGyKawUs68s1od05q8cqWgQXgw== - dependencies: - re-resizable "6.9.1" - react-draggable "4.4.3" - tslib "2.3.0" - -react-sizeme@^2.6.7: - version "2.6.12" - resolved "https://registry.yarnpkg.com/react-sizeme/-/react-sizeme-2.6.12.tgz#ed207be5476f4a85bf364e92042520499455453e" - integrity sha512-tL4sCgfmvapYRZ1FO2VmBmjPVzzqgHA7kI8lSJ6JS6L78jXFNRdOZFpXyK6P1NBZvKPPCZxReNgzZNUajAerZw== - dependencies: - element-resize-detector "^1.2.1" - invariant "^2.2.4" - shallowequal "^1.1.0" - throttle-debounce "^2.1.0" - -react-transition-group@^4.4.0: - version "4.4.2" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.2.tgz#8b59a56f09ced7b55cbd53c36768b922890d5470" - integrity sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg== - dependencies: - "@babel/runtime" "^7.5.5" - dom-helpers "^5.0.1" - loose-envify "^1.4.0" - prop-types "^15.6.2" - -react-virtualized-auto-sizer@^1.0.2: - version "1.0.6" - resolved "https://registry.yarnpkg.com/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.6.tgz#66c5b1c9278064c5ef1699ed40a29c11518f97ca" - integrity sha512-7tQ0BmZqfVF6YYEWcIGuoR3OdYe8I/ZFbNclFlGOC3pMqunkYF/oL30NCjSGl9sMEb17AnzixDz98Kqc3N76HQ== - -react-window@^1.8.5: - version "1.8.6" - resolved "https://registry.yarnpkg.com/react-window/-/react-window-1.8.6.tgz#d011950ac643a994118632665aad0c6382e2a112" - integrity sha512-8VwEEYyjz6DCnGBsd+MgkD0KJ2/OXFULyDtorIiTz+QzwoP94tBoA7CnbtyXMm+cCeAUER5KJcPtWl9cpKbOBg== - dependencies: - "@babel/runtime" "^7.0.0" - memoize-one ">=3.1.1 <6" - -react@^16.14.0: - version "16.14.0" - resolved "https://registry.yarnpkg.com/react/-/react-16.14.0.tgz#94d776ddd0aaa37da3eda8fc5b6b18a4c9a3114d" - integrity sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.2" - -read-cache@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" - integrity sha1-5mTvMRYRZsl1HNvo28+GtftY93Q= - dependencies: - pify "^2.3.0" - -read-package-json-fast@^1.1.3: - version "1.2.2" - resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-1.2.2.tgz#fba77b0b0d66b1ab344e214cb0876577e749c423" - integrity sha512-39DbPJjkltEzfXJXB6D8/Ir3GFOU2YbSKa2HaB/Y3nKrc/zY+0XrALpID6/13ezWyzqvOHrBbR4t4cjQuTdBVQ== - dependencies: - json-parse-even-better-errors "^2.3.0" - npm-normalize-package-bin "^1.0.1" - -read-package-json-fast@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz#323ca529630da82cb34b36cc0b996693c98c2b83" - integrity sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ== - dependencies: - json-parse-even-better-errors "^2.3.0" - npm-normalize-package-bin "^1.0.1" - -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - 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" - -readable-stream@^3.0.6, readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" - integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== - dependencies: - graceful-fs "^4.1.11" - micromatch "^3.1.10" - readable-stream "^2.0.2" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -rechoir@^0.7.0: - version "0.7.1" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686" - integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== - dependencies: - resolve "^1.9.0" - -redux-devtools-extension@^2.13.2: - version "2.13.9" - resolved "https://registry.yarnpkg.com/redux-devtools-extension/-/redux-devtools-extension-2.13.9.tgz#6b764e8028b507adcb75a1cae790f71e6be08ae7" - integrity sha512-cNJ8Q/EtjhQaZ71c8I9+BPySIBVEKssbPpskBfsXqb8HJ002A3KRVHfeRzwRo6mGPqsm7XuHTqNSNeS1Khig0A== - -redux-saga@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/redux-saga/-/redux-saga-1.1.3.tgz#9f3e6aebd3c994bbc0f6901a625f9a42b51d1112" - integrity sha512-RkSn/z0mwaSa5/xH/hQLo8gNf4tlvT18qXDNvedihLcfzh+jMchDgaariQoehCpgRltEm4zHKJyINEz6aqswTw== - dependencies: - "@redux-saga/core" "^1.1.3" - -redux-thunk@^2.3.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.4.1.tgz#0dd8042cf47868f4b29699941de03c9301a75714" - integrity sha512-OOYGNY5Jy2TWvTL1KgAlVy6dcx3siPJ1wTq741EPyUKfn6W6nChdICjZwCd0p8AZBs5kWpZlbkXW2nE/zjUa+Q== - -redux@^4.0.0, redux@^4.0.4, redux@^4.0.5: - version "4.1.2" - resolved "https://registry.yarnpkg.com/redux/-/redux-4.1.2.tgz#140f35426d99bb4729af760afcf79eaaac407104" - integrity sha512-SH8PglcebESbd/shgf6mii6EIoRM0zrQyjcuQ+ojmfxjTtE0z9Y8pa62iA/OJ58qjP6j27uyW4kUF4jl/jd6sw== - dependencies: - "@babel/runtime" "^7.9.2" - -reflect-metadata@^0.1.13, reflect-metadata@^0.1.2: - version "0.1.13" - resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" - integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== - -regenerate-unicode-properties@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz#54d09c7115e1f53dc2314a974b32c1c344efe326" - integrity sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA== - dependencies: - regenerate "^1.4.2" - -regenerate@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" - integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== - -regenerator-runtime@0.13.7: - version "0.13.7" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" - integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== - -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== - -regenerator-runtime@^0.13.4: - version "0.13.9" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" - integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== - -regenerator-transform@^0.14.2: - version "0.14.5" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" - integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== - dependencies: - "@babel/runtime" "^7.8.4" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -regex-parser@^2.2.11: - version "2.2.11" - resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" - integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== - -regexp.prototype.flags@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" - integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -regexpu-core@^4.7.1: - version "4.8.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.8.0.tgz#e5605ba361b67b1718478501327502f4479a98f0" - integrity sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg== - dependencies: - regenerate "^1.4.2" - regenerate-unicode-properties "^9.0.0" - regjsgen "^0.5.2" - regjsparser "^0.7.0" - unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.0.0" - -registry-auth-token@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250" - integrity sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw== - dependencies: - rc "^1.2.8" - -registry-url@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" - integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== - dependencies: - rc "^1.2.8" - -regjsgen@^0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" - integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== - -regjsparser@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.7.0.tgz#a6b667b54c885e18b52554cb4960ef71187e9968" - integrity sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ== - dependencies: - jsesc "~0.5.0" - -relateurl@^0.2.7: - version "0.2.7" - resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" - integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= - -renderkid@^2.0.4: - version "2.0.7" - resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.7.tgz#464f276a6bdcee606f4a15993f9b29fc74ca8609" - integrity sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ== - dependencies: - css-select "^4.1.3" - dom-converter "^0.2.0" - htmlparser2 "^6.1.0" - lodash "^4.17.21" - strip-ansi "^3.0.1" - -repeat-element@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" - integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - -request-progress@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-3.0.0.tgz#4ca754081c7fec63f505e4faa825aa06cd669dbe" - integrity sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4= - dependencies: - throttleit "^1.0.0" - -request@^2.87.0, request@^2.88.2: - version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" - integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= - -reselect@^4.0.0: - version "4.1.5" - resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.1.5.tgz#852c361247198da6756d07d9296c2b51eddb79f6" - integrity sha512-uVdlz8J7OO+ASpBYoz1Zypgx0KasCY20H+N8JD13oUMtPvSHQuscrHop4KbXrbsBcdB9Ds7lVK7eRkBIfO43vQ== - -resolve-cwd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" - integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= - dependencies: - resolve-from "^3.0.0" - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha1-six699nWiBvItuZTM17rywoYh0g= - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve-url-loader@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-3.1.2.tgz#235e2c28e22e3e432ba7a5d4e305c59a58edfc08" - integrity sha512-QEb4A76c8Mi7I3xNKXlRKQSlLBwjUV/ULFMP+G7n3/7tJZ8MG5wsZ3ucxP1Jz8Vevn6fnJsxDx9cIls+utGzPQ== - dependencies: - adjust-sourcemap-loader "3.0.0" - camelcase "5.3.1" - compose-function "3.0.3" - convert-source-map "1.7.0" - es6-iterator "2.0.3" - loader-utils "1.2.3" - postcss "7.0.21" - rework "1.0.1" - rework-visit "1.0.0" - source-map "0.6.1" - -resolve-url-loader@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz#d50d4ddc746bb10468443167acf800dcd6c3ad57" - integrity sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA== - dependencies: - adjust-sourcemap-loader "^4.0.0" - convert-source-map "^1.7.0" - loader-utils "^2.0.0" - postcss "^7.0.35" - source-map "0.6.1" - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= - -resolve@1.19.0: - version "1.19.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" - integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== - dependencies: - is-core-module "^2.1.0" - path-parse "^1.0.6" - -resolve@^1.1.7, resolve@^1.3.2, resolve@^1.8.1, resolve@^1.9.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" - integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== - dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" - -resp-modifier@6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/resp-modifier/-/resp-modifier-6.0.2.tgz#b124de5c4fbafcba541f48ffa73970f4aa456b4f" - integrity sha1-sSTeXE+6/LpUH0j/pzlw9KpFa08= - dependencies: - debug "^2.2.0" - minimatch "^3.0.2" - -responselike@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" - integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= - dependencies: - lowercase-keys "^1.0.0" - -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - -retry@^0.10.0: - version "0.10.1" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" - integrity sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q= - -retry@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" - integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= - -retry@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" - integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rework-visit@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/rework-visit/-/rework-visit-1.0.0.tgz#9945b2803f219e2f7aca00adb8bc9f640f842c9a" - integrity sha1-mUWygD8hni96ygCtuLyfZA+ELJo= - -rework@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/rework/-/rework-1.0.1.tgz#30806a841342b54510aa4110850cd48534144aa7" - integrity sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc= - dependencies: - convert-source-map "^0.3.3" - css "^2.0.0" - -rfdc@^1.1.4, rfdc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" - integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== - -rgb-regex@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" - integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= - -rgba-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" - integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= - -rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.3, rimraf@^2.7.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -rollup@2.26.5: - version "2.26.5" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.26.5.tgz#5562ec36fcba3eed65cfd630bd78e037ad0e0307" - integrity sha512-rCyFG3ZtQdnn9YwfuAVH0l/Om34BdO5lwCA0W6Hq+bNB21dVEBbCRxhaHOmu1G7OBFDWytbzAC104u7rxHwGjA== - optionalDependencies: - fsevents "~2.1.2" - -rollup@2.38.4: - version "2.38.4" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.38.4.tgz#1b84ea8728c73b1a00a6a6e9c630ec8c3fe48cea" - integrity sha512-B0LcJhjiwKkTl79aGVF/u5KdzsH8IylVfV56Ut6c9ouWLJcUK17T83aZBetNYSnZtXf2OHD4+2PbmRW+Fp5ulg== - optionalDependencies: - fsevents "~2.3.1" - -rtl-css-js@^1.13.1: - version "1.15.0" - resolved "https://registry.yarnpkg.com/rtl-css-js/-/rtl-css-js-1.15.0.tgz#680ed816e570a9ebccba9e1cd0f202c6a8bb2dc0" - integrity sha512-99Cu4wNNIhrI10xxUaABHsdDqzalrSRTie4GeCmbGVuehm4oj+fIy8fTzB+16pmKe8Bv9rl+hxIBez6KxExTew== - dependencies: - "@babel/runtime" "^7.1.2" - -run-async@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -run-queue@^1.0.0, run-queue@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" - integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= - dependencies: - aproba "^1.1.1" - -rx@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" - integrity sha1-pfE/957zt0D+MKqAP7CfmIBdR4I= - -rxjs-report-usage@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/rxjs-report-usage/-/rxjs-report-usage-1.0.6.tgz#6e06034d9e1592e8a45bee877631638e4bac2576" - integrity sha512-omv1DIv5z1kV+zDAEjaDjWSkx8w5TbFp5NZoPwUipwzYVcor/4So9ZU3bUyQ1c8lxY5Q0Es/ztWW7PGjY7to0Q== - dependencies: - "@babel/parser" "^7.10.3" - "@babel/traverse" "^7.10.3" - "@babel/types" "^7.10.3" - bent "~7.3.6" - chalk "~4.1.0" - glob "~7.2.0" - prompts "~2.4.2" - -rxjs-spy@^7.5.3: - version "7.5.3" - resolved "https://registry.yarnpkg.com/rxjs-spy/-/rxjs-spy-7.5.3.tgz#0194bc23ed0c30fb6a61f8bccbc8090e545b91b9" - integrity sha512-8QsSL6Ma51dTeaJ5Q9zWqhqnCSEkDf56Evs1gUsI9N22oB7bYrPMMx4UnoifNGc+Pko2sGX/xydzinLwGO+2pw== - dependencies: - "@types/circular-json" "^0.4.0" - "@types/stacktrace-js" "^0.0.33" - circular-json "^0.5.0" - error-stack-parser "^2.0.1" - rxjs-report-usage "^1.0.4" - stacktrace-gps "^3.0.2" - -rxjs@6.6.2: - version "6.6.2" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.2.tgz#8096a7ac03f2cc4fe5860ef6e572810d9e01c0d2" - integrity sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg== - dependencies: - tslib "^1.9.0" - -rxjs@6.6.3: - version "6.6.3" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" - integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ== - dependencies: - tslib "^1.9.0" - -rxjs@6.6.7, rxjs@^6.5.3, rxjs@^6.5.5, rxjs@^6.6.0, rxjs@^6.6.3, rxjs@~6.6.0: - version "6.6.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== - dependencies: - tslib "^1.9.0" - -rxjs@^5.5.6: - version "5.5.12" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.12.tgz#6fa61b8a77c3d793dbaf270bee2f43f652d741cc" - integrity sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw== - dependencies: - symbol-observable "1.0.1" - -rxjs@^7.4.0: - version "7.4.0" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.4.0.tgz#a12a44d7eebf016f5ff2441b87f28c9a51cebc68" - integrity sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w== - dependencies: - tslib "~2.1.0" - -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@^2.1.2, safer-buffer@~2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sass-loader@10.0.1: - version "10.0.1" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-10.0.1.tgz#10c0364d8034f22fee25ddcc9eded20f99bbe3b4" - integrity sha512-b2PSldKVTS3JcFPHSrEXh3BeAfR7XknGiGCAO5aHruR3Pf3kqLP3Gb2ypXLglRrAzgZkloNxLZ7GXEGDX0hBUQ== - dependencies: - klona "^2.0.3" - loader-utils "^2.0.0" - neo-async "^2.6.2" - schema-utils "^2.7.0" - semver "^7.3.2" - -sass-loader@10.1.1: - version "10.1.1" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-10.1.1.tgz#4ddd5a3d7638e7949065dd6e9c7c04037f7e663d" - integrity sha512-W6gVDXAd5hR/WHsPicvZdjAWHBcEJ44UahgxcIE196fW2ong0ZHMPO1kZuI5q0VlvMQZh32gpv69PLWQm70qrw== - dependencies: - klona "^2.0.4" - loader-utils "^2.0.0" - neo-async "^2.6.2" - schema-utils "^3.0.0" - semver "^7.3.2" - -sass-resources-loader@^2.1.1: - version "2.2.4" - resolved "https://registry.yarnpkg.com/sass-resources-loader/-/sass-resources-loader-2.2.4.tgz#1a86fba499e74a88cb7ce95f0c98449f348d360e" - integrity sha512-hIQhBygYky+rLf+4cuoGYONZ623CEH4Swo1fs1WRJkukbqdvN1VIu2KCL59du6vX92bNELzNkGPLx+NorN73xA== - dependencies: - async "^3.2.0" - chalk "^4.1.0" - glob "^7.1.6" - loader-utils "^2.0.0" - -sass@1.26.10: - version "1.26.10" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.26.10.tgz#851d126021cdc93decbf201d1eca2a20ee434760" - integrity sha512-bzN0uvmzfsTvjz0qwccN1sPm2HxxpNI/Xa+7PlUEMS+nQvbyuEK7Y0qFqxlPHhiNHb1Ze8WQJtU31olMObkAMw== - dependencies: - chokidar ">=2.0.0 <4.0.0" - -sass@1.32.6: - version "1.32.6" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.32.6.tgz#e3646c8325cd97ff75a8a15226007f3ccd221393" - integrity sha512-1bcDHDcSqeFtMr0JXI3xc/CXX6c4p0wHHivJdru8W7waM7a1WjKMm4m/Z5sY7CbVw4Whi2Chpcw6DFfSWwGLzQ== - dependencies: - chokidar ">=2.0.0 <4.0.0" - -saucelabs@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/saucelabs/-/saucelabs-1.5.0.tgz#9405a73c360d449b232839919a86c396d379fd9d" - integrity sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ== - dependencies: - https-proxy-agent "^2.2.1" - -sax@>=0.6.0, sax@^1.2.4, sax@~1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - -saxes@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" - integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== - dependencies: - xmlchars "^2.2.0" - -scheduler@^0.19.1: - version "0.19.1" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" - integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -schema-utils@2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" - integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== - dependencies: - "@types/json-schema" "^7.0.4" - ajv "^6.12.2" - ajv-keywords "^3.4.1" - -schema-utils@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" - integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== - dependencies: - ajv "^6.1.0" - ajv-errors "^1.0.0" - ajv-keywords "^3.1.0" - -schema-utils@^2.6.0, schema-utils@^2.6.1, schema-utils@^2.6.5, schema-utils@^2.6.6, schema-utils@^2.7.0: - version "2.7.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" - integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== - dependencies: - "@types/json-schema" "^7.0.5" - ajv "^6.12.4" - ajv-keywords "^3.5.2" - -schema-utils@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" - integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -schema-utils@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" - integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== - dependencies: - "@types/json-schema" "^7.0.9" - ajv "^8.8.0" - ajv-formats "^2.1.1" - ajv-keywords "^5.0.0" - -script-ext-html-webpack-plugin@2.1.5: - version "2.1.5" - resolved "https://registry.yarnpkg.com/script-ext-html-webpack-plugin/-/script-ext-html-webpack-plugin-2.1.5.tgz#d4a57e43b04aaf531f675c935688c3971bfafc6c" - integrity sha512-nMjd5dtsnoB8dS+pVM9ZL4mC9O1uVtTxrDS99OGZsZxFbkZE6pw0HCMued/cncDrKivIShO9vwoyOTvsGqQHEQ== - dependencies: - debug "^4.2.0" - -select-hose@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" - integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= - -selenium-webdriver@3.6.0, selenium-webdriver@^3.0.1: - version "3.6.0" - resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz#2ba87a1662c020b8988c981ae62cb2a01298eafc" - integrity sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q== - dependencies: - jszip "^3.1.3" - rimraf "^2.5.4" - tmp "0.0.30" - xml2js "^0.4.17" - -selfsigned@^1.10.11, selfsigned@^1.10.7, selfsigned@^1.10.8: - version "1.10.11" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.11.tgz#24929cd906fe0f44b6d01fb23999a739537acbe9" - integrity sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA== - dependencies: - node-forge "^0.10.0" - -semver-diff@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" - integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== - dependencies: - semver "^6.3.0" - -semver-dsl@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/semver-dsl/-/semver-dsl-1.0.1.tgz#d3678de5555e8a61f629eed025366ae5f27340a0" - integrity sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA= - dependencies: - semver "^5.3.0" - -semver-intersect@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/semver-intersect/-/semver-intersect-1.4.0.tgz#bdd9c06bedcdd2fedb8cd352c3c43ee8c61321f3" - integrity sha512-d8fvGg5ycKAq0+I6nfWeCx6ffaWJCsBYU0H2Rq56+/zFePYfT8mXkB3tWBSjR5BerkHNZ5eTPIk1/LBYas35xQ== - dependencies: - semver "^5.0.0" - -semver@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" - integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== - -semver@7.3.2: - version "7.3.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" - integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== - -semver@7.3.4: - version "7.3.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" - integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== - dependencies: - lru-cache "^6.0.0" - -semver@^5.0.0, semver@^5.0.1, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.1: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: - version "7.3.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== - dependencies: - lru-cache "^6.0.0" - -send@0.16.2: - version "0.16.2" - resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" - integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw== - dependencies: - 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" - -send@0.17.1: - version "0.17.1" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" - integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== - dependencies: - 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" - -serialize-javascript@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" - integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ== - -serialize-javascript@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" - integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== - dependencies: - randombytes "^2.1.0" - -serialize-javascript@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" - integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== - dependencies: - randombytes "^2.1.0" - -serve-index@1.9.1, serve-index@^1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" - integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= - dependencies: - 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" - -serve-static@1.13.2: - version "1.13.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" - integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.2" - send "0.16.2" - -serve-static@1.14.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" - integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.17.1" - -server-destroy@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/server-destroy/-/server-destroy-1.0.1.tgz#f13bf928e42b9c3e79383e61cc3998b5d14e6cdd" - integrity sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0= - -set-blocking@^2.0.0, set-blocking@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - -set-immediate-shim@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" - integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= - -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -setimmediate@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= - -setprototypeof@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" - integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== - -setprototypeof@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" - integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -shallow-clone@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" - integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== - dependencies: - kind-of "^6.0.2" - -shallowequal@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" - integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= - dependencies: - shebang-regex "^1.0.0" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: - version "3.0.6" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af" - integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== - -simple-swizzle@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" - integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= - dependencies: - is-arrayish "^0.3.1" - -sirv@^1.0.7: - version "1.0.19" - resolved "https://registry.yarnpkg.com/sirv/-/sirv-1.0.19.tgz#1d73979b38c7fe91fcba49c85280daa9c2363b49" - integrity sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ== - dependencies: - "@polka/url" "^1.0.0-next.20" - mrmime "^1.0.0" - totalist "^1.0.0" - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slice-ansi@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" - integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -slice-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -smart-buffer@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" - integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - 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" - -socket.io-adapter@~1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz#ab3f0d6f66b8fc7fca3959ab5991f82221789be9" - integrity sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g== - -socket.io-client@2.4.0, socket.io-client@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.4.0.tgz#aafb5d594a3c55a34355562fc8aea22ed9119a35" - integrity sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ== - dependencies: - backo2 "1.0.2" - component-bind "1.0.0" - component-emitter "~1.3.0" - debug "~3.1.0" - engine.io-client "~3.5.0" - has-binary2 "~1.0.2" - indexof "0.0.1" - parseqs "0.0.6" - parseuri "0.0.6" - socket.io-parser "~3.3.0" - to-array "0.1.4" - -socket.io-parser@~3.3.0: - version "3.3.2" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.3.2.tgz#ef872009d0adcf704f2fbe830191a14752ad50b6" - integrity sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg== - dependencies: - component-emitter "~1.3.0" - debug "~3.1.0" - isarray "2.0.1" - -socket.io-parser@~3.4.0: - version "3.4.1" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.4.1.tgz#b06af838302975837eab2dc980037da24054d64a" - integrity sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A== - dependencies: - component-emitter "1.2.1" - debug "~4.1.0" - isarray "2.0.1" - -socket.io@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.4.0.tgz#01030a2727bd8eb2e85ea96d69f03692ee53d47e" - integrity sha512-9UPJ1UTvKayuQfVv2IQ3k7tCQC/fboDyIK62i99dAQIyHKaBsNdTpwHLgKJ6guRWxRtC9H+138UwpaGuQO9uWQ== - dependencies: - debug "~4.1.0" - engine.io "~3.5.0" - has-binary2 "~1.0.2" - socket.io-adapter "~1.1.0" - socket.io-client "2.4.0" - socket.io-parser "~3.4.0" - -socket.io@^2.3.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.4.1.tgz#95ad861c9a52369d7f1a68acf0d4a1b16da451d2" - integrity sha512-Si18v0mMXGAqLqCVpTxBa8MGqriHGQh8ccEOhmsmNS3thNCGBwO8WGrwMibANsWtQQ5NStdZwHqZR3naJVFc3w== - dependencies: - debug "~4.1.0" - engine.io "~3.5.0" - has-binary2 "~1.0.2" - socket.io-adapter "~1.1.0" - socket.io-client "2.4.0" - socket.io-parser "~3.4.0" - -sockjs-client@1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.4.0.tgz#c9f2568e19c8fd8173b4997ea3420e0bb306c7d5" - integrity sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g== - dependencies: - 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" - -sockjs-client@^1.5.0: - version "1.5.2" - resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.5.2.tgz#4bc48c2da9ce4769f19dc723396b50f5c12330a3" - integrity sha512-ZzRxPBISQE7RpzlH4tKJMQbHM9pabHluk0WBaxAQ+wm/UieeBVBou0p4wVnSQGN9QmpAZygQ0cDIypWuqOFmFQ== - dependencies: - debug "^3.2.6" - eventsource "^1.0.7" - faye-websocket "^0.11.3" - inherits "^2.0.4" - json3 "^3.3.3" - url-parse "^1.5.3" - -sockjs@0.3.20: - version "0.3.20" - resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.20.tgz#b26a283ec562ef8b2687b44033a4eeceac75d855" - integrity sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA== - dependencies: - faye-websocket "^0.10.0" - uuid "^3.4.0" - websocket-driver "0.6.5" - -sockjs@^0.3.21: - version "0.3.24" - resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" - integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== - dependencies: - faye-websocket "^0.11.3" - uuid "^8.3.2" - websocket-driver "^0.7.4" - -socks-proxy-agent@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz#032fb583048a29ebffec2e6a73fca0761f48177e" - integrity sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ== - dependencies: - agent-base "^6.0.2" - debug "4" - socks "^2.3.3" - -socks@^2.3.3: - version "2.6.1" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.6.1.tgz#989e6534a07cf337deb1b1c94aaa44296520d30e" - integrity sha512-kLQ9N5ucj8uIcxrDwjm0Jsqk06xdpBjGNQtpXy4Q8/QY2k+fY7nZH8CARy+hkbG+SGAovmzzuauCpBlb8FrnBA== - dependencies: - ip "^1.1.5" - smart-buffer "^4.1.0" - -sort-keys@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" - integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= - dependencies: - is-plain-obj "^1.0.0" - -sortablejs@1.13.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/sortablejs/-/sortablejs-1.13.0.tgz#3ab2473f8c69ca63569e80b1cd1b5669b51269e9" - integrity sha512-RBJirPY0spWCrU5yCmWM1eFs/XgX2J5c6b275/YyxFRgnzPhKl/TDeU2hNR8Dt7ITq66NRPM4UlOt+e5O4CFHg== - -source-list-map@^2.0.0, source-list-map@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" - integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== - -source-map-js@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.1.tgz#a1741c131e3c77d048252adfa24e23b908670caf" - integrity sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA== - -source-map-loader@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-1.0.2.tgz#b0a6582b2eaa387ede1ecf8061ae0b93c23f9eb0" - integrity sha512-oX8d6ndRjN+tVyjj6PlXSyFPhDdVAPsZA30nD3/II8g4uOv8fCz0DMn5sy8KtVbDfKQxOpGwGJnK3xIW3tauDw== - dependencies: - data-urls "^2.0.0" - iconv-lite "^0.6.2" - loader-utils "^2.0.0" - schema-utils "^2.7.0" - source-map "^0.6.1" - -source-map-loader@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-1.1.3.tgz#7dbc2fe7ea09d3e43c51fd9fc478b7f016c1f820" - integrity sha512-6YHeF+XzDOrT/ycFJNI53cgEsp/tHTMl37hi7uVyqFAlTXW109JazaQCkbc+jjoL2637qkH1amLi+JzrIpt5lA== - dependencies: - abab "^2.0.5" - iconv-lite "^0.6.2" - loader-utils "^2.0.0" - schema-utils "^3.0.0" - source-map "^0.6.1" - whatwg-mimetype "^2.3.0" - -source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== - dependencies: - 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-resolve@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.6.0.tgz#3d9df87e236b53f16d01e58150fc7711138e5ed2" - integrity sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - -source-map-support@0.5.19: - version "0.5.19" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" - integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-support@^0.5.17, source-map-support@^0.5.5, source-map-support@~0.5.12, source-map-support@~0.5.19, source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-support@~0.4.0: - version "0.4.18" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" - integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== - dependencies: - source-map "^0.5.6" - -source-map-url@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" - integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== - -source-map@0.5.6: - version "0.5.6" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" - integrity sha1-dc449SvwczxafwwRjYEzSiu19BI= - -source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -source-map@0.7.3, source-map@^0.7.3, source-map@~0.7.2: - version "0.7.3" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" - integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== - -source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - -sourcemap-codec@^1.4.4, sourcemap-codec@^1.4.8: - version "1.4.8" - resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" - integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== - -spdy-transport@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" - integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== - dependencies: - 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" - -spdy@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" - integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== - dependencies: - debug "^4.1.0" - handle-thing "^2.0.0" - http-deceiver "^1.2.7" - select-hose "^2.0.0" - spdy-transport "^3.0.0" - -speed-measure-webpack-plugin@1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.3.3.tgz#6ff894fc83e8a6310dde3af863a0329cd79da4f5" - integrity sha512-2ljD4Ch/rz2zG3HsLsnPfp23osuPBS0qPuz9sGpkNXTN1Ic4M+W9xB8l8rS8ob2cO4b1L+WTJw/0AJwWYVgcxQ== - dependencies: - chalk "^2.0.1" - -speed-measure-webpack-plugin@1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.4.2.tgz#1608e62d3bdb45f01810010e1b5bfedefedfa58f" - integrity sha512-AtVzD0bnIy2/B0fWqJpJgmhcrfWFhBlduzSo0uwplr/QvB33ZNZj2NEth3NONgdnZJqicK0W0mSxnLSbsVCDbw== - dependencies: - chalk "^4.1.0" - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - -sprintf-js@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" - integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -sshpk@^1.14.1, sshpk@^1.7.0: - version "1.16.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" - integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== - dependencies: - 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@^6.0.1: - version "6.0.2" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5" - integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q== - dependencies: - figgy-pudding "^3.5.1" - -ssri@^7.0.0: - version "7.1.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-7.1.1.tgz#33e44f896a967158e3c63468e47ec46613b95b5f" - integrity sha512-w+daCzXN89PseTL99MkA+fxJEcU3wfaE/ah0i0lnOlpG1CYLJ2ZjzEry68YBKfLs4JfoTShrTEsJkAZuNZ/stw== - dependencies: - figgy-pudding "^3.5.1" - minipass "^3.1.1" - -ssri@^8.0.0, ssri@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" - integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== - dependencies: - minipass "^3.1.1" - -stable@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" - integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== - -stackframe@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.2.0.tgz#52429492d63c62eb989804c11552e3d22e779303" - integrity sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA== - -stacktrace-gps@^3.0.2: - version "3.0.4" - resolved "https://registry.yarnpkg.com/stacktrace-gps/-/stacktrace-gps-3.0.4.tgz#7688dc2fc09ffb3a13165ebe0dbcaf41bcf0c69a" - integrity sha512-qIr8x41yZVSldqdqe6jciXEaSCKw1U8XTXpjDuy0ki/apyTn/r3w9hDAAQOhZdxvsC93H+WwwEu5cq5VemzYeg== - dependencies: - source-map "0.5.6" - stackframe "^1.1.1" - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - -statuses@~1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" - integrity sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4= - -statuses@~1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" - integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== - -stream-browserify@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" - integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== - dependencies: - inherits "~2.0.1" - readable-stream "^2.0.2" - -stream-each@^1.1.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" - integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== - dependencies: - end-of-stream "^1.1.0" - stream-shift "^1.0.0" - -stream-http@^2.7.2: - version "2.8.3" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" - integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== - dependencies: - 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@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" - integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== - -stream-throttle@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/stream-throttle/-/stream-throttle-0.1.3.tgz#add57c8d7cc73a81630d31cd55d3961cfafba9c3" - integrity sha1-rdV8jXzHOoFjDTHNVdOWHPr7qcM= - dependencies: - commander "^2.2.0" - limiter "^1.0.5" - -streamroller@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-2.2.4.tgz#c198ced42db94086a6193608187ce80a5f2b0e53" - integrity sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ== - dependencies: - date-format "^2.1.0" - debug "^4.1.1" - fs-extra "^8.1.0" - -strict-uri-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= - -string-replace-loader@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/string-replace-loader/-/string-replace-loader-2.3.0.tgz#7f29be7d73c94dd92eccd5c5a15651181d7ecd3d" - integrity sha512-HYBIHStViMKLZC/Lehxy42OuwsBaPzX/LjcF5mkJlE2SnHXmW6SW6eiHABTXnY8ZCm/REbdJ8qnA0ptmIzN0Ng== - dependencies: - loader-utils "^1.2.3" - schema-utils "^2.6.5" - -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^3.0.0, string-width@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string.prototype.trimend@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" - integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -string.prototype.trimstart@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" - integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -string_decoder@^1.0.0, string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" - integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== - dependencies: - ansi-regex "^6.0.1" - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - -style-loader@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.2.1.tgz#c5cbbfbf1170d076cfdd86e0109c5bba114baa1a" - integrity sha512-ByHSTQvHLkWE9Ir5+lGbVOXhxX10fbprhLvdg96wedFZb4NDekDPxVKv5Fwmio+QcMlkkNfuK+5W1peQ5CUhZg== - dependencies: - loader-utils "^2.0.0" - schema-utils "^2.6.6" - -style-loader@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-2.0.0.tgz#9669602fd4690740eaaec137799a03addbbc393c" - integrity sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ== - dependencies: - loader-utils "^2.0.0" - schema-utils "^3.0.0" - -stylehacks@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" - integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g== - dependencies: - browserslist "^4.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" - -stylehacks@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.0.1.tgz#323ec554198520986806388c7fdaebc38d2c06fb" - integrity sha512-Es0rVnHIqbWzveU1b24kbw92HsebBepxfcqe5iix7t9j0PQqhs0IxXVXv0pY2Bxa08CgMkzD6OWql7kbGOuEdA== - dependencies: - browserslist "^4.16.0" - postcss-selector-parser "^6.0.4" - -stylus-loader@3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/stylus-loader/-/stylus-loader-3.0.2.tgz#27a706420b05a38e038e7cacb153578d450513c6" - integrity sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA== - dependencies: - loader-utils "^1.0.2" - lodash.clonedeep "^4.5.0" - when "~3.6.x" - -stylus-loader@4.3.3: - version "4.3.3" - resolved "https://registry.yarnpkg.com/stylus-loader/-/stylus-loader-4.3.3.tgz#381bb6341272ac50bcdfd0b877707eac99b6b757" - integrity sha512-PpWB5PnCXUzW4WMYhCvNzAHJBjIBPMXwsdfkkKuA9W7k8OQFMl/19/AQvaWsxz2IptxUlCseyJ6TY/eEKJ4+UQ== - dependencies: - fast-glob "^3.2.4" - klona "^2.0.4" - loader-utils "^2.0.0" - normalize-path "^3.0.0" - schema-utils "^3.0.0" - -stylus@0.54.8: - version "0.54.8" - resolved "https://registry.yarnpkg.com/stylus/-/stylus-0.54.8.tgz#3da3e65966bc567a7b044bfe0eece653e099d147" - integrity sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg== - dependencies: - css-parse "~2.0.0" - debug "~3.1.0" - glob "^7.1.6" - mkdirp "~1.0.4" - safer-buffer "^2.1.2" - sax "~1.2.4" - semver "^6.3.0" - source-map "^0.7.3" - -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= - -supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" - integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.0.0, supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -svgo@^1.0.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" - integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== - dependencies: - 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" - -svgo@^2.7.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" - integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== - dependencies: - "@trysound/sax" "0.2.0" - commander "^7.2.0" - css-select "^4.1.3" - css-tree "^1.1.3" - csso "^4.2.0" - picocolors "^1.0.0" - stable "^0.1.8" - -symbol-observable@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" - integrity sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ= - -symbol-observable@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-3.0.0.tgz#eea8f6478c651018e059044268375c408c15c533" - integrity sha512-6tDOXSHiVjuCaasQSWTmHUWn4PuG7qa3+1WT031yTc/swT7+rLiw3GOrFxaH1E3lLP09dH3bVuVDf2gK5rxG3Q== - -symbol-tree@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== - -tapable@^1.0.0, tapable@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" - integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== - -tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - -tar@^6.0.2, tar@^6.1.0: - version "6.1.11" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" - integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== - dependencies: - 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" - -terser-webpack-plugin@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-4.1.0.tgz#6e9d6ae4e1a900d88ddce8da6a47507ea61f44bc" - integrity sha512-0ZWDPIP8BtEDZdChbufcXUigOYk6dOX/P/X0hWxqDDcVAQLb8Yy/0FAaemSfax3PAA67+DJR778oz8qVbmy4hA== - dependencies: - cacache "^15.0.5" - find-cache-dir "^3.3.1" - jest-worker "^26.3.0" - p-limit "^3.0.2" - schema-utils "^2.6.6" - serialize-javascript "^4.0.0" - source-map "^0.6.1" - terser "^5.0.0" - webpack-sources "^1.4.3" - -terser-webpack-plugin@4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz#28daef4a83bd17c1db0297070adc07fc8cfc6a9a" - integrity sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ== - dependencies: - cacache "^15.0.5" - find-cache-dir "^3.3.1" - jest-worker "^26.5.0" - p-limit "^3.0.2" - schema-utils "^3.0.0" - serialize-javascript "^5.0.1" - source-map "^0.6.1" - terser "^5.3.4" - webpack-sources "^1.4.3" - -terser-webpack-plugin@^1.4.3: - version "1.4.5" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" - integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw== - dependencies: - 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" - -terser-webpack-plugin@^2.3.1: - version "2.3.8" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.3.8.tgz#894764a19b0743f2f704e7c2a848c5283a696724" - integrity sha512-/fKw3R+hWyHfYx7Bv6oPqmk4HGQcrWLtV3X6ggvPuwPNHSnzvVV51z6OaaCOus4YLjutYGOz3pEpbhe6Up2s1w== - dependencies: - cacache "^13.0.1" - find-cache-dir "^3.3.1" - jest-worker "^25.4.0" - p-limit "^2.3.0" - schema-utils "^2.6.6" - serialize-javascript "^4.0.0" - source-map "^0.6.1" - terser "^4.6.12" - webpack-sources "^1.4.3" - -terser@5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.3.0.tgz#c481f4afecdcc182d5e2bdd2ff2dc61555161e81" - integrity sha512-XTT3D3AwxC54KywJijmY2mxZ8nJiEjBHVYzq8l9OaYuRFWeQNBwvipuzzYEP4e+/AVcd1hqG/CqgsdIRyT45Fg== - dependencies: - commander "^2.20.0" - source-map "~0.6.1" - source-map-support "~0.5.12" - -terser@5.5.1: - version "5.5.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.5.1.tgz#540caa25139d6f496fdea056e414284886fb2289" - integrity sha512-6VGWZNVP2KTUcltUQJ25TtNjx/XgdDsBDKGt8nN0MpydU36LmbPPcMBd2kmtZNNGVVDLg44k7GKeHHj+4zPIBQ== - dependencies: - commander "^2.20.0" - source-map "~0.7.2" - source-map-support "~0.5.19" - -terser@^4.1.2, terser@^4.6.12, terser@^4.6.3: - version "4.8.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" - integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== - dependencies: - commander "^2.20.0" - source-map "~0.6.1" - source-map-support "~0.5.12" - -terser@^5.0.0, terser@^5.3.4: - version "5.10.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.10.0.tgz#b86390809c0389105eb0a0b62397563096ddafcc" - integrity sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA== - dependencies: - commander "^2.20.0" - source-map "~0.7.2" - source-map-support "~0.5.20" - -text-mask-core@^5.0.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/text-mask-core/-/text-mask-core-5.1.2.tgz#80dd5ebe04825757e46619e691407a9f8b3c1b6f" - integrity sha1-gN1evgSCV1fkZhnmkUB6n4s8G28= - -text-table@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= - -tfunk@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/tfunk/-/tfunk-4.0.0.tgz#de9399feaf2060901d590b7faad80fcd5443077e" - integrity sha512-eJQ0dGfDIzWNiFNYFVjJ+Ezl/GmwHaFTBTjrtqNPW0S7cuVDBrZrmzUz6VkMeCR4DZFqhd4YtLwsw3i2wYHswQ== - dependencies: - chalk "^1.1.3" - dlv "^1.1.3" - -throttle-debounce@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-2.3.0.tgz#fd31865e66502071e411817e241465b3e9c372e2" - integrity sha512-H7oLPV0P7+jgvrk+6mwwwBDmxTaxnu9HMXmloNLXwnNO0ZxZ31Orah2n8lU1eMPvsaowP2CX+USCgyovXfdOFQ== - -throttleit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" - integrity sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw= - -through2@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - -through@X.X.X, through@^2.3.6, through@^2.3.8: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - -thunky@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" - integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== - -timers-browserify@^2.0.4: - version "2.0.12" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" - integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== - dependencies: - setimmediate "^1.0.4" - -timsort@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" - integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= - -tiny-invariant@^1.0.6: - version "1.2.0" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.2.0.tgz#a1141f86b672a9148c72e978a19a73b9b94a15a9" - integrity sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg== - -tiny-warning@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" - integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== - -tmp@0.0.30: - version "0.0.30" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.30.tgz#72419d4a8be7d6ce75148fd8b324e593a711c2ed" - integrity sha1-ckGdSovn1s51FI/YsyTlk6cRwu0= - dependencies: - os-tmpdir "~1.0.1" - -tmp@0.2.1, tmp@~0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" - integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== - dependencies: - rimraf "^3.0.0" - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - -to-array@0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" - integrity sha1-F+bBH3PdTz10zaek/zI46a2b+JA= - -to-arraybuffer@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" - integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= - dependencies: - kind-of "^3.0.2" - -to-readable-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" - integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -toggle-selection@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" - integrity sha1-bkWxJj8gF/oKzH2J14sVuL932jI= - -toidentifier@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" - integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== - -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -totalist@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/totalist/-/totalist-1.1.0.tgz#a4d65a3e546517701e3e5c37a47a70ac97fe56df" - integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g== - -touch@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" - integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== - dependencies: - nopt "~1.0.10" - -tough-cookie@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" - integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.1.2" - -tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - -tr46@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" - integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== - dependencies: - punycode "^2.1.1" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= - -tree-kill@1.2.2, tree-kill@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" - integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== - -ts-loader@^5.2.0: - version "5.4.5" - resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-5.4.5.tgz#a0c1f034b017a9344cef0961bfd97cc192492b8b" - integrity sha512-XYsjfnRQCBum9AMRZpk2rTYSVpdZBpZK+kDh0TeT3kxmQNBDVIeUjdPjY5RZry4eIAb8XHc4gYSUiUWPYvzSRw== - dependencies: - chalk "^2.3.0" - enhanced-resolve "^4.0.0" - loader-utils "^1.0.2" - micromatch "^3.1.4" - semver "^5.0.1" - -ts-node@^8.10.2: - version "8.10.2" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.10.2.tgz#eee03764633b1234ddd37f8db9ec10b75ec7fb8d" - integrity sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA== - dependencies: - arg "^4.1.0" - diff "^4.0.1" - make-error "^1.1.1" - source-map-support "^0.5.17" - yn "3.1.1" - -ts-node@^9.0.0: - version "9.1.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.1.1.tgz#51a9a450a3e959401bda5f004a72d54b936d376d" - integrity sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg== - dependencies: - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - source-map-support "^0.5.17" - yn "3.1.1" - -ts-pnp@^1.1.6: - version "1.2.0" - resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" - integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== - -tslib@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.1.tgz#410eb0d113e5b6356490eec749603725b021b43e" - integrity sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ== - -tslib@2.1.0, tslib@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" - integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== - -tslib@2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e" - integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== - -tslib@^1.10.0, tslib@^1.13.0, tslib@^1.8.1, tslib@^1.9.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.0.0, tslib@^2.0.3: - version "2.3.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" - integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== - -tslint@^6.1.3: - version "6.1.3" - resolved "https://registry.yarnpkg.com/tslint/-/tslint-6.1.3.tgz#5c23b2eccc32487d5523bd3a470e9aa31789d904" - integrity sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg== - dependencies: - "@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.13.0" - tsutils "^2.29.0" - -tsutils@^2.29.0: - version "2.29.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" - integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== - dependencies: - tslib "^1.8.1" - -tty-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" - integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= - dependencies: - prelude-ls "~1.1.2" - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -type-is@~1.6.17, type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -type@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" - integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== - -type@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/type/-/type-2.5.0.tgz#0a2e78c2e77907b252abe5f298c1b01c63f0db3d" - integrity sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw== - -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= - -typescript-compare@^0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/typescript-compare/-/typescript-compare-0.0.2.tgz#7ee40a400a406c2ea0a7e551efd3309021d5f425" - integrity sha512-8ja4j7pMHkfLJQO2/8tut7ub+J3Lw2S3061eJLFQcvs3tsmJKp8KG5NtpLn7KcY2w08edF74BSVN7qJS0U6oHA== - dependencies: - typescript-logic "^0.0.0" - -typescript-logic@^0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/typescript-logic/-/typescript-logic-0.0.0.tgz#66ebd82a2548f2b444a43667bec120b496890196" - integrity sha512-zXFars5LUkI3zP492ls0VskH3TtdeHCqu0i7/duGt60i5IGPIpAHE/DWo5FqJ6EjQ15YKXrt+AETjv60Dat34Q== - -typescript-tuple@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/typescript-tuple/-/typescript-tuple-2.2.1.tgz#7d9813fb4b355f69ac55032e0363e8bb0f04dad2" - integrity sha512-Zcr0lbt8z5ZdEzERHAMAniTiIKerFCMgd7yjq1fPnDJ43et/k9twIFQMUYff9k5oXcsQ0WpvFcgzK2ZKASoW6Q== - dependencies: - typescript-compare "^0.0.2" - -typescript@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.0.2.tgz#7ea7c88777c723c681e33bf7988be5d008d05ac2" - integrity sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ== - -typescript@4.1.5: - version "4.1.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.5.tgz#123a3b214aaff3be32926f0d8f1f6e704eb89a72" - integrity sha512-6OSu9PTIzmn9TCDiovULTnET6BgXtDYL4Gg4szY+cGsc3JP1dQL8qvE8kShTRx1NIw4Q9IBHlwODjkjWEtMUyA== - -typescript@^2.5.0: - version "2.9.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.9.2.tgz#1cbf61d05d6b96269244eb6a3bce4bd914e0f00c" - integrity sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w== - -typescript@~4.0.5: - version "4.0.8" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.0.8.tgz#5739105541db80a971fdbd0d56511d1a6f17d37f" - integrity sha512-oz1765PN+imfz1MlZzSZPtC/tqcwsCyIYA8L47EkRnRW97ztRk83SzMiWLrnChC0vqoYxSU1fcFUDA5gV/ZiPg== - -ua-parser-js@0.7.22: - version "0.7.22" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.22.tgz#960df60a5f911ea8f1c818f3747b99c6e177eae3" - integrity sha512-YUxzMjJ5T71w6a8WWVcMGM6YWOTX27rCoIQgLXiWaxqXSx9D7DNjiGWn1aJIRSQ5qr0xuhra77bSIh6voR/46Q== - -ua-parser-js@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.2.tgz#e2976c34dbfb30b15d2c300b2a53eac87c57a775" - integrity sha512-00y/AXhx0/SsnI51fTc0rLRmafiGOM4/O+ny10Ps7f+j/b8p/ZY11ytMgznXkOVo4GQ+KwQG5UQLkLGirsACRg== - -unbox-primitive@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" - integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== - dependencies: - function-bind "^1.1.1" - has-bigints "^1.0.1" - has-symbols "^1.0.2" - which-boxed-primitive "^1.0.2" - -undefsafe@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" - integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== - -unfetch@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" - integrity sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA== - -unicode-canonical-property-names-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" - integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== - -unicode-match-property-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" - integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== - dependencies: - unicode-canonical-property-names-ecmascript "^2.0.0" - unicode-property-aliases-ecmascript "^2.0.0" - -unicode-match-property-value-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" - integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== - -unicode-property-aliases-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" - integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== - -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - -uniq@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" - integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= - -uniqs@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" - integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= - -unique-filename@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" - integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== - dependencies: - unique-slug "^2.0.0" - -unique-slug@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" - integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== - dependencies: - imurmurhash "^0.1.4" - -unique-string@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" - integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== - dependencies: - crypto-random-string "^2.0.0" - -universal-analytics@0.4.23: - version "0.4.23" - resolved "https://registry.yarnpkg.com/universal-analytics/-/universal-analytics-0.4.23.tgz#d915e676850c25c4156762471bdd7cf2eaaca8ac" - integrity sha512-lgMIH7XBI6OgYn1woDEmxhGdj8yDefMKg7GkWdeATAlQZFrMrNyxSkpDzY57iY0/6fdlzTbBV03OawvvzG+q7A== - dependencies: - debug "^4.1.1" - request "^2.88.2" - uuid "^3.0.0" - -universalify@^0.1.0, universalify@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= - -unquote@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" - integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -untildify@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" - integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== - -upath@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" - integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== - -update-notifier@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.1.0.tgz#4ab0d7c7f36a231dd7316cf7729313f0214d9ad9" - integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw== - dependencies: - boxen "^5.0.0" - chalk "^4.1.0" - configstore "^5.0.1" - has-yarn "^2.1.0" - import-lazy "^2.1.0" - is-ci "^2.0.0" - is-installed-globally "^0.4.0" - is-npm "^5.0.0" - is-yarn-global "^0.3.0" - latest-version "^5.1.0" - pupa "^2.1.1" - semver "^7.3.4" - semver-diff "^3.1.1" - xdg-basedir "^4.0.0" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= - -url-parse-lax@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" - integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= - dependencies: - prepend-http "^2.0.0" - -url-parse@^1.4.3, url-parse@^1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.3.tgz#71c1303d38fb6639ade183c2992c8cc0686df862" - integrity sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - -url@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= - dependencies: - punycode "1.3.2" - querystring "0.2.0" - -use-memo-one@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/use-memo-one/-/use-memo-one-1.1.2.tgz#0c8203a329f76e040047a35a1197defe342fab20" - integrity sha512-u2qFKtxLsia/r8qG0ZKkbytbztzRb317XCkT7yP8wxL0tZ/CzK2G+WWie5vWvpyeP7+YoPIwbJoIHJ4Ba4k0oQ== - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - -util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -util.promisify@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" - integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== - dependencies: - define-properties "^1.1.2" - object.getownpropertydescriptors "^2.0.3" - -util.promisify@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" - integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.2" - has-symbols "^1.0.1" - object.getownpropertydescriptors "^2.1.0" - -util@0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= - dependencies: - inherits "2.0.1" - -util@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" - integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== - dependencies: - inherits "2.0.3" - -utila@~0.4: - version "0.4.0" - resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" - integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= - -uuid@8.3.2, uuid@^8.1.0, uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -uuid@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" - integrity sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho= - -uuid@^3.0.0, uuid@^3.2.1, uuid@^3.3.2, uuid@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - -validate-npm-package-name@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" - integrity sha1-X6kS2B630MdK/BQN5zF/DKffQ34= - dependencies: - builtins "^1.0.3" - -vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= - -vendors@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" - integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -vm-browserify@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" - integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== - -void-elements@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" - integrity sha1-YU9/v42AHwu18GYfWy9XhXUOTwk= - -void-elements@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" - integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w= - -w3c-hr-time@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" - integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== - dependencies: - browser-process-hrtime "^1.0.0" - -w3c-xmlserializer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" - integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== - dependencies: - xml-name-validator "^3.0.0" - -watchpack-chokidar2@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957" - integrity sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww== - dependencies: - chokidar "^2.1.8" - -watchpack@^1.7.4: - version "1.7.5" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453" - integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ== - dependencies: - graceful-fs "^4.1.2" - neo-async "^2.5.0" - optionalDependencies: - chokidar "^3.4.1" - watchpack-chokidar2 "^2.0.1" - -wbuf@^1.1.0, wbuf@^1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" - integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== - dependencies: - minimalistic-assert "^1.0.0" - -wcwidth@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" - integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= - dependencies: - defaults "^1.0.3" - -webdriver-js-extender@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz#57d7a93c00db4cc8d556e4d3db4b5db0a80c3bb7" - integrity sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ== - dependencies: - "@types/selenium-webdriver" "^3.0.0" - selenium-webdriver "^3.0.1" - -webdriver-manager@^12.1.7, webdriver-manager@^12.1.8: - version "12.1.8" - resolved "https://registry.yarnpkg.com/webdriver-manager/-/webdriver-manager-12.1.8.tgz#5e70e73eaaf53a0767d5745270addafbc5905fd4" - integrity sha512-qJR36SXG2VwKugPcdwhaqcLQOD7r8P2Xiv9sfNbfZrKBnX243iAkOueX1yAmeNgIKhJ3YAT/F2gq6IiEZzahsg== - dependencies: - adm-zip "^0.4.9" - chalk "^1.1.1" - del "^2.2.0" - glob "^7.0.3" - ini "^1.3.4" - minimist "^1.2.0" - q "^1.4.1" - request "^2.87.0" - rimraf "^2.5.2" - semver "^5.3.0" - xml2js "^0.4.17" - -webfontloader@1.6.28: - version "1.6.28" - resolved "https://registry.yarnpkg.com/webfontloader/-/webfontloader-1.6.28.tgz#db786129253cb6e8eae54c2fb05f870af6675bae" - integrity sha1-23hhKSU8tujq5UwvsF+HCvZnW64= - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= - -webidl-conversions@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" - integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== - -webidl-conversions@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" - integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== - -webpack-bundle-analyzer@^4.4.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz#1b0eea2947e73528754a6f9af3e91b2b6e0f79d5" - integrity sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ== - dependencies: - acorn "^8.0.4" - acorn-walk "^8.0.0" - chalk "^4.1.0" - commander "^7.2.0" - gzip-size "^6.0.0" - lodash "^4.17.20" - opener "^1.5.2" - sirv "^1.0.7" - ws "^7.3.1" - -webpack-cli@^4.2.0: - version "4.9.1" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.9.1.tgz#b64be825e2d1b130f285c314caa3b1ba9a4632b3" - integrity sha512-JYRFVuyFpzDxMDB+v/nanUdQYcZtqFPGzmlW4s+UkPMFhSpfRNmf1z4AwYcHJVdvEFAM7FFCQdNTpsBYhDLusQ== - dependencies: - "@discoveryjs/json-ext" "^0.5.0" - "@webpack-cli/configtest" "^1.1.0" - "@webpack-cli/info" "^1.4.0" - "@webpack-cli/serve" "^1.6.0" - colorette "^2.0.14" - commander "^7.0.0" - execa "^5.0.0" - fastest-levenshtein "^1.0.12" - import-local "^3.0.2" - interpret "^2.2.0" - rechoir "^0.7.0" - webpack-merge "^5.7.3" - -webpack-dev-middleware@3.7.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz#0019c3db716e3fa5cecbf64f2ab88a74bab331f3" - integrity sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw== - dependencies: - memory-fs "^0.4.1" - mime "^2.4.4" - mkdirp "^0.5.1" - range-parser "^1.2.1" - webpack-log "^2.0.0" - -webpack-dev-middleware@^3.7.2: - version "3.7.3" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz#0639372b143262e2b84ab95d3b91a7597061c2c5" - integrity sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ== - dependencies: - memory-fs "^0.4.1" - mime "^2.4.4" - mkdirp "^0.5.1" - range-parser "^1.2.1" - webpack-log "^2.0.0" - -webpack-dev-middleware@^5.2.1: - version "5.2.2" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.2.2.tgz#eb5193faa5479ca1086b9f7bed68b89c731bff62" - integrity sha512-DjZyYrsHhkikAFNvSNKrpnziXukU1EChFAh9j4LAm6ndPLPW8cN0KhM7T+RAiOqsQ6ABfQ8hoKIs9IWMTjov+w== - dependencies: - colorette "^2.0.10" - memfs "^3.2.2" - mime-types "^2.1.31" - range-parser "^1.2.1" - schema-utils "^4.0.0" - -webpack-dev-server@3.11.0: - version "3.11.0" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz#8f154a3bce1bcfd1cc618ef4e703278855e7ff8c" - integrity sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg== - dependencies: - 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" - -webpack-dev-server@3.11.2: - version "3.11.2" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz#695ebced76a4929f0d5de7fd73fafe185fe33708" - integrity sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ== - dependencies: - 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.8" - semver "^6.3.0" - serve-index "^1.9.1" - sockjs "^0.3.21" - sockjs-client "^1.5.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" - -webpack-dev-server@^4.5.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.6.0.tgz#e8648601c440172d9b6f248d28db98bed335315a" - integrity sha512-oojcBIKvx3Ya7qs1/AVWHDgmP1Xml8rGsEBnSobxU/UJSX1xP1GPM3MwsAnDzvqcVmVki8tV7lbcsjEjk0PtYg== - dependencies: - ansi-html-community "^0.0.8" - bonjour "^3.5.0" - chokidar "^3.5.2" - colorette "^2.0.10" - compression "^1.7.4" - connect-history-api-fallback "^1.6.0" - default-gateway "^6.0.3" - del "^6.0.0" - express "^4.17.1" - graceful-fs "^4.2.6" - html-entities "^2.3.2" - http-proxy-middleware "^2.0.0" - ipaddr.js "^2.0.1" - open "^8.0.9" - p-retry "^4.5.0" - portfinder "^1.0.28" - schema-utils "^4.0.0" - selfsigned "^1.10.11" - serve-index "^1.9.1" - sockjs "^0.3.21" - spdy "^4.0.2" - strip-ansi "^7.0.0" - url "^0.11.0" - webpack-dev-middleware "^5.2.1" - ws "^8.1.0" - -webpack-log@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" - integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== - dependencies: - ansi-colors "^3.0.0" - uuid "^3.3.2" - -webpack-merge@4.2.2, webpack-merge@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d" - integrity sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g== - dependencies: - lodash "^4.17.15" - -webpack-merge@5.7.3: - version "5.7.3" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.7.3.tgz#2a0754e1877a25a8bbab3d2475ca70a052708213" - integrity sha512-6/JUQv0ELQ1igjGDzHkXbVDRxkfA57Zw7PfiupdLFJYrgFqY5ZP8xxbpp2lU3EPwYx89ht5Z/aDkD40hFCm5AA== - dependencies: - clone-deep "^4.0.1" - wildcard "^2.0.0" - -webpack-merge@^5.7.3: - version "5.8.0" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" - integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== - dependencies: - clone-deep "^4.0.1" - wildcard "^2.0.0" - -webpack-sources@1.4.3, webpack-sources@^1.0.1, webpack-sources@^1.1.0, webpack-sources@^1.2.0, webpack-sources@^1.3.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" - integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== - dependencies: - source-list-map "^2.0.0" - source-map "~0.6.1" - -webpack-sources@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-2.2.0.tgz#058926f39e3d443193b6c31547229806ffd02bac" - integrity sha512-bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w== - dependencies: - source-list-map "^2.0.1" - source-map "^0.6.1" - -webpack-subresource-integrity@1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/webpack-subresource-integrity/-/webpack-subresource-integrity-1.4.1.tgz#e8bf918b444277df46a66cd84542cbcdc5a6272d" - integrity sha512-XMLFInbGbB1HV7K4vHWANzc1CN0t/c4bBvnlvGxGwV45yE/S/feAXIm8dJsCkzqWtSKnmaEgTp/meyeThxG4Iw== - dependencies: - webpack-sources "^1.3.0" - -webpack-subresource-integrity@1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/webpack-subresource-integrity/-/webpack-subresource-integrity-1.5.2.tgz#e40b6578d3072e2d24104975249c52c66e9a743e" - integrity sha512-GBWYBoyalbo5YClwWop9qe6Zclp8CIXYGIz12OPclJhIrSplDxs1Ls1JDMH8xBPPrg1T6ISaTW9Y6zOrwEiAzw== - dependencies: - webpack-sources "^1.3.0" - -webpack@4.44.1: - version "4.44.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.44.1.tgz#17e69fff9f321b8f117d1fda714edfc0b939cc21" - integrity sha512-4UOGAohv/VGUNQJstzEywwNxqX417FnjZgZJpJQegddzPmTvph37eBIRbRTfdySXzVtJXLJfbMN3mMYhM6GdmQ== - dependencies: - "@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.3.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.7.4" - webpack-sources "^1.4.1" - -webpack@4.44.2: - version "4.44.2" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.44.2.tgz#6bfe2b0af055c8b2d1e90ed2cd9363f841266b72" - integrity sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q== - dependencies: - "@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.3.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.7.4" - webpack-sources "^1.4.1" - -webpack@^4.44.2: - version "4.46.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.46.0.tgz#bf9b4404ea20a073605e0a011d188d77cb6ad542" - integrity sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q== - dependencies: - "@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.5.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.7.4" - webpack-sources "^1.4.1" - -websocket-driver@0.6.5: - version "0.6.5" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36" - integrity sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY= - dependencies: - websocket-extensions ">=0.1.1" - -websocket-driver@>=0.5.1, websocket-driver@^0.7.4: - version "0.7.4" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" - integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== - dependencies: - http-parser-js ">=0.5.1" - safe-buffer ">=5.1.0" - websocket-extensions ">=0.1.1" - -websocket-extensions@>=0.1.1: - version "0.1.4" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" - integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== - -whatwg-encoding@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" - integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== - dependencies: - iconv-lite "0.4.24" - -whatwg-mimetype@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" - integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -whatwg-url@^8.0.0, whatwg-url@^8.5.0: - version "8.7.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" - integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== - dependencies: - lodash "^4.7.0" - tr46 "^2.1.0" - webidl-conversions "^6.1.0" - -when@~3.6.x: - version "3.6.4" - resolved "https://registry.yarnpkg.com/when/-/when-3.6.4.tgz#473b517ec159e2b85005497a13983f095412e34e" - integrity sha1-RztRfsFZ4rhQBUl6E5g/CVQS404= - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - -which@^1.2.1, which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.1, which@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -wide-align@^1.1.0: - version "1.1.5" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" - integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== - dependencies: - string-width "^1.0.2 || 2 || 3 || 4" - -widest-line@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" - integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== - dependencies: - string-width "^4.0.0" - -wildcard@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" - integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== - -word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - -worker-farm@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" - integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== - dependencies: - errno "~0.1.7" - -worker-plugin@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/worker-plugin/-/worker-plugin-5.0.0.tgz#113b5fe1f4a5d6a957cecd29915bedafd70bb537" - integrity sha512-AXMUstURCxDD6yGam2r4E34aJg6kW85IiaeX72hi+I1cxyaMUtrvVY6sbfpGKAj5e7f68Acl62BjQF5aOOx2IQ== - dependencies: - loader-utils "^1.1.0" - -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== - dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" - -wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -write-file-atomic@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== - dependencies: - imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - -ws@^6.2.1: - version "6.2.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" - integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== - dependencies: - async-limiter "~1.0.0" - -ws@^7.3.1, ws@^7.4.6: - version "7.5.6" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.6.tgz#e59fc509fb15ddfb65487ee9765c5a51dec5fe7b" - integrity sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA== - -ws@^8.1.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.3.0.tgz#7185e252c8973a60d57170175ff55fdbd116070d" - integrity sha512-Gs5EZtpqZzLvmIM59w4igITU57lrtYVFneaa434VROv4thzJyV6UjIL3D42lslWlI+D4KzLYnxSwtfuiO79sNw== - -ws@~7.4.2: - version "7.4.6" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" - integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== - -xdg-basedir@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" - integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== - -xhr2@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/xhr2/-/xhr2-0.2.1.tgz#4e73adc4f9cfec9cbd2157f73efdce3a5f108a93" - integrity sha512-sID0rrVCqkVNUn8t6xuv9+6FViXjUVXq8H5rWOH2rz9fDNQEd4g0EA2XlcEdJXRz5BMEn4O1pJFdT+z4YHhoWw== - -xml-name-validator@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" - integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== - -xml2js@^0.4.17: - version "0.4.23" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" - integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== - dependencies: - sax ">=0.6.0" - xmlbuilder "~11.0.0" - -xmlbuilder@~11.0.0: - version "11.0.1" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" - integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== - -xmlchars@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" - integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== - -xmlhttprequest-ssl@~1.6.2: - version "1.6.3" - resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz#03b713873b01659dfa2c1c5d056065b27ddc2de6" - integrity sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q== - -xtend@^4.0.0, xtend@~4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -y18n@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" - integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yargs-parser@^13.1.2: - version "13.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" - integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^18.1.2: - version "18.1.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" - integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs@17.1.1: - version "17.1.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.1.1.tgz#c2a8091564bdb196f7c0a67c1d12e5b85b8067ba" - integrity sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yargs@^13.3.2: - version "13.3.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" - integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== - dependencies: - 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@^15.3.1, yargs@^15.4.1: - version "15.4.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" - integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== - dependencies: - cliui "^6.0.0" - decamelize "^1.2.0" - find-up "^4.1.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^4.2.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^18.1.2" - -yargs@^16.0.0, yargs@^16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yauzl@^2.10.0: - version "2.10.0" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" - integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= - dependencies: - buffer-crc32 "~0.2.3" - fd-slicer "~1.1.0" - -yeast@0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" - integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk= - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -zone.js@^0.10.3, zone.js@~0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.10.3.tgz#3e5e4da03c607c9dcd92e37dd35687a14a140c16" - integrity sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg== +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@angular-builders/custom-webpack@10.0.1": + version "10.0.1" + resolved "https://registry.yarnpkg.com/@angular-builders/custom-webpack/-/custom-webpack-10.0.1.tgz#9126c260ecfeb88c3ba6865e51b486bbe301e504" + integrity sha512-YDy5zEKVwXdoXLjmbsY6kGaEbmunQxaPipxrwLUc9hIjRLU2WcrX9vopf1R9Pgj4POad73IPBNGu+ibqNRFIEQ== + dependencies: + "@angular-devkit/architect" ">=0.1000.0 < 0.1100.0" + "@angular-devkit/build-angular" ">=0.1000.0 < 0.1100.0" + "@angular-devkit/core" "^10.0.0" + lodash "^4.17.15" + ts-node "^9.0.0" + webpack-merge "^4.2.2" + +"@angular-devkit/architect@0.1002.3", "@angular-devkit/architect@>=0.1000.0 < 0.1100.0": + version "0.1002.3" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1002.3.tgz#fe8f3209ee6686efa0306410de27820b6606df52" + integrity sha512-7ainXRNO1njZ6bBbJXGpMzCh0OYrzuIRe/+zRj0ncV1YfEsJb2yWBuiza0+y2Ljco7hdd4wr+7eJm7cfn+NvAw== + dependencies: + "@angular-devkit/core" "10.2.3" + rxjs "6.6.2" + +"@angular-devkit/architect@0.1102.15", "@angular-devkit/architect@^0.1102.3": + version "0.1102.15" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1102.15.tgz#c5af92136f7f1c7b6fcacc3294b8d60250ad25ec" + integrity sha512-d6MKQc54HEsWVsFPipoPD7H3kNpsdpksDJyx4D9YWA2NYLbby9HTgBtp1x53glb0ipKRzzYGIr5BurFIMmxYzA== + dependencies: + "@angular-devkit/core" "11.2.15" + rxjs "6.6.3" + +"@angular-devkit/architect@^0.1202.10": + version "0.1202.13" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1202.13.tgz#b9b883d62f628a6b31ce071da91e268f61da00ef" + integrity sha512-LXgiidXwBgyWPqqWK4xR1/kCPQTMTzG5w+s7+LvENUZwbcdl6CKrOMjfgjo6WPr6yeq+WWQvPCD4pZ6nXRTm7A== + dependencies: + "@angular-devkit/core" "12.2.13" + rxjs "6.6.7" + +"@angular-devkit/build-angular@>=0.1000.0 < 0.1100.0": + version "0.1002.3" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-0.1002.3.tgz#f23c872dd953d1a3ba623e132d2abeab0635649f" + integrity sha512-NjM8H2AUpLjcf+3mKYd99VbFgN4kwT++IBmR9BRQkqOZ4fD63g8jLPzC0KTsWGIVkZtR9Qc88YW/5sC8C3SVFQ== + dependencies: + "@angular-devkit/architect" "0.1002.3" + "@angular-devkit/build-optimizer" "0.1002.3" + "@angular-devkit/build-webpack" "0.1002.3" + "@angular-devkit/core" "10.2.3" + "@babel/core" "7.11.1" + "@babel/generator" "7.11.0" + "@babel/plugin-transform-runtime" "7.11.0" + "@babel/preset-env" "7.11.0" + "@babel/runtime" "7.11.2" + "@babel/template" "7.10.4" + "@jsdevtools/coverage-istanbul-loader" "3.0.5" + "@ngtools/webpack" "10.2.3" + autoprefixer "9.8.6" + babel-loader "8.1.0" + browserslist "^4.9.1" + cacache "15.0.5" + caniuse-lite "^1.0.30001032" + circular-dependency-plugin "5.2.0" + copy-webpack-plugin "6.0.3" + core-js "3.6.4" + css-loader "4.2.2" + cssnano "4.1.10" + file-loader "6.0.0" + find-cache-dir "3.3.1" + glob "7.1.6" + jest-worker "26.3.0" + karma-source-map-support "1.4.0" + less-loader "6.2.0" + license-webpack-plugin "2.3.0" + loader-utils "2.0.0" + mini-css-extract-plugin "0.10.0" + minimatch "3.0.4" + open "7.2.0" + parse5 "6.0.1" + parse5-htmlparser2-tree-adapter "6.0.1" + pnp-webpack-plugin "1.6.4" + postcss "7.0.32" + postcss-import "12.0.1" + postcss-loader "3.0.0" + raw-loader "4.0.1" + regenerator-runtime "0.13.7" + resolve-url-loader "3.1.2" + rimraf "3.0.2" + rollup "2.26.5" + rxjs "6.6.2" + sass "1.26.10" + sass-loader "10.0.1" + semver "7.3.2" + source-map "0.7.3" + source-map-loader "1.0.2" + source-map-support "0.5.19" + speed-measure-webpack-plugin "1.3.3" + style-loader "1.2.1" + stylus "0.54.8" + stylus-loader "3.0.2" + terser "5.3.0" + terser-webpack-plugin "4.1.0" + tree-kill "1.2.2" + webpack "4.44.1" + webpack-dev-middleware "3.7.2" + webpack-dev-server "3.11.0" + webpack-merge "4.2.2" + webpack-sources "1.4.3" + webpack-subresource-integrity "1.4.1" + worker-plugin "5.0.0" + +"@angular-devkit/build-angular@~0.1102.15": + version "0.1102.15" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-0.1102.15.tgz#171b831a1e27eab397e08b34bcd6625dac5da17c" + integrity sha512-qE5BF8tluirGIcPdSJechTCqmfRNKNwez8HgG6iR2hKbMcAVx8IYYdr1XKnQifZhGF8C1FSnJzOoR9IUfm3MmA== + dependencies: + "@angular-devkit/architect" "0.1102.15" + "@angular-devkit/build-optimizer" "0.1102.15" + "@angular-devkit/build-webpack" "0.1102.15" + "@angular-devkit/core" "11.2.15" + "@babel/core" "7.12.10" + "@babel/generator" "7.12.11" + "@babel/plugin-transform-async-to-generator" "7.12.1" + "@babel/plugin-transform-runtime" "7.12.10" + "@babel/preset-env" "7.12.11" + "@babel/runtime" "7.12.5" + "@babel/template" "7.12.7" + "@discoveryjs/json-ext" "0.5.2" + "@jsdevtools/coverage-istanbul-loader" "3.0.5" + "@ngtools/webpack" "11.2.15" + ansi-colors "4.1.1" + autoprefixer "10.2.4" + babel-loader "8.2.2" + browserslist "^4.9.1" + cacache "15.0.5" + caniuse-lite "^1.0.30001032" + circular-dependency-plugin "5.2.2" + copy-webpack-plugin "6.3.2" + core-js "3.8.3" + critters "0.0.12" + css-loader "5.0.1" + cssnano "5.0.2" + file-loader "6.2.0" + find-cache-dir "3.3.1" + glob "7.1.6" + https-proxy-agent "5.0.0" + inquirer "7.3.3" + jest-worker "26.6.2" + karma-source-map-support "1.4.0" + less "4.1.1" + less-loader "7.3.0" + license-webpack-plugin "2.3.11" + loader-utils "2.0.0" + mini-css-extract-plugin "1.3.5" + minimatch "3.0.4" + open "7.4.0" + ora "5.3.0" + parse5-html-rewriting-stream "6.0.1" + pnp-webpack-plugin "1.6.4" + postcss "8.2.15" + postcss-import "14.0.0" + postcss-loader "4.2.0" + raw-loader "4.0.2" + regenerator-runtime "0.13.7" + resolve-url-loader "4.0.0" + rimraf "3.0.2" + rollup "2.38.4" + rxjs "6.6.3" + sass "1.32.6" + sass-loader "10.1.1" + semver "7.3.4" + source-map "0.7.3" + source-map-loader "1.1.3" + source-map-support "0.5.19" + speed-measure-webpack-plugin "1.4.2" + style-loader "2.0.0" + stylus "0.54.8" + stylus-loader "4.3.3" + terser "5.5.1" + terser-webpack-plugin "4.2.3" + text-table "0.2.0" + tree-kill "1.2.2" + webpack "4.44.2" + webpack-dev-middleware "3.7.2" + webpack-dev-server "3.11.2" + webpack-merge "5.7.3" + webpack-sources "2.2.0" + webpack-subresource-integrity "1.5.2" + worker-plugin "5.0.0" + +"@angular-devkit/build-optimizer@0.1002.3": + version "0.1002.3" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-optimizer/-/build-optimizer-0.1002.3.tgz#797822cdde3e0e9892670ac515c6f4a7caa0854b" + integrity sha512-/0KbxVmmvt3S7ghk5zUH8/PWjW8ki0uSmPsnjopY8jRgAxuXN/7PXZbqswItNlUBoEj34hj2UADBUJVic7fcnQ== + dependencies: + loader-utils "2.0.0" + source-map "0.7.3" + tslib "2.0.1" + typescript "4.0.2" + webpack-sources "1.4.3" + +"@angular-devkit/build-optimizer@0.1102.15": + version "0.1102.15" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-optimizer/-/build-optimizer-0.1102.15.tgz#f99416ea3468b1747d0521ee6b7115e4880dbba0" + integrity sha512-MFW4H25BE1tW6kC7DhNbAjNUNd/w71vO1g8P8OG1mWUVSKkv2W+WhPjwLqZ3TlHbSXiV9OEiOFR29Gt5+5wE/Q== + dependencies: + loader-utils "2.0.0" + source-map "0.7.3" + tslib "2.1.0" + typescript "4.1.5" + webpack-sources "2.2.0" + +"@angular-devkit/build-webpack@0.1002.3": + version "0.1002.3" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1002.3.tgz#763ae9c4c4b0854679e7bf1b4d0f467dd2b31c61" + integrity sha512-ngvPPA3VuYGYV275PM6X0pVI0Nl/uWx4eu2S6SUFe6mniN4BQkUHAyeCUMIbM3hkau/NAcF9xUs5AvZ9GDpvPw== + dependencies: + "@angular-devkit/architect" "0.1002.3" + "@angular-devkit/core" "10.2.3" + rxjs "6.6.2" + +"@angular-devkit/build-webpack@0.1102.15": + version "0.1102.15" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1102.15.tgz#d911bf7146cb9a84d4b6e122be3efe66fb04aa8f" + integrity sha512-/eNooHvpSCU4o+dKb/hy776J8Yb9mgZHCTu4O4+9JNUtgN2Ic1po091TiZP1AEBZ5aH0FtTLy8B580ddj/lsYw== + dependencies: + "@angular-devkit/architect" "0.1102.15" + "@angular-devkit/core" "11.2.15" + rxjs "6.6.3" + +"@angular-devkit/core@10.2.3", "@angular-devkit/core@^10.0.0": + version "10.2.3" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-10.2.3.tgz#499978929e58532f6f0caab8bd860c882d926eea" + integrity sha512-pMM1v9Xjqx6YLOQxQYs0D+03H6XPDZLS8cyEtoQX2iYdh8qlKHZVbJa2WsfzwMoIPtgcXfQAXn113VEgrQPLFA== + dependencies: + ajv "6.12.4" + fast-json-stable-stringify "2.1.0" + magic-string "0.25.7" + rxjs "6.6.2" + source-map "0.7.3" + +"@angular-devkit/core@11.2.15", "@angular-devkit/core@^11.2.3": + version "11.2.15" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-11.2.15.tgz#3e6d0308e049e47a3b21e42a0f2e8d5c31842665" + integrity sha512-6pGblUHg2Hv730cHhUhauTUNbjuviAgn6n23rfYIlfEPV5uxyZib6AUTS1DTcK7ITA0D1PscSsLicMiGaqQ8OA== + dependencies: + ajv "6.12.6" + fast-json-stable-stringify "2.1.0" + magic-string "0.25.7" + rxjs "6.6.3" + source-map "0.7.3" + +"@angular-devkit/core@12.2.13", "@angular-devkit/core@^12.2.10": + version "12.2.13" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-12.2.13.tgz#db3929d1bfce71010b37fb7c4e6c33ef80a4f35f" + integrity sha512-9csMF0p+lTvlWnutxxTZ/+pDRMIbXk/TV4MGLbcqUPPfeG3dCRwErns73xLuMTwp9qO/KCLkFqNaM6cGOoqsDA== + dependencies: + ajv "8.6.2" + ajv-formats "2.1.0" + fast-json-stable-stringify "2.1.0" + magic-string "0.25.7" + rxjs "6.6.7" + source-map "0.7.3" + +"@angular-devkit/schematics@11.2.15": + version "11.2.15" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-11.2.15.tgz#a2fb129870c3c8e7b283981743999470bfd4a28e" + integrity sha512-cFxtpdpwr9N2gtfIG9VyIMacDNsSuRyiV4pToNl/pyHy0z4zif4j32HydXandylHlrYKG4rBMq0UTD/WzHaUcw== + dependencies: + "@angular-devkit/core" "11.2.15" + ora "5.3.0" + rxjs "6.6.3" + +"@angular-devkit/schematics@12.2.13", "@angular-devkit/schematics@^12.2.10": + version "12.2.13" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-12.2.13.tgz#6464d86fa3ccd0efb5ead46c793cef9ec45c7758" + integrity sha512-LQTv72R5Ma1uowMEeii2wIoDWI4bYQyZvunqPy9jRveBTjli2yVwwcOziGCVyttwlYs46bSdxThgeEvVIako2w== + dependencies: + "@angular-devkit/core" "12.2.13" + ora "5.4.1" + rxjs "6.6.7" + +"@angular/animations@~11.2.14": + version "11.2.14" + resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-11.2.14.tgz#cf119ea779bf11bd3759f1355c85e4e8e9e7bb03" + integrity sha512-Heq/nNrCmb3jbkusu+BQszOecfFI/31Oxxj+CDQkqqYpBcswk6bOJLoEE472o+vmgxaXbgeflU9qbIiCQhpMFA== + dependencies: + tslib "^2.0.0" + +"@angular/cdk@^11.2.13": + version "11.2.13" + resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-11.2.13.tgz#d54c9187e3b8cf3f8ba190b1edddc08ed2b740de" + integrity sha512-FkE4iCwoLbQxLDUOjV1I7M/6hmpyb7erAjEdWgch7nGRNxF1hqX5Bqf1lvLFKPNCbx5NRI5K7YVAdIUQUR8vug== + dependencies: + tslib "^2.0.0" + optionalDependencies: + parse5 "^5.0.0" + +"@angular/cli@~11.2.15": + version "11.2.15" + resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-11.2.15.tgz#1bff50345bac813a03f4ce373d91e57702919651" + integrity sha512-Hg6L0v5lyDzZBELpXTsphJq6kWdW+yH5oUHiZzMjyZmc7qHB94zXZV9oLpMz4JbBEI4stTF6V31pgClyj4pUyQ== + dependencies: + "@angular-devkit/architect" "0.1102.15" + "@angular-devkit/core" "11.2.15" + "@angular-devkit/schematics" "11.2.15" + "@schematics/angular" "11.2.15" + "@schematics/update" "0.1102.15" + "@yarnpkg/lockfile" "1.1.0" + ansi-colors "4.1.1" + debug "4.3.1" + ini "2.0.0" + inquirer "7.3.3" + jsonc-parser "3.0.0" + npm-package-arg "8.1.0" + npm-pick-manifest "6.1.0" + open "7.4.0" + ora "5.3.0" + pacote "11.2.4" + resolve "1.19.0" + rimraf "3.0.2" + semver "7.3.4" + symbol-observable "3.0.0" + universal-analytics "0.4.23" + uuid "8.3.2" + +"@angular/common@~11.2.14": + version "11.2.14" + resolved "https://registry.yarnpkg.com/@angular/common/-/common-11.2.14.tgz#52887277b0ae0438e584f9ae97b417ee51a694b5" + integrity sha512-ZSLV/3j7eCTyLf/8g4yBFLWySjiLz3vLJAGWscYoUpnJWMnug1VRu6zoF/COxCbtORgE+Wz6K0uhfS6MziBGVw== + dependencies: + tslib "^2.0.0" + +"@angular/compiler-cli@~11.2.14": + version "11.2.14" + resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-11.2.14.tgz#fdd22aeec25aa2477595bed631d19e977254ecc5" + integrity sha512-A7ltnCp03/EVqK/Q3tVUDsokgz5GHW3dSPGl0Csk7Ys5uBB9ibHTmVt4eiXA4jt0+6Bk+mKxwe5BEDqLvwYFAg== + dependencies: + "@babel/core" "^7.8.6" + "@babel/types" "^7.8.6" + 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 "^16.2.0" + +"@angular/compiler@9.0.0": + version "9.0.0" + resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-9.0.0.tgz#87e0bef4c369b6cadae07e3a4295778fc93799d5" + integrity sha512-ctjwuntPfZZT2mNj2NDIVu51t9cvbhl/16epc5xEwyzyDt76pX9UgwvY+MbXrf/C/FWwdtmNtfP698BKI+9leQ== + +"@angular/compiler@~11.2.14": + version "11.2.14" + resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-11.2.14.tgz#9d3ea26b4d2d858aab935f69af9e201f53453a0f" + integrity sha512-XBOK3HgA+/y6Cz7kOX4zcJYmgJ264XnfcbXUMU2cD7Ac+mbNhLPKohWrEiSWalfcjnpf5gRfufQrQP7lpAGu0A== + dependencies: + tslib "^2.0.0" + +"@angular/core@9.0.0": + version "9.0.0" + resolved "https://registry.yarnpkg.com/@angular/core/-/core-9.0.0.tgz#227dc53e1ac81824f998c6e76000b7efc522641e" + integrity sha512-6Pxgsrf0qF9iFFqmIcWmjJGkkCaCm6V5QNnxMy2KloO3SDq6QuMVRbN9RtC8Urmo25LP+eZ6ZgYqFYpdD8Hd9w== + +"@angular/core@~11.2.14": + version "11.2.14" + resolved "https://registry.yarnpkg.com/@angular/core/-/core-11.2.14.tgz#3ebe298c79d5413dc670d56b7f503bd4d788d4a8" + integrity sha512-vpR4XqBGitk1Faph37CSpemwIYTmJ3pdIVNoHKP6jLonpWu+0azkchf0f7oD8/2ivj2F81opcIw0tcsy/D/5Vg== + dependencies: + tslib "^2.0.0" + +"@angular/forms@~11.2.14": + version "11.2.14" + resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-11.2.14.tgz#dc858408f7647f4fd033996a03aa74df18a02079" + integrity sha512-4LWqY6KEIk1AZQFnk+4PJSOCamlD4tumuVN06gO4D0dZo9Cx+GcvW6pM6N0CPubRvPs3sScCnu20WT11HNWC1w== + dependencies: + tslib "^2.0.0" + +"@angular/language-service@~11.2.14": + version "11.2.14" + resolved "https://registry.yarnpkg.com/@angular/language-service/-/language-service-11.2.14.tgz#452369cdffe76ac6d07836596fb47f9e69a6d119" + integrity sha512-3+0F0X4r1WeNOV6VmaMzYnJENPVmLX2/MX3/lugwZPNYKVXl/oGyh/4PB8ktntIj0tnxQuErzqRSeucNStNGRw== + +"@angular/localize@11.2.14": + version "11.2.14" + resolved "https://registry.yarnpkg.com/@angular/localize/-/localize-11.2.14.tgz#8b37eb0b59835d5ad616775c914577d8e05e1c5c" + integrity sha512-ssMuquxxqxA98LgEICEO/3JdmSflWxu5rlm/HPo28bnGiZ4IzDamZjJ1cu4S6RgsonJ1drB3Z8wkidXfEYZiWA== + dependencies: + "@babel/core" "7.8.3" + glob "7.1.2" + yargs "^16.2.0" + +"@angular/platform-browser-dynamic@~11.2.14": + version "11.2.14" + resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-11.2.14.tgz#3c7fff1a1daacba5390acf033d28c377ec281166" + integrity sha512-TWTPdFs6iBBcp+/YMsgCRQwdHpWGq8KjeJDJ2tfatGgBD3Gqt2YaHOMST1zPW6RkrmupytTejuVqXzeaKWFxuw== + dependencies: + tslib "^2.0.0" + +"@angular/platform-browser@~11.2.14": + version "11.2.14" + resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-11.2.14.tgz#e52ad7a54a42a865033a17e57e213013919f1b1d" + integrity sha512-fb7b7ss/gRoP8wLAN17W62leMgjynuyjEPU2eUoAAazsG9f2cgM+z3rK29GYncDVyYQxZUZYnjSqvL6GSXx86A== + dependencies: + tslib "^2.0.0" + +"@angular/platform-server@~11.2.14": + version "11.2.14" + resolved "https://registry.yarnpkg.com/@angular/platform-server/-/platform-server-11.2.14.tgz#19b0e2e287178b57a761123bdb4b1aafd2493741" + integrity sha512-VSJ4FSyMPVCE3EGfD4hIK1fZu+KFYi04uL4Co8vchzBQFpXPFABpCS/lGd7rOyvLnKRmUvl4NGS72gQdS00IUw== + dependencies: + domino "^2.1.2" + tslib "^2.0.0" + xhr2 "^0.2.0" + +"@angular/router@~11.2.14": + version "11.2.14" + resolved "https://registry.yarnpkg.com/@angular/router/-/router-11.2.14.tgz#4a8eb6d010a1a45c8e7f0c3b5b705959bdb69294" + integrity sha512-3aYBmj+zrEL9yf/ntIQxHIYaWShZOBKP3U07X2mX+TPMpGlvHDnR7L6bWhQVZwewzMMz7YVR16ldg50IFuAlfA== + dependencies: + tslib "^2.0.0" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.8.3": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.0.tgz#0dfc80309beec8411e65e706461c408b0bb9b431" + integrity sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA== + dependencies: + "@babel/highlight" "^7.16.0" + +"@babel/compat-data@^7.11.0", "@babel/compat-data@^7.12.7", "@babel/compat-data@^7.16.0": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.4.tgz#081d6bbc336ec5c2435c6346b2ae1fb98b5ac68e" + integrity sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q== + +"@babel/core@7.11.1": + version "7.11.1" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.11.1.tgz#2c55b604e73a40dc21b0e52650b11c65cf276643" + integrity sha512-XqF7F6FWQdKGGWAzGELL+aCO1p+lRY5Tj5/tbT3St1G8NaH70jhhDIKknIZaDans0OQBG5wRAldROLHSt44BgQ== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.11.0" + "@babel/helper-module-transforms" "^7.11.0" + "@babel/helpers" "^7.10.4" + "@babel/parser" "^7.11.1" + "@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" + +"@babel/core@7.12.10": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.10.tgz#b79a2e1b9f70ed3d84bbfb6d8c4ef825f606bccd" + integrity sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/generator" "^7.12.10" + "@babel/helper-module-transforms" "^7.12.1" + "@babel/helpers" "^7.12.5" + "@babel/parser" "^7.12.10" + "@babel/template" "^7.12.7" + "@babel/traverse" "^7.12.10" + "@babel/types" "^7.12.10" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.19" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/core@7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.8.3.tgz#30b0ebb4dd1585de6923a0b4d179e0b9f5d82941" + integrity sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA== + dependencies: + "@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/core@^7.7.5", "@babel/core@^7.8.6": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.0.tgz#c4ff44046f5fe310525cc9eb4ef5147f0c5374d4" + integrity sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ== + dependencies: + "@babel/code-frame" "^7.16.0" + "@babel/generator" "^7.16.0" + "@babel/helper-compilation-targets" "^7.16.0" + "@babel/helper-module-transforms" "^7.16.0" + "@babel/helpers" "^7.16.0" + "@babel/parser" "^7.16.0" + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" + semver "^6.3.0" + source-map "^0.5.0" + +"@babel/generator@7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.11.0.tgz#4b90c78d8c12825024568cbe83ee6c9af193585c" + integrity sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ== + dependencies: + "@babel/types" "^7.11.0" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/generator@7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.11.tgz#98a7df7b8c358c9a37ab07a24056853016aba3af" + integrity sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA== + dependencies: + "@babel/types" "^7.12.11" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/generator@^7.11.0", "@babel/generator@^7.12.10", "@babel/generator@^7.16.0", "@babel/generator@^7.8.3": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.0.tgz#d40f3d1d5075e62d3500bccb67f3daa8a95265b2" + integrity sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew== + dependencies: + "@babel/types" "^7.16.0" + jsesc "^2.5.1" + source-map "^0.5.0" + +"@babel/helper-annotate-as-pure@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz#9a1f0ebcda53d9a2d00108c4ceace6a5d5f1f08d" + integrity sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.0.tgz#f1a686b92da794020c26582eb852e9accd0d7882" + integrity sha512-9KuleLT0e77wFUku6TUkqZzCEymBdtuQQ27MhEKzf9UOOJu3cYj98kyaDAzxpC7lV6DGiZFuC8XqDsq8/Kl6aQ== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/helper-compilation-targets@^7.10.4", "@babel/helper-compilation-targets@^7.12.5", "@babel/helper-compilation-targets@^7.16.0": + version "7.16.3" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz#5b480cd13f68363df6ec4dc8ac8e2da11363cbf0" + integrity sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA== + dependencies: + "@babel/compat-data" "^7.16.0" + "@babel/helper-validator-option" "^7.14.5" + browserslist "^4.17.5" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.0.tgz#090d4d166b342a03a9fec37ef4fd5aeb9c7c6a4b" + integrity sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-function-name" "^7.16.0" + "@babel/helper-member-expression-to-functions" "^7.16.0" + "@babel/helper-optimise-call-expression" "^7.16.0" + "@babel/helper-replace-supers" "^7.16.0" + "@babel/helper-split-export-declaration" "^7.16.0" + +"@babel/helper-create-regexp-features-plugin@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.0.tgz#06b2348ce37fccc4f5e18dcd8d75053f2a7c44ff" + integrity sha512-3DyG0zAFAZKcOp7aVr33ddwkxJ0Z0Jr5V99y3I690eYLpukJsJvAbzTy1ewoCqsML8SbIrjH14Jc/nSQ4TvNPA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + regexpu-core "^4.7.1" + +"@babel/helper-explode-assignable-expression@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.0.tgz#753017337a15f46f9c09f674cff10cee9b9d7778" + integrity sha512-Hk2SLxC9ZbcOhLpg/yMznzJ11W++lg5GMbxt1ev6TXUiJB0N42KPC+7w8a+eWGuqDnUYuwStJoZHM7RgmIOaGQ== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-function-name@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz#b7dd0797d00bbfee4f07e9c4ea5b0e30c8bb1481" + integrity sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog== + dependencies: + "@babel/helper-get-function-arity" "^7.16.0" + "@babel/template" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/helper-get-function-arity@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz#0088c7486b29a9cb5d948b1a1de46db66e089cfa" + integrity sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-hoist-variables@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz#4c9023c2f1def7e28ff46fc1dbcd36a39beaa81a" + integrity sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-member-expression-to-functions@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz#29287040efd197c77636ef75188e81da8bccd5a4" + integrity sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.12.1", "@babel/helper-module-imports@^7.12.5", "@babel/helper-module-imports@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz#90538e60b672ecf1b448f5f4f5433d37e79a3ec3" + integrity sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-module-transforms@^7.11.0", "@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz#1c82a8dd4cb34577502ebd2909699b194c3e9bb5" + integrity sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA== + dependencies: + "@babel/helper-module-imports" "^7.16.0" + "@babel/helper-replace-supers" "^7.16.0" + "@babel/helper-simple-access" "^7.16.0" + "@babel/helper-split-export-declaration" "^7.16.0" + "@babel/helper-validator-identifier" "^7.15.7" + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/helper-optimise-call-expression@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz#cecdb145d70c54096b1564f8e9f10cd7d193b338" + integrity sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" + integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== + +"@babel/helper-remap-async-to-generator@^7.12.1", "@babel/helper-remap-async-to-generator@^7.16.0", "@babel/helper-remap-async-to-generator@^7.16.4": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.4.tgz#5d7902f61349ff6b963e07f06a389ce139fbfe6e" + integrity sha512-vGERmmhR+s7eH5Y/cp8PCVzj4XEjerq8jooMfxFdA5xVtAk9Sh4AQsrWgiErUEBjtGrBtOFKDUcWQFW4/dFwMA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-wrap-function" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/helper-replace-supers@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz#73055e8d3cf9bcba8ddb55cad93fedc860f68f17" + integrity sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.16.0" + "@babel/helper-optimise-call-expression" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/helper-simple-access@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz#21d6a27620e383e37534cf6c10bba019a6f90517" + integrity sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" + integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-split-export-declaration@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz#29672f43663e936df370aaeb22beddb3baec7438" + integrity sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw== + dependencies: + "@babel/types" "^7.16.0" + +"@babel/helper-validator-identifier@^7.15.7": + version "7.15.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" + integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== + +"@babel/helper-validator-option@^7.12.11", "@babel/helper-validator-option@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" + integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== + +"@babel/helper-wrap-function@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.0.tgz#b3cf318afce774dfe75b86767cd6d68f3482e57c" + integrity sha512-VVMGzYY3vkWgCJML+qVLvGIam902mJW0FvT7Avj1zEe0Gn7D93aWdLblYARTxEw+6DhZmtzhBM2zv0ekE5zg1g== + dependencies: + "@babel/helper-function-name" "^7.16.0" + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/helpers@^7.10.4", "@babel/helpers@^7.12.5", "@babel/helpers@^7.16.0", "@babel/helpers@^7.8.3": + version "7.16.3" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.3.tgz#27fc64f40b996e7074dc73128c3e5c3e7f55c43c" + integrity sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w== + dependencies: + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.3" + "@babel/types" "^7.16.0" + +"@babel/highlight@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.0.tgz#6ceb32b2ca4b8f5f361fb7fd821e3fddf4a1725a" + integrity sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g== + dependencies: + "@babel/helper-validator-identifier" "^7.15.7" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.10.3", "@babel/parser@^7.10.4", "@babel/parser@^7.11.1", "@babel/parser@^7.12.10", "@babel/parser@^7.12.7", "@babel/parser@^7.16.0", "@babel/parser@^7.16.3", "@babel/parser@^7.8.3": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.4.tgz#d5f92f57cf2c74ffe9b37981c0e72fee7311372e" + integrity sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng== + +"@babel/plugin-proposal-async-generator-functions@^7.10.4", "@babel/plugin-proposal-async-generator-functions@^7.12.1": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.4.tgz#e606eb6015fec6fa5978c940f315eae4e300b081" + integrity sha512-/CUekqaAaZCQHleSK/9HajvcD/zdnJiKRiuUFq8ITE+0HsPzquf53cpFiqAwl/UfmJbR6n5uGPQSPdrmKOvHHg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-remap-async-to-generator" "^7.16.4" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-proposal-class-properties@^7.10.4", "@babel/plugin-proposal-class-properties@^7.12.1": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.0.tgz#c029618267ddebc7280fa286e0f8ca2a278a2d1a" + integrity sha512-mCF3HcuZSY9Fcx56Lbn+CGdT44ioBMMvjNVldpKtj8tpniETdLjnxdHI1+sDWXIM1nNt+EanJOZ3IG9lzVjs7A== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-proposal-dynamic-import@^7.10.4", "@babel/plugin-proposal-dynamic-import@^7.12.1": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.0.tgz#783eca61d50526202f9b296095453977e88659f1" + integrity sha512-QGSA6ExWk95jFQgwz5GQ2Dr95cf7eI7TKutIXXTb7B1gCLTCz5hTjFTQGfLFBBiC5WSNi7udNwWsqbbMh1c4yQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-proposal-export-namespace-from@^7.10.4", "@babel/plugin-proposal-export-namespace-from@^7.12.1": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.0.tgz#9c01dee40b9d6b847b656aaf4a3976a71740f222" + integrity sha512-CjI4nxM/D+5wCnhD11MHB1AwRSAYeDT+h8gCdcVJZ/OK7+wRzFsf7PFPWVpVpNRkHMmMkQWAHpTq+15IXQ1diA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-proposal-json-strings@^7.10.4", "@babel/plugin-proposal-json-strings@^7.12.1": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.0.tgz#cae35a95ed1d2a7fa29c4dc41540b84a72e9ab25" + integrity sha512-kouIPuiv8mSi5JkEhzApg5Gn6hFyKPnlkO0a9YSzqRurH8wYzSlf6RJdzluAsbqecdW5pBvDJDfyDIUR/vLxvg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-proposal-logical-assignment-operators@^7.11.0", "@babel/plugin-proposal-logical-assignment-operators@^7.12.1": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.0.tgz#a711b8ceb3ffddd3ef88d3a49e86dbd3cc7db3fd" + integrity sha512-pbW0fE30sVTYXXm9lpVQQ/Vc+iTeQKiXlaNRZPPN2A2VdlWyAtsUrsQ3xydSlDW00TFMK7a8m3cDTkBF5WnV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.10.4", "@babel/plugin-proposal-nullish-coalescing-operator@^7.12.1": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.0.tgz#44e1cce08fe2427482cf446a91bb451528ed0596" + integrity sha512-3bnHA8CAFm7cG93v8loghDYyQ8r97Qydf63BeYiGgYbjKKB/XP53W15wfRC7dvKfoiJ34f6Rbyyx2btExc8XsQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-numeric-separator@^7.10.4", "@babel/plugin-proposal-numeric-separator@^7.12.7": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.0.tgz#5d418e4fbbf8b9b7d03125d3a52730433a373734" + integrity sha512-FAhE2I6mjispy+vwwd6xWPyEx3NYFS13pikDBWUAFGZvq6POGs5eNchw8+1CYoEgBl9n11I3NkzD7ghn25PQ9Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@^7.11.0", "@babel/plugin-proposal-object-rest-spread@^7.12.1": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.0.tgz#5fb32f6d924d6e6712810362a60e12a2609872e6" + integrity sha512-LU/+jp89efe5HuWJLmMmFG0+xbz+I2rSI7iLc1AlaeSMDMOGzWlc5yJrMN1d04osXN4sSfpo4O+azkBNBes0jg== + dependencies: + "@babel/compat-data" "^7.16.0" + "@babel/helper-compilation-targets" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.16.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.10.4", "@babel/plugin-proposal-optional-catch-binding@^7.12.1": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.0.tgz#5910085811ab4c28b00d6ebffa4ab0274d1e5f16" + integrity sha512-kicDo0A/5J0nrsCPbn89mTG3Bm4XgYi0CZtvex9Oyw7gGZE3HXGD0zpQNH+mo+tEfbo8wbmMvJftOwpmPy7aVw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@^7.11.0", "@babel/plugin-proposal-optional-chaining@^7.12.7": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.0.tgz#56dbc3970825683608e9efb55ea82c2a2d6c8dc0" + integrity sha512-Y4rFpkZODfHrVo70Uaj6cC1JJOt3Pp0MdWSwIKtb8z1/lsjl9AmnB7ErRFV+QNGIfcY1Eruc2UMx5KaRnXjMyg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-proposal-private-methods@^7.10.4", "@babel/plugin-proposal-private-methods@^7.12.1": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.0.tgz#b4dafb9c717e4301c5776b30d080d6383c89aff6" + integrity sha512-IvHmcTHDFztQGnn6aWq4t12QaBXTKr1whF/dgp9kz84X6GUcwq9utj7z2wFCUfeOup/QKnOlt2k0zxkGFx9ubg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-proposal-unicode-property-regex@^7.10.4", "@babel/plugin-proposal-unicode-property-regex@^7.12.1", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.0.tgz#890482dfc5ea378e42e19a71e709728cabf18612" + integrity sha512-ti7IdM54NXv29cA4+bNNKEMS4jLMCbJgl+Drv+FgYy0erJLAxNAIXcNjNjrRZEcWq0xJHsNVwQezskMFpF8N9g== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-async-generators@^7.8.0", "@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.10.4", "@babel/plugin-syntax-class-properties@^7.12.1": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-dynamic-import@^7.8.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-json-strings@^7.8.0", "@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.0", "@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.0", "@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-top-level-await@^7.10.4", "@babel/plugin-syntax-top-level-await@^7.12.1": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-arrow-functions@^7.10.4", "@babel/plugin-transform-arrow-functions@^7.12.1": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.0.tgz#951706f8b449c834ed07bd474c0924c944b95a8e" + integrity sha512-vIFb5250Rbh7roWARvCLvIJ/PtAU5Lhv7BtZ1u24COwpI9Ypjsh+bZcKk6rlIyalK+r0jOc1XQ8I4ovNxNrWrA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-async-to-generator@7.12.1": + version "7.12.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz#3849a49cc2a22e9743cbd6b52926d30337229af1" + integrity sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A== + dependencies: + "@babel/helper-module-imports" "^7.12.1" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-remap-async-to-generator" "^7.12.1" + +"@babel/plugin-transform-async-to-generator@^7.10.4", "@babel/plugin-transform-async-to-generator@^7.12.1": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.0.tgz#df12637f9630ddfa0ef9d7a11bc414d629d38604" + integrity sha512-PbIr7G9kR8tdH6g8Wouir5uVjklETk91GMVSUq+VaOgiinbCkBP6Q7NN/suM/QutZkMJMvcyAriogcYAdhg8Gw== + dependencies: + "@babel/helper-module-imports" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-remap-async-to-generator" "^7.16.0" + +"@babel/plugin-transform-block-scoped-functions@^7.10.4", "@babel/plugin-transform-block-scoped-functions@^7.12.1": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.0.tgz#c618763233ad02847805abcac4c345ce9de7145d" + integrity sha512-V14As3haUOP4ZWrLJ3VVx5rCnrYhMSHN/jX7z6FAt5hjRkLsb0snPCmJwSOML5oxkKO4FNoNv7V5hw/y2bjuvg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-block-scoping@^7.10.4", "@babel/plugin-transform-block-scoping@^7.12.11": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.0.tgz#bcf433fb482fe8c3d3b4e8a66b1c4a8e77d37c16" + integrity sha512-27n3l67/R3UrXfizlvHGuTwsRIFyce3D/6a37GRxn28iyTPvNXaW4XvznexRh1zUNLPjbLL22Id0XQElV94ruw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-classes@^7.10.4", "@babel/plugin-transform-classes@^7.12.1": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.0.tgz#54cf5ff0b2242c6573d753cd4bfc7077a8b282f5" + integrity sha512-HUxMvy6GtAdd+GKBNYDWCIA776byUQH8zjnfjxwT1P1ARv/wFu8eBDpmXQcLS/IwRtrxIReGiplOwMeyO7nsDQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-function-name" "^7.16.0" + "@babel/helper-optimise-call-expression" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-replace-supers" "^7.16.0" + "@babel/helper-split-export-declaration" "^7.16.0" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.10.4", "@babel/plugin-transform-computed-properties@^7.12.1": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.0.tgz#e0c385507d21e1b0b076d66bed6d5231b85110b7" + integrity sha512-63l1dRXday6S8V3WFY5mXJwcRAnPYxvFfTlt67bwV1rTyVTM5zrp0DBBb13Kl7+ehkCVwIZPumPpFP/4u70+Tw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-destructuring@^7.10.4", "@babel/plugin-transform-destructuring@^7.12.1": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.0.tgz#ad3d7e74584ad5ea4eadb1e6642146c590dee33c" + integrity sha512-Q7tBUwjxLTsHEoqktemHBMtb3NYwyJPTJdM+wDwb0g8PZ3kQUIzNvwD5lPaqW/p54TXBc/MXZu9Jr7tbUEUM8Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-dotall-regex@^7.10.4", "@babel/plugin-transform-dotall-regex@^7.12.1", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.0.tgz#50bab00c1084b6162d0a58a818031cf57798e06f" + integrity sha512-FXlDZfQeLILfJlC6I1qyEwcHK5UpRCFkaoVyA1nk9A1L1Yu583YO4un2KsLBsu3IJb4CUbctZks8tD9xPQubLw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-duplicate-keys@^7.10.4", "@babel/plugin-transform-duplicate-keys@^7.12.1": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.0.tgz#8bc2e21813e3e89e5e5bf3b60aa5fc458575a176" + integrity sha512-LIe2kcHKAZOJDNxujvmp6z3mfN6V9lJxubU4fJIGoQCkKe3Ec2OcbdlYP+vW++4MpxwG0d1wSDOJtQW5kLnkZQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-exponentiation-operator@^7.10.4", "@babel/plugin-transform-exponentiation-operator@^7.12.1": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.0.tgz#a180cd2881e3533cef9d3901e48dad0fbeff4be4" + integrity sha512-OwYEvzFI38hXklsrbNivzpO3fh87skzx8Pnqi4LoSYeav0xHlueSoCJrSgTPfnbyzopo5b3YVAJkFIcUpK2wsw== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-for-of@^7.10.4", "@babel/plugin-transform-for-of@^7.12.1": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.0.tgz#f7abaced155260e2461359bbc7c7248aca5e6bd2" + integrity sha512-5QKUw2kO+GVmKr2wMYSATCTTnHyscl6sxFRAY+rvN7h7WB0lcG0o4NoV6ZQU32OZGVsYUsfLGgPQpDFdkfjlJQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-function-name@^7.10.4", "@babel/plugin-transform-function-name@^7.12.1": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.0.tgz#02e3699c284c6262236599f751065c5d5f1f400e" + integrity sha512-lBzMle9jcOXtSOXUpc7tvvTpENu/NuekNJVova5lCCWCV9/U1ho2HH2y0p6mBg8fPm/syEAbfaaemYGOHCY3mg== + dependencies: + "@babel/helper-function-name" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-literals@^7.10.4", "@babel/plugin-transform-literals@^7.12.1": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.0.tgz#79711e670ffceb31bd298229d50f3621f7980cac" + integrity sha512-gQDlsSF1iv9RU04clgXqRjrPyyoJMTclFt3K1cjLmTKikc0s/6vE3hlDeEVC71wLTRu72Fq7650kABrdTc2wMQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-member-expression-literals@^7.10.4", "@babel/plugin-transform-member-expression-literals@^7.12.1": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.0.tgz#5251b4cce01eaf8314403d21aedb269d79f5e64b" + integrity sha512-WRpw5HL4Jhnxw8QARzRvwojp9MIE7Tdk3ez6vRyUk1MwgjJN0aNpRoXainLR5SgxmoXx/vsXGZ6OthP6t/RbUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-modules-amd@^7.10.4", "@babel/plugin-transform-modules-amd@^7.12.1": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.0.tgz#09abd41e18dcf4fd479c598c1cef7bd39eb1337e" + integrity sha512-rWFhWbCJ9Wdmzln1NmSCqn7P0RAD+ogXG/bd9Kg5c7PKWkJtkiXmYsMBeXjDlzHpVTJ4I/hnjs45zX4dEv81xw== + dependencies: + "@babel/helper-module-transforms" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-commonjs@^7.10.4", "@babel/plugin-transform-modules-commonjs@^7.12.1": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.0.tgz#add58e638c8ddc4875bd9a9ecb5c594613f6c922" + integrity sha512-Dzi+NWqyEotgzk/sb7kgQPJQf7AJkQBWsVp1N6JWc1lBVo0vkElUnGdr1PzUBmfsCCN5OOFya3RtpeHk15oLKQ== + dependencies: + "@babel/helper-module-transforms" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-simple-access" "^7.16.0" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-systemjs@^7.10.4", "@babel/plugin-transform-modules-systemjs@^7.12.1": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.0.tgz#a92cf240afeb605f4ca16670453024425e421ea4" + integrity sha512-yuGBaHS3lF1m/5R+6fjIke64ii5luRUg97N2wr+z1sF0V+sNSXPxXDdEEL/iYLszsN5VKxVB1IPfEqhzVpiqvg== + dependencies: + "@babel/helper-hoist-variables" "^7.16.0" + "@babel/helper-module-transforms" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-identifier" "^7.15.7" + babel-plugin-dynamic-import-node "^2.3.3" + +"@babel/plugin-transform-modules-umd@^7.10.4", "@babel/plugin-transform-modules-umd@^7.12.1": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.0.tgz#195f26c2ad6d6a391b70880effce18ce625e06a7" + integrity sha512-nx4f6no57himWiHhxDM5pjwhae5vLpTK2zCnDH8+wNLJy0TVER/LJRHl2bkt6w9Aad2sPD5iNNoUpY3X9sTGDg== + dependencies: + "@babel/helper-module-transforms" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.10.4", "@babel/plugin-transform-named-capturing-groups-regex@^7.12.1": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.0.tgz#d3db61cc5d5b97986559967cd5ea83e5c32096ca" + integrity sha512-LogN88uO+7EhxWc8WZuQ8vxdSyVGxhkh8WTC3tzlT8LccMuQdA81e9SGV6zY7kY2LjDhhDOFdQVxdGwPyBCnvg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.0" + +"@babel/plugin-transform-new-target@^7.10.4", "@babel/plugin-transform-new-target@^7.12.1": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.0.tgz#af823ab576f752215a49937779a41ca65825ab35" + integrity sha512-fhjrDEYv2DBsGN/P6rlqakwRwIp7rBGLPbrKxwh7oVt5NNkIhZVOY2GRV+ULLsQri1bDqwDWnU3vhlmx5B2aCw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-object-super@^7.10.4", "@babel/plugin-transform-object-super@^7.12.1": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.0.tgz#fb20d5806dc6491a06296ac14ea8e8d6fedda72b" + integrity sha512-fds+puedQHn4cPLshoHcR1DTMN0q1V9ou0mUjm8whx9pGcNvDrVVrgw+KJzzCaiTdaYhldtrUps8DWVMgrSEyg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-replace-supers" "^7.16.0" + +"@babel/plugin-transform-parameters@^7.10.4", "@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.16.0": + version "7.16.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.3.tgz#fa9e4c874ee5223f891ee6fa8d737f4766d31d15" + integrity sha512-3MaDpJrOXT1MZ/WCmkOFo7EtmVVC8H4EUZVrHvFOsmwkk4lOjQj8rzv8JKUZV4YoQKeoIgk07GO+acPU9IMu/w== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.10.4", "@babel/plugin-transform-property-literals@^7.12.1": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.0.tgz#a95c552189a96a00059f6776dc4e00e3690c78d1" + integrity sha512-XLldD4V8+pOqX2hwfWhgwXzGdnDOThxaNTgqagOcpBgIxbUvpgU2FMvo5E1RyHbk756WYgdbS0T8y0Cj9FKkWQ== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-regenerator@^7.10.4", "@babel/plugin-transform-regenerator@^7.12.1": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.0.tgz#eaee422c84b0232d03aea7db99c97deeaf6125a4" + integrity sha512-JAvGxgKuwS2PihiSFaDrp94XOzzTUeDeOQlcKzVAyaPap7BnZXK/lvMDiubkPTdotPKOIZq9xWXWnggUMYiExg== + dependencies: + regenerator-transform "^0.14.2" + +"@babel/plugin-transform-reserved-words@^7.10.4", "@babel/plugin-transform-reserved-words@^7.12.1": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.0.tgz#fff4b9dcb19e12619394bda172d14f2d04c0379c" + integrity sha512-Dgs8NNCehHSvXdhEhln8u/TtJxfVwGYCgP2OOr5Z3Ar+B+zXicEOKNTyc+eca2cuEOMtjW6m9P9ijOt8QdqWkg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-runtime@7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.11.0.tgz#e27f78eb36f19448636e05c33c90fd9ad9b8bccf" + integrity sha512-LFEsP+t3wkYBlis8w6/kmnd6Kb1dxTd+wGJ8MlxTGzQo//ehtqlVL4S9DNUa53+dtPSQobN2CXx4d81FqC58cw== + dependencies: + "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + resolve "^1.8.1" + semver "^5.5.1" + +"@babel/plugin-transform-runtime@7.12.10": + version "7.12.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.10.tgz#af0fded4e846c4b37078e8e5d06deac6cd848562" + integrity sha512-xOrUfzPxw7+WDm9igMgQCbO3cJKymX7dFdsgRr1eu9n3KjjyU4pptIXbXPseQDquw+W+RuJEJMHKHNsPNNm3CA== + dependencies: + "@babel/helper-module-imports" "^7.12.5" + "@babel/helper-plugin-utils" "^7.10.4" + semver "^5.5.1" + +"@babel/plugin-transform-shorthand-properties@^7.10.4", "@babel/plugin-transform-shorthand-properties@^7.12.1": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.0.tgz#090372e3141f7cc324ed70b3daf5379df2fa384d" + integrity sha512-iVb1mTcD8fuhSv3k99+5tlXu5N0v8/DPm2mO3WACLG6al1CGZH7v09HJyUb1TtYl/Z+KrM6pHSIJdZxP5A+xow== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-spread@^7.11.0", "@babel/plugin-transform-spread@^7.12.1": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.0.tgz#d21ca099bbd53ab307a8621e019a7bd0f40cdcfb" + integrity sha512-Ao4MSYRaLAQczZVp9/7E7QHsCuK92yHRrmVNRe/SlEJjhzivq0BSn8mEraimL8wizHZ3fuaHxKH0iwzI13GyGg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + +"@babel/plugin-transform-sticky-regex@^7.10.4", "@babel/plugin-transform-sticky-regex@^7.12.7": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.0.tgz#c35ea31a02d86be485f6aa510184b677a91738fd" + integrity sha512-/ntT2NljR9foobKk4E/YyOSwcGUXtYWv5tinMK/3RkypyNBNdhHUaq6Orw5DWq9ZcNlS03BIlEALFeQgeVAo4Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-template-literals@^7.10.4", "@babel/plugin-transform-template-literals@^7.12.1": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.0.tgz#a8eced3a8e7b8e2d40ec4ec4548a45912630d302" + integrity sha512-Rd4Ic89hA/f7xUSJQk5PnC+4so50vBoBfxjdQAdvngwidM8jYIBVxBZ/sARxD4e0yMXRbJVDrYf7dyRtIIKT6Q== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-typeof-symbol@^7.10.4", "@babel/plugin-transform-typeof-symbol@^7.12.10": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.0.tgz#8b19a244c6f8c9d668dca6a6f754ad6ead1128f2" + integrity sha512-++V2L8Bdf4vcaHi2raILnptTBjGEFxn5315YU+e8+EqXIucA+q349qWngCLpUYqqv233suJ6NOienIVUpS9cqg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-unicode-escapes@^7.10.4", "@babel/plugin-transform-unicode-escapes@^7.12.1": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.0.tgz#1a354064b4c45663a32334f46fa0cf6100b5b1f3" + integrity sha512-VFi4dhgJM7Bpk8lRc5CMaRGlKZ29W9C3geZjt9beuzSUrlJxsNwX7ReLwaL6WEvsOf2EQkyIJEPtF8EXjB/g2A== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-unicode-regex@^7.10.4", "@babel/plugin-transform-unicode-regex@^7.12.1": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.0.tgz#293b80950177c8c85aede87cef280259fb995402" + integrity sha512-jHLK4LxhHjvCeZDWyA9c+P9XH1sOxRd1RO9xMtDVRAOND/PczPqizEtVdx4TQF/wyPaewqpT+tgQFYMnN/P94A== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.0" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/preset-env@7.11.0": + version "7.11.0" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.11.0.tgz#860ee38f2ce17ad60480c2021ba9689393efb796" + integrity sha512-2u1/k7rG/gTh02dylX2kL3S0IJNF+J6bfDSp4DI2Ma8QN6Y9x9pmAax59fsCk6QUQG0yqH47yJWA+u1I1LccAg== + dependencies: + "@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-env@7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.12.11.tgz#55d5f7981487365c93dbbc84507b1c7215e857f9" + integrity sha512-j8Tb+KKIXKYlDBQyIOy4BLxzv1NUOwlHfZ74rvW+Z0Gp4/cI2IMDPBWAgWceGcE7aep9oL/0K9mlzlMGxA8yNw== + dependencies: + "@babel/compat-data" "^7.12.7" + "@babel/helper-compilation-targets" "^7.12.5" + "@babel/helper-module-imports" "^7.12.5" + "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-validator-option" "^7.12.11" + "@babel/plugin-proposal-async-generator-functions" "^7.12.1" + "@babel/plugin-proposal-class-properties" "^7.12.1" + "@babel/plugin-proposal-dynamic-import" "^7.12.1" + "@babel/plugin-proposal-export-namespace-from" "^7.12.1" + "@babel/plugin-proposal-json-strings" "^7.12.1" + "@babel/plugin-proposal-logical-assignment-operators" "^7.12.1" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.12.1" + "@babel/plugin-proposal-numeric-separator" "^7.12.7" + "@babel/plugin-proposal-object-rest-spread" "^7.12.1" + "@babel/plugin-proposal-optional-catch-binding" "^7.12.1" + "@babel/plugin-proposal-optional-chaining" "^7.12.7" + "@babel/plugin-proposal-private-methods" "^7.12.1" + "@babel/plugin-proposal-unicode-property-regex" "^7.12.1" + "@babel/plugin-syntax-async-generators" "^7.8.0" + "@babel/plugin-syntax-class-properties" "^7.12.1" + "@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.12.1" + "@babel/plugin-transform-arrow-functions" "^7.12.1" + "@babel/plugin-transform-async-to-generator" "^7.12.1" + "@babel/plugin-transform-block-scoped-functions" "^7.12.1" + "@babel/plugin-transform-block-scoping" "^7.12.11" + "@babel/plugin-transform-classes" "^7.12.1" + "@babel/plugin-transform-computed-properties" "^7.12.1" + "@babel/plugin-transform-destructuring" "^7.12.1" + "@babel/plugin-transform-dotall-regex" "^7.12.1" + "@babel/plugin-transform-duplicate-keys" "^7.12.1" + "@babel/plugin-transform-exponentiation-operator" "^7.12.1" + "@babel/plugin-transform-for-of" "^7.12.1" + "@babel/plugin-transform-function-name" "^7.12.1" + "@babel/plugin-transform-literals" "^7.12.1" + "@babel/plugin-transform-member-expression-literals" "^7.12.1" + "@babel/plugin-transform-modules-amd" "^7.12.1" + "@babel/plugin-transform-modules-commonjs" "^7.12.1" + "@babel/plugin-transform-modules-systemjs" "^7.12.1" + "@babel/plugin-transform-modules-umd" "^7.12.1" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.1" + "@babel/plugin-transform-new-target" "^7.12.1" + "@babel/plugin-transform-object-super" "^7.12.1" + "@babel/plugin-transform-parameters" "^7.12.1" + "@babel/plugin-transform-property-literals" "^7.12.1" + "@babel/plugin-transform-regenerator" "^7.12.1" + "@babel/plugin-transform-reserved-words" "^7.12.1" + "@babel/plugin-transform-shorthand-properties" "^7.12.1" + "@babel/plugin-transform-spread" "^7.12.1" + "@babel/plugin-transform-sticky-regex" "^7.12.7" + "@babel/plugin-transform-template-literals" "^7.12.1" + "@babel/plugin-transform-typeof-symbol" "^7.12.10" + "@babel/plugin-transform-unicode-escapes" "^7.12.1" + "@babel/plugin-transform-unicode-regex" "^7.12.1" + "@babel/preset-modules" "^0.1.3" + "@babel/types" "^7.12.11" + core-js-compat "^3.8.0" + semver "^5.5.0" + +"@babel/preset-modules@^0.1.3": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" + integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== + dependencies: + "@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@7.11.2": + version "7.11.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.11.2.tgz#f549c13c754cc40b87644b9fa9f09a6a95fe0736" + integrity sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/runtime@7.12.5": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" + integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.14.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": + version "7.16.3" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.3.tgz#b86f0db02a04187a3c17caa77de69840165d42d5" + integrity sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278" + integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/parser" "^7.10.4" + "@babel/types" "^7.10.4" + +"@babel/template@7.12.7": + version "7.12.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.7.tgz#c817233696018e39fbb6c491d2fb684e05ed43bc" + integrity sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/parser" "^7.12.7" + "@babel/types" "^7.12.7" + +"@babel/template@^7.10.4", "@babel/template@^7.12.7", "@babel/template@^7.16.0", "@babel/template@^7.8.3": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.0.tgz#d16a35ebf4cd74e202083356fab21dd89363ddd6" + integrity sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A== + dependencies: + "@babel/code-frame" "^7.16.0" + "@babel/parser" "^7.16.0" + "@babel/types" "^7.16.0" + +"@babel/traverse@^7.10.3", "@babel/traverse@^7.11.0", "@babel/traverse@^7.12.10", "@babel/traverse@^7.16.0", "@babel/traverse@^7.16.3", "@babel/traverse@^7.8.3": + version "7.16.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.3.tgz#f63e8a938cc1b780f66d9ed3c54f532ca2d14787" + integrity sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag== + dependencies: + "@babel/code-frame" "^7.16.0" + "@babel/generator" "^7.16.0" + "@babel/helper-function-name" "^7.16.0" + "@babel/helper-hoist-variables" "^7.16.0" + "@babel/helper-split-export-declaration" "^7.16.0" + "@babel/parser" "^7.16.3" + "@babel/types" "^7.16.0" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.10.3", "@babel/types@^7.10.4", "@babel/types@^7.11.0", "@babel/types@^7.12.10", "@babel/types@^7.12.11", "@babel/types@^7.12.7", "@babel/types@^7.16.0", "@babel/types@^7.4.4", "@babel/types@^7.8.3", "@babel/types@^7.8.6": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.0.tgz#db3b313804f96aadd0b776c4823e127ad67289ba" + integrity sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg== + dependencies: + "@babel/helper-validator-identifier" "^7.15.7" + to-fast-properties "^2.0.0" + +"@csstools/convert-colors@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" + integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw== + +"@cypress/request@^2.88.6": + version "2.88.10" + resolved "https://registry.yarnpkg.com/@cypress/request/-/request-2.88.10.tgz#b66d76b07f860d3a4b8d7a0604d020c662752cce" + integrity sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg== + dependencies: + 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" + http-signature "~1.3.6" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + 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 "^8.3.2" + +"@cypress/schematic@^1.5.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@cypress/schematic/-/schematic-1.6.0.tgz#7178702e94ec717b7ffc6b18b4d9ff7cd8a48d44" + integrity sha512-ENHceK21AANBCthaiQ4gJGEvHsqJ9wS3b9PjnlD4MKOMzqwU/WMrJAs/Xnxa6PGh3btB2w0xNN+0beeaf0KiCA== + dependencies: + "@angular-devkit/architect" "^0.1202.10" + "@angular-devkit/core" "^12.2.10" + "@angular-devkit/schematics" "^12.2.10" + "@schematics/angular" "^12.2.10" + jsonc-parser "^3.0.0" + rxjs "~6.6.0" + +"@cypress/xvfb@^1.2.4": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@cypress/xvfb/-/xvfb-1.2.4.tgz#2daf42e8275b39f4aa53c14214e557bd14e7748a" + integrity sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q== + dependencies: + debug "^3.1.0" + lodash.once "^4.1.1" + +"@discoveryjs/json-ext@0.5.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz#8f03a22a04de437254e8ce8cc84ba39689288752" + integrity sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg== + +"@discoveryjs/json-ext@^0.5.0": + version "0.5.6" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz#d5e0706cf8c6acd8c6032f8d54070af261bbbb2f" + integrity sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA== + +"@edsilv/http-status-codes@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@edsilv/http-status-codes/-/http-status-codes-1.0.3.tgz#a1b767c552ac43f2983ab2b9ee20e9c73b79960b" + integrity sha512-HLK2FS5sZqxPqD53D6hhZxC6C8THTVwlyZDZ7J0iWsrB8JmMA69m/CQuNKZc1kki9WSVeck2fXna26NL0SE7cg== + +"@emotion/hash@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" + integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== + +"@fortawesome/fontawesome-free@^5.5.0": + version "5.15.4" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.4.tgz#ecda5712b61ac852c760d8b3c79c96adca5554e5" + integrity sha512-eYm8vijH/hpzr/6/1CJ/V/Eb1xQFW2nnUKArb3z+yUWv7HTwj6M7SP957oMjfZjAHU6qpoNc2wQvIxBLWYa/Jg== + +"@gar/promisify@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.2.tgz#30aa825f11d438671d585bd44e7fd564535fc210" + integrity sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw== + +"@iiif/vocabulary@^1.0.20": + version "1.0.22" + resolved "https://registry.yarnpkg.com/@iiif/vocabulary/-/vocabulary-1.0.22.tgz#743d6cb1914e090137c56a4e44decbe7f8b21bdc" + integrity sha512-KOIZgRpDERMK4YGeSwPBNjpJETapMWp8pvEvSGUQkuTlqkiNLirZH65CIcEENZEL5A6mxrYLJX6okDYq7W1+RA== + +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jsdevtools/coverage-istanbul-loader@3.0.5": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.5.tgz#2a4bc65d0271df8d4435982db4af35d81754ee26" + integrity sha512-EUCPEkaRPvmHjWAAZkWMT7JDzpw7FKB00WTISaiXsbNOd5hCHg77XLA8sLYLFDo1zepYLo2w7GstN8YBqRXZfA== + dependencies: + convert-source-map "^1.7.0" + istanbul-lib-instrument "^4.0.3" + loader-utils "^2.0.0" + merge-source-map "^1.1.0" + schema-utils "^2.7.0" + +"@kolkov/ngx-gallery@^1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@kolkov/ngx-gallery/-/ngx-gallery-1.2.3.tgz#bb15d4b64a5c03905677aa4ca741835aabe41f43" + integrity sha512-Dpnhwq3DGPSXrNt65gexo+/Smb2L0bne14A0WONN04+racETtcY33fqFvNWfRw5Nvk2Eza+sq95eEA0NbgF/6g== + +"@material-ui/core@^4.11.0": + version "4.12.3" + resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-4.12.3.tgz#80d665caf0f1f034e52355c5450c0e38b099d3ca" + integrity sha512-sdpgI/PL56QVsEJldwEe4FFaFTLUqN+rd7sSZiRCdx2E/C7z5yK0y/khAWVBH24tXwto7I1hCzNWfJGZIYJKnw== + dependencies: + "@babel/runtime" "^7.4.4" + "@material-ui/styles" "^4.11.4" + "@material-ui/system" "^4.12.1" + "@material-ui/types" "5.1.0" + "@material-ui/utils" "^4.11.2" + "@types/react-transition-group" "^4.2.0" + clsx "^1.0.4" + hoist-non-react-statics "^3.3.2" + popper.js "1.16.1-lts" + prop-types "^15.7.2" + react-is "^16.8.0 || ^17.0.0" + react-transition-group "^4.4.0" + +"@material-ui/icons@^4.9.1": + version "4.11.2" + resolved "https://registry.yarnpkg.com/@material-ui/icons/-/icons-4.11.2.tgz#b3a7353266519cd743b6461ae9fdfcb1b25eb4c5" + integrity sha512-fQNsKX2TxBmqIGJCSi3tGTO/gZ+eJgWmMJkgDiOfyNaunNaxcklJQFaFogYcFl0qFuaEz1qaXYXboa/bUXVSOQ== + dependencies: + "@babel/runtime" "^7.4.4" + +"@material-ui/lab@^4.0.0-alpha.53": + version "4.0.0-alpha.60" + resolved "https://registry.yarnpkg.com/@material-ui/lab/-/lab-4.0.0-alpha.60.tgz#5ad203aed5a8569b0f1753945a21a05efa2234d2" + integrity sha512-fadlYsPJF+0fx2lRuyqAuJj7hAS1tLDdIEEdov5jlrpb5pp4b+mRDUqQTUxi4inRZHS1bEXpU8QWUhO6xX88aA== + dependencies: + "@babel/runtime" "^7.4.4" + "@material-ui/utils" "^4.11.2" + clsx "^1.0.4" + prop-types "^15.7.2" + react-is "^16.8.0 || ^17.0.0" + +"@material-ui/styles@^4.11.4": + version "4.11.4" + resolved "https://registry.yarnpkg.com/@material-ui/styles/-/styles-4.11.4.tgz#eb9dfccfcc2d208243d986457dff025497afa00d" + integrity sha512-KNTIZcnj/zprG5LW0Sao7zw+yG3O35pviHzejMdcSGCdWbiO8qzRgOYL8JAxAsWBKOKYwVZxXtHWaB5T2Kvxew== + dependencies: + "@babel/runtime" "^7.4.4" + "@emotion/hash" "^0.8.0" + "@material-ui/types" "5.1.0" + "@material-ui/utils" "^4.11.2" + clsx "^1.0.4" + csstype "^2.5.2" + hoist-non-react-statics "^3.3.2" + jss "^10.5.1" + jss-plugin-camel-case "^10.5.1" + jss-plugin-default-unit "^10.5.1" + jss-plugin-global "^10.5.1" + jss-plugin-nested "^10.5.1" + jss-plugin-props-sort "^10.5.1" + jss-plugin-rule-value-function "^10.5.1" + jss-plugin-vendor-prefixer "^10.5.1" + prop-types "^15.7.2" + +"@material-ui/system@^4.12.1": + version "4.12.1" + resolved "https://registry.yarnpkg.com/@material-ui/system/-/system-4.12.1.tgz#2dd96c243f8c0a331b2bb6d46efd7771a399707c" + integrity sha512-lUdzs4q9kEXZGhbN7BptyiS1rLNHe6kG9o8Y307HCvF4sQxbCgpL2qi+gUk+yI8a2DNk48gISEQxoxpgph0xIw== + dependencies: + "@babel/runtime" "^7.4.4" + "@material-ui/utils" "^4.11.2" + csstype "^2.5.2" + prop-types "^15.7.2" + +"@material-ui/types@5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@material-ui/types/-/types-5.1.0.tgz#efa1c7a0b0eaa4c7c87ac0390445f0f88b0d88f2" + integrity sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A== + +"@material-ui/utils@^4.11.2": + version "4.11.2" + resolved "https://registry.yarnpkg.com/@material-ui/utils/-/utils-4.11.2.tgz#f1aefa7e7dff2ebcb97d31de51aecab1bb57540a" + integrity sha512-Uul8w38u+PICe2Fg2pDKCaIG7kOyhowZ9vjiC1FsVwPABTW8vPPKfF6OvxRq3IiBaI1faOJmgdvMG7rMJARBhA== + dependencies: + "@babel/runtime" "^7.4.4" + prop-types "^15.7.2" + react-is "^16.8.0 || ^17.0.0" + +"@ng-bootstrap/ng-bootstrap@9.1.3": + version "9.1.3" + resolved "https://registry.yarnpkg.com/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-9.1.3.tgz#f48f42ad96ba75b50f1b87caa0dabcf5299a078c" + integrity sha512-Sl4lis1F5uSPrd4WsLEMX8b3fqzeHr4rgTFhocpx/IedZPaPdGec4a91TjdqcM/fNwzoXj1AdGrcMLpFFOxmvw== + dependencies: + tslib "^2.0.0" + +"@ng-dynamic-forms/core@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@ng-dynamic-forms/core/-/core-13.0.0.tgz#aee226839ffa1f648429cbdee56e4d8d9c56b76c" + integrity sha512-RBP7i+q9EUDlHcmqcd1e27zuJhk+8NOU9mC7xlHPcmhFzxV58Gzr/n0nb5IzF+FIQlcJqP/BspyksaCCbRStZw== + dependencies: + tslib "^2.0.0" + +"@ng-dynamic-forms/ui-ng-bootstrap@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@ng-dynamic-forms/ui-ng-bootstrap/-/ui-ng-bootstrap-13.0.0.tgz#cef62c1dfbf6d7aa700eab04f8c337dd0e15250f" + integrity sha512-0l/hfuFXadp6/PKeGdrN0bFBM/xwBSvZX6HeT9Q/Sp19s99jdKphu6ZfG2SHWxY4tXC0nzB+Xcmqc38vi0iZAg== + dependencies: + tslib "^2.0.0" + +"@ngrx/effects@^11.1.1": + version "11.1.1" + resolved "https://registry.yarnpkg.com/@ngrx/effects/-/effects-11.1.1.tgz#82abd97df8c1cdf1d9bd0bf720289591230d260c" + integrity sha512-KLfGSjlmlPUMlMEQkdD6tnJCs/dLSBJC6hZhCnobpDrBR9YMpoDDjM1t0Veg+Z50dL6AGO/T4dllRjd3BJuWiw== + dependencies: + tslib "^2.0.0" + +"@ngrx/router-store@^11.1.1": + version "11.1.1" + resolved "https://registry.yarnpkg.com/@ngrx/router-store/-/router-store-11.1.1.tgz#a4ce866b3247ceb7903f81b4af6a960d869729cf" + integrity sha512-KE3O43wCf0VGFFIilusgSc4G5+CA++5wYL9xvdc8/BVr6sXXmOklrhyRVU/reQqy7HdYzbIofLKox5mXE/smdA== + dependencies: + tslib "^2.0.0" + +"@ngrx/store-devtools@^11.1.1": + version "11.1.1" + resolved "https://registry.yarnpkg.com/@ngrx/store-devtools/-/store-devtools-11.1.1.tgz#bdefc5c03dcac6fc21fcc9e33a4a3a3464f3e2d6" + integrity sha512-YvTMy8HUMUiiyrzKn4KhrQzkAg2yBfLgd1PHR0yPjyzj7RCaYZHwhq6sP0+AiFMBi1Lat8Wczy7SwwLTa6aZ3w== + dependencies: + tslib "^2.0.0" + +"@ngrx/store@^11.1.1": + version "11.1.1" + resolved "https://registry.yarnpkg.com/@ngrx/store/-/store-11.1.1.tgz#e971d767ae5caa8984daad23cda38c6fd94dc888" + integrity sha512-tkeKoyYo631hLJ1I8+bm9EWoi7E0A3i4IMjvf956Vpu5IdMnP6d0HW3lKU/ruhFD5YOXAHcUgEIWyfxxILABag== + dependencies: + tslib "^2.0.0" + +"@ngtools/webpack@10.2.3": + version "10.2.3" + resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-10.2.3.tgz#e4e410d1d647b6e21a69ab20c00c110464f623ea" + integrity sha512-h7JJMMca1bHY/0Prpxu2P3bvnC6pUKmBAfqN0h0HaRN9LTU9IDWtDRTIL1Aqhs/tcTUio/DowVKnVi2CWHAOmg== + dependencies: + "@angular-devkit/core" "10.2.3" + enhanced-resolve "4.3.0" + webpack-sources "1.4.3" + +"@ngtools/webpack@11.2.15": + version "11.2.15" + resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-11.2.15.tgz#217973459112178940aa689a25ab9e3a4cb35a6f" + integrity sha512-uy+ekGlgReO/4N5Ifmd4Dh1s0BTvbvMnjTrSUzmPnaeCjg4zjosA3gcdv+33duQ1Y2ythDSnf2MPYRN9q3tzgQ== + dependencies: + "@angular-devkit/core" "11.2.15" + enhanced-resolve "5.7.0" + webpack-sources "2.2.0" + +"@nguniversal/builders@~11.2.1": + version "11.2.1" + resolved "https://registry.yarnpkg.com/@nguniversal/builders/-/builders-11.2.1.tgz#42fbe12ee56f4e700f9feae292e431f57779512b" + integrity sha512-TSN12ykp2UbHoAAXrtesALaAkIs8KQ0qHmnVEEWeHqOU6/lDGYg3DHtnEpVW3kzPz0FirgudYfO3K+auer6v7g== + dependencies: + "@angular-devkit/architect" "^0.1102.3" + "@angular-devkit/core" "^11.2.3" + "@nguniversal/common" "11.2.1" + browser-sync "^2.26.7" + guess-parser "^0.4.12" + http-proxy-middleware "^1.0.0" + ora "^5.1.0" + rxjs "^6.5.5" + tree-kill "^1.2.2" + +"@nguniversal/common@11.2.1": + version "11.2.1" + resolved "https://registry.yarnpkg.com/@nguniversal/common/-/common-11.2.1.tgz#c2f6a6ee9fee43121bf3cb5da43b76a45ce9f8eb" + integrity sha512-2PYo38yBCIE5GdURFj9s5b18bY/SwX3WHmNRoMaR6Aj8uE0j2kVpmyqQgdHTyvf93pgpIbRyo7x1J6MFFXPQAA== + dependencies: + critters "0.0.7" + tslib "^2.0.0" + +"@nguniversal/express-engine@11.2.1": + version "11.2.1" + resolved "https://registry.yarnpkg.com/@nguniversal/express-engine/-/express-engine-11.2.1.tgz#015b2bc0b87b947195ee880221fb9789b5674f76" + integrity sha512-Y2t4qkyeI5xaegZeI1fJDcMUvQ4AZbKxvEibahapEX5ixN7dxq+iB6xKnSIOG+WYaP3l4c6sExhlKo/oxNXMqA== + dependencies: + "@nguniversal/common" "11.2.1" + tslib "^2.0.0" + +"@ngx-translate/core@^13.0.0": + version "13.0.0" + resolved "https://registry.yarnpkg.com/@ngx-translate/core/-/core-13.0.0.tgz#60547cb8a0845a2a0abfde6b0bf5ec6516a63fd6" + integrity sha512-+tzEp8wlqEnw0Gc7jtVRAJ6RteUjXw6JJR4O65KlnxOmJrCGPI0xjV/lKRnQeU0w4i96PQs/jtpL921Wrb7PWg== + dependencies: + tslib "^2.0.0" + +"@nicky-lenaers/ngx-scroll-to@^9.0.0": + version "9.0.0" + resolved "https://registry.yarnpkg.com/@nicky-lenaers/ngx-scroll-to/-/ngx-scroll-to-9.0.0.tgz#c8b455e9968a6116323862d081762880f3492efc" + integrity sha512-eS0vyx8qX4UTMluRYc+sQF/vJHCnAKiufWrwQRme0VURwp+RdOoZDZpYrOPTxPfx6CVj72arTeV9auDYa0WKtA== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@npmcli/ci-detect@^1.0.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@npmcli/ci-detect/-/ci-detect-1.4.0.tgz#18478bbaa900c37bfbd8a2006a6262c62e8b0fe1" + integrity sha512-3BGrt6FLjqM6br5AhWRKTr3u5GIVkjRYeAFrMp3HjnfICrg4xOrVRwFavKT6tsp++bq5dluL5t8ME/Nha/6c1Q== + +"@npmcli/fs@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.0.0.tgz#589612cfad3a6ea0feafcb901d29c63fd52db09f" + integrity sha512-8ltnOpRR/oJbOp8vaGUnipOi3bqkcW+sLHFlyXIr08OGHmVJLB1Hn7QtGXbYcpVtH1gAYZTlmDXtE4YV0+AMMQ== + dependencies: + "@gar/promisify" "^1.0.1" + semver "^7.3.5" + +"@npmcli/git@^2.0.1": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-2.1.0.tgz#2fbd77e147530247d37f325930d457b3ebe894f6" + integrity sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw== + dependencies: + "@npmcli/promise-spawn" "^1.3.2" + lru-cache "^6.0.0" + mkdirp "^1.0.4" + npm-pick-manifest "^6.1.1" + promise-inflight "^1.0.1" + promise-retry "^2.0.1" + semver "^7.3.5" + which "^2.0.2" + +"@npmcli/installed-package-contents@^1.0.5": + version "1.0.7" + resolved "https://registry.yarnpkg.com/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz#ab7408c6147911b970a8abe261ce512232a3f4fa" + integrity sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw== + dependencies: + npm-bundled "^1.1.1" + npm-normalize-package-bin "^1.0.1" + +"@npmcli/move-file@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" + integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== + dependencies: + mkdirp "^1.0.4" + rimraf "^3.0.2" + +"@npmcli/node-gyp@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-1.0.3.tgz#a912e637418ffc5f2db375e93b85837691a43a33" + integrity sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA== + +"@npmcli/promise-spawn@^1.2.0", "@npmcli/promise-spawn@^1.3.2": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz#42d4e56a8e9274fba180dabc0aea6e38f29274f5" + integrity sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg== + dependencies: + infer-owner "^1.0.4" + +"@npmcli/run-script@^1.3.0": + version "1.8.6" + resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-1.8.6.tgz#18314802a6660b0d4baa4c3afe7f1ad39d8c28b7" + integrity sha512-e42bVZnC6VluBZBAFEr3YrdqSspG3bgilyg4nSLBJ7TRGNCzxHa92XAHxQBLYg0BmgwO4b2mf3h/l5EkEWRn3g== + dependencies: + "@npmcli/node-gyp" "^1.0.2" + "@npmcli/promise-spawn" "^1.3.2" + node-gyp "^7.1.0" + read-package-json-fast "^2.0.1" + +"@polka/url@^1.0.0-next.20": + version "1.0.0-next.21" + resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1" + integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== + +"@react-dnd/asap@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@react-dnd/asap/-/asap-4.0.0.tgz#b300eeed83e9801f51bd66b0337c9a6f04548651" + integrity sha512-0XhqJSc6pPoNnf8DhdsPHtUhRzZALVzYMTzRwV4VI6DJNJ/5xxfL9OQUwb8IH5/2x7lSf7nAZrnzUD+16VyOVQ== + +"@react-dnd/invariant@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@react-dnd/invariant/-/invariant-2.0.0.tgz#09d2e81cd39e0e767d7da62df9325860f24e517e" + integrity sha512-xL4RCQBCBDJ+GRwKTFhGUW8GXa4yoDfJrPbLblc3U09ciS+9ZJXJ3Qrcs/x2IODOdIE5kQxvMmE2UKyqUictUw== + +"@react-dnd/shallowequal@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@react-dnd/shallowequal/-/shallowequal-2.0.0.tgz#a3031eb54129f2c66b2753f8404266ec7bf67f0a" + integrity sha512-Pc/AFTdwZwEKJxFJvlxrSmGe/di+aAOBn60sremrpLo6VI/6cmiUYNNwlI5KNYttg7uypzA3ILPMPgxB2GYZEg== + +"@redux-saga/core@^1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@redux-saga/core/-/core-1.1.3.tgz#3085097b57a4ea8db5528d58673f20ce0950f6a4" + integrity sha512-8tInBftak8TPzE6X13ABmEtRJGjtK17w7VUs7qV17S8hCO5S3+aUTWZ/DBsBJPdE8Z5jOPwYALyvofgq1Ws+kg== + dependencies: + "@babel/runtime" "^7.6.3" + "@redux-saga/deferred" "^1.1.2" + "@redux-saga/delay-p" "^1.1.2" + "@redux-saga/is" "^1.1.2" + "@redux-saga/symbols" "^1.1.2" + "@redux-saga/types" "^1.1.0" + redux "^4.0.4" + typescript-tuple "^2.2.1" + +"@redux-saga/deferred@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@redux-saga/deferred/-/deferred-1.1.2.tgz#59937a0eba71fff289f1310233bc518117a71888" + integrity sha512-908rDLHFN2UUzt2jb4uOzj6afpjgJe3MjICaUNO3bvkV/kN/cNeI9PMr8BsFXB/MR8WTAZQq/PlTq8Kww3TBSQ== + +"@redux-saga/delay-p@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@redux-saga/delay-p/-/delay-p-1.1.2.tgz#8f515f4b009b05b02a37a7c3d0ca9ddc157bb355" + integrity sha512-ojc+1IoC6OP65Ts5+ZHbEYdrohmIw1j9P7HS9MOJezqMYtCDgpkoqB5enAAZrNtnbSL6gVCWPHaoaTY5KeO0/g== + dependencies: + "@redux-saga/symbols" "^1.1.2" + +"@redux-saga/is@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@redux-saga/is/-/is-1.1.2.tgz#ae6c8421f58fcba80faf7cadb7d65b303b97e58e" + integrity sha512-OLbunKVsCVNTKEf2cH4TYyNbbPgvmZ52iaxBD4I1fTif4+MTXMa4/Z07L83zW/hTCXwpSZvXogqMqLfex2Tg6w== + dependencies: + "@redux-saga/symbols" "^1.1.2" + "@redux-saga/types" "^1.1.0" + +"@redux-saga/symbols@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@redux-saga/symbols/-/symbols-1.1.2.tgz#216a672a487fc256872b8034835afc22a2d0595d" + integrity sha512-EfdGnF423glv3uMwLsGAtE6bg+R9MdqlHEzExnfagXPrIiuxwr3bdiAwz3gi+PsrQ3yBlaBpfGLtDG8rf3LgQQ== + +"@redux-saga/types@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@redux-saga/types/-/types-1.1.0.tgz#0e81ce56b4883b4b2a3001ebe1ab298b84237204" + integrity sha512-afmTuJrylUU/0OtqzaRkbyYFFNgCF73Bvel/sw90pvGrWIZ+vyoIJqA6eMSoA6+nb443kTmulmBtC9NerXboNg== + +"@researchgate/react-intersection-observer@^1.0.0": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@researchgate/react-intersection-observer/-/react-intersection-observer-1.3.5.tgz#0321d2dd609aaacdb9bace8004d99c72824fb142" + integrity sha512-aYlsex5Dd6BAHMJvJrUoFp8gzgMSL27xFvrxkVYW0bV1RMAapVsO+QeYLtTaSF/QCflktODodvv+wJm49oMnnQ== + +"@scarf/scarf@^1.1.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@scarf/scarf/-/scarf-1.1.1.tgz#d8b9f20037b3a37dbf8dcdc4b3b72f9285bfce35" + integrity sha512-VGbKDbk1RFIaSmdVb0cNjjWJoRWRI/Weo23AjRCC2nryO0iAS8pzsToJfPVPtVs74WHw4L1UTADNdIYRLkirZQ== + +"@schematics/angular@11.2.15": + version "11.2.15" + resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-11.2.15.tgz#9e9770746d46d85b6c28106aec23b9cf8981cb52" + integrity sha512-btVLsvIfjMdvBRuww0GkR2Bg1APmw+Kq9+2EqKhD8K7f56s3NEmVpECgSIi4UM0Eybx+2MtKYWeud0p0CdUQ7w== + dependencies: + "@angular-devkit/core" "11.2.15" + "@angular-devkit/schematics" "11.2.15" + jsonc-parser "3.0.0" + +"@schematics/angular@^12.2.10": + version "12.2.13" + resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-12.2.13.tgz#5bf3e7b699a42d7fd7f7aa12bbe4534e671e7201" + integrity sha512-TrigQ9TCmAedf1J5PSSSfTC+sScYrITeAUN8a9rlkjZNvff8hHVyQaiZmhqL+egKQL828mhkqpnFUDd4QsPBIw== + dependencies: + "@angular-devkit/core" "12.2.13" + "@angular-devkit/schematics" "12.2.13" + jsonc-parser "3.0.0" + +"@schematics/update@0.1102.15": + version "0.1102.15" + resolved "https://registry.yarnpkg.com/@schematics/update/-/update-0.1102.15.tgz#fa6674552858d9a1c12e2c43443fc9f3d92a4f70" + integrity sha512-pC+nqfwfyDqAQYtnNKG15j6eV6XfmCML2DAIHUtTarbHtQjhBkxtdKxXnPqZW9Usa1xFaryET/7yp21uhZ2Nrw== + dependencies: + "@angular-devkit/core" "11.2.15" + "@angular-devkit/schematics" "11.2.15" + "@yarnpkg/lockfile" "1.1.0" + ini "2.0.0" + npm-package-arg "^8.0.0" + pacote "11.2.4" + semver "7.3.4" + semver-intersect "1.4.0" + +"@sindresorhus/is@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" + integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== + +"@szmarczak/http-timer@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" + integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== + dependencies: + defer-to-connect "^1.0.1" + +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + +"@trysound/sax@0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" + integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== + +"@types/body-parser@*": + version "1.19.2" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/circular-json@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@types/circular-json/-/circular-json-0.4.0.tgz#7401f7e218cfe87ad4c43690da5658b9acaf51be" + integrity sha512-7+kYB7x5a7nFWW1YPBh3KxhwKfiaI4PbZ1RvzBU91LZy7lWJO822CI+pqzSre/DZ7KsCuMKdHnLHHFu8AyXbQg== + +"@types/connect@*": + version "3.4.35" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + +"@types/deep-freeze@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@types/deep-freeze/-/deep-freeze-0.1.2.tgz#68e5379291910e82c2f0d1629732163c2aa662cc" + integrity sha512-M6x29Vk4681dght4IMnPIcF1SNmeEm0c4uatlTFhp+++H1oDK1THEIzuCC2WeCBVhX+gU0NndsseDS3zaCtlcQ== + +"@types/express-serve-static-core@^4.17.18": + version "4.17.26" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.26.tgz#5d9a8eeecb9d5f9d7fc1d85f541512a84638ae88" + integrity sha512-zeu3tpouA043RHxW0gzRxwCHchMgftE8GArRsvYT0ByDMbn19olQHx5jLue0LxWY6iYtXb7rXmuVtSkhy9YZvQ== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/express@^4.17.9": + version "4.17.13" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034" + integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.18" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/file-saver@^2.0.1": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/file-saver/-/file-saver-2.0.4.tgz#aaf9b96296150d737b2fefa535ced05ed8013d84" + integrity sha512-sPZYQEIF/SOnLAvaz9lTuydniP+afBMtElRTdYkeV1QtEgvtJ7qolCPjly6O32QI8CbEmP5O/fztMXEDWfEcrg== + +"@types/glob@^7.1.1": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" + integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + +"@types/hoist-non-react-statics@^3.3.0", "@types/hoist-non-react-statics@^3.3.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" + integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== + dependencies: + "@types/react" "*" + hoist-non-react-statics "^3.3.0" + +"@types/html-minifier-terser@^5.0.0": + version "5.1.2" + resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz#693b316ad323ea97eed6b38ed1a3cc02b1672b57" + integrity sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w== + +"@types/http-proxy@^1.17.5": + version "1.17.7" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.7.tgz#30ea85cc2c868368352a37f0d0d3581e24834c6f" + integrity sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w== + dependencies: + "@types/node" "*" + +"@types/jasmine@*": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-3.10.2.tgz#1b9f9ba9ad7bfd7d322f7ed9d8753220b1c84b52" + integrity sha512-qs4xjVm4V/XjM6owGm/x6TNmhGl5iKX8dkTdsgdgl9oFnqgzxLepnS7rN9Tdo7kDmnFD/VEqKrW57cGD2odbEg== + +"@types/jasmine@~3.6.0": + version "3.6.11" + resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-3.6.11.tgz#4b1d77aa9dfc757407cb9e277216d8e83553f09d" + integrity sha512-S6pvzQDvMZHrkBz2Mcn/8Du7cpr76PlRJBAoHnSDNbulULsH5dp0Gns+WRyNX5LHejz/ljxK4/vIHK/caHt6SQ== + +"@types/jasminewd2@~2.0.8": + version "2.0.10" + resolved "https://registry.yarnpkg.com/@types/jasminewd2/-/jasminewd2-2.0.10.tgz#ae31c237aa6421bde30f1058b1d20f4577e54443" + integrity sha512-J7mDz7ovjwjc+Y9rR9rY53hFWKATcIkrr9DwQWmOas4/pnIPJTXawnzjwpHm3RSxz/e3ZVUvQ7cRbd5UQLo10g== + dependencies: + "@types/jasmine" "*" + +"@types/js-cookie@2.2.6": + version "2.2.6" + resolved "https://registry.yarnpkg.com/@types/js-cookie/-/js-cookie-2.2.6.tgz#f1a1cb35aff47bc5cfb05cb0c441ca91e914c26f" + integrity sha512-+oY0FDTO2GYKEV0YPvSshGq9t7YozVkgvXLty7zogQNuCxBhT9/3INX9Q7H1aRZ4SUDRXAKlJuA4EA5nTt7SNw== + +"@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" + integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== + +"@types/lodash@^4.14.165": + version "4.14.177" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.177.tgz#f70c0d19c30fab101cad46b52be60363c43c4578" + integrity sha512-0fDwydE2clKe9MNfvXHBHF9WEahRuj+msTuQqOmAApNORFvhMYZKNGGJdCzuhheVjMps/ti0Ak/iJPACMaevvw== + +"@types/mime@^1": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" + integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== + +"@types/minimatch@*": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" + integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== + +"@types/node@*": + version "16.11.12" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.12.tgz#ac7fb693ac587ee182c3780c26eb65546a1a3c10" + integrity sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw== + +"@types/node@^14.14.31", "@types/node@^14.14.9": + version "14.18.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.0.tgz#98df2397f6936bfbff4f089e40e06fa5dd88d32a" + integrity sha512-0GeIl2kmVMXEnx8tg1SlG6Gg8vkqirrW752KqolYo1PHevhhZN3bhJ67qHj+bQaINhX0Ra3TlWwRvMCd9iEfNQ== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/prop-types@*": + version "15.7.4" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11" + integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ== + +"@types/q@^0.0.32": + version "0.0.32" + resolved "https://registry.yarnpkg.com/@types/q/-/q-0.0.32.tgz#bd284e57c84f1325da702babfc82a5328190c0c5" + integrity sha1-vShOV8hPEyXacCur/IKlMoGQwMU= + +"@types/q@^1.5.1": + version "1.5.5" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.5.tgz#75a2a8e7d8ab4b230414505d92335d1dcb53a6df" + integrity sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ== + +"@types/qs@*": + version "6.9.7" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + +"@types/range-parser@*": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + +"@types/react-redux@^7.1.20": + version "7.1.20" + resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.20.tgz#42f0e61ababb621e12c66c96dda94c58423bd7df" + integrity sha512-q42es4c8iIeTgcnB+yJgRTTzftv3eYYvCZOh1Ckn2eX/3o5TdsQYKUWpLoLuGlcY/p+VAhV9IOEZJcWk/vfkXw== + dependencies: + "@types/hoist-non-react-statics" "^3.3.0" + "@types/react" "*" + hoist-non-react-statics "^3.3.0" + redux "^4.0.0" + +"@types/react-transition-group@^4.2.0": + version "4.4.4" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.4.tgz#acd4cceaa2be6b757db61ed7b432e103242d163e" + integrity sha512-7gAPz7anVK5xzbeQW9wFBDg7G++aPLAFY0QaSMOou9rJZpbuI58WAuJrgu+qR92l61grlnCUe7AFX8KGahAgug== + dependencies: + "@types/react" "*" + +"@types/react@*": + version "17.0.37" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.37.tgz#6884d0aa402605935c397ae689deed115caad959" + integrity sha512-2FS1oTqBGcH/s0E+CjrCCR9+JMpsu9b69RTFO+40ua43ZqP5MmQ4iUde/dMjWR909KxZwmOQIFq6AV6NjEG5xg== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/retry@^0.12.0": + version "0.12.1" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.1.tgz#d8f1c0d0dc23afad6dc16a9e993a0865774b4065" + integrity sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g== + +"@types/scheduler@*": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" + integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== + +"@types/selenium-webdriver@^3.0.0": + version "3.0.19" + resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-3.0.19.tgz#28ecede76f15b13553b4e86074d4cf9a0bbe49c4" + integrity sha512-OFUilxQg+rWL2FMxtmIgCkUDlJB6pskkpvmew7yeXfzzsOBb5rc+y2+DjHm+r3r1ZPPcJefK3DveNSYWGiy68g== + +"@types/serve-static@*": + version "1.13.10" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9" + integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/sinonjs__fake-timers@^6.0.2": + version "6.0.4" + resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.4.tgz#0ecc1b9259b76598ef01942f547904ce61a6a77d" + integrity sha512-IFQTJARgMUBF+xVd2b+hIgXWrZEjND3vJtRCvIelcFB5SIXfjV4bOHbHJ0eXKh+0COrBRc8MqteKAz/j88rE0A== + +"@types/sizzle@^2.3.2": + version "2.3.3" + resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.3.tgz#ff5e2f1902969d305225a047c8a0fd5c915cebef" + integrity sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ== + +"@types/source-list-map@*": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" + integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== + +"@types/stacktrace-js@^0.0.33": + version "0.0.33" + resolved "https://registry.yarnpkg.com/@types/stacktrace-js/-/stacktrace-js-0.0.33.tgz#9b027370ca161b89798f308af77438802546cb39" + integrity sha512-aqJ6QM9QThNL4dHBhwl1f9B0oDqiREkYLn9RldghUKsGeFWWGlCsqsRWxbh+hDvvmptMFqc4aIfFIGz9BBu8Qg== + +"@types/tapable@^1", "@types/tapable@^1.0.5": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.8.tgz#b94a4391c85666c7b73299fd3ad79d4faa435310" + integrity sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ== + +"@types/uglify-js@*": + version "3.13.1" + resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.13.1.tgz#5e889e9e81e94245c75b6450600e1c5ea2878aea" + integrity sha512-O3MmRAk6ZuAKa9CHgg0Pr0+lUOqoMLpc9AS4R8ano2auvsg7IE8syF3Xh/NPr26TWklxYcqoEEFdzLLs1fV9PQ== + dependencies: + source-map "^0.6.1" + +"@types/webpack-sources@*": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-3.2.0.tgz#16d759ba096c289034b26553d2df1bf45248d38b" + integrity sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg== + dependencies: + "@types/node" "*" + "@types/source-list-map" "*" + source-map "^0.7.3" + +"@types/webpack-sources@^0.1.5": + version "0.1.9" + resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-0.1.9.tgz#da69b06eb34f6432e6658acb5a6893c55d983920" + integrity sha512-bvzMnzqoK16PQIC8AYHNdW45eREJQMd6WG/msQWX5V2+vZmODCOPb4TJcbgRljTZZTwTM4wUMcsI8FftNA7new== + dependencies: + "@types/node" "*" + "@types/source-list-map" "*" + source-map "^0.6.1" + +"@types/webpack@^4.41.8": + version "4.41.32" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.32.tgz#a7bab03b72904070162b2f169415492209e94212" + integrity sha512-cb+0ioil/7oz5//7tZUSwbrSAN/NWHrQylz5cW8G0dWTcF/g+/dSdMlKVZspBYuMAN1+WnwHrkxiRrLcwd0Heg== + dependencies: + "@types/node" "*" + "@types/tapable" "^1" + "@types/uglify-js" "*" + "@types/webpack-sources" "*" + anymatch "^3.0.0" + source-map "^0.6.0" + +"@types/yauzl@^2.9.1": + version "2.9.2" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.9.2.tgz#c48e5d56aff1444409e39fa164b0b4d4552a7b7a" + integrity sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA== + dependencies: + "@types/node" "*" + +"@webassemblyjs/ast@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" + integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== + dependencies: + "@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@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" + integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== + +"@webassemblyjs/helper-api-error@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" + integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== + +"@webassemblyjs/helper-buffer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" + integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== + +"@webassemblyjs/helper-code-frame@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" + integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== + dependencies: + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/helper-fsm@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" + integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== + +"@webassemblyjs/helper-module-context@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" + integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== + dependencies: + "@webassemblyjs/ast" "1.9.0" + +"@webassemblyjs/helper-wasm-bytecode@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" + integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== + +"@webassemblyjs/helper-wasm-section@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" + integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== + dependencies: + "@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@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" + integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" + integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" + integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== + +"@webassemblyjs/wasm-edit@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" + integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== + dependencies: + "@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@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" + integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== + dependencies: + "@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@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" + integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== + dependencies: + "@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@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" + integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== + dependencies: + "@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@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" + integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== + dependencies: + "@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@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" + integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + "@xtuc/long" "4.2.2" + +"@webpack-cli/configtest@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.1.0.tgz#8342bef0badfb7dfd3b576f2574ab80c725be043" + integrity sha512-ttOkEkoalEHa7RaFYpM0ErK1xc4twg3Am9hfHhL7MVqlHebnkYd2wuI/ZqTDj0cVzZho6PdinY0phFZV3O0Mzg== + +"@webpack-cli/info@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.4.0.tgz#b9179c3227ab09cbbb149aa733475fcf99430223" + integrity sha512-F6b+Man0rwE4n0409FyAJHStYA5OIZERxmnUfLVwv0mc0V1wLad3V7jqRlMkgKBeAq07jUvglacNaa6g9lOpuw== + dependencies: + envinfo "^7.7.3" + +"@webpack-cli/serve@^1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.6.0.tgz#2c275aa05c895eccebbfc34cfb223c6e8bd591a2" + integrity sha512-ZkVeqEmRpBV2GHvjjUZqEai2PpUbuq8Bqd//vEYsp63J8WyexI8ppCqVS3Zs0QADf6aWuPdU+0XsPI647PVlQA== + +"@wessberg/ts-evaluator@0.0.27": + version "0.0.27" + resolved "https://registry.yarnpkg.com/@wessberg/ts-evaluator/-/ts-evaluator-0.0.27.tgz#06e8b901d5e84f11199b9f84577c6426ae761767" + integrity sha512-7gOpVm3yYojUp/Yn7F4ZybJRxyqfMNf0LXK5KJiawbPfL0XTsJV+0mgrEDjOIR6Bi0OYk2Cyg4tjFu1r8MCZaA== + dependencies: + chalk "^4.1.0" + jsdom "^16.4.0" + object-path "^0.11.5" + tslib "^2.0.3" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +"@yarnpkg/lockfile@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" + integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== + +abab@^2.0.3, abab@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" + integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + +acorn-globals@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" + integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== + dependencies: + acorn "^7.1.1" + acorn-walk "^7.1.1" + +acorn-walk@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +acorn-walk@^8.0.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^6.4.1: + version "6.4.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== + +acorn@^7.1.1: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +acorn@^8.0.4, acorn@^8.2.4: + version "8.6.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.6.0.tgz#e3692ba0eb1a0c83eaa4f37f5fa7368dd7142895" + integrity sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw== + +adjust-sourcemap-loader@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz#5ae12fb5b7b1c585e80bbb5a63ec163a1a45e61e" + integrity sha512-YBrGyT2/uVQ/c6Rr+t6ZJXniY03YtHGMJQYal368burRGYKqhx9qGTWqcBU5s1CwYY9E/ri63RYyG1IacMZtqw== + dependencies: + loader-utils "^2.0.0" + regex-parser "^2.2.11" + +adjust-sourcemap-loader@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz#fc4a0fd080f7d10471f30a7320f25560ade28c99" + integrity sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A== + dependencies: + loader-utils "^2.0.0" + regex-parser "^2.2.11" + +adm-zip@^0.4.9: + version "0.4.16" + resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365" + integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg== + +after@0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" + integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8= + +agent-base@6, agent-base@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +agent-base@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" + integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg== + dependencies: + es6-promisify "^5.0.0" + +agentkeepalive@^4.1.3: + version "4.1.4" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.1.4.tgz#d928028a4862cb11718e55227872e842a44c945b" + integrity sha512-+V/rGa3EuU74H6wR04plBb7Ks10FbtUQgRj/FQOG7uUIEuaINI+AiqJR1k6t3SVNs7o7ZjIdus6706qqzVq8jQ== + dependencies: + debug "^4.1.0" + depd "^1.1.2" + humanize-ms "^1.2.1" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + +ajv-formats@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.0.tgz#96eaf83e38d32108b66d82a9cb0cfa24886cdfeb" + integrity sha512-USH2jBb+C/hIpwD2iRjp0pe0k+MvzG0mlSn/FIdCgQhUb9ALPRjt2KIQdfZDS9r0ZIeUAg7gOu9KL0PFqGqr5Q== + dependencies: + ajv "^8.0.0" + +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv-keywords@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + +ajv@6.12.4: + version "6.12.4" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.4.tgz#0614facc4522127fa713445c6bfd3ebd376e2234" + integrity sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ== + dependencies: + 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@6.12.6, ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + 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@8.6.2: + version "8.6.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.6.2.tgz#2fb45e0e5fcbc0813326c1c3da535d1881bb0571" + integrity sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ajv@^8.0.0, ajv@^8.8.0: + version "8.8.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.8.2.tgz#01b4fef2007a28bf75f0b7fc009f62679de4abbb" + integrity sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +alphanum-sort@^1.0.0, alphanum-sort@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" + integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= + +angular-idle-preload@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/angular-idle-preload/-/angular-idle-preload-3.0.0.tgz#decace34d9fac1cb00000727a6dc5caafdb84e4d" + integrity sha512-W3P2m2B6MHdt1DVunH6H3VWkAZrG3ZwxGcPjedVvIyRhg/LmMtILoizHSxTXw3fsKIEdAPwGObXGpML9WD1jJA== + +angular2-text-mask@9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/angular2-text-mask/-/angular2-text-mask-9.0.0.tgz#70490170a8096241fc3ce9482ed6a758ddbce8ea" + integrity sha512-iALcnhJPS1zvX48d86rgUgDe/crX6XfhZrXC4Gdlo2/YwZW7u7KJZY6/b3ieSCIWVq/E6p+wDCzeo3E6leRjDA== + dependencies: + text-mask-core "^5.0.0" + +angulartics2@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/angulartics2/-/angulartics2-10.1.0.tgz#2988f95f25cf6a8dd630d63ea604eb6643e076c3" + integrity sha512-MnwQxRXJkfbBF7417Cs7L/SIuTRNWHCOBnGolZXHFz5ogw1e51KdCKUaUkfgBogR7JpXP279FU9UDkzerIS3xw== + dependencies: + tslib "^2.0.0" + +ansi-align@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" + integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== + dependencies: + string-width "^4.1.0" + +ansi-colors@4.1.1, ansi-colors@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-colors@^3.0.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" + integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== + +ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-html-community@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" + integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== + +ansi-html@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" + integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +anymatch@^3.0.0, anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +app-root-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-3.0.0.tgz#210b6f43873227e18a4b810a032283311555d5ad" + integrity sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw== + +aproba@^1.0.3, aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +arch@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" + integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== + +are-we-there-yet@~1.1.2: + version "1.1.7" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146" + integrity sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +aria-query@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-3.0.0.tgz#65b3fcc1ca1155a8c9ae64d6eee297f15d5133cc" + integrity sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w= + dependencies: + ast-types-flow "0.0.7" + commander "^2.11.0" + +arity-n@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/arity-n/-/arity-n-1.0.4.tgz#d9e76b11733e08569c0847ae7b39b2860b30b745" + integrity sha1-2edrEXM+CFacCEeuezmyhgswt0U= + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + +array-flatten@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= + dependencies: + array-uniq "^1.0.1" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +arraybuffer.slice@~0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" + integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog== + +arrify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + +asn1.js@^5.2.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" + +asn1@~0.2.3: + version "0.2.6" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +assert@^1.1.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + dependencies: + object-assign "^4.1.1" + util "0.10.3" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +ast-types-flow@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async-each-series@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/async-each-series/-/async-each-series-0.1.1.tgz#7617c1917401fd8ca4a28aadce3dbae98afeb432" + integrity sha1-dhfBkXQB/Yykooqtzj266Yr+tDI= + +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + +async@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= + +async@^2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + dependencies: + lodash "^4.17.14" + +async@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.2.tgz#2eb7671034bb2194d45d30e31e24ec7e7f9670cd" + integrity sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +autoprefixer@10.2.4: + version "10.2.4" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.2.4.tgz#c0e7cf24fcc6a1ae5d6250c623f0cb8beef2f7e1" + integrity sha512-DCCdUQiMD+P/as8m3XkeTUkUKuuRqLGcwD0nll7wevhqoJfMRpJlkFd1+MQh1pvupjiQuip42lc/VFvfUTMSKw== + dependencies: + browserslist "^4.16.1" + caniuse-lite "^1.0.30001181" + colorette "^1.2.1" + fraction.js "^4.0.13" + normalize-range "^0.1.2" + postcss-value-parser "^4.1.0" + +autoprefixer@9.8.6: + version "9.8.6" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f" + integrity sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg== + dependencies: + browserslist "^4.12.0" + caniuse-lite "^1.0.30001109" + colorette "^1.2.1" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + postcss "^7.0.32" + postcss-value-parser "^4.1.0" + +autoprefixer@^9.6.1: + version "9.8.8" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.8.tgz#fd4bd4595385fa6f06599de749a4d5f7a474957a" + integrity sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA== + dependencies: + browserslist "^4.12.0" + caniuse-lite "^1.0.30001109" + normalize-range "^0.1.2" + num2fraction "^1.2.2" + picocolors "^0.2.1" + postcss "^7.0.32" + postcss-value-parser "^4.1.0" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.8.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" + integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== + +axe-core@^4.3.3: + version "4.3.5" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.3.5.tgz#78d6911ba317a8262bfee292aeafcc1e04b49cc5" + integrity sha512-WKTW1+xAzhMS5dJsxWkliixlO/PqC4VhmO9T4juNYcaTg9jzWiJsou6m5pxWYGfigWbwzJWeFY6z47a+4neRXA== + +axios@0.21.4: + version "0.21.4" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" + integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== + dependencies: + follow-redirects "^1.14.0" + +axobject-query@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.0.2.tgz#ea187abe5b9002b377f925d8bf7d1c561adf38f9" + integrity sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww== + dependencies: + ast-types-flow "0.0.7" + +babel-loader@8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3" + integrity sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw== + dependencies: + find-cache-dir "^2.1.0" + loader-utils "^1.4.0" + mkdirp "^0.5.3" + pify "^4.0.1" + schema-utils "^2.6.5" + +babel-loader@8.2.2: + version "8.2.2" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.2.tgz#9363ce84c10c9a40e6c753748e1441b60c8a0b81" + integrity sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g== + dependencies: + find-cache-dir "^3.3.1" + loader-utils "^1.4.0" + make-dir "^3.1.0" + schema-utils "^2.6.5" + +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + +babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +backo2@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" + integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-arraybuffer@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz#9818c79e059b1355f97e0428a017c838e90ba812" + integrity sha1-mBjHngWbE1X5fgQooBfIOOkLqBI= + +base64-js@^1.0.2, base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +base64id@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" + integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + 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" + +basic-auth@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" + integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== + dependencies: + safe-buffer "5.1.2" + +batch-processor@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/batch-processor/-/batch-processor-1.0.0.tgz#75c95c32b748e0850d10c2b168f6bdbe9891ace8" + integrity sha1-dclcMrdI4IUNEMKxaPa9vpiRrOg= + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + +bent@~7.3.6: + version "7.3.12" + resolved "https://registry.yarnpkg.com/bent/-/bent-7.3.12.tgz#e0a2775d4425e7674c64b78b242af4f49da6b035" + integrity sha512-T3yrKnVGB63zRuoco/7Ybl7BwwGZR0lceoVG5XmQyMIH9s19SV5m+a8qam4if0zQuAmOQTyPTPmsQBdAorGK3w== + dependencies: + bytesish "^0.4.1" + caseless "~0.12.0" + is-stream "^2.0.0" + +big.js@^3.1.3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" + integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q== + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bl@^4.0.3, bl@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +blob-util@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/blob-util/-/blob-util-2.0.2.tgz#3b4e3c281111bb7f11128518006cdc60b403a1eb" + integrity sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ== + +blob@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" + integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig== + +blocking-proxy@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/blocking-proxy/-/blocking-proxy-1.0.1.tgz#81d6fd1fe13a4c0d6957df7f91b75e98dac40cb2" + integrity sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA== + dependencies: + minimist "^1.2.0" + +bluebird@^3.5.5, bluebird@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.0.0, bn.js@^5.1.1: + version "5.2.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" + integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== + +body-parser@1.19.0, body-parser@^1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== + dependencies: + 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" + +bonjour@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= + dependencies: + array-flatten "^2.1.0" + deep-equal "^1.0.1" + dns-equal "^1.0.0" + dns-txt "^2.0.2" + multicast-dns "^6.0.1" + multicast-dns-service-types "^1.1.0" + +boolbase@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= + +bootstrap@4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.3.1.tgz#280ca8f610504d99d7b6b4bfc4b68cec601704ac" + integrity sha512-rXqOmH1VilAt2DyPzluTi2blhk17bO7ef+zLLPlWvG494pDxcM234pJ8wTc/6R40UWizAIIMgxjvxZg5kmsbag== + +boxen@^5.0.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" + integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== + dependencies: + ansi-align "^3.0.0" + camelcase "^6.2.0" + chalk "^4.1.0" + cli-boxes "^2.2.1" + string-width "^4.2.2" + type-fest "^0.20.2" + widest-line "^3.1.0" + wrap-ansi "^7.0.0" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + 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" + +braces@^3.0.1, braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brorand@^1.0.1, brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== + +browser-sync-client@^2.27.7: + version "2.27.7" + resolved "https://registry.yarnpkg.com/browser-sync-client/-/browser-sync-client-2.27.7.tgz#e09dce1add876984cf8232de95d2332d29401a64" + integrity sha512-wKg9UP9a4sCIkBBAXUdbkdWFJzfSAQizGh+nC19W9y9zOo9s5jqeYRFUUbs7x5WKhjtspT+xetVp9AtBJ6BmWg== + dependencies: + etag "1.8.1" + fresh "0.5.2" + mitt "^1.1.3" + rxjs "^5.5.6" + +browser-sync-ui@^2.27.7: + version "2.27.7" + resolved "https://registry.yarnpkg.com/browser-sync-ui/-/browser-sync-ui-2.27.7.tgz#38cd65f7ba058544310591ad8ac2e7fdf29934f2" + integrity sha512-Bt4OQpx9p18OIzk0KKyu7jqlvmjacasUlk8ARY3uuIyiFWSBiRgr2i6XY8dEMF14DtbooaEBOpHEu9VCYvMcCw== + dependencies: + async-each-series "0.1.1" + connect-history-api-fallback "^1" + immutable "^3" + server-destroy "1.0.1" + socket.io-client "^2.4.0" + stream-throttle "^0.1.3" + +browser-sync@^2.26.7: + version "2.27.7" + resolved "https://registry.yarnpkg.com/browser-sync/-/browser-sync-2.27.7.tgz#65ec55d6c6e33283e505e06e5113bc32d9d0a8f0" + integrity sha512-9ElnnA/u+s2Jd+IgY+2SImB+sAEIteHsMG0NR96m7Ph/wztpvJCUpyC2on1KqmG9iAp941j+5jfmd34tEguGbg== + dependencies: + browser-sync-client "^2.27.7" + browser-sync-ui "^2.27.7" + bs-recipes "1.3.4" + bs-snippet-injector "^2.0.1" + chokidar "^3.5.1" + connect "3.6.6" + connect-history-api-fallback "^1" + dev-ip "^1.0.1" + easy-extender "^2.3.4" + eazy-logger "3.1.0" + etag "^1.8.1" + fresh "^0.5.2" + fs-extra "3.0.1" + http-proxy "^1.18.1" + immutable "^3" + localtunnel "^2.0.1" + micromatch "^4.0.2" + 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.4.0" + ua-parser-js "1.0.2" + yargs "^15.4.1" + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + 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@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== + dependencies: + bn.js "^5.0.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" + integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== + dependencies: + 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" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.16.0, browserslist@^4.16.1, browserslist@^4.16.6, browserslist@^4.17.5, browserslist@^4.18.1, browserslist@^4.6.4, browserslist@^4.9.1: + version "4.18.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.18.1.tgz#60d3920f25b6860eb917c6c7b185576f4d8b017f" + integrity sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ== + dependencies: + caniuse-lite "^1.0.30001280" + electron-to-chromium "^1.3.896" + escalade "^3.1.1" + node-releases "^2.0.1" + picocolors "^1.0.0" + +browserstack@^1.5.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/browserstack/-/browserstack-1.6.1.tgz#e051f9733ec3b507659f395c7a4765a1b1e358b3" + integrity sha512-GxtFjpIaKdbAyzHfFDKixKO8IBT7wR3NjbzrGc78nNs/Ciys9wU3/nBtsqsWv5nDSrdI5tz0peKuzCPuNXNUiw== + dependencies: + https-proxy-agent "^2.2.1" + +bs-recipes@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/bs-recipes/-/bs-recipes-1.3.4.tgz#0d2d4d48a718c8c044769fdc4f89592dc8b69585" + integrity sha1-DS1NSKcYyMBEdp/cT4lZLci2lYU= + +bs-snippet-injector@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/bs-snippet-injector/-/bs-snippet-injector-2.0.1.tgz#61b5393f11f52559ed120693100343b6edb04dd5" + integrity sha1-YbU5PxH1JVntEgaTEANDtu2wTdU= + +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer-indexof@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@^4.3.0: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +builtin-modules@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + +builtins@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" + integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og= + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= + +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +bytes@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.1.tgz#3f018291cb4cbad9accb6e6970bca9c8889e879a" + integrity sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg== + +bytesish@^0.4.1: + version "0.4.4" + resolved "https://registry.yarnpkg.com/bytesish/-/bytesish-0.4.4.tgz#f3b535a0f1153747427aee27256748cff92347e6" + integrity sha512-i4uu6M4zuMUiyfZN4RU2+i9+peJh//pXhd9x1oSe1LBkZ3LEbCoygu8W0bXTukU1Jme2txKuotpCZRaC3FLxcQ== + +cacache@15.0.5: + version "15.0.5" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.0.5.tgz#69162833da29170d6732334643c60e005f5f17d0" + integrity sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A== + dependencies: + "@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" + +cacache@^12.0.2: + version "12.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" + integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== + dependencies: + 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" + +cacache@^13.0.1: + version "13.0.1" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-13.0.1.tgz#a8000c21697089082f85287a1aec6e382024a71c" + integrity sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w== + dependencies: + chownr "^1.1.2" + figgy-pudding "^3.5.1" + fs-minipass "^2.0.0" + glob "^7.1.4" + graceful-fs "^4.2.2" + infer-owner "^1.0.4" + lru-cache "^5.1.1" + minipass "^3.0.0" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.2" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + p-map "^3.0.0" + promise-inflight "^1.0.1" + rimraf "^2.7.1" + ssri "^7.0.0" + unique-filename "^1.1.1" + +cacache@^15.0.4, cacache@^15.0.5: + version "15.3.0" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" + integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== + dependencies: + "@npmcli/fs" "^1.0.0" + "@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.1" + tar "^6.0.2" + unique-filename "^1.1.1" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + 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" + +cacheable-request@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" + integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^3.0.0" + lowercase-keys "^2.0.0" + normalize-url "^4.1.0" + responselike "^1.0.2" + +cachedir@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.3.0.tgz#0c75892a052198f0b21c7c1804d8331edfcae0e8" + integrity sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw== + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= + dependencies: + caller-callsite "^2.0.0" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camel-case@^4.1.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + +camelcase@5.3.1, camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.0.0, camelcase@^6.2.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.1.tgz#250fd350cfd555d0d2160b1d51510eaf8326e86e" + integrity sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA== + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001032, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001165, caniuse-lite@^1.0.30001181, caniuse-lite@^1.0.30001280: + version "1.0.30001285" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001285.tgz#fe1e52229187e11d6670590790d669b9e03315b7" + integrity sha512-KAOkuUtcQ901MtmvxfKD+ODHH9YVDYnBt+TGYSz2KIfnq22CiArbUxXPN9067gNbgMlnNYRSwho8OPXZPALB9Q== + +canonical-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/canonical-path/-/canonical-path-1.0.0.tgz#fcb470c23958def85081856be7a86e904f180d1d" + integrity sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + +cerialize@0.1.18: + version "0.1.18" + resolved "https://registry.yarnpkg.com/cerialize/-/cerialize-0.1.18.tgz#d0f4f1b61cec7e4ed16a3eda0cac2bc99787414d" + integrity sha512-C/hp4UoPrMK060251Pt/21axF9aL4ceJlg3+pThB68VghhRjOzBzy4f8R9AirXdNB4gpqgaV2deU3UaexInL5w== + dependencies: + typescript "^2.5.0" + +chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + 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" + +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.1.0, chalk@~4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +charenc@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" + integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc= + +check-more-types@^2.24.0: + version "2.24.0" + resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600" + integrity sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA= + +"chokidar@>=2.0.0 <4.0.0", chokidar@^3.0.0, chokidar@^3.3.0, chokidar@^3.4.1, chokidar@^3.4.2, chokidar@^3.5.1, chokidar@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" + integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chokidar@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + 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" + optionalDependencies: + fsevents "^1.2.7" + +chownr@^1.1.1, chownr@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +ci-info@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.0.tgz#b4ed1fb6818dea4803a55c623041f9165d2066b2" + integrity sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw== + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +circular-dependency-plugin@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/circular-dependency-plugin/-/circular-dependency-plugin-5.2.0.tgz#e09dbc2dd3e2928442403e2d45b41cea06bc0a93" + integrity sha512-7p4Kn/gffhQaavNfyDFg7LS5S/UT1JAjyGd4UqR2+jzoYF02eDkj0Ec3+48TsIa4zghjLY87nQHIh/ecK9qLdw== + +circular-dependency-plugin@5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/circular-dependency-plugin/-/circular-dependency-plugin-5.2.2.tgz#39e836079db1d3cf2f988dc48c5188a44058b600" + integrity sha512-g38K9Cm5WRwlaH6g03B9OEz/0qRizI+2I7n+Gz+L5DxXJAPAiWQvwlYNm1V1jkdpUv95bOe/ASm2vfi/G560jQ== + +circular-json@^0.5.0: + version "0.5.9" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.5.9.tgz#932763ae88f4f7dead7a0d09c8a51a4743a53b1d" + integrity sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ== + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +classnames@^2.2.5, classnames@^2.2.6: + version "2.3.1" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" + integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== + +clean-css@^4.2.3: + version "4.2.4" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.4.tgz#733bf46eba4e607c6891ea57c24a989356831178" + integrity sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A== + dependencies: + source-map "~0.6.0" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-boxes@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" + integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-progress@^3.8.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/cli-progress/-/cli-progress-3.9.1.tgz#a22eba6a20f53289fdd05d5ee8cb2cc8c28f866e" + integrity sha512-AXxiCe2a0Lm0VN+9L0jzmfQSkcZm5EYspfqXKaSIQKqIk+0hnkZ3/v1E9B39mkD6vYhKih3c/RPsJBSwq9O99Q== + dependencies: + colors "^1.1.2" + string-width "^4.2.0" + +cli-spinners@^2.5.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" + integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== + +cli-table3@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.0.tgz#b7b1bc65ca8e7b5cef9124e13dc2b21e2ce4faee" + integrity sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ== + dependencies: + object-assign "^4.1.0" + string-width "^4.2.0" + optionalDependencies: + colors "^1.1.2" + +cli-truncate@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== + dependencies: + slice-ansi "^3.0.0" + string-width "^4.2.0" + +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clone-response@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" + integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= + dependencies: + mimic-response "^1.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= + +clone@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= + +clsx@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" + integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== + +coa@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" + integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== + dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" + q "^1.1.2" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + +codelyzer@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/codelyzer/-/codelyzer-6.0.2.tgz#25d72eae641e8ff13ffd7d99b27c9c7ad5d7e135" + integrity sha512-v3+E0Ucu2xWJMOJ2fA/q9pDT/hlxHftHGPUay1/1cTgyPV5JTHFdO9hqo837Sx2s9vKBMTt5gO+lhF95PO6J+g== + dependencies: + "@angular/compiler" "9.0.0" + "@angular/core" "9.0.0" + app-root-path "^3.0.0" + 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" + rxjs "^6.5.3" + semver-dsl "^1.0.1" + source-map "^0.5.7" + sprintf-js "^1.1.2" + tslib "^1.10.0" + zone.js "~0.10.3" + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0, color-convert@^1.9.3: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@^1.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.6.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.0.tgz#63b6ebd1bec11999d1df3a79a7569451ac2be8aa" + integrity sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.0.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== + dependencies: + color-convert "^1.9.3" + color-string "^1.6.0" + +colord@^2.9.1: + version "2.9.1" + resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.1.tgz#c961ea0efeb57c9f0f4834458f26cb9cc4a3f90e" + integrity sha512-4LBMSt09vR0uLnPVkOUBnmxgoaeN4ewRbx801wY/bXcltXfpR/G46OdWn96XpYmCWuYvO46aBZP4NgX8HpNAcw== + +colorette@^1.2.1, colorette@^1.2.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" + integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== + +colorette@^2.0.10, colorette@^2.0.14, colorette@^2.0.16: + version "2.0.16" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" + integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== + +colors@1.4.0, colors@^1.1.2, colors@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + +combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^2.11.0, commander@^2.12.1, commander@^2.2.0, commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +commander@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + +commander@^7.0.0, commander@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +common-tags@^1.8.0: + version "1.8.2" + resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" + integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +component-bind@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" + integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E= + +component-emitter@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= + +component-emitter@^1.2.1, component-emitter@~1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +component-inherit@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" + integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM= + +compose-function@3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/compose-function/-/compose-function-3.0.3.tgz#9ed675f13cc54501d30950a486ff6a7ba3ab185f" + integrity sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8= + dependencies: + arity-n "^1.0.4" + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression-webpack-plugin@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/compression-webpack-plugin/-/compression-webpack-plugin-6.1.1.tgz#ae8e4b2ffdb7396bb776e66918d751a20d8ccf0e" + integrity sha512-BEHft9M6lwOqVIQFMS/YJGmeCYXVOakC5KzQk05TFpMBlODByh1qNsZCWjUBxCQhUP9x0WfGidxTbGkjbWO/TQ== + dependencies: + cacache "^15.0.5" + find-cache-dir "^3.3.1" + schema-utils "^3.0.0" + serialize-javascript "^5.0.1" + webpack-sources "^1.4.3" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + 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" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +configstore@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" + integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== + dependencies: + dot-prop "^5.2.0" + graceful-fs "^4.1.2" + make-dir "^3.0.0" + unique-string "^2.0.0" + write-file-atomic "^3.0.0" + xdg-basedir "^4.0.0" + +connect-history-api-fallback@^1, connect-history-api-fallback@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" + integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== + +connect@3.6.6: + version "3.6.6" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.6.tgz#09eff6c55af7236e137135a72574858b6786f524" + integrity sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ= + dependencies: + debug "2.6.9" + finalhandler "1.1.0" + parseurl "~1.3.2" + utils-merge "1.0.1" + +connect@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" + integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== + dependencies: + debug "2.6.9" + finalhandler "1.1.2" + parseurl "~1.3.3" + utils-merge "1.0.1" + +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + +content-disposition@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + +convert-source-map@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + dependencies: + safe-buffer "~5.1.1" + +convert-source-map@^0.3.3: + version "0.3.5" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190" + integrity sha1-8dgClQr33SYxof6+BZZVDIarMZA= + +convert-source-map@^1.5.1, convert-source-map@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== + dependencies: + safe-buffer "~5.1.1" + +cookie-parser@1.4.5: + version "1.4.5" + resolved "https://registry.yarnpkg.com/cookie-parser/-/cookie-parser-1.4.5.tgz#3e572d4b7c0c80f9c61daf604e4336831b5d1d49" + integrity sha512-f13bPUj/gG/5mDr+xLmSxxDsB9DQiTIfhJS/sqjrmfAWiAN+x2O4i/XguTL9yDZ+/IFDanJ+5x7hC4CXT9Tdzw== + dependencies: + cookie "0.4.0" + cookie-signature "1.0.6" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + +cookie@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + +cookie@~0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" + integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== + +copy-anything@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/copy-anything/-/copy-anything-2.0.3.tgz#842407ba02466b0df844819bbe3baebbe5d45d87" + integrity sha512-GK6QUtisv4fNS+XcI7shX0Gx9ORg7QqIznyfho79JTnX1XhLiyZHfftvGiziqzRiEi/Bjhgpi+D2o7HxJFPnDQ== + dependencies: + is-what "^3.12.0" + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +copy-to-clipboard@^3: + version "3.3.1" + resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz#115aa1a9998ffab6196f93076ad6da3b913662ae" + integrity sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw== + dependencies: + toggle-selection "^1.0.6" + +copy-webpack-plugin@6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-6.0.3.tgz#2b3d2bfc6861b96432a65f0149720adbd902040b" + integrity sha512-q5m6Vz4elsuyVEIUXr7wJdIdePWTubsqVbEMvf1WQnHGv0Q+9yPRu7MtYFPt+GBOXRav9lvIINifTQ1vSCs+eA== + dependencies: + cacache "^15.0.4" + fast-glob "^3.2.4" + 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 "^3.0.1" + schema-utils "^2.7.0" + serialize-javascript "^4.0.0" + webpack-sources "^1.4.3" + +copy-webpack-plugin@6.3.2: + version "6.3.2" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-6.3.2.tgz#0e920a6c181a5052aa6e2861b164bda03f83afeb" + integrity sha512-MgJ1uouLIbDg4ST1GzqrGQyKoXY5iPqi6fghFqarijam7FQcBa/r6Rg0VkoIuzx75Xq8iAMghyOueMkWUQ5OaA== + dependencies: + cacache "^15.0.5" + fast-glob "^3.2.4" + 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 "^3.0.2" + schema-utils "^3.0.0" + serialize-javascript "^5.0.1" + webpack-sources "^1.4.3" + +copy-webpack-plugin@^6.4.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-6.4.1.tgz#138cd9b436dbca0a6d071720d5414848992ec47e" + integrity sha512-MXyPCjdPVx5iiWyl40Va3JGh27bKzOTNY3NjUTrosD2q7dR/cLD0013uqJ3BpFbUjyONINjb6qI7nDIJujrMbA== + dependencies: + cacache "^15.0.5" + fast-glob "^3.2.4" + 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 "^3.0.2" + schema-utils "^3.0.0" + serialize-javascript "^5.0.1" + webpack-sources "^1.4.3" + +core-js-compat@^3.6.2, core-js-compat@^3.8.0: + version "3.19.3" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.19.3.tgz#de75e5821c5ce924a0a1e7b7d5c2cb973ff388aa" + integrity sha512-59tYzuWgEEVU9r+SRgceIGXSSUn47JknoiXW6Oq7RW8QHjXWz3/vp8pa7dbtuVu40sewz3OP3JmQEcDdztrLhA== + dependencies: + browserslist "^4.18.1" + semver "7.0.0" + +core-js@3.6.4: + version "3.6.4" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.4.tgz#440a83536b458114b9cb2ac1580ba377dc470647" + integrity sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw== + +core-js@3.8.3: + version "3.8.3" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.8.3.tgz#c21906e1f14f3689f93abcc6e26883550dd92dd0" + integrity sha512-KPYXeVZYemC2TkNEkX/01I+7yd+nX3KddKwZ1Ww7SKWdI2wQprSgLmrTddT8nw92AjEklTsPBoSdQBhbI1bQ6Q== + +core-js@^2.4.0: + version "2.6.12" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== + +core-js@^3.7.0: + version "3.19.3" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.19.3.tgz#6df8142a996337503019ff3235a7022d7cdf4559" + integrity sha512-LeLBMgEGSsG7giquSzvgBrTS7V5UL6ks3eQlUSbN8dJStlLFiRzUm5iqsRyzUB8carhfKjkJ2vzKqE6z1Vga9g== + +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cosmiconfig@^5.0.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + +cosmiconfig@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" + integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== + dependencies: + "@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" + +cosmiconfig@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" + integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +create-ecdh@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== + dependencies: + bn.js "^4.1.0" + elliptic "^6.5.3" + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + 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@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +critters@0.0.12: + version "0.0.12" + resolved "https://registry.yarnpkg.com/critters/-/critters-0.0.12.tgz#32baa87526e053a41b67e19921673ed92264e2ab" + integrity sha512-ujxKtKc/mWpjrOKeaACTaQ1aP0O31M0ZPWhfl85jZF1smPU4Ivb9va5Ox2poif4zVJQQo0LCFlzGtEZAsCAPcw== + dependencies: + chalk "^4.1.0" + css-select "^4.1.3" + parse5 "^6.0.1" + parse5-htmlparser2-tree-adapter "^6.0.1" + postcss "^8.3.7" + pretty-bytes "^5.3.0" + +critters@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/critters/-/critters-0.0.7.tgz#548b470360f4f3c51e622de3b7aa733c8f0b17bf" + integrity sha512-qUF2SaAWFYjNPdCcPpu68p2DnHiosia84yx5mPTlUMQjkjChR+n6sO1/I7yn2U2qNDgSPTd2SoaTIDQcUL+EwQ== + dependencies: + chalk "^4.1.0" + css "^3.0.0" + parse5 "^6.0.1" + parse5-htmlparser2-tree-adapter "^6.0.1" + pretty-bytes "^5.3.0" + +cross-env@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf" + integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw== + dependencies: + cross-spawn "^7.0.1" + +cross-spawn@^6.0.0: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypt@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" + integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs= + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + 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@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + +css-blank-pseudo@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz#dfdefd3254bf8a82027993674ccf35483bfcb3c5" + integrity sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w== + dependencies: + postcss "^7.0.5" + +css-box-model@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/css-box-model/-/css-box-model-1.2.1.tgz#59951d3b81fd6b2074a62d49444415b0d2b4d7c1" + integrity sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw== + dependencies: + tiny-invariant "^1.0.6" + +css-color-names@0.0.4, css-color-names@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" + integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= + +css-declaration-sorter@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" + integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA== + dependencies: + postcss "^7.0.1" + timsort "^0.3.0" + +css-declaration-sorter@^6.0.3: + version "6.1.3" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.1.3.tgz#e9852e4cf940ba79f509d9425b137d1f94438dc2" + integrity sha512-SvjQjNRZgh4ULK1LDJ2AduPKUKxIqmtU7ZAyi47BTV+M90Qvxr9AB6lKlLbDUfXqI9IQeYA8LbAsCZPpJEV3aA== + dependencies: + timsort "^0.3.0" + +css-has-pseudo@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz#3c642ab34ca242c59c41a125df9105841f6966ee" + integrity sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^5.0.0-rc.4" + +css-loader@3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.4.0.tgz#9fb263436783117a41d014e45e8eaeba54dd6670" + integrity sha512-JornYo4RAXl1Mzt0lOSVPmArzAMV3rGY2VuwtaDc732WTWjdwTaeS19nCGWMcSCf305Q396lhhDAJEWWM0SgPQ== + dependencies: + 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.23" + postcss-modules-extract-imports "^2.0.0" + postcss-modules-local-by-default "^3.0.2" + postcss-modules-scope "^2.1.1" + postcss-modules-values "^3.0.0" + postcss-value-parser "^4.0.2" + schema-utils "^2.6.0" + +css-loader@4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-4.2.2.tgz#b668b3488d566dc22ebcf9425c5f254a05808c89" + integrity sha512-omVGsTkZPVwVRpckeUnLshPp12KsmMSLqYxs12+RzM9jRR5Y+Idn/tBffjXRvOE+qW7if24cuceFJqYR5FmGBg== + dependencies: + camelcase "^6.0.0" + cssesc "^3.0.0" + icss-utils "^4.1.1" + loader-utils "^2.0.0" + postcss "^7.0.32" + postcss-modules-extract-imports "^2.0.0" + postcss-modules-local-by-default "^3.0.3" + postcss-modules-scope "^2.2.0" + postcss-modules-values "^3.0.0" + postcss-value-parser "^4.1.0" + schema-utils "^2.7.0" + semver "^7.3.2" + +css-loader@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-5.0.1.tgz#9e4de0d6636a6266a585bd0900b422c85539d25f" + integrity sha512-cXc2ti9V234cq7rJzFKhirb2L2iPy8ZjALeVJAozXYz9te3r4eqLSixNAbMDJSgJEQywqXzs8gonxaboeKqwiw== + dependencies: + camelcase "^6.2.0" + cssesc "^3.0.0" + icss-utils "^5.0.0" + loader-utils "^2.0.0" + postcss "^8.1.4" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.0" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.1.0" + schema-utils "^3.0.0" + semver "^7.3.2" + +css-parse@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/css-parse/-/css-parse-2.0.0.tgz#a468ee667c16d81ccf05c58c38d2a97c780dbfd4" + integrity sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q= + dependencies: + css "^2.0.0" + +css-prefers-color-scheme@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz#6f830a2714199d4f0d0d0bb8a27916ed65cff1f4" + integrity sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg== + dependencies: + postcss "^7.0.5" + +css-select-base-adapter@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" + integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== + +css-select@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" + integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== + dependencies: + boolbase "^1.0.0" + css-what "^3.2.1" + domutils "^1.7.0" + nth-check "^1.0.2" + +css-select@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.1.3.tgz#a70440f70317f2669118ad74ff105e65849c7067" + integrity sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA== + dependencies: + boolbase "^1.0.0" + css-what "^5.0.0" + domhandler "^4.2.0" + domutils "^2.6.0" + nth-check "^2.0.0" + +css-selector-tokenizer@^0.7.1: + version "0.7.3" + resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz#735f26186e67c749aaf275783405cf0661fae8f1" + integrity sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg== + dependencies: + cssesc "^3.0.0" + fastparse "^1.1.2" + +css-tree@1.0.0-alpha.37: + version "1.0.0-alpha.37" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" + integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== + dependencies: + mdn-data "2.0.4" + source-map "^0.6.1" + +css-tree@^1.1.2, css-tree@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +css-vendor@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/css-vendor/-/css-vendor-2.0.8.tgz#e47f91d3bd3117d49180a3c935e62e3d9f7f449d" + integrity sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ== + dependencies: + "@babel/runtime" "^7.8.3" + is-in-browser "^1.0.2" + +css-what@^3.2.1: + version "3.4.2" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" + integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== + +css-what@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.1.0.tgz#3f7b707aadf633baf62c2ceb8579b545bb40f7fe" + integrity sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw== + +css@^2.0.0: + version "2.2.4" + resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" + integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw== + dependencies: + inherits "^2.0.3" + source-map "^0.6.1" + source-map-resolve "^0.5.2" + urix "^0.1.0" + +css@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/css/-/css-3.0.0.tgz#4447a4d58fdd03367c516ca9f64ae365cee4aa5d" + integrity sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ== + dependencies: + inherits "^2.0.4" + source-map "^0.6.1" + source-map-resolve "^0.6.0" + +cssauron@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/cssauron/-/cssauron-1.4.0.tgz#a6602dff7e04a8306dc0db9a551e92e8b5662ad8" + integrity sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg= + dependencies: + through X.X.X + +cssdb@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0" + integrity sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ== + +cssesc@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" + integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-default@^4.0.7, cssnano-preset-default@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz#920622b1fc1e95a34e8838203f1397a504f2d3ff" + integrity sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ== + dependencies: + 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.3" + postcss-unique-selectors "^4.0.1" + +cssnano-preset-default@^5.0.1: + version "5.1.8" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.1.8.tgz#7525feb1b72f7b06e57f55064cbdae341d79dea2" + integrity sha512-zWMlP0+AMPBVE852SqTrP0DnhTcTA2C1wAF92TKZ3Va+aUVqLIhkqKlnJIXXdqXD7RN+S1ujuWmNpvrJBiM/vg== + dependencies: + css-declaration-sorter "^6.0.3" + cssnano-utils "^2.0.1" + postcss-calc "^8.0.0" + postcss-colormin "^5.2.1" + postcss-convert-values "^5.0.2" + postcss-discard-comments "^5.0.1" + postcss-discard-duplicates "^5.0.1" + postcss-discard-empty "^5.0.1" + postcss-discard-overridden "^5.0.1" + postcss-merge-longhand "^5.0.4" + postcss-merge-rules "^5.0.3" + postcss-minify-font-values "^5.0.1" + postcss-minify-gradients "^5.0.3" + postcss-minify-params "^5.0.2" + postcss-minify-selectors "^5.1.0" + postcss-normalize-charset "^5.0.1" + postcss-normalize-display-values "^5.0.1" + postcss-normalize-positions "^5.0.1" + postcss-normalize-repeat-style "^5.0.1" + postcss-normalize-string "^5.0.1" + postcss-normalize-timing-functions "^5.0.1" + postcss-normalize-unicode "^5.0.1" + postcss-normalize-url "^5.0.3" + postcss-normalize-whitespace "^5.0.1" + postcss-ordered-values "^5.0.2" + postcss-reduce-initial "^5.0.2" + postcss-reduce-transforms "^5.0.1" + postcss-svgo "^5.0.3" + postcss-unique-selectors "^5.0.2" + +cssnano-util-get-arguments@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" + integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= + +cssnano-util-get-match@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" + integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= + +cssnano-util-raw-cache@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" + integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== + dependencies: + postcss "^7.0.0" + +cssnano-util-same-parent@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" + integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== + +cssnano-utils@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-2.0.1.tgz#8660aa2b37ed869d2e2f22918196a9a8b6498ce2" + integrity sha512-i8vLRZTnEH9ubIyfdZCAdIdgnHAUeQeByEeQ2I7oTilvP9oHO6RScpeq3GsFUVqeB8uZgOQ9pw8utofNn32hhQ== + +cssnano@4.1.10: + version "4.1.10" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2" + integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ== + dependencies: + cosmiconfig "^5.0.0" + cssnano-preset-default "^4.0.7" + is-resolvable "^1.0.0" + postcss "^7.0.0" + +cssnano@5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.0.2.tgz#3f6de4fd5ecb7b5fb636c1a606de5f38cd241493" + integrity sha512-8JK3EnPsjQsULme9/e5M2hF564f/480hwsdcHvQ7ZtAIMfQ1O3SCfs+b8Mjf5KJxhYApyRshR2QSovEJi2K72Q== + dependencies: + cosmiconfig "^7.0.0" + cssnano-preset-default "^5.0.1" + is-resolvable "^1.1.0" + +cssnano@^4.1.10: + version "4.1.11" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.11.tgz#c7b5f5b81da269cb1fd982cb960c1200910c9a99" + integrity sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g== + dependencies: + cosmiconfig "^5.0.0" + cssnano-preset-default "^4.0.8" + is-resolvable "^1.0.0" + postcss "^7.0.0" + +csso@^4.0.2, csso@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" + integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== + dependencies: + css-tree "^1.1.2" + +cssom@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" + integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + dependencies: + cssom "~0.3.6" + +csstype@^2.5.2: + version "2.6.19" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.19.tgz#feeb5aae89020bb389e1f63669a5ed490e391caa" + integrity sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ== + +csstype@^3.0.2: + version "3.0.10" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.10.tgz#2ad3a7bed70f35b965707c092e5f30b327c290e5" + integrity sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA== + +custom-event@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" + integrity sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU= + +cyclist@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" + integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= + +cypress-axe@^0.13.0: + version "0.13.0" + resolved "https://registry.yarnpkg.com/cypress-axe/-/cypress-axe-0.13.0.tgz#3234e1a79a27701f2451fcf2f333eb74204c7966" + integrity sha512-fCIy7RiDCm7t30U3C99gGwQrUO307EYE1QqXNaf9ToK4DVqW8y5on+0a/kUHMrHdlls2rENF6TN9ZPpPpwLrnw== + +cypress@8.6.0: + version "8.6.0" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-8.6.0.tgz#8d02fa58878b37cfc45bbfce393aa974fa8a8e22" + integrity sha512-F7qEK/6Go5FsqTueR+0wEw2vOVKNgk5847Mys8vsWkzPoEKdxs+7N9Y1dit+zhaZCLtMPyrMwjfA53ZFy+lSww== + dependencies: + "@cypress/request" "^2.88.6" + "@cypress/xvfb" "^1.2.4" + "@types/node" "^14.14.31" + "@types/sinonjs__fake-timers" "^6.0.2" + "@types/sizzle" "^2.3.2" + arch "^2.2.0" + blob-util "^2.0.2" + bluebird "^3.7.2" + cachedir "^2.3.0" + chalk "^4.1.0" + check-more-types "^2.24.0" + cli-cursor "^3.1.0" + cli-table3 "~0.6.0" + commander "^5.1.0" + common-tags "^1.8.0" + dayjs "^1.10.4" + debug "^4.3.2" + enquirer "^2.3.6" + eventemitter2 "^6.4.3" + execa "4.1.0" + executable "^4.1.1" + extract-zip "2.0.1" + figures "^3.2.0" + fs-extra "^9.1.0" + getos "^3.2.1" + is-ci "^3.0.0" + is-installed-globally "~0.4.0" + lazy-ass "^1.6.0" + listr2 "^3.8.3" + lodash "^4.17.21" + log-symbols "^4.0.0" + minimist "^1.2.5" + ospath "^1.2.2" + pretty-bytes "^5.6.0" + proxy-from-env "1.0.0" + ramda "~0.27.1" + request-progress "^3.0.0" + supports-color "^8.1.1" + tmp "~0.2.1" + untildify "^4.0.0" + url "^0.11.0" + yauzl "^2.10.0" + +d@1, d@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + +damerau-levenshtein@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz#64368003512a1a6992593741a09a9d31a836f55d" + integrity sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw== + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + +data-urls@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" + integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== + dependencies: + abab "^2.0.3" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" + +date-format@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/date-format/-/date-format-2.1.0.tgz#31d5b5ea211cf5fd764cd38baf9d033df7e125cf" + integrity sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA== + +date-format@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/date-format/-/date-format-3.0.0.tgz#eb8780365c7d2b1511078fb491e6479780f3ad95" + integrity sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w== + +dayjs@^1.10.4: + version "1.10.7" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.10.7.tgz#2cf5f91add28116748440866a0a1d26f3a6ce468" + integrity sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig== + +debug-loader@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/debug-loader/-/debug-loader-0.0.1.tgz#44dc37e09e3c39e6af334681960f70a534a9d056" + integrity sha1-RNw34J48OeavM0aBlg9wpTSp0FY= + dependencies: + loader-utils "^0.2.12" + +debug@2.6.9, debug@^2.2.0, debug@^2.3.3: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.2: + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== + dependencies: + ms "2.1.2" + +debug@4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + dependencies: + ms "2.1.2" + +debug@4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" + integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== + dependencies: + ms "2.1.2" + +debug@^3.1.0, debug@^3.1.1, debug@^3.2.5, debug@^3.2.6, debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@~3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + dependencies: + ms "2.0.0" + +debug@~4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decimal.js@^10.2.1: + version "10.3.1" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" + integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= + dependencies: + mimic-response "^1.0.0" + +deep-equal@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" + integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== + dependencies: + 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@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deep-freeze@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/deep-freeze/-/deep-freeze-0.0.1.tgz#3a0b0005de18672819dfd38cd31f91179c893e84" + integrity sha1-OgsABd4YZygZ39OM0x+RF5yJPoQ= + +deep-is@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + +default-gateway@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" + integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA== + dependencies: + execa "^1.0.0" + ip-regex "^2.1.0" + +default-gateway@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" + integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== + dependencies: + execa "^5.0.0" + +defaults@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= + dependencies: + clone "^1.0.2" + +defer-to-connect@^1.0.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" + integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +del@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" + integrity sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag= + dependencies: + globby "^5.0.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + rimraf "^2.2.8" + +del@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" + integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== + dependencies: + "@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" + +del@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/del/-/del-6.0.0.tgz#0b40d0332cea743f1614f818be4feb717714c952" + integrity sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ== + dependencies: + globby "^11.0.1" + graceful-fs "^4.2.4" + is-glob "^4.0.1" + is-path-cwd "^2.2.0" + is-path-inside "^3.0.2" + p-map "^4.0.0" + rimraf "^3.0.2" + slash "^3.0.0" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +depd@^1.1.2, depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +depd@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +dependency-graph@^0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-0.7.2.tgz#91db9de6eb72699209d88aea4c1fd5221cac1c49" + integrity sha512-KqtH4/EZdtdfWX0p6MGP9jljvxSY6msy/pRUD4jgNwVpv3v1QmNLlsB3LDSSUg79BRVSn7jI1QPRtArGABovAQ== + +dependency-graph@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-0.9.0.tgz#11aed7e203bc8b00f48356d92db27b265c445318" + integrity sha512-9YLIBURXj4DJMFALxXw9K3Y3rwb5Fk0X5/8ipCzaN84+gKxoHK43tVKRNakCQbiEx07E8Uwhuq21BpUagFhZ8w== + +des.js@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + +dev-ip@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dev-ip/-/dev-ip-1.0.1.tgz#a76a3ed1855be7a012bb8ac16cb80f3c00dc28f0" + integrity sha1-p2o+0YVb56ASu4rBbLgPPADcKPA= + +di@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" + integrity sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw= + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + +dnd-core@^10.0.2: + version "10.0.2" + resolved "https://registry.yarnpkg.com/dnd-core/-/dnd-core-10.0.2.tgz#051dc119682ea1185622f954667670d3d5f6a574" + integrity sha512-PrxEjxF0+6Y1n1n1Z9hSWZ1tvnDXv9syL+BccV1r1RC08uWNsyetf8AnWmUF3NgYPwy0HKQJwTqGkZK+1NlaFA== + dependencies: + "@react-dnd/asap" "^4.0.0" + "@react-dnd/invariant" "^2.0.0" + redux "^4.0.4" + +dnd-multi-backend@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/dnd-multi-backend/-/dnd-multi-backend-5.1.1.tgz#0032761795c3df6a479989f002d8a7d92ad58094" + integrity sha512-+bdMsGAC1wlne4+AwTvr6eQ6Bp3St6hn0wp0BcpUMOMVTNM0S+n0Ha8S/qbpYK7XY+i0j439v+yaKO9g9aFvQg== + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= + +dns-packet@^1.3.1: + version "1.3.4" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f" + integrity sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA== + dependencies: + ip "^1.1.0" + safe-buffer "^5.0.1" + +dns-txt@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= + dependencies: + buffer-indexof "^1.0.0" + +dom-converter@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== + dependencies: + utila "~0.4" + +dom-helpers@^5.0.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" + integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== + dependencies: + "@babel/runtime" "^7.8.7" + csstype "^3.0.2" + +dom-serialize@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" + integrity sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs= + dependencies: + custom-event "~1.0.0" + ent "~2.2.0" + extend "^3.0.0" + void-elements "^2.0.0" + +dom-serializer@0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +dom-serializer@^1.0.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" + integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +domelementtype@1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domelementtype@^2.0.1, domelementtype@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" + integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== + +domexception@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" + integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== + dependencies: + webidl-conversions "^5.0.0" + +domhandler@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-3.3.0.tgz#6db7ea46e4617eb15cf875df68b2b8524ce0037a" + integrity sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA== + dependencies: + domelementtype "^2.0.1" + +domhandler@^4.0.0, domhandler@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.0.tgz#16c658c626cf966967e306f966b431f77d4a5626" + integrity sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g== + dependencies: + domelementtype "^2.2.0" + +domino@^2.1.2: + version "2.1.6" + resolved "https://registry.yarnpkg.com/domino/-/domino-2.1.6.tgz#fe4ace4310526e5e7b9d12c7de01b7f485a57ffe" + integrity sha512-3VdM/SXBZX2omc9JF9nOPCtDaYQ67BGp5CoLpIQlO2KCAPETs8TcDHacF26jXadGbvUteZzRTeos2fhID5+ucQ== + +dompurify@^2.0.11: + version "2.3.4" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.3.4.tgz#1cf5cf0105ccb4debdf6db162525bd41e6ddacc6" + integrity sha512-6BVcgOAVFXjI0JTjEvZy901Rghm+7fDQOrNIcxB4+gdhj6Kwp6T9VBhBY/AbagKHJocRkDYGd6wvI+p4/10xtQ== + +domutils@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + +domutils@^2.0.0, domutils@^2.5.2, domutils@^2.6.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +dot-prop@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== + dependencies: + is-obj "^2.0.0" + +dotenv@^8.2.0: + version "8.6.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" + integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== + +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + +duplexer@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +easy-extender@^2.3.4: + version "2.3.4" + resolved "https://registry.yarnpkg.com/easy-extender/-/easy-extender-2.3.4.tgz#298789b64f9aaba62169c77a2b3b64b4c9589b8f" + integrity sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q== + dependencies: + lodash "^4.17.10" + +eazy-logger@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/eazy-logger/-/eazy-logger-3.1.0.tgz#b169eb56df714608fa114f164c8a2956bec9f0f3" + integrity sha512-/snsn2JqBtUSSstEl4R0RKjkisGHAhvYj89i7r3ytNUKW12y178KDZwXLXIgwDqLW6E/VRMT9qfld7wvFae8bQ== + dependencies: + tfunk "^4.0.0" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + +electron-to-chromium@^1.3.896: + version "1.4.12" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.12.tgz#5f73d1278c6205fc41d7a0ebd75563046b77c5d8" + integrity sha512-zjfhG9Us/hIy8AlQ5OzfbR/C4aBv1Dg/ak4GX35CELYlJ4tDAtoEcQivXvyBdqdNQ+R6PhlgQqV8UNPJmhkJog== + +element-resize-detector@^1.2.1: + version "1.2.3" + resolved "https://registry.yarnpkg.com/element-resize-detector/-/element-resize-detector-1.2.3.tgz#5078d9b99398fe4c589f8c8df94ff99e5d413ff3" + integrity sha512-+dhNzUgLpq9ol5tyhoG7YLoXL3ssjfFW+0gpszXPwRU6NjGr1fVHMEAF8fVzIiRJq57Nre0RFeIjJwI8Nh2NmQ== + dependencies: + batch-processor "1.0.0" + +elliptic@^6.5.3: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +encodeurl@~1.0.1, encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + +encoding@^0.1.12: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +engine.io-client@~3.5.0: + version "3.5.2" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.5.2.tgz#0ef473621294004e9ceebe73cef0af9e36f2f5fa" + integrity sha512-QEqIp+gJ/kMHeUun7f5Vv3bteRHppHH/FMBQX/esFj/fuYfjyUKWGMo3VCvIP/V8bE9KcjHmRZrhIz2Z9oNsDA== + dependencies: + component-emitter "~1.3.0" + component-inherit "0.0.3" + debug "~3.1.0" + engine.io-parser "~2.2.0" + has-cors "1.1.0" + indexof "0.0.1" + parseqs "0.0.6" + parseuri "0.0.6" + ws "~7.4.2" + xmlhttprequest-ssl "~1.6.2" + yeast "0.1.2" + +engine.io-parser@~2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.2.1.tgz#57ce5611d9370ee94f99641b589f94c97e4f5da7" + integrity sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg== + dependencies: + after "0.8.2" + arraybuffer.slice "~0.0.7" + base64-arraybuffer "0.1.4" + blob "0.0.5" + has-binary2 "~1.0.2" + +engine.io@~3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.5.0.tgz#9d6b985c8a39b1fe87cd91eb014de0552259821b" + integrity sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA== + dependencies: + accepts "~1.3.4" + base64id "2.0.0" + cookie "~0.4.1" + debug "~4.1.0" + engine.io-parser "~2.2.0" + ws "~7.4.2" + +enhanced-resolve@4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz#3b806f3bfafc1ec7de69551ef93cca46c1704126" + integrity sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + +enhanced-resolve@5.7.0: + version "5.7.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.7.0.tgz#525c5d856680fbd5052de453ac83e32049958b5c" + integrity sha512-6njwt/NsZFUKhM6j9U8hzVyD4E4r0x7NQzhTCbcWOJ0IQjNSAoalWmb0AE51Wn+fwan5qVESWi7t2ToBxs9vrw== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +enhanced-resolve@^4.0.0, enhanced-resolve@^4.3.0, enhanced-resolve@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" + integrity sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + +enquirer@^2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + +ent@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" + integrity sha1-6WQhkyWiHQX0RGai9obtbOX13R0= + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +env-paths@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +envinfo@^7.7.3: + version "7.8.1" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" + integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== + +err-code@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960" + integrity sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA= + +err-code@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" + integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== + +errno@^0.1.1, errno@^0.1.3, errno@~0.1.7: + version "0.1.8" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== + dependencies: + prr "~1.0.1" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +error-stack-parser@^2.0.1: + version "2.0.6" + resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.0.6.tgz#5a99a707bd7a4c58a797902d48d82803ede6aad8" + integrity sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ== + dependencies: + stackframe "^1.1.1" + +es-abstract@^1.17.2, es-abstract@^1.19.1: + version "1.19.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" + integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.1" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.1" + is-string "^1.0.7" + is-weakref "^1.0.1" + object-inspect "^1.11.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es5-ext@^0.10.35, es5-ext@^0.10.50: + version "0.10.53" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" + integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.3" + next-tick "~1.0.0" + +es6-iterator@2.0.3, es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-promise@^4.0.3: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= + dependencies: + es6-promise "^4.0.3" + +es6-promisify@^6.0.0: + version "6.1.1" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-6.1.1.tgz#46837651b7b06bf6fff893d03f29393668d01621" + integrity sha512-HBL8I3mIki5C1Cc9QjKUenHtnG0A5/xA8Q/AllRcfiwl2CZFXGK7ddBiCoRwAix4i2KxcQfjtIVcrVbB3vbmwg== + +es6-symbol@^3.1.1, es6-symbol@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== + dependencies: + d "^1.0.1" + ext "^1.1.2" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-goat@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" + integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escodegen@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" + integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esrecurse@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@1.8.1, etag@^1.8.1, etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +eventemitter2@^6.4.3: + version "6.4.5" + resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.5.tgz#97380f758ae24ac15df8353e0cc27f8b95644655" + integrity sha512-bXE7Dyc1i6oQElDG0jMRZJrRAn9QR2xyyFGmBdZleNmyQX0FqGYmhZIrIrpPfm/w//LTo4tVQGOGQcGCb5q9uw== + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +eventsource@^1.0.7: + version "1.1.0" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.1.0.tgz#00e8ca7c92109e94b0ddf32dac677d841028cfaf" + integrity sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg== + dependencies: + original "^1.0.0" + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +execa@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" + integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== + dependencies: + 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" + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + 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" + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +executable@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c" + integrity sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg== + dependencies: + pify "^2.2.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + 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" + +express-rate-limit@^5.1.3: + version "5.5.1" + resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-5.5.1.tgz#110c23f6a65dfa96ab468eda95e71697bc6987a2" + integrity sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg== + +express@^4.17.1: + version "4.17.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + dependencies: + 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" + +ext@^1.1.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.6.0.tgz#3871d50641e874cc172e2b53f919842d19db4c52" + integrity sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg== + dependencies: + type "^2.5.0" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@^3.0.0, extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + 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" + +extract-zip@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.1.1, fast-glob@^3.2.4: + version "3.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" + integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-patch@^3.0.0-1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/fast-json-patch/-/fast-json-patch-3.1.0.tgz#ec8cd9b9c4c564250ec8b9140ef7a55f70acaee6" + integrity sha512-IhpytlsVTRndz0hU5t0/MGzS/etxLlfrpG5V5M9mVbuj9TrJLWaMfsox9REM5rkuGX0T+5qjpe8XA1o0gZ42nA== + +fast-json-stable-stringify@2.1.0, fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fast-memoize@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/fast-memoize/-/fast-memoize-2.5.2.tgz#79e3bb6a4ec867ea40ba0e7146816f6cdce9b57e" + integrity sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw== + +fastest-levenshtein@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" + integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== + +fastparse@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" + integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== + +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + dependencies: + reusify "^1.0.4" + +faye-websocket@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" + integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ= + dependencies: + websocket-driver ">=0.5.1" + +faye-websocket@^0.11.3, faye-websocket@~0.11.1: + version "0.11.4" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= + dependencies: + pend "~1.2.0" + +figgy-pudding@^3.5.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" + integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== + +figures@^3.0.0, figures@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +file-loader@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.0.0.tgz#97bbfaab7a2460c07bcbd72d3a6922407f67649f" + integrity sha512-/aMOAYEFXDdjG0wytpTL5YQLfZnnTmLNjn+AIrJ/6HVnTfDqLsVKUUwkDf4I4kgex36BvjuXEn/TX9B/1ESyqQ== + dependencies: + loader-utils "^2.0.0" + schema-utils "^2.6.5" + +file-loader@6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" + integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +file-saver@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/file-saver/-/file-saver-2.0.5.tgz#d61cfe2ce059f414d899e9dd6d4107ee25670c38" + integrity sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA== + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +filesize@^6.1.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.4.0.tgz#914f50471dd66fdca3cefe628bd0cde4ef769bcd" + integrity sha512-mjFIpOHC4jbfcTfoh4rkWpI31mF7viw9ikj/JyLoKzqlwG/YsefKfvYlYhdYdg/9mtK2z1AzgN/0LvVQ3zdlSQ== + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" + integrity sha1-zgtoVbRYU+eRsvzGgARtiCU91/U= + dependencies: + 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" + +finalhandler@1.1.2, finalhandler@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +find-cache-dir@3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" + integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-cache-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-cache-dir@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +flatted@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" + integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== + +flatten@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" + integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== + +flush-write-stream@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" + +follow-redirects@^1.0.0, follow-redirects@^1.14.0: + version "1.14.5" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.5.tgz#f09a5848981d3c772b5392309778523f8d85c381" + integrity sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA== + +font-awesome@4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/font-awesome/-/font-awesome-4.7.0.tgz#8fa8cf0411a1a31afd07b06d2902bb9fc815a133" + integrity sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM= + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + +fork-ts-checker-webpack-plugin@^6.0.3: + version "6.5.0" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.0.tgz#0282b335fa495a97e167f69018f566ea7d2a2b5e" + integrity sha512-cS178Y+xxtIjEUorcHddKS7yCMlrDPV31mt47blKKRfMd70Kxu5xruAFE2o9sDY6wVC5deuob/u/alD04YYHnw== + dependencies: + "@babel/code-frame" "^7.8.3" + "@types/json-schema" "^7.0.5" + chalk "^4.1.0" + chokidar "^3.4.2" + cosmiconfig "^6.0.0" + deepmerge "^4.2.2" + fs-extra "^9.0.0" + glob "^7.1.6" + memfs "^3.1.2" + minimatch "^3.0.4" + schema-utils "2.7.0" + semver "^7.3.2" + tapable "^1.0.0" + +form-data@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" + integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fraction.js@^4.0.13: + version "4.1.2" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.1.2.tgz#13e420a92422b6cf244dff8690ed89401029fbe8" + integrity sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA== + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2, fresh@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-extra@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" + integrity sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE= + dependencies: + graceful-fs "^4.1.2" + jsonfile "^3.0.0" + universalify "^0.1.0" + +fs-extra@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.2.tgz#f91704c53d1b461f893452b0c307d9997647ab6b" + integrity sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s= + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^0.22.1: + version "0.22.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.22.1.tgz#5fd6f8049dc976ca19eb2355d658173cabcce056" + integrity sha1-X9b4BJ3JdsoZ6yNV1lgXPKvM4FY= + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + rimraf "^2.2.8" + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^9.0.0, fs-extra@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-minipass@^2.0.0, fs-minipass@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs-monkey@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" + integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== + +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fscreen@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fscreen/-/fscreen-1.2.0.tgz#1a8c88e06bc16a07b473ad96196fb06d6657f59e" + integrity sha512-hlq4+BU0hlPmwsFjwGGzZ+OZ9N/wq9Ljg/sq3pX+2CD7hrJsX9tJgWWK/wiNTFM212CLHWhicOoqwXyZGGetJg== + +fsevents@^1.2.7: + version "1.2.13" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +fsevents@~2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" + integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== + +fsevents@~2.3.1, fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.1, get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-stdin@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" + integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== + +get-stream@^4.0.0, get-stream@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-stream@^5.0.0, get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +getos@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/getos/-/getos-3.2.1.tgz#0134d1f4e00eb46144c5a9c0ac4dc087cbb27dc5" + integrity sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q== + dependencies: + async "^3.2.0" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-parent@^5.1.1, glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ== + dependencies: + 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@7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + 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@^7.0.3, glob@^7.0.6, glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + 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" + +global-dirs@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686" + integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA== + dependencies: + ini "2.0.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globby@^11.0.0, globby@^11.0.1: + version "11.0.4" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" + integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== + dependencies: + 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" + +globby@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" + integrity sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0= + dependencies: + array-union "^1.0.1" + arrify "^1.0.0" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +got@^9.6.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" + integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== + dependencies: + "@sindresorhus/is" "^0.14.0" + "@szmarczak/http-timer" "^1.1.2" + cacheable-request "^6.0.0" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^4.1.0" + lowercase-keys "^1.0.1" + mimic-response "^1.0.1" + p-cancelable "^1.0.0" + to-readable-stream "^1.0.0" + url-parse-lax "^3.0.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.3, graceful-fs@^4.2.4, graceful-fs@^4.2.6: + version "4.2.8" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" + integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== + +guess-parser@^0.4.12: + version "0.4.22" + resolved "https://registry.yarnpkg.com/guess-parser/-/guess-parser-0.4.22.tgz#c26ab9e21b69bbc761960c5a1511476ae85428eb" + integrity sha512-KcUWZ5ACGaBM69SbqwVIuWGoSAgD+9iJnchR9j/IarVI1jHVeXv+bUXBIMeqVMSKt3zrn0Dgf9UpcOEpPBLbSg== + dependencies: + "@wessberg/ts-evaluator" "0.0.27" + +gzip-size@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" + integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== + dependencies: + duplexer "^0.1.2" + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== + +has-binary2@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d" + integrity sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw== + dependencies: + isarray "2.0.1" + +has-cors@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" + integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.1, has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has-yarn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" + integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== + +has@^1.0.0, has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hex-color-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" + integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +hosted-git-info@^3.0.6: + version "3.0.8" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-3.0.8.tgz#6e35d4cc87af2c5f816e4cb9ce350ba87a3f370d" + integrity sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw== + dependencies: + lru-cache "^6.0.0" + +hosted-git-info@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.0.2.tgz#5e425507eede4fea846b7262f0838456c4209961" + integrity sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg== + dependencies: + lru-cache "^6.0.0" + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +hsl-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" + integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= + +hsla-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" + integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= + +html-encoding-sniffer@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" + integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== + dependencies: + whatwg-encoding "^1.0.5" + +html-entities@^1.3.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc" + integrity sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA== + +html-entities@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.2.tgz#760b404685cb1d794e4f4b744332e3b00dcfe488" + integrity sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ== + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +html-loader@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/html-loader/-/html-loader-1.3.2.tgz#5a72ebba420d337083497c9aba7866c9e1aee340" + integrity sha512-DEkUwSd0sijK5PF3kRWspYi56XP7bTNkyg5YWSzBdjaSDmvCufep5c4Vpb3PBf6lUL0YPtLwBfy9fL0t5hBAGA== + dependencies: + html-minifier-terser "^5.1.1" + htmlparser2 "^4.1.0" + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +html-minifier-terser@^5.0.1, html-minifier-terser@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#922e96f1f3bb60832c2634b79884096389b1f054" + integrity sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg== + dependencies: + 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" + +html-parse-stringify@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz#dfc1017347ce9f77c8141a507f233040c59c55d2" + integrity sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg== + dependencies: + void-elements "3.1.0" + +html-webpack-plugin@^4.5.0: + version "4.5.2" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.5.2.tgz#76fc83fa1a0f12dd5f7da0404a54e2699666bc12" + integrity sha512-q5oYdzjKUIPQVjOosjgvCHQOv9Ett9CYYHlgvJeXG0qQvdSojnBq4vAdQBwn1+yGveAwHCoe/rMR86ozX3+c2A== + dependencies: + "@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.20" + pretty-error "^2.1.1" + tapable "^1.1.3" + util.promisify "1.0.0" + +htmlparser2@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-4.1.0.tgz#9a4ef161f2e4625ebf7dfbe6c0a2f52d18a59e78" + integrity sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q== + dependencies: + domelementtype "^2.0.1" + domhandler "^3.0.0" + domutils "^2.0.0" + entities "^2.0.0" + +htmlparser2@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.0.0" + domutils "^2.5.2" + entities "^2.0.0" + +http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" + integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= + +http-errors@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" + integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.1" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-parser-js@>=0.5.1: + version "0.5.5" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.5.tgz#d7c30d5d3c90d865b4a2e870181f9d6f22ac7ac5" + integrity sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA== + +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + +http-proxy-middleware@0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" + integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q== + dependencies: + http-proxy "^1.17.0" + is-glob "^4.0.0" + lodash "^4.17.11" + micromatch "^3.1.10" + +http-proxy-middleware@^1.0.0, http-proxy-middleware@^1.0.5: + version "1.3.1" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-1.3.1.tgz#43700d6d9eecb7419bf086a128d0f7205d9eb665" + integrity sha512-13eVVDYS4z79w7f1+NPllJtOQFx/FdUW4btIvVRMaRlUY9VGstAbo5MOhLEuUgZFRHn3x50ufn25zkj/boZnEg== + dependencies: + "@types/http-proxy" "^1.17.5" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + +http-proxy-middleware@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.1.tgz#7ef3417a479fb7666a571e09966c66a39bd2c15f" + integrity sha512-cfaXRVoZxSed/BmkA7SwBVNI9Kj7HFltaE5rqYOub5kWzWZ+gofV2koVN1j2rMW7pEfSSlCHGJ31xmuyFyfLOg== + dependencies: + "@types/http-proxy" "^1.17.5" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + +http-proxy@^1.17.0, http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +http-signature@~1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.3.6.tgz#cb6fbfdf86d1c974f343be94e87f7fc128662cf9" + integrity sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw== + dependencies: + assert-plus "^1.0.0" + jsprim "^2.0.2" + sshpk "^1.14.1" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + +https-proxy-agent@5.0.0, https-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + dependencies: + agent-base "6" + debug "4" + +https-proxy-agent@^2.2.1: + version "2.2.4" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b" + integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg== + dependencies: + agent-base "^4.3.0" + debug "^3.1.0" + +https@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https/-/https-1.0.0.tgz#3c37c7ae1a8eeb966904a2ad1e975a194b7ed3a4" + integrity sha1-PDfHrhqO65ZpBKKtHpdaGUt+06Q= + +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + integrity sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0= + dependencies: + ms "^2.0.0" + +hyphenate-style-name@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" + integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== + +i18next@^19.5.0: + version "19.9.2" + resolved "https://registry.yarnpkg.com/i18next/-/i18next-19.9.2.tgz#ea5a124416e3c5ab85fddca2c8e3c3669a8da397" + integrity sha512-0i6cuo6ER6usEOtKajUUDj92zlG+KArFia0857xxiEHAQcUwh/RtOQocui1LPJwunSYT574Pk64aNva1kwtxZg== + dependencies: + "@babel/runtime" "^7.12.0" + +icomcom-react@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/icomcom-react/-/icomcom-react-1.0.1.tgz#6c513655bc576621930e31d19ddb718c3b7439f4" + integrity sha512-Xbz81qZ+er8RYZ6DFMmXxCl9YjxNWngNfPANTSOvzYNrQDieYvBZi+nv1MspI/ze+PAzfHUrmDcUii5RGCUifg== + dependencies: + prop-types "^15.6.0" + +iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +icss-utils@^4.0.0, icss-utils@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" + integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== + dependencies: + postcss "^7.0.14" + +icss-utils@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + +ieee754@^1.1.13, ieee754@^1.1.4: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= + +ignore-by-default@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" + integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk= + +ignore-walk@^3.0.3: + version "3.0.4" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.4.tgz#c9a09f69b7c7b479a5d74ac1a3c0d4236d2a6335" + integrity sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ== + dependencies: + minimatch "^3.0.4" + +ignore@^5.1.4: + version "5.1.9" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.9.tgz#9ec1a5cbe8e1446ec60d4420060d43aa6e7382fb" + integrity sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ== + +image-size@~0.5.0: + version "0.5.5" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" + integrity sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w= + +immediate@~3.0.5: + version "3.0.6" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" + integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps= + +immutability-helper@^3.0.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/immutability-helper/-/immutability-helper-3.1.1.tgz#2b86b2286ed3b1241c9e23b7b21e0444f52f77b7" + integrity sha512-Q0QaXjPjwIju/28TsugCHNEASwoCcJSyJV3uO1sOIQGI0jKgm9f41Lvz0DZj3n46cNCyAZTsEYoY4C2bVRUzyQ== + +immutable@^3: + version "3.8.2" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" + integrity sha1-wkOZUUVbs5kT2vKBN28VMOEErfM= + +import-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" + integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk= + dependencies: + import-from "^2.1.0" + +import-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-3.0.0.tgz#20845547718015126ea9b3676b7592fb8bd4cf92" + integrity sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg== + dependencies: + import-from "^3.0.0" + +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + +import-fresh@^3.1.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-from@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" + integrity sha1-M1238qev/VOqpHHUuAId7ja387E= + dependencies: + resolve-from "^3.0.0" + +import-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/import-from/-/import-from-3.0.0.tgz#055cfec38cd5a27d8057ca51376d7d3bf0891966" + integrity sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ== + dependencies: + resolve-from "^5.0.0" + +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= + +import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + +import-local@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.3.tgz#4d51c2c495ca9393da259ec66b62e022920211e0" + integrity sha512-bE9iaUY3CXH8Cwfan/abDKAxe1KGT9kyGsBPqf6DMK/z0a2OzAsrukeYNgIH6cH5Xr452jb1TUL8rSfCLjZ9uA== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= + +indexof@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= + +infer-owner@^1.0.3, infer-owner@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + +ini@^1.3.4, ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +inquirer@7.3.3: + version "7.3.3" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" + integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.19" + mute-stream "0.0.8" + run-async "^2.4.0" + rxjs "^6.6.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + +internal-ip@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" + integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg== + dependencies: + default-gateway "^4.2.0" + ipaddr.js "^1.9.0" + +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + +interpret@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" + integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== + +intersection-observer@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/intersection-observer/-/intersection-observer-0.10.0.tgz#4d11d63c1ff67e21e62987be24d55218da1a1a69" + integrity sha512-fn4bQ0Xq8FTej09YC/jqKZwtijpvARlRp6wxL5WTA6yPe2YWSJ5RJh7Nm79rK2qB0wr6iDQzH60XGq5V/7u8YQ== + +invariant@^2.2.2, invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= + +ip@^1.1.0, ip@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + +ipaddr.js@1.9.1, ipaddr.js@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +ipaddr.js@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" + integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== + +is-absolute-url@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" + integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= + +is-absolute-url@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" + integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-buffer@^1.1.5, is-buffer@~1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-callable@^1.1.4, is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== + +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + +is-ci@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" + integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== + dependencies: + ci-info "^3.2.0" + +is-color-stop@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" + integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= + dependencies: + css-color-names "^0.0.4" + hex-color-regex "^1.1.0" + hsl-regex "^1.0.0" + hsla-regex "^1.0.0" + rgb-regex "^1.0.1" + rgba-regex "^1.0.0" + +is-core-module@^2.1.0, is-core-module@^2.2.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548" + integrity sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw== + dependencies: + has "^1.0.3" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-in-browser@^1.0.2, is-in-browser@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-in-browser/-/is-in-browser-1.1.3.tgz#56ff4db683a078c6082eb95dad7dc62e1d04f835" + integrity sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU= + +is-installed-globally@^0.4.0, is-installed-globally@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" + integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== + dependencies: + global-dirs "^3.0.0" + is-path-inside "^3.0.2" + +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + +is-lambda@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" + integrity sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU= + +is-negative-zero@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== + +is-npm@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8" + integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== + +is-number-like@^1.0.3: + version "1.0.8" + resolved "https://registry.yarnpkg.com/is-number-like/-/is-number-like-1.0.8.tgz#2e129620b50891042e44e9bbbb30593e75cfbbe3" + integrity sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA== + dependencies: + lodash.isfinite "^3.3.2" + +is-number-object@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" + integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= + +is-path-cwd@^2.0.0, is-path-cwd@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + +is-path-in-cwd@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" + integrity sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ== + dependencies: + is-path-inside "^1.0.0" + +is-path-in-cwd@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" + integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ== + dependencies: + is-path-inside "^2.1.0" + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= + dependencies: + path-is-inside "^1.0.1" + +is-path-inside@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" + integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== + dependencies: + path-is-inside "^1.0.2" + +is-path-inside@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-obj@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + +is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + +is-regex@^1.0.4, is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-resolvable@^1.0.0, is-resolvable@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== + +is-shared-array-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" + integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typedarray@^1.0.0, is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-weakref@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.1.tgz#842dba4ec17fa9ac9850df2d6efbc1737274f2a2" + integrity sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ== + dependencies: + call-bind "^1.0.0" + +is-what@^3.12.0: + version "3.14.1" + resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" + integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA== + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +is-wsl@^2.1.1, is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +is-yarn-global@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" + integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isarray@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e" + integrity sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4= + +isbinaryfile@^4.0.6: + version "4.0.8" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.8.tgz#5d34b94865bd4946633ecc78a026fc76c5b11fcf" + integrity sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isomorphic-unfetch@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz#87341d5f4f7b63843d468438128cb087b7c3e98f" + integrity sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q== + dependencies: + node-fetch "^2.6.1" + unfetch "^4.2.0" + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + +istanbul-lib-coverage@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" + integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA== + +istanbul-lib-coverage@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + +istanbul-lib-instrument@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" + integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== + dependencies: + "@babel/core" "^7.7.5" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.0.0" + semver "^6.3.0" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz#284997c48211752ec486253da97e3879defba8c8" + integrity sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^2.0.5" + make-dir "^2.1.0" + rimraf "^2.6.3" + source-map "^0.6.1" + +istanbul-reports@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.1.tgz#7085857f17d2441053c6ce5c3b8fdf6882289397" + integrity sha512-q1kvhAXWSsXfMjCdNHNPKZZv94OlspKnoGv+R9RGbnqOOQ0VbNfLFgQDVgi7hHenKsndGq3/o0OBdzDXthWcNw== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jasmine-core@^3.6.0: + version "3.10.1" + resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-3.10.1.tgz#7aa6fa2b834a522315c651a128d940eca553989a" + integrity sha512-ooZWSDVAdh79Rrj4/nnfklL3NQVra0BcuhcuWoAwwi+znLDoUeH87AFfeX8s+YeYi6xlv5nveRyaA1v7CintfA== + +jasmine-core@~2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.8.0.tgz#bcc979ae1f9fd05701e45e52e65d3a5d63f1a24e" + integrity sha1-vMl5rh+f0FcB5F5S5l06XWPxok4= + +jasmine-core@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-3.6.0.tgz#491f3bb23941799c353ceb7a45b38a950ebc5a20" + integrity sha512-8uQYa7zJN8hq9z+g8z1bqCfdC8eoDAeVnM5sfqs7KHv9/ifoJ500m018fpFc7RDaO6SWCLCXwo/wPSNcdYTgcw== + +jasmine-marbles@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/jasmine-marbles/-/jasmine-marbles-0.6.0.tgz#f78dc1a3bc452976de10ee8b47c73d616532a954" + integrity sha512-1uzgjEesEeCb+r+v46qn5x326TiGqk5SUZa+A3O+XnMCjG/pGcUOhL9Xsg5L7gLC6RFHyWGTkB5fei4rcvIOiQ== + dependencies: + lodash "^4.5.0" + +jasmine-spec-reporter@~5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/jasmine-spec-reporter/-/jasmine-spec-reporter-5.0.2.tgz#b61288ab074ad440dc2477c4d42840b0e74a6b95" + integrity sha512-6gP1LbVgJ+d7PKksQBc2H0oDGNRQI3gKUsWlswKaQ2fif9X5gzhQcgM5+kiJGCQVurOG09jqNhk7payggyp5+g== + dependencies: + colors "1.4.0" + +jasmine@2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/jasmine/-/jasmine-2.8.0.tgz#6b089c0a11576b1f16df11b80146d91d4e8b8a3e" + integrity sha1-awicChFXax8W3xG4AUbZHU6Lij4= + dependencies: + exit "^0.1.2" + glob "^7.0.6" + jasmine-core "~2.8.0" + +jasminewd2@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/jasminewd2/-/jasminewd2-2.2.0.tgz#e37cf0b17f199cce23bea71b2039395246b4ec4e" + integrity sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4= + +jest-worker@26.3.0: + version "26.3.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.3.0.tgz#7c8a97e4f4364b4f05ed8bca8ca0c24de091871f" + integrity sha512-Vmpn2F6IASefL+DVBhPzI2J9/GJUsqzomdeN+P+dK8/jKxbh8R3BtFnx3FIta7wYlPU62cpJMJQo4kuOowcMnw== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^7.0.0" + +jest-worker@26.6.2, jest-worker@^26.3.0, jest-worker@^26.5.0: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" + integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^7.0.0" + +jest-worker@^25.4.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.5.0.tgz#2611d071b79cea0f43ee57a3d118593ac1547db1" + integrity sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw== + dependencies: + merge-stream "^2.0.0" + supports-color "^7.0.0" + +js-cookie@2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8" + integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + +jsdom@^16.4.0: + version "16.7.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" + integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== + dependencies: + abab "^2.0.5" + acorn "^8.2.4" + acorn-globals "^6.0.0" + cssom "^0.4.4" + cssstyle "^2.3.0" + data-urls "^2.0.0" + decimal.js "^10.2.1" + domexception "^2.0.1" + escodegen "^2.0.0" + form-data "^3.0.0" + html-encoding-sniffer "^2.0.1" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.0" + parse5 "6.0.1" + saxes "^5.0.1" + symbol-tree "^3.2.4" + tough-cookie "^4.0.0" + 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.5.0" + ws "^7.4.6" + xml-name-validator "^3.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= + +json-buffer@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" + integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= + +json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-schema@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + +json3@^3.3.2, json3@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" + integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== + +json5@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +json5@^2.1.0, json5@^2.1.2, json5@^2.1.3: + version "2.2.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== + dependencies: + minimist "^1.2.5" + +jsonc-parser@3.0.0, jsonc-parser@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.0.0.tgz#abdd785701c7e7eaca8a9ec8cf070ca51a745a22" + integrity sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA== + +jsonfile@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" + integrity sha1-pezG9l9T9mLEQVx2daAzHQmS7GY= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonparse@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= + +jsonschema@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.0.tgz#1afa34c4bc22190d8e42271ec17ac8b3404f87b2" + integrity sha512-/YgW6pRMr6M7C+4o8kS+B/2myEpHCrxO4PEWnqJNBFMjn7EWXqlQ4tGwL6xTHeRplwuZmcAncdvfOad1nT2yMw== + +jsprim@^1.2.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" + integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.4.0" + verror "1.10.0" + +jsprim@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-2.0.2.tgz#77ca23dbcd4135cd364800d22ff82c2185803d4d" + integrity sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ== + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.4.0" + verror "1.10.0" + +jss-plugin-camel-case@^10.5.1: + version "10.8.2" + resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.8.2.tgz#8d7f915c8115afaff8cbde08faf610ec9892fba6" + integrity sha512-2INyxR+1UdNuKf4v9It3tNfPvf7IPrtkiwzofeKuMd5D58/dxDJVUQYRVg/n460rTlHUfsEQx43hDrcxi9dSPA== + dependencies: + "@babel/runtime" "^7.3.1" + hyphenate-style-name "^1.0.3" + jss "10.8.2" + +jss-plugin-default-unit@^10.5.1: + version "10.8.2" + resolved "https://registry.yarnpkg.com/jss-plugin-default-unit/-/jss-plugin-default-unit-10.8.2.tgz#c66f12e02e0815d911b85c02c2a979ee7b4ce69a" + integrity sha512-UZ7cwT9NFYSG+SEy7noRU50s4zifulFdjkUNKE+u6mW7vFP960+RglWjTgMfh79G6OENZmaYnjHV/gcKV4nSxg== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.8.2" + +jss-plugin-global@^10.5.1: + version "10.8.2" + resolved "https://registry.yarnpkg.com/jss-plugin-global/-/jss-plugin-global-10.8.2.tgz#1a35632a693cf50113bcc5ffe6b51969df79c4ec" + integrity sha512-UaYMSPsYZ7s/ECGoj4KoHC2jwQd5iQ7K+FFGnCAILdQrv7hPmvM2Ydg45ThT/sH46DqktCRV2SqjRuxeBH8nRA== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.8.2" + +jss-plugin-nested@^10.5.1: + version "10.8.2" + resolved "https://registry.yarnpkg.com/jss-plugin-nested/-/jss-plugin-nested-10.8.2.tgz#79f3c7f75ea6a36ae72fe52e777035bb24d230c7" + integrity sha512-acRvuPJOb930fuYmhkJaa994EADpt8TxI63Iyg96C8FJ9T2xRyU5T6R1IYKRwUiqZo+2Sr7fdGzRTDD4uBZaMA== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.8.2" + tiny-warning "^1.0.2" + +jss-plugin-props-sort@^10.5.1: + version "10.8.2" + resolved "https://registry.yarnpkg.com/jss-plugin-props-sort/-/jss-plugin-props-sort-10.8.2.tgz#e25a7471868652c394562b6dc5433dcaea7dff6f" + integrity sha512-wqdcjayKRWBZnNpLUrXvsWqh+5J5YToAQ+8HNBNw0kZxVvCDwzhK2Nx6AKs7p+5/MbAh2PLgNW5Ym/ysbVAuqQ== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.8.2" + +jss-plugin-rule-value-function@^10.5.1: + version "10.8.2" + resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.8.2.tgz#55354b55f1b2968a15976729968f767f02d64049" + integrity sha512-bW0EKAs+0HXpb6BKJhrn94IDdiWb0CnSluTkh0rGEgyzY/nmD1uV/Wf6KGlesGOZ9gmJzQy+9FFdxIUID1c9Ug== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.8.2" + tiny-warning "^1.0.2" + +jss-plugin-vendor-prefixer@^10.5.1: + version "10.8.2" + resolved "https://registry.yarnpkg.com/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.8.2.tgz#ebb4a482642f34091e454901e21176441dd5f475" + integrity sha512-DeGv18QsSiYLSVIEB2+l0af6OToUe0JB+trpzUxyqD2QRC/5AzzDrCrYffO5AHZ81QbffYvSN/pkfZaTWpRXlg== + dependencies: + "@babel/runtime" "^7.3.1" + css-vendor "^2.0.8" + jss "10.8.2" + +jss-rtl@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/jss-rtl/-/jss-rtl-0.3.0.tgz#386961615956f9655bd5e9ec7e9d08bef223e4af" + integrity sha512-rg9jJmP1bAyhNOAp+BDZgOP/lMm4+oQ76qGueupDQ68Wq+G+6SGvCZvhIEg8OHSONRWOwFT6skCI+APGi8DgmA== + dependencies: + rtl-css-js "^1.13.1" + +jss@10.8.2, jss@^10.3.0, jss@^10.5.1: + version "10.8.2" + resolved "https://registry.yarnpkg.com/jss/-/jss-10.8.2.tgz#4b2a30b094b924629a64928236017a52c7c97505" + integrity sha512-FkoUNxI329CKQ9OQC8L72MBF9KPf5q8mIupAJ5twU7G7XREW7ahb+7jFfrjZ4iy1qvhx1HwIWUIvkZBDnKkEdQ== + dependencies: + "@babel/runtime" "^7.3.1" + csstype "^3.0.2" + is-in-browser "^1.1.3" + tiny-warning "^1.0.2" + +jszip@^3.1.3: + version "3.7.1" + resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.7.1.tgz#bd63401221c15625a1228c556ca8a68da6fda3d9" + integrity sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg== + dependencies: + lie "~3.3.0" + pako "~1.0.2" + readable-stream "~2.3.6" + set-immediate-shim "~1.0.1" + +jwt-decode@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/jwt-decode/-/jwt-decode-3.1.2.tgz#3fb319f3675a2df0c2895c8f5e9fa4b67b04ed59" + integrity sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A== + +karma-chrome-launcher@~3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz#805a586799a4d05f4e54f72a204979f3f3066738" + integrity sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg== + dependencies: + which "^1.2.1" + +karma-coverage-istanbul-reporter@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-3.0.3.tgz#f3b5303553aadc8e681d40d360dfdc19bc7e9fe9" + integrity sha512-wE4VFhG/QZv2Y4CdAYWDbMmcAHeS926ZIji4z+FkB2aF/EposRb6DP6G5ncT/wXhqUfAb/d7kZrNKPonbvsATw== + dependencies: + istanbul-lib-coverage "^3.0.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^3.0.6" + istanbul-reports "^3.0.2" + minimatch "^3.0.4" + +karma-jasmine-html-reporter@^1.5.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.7.0.tgz#52c489a74d760934a1089bfa5ea4a8fcb84cc28b" + integrity sha512-pzum1TL7j90DTE86eFt48/s12hqwQuiD+e5aXx2Dc9wDEn2LfGq6RoAxEZZjFiN0RDSCOnosEKRZWxbQ+iMpQQ== + +karma-jasmine@~4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/karma-jasmine/-/karma-jasmine-4.0.1.tgz#b99e073b6d99a5196fc4bffc121b89313b0abd82" + integrity sha512-h8XDAhTiZjJKzfkoO1laMH+zfNlra+dEQHUAjpn5JV1zCPtOIVWGQjLBrqhnzQa/hrU2XrZwSyBa6XjEBzfXzw== + dependencies: + jasmine-core "^3.6.0" + +karma-mocha-reporter@2.2.5: + version "2.2.5" + resolved "https://registry.yarnpkg.com/karma-mocha-reporter/-/karma-mocha-reporter-2.2.5.tgz#15120095e8ed819186e47a0b012f3cd741895560" + integrity sha1-FRIAlejtgZGG5HoLAS8810GJVWA= + dependencies: + chalk "^2.1.0" + log-symbols "^2.1.0" + strip-ansi "^4.0.0" + +karma-source-map-support@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz#58526ceccf7e8730e56effd97a4de8d712ac0d6b" + integrity sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A== + dependencies: + source-map-support "^0.5.5" + +karma@^5.2.3: + version "5.2.3" + resolved "https://registry.yarnpkg.com/karma/-/karma-5.2.3.tgz#3264024219bad2728e92542e0058a2492d7a46e4" + integrity sha512-tHdyFADhVVPBorIKCX8A37iLHxc6RBRphkSoQ+MLKdAtFn1k97tD8WUGi1KlEtDZKL3hui0qhsY9HXUfSNDYPQ== + dependencies: + body-parser "^1.19.0" + braces "^3.0.2" + chokidar "^3.4.2" + colors "^1.4.0" + connect "^3.7.0" + di "^0.0.1" + dom-serialize "^2.2.1" + glob "^7.1.6" + graceful-fs "^4.2.4" + http-proxy "^1.18.1" + isbinaryfile "^4.0.6" + lodash "^4.17.19" + log4js "^6.2.1" + mime "^2.4.5" + minimatch "^3.0.4" + qjobs "^1.2.0" + range-parser "^1.2.1" + rimraf "^3.0.2" + socket.io "^2.3.0" + source-map "^0.6.1" + tmp "0.2.1" + ua-parser-js "0.7.22" + yargs "^15.3.1" + +keyv@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" + integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== + dependencies: + json-buffer "3.0.0" + +killable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" + integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +klaro@^0.7.10: + version "0.7.18" + resolved "https://registry.yarnpkg.com/klaro/-/klaro-0.7.18.tgz#fef3a05fcd656451b941e11459f37d6c336e84c0" + integrity sha512-Q5nehkGeZuFerisW4oeeB1ax6dHDszWckR70EcxKvhFiJQ61CM0WBSo20yLbdvz8N9MFsOFu4RNCO9JsbkCxgQ== + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +klona@^2.0.3, klona@^2.0.4: + version "2.0.5" + resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" + integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== + +last-call-webpack-plugin@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555" + integrity sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w== + dependencies: + lodash "^4.17.5" + webpack-sources "^1.1.0" + +latest-version@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" + integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== + dependencies: + package-json "^6.3.0" + +lazy-ass@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513" + integrity sha1-eZllXoZGwX8In90YfRUNMyTVRRM= + +less-loader@6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-6.2.0.tgz#8b26f621c155b342eefc24f5bd6e9dc40c42a719" + integrity sha512-Cl5h95/Pz/PWub/tCBgT1oNMFeH1WTD33piG80jn5jr12T4XbxZcjThwNXDQ7AG649WEynuIzO4b0+2Tn9Qolg== + dependencies: + clone "^2.1.2" + less "^3.11.3" + loader-utils "^2.0.0" + schema-utils "^2.7.0" + +less-loader@7.3.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-7.3.0.tgz#f9d6d36d18739d642067a05fb5bd70c8c61317e5" + integrity sha512-Mi8915g7NMaLlgi77mgTTQvK022xKRQBIVDSyfl3ErTuBhmZBQab0mjeJjNNqGbdR+qrfTleKXqbGI4uEFavxg== + dependencies: + klona "^2.0.4" + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +less@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/less/-/less-4.1.1.tgz#15bf253a9939791dc690888c3ff424f3e6c7edba" + integrity sha512-w09o8tZFPThBscl5d0Ggp3RcrKIouBoQscnOMgFH3n5V3kN/CXGHNfCkRPtxJk6nKryDXaV9aHLK55RXuH4sAw== + dependencies: + copy-anything "^2.0.1" + parse-node-version "^1.0.1" + tslib "^1.10.0" + optionalDependencies: + errno "^0.1.1" + graceful-fs "^4.1.2" + image-size "~0.5.0" + make-dir "^2.1.0" + mime "^1.4.1" + needle "^2.5.2" + source-map "~0.6.0" + +less@^3.11.3: + version "3.13.1" + resolved "https://registry.yarnpkg.com/less/-/less-3.13.1.tgz#0ebc91d2a0e9c0c6735b83d496b0ab0583077909" + integrity sha512-SwA1aQXGUvp+P5XdZslUOhhLnClSLIjWvJhmd+Vgib5BFIr9lMNlQwmwUNOjXThF/A0x+MCYYPeWEfeWiLRnTw== + dependencies: + copy-anything "^2.0.1" + tslib "^1.10.0" + optionalDependencies: + errno "^0.1.1" + graceful-fs "^4.1.2" + image-size "~0.5.0" + make-dir "^2.1.0" + mime "^1.4.1" + native-request "^1.0.5" + source-map "~0.6.0" + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levenary@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/levenary/-/levenary-1.1.1.tgz#842a9ee98d2075aa7faeedbe32679e9205f46f77" + integrity sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ== + dependencies: + leven "^3.1.0" + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +license-webpack-plugin@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/license-webpack-plugin/-/license-webpack-plugin-2.3.0.tgz#c00f70d5725ba0408de208acb9e66612cc2eceda" + integrity sha512-JK/DXrtN6UeYQSgkg5q1+pgJ8aiKPL9tnz9Wzw+Ikkf+8mJxG56x6t8O+OH/tAeF/5NREnelTEMyFtbJNkjH4w== + dependencies: + "@types/webpack-sources" "^0.1.5" + webpack-sources "^1.2.0" + +license-webpack-plugin@2.3.11: + version "2.3.11" + resolved "https://registry.yarnpkg.com/license-webpack-plugin/-/license-webpack-plugin-2.3.11.tgz#0d93188a31fce350a44c86212badbaf33dcd29d8" + integrity sha512-0iVGoX5vx0WDy8dmwTTpOOMYiGqILyUbDeVMFH52AjgBlS58lHwOlFMSoqg5nY8Kxl6+FRKyUZY/UdlQaOyqDw== + dependencies: + "@types/webpack-sources" "^0.1.5" + webpack-sources "^1.2.0" + +lie@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" + integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== + dependencies: + immediate "~3.0.5" + +lilconfig@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.4.tgz#f4507d043d7058b380b6a8f5cb7bcd4b34cee082" + integrity sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA== + +limiter@^1.0.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/limiter/-/limiter-1.1.5.tgz#8f92a25b3b16c6131293a0cc834b4a838a2aa7c2" + integrity sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +listr2@^3.8.3: + version "3.13.5" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.13.5.tgz#105a813f2eb2329c4aae27373a281d610ee4985f" + integrity sha512-3n8heFQDSk+NcwBn3CgxEibZGaRzx+pC64n3YjpMD1qguV4nWus3Al+Oo3KooqFKTQEJ1v7MmnbnyyNspgx3NA== + dependencies: + cli-truncate "^2.1.0" + colorette "^2.0.16" + log-update "^4.0.0" + p-map "^4.0.0" + rfdc "^1.3.0" + rxjs "^7.4.0" + through "^2.3.8" + wrap-ansi "^7.0.0" + +loader-runner@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== + +loader-utils@1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== + dependencies: + big.js "^5.2.2" + emojis-list "^2.0.0" + json5 "^1.0.1" + +loader-utils@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" + integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +loader-utils@^0.2.12: + version "0.2.17" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" + integrity sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g= + dependencies: + big.js "^3.1.3" + emojis-list "^2.0.0" + json5 "^0.5.0" + object-assign "^4.0.1" + +loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +loader-utils@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.2.tgz#d6e3b4fb81870721ae4e0868ab11dd638368c129" + integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +localtunnel@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/localtunnel/-/localtunnel-2.0.2.tgz#528d50087151c4790f89c2db374fe7b0a48501f0" + integrity sha512-n418Cn5ynvJd7m/N1d9WVJISLJF/ellZnfsLnx8WBWGzxv/ntNcFkJ1o6se5quUhCplfLGBNL5tYHiq5WF3Nug== + dependencies: + axios "0.21.4" + debug "4.3.2" + openurl "1.1.1" + yargs "17.1.1" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= + +lodash.difference@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c" + integrity sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw= + +lodash.forown@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.forown/-/lodash.forown-4.4.0.tgz#85115cf04f73ef966eced52511d3893cc46683af" + integrity sha1-hRFc8E9z75ZuztUlEdOJPMRmg68= + +lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= + +lodash.groupby@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.groupby/-/lodash.groupby-4.6.0.tgz#0b08a1dcf68397c397855c3239783832df7403d1" + integrity sha1-Cwih3PaDl8OXhVwyOXg4Mt90A9E= + +lodash.isfinite@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz#fb89b65a9a80281833f0b7478b3a5104f898ebb3" + integrity sha1-+4m2WpqAKBgz8LdHizpRBPiY67M= + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + +lodash.once@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + +lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.5, lodash@^4.5.0, lodash@^4.7.0: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== + dependencies: + chalk "^2.0.1" + +log-symbols@^4.0.0, log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +log-update@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" + integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== + dependencies: + ansi-escapes "^4.3.0" + cli-cursor "^3.1.0" + slice-ansi "^4.0.0" + wrap-ansi "^6.2.0" + +log4js@^6.2.1: + version "6.3.0" + resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.3.0.tgz#10dfafbb434351a3e30277a00b9879446f715bcb" + integrity sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw== + dependencies: + date-format "^3.0.0" + debug "^4.1.1" + flatted "^2.0.1" + rfdc "^1.1.4" + streamroller "^2.2.4" + +loglevel@^1.6.8: + version "1.8.0" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.0.tgz#e7ec73a57e1e7b419cb6c6ac06bf050b67356114" + integrity sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA== + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +magic-string@0.25.7, magic-string@^0.25.0: + version "0.25.7" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" + integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== + dependencies: + sourcemap-codec "^1.4.4" + +make-dir@^2.0.0, make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +make-fetch-happen@^8.0.9: + version "8.0.14" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-8.0.14.tgz#aaba73ae0ab5586ad8eaa68bd83332669393e222" + integrity sha512-EsS89h6l4vbfJEtBZnENTOFk8mCRpY5ru36Xe5bcX1KYIli2mkSHqoFsp5O1wMDvTJJzxe/4THpCTtygjeeGWQ== + dependencies: + agentkeepalive "^4.1.3" + cacache "^15.0.5" + http-cache-semantics "^4.1.0" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^6.0.0" + minipass "^3.1.3" + minipass-collect "^1.0.2" + minipass-fetch "^1.3.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + promise-retry "^2.0.1" + socks-proxy-agent "^5.0.0" + ssri "^8.0.0" + +manifesto.js@^4.2.0: + version "4.2.4" + resolved "https://registry.yarnpkg.com/manifesto.js/-/manifesto.js-4.2.4.tgz#996cb3bd638883ea8f447ad00b958f23aeb0a184" + integrity sha512-Kfa3RSFnWeLTmzpkRQu/WM1275cx859rzwQO0wiRVo3Kl3yjbyV7QPzZkLCqgaL76gOarfYe28t1EDytgGpL9A== + dependencies: + "@edsilv/http-status-codes" "^1.0.3" + "@iiif/vocabulary" "^1.0.20" + isomorphic-unfetch "^3.0.0" + lodash "^4.17.21" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +md5@^2.2.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" + integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g== + dependencies: + charenc "0.0.2" + crypt "0.0.2" + is-buffer "~1.1.6" + +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + +mdn-data@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" + integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + +memfs@^3.1.2, memfs@^3.2.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.0.tgz#8bc12062b973be6b295d4340595736a656f0a257" + integrity sha512-o/RfP0J1d03YwsAxyHxAYs2kyJp55AFkMazlFAZFR2I2IXkxiUTXRabJ6RmNNCQ83LAD2jy52Khj0m3OffpNdA== + dependencies: + fs-monkey "1.0.3" + +"memoize-one@>=3.1.1 <6", memoize-one@^5.1.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" + integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== + +memory-fs@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +memory-fs@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + +merge-source-map@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" + integrity sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw== + dependencies: + source-map "^0.6.1" + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +merge@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" + integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + +micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + 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" + +micromatch@^4.0.2, micromatch@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + dependencies: + braces "^3.0.1" + picomatch "^2.2.3" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.51.0, "mime-db@>= 1.43.0 < 2": + version "1.51.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" + integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== + +mime-types@^2.1.12, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: + version "2.1.34" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" + integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== + dependencies: + mime-db "1.51.0" + +mime@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== + +mime@1.6.0, mime@^1.4.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.4.4, mime@^2.4.5: + version "2.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-response@^1.0.0, mimic-response@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +mini-css-extract-plugin@0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.10.0.tgz#a0e6bfcad22a9c73f6c882a3c7557a98e2d3d27d" + integrity sha512-QgKgJBjaJhxVPwrLNqqwNS0AGkuQQ31Hp4xGXEK/P7wehEg6qmNtReHKai3zRXqY60wGVWLYcOMJK2b98aGc3A== + dependencies: + loader-utils "^1.1.0" + normalize-url "1.9.1" + schema-utils "^1.0.0" + webpack-sources "^1.1.0" + +mini-css-extract-plugin@1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-1.3.5.tgz#252166e78879c106e0130f229d44e0cbdfcebed3" + integrity sha512-tvmzcwqJJXau4OQE5vT72pRT18o2zF+tQJp8CWchqvfQnTlflkzS+dANYcRdyPRWUWRkfmeNTKltx0NZI/b5dQ== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + webpack-sources "^1.1.0" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-fetch@^1.3.0, minipass-fetch@^1.3.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-1.4.1.tgz#d75e0091daac1b0ffd7e9d41629faff7d0c1f1b6" + integrity sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw== + dependencies: + minipass "^3.1.0" + minipass-sized "^1.0.3" + minizlib "^2.0.0" + optionalDependencies: + encoding "^0.1.12" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-json-stream@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz#7edbb92588fbfc2ff1db2fc10397acb7b6b44aa7" + integrity sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg== + dependencies: + jsonparse "^1.3.1" + minipass "^3.0.0" + +minipass-pipeline@^1.2.2, minipass-pipeline@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + +minipass-sized@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" + integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== + dependencies: + minipass "^3.0.0" + +minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3: + version "3.1.5" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.5.tgz#71f6251b0a33a49c01b3cf97ff77eda030dff732" + integrity sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw== + dependencies: + yallist "^4.0.0" + +minizlib@^2.0.0, minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mirador-dl-plugin@^0.13.0: + version "0.13.0" + resolved "https://registry.yarnpkg.com/mirador-dl-plugin/-/mirador-dl-plugin-0.13.0.tgz#9a6cb0fa3c566a2a1ebe1ad9caa1ff590ff22689" + integrity sha512-I/6etIvpTtO1zgjxx2uEUFoyB9NxQ43JWg8CMkKmZqblW7AAeFqRn1/zUlQH7N8KFZft9Rah6D8qxtuNAo9jmA== + +mirador-share-plugin@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/mirador-share-plugin/-/mirador-share-plugin-0.11.0.tgz#13e2f654e38839044382acad42d9329e91a8cd5e" + integrity sha512-fHcdDXyrtfy5pn1zdQNX9BvE5Tjup66eQwyNippE5PMaP8ImUcrFaSL+mStdn+v6agsHcsdRqLhseZ0XWgEuAw== + +mirador@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/mirador/-/mirador-3.3.0.tgz#7a957a1db1a5388b2b8cafab00db4eb9f97557b9" + integrity sha512-BmGfRnWJ45B+vtiAwcFT7n9nKialfejE9UvuUK0NorO37ShArpsKr3yVSD4jQASwSR4DRRpPEG21jOk4WN7H3w== + dependencies: + "@material-ui/core" "^4.11.0" + "@material-ui/icons" "^4.9.1" + "@material-ui/lab" "^4.0.0-alpha.53" + "@researchgate/react-intersection-observer" "^1.0.0" + classnames "^2.2.6" + clsx "^1.0.4" + deepmerge "^4.2.2" + dompurify "^2.0.11" + i18next "^19.5.0" + icomcom-react "^1.0.1" + intersection-observer "^0.10.0" + isomorphic-unfetch "^3.0.0" + jss "^10.3.0" + jss-rtl "^0.3.0" + lodash "^4.17.11" + manifesto.js "^4.2.0" + normalize-url "^4.5.0" + openseadragon "^2.4.2" + prop-types "^15.6.2" + re-reselect "^4.0.0" + react-aria-live "^2.0.5" + react-beautiful-dnd "^13.0.0" + react-copy-to-clipboard "^5.0.1" + react-dnd "^10.0.2" + react-dnd-html5-backend "^10.0.2" + react-dnd-multi-backend "^5.0.0" + react-dnd-touch-backend "^10.0.2" + react-full-screen "^0.2.4" + react-i18next "^11.7.0" + react-image "^4.0.1" + react-mosaic-component "^4.0.1" + react-redux "^7.1.0" + react-resize-observer "^1.1.1" + react-rnd "^10.1" + react-sizeme "^2.6.7" + react-virtualized-auto-sizer "^1.0.2" + react-window "^1.8.5" + redux "^4.0.5" + redux-devtools-extension "^2.13.2" + redux-saga "^1.1.3" + redux-thunk "^2.3.0" + reselect "^4.0.0" + uuid "^8.1.0" + +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + dependencies: + 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@^1.1.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mitt/-/mitt-1.2.0.tgz#cb24e6569c806e31bd4e3995787fe38a04fdf90d" + integrity sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw== + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +mkdirp@^1.0.3, mkdirp@^1.0.4, mkdirp@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +moment@^2.29.1: + version "2.29.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" + integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== + +morgan@^1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.10.0.tgz#091778abc1fc47cd3509824653dae1faab6b17d7" + integrity sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ== + dependencies: + basic-auth "~2.0.1" + debug "2.6.9" + depd "~2.0.0" + on-finished "~2.3.0" + on-headers "~1.0.2" + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= + dependencies: + 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" + +mrmime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.0.tgz#14d387f0585a5233d291baba339b063752a2398b" + integrity sha512-a70zx7zFfVO7XpnQ2IX1Myh9yY4UYvfld/dikWRnsXxbyvMcfz+u6UfgNAtH+k2QqtJuzVpv6eLTx1G2+WKZbQ== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.0.0, ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multicast-dns-service-types@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= + +multicast-dns@^6.0.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" + integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== + dependencies: + dns-packet "^1.3.1" + thunky "^1.0.2" + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +nan@^2.12.1: + version "2.15.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" + integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== + +nanoid@^3.1.23, nanoid@^3.1.30: + version "3.1.30" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.30.tgz#63f93cc548d2a113dc5dfbc63bfa09e2b9b64362" + integrity sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + 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" + +native-request@^1.0.5: + version "1.1.0" + resolved "https://registry.yarnpkg.com/native-request/-/native-request-1.1.0.tgz#acdb30fe2eefa3e1bc8c54b3a6852e9c5c0d3cb0" + integrity sha512-uZ5rQaeRn15XmpgE0xoPL8YWqcX90VtCFglYwAgkvKM5e8fog+vePLAhHxuuv/gRkrQxIeh5U3q9sMNUrENqWw== + +needle@^2.5.2: + version "2.9.1" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.9.1.tgz#22d1dffbe3490c2b83e301f7709b6736cd8f2684" + integrity sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ== + dependencies: + debug "^3.2.6" + iconv-lite "^0.4.4" + sax "^1.2.4" + +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + +neo-async@^2.5.0, neo-async@^2.6.1, neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +next-tick@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= + +ng-mocks@11.11.2: + version "11.11.2" + resolved "https://registry.yarnpkg.com/ng-mocks/-/ng-mocks-11.11.2.tgz#5deaae4364da233a32035652f1302d4e7ba60884" + integrity sha512-TRcHriSjHgkKnpbK1TMpIv6qhRmif/BCRGLgZrwi8Y/7/eZrIeDQ4bqW+i9cotKxyv0bAnMuaM09t/Q5rzaKTg== + +ng2-file-upload@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ng2-file-upload/-/ng2-file-upload-1.4.0.tgz#8dea28d573234c52af474ad2a4001b335271e5c4" + integrity sha512-3J/KPU/tyh/ad6TFeUbrxX+SihUj0iOEt2Zsg4EX7mB3GFiQscXOfcUOxCkBtPWWWaqt3azrYbVGzsYa3/7NzQ== + dependencies: + tslib "^1.9.0" + +ng2-nouislider@^1.8.3: + version "1.8.3" + resolved "https://registry.yarnpkg.com/ng2-nouislider/-/ng2-nouislider-1.8.3.tgz#c9c1ec77b6b5a909f87368ba799914208baa13a6" + integrity sha512-Vl8tHCcJ/ioJLAs2t6FBC35sZq1P/O5ZdqdFwYxOCOMVbILGWNg+2gWZIjFstvv9pqb/mVvVUYe6qGG/mA/RBQ== + +ngx-infinite-scroll@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/ngx-infinite-scroll/-/ngx-infinite-scroll-10.0.1.tgz#6f51f2f8775a7c50d1dd8bad125d4e748abbe880" + integrity sha512-7is0eJZ9kJPsaHohRmMhJ/QFHAW9jp9twO5HcHRvFM/Yl/R8QCiokgjwmH0/CR3MuxUanxfHZMfO3PbYTwlBEg== + dependencies: + "@scarf/scarf" "^1.1.0" + opencollective-postinstall "^2.0.2" + +ngx-moment@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ngx-moment/-/ngx-moment-5.0.0.tgz#6500432a2fcda75fb236a632850e599db23c8177" + integrity sha512-LPpGPo4ccdh8RWnDbJdLTLGGGcwbRYMbn/j4PXM24754J7MZ0tgnBM+ncaVbwefUSSEMme8yMkNIxFiVxgOOvQ== + dependencies: + tslib "^2.0.0" + +ngx-pagination@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/ngx-pagination/-/ngx-pagination-5.0.0.tgz#a4b4c150a70aef17ccd825e4543e174a974bbd14" + integrity sha512-Ur0pTWRe2ZXoJ8impEzo0IZKxY5aEcQfSmL5uBqW1rHI2J6nfzgZAHsSLagKHFGchXq0PkRlDVVMcIaNxYJwvQ== + +ngx-sortablejs@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/ngx-sortablejs/-/ngx-sortablejs-11.1.0.tgz#14e50c48db908c1cb4b37722b28c2d3867c6140a" + integrity sha512-eM4dHwWSmXDcvF5gUmyMMQ0qqcqBXWCSZ9IRpqx4UkBKfo4N7pk/QuYh5io2fXVHWVFDaxW1yhn2FNpqxV6Jqw== + dependencies: + tslib "^2.0.0" + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +node-fetch@^2.6.1: + version "2.6.6" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.6.tgz#1751a7c01834e8e1697758732e9efb6eeadfaf89" + integrity sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA== + dependencies: + whatwg-url "^5.0.0" + +node-forge@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" + integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== + +node-gyp@^7.1.0: + version "7.1.2" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-7.1.2.tgz#21a810aebb187120251c3bcec979af1587b188ae" + integrity sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ== + dependencies: + env-paths "^2.2.0" + glob "^7.1.4" + graceful-fs "^4.2.3" + nopt "^5.0.0" + npmlog "^4.1.2" + request "^2.88.2" + rimraf "^3.0.2" + semver "^7.3.2" + tar "^6.0.2" + which "^2.0.2" + +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== + dependencies: + 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" + +node-releases@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" + integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== + +nodemon@^2.0.15: + version "2.0.15" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.15.tgz#504516ce3b43d9dc9a955ccd9ec57550a31a8d4e" + integrity sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA== + dependencies: + chokidar "^3.5.2" + debug "^3.2.7" + ignore-by-default "^1.0.1" + minimatch "^3.0.4" + pstree.remy "^1.1.8" + semver "^5.7.1" + supports-color "^5.5.0" + touch "^3.1.0" + undefsafe "^2.0.5" + update-notifier "^5.1.0" + +nopt@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" + integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== + dependencies: + abbrev "1" + +nopt@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" + integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4= + dependencies: + abbrev "1" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + +normalize-url@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" + integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= + dependencies: + object-assign "^4.0.1" + prepend-http "^1.0.0" + query-string "^4.1.0" + sort-keys "^1.0.0" + +normalize-url@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" + integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== + +normalize-url@^4.1.0, normalize-url@^4.5.0: + version "4.5.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" + integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== + +normalize-url@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== + +nouislider@^14.6.3: + version "14.7.0" + resolved "https://registry.yarnpkg.com/nouislider/-/nouislider-14.7.0.tgz#a71db0587c92567b6da1df57d251d3696d942362" + integrity sha512-4RtQ1+LHJKesDCNJrXkQcwXAWCrC2aggdLYMstS/G5fEWL+fXZbUA9pwVNHFghMGuFGRATlDLNInRaPeRKzpFQ== + +npm-bundled@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.2.tgz#944c78789bd739035b70baa2ca5cc32b8d860bc1" + integrity sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ== + dependencies: + npm-normalize-package-bin "^1.0.1" + +npm-install-checks@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-4.0.0.tgz#a37facc763a2fde0497ef2c6d0ac7c3fbe00d7b4" + integrity sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w== + dependencies: + semver "^7.1.1" + +npm-normalize-package-bin@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" + integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== + +npm-package-arg@8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-8.1.0.tgz#b5f6319418c3246a1c38e1a8fbaa06231bc5308f" + integrity sha512-/ep6QDxBkm9HvOhOg0heitSd7JHA1U7y1qhhlRlteYYAi9Pdb/ZV7FW5aHpkrpM8+P+4p/jjR8zCyKPBMBjSig== + dependencies: + hosted-git-info "^3.0.6" + semver "^7.0.0" + validate-npm-package-name "^3.0.0" + +npm-package-arg@^8.0.0, npm-package-arg@^8.0.1, npm-package-arg@^8.1.2: + version "8.1.5" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-8.1.5.tgz#3369b2d5fe8fdc674baa7f1786514ddc15466e44" + integrity sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q== + dependencies: + hosted-git-info "^4.0.1" + semver "^7.3.4" + validate-npm-package-name "^3.0.0" + +npm-packlist@^2.1.4: + version "2.2.2" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-2.2.2.tgz#076b97293fa620f632833186a7a8f65aaa6148c8" + integrity sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg== + dependencies: + glob "^7.1.6" + ignore-walk "^3.0.3" + npm-bundled "^1.1.1" + npm-normalize-package-bin "^1.0.1" + +npm-pick-manifest@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-6.1.0.tgz#2befed87b0fce956790f62d32afb56d7539c022a" + integrity sha512-ygs4k6f54ZxJXrzT0x34NybRlLeZ4+6nECAIbr2i0foTnijtS1TJiyzpqtuUAJOps/hO0tNDr8fRV5g+BtRlTw== + dependencies: + npm-install-checks "^4.0.0" + npm-package-arg "^8.0.0" + semver "^7.0.0" + +npm-pick-manifest@^6.0.0, npm-pick-manifest@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz#7b5484ca2c908565f43b7f27644f36bb816f5148" + integrity sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA== + dependencies: + npm-install-checks "^4.0.0" + npm-normalize-package-bin "^1.0.1" + npm-package-arg "^8.1.2" + semver "^7.3.4" + +npm-registry-fetch@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-9.0.0.tgz#86f3feb4ce00313bc0b8f1f8f69daae6face1661" + integrity sha512-PuFYYtnQ8IyVl6ib9d3PepeehcUeHN9IO5N/iCRhyg9tStQcqGQBRVHmfmMWPDERU3KwZoHFvbJ4FPXPspvzbA== + dependencies: + "@npmcli/ci-detect" "^1.0.0" + lru-cache "^6.0.0" + make-fetch-happen "^8.0.9" + minipass "^3.1.3" + minipass-fetch "^1.3.0" + minipass-json-stream "^1.0.1" + minizlib "^2.0.0" + npm-package-arg "^8.0.0" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +npm-run-path@^4.0.0, npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +npmlog@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +nth-check@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + +nth-check@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2" + integrity sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w== + dependencies: + boolbase "^1.0.0" + +num2fraction@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +nwsapi@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" + integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-inspect@^1.11.0, object-inspect@^1.9.0: + version "1.11.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.1.tgz#d4bd7d7de54b9a75599f59a00bd698c1f1c6549b" + integrity sha512-If7BjFlpkzzBeV1cqgT3OSWT3azyoxDGajR+iGnFBfVV2EWyDyWaZZW2ERDjUaY2QM8i5jI3Sj7mhsM4DDAqWA== + +object-is@^1.0.1: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object-path@^0.11.5: + version "0.11.8" + resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.8.tgz#ed002c02bbdd0070b78a27455e8ae01fc14d4742" + integrity sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA== + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.assign@^4.1.0, object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0: + version "2.1.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz#b223cf38e17fefb97a63c10c91df72ccb386df9e" + integrity sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +object.values@^1.1.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" + integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +onetime@^5.1.0, onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/open/-/open-7.2.0.tgz#212959bd7b0ce2e8e3676adc76e3cf2f0a2498b4" + integrity sha512-4HeyhxCvBTI5uBePsAdi55C5fmqnWZ2e2MlmvWi5KW5tdH5rxoiv/aMtbeVxKZc3eWkT1GymMnLG8XC4Rq4TDQ== + dependencies: + is-docker "^2.0.0" + is-wsl "^2.1.1" + +open@7.4.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/open/-/open-7.4.0.tgz#ad95b98f871d9acb0ec8fecc557082cc9986626b" + integrity sha512-PGoBCX/lclIWlpS/R2PQuIR4NJoXh6X5AwVzE7WXnWRGvHg7+4TBCgsujUgiPpm0K1y4qvQeWnCWVTpTKZBtvA== + dependencies: + is-docker "^2.0.0" + is-wsl "^2.1.1" + +open@^8.0.9: + version "8.4.0" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" + integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +opencollective-postinstall@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259" + integrity sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q== + +opener@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== + +openseadragon@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/openseadragon/-/openseadragon-2.4.2.tgz#f25d833d0ab9941599d65a3e2b44bec546c9f15c" + integrity sha512-398KbZwRtOYA6OmeWRY4Q0737NTacQ9Q6whmr9Lp1MNQO3p0eBz5LIASRne+4gwequcSM1vcHcjfy3dIndQziw== + +openurl@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/openurl/-/openurl-1.1.1.tgz#3875b4b0ef7a52c156f0db41d4609dbb0f94b387" + integrity sha1-OHW0sO96UsFW8NtB1GCduw+Us4c= + +opn@5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.3.0.tgz#64871565c863875f052cfdf53d3e3cb5adb53b1c" + integrity sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g== + dependencies: + is-wsl "^1.1.0" + +opn@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" + integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== + dependencies: + is-wsl "^1.1.0" + +optimize-css-assets-webpack-plugin@^5.0.4: + version "5.0.8" + resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.8.tgz#cbccdcf5a6ef61d4f8cc78cf083a67446e5f402a" + integrity sha512-mgFS1JdOtEGzD8l+EuISqL57cKO+We9GcoiQEmdCWRqqck+FGNmYJtx9qfAPzEz+lRrlThWMuGDaRkI/yWNx/Q== + dependencies: + cssnano "^4.1.10" + last-call-webpack-plugin "^3.0.0" + +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + 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@5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.3.0.tgz#fb832899d3a1372fe71c8b2c534bbfe74961bb6f" + integrity sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g== + dependencies: + bl "^4.0.3" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + log-symbols "^4.0.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +ora@5.4.1, ora@^5.1.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +original@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" + integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg== + dependencies: + url-parse "^1.4.3" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + +os-tmpdir@^1.0.1, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +ospath@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/ospath/-/ospath-1.2.2.tgz#1276639774a3f8ef2572f7fe4280e0ea4550c07b" + integrity sha1-EnZjl3Sj+O8lcvf+QoDg6kVQwHs= + +p-cancelable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" + integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.1, p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + +p-map@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" + integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== + dependencies: + aggregate-error "^3.0.0" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-retry@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" + integrity sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w== + dependencies: + retry "^0.12.0" + +p-retry@^4.5.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.1.tgz#8fcddd5cdf7a67a0911a9cf2ef0e5df7f602316c" + integrity sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA== + dependencies: + "@types/retry" "^0.12.0" + retry "^0.13.1" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +package-json@^6.3.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" + integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== + dependencies: + got "^9.6.0" + registry-auth-token "^4.0.0" + registry-url "^5.0.0" + semver "^6.2.0" + +pacote@11.2.4: + version "11.2.4" + resolved "https://registry.yarnpkg.com/pacote/-/pacote-11.2.4.tgz#dc7ca740a573ed86a3bf863511d22c1d413ec82f" + integrity sha512-GfTeVQGJ6WyBQbQD4t3ocHbyOmTQLmWjkCKSZPmKiGFKYKNUaM5U2gbLzUW8WG1XmS9yQFnsTFA0k3o1+q4klQ== + dependencies: + "@npmcli/git" "^2.0.1" + "@npmcli/installed-package-contents" "^1.0.5" + "@npmcli/promise-spawn" "^1.2.0" + "@npmcli/run-script" "^1.3.0" + cacache "^15.0.5" + chownr "^2.0.0" + fs-minipass "^2.1.0" + infer-owner "^1.0.4" + minipass "^3.1.3" + mkdirp "^1.0.3" + npm-package-arg "^8.0.1" + npm-packlist "^2.1.4" + npm-pick-manifest "^6.0.0" + npm-registry-fetch "^9.0.0" + promise-retry "^1.1.1" + read-package-json-fast "^1.1.3" + rimraf "^3.0.2" + ssri "^8.0.0" + tar "^6.1.0" + +pako@~1.0.2, pako@~1.0.5: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +parallel-transform@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" + integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== + dependencies: + cyclist "^1.0.1" + inherits "^2.0.3" + readable-stream "^2.1.5" + +param-case@^3.0.3: + version "3.0.4" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" + integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-asn1@^5.0.0, parse-asn1@^5.1.5: + version "5.1.6" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" + integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== + dependencies: + asn1.js "^5.2.0" + browserify-aes "^1.0.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse-node-version@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" + integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== + +parse5-html-rewriting-stream@6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-6.0.1.tgz#de1820559317ab4e451ea72dba05fddfd914480b" + integrity sha512-vwLQzynJVEfUlURxgnf51yAJDQTtVpNyGD8tKi2Za7m+akukNHxCcUQMAa/mUGLhCeicFdpy7Tlvj8ZNKadprg== + dependencies: + parse5 "^6.0.1" + parse5-sax-parser "^6.0.1" + +parse5-htmlparser2-tree-adapter@6.0.1, parse5-htmlparser2-tree-adapter@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" + integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== + dependencies: + parse5 "^6.0.1" + +parse5-sax-parser@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5-sax-parser/-/parse5-sax-parser-6.0.1.tgz#98b4d366b5b266a7cd90b4b58906667af882daba" + integrity sha512-kXX+5S81lgESA0LsDuGjAlBybImAChYRMT+/uKCEXFBFOeEhS52qUCydGhU3qLRD8D9DVjaUo821WK7DM4iCeg== + dependencies: + parse5 "^6.0.1" + +parse5@6.0.1, parse5@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +parse5@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" + integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== + +parseqs@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.6.tgz#8e4bb5a19d1cdc844a08ac974d34e273afa670d5" + integrity sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w== + +parseuri@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.6.tgz#e1496e829e3ac2ff47f39a4dd044b32823c4a25a" + integrity sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow== + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-is-inside@^1.0.1, path-is-inside@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pbkdf2@^3.0.3: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +pem@1.14.4: + version "1.14.4" + resolved "https://registry.yarnpkg.com/pem/-/pem-1.14.4.tgz#a68c70c6e751ccc5b3b5bcd7af78b0aec1177ff9" + integrity sha512-v8lH3NpirgiEmbOqhx0vwQTxwi0ExsiWBGYh0jYNq7K6mQuO4gI6UEFlr6fLAdv9TPXRt6GqiwE37puQdIDS8g== + dependencies: + es6-promisify "^6.0.0" + md5 "^2.2.1" + os-tmpdir "^1.0.1" + which "^2.0.2" + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + +picocolors@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" + integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== + +pify@^2.0.0, pify@^2.2.0, pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pkg-dir@^4.1.0, pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +pnp-webpack-plugin@1.6.4: + version "1.6.4" + resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" + integrity sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg== + dependencies: + ts-pnp "^1.1.6" + +popper.js@1.16.1-lts: + version "1.16.1-lts" + resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1-lts.tgz#cf6847b807da3799d80ee3d6d2f90df8a3f50b05" + integrity sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA== + +portfinder@^1.0.26, portfinder@^1.0.28: + version "1.0.28" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" + integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA== + dependencies: + async "^2.6.2" + debug "^3.1.1" + mkdirp "^0.5.5" + +portscanner@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/portscanner/-/portscanner-2.1.1.tgz#eabb409e4de24950f5a2a516d35ae769343fbb96" + integrity sha1-6rtAnk3iSVD1oqUW01rnaTQ/u5Y= + dependencies: + async "1.5.2" + is-number-like "^1.0.3" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +postcss-apply@0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/postcss-apply/-/postcss-apply-0.11.0.tgz#4bef9b443e4bfeeec5b094c7008bfe25dca5f40d" + integrity sha512-Y/uBl3p0H3jby+N3kvSNyuyLKZaCElCMMFWXSfEL9llEeCKupJ9Wit5Ms7TsAXFINexkWWwjiYfqPZ1nedi1Jw== + dependencies: + babel-runtime "^6.26.0" + balanced-match "^1.0.0" + postcss "^7.0.2" + +postcss-attribute-case-insensitive@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz#d93e46b504589e94ac7277b0463226c68041a880" + integrity sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^6.0.2" + +postcss-calc@^7.0.1: + version "7.0.5" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.5.tgz#f8a6e99f12e619c2ebc23cf6c486fdc15860933e" + integrity sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg== + dependencies: + postcss "^7.0.27" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.2" + +postcss-calc@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.0.0.tgz#a05b87aacd132740a5db09462a3612453e5df90a" + integrity sha512-5NglwDrcbiy8XXfPM11F3HeC6hoT9W7GUH/Zi5U/p7u3Irv4rHhdDcIZwG0llHXV4ftsBjpfWMXAnXNl4lnt8g== + dependencies: + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.0.2" + +postcss-cli@^8.3.0: + version "8.3.1" + resolved "https://registry.yarnpkg.com/postcss-cli/-/postcss-cli-8.3.1.tgz#865dad08300ac59ae9cecb7066780aa81c767a77" + integrity sha512-leHXsQRq89S3JC9zw/tKyiVV2jAhnfQe0J8VI4eQQbUjwIe0XxVqLrR+7UsahF1s9wi4GlqP6SJ8ydf44cgF2Q== + dependencies: + chalk "^4.0.0" + chokidar "^3.3.0" + dependency-graph "^0.9.0" + fs-extra "^9.0.0" + get-stdin "^8.0.0" + globby "^11.0.0" + postcss-load-config "^3.0.0" + postcss-reporter "^7.0.0" + pretty-hrtime "^1.0.3" + read-cache "^1.0.0" + slash "^3.0.0" + yargs "^16.0.0" + +postcss-color-functional-notation@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz#5efd37a88fbabeb00a2966d1e53d98ced93f74e0" + integrity sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-color-gray@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz#532a31eb909f8da898ceffe296fdc1f864be8547" + integrity sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.5" + postcss-values-parser "^2.0.0" + +postcss-color-hex-alpha@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz#a8d9ca4c39d497c9661e374b9c51899ef0f87388" + integrity sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw== + dependencies: + postcss "^7.0.14" + postcss-values-parser "^2.0.1" + +postcss-color-mod-function@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz#816ba145ac11cc3cb6baa905a75a49f903e4d31d" + integrity sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-color-rebeccapurple@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz#c7a89be872bb74e45b1e3022bfe5748823e6de77" + integrity sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-colormin@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" + integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw== + dependencies: + browserslist "^4.0.0" + color "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-colormin@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.2.1.tgz#6e444a806fd3c578827dbad022762df19334414d" + integrity sha512-VVwMrEYLcHYePUYV99Ymuoi7WhKrMGy/V9/kTS0DkCoJYmmjdOMneyhzYUxcNgteKDVbrewOkSM7Wje/MFwxzA== + dependencies: + browserslist "^4.16.6" + caniuse-api "^3.0.0" + colord "^2.9.1" + postcss-value-parser "^4.1.0" + +postcss-convert-values@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" + integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-convert-values@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.0.2.tgz#879b849dc3677c7d6bc94b6a2c1a3f0808798059" + integrity sha512-KQ04E2yadmfa1LqXm7UIDwW1ftxU/QWZmz6NKnHnUvJ3LEYbbcX6i329f/ig+WnEByHegulocXrECaZGLpL8Zg== + dependencies: + postcss-value-parser "^4.1.0" + +postcss-custom-media@^7.0.8: + version "7.0.8" + resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz#fffd13ffeffad73621be5f387076a28b00294e0c" + integrity sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg== + dependencies: + postcss "^7.0.14" + +postcss-custom-properties@^8.0.11: + version "8.0.11" + resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz#2d61772d6e92f22f5e0d52602df8fae46fa30d97" + integrity sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA== + dependencies: + postcss "^7.0.17" + postcss-values-parser "^2.0.1" + +postcss-custom-selectors@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz#64858c6eb2ecff2fb41d0b28c9dd7b3db4de7fba" + integrity sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-dir-pseudo-class@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz#6e3a4177d0edb3abcc85fdb6fbb1c26dabaeaba2" + integrity sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-discard-comments@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" + integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== + dependencies: + postcss "^7.0.0" + +postcss-discard-comments@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.0.1.tgz#9eae4b747cf760d31f2447c27f0619d5718901fe" + integrity sha512-lgZBPTDvWrbAYY1v5GYEv8fEO/WhKOu/hmZqmCYfrpD6eyDWWzAOsl2rF29lpvziKO02Gc5GJQtlpkTmakwOWg== + +postcss-discard-duplicates@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" + integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== + dependencies: + postcss "^7.0.0" + +postcss-discard-duplicates@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.1.tgz#68f7cc6458fe6bab2e46c9f55ae52869f680e66d" + integrity sha512-svx747PWHKOGpAXXQkCc4k/DsWo+6bc5LsVrAsw+OU+Ibi7klFZCyX54gjYzX4TH+f2uzXjRviLARxkMurA2bA== + +postcss-discard-empty@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" + integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== + dependencies: + postcss "^7.0.0" + +postcss-discard-empty@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.0.1.tgz#ee136c39e27d5d2ed4da0ee5ed02bc8a9f8bf6d8" + integrity sha512-vfU8CxAQ6YpMxV2SvMcMIyF2LX1ZzWpy0lqHDsOdaKKLQVQGVP1pzhrI9JlsO65s66uQTfkQBKBD/A5gp9STFw== + +postcss-discard-overridden@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" + integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg== + dependencies: + postcss "^7.0.0" + +postcss-discard-overridden@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.0.1.tgz#454b41f707300b98109a75005ca4ab0ff2743ac6" + integrity sha512-Y28H7y93L2BpJhrdUR2SR2fnSsT+3TVx1NmVQLbcnZWwIUpJ7mfcTC6Za9M2PG6w8j7UQRfzxqn8jU2VwFxo3Q== + +postcss-double-position-gradients@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz#fc927d52fddc896cb3a2812ebc5df147e110522e" + integrity sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA== + dependencies: + postcss "^7.0.5" + postcss-values-parser "^2.0.0" + +postcss-env-function@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-2.0.2.tgz#0f3e3d3c57f094a92c2baf4b6241f0b0da5365d7" + integrity sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-focus-visible@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz#477d107113ade6024b14128317ade2bd1e17046e" + integrity sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g== + dependencies: + postcss "^7.0.2" + +postcss-focus-within@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz#763b8788596cee9b874c999201cdde80659ef680" + integrity sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w== + dependencies: + postcss "^7.0.2" + +postcss-font-variant@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz#42d4c0ab30894f60f98b17561eb5c0321f502641" + integrity sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA== + dependencies: + postcss "^7.0.2" + +postcss-gap-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz#431c192ab3ed96a3c3d09f2ff615960f902c1715" + integrity sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg== + dependencies: + postcss "^7.0.2" + +postcss-image-set-function@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz#28920a2f29945bed4c3198d7df6496d410d3f288" + integrity sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-import@12.0.1, postcss-import@^12.0.1: + version "12.0.1" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-12.0.1.tgz#cf8c7ab0b5ccab5649024536e565f841928b7153" + integrity sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw== + dependencies: + postcss "^7.0.1" + postcss-value-parser "^3.2.3" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-import@14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-14.0.0.tgz#3ed1dadac5a16650bde3f4cdea6633b9c3c78296" + integrity sha512-gFDDzXhqr9ELmnLHgCC3TbGfA6Dm/YMb/UN8/f7Uuq4fL7VTk2vOIj6hwINEwbokEmp123bLD7a5m+E+KIetRg== + dependencies: + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-initial@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.4.tgz#9d32069a10531fe2ecafa0b6ac750ee0bc7efc53" + integrity sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg== + dependencies: + postcss "^7.0.2" + +postcss-lab-function@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz#bb51a6856cd12289ab4ae20db1e3821ef13d7d2e" + integrity sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg== + dependencies: + "@csstools/convert-colors" "^1.4.0" + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-load-config@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.2.tgz#c5ea504f2c4aef33c7359a34de3573772ad7502a" + integrity sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw== + dependencies: + cosmiconfig "^5.0.0" + import-cwd "^2.0.0" + +postcss-load-config@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-3.1.0.tgz#d39c47091c4aec37f50272373a6a648ef5e97829" + integrity sha512-ipM8Ds01ZUophjDTQYSVP70slFSYg3T0/zyfII5vzhN6V57YSxMgG5syXuwi5VtS8wSf3iL30v0uBdoIVx4Q0g== + dependencies: + import-cwd "^3.0.0" + lilconfig "^2.0.3" + yaml "^1.10.2" + +postcss-loader@3.0.0, postcss-loader@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d" + integrity sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA== + dependencies: + loader-utils "^1.1.0" + postcss "^7.0.0" + postcss-load-config "^2.0.0" + schema-utils "^1.0.0" + +postcss-loader@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-4.2.0.tgz#f6993ea3e0f46600fb3ee49bbd010448123a7db4" + integrity sha512-mqgScxHqbiz1yxbnNcPdKYo/6aVt+XExURmEbQlviFVWogDbM4AJ0A/B+ZBpYsJrTRxKw7HyRazg9x0Q9SWwLA== + dependencies: + cosmiconfig "^7.0.0" + klona "^2.0.4" + loader-utils "^2.0.0" + schema-utils "^3.0.0" + semver "^7.3.4" + +postcss-logical@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-3.0.0.tgz#2495d0f8b82e9f262725f75f9401b34e7b45d5b5" + integrity sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA== + dependencies: + postcss "^7.0.2" + +postcss-media-minmax@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz#b75bb6cbc217c8ac49433e12f22048814a4f5ed5" + integrity sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw== + dependencies: + postcss "^7.0.2" + +postcss-merge-longhand@^4.0.11: + version "4.0.11" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" + integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw== + dependencies: + css-color-names "0.0.4" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + stylehacks "^4.0.0" + +postcss-merge-longhand@^5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.0.4.tgz#41f4f3270282ea1a145ece078b7679f0cef21c32" + integrity sha512-2lZrOVD+d81aoYkZDpWu6+3dTAAGkCKbV5DoRhnIR7KOULVrI/R7bcMjhrH9KTRy6iiHKqmtG+n/MMj1WmqHFw== + dependencies: + postcss-value-parser "^4.1.0" + stylehacks "^5.0.1" + +postcss-merge-rules@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" + integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ== + dependencies: + 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" + +postcss-merge-rules@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.0.3.tgz#b5cae31f53129812a77e3eb1eeee448f8cf1a1db" + integrity sha512-cEKTMEbWazVa5NXd8deLdCnXl+6cYG7m2am+1HzqH0EnTdy8fRysatkaXb2dEnR+fdaDxTvuZ5zoBdv6efF6hg== + dependencies: + browserslist "^4.16.6" + caniuse-api "^3.0.0" + cssnano-utils "^2.0.1" + postcss-selector-parser "^6.0.5" + +postcss-minify-font-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" + integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-font-values@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.0.1.tgz#a90cefbfdaa075bd3dbaa1b33588bb4dc268addf" + integrity sha512-7JS4qIsnqaxk+FXY1E8dHBDmraYFWmuL6cgt0T1SWGRO5bzJf8sUoelwa4P88LEWJZweHevAiDKxHlofuvtIoA== + dependencies: + postcss-value-parser "^4.1.0" + +postcss-minify-gradients@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" + integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + is-color-stop "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-minify-gradients@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.0.3.tgz#f970a11cc71e08e9095e78ec3a6b34b91c19550e" + integrity sha512-Z91Ol22nB6XJW+5oe31+YxRsYooxOdFKcbOqY/V8Fxse1Y3vqlNRpi1cxCqoACZTQEhl+xvt4hsbWiV5R+XI9Q== + dependencies: + colord "^2.9.1" + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" + +postcss-minify-params@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" + integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg== + dependencies: + 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" + +postcss-minify-params@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.0.2.tgz#1b644da903473fbbb18fbe07b8e239883684b85c" + integrity sha512-qJAPuBzxO1yhLad7h2Dzk/F7n1vPyfHfCCh5grjGfjhi1ttCnq4ZXGIW77GSrEbh9Hus9Lc/e/+tB4vh3/GpDg== + dependencies: + alphanum-sort "^1.0.2" + browserslist "^4.16.6" + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" + +postcss-minify-selectors@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" + integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g== + dependencies: + alphanum-sort "^1.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +postcss-minify-selectors@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.1.0.tgz#4385c845d3979ff160291774523ffa54eafd5a54" + integrity sha512-NzGBXDa7aPsAcijXZeagnJBKBPMYLaJJzB8CQh6ncvyl2sIndLVWfbcDi0SBjRWk5VqEjXvf8tYwzoKf4Z07og== + dependencies: + alphanum-sort "^1.0.2" + postcss-selector-parser "^6.0.5" + +postcss-modules-extract-imports@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" + integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== + dependencies: + postcss "^7.0.5" + +postcss-modules-extract-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" + integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + +postcss-modules-local-by-default@^3.0.2, postcss-modules-local-by-default@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0" + integrity sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw== + dependencies: + icss-utils "^4.1.1" + postcss "^7.0.32" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-local-by-default@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" + integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^2.1.1, postcss-modules-scope@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" + integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ== + dependencies: + postcss "^7.0.6" + postcss-selector-parser "^6.0.0" + +postcss-modules-scope@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" + integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-modules-values@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" + integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg== + dependencies: + icss-utils "^4.0.0" + postcss "^7.0.6" + +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + dependencies: + icss-utils "^5.0.0" + +postcss-nesting@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-7.0.1.tgz#b50ad7b7f0173e5b5e3880c3501344703e04c052" + integrity sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg== + dependencies: + postcss "^7.0.2" + +postcss-normalize-charset@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" + integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== + dependencies: + postcss "^7.0.0" + +postcss-normalize-charset@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.0.1.tgz#121559d1bebc55ac8d24af37f67bd4da9efd91d0" + integrity sha512-6J40l6LNYnBdPSk+BHZ8SF+HAkS4q2twe5jnocgd+xWpz/mx/5Sa32m3W1AA8uE8XaXN+eg8trIlfu8V9x61eg== + +postcss-normalize-display-values@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" + integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-display-values@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.0.1.tgz#62650b965981a955dffee83363453db82f6ad1fd" + integrity sha512-uupdvWk88kLDXi5HEyI9IaAJTE3/Djbcrqq8YgjvAVuzgVuqIk3SuJWUisT2gaJbZm1H9g5k2w1xXilM3x8DjQ== + dependencies: + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" + +postcss-normalize-positions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" + integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA== + dependencies: + cssnano-util-get-arguments "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-positions@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.0.1.tgz#868f6af1795fdfa86fbbe960dceb47e5f9492fe5" + integrity sha512-rvzWAJai5xej9yWqlCb1OWLd9JjW2Ex2BCPzUJrbaXmtKtgfL8dBMOOMTX6TnvQMtjk3ei1Lswcs78qKO1Skrg== + dependencies: + postcss-value-parser "^4.1.0" + +postcss-normalize-repeat-style@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" + integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q== + dependencies: + cssnano-util-get-arguments "^4.0.0" + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-repeat-style@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.0.1.tgz#cbc0de1383b57f5bb61ddd6a84653b5e8665b2b5" + integrity sha512-syZ2itq0HTQjj4QtXZOeefomckiV5TaUO6ReIEabCh3wgDs4Mr01pkif0MeVwKyU/LHEkPJnpwFKRxqWA/7O3w== + dependencies: + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" + +postcss-normalize-string@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" + integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA== + dependencies: + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-string@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.0.1.tgz#d9eafaa4df78c7a3b973ae346ef0e47c554985b0" + integrity sha512-Ic8GaQ3jPMVl1OEn2U//2pm93AXUcF3wz+OriskdZ1AOuYV25OdgS7w9Xu2LO5cGyhHCgn8dMXh9bO7vi3i9pA== + dependencies: + postcss-value-parser "^4.1.0" + +postcss-normalize-timing-functions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" + integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A== + dependencies: + cssnano-util-get-match "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-timing-functions@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.0.1.tgz#8ee41103b9130429c6cbba736932b75c5e2cb08c" + integrity sha512-cPcBdVN5OsWCNEo5hiXfLUnXfTGtSFiBU9SK8k7ii8UD7OLuznzgNRYkLZow11BkQiiqMcgPyh4ZqXEEUrtQ1Q== + dependencies: + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" + +postcss-normalize-unicode@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" + integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-unicode@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.0.1.tgz#82d672d648a411814aa5bf3ae565379ccd9f5e37" + integrity sha512-kAtYD6V3pK0beqrU90gpCQB7g6AOfP/2KIPCVBKJM2EheVsBQmx/Iof+9zR9NFKLAx4Pr9mDhogB27pmn354nA== + dependencies: + browserslist "^4.16.0" + postcss-value-parser "^4.1.0" + +postcss-normalize-url@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" + integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA== + dependencies: + is-absolute-url "^2.0.0" + normalize-url "^3.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-url@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.0.3.tgz#42eca6ede57fe69075fab0f88ac8e48916ef931c" + integrity sha512-qWiUMbvkRx3kc1Dp5opzUwc7MBWZcSDK2yofCmdvFBCpx+zFPkxBC1FASQ59Pt+flYfj/nTZSkmF56+XG5elSg== + dependencies: + is-absolute-url "^3.0.3" + normalize-url "^6.0.1" + postcss-value-parser "^4.1.0" + +postcss-normalize-whitespace@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" + integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-normalize-whitespace@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.0.1.tgz#b0b40b5bcac83585ff07ead2daf2dcfbeeef8e9a" + integrity sha512-iPklmI5SBnRvwceb/XH568yyzK0qRVuAG+a1HFUsFRf11lEJTiQQa03a4RSCQvLKdcpX7XsI1Gen9LuLoqwiqA== + dependencies: + postcss-value-parser "^4.1.0" + +postcss-ordered-values@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" + integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw== + dependencies: + cssnano-util-get-arguments "^4.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-ordered-values@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.0.2.tgz#1f351426977be00e0f765b3164ad753dac8ed044" + integrity sha512-8AFYDSOYWebJYLyJi3fyjl6CqMEG/UVworjiyK1r573I56kb3e879sCJLGvR3merj+fAdPpVplXKQZv+ey6CgQ== + dependencies: + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" + +postcss-overflow-shorthand@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz#31ecf350e9c6f6ddc250a78f0c3e111f32dd4c30" + integrity sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g== + dependencies: + postcss "^7.0.2" + +postcss-page-break@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-2.0.0.tgz#add52d0e0a528cabe6afee8b46e2abb277df46bf" + integrity sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ== + dependencies: + postcss "^7.0.2" + +postcss-place@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-4.0.1.tgz#e9f39d33d2dc584e46ee1db45adb77ca9d1dcc62" + integrity sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg== + dependencies: + postcss "^7.0.2" + postcss-values-parser "^2.0.0" + +postcss-preset-env@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz#c34ddacf8f902383b35ad1e030f178f4cdf118a5" + integrity sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg== + dependencies: + autoprefixer "^9.6.1" + browserslist "^4.6.4" + caniuse-lite "^1.0.30000981" + css-blank-pseudo "^0.1.4" + css-has-pseudo "^0.10.0" + css-prefers-color-scheme "^3.1.1" + cssdb "^4.4.0" + postcss "^7.0.17" + postcss-attribute-case-insensitive "^4.0.1" + postcss-color-functional-notation "^2.0.1" + postcss-color-gray "^5.0.0" + postcss-color-hex-alpha "^5.0.3" + postcss-color-mod-function "^3.0.3" + postcss-color-rebeccapurple "^4.0.1" + postcss-custom-media "^7.0.8" + postcss-custom-properties "^8.0.11" + postcss-custom-selectors "^5.1.2" + postcss-dir-pseudo-class "^5.0.0" + postcss-double-position-gradients "^1.0.0" + postcss-env-function "^2.0.2" + postcss-focus-visible "^4.0.0" + postcss-focus-within "^3.0.0" + postcss-font-variant "^4.0.0" + postcss-gap-properties "^2.0.0" + postcss-image-set-function "^3.0.1" + postcss-initial "^3.0.0" + postcss-lab-function "^2.0.1" + postcss-logical "^3.0.0" + postcss-media-minmax "^4.0.0" + postcss-nesting "^7.0.0" + postcss-overflow-shorthand "^2.0.0" + postcss-page-break "^2.0.0" + postcss-place "^4.0.1" + postcss-pseudo-class-any-link "^6.0.0" + postcss-replace-overflow-wrap "^3.0.0" + postcss-selector-matches "^4.0.0" + postcss-selector-not "^4.0.0" + +postcss-pseudo-class-any-link@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz#2ed3eed393b3702879dec4a87032b210daeb04d1" + integrity sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew== + dependencies: + postcss "^7.0.2" + postcss-selector-parser "^5.0.0-rc.3" + +postcss-reduce-initial@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" + integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA== + dependencies: + browserslist "^4.0.0" + caniuse-api "^3.0.0" + has "^1.0.0" + postcss "^7.0.0" + +postcss-reduce-initial@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.0.2.tgz#fa424ce8aa88a89bc0b6d0f94871b24abe94c048" + integrity sha512-v/kbAAQ+S1V5v9TJvbGkV98V2ERPdU6XvMcKMjqAlYiJ2NtsHGlKYLPjWWcXlaTKNxooId7BGxeraK8qXvzKtw== + dependencies: + browserslist "^4.16.6" + caniuse-api "^3.0.0" + +postcss-reduce-transforms@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" + integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg== + dependencies: + cssnano-util-get-match "^4.0.0" + has "^1.0.0" + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + +postcss-reduce-transforms@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.1.tgz#93c12f6a159474aa711d5269923e2383cedcf640" + integrity sha512-a//FjoPeFkRuAguPscTVmRQUODP+f3ke2HqFNgGPwdYnpeC29RZdCBvGRGTsKpMURb/I3p6jdKoBQ2zI+9Q7kA== + dependencies: + cssnano-utils "^2.0.1" + postcss-value-parser "^4.1.0" + +postcss-replace-overflow-wrap@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz#61b360ffdaedca84c7c918d2b0f0d0ea559ab01c" + integrity sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw== + dependencies: + postcss "^7.0.2" + +postcss-reporter@^7.0.0: + version "7.0.4" + resolved "https://registry.yarnpkg.com/postcss-reporter/-/postcss-reporter-7.0.4.tgz#640de7ef30fa89374bc0d5029c307ad2ecda25c3" + integrity sha512-jY/fnpGSin7kwJeunXbY35STp5O3VIxSFdjee5JkoPQ+FfGH5JW3N+Xe9oAPcL9UkjWjkK+JC72o8XH4XXKdhw== + dependencies: + lodash.difference "^4.5.0" + lodash.forown "^4.4.0" + lodash.get "^4.4.2" + lodash.groupby "^4.6.0" + lodash.sortby "^4.7.0" + picocolors "^1.0.0" + +postcss-responsive-type@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/postcss-responsive-type/-/postcss-responsive-type-1.0.0.tgz#bb2d57d830beb9586ec4fda7994f07e37953aad8" + integrity sha1-uy1X2DC+uVhuxP2nmU8H43lTqtg= + dependencies: + postcss "^6.0.6" + +postcss-selector-matches@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz#71c8248f917ba2cc93037c9637ee09c64436fcff" + integrity sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww== + dependencies: + balanced-match "^1.0.0" + postcss "^7.0.2" + +postcss-selector-not@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz#263016eef1cf219e0ade9a913780fc1f48204cbf" + integrity sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ== + dependencies: + balanced-match "^1.0.0" + postcss "^7.0.2" + +postcss-selector-parser@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270" + integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA== + dependencies: + dot-prop "^5.2.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" + integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ== + dependencies: + cssesc "^2.0.0" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5: + version "6.0.6" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz#2c5bba8174ac2f6981ab631a42ab0ee54af332ea" + integrity sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-svgo@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.3.tgz#343a2cdbac9505d416243d496f724f38894c941e" + integrity sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw== + dependencies: + postcss "^7.0.0" + postcss-value-parser "^3.0.0" + svgo "^1.0.0" + +postcss-svgo@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.0.3.tgz#d945185756e5dfaae07f9edb0d3cae7ff79f9b30" + integrity sha512-41XZUA1wNDAZrQ3XgWREL/M2zSw8LJPvb5ZWivljBsUQAGoEKMYm6okHsTjJxKYI4M75RQEH4KYlEM52VwdXVA== + dependencies: + postcss-value-parser "^4.1.0" + svgo "^2.7.0" + +postcss-unique-selectors@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" + integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg== + dependencies: + alphanum-sort "^1.0.0" + postcss "^7.0.0" + uniqs "^2.0.0" + +postcss-unique-selectors@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.0.2.tgz#5d6893daf534ae52626708e0d62250890108c0c1" + integrity sha512-w3zBVlrtZm7loQWRPVC0yjUwwpty7OM6DnEHkxcSQXO1bMS3RJ+JUS5LFMSDZHJcvGsRwhZinCWVqn8Kej4EDA== + dependencies: + alphanum-sort "^1.0.2" + postcss-selector-parser "^6.0.5" + +postcss-value-parser@^3.0.0, postcss-value-parser@^3.2.3: + version "3.3.1" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + +postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f" + integrity sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg== + dependencies: + flatten "^1.0.2" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss@7.0.21: + version "7.0.21" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.21.tgz#06bb07824c19c2021c5d056d5b10c35b989f7e17" + integrity sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +postcss@7.0.32: + version "7.0.32" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.32.tgz#4310d6ee347053da3433db2be492883d62cec59d" + integrity sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +postcss@8.2.15: + version "8.2.15" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.2.15.tgz#9e66ccf07292817d226fc315cbbf9bc148fbca65" + integrity sha512-2zO3b26eJD/8rb106Qu2o7Qgg52ND5HPjcyQiK2B98O388h43A448LCslC0dI2P97wCAQRJsFvwTRcXxTKds+Q== + dependencies: + colorette "^1.2.2" + nanoid "^3.1.23" + source-map "^0.6.1" + +postcss@^6.0.6: + version "6.0.23" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" + integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== + dependencies: + chalk "^2.4.1" + source-map "^0.6.1" + supports-color "^5.4.0" + +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.23, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.35, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.39" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" + integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== + dependencies: + picocolors "^0.2.1" + source-map "^0.6.1" + +postcss@^8.1.4, postcss@^8.3.7: + version "8.4.4" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.4.tgz#d53d4ec6a75fd62557a66bb41978bf47ff0c2869" + integrity sha512-joU6fBsN6EIer28Lj6GDFoC/5yOZzLCfn0zHAn/MYXI7aPt4m4hK5KC5ovEZXy+lnCjmYIbQWngvju2ddyEr8Q== + dependencies: + nanoid "^3.1.30" + picocolors "^1.0.0" + source-map-js "^1.0.1" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + +prepend-http@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + +prepend-http@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" + integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= + +pretty-bytes@^5.3.0, pretty-bytes@^5.6.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" + integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== + +pretty-error@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.2.tgz#be89f82d81b1c86ec8fdfbc385045882727f93b6" + integrity sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw== + dependencies: + lodash "^4.17.20" + renderkid "^2.0.4" + +pretty-hrtime@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" + integrity sha1-t+PqQkNaTJsnWdmeDyAesZWALuE= + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + +promise-retry@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-1.1.1.tgz#6739e968e3051da20ce6497fb2b50f6911df3d6d" + integrity sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0= + dependencies: + err-code "^1.0.0" + retry "^0.10.0" + +promise-retry@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" + integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== + dependencies: + err-code "^2.0.2" + retry "^0.12.0" + +prompts@~2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2: + version "15.7.2" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" + integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.8.1" + +protractor-istanbul-plugin@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/protractor-istanbul-plugin/-/protractor-istanbul-plugin-2.0.0.tgz#f6271d2a5d6382488e86ff9fb7770f46a8b2c5e2" + integrity sha1-9icdKl1jgkiOhv+ft3cPRqiyxeI= + dependencies: + fs-extra "^0.22.1" + merge "^1.2.0" + q "^1.4.1" + uuid "^2.0.1" + +protractor@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/protractor/-/protractor-7.0.0.tgz#c3e263608bd72e2c2dc802b11a772711a4792d03" + integrity sha512-UqkFjivi4GcvUQYzqGYNe0mLzfn5jiLmO8w9nMhQoJRLhy2grJonpga2IWhI6yJO30LibWXJJtA4MOIZD2GgZw== + dependencies: + "@types/q" "^0.0.32" + "@types/selenium-webdriver" "^3.0.0" + blocking-proxy "^1.0.0" + browserstack "^1.5.1" + chalk "^1.1.3" + glob "^7.0.3" + jasmine "2.8.0" + jasminewd2 "^2.1.0" + q "1.4.1" + saucelabs "^1.5.0" + selenium-webdriver "3.6.0" + source-map-support "~0.4.0" + webdriver-js-extender "2.1.0" + webdriver-manager "^12.1.7" + yargs "^15.3.1" + +proxy-addr@~2.0.5: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +proxy-from-env@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" + integrity sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4= + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +psl@^1.1.28, psl@^1.1.33: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + +pstree.remy@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" + integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^1.2.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +pupa@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62" + integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== + dependencies: + escape-goat "^2.0.0" + +q@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" + integrity sha1-VXBbzZPF82c1MMLCy8DCs63cKG4= + +q@^1.1.2, q@^1.4.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= + +qjobs@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071" + integrity sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg== + +qs@6.2.3: + version "6.2.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.3.tgz#1cfcb25c10a9b2b483053ff39f5dfc9233908cfe" + integrity sha1-HPyyXBCpsrSDBT/zn138kjOQjP4= + +qs@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== + +query-string@^4.1.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" + integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s= + dependencies: + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +raf-schd@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/raf-schd/-/raf-schd-4.0.3.tgz#5d6c34ef46f8b2a0e880a8fcdb743efc5bfdbc1a" + integrity sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ== + +ramda@~0.27.1: + version "0.27.1" + resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.27.1.tgz#66fc2df3ef873874ffc2da6aa8984658abacf5c9" + integrity sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw== + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@^1.2.1, range-parser@~1.2.0, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== + dependencies: + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" + +raw-body@^2.3.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.2.tgz#baf3e9c21eebced59dd6533ac872b71f7b61cb32" + integrity sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ== + dependencies: + bytes "3.1.1" + http-errors "1.8.1" + iconv-lite "0.4.24" + unpipe "1.0.0" + +raw-loader@0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa" + integrity sha1-DD0L6u2KAclm2Xh793goElKpeao= + +raw-loader@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-4.0.1.tgz#14e1f726a359b68437e183d5a5b7d33a3eba6933" + integrity sha512-baolhQBSi3iNh1cglJjA0mYzga+wePk7vdEX//1dTFd+v4TsQlQE0jitJSNF1OIP82rdYulH7otaVmdlDaJ64A== + dependencies: + loader-utils "^2.0.0" + schema-utils "^2.6.5" + +raw-loader@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-4.0.2.tgz#1aac6b7d1ad1501e66efdac1522c73e59a584eb6" + integrity sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +rc@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +re-reselect@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/re-reselect/-/re-reselect-4.0.0.tgz#9ddec4c72c4d952f68caa5aa4b76a9ed38b75cac" + integrity sha512-wuygyq8TXUlSdVXv2kigXxQNOgdb9m7LbIjwfTNGSpaY1riLd5e+VeQjlQMyUtrk0oiyhi1AqIVynworl3qxHA== + +re-resizable@6.9.1: + version "6.9.1" + resolved "https://registry.yarnpkg.com/re-resizable/-/re-resizable-6.9.1.tgz#6be082b55d02364ca4bfee139e04feebdf52441c" + integrity sha512-KRYAgr9/j1PJ3K+t+MBhlQ+qkkoLDJ1rs0z1heIWvYbCW/9Vq4djDU+QumJ3hQbwwtzXF6OInla6rOx6hhgRhQ== + dependencies: + fast-memoize "^2.5.1" + +react-aria-live@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/react-aria-live/-/react-aria-live-2.0.5.tgz#333480cb898d6963421bd86fe3cbd0ce54e37f08" + integrity sha512-rXiH1HNKJrr/UfVeGwA2aKY43r5WbjLs+AYB6/kJF1qny2hwxzQc1qewQmUpdQ5h8HAOTD8O/XlGcEHjqlCl0g== + dependencies: + uuid "^3.2.1" + +react-beautiful-dnd@^13.0.0: + version "13.1.0" + resolved "https://registry.yarnpkg.com/react-beautiful-dnd/-/react-beautiful-dnd-13.1.0.tgz#ec97c81093593526454b0de69852ae433783844d" + integrity sha512-aGvblPZTJowOWUNiwd6tNfEpgkX5OxmpqxHKNW/4VmvZTNTbeiq7bA3bn5T+QSF2uibXB0D1DmJsb1aC/+3cUA== + dependencies: + "@babel/runtime" "^7.9.2" + css-box-model "^1.2.0" + memoize-one "^5.1.1" + raf-schd "^4.0.2" + react-redux "^7.2.0" + redux "^4.0.4" + use-memo-one "^1.1.1" + +react-copy-to-clipboard@^5.0.1: + version "5.0.4" + resolved "https://registry.yarnpkg.com/react-copy-to-clipboard/-/react-copy-to-clipboard-5.0.4.tgz#42ec519b03eb9413b118af92d1780c403a5f19bf" + integrity sha512-IeVAiNVKjSPeGax/Gmkqfa/+PuMTBhutEvFUaMQLwE2tS0EXrAdgOpWDX26bWTXF3HrioorR7lr08NqeYUWQCQ== + dependencies: + copy-to-clipboard "^3" + prop-types "^15.5.8" + +react-dnd-html5-backend@^10.0.2: + version "10.0.2" + resolved "https://registry.yarnpkg.com/react-dnd-html5-backend/-/react-dnd-html5-backend-10.0.2.tgz#15cb9d2b923f43576a136df854e288cb5969784c" + integrity sha512-ny17gUdInZ6PIGXdzfwPhoztRdNVVvjoJMdG80hkDBamJBeUPuNF2Wv4D3uoQJLjXssX1+i9PhBqc7EpogClwQ== + dependencies: + dnd-core "^10.0.2" + +react-dnd-multi-backend@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/react-dnd-multi-backend/-/react-dnd-multi-backend-5.1.1.tgz#1ddb243cea74e41efa3932e6403bb84d0a8cd11b" + integrity sha512-u085U6tIAfkFzaBhe0AhZZIhs9Ta1sRcp+S/A7JR81B1TjtPVLYIoTyqCO91wG1Iz5+MEVL88aYuRPayMY4HXQ== + dependencies: + dnd-multi-backend "^5.1.1" + prop-types "^15.7.2" + react-dnd-preview "^5.1.1" + +react-dnd-preview@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/react-dnd-preview/-/react-dnd-preview-5.1.1.tgz#90c4ad49e90d9abe39728b762d72132b8589b784" + integrity sha512-RryrwRRfF22kL8CQcYqDHt4WLbytRbVNXYnjPkyZKfGsXfQnY0j8OtxokTee4Ba3OkcSiSYQbLhDRFw9wiJj5g== + dependencies: + prop-types "^15.7.2" + +react-dnd-touch-backend@^10.0.2: + version "10.0.2" + resolved "https://registry.yarnpkg.com/react-dnd-touch-backend/-/react-dnd-touch-backend-10.0.2.tgz#90cb916655539b838d49b8895e1813f8b874b3b4" + integrity sha512-+lW/Ern0dKyHToD0oP+Wc/ZD6l7qJazosLqbjzL7OnPlig6WxdlrHkJylOLkeAdZj41fIJJ551Lb57pIL0CcPw== + dependencies: + "@react-dnd/invariant" "^2.0.0" + dnd-core "^10.0.2" + +react-dnd@^10.0.2: + version "10.0.2" + resolved "https://registry.yarnpkg.com/react-dnd/-/react-dnd-10.0.2.tgz#a6ad8eb3d9f2c573031f7ce05012e5c767a0b1fc" + integrity sha512-SC2Ymvntynhoqtf5zaFhZscm9xenCoMofilxPdlwUlaelAzmbl9fw82C4ZJ//+lNm3kWAKXjGDZg2/aWjKEAtg== + dependencies: + "@react-dnd/shallowequal" "^2.0.0" + "@types/hoist-non-react-statics" "^3.3.1" + dnd-core "^10.0.2" + hoist-non-react-statics "^3.3.0" + +react-dom@^16.14.0: + version "16.14.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.14.0.tgz#7ad838ec29a777fb3c75c3a190f661cf92ab8b89" + integrity sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + scheduler "^0.19.1" + +react-draggable@4.4.3: + version "4.4.3" + resolved "https://registry.yarnpkg.com/react-draggable/-/react-draggable-4.4.3.tgz#0727f2cae5813e36b0e4962bf11b2f9ef2b406f3" + integrity sha512-jV4TE59MBuWm7gb6Ns3Q1mxX8Azffb7oTtDtBgFkxRvhDp38YAARmRplrj0+XGkhOJB5XziArX+4HUUABtyZ0w== + dependencies: + classnames "^2.2.5" + prop-types "^15.6.0" + +react-full-screen@^0.2.4: + version "0.2.5" + resolved "https://registry.yarnpkg.com/react-full-screen/-/react-full-screen-0.2.5.tgz#bc79a5cdb9640d8b9b09e11a17fa54f6e6fa5789" + integrity sha512-LNkxjLWmiR+AwemSVdn/miUcBy8tHA6mDVS1qz1AM/DHNEtQbzkh5ok9A6g99502OqutQq1zBvCBGLV8rsB2tw== + dependencies: + "@types/react" "*" + fscreen "^1.0.1" + +react-i18next@^11.7.0: + version "11.14.3" + resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-11.14.3.tgz#b44b5c4d1aadac5211be011827a2830be60f2522" + integrity sha512-Hf2aanbKgYxPjG8ZdKr+PBz9sY6sxXuZWizxCYyJD2YzvJ0W9JTQcddVEjDaKyBoCyd3+5HTerdhc9ehFugc6g== + dependencies: + "@babel/runtime" "^7.14.5" + html-parse-stringify "^3.0.1" + +react-image@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/react-image/-/react-image-4.0.3.tgz#6fa722877660b67295298a914bff1ed87ad2cf83" + integrity sha512-19MUK9u1qaw9xys8XEsVkSpVhHctEBUeYFvrLTe1PN+4w5Co13AN2WA7xtBshPM6SthsOj77SlDrEAeOaJpf7g== + +react-is@^16.7.0, react-is@^16.8.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +"react-is@^16.8.0 || ^17.0.0", react-is@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + +react-mosaic-component@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/react-mosaic-component/-/react-mosaic-component-4.1.1.tgz#48a34e5e5c16654075212666c2aebeb488bab9f2" + integrity sha512-HVlLvfYQ/AKmoKvw95Orx3Qyc7SNuS/QlAy+SkAVit1g9ipzXBGYoBg7RMXP5sF5w47CgYxA+1gT+fYRVf73jA== + dependencies: + classnames "^2.2.6" + immutability-helper "^3.0.1" + lodash "^4.17.11" + prop-types "^15.7.2" + react-dnd "^10.0.2" + react-dnd-html5-backend "^10.0.2" + react-dnd-multi-backend "^5.0.0" + react-dnd-touch-backend "^10.0.2" + uuid "^3.3.2" + +react-redux@^7.1.0, react-redux@^7.2.0: + version "7.2.6" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.6.tgz#49633a24fe552b5f9caf58feb8a138936ddfe9aa" + integrity sha512-10RPdsz0UUrRL1NZE0ejTkucnclYSgXp5q+tB5SWx2qeG2ZJQJyymgAhwKy73yiL/13btfB6fPr+rgbMAaZIAQ== + dependencies: + "@babel/runtime" "^7.15.4" + "@types/react-redux" "^7.1.20" + hoist-non-react-statics "^3.3.2" + loose-envify "^1.4.0" + prop-types "^15.7.2" + react-is "^17.0.2" + +react-resize-observer@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/react-resize-observer/-/react-resize-observer-1.1.1.tgz#641dfa2e0f4bd2549a8ab4bbbaf43b68f3dcaf76" + integrity sha512-3R+90Hou90Mr3wJYc+unsySC8Pn91V4nmjO32NKvUvjphRUbq9HisyLg7bDyGBE7xlMrrM6Fax7iNQaFdc/FYA== + +react-rnd@^10.1: + version "10.3.5" + resolved "https://registry.yarnpkg.com/react-rnd/-/react-rnd-10.3.5.tgz#b66e5e06f1eb6823e72eb4b552081b4b9241b139" + integrity sha512-LWJP+l5bp76sDPKrKM8pwGJifI6i3B5jHK4ONACczVMbR8ycNGA75ORRqpRuXGyKawUs68s1od05q8cqWgQXgw== + dependencies: + re-resizable "6.9.1" + react-draggable "4.4.3" + tslib "2.3.0" + +react-sizeme@^2.6.7: + version "2.6.12" + resolved "https://registry.yarnpkg.com/react-sizeme/-/react-sizeme-2.6.12.tgz#ed207be5476f4a85bf364e92042520499455453e" + integrity sha512-tL4sCgfmvapYRZ1FO2VmBmjPVzzqgHA7kI8lSJ6JS6L78jXFNRdOZFpXyK6P1NBZvKPPCZxReNgzZNUajAerZw== + dependencies: + element-resize-detector "^1.2.1" + invariant "^2.2.4" + shallowequal "^1.1.0" + throttle-debounce "^2.1.0" + +react-transition-group@^4.4.0: + version "4.4.2" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.2.tgz#8b59a56f09ced7b55cbd53c36768b922890d5470" + integrity sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg== + dependencies: + "@babel/runtime" "^7.5.5" + dom-helpers "^5.0.1" + loose-envify "^1.4.0" + prop-types "^15.6.2" + +react-virtualized-auto-sizer@^1.0.2: + version "1.0.6" + resolved "https://registry.yarnpkg.com/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.6.tgz#66c5b1c9278064c5ef1699ed40a29c11518f97ca" + integrity sha512-7tQ0BmZqfVF6YYEWcIGuoR3OdYe8I/ZFbNclFlGOC3pMqunkYF/oL30NCjSGl9sMEb17AnzixDz98Kqc3N76HQ== + +react-window@^1.8.5: + version "1.8.6" + resolved "https://registry.yarnpkg.com/react-window/-/react-window-1.8.6.tgz#d011950ac643a994118632665aad0c6382e2a112" + integrity sha512-8VwEEYyjz6DCnGBsd+MgkD0KJ2/OXFULyDtorIiTz+QzwoP94tBoA7CnbtyXMm+cCeAUER5KJcPtWl9cpKbOBg== + dependencies: + "@babel/runtime" "^7.0.0" + memoize-one ">=3.1.1 <6" + +react@^16.14.0: + version "16.14.0" + resolved "https://registry.yarnpkg.com/react/-/react-16.14.0.tgz#94d776ddd0aaa37da3eda8fc5b6b18a4c9a3114d" + integrity sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + prop-types "^15.6.2" + +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + integrity sha1-5mTvMRYRZsl1HNvo28+GtftY93Q= + dependencies: + pify "^2.3.0" + +read-package-json-fast@^1.1.3: + version "1.2.2" + resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-1.2.2.tgz#fba77b0b0d66b1ab344e214cb0876577e749c423" + integrity sha512-39DbPJjkltEzfXJXB6D8/Ir3GFOU2YbSKa2HaB/Y3nKrc/zY+0XrALpID6/13ezWyzqvOHrBbR4t4cjQuTdBVQ== + dependencies: + json-parse-even-better-errors "^2.3.0" + npm-normalize-package-bin "^1.0.1" + +read-package-json-fast@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz#323ca529630da82cb34b36cc0b996693c98c2b83" + integrity sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ== + dependencies: + json-parse-even-better-errors "^2.3.0" + npm-normalize-package-bin "^1.0.1" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + 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" + +readable-stream@^3.0.6, readable-stream@^3.4.0, readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +rechoir@^0.7.0: + version "0.7.1" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686" + integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== + dependencies: + resolve "^1.9.0" + +redux-devtools-extension@^2.13.2: + version "2.13.9" + resolved "https://registry.yarnpkg.com/redux-devtools-extension/-/redux-devtools-extension-2.13.9.tgz#6b764e8028b507adcb75a1cae790f71e6be08ae7" + integrity sha512-cNJ8Q/EtjhQaZ71c8I9+BPySIBVEKssbPpskBfsXqb8HJ002A3KRVHfeRzwRo6mGPqsm7XuHTqNSNeS1Khig0A== + +redux-saga@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/redux-saga/-/redux-saga-1.1.3.tgz#9f3e6aebd3c994bbc0f6901a625f9a42b51d1112" + integrity sha512-RkSn/z0mwaSa5/xH/hQLo8gNf4tlvT18qXDNvedihLcfzh+jMchDgaariQoehCpgRltEm4zHKJyINEz6aqswTw== + dependencies: + "@redux-saga/core" "^1.1.3" + +redux-thunk@^2.3.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.4.1.tgz#0dd8042cf47868f4b29699941de03c9301a75714" + integrity sha512-OOYGNY5Jy2TWvTL1KgAlVy6dcx3siPJ1wTq741EPyUKfn6W6nChdICjZwCd0p8AZBs5kWpZlbkXW2nE/zjUa+Q== + +redux@^4.0.0, redux@^4.0.4, redux@^4.0.5: + version "4.1.2" + resolved "https://registry.yarnpkg.com/redux/-/redux-4.1.2.tgz#140f35426d99bb4729af760afcf79eaaac407104" + integrity sha512-SH8PglcebESbd/shgf6mii6EIoRM0zrQyjcuQ+ojmfxjTtE0z9Y8pa62iA/OJ58qjP6j27uyW4kUF4jl/jd6sw== + dependencies: + "@babel/runtime" "^7.9.2" + +reflect-metadata@^0.1.13, reflect-metadata@^0.1.2: + version "0.1.13" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" + integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== + +regenerate-unicode-properties@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz#54d09c7115e1f53dc2314a974b32c1c344efe326" + integrity sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@0.13.7: + version "0.13.7" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" + integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + +regenerator-runtime@^0.13.4: + version "0.13.9" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== + +regenerator-transform@^0.14.2: + version "0.14.5" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" + integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== + dependencies: + "@babel/runtime" "^7.8.4" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +regex-parser@^2.2.11: + version "2.2.11" + resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" + integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== + +regexp.prototype.flags@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" + integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +regexpu-core@^4.7.1: + version "4.8.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.8.0.tgz#e5605ba361b67b1718478501327502f4479a98f0" + integrity sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties "^9.0.0" + regjsgen "^0.5.2" + regjsparser "^0.7.0" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.0.0" + +registry-auth-token@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250" + integrity sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw== + dependencies: + rc "^1.2.8" + +registry-url@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" + integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== + dependencies: + rc "^1.2.8" + +regjsgen@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" + integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== + +regjsparser@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.7.0.tgz#a6b667b54c885e18b52554cb4960ef71187e9968" + integrity sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ== + dependencies: + jsesc "~0.5.0" + +relateurl@^0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" + integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +renderkid@^2.0.4: + version "2.0.7" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.7.tgz#464f276a6bdcee606f4a15993f9b29fc74ca8609" + integrity sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ== + dependencies: + css-select "^4.1.3" + dom-converter "^0.2.0" + htmlparser2 "^6.1.0" + lodash "^4.17.21" + strip-ansi "^3.0.1" + +repeat-element@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" + integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +request-progress@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-3.0.0.tgz#4ca754081c7fec63f505e4faa825aa06cd669dbe" + integrity sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4= + dependencies: + throttleit "^1.0.0" + +request@^2.87.0, request@^2.88.2: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= + +reselect@^4.0.0: + version "4.1.5" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.1.5.tgz#852c361247198da6756d07d9296c2b51eddb79f6" + integrity sha512-uVdlz8J7OO+ASpBYoz1Zypgx0KasCY20H+N8JD13oUMtPvSHQuscrHop4KbXrbsBcdB9Ds7lVK7eRkBIfO43vQ== + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + dependencies: + resolve-from "^3.0.0" + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-url-loader@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-3.1.2.tgz#235e2c28e22e3e432ba7a5d4e305c59a58edfc08" + integrity sha512-QEb4A76c8Mi7I3xNKXlRKQSlLBwjUV/ULFMP+G7n3/7tJZ8MG5wsZ3ucxP1Jz8Vevn6fnJsxDx9cIls+utGzPQ== + dependencies: + adjust-sourcemap-loader "3.0.0" + camelcase "5.3.1" + compose-function "3.0.3" + convert-source-map "1.7.0" + es6-iterator "2.0.3" + loader-utils "1.2.3" + postcss "7.0.21" + rework "1.0.1" + rework-visit "1.0.0" + source-map "0.6.1" + +resolve-url-loader@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz#d50d4ddc746bb10468443167acf800dcd6c3ad57" + integrity sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA== + dependencies: + adjust-sourcemap-loader "^4.0.0" + convert-source-map "^1.7.0" + loader-utils "^2.0.0" + postcss "^7.0.35" + source-map "0.6.1" + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +resolve@1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" + integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== + dependencies: + is-core-module "^2.1.0" + path-parse "^1.0.6" + +resolve@^1.1.7, resolve@^1.3.2, resolve@^1.8.1, resolve@^1.9.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + +resp-modifier@6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/resp-modifier/-/resp-modifier-6.0.2.tgz#b124de5c4fbafcba541f48ffa73970f4aa456b4f" + integrity sha1-sSTeXE+6/LpUH0j/pzlw9KpFa08= + dependencies: + debug "^2.2.0" + minimatch "^3.0.2" + +responselike@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" + integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= + dependencies: + lowercase-keys "^1.0.0" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +retry@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" + integrity sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q= + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rework-visit@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rework-visit/-/rework-visit-1.0.0.tgz#9945b2803f219e2f7aca00adb8bc9f640f842c9a" + integrity sha1-mUWygD8hni96ygCtuLyfZA+ELJo= + +rework@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rework/-/rework-1.0.1.tgz#30806a841342b54510aa4110850cd48534144aa7" + integrity sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc= + dependencies: + convert-source-map "^0.3.3" + css "^2.0.0" + +rfdc@^1.1.4, rfdc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" + integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== + +rgb-regex@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" + integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= + +rgba-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" + integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= + +rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.3, rimraf@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rollup@2.26.5: + version "2.26.5" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.26.5.tgz#5562ec36fcba3eed65cfd630bd78e037ad0e0307" + integrity sha512-rCyFG3ZtQdnn9YwfuAVH0l/Om34BdO5lwCA0W6Hq+bNB21dVEBbCRxhaHOmu1G7OBFDWytbzAC104u7rxHwGjA== + optionalDependencies: + fsevents "~2.1.2" + +rollup@2.38.4: + version "2.38.4" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.38.4.tgz#1b84ea8728c73b1a00a6a6e9c630ec8c3fe48cea" + integrity sha512-B0LcJhjiwKkTl79aGVF/u5KdzsH8IylVfV56Ut6c9ouWLJcUK17T83aZBetNYSnZtXf2OHD4+2PbmRW+Fp5ulg== + optionalDependencies: + fsevents "~2.3.1" + +rtl-css-js@^1.13.1: + version "1.15.0" + resolved "https://registry.yarnpkg.com/rtl-css-js/-/rtl-css-js-1.15.0.tgz#680ed816e570a9ebccba9e1cd0f202c6a8bb2dc0" + integrity sha512-99Cu4wNNIhrI10xxUaABHsdDqzalrSRTie4GeCmbGVuehm4oj+fIy8fTzB+16pmKe8Bv9rl+hxIBez6KxExTew== + dependencies: + "@babel/runtime" "^7.1.2" + +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= + dependencies: + aproba "^1.1.1" + +rx@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" + integrity sha1-pfE/957zt0D+MKqAP7CfmIBdR4I= + +rxjs-report-usage@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/rxjs-report-usage/-/rxjs-report-usage-1.0.6.tgz#6e06034d9e1592e8a45bee877631638e4bac2576" + integrity sha512-omv1DIv5z1kV+zDAEjaDjWSkx8w5TbFp5NZoPwUipwzYVcor/4So9ZU3bUyQ1c8lxY5Q0Es/ztWW7PGjY7to0Q== + dependencies: + "@babel/parser" "^7.10.3" + "@babel/traverse" "^7.10.3" + "@babel/types" "^7.10.3" + bent "~7.3.6" + chalk "~4.1.0" + glob "~7.2.0" + prompts "~2.4.2" + +rxjs-spy@^7.5.3: + version "7.5.3" + resolved "https://registry.yarnpkg.com/rxjs-spy/-/rxjs-spy-7.5.3.tgz#0194bc23ed0c30fb6a61f8bccbc8090e545b91b9" + integrity sha512-8QsSL6Ma51dTeaJ5Q9zWqhqnCSEkDf56Evs1gUsI9N22oB7bYrPMMx4UnoifNGc+Pko2sGX/xydzinLwGO+2pw== + dependencies: + "@types/circular-json" "^0.4.0" + "@types/stacktrace-js" "^0.0.33" + circular-json "^0.5.0" + error-stack-parser "^2.0.1" + rxjs-report-usage "^1.0.4" + stacktrace-gps "^3.0.2" + +rxjs@6.6.2: + version "6.6.2" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.2.tgz#8096a7ac03f2cc4fe5860ef6e572810d9e01c0d2" + integrity sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg== + dependencies: + tslib "^1.9.0" + +rxjs@6.6.3: + version "6.6.3" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" + integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ== + dependencies: + tslib "^1.9.0" + +rxjs@6.6.7, rxjs@^6.5.3, rxjs@^6.5.5, rxjs@^6.6.0, rxjs@^6.6.3, rxjs@~6.6.0: + version "6.6.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== + dependencies: + tslib "^1.9.0" + +rxjs@^5.5.6: + version "5.5.12" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.12.tgz#6fa61b8a77c3d793dbaf270bee2f43f652d741cc" + integrity sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw== + dependencies: + symbol-observable "1.0.1" + +rxjs@^7.4.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.4.0.tgz#a12a44d7eebf016f5ff2441b87f28c9a51cebc68" + integrity sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w== + dependencies: + tslib "~2.1.0" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@^2.1.2, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sass-loader@10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-10.0.1.tgz#10c0364d8034f22fee25ddcc9eded20f99bbe3b4" + integrity sha512-b2PSldKVTS3JcFPHSrEXh3BeAfR7XknGiGCAO5aHruR3Pf3kqLP3Gb2ypXLglRrAzgZkloNxLZ7GXEGDX0hBUQ== + dependencies: + klona "^2.0.3" + loader-utils "^2.0.0" + neo-async "^2.6.2" + schema-utils "^2.7.0" + semver "^7.3.2" + +sass-loader@10.1.1: + version "10.1.1" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-10.1.1.tgz#4ddd5a3d7638e7949065dd6e9c7c04037f7e663d" + integrity sha512-W6gVDXAd5hR/WHsPicvZdjAWHBcEJ44UahgxcIE196fW2ong0ZHMPO1kZuI5q0VlvMQZh32gpv69PLWQm70qrw== + dependencies: + klona "^2.0.4" + loader-utils "^2.0.0" + neo-async "^2.6.2" + schema-utils "^3.0.0" + semver "^7.3.2" + +sass-resources-loader@^2.1.1: + version "2.2.4" + resolved "https://registry.yarnpkg.com/sass-resources-loader/-/sass-resources-loader-2.2.4.tgz#1a86fba499e74a88cb7ce95f0c98449f348d360e" + integrity sha512-hIQhBygYky+rLf+4cuoGYONZ623CEH4Swo1fs1WRJkukbqdvN1VIu2KCL59du6vX92bNELzNkGPLx+NorN73xA== + dependencies: + async "^3.2.0" + chalk "^4.1.0" + glob "^7.1.6" + loader-utils "^2.0.0" + +sass@1.26.10: + version "1.26.10" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.26.10.tgz#851d126021cdc93decbf201d1eca2a20ee434760" + integrity sha512-bzN0uvmzfsTvjz0qwccN1sPm2HxxpNI/Xa+7PlUEMS+nQvbyuEK7Y0qFqxlPHhiNHb1Ze8WQJtU31olMObkAMw== + dependencies: + chokidar ">=2.0.0 <4.0.0" + +sass@1.32.6: + version "1.32.6" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.32.6.tgz#e3646c8325cd97ff75a8a15226007f3ccd221393" + integrity sha512-1bcDHDcSqeFtMr0JXI3xc/CXX6c4p0wHHivJdru8W7waM7a1WjKMm4m/Z5sY7CbVw4Whi2Chpcw6DFfSWwGLzQ== + dependencies: + chokidar ">=2.0.0 <4.0.0" + +saucelabs@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/saucelabs/-/saucelabs-1.5.0.tgz#9405a73c360d449b232839919a86c396d379fd9d" + integrity sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ== + dependencies: + https-proxy-agent "^2.2.1" + +sax@>=0.6.0, sax@^1.2.4, sax@~1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +saxes@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" + integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== + dependencies: + xmlchars "^2.2.0" + +scheduler@^0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196" + integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + +schema-utils@2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" + integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== + dependencies: + "@types/json-schema" "^7.0.4" + ajv "^6.12.2" + ajv-keywords "^3.4.1" + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +schema-utils@^2.6.0, schema-utils@^2.6.5, schema-utils@^2.6.6, schema-utils@^2.7.0: + version "2.7.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +schema-utils@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" + integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.8.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.0.0" + +script-ext-html-webpack-plugin@2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/script-ext-html-webpack-plugin/-/script-ext-html-webpack-plugin-2.1.5.tgz#d4a57e43b04aaf531f675c935688c3971bfafc6c" + integrity sha512-nMjd5dtsnoB8dS+pVM9ZL4mC9O1uVtTxrDS99OGZsZxFbkZE6pw0HCMued/cncDrKivIShO9vwoyOTvsGqQHEQ== + dependencies: + debug "^4.2.0" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= + +selenium-webdriver@3.6.0, selenium-webdriver@^3.0.1: + version "3.6.0" + resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz#2ba87a1662c020b8988c981ae62cb2a01298eafc" + integrity sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q== + dependencies: + jszip "^3.1.3" + rimraf "^2.5.4" + tmp "0.0.30" + xml2js "^0.4.17" + +selfsigned@^1.10.11, selfsigned@^1.10.7, selfsigned@^1.10.8: + version "1.10.11" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.11.tgz#24929cd906fe0f44b6d01fb23999a739537acbe9" + integrity sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA== + dependencies: + node-forge "^0.10.0" + +semver-diff@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" + integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== + dependencies: + semver "^6.3.0" + +semver-dsl@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/semver-dsl/-/semver-dsl-1.0.1.tgz#d3678de5555e8a61f629eed025366ae5f27340a0" + integrity sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA= + dependencies: + semver "^5.3.0" + +semver-intersect@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/semver-intersect/-/semver-intersect-1.4.0.tgz#bdd9c06bedcdd2fedb8cd352c3c43ee8c61321f3" + integrity sha512-d8fvGg5ycKAq0+I6nfWeCx6ffaWJCsBYU0H2Rq56+/zFePYfT8mXkB3tWBSjR5BerkHNZ5eTPIk1/LBYas35xQ== + dependencies: + semver "^5.0.0" + +semver@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== + +semver@7.3.2: + version "7.3.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" + integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== + +semver@7.3.4: + version "7.3.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" + integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== + dependencies: + lru-cache "^6.0.0" + +semver@^5.0.0, semver@^5.0.1, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.1: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + +send@0.16.2: + version "0.16.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" + integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw== + dependencies: + 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" + +send@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + dependencies: + 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" + +serialize-javascript@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" + integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== + dependencies: + randombytes "^2.1.0" + +serialize-javascript@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" + integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== + dependencies: + randombytes "^2.1.0" + +serve-index@1.9.1, serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= + dependencies: + 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" + +serve-static@1.13.2: + version "1.13.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" + integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.2" + send "0.16.2" + +serve-static@1.14.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + +server-destroy@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/server-destroy/-/server-destroy-1.0.1.tgz#f13bf928e42b9c3e79383e61cc3998b5d14e6cdd" + integrity sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0= + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-immediate-shim@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shallowequal@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: + version "3.0.6" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af" + integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= + dependencies: + is-arrayish "^0.3.1" + +sirv@^1.0.7: + version "1.0.19" + resolved "https://registry.yarnpkg.com/sirv/-/sirv-1.0.19.tgz#1d73979b38c7fe91fcba49c85280daa9c2363b49" + integrity sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ== + dependencies: + "@polka/url" "^1.0.0-next.20" + mrmime "^1.0.0" + totalist "^1.0.0" + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +smart-buffer@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + 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" + +socket.io-adapter@~1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz#ab3f0d6f66b8fc7fca3959ab5991f82221789be9" + integrity sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g== + +socket.io-client@2.4.0, socket.io-client@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.4.0.tgz#aafb5d594a3c55a34355562fc8aea22ed9119a35" + integrity sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ== + dependencies: + backo2 "1.0.2" + component-bind "1.0.0" + component-emitter "~1.3.0" + debug "~3.1.0" + engine.io-client "~3.5.0" + has-binary2 "~1.0.2" + indexof "0.0.1" + parseqs "0.0.6" + parseuri "0.0.6" + socket.io-parser "~3.3.0" + to-array "0.1.4" + +socket.io-parser@~3.3.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.3.2.tgz#ef872009d0adcf704f2fbe830191a14752ad50b6" + integrity sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg== + dependencies: + component-emitter "~1.3.0" + debug "~3.1.0" + isarray "2.0.1" + +socket.io-parser@~3.4.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.4.1.tgz#b06af838302975837eab2dc980037da24054d64a" + integrity sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A== + dependencies: + component-emitter "1.2.1" + debug "~4.1.0" + isarray "2.0.1" + +socket.io@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.4.0.tgz#01030a2727bd8eb2e85ea96d69f03692ee53d47e" + integrity sha512-9UPJ1UTvKayuQfVv2IQ3k7tCQC/fboDyIK62i99dAQIyHKaBsNdTpwHLgKJ6guRWxRtC9H+138UwpaGuQO9uWQ== + dependencies: + debug "~4.1.0" + engine.io "~3.5.0" + has-binary2 "~1.0.2" + socket.io-adapter "~1.1.0" + socket.io-client "2.4.0" + socket.io-parser "~3.4.0" + +socket.io@^2.3.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.4.1.tgz#95ad861c9a52369d7f1a68acf0d4a1b16da451d2" + integrity sha512-Si18v0mMXGAqLqCVpTxBa8MGqriHGQh8ccEOhmsmNS3thNCGBwO8WGrwMibANsWtQQ5NStdZwHqZR3naJVFc3w== + dependencies: + debug "~4.1.0" + engine.io "~3.5.0" + has-binary2 "~1.0.2" + socket.io-adapter "~1.1.0" + socket.io-client "2.4.0" + socket.io-parser "~3.4.0" + +sockjs-client@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.4.0.tgz#c9f2568e19c8fd8173b4997ea3420e0bb306c7d5" + integrity sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g== + dependencies: + 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" + +sockjs-client@^1.5.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.5.2.tgz#4bc48c2da9ce4769f19dc723396b50f5c12330a3" + integrity sha512-ZzRxPBISQE7RpzlH4tKJMQbHM9pabHluk0WBaxAQ+wm/UieeBVBou0p4wVnSQGN9QmpAZygQ0cDIypWuqOFmFQ== + dependencies: + debug "^3.2.6" + eventsource "^1.0.7" + faye-websocket "^0.11.3" + inherits "^2.0.4" + json3 "^3.3.3" + url-parse "^1.5.3" + +sockjs@0.3.20: + version "0.3.20" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.20.tgz#b26a283ec562ef8b2687b44033a4eeceac75d855" + integrity sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA== + dependencies: + faye-websocket "^0.10.0" + uuid "^3.4.0" + websocket-driver "0.6.5" + +sockjs@^0.3.21: + version "0.3.24" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" + integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== + dependencies: + faye-websocket "^0.11.3" + uuid "^8.3.2" + websocket-driver "^0.7.4" + +socks-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz#032fb583048a29ebffec2e6a73fca0761f48177e" + integrity sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ== + dependencies: + agent-base "^6.0.2" + debug "4" + socks "^2.3.3" + +socks@^2.3.3: + version "2.6.1" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.6.1.tgz#989e6534a07cf337deb1b1c94aaa44296520d30e" + integrity sha512-kLQ9N5ucj8uIcxrDwjm0Jsqk06xdpBjGNQtpXy4Q8/QY2k+fY7nZH8CARy+hkbG+SGAovmzzuauCpBlb8FrnBA== + dependencies: + ip "^1.1.5" + smart-buffer "^4.1.0" + +sort-keys@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" + integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= + dependencies: + is-plain-obj "^1.0.0" + +sortablejs@1.13.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/sortablejs/-/sortablejs-1.13.0.tgz#3ab2473f8c69ca63569e80b1cd1b5669b51269e9" + integrity sha512-RBJirPY0spWCrU5yCmWM1eFs/XgX2J5c6b275/YyxFRgnzPhKl/TDeU2hNR8Dt7ITq66NRPM4UlOt+e5O4CFHg== + +source-list-map@^2.0.0, source-list-map@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map-js@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.1.tgz#a1741c131e3c77d048252adfa24e23b908670caf" + integrity sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA== + +source-map-loader@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-1.0.2.tgz#b0a6582b2eaa387ede1ecf8061ae0b93c23f9eb0" + integrity sha512-oX8d6ndRjN+tVyjj6PlXSyFPhDdVAPsZA30nD3/II8g4uOv8fCz0DMn5sy8KtVbDfKQxOpGwGJnK3xIW3tauDw== + dependencies: + data-urls "^2.0.0" + iconv-lite "^0.6.2" + loader-utils "^2.0.0" + schema-utils "^2.7.0" + source-map "^0.6.1" + +source-map-loader@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-1.1.3.tgz#7dbc2fe7ea09d3e43c51fd9fc478b7f016c1f820" + integrity sha512-6YHeF+XzDOrT/ycFJNI53cgEsp/tHTMl37hi7uVyqFAlTXW109JazaQCkbc+jjoL2637qkH1amLi+JzrIpt5lA== + dependencies: + abab "^2.0.5" + iconv-lite "^0.6.2" + loader-utils "^2.0.0" + schema-utils "^3.0.0" + source-map "^0.6.1" + whatwg-mimetype "^2.3.0" + +source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + 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-resolve@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.6.0.tgz#3d9df87e236b53f16d01e58150fc7711138e5ed2" + integrity sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + +source-map-support@0.5.19: + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-support@^0.5.17, source-map-support@^0.5.5, source-map-support@~0.5.12, source-map-support@~0.5.19, source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-support@~0.4.0: + version "0.4.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== + dependencies: + source-map "^0.5.6" + +source-map-url@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" + integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== + +source-map@0.5.6: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" + integrity sha1-dc449SvwczxafwwRjYEzSiu19BI= + +source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@0.7.3, source-map@^0.7.3, source-map@~0.7.2: + version "0.7.3" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== + +source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +sourcemap-codec@^1.4.4, sourcemap-codec@^1.4.8: + version "1.4.8" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + 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" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +speed-measure-webpack-plugin@1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.3.3.tgz#6ff894fc83e8a6310dde3af863a0329cd79da4f5" + integrity sha512-2ljD4Ch/rz2zG3HsLsnPfp23osuPBS0qPuz9sGpkNXTN1Ic4M+W9xB8l8rS8ob2cO4b1L+WTJw/0AJwWYVgcxQ== + dependencies: + chalk "^2.0.1" + +speed-measure-webpack-plugin@1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.4.2.tgz#1608e62d3bdb45f01810010e1b5bfedefedfa58f" + integrity sha512-AtVzD0bnIy2/B0fWqJpJgmhcrfWFhBlduzSo0uwplr/QvB33ZNZj2NEth3NONgdnZJqicK0W0mSxnLSbsVCDbw== + dependencies: + chalk "^4.1.0" + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +sprintf-js@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" + integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +sshpk@^1.14.1, sshpk@^1.7.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + dependencies: + 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@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5" + integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q== + dependencies: + figgy-pudding "^3.5.1" + +ssri@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-7.1.1.tgz#33e44f896a967158e3c63468e47ec46613b95b5f" + integrity sha512-w+daCzXN89PseTL99MkA+fxJEcU3wfaE/ah0i0lnOlpG1CYLJ2ZjzEry68YBKfLs4JfoTShrTEsJkAZuNZ/stw== + dependencies: + figgy-pudding "^3.5.1" + minipass "^3.1.1" + +ssri@^8.0.0, ssri@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" + integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== + dependencies: + minipass "^3.1.1" + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +stackframe@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.2.0.tgz#52429492d63c62eb989804c11552e3d22e779303" + integrity sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA== + +stacktrace-gps@^3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/stacktrace-gps/-/stacktrace-gps-3.0.4.tgz#7688dc2fc09ffb3a13165ebe0dbcaf41bcf0c69a" + integrity sha512-qIr8x41yZVSldqdqe6jciXEaSCKw1U8XTXpjDuy0ki/apyTn/r3w9hDAAQOhZdxvsC93H+WwwEu5cq5VemzYeg== + dependencies: + source-map "0.5.6" + stackframe "^1.1.1" + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +statuses@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" + integrity sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4= + +statuses@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== + +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + dependencies: + 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@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== + +stream-throttle@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/stream-throttle/-/stream-throttle-0.1.3.tgz#add57c8d7cc73a81630d31cd55d3961cfafba9c3" + integrity sha1-rdV8jXzHOoFjDTHNVdOWHPr7qcM= + dependencies: + commander "^2.2.0" + limiter "^1.0.5" + +streamroller@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-2.2.4.tgz#c198ced42db94086a6193608187ce80a5f2b0e53" + integrity sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ== + dependencies: + date-format "^2.1.0" + debug "^4.1.1" + fs-extra "^8.1.0" + +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= + +string-replace-loader@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/string-replace-loader/-/string-replace-loader-2.3.0.tgz#7f29be7d73c94dd92eccd5c5a15651181d7ecd3d" + integrity sha512-HYBIHStViMKLZC/Lehxy42OuwsBaPzX/LjcF5mkJlE2SnHXmW6SW6eiHABTXnY8ZCm/REbdJ8qnA0ptmIzN0Ng== + dependencies: + loader-utils "^1.2.3" + schema-utils "^2.6.5" + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string_decoder@^1.0.0, string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" + integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== + dependencies: + ansi-regex "^6.0.1" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +style-loader@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.2.1.tgz#c5cbbfbf1170d076cfdd86e0109c5bba114baa1a" + integrity sha512-ByHSTQvHLkWE9Ir5+lGbVOXhxX10fbprhLvdg96wedFZb4NDekDPxVKv5Fwmio+QcMlkkNfuK+5W1peQ5CUhZg== + dependencies: + loader-utils "^2.0.0" + schema-utils "^2.6.6" + +style-loader@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-2.0.0.tgz#9669602fd4690740eaaec137799a03addbbc393c" + integrity sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +stylehacks@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" + integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g== + dependencies: + browserslist "^4.0.0" + postcss "^7.0.0" + postcss-selector-parser "^3.0.0" + +stylehacks@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.0.1.tgz#323ec554198520986806388c7fdaebc38d2c06fb" + integrity sha512-Es0rVnHIqbWzveU1b24kbw92HsebBepxfcqe5iix7t9j0PQqhs0IxXVXv0pY2Bxa08CgMkzD6OWql7kbGOuEdA== + dependencies: + browserslist "^4.16.0" + postcss-selector-parser "^6.0.4" + +stylus-loader@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/stylus-loader/-/stylus-loader-3.0.2.tgz#27a706420b05a38e038e7cacb153578d450513c6" + integrity sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA== + dependencies: + loader-utils "^1.0.2" + lodash.clonedeep "^4.5.0" + when "~3.6.x" + +stylus-loader@4.3.3: + version "4.3.3" + resolved "https://registry.yarnpkg.com/stylus-loader/-/stylus-loader-4.3.3.tgz#381bb6341272ac50bcdfd0b877707eac99b6b757" + integrity sha512-PpWB5PnCXUzW4WMYhCvNzAHJBjIBPMXwsdfkkKuA9W7k8OQFMl/19/AQvaWsxz2IptxUlCseyJ6TY/eEKJ4+UQ== + dependencies: + fast-glob "^3.2.4" + klona "^2.0.4" + loader-utils "^2.0.0" + normalize-path "^3.0.0" + schema-utils "^3.0.0" + +stylus@0.54.8: + version "0.54.8" + resolved "https://registry.yarnpkg.com/stylus/-/stylus-0.54.8.tgz#3da3e65966bc567a7b044bfe0eece653e099d147" + integrity sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg== + dependencies: + css-parse "~2.0.0" + debug "~3.1.0" + glob "^7.1.6" + mkdirp "~1.0.4" + safer-buffer "^2.1.2" + sax "~1.2.4" + semver "^6.3.0" + source-map "^0.7.3" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + +supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +svgo@^1.0.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" + integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== + dependencies: + 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" + +svgo@^2.7.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" + integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== + dependencies: + "@trysound/sax" "0.2.0" + commander "^7.2.0" + css-select "^4.1.3" + css-tree "^1.1.3" + csso "^4.2.0" + picocolors "^1.0.0" + stable "^0.1.8" + +symbol-observable@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" + integrity sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ= + +symbol-observable@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-3.0.0.tgz#eea8f6478c651018e059044268375c408c15c533" + integrity sha512-6tDOXSHiVjuCaasQSWTmHUWn4PuG7qa3+1WT031yTc/swT7+rLiw3GOrFxaH1E3lLP09dH3bVuVDf2gK5rxG3Q== + +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +tapable@^1.0.0, tapable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +tar@^6.0.2, tar@^6.1.0: + version "6.1.11" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" + integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== + dependencies: + 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" + +terser-webpack-plugin@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-4.1.0.tgz#6e9d6ae4e1a900d88ddce8da6a47507ea61f44bc" + integrity sha512-0ZWDPIP8BtEDZdChbufcXUigOYk6dOX/P/X0hWxqDDcVAQLb8Yy/0FAaemSfax3PAA67+DJR778oz8qVbmy4hA== + dependencies: + cacache "^15.0.5" + find-cache-dir "^3.3.1" + jest-worker "^26.3.0" + p-limit "^3.0.2" + schema-utils "^2.6.6" + serialize-javascript "^4.0.0" + source-map "^0.6.1" + terser "^5.0.0" + webpack-sources "^1.4.3" + +terser-webpack-plugin@4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz#28daef4a83bd17c1db0297070adc07fc8cfc6a9a" + integrity sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ== + dependencies: + cacache "^15.0.5" + find-cache-dir "^3.3.1" + jest-worker "^26.5.0" + p-limit "^3.0.2" + schema-utils "^3.0.0" + serialize-javascript "^5.0.1" + source-map "^0.6.1" + terser "^5.3.4" + webpack-sources "^1.4.3" + +terser-webpack-plugin@^1.4.3: + version "1.4.5" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" + integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw== + dependencies: + 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" + +terser-webpack-plugin@^2.3.1: + version "2.3.8" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.3.8.tgz#894764a19b0743f2f704e7c2a848c5283a696724" + integrity sha512-/fKw3R+hWyHfYx7Bv6oPqmk4HGQcrWLtV3X6ggvPuwPNHSnzvVV51z6OaaCOus4YLjutYGOz3pEpbhe6Up2s1w== + dependencies: + cacache "^13.0.1" + find-cache-dir "^3.3.1" + jest-worker "^25.4.0" + p-limit "^2.3.0" + schema-utils "^2.6.6" + serialize-javascript "^4.0.0" + source-map "^0.6.1" + terser "^4.6.12" + webpack-sources "^1.4.3" + +terser@5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.3.0.tgz#c481f4afecdcc182d5e2bdd2ff2dc61555161e81" + integrity sha512-XTT3D3AwxC54KywJijmY2mxZ8nJiEjBHVYzq8l9OaYuRFWeQNBwvipuzzYEP4e+/AVcd1hqG/CqgsdIRyT45Fg== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +terser@5.5.1: + version "5.5.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.5.1.tgz#540caa25139d6f496fdea056e414284886fb2289" + integrity sha512-6VGWZNVP2KTUcltUQJ25TtNjx/XgdDsBDKGt8nN0MpydU36LmbPPcMBd2kmtZNNGVVDLg44k7GKeHHj+4zPIBQ== + dependencies: + commander "^2.20.0" + source-map "~0.7.2" + source-map-support "~0.5.19" + +terser@^4.1.2, terser@^4.6.12, terser@^4.6.3: + version "4.8.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" + integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +terser@^5.0.0, terser@^5.3.4: + version "5.10.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.10.0.tgz#b86390809c0389105eb0a0b62397563096ddafcc" + integrity sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA== + dependencies: + commander "^2.20.0" + source-map "~0.7.2" + source-map-support "~0.5.20" + +text-mask-core@^5.0.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/text-mask-core/-/text-mask-core-5.1.2.tgz#80dd5ebe04825757e46619e691407a9f8b3c1b6f" + integrity sha1-gN1evgSCV1fkZhnmkUB6n4s8G28= + +text-table@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +tfunk@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/tfunk/-/tfunk-4.0.0.tgz#de9399feaf2060901d590b7faad80fcd5443077e" + integrity sha512-eJQ0dGfDIzWNiFNYFVjJ+Ezl/GmwHaFTBTjrtqNPW0S7cuVDBrZrmzUz6VkMeCR4DZFqhd4YtLwsw3i2wYHswQ== + dependencies: + chalk "^1.1.3" + dlv "^1.1.3" + +throttle-debounce@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-2.3.0.tgz#fd31865e66502071e411817e241465b3e9c372e2" + integrity sha512-H7oLPV0P7+jgvrk+6mwwwBDmxTaxnu9HMXmloNLXwnNO0ZxZ31Orah2n8lU1eMPvsaowP2CX+USCgyovXfdOFQ== + +throttleit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" + integrity sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw= + +through2@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +through@X.X.X, through@^2.3.6, through@^2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +timers-browserify@^2.0.4: + version "2.0.12" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" + integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== + dependencies: + setimmediate "^1.0.4" + +timsort@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" + integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= + +tiny-invariant@^1.0.6: + version "1.2.0" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.2.0.tgz#a1141f86b672a9148c72e978a19a73b9b94a15a9" + integrity sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg== + +tiny-warning@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== + +tmp@0.0.30: + version "0.0.30" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.30.tgz#72419d4a8be7d6ce75148fd8b324e593a711c2ed" + integrity sha1-ckGdSovn1s51FI/YsyTlk6cRwu0= + dependencies: + os-tmpdir "~1.0.1" + +tmp@0.2.1, tmp@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +to-array@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" + integrity sha1-F+bBH3PdTz10zaek/zI46a2b+JA= + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-readable-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" + integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +toggle-selection@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" + integrity sha1-bkWxJj8gF/oKzH2J14sVuL932jI= + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +totalist@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/totalist/-/totalist-1.1.0.tgz#a4d65a3e546517701e3e5c37a47a70ac97fe56df" + integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g== + +touch@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" + integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== + dependencies: + nopt "~1.0.10" + +tough-cookie@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" + integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.1.2" + +tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tr46@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" + integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== + dependencies: + punycode "^2.1.1" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + +tree-kill@1.2.2, tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + +ts-loader@^5.2.0: + version "5.4.5" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-5.4.5.tgz#a0c1f034b017a9344cef0961bfd97cc192492b8b" + integrity sha512-XYsjfnRQCBum9AMRZpk2rTYSVpdZBpZK+kDh0TeT3kxmQNBDVIeUjdPjY5RZry4eIAb8XHc4gYSUiUWPYvzSRw== + dependencies: + chalk "^2.3.0" + enhanced-resolve "^4.0.0" + loader-utils "^1.0.2" + micromatch "^3.1.4" + semver "^5.0.1" + +ts-node@^8.10.2: + version "8.10.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.10.2.tgz#eee03764633b1234ddd37f8db9ec10b75ec7fb8d" + integrity sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA== + dependencies: + arg "^4.1.0" + diff "^4.0.1" + make-error "^1.1.1" + source-map-support "^0.5.17" + yn "3.1.1" + +ts-node@^9.0.0: + version "9.1.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.1.1.tgz#51a9a450a3e959401bda5f004a72d54b936d376d" + integrity sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg== + dependencies: + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + source-map-support "^0.5.17" + yn "3.1.1" + +ts-pnp@^1.1.6: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" + integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== + +tslib@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.1.tgz#410eb0d113e5b6356490eec749603725b021b43e" + integrity sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ== + +tslib@2.1.0, tslib@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" + integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== + +tslib@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e" + integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== + +tslib@^1.10.0, tslib@^1.13.0, tslib@^1.8.1, tslib@^1.9.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.0.0, tslib@^2.0.3: + version "2.3.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== + +tslint@^6.1.3: + version "6.1.3" + resolved "https://registry.yarnpkg.com/tslint/-/tslint-6.1.3.tgz#5c23b2eccc32487d5523bd3a470e9aa31789d904" + integrity sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg== + dependencies: + "@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.13.0" + tsutils "^2.29.0" + +tsutils@^2.29.0: + version "2.29.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" + integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== + dependencies: + tslib "^1.8.1" + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +type@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== + +type@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/type/-/type-2.5.0.tgz#0a2e78c2e77907b252abe5f298c1b01c63f0db3d" + integrity sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw== + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +typescript-compare@^0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/typescript-compare/-/typescript-compare-0.0.2.tgz#7ee40a400a406c2ea0a7e551efd3309021d5f425" + integrity sha512-8ja4j7pMHkfLJQO2/8tut7ub+J3Lw2S3061eJLFQcvs3tsmJKp8KG5NtpLn7KcY2w08edF74BSVN7qJS0U6oHA== + dependencies: + typescript-logic "^0.0.0" + +typescript-logic@^0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/typescript-logic/-/typescript-logic-0.0.0.tgz#66ebd82a2548f2b444a43667bec120b496890196" + integrity sha512-zXFars5LUkI3zP492ls0VskH3TtdeHCqu0i7/duGt60i5IGPIpAHE/DWo5FqJ6EjQ15YKXrt+AETjv60Dat34Q== + +typescript-tuple@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/typescript-tuple/-/typescript-tuple-2.2.1.tgz#7d9813fb4b355f69ac55032e0363e8bb0f04dad2" + integrity sha512-Zcr0lbt8z5ZdEzERHAMAniTiIKerFCMgd7yjq1fPnDJ43et/k9twIFQMUYff9k5oXcsQ0WpvFcgzK2ZKASoW6Q== + dependencies: + typescript-compare "^0.0.2" + +typescript@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.0.2.tgz#7ea7c88777c723c681e33bf7988be5d008d05ac2" + integrity sha512-e4ERvRV2wb+rRZ/IQeb3jm2VxBsirQLpQhdxplZ2MEzGvDkkMmPglecnNDfSUBivMjP93vRbngYYDQqQ/78bcQ== + +typescript@4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.5.tgz#123a3b214aaff3be32926f0d8f1f6e704eb89a72" + integrity sha512-6OSu9PTIzmn9TCDiovULTnET6BgXtDYL4Gg4szY+cGsc3JP1dQL8qvE8kShTRx1NIw4Q9IBHlwODjkjWEtMUyA== + +typescript@^2.5.0: + version "2.9.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.9.2.tgz#1cbf61d05d6b96269244eb6a3bce4bd914e0f00c" + integrity sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w== + +typescript@~4.0.5: + version "4.0.8" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.0.8.tgz#5739105541db80a971fdbd0d56511d1a6f17d37f" + integrity sha512-oz1765PN+imfz1MlZzSZPtC/tqcwsCyIYA8L47EkRnRW97ztRk83SzMiWLrnChC0vqoYxSU1fcFUDA5gV/ZiPg== + +ua-parser-js@0.7.22: + version "0.7.22" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.22.tgz#960df60a5f911ea8f1c818f3747b99c6e177eae3" + integrity sha512-YUxzMjJ5T71w6a8WWVcMGM6YWOTX27rCoIQgLXiWaxqXSx9D7DNjiGWn1aJIRSQ5qr0xuhra77bSIh6voR/46Q== + +ua-parser-js@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.2.tgz#e2976c34dbfb30b15d2c300b2a53eac87c57a775" + integrity sha512-00y/AXhx0/SsnI51fTc0rLRmafiGOM4/O+ny10Ps7f+j/b8p/ZY11ytMgznXkOVo4GQ+KwQG5UQLkLGirsACRg== + +unbox-primitive@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" + +undefsafe@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" + integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== + +unfetch@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.2.0.tgz#7e21b0ef7d363d8d9af0fb929a5555f6ef97a3be" + integrity sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA== + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" + integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" + integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + +uniqs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" + integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + +universal-analytics@0.4.23: + version "0.4.23" + resolved "https://registry.yarnpkg.com/universal-analytics/-/universal-analytics-0.4.23.tgz#d915e676850c25c4156762471bdd7cf2eaaca8ac" + integrity sha512-lgMIH7XBI6OgYn1woDEmxhGdj8yDefMKg7GkWdeATAlQZFrMrNyxSkpDzY57iY0/6fdlzTbBV03OawvvzG+q7A== + dependencies: + debug "^4.1.1" + request "^2.88.2" + uuid "^3.0.0" + +universalify@^0.1.0, universalify@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +untildify@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" + integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== + +upath@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +update-notifier@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.1.0.tgz#4ab0d7c7f36a231dd7316cf7729313f0214d9ad9" + integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw== + dependencies: + boxen "^5.0.0" + chalk "^4.1.0" + configstore "^5.0.1" + has-yarn "^2.1.0" + import-lazy "^2.1.0" + is-ci "^2.0.0" + is-installed-globally "^0.4.0" + is-npm "^5.0.0" + is-yarn-global "^0.3.0" + latest-version "^5.1.0" + pupa "^2.1.1" + semver "^7.3.4" + semver-diff "^3.1.1" + xdg-basedir "^4.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url-parse-lax@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" + integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= + dependencies: + prepend-http "^2.0.0" + +url-parse@^1.4.3, url-parse@^1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.3.tgz#71c1303d38fb6639ade183c2992c8cc0686df862" + integrity sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use-memo-one@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/use-memo-one/-/use-memo-one-1.1.2.tgz#0c8203a329f76e040047a35a1197defe342fab20" + integrity sha512-u2qFKtxLsia/r8qG0ZKkbytbztzRb317XCkT7yP8wxL0tZ/CzK2G+WWie5vWvpyeP7+YoPIwbJoIHJ4Ba4k0oQ== + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util.promisify@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + +util.promisify@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" + integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.2" + has-symbols "^1.0.1" + object.getownpropertydescriptors "^2.1.0" + +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + +utila@~0.4: + version "0.4.0" + resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw= + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + +uuid@8.3.2, uuid@^8.1.0, uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +uuid@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" + integrity sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho= + +uuid@^3.0.0, uuid@^3.2.1, uuid@^3.3.2, uuid@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +validate-npm-package-name@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" + integrity sha1-X6kS2B630MdK/BQN5zF/DKffQ34= + dependencies: + builtins "^1.0.3" + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + +vendors@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" + integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + +void-elements@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" + integrity sha1-YU9/v42AHwu18GYfWy9XhXUOTwk= + +void-elements@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" + integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w= + +w3c-hr-time@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== + dependencies: + browser-process-hrtime "^1.0.0" + +w3c-xmlserializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" + integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== + dependencies: + xml-name-validator "^3.0.0" + +watchpack-chokidar2@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957" + integrity sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww== + dependencies: + chokidar "^2.1.8" + +watchpack@^1.7.4: + version "1.7.5" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453" + integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ== + dependencies: + graceful-fs "^4.1.2" + neo-async "^2.5.0" + optionalDependencies: + chokidar "^3.4.1" + watchpack-chokidar2 "^2.0.1" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= + dependencies: + defaults "^1.0.3" + +webdriver-js-extender@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz#57d7a93c00db4cc8d556e4d3db4b5db0a80c3bb7" + integrity sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ== + dependencies: + "@types/selenium-webdriver" "^3.0.0" + selenium-webdriver "^3.0.1" + +webdriver-manager@^12.1.7, webdriver-manager@^12.1.8: + version "12.1.8" + resolved "https://registry.yarnpkg.com/webdriver-manager/-/webdriver-manager-12.1.8.tgz#5e70e73eaaf53a0767d5745270addafbc5905fd4" + integrity sha512-qJR36SXG2VwKugPcdwhaqcLQOD7r8P2Xiv9sfNbfZrKBnX243iAkOueX1yAmeNgIKhJ3YAT/F2gq6IiEZzahsg== + dependencies: + adm-zip "^0.4.9" + chalk "^1.1.1" + del "^2.2.0" + glob "^7.0.3" + ini "^1.3.4" + minimist "^1.2.0" + q "^1.4.1" + request "^2.87.0" + rimraf "^2.5.2" + semver "^5.3.0" + xml2js "^0.4.17" + +webfontloader@1.6.28: + version "1.6.28" + resolved "https://registry.yarnpkg.com/webfontloader/-/webfontloader-1.6.28.tgz#db786129253cb6e8eae54c2fb05f870af6675bae" + integrity sha1-23hhKSU8tujq5UwvsF+HCvZnW64= + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + +webidl-conversions@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" + integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== + +webidl-conversions@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" + integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== + +webpack-bundle-analyzer@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz#1b0eea2947e73528754a6f9af3e91b2b6e0f79d5" + integrity sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ== + dependencies: + acorn "^8.0.4" + acorn-walk "^8.0.0" + chalk "^4.1.0" + commander "^7.2.0" + gzip-size "^6.0.0" + lodash "^4.17.20" + opener "^1.5.2" + sirv "^1.0.7" + ws "^7.3.1" + +webpack-cli@^4.2.0: + version "4.9.1" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.9.1.tgz#b64be825e2d1b130f285c314caa3b1ba9a4632b3" + integrity sha512-JYRFVuyFpzDxMDB+v/nanUdQYcZtqFPGzmlW4s+UkPMFhSpfRNmf1z4AwYcHJVdvEFAM7FFCQdNTpsBYhDLusQ== + dependencies: + "@discoveryjs/json-ext" "^0.5.0" + "@webpack-cli/configtest" "^1.1.0" + "@webpack-cli/info" "^1.4.0" + "@webpack-cli/serve" "^1.6.0" + colorette "^2.0.14" + commander "^7.0.0" + execa "^5.0.0" + fastest-levenshtein "^1.0.12" + import-local "^3.0.2" + interpret "^2.2.0" + rechoir "^0.7.0" + webpack-merge "^5.7.3" + +webpack-dev-middleware@3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz#0019c3db716e3fa5cecbf64f2ab88a74bab331f3" + integrity sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw== + dependencies: + memory-fs "^0.4.1" + mime "^2.4.4" + mkdirp "^0.5.1" + range-parser "^1.2.1" + webpack-log "^2.0.0" + +webpack-dev-middleware@^3.7.2: + version "3.7.3" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz#0639372b143262e2b84ab95d3b91a7597061c2c5" + integrity sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ== + dependencies: + memory-fs "^0.4.1" + mime "^2.4.4" + mkdirp "^0.5.1" + range-parser "^1.2.1" + webpack-log "^2.0.0" + +webpack-dev-middleware@^5.2.1: + version "5.2.2" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.2.2.tgz#eb5193faa5479ca1086b9f7bed68b89c731bff62" + integrity sha512-DjZyYrsHhkikAFNvSNKrpnziXukU1EChFAh9j4LAm6ndPLPW8cN0KhM7T+RAiOqsQ6ABfQ8hoKIs9IWMTjov+w== + dependencies: + colorette "^2.0.10" + memfs "^3.2.2" + mime-types "^2.1.31" + range-parser "^1.2.1" + schema-utils "^4.0.0" + +webpack-dev-server@3.11.0: + version "3.11.0" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz#8f154a3bce1bcfd1cc618ef4e703278855e7ff8c" + integrity sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg== + dependencies: + 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" + +webpack-dev-server@3.11.2: + version "3.11.2" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz#695ebced76a4929f0d5de7fd73fafe185fe33708" + integrity sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ== + dependencies: + 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.8" + semver "^6.3.0" + serve-index "^1.9.1" + sockjs "^0.3.21" + sockjs-client "^1.5.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" + +webpack-dev-server@^4.5.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.6.0.tgz#e8648601c440172d9b6f248d28db98bed335315a" + integrity sha512-oojcBIKvx3Ya7qs1/AVWHDgmP1Xml8rGsEBnSobxU/UJSX1xP1GPM3MwsAnDzvqcVmVki8tV7lbcsjEjk0PtYg== + dependencies: + ansi-html-community "^0.0.8" + bonjour "^3.5.0" + chokidar "^3.5.2" + colorette "^2.0.10" + compression "^1.7.4" + connect-history-api-fallback "^1.6.0" + default-gateway "^6.0.3" + del "^6.0.0" + express "^4.17.1" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.0" + ipaddr.js "^2.0.1" + open "^8.0.9" + p-retry "^4.5.0" + portfinder "^1.0.28" + schema-utils "^4.0.0" + selfsigned "^1.10.11" + serve-index "^1.9.1" + sockjs "^0.3.21" + spdy "^4.0.2" + strip-ansi "^7.0.0" + url "^0.11.0" + webpack-dev-middleware "^5.2.1" + ws "^8.1.0" + +webpack-log@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" + integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== + dependencies: + ansi-colors "^3.0.0" + uuid "^3.3.2" + +webpack-merge@4.2.2, webpack-merge@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d" + integrity sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g== + dependencies: + lodash "^4.17.15" + +webpack-merge@5.7.3: + version "5.7.3" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.7.3.tgz#2a0754e1877a25a8bbab3d2475ca70a052708213" + integrity sha512-6/JUQv0ELQ1igjGDzHkXbVDRxkfA57Zw7PfiupdLFJYrgFqY5ZP8xxbpp2lU3EPwYx89ht5Z/aDkD40hFCm5AA== + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" + +webpack-merge@^5.7.3: + version "5.8.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" + integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" + +webpack-sources@1.4.3, webpack-sources@^1.1.0, webpack-sources@^1.2.0, webpack-sources@^1.3.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack-sources@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-2.2.0.tgz#058926f39e3d443193b6c31547229806ffd02bac" + integrity sha512-bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w== + dependencies: + source-list-map "^2.0.1" + source-map "^0.6.1" + +webpack-subresource-integrity@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/webpack-subresource-integrity/-/webpack-subresource-integrity-1.4.1.tgz#e8bf918b444277df46a66cd84542cbcdc5a6272d" + integrity sha512-XMLFInbGbB1HV7K4vHWANzc1CN0t/c4bBvnlvGxGwV45yE/S/feAXIm8dJsCkzqWtSKnmaEgTp/meyeThxG4Iw== + dependencies: + webpack-sources "^1.3.0" + +webpack-subresource-integrity@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/webpack-subresource-integrity/-/webpack-subresource-integrity-1.5.2.tgz#e40b6578d3072e2d24104975249c52c66e9a743e" + integrity sha512-GBWYBoyalbo5YClwWop9qe6Zclp8CIXYGIz12OPclJhIrSplDxs1Ls1JDMH8xBPPrg1T6ISaTW9Y6zOrwEiAzw== + dependencies: + webpack-sources "^1.3.0" + +webpack@4.44.1: + version "4.44.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.44.1.tgz#17e69fff9f321b8f117d1fda714edfc0b939cc21" + integrity sha512-4UOGAohv/VGUNQJstzEywwNxqX417FnjZgZJpJQegddzPmTvph37eBIRbRTfdySXzVtJXLJfbMN3mMYhM6GdmQ== + dependencies: + "@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.3.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.7.4" + webpack-sources "^1.4.1" + +webpack@4.44.2: + version "4.44.2" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.44.2.tgz#6bfe2b0af055c8b2d1e90ed2cd9363f841266b72" + integrity sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q== + dependencies: + "@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.3.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.7.4" + webpack-sources "^1.4.1" + +webpack@^4.44.2: + version "4.46.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.46.0.tgz#bf9b4404ea20a073605e0a011d188d77cb6ad542" + integrity sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q== + dependencies: + "@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.5.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.7.4" + webpack-sources "^1.4.1" + +websocket-driver@0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36" + integrity sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY= + dependencies: + websocket-extensions ">=0.1.1" + +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + +whatwg-encoding@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-mimetype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +whatwg-url@^8.0.0, whatwg-url@^8.5.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" + integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== + dependencies: + lodash "^4.7.0" + tr46 "^2.1.0" + webidl-conversions "^6.1.0" + +when@~3.6.x: + version "3.6.4" + resolved "https://registry.yarnpkg.com/when/-/when-3.6.4.tgz#473b517ec159e2b85005497a13983f095412e34e" + integrity sha1-RztRfsFZ4rhQBUl6E5g/CVQS404= + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@^1.2.1, which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1, which@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + +wildcard@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" + integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== + +word-wrap@~1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +worker-farm@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== + dependencies: + errno "~0.1.7" + +worker-plugin@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/worker-plugin/-/worker-plugin-5.0.0.tgz#113b5fe1f4a5d6a957cecd29915bedafd70bb537" + integrity sha512-AXMUstURCxDD6yGam2r4E34aJg6kW85IiaeX72hi+I1cxyaMUtrvVY6sbfpGKAj5e7f68Acl62BjQF5aOOx2IQ== + dependencies: + loader-utils "^1.1.0" + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +ws@^6.2.1: + version "6.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" + integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== + dependencies: + async-limiter "~1.0.0" + +ws@^7.3.1, ws@^7.4.6: + version "7.5.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.6.tgz#e59fc509fb15ddfb65487ee9765c5a51dec5fe7b" + integrity sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA== + +ws@^8.1.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.3.0.tgz#7185e252c8973a60d57170175ff55fdbd116070d" + integrity sha512-Gs5EZtpqZzLvmIM59w4igITU57lrtYVFneaa434VROv4thzJyV6UjIL3D42lslWlI+D4KzLYnxSwtfuiO79sNw== + +ws@~7.4.2: + version "7.4.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== + +xdg-basedir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" + integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== + +xhr2@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/xhr2/-/xhr2-0.2.1.tgz#4e73adc4f9cfec9cbd2157f73efdce3a5f108a93" + integrity sha512-sID0rrVCqkVNUn8t6xuv9+6FViXjUVXq8H5rWOH2rz9fDNQEd4g0EA2XlcEdJXRz5BMEn4O1pJFdT+z4YHhoWw== + +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + +xml2js@^0.4.17: + version "0.4.23" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" + integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" + +xmlbuilder@~11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +xmlhttprequest-ssl@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz#03b713873b01659dfa2c1c5d056065b27ddc2de6" + integrity sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q== + +xtend@^4.0.0, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs@17.1.1: + version "17.1.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.1.1.tgz#c2a8091564bdb196f7c0a67c1d12e5b85b8067ba" + integrity sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yargs@^13.3.2: + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== + dependencies: + 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@^15.3.1, yargs@^15.4.1: + version "15.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.2" + +yargs@^16.0.0, yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + +yeast@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" + integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk= + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zone.js@^0.10.3, zone.js@~0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.10.3.tgz#3e5e4da03c607c9dcd92e37dd35687a14a140c16" + integrity sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg== From 107199eb8e474848e0ff634f5c65687837a62e63 Mon Sep 17 00:00:00 2001 From: Rezart Vata Date: Wed, 27 Apr 2022 13:40:33 +0200 Subject: [PATCH 070/343] [CST-5270] Finished unit testing --- .../section-sherpa-policies.service.mock.ts | 108 +++++++++++ .../content-accordion.component.spec.ts | 30 ++- .../metadata-information.component.spec.ts | 25 ++- .../publication-information.component.spec.ts | 26 ++- .../publisher-policy.component.spec.ts | 29 ++- .../section-sherpa-policies.component.spec.ts | 180 ++++++------------ 6 files changed, 263 insertions(+), 135 deletions(-) create mode 100644 src/app/shared/mocks/section-sherpa-policies.service.mock.ts diff --git a/src/app/shared/mocks/section-sherpa-policies.service.mock.ts b/src/app/shared/mocks/section-sherpa-policies.service.mock.ts new file mode 100644 index 0000000000..895e518d96 --- /dev/null +++ b/src/app/shared/mocks/section-sherpa-policies.service.mock.ts @@ -0,0 +1,108 @@ +import { WorkspaceitemSectionSherpaPoliciesObject } from './../../core/submission/models/workspaceitem-section-sherpa-policies.model'; +import { SubmissionFormsModel } from '../../core/config/models/config-submission-forms.model'; +import { of as observableOf } from 'rxjs'; + +export const dataRes = { + 'id': 'sherpaPolicies', + 'retrievalTime': '2022-04-20T09:44:39.870+00:00', + 'sherpaResponse': [ + { + 'error': false, + 'message': null, + 'metadata': { + 'id': 23803, + 'uri': 'http://v2.sherpa.ac.uk/id/publication/23803', + 'dateCreated': '2012-11-20 14:51:52', + 'dateModified': '2020-03-06 11:25:54', + 'inDOAJ': false, + 'publiclyVisible': true + }, + 'journals': [{ + 'titles': ['The Lancet', 'Lancet'], + 'url': 'http://www.thelancet.com/journals/lancet/issue/current', + 'issns': ['0140-6736', '1474-547X'], + 'romeoPub': 'Elsevier: The Lancet', + 'zetoPub': 'Elsevier: The Lancet', + 'publisher': { + 'name': 'Elsevier', + 'relationshipType': null, + 'country': null, + 'uri': 'http://www.elsevier.com/', + 'identifier': null, + 'publicationCount': 0, + 'paidAccessDescription': 'Open access', + 'paidAccessUrl': 'https://www.elsevier.com/about/open-science/open-access' + }, + 'publishers': [{ + 'name': 'Elsevier', + 'relationshipType': null, + 'country': null, + 'uri': 'http://www.elsevier.com/', + 'identifier': null, + 'publicationCount': 0, + 'paidAccessDescription': 'Open access', + 'paidAccessUrl': 'https://www.elsevier.com/about/open-science/open-access' + }], + 'policies': [{ + 'id': 0, + 'openAccessPermitted': false, + 'uri': null, + 'internalMoniker': 'Lancet', + 'permittedVersions': [{ + 'articleVersion': 'submitted', + 'option': 1, + 'conditions': ['Upon publication publisher copyright and source must be acknowledged', 'Upon publication must link to publisher version'], + 'prerequisites': [], + 'locations': ['Author\'s Homepage', 'Preprint Repository'], + 'licenses': [], + 'embargo': null + }, { + 'articleVersion': 'accepted', + 'option': 1, + 'conditions': ['Publisher copyright and source must be acknowledged', 'Must link to publisher version'], + 'prerequisites': [], + 'locations': ['Author\'s Homepage', 'Institutional Website'], + 'licenses': ['CC BY-NC-ND'], + 'embargo': null + }, { + 'articleVersion': 'accepted', + 'option': 2, + 'conditions': ['Publisher copyright and source must be acknowledged', 'Must link to publisher version'], + 'prerequisites': ['If Required by Funder'], + 'locations': ['Non-Commercial Repository'], + 'licenses': ['CC BY-NC-ND'], + 'embargo': null + }, { + 'articleVersion': 'accepted', + 'option': 3, + 'conditions': ['Publisher copyright and source must be acknowledged', 'Must link to publisher version'], + 'prerequisites': [], + 'locations': ['Non-Commercial Repository'], + 'licenses': [], + 'embargo': null + }], + 'urls': { + 'http://download.thelancet.com/flatcontentassets/authors/lancet-information-for-authors.pdf': 'Guidelines for Authors', + 'http://www.thelancet.com/journals/lancet/article/PIIS0140-6736%2813%2960720-5/fulltext': 'The Lancet journals welcome a new open access policy', + 'http://www.thelancet.com/lancet-information-for-authors/after-publication': 'What happens after publication?', + 'http://www.thelancet.com/lancet/information-for-authors/disclosure-of-results': 'Disclosure of results before publication', + 'https://www.elsevier.com/__data/assets/pdf_file/0005/78476/external-embargo-list.pdf': 'Journal Embargo Period List', + 'https://www.elsevier.com/__data/assets/pdf_file/0011/78473/UK-Embargo-Periods.pdf': 'Journal Embargo List for UK Authors' + }, + 'openAccessProhibited': false, + 'publicationCount': 0, + 'preArchiving': 'can', + 'postArchiving': 'can', + 'pubArchiving': 'cannot' + }], + 'inDOAJ': false + }] + } + ] +} as WorkspaceitemSectionSherpaPoliciesObject; + +export function getSherpaPoliciesData() { + return jasmine.createSpyObj('SectionAccessesService', { + getSherpaPoliciesData: observableOf(dataRes), + }); +} diff --git a/src/app/submission/sections/sherpa-policies/content-accordion/content-accordion.component.spec.ts b/src/app/submission/sections/sherpa-policies/content-accordion/content-accordion.component.spec.ts index 3b4d18a633..ec1180a6c9 100644 --- a/src/app/submission/sections/sherpa-policies/content-accordion/content-accordion.component.spec.ts +++ b/src/app/submission/sections/sherpa-policies/content-accordion/content-accordion.component.spec.ts @@ -1,25 +1,51 @@ +import { NgbAccordionModule } from '@ng-bootstrap/ng-bootstrap'; +import { TranslateLoaderMock } from './../../../../shared/testing/translate-loader.mock'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ContentAccordionComponent } from './content-accordion.component'; +import { dataRes } from './../../../../shared/mocks/section-sherpa-policies.service.mock'; +import { DebugElement } from '@angular/core'; +import { By } from '@angular/platform-browser'; +import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; describe('ContentAccordionComponent', () => { let component: ContentAccordionComponent; let fixture: ComponentFixture; + let de: DebugElement; beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ ContentAccordionComponent ] + imports: [ + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useClass: TranslateLoaderMock + } + }), + NgbAccordionModule + ], + declarations: [ContentAccordionComponent] }) - .compileComponents(); + .compileComponents(); }); beforeEach(() => { fixture = TestBed.createComponent(ContentAccordionComponent); component = fixture.componentInstance; + de = fixture.debugElement; + component.version = dataRes.sherpaResponse[0].journals[0].policies[0].permittedVersions[0]; fixture.detectChanges(); }); it('should create', () => { expect(component).toBeTruthy(); }); + + it('should show accordion', () => { + expect(de.query(By.css('ngb-accordion'))).toBeTruthy(); + }); + + it('should show 5 rows', () => { + expect(de.queryAll(By.css('.row')).length).toEqual(5); + }); }); diff --git a/src/app/submission/sections/sherpa-policies/metadata-information/metadata-information.component.spec.ts b/src/app/submission/sections/sherpa-policies/metadata-information/metadata-information.component.spec.ts index c1257fc802..b329fb1821 100644 --- a/src/app/submission/sections/sherpa-policies/metadata-information/metadata-information.component.spec.ts +++ b/src/app/submission/sections/sherpa-policies/metadata-information/metadata-information.component.spec.ts @@ -1,25 +1,46 @@ +import { TranslateLoaderMock } from './../../../../shared/testing/translate-loader.mock'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { MetadataInformationComponent } from './metadata-information.component'; +import { dataRes } from './../../../../shared/mocks/section-sherpa-policies.service.mock'; +import { DebugElement } from '@angular/core'; +import { By } from '@angular/platform-browser'; +import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; describe('MetadataInformationComponent', () => { let component: MetadataInformationComponent; let fixture: ComponentFixture; + let de: DebugElement; beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ MetadataInformationComponent ] + imports: [ + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useClass: TranslateLoaderMock + } + }), + ], + declarations: [MetadataInformationComponent] }) - .compileComponents(); + .compileComponents(); }); beforeEach(() => { fixture = TestBed.createComponent(MetadataInformationComponent); component = fixture.componentInstance; + de = fixture.debugElement; + component.metadata = dataRes.sherpaResponse[0].metadata; fixture.detectChanges(); }); it('should create', () => { expect(component).toBeTruthy(); }); + + it('should show 4 rows', () => { + expect(de.queryAll(By.css('.row')).length).toEqual(4); + }); + }); diff --git a/src/app/submission/sections/sherpa-policies/publication-information/publication-information.component.spec.ts b/src/app/submission/sections/sherpa-policies/publication-information/publication-information.component.spec.ts index 3f264df21f..e1acc016ab 100644 --- a/src/app/submission/sections/sherpa-policies/publication-information/publication-information.component.spec.ts +++ b/src/app/submission/sections/sherpa-policies/publication-information/publication-information.component.spec.ts @@ -1,25 +1,47 @@ +import { TranslateLoaderMock } from './../../../../shared/testing/translate-loader.mock'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { PublicationInformationComponent } from './publication-information.component'; +import { dataRes } from './../../../../shared/mocks/section-sherpa-policies.service.mock'; +import { DebugElement } from '@angular/core'; +import { By } from '@angular/platform-browser'; +import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; describe('PublicationInformationComponent', () => { let component: PublicationInformationComponent; let fixture: ComponentFixture; + let de: DebugElement; + beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ PublicationInformationComponent ] + imports: [ + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useClass: TranslateLoaderMock + } + }), + ], + declarations: [PublicationInformationComponent] }) - .compileComponents(); + .compileComponents(); }); beforeEach(() => { fixture = TestBed.createComponent(PublicationInformationComponent); component = fixture.componentInstance; + de = fixture.debugElement; + component.journal = dataRes.sherpaResponse[0].journals[0]; fixture.detectChanges(); }); it('should create', () => { expect(component).toBeTruthy(); }); + + it('should show 6 rows', () => { + expect(de.queryAll(By.css('.row')).length).toEqual(6); + }); + }); diff --git a/src/app/submission/sections/sherpa-policies/publisher-policy/publisher-policy.component.spec.ts b/src/app/submission/sections/sherpa-policies/publisher-policy/publisher-policy.component.spec.ts index 1821a97795..9ba77adf94 100644 --- a/src/app/submission/sections/sherpa-policies/publisher-policy/publisher-policy.component.spec.ts +++ b/src/app/submission/sections/sherpa-policies/publisher-policy/publisher-policy.component.spec.ts @@ -1,25 +1,50 @@ +import { TranslateLoaderMock } from './../../../../shared/testing/translate-loader.mock'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { PublisherPolicyComponent } from './publisher-policy.component'; +import { dataRes } from './../../../../shared/mocks/section-sherpa-policies.service.mock'; +import { By } from '@angular/platform-browser'; +import { DebugElement } from '@angular/core'; +import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; +import { getMockTranslateService } from '../../../../shared/mocks/translate.service.mock'; describe('PublisherPolicyComponent', () => { let component: PublisherPolicyComponent; let fixture: ComponentFixture; + let de: DebugElement; beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ PublisherPolicyComponent ] + imports: [ + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useClass: TranslateLoaderMock + } + }), + ], + declarations: [PublisherPolicyComponent], }) - .compileComponents(); + .compileComponents(); }); beforeEach(() => { fixture = TestBed.createComponent(PublisherPolicyComponent); component = fixture.componentInstance; + de = fixture.debugElement; + component.policy = dataRes.sherpaResponse[0].journals[0].policies[0]; fixture.detectChanges(); }); it('should create', () => { expect(component).toBeTruthy(); }); + + it('should show content accordion', () => { + expect(de.query(By.css('ds-content-accordion'))).toBeTruthy(); + }); + + it('should show 2 rows', () => { + expect(de.queryAll(By.css('.row')).length).toEqual(2); + }); }); diff --git a/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.spec.ts b/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.spec.ts index 5509cab4bb..ce64406486 100644 --- a/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.spec.ts +++ b/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.spec.ts @@ -1,100 +1,80 @@ -import { FormService } from '../../../shared/form/form.service'; +import { NgbAccordionModule } from '@ng-bootstrap/ng-bootstrap'; +import { SubmissionServiceStub } from './../../../shared/testing/submission-service.stub'; +import { dataRes, getSherpaPoliciesData } from './../../../shared/mocks/section-sherpa-policies.service.mock'; import { ComponentFixture, inject, TestBed } from '@angular/core/testing'; -import { SubmissionSectionAccessesComponent } from './section-accesses.component'; import { SectionsService } from '../sections.service'; import { SectionsServiceStub } from '../../../shared/testing/sections-service.stub'; import { FormBuilderService } from '../../../shared/form/builder/form-builder.service'; import { getMockFormBuilderService } from '../../../shared/mocks/form-builder-service.mock'; -import { SubmissionAccessesConfigService } from '../../../core/config/submission-accesses-config.service'; -import { - getSubmissionAccessesConfigNotChangeDiscoverableService, - getSubmissionAccessesConfigService -} from '../../../shared/mocks/section-accesses-config.service.mock'; -import { SectionAccessesService } from './section-accesses.service'; -import { SectionFormOperationsService } from '../form/section-form-operations.service'; import { JsonPatchOperationsBuilder } from '../../../core/json-patch/builder/json-patch-operations-builder'; -import { TranslateModule, TranslateService } from '@ngx-translate/core'; -import { SubmissionJsonPatchOperationsService } from '../../../core/submission/submission-json-patch-operations.service'; -import { getSectionAccessesService } from '../../../shared/mocks/section-accesses.service.mock'; -import { getMockFormOperationsService } from '../../../shared/mocks/form-operations-service.mock'; +import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; import { getMockTranslateService } from '../../../shared/mocks/translate.service.mock'; -import { SubmissionJsonPatchOperationsServiceStub } from '../../../shared/testing/submission-json-patch-operations-service.stub'; -import { BrowserModule } from '@angular/platform-browser'; +import { BrowserModule, By } from '@angular/platform-browser'; -import { of as observableOf } from 'rxjs'; import { Store } from '@ngrx/store'; -import { FormComponent } from '../../../shared/form/form.component'; -import { - DynamicCheckboxModel, - DynamicDatePickerModel, - DynamicFormArrayModel, - DynamicSelectModel -} from '@ng-dynamic-forms/core'; import { AppState } from '../../../app.reducer'; -import { getMockFormService } from '../../../shared/mocks/form-service.mock'; -import { mockAccessesFormData } from '../../../shared/mocks/submission.mock'; -import { accessConditionChangeEvent, checkboxChangeEvent } from '../../../shared/testing/form-event.stub'; +import { SectionSherpaPoliciesService } from './section-sherpa-policies.service'; +import { SubmissionSectionSherpaPoliciesComponent } from './section-sherpa-policies.component'; +import { SubmissionService } from '../../submission.service'; +import { DebugElement } from '@angular/core'; +import { TranslateLoaderMock } from 'src/app/shared/mocks/translate-loader.mock'; -describe('SubmissionSectionAccessesComponent', () => { - let component: SubmissionSectionAccessesComponent; - let fixture: ComponentFixture; +describe('SubmissionSectionSherpaPoliciesComponent', () => { + let component: SubmissionSectionSherpaPoliciesComponent; + let fixture: ComponentFixture; + let de: DebugElement; const sectionsServiceStub = new SectionsServiceStub(); // const pathCombiner = new JsonPatchOperationPathCombiner('sections', sectionId, 'files', fileIndex); const builderService: FormBuilderService = getMockFormBuilderService(); - const submissionAccessesConfigService = getSubmissionAccessesConfigService(); - const sectionAccessesService = getSectionAccessesService(); - const sectionFormOperationsService = getMockFormOperationsService(); + const sectionSherpaPoliciesService = getSherpaPoliciesData(); + const operationsBuilder = jasmine.createSpyObj('operationsBuilder', { add: undefined, remove: undefined, replace: undefined, }); - let formService: any; - const storeStub = jasmine.createSpyObj('store', ['dispatch']); const sectionData = { - header: 'submit.progressbar.accessCondition', - config: 'http://localhost:8080/server/api/config/submissionaccessoptions/AccessConditionDefaultConfiguration', + header: 'submit.progressbar.sherpaPolicies', + config: 'http://localhost:8080/server/api/config/submissionaccessoptions/SherpaPoliciesDefaultConfiguration', mandatory: true, - sectionType: 'accessCondition', + sectionType: 'sherpaPolicies', collapsed: false, enabled: true, - data: { - discoverable: true, - accessConditions: [] - }, + data: dataRes, errorsToShow: [], serverValidationErrors: [], isLoading: false, isValid: true }; - describe('First with canChangeDiscoverable true', () => { + describe('SubmissionSectionSherpaPoliciesComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ imports: [ BrowserModule, - TranslateModule.forRoot() + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useClass: TranslateLoaderMock + } + }), + NgbAccordionModule ], - declarations: [SubmissionSectionAccessesComponent, FormComponent], + declarations: [SubmissionSectionSherpaPoliciesComponent], providers: [ { provide: SectionsService, useValue: sectionsServiceStub }, - { provide: FormBuilderService, useValue: builderService }, - { provide: SubmissionAccessesConfigService, useValue: submissionAccessesConfigService }, - { provide: SectionAccessesService, useValue: sectionAccessesService }, - { provide: SectionFormOperationsService, useValue: sectionFormOperationsService }, + { provide: SectionSherpaPoliciesService, useValue: sectionSherpaPoliciesService }, { provide: JsonPatchOperationsBuilder, useValue: operationsBuilder }, - { provide: TranslateService, useValue: getMockTranslateService() }, - { provide: FormService, useValue: getMockFormService() }, + { provide: SubmissionService, useValue: SubmissionServiceStub }, { provide: Store, useValue: storeStub }, - { provide: SubmissionJsonPatchOperationsService, useValue: SubmissionJsonPatchOperationsServiceStub }, { provide: 'sectionDataProvider', useValue: sectionData }, { provide: 'submissionIdProvider', useValue: '1508' }, ] @@ -103,12 +83,9 @@ describe('SubmissionSectionAccessesComponent', () => { }); beforeEach(inject([Store], (store: Store) => { - fixture = TestBed.createComponent(SubmissionSectionAccessesComponent); + fixture = TestBed.createComponent(SubmissionSectionSherpaPoliciesComponent); component = fixture.componentInstance; - formService = TestBed.inject(FormService); - formService.validateAllFormFields.and.callFake(() => null); - formService.isValid.and.returnValue(observableOf(true)); - formService.getFormData.and.returnValue(observableOf(mockAccessesFormData)); + de = fixture.debugElement; fixture.detectChanges(); })); @@ -117,88 +94,37 @@ describe('SubmissionSectionAccessesComponent', () => { expect(component).toBeTruthy(); }); - it('should have created formModel', () => { - expect(component.formModel).toBeTruthy(); + it('should show accordions', () => { + expect(de.query(By.css('ngb-accordion'))).toBeTruthy(); }); - it('should have formModel length should be 2', () => { - expect(component.formModel.length).toEqual(2); + it('should show expanded accordion', () => { + expect(component.acc.first.isExpanded('publication-information-0')).toBeTrue(); }); - it('formModel should have 1 model type checkbox and 1 model type array', () => { - expect(component.formModel[0] instanceof DynamicCheckboxModel).toBeTrue(); - expect(component.formModel[1] instanceof DynamicFormArrayModel).toBeTrue(); + it('should show refresh button', () => { + expect(de.query(By.css('.refresh-container > button'))).toBeTruthy(); }); - it('formModel type array should have formgroup with 1 input and 2 datepickers', () => { - const formModel: any = component.formModel[1]; - const formGroup = formModel.groupFactory()[0].group; - expect(formGroup[0] instanceof DynamicSelectModel).toBeTrue(); - expect(formGroup[1] instanceof DynamicDatePickerModel).toBeTrue(); - expect(formGroup[2] instanceof DynamicDatePickerModel).toBeTrue(); + it('should show publisher information', () => { + expect(de.query(By.css('ds-publication-information'))).toBeTruthy(); }); - it('when checkbox changed it should call operationsBuilder replace function', () => { - component.onChange(checkboxChangeEvent); + it('should show publisher policy', () => { + expect(de.query(By.css('ds-publisher-policy'))).toBeTruthy(); + }); + + it('should show metadata information', () => { + expect(de.query(By.css('ds-metadata-information'))).toBeTruthy(); + }); + + it('when refresh button click operationsBuilder.remove should have been called', () => { + de.query(By.css('.refresh-container > button')).nativeElement.click(); fixture.detectChanges(); - - expect(operationsBuilder.replace).toHaveBeenCalled(); + expect(operationsBuilder.remove).toHaveBeenCalled(); }); - it('when dropdown select changed it should call operationsBuilder add function', () => { - component.onChange(accessConditionChangeEvent); - fixture.detectChanges(); - expect(operationsBuilder.add).toHaveBeenCalled(); - }); + }); - describe('when canDescoverable is false', () => { - - - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - BrowserModule, - TranslateModule.forRoot() - ], - declarations: [SubmissionSectionAccessesComponent, FormComponent], - providers: [ - { provide: SectionsService, useValue: sectionsServiceStub }, - { provide: FormBuilderService, useValue: builderService }, - { provide: SubmissionAccessesConfigService, useValue: getSubmissionAccessesConfigNotChangeDiscoverableService() }, - { provide: SectionAccessesService, useValue: sectionAccessesService }, - { provide: SectionFormOperationsService, useValue: sectionFormOperationsService }, - { provide: JsonPatchOperationsBuilder, useValue: operationsBuilder }, - { provide: TranslateService, useValue: getMockTranslateService() }, - { provide: FormService, useValue: getMockFormService() }, - { provide: Store, useValue: storeStub }, - { provide: SubmissionJsonPatchOperationsService, useValue: SubmissionJsonPatchOperationsServiceStub }, - { provide: 'sectionDataProvider', useValue: sectionData }, - { provide: 'submissionIdProvider', useValue: '1508' }, - ] - }) - .compileComponents(); - }); - - beforeEach(inject([Store], (store: Store) => { - fixture = TestBed.createComponent(SubmissionSectionAccessesComponent); - component = fixture.componentInstance; - formService = TestBed.inject(FormService); - formService.validateAllFormFields.and.callFake(() => null); - formService.isValid.and.returnValue(observableOf(true)); - formService.getFormData.and.returnValue(observableOf(mockAccessesFormData)); - fixture.detectChanges(); - })); - - - it('should have formModel length should be 1', () => { - expect(component.formModel.length).toEqual(1); - }); - - it('formModel should have only 1 model type array', () => { - expect(component.formModel[0] instanceof DynamicFormArrayModel).toBeTrue(); - }); - - }); }); From da5d5406683ff81c9c78c4538ab7a8821d12ce51 Mon Sep 17 00:00:00 2001 From: Pratik Rajkotiya Date: Wed, 27 Apr 2022 19:10:44 +0530 Subject: [PATCH 071/343] [CST-5738] add special group with mock & test cases. --- src/app/core/auth/models/auth-status.model.ts | 11 ++++ .../profile-page/profile-page.component.html | 11 ++++ .../profile-page.component.spec.ts | 22 ++++++- .../profile-page/profile-page.component.ts | 8 +++ .../testing/auth-request-service.stub.ts | 6 ++ src/app/shared/testing/special-group.mock.ts | 64 +++++++++++++++++++ src/assets/i18n/en.json5 | 2 + 7 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 src/app/shared/testing/special-group.mock.ts diff --git a/src/app/core/auth/models/auth-status.model.ts b/src/app/core/auth/models/auth-status.model.ts index 197c025407..2500c5b0a9 100644 --- a/src/app/core/auth/models/auth-status.model.ts +++ b/src/app/core/auth/models/auth-status.model.ts @@ -6,6 +6,8 @@ import { CacheableObject } from '../../cache/object-cache.reducer'; import { RemoteData } from '../../data/remote-data'; import { EPerson } from '../../eperson/models/eperson.model'; import { EPERSON } from '../../eperson/models/eperson.resource-type'; +import { Group } from '../../eperson/models/group.model'; +import { GROUP } from '../../eperson/models/group.resource-type'; import { HALLink } from '../../shared/hal-link.model'; import { ResourceType } from '../../shared/resource-type'; import { excludeFromEquals } from '../../utilities/equals.decorators'; @@ -14,6 +16,7 @@ import { AUTH_STATUS } from './auth-status.resource-type'; import { AuthTokenInfo } from './auth-token-info.model'; import { AuthMethod } from './auth.method'; + /** * Object that represents the authenticated status of a user */ @@ -61,6 +64,7 @@ export class AuthStatus implements CacheableObject { _links: { self: HALLink; eperson: HALLink; + specialGroups: HALLink; }; /** @@ -70,6 +74,13 @@ export class AuthStatus implements CacheableObject { @link(EPERSON) eperson?: Observable>; + /** + * The SpecialGroup of this auth status + * Will be undefined unless the SpecialGroup {@link HALLink} has been resolved. + */ + @link(GROUP) + specialGroups?: Observable>; + /** * True if the token is valid, false if there was no token or the token wasn't valid */ diff --git a/src/app/profile-page/profile-page.component.html b/src/app/profile-page/profile-page.component.html index ccfae0bba1..ffdf802a94 100644 --- a/src/app/profile-page/profile-page.component.html +++ b/src/app/profile-page/profile-page.component.html @@ -29,5 +29,16 @@
+ + +
+
+

{{'profile.special.groups.head' | translate}}

+
    +
  • {{specialGroup.name}}
  • +
+
+
+
diff --git a/src/app/profile-page/profile-page.component.spec.ts b/src/app/profile-page/profile-page.component.spec.ts index f48b894d8d..5ba1deedcf 100644 --- a/src/app/profile-page/profile-page.component.spec.ts +++ b/src/app/profile-page/profile-page.component.spec.ts @@ -13,13 +13,17 @@ import { NotificationsService } from '../shared/notifications/notifications.serv import { authReducer } from '../core/auth/auth.reducer'; import { createSuccessfulRemoteDataObject$ } from '../shared/remote-data.utils'; import { createPaginatedList } from '../shared/testing/utils.test'; -import { BehaviorSubject, of as observableOf } from 'rxjs'; +import { BehaviorSubject, Observable, of as observableOf } from 'rxjs'; import { AuthService } from '../core/auth/auth.service'; import { RestResponse } from '../core/cache/response.models'; import { provideMockStore } from '@ngrx/store/testing'; import { AuthorizationDataService } from '../core/data/feature-authorization/authorization-data.service'; import { getTestScheduler } from 'jasmine-marbles'; import { By } from '@angular/platform-browser'; +import { RemoteData } from '../core/data/remote-data'; +import { PaginatedList } from '../core/data/paginated-list.model'; +import { Group } from '../core/eperson/models/group.model'; +import { SpecialGroupData } from '../shared/testing/special-group.mock'; describe('ProfilePageComponent', () => { let component: ProfilePageComponent; @@ -235,4 +239,20 @@ describe('ProfilePageComponent', () => { }); }); }); + + describe('check for specialGroups', () => { + it('should contains specialGroups list', () => { + component.specialGroupsRD$ = SpecialGroupData; + fixture.detectChanges(); + const specialGroupsEle = fixture.debugElement.query(By.css('#specialGroups')); + expect(specialGroupsEle).toBeTruthy(); + }); + + it('should not contains specialGroups list', () => { + component.specialGroupsRD$ = null; + fixture.detectChanges(); + const specialGroupsEle = fixture.debugElement.query(By.css('#specialGroups')); + expect(specialGroupsEle).toBeFalsy(); + }); + }); }); diff --git a/src/app/profile-page/profile-page.component.ts b/src/app/profile-page/profile-page.component.ts index fece166a59..574f8c17a4 100644 --- a/src/app/profile-page/profile-page.component.ts +++ b/src/app/profile-page/profile-page.component.ts @@ -20,6 +20,8 @@ import { AuthService } from '../core/auth/auth.service'; import { Operation } from 'fast-json-patch'; import { AuthorizationDataService } from '../core/data/feature-authorization/authorization-data.service'; import { FeatureID } from '../core/data/feature-authorization/feature-id'; +import { SpecialGroupData } from '../shared/testing/special-group.mock'; + @Component({ selector: 'ds-profile-page', @@ -45,6 +47,11 @@ export class ProfilePageComponent implements OnInit { */ groupsRD$: Observable>>; + /** + * The special groups the user belongs to + */ + specialGroupsRD$: Observable>>; + /** * Prefix for the notification messages of this component */ @@ -88,6 +95,7 @@ export class ProfilePageComponent implements OnInit { ); this.groupsRD$ = this.user$.pipe(switchMap((user: EPerson) => user.groups)); this.canChangePassword$ = this.user$.pipe(switchMap((user: EPerson) => this.authorizationService.isAuthorized(FeatureID.CanChangePassword, user._links.self.href))); + this.specialGroupsRD$ = SpecialGroupData; } /** diff --git a/src/app/shared/testing/auth-request-service.stub.ts b/src/app/shared/testing/auth-request-service.stub.ts index 0dc57427dd..0094324518 100644 --- a/src/app/shared/testing/auth-request-service.stub.ts +++ b/src/app/shared/testing/auth-request-service.stub.ts @@ -34,6 +34,9 @@ export class AuthRequestServiceStub { }, eperson: { href: this.mockUser._links.self.href + }, + specialGroups: { + href: this.mockUser._links.self.href } }; } else { @@ -62,6 +65,9 @@ export class AuthRequestServiceStub { }, eperson: { href: this.mockUser._links.self.href + }, + specialGroups: { + href: this.mockUser._links.self.href } }; } else { diff --git a/src/app/shared/testing/special-group.mock.ts b/src/app/shared/testing/special-group.mock.ts new file mode 100644 index 0000000000..76d5bf60ea --- /dev/null +++ b/src/app/shared/testing/special-group.mock.ts @@ -0,0 +1,64 @@ +import { EPersonMock } from './eperson.mock'; +import { of } from 'rxjs'; +import { RemoteData } from '../../core/data/remote-data'; +import { environment } from '../../../environments/environment'; +import { RequestEntryState } from '../../core/data/request.reducer'; +import { PageInfo } from '../../core/shared/page-info.model'; +import { buildPaginatedList } from '../../core/data/paginated-list.model'; +import { Group } from '../../core/eperson/models/group.model'; + + +export const SpecialGroupMock2: Group = Object.assign(new Group(), { + handle: null, + subgroups: [], + epersons: [], + permanent: true, + selfRegistered: false, + _links: { + self: { + href: 'https://rest.api/server/api/eperson/specialGroups/testgroupid2', + }, + subgroups: { href: 'https://rest.api/server/api/eperson/specialGroups/testgroupid2/subgroups' }, + object: { href: 'https://rest.api/server/api/eperson/specialGroups/testgroupid2/object' }, + epersons: { href: 'https://rest.api/server/api/eperson/specialGroups/testgroupid2/epersons' } + }, + _name: 'testgroupname2', + id: 'testgroupid2', + uuid: 'testgroupid2', + type: 'specialGroups', + // object: createSuccessfulRemoteDataObject$({ name: 'testspecialGroupsid2objectName'}) +}); + +export const SpecialGroupMock: Group = Object.assign(new Group(), { + handle: null, + subgroups: [SpecialGroupMock2], + epersons: [EPersonMock], + selfRegistered: false, + permanent: false, + _links: { + self: { + href: 'https://rest.api/server/api/eperson/specialGroups/testgroupid', + }, + subgroups: { href: 'https://rest.api/server/api/eperson/specialGroups/testgroupid/subgroups' }, + object: { href: 'https://rest.api/server/api/eperson/specialGroups/testgroupid2/object' }, + epersons: { href: 'https://rest.api/server/api/eperson/specialGroups/testgroupid/epersons' } + }, + _name: 'testgroupname', + id: 'testgroupid', + uuid: 'testgroupid', + type: 'specialGroups', +}); + +export const SpecialGroupData = of(new RemoteData( + new Date().getTime(), + environment.cache.msToLive.default, + new Date().getTime(), + RequestEntryState.Success, + undefined, + buildPaginatedList(new PageInfo(), [SpecialGroupMock2,SpecialGroupMock]), + 200 + )); + + + + diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index c3c68a6882..25c69d372a 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -2861,6 +2861,8 @@ "profile.groups.head": "Authorization groups you belong to", + "profile.special.groups.head": "Authorization special groups you belong to", + "profile.head": "Update Profile", "profile.metadata.form.error.firstname.required": "First Name is required", From a34e7428c3ad7fb1d441ae9d3f532a44522fcce2 Mon Sep 17 00:00:00 2001 From: Pratik Rajkotiya Date: Wed, 27 Apr 2022 19:11:49 +0530 Subject: [PATCH 072/343] [CST-5738] remove unused variable. --- config/config.yml | 4 ++-- src/app/profile-page/profile-page.component.spec.ts | 3 --- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/config/config.yml b/config/config.yml index b5eecd112f..3866797f5d 100644 --- a/config/config.yml +++ b/config/config.yml @@ -1,5 +1,5 @@ rest: - ssl: true - host: api7.dspace.org + ssl: false + host: localhost:8080 port: 443 nameSpace: /server diff --git a/src/app/profile-page/profile-page.component.spec.ts b/src/app/profile-page/profile-page.component.spec.ts index 5ba1deedcf..6fad24eb34 100644 --- a/src/app/profile-page/profile-page.component.spec.ts +++ b/src/app/profile-page/profile-page.component.spec.ts @@ -20,9 +20,6 @@ import { provideMockStore } from '@ngrx/store/testing'; import { AuthorizationDataService } from '../core/data/feature-authorization/authorization-data.service'; import { getTestScheduler } from 'jasmine-marbles'; import { By } from '@angular/platform-browser'; -import { RemoteData } from '../core/data/remote-data'; -import { PaginatedList } from '../core/data/paginated-list.model'; -import { Group } from '../core/eperson/models/group.model'; import { SpecialGroupData } from '../shared/testing/special-group.mock'; describe('ProfilePageComponent', () => { From f9d55dc3e8130db99926e34bf3852a1857f3a0e9 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Wed, 27 Apr 2022 17:19:38 +0200 Subject: [PATCH 073/343] [CST-5270] Refactoring implementation and remove mock response --- ...spaceitem-section-sherpa-policies.model.ts | 2 +- .../section-sherpa-policies.service.mock.ts | 17 +++----- src/app/submission/sections/sections-type.ts | 2 +- .../content-accordion.component.spec.ts | 7 ++-- .../content-accordion.component.ts | 3 +- .../metadata-information.component.spec.ts | 7 ++-- .../metadata-information.component.ts | 3 +- .../publication-information.component.spec.ts | 6 +-- .../publication-information.component.ts | 5 ++- .../publisher-policy.component.spec.ts | 11 +++-- .../publisher-policy.component.ts | 5 ++- .../section-sherpa-policies.component.html | 13 +++--- .../section-sherpa-policies.component.spec.ts | 22 ++++------ .../section-sherpa-policies.component.ts | 35 ++++++++++------ .../section-sherpa-policies.service.ts | 42 ------------------- src/app/submission/submission.module.ts | 36 +++++++++++----- src/assets/i18n/en.json5 | 6 ++- 17 files changed, 100 insertions(+), 122 deletions(-) delete mode 100644 src/app/submission/sections/sherpa-policies/section-sherpa-policies.service.ts diff --git a/src/app/core/submission/models/workspaceitem-section-sherpa-policies.model.ts b/src/app/core/submission/models/workspaceitem-section-sherpa-policies.model.ts index cbef185090..c57beadbb9 100644 --- a/src/app/core/submission/models/workspaceitem-section-sherpa-policies.model.ts +++ b/src/app/core/submission/models/workspaceitem-section-sherpa-policies.model.ts @@ -18,5 +18,5 @@ export interface WorkspaceitemSectionSherpaPoliciesObject { /** * The sherpa policies details */ - sherpaResponse: SherpaPoliciesDetailsObject[]; + sherpaResponse: SherpaPoliciesDetailsObject; } diff --git a/src/app/shared/mocks/section-sherpa-policies.service.mock.ts b/src/app/shared/mocks/section-sherpa-policies.service.mock.ts index 895e518d96..b4947ea5b4 100644 --- a/src/app/shared/mocks/section-sherpa-policies.service.mock.ts +++ b/src/app/shared/mocks/section-sherpa-policies.service.mock.ts @@ -1,11 +1,11 @@ -import { WorkspaceitemSectionSherpaPoliciesObject } from './../../core/submission/models/workspaceitem-section-sherpa-policies.model'; -import { SubmissionFormsModel } from '../../core/config/models/config-submission-forms.model'; -import { of as observableOf } from 'rxjs'; +import { + WorkspaceitemSectionSherpaPoliciesObject +} from '../../core/submission/models/workspaceitem-section-sherpa-policies.model'; -export const dataRes = { +export const SherpaDataResponse = { 'id': 'sherpaPolicies', 'retrievalTime': '2022-04-20T09:44:39.870+00:00', - 'sherpaResponse': [ + 'sherpaResponse': { 'error': false, 'message': null, @@ -98,11 +98,4 @@ export const dataRes = { 'inDOAJ': false }] } - ] } as WorkspaceitemSectionSherpaPoliciesObject; - -export function getSherpaPoliciesData() { - return jasmine.createSpyObj('SectionAccessesService', { - getSherpaPoliciesData: observableOf(dataRes), - }); -} diff --git a/src/app/submission/sections/sections-type.ts b/src/app/submission/sections/sections-type.ts index f998ef4554..6b6f839b7c 100644 --- a/src/app/submission/sections/sections-type.ts +++ b/src/app/submission/sections/sections-type.ts @@ -6,5 +6,5 @@ export enum SectionsType { CcLicense = 'cclicense', collection = 'collection', AccessesCondition = 'accessCondition', - SherpaPolicies = 'sherpaPolicies', + SherpaPolicies = 'sherpaPolicy', } diff --git a/src/app/submission/sections/sherpa-policies/content-accordion/content-accordion.component.spec.ts b/src/app/submission/sections/sherpa-policies/content-accordion/content-accordion.component.spec.ts index ec1180a6c9..382450fbd3 100644 --- a/src/app/submission/sections/sherpa-policies/content-accordion/content-accordion.component.spec.ts +++ b/src/app/submission/sections/sherpa-policies/content-accordion/content-accordion.component.spec.ts @@ -1,12 +1,13 @@ import { NgbAccordionModule } from '@ng-bootstrap/ng-bootstrap'; -import { TranslateLoaderMock } from './../../../../shared/testing/translate-loader.mock'; +import { TranslateLoaderMock } from '../../../../shared/mocks/translate-loader.mock'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ContentAccordionComponent } from './content-accordion.component'; -import { dataRes } from './../../../../shared/mocks/section-sherpa-policies.service.mock'; + import { DebugElement } from '@angular/core'; import { By } from '@angular/platform-browser'; import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; +import { SherpaDataResponse } from '../../../../shared/mocks/section-sherpa-policies.service.mock'; describe('ContentAccordionComponent', () => { let component: ContentAccordionComponent; @@ -33,7 +34,7 @@ describe('ContentAccordionComponent', () => { fixture = TestBed.createComponent(ContentAccordionComponent); component = fixture.componentInstance; de = fixture.debugElement; - component.version = dataRes.sherpaResponse[0].journals[0].policies[0].permittedVersions[0]; + component.version = SherpaDataResponse.sherpaResponse.journals[0].policies[0].permittedVersions[0]; fixture.detectChanges(); }); diff --git a/src/app/submission/sections/sherpa-policies/content-accordion/content-accordion.component.ts b/src/app/submission/sections/sherpa-policies/content-accordion/content-accordion.component.ts index 378f08c8bc..a2decc38e1 100644 --- a/src/app/submission/sections/sherpa-policies/content-accordion/content-accordion.component.ts +++ b/src/app/submission/sections/sherpa-policies/content-accordion/content-accordion.component.ts @@ -1,6 +1,7 @@ -import { PermittedVersions } from './../../../../core/submission/models/sherpa-policies-details.model'; import { Component, Input } from '@angular/core'; +import { PermittedVersions } from '../../../../core/submission/models/sherpa-policies-details.model'; + @Component({ selector: 'ds-content-accordion', templateUrl: './content-accordion.component.html', diff --git a/src/app/submission/sections/sherpa-policies/metadata-information/metadata-information.component.spec.ts b/src/app/submission/sections/sherpa-policies/metadata-information/metadata-information.component.spec.ts index b329fb1821..9a60a6d010 100644 --- a/src/app/submission/sections/sherpa-policies/metadata-information/metadata-information.component.spec.ts +++ b/src/app/submission/sections/sherpa-policies/metadata-information/metadata-information.component.spec.ts @@ -1,11 +1,12 @@ -import { TranslateLoaderMock } from './../../../../shared/testing/translate-loader.mock'; +import { TranslateLoaderMock } from '../../../../shared/testing/translate-loader.mock'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { MetadataInformationComponent } from './metadata-information.component'; -import { dataRes } from './../../../../shared/mocks/section-sherpa-policies.service.mock'; + import { DebugElement } from '@angular/core'; import { By } from '@angular/platform-browser'; import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; +import { SherpaDataResponse } from '../../../../shared/mocks/section-sherpa-policies.service.mock'; describe('MetadataInformationComponent', () => { let component: MetadataInformationComponent; @@ -31,7 +32,7 @@ describe('MetadataInformationComponent', () => { fixture = TestBed.createComponent(MetadataInformationComponent); component = fixture.componentInstance; de = fixture.debugElement; - component.metadata = dataRes.sherpaResponse[0].metadata; + component.metadata = SherpaDataResponse.sherpaResponse.metadata; fixture.detectChanges(); }); diff --git a/src/app/submission/sections/sherpa-policies/metadata-information/metadata-information.component.ts b/src/app/submission/sections/sherpa-policies/metadata-information/metadata-information.component.ts index 8b85237762..cced669024 100644 --- a/src/app/submission/sections/sherpa-policies/metadata-information/metadata-information.component.ts +++ b/src/app/submission/sections/sherpa-policies/metadata-information/metadata-information.component.ts @@ -1,5 +1,6 @@ import { Component, Input } from '@angular/core'; -import { Metadata } from './../../../../core/submission/models/sherpa-policies-details.model'; + +import { Metadata } from '../../../../core/submission/models/sherpa-policies-details.model'; @Component({ selector: 'ds-metadata-information', diff --git a/src/app/submission/sections/sherpa-policies/publication-information/publication-information.component.spec.ts b/src/app/submission/sections/sherpa-policies/publication-information/publication-information.component.spec.ts index e1acc016ab..c5dc896858 100644 --- a/src/app/submission/sections/sherpa-policies/publication-information/publication-information.component.spec.ts +++ b/src/app/submission/sections/sherpa-policies/publication-information/publication-information.component.spec.ts @@ -1,11 +1,11 @@ -import { TranslateLoaderMock } from './../../../../shared/testing/translate-loader.mock'; +import { TranslateLoaderMock } from '../../../../shared/testing/translate-loader.mock'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { PublicationInformationComponent } from './publication-information.component'; -import { dataRes } from './../../../../shared/mocks/section-sherpa-policies.service.mock'; import { DebugElement } from '@angular/core'; import { By } from '@angular/platform-browser'; import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; +import { SherpaDataResponse } from '../../../../shared/mocks/section-sherpa-policies.service.mock'; describe('PublicationInformationComponent', () => { let component: PublicationInformationComponent; @@ -32,7 +32,7 @@ describe('PublicationInformationComponent', () => { fixture = TestBed.createComponent(PublicationInformationComponent); component = fixture.componentInstance; de = fixture.debugElement; - component.journal = dataRes.sherpaResponse[0].journals[0]; + component.journal = SherpaDataResponse.sherpaResponse.journals[0]; fixture.detectChanges(); }); diff --git a/src/app/submission/sections/sherpa-policies/publication-information/publication-information.component.ts b/src/app/submission/sections/sherpa-policies/publication-information/publication-information.component.ts index a5306406af..54973eba02 100644 --- a/src/app/submission/sections/sherpa-policies/publication-information/publication-information.component.ts +++ b/src/app/submission/sections/sherpa-policies/publication-information/publication-information.component.ts @@ -1,5 +1,6 @@ -import { Component, Input, OnInit } from '@angular/core'; -import { Journal } from './../../../../core/submission/models/sherpa-policies-details.model'; +import { Component, Input } from '@angular/core'; + +import { Journal } from '../../../../core/submission/models/sherpa-policies-details.model'; @Component({ selector: 'ds-publication-information', diff --git a/src/app/submission/sections/sherpa-policies/publisher-policy/publisher-policy.component.spec.ts b/src/app/submission/sections/sherpa-policies/publisher-policy/publisher-policy.component.spec.ts index 9ba77adf94..da97f824b1 100644 --- a/src/app/submission/sections/sherpa-policies/publisher-policy/publisher-policy.component.spec.ts +++ b/src/app/submission/sections/sherpa-policies/publisher-policy/publisher-policy.component.spec.ts @@ -1,12 +1,11 @@ -import { TranslateLoaderMock } from './../../../../shared/testing/translate-loader.mock'; import { ComponentFixture, TestBed } from '@angular/core/testing'; - import { PublisherPolicyComponent } from './publisher-policy.component'; -import { dataRes } from './../../../../shared/mocks/section-sherpa-policies.service.mock'; import { By } from '@angular/platform-browser'; import { DebugElement } from '@angular/core'; -import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; -import { getMockTranslateService } from '../../../../shared/mocks/translate.service.mock'; +import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; + +import { SherpaDataResponse } from '../../../../shared/mocks/section-sherpa-policies.service.mock'; +import { TranslateLoaderMock } from '../../../../shared/mocks/translate-loader.mock'; describe('PublisherPolicyComponent', () => { let component: PublisherPolicyComponent; @@ -32,7 +31,7 @@ describe('PublisherPolicyComponent', () => { fixture = TestBed.createComponent(PublisherPolicyComponent); component = fixture.componentInstance; de = fixture.debugElement; - component.policy = dataRes.sherpaResponse[0].journals[0].policies[0]; + component.policy = SherpaDataResponse.sherpaResponse.journals[0].policies[0]; fixture.detectChanges(); }); diff --git a/src/app/submission/sections/sherpa-policies/publisher-policy/publisher-policy.component.ts b/src/app/submission/sections/sherpa-policies/publisher-policy/publisher-policy.component.ts index dcbc115ddd..639361beb0 100644 --- a/src/app/submission/sections/sherpa-policies/publisher-policy/publisher-policy.component.ts +++ b/src/app/submission/sections/sherpa-policies/publisher-policy/publisher-policy.component.ts @@ -1,5 +1,6 @@ -import { Policy } from './../../../../core/submission/models/sherpa-policies-details.model'; -import { Component, Input, OnInit } from '@angular/core'; +import { Component, Input } from '@angular/core'; + +import { Policy } from '../../../../core/submission/models/sherpa-policies-details.model'; @Component({ selector: 'ds-publisher-policy', diff --git a/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.html b/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.html index 6756793fd5..94553dd4c3 100644 --- a/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.html +++ b/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.html @@ -1,10 +1,13 @@ + + +
- + @@ -38,11 +41,11 @@ - +
- - + +
{{'submission.sections.sherpa.record.information' | translate}} @@ -51,4 +54,4 @@
-
\ No newline at end of file +
diff --git a/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.spec.ts b/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.spec.ts index ce64406486..fb8f8ba355 100644 --- a/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.spec.ts +++ b/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.spec.ts @@ -1,25 +1,21 @@ import { NgbAccordionModule } from '@ng-bootstrap/ng-bootstrap'; -import { SubmissionServiceStub } from './../../../shared/testing/submission-service.stub'; -import { dataRes, getSherpaPoliciesData } from './../../../shared/mocks/section-sherpa-policies.service.mock'; +import { SubmissionServiceStub } from '../../../shared/testing/submission-service.stub'; +import { SherpaDataResponse } from '../../../shared/mocks/section-sherpa-policies.service.mock'; import { ComponentFixture, inject, TestBed } from '@angular/core/testing'; import { SectionsService } from '../sections.service'; import { SectionsServiceStub } from '../../../shared/testing/sections-service.stub'; - -import { FormBuilderService } from '../../../shared/form/builder/form-builder.service'; -import { getMockFormBuilderService } from '../../../shared/mocks/form-builder-service.mock'; import { JsonPatchOperationsBuilder } from '../../../core/json-patch/builder/json-patch-operations-builder'; -import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core'; -import { getMockTranslateService } from '../../../shared/mocks/translate.service.mock'; +import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; import { BrowserModule, By } from '@angular/platform-browser'; import { Store } from '@ngrx/store'; import { AppState } from '../../../app.reducer'; -import { SectionSherpaPoliciesService } from './section-sherpa-policies.service'; import { SubmissionSectionSherpaPoliciesComponent } from './section-sherpa-policies.component'; import { SubmissionService } from '../../submission.service'; import { DebugElement } from '@angular/core'; -import { TranslateLoaderMock } from 'src/app/shared/mocks/translate-loader.mock'; +import { TranslateLoaderMock } from '../../../shared/mocks/translate-loader.mock'; +import { of as observableOf } from 'rxjs'; describe('SubmissionSectionSherpaPoliciesComponent', () => { let component: SubmissionSectionSherpaPoliciesComponent; @@ -27,10 +23,6 @@ describe('SubmissionSectionSherpaPoliciesComponent', () => { let de: DebugElement; const sectionsServiceStub = new SectionsServiceStub(); - // const pathCombiner = new JsonPatchOperationPathCombiner('sections', sectionId, 'files', fileIndex); - - const builderService: FormBuilderService = getMockFormBuilderService(); - const sectionSherpaPoliciesService = getSherpaPoliciesData(); const operationsBuilder = jasmine.createSpyObj('operationsBuilder', { add: undefined, @@ -47,7 +39,7 @@ describe('SubmissionSectionSherpaPoliciesComponent', () => { sectionType: 'sherpaPolicies', collapsed: false, enabled: true, - data: dataRes, + data: SherpaDataResponse, errorsToShow: [], serverValidationErrors: [], isLoading: false, @@ -71,7 +63,6 @@ describe('SubmissionSectionSherpaPoliciesComponent', () => { declarations: [SubmissionSectionSherpaPoliciesComponent], providers: [ { provide: SectionsService, useValue: sectionsServiceStub }, - { provide: SectionSherpaPoliciesService, useValue: sectionSherpaPoliciesService }, { provide: JsonPatchOperationsBuilder, useValue: operationsBuilder }, { provide: SubmissionService, useValue: SubmissionServiceStub }, { provide: Store, useValue: storeStub }, @@ -86,6 +77,7 @@ describe('SubmissionSectionSherpaPoliciesComponent', () => { fixture = TestBed.createComponent(SubmissionSectionSherpaPoliciesComponent); component = fixture.componentInstance; de = fixture.debugElement; + sectionsServiceStub.getSectionData.and.returnValue(observableOf(SherpaDataResponse)) fixture.detectChanges(); })); diff --git a/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.ts b/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.ts index f5eaaa773a..d287a182ba 100644 --- a/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.ts +++ b/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.ts @@ -1,18 +1,19 @@ -import { JsonPatchOperationPathCombiner } from './../../../core/json-patch/builder/json-patch-operation-path-combiner'; -import { JsonPatchOperationsBuilder } from './../../../core/json-patch/builder/json-patch-operations-builder'; -import { WorkspaceitemSectionSherpaPoliciesObject } from './../../../core/submission/models/workspaceitem-section-sherpa-policies.model'; -import { SectionSherpaPoliciesService } from './section-sherpa-policies.service'; -import { Component, Inject, ViewChildren, QueryList } from '@angular/core'; +import { Component, Inject, QueryList, ViewChildren } from '@angular/core'; -import { Observable, of, Subscription } from 'rxjs'; +import { BehaviorSubject, Observable, of, Subscription } from 'rxjs'; +import { JsonPatchOperationPathCombiner } from '../../../core/json-patch/builder/json-patch-operation-path-combiner'; +import { JsonPatchOperationsBuilder } from '../../../core/json-patch/builder/json-patch-operations-builder'; +import { + WorkspaceitemSectionSherpaPoliciesObject +} from '../../../core/submission/models/workspaceitem-section-sherpa-policies.model'; import { renderSectionFor } from '../sections-decorator'; import { SectionsType } from '../sections-type'; import { SectionDataObject } from '../models/section-data.model'; import { SectionsService } from '../sections.service'; import { SectionModelComponent } from '../models/section.model'; import { SubmissionService } from '../../submission.service'; -import { hasValue } from '../../../shared/empty.util'; +import { hasValue, isEmpty } from '../../../shared/empty.util'; /** * This component represents a section for managing item's access conditions. @@ -31,7 +32,7 @@ export class SubmissionSectionSherpaPoliciesComponent extends SectionModelCompon * The accesses section data * @type {WorkspaceitemSectionAccessesObject} */ - public sherpaPoliciesData: WorkspaceitemSectionSherpaPoliciesObject; + public sherpaPoliciesData$: BehaviorSubject = new BehaviorSubject(null); /** * The [[JsonPatchOperationPathCombiner]] object @@ -50,14 +51,12 @@ export class SubmissionSectionSherpaPoliciesComponent extends SectionModelCompon * * @param {SectionsService} sectionService * @param {SectionDataObject} injectedSectionData - * @param {SectionSherpaPoliciesService} sectionSherpaPoliciesService * @param {JsonPatchOperationsBuilder} operationsBuilder * @param {SubmissionService} submissionService * @param {string} injectedSubmissionId */ constructor( protected sectionService: SectionsService, - private sectionSherpaPoliciesService: SectionSherpaPoliciesService, protected operationsBuilder: JsonPatchOperationsBuilder, private submissionService: SubmissionService, @Inject('sectionDataProvider') public injectedSectionData: SectionDataObject, @@ -88,11 +87,14 @@ export class SubmissionSectionSherpaPoliciesComponent extends SectionModelCompon * Initialize all instance variables and retrieve collection default access conditions */ protected onSectionInit(): void { + this.pathCombiner = new JsonPatchOperationPathCombiner('sections', this.sectionData.id); this.subs.push( - this.sectionSherpaPoliciesService.getSherpaPoliciesData(this.submissionId, this.sectionData.id).subscribe((sherpaPolicies: WorkspaceitemSectionSherpaPoliciesObject) => { - this.sherpaPoliciesData = sherpaPolicies; - }) + this.sectionService.getSectionData(this.submissionId, this.sectionData.id, this.sectionData.sectionType) + .subscribe((sherpaPolicies: WorkspaceitemSectionSherpaPoliciesObject) => { + this.sherpaPoliciesData$.next(sherpaPolicies); + console.log(this.sherpaPoliciesData$.value) + }) ); } @@ -106,6 +108,13 @@ export class SubmissionSectionSherpaPoliciesComponent extends SectionModelCompon return of(true); } + /** + * Check if section has no data + */ + hasNoData(): boolean { + return isEmpty(this.sherpaPoliciesData$.value); + } + /** * Refresh sherpa information */ diff --git a/src/app/submission/sections/sherpa-policies/section-sherpa-policies.service.ts b/src/app/submission/sections/sherpa-policies/section-sherpa-policies.service.ts deleted file mode 100644 index 4ddf4509cb..0000000000 --- a/src/app/submission/sections/sherpa-policies/section-sherpa-policies.service.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { WorkspaceitemSectionSherpaPoliciesObject } from './../../../core/submission/models/workspaceitem-section-sherpa-policies.model'; -import { Injectable } from '@angular/core'; - -import { Observable } from 'rxjs'; -import { distinctUntilChanged, filter } from 'rxjs/operators'; -import { Store } from '@ngrx/store'; - -import { SubmissionState } from '../../submission.reducers'; -import { isNotUndefined } from '../../../shared/empty.util'; -import { submissionSectionDataFromIdSelector } from '../../selectors'; - -/** - * A service that provides methods to handle submission item's sherpa policies state. - */ -@Injectable() -export class SectionSherpaPoliciesService { - - /** - * Initialize service variables - * - * @param {Store} store - */ - constructor(private store: Store) { } - - - /** - * Return item's sherpa policies state. - * - * @param submissionId - * The submission id - * @param sectionId - * The section id - * @returns {Observable} - * Emits bitstream's metadata - */ - public getSherpaPoliciesData(submissionId: string, sectionId: string): Observable { - - return this.store.select(submissionSectionDataFromIdSelector(submissionId, sectionId)).pipe( - filter((state) => isNotUndefined(state)), - distinctUntilChanged()); - } -} diff --git a/src/app/submission/submission.module.ts b/src/app/submission/submission.module.ts index 85b8067d0e..b0b6d5195d 100644 --- a/src/app/submission/submission.module.ts +++ b/src/app/submission/submission.module.ts @@ -1,4 +1,3 @@ -import { SectionSherpaPoliciesService } from './sections/sherpa-policies/section-sherpa-policies.service'; import { NgModule } from '@angular/core'; import { CoreModule } from '../core/core.module'; import { SharedModule } from '../shared/shared.module'; @@ -23,15 +22,27 @@ import { SubmissionSectionLicenseComponent } from './sections/license/section-li import { SubmissionUploadsConfigService } from '../core/config/submission-uploads-config.service'; import { SubmissionEditComponent } from './edit/submission-edit.component'; import { SubmissionSectionUploadFileComponent } from './sections/upload/file/section-upload-file.component'; -import { SubmissionSectionUploadFileEditComponent } from './sections/upload/file/edit/section-upload-file-edit.component'; -import { SubmissionSectionUploadFileViewComponent } from './sections/upload/file/view/section-upload-file-view.component'; -import { SubmissionSectionUploadAccessConditionsComponent } from './sections/upload/accessConditions/submission-section-upload-access-conditions.component'; +import { + SubmissionSectionUploadFileEditComponent +} from './sections/upload/file/edit/section-upload-file-edit.component'; +import { + SubmissionSectionUploadFileViewComponent +} from './sections/upload/file/view/section-upload-file-view.component'; +import { + SubmissionSectionUploadAccessConditionsComponent +} from './sections/upload/accessConditions/submission-section-upload-access-conditions.component'; import { SubmissionSubmitComponent } from './submit/submission-submit.component'; import { storeModuleConfig } from '../app.reducer'; import { SubmissionImportExternalComponent } from './import-external/submission-import-external.component'; -import { SubmissionImportExternalSearchbarComponent } from './import-external/import-external-searchbar/submission-import-external-searchbar.component'; -import { SubmissionImportExternalPreviewComponent } from './import-external/import-external-preview/submission-import-external-preview.component'; -import { SubmissionImportExternalCollectionComponent } from './import-external/import-external-collection/submission-import-external-collection.component'; +import { + SubmissionImportExternalSearchbarComponent +} from './import-external/import-external-searchbar/submission-import-external-searchbar.component'; +import { + SubmissionImportExternalPreviewComponent +} from './import-external/import-external-preview/submission-import-external-preview.component'; +import { + SubmissionImportExternalCollectionComponent +} from './import-external/import-external-collection/submission-import-external-collection.component'; import { SubmissionSectionCcLicensesComponent } from './sections/cc-license/submission-section-cc-licenses.component'; import { JournalEntitiesModule } from '../entity-groups/journal-entities/journal-entities.module'; import { ResearchEntitiesModule } from '../entity-groups/research-entities/research-entities.module'; @@ -46,8 +57,12 @@ import { SectionAccessesService } from './sections/accesses/section-accesses.ser import { SubmissionSectionSherpaPoliciesComponent } from './sections/sherpa-policies/section-sherpa-policies.component'; import { ContentAccordionComponent } from './sections/sherpa-policies/content-accordion/content-accordion.component'; import { PublisherPolicyComponent } from './sections/sherpa-policies/publisher-policy/publisher-policy.component'; -import { PublicationInformationComponent } from './sections/sherpa-policies/publication-information/publication-information.component'; -import { MetadataInformationComponent } from './sections/sherpa-policies/metadata-information/metadata-information.component'; +import { + PublicationInformationComponent +} from './sections/sherpa-policies/publication-information/publication-information.component'; +import { + MetadataInformationComponent +} from './sections/sherpa-policies/metadata-information/metadata-information.component'; const ENTRY_COMPONENTS = [ // put only entry components that use custom decorator @@ -108,8 +123,7 @@ const DECLARATIONS = [ SectionsService, SubmissionUploadsConfigService, SubmissionAccessesConfigService, - SectionAccessesService, - SectionSherpaPoliciesService + SectionAccessesService ] }) diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index ec9bc5b3a0..d9f6523ed4 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -3874,10 +3874,14 @@ "submission.sections.submit.progressbar.license": "Deposit license", + "submission.sections.submit.progressbar.sherpapolicy": "Sherpa policies", + "submission.sections.submit.progressbar.upload": "Upload files", + "submission.sections.sherpa-policy.title-empty": "No information available", + "submission.sections.status.errors.title": "Errors", "submission.sections.status.valid.title": "Valid", @@ -3990,7 +3994,7 @@ "submission.sections.sherpa.publication.information": "Publication information", - + "submission.sections.sherpa.publication.information.title": "Title", "submission.sections.sherpa.publication.information.issns": "ISSNs", From e307c5de9fdb57809b30427237e0d24b63eb4026 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Wed, 27 Apr 2022 17:20:26 +0200 Subject: [PATCH 074/343] [CST-5270] add string type to attribute declaration --- src/app/shared/alert/alert.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/shared/alert/alert.component.ts b/src/app/shared/alert/alert.component.ts index 93535d2057..0fcce39d38 100644 --- a/src/app/shared/alert/alert.component.ts +++ b/src/app/shared/alert/alert.component.ts @@ -33,7 +33,7 @@ export class AlertComponent { /** * The alert type */ - @Input() type: AlertType; + @Input() type: AlertType|string; /** * An event fired when alert is dismissed. From aaa166593e8fb2a2f082808934a0ad95c890d639 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Wed, 27 Apr 2022 18:59:29 +0200 Subject: [PATCH 075/343] [DSC-516] Fix accessibility issues --- .../truncatable-part.component.html | 16 +++++++--------- .../truncatable-part.component.scss | 15 ++++++--------- .../truncatable-part.component.spec.ts | 4 ++-- .../truncatable-part.component.ts | 11 +++++------ 4 files changed, 20 insertions(+), 26 deletions(-) diff --git a/src/app/shared/truncatable/truncatable-part/truncatable-part.component.html b/src/app/shared/truncatable/truncatable-part/truncatable-part.component.html index 34227e2583..cb9f529f99 100644 --- a/src/app/shared/truncatable/truncatable-part/truncatable-part.component.html +++ b/src/app/shared/truncatable/truncatable-part/truncatable-part.component.html @@ -1,11 +1,9 @@
-
- -
- - - {{ 'item.truncatable-part.show-less' | translate }} +
+ +
+ +
diff --git a/src/app/shared/truncatable/truncatable-part/truncatable-part.component.scss b/src/app/shared/truncatable/truncatable-part/truncatable-part.component.scss index 7a1f31f578..f67d343cd6 100644 --- a/src/app/shared/truncatable/truncatable-part/truncatable-part.component.scss +++ b/src/app/shared/truncatable/truncatable-part/truncatable-part.component.scss @@ -1,10 +1,7 @@ -#dontBreakContent:not(.truncated) ~ label{ - display: none; - } +.content:not(.truncated) ~ button.expandButton { + display: none; +} -a { - color: #207698 !important; - text-decoration: none !important; - background-color: transparent !important; - cursor: pointer; -} \ No newline at end of file +.btn:focus { + box-shadow: none !important; +} diff --git a/src/app/shared/truncatable/truncatable-part/truncatable-part.component.spec.ts b/src/app/shared/truncatable/truncatable-part/truncatable-part.component.spec.ts index 09d603e6b7..08d3e18117 100644 --- a/src/app/shared/truncatable/truncatable-part/truncatable-part.component.spec.ts +++ b/src/app/shared/truncatable/truncatable-part/truncatable-part.component.spec.ts @@ -70,7 +70,7 @@ describe('TruncatablePartComponent', () => { }); it('collapseButton should be hidden', () => { - const a = fixture.debugElement.query(By.css('#collapseButton')); + const a = fixture.debugElement.query(By.css('.collapseButton')); expect(a).toBeNull(); }); }); @@ -98,7 +98,7 @@ describe('TruncatablePartComponent', () => { (comp as any).setLines(); (comp as any).expandable = true; fixture.detectChanges(); - const a = fixture.debugElement.query(By.css('#collapseButton')); + const a = fixture.debugElement.query(By.css('.collapseButton')); expect(a).not.toBeNull(); }); }); diff --git a/src/app/shared/truncatable/truncatable-part/truncatable-part.component.ts b/src/app/shared/truncatable/truncatable-part/truncatable-part.component.ts index 7fe36e950a..0bfcf25d39 100644 --- a/src/app/shared/truncatable/truncatable-part/truncatable-part.component.ts +++ b/src/app/shared/truncatable/truncatable-part/truncatable-part.component.ts @@ -1,4 +1,4 @@ -import { Component, Inject, Input, OnDestroy, OnInit, PLATFORM_ID } from '@angular/core'; +import { AfterContentChecked, Component, Inject, Input, OnDestroy, OnInit, PLATFORM_ID } from '@angular/core'; import { TruncatableService } from '../truncatable.service'; import { hasValue } from '../../empty.util'; import { DOCUMENT, isPlatformBrowser } from '@angular/common'; @@ -14,7 +14,7 @@ import { NativeWindowRef, NativeWindowService } from '../../../core/services/win * Component that truncates/clamps a piece of text * It needs a TruncatableComponent parent to identify it's current state */ -export class TruncatablePartComponent implements OnInit, OnDestroy { +export class TruncatablePartComponent implements AfterContentChecked, OnInit, OnDestroy { /** * Number of lines shown when the part is collapsed */ @@ -116,10 +116,9 @@ export class TruncatablePartComponent implements OnInit, OnDestroy { * Function to get data to be observed */ toObserve() { - this.observedContent = this.document.querySelectorAll('#dontBreakContent'); - this.observer = new (this._window.nativeWindow as any).ResizeObserver(entries => { - // tslint:disable-next-line:prefer-const - for (let entry of entries) { + this.observedContent = this.document.querySelectorAll('.content'); + this.observer = new (this._window.nativeWindow as any).ResizeObserver((entries) => { + for (let entry of entries) { if (!entry.target.classList.contains('notruncatable')) { if (entry.target.scrollHeight > entry.contentRect.height) { if (entry.target.children.length > 0) { From aa78a2991cf7185f6776b2096e81ff62311ec62d Mon Sep 17 00:00:00 2001 From: Rezart Vata Date: Wed, 27 Apr 2022 20:18:33 +0200 Subject: [PATCH 076/343] CST-5253] Finished functionalities --- src/app/app-routing-paths.ts | 6 +++ .../resolver/submission-object.resolver.ts | 43 +++++++++++++++++++ .../claimed-task-actions.component.html | 26 +++++------ .../pool-task-actions.component.html | 19 +++++--- .../pool-task/pool-task-actions.component.ts | 28 +++++++----- .../workspaceitem-actions.component.html | 38 +++++++++------- .../workspaceitem-actions.component.ts | 20 ++++++--- .../item-from-workflow.resolver.ts | 30 ++----------- .../item-from-workspace.resolver.ts | 21 +++++++++ .../workspaceitems-edit-page-routing-paths.ts | 8 ++++ ...workspaceitems-edit-page-routing.module.ts | 14 +++++- .../workspaceitems-edit-page.module.ts | 4 +- src/assets/i18n/en.json5 | 7 +++ 13 files changed, 183 insertions(+), 81 deletions(-) create mode 100644 src/app/core/submission/resolver/submission-object.resolver.ts create mode 100644 src/app/workspaceitems-edit-page/item-from-workspace.resolver.ts create mode 100644 src/app/workspaceitems-edit-page/workspaceitems-edit-page-routing-paths.ts diff --git a/src/app/app-routing-paths.ts b/src/app/app-routing-paths.ts index 57767b6f3e..6524edef77 100644 --- a/src/app/app-routing-paths.ts +++ b/src/app/app-routing-paths.ts @@ -70,6 +70,12 @@ export function getWorkflowItemModuleRoute() { return `/${WORKFLOW_ITEM_MODULE_PATH}`; } +export const WORKSPACE_ITEM_MODULE_PATH = 'workspaceitems'; + +export function getWorkspaceItemModuleRoute() { + return `/${WORKSPACE_ITEM_MODULE_PATH}`; +} + export function getDSORoute(dso: DSpaceObject): string { if (hasValue(dso)) { switch ((dso as any).type) { diff --git a/src/app/core/submission/resolver/submission-object.resolver.ts b/src/app/core/submission/resolver/submission-object.resolver.ts new file mode 100644 index 0000000000..32f6c544e2 --- /dev/null +++ b/src/app/core/submission/resolver/submission-object.resolver.ts @@ -0,0 +1,43 @@ +import { DSpaceObject } from './../../shared/dspace-object.model'; +import { followLink } from './../../../shared/utils/follow-link-config.model'; +import { ChildHALResource } from './../../shared/child-hal-resource.model'; +import { Injectable } from '@angular/core'; +import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; +import { Observable } from 'rxjs'; +import { Store } from '@ngrx/store'; +import { switchMap } from 'rxjs/operators'; +import { DataService } from '../../data/data.service'; +import { RemoteData } from '../../data/remote-data'; +import { getFirstCompletedRemoteData } from '../../shared/operators'; + +/** + * This class represents a resolver that requests a specific item before the route is activated + */ +@Injectable() +export class SubmissionObjectResolver implements Resolve> { + constructor( + protected dataService: DataService, + protected store: Store + ) { + } + + /** + * Method for resolving an item based on the parameters in the current route + * @param {ActivatedRouteSnapshot} route The current ActivatedRouteSnapshot + * @param {RouterStateSnapshot} state The current RouterStateSnapshot + * @returns Observable<> Emits the found item based on the parameters in the current route, + * or an error if something went wrong + */ + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable> { + const itemRD$ = this.dataService.findById(route.params.id, + true, + false, + followLink('item'), + ).pipe( + getFirstCompletedRemoteData(), + switchMap((wfiRD: RemoteData) => wfiRD.payload.item as Observable>), + getFirstCompletedRemoteData() + ); + return itemRD$; + } +} diff --git a/src/app/shared/mydspace-actions/claimed-task/claimed-task-actions.component.html b/src/app/shared/mydspace-actions/claimed-task/claimed-task-actions.component.html index 4ad6665cf8..0b2398791e 100644 --- a/src/app/shared/mydspace-actions/claimed-task/claimed-task-actions.component.html +++ b/src/app/shared/mydspace-actions/claimed-task/claimed-task-actions.component.html @@ -1,22 +1,18 @@
- + - - - + + + - +
-
+ \ No newline at end of file diff --git a/src/app/shared/mydspace-actions/pool-task/pool-task-actions.component.html b/src/app/shared/mydspace-actions/pool-task/pool-task-actions.component.html index 214f85ed5b..c2f0158c12 100644 --- a/src/app/shared/mydspace-actions/pool-task/pool-task-actions.component.html +++ b/src/app/shared/mydspace-actions/pool-task/pool-task-actions.component.html @@ -1,8 +1,13 @@ - + \ No newline at end of file diff --git a/src/app/shared/mydspace-actions/pool-task/pool-task-actions.component.ts b/src/app/shared/mydspace-actions/pool-task/pool-task-actions.component.ts index 92086ac817..45f51a5d4a 100644 --- a/src/app/shared/mydspace-actions/pool-task/pool-task-actions.component.ts +++ b/src/app/shared/mydspace-actions/pool-task/pool-task-actions.component.ts @@ -2,7 +2,7 @@ import { Component, Injector, Input, OnDestroy } from '@angular/core'; import { Router } from '@angular/router'; import { Observable } from 'rxjs'; -import {filter, map, switchMap, take} from 'rxjs/operators'; +import { filter, map, switchMap, take } from 'rxjs/operators'; import { TranslateService } from '@ngx-translate/core'; import { WorkflowItem } from '../../../core/submission/models/workflowitem.model'; @@ -19,6 +19,7 @@ import { Item } from '../../../core/shared/item.model'; import { DSpaceObject } from '../../../core/shared/dspace-object.model'; import { MyDSpaceReloadableActionsComponent } from '../mydspace-reloadable-actions'; import { ProcessTaskResponse } from '../../../core/tasks/models/process-task-response'; +import { getWorkflowItemViewRoute } from '../../../workflowitems-edit-page/workflowitems-edit-page-routing-paths'; /** * This component represents mydspace actions related to PoolTask object. @@ -58,12 +59,12 @@ export class PoolTaskActionsComponent extends MyDSpaceReloadableActionsComponent * @param {RequestService} requestService */ constructor(protected injector: Injector, - protected router: Router, - protected notificationsService: NotificationsService, - protected claimedTaskService: ClaimedTaskDataService, - protected translate: TranslateService, - protected searchService: SearchService, - protected requestService: RequestService) { + protected router: Router, + protected notificationsService: NotificationsService, + protected claimedTaskService: ClaimedTaskDataService, + protected translate: TranslateService, + protected searchService: SearchService, + protected requestService: RequestService) { super(PoolTask.type, injector, router, notificationsService, translate, searchService, requestService); } @@ -91,7 +92,7 @@ export class PoolTaskActionsComponent extends MyDSpaceReloadableActionsComponent return this.objectDataService.getPoolTaskEndpointById(this.object.id) .pipe(switchMap((poolTaskHref) => { return this.claimedTaskService.claimTask(this.object.id, poolTaskHref); - })); + })); } reloadObjectExecution(): Observable | DSpaceObject> { @@ -107,12 +108,19 @@ export class PoolTaskActionsComponent extends MyDSpaceReloadableActionsComponent switchMap((workflowItem: WorkflowItem) => workflowItem.item.pipe(getFirstSucceededRemoteDataPayload()) )) .subscribe((item: Item) => { - this.itemUuid = item.uuid; - }); + this.itemUuid = item.uuid; + }); } ngOnDestroy() { this.subs.forEach((sub) => sub.unsubscribe()); } + /** + * Get the workflowitem view route. + */ + getWorkflowItemViewRoute(workflowitem: WorkflowItem): string { + return getWorkflowItemViewRoute(workflowitem?.id); + } + } diff --git a/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.html b/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.html index a43c9f8d17..8b6ad87ca2 100644 --- a/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.html +++ b/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.html @@ -1,22 +1,28 @@
- + + + + {{'submission.workflow.generic.edit' | translate}} -
+ - + \ No newline at end of file diff --git a/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.ts b/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.ts index a25ce335e3..a6d30728ac 100644 --- a/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.ts +++ b/src/app/shared/mydspace-actions/workspaceitem/workspaceitem-actions.component.ts @@ -14,6 +14,7 @@ import { SearchService } from '../../../core/shared/search/search.service'; import { getFirstCompletedRemoteData } from '../../../core/shared/operators'; import { RemoteData } from '../../../core/data/remote-data'; import { NoContent } from '../../../core/shared/NoContent.model'; +import { getWorkspaceItemViewRoute } from '../../../workspaceitems-edit-page/workspaceitems-edit-page-routing-paths'; /** * This component represents actions related to WorkspaceItem object. @@ -48,12 +49,12 @@ export class WorkspaceitemActionsComponent extends MyDSpaceActionsComponent> { +export class ItemFromWorkflowResolver extends SubmissionObjectResolver implements Resolve> { constructor( private workflowItemService: WorkflowItemDataService, protected store: Store ) { + super(workflowItemService, store); } - /** - * Method for resolving an item based on the parameters in the current route - * @param {ActivatedRouteSnapshot} route The current ActivatedRouteSnapshot - * @param {RouterStateSnapshot} state The current RouterStateSnapshot - * @returns Observable<> Emits the found item based on the parameters in the current route, - * or an error if something went wrong - */ - resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable> { - const itemRD$ = this.workflowItemService.findById(route.params.id, - true, - false, - followLink('item'), - ).pipe( - getFirstCompletedRemoteData(), - switchMap((wfiRD: RemoteData) => wfiRD.payload.item as Observable>), - getFirstCompletedRemoteData() - ); - return itemRD$; - } } diff --git a/src/app/workspaceitems-edit-page/item-from-workspace.resolver.ts b/src/app/workspaceitems-edit-page/item-from-workspace.resolver.ts new file mode 100644 index 0000000000..60e1fe6a87 --- /dev/null +++ b/src/app/workspaceitems-edit-page/item-from-workspace.resolver.ts @@ -0,0 +1,21 @@ +import { Injectable } from '@angular/core'; +import { Resolve } from '@angular/router'; +import { RemoteData } from '../core/data/remote-data'; +import { Item } from '../core/shared/item.model'; +import { Store } from '@ngrx/store'; +import { SubmissionObjectResolver } from '../core/submission/resolver/submission-object.resolver'; +import { WorkspaceitemDataService } from '../core/submission/workspaceitem-data.service'; + +/** + * This class represents a resolver that requests a specific item before the route is activated + */ +@Injectable() +export class ItemFromWorkspaceResolver extends SubmissionObjectResolver implements Resolve> { + constructor( + private workspaceItemService: WorkspaceitemDataService, + protected store: Store + ) { + super(workspaceItemService, store); + } + +} diff --git a/src/app/workspaceitems-edit-page/workspaceitems-edit-page-routing-paths.ts b/src/app/workspaceitems-edit-page/workspaceitems-edit-page-routing-paths.ts new file mode 100644 index 0000000000..74917b4392 --- /dev/null +++ b/src/app/workspaceitems-edit-page/workspaceitems-edit-page-routing-paths.ts @@ -0,0 +1,8 @@ +import { getWorkspaceItemModuleRoute } from '../app-routing-paths'; +import { URLCombiner } from '../core/url-combiner/url-combiner'; + +export function getWorkspaceItemViewRoute(wfiId: string) { + return new URLCombiner(getWorkspaceItemModuleRoute(), wfiId, WORKSPACE_ITEM_VIEW_PATH).toString(); +} + +export const WORKSPACE_ITEM_VIEW_PATH = 'view'; diff --git a/src/app/workspaceitems-edit-page/workspaceitems-edit-page-routing.module.ts b/src/app/workspaceitems-edit-page/workspaceitems-edit-page-routing.module.ts index 1a58417d0c..10c2f2a1d0 100644 --- a/src/app/workspaceitems-edit-page/workspaceitems-edit-page-routing.module.ts +++ b/src/app/workspaceitems-edit-page/workspaceitems-edit-page-routing.module.ts @@ -4,6 +4,8 @@ import { RouterModule } from '@angular/router'; import { AuthenticatedGuard } from '../core/auth/authenticated.guard'; import { ThemedSubmissionEditComponent } from '../submission/edit/themed-submission-edit.component'; import { I18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.resolver'; +import { ThemedFullItemPageComponent } from '../item-page/full/themed-full-item-page.component'; +import { ItemFromWorkspaceResolver } from './item-from-workspace.resolver'; @NgModule({ imports: [ @@ -17,7 +19,17 @@ import { I18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.reso breadcrumb: I18nBreadcrumbResolver }, data: { title: 'submission.edit.title', breadcrumbKey: 'submission.edit' } - } + }, + { + canActivate: [AuthenticatedGuard], + path: ':id/view', + component: ThemedFullItemPageComponent, + resolve: { + dso: ItemFromWorkspaceResolver, + breadcrumb: I18nBreadcrumbResolver + }, + data: { title: 'workspace-item.view.title', breadcrumbKey: 'workspace-item.view' } + }, ]) ] }) diff --git a/src/app/workspaceitems-edit-page/workspaceitems-edit-page.module.ts b/src/app/workspaceitems-edit-page/workspaceitems-edit-page.module.ts index 65a40f3f7c..83f869881a 100644 --- a/src/app/workspaceitems-edit-page/workspaceitems-edit-page.module.ts +++ b/src/app/workspaceitems-edit-page/workspaceitems-edit-page.module.ts @@ -3,6 +3,7 @@ import { NgModule } from '@angular/core'; import { SharedModule } from '../shared/shared.module'; import { WorkspaceitemsEditPageRoutingModule } from './workspaceitems-edit-page-routing.module'; import { SubmissionModule } from '../submission/submission.module'; +import { ItemFromWorkspaceResolver } from './item-from-workspace.resolver'; @NgModule({ imports: [ @@ -11,7 +12,8 @@ import { SubmissionModule } from '../submission/submission.module'; SharedModule, SubmissionModule, ], - declarations: [] + declarations: [], + providers: [ItemFromWorkspaceResolver] }) /** * This module handles all modules that need to access the workspaceitems edit page. diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index a7ce942e7d..b2c8aaf482 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -4054,6 +4054,10 @@ "submission.workflow.tasks.pool.show-detail": "Show detail", + "submission.workspace.generic.view": "View", + + "submission.workspace.generic.view-help": "Select this option to view the item's metadata.", + "thumbnail.default.alt": "Thumbnail Image", @@ -4160,6 +4164,9 @@ "workflow-item.view.breadcrumbs": "Workflow View", + "workspace-item.view.breadcrumbs": "Workspace View", + + "workspace-item.view.title": "Workspace View", "idle-modal.header": "Session will expire soon", From 44f393d65a54db0ec8c1b4b6663267da783b1f87 Mon Sep 17 00:00:00 2001 From: Davide Negretti Date: Thu, 28 Apr 2022 11:44:53 +0200 Subject: [PATCH 077/343] [CST-5674] Fixed link in TODO --- .../resource-policies/form/resource-policy-form.component.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/shared/resource-policies/form/resource-policy-form.component.ts b/src/app/shared/resource-policies/form/resource-policy-form.component.ts index 7ae699340e..0a7f0b7a90 100644 --- a/src/app/shared/resource-policies/form/resource-policy-form.component.ts +++ b/src/app/shared/resource-policies/form/resource-policy-form.component.ts @@ -193,11 +193,11 @@ export class ResourcePolicyFormComponent implements OnInit, OnDestroy { */ private buildResourcePolicyForm(): DynamicFormControlModel[] { const formModel: DynamicFormControlModel[] = []; - // TODO to be removed when https://jira.lyrasis.org/browse/DS-4477 will be implemented + // TODO to be removed when https://github.com/DSpace/DSpace/issues/7812 will be implemented const policyTypeConf = Object.assign({}, RESOURCE_POLICY_FORM_POLICY_TYPE_CONFIG, { disabled: isNotEmpty(this.resourcePolicy) }); - // TODO to be removed when https://jira.lyrasis.org/browse/DS-4477 will be implemented + // TODO to be removed when https://github.com/DSpace/DSpace/issues/7812 will be implemented const actionConf = Object.assign({}, RESOURCE_POLICY_FORM_ACTION_TYPE_CONFIG, { disabled: isNotEmpty(this.resourcePolicy) }); From cc745b422565b9fea1ede6817757bc35c2ac8db0 Mon Sep 17 00:00:00 2001 From: Yura Bondarenko Date: Wed, 27 Apr 2022 15:05:19 +0200 Subject: [PATCH 078/343] 90978: Minor fixes --- src/app/core/auth/auth.reducer.spec.ts | 6 +++--- .../transfer-state/dspace-browser-transfer-state.service.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/app/core/auth/auth.reducer.spec.ts b/src/app/core/auth/auth.reducer.spec.ts index 8cd587b61a..8ebc9f6cb0 100644 --- a/src/app/core/auth/auth.reducer.spec.ts +++ b/src/app/core/auth/auth.reducer.spec.ts @@ -192,7 +192,7 @@ describe('authReducer', () => { state = { authenticated: false, loaded: false, - blocking: true, + blocking: false, loading: true, idle: false }; @@ -212,7 +212,7 @@ describe('authReducer', () => { state = { authenticated: false, loaded: false, - blocking: true, + blocking: false, loading: true, idle: false }; @@ -558,7 +558,7 @@ describe('authReducer', () => { state = { authenticated: false, loaded: false, - blocking: true, + blocking: false, loading: true, authMethods: [], idle: false diff --git a/src/modules/transfer-state/dspace-browser-transfer-state.service.ts b/src/modules/transfer-state/dspace-browser-transfer-state.service.ts index fd7c1e3e97..512d6aeb71 100644 --- a/src/modules/transfer-state/dspace-browser-transfer-state.service.ts +++ b/src/modules/transfer-state/dspace-browser-transfer-state.service.ts @@ -7,7 +7,7 @@ import { isNotEmpty } from '../../app/shared/empty.util'; @Injectable() export class DSpaceBrowserTransferState extends DSpaceTransferState { - async transfer(): Promise { + transfer(): Promise { const state = this.transferState.get(DSpaceTransferState.NGRX_STATE, null); this.transferState.remove(DSpaceTransferState.NGRX_STATE); this.store.dispatch(new StoreAction(StoreActionTypes.REHYDRATE, state)); From 8a4f811575e1abbb043ca68c8bd67d0fd5fe0a91 Mon Sep 17 00:00:00 2001 From: Yura Bondarenko Date: Wed, 27 Apr 2022 14:26:00 +0200 Subject: [PATCH 079/343] 90978: Move admin menu to MenuResolver, clean up & add tests --- .../admin-sidebar.component.spec.ts | 146 ----- .../admin-sidebar/admin-sidebar.component.ts | 498 ---------------- src/app/menu.resolver.spec.ts | 297 +++++++++- src/app/menu.resolver.ts | 553 +++++++++++++++++- src/app/shared/testing/menu-service.stub.ts | 6 +- 5 files changed, 841 insertions(+), 659 deletions(-) diff --git a/src/app/admin/admin-sidebar/admin-sidebar.component.spec.ts b/src/app/admin/admin-sidebar/admin-sidebar.component.spec.ts index 65026c1504..3aca092b52 100644 --- a/src/app/admin/admin-sidebar/admin-sidebar.component.spec.ts +++ b/src/app/admin/admin-sidebar/admin-sidebar.component.spec.ts @@ -182,150 +182,4 @@ describe('AdminSidebarComponent', () => { expect(menuService.collapseMenuPreview).toHaveBeenCalled(); })); }); - - describe('menu', () => { - beforeEach(() => { - spyOn(menuService, 'addSection'); - }); - - describe('for regular user', () => { - beforeEach(() => { - authorizationService.isAuthorized = createSpy('isAuthorized').and.callFake(() => { - return observableOf(false); - }); - }); - - beforeEach(() => { - comp.createMenu(); - }); - - it('should not show site admin section', () => { - expect(menuService.addSection).toHaveBeenCalledWith(comp.menuID, jasmine.objectContaining({ - id: 'admin_search', visible: false, - })); - expect(menuService.addSection).toHaveBeenCalledWith(comp.menuID, jasmine.objectContaining({ - id: 'registries', visible: false, - })); - expect(menuService.addSection).toHaveBeenCalledWith(comp.menuID, jasmine.objectContaining({ - parentID: 'registries', visible: false, - })); - expect(menuService.addSection).toHaveBeenCalledWith(comp.menuID, jasmine.objectContaining({ - id: 'curation_tasks', visible: false, - })); - expect(menuService.addSection).toHaveBeenCalledWith(comp.menuID, jasmine.objectContaining({ - id: 'workflow', visible: false, - })); - }); - - it('should not show edit_community', () => { - expect(menuService.addSection).toHaveBeenCalledWith(comp.menuID, jasmine.objectContaining({ - id: 'edit_community', visible: false, - })); - - }); - - it('should not show edit_collection', () => { - expect(menuService.addSection).toHaveBeenCalledWith(comp.menuID, jasmine.objectContaining({ - id: 'edit_collection', visible: false, - })); - }); - - it('should not show access control section', () => { - expect(menuService.addSection).toHaveBeenCalledWith(comp.menuID, jasmine.objectContaining({ - id: 'access_control', visible: false, - })); - expect(menuService.addSection).toHaveBeenCalledWith(comp.menuID, jasmine.objectContaining({ - parentID: 'access_control', visible: false, - })); - - }); - }); - - describe('for site admin', () => { - beforeEach(() => { - authorizationService.isAuthorized = createSpy('isAuthorized').and.callFake((featureID: FeatureID) => { - return observableOf(featureID === FeatureID.AdministratorOf); - }); - }); - - beforeEach(() => { - comp.createMenu(); - }); - - it('should contain site admin section', () => { - expect(menuService.addSection).toHaveBeenCalledWith(comp.menuID, jasmine.objectContaining({ - id: 'admin_search', visible: true, - })); - expect(menuService.addSection).toHaveBeenCalledWith(comp.menuID, jasmine.objectContaining({ - id: 'registries', visible: true, - })); - expect(menuService.addSection).toHaveBeenCalledWith(comp.menuID, jasmine.objectContaining({ - parentID: 'registries', visible: true, - })); - expect(menuService.addSection).toHaveBeenCalledWith(comp.menuID, jasmine.objectContaining({ - id: 'curation_tasks', visible: true, - })); - expect(menuService.addSection).toHaveBeenCalledWith(comp.menuID, jasmine.objectContaining({ - id: 'workflow', visible: true, - })); - }); - }); - - describe('for community admin', () => { - beforeEach(() => { - authorizationService.isAuthorized = createSpy('isAuthorized').and.callFake((featureID: FeatureID) => { - return observableOf(featureID === FeatureID.IsCommunityAdmin); - }); - }); - - beforeEach(() => { - comp.createMenu(); - }); - - it('should show edit_community', () => { - expect(menuService.addSection).toHaveBeenCalledWith(comp.menuID, jasmine.objectContaining({ - id: 'edit_community', visible: true, - })); - }); - }); - - describe('for collection admin', () => { - beforeEach(() => { - authorizationService.isAuthorized = createSpy('isAuthorized').and.callFake((featureID: FeatureID) => { - return observableOf(featureID === FeatureID.IsCollectionAdmin); - }); - }); - - beforeEach(() => { - comp.createMenu(); - }); - - it('should show edit_collection', () => { - expect(menuService.addSection).toHaveBeenCalledWith(comp.menuID, jasmine.objectContaining({ - id: 'edit_collection', visible: true, - })); - }); - }); - - describe('for group admin', () => { - beforeEach(() => { - authorizationService.isAuthorized = createSpy('isAuthorized').and.callFake((featureID: FeatureID) => { - return observableOf(featureID === FeatureID.CanManageGroups); - }); - }); - - beforeEach(() => { - comp.createMenu(); - }); - - it('should show access control section', () => { - expect(menuService.addSection).toHaveBeenCalledWith(comp.menuID, jasmine.objectContaining({ - id: 'access_control', visible: true, - })); - expect(menuService.addSection).toHaveBeenCalledWith(comp.menuID, jasmine.objectContaining({ - parentID: 'access_control', visible: true, - })); - }); - }); - }); }); diff --git a/src/app/admin/admin-sidebar/admin-sidebar.component.ts b/src/app/admin/admin-sidebar/admin-sidebar.component.ts index c81b2e6e93..d07196502f 100644 --- a/src/app/admin/admin-sidebar/admin-sidebar.component.ts +++ b/src/app/admin/admin-sidebar/admin-sidebar.component.ts @@ -67,9 +67,7 @@ export class AdminSidebarComponent extends MenuComponent implements OnInit { protected injector: Injector, private variableService: CSSVariableService, private authService: AuthService, - private modalService: NgbModal, public authorizationService: AuthorizationDataService, - private scriptDataService: ScriptDataService, public route: ActivatedRoute ) { super(menuService, injector, authorizationService, route); @@ -80,7 +78,6 @@ export class AdminSidebarComponent extends MenuComponent implements OnInit { * Set and calculate all initial values of the instance variables */ ngOnInit(): void { - this.createMenu(); super.ngOnInit(); this.sidebarWidth = this.variableService.getVariable('sidebarItemsWidth'); this.authService.isAuthenticated() @@ -115,501 +112,6 @@ export class AdminSidebarComponent extends MenuComponent implements OnInit { }); } - /** - * Initialize all menu sections and items for this menu - */ - createMenu() { - this.createMainMenuSections(); - this.createSiteAdministratorMenuSections(); - this.createExportMenuSections(); - this.createImportMenuSections(); - this.createAccessControlMenuSections(); - } - - /** - * Initialize the main menu sections. - * edit_community / edit_collection is only included if the current user is a Community or Collection admin - */ - createMainMenuSections() { - combineLatest([ - this.authorizationService.isAuthorized(FeatureID.IsCollectionAdmin), - this.authorizationService.isAuthorized(FeatureID.IsCommunityAdmin), - this.authorizationService.isAuthorized(FeatureID.AdministratorOf) - ]).subscribe(([isCollectionAdmin, isCommunityAdmin, isSiteAdmin]) => { - const menuList = [ - /* News */ - { - id: 'new', - active: false, - visible: true, - model: { - type: MenuItemType.TEXT, - text: 'menu.section.new' - } as TextMenuItemModel, - icon: 'plus', - index: 0 - }, - { - id: 'new_community', - parentID: 'new', - active: false, - visible: isCommunityAdmin, - model: { - type: MenuItemType.ONCLICK, - text: 'menu.section.new_community', - function: () => { - this.modalService.open(CreateCommunityParentSelectorComponent); - } - } as OnClickMenuItemModel, - }, - { - id: 'new_collection', - parentID: 'new', - active: false, - visible: isCommunityAdmin, - model: { - type: MenuItemType.ONCLICK, - text: 'menu.section.new_collection', - function: () => { - this.modalService.open(CreateCollectionParentSelectorComponent); - } - } as OnClickMenuItemModel, - }, - { - id: 'new_item', - parentID: 'new', - active: false, - visible: true, - model: { - type: MenuItemType.ONCLICK, - text: 'menu.section.new_item', - function: () => { - this.modalService.open(CreateItemParentSelectorComponent); - } - } as OnClickMenuItemModel, - }, - { - id: 'new_process', - parentID: 'new', - active: false, - visible: isCollectionAdmin, - model: { - type: MenuItemType.LINK, - text: 'menu.section.new_process', - link: '/processes/new' - } as LinkMenuItemModel, - }, - // TODO: enable this menu item once the feature has been implemented - // { - // id: 'new_item_version', - // parentID: 'new', - // active: false, - // visible: true, - // model: { - // type: MenuItemType.LINK, - // text: 'menu.section.new_item_version', - // link: '' - // } as LinkMenuItemModel, - // }, - - /* Edit */ - { - id: 'edit', - active: false, - visible: true, - model: { - type: MenuItemType.TEXT, - text: 'menu.section.edit' - } as TextMenuItemModel, - icon: 'pencil-alt', - index: 1 - }, - { - id: 'edit_community', - parentID: 'edit', - active: false, - visible: isCommunityAdmin, - model: { - type: MenuItemType.ONCLICK, - text: 'menu.section.edit_community', - function: () => { - this.modalService.open(EditCommunitySelectorComponent); - } - } as OnClickMenuItemModel, - }, - { - id: 'edit_collection', - parentID: 'edit', - active: false, - visible: isCollectionAdmin, - model: { - type: MenuItemType.ONCLICK, - text: 'menu.section.edit_collection', - function: () => { - this.modalService.open(EditCollectionSelectorComponent); - } - } as OnClickMenuItemModel, - }, - { - id: 'edit_item', - parentID: 'edit', - active: false, - visible: true, - model: { - type: MenuItemType.ONCLICK, - text: 'menu.section.edit_item', - function: () => { - this.modalService.open(EditItemSelectorComponent); - } - } as OnClickMenuItemModel, - }, - - /* Statistics */ - // TODO: enable this menu item once the feature has been implemented - // { - // id: 'statistics_task', - // active: false, - // visible: true, - // model: { - // type: MenuItemType.LINK, - // text: 'menu.section.statistics_task', - // link: '' - // } as LinkMenuItemModel, - // icon: 'chart-bar', - // index: 8 - // }, - - /* Control Panel */ - // TODO: enable this menu item once the feature has been implemented - // { - // id: 'control_panel', - // active: false, - // visible: isSiteAdmin, - // model: { - // type: MenuItemType.LINK, - // text: 'menu.section.control_panel', - // link: '' - // } as LinkMenuItemModel, - // icon: 'cogs', - // index: 9 - // }, - - /* Processes */ - { - id: 'processes', - active: false, - visible: isSiteAdmin, - model: { - type: MenuItemType.LINK, - text: 'menu.section.processes', - link: '/processes' - } as LinkMenuItemModel, - icon: 'terminal', - index: 10 - }, - ]; - menuList.forEach((menuSection) => this.menuService.addSection(this.menuID, Object.assign(menuSection, { - shouldPersistOnRouteChange: true - }))); - }); - } - - /** - * Create menu sections dependent on whether or not the current user is a site administrator and on whether or not - * the export scripts exist and the current user is allowed to execute them - */ - createExportMenuSections() { - const menuList = [ - /* Export */ - { - id: 'export', - active: false, - visible: true, - model: { - type: MenuItemType.TEXT, - text: 'menu.section.export' - } as TextMenuItemModel, - icon: 'file-export', - index: 3, - shouldPersistOnRouteChange: true - }, - // TODO: enable this menu item once the feature has been implemented - // { - // id: 'export_community', - // parentID: 'export', - // active: false, - // visible: true, - // model: { - // type: MenuItemType.LINK, - // text: 'menu.section.export_community', - // link: '' - // } as LinkMenuItemModel, - // shouldPersistOnRouteChange: true - // }, - // TODO: enable this menu item once the feature has been implemented - // { - // id: 'export_collection', - // parentID: 'export', - // active: false, - // visible: true, - // model: { - // type: MenuItemType.LINK, - // text: 'menu.section.export_collection', - // link: '' - // } as LinkMenuItemModel, - // shouldPersistOnRouteChange: true - // }, - // TODO: enable this menu item once the feature has been implemented - // { - // id: 'export_item', - // parentID: 'export', - // active: false, - // visible: true, - // model: { - // type: MenuItemType.LINK, - // text: 'menu.section.export_item', - // link: '' - // } as LinkMenuItemModel, - // shouldPersistOnRouteChange: true - // }, - ]; - menuList.forEach((menuSection) => this.menuService.addSection(this.menuID, menuSection)); - - observableCombineLatest( - this.authorizationService.isAuthorized(FeatureID.AdministratorOf), - // this.scriptDataService.scriptWithNameExistsAndCanExecute(METADATA_EXPORT_SCRIPT_NAME) - ).pipe( - // TODO uncomment when #635 (https://github.com/DSpace/dspace-angular/issues/635) is fixed; otherwise even in production mode, the metadata export button is only available after a refresh (and not in dev mode) - // filter(([authorized, metadataExportScriptExists]: boolean[]) => authorized && metadataExportScriptExists), - take(1) - ).subscribe(() => { - this.menuService.addSection(this.menuID, { - id: 'export_metadata', - parentID: 'export', - active: true, - visible: true, - model: { - type: MenuItemType.ONCLICK, - text: 'menu.section.export_metadata', - function: () => { - this.modalService.open(ExportMetadataSelectorComponent); - } - } as OnClickMenuItemModel, - shouldPersistOnRouteChange: true - }); - }); - } - - /** - * Create menu sections dependent on whether or not the current user is a site administrator and on whether or not - * the import scripts exist and the current user is allowed to execute them - */ - createImportMenuSections() { - const menuList = [ - /* Import */ - { - id: 'import', - active: false, - visible: true, - model: { - type: MenuItemType.TEXT, - text: 'menu.section.import' - } as TextMenuItemModel, - icon: 'file-import', - index: 2 - }, - // TODO: enable this menu item once the feature has been implemented - // { - // id: 'import_batch', - // parentID: 'import', - // active: false, - // visible: true, - // model: { - // type: MenuItemType.LINK, - // text: 'menu.section.import_batch', - // link: '' - // } as LinkMenuItemModel, - // } - ]; - menuList.forEach((menuSection) => this.menuService.addSection(this.menuID, Object.assign(menuSection, { - shouldPersistOnRouteChange: true - }))); - - observableCombineLatest( - this.authorizationService.isAuthorized(FeatureID.AdministratorOf), - // this.scriptDataService.scriptWithNameExistsAndCanExecute(METADATA_IMPORT_SCRIPT_NAME) - ).pipe( - // TODO uncomment when #635 (https://github.com/DSpace/dspace-angular/issues/635) is fixed - // filter(([authorized, metadataImportScriptExists]: boolean[]) => authorized && metadataImportScriptExists), - take(1) - ).subscribe(() => { - this.menuService.addSection(this.menuID, { - id: 'import_metadata', - parentID: 'import', - active: true, - visible: true, - model: { - type: MenuItemType.LINK, - text: 'menu.section.import_metadata', - link: '/admin/metadata-import' - } as LinkMenuItemModel, - shouldPersistOnRouteChange: true - }); - }); - } - - /** - * Create menu sections dependent on whether or not the current user is a site administrator - */ - createSiteAdministratorMenuSections() { - this.authorizationService.isAuthorized(FeatureID.AdministratorOf).subscribe((authorized) => { - const menuList = [ - /* Admin Search */ - { - id: 'admin_search', - active: false, - visible: authorized, - model: { - type: MenuItemType.LINK, - text: 'menu.section.admin_search', - link: '/admin/search' - } as LinkMenuItemModel, - icon: 'search', - index: 5 - }, - /* Registries */ - { - id: 'registries', - active: false, - visible: authorized, - model: { - type: MenuItemType.TEXT, - text: 'menu.section.registries' - } as TextMenuItemModel, - icon: 'list', - index: 6 - }, - { - id: 'registries_metadata', - parentID: 'registries', - active: false, - visible: authorized, - model: { - type: MenuItemType.LINK, - text: 'menu.section.registries_metadata', - link: 'admin/registries/metadata' - } as LinkMenuItemModel, - }, - { - id: 'registries_format', - parentID: 'registries', - active: false, - visible: authorized, - model: { - type: MenuItemType.LINK, - text: 'menu.section.registries_format', - link: 'admin/registries/bitstream-formats' - } as LinkMenuItemModel, - }, - - /* Curation tasks */ - { - id: 'curation_tasks', - active: false, - visible: authorized, - model: { - type: MenuItemType.LINK, - text: 'menu.section.curation_task', - link: 'admin/curation-tasks' - } as LinkMenuItemModel, - icon: 'filter', - index: 7 - }, - - /* Workflow */ - { - id: 'workflow', - active: false, - visible: authorized, - model: { - type: MenuItemType.LINK, - text: 'menu.section.workflow', - link: '/admin/workflow' - } as LinkMenuItemModel, - icon: 'user-check', - index: 11 - }, - ]; - - menuList.forEach((menuSection) => this.menuService.addSection(this.menuID, Object.assign(menuSection, { - shouldPersistOnRouteChange: true - }))); - }); - } - - /** - * Create menu sections dependent on whether or not the current user can manage access control groups - */ - createAccessControlMenuSections() { - observableCombineLatest( - this.authorizationService.isAuthorized(FeatureID.AdministratorOf), - this.authorizationService.isAuthorized(FeatureID.CanManageGroups) - ).subscribe(([isSiteAdmin, canManageGroups]) => { - const menuList = [ - /* Access Control */ - { - id: 'access_control_people', - parentID: 'access_control', - active: false, - visible: isSiteAdmin, - model: { - type: MenuItemType.LINK, - text: 'menu.section.access_control_people', - link: '/access-control/epeople' - } as LinkMenuItemModel, - }, - { - id: 'access_control_groups', - parentID: 'access_control', - active: false, - visible: canManageGroups, - model: { - type: MenuItemType.LINK, - text: 'menu.section.access_control_groups', - link: '/access-control/groups' - } as LinkMenuItemModel, - }, - // TODO: enable this menu item once the feature has been implemented - // { - // id: 'access_control_authorizations', - // parentID: 'access_control', - // active: false, - // visible: authorized, - // model: { - // type: MenuItemType.LINK, - // text: 'menu.section.access_control_authorizations', - // link: '' - // } as LinkMenuItemModel, - // }, - { - id: 'access_control', - active: false, - visible: canManageGroups || isSiteAdmin, - model: { - type: MenuItemType.TEXT, - text: 'menu.section.access_control' - } as TextMenuItemModel, - icon: 'key', - index: 4 - }, - ]; - - menuList.forEach((menuSection) => this.menuService.addSection(this.menuID, Object.assign(menuSection, { - shouldPersistOnRouteChange: true, - }))); - }); - } - @HostListener('focusin') public handleFocusIn() { this.inFocus$.next(true); diff --git a/src/app/menu.resolver.spec.ts b/src/app/menu.resolver.spec.ts index 76adc49bc9..7fa156fc4e 100644 --- a/src/app/menu.resolver.spec.ts +++ b/src/app/menu.resolver.spec.ts @@ -1,16 +1,305 @@ -import { TestBed } from '@angular/core/testing'; +import { TestBed, waitForAsync } from '@angular/core/testing'; import { MenuResolver } from './menu.resolver'; +import { of as observableOf } from 'rxjs'; +import { FeatureID } from './core/data/feature-authorization/feature-id'; +import { TranslateModule } from '@ngx-translate/core'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { RouterTestingModule } from '@angular/router/testing'; +import { AdminSidebarComponent } from './admin/admin-sidebar/admin-sidebar.component'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { MenuService } from './shared/menu/menu.service'; +import { AuthorizationDataService } from './core/data/feature-authorization/authorization-data.service'; +import { ScriptDataService } from './core/data/processes/script-data.service'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; +import { MenuServiceStub } from './shared/testing/menu-service.stub'; +import { MenuID } from './shared/menu/initial-menus-state'; +import { BrowseService } from './core/browse/browse.service'; +import { cold } from 'jasmine-marbles'; +import createSpy = jasmine.createSpy; +import { createSuccessfulRemoteDataObject$ } from './shared/remote-data.utils'; +import { createPaginatedList } from './shared/testing/utils.test'; + +const BOOLEAN = { t: true, f: false }; +const MENU_STATE = { + id: 'some menu' +}; +const BROWSE_DEFINITIONS = [ + { id: 'definition1' }, + { id: 'definition2' }, + { id: 'definition3' }, +]; describe('MenuResolver', () => { let resolver: MenuResolver; - beforeEach(() => { - TestBed.configureTestingModule({}); + let menuService; + let browseService; + let authorizationService; + let scriptService; + + beforeEach(waitForAsync(() => { + menuService = new MenuServiceStub(); + spyOn(menuService, 'getMenu').and.returnValue(observableOf(MENU_STATE)); + + browseService = jasmine.createSpyObj('browseService', { + getBrowseDefinitions: createSuccessfulRemoteDataObject$(createPaginatedList(BROWSE_DEFINITIONS)) + }); + authorizationService = jasmine.createSpyObj('authorizationService', { + isAuthorized: observableOf(true) + }); + scriptService = jasmine.createSpyObj('scriptService', { + scriptWithNameExistsAndCanExecute: observableOf(true) + }); + + TestBed.configureTestingModule({ + imports: [TranslateModule.forRoot(), NoopAnimationsModule, RouterTestingModule], + declarations: [AdminSidebarComponent], + providers: [ + { provide: MenuService, useValue: menuService }, + { provide: BrowseService, useValue: browseService }, + { provide: AuthorizationDataService, useValue: authorizationService }, + { provide: ScriptDataService, useValue: scriptService }, + { + provide: NgbModal, useValue: { + open: () => {/*comment*/ + } + } + } + ], + schemas: [NO_ERRORS_SCHEMA] + }); resolver = TestBed.inject(MenuResolver); - }); + + spyOn(menuService, 'addSection'); + })); it('should be created', () => { expect(resolver).toBeTruthy(); }); + + describe('resolve', () => { + it('should create all menus', (done) => { + spyOn(resolver, 'createPublicMenu$').and.returnValue(observableOf(true)); + spyOn(resolver, 'createAdminMenu$').and.returnValue(observableOf(true)); + + resolver.resolve(null, null).subscribe(resolved => { + expect(resolved).toBeTrue(); + expect(resolver.createPublicMenu$).toHaveBeenCalled(); + expect(resolver.createAdminMenu$).toHaveBeenCalled(); + done(); + }); + }); + + it('should return an Observable that emits true as soon as all menus are created', () => { + spyOn(resolver, 'createPublicMenu$').and.returnValue(cold('--(t|)', BOOLEAN)); + spyOn(resolver, 'createAdminMenu$').and.returnValue(cold('----(t|)', BOOLEAN)); + + expect(resolver.resolve(null, null)).toBeObservable(cold('----(t|)', BOOLEAN)); + }); + }); + + describe('createPublicMenu$', () => { + it('should retrieve the menu by ID return an Observable that emits true as soon as it is created', () => { + (menuService as any).getMenu.and.returnValue(cold('--u--m--', { + u: undefined, + m: MENU_STATE, + })); + + expect(resolver.createPublicMenu$()).toBeObservable(cold('-----(t|)', BOOLEAN)); + expect(menuService.getMenu).toHaveBeenCalledOnceWith(MenuID.PUBLIC); + }); + + describe('contents', () => { + beforeEach((done) => { + resolver.createPublicMenu$().subscribe((_) => { + done(); + }); + }); + + it('should include community list link', () => { + expect(menuService.addSection).toHaveBeenCalledWith(MenuID.PUBLIC, jasmine.objectContaining({ + id: 'browse_global_communities_and_collections', visible: true, + })); + }); + + it('should include browse dropdown', () => { + expect(menuService.addSection).toHaveBeenCalledWith(MenuID.PUBLIC, jasmine.objectContaining({ + id: 'browse_global_by_definition1', parentID: 'browse_global', visible: true, + })); + expect(menuService.addSection).toHaveBeenCalledWith(MenuID.PUBLIC, jasmine.objectContaining({ + id: 'browse_global_by_definition2', parentID: 'browse_global', visible: true, + })); + expect(menuService.addSection).toHaveBeenCalledWith(MenuID.PUBLIC, jasmine.objectContaining({ + id: 'browse_global_by_definition3', parentID: 'browse_global', visible: true, + })); + + expect(menuService.addSection).toHaveBeenCalledWith(MenuID.PUBLIC, jasmine.objectContaining({ + id: 'browse_global', visible: true, + })); + }); + }); + }); + + describe('createAdminMenu$', () => { + it('should retrieve the menu by ID return an Observable that emits true as soon as it is created', () => { + (menuService as any).getMenu.and.returnValue(cold('--u--m', { + u: undefined, + m: MENU_STATE, + })); + + expect(resolver.createAdminMenu$()).toBeObservable(cold('-----(t|)', BOOLEAN)); + expect(menuService.getMenu).toHaveBeenCalledOnceWith(MenuID.ADMIN); + }); + + describe('for regular user', () => { + beforeEach(() => { + authorizationService.isAuthorized = createSpy('isAuthorized').and.callFake(() => { + return observableOf(false); + }); + }); + + beforeEach((done) => { + resolver.createAdminMenu$().subscribe((_) => { + done(); + }); + }); + + it('should not show site admin section', () => { + expect(menuService.addSection).toHaveBeenCalledWith(MenuID.ADMIN, jasmine.objectContaining({ + id: 'admin_search', visible: false, + })); + expect(menuService.addSection).toHaveBeenCalledWith(MenuID.ADMIN, jasmine.objectContaining({ + id: 'registries', visible: false, + })); + expect(menuService.addSection).toHaveBeenCalledWith(MenuID.ADMIN, jasmine.objectContaining({ + parentID: 'registries', visible: false, + })); + expect(menuService.addSection).toHaveBeenCalledWith(MenuID.ADMIN, jasmine.objectContaining({ + id: 'curation_tasks', visible: false, + })); + expect(menuService.addSection).toHaveBeenCalledWith(MenuID.ADMIN, jasmine.objectContaining({ + id: 'workflow', visible: false, + })); + }); + + it('should not show edit_community', () => { + expect(menuService.addSection).toHaveBeenCalledWith(MenuID.ADMIN, jasmine.objectContaining({ + id: 'edit_community', visible: false, + })); + + }); + + it('should not show edit_collection', () => { + expect(menuService.addSection).toHaveBeenCalledWith(MenuID.ADMIN, jasmine.objectContaining({ + id: 'edit_collection', visible: false, + })); + }); + + it('should not show access control section', () => { + expect(menuService.addSection).toHaveBeenCalledWith(MenuID.ADMIN, jasmine.objectContaining({ + id: 'access_control', visible: false, + })); + expect(menuService.addSection).toHaveBeenCalledWith(MenuID.ADMIN, jasmine.objectContaining({ + parentID: 'access_control', visible: false, + })); + + }); + }); + + describe('for site admin', () => { + beforeEach(() => { + authorizationService.isAuthorized = createSpy('isAuthorized').and.callFake((featureID: FeatureID) => { + return observableOf(featureID === FeatureID.AdministratorOf); + }); + }); + + beforeEach((done) => { + resolver.createAdminMenu$().subscribe((_) => { + done(); + }); + }); + + it('should contain site admin section', () => { + expect(menuService.addSection).toHaveBeenCalledWith(MenuID.ADMIN, jasmine.objectContaining({ + id: 'admin_search', visible: true, + })); + expect(menuService.addSection).toHaveBeenCalledWith(MenuID.ADMIN, jasmine.objectContaining({ + id: 'registries', visible: true, + })); + expect(menuService.addSection).toHaveBeenCalledWith(MenuID.ADMIN, jasmine.objectContaining({ + parentID: 'registries', visible: true, + })); + expect(menuService.addSection).toHaveBeenCalledWith(MenuID.ADMIN, jasmine.objectContaining({ + id: 'curation_tasks', visible: true, + })); + expect(menuService.addSection).toHaveBeenCalledWith(MenuID.ADMIN, jasmine.objectContaining({ + id: 'workflow', visible: true, + })); + }); + }); + + describe('for community admin', () => { + beforeEach(() => { + authorizationService.isAuthorized = createSpy('isAuthorized').and.callFake((featureID: FeatureID) => { + return observableOf(featureID === FeatureID.IsCommunityAdmin); + }); + }); + + beforeEach((done) => { + resolver.createAdminMenu$().subscribe((_) => { + done(); + }); + }); + + it('should show edit_community', () => { + expect(menuService.addSection).toHaveBeenCalledWith(MenuID.ADMIN, jasmine.objectContaining({ + id: 'edit_community', visible: true, + })); + }); + }); + + describe('for collection admin', () => { + beforeEach(() => { + authorizationService.isAuthorized = createSpy('isAuthorized').and.callFake((featureID: FeatureID) => { + return observableOf(featureID === FeatureID.IsCollectionAdmin); + }); + }); + + beforeEach((done) => { + resolver.createAdminMenu$().subscribe((_) => { + done(); + }); + }); + + it('should show edit_collection', () => { + expect(menuService.addSection).toHaveBeenCalledWith(MenuID.ADMIN, jasmine.objectContaining({ + id: 'edit_collection', visible: true, + })); + }); + }); + + describe('for group admin', () => { + beforeEach(() => { + authorizationService.isAuthorized = createSpy('isAuthorized').and.callFake((featureID: FeatureID) => { + return observableOf(featureID === FeatureID.CanManageGroups); + }); + }); + + beforeEach((done) => { + resolver.createAdminMenu$().subscribe((_) => { + done(); + }); + }); + + it('should show access control section', () => { + expect(menuService.addSection).toHaveBeenCalledWith(MenuID.ADMIN, jasmine.objectContaining({ + id: 'access_control', visible: true, + })); + expect(menuService.addSection).toHaveBeenCalledWith(MenuID.ADMIN, jasmine.objectContaining({ + parentID: 'access_control', visible: true, + })); + }); + }); + }); }); diff --git a/src/app/menu.resolver.ts b/src/app/menu.resolver.ts index 12af6236fe..e6e30dcbcc 100644 --- a/src/app/menu.resolver.ts +++ b/src/app/menu.resolver.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; -import { Resolve, RouterStateSnapshot, ActivatedRouteSnapshot } from '@angular/router'; -import { Observable } from 'rxjs'; -import { MenuItemType, MenuID } from './shared/menu/initial-menus-state'; +import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router'; +import { combineLatest as observableCombineLatest, combineLatest, Observable } from 'rxjs'; +import { MenuID, MenuItemType } from './shared/menu/initial-menus-state'; import { LinkMenuItemModel } from './shared/menu/menu-item/models/link.model'; import { getFirstCompletedRemoteData } from './core/shared/operators'; import { PaginatedList } from './core/data/paginated-list.model'; @@ -11,28 +11,63 @@ import { TextMenuItemModel } from './shared/menu/menu-item/models/text.model'; import { BrowseService } from './core/browse/browse.service'; import { MenuService } from './shared/menu/menu.service'; import { MenuState } from './shared/menu/menu.reducer'; -import { find, map } from 'rxjs/operators'; +import { find, map, take } from 'rxjs/operators'; import { hasValue } from './shared/empty.util'; +import { FeatureID } from './core/data/feature-authorization/feature-id'; +import { CreateCommunityParentSelectorComponent } from './shared/dso-selector/modal-wrappers/create-community-parent-selector/create-community-parent-selector.component'; +import { OnClickMenuItemModel } from './shared/menu/menu-item/models/onclick.model'; +import { CreateCollectionParentSelectorComponent } from './shared/dso-selector/modal-wrappers/create-collection-parent-selector/create-collection-parent-selector.component'; +import { CreateItemParentSelectorComponent } from './shared/dso-selector/modal-wrappers/create-item-parent-selector/create-item-parent-selector.component'; +import { EditCommunitySelectorComponent } from './shared/dso-selector/modal-wrappers/edit-community-selector/edit-community-selector.component'; +import { EditCollectionSelectorComponent } from './shared/dso-selector/modal-wrappers/edit-collection-selector/edit-collection-selector.component'; +import { EditItemSelectorComponent } from './shared/dso-selector/modal-wrappers/edit-item-selector/edit-item-selector.component'; +import { ExportMetadataSelectorComponent } from './shared/dso-selector/modal-wrappers/export-metadata-selector/export-metadata-selector.component'; +import { AuthorizationDataService } from './core/data/feature-authorization/authorization-data.service'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; +/** + * Creates all of the app's menus + */ @Injectable({ providedIn: 'root' }) export class MenuResolver implements Resolve { constructor( protected menuService: MenuService, - public browseService: BrowseService, + protected browseService: BrowseService, + protected authorizationService: AuthorizationDataService, + protected modalService: NgbModal, ) { } + /** + * Initialize all menus + */ resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { - this.createPublicMenu(); - return this.menuService.getMenu(MenuID.PUBLIC).pipe( - find((menu: MenuState) => hasValue(menu)), - map(() => true) + return combineLatest([ + this.createPublicMenu$(), + this.createAdminMenu$(), + ]).pipe( + map((menusDone: boolean[]) => menusDone.every(Boolean)), ); } - createPublicMenu() { + /** + * Wait for a specific menu to appear + * @param id the ID of the menu to wait for + * @return an Observable that emits true as soon as the menu is created + */ + protected waitForMenu$(id: MenuID): Observable { + return this.menuService.getMenu(id).pipe( + find((menu: MenuState) => hasValue(menu)), + map(() => true), + ); + } + + /** + * Initialize all menu sections and items for {@link MenuID.PUBLIC} + */ + createPublicMenu$(): Observable { const menuList: any[] = [ /* Communities & Collections tree */ { @@ -84,6 +119,504 @@ export class MenuResolver implements Resolve { }))); }); + return this.waitForMenu$(MenuID.PUBLIC); + } + + /** + * Initialize all menu sections and items for {@link MenuID.ADMIN} + */ + createAdminMenu$() { + this.createMainMenuSections(); + this.createSiteAdministratorMenuSections(); + this.createExportMenuSections(); + this.createImportMenuSections(); + this.createAccessControlMenuSections(); + + return this.waitForMenu$(MenuID.ADMIN); + } + + /** + * Initialize the main menu sections. + * edit_community / edit_collection is only included if the current user is a Community or Collection admin + */ + createMainMenuSections() { + combineLatest([ + this.authorizationService.isAuthorized(FeatureID.IsCollectionAdmin), + this.authorizationService.isAuthorized(FeatureID.IsCommunityAdmin), + this.authorizationService.isAuthorized(FeatureID.AdministratorOf) + ]).subscribe(([isCollectionAdmin, isCommunityAdmin, isSiteAdmin]) => { + const menuList = [ + /* News */ + { + id: 'new', + active: false, + visible: true, + model: { + type: MenuItemType.TEXT, + text: 'menu.section.new' + } as TextMenuItemModel, + icon: 'plus', + index: 0 + }, + { + id: 'new_community', + parentID: 'new', + active: false, + visible: isCommunityAdmin, + model: { + type: MenuItemType.ONCLICK, + text: 'menu.section.new_community', + function: () => { + this.modalService.open(CreateCommunityParentSelectorComponent); + } + } as OnClickMenuItemModel, + }, + { + id: 'new_collection', + parentID: 'new', + active: false, + visible: isCommunityAdmin, + model: { + type: MenuItemType.ONCLICK, + text: 'menu.section.new_collection', + function: () => { + this.modalService.open(CreateCollectionParentSelectorComponent); + } + } as OnClickMenuItemModel, + }, + { + id: 'new_item', + parentID: 'new', + active: false, + visible: true, + model: { + type: MenuItemType.ONCLICK, + text: 'menu.section.new_item', + function: () => { + this.modalService.open(CreateItemParentSelectorComponent); + } + } as OnClickMenuItemModel, + }, + { + id: 'new_process', + parentID: 'new', + active: false, + visible: isCollectionAdmin, + model: { + type: MenuItemType.LINK, + text: 'menu.section.new_process', + link: '/processes/new' + } as LinkMenuItemModel, + }, + // TODO: enable this menu item once the feature has been implemented + // { + // id: 'new_item_version', + // parentID: 'new', + // active: false, + // visible: true, + // model: { + // type: MenuItemType.LINK, + // text: 'menu.section.new_item_version', + // link: '' + // } as LinkMenuItemModel, + // }, + + /* Edit */ + { + id: 'edit', + active: false, + visible: true, + model: { + type: MenuItemType.TEXT, + text: 'menu.section.edit' + } as TextMenuItemModel, + icon: 'pencil-alt', + index: 1 + }, + { + id: 'edit_community', + parentID: 'edit', + active: false, + visible: isCommunityAdmin, + model: { + type: MenuItemType.ONCLICK, + text: 'menu.section.edit_community', + function: () => { + this.modalService.open(EditCommunitySelectorComponent); + } + } as OnClickMenuItemModel, + }, + { + id: 'edit_collection', + parentID: 'edit', + active: false, + visible: isCollectionAdmin, + model: { + type: MenuItemType.ONCLICK, + text: 'menu.section.edit_collection', + function: () => { + this.modalService.open(EditCollectionSelectorComponent); + } + } as OnClickMenuItemModel, + }, + { + id: 'edit_item', + parentID: 'edit', + active: false, + visible: true, + model: { + type: MenuItemType.ONCLICK, + text: 'menu.section.edit_item', + function: () => { + this.modalService.open(EditItemSelectorComponent); + } + } as OnClickMenuItemModel, + }, + + /* Statistics */ + // TODO: enable this menu item once the feature has been implemented + // { + // id: 'statistics_task', + // active: false, + // visible: true, + // model: { + // type: MenuItemType.LINK, + // text: 'menu.section.statistics_task', + // link: '' + // } as LinkMenuItemModel, + // icon: 'chart-bar', + // index: 8 + // }, + + /* Control Panel */ + // TODO: enable this menu item once the feature has been implemented + // { + // id: 'control_panel', + // active: false, + // visible: isSiteAdmin, + // model: { + // type: MenuItemType.LINK, + // text: 'menu.section.control_panel', + // link: '' + // } as LinkMenuItemModel, + // icon: 'cogs', + // index: 9 + // }, + + /* Processes */ + { + id: 'processes', + active: false, + visible: isSiteAdmin, + model: { + type: MenuItemType.LINK, + text: 'menu.section.processes', + link: '/processes' + } as LinkMenuItemModel, + icon: 'terminal', + index: 10 + }, + ]; + menuList.forEach((menuSection) => this.menuService.addSection(MenuID.ADMIN, Object.assign(menuSection, { + shouldPersistOnRouteChange: true + }))); + }); + } + + /** + * Create menu sections dependent on whether or not the current user is a site administrator and on whether or not + * the export scripts exist and the current user is allowed to execute them + */ + createExportMenuSections() { + const menuList = [ + /* Export */ + { + id: 'export', + active: false, + visible: true, + model: { + type: MenuItemType.TEXT, + text: 'menu.section.export' + } as TextMenuItemModel, + icon: 'file-export', + index: 3, + shouldPersistOnRouteChange: true + }, + // TODO: enable this menu item once the feature has been implemented + // { + // id: 'export_community', + // parentID: 'export', + // active: false, + // visible: true, + // model: { + // type: MenuItemType.LINK, + // text: 'menu.section.export_community', + // link: '' + // } as LinkMenuItemModel, + // shouldPersistOnRouteChange: true + // }, + // TODO: enable this menu item once the feature has been implemented + // { + // id: 'export_collection', + // parentID: 'export', + // active: false, + // visible: true, + // model: { + // type: MenuItemType.LINK, + // text: 'menu.section.export_collection', + // link: '' + // } as LinkMenuItemModel, + // shouldPersistOnRouteChange: true + // }, + // TODO: enable this menu item once the feature has been implemented + // { + // id: 'export_item', + // parentID: 'export', + // active: false, + // visible: true, + // model: { + // type: MenuItemType.LINK, + // text: 'menu.section.export_item', + // link: '' + // } as LinkMenuItemModel, + // shouldPersistOnRouteChange: true + // }, + ]; + menuList.forEach((menuSection) => this.menuService.addSection(MenuID.ADMIN, menuSection)); + + observableCombineLatest( + this.authorizationService.isAuthorized(FeatureID.AdministratorOf), + // this.scriptDataService.scriptWithNameExistsAndCanExecute(METADATA_EXPORT_SCRIPT_NAME) + ).pipe( + // TODO uncomment when #635 (https://github.com/DSpace/dspace-angular/issues/635) is fixed; otherwise even in production mode, the metadata export button is only available after a refresh (and not in dev mode) + // filter(([authorized, metadataExportScriptExists]: boolean[]) => authorized && metadataExportScriptExists), + take(1) + ).subscribe(() => { + this.menuService.addSection(MenuID.ADMIN, { + id: 'export_metadata', + parentID: 'export', + active: true, + visible: true, + model: { + type: MenuItemType.ONCLICK, + text: 'menu.section.export_metadata', + function: () => { + this.modalService.open(ExportMetadataSelectorComponent); + } + } as OnClickMenuItemModel, + shouldPersistOnRouteChange: true + }); + }); + } + + /** + * Create menu sections dependent on whether or not the current user is a site administrator and on whether or not + * the import scripts exist and the current user is allowed to execute them + */ + createImportMenuSections() { + const menuList = [ + /* Import */ + { + id: 'import', + active: false, + visible: true, + model: { + type: MenuItemType.TEXT, + text: 'menu.section.import' + } as TextMenuItemModel, + icon: 'file-import', + index: 2 + }, + // TODO: enable this menu item once the feature has been implemented + // { + // id: 'import_batch', + // parentID: 'import', + // active: false, + // visible: true, + // model: { + // type: MenuItemType.LINK, + // text: 'menu.section.import_batch', + // link: '' + // } as LinkMenuItemModel, + // } + ]; + menuList.forEach((menuSection) => this.menuService.addSection(MenuID.ADMIN, Object.assign(menuSection, { + shouldPersistOnRouteChange: true + }))); + + observableCombineLatest( + this.authorizationService.isAuthorized(FeatureID.AdministratorOf), + // this.scriptDataService.scriptWithNameExistsAndCanExecute(METADATA_IMPORT_SCRIPT_NAME) + ).pipe( + // TODO uncomment when #635 (https://github.com/DSpace/dspace-angular/issues/635) is fixed + // filter(([authorized, metadataImportScriptExists]: boolean[]) => authorized && metadataImportScriptExists), + take(1) + ).subscribe(() => { + this.menuService.addSection(MenuID.ADMIN, { + id: 'import_metadata', + parentID: 'import', + active: true, + visible: true, + model: { + type: MenuItemType.LINK, + text: 'menu.section.import_metadata', + link: '/admin/metadata-import' + } as LinkMenuItemModel, + shouldPersistOnRouteChange: true + }); + }); + } + + /** + * Create menu sections dependent on whether or not the current user is a site administrator + */ + createSiteAdministratorMenuSections() { + this.authorizationService.isAuthorized(FeatureID.AdministratorOf).subscribe((authorized) => { + const menuList = [ + /* Admin Search */ + { + id: 'admin_search', + active: false, + visible: authorized, + model: { + type: MenuItemType.LINK, + text: 'menu.section.admin_search', + link: '/admin/search' + } as LinkMenuItemModel, + icon: 'search', + index: 5 + }, + /* Registries */ + { + id: 'registries', + active: false, + visible: authorized, + model: { + type: MenuItemType.TEXT, + text: 'menu.section.registries' + } as TextMenuItemModel, + icon: 'list', + index: 6 + }, + { + id: 'registries_metadata', + parentID: 'registries', + active: false, + visible: authorized, + model: { + type: MenuItemType.LINK, + text: 'menu.section.registries_metadata', + link: 'admin/registries/metadata' + } as LinkMenuItemModel, + }, + { + id: 'registries_format', + parentID: 'registries', + active: false, + visible: authorized, + model: { + type: MenuItemType.LINK, + text: 'menu.section.registries_format', + link: 'admin/registries/bitstream-formats' + } as LinkMenuItemModel, + }, + + /* Curation tasks */ + { + id: 'curation_tasks', + active: false, + visible: authorized, + model: { + type: MenuItemType.LINK, + text: 'menu.section.curation_task', + link: 'admin/curation-tasks' + } as LinkMenuItemModel, + icon: 'filter', + index: 7 + }, + + /* Workflow */ + { + id: 'workflow', + active: false, + visible: authorized, + model: { + type: MenuItemType.LINK, + text: 'menu.section.workflow', + link: '/admin/workflow' + } as LinkMenuItemModel, + icon: 'user-check', + index: 11 + }, + ]; + + menuList.forEach((menuSection) => this.menuService.addSection(MenuID.ADMIN, Object.assign(menuSection, { + shouldPersistOnRouteChange: true + }))); + }); + } + + /** + * Create menu sections dependent on whether or not the current user can manage access control groups + */ + createAccessControlMenuSections() { + observableCombineLatest( + this.authorizationService.isAuthorized(FeatureID.AdministratorOf), + this.authorizationService.isAuthorized(FeatureID.CanManageGroups) + ).subscribe(([isSiteAdmin, canManageGroups]) => { + const menuList = [ + /* Access Control */ + { + id: 'access_control_people', + parentID: 'access_control', + active: false, + visible: isSiteAdmin, + model: { + type: MenuItemType.LINK, + text: 'menu.section.access_control_people', + link: '/access-control/epeople' + } as LinkMenuItemModel, + }, + { + id: 'access_control_groups', + parentID: 'access_control', + active: false, + visible: canManageGroups, + model: { + type: MenuItemType.LINK, + text: 'menu.section.access_control_groups', + link: '/access-control/groups' + } as LinkMenuItemModel, + }, + // TODO: enable this menu item once the feature has been implemented + // { + // id: 'access_control_authorizations', + // parentID: 'access_control', + // active: false, + // visible: authorized, + // model: { + // type: MenuItemType.LINK, + // text: 'menu.section.access_control_authorizations', + // link: '' + // } as LinkMenuItemModel, + // }, + { + id: 'access_control', + active: false, + visible: canManageGroups || isSiteAdmin, + model: { + type: MenuItemType.TEXT, + text: 'menu.section.access_control' + } as TextMenuItemModel, + icon: 'key', + index: 4 + }, + ]; + + menuList.forEach((menuSection) => this.menuService.addSection(MenuID.ADMIN, Object.assign(menuSection, { + shouldPersistOnRouteChange: true, + }))); + }); } } diff --git a/src/app/shared/testing/menu-service.stub.ts b/src/app/shared/testing/menu-service.stub.ts index 4f2828a7e1..ed1098955b 100644 --- a/src/app/shared/testing/menu-service.stub.ts +++ b/src/app/shared/testing/menu-service.stub.ts @@ -1,6 +1,6 @@ import { MenuID } from '../menu/initial-menus-state'; import { Observable, of as observableOf } from 'rxjs'; -import { MenuSection } from '../menu/menu.reducer'; +import { MenuSection, MenuState } from '../menu/menu.reducer'; export class MenuServiceStub { visibleSection1 = { @@ -77,6 +77,10 @@ export class MenuServiceStub { return observableOf(true); } + getMenu(id: MenuID): Observable { + return observableOf({} as MenuState); + } + getMenuTopSections(id: MenuID): Observable { return observableOf([this.visibleSection1, this.visibleSection2]); } From e65b5e2f1c6cadd428c338502ddff04c398d2c75 Mon Sep 17 00:00:00 2001 From: Yura Bondarenko Date: Wed, 27 Apr 2022 14:56:02 +0200 Subject: [PATCH 080/343] 90978: Update theme modules --- src/themes/custom/eager-theme.module.ts | 56 +++++++++++++++++++ src/themes/custom/entry-components.ts | 5 -- .../{theme.module.ts => lazy-theme.module.ts} | 56 +++++++------------ src/themes/dspace/eager-theme.module.ts | 13 ++--- src/themes/dspace/lazy-theme.module.ts | 4 +- src/themes/eager-themes.module.ts | 12 ++-- 6 files changed, 93 insertions(+), 53 deletions(-) create mode 100644 src/themes/custom/eager-theme.module.ts delete mode 100644 src/themes/custom/entry-components.ts rename src/themes/custom/{theme.module.ts => lazy-theme.module.ts} (91%) diff --git a/src/themes/custom/eager-theme.module.ts b/src/themes/custom/eager-theme.module.ts new file mode 100644 index 0000000000..f226e60722 --- /dev/null +++ b/src/themes/custom/eager-theme.module.ts @@ -0,0 +1,56 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { SharedModule } from '../../app/shared/shared.module'; +import { HomeNewsComponent } from './app/home-page/home-news/home-news.component'; +import { NavbarComponent } from './app/navbar/navbar.component'; +import { HeaderComponent } from './app/header/header.component'; +import { HeaderNavbarWrapperComponent } from './app/header-nav-wrapper/header-navbar-wrapper.component'; +import { SearchModule } from '../../app/shared/search/search.module'; +import { RootModule } from '../../app/root.module'; +import { NavbarModule } from '../../app/navbar/navbar.module'; +import { PublicationComponent } from './app/item-page/simple/item-types/publication/publication.component'; +import { ItemPageModule } from '../../app/item-page/item-page.module'; + +/** + * Add components that use a custom decorator to ENTRY_COMPONENTS as well as DECLARATIONS. + * This will ensure that decorator gets picked up when the app loads + */ +const ENTRY_COMPONENTS = [ + PublicationComponent, +]; + +const DECLARATIONS = [ + ...ENTRY_COMPONENTS, + HomeNewsComponent, + HeaderComponent, + HeaderNavbarWrapperComponent, + NavbarComponent, +]; + +@NgModule({ + imports: [ + CommonModule, + SharedModule, + SearchModule, + FormsModule, + RootModule, + NavbarModule, + ItemPageModule, + ], + declarations: DECLARATIONS, + providers: [ + ...ENTRY_COMPONENTS.map((component) => ({ provide: component })) + ], +}) +/** + * This module is included in the main bundle that gets downloaded at first page load. So it should + * contain only the themed components that have to be available immediately for the first page load, + * and the minimal set of imports required to make them work. Anything you can cut from it will make + * the initial page load faster, but may cause the page to flicker as components that were already + * rendered server side need to be lazy-loaded again client side + * + * Themed EntryComponents should also be added here + */ +export class EagerThemeModule { +} diff --git a/src/themes/custom/entry-components.ts b/src/themes/custom/entry-components.ts deleted file mode 100644 index b518e4cc45..0000000000 --- a/src/themes/custom/entry-components.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { PublicationComponent } from './app/item-page/simple/item-types/publication/publication.component'; - -export const ENTRY_COMPONENTS = [ - PublicationComponent -]; diff --git a/src/themes/custom/theme.module.ts b/src/themes/custom/lazy-theme.module.ts similarity index 91% rename from src/themes/custom/theme.module.ts rename to src/themes/custom/lazy-theme.module.ts index 453f366b28..07464cda2a 100644 --- a/src/themes/custom/theme.module.ts +++ b/src/themes/custom/lazy-theme.module.ts @@ -28,20 +28,28 @@ import { StatisticsModule } from '../../app/statistics/statistics.module'; import { StoreModule } from '@ngrx/store'; import { StoreRouterConnectingModule } from '@ngrx/router-store'; import { TranslateModule } from '@ngx-translate/core'; -import { HomeNewsComponent } from './app/home-page/home-news/home-news.component'; -import { HomePageComponent } from './app/home-page/home-page.component'; import { HomePageModule } from '../../app/home-page/home-page.module'; -import { RootComponent } from './app/root/root.component'; import { AppModule } from '../../app/app.module'; -import { PublicationComponent } from './app/item-page/simple/item-types/publication/publication.component'; import { ItemPageModule } from '../../app/item-page/item-page.module'; import { RouterModule } from '@angular/router'; -import { AccessControlModule } from '../../app/access-control/access-control.module'; +import { CommunityListPageModule } from '../../app/community-list-page/community-list-page.module'; +import { InfoModule } from '../../app/info/info.module'; +import { StatisticsPageModule } from '../../app/statistics-page/statistics-page.module'; +import { CommunityPageModule } from '../../app/community-page/community-page.module'; +import { CollectionPageModule } from '../../app/collection-page/collection-page.module'; +import { SubmissionModule } from '../../app/submission/submission.module'; +import { MyDSpacePageModule } from '../../app/my-dspace-page/my-dspace-page.module'; +import { SearchModule } from '../../app/shared/search/search.module'; +import { ResourcePoliciesModule } from '../../app/shared/resource-policies/resource-policies.module'; +import { ComcolModule } from '../../app/shared/comcol/comcol.module'; +import { RootModule } from '../../app/root.module'; +import { FileSectionComponent } from './app/item-page/simple/field-components/file-section/file-section.component'; +import { HomePageComponent } from './app/home-page/home-page.component'; +import { RootComponent } from './app/root/root.component'; import { BrowseBySwitcherComponent } from './app/browse-by/browse-by-switcher/browse-by-switcher.component'; import { CommunityListPageComponent } from './app/community-list-page/community-list-page.component'; -import { CommunityListPageModule } from '../../app/community-list-page/community-list-page.module'; import { SearchPageComponent } from './app/search-page/search-page.component'; -import { InfoModule } from '../../app/info/info.module'; +import { ConfigurationSearchPageComponent } from './app/search-page/configuration-search-page.component'; import { EndUserAgreementComponent } from './app/info/end-user-agreement/end-user-agreement.component'; import { PageNotFoundComponent } from './app/pagenotfound/pagenotfound.component'; import { ObjectNotFoundComponent } from './app/lookup-by-id/objectnotfound/objectnotfound.component'; @@ -49,14 +57,10 @@ import { ForbiddenComponent } from './app/forbidden/forbidden.component'; import { PrivacyComponent } from './app/info/privacy/privacy.component'; import { CollectionStatisticsPageComponent } from './app/statistics-page/collection-statistics-page/collection-statistics-page.component'; import { CommunityStatisticsPageComponent } from './app/statistics-page/community-statistics-page/community-statistics-page.component'; -import { StatisticsPageModule } from '../../app/statistics-page/statistics-page.module'; import { ItemStatisticsPageComponent } from './app/statistics-page/item-statistics-page/item-statistics-page.component'; import { SiteStatisticsPageComponent } from './app/statistics-page/site-statistics-page/site-statistics-page.component'; import { CommunityPageComponent } from './app/community-page/community-page.component'; import { CollectionPageComponent } from './app/collection-page/collection-page.component'; -import { CommunityPageModule } from '../../app/community-page/community-page.module'; -import { CollectionPageModule } from '../../app/collection-page/collection-page.module'; -import { ConfigurationSearchPageComponent } from './app/search-page/configuration-search-page.component'; import { ItemPageComponent } from './app/item-page/simple/item-page.component'; import { FullItemPageComponent } from './app/item-page/full/full-item-page.component'; import { LoginPageComponent } from './app/login-page/login-page.component'; @@ -66,32 +70,19 @@ import { ForgotEmailComponent } from './app/forgot-password/forgot-password-emai import { ForgotPasswordFormComponent } from './app/forgot-password/forgot-password-form/forgot-password-form.component'; import { ProfilePageComponent } from './app/profile-page/profile-page.component'; import { RegisterEmailComponent } from './app/register-page/register-email/register-email.component'; +import { MyDSpacePageComponent } from './app/my-dspace-page/my-dspace-page.component'; import { SubmissionEditComponent } from './app/submission/edit/submission-edit.component'; import { SubmissionImportExternalComponent } from './app/submission/import-external/submission-import-external.component'; import { SubmissionSubmitComponent } from './app/submission/submit/submission-submit.component'; -import { MyDSpacePageComponent } from './app/my-dspace-page/my-dspace-page.component'; -import { WorkflowItemSendBackComponent } from './app/workflowitems-edit-page/workflow-item-send-back/workflow-item-send-back.component'; import { WorkflowItemDeleteComponent } from './app/workflowitems-edit-page/workflow-item-delete/workflow-item-delete.component'; -import { SubmissionModule } from '../../app/submission/submission.module'; -import { MyDSpacePageModule } from '../../app/my-dspace-page/my-dspace-page.module'; -import { NavbarComponent } from './app/navbar/navbar.component'; -import { HeaderComponent } from './app/header/header.component'; -import { FooterComponent } from './app/footer/footer.component'; +import { WorkflowItemSendBackComponent } from './app/workflowitems-edit-page/workflow-item-send-back/workflow-item-send-back.component'; import { BreadcrumbsComponent } from './app/breadcrumbs/breadcrumbs.component'; -import { HeaderNavbarWrapperComponent } from './app/header-nav-wrapper/header-navbar-wrapper.component'; -import { FileSectionComponent } from './app/item-page/simple/field-components/file-section/file-section.component'; -import { SearchModule } from '../../app/shared/search/search.module'; -import { ResourcePoliciesModule } from '../../app/shared/resource-policies/resource-policies.module'; -import { ComcolModule } from '../../app/shared/comcol/comcol.module'; import { FeedbackComponent } from './app/info/feedback/feedback.component'; -import { RootModule } from '../../app/root.module'; const DECLARATIONS = [ FileSectionComponent, HomePageComponent, - HomeNewsComponent, RootComponent, - PublicationComponent, BrowseBySwitcherComponent, CommunityListPageComponent, SearchPageComponent, @@ -122,17 +113,12 @@ const DECLARATIONS = [ SubmissionSubmitComponent, WorkflowItemDeleteComponent, WorkflowItemSendBackComponent, - FooterComponent, - HeaderComponent, - NavbarComponent, - HeaderNavbarWrapperComponent, BreadcrumbsComponent, - FeedbackComponent + FeedbackComponent, ]; @NgModule({ imports: [ - AccessControlModule, AdminRegistriesModule, AdminSearchModule, AdminWorkflowModuleModule, @@ -178,9 +164,9 @@ const DECLARATIONS = [ SearchModule, FormsModule, ResourcePoliciesModule, - ComcolModule + ComcolModule, ], - declarations: DECLARATIONS + declarations: DECLARATIONS, }) /** @@ -190,5 +176,5 @@ const DECLARATIONS = [ * It is purposefully not exported, it should never be imported anywhere else, its only purpose is * to give lazily loaded components a context in which they can be compiled successfully */ -class ThemeModule { +class LazyThemeModule { } diff --git a/src/themes/dspace/eager-theme.module.ts b/src/themes/dspace/eager-theme.module.ts index 3f043d32de..5dd114cd72 100644 --- a/src/themes/dspace/eager-theme.module.ts +++ b/src/themes/dspace/eager-theme.module.ts @@ -5,25 +5,24 @@ import { SharedModule } from '../../app/shared/shared.module'; import { HomeNewsComponent } from './app/home-page/home-news/home-news.component'; import { NavbarComponent } from './app/navbar/navbar.component'; import { HeaderComponent } from './app/header/header.component'; -import { - HeaderNavbarWrapperComponent -} from './app/header-nav-wrapper/header-navbar-wrapper.component'; +import { HeaderNavbarWrapperComponent } from './app/header-nav-wrapper/header-navbar-wrapper.component'; import { SearchModule } from '../../app/shared/search/search.module'; import { RootModule } from '../../app/root.module'; import { NavbarModule } from '../../app/navbar/navbar.module'; /** - * Add components that use a custom decorator to ENTRY_COM&PONENTS as well as DECLARATIONS. This will - * ensure that decorator gets picked up when the app loads + * Add components that use a custom decorator to ENTRY_COMPONENTS as well as DECLARATIONS. + * This will ensure that decorator gets picked up when the app loads */ const ENTRY_COMPONENTS = [ ]; const DECLARATIONS = [ + ...ENTRY_COMPONENTS, HomeNewsComponent, HeaderComponent, HeaderNavbarWrapperComponent, - NavbarComponent + NavbarComponent, ]; @NgModule({ @@ -38,7 +37,7 @@ const DECLARATIONS = [ declarations: DECLARATIONS, providers: [ ...ENTRY_COMPONENTS.map((component) => ({ provide: component })) - ] + ], }) /** * This module is included in the main bundle that gets downloaded at first page load. So it should diff --git a/src/themes/dspace/lazy-theme.module.ts b/src/themes/dspace/lazy-theme.module.ts index c87a2b67a2..a4e8027a15 100644 --- a/src/themes/dspace/lazy-theme.module.ts +++ b/src/themes/dspace/lazy-theme.module.ts @@ -106,9 +106,9 @@ const DECLARATIONS = [ SearchModule, FormsModule, ResourcePoliciesModule, - ComcolModule + ComcolModule, ], - declarations: DECLARATIONS + declarations: DECLARATIONS, }) /** diff --git a/src/themes/eager-themes.module.ts b/src/themes/eager-themes.module.ts index 7af4a0edc6..4a46595f35 100644 --- a/src/themes/eager-themes.module.ts +++ b/src/themes/eager-themes.module.ts @@ -1,14 +1,18 @@ import { NgModule } from '@angular/core'; import { EagerThemeModule as DSpaceEagerThemeModule } from './dspace/eager-theme.module'; +// import { EagerThemeModule as CustomEagerThemeModule } from './custom/eager-theme.module'; /** - * This module only serves to ensure themed entry components are discoverable. It's kept separate - * from the theme modules to ensure only the minimal number of theme components is loaded ahead of - * time + * This module bundles the eager theme modules for all available themes. + * Eager modules contain components that are present on every page (to speed up initial loading) + * and entry components (to ensure their decorators get picked up). + * + * Themes that aren't in use should not be imported here so they don't take up unnecessary space in the main bundle. */ @NgModule({ imports: [ - DSpaceEagerThemeModule + DSpaceEagerThemeModule, + // CustomEagerThemeModule, ], }) export class EagerThemesModule { From 7e391f04113c09857c84cf8274a58571ffebf6cf Mon Sep 17 00:00:00 2001 From: Yura Bondarenko Date: Thu, 28 Apr 2022 09:22:28 +0200 Subject: [PATCH 081/343] 90978: Serve pre-compressed static files --- package.json | 1 + server.ts | 18 +++++++-- webpack/webpack.browser.ts | 4 +- yarn.lock | 76 +++++++++++++++++++++++++++++++++++--- 4 files changed, 88 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 4a9d2f144f..8be2b57c04 100644 --- a/package.json +++ b/package.json @@ -152,6 +152,7 @@ "debug-loader": "^0.0.1", "deep-freeze": "0.0.1", "dotenv": "^8.2.0", + "express-static-gzip": "^2.1.5", "fork-ts-checker-webpack-plugin": "^6.0.3", "html-loader": "^1.3.2", "html-webpack-plugin": "^4.5.0", diff --git a/server.ts b/server.ts index da3b877bc1..8f9543b83c 100644 --- a/server.ts +++ b/server.ts @@ -25,6 +25,7 @@ import * as morgan from 'morgan'; import * as express from 'express'; import * as bodyParser from 'body-parser'; import * as compression from 'compression'; +import * as expressStaticGzip from 'express-static-gzip'; import { existsSync, readFileSync } from 'fs'; import { join } from 'path'; @@ -74,11 +75,15 @@ export function app() { /* * If production mode is enabled in the environment file: * - Enable Angular's production mode - * - Enable compression for response bodies. See [compression](https://github.com/expressjs/compression) + * - Enable compression for SSR reponses. See [compression](https://github.com/expressjs/compression) */ if (environment.production) { enableProdMode(); - server.use(compression()); + server.use(compression({ + // only compress responses we've marked as SSR + // otherwise, this middleware may compress files we've chosen not to compress via compression-webpack-plugin + filter: (_, res) => res.locals.ssr, + })); } /* @@ -150,8 +155,14 @@ export function app() { /* * Serve static resources (images, i18n messages, …) + * Handle pre-compressed files with [express-static-gzip](https://github.com/tkoenig89/express-static-gzip) */ - server.get('*.*', cacheControl, express.static(DIST_FOLDER, { index: false })); + server.get('*.*', cacheControl, expressStaticGzip(DIST_FOLDER, { + index: false, + enableBrotli: true, + orderPreference: ['br', 'gzip'], + })); + /* * Fallthrough to the IIIF viewer (must be included in the build). */ @@ -180,6 +191,7 @@ function ngApp(req, res) { providers: [{ provide: APP_BASE_HREF, useValue: req.baseUrl }] }, (err, data) => { if (hasNoValue(err) && hasValue(data)) { + res.locals.ssr = true; // mark response as SSR res.send(data); } else if (hasValue(err) && err.code === 'ERR_HTTP_HEADERS_SENT') { // When this error occurs we can't fall back to CSR because the response has already been diff --git a/webpack/webpack.browser.ts b/webpack/webpack.browser.ts index 400da57bf0..b6e6d2f986 100644 --- a/webpack/webpack.browser.ts +++ b/webpack/webpack.browser.ts @@ -16,14 +16,14 @@ module.exports = Object.assign({}, commonExports, { new CompressionPlugin({ filename: '[path][base].gz', algorithm: 'gzip', - test: /\.(js|css|html|svg)$/, + test: /\.(js|css|html|svg|json5)$/, threshold: 10240, minRatio: 0.8, }), new CompressionPlugin({ filename: '[path][base].br', algorithm: 'brotliCompress', - test: /\.(js|css|html|svg)$/, + test: /\.(js|css|html|svg|json5)$/, compressionOptions: { params: { [zlib.constants.BROTLI_PARAM_QUALITY]: 11, diff --git a/yarn.lock b/yarn.lock index 7f55750ba8..ad8cb4ef25 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5230,16 +5230,16 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= +depd@2.0.0, depd@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + depd@^1.1.2, depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= -depd@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - dependency-graph@^0.7.2: version "0.7.2" resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-0.7.2.tgz#91db9de6eb72699209d88aea4c1fd5221cac1c49" @@ -5258,6 +5258,11 @@ des.js@^1.0.0: inherits "^2.0.1" minimalistic-assert "^1.0.0" +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" @@ -5951,6 +5956,13 @@ express-rate-limit@^5.1.3: resolved "https://registry.yarnpkg.com/express-rate-limit/-/express-rate-limit-5.5.1.tgz#110c23f6a65dfa96ab468eda95e71697bc6987a2" integrity sha512-MTjE2eIbHv5DyfuFz4zLYWxpqVhEhkTiwFGuB74Q9CSou2WHO52nlE5y3Zlg6SIsiYUIPj6ifFxnkPz6O3sIUg== +express-static-gzip@^2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/express-static-gzip/-/express-static-gzip-2.1.5.tgz#e45b512ef5596a068c45f729d7e0cc0b429b08b4" + integrity sha512-bgiQ1fY7ltuUrSzg0WoN7ycoAd7r2VEw7durn/3k0jCMUC5wydF0K36ouIuJPE+MNDwK5uoSaVgIBVNemwxWgw== + dependencies: + serve-static "^1.14.1" + express@^4.17.1: version "4.17.1" resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" @@ -6992,6 +7004,17 @@ http-errors@1.8.1: statuses ">= 1.5.0 < 2" toidentifier "1.0.1" +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + http-errors@~1.6.2: version "1.6.3" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" @@ -9260,7 +9283,7 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@^2.0.0, ms@^2.1.1: +ms@2.1.3, ms@^2.0.0, ms@^2.1.1: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -9757,6 +9780,13 @@ obuf@^1.0.0, obuf@^1.1.2: resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" @@ -12670,6 +12700,25 @@ send@0.17.1: range-parser "~1.2.1" statuses "~1.5.0" +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + serialize-javascript@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" @@ -12717,6 +12766,16 @@ serve-static@1.14.1: parseurl "~1.3.3" send "0.17.1" +serve-static@^1.14.1: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + server-destroy@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/server-destroy/-/server-destroy-1.0.1.tgz#f13bf928e42b9c3e79383e61cc3998b5d14e6cdd" @@ -13256,6 +13315,11 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + "statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" From 572a10db6be8745ff1bf6bf9d381113c17de1f31 Mon Sep 17 00:00:00 2001 From: Yura Bondarenko Date: Wed, 27 Apr 2022 18:13:44 +0200 Subject: [PATCH 082/343] 90978: Responsive banner background image --- .../home-news/home-news.component.html | 7 ++++++- .../home-news/home-news.component.scss | 17 +++++++++++++---- .../dspace/assets/images/banner-half.jpg | Bin 0 -> 290658 bytes .../dspace/assets/images/banner-half.webp | Bin 0 -> 156066 bytes .../dspace/assets/images/banner-tall.jpg | Bin 0 -> 281395 bytes .../dspace/assets/images/banner-tall.webp | Bin 0 -> 117724 bytes src/themes/dspace/assets/images/banner.webp | Bin 0 -> 369906 bytes 7 files changed, 19 insertions(+), 5 deletions(-) create mode 100644 src/themes/dspace/assets/images/banner-half.jpg create mode 100644 src/themes/dspace/assets/images/banner-half.webp create mode 100644 src/themes/dspace/assets/images/banner-tall.jpg create mode 100644 src/themes/dspace/assets/images/banner-tall.webp create mode 100644 src/themes/dspace/assets/images/banner.webp diff --git a/src/themes/dspace/app/home-page/home-news/home-news.component.html b/src/themes/dspace/app/home-page/home-news/home-news.component.html index 92ce1ba020..ef576ed99c 100644 --- a/src/themes/dspace/app/home-page/home-news/home-news.component.html +++ b/src/themes/dspace/app/home-page/home-news/home-news.component.html @@ -1,4 +1,4 @@ -
+
@@ -30,5 +30,10 @@
+ + + + + Photo by @inspiredimages
diff --git a/src/themes/dspace/app/home-page/home-news/home-news.component.scss b/src/themes/dspace/app/home-page/home-news/home-news.component.scss index 5e89f6b62f..93ec1763f3 100644 --- a/src/themes/dspace/app/home-page/home-news/home-news.component.scss +++ b/src/themes/dspace/app/home-page/home-news/home-news.component.scss @@ -2,12 +2,21 @@ display: block; margin-top: calc(var(--ds-content-spacing) * -1); - div.background-image { + div.background-image-container { color: white; - background-color: var(--bs-info); position: relative; - background-image: url('/assets/dspace/images/banner.jpg'); - background-size: cover; + + .background-image > img { + background-color: var(--bs-info); + position: absolute; + z-index: -1; + top: 0; + left: 0; + width: 100%; + height: 100%; + object-fit: cover; + object-position: top; + } .container { position: relative; diff --git a/src/themes/dspace/assets/images/banner-half.jpg b/src/themes/dspace/assets/images/banner-half.jpg new file mode 100644 index 0000000000000000000000000000000000000000..31610cc35021c4f4f660850354892db111d38298 GIT binary patch literal 290658 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

r>7cia++t=(D!v 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

  • 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%0A+@MZj1 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 aM;py#OPRc=sABIo2U#3Esg2o000009Yy%De literal 0 HcmV?d00001 diff --git a/src/themes/dspace/assets/images/banner.webp b/src/themes/dspace/assets/images/banner.webp new file mode 100644 index 0000000000000000000000000000000000000000..7745766f0543502e2f09becad46a7c9d1f4c9089 GIT binary patch literal 369906 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%0D`pnm+aFR1&Uw({xU!Fq?z0P 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%0Ab54pDNFzW00Ddf954V7 zwtGlG03c7VyDk8u0OsuCxf>W-R)b!WjJ#p4i4XWChP~@Tz65ZU_cDtk$QtOAdKqh$ zRul~X=qBpr1=^G$Cz+uQ-5`48YQe6SPfypRLH*%NxkoJt(`z%5vZ;B><|m06B_@CkbyGWhuGmq< zQ+x>ZvhP_0yeQi|ZB}eClh~&5MZt4O+(n;PJ$4InsceVNAyiL=7LYImFK#_!oytvX zlW@4$yDTC~875oN9u}Hl$f+?Z`A8`^-GdDC`chD8Obhp4YjOC zugB$WykL9C6Ri=rhfNIq zCt5L@)%9<6K~oz~vWf%HMl-iQvY)7Uen_GFS&a&lJeGv-Bw}_!Tf$-`ihE1(AI;zT z7JUyNK(`9Y0dDF_6R0fZfwvP?O;!2yo1X3AyNZ1B?d+RHiV|$@oat{YA^Oj3ev%jStDrK&VXNy8yRpoxIAv^H?L{!O=Di z1Os_x92Pm3QzCGa%{V@Uf zak`07LPPaItgJDI!p1UFx9|dVl5b_lftLT1pb-pj=e=DB2~%X`vd85UFj9KzqM~{k z{aB<1a`e`bcz^UoB#R1cOE`LBAz1FqZ$<4P@V`~}ua5|OaUB*PmXY&PXj0z}@cs+%gs%)j#PY{AZXLyxwRaFtY~_nizQz4Yea*wUUpp z!|=%{qo^%J79fdLo|Y)X=mT*(h^7dgjSq{?Qy+=13j~_J{D@$I{W6~V)`%f$nsb*< zg}+QDab{T#JCwJ%;e`x{R+|z?2|F|BnLQsvH(<52yk3|A^VnrR$3d)X+OtqEsVQyb z2#h)Y4AVce)97F^eA3Y*Tx0wmR*j`Y`wJT6=>MgF43_mvMFt;uHxPq`sxnBWM6gK2 zqX(nfFNaSOF;B(e<|#2iDTWPT};&qc*weAcg{1?k7-Huu`Ymc>>S$( zAN;a*(kPicIAFP$zdbS>BkvX|p$J`rBnLYeHb}sGr4J@9MiM|Budat-Ir2<|0Kstr zrciDBH(hBckychqC#~&x!LYRT3HCloHSJOA0=pbPRG$m1jr5zdu&vEGzYh82dsRIU zyx!$!&N~$HRO~4H`M|dqPMOCQDY%FK*4I$5|Fz!m(J~_OECi!)nMeIrO^;eAg^u<9 zsRAvun&Xt5o^#Ng{gFvaFjk&0QEtv^Xtbq!)PTIi9RMAr5qA3Rt$HJcon$!FD-R|=SvaJL zFg+hr1QS0Zv!&GJuCH!@01ab~KmY&$p9BB^l|QYCz;&r*1(=_hk>lF{2Hi41lo>$_ z_vQi}qDUJ8WdIyUftz})BKSaxphN5$7opr=#OzwxP>mWYfx&o1yh8nJLD@fWa!*Xj zX7FWX*gQEB-yfg6T*n-ece1o7Bq5|aj)Otu=-cxfK@$qHIMEK7x^V`*A|~|yo$2G4 zh@YjQkwQeDmy20s6x<*A0_;#0?M?%`HTJiU!H_=7Pn0!-*|pe>#RLbTdZa@^V$rq`cSz(nr0MGx_qwE>@D)|adCl^I% z7bWrup0;z&mlf{Dd?=+EMYmXhpgwD8HH4(*${HcQcxqM+RFEt^BfN=O>Og3ai&lRd z<+$v{cMn`0h!7%FW441=z(r08Z{lh%)@h3UDTNbOc82}rU1i1|2TePypK`Vc z*vv?IqM*AeKFc4ysp4iH$8{ei?T304JF_o@DyIlq>8l9@7-=<;o=3!M{5;2MAB0|J zAIy3_M?GU>Q9e?kXZ2s8noI}l3tx;5aPqznu4pzkOwFX42)#xtEM(RsXHGbgI}QWq z$IM?8g`d9Mc(#eo-8~A)3ic9*;6Xa~k>$US`aSf8Y$*zMv!%B*;VykH0}YIJ7&e!V zJ41E~U<_q#u>w`7gr4RUbe21H?C?pm?{&OOk>vAdAjT+oCXZRWTZ@d;x-goMHSUl; zyEbtR9oPiac^cc~H6Oz$J(V@D;T*;D_4he8`31Y-^)guAUrmR@!Nj117Mzbt;#!$q zMmW9MT*5dbaM|3Au9^+-y{E5-8u-`Ky%}H3alHyGmwz}bWrzw{qrTdX{NRTmI~{KFH@bcDvJ8 za$5=Y2PQq^`4GiTe(Sv=PaQoX5;f_o{o_-1AHuAYO|YH4TSddT8Z;W@F5;j zC)~18;Q04_S>|w59<>XlpGIsbcyXDj+|5zxZ$_OSCmE@_A1Y>Ai6MbKw=iBN+s<5F zw&&L_fXr|A9NXVCgBDk5D@g;h=Yrb$hKEkzLkuo>KE3*|V>vSpv5~bV0kfckR?^|C z=K;E2GQ-Atg@XM(|C>!>rLYa1AglLmHd(u}=gJaDnJHkY1#w@rSE_}Ms+-2UxWw-a zBNRr#n7l|Q_=+i|m^tVJ<~Yfr3Th3a6f~_<=1;{4sL}6KBLd>(G~UD!GHi|t>d@*j z%Z%->9S=W4;xd;c6`!{dac(fq+|eW+L+tu`dZD+mKhMB@qC+8o*pp=N-s*04y+iMh zFjV()K*q^d4P2Y4qjpl4+;+WYpT4ZJ&D2-XhlG(OhjAG^c!4lOymnw4t~K-=tPbXL zSKPY%5X%(r*PG?n+xME<;_k+A5ni~u!cT?Q5XWuOl=Ger0GbMvWy3lDm?4o8Im-;d z3bgqqPy$)(K>1DI9G%BFm(<&zCQ$jiNvjHT(D)~+%bQ&+^G9xrFCeA)aSR@Ii&o;& z2<~R=DNSS>dRJxuw6bQ&y5$7O#BGM{ZD?&kdF%vQG`4yf3cl+y8MnBt7T9O}X z0rjXZcmpmUMsT?{lG5?aS%Za-9w3isXdPRJUl9cex`aVeN3wkeqckk!4LGoN%8@Dh zor``@6#CAVr`M=c=WjN5HD=B2yeU*0dZhjiRfK|~0Te67_gJt2;TUh@Mh5Z`B!K$> zBZN>e2gdq{C1w8H?<_U_+O@>BPiB%rC@TR2k?HJ~lJ)P_xp>s`GDimCIc?q`xOTre zBldZalr49LV7{LC7*mlvqVJbv1aR7+FQTt*ZROOyqP5<3`@lz!yBd0?;x4-YsFYKs zkyrHlnH^=a;*o342pu-D&SUhCfZW-u>6T!Y#c8OSVgwvbU`xuNn_*`=!WH$0QUQkK z-z3L!op}r?YX`jZceFyJEQm?bWD8BGPUg-)@B!<=mcONYkt`qjQ$Ef!Fxm|jGl^=*=N?Ss0a7CQ0viS;pDS?oFxP2Hc69vbNU&)1^{&uck zI<+9(>3;rhu^@97R0b*TOmXngE+I69xWDrAS!XB@L^69HzG%-kK*9rR0Y7xpjq76U zZJ2b~4#^Dd(|C&qpvzKF^~6uEX0Fl$vbhO%#vXF8;VM2j!Tmj)Do}0R7>q~&uiRpi zif1Wf+a0Yx+o8@PXNk90s?<7VVZ-d+4RlPDF0XXX5OjCyDMMD_^lxcBtbcz9Rw%W%t$5)FCa-Qq)40u~8sGx&pv8X^;U7|?ddwM-Yu4$<1 znttR0*^GsqB%@~}o&HZuc=pj#*Ymj$?NxaM6Q&-;>tt52k1kh*gX$6|2STGZ+-Aa} zL$uqA22givQmLendBw?|N)^P1X!vZ1PwfMv-A#y!>VoI1e0r(xhgaq?tW_v1ja<01 zrl?B7hKY?hf}LU@gP7K~ge#n=QP3C^g>H^1M984$toBLNMmW{FEs)geF%5Lwf#Y_p znHSiy2ineTfuAKmF-*KfKIB0^XmDR(4c;dL(pWbcI2I2apR7Q|+6{(@&!V*QN`0TT zA^0n!yN>Ao%UD`ygg|(`-`zbx;6L@{L`t%T!*7OK>sbnH^q@ zq)6d=Tmk{*C0@q$e2#f?^DOmOSu?cz@Y=W0SAngpe9BC^GDkMTzrdfX9nx>?tLI*$ zesFFApw#@bMit1auI!W8CQ0>d#wN#mF9emIw@Gm3ORq)uNvC$@;N+KGuVa|rGE8I0 zQZ7L0-#zr3vOnun=CLwdvD?%QFcJvrtE>k!(PV_3EPcwLR{)MEUa?;RSd{>@Lz6hP z44yFh_^`bw6V@=Le&;O=CwE8%5er-OyFO1*#}S@w6h4XQ-tc3=I=M^cbv0?=g&!&` zUtM2;5Fl1nk`3OZmwB0o11Hi)`9c|4dbS?EUPwue+#Qm#Cbi!)5A6d}^ivjU75x&u zJ#I@olrSJ3>)(YNYcxh{Fxq-JM$sdfI;`lsZLM?!d(=hYJ@vY=1CAQp;UQFD3WF)c z{AY+MX7fGa-VY-c)cJPNhslN~=bz^hwfr&PK?Kt{Js;VSKkXc(B8dv35lgf3Fy-bj zFZ3kJI>OTPGIT4hrpK_M#(Mi|+LB))O;j&m^hwbX09k7p?7S!u3>b?5^JwM=DhggqIk zY`sa9=1)Bnv;M%sAKZcIEI?oxr#{h8x&;}CuR}%tCkBDzu$FyJ5RYZ?n)ZoD5i7p) zeI>sW>)AFxwUFGr^_3-SeJ56pUV#<*@1Dc_zWCwUm{8==JTl|JRsX=)i;y(*p~dnx z)gs{LT%YgEs^ zOoi29Dukn9;rbz*^x|a_KH^}@QATf=F`kRhvIf0d2s;uWMfh62eRZY1CvW`B55NEb zO?CqW0&N)301}N4fn=A069S>I02ZJ^fu~(5h*kgI4kQ>5FaQ7@X)ps|((BFW&_ID8 zh(i`U002%o?>VGYvAoV{t?5${Vekxc6$)PyuxZcVmKVSBD+I(Kl?(tbP4I4Ey^)v* zuo>D#6p@ZGp4@xztRx+Ca(XEg5CZa;`y?X<$06hlJ9g-28+FOQlxpXx=eLk7UaHz) zwRaA~#7zTg#I^~?QX4z0cWFNmKA0T3MGBB>%?$3)?jhuECP#AEbD7e=1_c6YrFC}heu@HdjRt$e@xYRz zzNAFU1nEwMruyx=--QFUFFgm?);;kgB?7#{Cu&Je@G4ff_+6p7C6iltG|MM*`xe!Q zzX^;Q!Y|YTMjH+lDc;5}bZWO`QsrtqrX#i`>40d;K{*o$NV~2^0^bk?=1>rLN!M*v zjS$x23eN-xD1r^j`fNGsU8UWW38L=F@Fc-?g8Bd$*U`vGDA{tC=q1CZ1tb2*(Y&%Jf0YkY z&yZ*>j5x^g!^m8v^vDO=G7S@K$J6k@cEB-4uUlPLD=@Ea+WUQ?ETgi==i*zs$Hhk9 zrKfRk0tEDtCG;Ghu}D2)W?gcZ!`optFd0EqN7X&e&WT_VQ;bwjY`5#FlBZa+%)(D$ zwDoS~Ec>ED#1QL=kbwk>Os^8997mRDl?Om^_3jc%IF>Ej*SOj~AF;KMG_Zkydm5=_ zusK^!X{!yBE%<*Mwlab~v^Ip(lUI9rBH=|4kZRjL0VhK*=#qnAN!O(>MsBo-H zXx6*?7^;Q65DN{{HcKr?yYFx+MU#YCnIr+mp{i%q%#`V`%MlZ5R*?b78(P2~YW$Gp6l@{WNF__k^P5O;@fX=3HWBie1Qj17dkoCGz`}+6;2$#N1NT;!6s+nDrt$ z?#dJJPP#?)G$~y^C;MfLLHB;{Y;oQsmb1$9If~5NruL49#UJA}$cXSz50%8T%JQzl zc{^G_N5Z?yvJNmAKGwjb06lq|FzGvtQ*?|7)zaTKO(#2in&qbSV%ZKB!dDMK(z-iUouurnSqG zU7(qb7i<5jx=><7nq{29-IJ!}X97n9(x^1Lh!;zkPTj#w6mY;J#JK9h{Afz86BQZS zA&gV9((d03r0jR;p61K+3-H6c6A$tbO%Pp2kN{YeFCZcEXC8Iy$NP*OeC7r!g9 zaBF1ii67s~zpOA_ zGyPac9UaKje|5)oJodd9oh!>*Crs(aN~+XYb(!COh|-Zz<^R3#9d0OR;0onRvQ?rE zN8@Ok*87r?+hrXL4}cy^t*?Ppa#YE|wP}a(t$?i}jH|SR*p1}cWWQukzABMwIr7o6xVj5FRY^6;xhi(bjZQ^z^Rx!?fj%noZ*=W2>x@Y%roe`j{D$?^8Rw3!tw~V3aa@zQQi@HQ zCF5BX;E_Yv7Q*t4VnBgFEQ|BAx=voJmdAqk7;zt)v~0F~bFOI)aV)&(ATFt>{8!7l zHB=P}$-UqE9A6;?tux?zTNjpHLO#)v-@De$W09O};)i8-6~$#N#pSwWaVVkUnJ-!H z3V0*{na{QcDN@IQu?2R43+3QX0}i*~k4(}|d8v+ZPG7RRhJce=Ym3jZRxid9`Vs4P z&~}ilo>FcfLPErFQc_%Mu0xF08yz1#<6nGNay?mC7wMaUR#Ul3Xs zhE6rUNdk*pzOhPS5(^ioT;xQ~?w+CHU;NAyAxG)Asa|mZU1DY@m0Ar9+0Uq?% z)WRIxIBHUKC`hlW077>qkN})Hr0EzElv;FG^HHi{l#)y#Qr6khgV4`n3fk37hm*m8c!`I7pUuD*!~E5j#1w-T*7Ke zj&RI+3p{s`Ny z{6ZHaZ?a(nrOr-3?$^u8dH4_G5mb+9RhCD_`FjbI`M`PJ7U zwfrk2A5m?%(BRCnmAI?B%s!Ek^6ITmFA`Y0?UpZRn024?wl_ZklTfW0iRe~dypyt? zxwX5FlDHNl78DbT_;^ALwn3Z|6{X*$t@`l@%G5otM~3h1kz7-nQQK4<;!Rwvg_N`h zX?aCx$w@0mK~IA&qESOjvUk6J(uIaLQw&2HxE+FehQbQ0{f+%Xgi3YERC^NavjJY> zA7n56rqqml+?U`f|AONW1B=P_$QB4;PK3P)01?q<%fI5v$rHWejqzUxhDRRGMtM8$ zH7RhB+Q%oC%%lZB!KEmV%U6btg|l}pRK-N1#dYibf>Z~$-4)=NUigwh%NE7(c)Ayp zQ;w8sc(L_wT!pNAW)KUo(R3|P%FQ2aSE_HCe&&N_ z_>$Q~=gD+)xIMc!e5)1#Fe%OmDu;k#b|tRtbrz8erN}69h2dM>PokdDXE*iNErw#c zu@?O#mzC8%eLMh;i4>?yV$dU|=R!6?=m6u)MT`xG3AzYh9>D|e~OdD8jwrNTr|*j8WXiJlS>_S-TP`i_sEStD+D`6n&DLup9| zB50@(OuUUmvKlyc+pfwO1PGnTyJcB+S~cub#I>=$+%t%JHH(fF^ckDANqG-i3GZp% znzGWD#D$rX3Z)l3qOID84Kb(`@aF~WBk^Sbdj0sv{!_4k5a+p8!H`=CzX>u;@r?Gk z*6h@#Z~r(`qHeemO@Ye-={iWICyLR;(I)(rM05vc!!zXr+ zH#T(&)d+x5NCC&t09rr*I%EW)#DBMN$8V$89smFVDm)k+QpRUm)3x;|06H19#Db?J zQ0^kN=9$)<)9eH9ZrZwuL#i;p+S@IZH;$pxxlEc70V~jK${q1+{fOCL^Iw%j82g#E zJqBX+AI3$Ex@;hp6%8J;?h5a~lM?EmQdqyH?yi#$;l&SiLdFWgT-dV?UT;bc$=OMb zbx{oi6y4e(*i(NOn>@XcBCZO_&lW9`u4i+*B%+kA zdSx$6(7cw^Um?{0H=P_D+58wtuy+#QlC683#{TZr{&J3HS=070nH>4* znpzqZt}fGFOFShxRm6L>Pg|P)YJduiA1p+c1`uHWKR6CIZ7mh@o3pr#g(wK4eCl8U z%KaR`B}+J98x94iF56Tua{5fycp`usXN##-Kh`2lO#004=xo=M&K2xOOq1dcw);st zs>n$u7BV8=)FHE*-%fcTMf8st00yCdK}TD(n28!%%m703oJysjIj8wGxB`8YXtq@c z_T}XM$b~5Y05PH+sU2B1z2ktnuzyC2$0BGdSt@DY5%33gKAXrUr>>XN_FJHzsi*?9 zBbRn7b{ikI;2XGe{dz2ABT}*d_oDT^+Z6+K7a^+MCIxW)pd~~9xJvtCv9cxjg)(`YIyyXNJt>KnR}fXYlFkSoBR#N*}%DJwZIad{Y_9#zNQsv9X1JfT!h#&D#=cyMN~aC zrV!50B3S}T%&T*Tt#wHEpV@`Y^KHz$%i&-6$QUifj%xLp<5F6-x^p0J#D&Gb>Vp(*xbgAMD zG=EOS)E{(506iX9;z=#U!NbFKA5GVa2eX+nR+qWU+B}IIFTDR>Gz%yMo6Tvm_f3h4 z1^$?@V6vztHpchR0Sn2JEIi6}qOWU`n?jD(u zmGKndf)HYqvh@oxg?>rj;Z!&@Y@S-*|2(ZD!OMv<7HIh^(@I1PA}+8lCAJQfi!(MV z0UU)n)?Od?uzo9uFmnWm%N~wqVV&f2%WyY3zOENbBGw`RTT3_ZpaWS8`4}d+4T0@{ zRE3IS1In6N7d+;AE4u}5T~c8Txa+twubxH*!Y2XHiqJUb-DiKPeDdgo05q9|7&^tU z#!L&A2PDt<<>qz;)-r+VMPWbq6X;=E5xMZL3hKb^N_yE9Eit?9on>A4q5=vTt1*4I z&RL4M=kmg!l&n?vnwjRr*|LdHQRnKQgm(nIbFyvoy^E1^kVc1+3&kvj%C3*36)pn? z$-?)I!K>0^5_`DbMr_ys7NVe~h9he68hf+z6dMkU!bLD&kRnhzO;S>m+?-JB&Wekf z*Grw7Q8(@%r7F6F#t(`BfbdR3gL3|6T1>oW;!%$Hh9*&lpXc|9Q}LhYD;Qo6pZAUr z+MwBM&`A*=%sAG51N2q_)wSNHVD7JKfA~iQT`c=mFx)#Ilhx06#BaD@moFrQ7hb`R%)}}>MEKD1uz4P- zSgy_)P-e2VZD#v+=n9XSBM^pe-HF*PDa&W&-hzqR+4s{dKEhp_u={<@)(+QHa}~SuUG>@6k9^Rga9tY&;SLm zzE|l01RNpY00000YE-9$MK;T(3-$V2_t@}^zV4Y8+V)3$LFxin-cI@bnLW zWPM?RUsF+O1nBj!zspf*HV8X`;3!F5LJ6Q2QTiOC3?Q47TOC##;32*};cgkO9JzT_ zi<9kDJ|8IHh~}EZ#X1l7E^D{&jn%(k=lLVgee&N zsuGvq6oRR!0R{yxxXp4)e$FF@k?U7!D?^SgmVamZkX!ZbK-!_|t#t_E*jsuV!)zB` zw!gmmbf;pe!P zUh;$Y`d=F;BV{*>wUZ2Q>97;iJm{`qV5VnnLkJe6$I?mO#l;L|veV?Cz4++_86dkLEqhG{MbVufAKNsto$in+GhC`y?J=g`BYbo*4&r9I5+0m{af{p3nOgL^viVVtoZ zchSyMknt5EH4(ObB^RK^s|sg9YV@Ls1?paraCB%#yL*5 zl`KNaiH1)0g=N5B?V_6Z@3gX492BDnHl&Ia@Dnus^pBD>YUOq)&1-H>T2zIqx)}!R zRmUMJW_1wdpQ#YI=ZvgQ(TFBm&pPr<6KP-yDSz)Oh z;_o0eJUoSb3RL---av~|y%4Ee;ATj60;BH6l39tg;9CbpfRVoj3GQ|q0WUCg)|5iy zzYFjUR?-7o^@M=1IN~FrAn^a3)!Z%=ICqm4**}nZ5GErXw8x%YeO?d_B|A^Qs>X$@ zdsK%Mx80x<5gm0HNSvPG&HzVT-sI5<3m$69)R?KNTET z3v%U6%WMZ*0mSrj@VtEtXl>LiL88sYPs_koQ%1@KXqN$^`pK!8`JBNSY&17EwVFFv z0!VyQm#zJ{a7&78iupe_9)3Y$(SucNt9auoMz6mNdbky-7cEKbnaMZ?reH)^XuV~5 z`7nzLgR{?}Aq~&2ll)jY)Ysj4FAvC9vCliJ?~^f-OzWs4?oc#(yIn2D_@xg7kx!&o zt2n~x@=rkIjb8!rLI$AZmK|UEZ7jkp^%6B!jWbSYqD=K;Qb1)M2%ptwz}OxOlU<3~ zTx{rk*{_N3a#Ox8RuTR&-7)=i=mEvx_NGGHWc1*1^3}OT2Htr z3$po=l;zZJ=kLH)L$-~7N1W`aP9IY5(Oj!k45RReG(xKW9<(L+G4l8yyyiv}_0TI&>hap7ZITPmCnyt` zU!8H9V%Nt0ob@$M*;}}p%&JQy3?w0E?VGNU=Nv+Ktx}OCQt-ulbQa3`+*=-ba5$t- zZOlu3{CBJUGP4g*eNk=_tXCT zA{bi2#53eH=uj*RD}HMQq4AoeaNUr%b48uHGoSjkte%A`rwFYJ6N<-~7924wWP`$o zlv8$|FhketL+d%k4Iz9Iic$oBwe}m17dTgUPhvjdYQJXbSC)cpKP!AI9kvZogKISy zlMz-o2q>s;INgXoS;6Ef0Y;Ezid^p)U{e@rAOHXW02P)&0U`{?4uKz(%rfDoVm@A0noFUFD+bH}zW!oC4IYf8iWUop zv@CdUud%B**|xtUC$>%fCs{I&?+?O|szXkYPlU0cR+YUn9;c+Is#6K$CCYJ!pCJ`b!RkPv9Ln_l?+|F z35uYi@dyGEh*Jvk+-(xk4-k>VaH^0!$Cp>yhI?~j+suWg@S{5iD|xVl0rzm=sLJzk zEnBK!%e!j~b-IV2yzJ!al8{Hkh5HW4;}q#_0uDww-~qH~49tFf1Bwk8um+IVrd{u? z>sQsL;qzY6v8v3fmV|9U!)PT!@uSF678I&sZ1O9A_+7o;C0?8W?YoAX{;4Ztj(wkT zt?LJyhX7Kf_1&7Kx=R`td5p%cdDLNX#OI3nb(e~=lGN=+bT^q;FBTuF^zl=s&%Q4o zpda1YLjYqyetSqP2ml+zJ~SNMeGI_sflVCpfvw{BJlKWOm!LOJk1ICnVY-l9uA^@c zx>qQB;-RZx%(u3XCaU0EGdI775`#E+if7{n-=je9%cx8J9sm2E(26-c;O*M$52HHg-?}`jg3ufW88*0cf1fV*OL`#z1@x|(3dJD3 zO8Qp=2etK_m0kFxHooO)(0jOKN8h*Sy1Aq}vB9l}4GN;zwfl8cg(k|QkJOKb{vmG5 z-pNglGX;!~q(qf7AGnw_=)yDY=Mf`IQ>oIzgE~&_->z6JmT~L}0})+3z%z_zzY?ykvba(f}2Eeb#trBs}+-r0IgxQD4&^sB(l-)AgK<4Zdb;> z12rn36V7H4WHfZlSfNO;2>`VYne8N)bJgjXC#{Z75=8T=uawhm(&KT2nAo=MpPV$d zj#^9bD}|(5m(ws&m&ZF6lah5ilA8}kxkIuH!iq(waDGVCS%QA?c$H$LlY_Y-0wnyEq@DWqSQs|+yX||W9l&GCPw0(|6D^Y)$px`cR zn;HlT7I|MPRw+v!zR>)jDdbZm6Lr@jz(54Rx`l2T|F4y_ z_~B=CW)uw8$y_{#K()J$q|GkrX5eB5vD+U5G;VizO|t5I38kC=@oM2sI(e|0)&pa8 z6De~cypos}m|Wg6Yt`n7ET^QN|LZVz-mEG=DKjh-kHZ`?J`nFGu1qyR*YwFndInGb zU%9s7rJYi@*ad(ZC@?@M;g=l@2mwqopo7`}nlZsA-Dw~kLU*6m1Ni70qf{|zVM1-N zgh)HH=A9&aAbz9H;ZA}Wy2oFE*oA;^oqoV|y&U4FjOmj12WO$&$NH#ofW;1cFn%Re z=M%Bf{t%_0vxJMM&WOQP%j&&e*AdwFD!0#Xn-o0RZSgmty(om0v;Is(GO~I6QbLGy zj?=N*xUMTW_?pX_^C^VR?fE>X4y@vm%~+@PhJD!@BiXO02WAa3Me|37r%q65n{h`{ zs#Ot1XK~=%0kU~D-lXFUY?BfUX*I1ivGg>tUfG7pXLWRNrQ<1it598g6QLQY%3YuW zA$#l_H?s4>9a*yJkE9A5>}KR@UhxAx+1%k4Pq6tr=pz5xBIKd)u z&})To@x^$N6xYc=T;qw~etRuKAt|RQcW^s3TW;r|!ca9LqNYlp5hw~S2lah$z>*v; zDH2`&>-dtc)9*~f*5a^ox)9!-e4T*or&xj}?sk2aLU|XZ>rO2OziZ*!V_CY5gh7sd z^gJF5#i$!?sS|k-r|=~SMs6Jg5UZ4@5~&9OL`3`T2cr{Gk+=e^wAte``HFXs$yIS) zI;PS?f}Q0J!ZoCOXy@`Jj6RK5EwE8C2a-(ubHKMR%-$fsHRd|d+R9Z5Yn5zoAZX02 z0eU28YT}ztGo|uRd=Wh%ckdx}@}I>JE4ztX!a^{|G4KPZ02m+u01LI!6dfG{GB;=d ze!u_+OyEUDcGn`V>b_KWx*c)#4{fDOzw4X}X}o3+KRJP%=6@UZcp`v7g?K7O75Cqi zV*q6Crn&1B1BE+mkxwc^(F}NxU}un1&3#INi&x0?H5h%jQOPLTH3NOWc>yVK8jjhH!2nHh&-A`FEiGYyk=E zdE5l7aBa|gHE!OnBqDT(PsBjCwe)rCn(9o60WV&$&)I@Br_qr~1*nmin6kCf<3(h; zV1|1()kxBNloEogot2V@^K}%@M>4;hx6vv_%07X`xO|;NIRf%nLmQ!?pFMXIBvKsv z(=uoN;6yMHrC-a-WBebdef~{?@P{yPbe~E!DGzs@p1&rlk&_UU=5$ol#xAwz0)=JX z5athAm0gWx*_p}z4KF&OEg{*cjc-OX4XaFZ`tE)OUo{>J^6;YGS!4vEA>*K6J;wUe zC%XJfW#LqkvElZ(8CyTrWP6)w7$QaZ11Y)l?&Vf@;Kd3bM^I~8jh^BSSZgfB&Nvpz z^6C9U$%)vo@f1eV=Ew&&0j$Fjc2OBIzzlYSmDF&2%k7Dhh@oA$BH>fdu7=>f#|2a~ z2Du&C`EiBH?TYXzWwYD*yUAy@Zg0_?9^XK+Yy9*ueeZtoJ6D(g536XMeA9%|Uc0zY z6rlrx=xNf;zJYNv*~!cf-4sHeR5TB3PMP53(;6@-baQ1P-gi1c0Pp-WKxh-{;7MzT zqCK$V(^T<%Z@vZHS$}BvKD)*0V^Z#kI;S?g*ELQjBb>+-UH|dfV7)UTyZFGP)zZLW z5s1B)_IPJZ8WT*23c998`o^Iep6@arBZVAStJyNSQ~u&PKm_HtqA$Vfks3t|dF-90Et-CGu2fWijGFZO}SPTY1f zn87`eK?r*N6u+;97X>y15^-Z3TK$K^S$FqW1EV9+%5hLCim@-VhCnrf;>zv|7Uv7(;h}hZecK6DosQk9+P&y}R>ekD^Kedc;LIQpz(>jw1tZ=@p;>E(l37p=^T-heuJ>buLo$M&Lp; z&(jMA|6W9l)hNcu0(Kc$UYJ& zK~b+lc}Xox|GhHkSXcW4N;6C&FEjGREk2!5q2#t6K?l;HDN-VuzzguTYG% zbGG!7H@3-uYd9?#au}vr(6(NX00J==++g@lhwkW z--~DN^4Q3SajCj23{`33@WiFOfdnldPWn4g;lpRSLaf@J1Ni#lQvq!mkx4m9j%b7! zLJ8N6F1ZSgyt~MN=-_Bhe6NI0eMw)GPwv^2_)J92B8UwFo>eeL3e8*#& zc(=%;j2q&dHQnHahU(y`+e}9dfn^l$i^w0v&J&rWkPl z(BD95w6f|CNWRI)IBEF_My}vh)NvgFoC1yE52kXb;1naKn4QiGfZq|Vv9oi8Rv7KE zF061FN#rHj^(8=C_N@w1vPY4pM3!?RygXz47aO|uMdh0Qk?PDOQx=I@9AP945}#RJ$pNYv?R z^TtUW)jml6NY6xuy1tBWS!|l3sKKR}mI8_I2BY(h9n`|2L{&45y{?CY0NG+}BiCGW z=9(z}g%ZgJc*{0y)m}$k_6o4H$#C+El^E;M<>mKG%Fs|pb4dL2jxi$Zw-L*^1szjZ zyD4S>Gh>(aZ(u2jkx$P4JyC;(Yz0C5N7dBfu>RXG`TJa1&wjZ*#tp<4w27goAgSX2xnz{qVK7;v|rjcw@V@a5+vO>f-NnE zNW>Q4(MHq!(L&uO;OhlW)cM<@C0R8T+AtR3Tx0s#G*70_|C_PP%$NYBlh@B!fKl{r zl6)ITSg@{1SF+b^3tTCRjs@km5K4D(fvAVJ3H@il>E1v8bXMr6i*&PZ7cuhF=j%9# z)(vt5=!MnQ$q-l#uA`5B$>|#`xIv4P zhxCS3>3vRW0s6POnsi)K0O5qMGbI?S(E`OKjv4COdh*V!DW2Sh#T!H47b+RSZKbteJZO73)73r@xc zXa$2s^34K8>O1cjBGt?Y@||(AB{cvK{((U2EBB-CR~UQBX;iJHuIXb1p5F%l-PGn( zigdyde}|vqP6AV4`tjSXOqs<`D5xOaNP2bQD8@l}VW!7^bSz*1CRH9^)C``zuEfN8 zaJYZ5DXCg2x+m1Fwn?2kDoST!eA~A+5%^|jlHrUmm~JyjhU^uF5+sKxehU@BNS|`Sie}kzby%Sdl%^u7^>CjkxX-<45mg`*OoF&9i*fDA&5SYoiS3m? zr9RH(RIHL+nGA>}VRE4Z?mWwk>L7|wvIy`U!MPYehG}VF4R$Tc6>F7$Z)G)lGB#!O zWeeg{uzO%Sk&_ugQ)Pm@)ej*XpfK;^`+<2yc;o38Wb5myl#yVb23o>R@VjIZ+ely}<3S7p5w?W3Ot0}WTDYpO zoKI}XO}sE>uz*vb)hal%<}Jowhdi!v99h@h?kM72z~KrmGy+qXQfHog7*-PsKfl{- zNBynCq8DXLF)F#8?m6VMTDQOwq<*N=PZZe5X^$@J@@-TFz4OpTAqJi?4Upf1C;hnP~{)c{fi{Z!7 zEMk`qQ%Cz^lRoQ+hkdt+R0i$=i9VzC2qQ3nqkjTK5MXkn-RP zOIw1gBqW^{&KD@gAf~DwN<2bL35kg`X$=oXiT}tBPqMz?MPWjLQw8Fls*VzuJ=lpf z0;<^tw3>_^?b5BTpk8LqYJtmkHC}iaxXeKFY%Pl3w#d)#&j-2L^tkQa?G;0FrvS)# z1%7x}dmH=EwdIf%Iq=S&NT|UjOrH~VEHZmAM&yPSyR%yHHg%giIN{!LamTj#zcY!j zd`R01?$JA++j-@I6W^4{hRP^2^j$li=P^al;bkg|w}dF9+<8rO^Omz;Ne^@dG-h$= zLzC|LePx?a`;LmOr{*9&mY2~crN0Dx@jahPn#py+u?2-FA*3z9uybM)N{2ttvO{P7 zG5O#Deqy>?5eNze2^AP_dP0;ptF`+4P1*6vGIf zl_yFwi|_#X8MfTruV5nDWtl@{|H>gS000@-0n*{5u&7)J+W-JLKmY&>^Z+#K;1eF; zg?ie%Xo^w5T0;e8UU@YJyBjlR=z}_}9kcpWMBz5@6RBTNis4)~1Rb#ng$E-Z1Wl^| z9+cr`hhvfAS;c|KAPCmLvz9g+G7**UVb@j0{{1OD=X9=JD&_ zk7&4E00@P`#Q?Beiyk%lxBG+YgoFxtt8xiuaf^9jYr*om?yh{s+4I!ERac;-@fZZ|VlXNhN{2hV|@ z_9s%bM^U)N&Eg72qwiVQf8G?Wjie(TWexZthk5yh=2rHV_C+wa&{>$ul`F5r>+_lH5^DMkOK`VxrK-(So&(K&H0oLEyw|?UJtl50Eet-jN#%)1LJ}d zaxI=IfvGb3gl#4*`$y;N0;YjpOn6|??|#-!F{Lk6W=@0q{nl1h&E1dN|E%SO^lWai0qg^8%rx;Udf5<7ft-Q_q-L`W-W#;fsLh zJm(ccG3JOuZl7`GU{j0X^ixAqqf@?8c!g6K`h0g20a<1g{tp(Q)Vzav+9S%jK5j$ZxaUsY7iUy=e*V`bkm{Inr9se-^mUhUn*{oT|9L*swV3$u*$vI zS;@5veM_LQ>XOGh?WI6Nxy6osY*s`Ws^l#?d@Z#{seNP+|t#1%h1u0tBzLR#^1oJXgGfE;btmUHQd1d2yYt;kIg zmywT(s>qg&k`L$(L$^sAR-`eKE6T=4INRx{QcWyAp(8ZO2}R`D-*z$kqHTgq>1G$+ zRlg1iKLd-(rwuWImuCUfdwEkFOUFl*^4O}aB*|uK7of=dAJ#VLn zF{3Qab;&W+^d=qkS7wx{(!uNe9UB!AVv*t>(9-LT4PYnQvQk##)oozynf~js>2!H? zxX?_I;H;l2G-k4K4ek9$N3$m>=&nXoZQ~2g@j(>`-XKY*tEf}@%YK0;7|%HKusG9; zGfKc^saz&D{ZYP1-I1)TZjtgDoB^hSNcZ8-jzX%s-3`!vZK#eO*N0Yc}N#z#HRDvS}74nOeJ%Oz9p~#+Es^t zFI3q4e@X>$>KRA}M-I>!RngB5!msbj9@qX{H(J-&UQrE0DcWEwXMu@TcY!h+k)zJu` z@@5;3Z_a;i^L1AFvA6eyHadene~b*ETZ;;)+xtPk&?%x-kbypW%q?(lU;KS5dhXE?PP6EhA7dqq96Y^pgcc+Z6Ks zg+gw0lCR+Cin3BlXq!@}mNeR>t53uF&2$zC>-ruJ3lZ~N^&6?4w;(UxklWF;=)E_? z*1A507r0FWi%|YN3cw%MsT$ap0KmQ_<;f?jhyVqw3^NSC-a2M^Ko|HQCxfK$I_RWG zu87`QbZ;{{o-?Zmn}PM2ysX$~#Nq8M#5&Mu4ZBU@&w;f8gI^UOE zQnx4#ta?ZZPA15}1;n?5y>7X}*GOMBNIpjVfSk$xFkFP#TLinI-LU#KmZ}Z0003v zqn)+D00ET`3JL}|3o+aP0gIY%pe7&yxiZ4~OY2Yo00N5u5;UiS4-Sj;K9Ul$*KQXu z88~D>gmB!KNV($l%;O<(Vi=c-Bz|ejc75l`$B{UJ^ycIf{bb?p-EJ(z*;sN%%8+zw zsT+!p;K^BROs&5wwxOgQ#WyNJx#PE`U_Dr zbOrn%<&sEJ)m|C&*c9;W`6nlpzS~gKTG037$f^^`WJo_S4bT!kzR(g9-7CeGON))c z*eq`=tIbJaSUrq2xqMLUP}C8&>X>o#bEY$E(JbiOls~(`gD?9t2JweM?y(jRju=c2 zq^xJQ_E3X(@XY+UcI6e)XaBcX8_+PCTA%`#v6p=S5~;}cubH8g4>*R5fajLAO?}Ky zisal;jDC&x2+LFDYk8)vXbDykdYdpr_oiYUNOZ#?98Zk^-&~j>mC$9Eh+2f142gnh zd%@J&0wsmMrNdR}EI0T-8H(H-XI#LO+JudJBYXgGVz3%qq{|4$Y2pSBW&=NC9e0~( zeUX%HWR9&YJ6Mds(*7kpKg}S?GgDAE8~LD<9X3wi9A%hGo_o_?iJFD6(}y#fB!KWe zYpBXWIpZK*FRD#hrG#0vRBQM_M_9< zD}HyrW}8=QvMh#?%kPz9KTBFbRnph)b{m67)!7&%N6;ZZ&BLuA1k$-vlEx9fb!v#qNutVb2Q*+ughNgHFT#keh zWWS5-`+F$7zN%;1BevuNi4ZR-n-kWQ_)GaG9urgQs7tpn0R=4uX{=Yf9I#%RRwqoqq_}?ZPh7YTcI1>?eS`MfPD2-I>I9JRn<|MSi9Kh|Z{wlt zM8L~G^38VZ; z|B#VxFGQ!B9yENjO^B($)PxLJK`FRa(CUf>Ke_2&slC*0x|k%b{8psZb7gtyShqve zNU>^7&fpqveF)Zv8UoAkwjq_4P~aW;@CB&;p%E(lmT1w`-nbrtkHyRAj<9ET5nX(! znph~lhLq~h+j4Tn{7N<#YX{N{ayvwTdP?+KUj7Xa4~(46JVyMyP5+YSYUf}9XBh>S z?09|K7n~ViWRvJVSQJvW?wpZ5=jeFwn6|WdV*{0vTWkSWw>SN3v<0?Wt6vn~ymM;C zn=UNV-vl73^W+XOBm~S?AYQj5onISMZLK6tuX!p5*|nNxW<5U6mdOwFMD?#KlVP`- zF_W2HA?Gw^viS+3p^sM{{%ZD!jnFGO&zRK7dL>6rY=n7!V!?E7`vne!l#Ouy!q0eZ-6ZdNbuB^$ z#}cIDUqNe-)3rX6P5k=vNo8chSJN+-Dp_KG{(|nuAtlF45r=g}zrjk=TZ^F`?UMRt zoR80aPT>^8%if$Y-Y3hAa}0-%#yiBT(S{1LnO`R!NRy%_`DV0X>K|(`g2Ln7^i~hX z>IE%GESuKz$Y>`0L^R*GnVXx@Qa2JEj1LbSnniXC^9OiXm0QfLPcle z+)nw&gkV#8$w)9UC>{>*awXe6K8U5xyF_WiUq; zQNs3Q^5(RNWp5ZwpIo5i`Qi4N4h0ZFxlN*bzw0!<-jSiiZ0mgNx|NWwAszt$b6bI> zn@p@{C2Q*3F;1Vu&^=ar&Lxhju}6v`NdiB+bwe{L(Cm?{XN;obd z*B5HUh1D~;pv^DBmbGVZQt$_v%rTG^Ic)kbUm%`~j~)qo4nT(r5P}A_WxV?b%8x1y zBc8@J#kh_UG?h`&g?lI63U8+kh0;|!wW+8$m(4KA+6$e2W6S`_zak7Zk>{?Uzl`=a zrM%LTx40Q=GK@rqzC9G*!XAJ4Mwb}kDsnx2@)=*eHx26;E?UVconOO9+@7O9i&8=&Y(2#miideez0>oOK1mY$DrI z*n&F7>c{lH;WRQ@ETP_0suKa#1W=yUMg1_A!k2G1x-P?4L2z{tujFrdBbP^TJ7c$m z_(F*2Q+m_R;*20d!c)Kj8p(01HQ9|h&rttTvCP>i4w2atJ@Mg zW@U~=9#oH6hEoj;@Y|t3b;|>F=#ZKm^Rv71OFe>HP%d?lc2+x3F^SW`xS|IYS+{xz zD6m-$H5!w$Sh_p3Ck_nN)cmuU>uNwT-~(U``(3FK-X432DX7NlT;w}8F2@Na0@X9? z4Fu7W#JaD{TI&J@QCT0P);6>{WMO;Y%;#gCguve0#S>#-W^+#qF{En7$rb0G@xYmO z9kaFJD|;{=j7e+AbKB+7Yg!GAH_u|lml7zSQyFlVJs=^`_dTj-?bYKE8X(2Du4X08BNI8G$ zv}?HOd=)Yxf;z~n4$2-qc2GJUCW9b_4@T2<=bIOlpZWH+plDZv2$;9jQpd#W2@!O_qi59Ij8Hnz4c+*28Di`h5SqfZTG|`*)%a7XVz!>}qoqlrO_;0t=&uKH0 zI#FSgD{b_8-L4WjG&#E-1jNTg_*sA217j^&{FJ7%NAlof?fMSD5oK8%C>$7~K?NXU z<$r+7V4iX$zMUbVwFa@l=cfiN5E1Z2iH;L5h6%3Fc`NAai4fG4f!T&Ph7)qpP=^pt zZ^IVB+R=Qt)|+{E7}M;Ar*%$c_Fzp*y7AdJQp-I!IIA5UZw{CXILI!zGxqSV=kBB! z9VUe~u4C4ADEIRJIq)0S>Tj{*=%@~xc62F=*LbI}Qi^XzQ*G+~Ao*^7vd`}`CCSj| zeVlSK*-)=G6*|ojx9ama)JH~V`IJP1!i=YyUwAI&&Ja`AK2RhuC?^e!44pLjjsKF1 z$O6azMz`GG*1zq+C;Ap}o=9{zED+FJ_cjO(j26qY5Sc~Ud@p5QrNgv_&mNOFxWwAz zl0=<3mfPnVm-d`rU=9(b2RrY)g=s8@IQIk!?U9QpR+6oU*Z`JC;RJolMou}6sWEiD zDv-vR2gAFqn%QW6WPuF5W{%0)Z}o>Wg5xL9=Km{oX$+IMxmAhH=7qAK`jtR!>^ESy zRPH_xrcadM+>$$QH^#9!`E2KgnP*fgcf!(O6G=PEGv%<no??eTWeoJQLG}#jLN5za!{m?{xiw(v z3i6t%ad3m@{`}3qi}A z?YzBHL>M(nMf2?H->Ph$fhRr&HSlk?OzZ*Yr@vh0B6(*EFbEDg#W#yLn^*u&7{RBZ3>dID)Lpv+s zMc?^pt9(-NF;Sjm8IMcT#r7Z;ORbK@AiNVQRoN8%!oY{EZHWDZ-D~qx7E2nT10*p@ z<;hWD_wxHEk)j=D!GO~yQt>FBX>yEd21L{=x7(#x1RPMQrj_FTi21+|nOj+y1L^+D zb1V+7ja(0m2;fY<@f783FJq&|QcG!@MvX6cZ?tsaRMR8;5?_$ykLum(t z;hn3fN&O!ScL*wgUzyP+#KW1in!+AnTnImf;j~s!d_82{SksdKge_LpV8Z;Jh2X-L zeSBL^!|Er;+pDp0#w$|*uKZ9Ws*`(vRH&nJgY^9GU5Z-_bgp2Uy8L>dSb@+7iOa4D ziPlo5pvx^B_xCN-qBc(b+$^}yz|JwyyLCqm)@_dXz+*EG>>S-1m|3|@ZEZY^aK#bn zx~|Ik6bCJVX|bz-Sh9A3miej-hAMiU-+w*+GUm@5w0!62&}bptTfuv9aC61=j;%V- zZwKh2^VySh#DAj5Kz#cl@hfUNn<+G z_oM$bx{Oythj^39#a?@2GdQ`cpaTgMSObYyL7tRurej>5i&($Rn6fP%2*1hVFFc&{ zt3=^0`?;6~vyRPeOF!Lj^r>WxdP9;Vtf{enpa~fDlbPpZ76lgCp21l}QFj^$$k7rS z+vr97cj)sCgu2ZXQ_!=f?D1j&vRHuC2aIrA;9N1uBWk1~r$Hs+fi_WQQj$m{ETMu) zZSED67ODm@NR3J_vXzg}7Gkq$FDKn%^l>bqn}-2isR76u3%~I6@kV_8rjz8CACwUV z0|N67^*ppZjk}>p17u^G;FY&7KBh_=oGOr(EBrACq#YtHZ-3O|K=vfvN8mQ*EYk(?kAK|NWPR;04%9i)qKq>Rw zqnc4NJE`O+vVkD-9u zAJjs$OjOSxUYU@*rHpdwX@`yUZDA9TK17qh=CQ+*pHP2JGKrv!9F*MFn2RG|92N)> zAH+v|QG<98Fg%6=Q)oP#UN+_lUGS|Ev-IGKuY}0gS|r1Hw7-l`)*V5$bQ7=`8>^(A zD7z=wowW16gt3Y~i8;vr9DC#YLyKBEvYoU5Nc+*urLH`X1}pdVb!J)d6A`{{<3IUB>Kb|!1;eC#+1%Q1rr zci_L}KE9tkwt_iKH>EY89XFyLs{0YirB(gcZ^c&WrA$61WU}vzyAxIE77=GG#%y12 zTf8M@JU~yTu4-VOE zLu;mAGh~y=b_Eyt9BF1s83c2&2f^S0twl@#04;rj;F16p09Qa2s0~OUU)xS;fCK;l z024dVe2+!+GzOX_4QxyiELhRbXfKZd0AKzJ`)vTi0!|17w#C#>o&v-~0Vu!#3{;N> zqil`I77{%Ye~8oLfp#}8>W3OO{X}9_vS2}nYU&nw*Fw-^4~kwQja+wP+cFdv8-KBA zNE9hvQ$0jD2XYUc|m2KwrW8U6euAqKtvfO z=9(>nS6snm)6YsjL6vn%|HV$MdRc&GJO9d3AAy(6WZA@herWw)ugDGma`bdh&mMd2 zA&-F|=O0>j1);Pz{$Wy0$cR60sw2=}#QDz7?xWla2mqC_=v4vyTWq8U6$@|)#{r*e zFd3n_Kw{zTPA+~PeFWplw+a>;X20`SBh8Q1Liq-fDqDCMf2Ur7v*2Ag=948Lr^g=h zJVi0Jlt~)iFAYqJlgfhJ-eL2r?QP%VkmbzzV7~7nEUKJcmaFdF@r$L~#f#HdIy2Ql z^w`&Wk+C|g=IE30Az?kb&UaRMcljYJB7D0nbg#_7GC%}$ZVE~&o_*+RB?Jv>i znu2@-D;5e2XZmx^fB@e*P(MBH{shufaY}JSxC{BA_*LC~M)gvly7m@D1 zkn9Ve!iKVL%c%W^@skpQH^x`>O-ZN+t&4LOqaum3$!IMq)J%sqYw)t*9gP1j2Nn^= zE%aR=nqz0y@2DU(0=7moGrX{9o3^@FM}ZZ0NBvdLfjZbrsRXFl2{iW>WUd=VERcwg zxiZ*^F1>H3wijO_577pt+BN*hv$2HVTad)hrt(eB0lvb>l!N{VpOB) zIUy{rY=d`8eJ-Qi+BTpO3zZ_Kq5>cUPUn^r!QuX9lxa}QQ6a5!U9lCc4>hS)sB5I& ztE4r#Cm9J7lH9R|pSHR_fCBj`Qt|##8#wMHsY@>u7kjR+I+`R$ZZ_7r6B3Xu4kAuF zp*F}6orS;H=Y-xq|K1K5tQnWXXQN`mLnaAT6uZKV--qq6tQ8fwo_Q>DQEK5ymm55CggJ z(|cv^e&Olei64oVG7UHW{H3;yPorQ2s~rS7DHME!t7FCm z*S|(4g90JL$uC!4>GC;hNRDwsG^k={F%%UkcG2eTA)dSpdop)4e)|u+Mmj`@dIca2 z&C0)yQ(jXLLAFOVyR?DajSlzzsa{~O=jBz~;3@ZrAX9ZR+@jWydbrfGO zy$2G2AnchY(;Ey`uTLOVbE%3F>|js-_IBeuqDAp%*V!srOO+FLkIJBdYyy{^OMa-v z!N}aCy2R|9Pp};WYkBXgc&cFEO*$9Kb#x#Q3FjcwOf4z64V!9P<6D-Gdg~kU$t<;v zUu}2ka?8O01bBfh*@WZd@Awo%MH?!H7jRVf!?Xn0Q5)q4jLY zLJ7L4B$?O7`f)?(VqBe->7M1#Y}(yh;+}n9n)6#8q>{gPo&tiI7Xkr`WXZI| z5+eh@FC=#V%y$E2XYbL(NUe~ndhZ`EUu^ypWmZ=Vb-z5t+RS{f3O@U@1*8`A{X+Q| zSZ_Ezs7G-*Da1n-vmb%Q*z5OvD|~-i{e0hfiHs`-LSkX8rfD{Srh(LHJ$@Rl1Dg&< zVbP(w1vApk0vZd}gb}S-UU(^Ps>v|tMmeUO<$4IPm}`a3Ogxgn0000000G~+xBwXM zFmEfVeL^z_2#h3f6A2N(P`fWRGgMSlpa~UOgH`5?00eGa0001SrBTYj584W~ab`Ge zfB}3mfr{N7Jzd!tMuq$Sz3}uw+^XF=iH5+m~HAMper;z%DN*7cI|PU$b~(e3`FAKz5J9w z`+J9x*eORdq|56rol#`UeE=32;reD})35S6ViC*^pcy6SYFKV-5for{F=r#2-cO|G z3zlkH>zv?RT(W>(w_T&6t@NgAhVo>v(4Tddu*b>GPV!VWaw`5GaB7TvYX+pRnE7{* z)|0q9bU8>9SZMvgDm);`t9-|(C#*+Wp2K@FJq)=^ zld73oP0;Ex{|qdK%7Bh z6{jhW%CK%3CJ48_#V>m^%`U@23>RAtL*>QJQc5kf%K zh4b%)1J5rJQJ}oKy#Ql)fmVUUUPt-Od^=@d1~`l=2#l6bcqmbB7#(SBs%Ey2CLId8 zpU|{8@X$@9BH#*lm1txxRG0?3f!p*2VG0WC>Dnwq%A6(greMgO5%ZBVYR~pRR^zqGTF?{v{(Hm3K89!7cxZ;{pzf9=r-{EHYL2{?KQ4LwhtYbGf*w0K&vEr5IflCv{Be4XHf zc)kefFeu@4rN}doB04zRo=A+nIYBO!=_UxkptzXI8nf;E8N)kZXt>b*s&@eaPYL0!>08-2}Zk458MkjsflL^+zjo+H*zo`Xr z#B1Y8#?cr|eK;(0Ehn9IEQz=uW2uW8;14`*GR%K(z&I*5dw_2>wj3m`&Pru%OM9VB zK|$`;TQnWP#F819WX%XUEo$0Oz-bq>!!xbVP)|0nm(DS3Q9oev$^WRbAg8SSf><@K zbop#p^`VwVBmhlvC5l+HOxdfw_65l+NXD}EKf8@Jp?r;of3QjWcrKpuAxJ@s>dqhmbq0nk6130O z|Lv_-T&YY_1{a1^!wnL^#sX*n002BMGtlDz00Wz#0aJicU=Sz(1V6HT02F+@xl~mq z0GbM%fs6hV5bXc}Qk%9SpCANlEbMZVZ~y=R000D;h@o)i4nINz$nh-(%`%E(rBQr|})oG~g(pUMSkagBo22crzzMNf(vtZ(+qiRiq5 z9j7gFfCSU+27aa#?IxDDPqx`dgGFt}-fv~PHorKV;aQsJrB)UyEw&C5xcICf)3Q7_ zu}qPMm-4GL#FIcD6_z!JfQJ16fnrE63VjVyQM2rY)=aBm3h(WMXsRMFA8I~<^g~Ko zR7`2tTe2)acXA)~QrCs!rl+hBhrj_h)XPkl&8vA^GK6VdBVH!u0 z^NUE2bEzGTz~L5bIsr3Ph(duLdjetFo|{}z(%XY;Fp`QxN>vKsIg-;yNmD|$@n&~M zRKTr}v&hAweX2_~RYI$&9TKP&mG?#(wr*ey0u2v)SVdsLq$sUSdE`NBgF7J4pK|_F zReWF?zHp zzNfyIpVO74;XiJ;{uyhPLBB%Uq9 z4ST8<0vXeX4$SZnmT(i{-l-tSEyFXBHtbmJD=I4@q56}oil!~Ai?AQ+zKXIZ){kaS z=3XgmG<5x%d3%$bxkX)9G^nnZGOS}I$_q94@JdcoO#acg+3EQkTSV(F;iF6iTnbA- zCtJ#EtY(#2AqZ zY~bw@RQdyjJLibx`)rvLZpB!JwejoA$gYz1qKJ^BAXpZQxPnS*wtID_ z7MKp0fS-i?xaXCmn@-LmtrED~)u+N$0)G07~b&dIEQ2 ziXy@y!GO4gih2p5=P-iJDlM?&JH^xH!w??|44xij7bmGlORK-Z%#3zM)zmIYwD57J z4y54Gvo?XR!k-^vx-qEk8GEvd!--M)Js4jx9b4#>QJB*B^Cg9Mh5-qY!L9J%;-ch| zlXV~sXGMM$>1Cx$jj9oGd~P)mzk?aq8%II6)jRF}ABi;p^YbTK&1>yKc75basw)6# zB}9Z`Z9~N#rk6TR48I*#?Ck1hf00Q&? z00000002tC@`4bVtik{V|37u2_jA~S+gl82$rw8g%}^ z_i;7XK1Vll*n-BeC)3jbiZ5+YxAYX=lzxy1)x@H*{REqtTQUnbYuHK+ajTXr&2WBG zqu_iXt7^q2{;KdrE@DwqO@w;30A(p_NQa@Jf(LQ}gX3%~eSm(zTgyBPKVQp`9tS*y zEkCi*$!xhey83rEQY>qrm&Kw&If9q|CVqav2`;(?E6<%gcKH`(csxNV4ZGYQAIlJX zXTc&@)7XEjX;_WgUM^aAumthS9IEAaxeE!hMDgez+0~P$fY_}7cv$en*qi~Z_D65* zQ)z`&KzU_O4JaIWos0SNlw@t@Zt+%Au7VqxN=+|?wF#woo6P9=(+N}r(Nf^Zk8LtK zz#1gw%3-a(GrmIP>EE63x!uYonZM*P=@BZsf7fw}z~TW4K{p4DKUaWz&PpXk_X|Xo z$b&X{fOTpdwII0$ULVw^3#zo#jaz@u&o}9Ooj7g z%I{t<>?Z@pN^|kiNn&3%P|Iz_tX16tY8p(IEw%Z{G%@ zt{w7%{PT>~&RGe;7vW_t!(RL^gTTL}t74j#YAd5!XX2o2F`r`0dz}bT zYMYKB|Mj3XkMpr-RiWZYmC2t?9iS@S4|`=s9J!bBSDsy_aq>%~=9ig=@A}6uN>-n4 z7dbF!>43pA5B70%tEZaX1$fGL1j4Hz1kb(f!X(YbQo1g<2)<->+Fy_lhY4>IDtC`W z<3@2TCqy492JvTn<}Cps3!A`OSZ7pU)W|w`1rCY@8FilD>Xk;4#TXnt(Acy+O-#z7 z%7p+Vnq*z@wN5GStB}0aqB31>{*0wwz#n*k%`j$>qnJxc%#<#WnMxri`VhfvBj%+HQCGfWD1G$+&HTB~Roe+6Vinu=BR zSHo){gUgN7#j%P_q)G7MvMQ&vsa`JHW%GNrzDo0ba*&j0b4d@0T^^?>fX?LzzzYQa z;^79eY{oRL)YD$ebGt38ht^6R#drh+0*!F=_4zWM4Vc}O z$Y(PmapEVv)>~9dIxdab|4q3=+!{KyE`q3?Qx=oE*b^#(=j*8&iCg3SyqDB~I8>z= zF{(Fg9HWEXtehouMM^{Cyw6MjAx%RO9ar|3+aw5GlVdZ5c@DhviufG989M+!)ebvW z2CJE>f`uV+04x0M`ng20uT?`$1sChg5#oYB?9$b5{S+@~I3I??fi=j_9C8%_&MtyI zl*e4U#bx1XKNm-)Pt`Ekn2RXy2+j#b z&j2kBsW4xXUsE(MWRb20nK$%=SqvLMgsZbDS`*Ba_j9nc`;QlFx?FbI%%Sb^k|qMV zYIor&hLXP~yJ>6+c%_k~pb5))c#jQcE3tC)Vx@A{zhRJp9)F-M(ZVkjv>&Qvo&Oe< zu9ZOh`+m)t-ZvtPS#ON?Gd$07rrOB^-7noH5Ljh&1ur&PS1V#WbH z%s0l6wZ~^CF4pmbUJ@RXm=nD+m&UriZ~Mem3dW1Bm(M%P<3jixAt>G1j$`j|p4E4i zzkJN^n_hcM1MDJ62|G<##%$?mC+g+bF8KYdg0@1=^RY88-Wo=L$+XY1}XD#PS8=hRZ(JM0RRHBLZLMdI+;=(BD8JS;TG&DA8i##bSVd5OALk;aScAI zIu58tm?~a*1G6m@isczKbNm_&Sh92sr2Fm2O2stFfu*1I;HDmC6`GTL+|;=x@u`yG z%9FQ|@DU0i&i3L7sX`xnW+_~uqdpKuSFc<8-Xlk?yba$0xO|sZf5k&&$;XsAd4Yoy zy8H9=JaUM=r`1|=1yD1Mmg8$<3W0`Qa==hbvVfBWZ0yM0H^9sE6o>-)1V5fL>>vs> zUB8e(s1ylO;gf6vLB5cQMmR*&Ma9zAt52 z-D`l*8u2+4q9y<#eCFF9g>lcCxc<5c=SxH}s)H#O2G;K`(7i-c!5ts}@XEw4<|01D zIl{HtJ{jd5DeQQrfN-GgQJ@uD?24Npg&$;FTR~?3j3@TIu-zt65Ro_jxY>UTm%>S-JBSfl&4K3M)&qUAKCv}=Ym z`yfotJ1TLABJIz96_B}0KP;CoVb~c~d#ETEtmGCn^ShmAArkE;{Z<@*h->vs0;-p8 zu3*}#H8=a9P9zJX_#6bA8Q6(82_RaQ<1lPvcwz6MPjH*W;;vn5h?4B_$swoiTr5I1 zM}el{j3Y)7Gu@%$d!)w2l&dr=lt?2Rb!5LA@szj*P?$xx)KuOc-EkSEn$(9(q=$%&Zqr(abwNcfdrF=0017qrA|yx@F=Pm zTZa!OlfViRjJzG2CcKNbizREVMxkP^=s3_N6P%B>;E?&5@y`al7UUSD#8`N1q|l)( zCtM{O2zxXW@A)=(C8@^}Gn1lAqt0{$3)j!A2o&XHa#)N^t+Rbz;Qxm7r?5!!UEyWA z4k`n&z^{H(MNOzHwz6A)8!b6Wz|X_V_F&KmJ-d#=fe6u zoO5bD-tJYoU*q>Gv5f65UOp6$BWBaZ(PIMhwqxmw`(#s4sxPjBl3N&d);UK^} zij%OUkkvc6TDTR`VOYx6-*aW}C#c+NQEM$V-ISXC_NQgTsB z62US8_y7O^1M83+*Z=|O=mwBBF(Tv?1C>W5^kNBHF+h=M;c6ui013)MTl^ZJ007Ov zAR2%=;wG&H#;`+VI1W7H^~L`mW^|~X8a=>cY}wK2rP^L6r-g^w2T6~OBVnW6ZV`h( z000)1WkzvN1;_@bo9MqBc%#<+IU^D(s`rubsXcrZ3Yyjj{W&KY0ELOP27Zah*Ly&m#<# zYrsz(XGkVI^Hpq;Q zGR1jAMUOfjOP6U^zktvJIMrf?X(WKmeE4dh8Uujtb}WSE>CghbE(8bA4$_~j zyzac|X&ksfY+~p>)=nN$f!kl(Lp>67$$mqVj7pe$X(Y(5Ke2U6UU&Q=01v%AM=kW6 z@%%tGy)}BzATHno$mx;jF)leS`g0>u*%-8ZfxlH{bqv$P*D=hyC;Vcq;k4kAydcx- zh@;SbG!%JkpVUE{*=<`gIwxYHfL&0)h7E&devi5-Bhi%nOR29h+}lED0)S;yGE%iV ztE~|@#c7+NtKwuv7BH!M948*ma;t4PSWv)h2Ch0P6YdNYp+35=q&Q-$+?zwWy2B6z zwg3U*N*pdY)TboFhV6^~t@}8s z@9tfCSg`G)&j6FvbpR42Kd-yAy)vDw|76mfyfIo9vPt0=(S?yUM1j63$0^$>BA*Z& zS!w}y)pQE}F|=AyG)?@Z-CN@|BWg4;@XGqL7Uj8-B3)Ex_XwA>u#T&0=SD{d<65e! z7T+uyiFGztE9#cN=DD`;;4b`{(<<=fe2_t7k_2g_HLpr?U41-XCi;!kR*9X(_Vm%w zqry*%uH!j{F3+@E9-trLfz0tq(Qh%3%v=%0p<3S!8b9~uza16AAYPVYQg6OWlG5A? zCM1_*LSt?sM*Wr(XzNKn4iv4kMLK6)sSCR84!IX`ZkshRg@En@yWJorg}$WmwH}iq z(gWrI)7)#shstHAY!}b~bdVqbVr_@mmpfU*E#0Bl;j`n>t*ijD_22?xkA7%zhgQM} zP(6WUlGbhrEHb+PVEo_GHotYj)*tv>sTOpEp-mocu(w;#Y`U9`Z{{WxQ=?vbL2-Z`2kGkZEYVyWvP_-;E~|-m32RW! zMf=y+YwKIE@*H18)xD35#R@AXBTfeTa)*zdbf$xRytDtST`4(ifA$+5tOA~wVVmU# zCKv>}h9e?V;?mrBh&ghGPX$4A?Sn}nMer(Kq5Suz0wqKrlm#N+c>iC~i3)}VC zm~U7gYw`b9Beaf!;&YxXNbty}i3i`4CDjbc&SXxQ$Xb?dxaKEK+LW|jZdq2|& z7oY93=JUYf`G~o|)YpfcBg7ce12K6Y%{zV7f-saxs@(u~?yKUe;+ECfM z=Rh>OE6PZt^ZCSnsbZ6 zRb{t0neHAx(=PJmF>)U9=y*e@oaQ*J=3=&whT9T>a1H%P;{l-}5!9^^o@NoW!{zH_ z3Y|I9j&Bb!JbENrQ@P^&NF~_{E8ycQLn(xkd|Qnfxqq;}a3)eDC-$Vn0g`38Sgq!h zX>p9O&Ma5cE7R0Oc=vveckR&V2@V3}Hq-^X^eW>jwsV{ogQElqrs-8~>f8VT;W)c} z9$x5+bDyj1nU16q3_hmlS1@;vZZz?*xq~9B{gK!WQQ3roRYQmm?^#%@)CIwHPs@o~ zd3@mHc#5P@{nTD+$|wNHE{IA|P34F!mT)AzxEUBxKgv|=u<*Kn(jf#EOb13Xx8{$` z!5G{0Q~US2=d%dlOJ$S9HmmjNlFH~Zvf?oO;+&7L2wsKBFH&fPMUdP!XPeP#iN z(Cr%bz1@y^NUwtclDivp50*fP1~c#&j$hw+{{Oz5(m!1Xse2+R>%oDp%ZMw#X)8*u zX+AEHS1zHRkGm*aLs0l2!I$ZX4hMkA*Dq13W7@o;$<^@9%mVOey4qvJMh|G`R$@B< zIl4@H7YUcqM1H)e0)Z;9IJgoX7Z98kig~63R%e{zkh%jF#^HxXrvqAA1y-9|E|@{4 z>5>^O5i%QWd*+W14a0ssHjQq#R_{us-z55@aSokT@f?bAj8(n9 z7CBDSo?=IEnQFtshcV0XkaxRlC#!KA=}KU?@G@y2r#q_{NURii$`4JXHFf1JQLKar z`nC)C#o;hxl~5y$_s?e)Tm+9Ha}XDJ7-B%uqR;L+*{}1ApgeYWbq#0*6@s3A@MU1o|e}rT`mT0+;djP(dPW6Q&>MDzU{muFzh#tRf-8V5-G+51G8FZ^+uj7W|7& z+5k~&=(JL2^$y9LK1wLw5=hj4NSC!ssEe*3x)GG334u@m00&+coe(~+rYyAm|3G%} zA8QP>6u>dG{msM0#> zhO_F^N|(H#En_MmewBw%uOJZTwie}lZ!hY&ucn|ow!d*HuP!Gu_d^R`#y(Z4rV2vj ziWh?ordU``xH)SE-dIye6sn`^X*68UDG^LwqAt%lko}-05job=eNy6JF+mj9y1`h{BgpQV*9GMXMh%dTX5w<%s8SAjm;7bqtJN~8a;z%RwJmsa;dIrWFxB5DzE zfS5%Js<$uCR4BRE4#(3hRkQ09Lx~yiW(ZQCo1nQl2@6d0AMIqygrgIdMJSz_$LwGV zJIH|Y3IwJuTWiTdA+)#9+6{5b5YYk%e=u;i5fOCHkK*s)0pDrR37@+vZ-;pu{gU9T{nVb<0Fj9|Thg*eD*oIHW`0(HcD9-RNe;Tan*^`CPfovDHq*2hQTAluD>-!9$sfCoq1Udr-Y2Ts zfC7>FO{6tj2#Zj%FlKH^62>uImW4Fpb#bTU{5kkel?^7xA;ZIrYw}X2Gw_ZZ{Yce8 z#Neo380v^~DOT(pdN%7gg+?NA8q{JJTqqxi- zxa)usYD-P|&N|}CNwPNOC-(JKu6}6b=|SXeON#bE`gp9o=hw%#zT73yN1(|9{d>R? zQL_KgK5^sS6u2s={s14iUZDNWI^bXbXQ188GL8fqR(v!0E7k#O{{-`d>~p|@S8hE0$p- zq9YTcH&iZEoK-97_p1gvlSnlZE*LM$Y$}zf$<`PW5W7IdLINDvWxK#-nj%3TztEK03HTL zg4;EmZOXNgvd0DVq_H@HTE4byHnffZ+@33-BUn)jqm14Kl--N@+d^|rwgWJ0qR|xm zYUHVtny|O$1tSefPQbv40>`0Rpsd2h>{*>5;Enn4M5mubZaVFVN3eVWe$u7c^~rh> zP(E7tui?SNT0c}bwGK9uEeDFIa+YPe$*5WNA&Wa)mTAQH2TbQIc&4{uR5ni5E-UZc z?aG^2?Eym^#kvbFCJl;@a7@&$B29`m3gsvAd0>4Yi1Ih#0kSnu^uWd&Xvk7Jd7*4% zXh&EIvXsI;uQ^{jd~zwv)g^q?RAa*dv8oQ<8tt_dc_At*kl4v*iH z7EzI8#f)$T0o=?kUY(9o-x1tE;@sfDO&PAZsQ55}xZ=l2?ectUxS;uF009bSC4E|k z_+UcYn5RqGgX&DA*`kgO)Y70idu;21EPwz9M*si-Bi%4DpgWfJ0^8g?3%u%10T%br z#I)U~`nz@g=bH^&*+*f0(V9)eraap)8CD3{u|s zNyILy0iL4$u1_f)xZMSK07WnWET938=%~~H0GN2V(*fz|^@_JJ5Wj*rV3;`0?OLO7 zhpA`x@w8P+i|5v+@Bdo6FEiRu(q4vGbX8^Yp-#<2u|Yh{;A6Z{Wq!A_;~1l}q^j>} zRp%+PmnS(#MEe`;OeJ|KH9{?b5F8S(W+>UkxE9XFwsb{{llH^7FJ}J2Z%Z3A_2SRd zc$b^$pD`@v2|!0k^4XWA$|fCHyLpUN9%g208*3aJWKu@wBI@U@SKO(NciFTre15Z_ zHw_w#&}`sCg=lL+jgcA>>3JEvkj___HY94ppd-hd(BQyE`C#*_lg2prCkSM25A}$t zy*s6ipsvpDVL*#`4#J}1TB51D0DTr>)RsO7ZWLY)CbWO{t@#1N>vyT{KX`S4EH8BG zi!`eJ&hKZ}Ste**wP!$Os8+!&j24!GTI`BB;fW%b9SB>Gk~Y47mw1$QlOoxMil=dP`>CfjD@ty7wM z1c`p}ITS-OCwUT;k<3`(Jb$1VSb)e z9h#-Xr&-d-|4S|;!-!$_H^Lhox3=UE$^BNg)n!qSTv9Gu=-$^<-`O!Y8$x(G6?|aF z)TQuBK16CW8e4*Y@GO5>Wg&p!UUNAV=+Ykd1nQ-S;kSw3RVOwn*kiH(;M z+10M#(=t61(g*d&vv8>AyeAE6NGL}sNS_-=o+0+65oZT2LORXYln&=RGlRuE0E#Q>nZp!BL9lD>?f6UEVFw#O}T#AZ+-|F5hLTAA|3As>=Vv5wdI2ik(_`THmz3Mlp0Lx>$ zeHs*;#17RsMN{)eY%Bvvf^#M>RO~w;$0}Q?7|suiibSgg3Z?H<`ZT?t`oNZR8;S{e z9XFi-Lqtce;YMYc`ZAUR$`EOf=^{Y5Y6L4N3I6v@4;hRD*IP4Se?m7q030R_dP^6S ze(}q(>j(mOV{;aRI1DJA(jNcF9dzr9t?J{; zj8u6QI;)!^i8&{a>x!&kyW($iRkMYH=HVVp^j}4fU4`wDU!j62bcR5)uPt=@j(k&S zDP^6_#7%?qtXSySok1~Yn7Q9OuqforDKnu`ORc8bG{j2Dlc=}CneGx`y^b97Y+)WM zGD}3qyCw+B9h)tGQ5lj<2oZO5Mm8HEk; zF7zcQJ;*ldmHwyFpw* z7kl(&#uE8pYuYOS?3n!k5YQ%rx~GRJkO=>{H4j#XkQve;g6v}O0*17gX33B0JQiHF z{6vR&w|oo}VkU;Nc%#zoOiQw`ytyf;t@hIv0WYoKW~}S%^8uUmD~(<@qO<~bXjTc| zkC8Ry3NP8GS_TSIq*?6&l!8U6yGubF$TRs(-W}||6;2wr*IBPFE$a%&=;TWFf+qEt zESlaR?#!mRO!B=&SDG$Q7w*FOWjDn|=Ky-Ki2~xl0000AGsYNIZeE3vD9ARR5>uY| zTsi7GH@N)!G`*iFQ!6!4t4m#y1;I^U3nMYm^I_Pgq&k8IhLgI&D@24s!2N^0_jPyJ zYWa;2bqAs2s>}cr98=JILrmYHPWWI5pBEId0~0!1guteTMoc290}cfrK!raOjMt|| zS0pC8d@F`6I?(_Wl+{``W9)laG?C4bXNe^@vg|FZc<5T9D_ii4b{osS*Vc8RRK}Vf zo4^Hf$KUq5fr178+*EZ1r4D}lVvNQ@ea=61=JS2ytoY z0q53v(_lm#SA^)^PNau*imCl}QnyHOD*~mCF51N_tGe)d4ssl3TvCtT=_E|mB4>$T z>M6Kw-so5^YSDeHcb13D`a!Mdmc*ZYo@4Y$VxzM8EhOj04FoyS+i9cD6J7+{j!EE5 z0me>m@IPBm$$;kcOhTXP`quMhR!BeoK|%l2uqmommbI`pb|{!;hD%geu(H2D>l)c5 zZ2CGZy*19Iqdi8C`I$x+EO5Q(Br4yt1DE{DpWxZCkDC%`r1!xhTnkMyb{ zJmF%X-+0sE&9_p*iv*NqammMHTfCXAeBO=q%V5>Qy^fAOR@uN_1wx)OeIuW%shdfy zem51MgosqGRYsB0TNYv#>|>k(Q-}6M$pw7lZodz23Duyc)57z$SwjxThS{Limy1ov zICl<7!U|{`k_F2-ptLGqsEVlO@k4)@U5t!|4R$r*vHH$Wx;=$6=NlB|T8o-xFIKum zjuTG}peg+S?A^OV{@xy# z-fj9^vRbC7Sa&akuE`i7`QhbhuMKOcWCwyJC)09Co6NiqG#fDzw8S?GG_ojphz>i_ zyr?#lyTHxA2~6fZ!aJP7y^<GpyMFVkU*;l@HG}tHkje!7IBx0TwK(p>e(XN2%1)V4_{;QfI zQQ-1^<{zP#dN_#bMY7JmvZPSSIO%)h6oa6ymQz!I3yM0?)0_fI!yR#1Jf* zh70YHF2$4cMa=RL!56>fANEW06FqDJ8~OqllaUQE_C<%|%XmJ+mR0osWH~{QjH0%( zfO!4PXC4)!*36tj@VTGE`n4kv=GI|+@0Hso?fv?PBHJX50Ikc={6P3Mk{fYC?*Ywz zQYlYJX~EwV23;1iGAW+vUZ-j{HJ8PxYEl7GvLj`*jfeXk`N2ONcP+GmLa07IaL`my z?_%Kr5fm+>8MgU@%Yk|mHv0_m(P&e~8+{tQ(-D_ZSqaB8T&klQ`TO*{Um{2yydW>9 zr=LrVpeSHxpeIg(szVm5hTA)WbhkyRVD93#uv16aU3mmBHCj$%j^)s&C7v4Rvz$Ag zkQUj;U)E*Q5IG;ecpuB;TFjpXJCti468eGS=i*_TW;Dsi$5)6^Hx*r70xOB|=PZrC zw!+D)*);0Gn&9h)>NWy`1Qw#nkiz`l^ycpM6Q3e?An*1+!$1w&^)QASwCButT*G}W5dUxL47pJzD(@MNPLkm1B`ze+* zUbFVNkp&omb5gu$f|+*1oWsNKJ86G{HN}UApF)24Tmw^0I6f@H!Gn4q*&Mq%Rz^rs zet@42I3x@{H;Ba@NyCSrM?CU?^Xtqugm&*E9I0-WejvmX8nP?f6w~4G*Zg zFdh8QcBFn3OXZZsi&u>ks#6&I1s46dfI!e#6HudPFf99s00LJF)2GHH+7D84sBfqt zn|6bU%x&_alqmghoD(K!Ppd5z=39$U-cXJts7gyiqE#&?MgXrVa zpcDoBkTb?}va>(v000#@$3!wpvVRSwn?ECPt>K4Us4)Qaf}QXo(l9hoMvT&29z4;& z9qM0g;s1`f`t3i4P?XR<+;%Ja|8E;O?8bRjVr~z#7%bft+vi^zN|n8VMp$gp#oTO$ z(w_KTX0R9Hy0^GD27$YJ{U{H@dwBRW!wfJKT8>4VwY9mq8<0#|^W}P#Ga@3X4Sz7_x2~!BO6+ z+*+(3#3{zma8R@~(=0{&FN|`;eQ&5zm%&<#2z~=s$XE5fMOf4cKX(uK061sgf-jI1!O~4!ZhI;$}28f8ufeJF6t>B|EBg!V@ z09oDK1mY`pmiK1``jb}FShVWQxT;;M72l)TVMP;)fPx}AP)aD)+0{11Fu#~7VJzuH zG%%u+tjweAGLIp)eCvk8fjSlT6F@?{c`p++`5Ryvk#L<#mHnfCK_$-iPsv7JD>R`? zFkg8*CO;`cqJ5rxfK7h6#A_E_CZ!{zVawMUs-vWeO#XWPGv8mfqj{I?R9cl``iZ!# zsm(Zt7g1)H4&nh_%Jrpb24b_eKy3$alTniU5jQKrU3t6ut@@BVH%=v9 zLjcg5ug}s;5QRhYZbvmeLv&wM?uZ)QSfEG21!XjaPy_YqlXV&@cZ<5wIlbjZ{%uE4Q*F0-#6S7`c z8s%wq`-o+U)oU?|ens=8JTq*m{zp`{4IVY}FjJ_5_3$*vePmSL{W-+sQb{1~i~9WC z)jI`SWMcyA!D4@_u->Gb#DP%SRB^fz%eyx|lPtx^BdMk&VQk4?ppHcJNy&c5E29Mue2XtpHaORoB69L7h z+(bV}$>H`sNinr`sONVMgj#YyNKlJP4`H-X+Mn&*kg=wf996p$>{=faAb+f(?C6JG zopij}lZh2;oO%jk9!FiZ(M0Y+*itz?pTVoO%3;`|)O9C|ljhn7Q>FL8k8Az-|HU-z zl@@;VhM@_4OInt5QRrgZZ^OfFi-+s-0=&#fQnV1o(i$THM=^8>=-g1=lQ+N4HWK9D zJJrAKfuf4hBeGh2uS5g|D_^Y1p;-m!m=?Z*-Y-Iaht5-H6T}RkGaGIb8(yQDpqV;cL$uZej8P_j5e?`^-db+Z(n>zJN z0o8R*V+>)=HK!T%t{WfsTJn5HH}uqm2DbcpeZ4z$m6gj~QYbYea|qF`ykGzT1e@9d zH2BCQWZ-(PtYRebU6?l)i)(;qe?hKkMUAWTRN$>(600S*N?;DD*{obaB+~^<@s=m@ zjOSDOt+n^Gf$B`zr328E!e|Z8?r;jx&kFhRXSeMqsu+yfFl7rlTawIhNItO?3CskC z=D7EzG>dh>sra|9=j#ckWlfp~ruySnHAer2NpffAp z;u7|*!;Ol>r%5&#Y-kEX#t8-D09e4}+y(B;nnM?kp0(lcjB`iIh9`iXTvT>lt1 z;c(@7;#Eqs!p0`gcmEDe>sicxkHDT#Rt;><9q8Qw7@Ggus1@2HN2yG zj{K6Owf(hIdmLIJZcI*%Eh&zBT{$O2>bid;cR;H%x$CIg>V^})oAcukeU*L%&Q!Mq zOkND~@O}FaIpCx* zGr~phsxEmd^>D0awV(BJ2^3gXq^+pENIhbNSBlY;`^92-0N+q zll!?)DnTF7?_g$%n0sU{W`RkPGwzf}4A|xjS8;rbM%$YlZ)bYHp%NRvU(<~+k+|qG zw7?18=7mQgQ#I^T`AZTf-FjzGgMMm}3fDk}?LLH(fTZ}oF<9A53ql%DQG4dpY+6|s z+%k6ODn6ACC-LkYZo6SHB27)Z077LcX#O4t&0_}pm9S?xSPTGgYV8g$83sCCN#AHs zTM&Y$q%91cZ&LeFp-szSp&^x*j+*?;J7Jf$du$x01w-8BT!E zRHe!3l@?X%ClEcW9DrUtWbm0-$&W+)!r)qWT@_&Hy)XQ^qyg@Iyt!$F8@j`9_Tlnz zW7|QkNr`M1BQ>d!Rd_Ku7VEA@^^&pc9wwt^4VLAEr=VAZo-`Ly;q(Nu~b%wcM3;>q~SXqPmgoif+%# zitfY*lXY_qJ7>}ww~!0xf|cEYOY759j6~ZF-K!W1HXkJTZG(hsI;k4Qu&MOE&x@;Cg3D4lD%$WifGQ~6?tM&^zjPjb- z)*f=n6=F-Lvpkw>ORw8TyjLtXFnDJ}g8b(7>Km?S=oXEthe+;9e4=Fd(6r6p?+*X@`gZCJzO3%o>N z5L3RK3cvmZkLP2Q%^nb)uO%MKM~}vcrngT^(^9mA`hLxG;?w{ml22WjHP(r>?^`Y1 zYzYj0Y>Z7YUPchVdFAQqv13QBIQ$#kqO92XTyL(1*fP(!oiopmTGD5Nz>k-_bJetE zx|HBTbMP~YOi@U2qkR>u8}W=l0F{&zjRQAVrP4^x9P>r7sEtXyd(F zV1)_9$G^8zi6_p)4%O{`^`Ob!cUG9{6r>80_3BceI}4#3Mb}qjjsH$zIuT%`Q4KwF zWf-Cue_A2`a?@uyiuzhbubq1o&qqF=iBIz6VrFSemLC;LchzCV4iMpFqH@E|{T8A= z_I(R+5%iy&k5ti{q@*q5h|Wh!$k*E$(+uzr<%Y5PN(-~Rhz}eH%Cyf1wAEKHRkz~M zL0- zGM8(`!8+tMmGs&L{w}$j;O@(ejPQJVw{9?*0C0wBY(dW2!K}f`$Hn{py=9UdIp{x6 zf|m(RqT!t3@e3D)rvgoJr6cQ&oR+6ezIT|_{vO#G9E@!xS;(imUdP8Bil#wD^x$mHYVxL$axTbrGJfja4up3FuKPTHwFi$Zu2m+*;>bpgCil z+}dTO{|Td@F0iUu)4`UTT!{O4CRynjcI_01L`aywG=Zx(I0=5%M>J3yM_3L=3?o`_gz6k4n;4h$_sZ9#lu$)$l{|0Fo)C(ozLUi{a6 zxo|q2TV1aM{Edu-MxfCoXafCh#edg4^m&jN(dqK|Lfh-hxtt|bcQz6^@|+Mnql9LT z_&;D4^W~F(p-$M&t}|fZEYe_Nq4XL}qUa(y`op5tuE<(!ya#xb8+Tam>NK$57CS0N zodqqk*S=DDN~K=3!E`Q$M)@Z*pSmoiLL< zn0&=-@6~eIHWz#mB^yUGu|>%^z4qWkQ-12S0$Y+Olg`Hy{Nv4|2dIlu(D=!I0%S^R zgm3?teN8(U+$6Lk7#c;eKxvw_723oCQ%%?V1Kv`_3mWUyD@BG@Akx7PgzndhUDw%} z73vBV&ChP@cRnLet@)Tum)w?n4ch<#J3PMR&qt9cq7E$1A~h^FPw-_f=)xruOsTvV zM$tFpnEnKr-q$X~sE=@B()X?r`ja$ejC3dwgH+TL6-V$Jp8c2!)+rGAt9g=MO5K%$ z)jUH64*oQ>+LRKr+s_jGwmhMBlyg8KCW9@pCl>;w8C&<#gx=1<|2DKH{RlyqW@jKq z4h9IpB4tZCP4f%v_Y^+PyozAK>Z->nJ0IMu5%E&%$D1j<^1tt!(N*8f9)Ck6PLMxM z=WN48Edr0PC}Rimcn925C1Lte0ZrF|Zzylrve;q#5&Zue0h~7$^xtTE1KTZD(b7Oz zKwzYsQCCnF9>=@rujTW(=<R z91LzHdp%T2CM^8ac#&^=v}JPN<LP7@X1|62PS<_yzU9IV{Bmc+c?P75aMxe*)Ey zh`Ry4;;I!ZDx-x`X>MOgaV@MbeVB{sq)Gnuuc5~L43m(@OsAzZm0sq2P-^h-T_(5V zm4@dvs{=be#yV7SbLJDywPIij?LOhKUj;a(Vf3AxZJ0W8{MHqNF(dODsVwj2G-J5N z`I-YGl(KO3Gjyuyk5hw&5K^-JI)aZatcxkur zr2Mdq_7KXwFFFgbr`Q+tg45o%mLWO7^$?;P_5dR8e8y3-f?>)cFFGe_q+pfJel#qh zS$A76_KKWtinzU*im_wgl`NuzMJEd-%pw8aOc2=WLwN+-?p52A0do>r)g(dJTuffxIsCFxS6bsC&+w@2Srg=IIsin zP|PUNm%_zKZ!V=hXO|0f>={`zM!`aS%-2=8dt-MD5N=cx;@i(AB@P5%D3g9k9FTLypJrDLzG1KzqdvCV1OviYdA=ppWY-HW zqT@5Z1*jEhv>Q^Q1Ww;P35X66Yv={EExG5|)$ssr(3g;{$mG^O7KbH;?P%x3OnyIH z0SxEWP>9&75cYOIvOCx7=Km&`n2aYL+eCq8ce87thY!fAA^UG~qlq)tr=7ZEuS2O* zM;QuR73X~~r}FQUNSszZUwfR~3WIh_&P?haOC8-q%ZG{wLrV;xD4egP8oyM3_WW5d z5dKX|c$4p2JAK^YaymmWWa0q#GdE#vVdgzx0P=>lfp(5}uVJF*+?D=1!3JRwkMbC{ zPUDwuG`1?z;9Vy`8^-G3`8rUmXv1d(L<~V3|1?zd{S1NZ81gJ>3Z*MO!I~~f$BB^~ zA^Qx*_t#kCHsX;kx$#LXT)??2sf!LBt>m79%e%nLozcSd<-yk8^SBBb5NwflC7>In zv10`))DLOM2jkyuD8`bT80yJ}ZqNTy)Kr^s^@jarc5DWbyM{3(S@ArW!_INEF&8#( zvicr&r3f$3uXxuAuqHk{+penc#%P+~20)*Ho@2Mo=NLk(O%3}Jr~-Ws6D*y2+>%E{ zaxQ0jl$*i`wBM2P-Nxo{XSV{Ea3Wo)uF5U4PGV>!>zQsJ6Sy^dY1l}dfV%>>WGY9! zP|vScQ;M>;Lt7NzHzm@qVFZaYrC1ct25xYsEru7|uQ&p+}v;! zi?4u1rvtw9NDKS}52fhdly^R0RRS7zA!DCG%rD+V!%^DE4MR2>Rm^Q6VubV?Vpd+=nT}A>H+F}0v}jJ0<#MJv{-1lorcUI8j}q2W?@ZJnufkq2derWl?Gn0Eo(PJ zIaouI1+(pQb(;cNZ2=SAnQuaA4PIgi>HDMtOl^eDr9CmsX9KApl?8Z*Z)BQW+^`oK zD};L1Vy~v5EW=iY$OS@}%fOL-;?kV0MYer6e6G~%cUj9oioji&_A=>7eMyX5xd&zS z9SoSf03fFiqQI$O6H*7-g|5;cD9m8*$Q^ec$uS>4ng12}6O;&Gd}mow}e z(!ppO5KE!rP~C1i1z6ZiRQdX+CEbJQuP!$sWv~dNPRl4C&^L<*G;a5N!Ku+-JfE!>liW6@uO#CKt0bQ#V#vujY5jFJV!;D>B-d<#a|t` z&|ew^rdfhmFn{6ZXU}QEEkH}yjNU8*5D{m*Ys1PeQ2USoDlNhNC3rv?*gyyY8=%Uo z&$t94TM%9Zmr+4V?RgOb3V=41kLm?u6HEPQBJrbt1QC6Y~> zY|JJD**KsyQRT%iZ1)Tp9>2oKV`9Ywe)^et>7$<3i>G2r2Gv2EhoO8ZBs{4Q)y8pL zDEn*YKi6EQ;om(XSs<=d^2ce6+!`=gTw4j6n7sB=3=D*IJ<3{5qC@f42Pn%gbi4d5>DLVP=}b6h z-!CTVlsFA;tVikpO5mcwV-krz1ge`_7`7F>$>YWRUm6u~?d4)u7cWIP^4R|lJY%y; zUt$H=0KRp29B-ATEs^=bl*-PH%j}!JNtLZ6m)O z&jG(YEzO*McfB&3d#A{9CJ@GLw3MPPCsI&f^y$E)7!*1&;d+I>9%^;WEg;&UN1{|s zpeQn(EGFCqw}{6xu)ljb9a8wn)~EG+-K)_tjAMcBNU`d5!7Z?8a-5?K(m)Xg1v0Q; zq{e)tw7sp7p1UpA`R`xNn3QXrE_`2*4C+00Y+k7se-8tlykXtXmTzv?Xwo4c$27$2 z)KO+Gjwn_T=v3pOn&*P~~atxAxSHfQ{wY@GKw{cODi=v}1YO7usU!nsUmR z>bD^wz6yT7W%Vd}mhdvXm@w?NA(1=XBOEH!4T-U9d~Pogv`Mctf^XNP@_^8JzwGW= zKb0HdUh)}}wpkRI`9BI$CMUZy?jj?u+w2R9m?>4)58w97vkUEh|d zsWHs!8MRms4|@kv$`nbVgbQZW?Z2f6b(Ce4@(@10{-e{@S+2#KC?vlPKpiFi;q*JvuMQ$CDg#b|$tbZJXD3L|Lm{_H#+1eAjcp zZ;mA7E^KgjIaN2b)a~hg#f7(1)hs6VQ!{EM_Evbnx#xMnwaa%6BO?2TC_JaH!|{8u z3j#GZdn_S3*OdG-(Wg3JT^%yzov_QFFo?7T|2HL-lnpHSx4uW>*%MnNzQM1UTE?m5 z&y%_mhCZQ)*!99B^LTGli}n#dAj;k&qn*7Enn=MqtbQ@SLC_G0#j9I{Htv+6NLsZsONqpkW$X74 ze`@Q!N(>hX$#X#5dT=Ku&b2)<9@86uOIbuMtd)j-6njVGxl+Is-3^-_)%(otBT7qZnY zd<-=Ig+jR;qJ>b+zjp|+h{yW>L96PsPH#-#4|S*oK{7YA7Z1K_%L1;+G|&BwYG z=Oe5EG8+t&RzB)UC>LM{GJ?iKTN}L_qK%P>C$3iGZ$`qmwSP$3EVP9DEew7DUU23v zf3*{W4yO#zap&<0A!HI%cC(33(IbRLP8)`sbEW8il;Yc`WhJ6KYB!thg)ttOk1^)_ z-iEmz0eMmoe^$Ejj?iWpaz>mS)qocs%K#JDMu|DTA4FyV3YuQ}Pv{xfY;4ra-5T69 zbuOq79MR8ZLu6kKPKWVhdEDjFe_}*MMZVNH<=PSFdCrpnXUE3bs*|nHS zCZV}UPrJv2&ckP)WQ3nRlqEF}lcmY>P0VV6L>c&*L3WU3oKVkWL&hZrv8BCc zWlr7D=|6yinZrBoBj7#oaF{gcu9QIOfB+rNR3WKabavIOvu0w2`;G<8*XM0WUDWTD zO%@9#!gb9h`$JQe=lV1@0^VqJ_Jt?hUGLkLG2oa)90?rDOPgF8X@g;!Af=qhf0ETh zW5mlOf1ep?%R*mQ`|yQ>r=xO-Y^deIqF(o%2_)SwYKYE4!4E zcEaq+L7@eDZ=c}vV{cg_hbca>-g(gdCVR*y(#&f|hw>|}mx&555Qrs{-`ZHJz46rpkBGJ&AKzwMQosg`-osG? zJctmkIP`LlupDMF1D_hT`vV8B_;OC!x20aM%ixsph;G}a@!R&F0X1@1x45(boqpVj zA@3Tz<{$O}zf#8_@EUV4bDJ6e_v+vM6#yDCzQXQ*4x(f*gSp1$8FzEuckYkHaU)G!B0~YFesq|{O6ayw4eR3IAYw`cn@`W^JT`zbiRY~D%`?g!`Fj^N_rvE* z!`9gyU#Y#XA_W`btT=q<(swFQ4n?l}p5B`Dwdk60isuKY5L>NwW(?|Rk(2huL?EjW zvr8p}QwiA~F;_HQ`}CW>x|{g!Ql^JJhx=wmv>`?VgO%;j+7 z@Y3M=h;3fx*A6&f$*NV!K=$>%u>RXEzV`8ubQ&D10)Q==T^bd%tZSItc8Dn5&{!uE z-NJk~tG!FZ(bSzN%PK#ovp(8+ecPR5KWPg2v6d(|MPqbV>4=bBuMIs zv14M?Fc(ezz3d8s2EzHiQ6#v11H?GN}J0Qle+wzY7d}vbp{QXdtJ(aWFd;fCAg3li~;v^PSPNLkHNX;$J>M zXZ(&IVo*uFD}xY!j^1RczgpU9&x~0?x_fNWo}+R?j^}*8AjYh`OD8=&_#pwcT!l;X ze*Ul=bw-)TXhvOO;_xf>2HYUk-yB+R8iVZN$9y9Zs;U%7?;HXtG_^d&1TYfq0MO#- zfmo%(+hjUp}C(Zi14Zs>|r2M%TiN4|KvwlCn= zF+$juQ=8ye>EapsR33`v7XvNx3G?2nCfC0Hql>C{E(C&z!1eV3>Z|3{H|(hFZoSW* zZ^XmANSfqRA(=xybV_g9tCS*-n&DX;2VV6j1_0q#^N|YC^iZ`yA3pW1@a_ z?5@^XPDd}?L+41M!tClmiQtH#nhV0b-wI^yt>O-M%vX~SN1ZJ^w;!!o?V6s1ygEmC zYe_||pYTb?Yj(|m00V@8EX9Bg;Z`{Tc2o`RMU8VR3X6m4=x%xrgH(@e6F5qUuP$}x<>b9azMhmTBwRlt{Bg&Nce)j*cgsa!CF*BCm z^@oMp1ay}mm|p4QsH{rW+B@sj#opC05`qVj)SW*4o}-RP9Vya*Z^9f8 z)@a$yrT$O=*_K$@zb_&hl>B>F*l;>K_kC3{HlXIU3g-2=#Xgi{_Das!*tbH!m1-P} zN>%*u9k+4X537!R5{E!y`Dye9=FgB3Vg>sc0=*IkLN~t8TM^P(8WM5LkSLXB4N%H6 zP*K#SlVvQ>+1%sb^1H_uG;}2Wdo>(?UcHLwR_tn)IHeO+p(RRwJ5?Jdb^g&S+Fj)N z)=ATtl~pnrr|{4&N*DOyBVyPWx$rB;_Rks)KH@38cO&@?a6_0U9yVr+T|f& z1ve0uy(w}x$^+b>IaHbKK)texjT{!Gc)wVlld)gd^gU(nww$(N2?h~Aa8S;m)i z@ea?;pUYOhfcv{NYtIkXyQC|p<5k&+(p=YQ7@Mm1E6yp4h9M9^`Epm#xb}v!4|iGK)mD|U@;#OCZC2T)^Ez2yZ| zl0X-I24MO!gJ_^@?F;r+=PJ!@CTC_{Q4LjN@Km6rsKolPpte|mA(1qhj3rs|EzaQ5 zWK{R?nc7q8_?lLgk{;#NHQooI12Y)l4x7VSbY^4>#IU?;yYD>INF-1WXqk-#u7-ft zIiG$TU6#hwr<5>fMGFm(ITkt{y@K}Wu1)=qVB5HUiyOtdjzJUZrjS~Yx}qNMgMg0l z6}9+@4j=QnC%YM@e=3h*wsKGr9zTDl-*9B()bMl)}l zUU7eWDZ&My)?s2GbJYo+AEkiKPZUtrPO;9rQ*Jx*DY~7#F@__5S7>I`Xf$#DE~o~Zvv!jQ^9==r znhu~gl;Lh`aX_3|J)xv=M^ct|X#fg7oS?KH#Eb9aeZ%y(nIPC!FLh-E z^W4|kQ-$NtlnH93XyPoU)MriShmV`R#Q>I7kF(Ah>sgL*Ek~aKh`tg={}o*+=Jn-a zt^{F{=OoLeb=?g%YtaA@sun94Khc`~i*D=h<6!l_7kQV?1rvOPU=W7Vyv*?pksle)8 z1UASI98_S<(W1i)=3zSbK0TzXf9|Qlj1{m2C`cqy4FEuj=ACv%H*R4xpGSpJ!=kfA z*Q9O&r?b;$Yl`if6PN zIN@M}A(uOI2tPXNU?Cv60%)00DLR)CD(3_yEm#I=wbE6Ia(_-)>BK>dex<&=%gn4v{03GKmeVrcn220mT6rssl_gbTI#=biNO4ySi_lwioa zcknYxs_1H0e@gvtSXbex{;UmwY?-pI&tqZlv1JjqeB)$m5xli-3D3UA&^=+ja6tE} zS5HVl^(g?lcKlac=yJaroxbX5Op zkcEL$yutRy(nitcrxys!@Wn!d5@PJPyns z)X7h@k#JSUWY67#oI%JBP!UJ3tI6X;mVjpP6i(#dqyOoWZMb$F=A_stU#3Cs z6p;^pchk=q@0Dw7B>6Mx1$Woj{!snzY-_h6D`RgpsvzbkC+e`ZEAavSKI9ru3Wz9= z4d1M$^*w>})I*CC?7{1R7&eCrQ)gtZy#x#YHp*Ei)Xwh$-lg{tI=M546=5kFxoZYp zBNO=O-1QE#?tDbw3T1xrMIl_9z8*hApYqdyU6T7|nA`FD;nCV9l%sjkkk_^cX;1)P zm5Xe71;f}@cD~F_Jk517AZbH>cn;U)A)<=>exqr?nVm^6{yuTeG_C+qouP=jQr60gYk#r#931v6HskYURhi%iTK-$^Rk`j(8o z@n;oF=Ntr)?iBSP)tE8%+vIs*e}mDEk3P;AG=zY`@>o?qYYRBKvq|oN#N3_8Prz*J zN{;Q9*1 zAvj|x#Q=(QGS;GIICw;GncR-+da2X3h487pqrgC-xrrny9m%bpV8nx5- z0z2#+S>jGsgS-rq!VzgC16WkI%l5?CHNcFPNY^byWI=be^n6+E9aVo9OYYj#;aj#X z_56JP&2*|OluBD^4$niQUX zpA#{zg=gL(c%Uk(;Son>R_udHDKa1qr=R(|C=bpu;LSQ?JKI80s;Px~=EluDXPvvy zBTQg`t6LaHfv<4hBh&i3sKZRIsis!=?$5mt1g`v!3(#iYJVb8l}F?}Y2e>`c2f552-Vc_YuS1j-KXkzv} zk0yqny{ed)7V<@t9VN4UQRJioah<%tB>MON|S^zWSR0o}!O6|F-=4DK@!*x6u5gU=Y>%f6p&;`oJpCkN{uGKGLS#pdD0YL_9& ztm~=LX&l=}}pQt;_pv%EN*u0@L!vxygY z_5bw(3qcW2MPuv-Vd0)C)IwFC3I8MN9X194C#K``RBOP$tK&BgSvZ3Psa_TB&ozb7 zu=Lk|Hp;7GEChcK4=Dd~Y3`WXCgQcwjinE$nyLI>stXr$(!wwiq7|hQ(SWfMy6v0v znSh2O^e6hFX`z9i)wVhW)ZhRy%fd6#r!2iGD{nc^K0o9!#b-PheGvdT6wjaczSO$l zrC$2OE~Qt-hN#-__%^3n+jMD#v2%ib$8u~N)D-xVpNe!FP4#+is2NOP8EObGt?!;P zq)Rsox8XDMnQ5xjIF9DwYqUUn%dv9dSJEV=wZ!u4;LVUXtYqh$bxw{}q(L;S6yZB6 zV)=N?@$jGp7`~e#lM172L4wmovfqtB3%K5#*Q($O3A}&@dZg+{y`X0=4(Jh(V9}N) zPu&*&XKeQD?*r$ct3GLb=9c1DH+{pt1mB#1hBBv7lhqav$o5V&0yr_jWLF@r4}R}E zeY{VPyRDwnecRzQW%3cd^28}Pni!2l6C+>z+N8h?p!0?g033O1G5QCO5iTv*nWZPl zO;{xKr){fARJ6h*n07AqLWm6GihXT4c|Iod3pns$DfEIe^={YAR$uQ_vVJgqbP|`$ z3jEF8SW{IiSV$=sEX3cE`Y4{JZyiy)!w>5<`jOn?XHB_O9JD>tZl>iKj?`GAX2)Xr z#iOr0AfW|J4LA1tCU1ib^k<0|^f^3P3Y=|T{QsD|s!8^r$!Yv{SnzOo46@rTLYxSs zEuoWHU=EWNs-AC`2VJ)aux`YZ2y9&D2)E?x1bON@O6TH)+J>sFXJ+Nb0Qcy8K+p}D zvqoN`e+S!NOEB2o8hk`L!dU3#8p0LLi5fr!k7OUNG#lhO0rTKf)$&Pl;3Ht;7DHrf zR+YWIzA1%4OA|m;7UHdPXe8+>lVF9a5kLst5sC{Pjc{EvU*dx*qc?xl(@>JR3YQb7 zrIjs50{^n4`{lO@d_1QjVK7Rl(dUIqtKmdarJZI;xJa$Qd5$8HClCEIVFwA?-t-?C zzLe5L@xHJkWFNV`68u=NWBr=3z2O5OY%w7r5h*XO=W@!bo`Pi4n~ihHpGvV7hq_44 zG^9&lPR%>L%G%;Ug^!?000eu zNSVgv%&$95u@32b^)=rGTAMU?w3YeDiV`^LEqC)|CWW(Wm zyx0_Q5l^+WE2U7h{35?f9VZn`E@;8lfTL9JUZKP(mOhoer{vo45->R3ClfssaYLcD zbVj6B+Rq<5aDdMb^blhK!Qgw)Lb}128se^IR}pwT%#BbgL#?glYW+)wTTmUM*-<@rVR3tlYx~v1;+6Xh&@g1giU34g})8Q9@{c-QC?q%71 z%b_!}v(B%^m~;vtzK(K|KB#HoPGX#wbwE#sgd+y&hef?`&39exqL7K4_prOAMJNCC zDRnZKBpWrqB*w>OoN>#&=f5AUBgfjt>T2PK_S+o$+EkSKEt_jpxgfdWaw7z4!V9<3-C5$2GBP(V<7A@(Tc_c|&AzcLqc`EPD5PB9p=jXt*<)_pQzG<)7J2{% zgeD=WOppKo0ZR{<@BwCd@pbkQuUQBNX;UNskV+tE@)`IqfCV6z8zBEqGgR`cjj^z! z#fLWM-P8e|vTspxJ;!XS@H7!QjxG5OPC8l+_B6cIWi1P4z7eUJTqM{>!8ajF>g*P) zo^ys$)JKik&di(y8n+>TK@*^LLPWev@%iu=_@$e5`I28|@Xzd5_6P-f@SgH-j{Ze| zArx2bLONf4p6mD#quDMTWO`H0ZL`lK*v1mLkMne(^ ziV?bnMH7$k`9J9XyC&wWphj~mN?J-Z;A7*}l7>b0q0*a}v=MyF{NB3~t0FA=qzH@CHbeyOqXh8v=toYcnCOw%#A};|C|Z8!2FKNzUYjn=`|RYR;x24*@9;#BcBi zx}|n$C`(ia0(DMv&FD7;2EE7PhJ<{UOXU4D_Z!5f*ipLxdBcR{nT@RGa(Z;q_DraI zN~rcfK^L1oGUXHfL2}V&)X67cG)Lvl-N1~qAFGx%oPGe^iALq}?%NmUNoE}41P+J9 zf1f+$8Hz`qh^|){W$H?K_s#-%E7iCv1j$^rdK_}=a=of!uPVI{Dx8ja*U*0V8G3DB z&-loNO>>dJQxhw4lrf^J&FMHpTj%VXQ-2@?p3*8M(CdFV|LB`pG`-rnwnMc@`*@;| zd?u;+IFkSX011y8pC~D)j%5U-S-n+vPOt4prTmC+z4pu&A^^oY!SDex4hf4URQ=n+ zl08?jJ#>dFp6K6+uibh6cI2s$VI($S2F~6aDCH6l!U}=Ac*>!xOFTwFHxixqU=ei8 zau<|~HLWq*F9VK$;^C^~Xsm}07CDP$`WY`@HSk!P5xz39ADK4wJfab{2NCF}tLsds zy=TKMIcs%%ZofZI(GW`IGk7{l{Zv36G83VPTVL10XlHv$eckwuY^ZcG21VP^cXHLHgCaVd2=DFHliW^d^6E z9uj&hl|r|4<1)Xi6nf$QX8p}V3+4*tEodsz<%E(cuZ*>)_yQo1mpz^H&D+s4&e=GC zY{IIZ@mPu20})oIjRodze!!!Ig$WL(;O9g{#+dVGhdc3vY5d^&xfmqFzI8-}D?Dk^ z#sJ8c)_|72$*n!gUs?9$c%&f;hd165$L-;Uah?ddCN5i6@lrT(A33*fe2Yarsji1| zToblk=u;OR!1H>`9)%HPz6*`YsrHP`AfhhPvhk#!9%&i3Wk*ucd`Zv(3I<=*+!tX4pv+~;M)Qz{6^Y|2mqo9 z860^$=77S5qst@$?yD*(rC&^72SRF#{-mJXBk~~M!(AC;fRAd2BdyiV61`L}ocQQx zpKjXMz!z;Y(2aBTm%kq+24{1T>hZ9wWm+^r`&MnG>GhGRR!? zn(Yw9E=af7xzvRpz&8hAT?swUxe7HF7bs1PMDc5>>2dzSv4J|9%F})-3EB!%yOB%a z6st_@5|gz z72K81ta9w4l`cO&54kh%C7^2|h-Ue57<*0kFQgtNL5+7|=d2FGb9hG>h-_Uo%uq9R zPOVSNlX>=?L}lUG;K7q}GQo$|RHjvU007p;WtHGFUO+9~1W_1sB6xP*3_Zg^vaKe} zIx0aF8*lS%iORBPIiO`m0CBBcj8B*~mtnF*<-KDR2fVQfLO_jtbJNlMwBA&5sxZsK z`maodTn6$=7C(Z4-r)Q-gofm8!~Z6`q)@p4&^5Aj?RKPe<51Bjcqm}OjBc^$Tc0A&aGrjZZy zF1cRIP!#P-0U=tAUu6hCDYsC=a+#N9(z{%~R=x6#?D;&sv zRcqTpv7OmnRHKR7Q#!NC1wE4YHtPzM!2p;G0(j)Q9t72b zyx68!h(h3R{du|G}>rT@e09?|2>M6eE8c6l?0Rvzn?(QJsL10G5PQ?xbhG@Al z!-AC_u0OsrK*^oL?~=wH%s_u$l%>wjYTV;sq2&*);fIHG2R>l?*PpqGMq{coV5kTy z_3lWDwlbTwprY!*s}#j@>N3Dzx}0kuLF65bHBnNMwd)o|;529Tn(oO01#g$LfOCv` zy1YYsp)}h7*~kKz+Iv6cXZpC*+R6m zKhVI|zV%_AgWm$u`FB{;KW}AaJsqyd zU=70h?a)%3c;{{K8hCUpcPmywTKn0bdtCnkFX)m1doLPOuu&rtX8{o7f{6JXR!?!m z`IwXR36LTHD?rr0@8roi#zNfybEwWEUetGieo1nS0H@vw28Sp{3b%N!k5e;+swj6V z^gYUwK#*(pCR$*EHo;)=w7-J@3sJZ2D(M!Jj6e8RJyi>vd~U;^NmIOPPo^Y{_F73w zC{o4YcV0+Y1jV|BwV@r0)N$s>tfmzDIx)Kv7#%pn6$ye^Q*a$Y?|#^%COEVGmRFW#X|67le%|V=*d{oX^M~Xw1UvLgIR&)9*y8 z?eH#KcfW?ZOkP3@3pzRztO5O816kzzcw=ZsF z+2LX^|8H75t?yM_vcF*WuJWg)XC$r_EEQgOnM$p3yYlBS3hpK1GpD?IZ`ZTJR8wws zvydFZI?#TVcrthEALx~(b>n_W;c<8wd5z6v3!x+eAx z?!w)^MIM#|)G7k!zVZbDMQQtFmo~(H1Gt_B@yAbY8_(t5;1>q~9uxJV_Zf6Adb_Rx z3ZW6Ym#>nO*A@a0sr8|@REh0E44r>tyvOyXQbn~->^$6~i<`{nI304hXtc!3y1t)E z1ziD^-eK8i!em!&2tss9P{NF=Yx(+W1bvpLQ;Kc5BH+w(3&#G9C(z!%-w*KP7_dYF zi^A789;Z8hAIy0fPP2tAUdh?sP@ z05Y82E8b&5t4_7TL+_l*X{{{L0n_+XhFe*O^)N-FV}w3Kgwdq&#z4kE=FwDeioFs* zqA3AuzV? z^ZqIa8%x$9qS?}lr2UOD>oD!@nm;SsDJF39Fp?S3s?hiY+(vKIWW?xMjdPPBU3$44 zS6DKu2(gm}c32_ZY2ql^;VBzbY_GdVwJ`gWna8hKMAg({aWb18cgg5Wu-H84q6It7 z)VtV}ca7i!&n-j#R!H`)$g#ypr1Sqg-yk2Q3KH&bz2PC99mnqGlPV>kkQk!x@;yoP zX>gNubKW&ktedr;?<^=T%;3F0J42cwlWN zVoYx03Lv()=gvA{lY~7HgBbK7xM~#%U}Z@hoKVYjPyowB49dwYj;Rb*MbRgKrrrYD z*z$ESnWPS0ejYYJNY!%jD6Xu!OXUk_dQ~^n!W`nUXe@%|WOm(T*0E&kU>>HV_kbC4%2wSYI0hzyg zM?AC!FCct4&=phoMFpLaGOapKm=3`dWy&$8X*-(4&BghJ9IoaI;&pDsRP_dm`zi$v zr8Lu8b5`Y*qM&XThq}?!)_RNK;>GeD-TdhxCu?tuBER?H$xA6c6cdL=?!1{FW+t~+ zU{J+CNM)q!gw9=ZvJZIlP!$^{+g1=M<%&>kUs24c=VF%*9Ax@ANP3O>U5pQ57a z%eUW=Qqn2ba1FK#%yAnJUH|LFy|l!mOBX1h~9o zT{YkCQORQjzZ^IAz+`TIfMF$!a6Pa*_#SOFT7qSBXw+w?H(dM)s(;GEhb3^_NbxAa zdTKJT$aR)sv*OxNC&^lh<+?ywDy2omtIQP5HND&0(qlZ}4UJj~s$CQPy)VUhH)qi4 zgdE=Z8l5@d001IdCS000EXWEFshBbTqYEcto8=n4_&nBHZRNM5R) zlN7yMP7RJgX7)Oc7a2nOJX~XE+rxFYtyO%zR=NrWo-ghU-29}ZZ}BYYhoq2>V{({7 zjSdG6DeCfD=^U?*bnN4A+`fRGozJp?Vzf^nCt}}xzF02iX*TQlgEtcbt++XljFQ<4m$EZ@{5}LRF z&Ck7-0xq^_JWDCJPfg&Fq!aoP29z#6%j*%x+8U$rf7S%LYaH0SNai$R9Po{cb_RN~ zi2uQ7Pb8lDKOL2iV2CcbBBfMJgtZ{2Z8^0dBpq#Z(Wa2gh^DjJ>#wQmje&~YkIc~n z+EnhX^Ty9_oUyYYCBLE{tb;dBMhL_2#DhbjlghhF$K(9bkdI!BmVt}1YH>=8t~cwP zG&_*#8Ig33Y79*UnX=Z>_}XyrN>=EWV9`p<%GMYwsAvyffHxu#M6jv#ZfUBerZ)vtg6%9@dkhl^+{e8~sJU}sgFN=$bGh}|~VSPOxj?HvWaS{979Hq|0Fs>XQ0dh1wG zvi(U8CSvyFyu)$jB6>+95m!IB%NTR(l_4-VMWPWMFa+Pvq-ZrtGWxG*^8NSj;}sR2I2 z4tnaVf_i-!`?z62p>=*gvay}8M!{Smr^=_@F1Q;M&)NV2eT2NEhF>(#S6+a=tAur5 zZ#gNlaD-}z=*1mezzYDoMV|QIZ8G*)-3exvXQKRB>&_eWAtQD>FC;?BCbh_tSf6C(u~{ zl+69itDmLUqOrKu4&l@jDcQt7jN5joxZphCinU_6Vv{MSQZ4{*9EjsUHUx)FkR~Zh zf+~7YgTQR7hJEEJ%v6Jq7630lj67Q60c4W&4J`t8)`ahrf6%2T--tt;335;F5T{Zb z@_o=tP=ok}K!NJI4{0IV9>+c4^>#6HCY8^q<+rHRff zfrUO$TVreJ5{Fh!LXAq5P%%$zrwCp)=j9`u*%1$%BRMhkrLV~_f5>wA+TkWn(a={ZnAalY2;5&00H_Z>$4ig{+EM7@*Y4WORkvv$K3y8%iE)lK%Z(5){oF4KM zw1dvgLzSw{&TNsTG><5huTSP%I#*N(NAv3K7oC`zhrVk|?KF|sv&**e0`RH@;c)DN<`tMU<;f*?x-~G0MS#P6_En z?J<_bU3Ctv9Gw_UElG5P2mDvT-N!R0<*Hg}L;-6{^rewF1N_MPjLT`R{q-wyy8hz) zmZfbuXi1HE!Svx%>lbF&D>W3LbkE^)g2z}7iWq}_q%RH_5U zR)^Qy-ByklUUaiwo#S|jNV=Oz0DfjKE%8RPr4b{VptOQ?$kZCb;;1WFZnK`AyBCX_ zzOEpWg*g$5)}KX>4~@m_iFNKx$(ec^^8o}vDNS`Gw-z{fGIfGolYAc|6S0u2yN?!YzwKKW{|Y!dQjm2%filZ$iE(3@j<%o7!P8&0$^kk&k7`kC|Iq*J69Aw{* z-Y?N9EWan+Qon`cSlYsWGMQd`4^>fRMb)(rSG%+irZZ;WTCL$j^6LtnhPRnQji%wy z66A5Ahs6NmDQ|v7p--3I+1h;R-rpO1_S@Wc!l|p*_n;-CA=EN}WsK2B?&dM~yPGA9 z)>Njimi_@ZAx%bb0fdHB{$d42sv>ZTF*B{bUnn%eD}R25-HiKd$N&IvL3*k0C)@xn zoh6_%horzD5P;J16?10FOIL@S0BM6iJ+b+)kdd=E7rpBzP-u~sanHaZ!6)6Y{&bYDiAQg(q|YvPS>uBFNWyPE}hx^NIWaa+VZdD*MeU{V#n z(Nx1AlUgA)t327Ey$cJDhIPe*dmnpWjd!!K~As@c?<;0ovW2x+}Ue9BiZg}<`= z)sRJ|x@B?*2okUMnrghz4y^5T!&Pk51ZH&2(+8Z1`m6c!y7@0`?70+qRxToovM7>C zS(RB3{Z*k=9&pF)wCHSIB0E*!AMQ)J;#y}tQks&fZ7pb^mT_U6Y)tE*ja<*)<;d6XP*^fRPoJHC> zKWVK0xS9XwWcdhN36Bq?K{GXZdr2u7?r^J{au_2JQ#))SPV)@4S znf4|Rj5>G3R}?C+`=IjwyYt7g2MeTP^c_5^Yq#(!4KTBe>%2`_js$YricDzlYU!SM z0(Rd%l4$+WiPiw<3wO55dev zuk!c8JjxMXVs}D>hG;Suyc&YKMxt{iAL+_q2czt)&VN|$FhJ`lJ`gZY^48uK+@fckB>isQVFJxoW3axq7cj6jFjm-6^()=JoQ$10jW zA|K-nd?m zPEUGJY3%&3#vm4m!g%8t2wV46fO!$^&*F03_5rg_rz$G_xfMOeYoLO3To(f86{}`t zpA^aQCP?sgs$cAaf#Ab0mdhSAFcCvu^RTT|pHxReTLh~?FD1Cr->As)gGiu0Gjw;h>-k}PZ1y_OZxOr? z3pOU*LDk`Yhxh+2{hjQ?7)1cJ?j`Q(0dJ_tThe0`49fokHKrIR<18Yee6f*|Weq%pu z0000L!Smk_QxKj@TvjC`)G$911({Q@yXJPMyTGPQ?>q^StWN&_-)OeWuBET_C0YJ3 zCHzr*qbPWb{8Unt0JN>tM*XL09I#Zahb1uyMUZbe=MXRq@k zC<^rRp@L>ye>&~OV_40yuc>e})Ge<_3%~YvdjI9}79e(b>5-iB>|M`ajO27o?qS{E z3{`xjRNnMP(h^4WTShia$}b;|Umw4P?ZX2U7ol-*-li1Q8w<%Dw@mDW^p9=_zL^@# zeTyH~TkHB^YynMCdm+9-IhDh*LA0eax;eF@g*v~(aHH{H5_{Z>;!^=t7H^zQjAKW1 zMAF?b-r)8kR0EMPzR6}c2A6T(TR5M=EkP#s%*O#C;$(t@uwA4Xz-! zOd^|qz8txD>>{^9f^jdIKUf$`ZQ*020K2blYh4GXbvUIMf28;FS9@Z3y*}?a|KUtT zpI(Dq+jH3P(WC|Me)~XA%ZBd~NvD7d)L!r;ZCqs=y$dP?f%OdEENU_kp;Y^R>!fDR zI?HBr1dM;u9&)e9_=f4T6J2+E7hjqARn_b_-Xe#BCeIVErtJd{z9OdHGRvZwK@;b+#te#2OQyM8wM~a*H&P$ z(6r}(#AzfR$Tm=8)gDLFEnVmU4P$oQXUipq{0|~d;I0jnCUi=q9kUUYTRh5qUObgd zBAx6?$UGcRhyNU%WLf} zOB07Ad(eh{LlJx%(o2dU;fG_-r{r|)c$U8Zh_1$bQd?8Kg2PiIga16TISzX)xchQP zYH-DHX$rZe>Ij@YjYZF6)sc|trOm({(BnTp{jS`Rr;af_7X!G}n6U^rh$JUSG5XFX zHs`8n-mwcne+c+&QKwXh&lmSEjb0Cp+k55irscv#4t^gz2gpAd+a74Y zXv72ay6!y9VAh)QZ{J-{XdhqIf&69(+-(UxJCy1TV@#(vxn=d0|3>|Ly zvW!Lxr+^g7o`q7#to5C~`+1^#uqqtXLt!E@N z>^A!Xd|N-VZiILB)O=vREP@H^w{+XWqI*EB|xzPgloG->05;UakdNAW$skwZu z#DsE{ld~0Q{5p5-1*&Fy`cIFuKdc_+YL?4!EjHr5{E^$@_F^>QhzuXw|Maa5>`+{_ z!Mw4N5j}aU`wIrC^3F>HOUOLdY+G$(z%n)6?kl{>8a2Ew;D8z4ptoE7D>wU9 z_X_YUxgs+qDs+gq96rT8USTUUnTf=5a48c!PWUtJqLDAYKh$VFP8iD3znOF~0dEuaVmPamY#o8Yz-7Wu|uAD`>t9hxrdL;6O^m zKijvqyDiFaFcL&+TpEcoP#)LyUuZjvYTC{# zqu@EM$Y5{5pSn9a;Ejp(gE2biOc|h{KwIvRZBfy<0(*@C{obx1)yQ@dUyV53cVmSb ze{w!~{X|-lqf{o7b=c$lBoTW;cSGnwyhYe`9I873>E0z4yP zN-;7lXE5SgMZB;Yf_hj$#gs00zL?Z#6D%vp>?`Zsc?`OZa+!vYk8CH+3f*bSaX>Hp zlZYPo4sDJ9=qpFiHNadv={bO%n0cLhX2h9kb)b9_H|jr-R&Ql?V7skI~l>E!XY z!^Jbxk;*duXwci2?0i*kA8N}FcN$NYkEoiIrmAot80kx{elqtdLy7#WW1f7wgl#jc zv<0NTV1n@8C(jytg0*1n#}~sT-EULef&)YxEi2#JGC?#nM8~#ALz^385NlZX{$(qf zyOgLBocn;xu)1nCaZ?1s-@px9G2{Yt=3j8ALQ`F|~qJm;8oF6DzF#aOh-uJgH4x@ytCNRk+i5=v3MK^Ee0`TcF&b za3xYVpgz`|ExbP+nCgnWk|*^)i|CDMShd-MED4dv_1-bhRGg|lt>|s;zDnr5wQ&)O znO};i(M<$9xaA+Da3}A&=F026$8O!E(MO($9YP-e(+ zVN&F)au}SJ@RsJ#^D&d;MFw2k05rUTwPcf_yd;#m)1grj#(; zSIXTS!dynX!6uYDMG||@u`7unF-B9#Pm1gNT5dhoDrWkHUo50e^DL%0STO2rWw2wK zKwY*2V9rE1g7#N@^>+9kL^>>De5DsHHb6fU%7{J{x|47+599mD6~?s;orOFOFZqwL zTgBz0^}IEb*nNgTSm-Q}=Dp$E`2X}b3=MAu;;M@8v4AG51h^gIz34iL79LeuqJa$bp9ZncwIrkV`}a9_C2{H%CL{?B%5} z83!wGj$kA0;C$Wt{v_^?G}%m-Si)1wEDrem^Lo}x*!^G$9Wlt^@<4ZkzA=7F6R1EY z3X#jdu7v;tyjeCNHk-gW?P#?@Vrq@W!Y69Smc@P}sFXY7N}i0W3H6kf{$5xP#4}NX zhA!50qzy_TFYknwPAG4x0Lap{3tIhUzp_IxgLFAWN~r(Dit0v&dgpDpcFjp!7zi*f zK=KgX@9u2==Fp&59#X?9$X*UzZER25$$LAPoeyE#%;nOJW$lC2wij$&Wr*Aw z9T2X@)8%rV?)zvXxDZ(0Fr23EaHLkzElVhLY>7+Je8nCU2|D$E`&nLe$gS}V;URsK zU@SEMkTE%wTy)O$4RGtMYaaL=xD#aPPKkc$>mO8dbLn#7=162&oYBa};aw3;-s^88Bb|&g&v2DOhNc%@L#yPdIMZdLVN?gthbrJfRQrS{IC7N#CoMU^rwJaRVWV+w`Djj5e3(o8+O z+&RU!1(m_C(kQx3UfH|IiO|pm>r`IvVYtXfnHE=6PgUkA7d%cof)0>1jwTu?(&*n2 zPh}b!Nq%R!?2;H!1l~XMC$tqt&Aqod^bI!<-sXg2z#fcmTpD} zpkUN&Ah*}p+JPkCD_#d3Xae!Y42pO>e) ziNv0uy(!`A+;mra63QlB1;Z*PeEt&mnQQ@Q$;hNPj^>}U8kr47br{nPcAFe=gJEhD1%Wu_#nR|xYp>cP*Asxr?5(+MANF(dBWw| zd%I_Lb!cA{^mWPaqI}S+%={M&i}ph=zH{D+cH#Mj%x<|i^w<9=1EqtK?dHH-@;}D^ z3vo3*coQ!&b-4?;`K1K};+VXipsg%#2nc6NR*($xg7$;LiEafX%|uWx-;;_H)>2+~ z2hrHf%;Ja4b0r$us(PG969MriZvQ;jo7D20P_)3?Slt=R9yXI%#r=}PdW10yZEdWf zv@tBaIe_U<%qugA#bU~Mal)R45qUO_wI2;a{_i-%ix0v5hqN{U9R2~-)l>3qWfBtY z;WGh^E5I_dmV9(7;IU0jg$gLR_!{GDLvktd;m;6Zop{zYBGF zgX-(2A;wuA6|wdmaX`Dkt5KkT0sS+WlR`9K(2oC}?b=5-3N7ORyj#5|mDG0p~XeY<)xt|^12Bl=J(?9gJb{Ug@SR0V^!ddG#JueLVNPBT$52YML z$5%l#e)KjSWubnif!xVceM{A<6bOz-`B1d&#)7CcMZfa;6jagaMh=QsCJTVS~mMB(ZhsyOd;Y4!!+H z4)pGgE}0vW{^%SM*7b{Z3@(MpdFFTEzT=_qmknzIxti@Cc(nB75rT6V``Iah$MW0( zrSK}OM$Q9>4!#$KZ5F&ZesE&*OlN_RV%QVB=SWpQJD>EhS>@n+{Yt?9)S~sUuEKfT5XFBfi@@L&!1Si zrelgwKYjsQu+(|uUy#_^{M|OFm;9I!uPlBZZ-G#824eHDKJHtBHHV@Y z+)D~C6BNC4LFYqw8dMrklnwjx_wA1A~JT56ysi$DAY|(y} z`?pWy-^0qV(O|_fpU*6aHeLBd5uP&jJ`NN*?!2Nah9RAO%U_6ab$10N8{v1`Y< zW+{i%-XNRi@NwvTi%6re*KQDzZ3{Ym^t8j-Y%F|Et-Q-okAMiG3qRO{jX{*v$7@@~>+0V_aj!{`>oJhaT&q1XNKVg0-A9Q$ z2pIp~JXd%Zpt)I8MX_ZOxiB5g$lKGM>5Nu2ONN6=MF&`YC{=%T2LT< zOr|DX6({uRDz-C*?c|njK$j>~enU1T81=*QpnGr2oDo|ANr1@=?`3D^CQN%-(pDC9 z^YMv2&^-308MmQLz$fb7|J?;xneGhwERr-waA0PM-KHfm8k|`VbN3fQu@x|8eQ%WR zpvPARXks%glJ;O^JM{NF|FEOO6Np3a0oU!290)Xs@1#LGNd&aC&I8J{{9pq%rUABc z!@c9qLFY{iR|A3q(9%I0&#o$Ro~YG&%CvO06Radg9udk zB0VN6Hm9)c7vq=@Xie1mRbuUG_yD)n8N@k>_|d%aoeqICE7ofoLz$i-q+=4FT~ztt zdVjm@V$b9;BYe|bBeoP952=U?I>};VdvUn5ikK#v00*3Stb>+dV~UsMrp?at@XF92 zsLF&1;Ste*)SE;>3OkOm3u!)xmK8DcVL|5rUI%U0hD#TOx4~GOmpH6UTCMzF|iDV|glH|hNRrn>S+36mpj@3cFLJ;j6o;;MxLQ{|4&7gaj&ROU8A-P+%c;&W6 zgFtjM;#}6r}8NK>j(XngI$0utrykZB9sBhNQ2!jQ$n;9e8 zL#7`b01$X?0I;td%zTt|uX;)LB1}-fDVorTWCRd>8Te=S83_)<6_g5fl5WpBD| zb`OGw>?8*%3!scV63w3#@GoR--BJcr3 zeuPfovklJ~ga@h`Mn9v|2qDdswy&rT$K&J0q1fL>zPcwcqCAM1Rdf)U_AGGNT)OM7 ztFwz?U(-Fo%9uWS@^89&jVHgQMx9SGAG8zT^QQ%qPYZt7WgpD-NOyR5ECEdiaiws~PGLVGvo$nUHYyPS2h)$%D`! z*MYb6Nh9b!ZMpRvQNoq^-#shCecIUkvl!6=*(<$i?|YM4FZ&@xSt1K5*3`AfUJaHz z;uH)I$T*3$>oMB7-$m<#cT)@N+|3n#F!_@2PKNB)P}XKFHxoH}lJ^N^Rsk5idBO{$ z5^f@Z;BSb?HcBZx$b^|=Ucc2CS47qt)}3~93smXYAD44vsz%MttgxiaHGXg ziNua1;&;IoEPn3!=8qQlsI)5hO*=3#__1*l+v|r9WfJqsphEFi3(_Cg{4flena)Pc zj#1HC9=&Oz$*vivZWlB)Zw)IJa9=o?tD8(^{QZs#RH&P?0}-eIQG-Z(H^v33c1B@q9@fQf_1xG(_I4tX8$Eh_}> zqzTo7;BrZy80?tMlwyRXLdp=0FdVpD)PfMJQ5NL&~L;dsNHJ9!IR$ed&bw%}2`^ zqhnKZI$p1qPyPd)&gNcH-^3!C3xBBxy)kKg5cDS~_Wbr9e_vWj?Bd+`xR@<|asIVt z`H1fF7%Rb|FtC~>j2>coDf)NgLXHT78JE4BP=pFM?>W+m=&WLm!#@x9uaw-N*}C)P z1n+I0#`fsAj16AXR~;`z1}j=OABFkcCvuKxO>5F5ODW2lH>!stiB3o^bc1zbb8AbR z)FwYtw=H7@uVh?D8Wr|N#&+dRp`OGlMrox@>khsSa-s-7J{RG(1-lDnQ#nwi63kp; z1Twtpv&gGR907Rh_9F7XjOX@81p!8!$fZC&Fju9mfZy*l#trbWF#h9C)e0Hqz#HEu^mC|1`j@L>)S+v%5xPO93kgw`7$y<<)H z0cbSmCP9>^Yq>|cD4l?R2P*YKzoak+y)!WBOYTqlt4bd>&409j$1!J$;h(8ja`UN> z1oUO6ZE@yEjX|HBejx9|A-dP*bff)^F(&@abI-nOh^6il{yL;V zP+F>;dCaqQ5$;Q_{{1G|)by!vJ(>6=go2Fay)k>~A8e!8j=DKQ4N5$%AD#EIRJdwx9_HXN9PS{!=FXvY zMQb#nEIa4;fs{Q5U4;`_4!9cZl6=`Ni1T`trhL?jhJtwRrAi8veFBSZ-^+MqTJY$8@?tcC9uSK78R@L#_3Q)*tqxJE-vB}jC1QDvC20w#;)JK&Uez#|E zjgaW30)Y(JTp?XeN5Tz==xJPfxu2Y*h?NWe4_8QVbjzONd_CqS5Wt?nCy3YFn9rc5 z#q|^)MEfr435<=MgMJc#D&EM|HNV09Dh;!G4XmK*mrNfvEZ1uSE)$E>xD)nfi3zP! z+yeTX-D86}=7E->LQjvm^b83!Lufx&Z{*P%*-LSMtwb=9f=F3>3w;RZH75_o*)yBA z<4PO4YHk%p_qr~zhF)IC;=TH+%|?ZM?e3jFcELM<8`uftn+HIHEA#w3=!uYqSaBxX z$a1*>5Y9vwuf1_9{n2u!g>9rXB*hjFKmH_dSYh;`iG<|9x!CEIND04%9#Z0o1=;(2y^z z?$KKctzZOcHp(nHoA29B$S?C=(?LqMEWa&Q&JUgKe7}41C|owwk6{%V*SABMg_Vz& z>`_6?eQ`FesNT^Fm`~?@oxPnb}cKE6$)pz8OiL}L*6*no%;fN^miUyO$oDZO~Xgfn+^qxQUfRE*mBd= zxN&~z&Th%4_D$WGZy2?t+keqFwcKutBuoBxE@~@I%Q3-5pxqs%lP6fJSb82&zsn?O z%EP|E!r(XsD+WQ0AS5EF{}EJWqmDo#Gby@Xw_nK8J+#=v|;tNgrG4!ZE?h9&TEk}tIG z9(~;BK6?FjWJ;5i-fz3Ii6p-+3|Hg;@h2I<#>}_wG&`8Tmqm(+H7Ig&Djs|j%W->wCqgsy(7!ciX zYn~G?EXHHt`o2O^G8F3Wdjap(-08pRFEQ#<*cOQ`&aPy%EOiOuU3_h2T|ES@eOETj z!vRnWT(`gAD~P9y9O+x|Q-Zg18w`ya?5O{jkOcC2dx-CN=maF%<%&n~k5&QJjcM{df2dd=SD^13w z2qHnHVL@O1BJ^pS>J7GNDbeX+S4a*S zcG@ELsTa3k)G|Mrw=*|}dV<#CNqTJ=LohyG4dl~MHk5gpiY^OkCVQqh5cA}El)Cd_ zZ66)fJ*?0ga^*YU;Y}sRHyOp$9f3tlZ{;y0YQ^YLKfZA>hl61GjXW&Nax&85@>Y9g zHGXcUPJ8xET_H3#H@F<_olxUBLyv8G%kqSNuOsPOFx%}s_-ig)j}pV z6vIN{mODOczX-^d-4D~4eY*v?@E0hrtZ7Zgo3$AEX>?k%Hj#^MGTDkzk#+$6Uw9pv zz>9-omU84V&@lRI2ylWyq57-z1y?WghCli1P!=8}Y&Qo=CpB|H9hKR+M@r{y;5}qjn zdCbTF6hq*Skl+v;hmk&;mBZc{0UY%mwKoD6iU##+v$%~5z4av8MaHzPtb>f^j=d|$ zpz@%lCm!wD`%#(YV&p?hAkDC!!f zNLP{XsE=D~j?F^(7sS00T+Q1*a@p}xFF0Z7J|V0QU$mwR1)NsRz-b5jnQAx!fP@Pp z#^S-D)IG9lFvUi1uiJyg92cCxQQ?`MG!W(<+HQajb-^9sfn+BPDwsl{8*`%PS!>$| z%gDqfJ2m#8{E2({v7$~9U}5*cX_upJVJF&_-dRwD=B0P5iYN%k`k%g57PgUu?CG z7w=0s(dXKSUE_dGMMM$`k8 zfY4m06^bi+Em-CQA0vh!AJ(2thZ~)@@gg{cRz^xy= zp`u_SAuqm~X6FM|@^PUJZkw+sJKJ0ayz3s)IxN2MEoL&bPDejjJW>!t!-i<8o&C%f z4YNW2*SQ)6Zpd_Eb=?uKq5-@GZ!a?zeud1{1A&HTKj_JUX9|a09(J>1Mb^mEwIyKI z^stH{Cg#k~R_Zop2UZ9K^)Ul+yRL3!1P~^CysojXV8u2qjEC*YhH?GO;dL^P8;70A z42+>@_7}LMEzrB|VL@STd=*g*j`DXxvao9ZU@NJ7(B{5jTk3ni;fdm$o04~1uHX*d+{b6mTm z12}ZK&}QJ%oC~WiwpAkL6R5=;Uj@8!eFktDbi%PIX8tK z8c!#n=&r*`He!$(ea`63&6S%TcS3k0R<}WQJp6rp-IuikBxe<7wGOxhx^iW{mdiP7-P zw}1U$R1-1fpM?>7;aY#mJyn+-&;V!9)PAgzkEl|B!4t=KRtOFkX0&ztu9P_FtLOk^ zn-fL%e}xW_xOD2<5Yk1y_bYmeK7=8Dthz!=8*d5Rwan?J_n3&ndNBB+N}tP7@czWm zM#hZ|{o~d@v(IF=mOB6Hqe{x_N9}!1*d%9pP~UZNrK^Ho7wPOTZ|87Do>y1qR@2OXzNMu_|>H_ zVPgbmoAlVehxhgZ?Jp}w;%e0&kL%P-uZm)Az5jC<0h^9RZn0>p80@!*+tRp+k4a-59>aHC)y@i z-K6atpEL(ZvX?TLMM)nMug7Djj-e182Wi$I7K^sO&~y+d>oGa2=?nTEi3>c|*@0!& zAknGMQW2lX@xnCWnI~&HShf-IK>1S@yWJ!SHTd$@L^Pm6m4a-Db0j?=^^fRF7U^-P zCb4k96ZU-1>uPR-zlWA7s3#W<`7ESUJfi%LjRBAE8K!9#_pwBUp>$3ES{qO@t)K ztqKVNMrwoO18qQp>)2PzgoTe>V8dsRkj(6S&v!hM55fQnIr71$qUr8=RN_okL|m|0 zxBIC@trT{dn~n}mv4>)^TLl?pQ!ZX@5IAfOIF;lkRKy~!g=8o6F8^*zz`mdK&k57E zEr)+cnCj`Xsr?p(mGt6A#E|CoaX^%}j`(WXsL1&LiFNTKper{cDTw`>JQ+LN7WnVX zSOQA-MX0xP)q?$_gP{1tahbUB2&}iZRK{*tz#cVX8IXTq`mO1L(n}Fon^9<0^pUy% z=qgBcrG`%AIwrQ^UDbXieGOl!+QhR-N-Ak;D1Ut8J*Jq_$B}$8vU<$azrrh~nmLHk zLY1*Q>IoH-5c10Z@ER!S0Z`fBNik^V`q^*2rl-+^zbRxbB%Q`hcQasAm_m&<`oNhq zyJWLo^Q`bt_Le-Ud602Gj={%Iq<3VyT)FM!_jmO5Kh7(EVj389f z4!oGD01*$+1=-_imE#1FtC$GD--u#I8h@Wf-)P^Lad#Eh2H5}aGaDjQE&73uF4_ey zBWvR%NS$nv2CO5$EA4qqi=NQ}$%kewh{zi{p8e8M={bmY5RcZqcl=24SVzDrc7+NV=o%J->~RgZ%JhzAS4!YRB(RNS6^2c z|AE5FE6sGXg=CMQ6_x7QC2;a#mi5mH*$ITI*(f*t<P2aWP?W4%>qa<$d0(%xm4#q-Jl~0 zQjJONIL6r2QXi84QRCXa#RxNzZsA)6*(2o*EFFmzb>Q0?dV7`upi|PXz8^0= z=Q8KQmm>*gi!Mwca?MJI6sXHoecTCu+kUIQ+vAuoS=oVNjX4~Jj?qKtY8JSnP&}aI zL4@uXT2h&n8?g2~gCgzd-SQ5w=!1V}*lkeWBBG1_1(6Vm8#xh`Nu=hliJ^d1SFnjIkt7>BBHVoDjloGza3BbDcRNW%E-AMjOb^ zg{bX@3jvZ5l`VdDdBR=6pefUDp)8}hjd@CT}n{Fsop%;kOD!mFcx2j4Vi z0!R*#oC3(b8t}l>KZBUBG6QlP^um^Nx=wf%0xd0?3Be9)C(A{V@yU>iB<&NpNf}9a zyHi9FeI$b`$JJY6QVF@IcmpH~XPi~msoY{hs< zL$_k1!4D&SdN2G*k z>gMF>Qj~VPP6M&3;{2w^CVkn%7*_#FOKB#8^b>P&+MB~t$a5`y(rrr*%Ki zByZ*#-US)jib`S-J5#h?kXXN?MC}<`X#HWV7{7jtfoL5eLHbJoN)Su3Jz^TIQ;>-? zV1ZH#$~d!f1MYac6&b&>o!d{4O5BUq!&a$#=IH_wGN*( z9L6{bmk1rG8a2WlHfvp^V|digG~x|heH4rzTD`lJM zJ@^Cbg?5E+e4sULjy2T{Stngv%NTk=Sp7Y*qV0)y z`$hS@A@#ic2|N@^q>>BBOJwv#_Dc)P}xh$|P-DW_Yb7)hXS zr}AE36wnU|)$Qg7F^|io;|Ct*=<*hh3Zp7y4|>MMiCR_m9T?K5cTyqiRq?4j8^o;u zx@QmA))bjID~Oe9UpooT+Ld_6uomRL?`V@(lKtpbSk0+BFZa1ot5!_N0TWKQ%v}W) zNea1(x4(dC-{BF`j^dVPRwT9sOas8selr1m{fuO(j>v#qmZ`NSl7&;912|&(o@Mi) zwuC$~0N18B8CI0>H=|1Tp|oZxjZp?xMB)dV_?zF1@_1c@!=_j)Hjhk@m`}Xr!F8by zdsL62F;~s=RWRm64^P4yo#(r;rLzFa@|-$;G~CW^Gr-Di)jb@u9_o8FJ6`B3cNg6n zkaPeNPiE45lum1qQ*c|x{j?14U@ENQ!mA8%jXGJ!3d2UFSXE-rt$(eW-V1*>LFMhA zt<|`ZazKw>X~#7ckc5Py{;3*8N!gOdA8sP?f*bW1yj#`~z1*8V&i*ZanpMaBLU^fq z?EgvHh|5g$*V-d5?s^O3jcJl&Zj^{7TEJ^}?T?X}+Dpz|U`JzLZC8xa!bR)=zy#g5 zSEI=E=7vG+ojO)l)kmENb;re624iRI3|0$x<2=T08Z9LyEx9*o+ZIMBl8DTSmhw%2qE4>aXQw!J%gZi}rBIz>0}nw7j&m79W;HIXJzj z1GPOJ%lXhH`+9HU6IOXEd;}#hF>t)lbwE|fD39!i@2~lOt_wd|>TVh0$SbA0q_6uc zI7bHdI)){>JFGnTSIDA;V#}gd`!nrO7umr+ECpD zgkssvjF+ddu1&a^hk_8>L!6W4eD8EHCQ1xSDJHvBOmEjc?Ozfj5)W`Nel@Zhm`cTe zEuEq+o(Bv-2P;a*X84DEcKT%{knVpu#wO6sLl8fb4J*6XjdZd|<9Bn{6diE4wweHQ z--*sl=8r++a|7d$@ELQGBWWPcAOZf+@^Zw|6S8-TQ@Yt(6d_bZh;)2lmP$r(Mb8Qp z03KN=f}N8ZzQLrD`3nfcDUiVAwgvd`u&|m6X@x(WEfj~KgSRFPIPJG)`-pdrzqBC& z);RjUA|=2}G{|%3X1uXq_I0GlCV@Y47Aao>OLS)oy+b)5SNmdUMm_z_(qEQm{DAC=if*v9R;`@iFd4 zn{m{IHo?fzzk04FuvqEaMq|o4SH`h-cDDuuC~X!Z#81c0hN8KBYTi3ceO~I#dB$+< z7=F&1huZh=)bal>=Fv>$LM77u(9B5L4wN4JW7c7XbGjS^g7&>`pdtLr#e&lXkXun8 z9;(82uaiCVK>#70AECnn{3OA6gO1~})TkQR|1jI2t@m*m?bsFxMXVIy_ODuQX5qpQvm?}c4G?-<9RK z{wcM#5Q1_MsGisB&5lPt?mhZprPzArV(DvrLy5Bi6BGNl6G^pxkGgoYf^qZwhsAzr zuv1bE?IB5kc}=M6F0EVk`ueJYcElqQFjnL=|LA)JxEt~Cv`b8&NnrqTy!Z2fV0}C_ zkEK4e*SwJifip{XTYJUaSgDYb?<0^(f0fp*W0m3i8w5MeCtbyrm6gDR-i{FL!_4Ip1>gZ&!%Qm7~*v`O?G9qW~ zH`(#45GQcE7rTd0MpTXP@6SGKytdi%SgSL2*iLcMopA^RBE=Y(9NUVbCF;>fsyeM) z;fprznyc!^ZhkBc#^KTVR!qOi+Y-n{y0tfv({D5Ke6JCB)VV8=DR;0iS2f6cnJExk zxbfnbEX<8rPxn$MJs&Mn!8?Tb(!z4xF!uaBtTM=0frFsz!W;v&yq1{XsY@I7Q&ILbtjS~|zqbxcGC%=7>B zvq8vPub!F2t2+yirB;nq!CH1UXdzLS;9!Kb{|!DAKNLZ@AJh2++FprOv%!bg0KBAI zWk9nuN$}eKg{05ngy^!#Z!(O?j6>doK@t5-5FN|r#!?%$dU7QM6Ku>Gaj^rPvtaUy zqx(j0^@(m4KD_e9W7vcd-RTwic-{wihCmE-Li4Y)hV-CV98HF4a37o^r$3&mB-n`q zcv2T-$&Ua8_?&?a;2&3A`VQ3KQXEtQi?_t;sJBAm0(a`a*yU}0<(SfKvChQ9QM^5a z)t&^~m78MJA3_OsZ^3XSMFa_CpRS=8S;Vq#Ce1Tgq#5Qkg}zQ1JVwV$K(R&AN+{xh zdhcb!B<_~dzjvfX5?ES&ix(M^n9f_wnx^9Ad)de)Y(FF<=|G=WH%)@p_y?Y+$UL#2 zVh)pv_X5epmv#0Yg`rFO+QrOctKASCpnW=~#q(OyifWW}Bwj;d8(G?b0FYFzjqs~qMASK7!ZES(Qe;kked$hFf@*V` z6!K53d5*OtICGw|C4t|#)oV?IH$f$4(!50e&jmqviVkFb8eJO?f8+fJi*c{tr?bpT zVinH4nZ{!ETYZ{sJN(?m_f2QwA60f)<`7sQhbc4@UT2%8+0OzKGU;akeOE6 z6+z-qL@)?VGp&Nh*m2c8Y7?fu&uRh51Fii=dz2(~yFGDm)T2`+a_vIXJxw(i0MDMO zD9JpN-=?46yBlC-q(Y7?A^`c9O;N9e+l2DC+vZQ)j}g`-aJBS*7=Zs7(}AJc2&VQZ zI?4UNWZ+bKtc2TYB{fu&HO`!N6n{Id>E1QsH%Rii)w;w6HlgjHi9u}k@H=Dg5M&B{ z1GQXUy1(9p$a)MBW1O*58I}#pefn>#^ICW6iIvHd1dxGb#*le5* zlf;mS)&2G?u$s$X{uZ~izk@IiT8%o)JC43@Jl{p0`$ZX`6qIRwJ|DHrwiL9YA4w*iRWbm(g7E@= z))`Cvq0Cf`dC7Q(jWc`_>Y=aRU#^Hmsoy+*?Fg4Z&aef6+lnw2<)D(O%;RlW0&j^Y zX_I{A%Qnjt5iE!Hce?Zr@ao$3TV>t#0F1tmAgU{n`#h+mSvH4MrBYtGPoY{XwtUD) z3`IjI0T6%-8bptIDImv;pc;6+X@YDc0-fNuh9?thKPDrP+r}{V*Q(_b9rD`W*hZXU zUFn-Q7DLZzukVneC14;x-A(d)h8lMMjZAY!xid!tNVFkA_7Sp_l=W<#p>JTk%P;;N zh$7glVAR3tA6laM@XS7ghr~J5k+673 zkYfkH$4$u7mr1$amwcv@kpKf)fB*(_O?d2CHoBQe=Sz;RGo!oLpEc&)aj*=CZ#<{W{O~RLy@6w3)gI{h$3#=`=CIA472%+D@ z+Y;KMbgzW}Q(Vu*!xQymru{4`eEmYPMBqiVngm+&b1G1-Sz}BK;dZM`UHm=9l@7zj za1JsqFD|n9fAk2rPie5sD5BN>Xor z!YHx_)9G5eeBO54-WM@pIPgOw#J4qzivuN7pobU_u-PdPMsuXqwn)~?p7@5fIH>r? zjp-{wfSC~ujzit`=fI46*Hg|&1R|$^EF`nY?h0Y41-z6PrV3-F*7ueL^M-`0yM*N6BMI)1JdGDs>R-&+6iVx!447|~ z*jLvn(%-f}8@%Xi{Y&;*;#uDH)_Xg(*7&TMHh5R6gtaW|gIO)Hht{`4dTV+rK$i*Q zJy9{qKeJl^6wpg9)bLZW-J9?`y~4q21g2e?22``F&ir{o$umr>76ZFtG>Q%6M5#pH zkF@`3cM5>NTGCckx5i_giU%4JJmd+k);~r$WbLAc8uyIW&dG6M&9~BKq?~8hkAf!u z>K?$8yv}WF4RJ4%x(zUr4<4rt=Llskrk}eq`Mq{)C4_NJk|N!MLfF*6-YGtVNlF8O(dhuR)`%{o?4eI47I%_zVT44}b~1taUC`-q^Vbj^ zlW@JS9o+@1l{0VZ9XpB-*(Vn|);3gnz9?~Eo3B50y0nlw#?H+*{ph-H-p!|l+?^|z z^`gw->X~cA-ISNLcty%n(G}RGzuFmNc#;fY)%hYdwvx$j)fQ8E@bvzU(7X{v6scVp zlnN*z;zf>r%>zlo*DXa(wU|5ygovCq6f=BNOBw7~iM@oK1A>n3ID8qPk4gC<-7rr; zKSPgp?Ym?FI=FTduTUZJSUQX{lV(ks5`}%U;o6j1UTX3q=xs5g@cM-MPJyUN*KMbi zc;Oc@`+CQ010RJF@sW6v6N0ZE(=*|*&J-R>2&;*oX=`KJz)i(o4Vd~rES!y~5o}hv zdp6wh%Z)Cj{C9;aoyDn;9)UW%zxiyK11DC^o`+(q9Wdr_0` z&8A}kPb+DaL+N@o5E(B!dD1umt43E2=-%lpLo3BcR6?GhDn(Q;7DP|d5xsmczYpzS z8SJa%VV_w?!9W5)75~0z>36EVw}1e9D*?4Fohno)Ibahaiwb>_d^FH7fSrPiyvHG) z<~RhE1p@imj^_jX139*iNlxhvtR-Ujekt>BV9wi1Q$D_lOz?qym8jMp-DaS{dj%Mq z0iY4k#!6$js2b4XRkV(Cnfk&Ku?dp@L~VD9E6Ze~DK#_ksavY?x#! z|2cqwCC_HJbE*3n&V>Plbfk!-6f5ya!p5U|pM&C*aBuGz@F@+zPkg39;p=H-+Z-}H zt*Qt(BHGG4aRcgPU2uIpzd&5DYWmYmm!V0E__ZE6`!+PvS3dOVKzxHwE+1cp$s9F|*WZ+Sh6xsqUIGzRxrnO1x3r_0y#$O%Q-V|4cx^O~ zuw-ZnBS&6I&+XDFM6usR+E}16E$*ZBC}7O_6$o1Zrwg^0sScXG68T(wh508)(#pt`^!QDoZMH)@Lh{49BW6MfF5TVOqIgfWHtVt0Aw@$3TrZ42t;cu zUV#zcA$iSeDBeICY|Q+7vg6m9U!j7d-i8}SdCLu<2T~nBA?qzeqls^Cw93oEV8P!X zA=kM)dNxmpt(cgSTy!VThTwb=!zn>Tan1mxs9VgTL6k!m;#5sZ#6wA&vMb>>YFetV zgh}k#VIw-==M24ytK+)v8W?>6X;(@N^I}K<9UibSQL&S(RU~NlyNjM>mI;TXAxl44 zMC{Lx_6vQ+A=(fGB61Ndmydp0Mw-yj#MjHl7!1mRgL-m|KnT zTu%_J&Qf_N_f@<9?SHx&d3JL^86Z;R76H@c(~4iOb!BCU(E}c~si0*~G`CeSnF7l$ z8X|BB8Q{hh0-pdArtR}cMgkfCA8eK!OQni;oI$-q8yPbaozKZURUBnMB$3{Nlvv*G zW_U45X7feuGZ~i-H_MJ|Fd!QOg$mjtfB>P*VX3<&O0WOlQ%)DX)3u+te5n={81r_S z*%X&73g=Br#1ZGO1v4pH1nSvb`~lxnMrtZFz8C@1XvP6c?LP6W&ErJ-nB+JE*ldR3 zT~v|K;}QA!rz+fhX~nEkr)t;95cx!BTXx-TlO82NDjWS)mnSGTn{PDKNHZXvcHJ9v zEn3!0{3ek2M_~SfO34jQbDHH1_k4&3H(PSFOrBLxf6-?c*y9|l6=H`>IJxMd=A`(m z@Ub-bJsU``+*CTku5i+~nLU?7t@I2t&nkb{0&NcC?n693#UW-P?PoW}U6ob;HR&4w z7!+yLKBFZ?Lc<_1I$6ENZguxb!zwUwL!y#EJWwtYb>CcfKJ4k7@$37acZ@zGSpzoK2Nz-^r)cK``v zwBGjVO)C6tlUJ3OP6*ayWEh>8$A>xfhCZby*y)nw2{>U2?myntR_6&q4f}g;TPU3C z_g!L!G>-xB;EOHDs&46j^y*op{gX&4U@2+9Om}&jdFCmOeU4=rd3kSawnR=Hvkq*ibDR_NwlktX6IuB3m#~3J9V4LVR(>O_WGFToJwDOtpMl4a)h85qJD$4 z3MJb#6g*e9h!3RXk)EP|Lm8tMN?UvAg&fi4qry{ zu#!ZVW;m3;n6Ysw5%jjVj(6^Wrs0qP0a50miHH3sMTjr2C1O`9>=rly@-aKt{#=_G z6@aAP5vn+g45+@{Q9!_#_2I<*3#xZNEE*UoJb$SI2?ZO}`#JCdu5z|kPb!}gUg4cb zE(Zzs4*1icP9D9#$D&`AG++lB;iep{^n0j_5Gr=If_t(Vt*D>B>6$Ib%zDS+H8NOQ zSBjsHd|9n?@dy~;jR@60L!;JQ?`6IC^UiVEw{*+1k@dP`Ssw!_)`+F_caw+bjZ1Bj zhcB&`Awt5_HYL<;61px4)!i>X@2egRD7<`JTvAvQY@k4PEXajG6%|{n_ikD`OYWB@ zI?SAJ9?C#;(eUalpxZY&Nv{(S;@MuEc0S_@ZA|j!oxHO)Uft7-a zF0t!Z4@I8hHxNw@S!eIsPYen<=P+J6nhBiSn@^RwCv9hR!#(wJQPAsVmua<_R1m_x z1qNlI%Na-TGij!wTb)^~FuqSloA-tiG=Fj|c8pp`CDX~JBBAfu@Pc&z3AA^R43=Ro ziP8XXh5o6jtoIw$?a?wR*@H8p_`1%JcUj^vPiH+S4jhfTRU&NONlK!1i1{Q)$ zgs|tnlj7=3;8EKW_Y>r*5GSd%TVEe7Pd5lxt$~)rBE2&EO6qcDCMR6e9Prdj#HY*K z#XQxtarc~Fl;0Gek+!!w#hKIb6%hgxenTDdzHQv8pC7?kR{x}k&juEz_Pt*w-HiS7 zK*Cb3ACc%>Jh>uV{ERZ=DSVVrm!gCu5OiC99>jBkHK$>`qtQSG^75A9GqAr;scvjQvl zGF&}L`ZRW7N%Y` zU;HnDBg2o_JO>7iQ;|KXQ7c}zn4{>9wM5%P5`gMyNVTlY6N$}$*v^Vv!M4o zbQhYt3|e6o1+`D)JcdE^tBRxb(M4R_eszo-eQ2Gz{lu@0P|0m^CUP9D$;!w;dp;M8 zhRp(5lU%O)yHw4-l3E7mz@oeBjyZ@W(4qZy3tTU2X2jV9{IZDsd^WSH}p5_ z=*~z1LTKaq`{0t#eV;9b=LJ7s5#H*eFKBZ$Tj?H4m-&CzpmP06qJ7jqb$A7MW~wd^ zW|>lb^fDN_F%QO^`9(q>e!S1@9*RaK?Tk9tTjDxi0rkaVQuSw8o7HLdIV@u2Eo_TVUTuw;)mFB>%LNo9GNd>J|E@o z0ImvWJ0l$RPDAKA6E}QWWAweAM1njH=}?2hX>FIB4OLoReF??0}%rFT>z2p-rM}f?m3;OsFx<`A@I);d&Q@EF|ZHDILR52y9h^CUn z*u}P zN~YOrx9O(G)N5E_S&SFyFk_yN%n+hr8~zpj2-#pZAB-Q@y1K3@(M$QeCvAUdR8c*4 zL9ipKqkDw7${4-Hq%ShGm}CpbZCI(>$ZIM;5@8|=6k2m1<1T|ijl4h0@k8^$ZTFJ| zw7696*;Fk7ZeAA&7tW2@P(3{}uGh~4f%D~k;9|PJqN3S}!5_IwtM=#Fi}`=B%7Xk$ z0E4%);{d-|&iO~hcSaT?{Ofbmj@6hNHHf;>t3HiGY_4A?@YF*;3F}^I>DBbJd~U&( zuQe3<%s!bo{N;&`DYR+1k6yS4Oq}(L zjQJ&T8;jPlNyznhi~W6I&8M84sF2`v*@*j_eeM|Q(X>TI^(FXBot2vq#T#A3l}YNk7%c<1@Gw;g@@Zv3ye zvNlgpvJXklz1*Mxho*n^4CRniW)%YPB6i=LWC=7JX@@VOp}TW3MVfOV^9*=13*kdM z8JN?VRsaEZI+JiHg^K;TB|hZSV4~0NuS-A}(%-c&Amz*c7>Kux91|u(0-Oqj&XbQi z+_GXy5CHEd!vhwjt+#p-zvRGco4>;-FPLf^* z>PUdDcpyUM?Q}3E2apH8c)LXx_YqPaB+;Aa1ne4Pv56y%6PT019DYn>7#T?zPLWFh{J=UJ&1xVPlX! zgF)mv>;wxarqX}A4bMu_z6FDGn4UCQ7Zr)_rY%5{Pp3iud8=vCgH)xwv4N!Czv=49 zudC(H*hTPdl^z?Vsc{90QGdPp7j9u>3{L<_`kOa5sI$(`YKQywLg10McNmZ>)0cr}HN- z<+(#bOY~X*004l4X}w8cQFv&oo?XG@KE((o!4&h_h`$Y3h#^nkzfpN~5&jlUoFEel zt0@xTvrtzH8mT>Yf{yIEfhU>cunBu77C&#Ucf}BVpcC>vB2YSw2)+ef+<+w~5_?Am z;Y>ZL9L8hUR;RzpR`n&Se@=rx8QmM0L1{LpIdeQ)v(>hNlcd!CEp9=67D|1|6t zndwGwg8S!)ZsT@zFBQQm%HL4*u$tj^;h|RfB?xVq-vy!)`Q|^Qg^dSaE=}pi3EAr_ zB}4Te;@*A7Hh3d$YY*awchOhHTt@6R!e}Kn_Ihg=f7IBTgG$0xN4-;7m5QvrKiIzT zI~1*-DXl~D-bK+F zolY?(?|g|LdG^7g9&&`nuGHs3?A)=sgqrGEEx#?`WD=dK1RX zIN~qe5{`X}g*F5j8$iKW^3P}6sH4NJmy?b6bNqb*PTIUgQ9d5|6f?8rs^S?N$iX?Zj0(OG}3Egr814QWHB@DkKN7AEtl7<5#JtTLCj-_ zK(9AMtL_ry(?qCl)0!cEhwME89O(f2p(OMe%A#|h*NgeA5&z@vHk5gHKs8YYF{k6^ z#G>*Km(Q`(JB0FLe`i$H|@ z1!>Y8sc(FLD;y88gGn%5$&}FuVFMk?boU4B1OE35@cO^Kg6o*EbaZ$iBIWbYMenSY zdN1xW=FW$wArw-3WAZ~-_0K#j81(B$ks_m~;fC?|{+=R6PLJYyysGiz)gQ37`tfx( ze2ve9FKG&3KgQIrBYPYNF~KS<07eqv|9H*iC#AfncIGZQQX6ck+FB**SAOR z=GKa0#URnq4jdBVx`4*efleJINlH`}iB)2r@86|haG=>l3{pN$V`6o953>0rXGcmJ zQiBOYeGJ0u5T`Ay6CRzp*t=9~<8(F(BLRv}2aI zh5ZFW^=&?q5w@Nx!`E*x58T7Vt7#?T8sEi9Z2%K#DN=&d@~G@@nJp zT6#4(3{;z`WRf{&rU=;u@wO7h1;ky-AcylN-o>J=NVhV}edRHmF7gMr)NswW(5-73 zZuBC#n$_JTct0j%Mq#@>G!{=~H^LZ6c%Uj#nPvZHkER?LD$nb3(Sq-fZ<7F&?WdJ` z<~Iv@bdRe%1CR1e(>`kbcrJOy2liZXIX>GEb|JI1YpCZAXq3NBcMoJWIQgypUm`ci zxPcz>Io5u{di5tfoJUL7g|(B4OjaXsmfIXobv~AS>u_3V&`A@S1%``@TD*IOnFwjf z=O@st`d2w?rMsqTja&~}Rma*Yo6!`zL*=B*@qHXQ{_gINSS8{edp4z@F4tS0Vu*p~ zpze&eYsNm@AI;VI6S$<|I{wT(U%LwmyILD|0jmJ3cWWRX|7-c04e&Bc$Kw6U2rS~A z)L$@4ULXjsKomn1`|0;q9tTzD>%}a|tGn^*yp=e6q4r{ihCZ+oAaCtW(V|Te>F1CW z06pJgXE!4u$9h3DD>(HtBL@>|O2qtK%AFkh@F!&I5#<;%M<8|{A$wD*MZoP0S>q@{ z3GMMePm=Mi-$u+Qbhz=l1F;$w?4#op)-+(Y(}b@#$|zI?nzq|%-#9;(He-HY=PJT#&(auKFq8Zx5Qvv z0s~o!Fv*049C@#DlBD^cjV?Eem+d-MDg;Frs!lSO*uHE*>i|-Kf)_3Z(P!Vq8v;E*_vC|eQ>82YAAOX}QAR;6P!UrgILyv*CQ`opDA}q3ULWr|<QZB zOl@IsGw#-7lA*TKar@~T4>UZ7A%~p`d4kHdVAx|0RJ2@>d;TAi@19+>kgjQCEF2F` zj=|6Z+5Bp{vK8Fai)l32;nr?C0FNa<01+R7GbkE1bHUwD5OML?0R!CCZ>Edsk7Gjo zDbEUhE9|JPc?)&edYQ=xR3btKsicvV2yF4RL){}xUyO1{#ZP;m@5k_`|D=eM>M)a^ z*9P5xtwsG?lh)77g*KB|FUboeqEPmWn(7?SQ#`6%il%{LJ_9&2g2xzhh=_@cy@TrX z9LvrW;kdSxc^A6=&u6vd@2P@)?H^&iDLF>n@-BH7tBpw1bM$&u@(PzzB_)C$00AJ9 zOagGic~w&e)0_MVnB3Vtnlw0N#szE*(cvBp8o&AuqI(Vrln3Ns)zpMc1xDKcYdic9 zA{8k+*htD5mkMXMeQ8)4mfs%!8@ugRqD-~c3?W6pJe<9vf z|C{E<&;4px!?eD`*U<+PxF_`N1TQ!4tN%7&)O5Z5R;G$;D@316Z|zBZ#pE)`e0nl4 zy65%gy02AgX$~9}tzBBV`qFH|q5z}iJNO?809By;;TU3wt&Ljn$waBRI$E%MZBf?f zwU$oI(~y!x2PRgx(O{)gqg?2IKroo)iXCB1X{TB1u)|ogaz>9hZSbksm72wXH__DM zcqR(4U{himlt`aOzH9=!ap%nLP7GKnV&4BU`dYPwxhk_7B_dQFSSgo5?k*V~gVRJ3nv8$G0SS}=+P`(Mw!ZVrCUe2ktqt_-C>g73DA2=wSo zq&(^x$d@BTuW;qdW*EglX;67B0;Qf-xm}gr$g!9yW+B7H4H=sRUv3rTTqXAw5%=>( zLZANl+hzM@K8tw<<6zHZF(0mwN;Z6!IP~AFwpvKExuFd^ulBkR zd4Y6M-4Yi*q=V{(J9mErvYb2N7A#lxavr0JMjU!@1oWD58;QE7YeBUR>cNm4^qx5Q z&puOxm|12P_o$Gm!)xKL6l)B1BT7oU$0O=}r)P1ZzR3nPL$u$Vd-n;lUMVndxR7sb zr}^980hKmj1Xv7e$EtJzGR1%<0O?zA>eht+?%Vy>0G^~^3k4r=?#wiEm7TgCJ?)Nc zG$R@ZEH=RXZWfZ3#?A%n#I5?v@P>PRzy2cVl@<~x@ZpEL7KVrrM>98(B-VK&bnC6&-UuVR8(Hk3zyE>?Y?&B0#Sut!u%?awn z0DM7`UCJNjAZvvQZ)h9mkfw|1Geeovf4v8Hr9DNwgF-S6U5|ImmVb|j;`DwDqL_Pw z_$|;Tguy2OYWuiPcce6C)(ZdRv!A0ey8U6p5zKr_l6y+}RxX9jWF=rFG9J>%8kGOg zxwl2xWE;h1M5PxU<2nyYr#G>LXI6a!Y1brF zs4>y7S_ewgZ(%gVoKP~*(|+v1&cAbRIYR@h@``c|(t;1pDcObNv64v;5UmefFR2Yv zg){w5<&x&pqn zhlb}sDK&V}6QB3sh3I`!>BiD8hGRo>g)ZO`r(&B+Iz7Of#aj^jdUMgXiCCh2DOfCu z`x$@BSmrLB3~bJ>QM(Gz7NBvoVW<%1?iEc|sHbOTkH|JC>D-zN|At}WQWebpw1b7- zk-d_`2Fs+uGBB8E+r#`)Kbrj;i zr`zwJ(6BZni;-kHZcLJa^WDy6p=*rjnY$X|(w(UKZoGV}yK4DSSLZP@`b)n>_!asa zBtkZ+8tQGw2^h5!2dPs|3UEx2)Q&9vm(Kt{K)}D+pp2@>CXEezB1GRgXv>1dD^2E;3=}duAL3q* z>L*=o(Ju>pG|U+tKW=6a|FzEi1;xXN3DBW4Kqq77!-9=LUYcYH+>m%C+;E_0mpq zu!}kcq;_8oH3O!(v@{<|ba^U4@UlpO{$6oYhXgZo0^*eQ(XEpMX{q-V*UWpTp((=4 zczhIWE4>h0v?OEd?E%;;+!f!(?)AiJiSaE~H#jj&qwDqWd1Ua-cq-lZCf!rgV-BIR z&S~Lq6FkegcjgVu1Oz7QNsu*7->FfVu2F`K`ZK`MnW!=m3F9w^u?& z*Nu5@l9%P-@GdPpY7GwpTEpaKdKk#DNLqh1C%)w`q>|5SIH;+@TG6~&I(P|3`1?yt z>LBvD^hio}$abe%T#otvhF^j@fpfq{oEA-Qh?v4t9oe5dH*@_|#7n*btWRPDJnbrL zS}osvRJsX;oz-^7T22`Ij17oE)6D3fmhCcEfdEOk4!- z={U)NeBr%B-;)=r@`hu8f^^6p?nY*vj{zaRtP4;|q)vZi#mVKt6BE3H@v|;T-$qa! z-2!YX_a9YIC;_~2m;%wf5ADe@eNv>F313*rp(D+EYZfaJe(z`~eeYHcIlXAOC*F&T zu?}I9GN*2cnwT_r-P=d+frJ3PA5?Wh-}3$DF>8!eTDhty1}018n@PF{&4w04ESS{l>ivZtx?I z5iN3g6L`mdOt!%7^;Y=4^_mz2zw!@5d-t9M3?<>31c6JTc7ty+X9~A-IEKBvj+=Y> zfOeopjV6F}M;+(AMI-yB*xf&0kFX-+7JL}P$YPENS|H~teV_^Tz`9}DZm7=*if7&< z-!Nu&iyO?cH19}x#1in(2A|YX=S;SpQ*^sL^@PAqy)e>tu-ef+yq#Ja7I^feney#W znIqY$TIovE`gl%}-AJ#_Yv*_29x(%oyx@zH;+ysW)XF8`v);f976QT6QQl0rc+C#@ z@nUQrF#xGyzOfFXP&;@+fvG`2g5{0Wl$TAzap+pJfa|lr@ELbwfANJfWZ!V5 z!^m~wLu9(=-2rEo%*xBJ5HBWB7~tFinVs5q_w%dVPaZ)Mk(UtBT@Mt)wXCW!qbn&- zg1(jcD*vXh3STw*i?D>7@(%KOjB&@n#j+|~|??)(Lx@DjEmfRVOxhXUm zDHT17vTr4q!c9y?W@{7IzQIqgK^SbZ(-38CJt`C_(T)Nw)hZ>{497v%nmUDo?+Yh1 z#(l#1Y8sFjzk2zJoIcy8RB~>pbas8ZX&emkWdEefWHyA3azf_w6VkC%`eKbfRzz6R zHFgO1eWEC9dqwDHx9HGri~x|MM*9esBj5sC&&A?j@|0%k=DmUdE4>h|!}^%15MMEK zY}ch&@mw^rOYRceoF{C4R2e(*;&Fa7wcvgagMNUUPSQ)`0d&SiV?Rc430JtbQzZDV zQ*LAw?=l!RvaB>O8WSKZ0w2iy z*$XsD?Ffw=Ag$!<12%g=vf^epUmp6&hiAJuRxI1=z$4jVPZr>XplJ8YKoA6@{9P-T z9w9eAr!tW%t8z_n&b2Wgi=zVL?M1)k9(XusK>%W^x<<*a6>W~A$8zP5F8x*r0055m8`yTy3tKY{{RU#<-ImH% zz(R5pd}L`V4At>L&p6Pb%`I0#9b=;2oxfRpoC;N`?l{Q!v&tEJhKmmbLtB#oZq}yK zDlzxJ{5=q5`syn*@jx{Bw7Gb#`z5c#9wz7298J=$c3a0<@(96z!qmEBz0jSAAwPNQ zfOmw<}DEZz){6(H}C608cB3xsU)x{Q05Vo~vKf zbBnVPDS2ucxssnIrqbp#^MVe`?zEp79c1-{|LX75DoCVLBCuZwkIw;+&t-pB1^?Qx z4S4W`W3PueXt@IZ7=-~2z=~V)QH!D|gwJQe3IwuJycJY%V2jYFbhT~_Gkjc6m|gqAXo@sl!_QSdJ(QUf)$_e>X6EM2# zDQs_!XHClver=m6Ga|=rm}Dd&n57WQqTMpoZivxD-Jl7i8Kl1sl)nW|yU*)okeyFG z1!0Ht1ME>Fv9dj}@-8+7wZ$uLWb`PbQ2qaLaV1!3(o4+=0G=u#g&lLjMNNe({c}0u z6W9_!+^3$D=s3*Ug3E1_`MN<3^m!r&7JpkM-CyWr2JsSLnC&4TZfLeQs*y5_F}KGD zX-#xzHa=^40&)!LP_XR45aB1wq{krZt`n>W#bI);T7+XKfAHdwhu#oA3PDirBylW$ zK|GA7MxN}E(y8$}!Zw0!06rDq1|8-Tm8R{SLfguLNi`vcMe_ezb=0 zQC};@XJOjmB5*0p%v_V2k{cXxd_!1O&tQ+#S>5*x)lHYmj_6Q32=4+~1ZO9I&a<4f}3Mqn0`}nHpDG0XsR(F1P`Jo@?UiSx7(OGb=)_{ zljCu%>PJ%)Esc%?%E7)CnLm!#^_{f%ouXUY;L|fi!PFDqnBk4Q)b2Bo9Wg}gi5v?n zj+la1d?c%2-8o;?I?@RGiOa74t3%w97Foq~Isci{b+)urqHG|KUb289uJ zI$qN(sklnOr$4uJ5utS`<4GY1)^E{|;#O4f{-UOjY_p+9)&UD^Chgy?sARh&4Z>K& zjba$NdIdTgQhzzc!*or->uiL4;_Ll5?f%hxJiPH=-6+kg4mA=8ZHkix-~osb*>BHK&dFv{QSwT*b$gene9m!6+ox_Dt~l(1*)mAD9Wu&cn)?TK6;-o z3U>yvp`#IFEK7HY*MIZ&XfjVqqFmo$$zX0N@VOByD@gghauLXR9hK;{!YhqvZe*Xv z_y&I?1x*p@|KQ(TY*+UyfuC-Fuch~G%U&5O@>+DQFTsvu#cP_(7esK28n|vklLfbK zdN}clrd2xFRuu3>4xZe8_Jr1kZdV5^P!|>~ojW@Et5qEKw^yg5xnWNsLw5V)zo*YV?3UajbM&Y{SXYWF>22W7*6X#2X@3{ zk*@;W3f&+gpSeSQ+~uq$xW60&ns(v;0Th0-&l=N6INphKmjs@5fJc_ zUZ>snJcQrR$Su^dS?l0ACFjgxt#I^2E|Q3TfzWFR-%_gm4AoW4k0_(M~TgDitaX zAb!v`8g5^I8Cehqv_L>p7dw*OSvlf1PlxBTjXw{Yjyf6#VN?zyDv4JB`bfXuqpI}w zJNg>gv?G(&c|PQLX}3#f8E$)J*knJiJ|;5b%3_^IO#FHW*QL^8QF5y*?U1#4?7stq zyq)1pwOH23%FNXiw%C&saZE#VvXrf2o}4;-p+^me{+ERBfejekQlP zjYg&08Ry5R8%kfyp{$;*Ld&@RS!=^}{H3^aW}fQx^?4uF<`#e#WC0xnQv#2q5DWfL zY6ea|F_U9qb@mO)mCR~W060ILAXBgXoN|}8cWe`8IUr@Vx=!_D;6ldKbMrbNkDI%q z9z6KU*5&h1%2t1xRW(M;H@XO1b^5^@ECsO7AmOw(611a8H1JT0kt$0-e7}P=jVHib z8KcvIbeYJr{H3@xrN&SX?ATv)DMV1cYbU~zA`2i#&cnJ9Qk#=>%^UpzMh8L&uaYGq zgP?|zoj-i18_|q?up8%?9^$3_pEnsXqCsk8pyqiYLB?rfeAwYEgRsVqI?)4bs`zRV z7Vc2m3ki-T;}eJksmDVc(G*z8!+5o=_4n@aI5#=BG~@QIv{OaZ%n^Co%#2&OE5hFO z2-3jo)(uG$C>bcU$-X_6=z%X~RKa=!70iEOPi8Td`P=OqDR3DKU zBMcv_IlwlQLf&hjEcFCQZ=RE|0y#o(j>tlkj8c6h_KzLUuR`hlzPtE@TM-F>oRXW| zTBdBbmO}fJE70FyAH6&m&3ntWDk@GIE1#@n%Dyh3;Fe5pN)fbSoWr1c!J>HnK z77f5&cZ*dU6}iQmn~!2CeFgU!{jnaD-D@p(#)Lq5m7+c89Fv{Z_-=8UsgOc9b`dxy zPS`2(@Lu2X;C*2e{lHl=?Ko5-hxSehkf%u@^~gFMBm?OXWSVV+aJ0^Af)#i!E~Ic! zPG-gI>ts!ikRdSt_l}w0D%w`w-CQnkCxgJzT*s)6D1$&L*ynXz*)|9nzfG zJ(&NN6d7#)tQYj4((#$m`NDE%d}<*J>S}BFE@=Wx6uBu!@{HD!?^hb)pTtZ{-ukF2 z=&jc69>H#6RN%PiKELGA`!B}QDV0(~zxf%;zAyaK?`Jmu+!>!kK3;I)&~N(G$0L0? zVop*6S}NE(CC(KxVPcUs{OB!oz8juoE4i!Hp&{gxwwF#qd-E!-U_rZF+Qh@8KCrRf z9MAhS4Ql{iQt4deuzyHyR(_%OrFo0DVZUf*k@acuYo?=cRh7wk5vKeujWq@mSe2MQVNPFnQN9^0ya` zdB?-=j%}kp*$;>XuAqNjC^yzn3^yKqF1J{7^ z;F1a$`2hXT{EZ^LVOk2Y5-)=Pu`b0D_T#1y(>RQgw2>vMBHw$o9y3_f<1jui@}lKx z40Cw(7)OSGRkmLVR?zu3lqar96GR?0-ORcL-2gL9YH=L8QO@`4nDrE%5flxuptw9vt1BnX4^ov^-l9~3=8C~J3h#Ihu9 z{r|RaC^?HEMMkd$Wa#jV>1{@Rk$%x79H1K;jRKlgnw?ST;%0yTfe_cS;?{T|;XJH* z7!Rs!n$>Sw=N*)%%I(G>ylbT4SOvYT;uABNYkD@KvCH6zNUdHIkxtkf=lE97Q1WBK z+OsIu4@?XNfQMB(gOgCOm1@~klosexUuMCm0tkG4z7MEeno$+X4_a5K$IuEI)UX)l zzxVhAfyCHWz9Dd96Wq;OzC8R$Zi+@eC9iiF(#9X!EXSsiCyk5Z_?l zSQ+9*bk%GPS+5+9jC*@~Gn`Svj!!c|7A619bWO0rkjv>u1$k#MatneUks@wR$6NXS z$cGS8^m8XB6Qs6ChRniqc4i%@1{$Yq-~qBTE)n(D=F~}`2yb(K0!SMdHA?-js%p4m z&Nl~XAR9dWDo+(ktb>~9IRn5LL2;oUXU|ZvD?vzkcBaHLX+iq*)O<+cKdyED+n`UY z>QhjRJ)8#i3+3`ux{mZvk|$=9D9RK;eWw$oe8`O7v?j5!4RwDf#Krzem1DFvxsCha z-;_3%%-k2;bAt{2vpUff9hM0Lgor%GPNIoHG5%tR(HC5W_y<^p$cW7P5qk$hGD!I3 zBieFuSoOeI3K$4k0FP(jQmC%cMkV9@m^AQMP`hXsxklxI-cpW_VS%@ZI;_v6^>0Yj z|1+Vra=e+auKv)zDMLJPj!WoEes8(H55&f9`XCNTY_n~Fg?|H@i99khKAW<|}3 zl&2w6Q=!}o1mhsy)ZUD=AAP4$Q?kimST(TVs%Rz0!O+|CXg48Z4)`^(SWxYmJwC$f zguk>NMf}Jsn;e1xLeA?Nj+hiAju(lrm{n~PewL@Y>5Zin`2p-mF6or=z`7*pB-Uu( z;5t%Z^fdaBl4^MUw#bg|+AY$gAOj8Q%Tu;ziW85G-+g;yH&5s;M~Bwp&?Ly>!uHVQU|-axS2I*CUM4i9^XHuek6ia3yj6Po+xteR^2cF zL1_4<>9uuLvw*VU)s>NwH<0W?B=m_Xz#3Mg@O5-pRgikG>E5mq*mpdwD?PdKXqq=> zlw$F%nIq-bOI5qeK7z2jHav+J5py$nayGWfKgwaiv$fCiw*(MAPrzV}N5d!%D(%U>>SA0Z4Ecm%)zACEDZ z8gCLQbBG>ilM{m={)s3#>PLD~k|egC3y^aUvwhW^_N08k|6{WKt|0iJCefwpLowcZ zGyVpin$C?NL8yLm*2%H>(2G zr&S&MEQl9Ja)erhz;HoKg98d2s7V1Seqe;+?z}0$|pa;EG=6R(V1O$ z^GDhu!nGlZKDn9LYw@6eN1VkG0>!kv>_}tClML7)Soe6*(WI&X^&~Vj&a$OlWhO%% zzH6uny>ii>?5hB*$1B;KLIRw|3c6kD++^L~55m3dT)oUt=#?tkG?)tDi4?nEw>@-( ze46BW_6mh@?yA*&;5tp+vVNF~vJUA;oIfQB<@bqIIaQ1Ax-AJyQN5akcw+TjvIOy` z=N$gqcKbMZTo)xqq;uYKaUj@@UT@Pp-}-;%(=^^HQ}Ph>l9|OUj}m#3ct)UJ>_ffo zO&Snn6WnGz+41?{?SeF=y7hAHtJ5zdB%y~HaU(w+x^^pC>+N{4ux;&0OuO4PsSB5V zA|YtDoTH3+q#o~lzEj}O;Yg6ZUJ*~A^eBc*wIbF;}rgE7AVBbH%Bx@V@I;67;y1t^oEG zoq3euXWRnFhTxR}+52)K)c;gM)o9!>g+Mi;iYj4RU>|<-M|UHM&5lozkd5W|7d&DY zfh`-sZH+&N1;P|yO?3)OB)D2VOrT#cBo}E9%pa<5&cYo4XRf>}w;aeAc>RcpUJ`zt ziHY;ojdL0L4gCo=@l)1~M(%^-$*HW#@l=dI#DU$$rLPxiq%QI&r+6ZnB2T(7%J!MC znC|XuZ$T}96O6PA2=`-$s2)U-jL>FhtqmveB%8pGWR^<{OdsOCcPV0!HzUw*{VmL^`Ho)kvJ02^a;i zlxVv{0Qkm>R6jAi0~;12doOBPwrkY3)bOU&%W*n^g2I83>N(Hql%<2qNQx&|c;waM z@6mQrBCz;o+jk0HpJJK*m1s z-m~)g#|{UdT(TIj@9OWbe9JHha~wXQO1IBu-T(fbz{RD=S zJ`Y8%1VsHfk_jX1{ux`ve1V<#`K)fHpP4Ny9fsW(PY9TqI}GPX4j`gF8)8G?RHe$6 z>#dxv*;~MKG@V!TSk}3n47N4DhbeuYMMYW}b$(U_xNVs3!B zQYwZhAAq2Dxw;$_2ohM(OfJPVGRZ&?84wQXMW<3z#&gsS8?>LqlAX|a>FM@wMDta1Km+`5 z2a$rx#WV1oooe%;1n<93IAJ2M&SAC2w8+#PPpT-|m%u|#@EjlC6cEv@T8nR$%x3`q z48v!_C2uu)5TElIlWJafEEhaI|z-s zEk?d3mE4T_o#-`SvC1)1Q2E6V1NmBn@bfy-t3Kz?lugy@OH{@ARp)KoOINWqkPfw> z<@?FuB7SY@8-ISF|3BMJm{ve|?PV&-;;HF%gQSJBSejzKaIO_OT#Ka# zmakRgH^KKUoC*RV3mc=|Nv61O`6AM(gT1R7TLM=Na;-*!hlMMI_DGsY*w195OYMennVg;X45xCSAh2M7i%mICno-ZYX3lJ4q{|8Smjq`L{?PW5o6_?D@9UKqfobu1a zrd;K=rQ0)-g6+%!WLphk)|gT1l`K^L5-?f6S z%)J(%I#4`W`jNbpUaqGoI<|iw{vDgyr9|;M~ z)t{f-$0=0PU@20m?j{}Q^C<&PP-l_0IwAcs&z3%=URG$uc{`O!teVJ~Y7n&xgY#H` zG_(fE^BxC&8L%Munz|$Jvl%ieM~8gHBrS%QShZhaYZcSIhUBU_t9~$=vCcA^rX@dP z@%#`o9-d^qq!(uW09gS8(InG+yUW{%6EV>t>uBkGZ6~yH(bHQ%-KS0CyrkTBxp8J@ za$aLc*Sm$bov%4@{F&x6)i*}X`$0ex^~LJaD)jR2-@W1euLDoi((%?#)AoRl6+g=G z5mv}311;{S&Yz5$3Q1DU*Ck_AKg>cXP_qO^+^Rz?CXaBi^X9F@y3 z)Rt1%yBsE2Gh_Jt(%F(2y}BlKVn3~0$BH&~ zx-oj1Pm~`=-FI?|?rqLry)?*iaxippEDFJ#??jMz6KY9CP}inx39@uiMtbU*ZYNFN zNg5cX@e_o}x2nYlSmt4pCy#trtE>#Uag2k z?uSk<9cpBh^9gPUG@i(VUdA78e^$Kz8cs^xp8MQrq6XCS_!Z2pc7AZHK`10*x^ zls4dpPOcv`61BU`jiHOfxxRAd zzqMD!n~n}Hn)70eSjrM~F2OI=H-iAT!m|P#%nopU_+Lkzt(s3ETjb=BJU71i#Rp&8dNrcM+w9@Q)< zv$pnlF^0TtPdU6IX}Q;rNy$M1?4I$+%UbyRS$84SGvDr#zF zAYa*u4B??z{H4qY_#)_atyH4_KjRH~RB4Wf1V>q7>~3WK43Uyrt3=qEr)y8coVdeT8HZH(uJX0|Dr z;rR%wnsZhzm+bmnB_{x$ z3>7aDPVRR@3lW}b$ESIO_cErv6a8}QtsGN6gg87kyH`4_Gi3iu$)zwT(^lSPm0IDZ zQMbE7QdWGaJp??&SdriQg&~A=8Ie_sdu0&4X+}yp*-Nc%oaI^F?Y-fX#}34!-k5bf ze+yJRGl72ZSi3Ms7@tQiU)H*30GSn{ibglOl3Z zoJ*7fZsCck<-YZKaFcY9{ZqOgn|ghqt8SA$V((MKaIjGLUeq&t&550Oc-%rB+f7}xSR6gn!->}qAsc51aYHFQr)_Uf1ab)SRm@<@QC z)K09J4`OubX*bl0n!4nzthAa0#WtF6nbek*x<*FCz*)cR1=QKj}KHUqZ*OFIq*TZ&I`Vw zdz-S@o0ZdX6#s9~lcLeKDC&xCKaUbAepo;)FbQpiFAdcezRD^>jKB^HF2!h^>to>9 z2Fc){tsMSnMcRz?M!Do62I{4!d#*(!WnIa<1m1{$m|;p_zWPh6IrM88GB(mGd4q4{ zr;nJ5m2^RGak`brj)ytrCu@IYW1~lwQPUC2M1bLU&Zao`JTH~7q1l7aMb(x1jR3DV z<`I0a=43do6sb^S(8FViBSKY^*>bH!b0nSGgfK7YCVKnHhTw1mN}MHfTnw47VI^=4 z-jDv^`!*boh*11Tf5o(*NfYM7dq5_!oB~`5>*SMick*OPq%3x<#q(}L@~^exM$8vB z4}Bq4W@}IDL@~zJv8Hr2?p23WjKp-b(o*c(?BOX~`rm{cZshf*p+E8vIIt7xs@Oi; zCg|U!T9_A-XKfB{gDa()S8fGN(em=G6c~4+3vCk2!h;#x-2Fm87QU4}>8tnc6n<5* z&Aswt!aK5eIJ~rSNSSjOTA|-q?5#|XEMQr=Y3Fp?e*4B4NTvcvm$p08r?PTg%3UU+>>1%iN_rs^BP=E=(?gm9Ob!HZcliJYT+p!Z;#O_f-7yGy1Z zFbJ|`>{PYVxhUcc1{fzz_B^=87!4)(nYx;Vf*JWI?K(NTIw-eb?*BZSVGk0F>D94g zMj8xm*YeceY97GI#$fp2hx-Yx*e2W*IBGB@(KS|DCpY#+8xTqMaR6czYVNs}U*=yA z*A+QRW}(NL@Z31&FEO%b%bc zH=gwD`dJX@MYlVCRR1TaSjyE`>VmZUfAHT&l9}WZX>2PI2I;>oGxvS(Eqy24O~Fon zVd(IrCgogOLl6y-N?D}}cQ)WmrNjDxP?pBeSqy}-7W!G}!E2ZW#e`940R|_aE8ttD ztY%M_)1F%Vd{@Z{b+=fX8E-J#ebOz`h!q_RDT0>R<5UXrJn!z_#eT{Em8oP)`t^cb z(s{H05&mC{r(<&uTog>r7pn2>@7>XK(0G|<+kTJvtrx4gt9rrXQe5yya$iOJ^Cl&& zy-GEB;hrT&81|OIIK;9M8_8bcITEn-?t1U3wP6`fFZSmk#U@gTUqPN6NET1GPuk?#zxjcIdvuHPg7?CXKs2Lz(oI@#ay6|HJe|C_HVHT-`+|l&M(SY za4pv4J4#xe2Bq#lUq8m^y}26)h=BYHOC6Rr7=;_8p|{L5!JAb`zG^v6()X8}VwStI zv-ufHBAn?0Z(P~f-tz>uiJ>A0C61B;buBMRa!vWBmjirj5Rx`3%G1FrXhdm;;41t1 z9m}k|M(1IgfVfGBAV$qqku5Sex-Al>8m5z=8Hl6t9FLlt^*1+k(Qp6CO=;;hDJ9iO zatU$3WNrDK%_!Dd#_9x)b-ZRg7dlKrJ2is&G=ha4yYO*C5jR5QXO@YItfsC6W<*n% zZ@^rFMB3ju?oZ~CrNjl7xddU~hT-%cEq${52tMlF(k6Y@V{r+hT>bb!jiQPV9g zMm=J7z}eFs)3oV?m(L$`#RbSr{Ld?g2!*1ZnF7gBT_wJLHXn z8C%*7M4f-=wd2y*)`~;0B|55;72F?JpE`)&;QurDKoCrW$Gg)3fl^m|G#o^n6UD|a zJvYT*QaL>mUj@r?ZO01q!Ui@fj}qkJ6}zj#B_e!@!izryx^Ae+%Vn*A`jOR!OhPU3 zvC6$^+5x<;jcPK{x%{B*qnDf}p`FPaE72#P1CA}Nw}_t5v6r~v>?gT#g7D0k=qJ#_ z$j%H5V-E;KRfd+RUgI1XyiXsZ%Vz_W&sAjHpj8tcZ;e^^O9@%N8jQ_)A6-B} zTsFYsr04jFKWOje~ z3)1RMWY~^Ux|AE{c=z+uD%L+b3Faj(>D@?yHWtQY06(v+3`QI}xS(@x9^(t}&u|?= zhYxd>?>Kmqr%S<(KkGEZ&62G<T>hc4H85+t|ga!Qb*T6+z-?=Z@PC zs#Ra?{z=#Hqo+;8&i>$YSxpW9U`@B5X&fT7(6fpqc7wRYQB2Kz&Wr$+)scXcWvfL4 zix{eGQkVn7b@hR29NDdz zcM;k-j%^#sb%EJ_iUBMVfz+EDMO^?Z&=M2EP;q3^{)(ij6&g*+F7?C|-D6Lau4>QN zaq1G~o0tC3AiI#RRlTAn*K}ne`CkaHaa3n)zA?#FNsRI3uQ`z#F27(M?)7s%ph4@C z`?}G@W(TqN86r$!$lZpNgFeTO_ z1S<|-+3y{NVG>Di5J1PkzIR`ONfGRGz*{rO)+UYEclF@Uu9dLwO%pVdUNjTy5jcVu zQ>>eEl@IqRfma`N#gt@xz(bZh0d;V9gc-UpOoK8SR2a3QFgnJ`XPbrSPx>Vpr8X*O zcedXn8xCIyrW%?Vn3@r9BFa)0TdlDfL&3Gu7oFX8K~h}!QVa5VhiCxazqfcFMY4wI zcJn4g$@ZYlcQtUR+yV?@#xVvyniCQ9sHmKCQr5bILy3J=lh98pjbOi6VD z1}sXgV!{u8;OLJ?qJkv(Gu;p&V1S$8#y4_3rKBfb!f+)hune$p!Al>ZkV+hut;7YP zWIdYhjAED4`b!R9J?0n6yq6ipq?yMTT|L=4$ZCR;X{7878#d-(8ls2ZaMZK**GLEX z$>fXxEUBSzMG8hOBSdF3PHRjZIR>V3eeMnWJvTHgrK#zuf)IkXse|*DNz`WG%MCPY z_*DSyb2+VD_muyZ0J+SFxQ+Fx7^k(;4ahm^-g5u?;kXecSYku4-i3*bmSX!XX{nqi zmZVOelTnk6=n+q`asb=ZqtKsLF1FJ~k_nw6F0sMd}C zLPwl7a>_0%1}%08b<$Jh*pdgLfxV+uv>&VjJl3qYl?D7aJ31wi*rxG@=!b~vr%Na3 z4mMz@HW9K?Gn>E_q(++P(fXGtK$DH>4VWIWDQFLZZ5>4s`av|otq?j*VFuFrL+4L1 zLRXbwT3U0+d`OFl<&;dw0`c8S&AQR!26>sLt@d-(u3H7dkbyYKiB3oxSg2y1{}SuR z5CSr*e#%SVkHppqC6Cz;uWIr)p-Bja^w6OShA~_^tz1KA@n{ ztX7^-AB>@@8#)cTZ6NKUNG99DwMd|E-Cko?cM*V(2S;jE_QqI5J6HV!%^DJ$L-HCb z18*A>9*#mrQZln^JD;0?%=~78hlP}8ZGQkicamcIma+>x0-ARd8@(d2fkRQ}_Xnt` z=HEgkJ>M?chFJ(){VR(Vrrlf$3(>e%D$y%R?}!w}q+U7=O)@Vy^itWcMH5E@vCkmp zNyi`ip)oUi;<9ppfE!MC@FsH5VI7!G9-gwE=6m7Yxh{K8cw+aU_MZH8m{J>q!R=+u z1-~`EddZ)XZ-?$wTemiNz-}`FmXEGlY2wWOrt%-Et)m<2UdLed!3<^IH;t)K6_FSz z{MMigCi7HItA;G~SvH41grwtKDIcUnuch5qfI zC19%K;3bBu7eT6(&t}mw|EQVAd%${6Rim{|c1zrHHFanyg6hw!uwMpc&Ki+LILh+i zuo!Nr64=D;tNL|_5>KNAW~OquvmX|i4a7j#=PXwBx{>$vz>m)#ORmZ&ObAD_I|MSb zf_`{BQ7@yAw1nZCkwblPMo7=?2ZHS<$5AQ0GsS>=JcinCMAPUbU#d&O;iwk(H!-x*>nZ(Yk=D6%{fD} zJy_yMw9Eu(aYM>7@uV)N6zH$`pEU=D3%WnL8=|VIVQZNV-yH@_i zJG$;P)}?NdwRr)Q<9IxXixtP)P-d$ecL%>Exkie;ql2@|H4%VFF6tFMlpchT<6BzW ze^dWQ_3xCyu7Td0oVuBP3>%geag-@|P#Vd25g~WSjb0Ol9j`L$zPkId!M3>pOLP-h z6BEUSWOnslpD&ziku9ACC&DsLeKG+(pK+wL2v7N72=f$Xgi<`-!=yD{id%m9!A|26pcXz2 zwi-?8O*jMn?$0*)wy{D>v?PW|o`Tef%G@{Q7)BD&>Tru3UiJGMR)9@}`z^0u1nmV%# zpUzjC<5|qtIu^haQai3M6m8KIi`vh43a{=OebL5NW>HuU!YjdFK1X;~XM$x3Iuo9K znIh|u)5<*!X&Y^-9{av0qt6HI{1wKU65}E*; zz}@|Gkf)&7j*K6Qk1fC5+0VPAlG~1$XgX|jo53sxmf!fSrnKs5@zR9JVvMr08JL6Y z^EklK2j5w-P`*NgPiZzLv!5Hx`Yn99MeMsMIZ`6g{LYNEu83=1c#BR9J6{ecQB~VH z>$8g&VmI1pCfsx5b=4gOP!cCgA0eMndPo0H@b;Y^7`L`JFVD_Rc4SU@dfpU%BxjY5 zhg)B&qyw>Q4km`i%M8a3yAK#ku(poJ8w+C3w#r);Ahin(`8{Zo7bNkcwv8}K3!pGM zlAEy`u_&=5+BV%e$NafmKpr+wDY<5MXZNLSx-y3{m-tU#>=iFoDKg1dqU2cEW3$M-3#&fzL&;B>X6 zC&v9ziP6jp)K?OFV@gw}et;loFFE6Tr$*%WbMPA?3+h9VMO| zBO8s8tA6}Qq{GIP!L&`e>4fF*_=aKWCXZxnhxSHhj3Z2eG$SnnfR5DNuv(=3%u#DR z6Awq+Af-1}gWfb&u>Mox*cZlbA*xK@g*qxB2U?F+!U*uVy$_g@meX!&Sw4S}xjZDq`12qi9PqzQB4mqp2t$v(+|?-3V{pt)dZY zXCe>jDO>}3G5+($2aGdmB`^%2VapF=y2o%tL`tVX;2xD{0E$j2@32VKIHCXp?#1XW z`N3{@4g%tR_V5aN+y2dT!*)1{wNTri;8|_g_~f;nw6~Uo`ye`--X8cxnd+TMvtU=T zG!v*}qg-NY&_u8IBLP&W;VaQ>x=Onj14;C7e!q=X5ySt)g|j_VpHrgpL7P~w7X6e) zi5;$+o!8jwu(joCVDn}D+Xf!$K!F78 z*U;=lO@+{~CuTozFP|ZXPHUZ9iaD&JNbt((k0an2L;{|1WmT9c#gH6dq+(4En-WhE zA6%Gn8}`AcF$pz4&@5uKp;uDNWka1PL_z9u3|7e(D()-MGa$mCZ81Gs|+-VHO5Y(3M;g&q=Xv8j$YmV|@V7?_UI)5AKy?vs0NhCG}!qm-ZPw{gjj z%gD*MR35Paee@|Yz1OsoZFq}qA3`l&=57v)H%iQrQ+Uz?f%aQ(MgRZ=?>-2m5;;o#y)Pw;>74@e%{10`Y?166DfZ56u1+?d6#CYD3T0{ zszF#z=ZI(;v0n#NSyLtu^dIT}SG$eIe-x4X4}bs6AC5n-%~N)-8sMLnhD5`fNDv+a z*_kbi_ax56B1m3EO$xxBB3%MzgX01pTJZ-6~~%;Xe?TltNCT1#Uy=b!In% zA7oUIqRo<{AQ;1PLCQ%a|2K2BHz9^5HrHP%J)R##(&=V}D(-xu84m_-?AHUvcP?@C z*{(0J#^2&070BF~Z);%ugTPgY+vNAtcK1{AqOX?XI}Zxs6|AXZ(GPR~B($+avRqf- zEhZIx68Of|T(5T9{2QX}?v=&}SDK1z>>c!Ao!wbFlpzapnM)hphDk`4%`sGkf>+8q z)@1~l!h~c2oaijm&uvmdrV_`dWpd+StEyjOr`JE zfx0nnu+mU<@%SjYTkJF-052thVO}rc`@+-jElHW3Nkk2*$3BAZFiBNGd9Ci!^bjPL zg}p^V$eT~*dqT=e(ulBB7ZpcDRzd{9yRv`<2f5nbTe^y33K%50r`t`ox)lJ<_B{^l z)tYUMQIONH-<`$~zN769G~y}|*U_=tZz9uSaQcRIk5Z%?ig*=go36C!-z15{egCJe z)31yp`a^es?ocyC-Ym6qPXY}PD0{ftC-7!3D_l1TVjq6k#!bjCnA#HxU`)_+-?V7( zaf0+?qM@!T-+}^^)+RaoJ1>Eqdx+xw_qkQwzjoHwK4W#7usB&QVwKdEP1aM# zI2=y9D^T0233n%=DRj;N0LsxTX%Q>Lc`KbBbdFf6ce*NI(DmzI(Is#}=tuOiQ9{D& z?ZF49bbkvm|8P2Ki4V}MD&U}eWm6N1gT#h|1G45Od*J{MeuPZ zAZkrbru1nq=fsq?;GP7*lsjaL`qQ8*FZ#Os<%ihZac3q41|uF?s$)_lOLNM51$ZX zzl1#v`IovTdri^ZzxDnhS3N%e+^}R4NRTx;{toV6tEA%ptCa!fAi(>7TUel}Nl|J0 zv$=LV{hZwxsXgX5i64!K_B(@{hQv*AnlX73GhPput&nq6t!hxy9Q(w7Mk!tiJfR*e zc^bfDGO~QC0=1I^HQHpYIaWwu1xFawP07+hGO;>IQO(hL0AXuBF?Sn(%s@kMB$AxrMB_ck3(<+Jx2U(JQ9C0Dei31cM zP>++q=I|#2wu*?2r3Z4MBVC~beCkrLMCc2@Wwws<(KBsi=S|7qH}j}*{gdW4XoQ&m z;X-vKY-N75>Z-fPWK^($ZR_6`@3^huM1KCPdz7GMDu`qOkNOIC$SlH@^3c(;Sz4U0 zyo+dr;=?sfOq%RyLYNFn+To9I8^SIsLUCgdYG}>>pC7xp^oMC_vuPZ(|0 z`5@!MXRsM95M(1rhQP5gv@***RMDN5;8rm(|4N^fFu3Gck@7lAD*7UhsU9G)02T_j zn8t+}?4-T(_9n`P!t$tU{&fQuYhimV7<1ugfqQ_x-tzg=K*F4SN}#~~d5EhQ`J>U- ze_4pGOKaMS0=e6~NZ*)efxncgCLJCC(8iG)H!;M3r_&NF7o}M5+PmKC_cDqM2Si~) z#!Ff7ENgbpkqE%|qANDUF;AX0ZQ>-YN_(C)gb<3pt)}vPXvOQUlm>?#>AwTmY$SK6 zBRE3shf4f}R?~7}>3iqkfgB3k&>xFgn7u#esiJzz{UKBc1i?JptRC$R@HHSpwsI$R z+pq~YeB~gcKTV?UOF%08)eePodlP*r%8daDwO1a91FTI!{>mcjkb@Ki3x`mq#GMhG z8~W9LLPKi^?ZfJTtJJ~<{~~sIa_Nmm2$d0RD$M%W#BpqUYIfW)W6Z5CdCl@F-PFvN z@7yvc^`LRiaU_u>Ezg;;`~BmG9o{7CY+V?c_@7VAa^?x&qEjxjs($=mb|j?OclDK! z0u$A?h&Flf`s>!lAlKT3maLRlh{u$?<&HWQ5I>Bk?^tR;xyAy4`yY6jP!L0gj=OyMbnI1tZ`?fBQ{C!Gf zsz78aD>s1^2R?l?*L5`DLL;<9*WH_RMTi@iPln9nfB_QsGt(F@qS{W^$+hJVy+922 zlDgwBdZ7(cf+tYgk4BV#;p!XpkEo_6!wBob=n-9*#<<;0Sgl%2ebfwfzDGf(5%9>2 zuv)QBB{c5VfYk@Uq9MObA!0Ev^T7#HOkz|cZG~MU5$hW7?UJHyg$ad7!zKKhxb>r| z-^4D|M3i*)v%uk@1JqSZ{X7e7;&p2cEfR2EqQ);FLC-GHM-&NPBp#JXTTNU4g$M_q z!;w%R)Q2lP`mquOP?Z0CcRed5N0Ox54v=37=jS(=jZ4jZwIdri2lC>&3 z<5klScs8fF+xj0|>6X%9hz_(NJj3}pl`t8(@uyr>J2eQ$p?s!`-xDkLVsYQbunAk% zdd$StWr#i*%j$d~KuKpr^J~~$1)&DS#~yP82Br7DCu~|xmX9|XB9mV3VVaOCrB9N! zB4FlPW0Enhx4#tQ70`_5#@M25>pqc}nF6Y?_@4$3#C~2xFN_SsR;sFItU)|;iFC4M z(3IA_Q1LD{ke;?Dsuq-(qLYVkf+6w}7AEGG=*_ zgG`=tPCjW?RzGG*TA)f6(`g({d4(w%ypV!}Oa3Te-h9px(dZ6TPVl@ZcYZ+QuP5yE zD@C;b{t^nwf-}#&e?+s3*f6yfjF(MM$lNBHYziY!GqosY?yN8yOloXmZ?oD7wJ9nH zuX~CxmZJ)0o4)7<#uL~h<3xgcf{Y2*hYO1sK{>yNP<4#du{B?X0hh^UD;L$u8jNI` zIwb?~hS{W4eH$l9$+A9L37d11*0VPbRYdLDFlu}Fr*fx5^KbxdNSOEp)(Wo$}9L^MQUZw043q*E6Ck<1FUIpgS?By^l}}2t$z;JhF5)o z{yVmY!46YqO~@xg+^qfC~G;O)$Sl@-ivHhyGdFi(K}=?Ih2@8fgH-TvxWqfqbj`DE&mN z4D%1wN&u|u?Zh;hQ`Uf3!Yo9E*Lpb@guLRqJe9WS;I7Gk`2oNMR8XnZ!0w!m(X-G- zX=KhPKLFMS;xDjZoSp%U8bYPwdOZR%2fc;|0v8~x2m8UM;Q?e;8TAw9N46#96l(3c z3LoM>mh`goWi9s_Nw{lb!GJxOGc}A=Zdy_+VE{a0FOSLUH<)l2oI3=uAj`5nJYLr$ z6!TA~1s;LCxuP~_GmWY*sXRbyzJja#hP9TPdG$(AHrMytoq9_&~? zTG%TJDEZhz36}8?pfYd_m=iK<7l;;g6(TRq+BQFze%o^Ax%SH~ zb?|nYZ5o>#0{BqlOHI&Nidu`=*id8|JxHAz6FB|%ADP(q_ld4Y1M*+p1ic-1ss?7` zEM^=a_RGa}7#gl=x*x@ew=;xPI%v*7b5gOB5j9y$p#NrGvn63BZ8Z=LasM-HlWY@8 zKQI^tNy`93!{OBaFb}c;dm)nNm2A=|WN%D7NsM6)emBQ=?_h`5)R1p*upPg?oJ)wu zZQ*1dNaD}O55xXwkA*vrhdYc-W42;Fs~lr%Pv?1`VH(I@H*glDHgu2;eh%qO)b|_L zfF_RQcHl(je87ufcVvZbyB%B5PlOYXI9s@w+==ytsU;q#^tnkleyA8c3onB8-maA4 z(fLGIE3C#}2=+%WVI@o6!y| zj_l*UP23>8BS9N+sP!E|1xR0%%!pmgS^W#qn9Vb2BzH_s-xabgfr@1-`!ygIzW&aX zE@*wCp59TT`!pudftS^TeHSdOYtbhMVJ|D1NcOWy-~oWn%L`k?b7U{Qlujx1KN;bJ|tOZ4dUk{qzQb-ft(I-mQi)1lZRzb33 z*?V7FbzeD2^JX-fJGO!3RjBSNeQyHqoTA(# zGp4bcLD{cOIyc+7@l8KB%x-of!XI_DOH@J$&^-u*%@<8;CH*o$7rBntEJBAW=Hk&u zBjLfC48>@<7j}XiGPs(=y2U&7)q(&f?dh|A`#_}0?<{uIhOtdzafI-`PN&9$=zbSw zE}ysGM{=ni$A`k_b|y9M(xT!)~w7zRIz zgwN)ts)eYqh-B2#MLZt11~BY#=GOP;eEzu*c`HLRRmk#DpitG)oR#R9;Bb(6Iw~0F zSRWUu_-<{}tv;7@TK>9qBkgZDWs&`sfiR5rH9LB(iikRP%V2)vs+@0JVe0f2^a$#% zEJx1Mqp{$I)hv~2;6zgYXKuAF*EMbxU2EQoC+s*eG`V5ga(&HCgRbrf1vj{_=_^P( zE23x5A^gt<&vuTM_(ssIWlQsT31weaUxJZDLHiO0aU4g=Q&$%N91)nH*99nWM=eLd zJ`AkL56>TjuDmG^72O@@HH&X@)QY7(g(YY!KQZ93j)|u%29C@^y^J?~DV`D>%y6eJ zw=(cP9*nKVm(W^ge*@jqhQG-91CxHDx(j7$cD~4f*_7W)rU4HO zz-Spbb@Sg|&W*^I{B;l`QUdbOsD*Z&Iaf3CX_*H7czbdgB7ptx@M@$|UNLNgIpTO= zFo3gl;bur!+L|7_=5$0in_Zfu(>r`lt9@WX>4}2cf9E5=r!a}CWuBV&2E1sX8~EN> z{%F_n+j*sK_u-JwMh5Al|VAOE7RJ@WHBaW zQ8{|$QOV2U4n(}7-!L@ok-1?laUrkhP3cQ&>U|DE?6RI2m)vY2$n94CjT3?UG`R;v za$^`%Qckg#pKVG`DxmjXh!Qs&b>)nm-ubdp(k|}$i{d=MO2Aa)znpK-?5pws7Y4Ie z*|{S04F2UXLq~@-jh#2|boDC+qvPgKMeWx!<-ILpxepZPy?d_&(hOswz>UrybJB~VJ@DGq?W$a^ke_f@$O^1ZN}X@~|h z`+~L70$#f#my+i4g~W4ZWSh=stf|Fc#RnyJMaHpK3*L#82b5~uUHx4m=1%(S(JagD z8DKchY)uNmDWOXVnX6F!-_NriD}-JFY_0&vo2&s6eye#p(x8C`d(JX#ayeaim=ycr zR*-RvHjtQ^apwYp!Pfm4qOGjj&atsEj_Pqe)r;E_NClvOMHJcJybAP2AiQz;_bsm< z!SK0o;zLNzU;ECI@#wGrTYKU6CluaQA*FyD5aGVG2yqu#;V?xT#g|igz6q)a^IWUL z9dPC=*Ee8Fka{PwSefmDb|}wD8{gVb7fPa*KBeqVJ{{#}c7i!5V3aFAziVAqpK zAIEQI@hE^du-PcMgZ@^QSd)ls?tqWt1r&ybKrjXY%w)Ck?wE?YgC-w5$MNJeRVvCj z6PW(kOLzn~^|=U-9tz6KkBUcWbH|oL{G+e)9^1Rmn)@bTX}dvZYopCa}E&I16DN(;1r$N>WM@)c294T z?DMBgt>cpsjkBjZ;YL}Yq$f+btU5L%Aw!j6glLoLQu25Wx$NBd3pp$nVb!c_eA$j< zkbRz5g;p3z+c+SLVVDf3)b>bvq;F?(>w2>mtgV-sG%20%ihE}sw@&P}J*Zv1vL(3V zib;Ng;!~LZ>q-r1t^RDXZ)w|kHrFUAnq^`+?1qdT;iQNGHvLreU@i=uKLG&$c1E|F z@!TPKh9Y z1Zy`E3O^l?M5dM^%R`?%F1rCPC92YHxq_wi3RDvxx@`7SRUgRzQ|GCr#tc58j2i{2%}!!oawAB9H~RIy8m)9DQNHfp|FwN+;g{ z7|+5dQq8AXu{>lp*;FLOWf1WAtT((YXQxwBXd+?GBNEy_D10<#df$VE(;VugFwo-v zqn5eliFIdgXMK^g{IrAoXQJ%;0Ab_!k5i|j1StQ=nZH66f>0+p&a~MqAx7!6SmF^^ z)!EPiw_M?6_}@ypWlobz@N1Txa=B{n+D`sFEbOArv_SnQ#WX?g~Jy zDw!J}{H3&-=nOein`>;z?cmnol{do&S2(2D5dTl(h$_#odpj}gMctE@nU)_-VYbUlmzlJ~tm zP2o0f7|th`uleziW+~PJ9)RIDD`dMWLj}aEfIZmRn80&>bcuiOr9OR2)@kck5i~GY zs2Nj-`9aAR%tb6 zS6m0n{hlC@M(M(_AY5MA_M?Z@(#U_2XxPi|x>#5sMmZ*`YoLfqk&n=@yq zHULK$iN;tUNvc@UO)lgk_j(nV;#a;ZeB>)c0KO%@Vm~xDpRasxdHkS_{eB^eUo|@6 z+69|D(f=nP!o4Gz{<)X8D4=XPHsR&v3C`tV@jEBoplnrK017o@8>(_o=V9v-_-zhp zyn{ceap$#zEqRbH1B#It$q}#=idR@aT$u@y{$PTMZw2-LNogBr z3UW__O^Ya(m5|28WaObVwANU_`yI9cfq_oUr8JD~v^%2yVxOa-oSQr*{?Z&<`1&IG z{!vT+Z*^U8j=-%hLmv0BuwqnCBQ>zB>0u!~3VC0$XM|6@ZIQpTC{S(>zAvi+udO3OZ>8Ye0g*B<1Q{93| zl6?#jpm661Nz3e8RU10k+eQ$gigjx3WexYZ2p6`9<5mO2keCD|al|vg(JN0>6be4@ zDJ0eNkU>fsnEc%m$wYBD^AL*BPa9hp6e@&zz)G})>2=0JUhQBRC9~6>fvHxycs=tX z9+xFA)#`$9_xAJ%dPME4qW}FZbe#N()qhU@=AbFjK>}9QJ-hf{U=&>uTQwiq`-uFb z-(PNdY^-QSR;$nic{s zDZ-=Yg*J;zfj|!{3t-%)1VJqI1K*efw^1#M*TiKZ z5}XV^lQJa8d(r%FBTHBW(0QWK0^9gRr$J+g-2FCVzL>M1oaL@Nf;#!g9YTRaLB)M5 zZk27={@deMEG3ZEe$g@t#BPV%&xPtVr zp4FEJ8*LsX+YZ4)cKBrtm{y*mTvNtRiH!EL={rPhwxULEQc9PDjW&OwOhw*SY*v6bP zDzMw_Ow@f;j5Kza4+AZdY^Mu*9BtQv3KA!4uS11i2+)kS<6fBh|2CT%FsETy;X_}V zpYn~6vH#0e93}ixHmj$rxnv!?B4TuEpmPjRbefAbKhVxJC^CKD+<+$Z(|%!X822kJ zP&gayHaPX|edOeG2Iu&zv;r5>0s>CP7(wNvJ<9XvMBc4gg5sO-q+B`wD#uPos#^EK z@DccIjjaqIy{Ci%pFMxhLAXC^_;SQvFwIgh)IrR|{mT#kqgcsX*<^NaH&ypQrsflT zubC(%+fMEwX+1`LG?4xQohzGqz+YXOSeRcZ@S(Ec<{}WkLP0W~&k6oZS;EE+1WxpS zy>uRm?&b4x-RL`PMi|TVa?IQenl$6SbXL4?N(!8DlZXt^`J$wS@I)Iw`tA#7Bi?f% z2yufREk_DPJGYTaVfUH3;=7%og=Cr;#J<0hRZs5Ep7kE7Q@r64URo1`={h&odDZ3+ z_<_Vqr*|)$1-neK{KOelaGIJEw(rfZ;AY~PUdxa7bjmo$h)$xF#7sFQ<3-SaTj^;l z4qfKK%VjrcEGu=)G#8B{!3WWTeVlBq za*2t#vigSZ%yd?T*!HUEboyw$c=ZJiN1j&;gJnLHb)k>~&qC06Wr7U)tY7suh}+f9 zdOn1)xr7}Jhx27^4ZtS`w4djKS%?eWLD)ywu(#jH$gm^f06#L5deUMjcXbSc8pDyz z$l0!QfP3nj$v+qxBoW^CCO*a7pGKgj9g;e~UfbXb*HbY`(l%tc!p!s{xj?e+-0x5& z6$2Yc2U8wRA$(iww&4n2Jj?q@aKLilne!ygDMI%!HusmX-;>0V%}YwSK!-+AL203%*AhnYI-T)PRKdEOE{PmDV;hO&umvK^L)17x=OH#@rcQJ5TsHd{iA`sT^H*R$72(nXu zyg5JL2_wAE6#r>WQx~-R6SW_LJ|dKsuONY{P7oMJl9*;(vt9M9LNt0`%h_qmEl5)* zYh)>B8l`|Ch&B)<{uAaq`5Bl)z*B}XWWb~u6MKf;D{BRHlf+BKE^Zt6lxkw-s3WO7 z<8ki*LH)^$z99M4nTys3_+%myN0X*gd=inr<5`B{Y0VSQ(Wtqy7=w17X1JK;Zd`D9TO7}^99Ph~ZZ?4_@%2Zcv z`)A_(VIWaY<^8h#3iiVJO8|Rfy-;nYGhB9|bEth22K^j7g3KfZ@s}}(dM3y*C$CyO-jnIymZEJ60qxxxfQ9xp3_aI94Ohd{uED3nOSRaM3lqf|eta z@X02}D+_I=6t@CIAcJ+z2IE;ja!J$2o&V&abpjo77zcS_z;Vz_VT_UIfwe6|L5SL= z5xvOWXU(P0FZ){!e-?{og2i*h!6BZRnm<71UZC9=S1ap2B2Yb6@7ymgY zZcS1WQA;QD4UbEzCufyO`1Ug``;YfsF`J6N?R5o{(d=@`;y;;ATmiP!`sls4Bqe43 zyBlAZ(d%loyvL0q!K<)l;+}rq6wkMG=#RLRvhsI29GzWudk4RW=|Zt#NqW`OLNY8N z&)&Z%{0Z6LU$1bB#08s|3sKCI<@DJDi~T3`%{$0$Mu@+S3FJ7iv2cTz@m`>GeZdl| zRkggM4KS{7D~>&n1r^wU*G3eOR$k1+B0U|Aa?I0V#b%3p_AG7JQF94k(rK%--Eo>l zTqd!{(jpW#8cyf}!&yu_EMAWT{eA?_?Ied+4+V^4t>|N+=W?1O&)Q7&Wgrxfp)yAX zq^2AC3oRM`n;W%ep1-`&e`bIjI7h^f=%5U{?5%18@DRGwWVfbTc!FH)(C$}SL^FTR zAu8?3Rjj`~6j2e-Nveki*?zc18>kE()`4Tlc*f?oaoi*PYN!qDCQ!0m&hd*Gy_gu7 z7%miAj5Ny27p4S_o+4eAGM7Rt@KIAusjHF$`3)L^85Rz4wqcC!H|^!I%-bC==@0?i zkxm#htxTEYNEz)jt|OSc^b#`kGr!CNe{WS$fZ!O8XW;Q9SU?adEK|5@4;ABar9DVC zkHNvkg_zfY?+lX41rXe#>Jz4(wwcH?Sx(DIYp0->I2v)}A5>WnMUQ3s_mDNEv$T&X zD+m^_ko6iaO3$~Ou?jpJgO)F~REg7gs0~AFsesqI7sQyWt$)01l+*#))+$RQEX$Jd z&_I1*J!6>PWuA<+kYxbhN(SL!FhzYPd6`5h!(e3}&QQxv57+V!t%~o~DLP|V(t4oj zz3YtTTK#o>)8mTG0JAz4pm1DP5ZzGA;0nfqkdmgt7!%KQaD#XYdL<97Ihqv3G)1+0 zyP_P_3_CENDNre;$Fp;jCmzdOGN&a^_5Vmnr7g}bOpm&JQmgp;xR!bhwTvkqm;qYF zVBi``R5Dt8)72~_*|taz4cMpSJ;%Ii$q5>Xpj=9QWLwaL8<$)Eob`rnsnN2$Xy1lL zbN{G~0CSQpN?*$c=Bx$PP2V*#{nEyTV>wM=*9~kZ2N^=Q4YMF@Ia-R07+@A-e|SqD z>qcHrydxze5MBTJ5xa|%hZc;kP952zS2f$A$7YjNGUT5S95{as#ftQ7Ge~l6=trum zV%1Q|6hjDSv8D?h)w9Q8He@T2A{vQgaGgIVUboqb&NEIpzBP*2GhDP`sE8cN#1Wr6 zN$Eq+Q#J{2sSk?Gubvx!=oOE3W$1qv_fsd_!VvUPB%17Qf_c2oH6LwTakh_;g7nKs zGqbh5hK(NnzKWO88OVJ-F!~{*^gF|Ojv%YB^+dh#?VCimvv6Zu+M8>?L1u?N`a=o{ z?fU)=m0OXqP< z%><ISb}Y}({)4nn`}JP81VEENIy>n<^fOHyEghvMf1-mKb_AGV z-X;qJREES|^GvbSYSMnV>-_J|YBbT45>$1n9AqLf>CY#>32=ad5|)yt%mUs|0l^J5 zZk5Y)2VY5uPu1OXc#M4gZ)CQnFiY2Bt${#BCJC1qK03*=njwFk60VS|sS_L^pqaoF z`j?*yph*wk)_CX1?n-Jd+N(#ate=GyqfdKjn@c`$uBl18$;2k&+1wyc%dR z35&Y+nZw?#r$j=rvl*fCwS zDc?`bs3RS6fx69;8PG`?p{1qD?HMt$j{(N3Zm0T>J&8@PsvjL(K&DW>kTKol5YO?q zV|=K!+L^7KrVaZq8@(lNI-W0?&BrMBP|f5emH5)n+D#94v&+f>w=3!KmBX(>-xq3r zYzveQyVzT^r%!z#TsMHq-D4ZBY5A4AUQmIH=L&qmcR{*VCP)Vv#SLXW&=wm`_HnOT zFJV(0{9{q&0G~cNNLo%?B^*u8#2^$Q4GP}6Tcc*m zDnE}o^q+7h&f&~d_G>4wIwR+EQz*q`Cb(uJgN>4{!*7WBL>-N)=JPN_bhlggrD&EE zYW~W;4PW>_T&LnM$+e^0>pn)^CD(nfFFvR5*3>9^0?cmZ9FpkApPu*EDZ*N2gw|tj zG`Rgw1tk0lFG-*852Nxjk?Bn={~)efEJ*q!%> z$OrnUGVnM$C=x^mEc9-sZ(9sh;bkz6JT_yr4KC;kox3u%VW2z`En^tG!T-I^i}3-D zb4OlVf+!5#5dMC@>vr9VZ|d)^&%}N~p#3O>AR(2T&hD!{0^(kYQ=Quq8kc3eVx?C& zZn;i%<8+w_5oKRqlop(&2Hg(_YfWX&E9;#!Ir(pcaM4d5V_5GMgXbiY8QHS6N6he} zO;x`U@CWxb}mK6tJc85H*^anP2*uDdZd&+gDzhmk|45;IYM z?vSiiwBGU=UyU9{N8m8_9Vw$;8wHqsx`saTKFsNg`m)P?hoMTOs*_|X{11tcV(|7p zI?Ag>%u#GiCz;Mf8*9%3phdrGpaq((*NOx8xpT#MkRr5*&Qkv#x@S7rE$$CMA$=xd{e@!frhD3vD@dm^FP&=q#TZV9>7Z zQ-J#0*%)^k^p4=q$Hqqeq+TPGG9$hy(@K}?26a4wBR_u+*MCb;eGOF5RCgz(iDn>Mz-p>&j90s7z^pgRf+2hj3%W9_y<`VC= z(`uG`Hii@Vn>})%eqZa9KV%*ue{|Q}YXog5@gQH-?a!pAJ%QwmLl2%b7tejnnd{M% zwX$Q*2qZZs)Me#r1h=zN-hK?H4wN9^ZChpN7FiTt%Spum{jA=*kPA{liT$cu(-Pa; z<3)}CZjKV6zF)_MmQgniBu>?u)wNHbaIn@Jr-{)|Ax}!yjmW#R%4>*FgqSrHN(^-8 z$_Fe1u${%-&V8;ackz!?_T=y0u)U+M!E-`jJ62d-1!Pg11Pg5rljByo1#d!$rx)i$ z+F(7g7b2@D+|WkycK{2g``i3jAQQBHcC%C%nKRzU-dMw`FgjSQlJ6Egt`dZ{y(I%U za%3pOs%SK$oW)`JjVWsrz?h7u*W;%kcOKGcSDMtnzUaeV%`qDOdZUxeKTM<8y&q!@S8G5x*9D6h# zlmjewp3$8r317XwK9MV(;essPHJ!6JZJO~h zBR)bRG^*wAxQ{+B0X20*1I6ypDfa&$9Lwdlz8iRN!%>z!n}V3?HnQvGM^{9|H8aE3 zd!1+OESBsvx~hVg2lvt=e9d(xPL3jbR1C08Q-~sGF)SvdVjAzY4>&g3NVqRS%xL!q z?cSlfBhWxJ-nx7~jN_?4g!9T8eDV%22VDyIVBD|wH@{$Ad#beRa9fKt=!=)QdmFrT zTXM%nE=55p3_qSq_)#>0{6}hEk9 zZKggH()j1wI@s_-x6A`SLAL$r4Qj7oTDQ^AJvvm`*je1PjphTF$L@A>rVb`7SuS&bYV3*wH~s6` z=yJVBc3E!xl#)^arN4LKiT5(QMluYDbQPpx@H{ZDS#P{of$w64M}udOB;YsNC$k$j zCIJ0%AfIThqeb*EGGcWITaFB6~fXqx{q4fJXCd)CTQ- zi76md#YvN70EOhA#;o!x!jGR!?>JW*4nLA100>do9sEiZ*Z$z}L61!G6)>eJem`+k zg(n1~W@S-J!xqUtAG!S{BZ@q&a$I;?1XfRhO?X?%jAb^Y;rWS3oKbV?5)z*I`;EQE zDzIx>cfOF4r$+EqKqXdvHMPdn1pG_pJ%&U{K3JFCyg` zNM{1dYB*DzAkjH9%~p;I#qPTcL~eCXW|ogcfJ+DN5wj zNn4Re2j*Z2Qy%70`y(ee$a}W2TJAEbT()$J4MBkp)HOyjN^y$v#SjiL59?7Pg(Q;# z?M?_|TpDTN?O++f$-J@azf#t+Qll5cWl=ms2`*5qb8&^{Xb`KvKUo=`W#D(Z;r_d6 za`wbC{M2n~gLAn_vqapxj&V%~q`ITUTK;+@L=7^rY83-46ra>VmR}Ill2^jA*Fx3Q z@mQ?NyH||53*4syo)7?HN*Dt?T9rdND+yVUEA7-gef^{f%cvh06*I4<@vWy0|4h5( z1=H>0uvKm>CM6nta+dEfaE@rLp@>n6RV~BAw~~5FJYPE^XyEqh;j%@yYz;3X!wP8V zpWZPmvdG_L@+3ZU0p*E~u@#JEEwR6e|7mwkq9KQ76=z2t4H>(Hf1Wc?Ig6@RUpTpz zv>pYsvou$nGttp!ocS!|IyG|nl#r1XHmWkN_0xa7dIxL57D|^7Fu|_g*3bp8?+W$$ z#BAC;E`GneM4{*l6ZGnfO$^^32UBY>u*q*M3Xa%S*GF#nNQJwn+A6bn35<-sOR|ob znZz;;G!f1T{V|W3zZYImhH>2G35r9}a`*$-i5pWrSyvQA)oBkecxTv@kuSYO1K#4J ze&}$ZniU-j*KA;Urnh6LV)IfN?}R&*)#Gh&7T;)f8E53A0XC3dHDZCW;>aLpz=E!j zdIM446#uQ;yHpQ`~@&OOT5Ez=?ln+1`?$2#dDk`rC-A&tD?x{|UW;;YcjKtG!uOakB!~ z>4{%~5yna5H$69diqpQFn%QF*&x89V%#M|0pC}h)6dM+`V?_W~p#ZRL<+S{|$J z|krH^poWHQGzZl(yD~WIG^!kKOiE+!X zz^g2>oK9ROioh0jAAR*`5k2(;XV>pk#9S+QsijTgdV_=qt78;Mg+Uu8qeyNx9=oBUIUFe-^O}V# zH~bk6L6HB|-ZCMyu)JDS4RoAF0d;#=Kn+_qyk^~jG);dByk^D=pwwJUr5P>jp*3~V zyR|(r_FAya2pyj-4!-F;5L4=S^XOBYb{bWHG>QFNaO_Yfy5RK9MN_;rTTLz@o!Jj@ zT#Dfj0v34}Wy}hEX=p!h>}n8dl@ROay1f@X*)9VjRu$ispM(}ru!tK zYpBD~&?iFX1|t#hF8Zp|(IXyZFk_i|;*+Lvf6d<#kmq}%efaI|&=pvtJ@a?%<#n^? zAPbWQyzTble6w(VlB59zHBfc_PPm52PZR5 z#lmQ7{n-!&Y+la!D*IOeRdH~`o;ouu9Tee3eHh2$L}As6W`W#7jXQzNH2uv9zi|=O z@jAVwTmXldfm1MSn9-jSIHQRe9}55bKVueD|8|30hCL@e!=|@(;ud>K@FKb?a8C}3 zhJA1~!+D~!a{fSJk_}dTuo`RT^xUPDjk+2~*HynVj7oFCI(D9Y6`3D} zw&=}FH$!&cd3yx}{PMc{@@7PPHOS!uia38wOGMPbSMDRl5N>7L4fVqkAO+vix=ngR zWe1jd!Je*>?|+DZ-b#9|IAeI#y1BW8Z1?8lCYDo<=0p5*i(Ex@5ZZQIS~-+)ow|R| zQ}TyRx&h#a-wLh&J+t>hC?4QplO}oo%;q?9(2VIvfKzl?yJ|{%AtA zhMnKew6hjr{h%qU;+ZEcg1QUygC5GGo9mv2-_(K-ZxX}JvALY3l8Y``M^KW; zc`TC6kd+ftX5m7(y888ihW-MRQ^Xy45B-^h)Bm-p#ZGNf0nESEzffRqU4tWhv7kErC7(x}Q#Nu{g$w*i7j0+aqV0;oA%rdN5%1)zL#%R@ zKEw&KP^}?AIdD+$0&fU^LGc#nhk||@u+Ilo|HLe%wlveOL5~$e| zRY5~td|J!RIduz8^m1p_$zDCZ+K~m99GWEbbN^RRKb(!KNYxZ(c>^gw{2k_I_cV{D z{q>57dO(|yv>9h%o*lBOV!LLfkg4s4W3iU(PUTW&}+nl#F_O9$7~p(oEpi+Lvt zI_yye3)_OjRoR6za(*VED6q39YxqpFb5jwKF2uH}3bM8MV^gfV`iV9sQ9!T~MycZ) zxbj|F>M4I7&#P@G%MX-&*%&^9&en4dr#u^q?-f5qx1-_Kvwx$+sQfTJ zzRN>F%N5#IX6SvL?yxe>92eQk3B)%lePj7L^|p>}`H(Mg2SNQ?_GYAG1+)wygnyB% zqaQsq1#(`*!PU#5(^n$Uy8IsATWLSM2 zin=%=_rJ^e*ULUoRxHjT?~IK%lQF;>8$#-=Ij3oCL->$Z1^+gJ--S=JTUx0LYJf=wab2 zCvv8)K)kz4VVQDT60JFY!p^T17#u`23js_D$_{^rO&a{HN8r^LdNIPJ~gvg_Ikh$n6a?`o1XHJ+L8DOn4`q)Cf^_DY=!jQZsMLcWBxI0#>OZELHG$KDC3HZN9YcK7+_{H|5RS8G9Du9CC6P<}=-1#im5-Z9LI_E8^=`pKw$??8)9a>#&L3}6=V9C>P0Xyy zqSUKT6{-&hsJyO#e2z0b$XE(LcKRgv=;GjE5Vkhmsj!rNW;Ipki;O(^>1NZo9^kJ! z<$#2$N!r2mqK#-O`yb=aETaR64R++}Wd5o)aR_7H*hI7Z9vg^1>?!!qbW1-`!_7P`~7uVCFW7 z#gpQ}^XT|<`&JVlN-w$G6mK5>RFt-TK-lAu!=2qhecuE`f%?7T8jvahyo0SZu2;+9 zIQjc3`P1r*-p(>>4z%Tg;#-|DhF0iTxhBz^?rlq^_UO9J>W5mqwjkZrhpB!B=bWSnJCTN37S z|1r&seN3VcuIfy{_w#MKQ0LY(i0hOLGa^pbv{Q%5#a+Z0EeT3Ci_li*oD!(?=bnSR zDxVqvN&7GNmWB&AHs{&j-ot6)0+t$0`CjJKHnhP8R2~&t>q{ElH?fVXl@P@GDkp}u zm-H5aoTU~WU%434>ck?FN;Ch$*{K-m_}|bvBrV~UL}a>_ zK{xg-NJs{&G$c;d*{Gul{7)(lbSdP&x5!`J<-&8)(*CUU=X*|xgqcKMSqE#Z11)b4 zs9aDELit_T`n2yjK3;UJ6R!oC&)+cB#_0E7Ij>W;?RWFxSs6VRWEm9WclB#7I))| zc4Z(OSwbh$zmGJb-pT*ci+VY6Hglm4L+h#qIvO4>+5hY#9+%KnB+HS!qjN8$IqMp{ zP=o;gyn~EABAy>~x=*$B+ImtolDC^p`NYjXw*~TZp&zz1@})7Ph5e_`BvIB)mxf(; zfdclo(~32BqF&biul(voQO)x%Gs_@LKkh3#ya%(=3?8J^{&1N;STpX zBSm6C51Ym_*?a>{76Tx{>@S2{s~FM(Mb`^n6Da(G8=wSvm!BQC>g9|byAi!G;EPXepkJDrJJ8DySFmJ;tKIFBxQsfDq0 z(YDu)HnYc;2vYoQQrcoEL}IMOrN;(}k+_p-pR6NkN(@I^dtkl1P_+@Z1|F^N7^I-& ze<@D0=lpUQox49xP?rzz($AoLkV*(P=Ocg`?M9Xt5hpg3zmG3N&vYfFnzDiK9@yq7 zcx=a+yN%Xt0rLk40xsK!a&upz$)z_CBa_8`hQPn)QJ#Z!F8Cz^=#fW%*A%-;1dCii z4a5M46!L^D*DRsu0S$XZ$B_0QHC{3=ex@O=4jK)`)zq}MxVIqgh6&jg4bhU^TriN; z&^EX$bMNXaJ65$&;~v|U#4{jb43&$OCAWV2&>#~AF#*xizZR)fqJFHQFR67p0z{C2 zaWH}e>(&zPz$N-Ft%tt>`YqswtU?j@QhFo+0cJ6$EC$|kYwubH=_y|^2g?S8N%IjY zg;dg35v@qpUbpPF=@-{*gJQt1y@nA*tHp=hz1g1LfPyY`Q3KZqT06i5vGK92VOOv9SCG+ zMM;9Og3(GU5Q<;)KNp&uuVB7hb5Q4cRwEVcB7h@`&Aj5Wz-Kd7G1W=~uI{0}@|(kJ z!>VMVefGv1FA*}<2lGQ&YLtGhPHpp?;@^*4ml6WXwpRA(Q4R%<{p1QsEE+yzXki?l z57jX#)1bdL1XoCuf=na9*O1E*6NFJSlmNr72Zo-%<@fVdt&cZPD@-Cq)QSwfirE1# znqyUqJ|jiHUM5NygW9)>!4s)zuiu-fINsbOHTx|kjs=Oex1TWM$y&S$b4^#Rky*>n^geIy`YGvT>^`(sK2t$B!(F!)6tHu^e!q%H4xadKrh3Y7<5aI;R zj$S9$t2*p396CX^xouo-<@SweZ_cam!l9AV-qZQ$GH~t=04K4R2v%r+(FU08c`tM~ z2IN2@;(i!OwI>syl?vV~2iGRAB(h2m6pq*q*si{@alTr_IIS9h2h*Ukvw-Px6Z&_fEMR0CZ6vXEvC&up6Pj0f&nYHCl7Pn zY7um1zsS#BZCV;deq3A)fIUnM-E>q}M}5eQt7kwcpHk2~U-T94K8*YR4%z7@3K3j5 z{X226Nl8L4w9`y7SE%FSO3SCc-kp-h8zj}jV<_?0^ENJ!ls_`#a5;~&Z@hLlef#S} zrnT%}EoD<>=e-ulzlN`do5OX0QwBj?AnLt1b{eH7$3=S=NRTgK0CC`Tgp_itdQ*bSV)~Y-v5?}z9(D2#wn(o%{Ld-LWcKNhdzEYRVYFzV=V77w0ib21 z#vuM(jfX5nrNV1APO`3!h(W(Q$Ipmy%oO6b3GY*w;fsPiMwY;UR`In6`$7=nxLe=T zu*K6cT1YexG3I)IA5YI2GQRo8g=M|4q5#*r$-qz`yc2CDx{nZbGPWO}PLOkeQTW)n zusj5s!;DYP*tEmE)S{Y6veL&}uV;!rh@QCyP9frXk#ghG8Ne^;Z9%>k9SuPF{pDAI zyf>}p!sbb+>@GGL>3cj87EX7(tuH z)p-4k1rN9Rf)K+o4_%iBQAi=$l&{TN0S&sdSOM~LZ8(HUE)y~vK61R#9)TjPDCX*O zw+Pq1!kGpdarYvw8NQ)hfVZ?Cp42pZJ*~ucA^V_jPH9W>wZa2nmACnzSI{cVP+>Es z(ls1Fr~&hDZ4&yf{HlT<|1!m3$85>18jk*jIes?2QK&5-7%n0;sar(}PSwQot-S$) zp5EJ{-2oVtn9#U)PSgn#D+*rRKhmd`tIH?oD>0Vw4+HXwWHA`$cm4IRV#h;0ku8GD4 z)G4ZPsFf|}zuKF+Ragpc{Nd2Vo<=3L2hT9sTK>}Tj#@hLMqmdZ0@D8%0~w}i{|i_Y zVoXn70X}%fLwc=CV~kN3mNn0%&MQF-`dFp0Q>jj0p9>dC$2sW1Z_?U(wV>kALaPJi zGod54gxQT3BpGtYD_8`iV@d&bL_{tUBfR(XSq>BM8EFNG zMxa#m>0T**Z0}OU=6+pc%AIZe0GpKDVr(VnAGXm-qy>)XDRkT1=;DU1G$b|U-DVEQ zbj{vm^Q??LOu%5F8{p^u`g1vNwTe8G1ls%@V-J5@4CbfJ>Y8~@3_YnXqAtr%?PBn86saIV0)rKGpZ zq?D$EK7p9nTg9y?9ltMWY6mCfmc_ZuWhmW>2CF-i-bOvYwwP)wGA-E)E{FL2V51a7O`~~Q`4vU&HS@o0T#sB)ftoj0=07~UV*d^fsnY)Gik}`Oh|m(n$%iFCp8dO{sm9c&ieM-^NWDydJ%10no8N8fE= zg4rktiE{&Npb~iG!XM&SVrke_|8s|=-@#8u3oiC~p=}-CmRaxphI3gkv7B$Ykp$^@ zCHZp&&1SM4@5^mLuzwpfNJvI+YOtEza4c_um_C2St&v+euto3m#F`%8l}>s7q|K`$ zy5cgg5k{6WlvTK+pbdHjc&p0s@5c}!7ipPRgDkipM!?)TA47pElCu(U%Sv8h*R!?V zsSOvQ-@RorIH3>&V(VQP^`jd_*X7jxDbh}1TRtJqbl<%3%ucXrjc0wvlC(jC%>>(HyGGh_lc9sl>{B;r8H0Wz| zj3|8=5K;D~1kPlPek+nJu)dX4vl;|Jm==WkD9?_ah!>03eDi|eTV08>b*q0x)lVU1 znhFr`h1HjBKSg4KHB35TgTZzE{WfH*g6ed_fbehd5+qSoh-m>)i)bR^6D7$vT}VT)?zO>FQCm5|O<0pcK;0`*3R|$=@#9Bw1nPUS>}I`qza}S+i!@PAc5n0ePCZ*&+*`0P za#t2*aHQq~eaRLwR5;A!{0H87-|lw5Q9Ny`hpR5iNyQ|G&uD~#7V8dv9+=N3(zD)T z4QY(OdeS)XxSC+tA+6&U(s#wumt+w=v!0>&fKJjKm&P@B=mg)FB9$=#x!Uf{qGwTf zj{zJb5ESe|eT^bC2W_zAS!)Z-H~&hwLIuJ)5xEmB?g*{>}CCqSL`INl!|MX47RVQODcFonJW8gi*hG%eDGuWY{mQ1i%5_oWw_ z{$n;1AoUX@1>p%(qsz4Fz8Q)NX1vzy&7&TZP=bn##Jnpu z`kLL$m2v{fXZO&$l}5s6FU+~h8+W7h<*k%`grVRN06&0tv~m-5e8wphd1LXJBn^SC z{$wQYui((K8&KLu^s@gL%o~vlMezt5>={(1;6`6)Mnr_aiefZr!9*L#8ZO~V``EFN zrasS*Z%x@kBB8C~U+5LVunWyvxYFbvC-(`>sKweGUCHgWueeg`@7ohajcMb;X3kHp z#<84HJ=2>xwEUo5Aq9!wRPhNC|5AR6qyae?DJsbXWki$)M@XWANj-!eWWOAQFaFQR3`B1g|p z)H5}RDT{i)2mae*P=Wa@t~XY^QDj!SWP2S6GyRRP)sKaG0OG}*1IO!l667syC=WHl zp(m8ZZ6LvDV)g4RQ=5UYXQc4?i}T>SC5WU}Jm;t*6@S-2(=m)iu8Ed=-NYds_`JYZ zQ*0k#tZAs%!9NgJ8}T*5(sr4327}2Ip`EY*lsE-BalX+7ZTRQAIBgf22p$RAO_*GP z2U(^Z8SNBzA9S#{?OsdF@_tU7NW9?vu|9I%}Ry+HC zL(&BAww?%+O+$VaXp=m_+${d2u%W0cPh$TGM%rk1#7B1a^vwe7q&OY;XodTuUfxC3 zbjwca;NXK58wTQMFkn{_RAf|5ib{qH@J8`GdTG!8D<@Bb&ivT== zv0YINaa!PSQwzRUXZUXuk;&S&7&zP>Vn}d@3f>{*1seDaxK&C<>sqMbC(a>r9Pd{8 z3Fchtm4IB(KPH?A_HkQv{;^_31<23tb!^ZGS0e9-g4W(y*d8O)f%*Hwg4i76(ZG+onl5~EergVm>YAL|sT>P{X%v%RHkuB=;xK%3ixQ`I z`;q+K-QQN@H!mxCmlD@MAwqMb?Vo-az;eLADf=#yeC$P=-Npc(6G!|1+;Wvs}o#i_D zL-%BcmrE7Jk~2w+Y8Xw0emIjM@=n`tEXYKyiQ#RtwQ}iP*lnPO2n^pCxU7%)+Ep1Z-Ip$dk R)I9>EH849OcfvuD0008$dA$Gt literal 0 HcmV?d00001 From bcbd8dbd9353967bc600e1c77d4079452170191c Mon Sep 17 00:00:00 2001 From: Bruno Roemers Date: Thu, 28 Apr 2022 12:28:44 +0200 Subject: [PATCH 083/343] 91070: Fix tests (add missing dependencies to testbed) --- .../journal/journal.component.spec.ts | 24 ++++++++++++++----- .../publication/publication.component.spec.ts | 24 ++++++++++++++----- .../item-types/shared/item.component.spec.ts | 24 ++++++++++++++----- 3 files changed, 54 insertions(+), 18 deletions(-) diff --git a/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.spec.ts b/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.spec.ts index 0e756b7dc9..3ed73e7891 100644 --- a/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.spec.ts +++ b/src/app/entity-groups/journal-entities/item-pages/journal/journal.component.spec.ts @@ -29,6 +29,11 @@ import { TruncatableService } from '../../../../shared/truncatable/truncatable.s import { TruncatePipe } from '../../../../shared/utils/truncate.pipe'; import { JournalComponent } from './journal.component'; import { RouteService } from '../../../../core/services/route.service'; +import { RouterTestingModule } from '@angular/router/testing'; +import { VersionHistoryDataService } from '../../../../core/data/version-history-data.service'; +import { VersionDataService } from '../../../../core/data/version-data.service'; +import { WorkspaceitemDataService } from '../../../../core/submission/workspaceitem-data.service'; +import { SearchService } from '../../../../core/shared/search/search.service'; let comp: JournalComponent; let fixture: ComponentFixture; @@ -65,12 +70,15 @@ describe('JournalComponent', () => { }; beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ - imports: [TranslateModule.forRoot({ - loader: { - provide: TranslateLoader, - useClass: TranslateLoaderMock - } - })], + imports: [ + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useClass: TranslateLoaderMock + } + }), + RouterTestingModule, + ], declarations: [JournalComponent, GenericItemPageFieldComponent, TruncatePipe], providers: [ { provide: ItemDataService, useValue: {} }, @@ -86,7 +94,11 @@ describe('JournalComponent', () => { { provide: DSOChangeAnalyzer, useValue: {} }, { provide: NotificationsService, useValue: {} }, { provide: DefaultChangeAnalyzer, useValue: {} }, + { provide: VersionHistoryDataService, useValue: {} }, + { provide: VersionDataService, useValue: {} }, { provide: BitstreamDataService, useValue: mockBitstreamDataService }, + { provide: WorkspaceitemDataService, useValue: {} }, + { provide: SearchService, useValue: {} }, { provide: RouteService, useValue: {} } ], diff --git a/src/app/item-page/simple/item-types/publication/publication.component.spec.ts b/src/app/item-page/simple/item-types/publication/publication.component.spec.ts index 761849f232..404890e36d 100644 --- a/src/app/item-page/simple/item-types/publication/publication.component.spec.ts +++ b/src/app/item-page/simple/item-types/publication/publication.component.spec.ts @@ -33,6 +33,11 @@ import { import { PublicationComponent } from './publication.component'; import { createPaginatedList } from '../../../../shared/testing/utils.test'; import { RouteService } from '../../../../core/services/route.service'; +import { VersionHistoryDataService } from '../../../../core/data/version-history-data.service'; +import { VersionDataService } from '../../../../core/data/version-data.service'; +import { RouterTestingModule } from '@angular/router/testing'; +import { WorkspaceitemDataService } from '../../../../core/submission/workspaceitem-data.service'; +import { SearchService } from '../../../../core/shared/search/search.service'; const iiifEnabledMap: MetadataMap = { 'dspace.iiif.enabled': [iiifEnabled], @@ -64,12 +69,15 @@ describe('PublicationComponent', () => { } }; TestBed.configureTestingModule({ - imports: [TranslateModule.forRoot({ - loader: { - provide: TranslateLoader, - useClass: TranslateLoaderMock - } - })], + imports: [ + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useClass: TranslateLoaderMock + } + }), + RouterTestingModule, + ], declarations: [PublicationComponent, GenericItemPageFieldComponent, TruncatePipe], providers: [ { provide: ItemDataService, useValue: {} }, @@ -85,7 +93,11 @@ describe('PublicationComponent', () => { { provide: HttpClient, useValue: {} }, { provide: DSOChangeAnalyzer, useValue: {} }, { provide: DefaultChangeAnalyzer, useValue: {} }, + { provide: VersionHistoryDataService, useValue: {} }, + { provide: VersionDataService, useValue: {} }, { provide: BitstreamDataService, useValue: mockBitstreamDataService }, + { provide: WorkspaceitemDataService, useValue: {} }, + { provide: SearchService, useValue: {} }, { provide: RouteService, useValue: mockRouteService } ], diff --git a/src/app/item-page/simple/item-types/shared/item.component.spec.ts b/src/app/item-page/simple/item-types/shared/item.component.spec.ts index fc07f60b28..01e3115db1 100644 --- a/src/app/item-page/simple/item-types/shared/item.component.spec.ts +++ b/src/app/item-page/simple/item-types/shared/item.component.spec.ts @@ -32,6 +32,11 @@ import { ItemComponent } from './item.component'; import { createPaginatedList } from '../../../../shared/testing/utils.test'; import { RouteService } from '../../../../core/services/route.service'; import { MetadataValue } from '../../../../core/shared/metadata.models'; +import { WorkspaceitemDataService } from '../../../../core/submission/workspaceitem-data.service'; +import { SearchService } from '../../../../core/shared/search/search.service'; +import { VersionDataService } from '../../../../core/data/version-data.service'; +import { VersionHistoryDataService } from '../../../../core/data/version-history-data.service'; +import { RouterTestingModule } from '@angular/router/testing'; export const iiifEnabled = Object.assign(new MetadataValue(),{ 'value': 'true', @@ -70,12 +75,15 @@ export function getItemPageFieldsTest(mockItem: Item, component) { } }; TestBed.configureTestingModule({ - imports: [TranslateModule.forRoot({ - loader: { - provide: TranslateLoader, - useClass: TranslateLoaderMock - } - })], + imports: [ + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useClass: TranslateLoaderMock + } + }), + RouterTestingModule, + ], declarations: [component, GenericItemPageFieldComponent, TruncatePipe], providers: [ { provide: ItemDataService, useValue: {} }, @@ -89,9 +97,13 @@ export function getItemPageFieldsTest(mockItem: Item, component) { { provide: HALEndpointService, useValue: {} }, { provide: HttpClient, useValue: {} }, { provide: DSOChangeAnalyzer, useValue: {} }, + { provide: VersionHistoryDataService, useValue: {} }, + { provide: VersionDataService, useValue: {} }, { provide: NotificationsService, useValue: {} }, { provide: DefaultChangeAnalyzer, useValue: {} }, { provide: BitstreamDataService, useValue: mockBitstreamDataService }, + { provide: WorkspaceitemDataService, useValue: {} }, + { provide: SearchService, useValue: {} }, { provide: RouteService, useValue: {} } ], From 63de6139a310ee0f84ba1228269a5708ee593d0e Mon Sep 17 00:00:00 2001 From: Yura Bondarenko Date: Thu, 28 Apr 2022 14:06:38 +0200 Subject: [PATCH 084/343] 90978: Upgrade compression-webpack-plugin --- package.json | 2 +- yarn.lock | 15 ++++++--------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index b84d9e29a9..3981b449cf 100644 --- a/package.json +++ b/package.json @@ -154,7 +154,7 @@ "@typescript-eslint/eslint-plugin": "5.11.0", "@typescript-eslint/parser": "5.11.0", "axe-core": "^4.3.3", - "compression-webpack-plugin": "^6.1.1", + "compression-webpack-plugin": "^9.2.0", "copy-webpack-plugin": "^6.4.1", "cross-env": "^7.0.3", "css-loader": "^6.2.0", diff --git a/yarn.lock b/yarn.lock index c715667a18..b817a2a8de 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4111,16 +4111,13 @@ compressible@~2.0.16: dependencies: mime-db ">= 1.43.0 < 2" -compression-webpack-plugin@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/compression-webpack-plugin/-/compression-webpack-plugin-6.1.1.tgz#ae8e4b2ffdb7396bb776e66918d751a20d8ccf0e" - integrity sha512-BEHft9M6lwOqVIQFMS/YJGmeCYXVOakC5KzQk05TFpMBlODByh1qNsZCWjUBxCQhUP9x0WfGidxTbGkjbWO/TQ== +compression-webpack-plugin@^9.2.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/compression-webpack-plugin/-/compression-webpack-plugin-9.2.0.tgz#57fd539d17c5907eebdeb4e83dcfe2d7eceb9ef6" + integrity sha512-R/Oi+2+UHotGfu72fJiRoVpuRifZT0tTC6UqFD/DUo+mv8dbOow9rVOuTvDv5nPPm3GZhHL/fKkwxwIHnJ8Nyw== dependencies: - cacache "^15.0.5" - find-cache-dir "^3.3.1" - schema-utils "^3.0.0" - serialize-javascript "^5.0.1" - webpack-sources "^1.4.3" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" compression@^1.7.4: version "1.7.4" From 34be1179ab29ac264ecd8f0585de152dc4b155b9 Mon Sep 17 00:00:00 2001 From: Yura Bondarenko Date: Thu, 28 Apr 2022 14:49:34 +0200 Subject: [PATCH 085/343] Fix unused import --- src/modules/app/server-app.module.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/modules/app/server-app.module.ts b/src/modules/app/server-app.module.ts index fc7f903088..2b10e919eb 100644 --- a/src/modules/app/server-app.module.ts +++ b/src/modules/app/server-app.module.ts @@ -3,7 +3,6 @@ import { APP_INITIALIZER, NgModule } from '@angular/core'; import { BrowserModule, TransferState } from '@angular/platform-browser'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { ServerModule } from '@angular/platform-server'; -import { RouterModule } from '@angular/router'; import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; From a754a20ec6d7ca96a4b93421cf333dbdcb002ffa Mon Sep 17 00:00:00 2001 From: Rezart Vata Date: Thu, 28 Apr 2022 18:12:15 +0200 Subject: [PATCH 086/343] [CST-5270] Fixing ISSN removal and unit testing --- .../objects/submission-objects.effects.ts | 67 ++++++++------- .../section-sherpa-policies.component.html | 81 ++++++++++--------- .../section-sherpa-policies.component.spec.ts | 9 ++- .../section-sherpa-policies.component.ts | 24 ++++-- 4 files changed, 103 insertions(+), 78 deletions(-) diff --git a/src/app/submission/objects/submission-objects.effects.ts b/src/app/submission/objects/submission-objects.effects.ts index e79670306f..0c5f3fb61b 100644 --- a/src/app/submission/objects/submission-objects.effects.ts +++ b/src/app/submission/objects/submission-objects.effects.ts @@ -2,7 +2,7 @@ import { Injectable } from '@angular/core'; import { Actions, createEffect, ofType } from '@ngrx/effects'; import { Store } from '@ngrx/store'; import { TranslateService } from '@ngx-translate/core'; -import { isEqual, union } from 'lodash'; +import { isEqual, isUndefined, union } from 'lodash'; import { from as observableFrom, Observable, of as observableOf } from 'rxjs'; import { catchError, filter, map, mergeMap, switchMap, take, tap, withLatestFrom } from 'rxjs/operators'; @@ -43,7 +43,7 @@ import { UpdateSectionDataAction, UpdateSectionDataSuccessAction } from './submission-objects.actions'; -import { SubmissionObjectEntry} from './submission-objects.reducer'; +import { SubmissionObjectEntry } from './submission-objects.reducer'; import { Item } from '../../core/shared/item.model'; import { RemoteData } from '../../core/data/remote-data'; import { getFirstSucceededRemoteDataPayload } from '../../core/shared/operators'; @@ -60,7 +60,7 @@ export class SubmissionObjectEffects { /** * Dispatch a [InitSectionAction] for every submission sections and dispatch a [CompleteInitSubmissionFormAction] */ - loadForm$ = createEffect(() => this.actions$.pipe( + loadForm$ = createEffect(() => this.actions$.pipe( ofType(SubmissionObjectActionTypes.INIT_SUBMISSION_FORM), map((action: InitSubmissionFormAction) => { const definition = action.payload.submissionDefinition; @@ -104,7 +104,7 @@ export class SubmissionObjectEffects { /** * Dispatch a [InitSubmissionFormAction] */ - resetForm$ = createEffect(() => this.actions$.pipe( + resetForm$ = createEffect(() => this.actions$.pipe( ofType(SubmissionObjectActionTypes.RESET_SUBMISSION_FORM), map((action: ResetSubmissionFormAction) => new InitSubmissionFormAction( @@ -120,35 +120,35 @@ export class SubmissionObjectEffects { /** * Dispatch a [SaveSubmissionFormSuccessAction] or a [SaveSubmissionFormErrorAction] on error */ - saveSubmission$ = createEffect(() => this.actions$.pipe( + saveSubmission$ = createEffect(() => this.actions$.pipe( ofType(SubmissionObjectActionTypes.SAVE_SUBMISSION_FORM), switchMap((action: SaveSubmissionFormAction) => { return this.operationsService.jsonPatchByResourceType( this.submissionService.getSubmissionObjectLinkName(), action.payload.submissionId, 'sections').pipe( - map((response: SubmissionObject[]) => new SaveSubmissionFormSuccessAction(action.payload.submissionId, response, action.payload.isManual, action.payload.isManual)), - catchError(() => observableOf(new SaveSubmissionFormErrorAction(action.payload.submissionId)))); + map((response: SubmissionObject[]) => new SaveSubmissionFormSuccessAction(action.payload.submissionId, response, action.payload.isManual, action.payload.isManual)), + catchError(() => observableOf(new SaveSubmissionFormErrorAction(action.payload.submissionId)))); }))); /** * Dispatch a [SaveForLaterSubmissionFormSuccessAction] or a [SaveSubmissionFormErrorAction] on error */ - saveForLaterSubmission$ = createEffect(() => this.actions$.pipe( + saveForLaterSubmission$ = createEffect(() => this.actions$.pipe( ofType(SubmissionObjectActionTypes.SAVE_FOR_LATER_SUBMISSION_FORM), switchMap((action: SaveForLaterSubmissionFormAction) => { return this.operationsService.jsonPatchByResourceType( this.submissionService.getSubmissionObjectLinkName(), action.payload.submissionId, 'sections').pipe( - map((response: SubmissionObject[]) => new SaveForLaterSubmissionFormSuccessAction(action.payload.submissionId, response)), - catchError(() => observableOf(new SaveSubmissionFormErrorAction(action.payload.submissionId)))); + map((response: SubmissionObject[]) => new SaveForLaterSubmissionFormSuccessAction(action.payload.submissionId, response)), + catchError(() => observableOf(new SaveSubmissionFormErrorAction(action.payload.submissionId)))); }))); /** * Call parseSaveResponse and dispatch actions */ - saveSubmissionSuccess$ = createEffect(() => this.actions$.pipe( + saveSubmissionSuccess$ = createEffect(() => this.actions$.pipe( ofType(SubmissionObjectActionTypes.SAVE_SUBMISSION_FORM_SUCCESS), withLatestFrom(this.store$), map(([action, currentState]: [SaveSubmissionFormSuccessAction, any]) => { @@ -162,7 +162,7 @@ export class SubmissionObjectEffects { * Call parseSaveResponse and dispatch actions. * Notification system is forced to be disabled. */ - saveSubmissionSectionSuccess$ = createEffect(() => this.actions$.pipe( + saveSubmissionSectionSuccess$ = createEffect(() => this.actions$.pipe( ofType(SubmissionObjectActionTypes.SAVE_SUBMISSION_SECTION_FORM_SUCCESS), withLatestFrom(this.store$), map(([action, currentState]: [SaveSubmissionSectionFormSuccessAction, any]) => { @@ -174,7 +174,7 @@ export class SubmissionObjectEffects { /** * Dispatch a [SaveSubmissionSectionFormSuccessAction] or a [SaveSubmissionSectionFormErrorAction] on error */ - saveSection$ = createEffect(() => this.actions$.pipe( + saveSection$ = createEffect(() => this.actions$.pipe( ofType(SubmissionObjectActionTypes.SAVE_SUBMISSION_SECTION_FORM), switchMap((action: SaveSubmissionSectionFormAction) => { return this.operationsService.jsonPatchByResourceID( @@ -182,14 +182,14 @@ export class SubmissionObjectEffects { action.payload.submissionId, 'sections', action.payload.sectionId).pipe( - map((response: SubmissionObject[]) => new SaveSubmissionSectionFormSuccessAction(action.payload.submissionId, response)), - catchError(() => observableOf(new SaveSubmissionSectionFormErrorAction(action.payload.submissionId)))); + map((response: SubmissionObject[]) => new SaveSubmissionSectionFormSuccessAction(action.payload.submissionId, response)), + catchError(() => observableOf(new SaveSubmissionSectionFormErrorAction(action.payload.submissionId)))); }))); /** * Show a notification on error */ - saveError$ = createEffect(() => this.actions$.pipe( + saveError$ = createEffect(() => this.actions$.pipe( ofType(SubmissionObjectActionTypes.SAVE_SUBMISSION_FORM_ERROR, SubmissionObjectActionTypes.SAVE_SUBMISSION_SECTION_FORM_ERROR), withLatestFrom(this.store$), tap(() => this.notificationsService.error(null, this.translate.get('submission.sections.general.save_error_notice')))), { dispatch: false }); @@ -197,7 +197,7 @@ export class SubmissionObjectEffects { /** * Call parseSaveResponse and dispatch actions or dispatch [SaveSubmissionFormErrorAction] on error */ - saveAndDeposit$ = createEffect(() => this.actions$.pipe( + saveAndDeposit$ = createEffect(() => this.actions$.pipe( ofType(SubmissionObjectActionTypes.SAVE_AND_DEPOSIT_SUBMISSION), withLatestFrom(this.submissionService.hasUnsavedModification()), switchMap(([action, hasUnsavedModification]: [SaveAndDepositSubmissionAction, boolean]) => { @@ -233,7 +233,7 @@ export class SubmissionObjectEffects { /** * Dispatch a [DepositSubmissionSuccessAction] or a [DepositSubmissionErrorAction] on error */ - depositSubmission$ = createEffect(() => this.actions$.pipe( + depositSubmission$ = createEffect(() => this.actions$.pipe( ofType(SubmissionObjectActionTypes.DEPOSIT_SUBMISSION), withLatestFrom(this.store$), switchMap(([action, state]: [DepositSubmissionAction, any]) => { @@ -245,7 +245,7 @@ export class SubmissionObjectEffects { /** * Show a notification on success and redirect to MyDSpace page */ - saveForLaterSubmissionSuccess$ = createEffect(() => this.actions$.pipe( + saveForLaterSubmissionSuccess$ = createEffect(() => this.actions$.pipe( ofType(SubmissionObjectActionTypes.SAVE_FOR_LATER_SUBMISSION_FORM_SUCCESS), tap(() => this.notificationsService.success(null, this.translate.get('submission.sections.general.save_success_notice'))), tap(() => this.submissionService.redirectToMyDSpace())), { dispatch: false }); @@ -253,7 +253,7 @@ export class SubmissionObjectEffects { /** * Show a notification on success and redirect to MyDSpace page */ - depositSubmissionSuccess$ = createEffect(() => this.actions$.pipe( + depositSubmissionSuccess$ = createEffect(() => this.actions$.pipe( ofType(SubmissionObjectActionTypes.DEPOSIT_SUBMISSION_SUCCESS), tap(() => this.notificationsService.success(null, this.translate.get('submission.sections.general.deposit_success_notice'))), tap(() => this.submissionService.redirectToMyDSpace())), { dispatch: false }); @@ -261,14 +261,14 @@ export class SubmissionObjectEffects { /** * Show a notification on error */ - depositSubmissionError$ = createEffect(() => this.actions$.pipe( + depositSubmissionError$ = createEffect(() => this.actions$.pipe( ofType(SubmissionObjectActionTypes.DEPOSIT_SUBMISSION_ERROR), tap(() => this.notificationsService.error(null, this.translate.get('submission.sections.general.deposit_error_notice')))), { dispatch: false }); /** * Dispatch a [DiscardSubmissionSuccessAction] or a [DiscardSubmissionErrorAction] on error */ - discardSubmission$ = createEffect(() => this.actions$.pipe( + discardSubmission$ = createEffect(() => this.actions$.pipe( ofType(SubmissionObjectActionTypes.DISCARD_SUBMISSION), switchMap((action: DepositSubmissionAction) => { return this.submissionService.discardSubmission(action.payload.submissionId).pipe( @@ -279,7 +279,7 @@ export class SubmissionObjectEffects { /** * Adds all metadata an item to the SubmissionForm sections of the submission */ - addAllMetadataToSectionData = createEffect(() => this.actions$.pipe( + addAllMetadataToSectionData = createEffect(() => this.actions$.pipe( ofType(SubmissionObjectActionTypes.UPDATE_SECTION_DATA), switchMap((action: UpdateSectionDataAction) => { return this.sectionService.getSectionState(action.payload.submissionId, action.payload.sectionId, SectionsType.Upload) @@ -320,18 +320,18 @@ export class SubmissionObjectEffects { /** * Show a notification on error */ - discardSubmissionError$ = createEffect(() => this.actions$.pipe( + discardSubmissionError$ = createEffect(() => this.actions$.pipe( ofType(SubmissionObjectActionTypes.DISCARD_SUBMISSION_ERROR), tap(() => this.notificationsService.error(null, this.translate.get('submission.sections.general.discard_error_notice')))), { dispatch: false }); constructor(private actions$: Actions, - private notificationsService: NotificationsService, - private operationsService: SubmissionJsonPatchOperationsService, - private sectionService: SectionsService, - private store$: Store, - private submissionService: SubmissionService, - private submissionObjectService: SubmissionObjectDataService, - private translate: TranslateService) { + private notificationsService: NotificationsService, + private operationsService: SubmissionJsonPatchOperationsService, + private sectionService: SectionsService, + private store$: Store, + private submissionService: SubmissionService, + private submissionObjectService: SubmissionObjectDataService, + private translate: TranslateService) { } /** @@ -426,6 +426,11 @@ export class SubmissionObjectEffects { mappedActions.push(new UpdateSectionDataAction(submissionId, sectionId, sectionData, filteredErrors, sectionErrors)); } }); + let currentStateId = currentState.selfUrl.split('/')[currentState.selfUrl.split('/').length - 1]; + let currentResponseItem = response.find(item => item.id.toString() === currentStateId); + if (!isUndefined(currentState.sections.sherpaPolicies?.data) && isUndefined(currentResponseItem.sections.sherpaPolicies)) { + mappedActions.push(new UpdateSectionDataAction(submissionId, 'sherpaPolicies', null, [], [])); + } } return mappedActions; } diff --git a/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.html b/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.html index 94553dd4c3..b7b24ffcf0 100644 --- a/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.html +++ b/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.html @@ -1,57 +1,62 @@ -
    +
    - - - -
    - - -
    - {{'submission.sections.sherpa.publication.information' - | translate}} -
    - - - -
    - - + + +
    - - + +
    - {{'submission.sections.sherpa.publisher.policy' + {{'submission.sections.sherpa.publication.information' | translate}}
    - +
    + + + +
    + + +
    + {{'submission.sections.sherpa.publisher.policy' + | translate}} +
    + + + +
    +
    + + +
    + + +
    + {{'submission.sections.sherpa.record.information' + | translate}} +
    + + + +
    - - -
    - - -
    - {{'submission.sections.sherpa.record.information' - | translate}} -
    - - - -
    -
    + \ No newline at end of file diff --git a/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.spec.ts b/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.spec.ts index fb8f8ba355..0637745939 100644 --- a/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.spec.ts +++ b/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.spec.ts @@ -1,7 +1,8 @@ +import { SharedModule } from './../../../shared/shared.module'; import { NgbAccordionModule } from '@ng-bootstrap/ng-bootstrap'; import { SubmissionServiceStub } from '../../../shared/testing/submission-service.stub'; import { SherpaDataResponse } from '../../../shared/mocks/section-sherpa-policies.service.mock'; -import { ComponentFixture, inject, TestBed } from '@angular/core/testing'; +import { ComponentFixture, inject, TestBed, fakeAsync, tick } from '@angular/core/testing'; import { SectionsService } from '../sections.service'; import { SectionsServiceStub } from '../../../shared/testing/sections-service.stub'; @@ -58,7 +59,8 @@ describe('SubmissionSectionSherpaPoliciesComponent', () => { useClass: TranslateLoaderMock } }), - NgbAccordionModule + NgbAccordionModule, + SharedModule ], declarations: [SubmissionSectionSherpaPoliciesComponent], providers: [ @@ -77,7 +79,7 @@ describe('SubmissionSectionSherpaPoliciesComponent', () => { fixture = TestBed.createComponent(SubmissionSectionSherpaPoliciesComponent); component = fixture.componentInstance; de = fixture.debugElement; - sectionsServiceStub.getSectionData.and.returnValue(observableOf(SherpaDataResponse)) + sectionsServiceStub.getSectionData.and.returnValue(observableOf(SherpaDataResponse)); fixture.detectChanges(); })); @@ -112,7 +114,6 @@ describe('SubmissionSectionSherpaPoliciesComponent', () => { it('when refresh button click operationsBuilder.remove should have been called', () => { de.query(By.css('.refresh-container > button')).nativeElement.click(); - fixture.detectChanges(); expect(operationsBuilder.remove).toHaveBeenCalled(); }); diff --git a/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.ts b/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.ts index d287a182ba..a56eb5f663 100644 --- a/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.ts +++ b/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.ts @@ -1,6 +1,6 @@ import { Component, Inject, QueryList, ViewChildren } from '@angular/core'; -import { BehaviorSubject, Observable, of, Subscription } from 'rxjs'; +import { BehaviorSubject, interval, Observable, of, Subscription } from 'rxjs'; import { JsonPatchOperationPathCombiner } from '../../../core/json-patch/builder/json-patch-operation-path-combiner'; import { JsonPatchOperationsBuilder } from '../../../core/json-patch/builder/json-patch-operations-builder'; @@ -14,6 +14,7 @@ import { SectionsService } from '../sections.service'; import { SectionModelComponent } from '../models/section.model'; import { SubmissionService } from '../../submission.service'; import { hasValue, isEmpty } from '../../../shared/empty.util'; +import { debounce, debounceTime, timeInterval } from 'rxjs/operators'; /** * This component represents a section for managing item's access conditions. @@ -77,9 +78,11 @@ export class SubmissionSectionSherpaPoliciesComponent extends SectionModelCompon * Expand all primary accordions */ ngAfterViewInit() { - this.acc.forEach(accordion => { - accordion.expandAll(); - }); + if (this.acc) { + this.acc.forEach(accordion => { + accordion.expandAll(); + }); + } } @@ -93,9 +96,20 @@ export class SubmissionSectionSherpaPoliciesComponent extends SectionModelCompon this.sectionService.getSectionData(this.submissionId, this.sectionData.id, this.sectionData.sectionType) .subscribe((sherpaPolicies: WorkspaceitemSectionSherpaPoliciesObject) => { this.sherpaPoliciesData$.next(sherpaPolicies); - console.log(this.sherpaPoliciesData$.value) }) ); + + this.subs.push( + this.sherpaPoliciesData$.pipe( + debounceTime(500) + ).subscribe((sherpaPolicies: WorkspaceitemSectionSherpaPoliciesObject) => { + if (this.acc) { + this.acc.forEach(accordion => { + accordion.expandAll(); + }); + } + }) + ); } /** From 64f3af7a1b34a63d7e0d57b5e9c3011b12056a9e Mon Sep 17 00:00:00 2001 From: Rezart Vata Date: Thu, 28 Apr 2022 18:35:04 +0200 Subject: [PATCH 087/343] [CST-5253] Added unit testing --- .../item-from-workspace.resolver.spec.ts | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 src/app/workspaceitems-edit-page/item-from-workspace.resolver.spec.ts diff --git a/src/app/workspaceitems-edit-page/item-from-workspace.resolver.spec.ts b/src/app/workspaceitems-edit-page/item-from-workspace.resolver.spec.ts new file mode 100644 index 0000000000..c14344d70d --- /dev/null +++ b/src/app/workspaceitems-edit-page/item-from-workspace.resolver.spec.ts @@ -0,0 +1,36 @@ +import { first } from 'rxjs/operators'; +import { WorkspaceitemDataService } from '../core/submission/workspaceitem-data.service'; +import { createSuccessfulRemoteDataObject$ } from '../shared/remote-data.utils'; +import { ItemFromWorkspaceResolver } from './item-from-workspace.resolver'; + +describe('ItemFromWorkspaceResolver', () => { + describe('resolve', () => { + let resolver: ItemFromWorkspaceResolver; + let wfiService: WorkspaceitemDataService; + const uuid = '1234-65487-12354-1235'; + const itemUuid = '8888-8888-8888-8888'; + const wfi = { + id: uuid, + item: createSuccessfulRemoteDataObject$({ id: itemUuid }) + }; + + + beforeEach(() => { + wfiService = { + findById: (id: string) => createSuccessfulRemoteDataObject$(wfi) + } as any; + resolver = new ItemFromWorkspaceResolver(wfiService, null); + }); + + it('should resolve a an item from from the workflow item with the correct id', (done) => { + resolver.resolve({ params: { id: uuid } } as any, undefined) + .pipe(first()) + .subscribe( + (resolved) => { + expect(resolved.payload.id).toEqual(itemUuid); + done(); + } + ); + }); + }); +}); From b023a5a03c428faffd64eff771811f59bc94fd25 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Thu, 28 Apr 2022 18:58:35 +0200 Subject: [PATCH 088/343] [CST-5270] Fix submission-objects.effects sherpa romeo customization --- .../objects/submission-objects.effects.ts | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/app/submission/objects/submission-objects.effects.ts b/src/app/submission/objects/submission-objects.effects.ts index 0c5f3fb61b..4a7907cab1 100644 --- a/src/app/submission/objects/submission-objects.effects.ts +++ b/src/app/submission/objects/submission-objects.effects.ts @@ -2,7 +2,7 @@ import { Injectable } from '@angular/core'; import { Actions, createEffect, ofType } from '@ngrx/effects'; import { Store } from '@ngrx/store'; import { TranslateService } from '@ngx-translate/core'; -import { isEqual, isUndefined, union } from 'lodash'; +import { findKey, isEqual, union } from 'lodash'; import { from as observableFrom, Observable, of as observableOf } from 'rxjs'; import { catchError, filter, map, mergeMap, switchMap, take, tap, withLatestFrom } from 'rxjs/operators'; @@ -425,12 +425,15 @@ export class SubmissionObjectEffects { const filteredErrors = filterErrors(sectionForm, sectionErrors, currentState.sections[sectionId].sectionType, showErrors); mappedActions.push(new UpdateSectionDataAction(submissionId, sectionId, sectionData, filteredErrors, sectionErrors)); } + + // Sherpa Policies section needs to be updated when the rest response section is empty + const sherpaPoliciesSectionId = findKey(currentState.sections, (section) => section.sectionType === SectionsType.SherpaPolicies); + if (isNotUndefined(sherpaPoliciesSectionId) && isNotEmpty(currentState.sections[sherpaPoliciesSectionId]?.data) + && isEmpty(sections[sherpaPoliciesSectionId])) { + mappedActions.push(new UpdateSectionDataAction(submissionId, sherpaPoliciesSectionId, null, [], [])); + } }); - let currentStateId = currentState.selfUrl.split('/')[currentState.selfUrl.split('/').length - 1]; - let currentResponseItem = response.find(item => item.id.toString() === currentStateId); - if (!isUndefined(currentState.sections.sherpaPolicies?.data) && isUndefined(currentResponseItem.sections.sherpaPolicies)) { - mappedActions.push(new UpdateSectionDataAction(submissionId, 'sherpaPolicies', null, [], [])); - } + } return mappedActions; } From d435d8eeb1762acd2d03893858609f42b29a9f9a Mon Sep 17 00:00:00 2001 From: Rezart Vata Date: Thu, 28 Apr 2022 19:07:38 +0200 Subject: [PATCH 089/343] [CST-5270] Fixed graphical changes requested --- .../content-accordion.component.html | 4 +-- .../section-sherpa-policies.component.html | 34 +++++++++---------- .../section-sherpa-policies.component.scss | 2 +- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/app/submission/sections/sherpa-policies/content-accordion/content-accordion.component.html b/src/app/submission/sections/sherpa-policies/content-accordion/content-accordion.component.html index bec999603d..c2d7207c98 100644 --- a/src/app/submission/sections/sherpa-policies/content-accordion/content-accordion.component.html +++ b/src/app/submission/sections/sherpa-policies/content-accordion/content-accordion.component.html @@ -6,8 +6,8 @@ translate }}
    - - + +
    diff --git a/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.html b/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.html index b7b24ffcf0..f74e38bf8f 100644 --- a/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.html +++ b/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.html @@ -12,15 +12,15 @@ -
    - - -
    {{'submission.sections.sherpa.publication.information' | translate}} +
    + + +
    @@ -29,15 +29,15 @@ -
    - - -
    {{'submission.sections.sherpa.publisher.policy' | translate}} +
    + + +
    @@ -47,12 +47,12 @@
    -
    - - -
    - {{'submission.sections.sherpa.record.information' + {{'submission.sections.sherpa.record.information' | translate}} +
    + + +
    diff --git a/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.scss b/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.scss index 5a8e0e3c34..adaa627d56 100644 --- a/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.scss +++ b/src/app/submission/sections/sherpa-policies/section-sherpa-policies.component.scss @@ -12,7 +12,7 @@ button { text-align: left; padding: 0px; - width: auto; + // width: auto; font-weight: bold; .fas { From 7bbce89b40f46b268203d7a30335328f66f1f89c Mon Sep 17 00:00:00 2001 From: Michael Spalti Date: Thu, 28 Apr 2022 14:26:35 -0700 Subject: [PATCH 090/343] Fixes search passthrough to Mirador and adds tests. --- .../publication/publication.component.spec.ts | 121 ++++++++++++------ .../item-types/shared/item-iiif-utils.ts | 9 +- .../item-types/shared/item.component.spec.ts | 34 ++--- .../untyped-item.component.spec.ts | 86 +++++++++---- 4 files changed, 168 insertions(+), 82 deletions(-) diff --git a/src/app/item-page/simple/item-types/publication/publication.component.spec.ts b/src/app/item-page/simple/item-types/publication/publication.component.spec.ts index 761849f232..7c63fabb47 100644 --- a/src/app/item-page/simple/item-types/publication/publication.component.spec.ts +++ b/src/app/item-page/simple/item-types/publication/publication.component.spec.ts @@ -1,6 +1,6 @@ import { HttpClient } from '@angular/common/http'; import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { ComponentFixture, fakeAsync, TestBed, tick, waitForAsync } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { Store } from '@ngrx/store'; import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; @@ -17,7 +17,7 @@ import { RemoteData } from '../../../../core/data/remote-data'; import { Bitstream } from '../../../../core/shared/bitstream.model'; import { HALEndpointService } from '../../../../core/shared/hal-endpoint.service'; import { Item } from '../../../../core/shared/item.model'; -import { MetadataMap } from '../../../../core/shared/metadata.models'; +import { MetadataMap, MetadataValue } from '../../../../core/shared/metadata.models'; import { UUIDService } from '../../../../core/shared/uuid.service'; import { TranslateLoaderMock } from '../../../../shared/mocks/translate-loader.mock'; import { NotificationsService } from '../../../../shared/notifications/notifications.service'; @@ -26,22 +26,12 @@ import { TruncatableService } from '../../../../shared/truncatable/truncatable.s import { TruncatePipe } from '../../../../shared/utils/truncate.pipe'; import { GenericItemPageFieldComponent } from '../../field-components/specific-field/generic/generic-item-page-field.component'; import { - createRelationshipsObservable, - iiifEnabled, - iiifSearchEnabled, mockRouteService + createRelationshipsObservable, getIIIFEnabled, getIIIFSearchEnabled, mockRouteService } from '../shared/item.component.spec'; import { PublicationComponent } from './publication.component'; import { createPaginatedList } from '../../../../shared/testing/utils.test'; import { RouteService } from '../../../../core/services/route.service'; - -const iiifEnabledMap: MetadataMap = { - 'dspace.iiif.enabled': [iiifEnabled], -}; - -const iiifEnabledWithSearchMap: MetadataMap = { - 'dspace.iiif.enabled': [iiifEnabled], - 'iiif.search.enabled': [iiifSearchEnabled], -}; +import { UntypedItemComponent } from '../untyped-item/untyped-item.component'; const noMetadata = new MetadataMap(); @@ -72,31 +62,32 @@ describe('PublicationComponent', () => { })], declarations: [PublicationComponent, GenericItemPageFieldComponent, TruncatePipe], providers: [ - { provide: ItemDataService, useValue: {} }, - { provide: TruncatableService, useValue: {} }, - { provide: RelationshipService, useValue: {} }, - { provide: ObjectCacheService, useValue: {} }, - { provide: UUIDService, useValue: {} }, - { provide: Store, useValue: {} }, - { provide: RemoteDataBuildService, useValue: {} }, - { provide: CommunityDataService, useValue: {} }, - { provide: HALEndpointService, useValue: {} }, - { provide: NotificationsService, useValue: {} }, - { provide: HttpClient, useValue: {} }, - { provide: DSOChangeAnalyzer, useValue: {} }, - { provide: DefaultChangeAnalyzer, useValue: {} }, - { provide: BitstreamDataService, useValue: mockBitstreamDataService }, - { provide: RouteService, useValue: mockRouteService } + {provide: ItemDataService, useValue: {}}, + {provide: TruncatableService, useValue: {}}, + {provide: RelationshipService, useValue: {}}, + {provide: ObjectCacheService, useValue: {}}, + {provide: UUIDService, useValue: {}}, + {provide: Store, useValue: {}}, + {provide: RemoteDataBuildService, useValue: {}}, + {provide: CommunityDataService, useValue: {}}, + {provide: HALEndpointService, useValue: {}}, + {provide: NotificationsService, useValue: {}}, + {provide: HttpClient, useValue: {}}, + {provide: DSOChangeAnalyzer, useValue: {}}, + {provide: DefaultChangeAnalyzer, useValue: {}}, + {provide: BitstreamDataService, useValue: mockBitstreamDataService}, + {provide: RouteService, useValue: mockRouteService} ], schemas: [NO_ERRORS_SCHEMA] }).overrideComponent(PublicationComponent, { - set: { changeDetection: ChangeDetectionStrategy.Default } - }).compileComponents(); + set: {changeDetection: ChangeDetectionStrategy.Default} + }); })); describe('default view', () => { beforeEach(waitForAsync(() => { + TestBed.compileComponents(); fixture = TestBed.createComponent(PublicationComponent); comp = fixture.componentInstance; comp.object = getItem(noMetadata); @@ -137,6 +128,42 @@ describe('PublicationComponent', () => { describe('with IIIF viewer', () => { beforeEach(waitForAsync(() => { + const iiifEnabledMap: MetadataMap = { + 'dspace.iiif.enabled': [getIIIFEnabled(true)], + 'iiif.search.enabled': [getIIIFSearchEnabled(false)], + }; + TestBed.compileComponents(); + fixture = TestBed.createComponent(PublicationComponent); + comp = fixture.componentInstance; + comp.object = getItem(iiifEnabledMap); + fixture.detectChanges(); + })); + + it('should contain an iiif viewer component', () => { + const fields = fixture.debugElement.queryAll(By.css('ds-mirador-viewer')); + expect(fields.length).toBeGreaterThanOrEqual(1); + }); + it('should not retrieve the query term for previous route', fakeAsync((): void => { + //tick(10) + expect(comp.iiifQuery$).toBeFalsy(); + })); + + }); + + describe('with IIIF viewer and search', () => { + + beforeEach(waitForAsync(() => { + const localMockRouteService = { + getPreviousUrl(): Observable { + return of('/search?query=test') + } + }; + const iiifEnabledMap: MetadataMap = { + 'dspace.iiif.enabled': [getIIIFEnabled(true)], + 'iiif.search.enabled': [getIIIFSearchEnabled(true)], + }; + TestBed.overrideProvider(RouteService, {useValue: localMockRouteService}); + TestBed.compileComponents(); fixture = TestBed.createComponent(PublicationComponent); comp = fixture.componentInstance; comp.object = getItem(iiifEnabledMap); @@ -148,15 +175,30 @@ describe('PublicationComponent', () => { expect(fields.length).toBeGreaterThanOrEqual(1); }); + it('should retrieve the query term for previous route', fakeAsync((): void => { + //tick(10) + expect(comp.iiifQuery$.subscribe(result => expect(result).toEqual('test'))); + })) + }); - describe('with IIIF viewer and search', () => { + describe('with IIIF viewer and search but no previous search query', () => { beforeEach(waitForAsync(() => { - mockRouteService.getPreviousUrl.and.returnValue(of(['/search?q=bird&motivation=painting','/item'])); + const localMockRouteService = { + getPreviousUrl(): Observable { + return of('/item') + } + }; + const iiifEnabledMap: MetadataMap = { + 'dspace.iiif.enabled': [getIIIFEnabled(true)], + 'iiif.search.enabled': [getIIIFSearchEnabled(true)], + }; + TestBed.overrideProvider(RouteService, {useValue: localMockRouteService}); + TestBed.compileComponents(); fixture = TestBed.createComponent(PublicationComponent); comp = fixture.componentInstance; - comp.object = getItem(iiifEnabledWithSearchMap); + comp.object = getItem(iiifEnabledMap); fixture.detectChanges(); })); @@ -165,11 +207,12 @@ describe('PublicationComponent', () => { expect(fields.length).toBeGreaterThanOrEqual(1); }); - it('should call the RouteService getHistory method', () => { - expect(mockRouteService.getPreviousUrl).toHaveBeenCalled(); - }); + it('should not retrieve the query term for previous route', fakeAsync( () => { + let emitted; + comp.iiifQuery$.subscribe(result => emitted = result); + tick(10) + expect(emitted).toBeUndefined(); + })); }); - }); - diff --git a/src/app/item-page/simple/item-types/shared/item-iiif-utils.ts b/src/app/item-page/simple/item-types/shared/item-iiif-utils.ts index eb7b30eb56..45bba1e569 100644 --- a/src/app/item-page/simple/item-types/shared/item-iiif-utils.ts +++ b/src/app/item-page/simple/item-types/shared/item-iiif-utils.ts @@ -1,6 +1,6 @@ import { Item } from '../../../../core/shared/item.model'; import { Observable } from 'rxjs'; -import { filter, map } from 'rxjs/operators'; +import { filter, map, take } from 'rxjs/operators'; import { RouteService } from '../../../../core/services/route.service'; export const isIiifEnabled = (item: Item) => { @@ -26,10 +26,9 @@ export const getDSpaceQuery = (item: Item, routeService: RouteService): Observab return r.includes('/search'); }), map(r => { - const arr = r.split('&'); - const q = arr[1]; - const v = q.split('='); + const v = r.split('query='); return v[1]; - }) + }), + take(1) ); }; diff --git a/src/app/item-page/simple/item-types/shared/item.component.spec.ts b/src/app/item-page/simple/item-types/shared/item.component.spec.ts index fc07f60b28..96c5bd5106 100644 --- a/src/app/item-page/simple/item-types/shared/item.component.spec.ts +++ b/src/app/item-page/simple/item-types/shared/item.component.spec.ts @@ -4,7 +4,7 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { Store } from '@ngrx/store'; import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; -import { Observable } from 'rxjs'; +import { Observable, of } from 'rxjs'; import { RemoteDataBuildService } from '../../../../core/cache/builders/remote-data-build.service'; import { ObjectCacheService } from '../../../../core/cache/object-cache.service'; import { BitstreamDataService } from '../../../../core/data/bitstream-data.service'; @@ -33,21 +33,25 @@ import { createPaginatedList } from '../../../../shared/testing/utils.test'; import { RouteService } from '../../../../core/services/route.service'; import { MetadataValue } from '../../../../core/shared/metadata.models'; -export const iiifEnabled = Object.assign(new MetadataValue(),{ - 'value': 'true', - 'language': null, - 'authority': null, - 'confidence': -1, - 'place': 0 -}); +export function getIIIFSearchEnabled(enabled: boolean): MetadataValue { + return Object.assign(new MetadataValue(), { + 'value': enabled, + 'language': null, + 'authority': null, + 'confidence': -1, + 'place': 0 + }); +} -export const iiifSearchEnabled = Object.assign(new MetadataValue(), { - 'value': 'true', - 'language': null, - 'authority': null, - 'confidence': -1, - 'place': 0 -}); +export function getIIIFEnabled(enabled: boolean): MetadataValue { + return Object.assign(new MetadataValue(), { + 'value': enabled, + 'language': null, + 'authority': null, + 'confidence': -1, + 'place': 0 + }); +} export const mockRouteService = jasmine.createSpyObj('RouteService', ['getPreviousUrl']); diff --git a/src/app/item-page/simple/item-types/untyped-item/untyped-item.component.spec.ts b/src/app/item-page/simple/item-types/untyped-item/untyped-item.component.spec.ts index efbb4672a5..b5ac779086 100644 --- a/src/app/item-page/simple/item-types/untyped-item/untyped-item.component.spec.ts +++ b/src/app/item-page/simple/item-types/untyped-item/untyped-item.component.spec.ts @@ -1,10 +1,10 @@ import { HttpClient } from '@angular/common/http'; import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core'; -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { ComponentFixture, fakeAsync, TestBed, tick, waitForAsync } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { Store } from '@ngrx/store'; import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; -import { Observable } from 'rxjs'; +import { Observable, of } from 'rxjs'; import { RemoteDataBuildService } from '../../../../core/cache/builders/remote-data-build.service'; import { ObjectCacheService } from '../../../../core/cache/object-cache.service'; import { BitstreamDataService } from '../../../../core/data/bitstream-data.service'; @@ -26,13 +26,10 @@ import { TruncatableService } from '../../../../shared/truncatable/truncatable.s import { TruncatePipe } from '../../../../shared/utils/truncate.pipe'; import { GenericItemPageFieldComponent } from '../../field-components/specific-field/generic/generic-item-page-field.component'; import { - createRelationshipsObservable, - iiifEnabled, - iiifSearchEnabled, mockRouteService + createRelationshipsObservable, getIIIFEnabled, getIIIFSearchEnabled, mockRouteService } from '../shared/item.component.spec'; import { UntypedItemComponent } from './untyped-item.component'; import { RouteService } from '../../../../core/services/route.service'; -import { of } from 'rxjs'; import { createPaginatedList } from '../../../../shared/testing/utils.test'; import { VersionHistoryDataService } from '../../../../core/data/version-history-data.service'; import { VersionDataService } from '../../../../core/data/version-data.service'; @@ -41,16 +38,6 @@ import { WorkspaceitemDataService } from '../../../../core/submission/workspacei import { SearchService } from '../../../../core/shared/search/search.service'; import { ItemVersionsSharedService } from '../../../../shared/item/item-versions/item-versions-shared.service'; - -const iiifEnabledMap: MetadataMap = { - 'dspace.iiif.enabled': [iiifEnabled], -}; - -const iiifEnabledWithSearchMap: MetadataMap = { - 'dspace.iiif.enabled': [iiifEnabled], - 'iiif.search.enabled': [iiifSearchEnabled], -}; - const noMetadata = new MetadataMap(); function getItem(metadata: MetadataMap) { @@ -108,11 +95,12 @@ describe('UntypedItemComponent', () => { schemas: [NO_ERRORS_SCHEMA] }).overrideComponent(UntypedItemComponent, { set: {changeDetection: ChangeDetectionStrategy.Default} - }).compileComponents(); + }); })); describe('default view', () => { beforeEach(waitForAsync(() => { + TestBed.compileComponents(); fixture = TestBed.createComponent(UntypedItemComponent); comp = fixture.componentInstance; comp.object = getItem(noMetadata); @@ -159,6 +147,41 @@ describe('UntypedItemComponent', () => { describe('with IIIF viewer', () => { beforeEach(waitForAsync(() => { + const iiifEnabledMap: MetadataMap = { + 'dspace.iiif.enabled': [getIIIFEnabled(true)], + 'iiif.search.enabled': [getIIIFSearchEnabled(false)], + }; + TestBed.compileComponents(); + fixture = TestBed.createComponent(UntypedItemComponent); + comp = fixture.componentInstance; + comp.object = getItem(iiifEnabledMap); + fixture.detectChanges(); + })); + + it('should contain an iiif viewer component', () => { + const fields = fixture.debugElement.queryAll(By.css('ds-mirador-viewer')); + expect(fields.length).toBeGreaterThanOrEqual(1); + }); + it('should not retrieve the query term for previous route', (): void => { + expect(comp.iiifQuery$).toBeFalsy(); + }); + + }); + + describe('with IIIF viewer and search', () => { + + beforeEach(waitForAsync(() => { + const localMockRouteService = { + getPreviousUrl(): Observable { + return of('/search?query=test') + } + }; + const iiifEnabledMap: MetadataMap = { + 'dspace.iiif.enabled': [getIIIFEnabled(true)], + 'iiif.search.enabled': [getIIIFSearchEnabled(true)], + }; + TestBed.overrideProvider(RouteService, {useValue: localMockRouteService}); + TestBed.compileComponents(); fixture = TestBed.createComponent(UntypedItemComponent); comp = fixture.componentInstance; comp.object = getItem(iiifEnabledMap); @@ -170,15 +193,29 @@ describe('UntypedItemComponent', () => { expect(fields.length).toBeGreaterThanOrEqual(1); }); + it('should retrieve the query term for previous route', (): void => { + expect(comp.iiifQuery$.subscribe(result => expect(result).toEqual('test'))); + }); + }); - describe('with IIIF viewer and search', () => { + describe('with IIIF viewer and search but no previous search query', () => { beforeEach(waitForAsync(() => { - mockRouteService.getPreviousUrl.and.returnValue(of(['/search?q=bird&motivation=painting','/item'])); + const localMockRouteService = { + getPreviousUrl(): Observable { + return of('/item') + } + }; + const iiifEnabledMap: MetadataMap = { + 'dspace.iiif.enabled': [getIIIFEnabled(true)], + 'iiif.search.enabled': [getIIIFSearchEnabled(true)], + }; + TestBed.overrideProvider(RouteService, {useValue: localMockRouteService}); + TestBed.compileComponents(); fixture = TestBed.createComponent(UntypedItemComponent); comp = fixture.componentInstance; - comp.object = getItem(iiifEnabledWithSearchMap); + comp.object = getItem(iiifEnabledMap); fixture.detectChanges(); })); @@ -187,9 +224,12 @@ describe('UntypedItemComponent', () => { expect(fields.length).toBeGreaterThanOrEqual(1); }); - it('should call the RouteService getHistory method', () => { - expect(mockRouteService.getPreviousUrl).toHaveBeenCalled(); - }); + it('should not retrieve the query term for previous route', fakeAsync( () => { + let emitted; + comp.iiifQuery$.subscribe(result => emitted = result); + tick(10) + expect(emitted).toBeUndefined() + })); }); From 58b8ba3aa7a5a8274e9731fea6cc158373d93d2e Mon Sep 17 00:00:00 2001 From: Michael Spalti Date: Thu, 28 Apr 2022 17:01:59 -0700 Subject: [PATCH 091/343] Lint errors. --- .../item-types/publication/publication.component.spec.ts | 8 ++++---- .../untyped-item/untyped-item.component.spec.ts | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/app/item-page/simple/item-types/publication/publication.component.spec.ts b/src/app/item-page/simple/item-types/publication/publication.component.spec.ts index 7c63fabb47..772a83d93e 100644 --- a/src/app/item-page/simple/item-types/publication/publication.component.spec.ts +++ b/src/app/item-page/simple/item-types/publication/publication.component.spec.ts @@ -155,7 +155,7 @@ describe('PublicationComponent', () => { beforeEach(waitForAsync(() => { const localMockRouteService = { getPreviousUrl(): Observable { - return of('/search?query=test') + return of('/search?query=test'); } }; const iiifEnabledMap: MetadataMap = { @@ -178,7 +178,7 @@ describe('PublicationComponent', () => { it('should retrieve the query term for previous route', fakeAsync((): void => { //tick(10) expect(comp.iiifQuery$.subscribe(result => expect(result).toEqual('test'))); - })) + })); }); @@ -187,7 +187,7 @@ describe('PublicationComponent', () => { beforeEach(waitForAsync(() => { const localMockRouteService = { getPreviousUrl(): Observable { - return of('/item') + return of('/item'); } }; const iiifEnabledMap: MetadataMap = { @@ -210,7 +210,7 @@ describe('PublicationComponent', () => { it('should not retrieve the query term for previous route', fakeAsync( () => { let emitted; comp.iiifQuery$.subscribe(result => emitted = result); - tick(10) + tick(10); expect(emitted).toBeUndefined(); })); diff --git a/src/app/item-page/simple/item-types/untyped-item/untyped-item.component.spec.ts b/src/app/item-page/simple/item-types/untyped-item/untyped-item.component.spec.ts index b5ac779086..308129892a 100644 --- a/src/app/item-page/simple/item-types/untyped-item/untyped-item.component.spec.ts +++ b/src/app/item-page/simple/item-types/untyped-item/untyped-item.component.spec.ts @@ -173,7 +173,7 @@ describe('UntypedItemComponent', () => { beforeEach(waitForAsync(() => { const localMockRouteService = { getPreviousUrl(): Observable { - return of('/search?query=test') + return of('/search?query=test'); } }; const iiifEnabledMap: MetadataMap = { @@ -204,7 +204,7 @@ describe('UntypedItemComponent', () => { beforeEach(waitForAsync(() => { const localMockRouteService = { getPreviousUrl(): Observable { - return of('/item') + return of('/item'); } }; const iiifEnabledMap: MetadataMap = { @@ -227,8 +227,8 @@ describe('UntypedItemComponent', () => { it('should not retrieve the query term for previous route', fakeAsync( () => { let emitted; comp.iiifQuery$.subscribe(result => emitted = result); - tick(10) - expect(emitted).toBeUndefined() + tick(10); + expect(emitted).toBeUndefined(); })); }); From 2b7ed5c25800662fb3412f074ab2e337bf8d7183 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Fri, 29 Apr 2022 09:15:20 +0200 Subject: [PATCH 092/343] [CST-5253] Add view item button for workflow items --- .../workflowitem/workflowitem-actions.component.html | 5 +++++ .../workflowitem/workflowitem-actions.component.spec.ts | 7 +++++++ .../workflowitem/workflowitem-actions.component.ts | 8 ++++++++ 3 files changed, 20 insertions(+) diff --git a/src/app/shared/mydspace-actions/workflowitem/workflowitem-actions.component.html b/src/app/shared/mydspace-actions/workflowitem/workflowitem-actions.component.html index e69de29bb2..f6e5fecb50 100644 --- a/src/app/shared/mydspace-actions/workflowitem/workflowitem-actions.component.html +++ b/src/app/shared/mydspace-actions/workflowitem/workflowitem-actions.component.html @@ -0,0 +1,5 @@ + diff --git a/src/app/shared/mydspace-actions/workflowitem/workflowitem-actions.component.spec.ts b/src/app/shared/mydspace-actions/workflowitem/workflowitem-actions.component.spec.ts index 046eb2f018..79aece892e 100644 --- a/src/app/shared/mydspace-actions/workflowitem/workflowitem-actions.component.spec.ts +++ b/src/app/shared/mydspace-actions/workflowitem/workflowitem-actions.component.spec.ts @@ -18,6 +18,7 @@ import { getMockRequestService } from '../../mocks/request.service.mock'; import { RequestService } from '../../../core/data/request.service'; import { getMockSearchService } from '../../mocks/search-service.mock'; import { SearchService } from '../../../core/shared/search/search.service'; +import { By } from '@angular/platform-browser'; let component: WorkflowitemActionsComponent; let fixture: ComponentFixture; @@ -105,4 +106,10 @@ describe('WorkflowitemActionsComponent', () => { expect(component.object).toEqual(mockObject); }); + it('should display view button', () => { + const btn = fixture.debugElement.query(By.css('button [data-test="view-btn"]')); + + expect(btn).toBeDefined(); + }); + }); diff --git a/src/app/shared/mydspace-actions/workflowitem/workflowitem-actions.component.ts b/src/app/shared/mydspace-actions/workflowitem/workflowitem-actions.component.ts index 62a23ba66e..3587356642 100644 --- a/src/app/shared/mydspace-actions/workflowitem/workflowitem-actions.component.ts +++ b/src/app/shared/mydspace-actions/workflowitem/workflowitem-actions.component.ts @@ -9,6 +9,7 @@ import { WorkflowItemDataService } from '../../../core/submission/workflowitem-d import { NotificationsService } from '../../notifications/notifications.service'; import { RequestService } from '../../../core/data/request.service'; import { SearchService } from '../../../core/shared/search/search.service'; +import { getWorkflowItemViewRoute } from '../../../workflowitems-edit-page/workflowitems-edit-page-routing-paths'; /** * This component represents actions related to WorkflowItem object. @@ -44,6 +45,13 @@ export class WorkflowitemActionsComponent extends MyDSpaceActionsComponent Date: Fri, 29 Apr 2022 09:16:03 +0200 Subject: [PATCH 093/343] [CST-5253] Fix detail visualization for archived item in the mydspace result list --- .../item-search-result-detail-element.component.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/app/shared/object-detail/my-dspace-result-detail-element/item-search-result/item-search-result-detail-element.component.ts b/src/app/shared/object-detail/my-dspace-result-detail-element/item-search-result/item-search-result-detail-element.component.ts index 7e611ec3c8..27a94b0cf5 100644 --- a/src/app/shared/object-detail/my-dspace-result-detail-element/item-search-result/item-search-result-detail-element.component.ts +++ b/src/app/shared/object-detail/my-dspace-result-detail-element/item-search-result/item-search-result-detail-element.component.ts @@ -3,9 +3,12 @@ import { Component } from '@angular/core'; import { ViewMode } from '../../../../core/shared/view-mode.model'; import { Item } from '../../../../core/shared/item.model'; import { SearchResultDetailElementComponent } from '../search-result-detail-element.component'; -import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type'; +import { + MyDspaceItemStatusType +} from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type'; import { listableObjectComponent } from '../../../object-collection/shared/listable-object/listable-object.decorator'; import { ItemSearchResult } from '../../../object-collection/shared/item-search-result.model'; +import { Context } from '../../../../core/shared/context.model'; /** * This component renders item object for the search result in the detail view. @@ -16,7 +19,8 @@ import { ItemSearchResult } from '../../../object-collection/shared/item-search- templateUrl: './item-search-result-detail-element.component.html' }) -@listableObjectComponent(Item, ViewMode.DetailedListElement) +@listableObjectComponent(ItemSearchResult, ViewMode.DetailedListElement, Context.Workspace) +@listableObjectComponent(ItemSearchResult, ViewMode.DetailedListElement, Context.Workflow) export class ItemSearchResultDetailElementComponent extends SearchResultDetailElementComponent { /** From d3ef3d30790a4ddb4a7ccf1ac5cf5e713c4e4e35 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Fri, 29 Apr 2022 09:17:17 +0200 Subject: [PATCH 094/343] [CST-5253] Change full-item-page.component in order to display also workspace items --- .../full/full-item-page.component.html | 28 ++++++++++--------- .../full/full-item-page.component.spec.ts | 4 +-- .../full/full-item-page.component.ts | 8 +++--- 3 files changed, 21 insertions(+), 19 deletions(-) diff --git a/src/app/item-page/full/full-item-page.component.html b/src/app/item-page/full/full-item-page.component.html index 7cc8ff92c4..042be3d8ce 100644 --- a/src/app/item-page/full/full-item-page.component.html +++ b/src/app/item-page/full/full-item-page.component.html @@ -12,26 +12,28 @@ [tooltipMsg]="'item.page.edit'">
  • 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 Ml^a<_0w90?*_T2xdH?_b literal 0 HcmV?d00001 diff --git a/src/themes/dspace/assets/images/banner-half.webp b/src/themes/dspace/assets/images/banner-half.webp new file mode 100644 index 0000000000000000000000000000000000000000..f11cfb78595dcbcb334d99a37fed480587fac13c GIT binary patch literal 156066 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�{ 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 z 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

    - -
    \ No newline at end of file +
    diff --git a/src/app/submission/sections/sherpa-policies/publication-information/publication-information.component.html b/src/app/submission/sections/sherpa-policies/publication-information/publication-information.component.html index 2e6da459ae..079535b2fb 100644 --- a/src/app/submission/sections/sherpa-policies/publication-information/publication-information.component.html +++ b/src/app/submission/sections/sherpa-policies/publication-information/publication-information.component.html @@ -1,8 +1,7 @@
    -

    {{'submission.sections.sherpa.publication.information.title' - | translate}}

    +

    {{'submission.sections.sherpa.publication.information.title' | translate}}

    {{title}} @@ -11,8 +10,7 @@

    -

    {{'submission.sections.sherpa.publication.information.issns' - | translate}}

    +

    {{'submission.sections.sherpa.publication.information.issns' | translate}}

    {{issn}} @@ -21,12 +19,11 @@

    -

    {{'submission.sections.sherpa.publication.information.url' - | translate}}

    +

    {{'submission.sections.sherpa.publication.information.url' | translate}}

    - + {{journal.url}}

    @@ -34,12 +31,11 @@
    -

    {{'submission.sections.sherpa.publication.information.publishers' - | translate}}

    +

    {{'submission.sections.sherpa.publication.information.publishers' | translate}}

    - + {{publisher.name}}

    @@ -47,8 +43,7 @@
    -

    {{'submission.sections.sherpa.publication.information.romeoPub' - | translate}}

    +

    {{'submission.sections.sherpa.publication.information.romeoPub' | translate}}

    @@ -58,8 +53,7 @@

    -

    {{'submission.sections.sherpa.publication.information.zetoPub' - | translate}}

    +

    {{'submission.sections.sherpa.publication.information.zetoPub' | translate}}

    @@ -67,4 +61,4 @@

    -
    \ No newline at end of file +
    diff --git a/src/app/submission/sections/sherpa-policies/publisher-policy/publisher-policy.component.html b/src/app/submission/sections/sherpa-policies/publisher-policy/publisher-policy.component.html index 4a03bae735..ada6613aa2 100644 --- a/src/app/submission/sections/sherpa-policies/publisher-policy/publisher-policy.component.html +++ b/src/app/submission/sections/sherpa-policies/publisher-policy/publisher-policy.component.html @@ -15,9 +15,9 @@

    -
    \ No newline at end of file +
    From aa7ceec15aaa331335a67e6d595c075d14918c25 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Fri, 29 Apr 2022 19:15:40 +0200 Subject: [PATCH 104/343] [CST-5738] Fix retrieving of embed from auth status model --- src/app/core/auth/auth-request.service.ts | 19 +++++++++++-------- src/app/core/auth/auth.service.ts | 3 ++- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/app/core/auth/auth-request.service.ts b/src/app/core/auth/auth-request.service.ts index 516502ca6e..d0fec5fa71 100644 --- a/src/app/core/auth/auth-request.service.ts +++ b/src/app/core/auth/auth-request.service.ts @@ -12,6 +12,7 @@ import { AuthStatus } from './models/auth-status.model'; import { ShortLivedToken } from './models/short-lived-token.model'; import { URLCombiner } from '../url-combiner/url-combiner'; import { RestRequest } from '../data/rest-request.model'; +import { FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; /** * Abstract service to send authentication requests @@ -26,16 +27,18 @@ export abstract class AuthRequestService { ) { } - protected fetchRequest(request: RestRequest): Observable> { - return this.rdbService.buildFromRequestUUID(request.uuid).pipe( + protected fetchRequest(request: RestRequest, ...linksToFollow: FollowLinkConfig[]): Observable> { + return this.rdbService.buildFromRequestUUID(request.uuid, ...linksToFollow).pipe( getFirstCompletedRemoteData(), ); } - protected getEndpointByMethod(endpoint: string, method: string, embed = false): string { + protected getEndpointByMethod(endpoint: string, method: string, ...linksToFollow: FollowLinkConfig[]): string { let url = isNotEmpty(method) ? `${endpoint}/${method}` : `${endpoint}`; - if (embed) { - url += '?embed=specialGroups'; + if (linksToFollow && linksToFollow.length > 0) { + linksToFollow.forEach((link: FollowLinkConfig, index: number) => { + url += ((index === 0) ? '?' : '&') + `embed=${link.name}`; + }); } return url; @@ -52,14 +55,14 @@ export abstract class AuthRequestService { distinctUntilChanged()); } - public getRequest(method: string, options?: HttpOptions, embed = false): Observable> { + public getRequest(method: string, options?: HttpOptions, ...linksToFollow: FollowLinkConfig[]): Observable> { return this.halService.getEndpoint(this.linkName).pipe( filter((href: string) => isNotEmpty(href)), - map((endpointURL) => this.getEndpointByMethod(endpointURL, method)), + map((endpointURL) => this.getEndpointByMethod(endpointURL, method, ...linksToFollow)), distinctUntilChanged(), map((endpointURL: string) => new GetRequest(this.requestService.generateRequestId(), endpointURL, undefined, options)), tap((request: GetRequest) => this.requestService.send(request)), - mergeMap((request: GetRequest) => this.fetchRequest(request)), + mergeMap((request: GetRequest) => this.fetchRequest(request, ...linksToFollow)), distinctUntilChanged()); } diff --git a/src/app/core/auth/auth.service.ts b/src/app/core/auth/auth.service.ts index 2d2c61490c..7796094e39 100644 --- a/src/app/core/auth/auth.service.ts +++ b/src/app/core/auth/auth.service.ts @@ -55,6 +55,7 @@ import { buildPaginatedList, PaginatedList } from '../data/paginated-list.model' import { Group } from '../eperson/models/group.model'; import { createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; import { PageInfo } from '../shared/page-info.model'; +import { followLink } from '../../shared/utils/follow-link-config.model'; export const LOGIN_ROUTE = '/login'; export const LOGOUT_ROUTE = '/logout'; @@ -219,7 +220,7 @@ export class AuthService { * Return the special groups list embedded in the AuthStatus model */ public getSpecialGroupsFromAuthStatus(): Observable>> { - return this.authRequestService.getRequest('status', null, true).pipe( + return this.authRequestService.getRequest('status', null, followLink('specialGroups')).pipe( getFirstCompletedRemoteData(), switchMap((status: RemoteData) => { if (status.hasSucceeded) { From 917e5fe5bc0fdee2f022892c6bfab795384578ba Mon Sep 17 00:00:00 2001 From: Marie Verdonck Date: Mon, 2 May 2022 14:55:23 +0200 Subject: [PATCH 105/343] Issue 1635: Fix for @input not working on search bar ds-search-form --- src/app/shared/search-form/search-form.component.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/app/shared/search-form/search-form.component.ts b/src/app/shared/search-form/search-form.component.ts index 2791aee378..cabcab4859 100644 --- a/src/app/shared/search-form/search-form.component.ts +++ b/src/app/shared/search-form/search-form.component.ts @@ -77,6 +77,9 @@ export class SearchFormComponent { * @param data Values submitted using the form */ onSubmit(data: any) { + if (isNotEmpty(this.scope)) { + data = Object.assign(data, { scope: this.scope }); + } this.updateSearch(data); this.submitSearch.emit(data); } From f3a40a5ef900b180d7e6c27e320df4c20753e7a6 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Mon, 2 May 2022 16:08:58 +0200 Subject: [PATCH 106/343] [CST-5239] Fix button visualization --- .../metadata-import-page.component.html | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/app/admin/admin-import-metadata-page/metadata-import-page.component.html b/src/app/admin/admin-import-metadata-page/metadata-import-page.component.html index fb96c4becd..2c710935d5 100644 --- a/src/app/admin/admin-import-metadata-page/metadata-import-page.component.html +++ b/src/app/admin/admin-import-metadata-page/metadata-import-page.component.html @@ -12,8 +12,10 @@ [dropMessageLabelReplacement]="'admin.metadata-import.page.dropMsgReplace'"> - - +
    + + +
    From bb3cc1c619dfe0e2f9a8bfb55380f8f5eb0671e9 Mon Sep 17 00:00:00 2001 From: Davide Negretti Date: Mon, 2 May 2022 17:02:04 +0200 Subject: [PATCH 107/343] [CST-5674] Edit policy target; modal content; test --- .../resource-policy.service.spec.ts | 8 ++- .../resource-policy.service.ts | 55 +++++++++++++++++-- .../edit/resource-policy-edit.component.ts | 33 +++++++---- .../form/resource-policy-form.component.html | 15 ++++- .../resource-policy-form.component.spec.ts | 13 +++-- .../form/resource-policy-form.component.ts | 5 ++ src/assets/i18n/en.json5 | 10 ++++ 7 files changed, 117 insertions(+), 22 deletions(-) diff --git a/src/app/core/resource-policy/resource-policy.service.spec.ts b/src/app/core/resource-policy/resource-policy.service.spec.ts index 59316c0098..ca62159f59 100644 --- a/src/app/core/resource-policy/resource-policy.service.spec.ts +++ b/src/app/core/resource-policy/resource-policy.service.spec.ts @@ -19,6 +19,8 @@ import { createSuccessfulRemoteDataObject } from '../../shared/remote-data.utils import { RestResponse } from '../cache/response.models'; import { RequestEntry } from '../data/request-entry.model'; import { FindListOptions } from '../data/find-list-options.model'; +import { EPersonDataService } from '../eperson/eperson-data.service'; +import { GroupDataService } from '../eperson/group-data.service'; describe('ResourcePolicyService', () => { let scheduler: TestScheduler; @@ -28,6 +30,8 @@ describe('ResourcePolicyService', () => { let objectCache: ObjectCacheService; let halService: HALEndpointService; let responseCacheEntry: RequestEntry; + let ePersonService: EPersonDataService; + let groupService: GroupDataService; const resourcePolicy: any = { id: '1', @@ -129,7 +133,9 @@ describe('ResourcePolicyService', () => { halService, notificationsService, http, - comparator + comparator, + ePersonService, + groupService ); spyOn((service as any).dataService, 'create').and.callThrough(); diff --git a/src/app/core/resource-policy/resource-policy.service.ts b/src/app/core/resource-policy/resource-policy.service.ts index 065e58c53d..f4f70a73e2 100644 --- a/src/app/core/resource-policy/resource-policy.service.ts +++ b/src/app/core/resource-policy/resource-policy.service.ts @@ -1,6 +1,6 @@ /* eslint-disable max-classes-per-file */ import { Injectable } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; import { Store } from '@ngrx/store'; import { Observable } from 'rxjs'; @@ -23,11 +23,19 @@ import { PaginatedList } from '../data/paginated-list.model'; import { ActionType } from './models/action-type.model'; import { RequestParam } from '../cache/models/request-param.model'; import { isNotEmpty } from '../../shared/empty.util'; -import { map } from 'rxjs/operators'; +import { map, switchMap, take } from 'rxjs/operators'; import { NoContent } from '../shared/NoContent.model'; import { getFirstCompletedRemoteData } from '../shared/operators'; import { CoreState } from '../core-state.model'; import { FindListOptions } from '../data/find-list-options.model'; +import { HttpOptions } from '../dspace-rest/dspace-rest.service'; +import { PostRequest } from '../data/request.models'; +import { GenericConstructor } from '../shared/generic-constructor'; +import { ResponseParsingService } from '../data/parsing.service'; +import { StatusCodeOnlyResponseParsingService } from '../data/status-code-only-response-parsing.service'; +import { HALLink } from '../shared/hal-link.model'; +import { EPersonDataService } from '../eperson/eperson-data.service'; +import { GroupDataService } from '../eperson/group-data.service'; /** @@ -44,7 +52,8 @@ class DataServiceImpl extends DataService { protected halService: HALEndpointService, protected notificationsService: NotificationsService, protected http: HttpClient, - protected comparator: ChangeAnalyzer) { + protected comparator: ChangeAnalyzer, + ) { super(); } @@ -68,7 +77,10 @@ export class ResourcePolicyService { protected halService: HALEndpointService, protected notificationsService: NotificationsService, protected http: HttpClient, - protected comparator: DefaultChangeAnalyzer) { + protected comparator: DefaultChangeAnalyzer, + protected ePersonService: EPersonDataService, + protected groupService: GroupDataService, + ) { this.dataService = new DataServiceImpl(requestService, rdbService, null, objectCache, halService, notificationsService, http, comparator); } @@ -221,4 +233,39 @@ export class ResourcePolicyService { return this.dataService.searchBy(this.searchByResourceMethod, options, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow); } + /** + * Update the target of the resource policy + * @param resourcePolicyHref the link to the resource policy + * @param uuid the UUID of the target to which the permission is being granted + * @param type the type of the target (eperson or group) to which the permission is being granted + */ + updateTarget(resourcePolicyHref: string, uuid: string, type: string): Observable> { + + const targetService = type === 'eperson' ? this.ePersonService : this.groupService; + + const ep$ = targetService.getBrowseEndpoint().pipe( + take(1), + map((endpoint: string) =>`${endpoint}/${uuid}`), + ); + + const options: HttpOptions = Object.create({}); + let headers = new HttpHeaders(); + headers = headers.append('Content-Type', 'text/uri-list'); + options.headers = headers; + + const requestId = this.requestService.generateRequestId(); + + return ep$.pipe(switchMap((ep) => { + const request = new PostRequest(requestId, resourcePolicyHref, ep, options); + Object.assign(request, { + getResponseParser(): GenericConstructor { + return StatusCodeOnlyResponseParsingService; + } + }); + this.requestService.send(request); + return this.rdbService.buildFromRequestUUID(requestId); + })); + + } + } diff --git a/src/app/shared/resource-policies/edit/resource-policy-edit.component.ts b/src/app/shared/resource-policies/edit/resource-policy-edit.component.ts index a515eef675..d2c1b6dd0d 100644 --- a/src/app/shared/resource-policies/edit/resource-policy-edit.component.ts +++ b/src/app/shared/resource-policies/edit/resource-policy-edit.component.ts @@ -1,7 +1,7 @@ import { Component, OnInit } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; -import { BehaviorSubject, Observable } from 'rxjs'; +import { BehaviorSubject, Observable, of, combineLatest as observableCombineLatest, } from 'rxjs'; import { map, take } from 'rxjs/operators'; import { TranslateService } from '@ngx-translate/core'; @@ -88,16 +88,29 @@ export class ResourcePolicyEditComponent implements OnInit { type: RESOURCE_POLICY.value, _links: this.resourcePolicy._links }); - this.resourcePolicyService.update(updatedObject).pipe( + + const updateTargetSucceeded$ = event.updateTarget ? this.resourcePolicyService.updateTarget( + this.resourcePolicy._links.self.href, event.target.uuid, event.target.type + ).pipe( getFirstCompletedRemoteData(), - ).subscribe((responseRD: RemoteData) => { - this.processing$.next(false); - if (responseRD && responseRD.hasSucceeded) { - this.notificationsService.success(null, this.translate.get('resource-policies.edit.page.success.content')); - this.redirectToAuthorizationsPage(); - } else { - this.notificationsService.error(null, this.translate.get('resource-policies.edit.page.failure.content')); + map((responseRD) => responseRD && responseRD.hasSucceeded) + ) : of(true); + + const updateResourcePolicySucceeded$ = this.resourcePolicyService.update(updatedObject).pipe( + getFirstCompletedRemoteData(), + map((responseRD) => responseRD && responseRD.hasSucceeded) + ); + + observableCombineLatest([updateTargetSucceeded$, updateResourcePolicySucceeded$]).subscribe( + ([updateTargetSucceeded, updateResourcePolicySucceeded]) => { + this.processing$.next(false); + if (updateTargetSucceeded && updateResourcePolicySucceeded) { + this.notificationsService.success(null, this.translate.get('resource-policies.edit.page.success.content')); + this.redirectToAuthorizationsPage(); + } else { + this.notificationsService.error(null, this.translate.get('resource-policies.edit.page.failure.content')); + } } - }); + ); } } diff --git a/src/app/shared/resource-policies/form/resource-policy-form.component.html b/src/app/shared/resource-policies/form/resource-policy-form.component.html index 821d15f414..f7aad55ce8 100644 --- a/src/app/shared/resource-policies/form/resource-policy-form.component.html +++ b/src/app/shared/resource-policies/form/resource-policy-form.component.html @@ -55,15 +55,24 @@ diff --git a/src/app/shared/resource-policies/form/resource-policy-form.component.spec.ts b/src/app/shared/resource-policies/form/resource-policy-form.component.spec.ts index c31a65c1f6..456eb6db5e 100644 --- a/src/app/shared/resource-policies/form/resource-policy-form.component.spec.ts +++ b/src/app/shared/resource-policies/form/resource-policy-form.component.spec.ts @@ -222,6 +222,8 @@ describe('ResourcePolicyFormComponent test suite', () => { testFixture = createTestComponent(html, TestComponent) as ComponentFixture; testComp = testFixture.componentInstance; + testComp.resourcePolicy = resourcePolicy; + fixture.detectChanges(); }); afterEach(() => { @@ -242,6 +244,7 @@ describe('ResourcePolicyFormComponent test suite', () => { fixture = TestBed.createComponent(ResourcePolicyFormComponent); comp = fixture.componentInstance; compAsAny = fixture.componentInstance; + compAsAny.resourcePolicy = resourcePolicy; comp.isProcessing = observableOf(false); }); @@ -261,7 +264,7 @@ describe('ResourcePolicyFormComponent test suite', () => { expect(compAsAny.buildResourcePolicyForm).toHaveBeenCalled(); expect(compAsAny.initModelsValue).toHaveBeenCalled(); expect(compAsAny.formModel.length).toBe(5); - expect(compAsAny.subs.length).toBe(0); + expect(compAsAny.subs.length).toBe(1); }); @@ -279,7 +282,7 @@ describe('ResourcePolicyFormComponent test suite', () => { expect(compAsAny.reset.emit).toHaveBeenCalled(); }); - it('should update resource policy grant object properly', () => { + it('should update resource policy grant object properly', () => { comp.updateObjectSelected(EPersonMock, true); expect(comp.resourcePolicyGrant).toEqual(EPersonMock); @@ -301,6 +304,7 @@ describe('ResourcePolicyFormComponent test suite', () => { comp = fixture.componentInstance; compAsAny = fixture.componentInstance; comp.resourcePolicy = resourcePolicy; + compAsAny.resourcePolicy = resourcePolicy; comp.isProcessing = observableOf(false); compAsAny.ePersonService.findByHref.and.returnValue( observableOf(createSuccessfulRemoteDataObject({})).pipe(delay(100)) @@ -343,8 +347,8 @@ describe('ResourcePolicyFormComponent test suite', () => { }); }); - it('should not can set grant', () => { - expect(comp.isBeingEdited()).toBeFalsy(); + it('should be being edited', () => { + expect(comp.isBeingEdited()).toBeTrue(); }); it('should have a target name', () => { @@ -398,6 +402,7 @@ describe('ResourcePolicyFormComponent test suite', () => { type: 'group', uuid: GroupMock.id }; + eventPayload.updateTarget = false; scheduler = getTestScheduler(); scheduler.schedule(() => comp.onSubmit()); diff --git a/src/app/shared/resource-policies/form/resource-policy-form.component.ts b/src/app/shared/resource-policies/form/resource-policy-form.component.ts index ea49433db0..2783200d8f 100644 --- a/src/app/shared/resource-policies/form/resource-policy-form.component.ts +++ b/src/app/shared/resource-policies/form/resource-policy-form.component.ts @@ -49,6 +49,7 @@ export interface ResourcePolicyEvent { type: string, uuid: string }; + updateTarget: boolean; } @Component({ @@ -130,6 +131,8 @@ export class ResourcePolicyFormComponent implements OnInit, OnDestroy { navActiveId: string; + resourcePolicyTargetUpdated = false; + /** * Initialize instance variables * @@ -278,6 +281,7 @@ export class ResourcePolicyFormComponent implements OnInit, OnDestroy { * Update reference to the eperson or group that will be granted the permission */ updateObjectSelected(object: DSpaceObject, isEPerson: boolean): void { + this.resourcePolicyTargetUpdated = true; this.resourcePolicyGrant = object; this.resourcePolicyGrantType = isEPerson ? 'eperson' : 'group'; this.resourcePolicyTargetName$.next(this.getResourcePolicyTargetName()); @@ -304,6 +308,7 @@ export class ResourcePolicyFormComponent implements OnInit, OnDestroy { type: this.resourcePolicyGrantType, uuid: this.resourcePolicyGrant.id }; + eventPayload.updateTarget = this.resourcePolicyTargetUpdated; this.submit.emit(eventPayload); }); } diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index a7ce942e7d..dfc715b72b 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -3136,6 +3136,16 @@ "resource-policies.form.eperson-group-list.table.headers.name": "Name", + "resource-policies.form.eperson-group-list.modal.header": "Cannot change type", + + "resource-policies.form.eperson-group-list.modal.text1.toGroup": "It is not possible to replace an ePerson with a group.", + + "resource-policies.form.eperson-group-list.modal.text1.toEPerson": "It is not possible to replace a group with an ePerson.", + + "resource-policies.form.eperson-group-list.modal.text2": "Delete the current resource policy and create a new one with the desired type.", + + "resource-policies.form.eperson-group-list.modal.close": "Ok", + "resource-policies.form.date.end.label": "End Date", "resource-policies.form.date.start.label": "Start Date", From 833637c215afa64389a6ee47738ee27d6907f4b6 Mon Sep 17 00:00:00 2001 From: Kim Shepherd Date: Tue, 3 May 2022 14:10:33 +1200 Subject: [PATCH 108/343] [TLC-254] Get Type Bind config from backend --- config/config.example.yml | 5 --- .../ds-dynamic-type-bind-relation.service.ts | 8 ++-- .../form/builder/form-builder.service.spec.ts | 26 ++++++++++- .../form/builder/form-builder.service.ts | 43 ++++++++++++++++--- .../builder/parsers/concat-field-parser.ts | 2 +- .../builder/parsers/date-field-parser.spec.ts | 3 +- .../parsers/disabled-field-parser.spec.ts | 3 +- .../parsers/dropdown-field-parser.spec.ts | 3 +- .../builder/parsers/dropdown-field-parser.ts | 4 +- .../form/builder/parsers/field-parser.ts | 18 ++++---- .../builder/parsers/list-field-parser.spec.ts | 3 +- .../parsers/lookup-field-parser.spec.ts | 3 +- .../parsers/lookup-name-field-parser.spec.ts | 3 +- .../builder/parsers/name-field-parser.spec.ts | 3 +- .../parsers/onebox-field-parser.spec.ts | 3 +- .../form/builder/parsers/parser-options.ts | 1 + .../relation-group-field-parser.spec.ts | 3 +- .../form/builder/parsers/row-parser.spec.ts | 23 +++++----- .../shared/form/builder/parsers/row-parser.ts | 6 ++- .../parsers/series-field-parser.spec.ts | 3 +- .../builder/parsers/tag-field-parser.spec.ts | 3 +- .../parsers/textarea-field-parser.spec.ts | 3 +- src/app/submission/submission.module.ts | 3 +- 23 files changed, 123 insertions(+), 52 deletions(-) diff --git a/config/config.example.yml b/config/config.example.yml index fb0b4fd589..771c7b1653 100644 --- a/config/config.example.yml +++ b/config/config.example.yml @@ -77,11 +77,6 @@ submission: # NOTE: after how many time (milliseconds) submission is saved automatically # eg. timer: 5 * (1000 * 60); // 5 minutes timer: 0 - typeBind: - # NOTE: which field to use when matching to type-bind configuration, - # eg. dc.type, local.publicationType - # default: dc.type - field: dc.type icons: metadata: # NOTE: example of configuration diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-type-bind-relation.service.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-type-bind-relation.service.ts index c9473bd9d2..39f754af24 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-type-bind-relation.service.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-type-bind-relation.service.ts @@ -2,7 +2,7 @@ import { Inject, Injectable, Injector, Optional } from '@angular/core'; import { FormControl } from '@angular/forms'; import { Subscription } from 'rxjs'; -import { startWith } from 'rxjs/operators'; +import {map, startWith} from 'rxjs/operators'; import { AND_OPERATOR, @@ -15,10 +15,12 @@ import { OR_OPERATOR } from '@ng-dynamic-forms/core'; -import { hasNoValue, hasValue } from '../../../empty.util'; +import {hasNoValue, hasValue, isEmpty} from '../../../empty.util'; import { FormBuilderService } from '../form-builder.service'; import { FormFieldMetadataValueObject } from '../models/form-field-metadata-value.model'; import { DYNAMIC_FORM_CONTROL_TYPE_RELATION_GROUP } from './ds-dynamic-form-constants'; +import {getFirstCompletedRemoteData} from "../../../../core/shared/operators"; +import {ConfigurationDataService} from "../../../../core/data/configuration-data.service"; /** * Service to manage type binding for submission input fields @@ -31,7 +33,6 @@ export class DsDynamicTypeBindRelationService { protected dynamicFormRelationService: DynamicFormRelationService, protected formBuilderService: FormBuilderService, protected injector: Injector) { - } /** @@ -53,6 +54,7 @@ export class DsDynamicTypeBindRelationService { return value; } + /** * Get models for this bind type * @param model diff --git a/src/app/shared/form/builder/form-builder.service.spec.ts b/src/app/shared/form/builder/form-builder.service.spec.ts index 14c4e336cd..d2cd887e82 100644 --- a/src/app/shared/form/builder/form-builder.service.spec.ts +++ b/src/app/shared/form/builder/form-builder.service.spec.ts @@ -48,12 +48,18 @@ import { DynamicConcatModel } from './ds-dynamic-form-ui/models/ds-dynamic-conca import { DynamicLookupNameModel } from './ds-dynamic-form-ui/models/lookup/dynamic-lookup-name.model'; import { DynamicRowArrayModel } from './ds-dynamic-form-ui/models/ds-dynamic-row-array-model'; import { FormRowModel } from '../../../core/config/models/config-submission-form.model'; +import {ConfigurationDataService} from "../../../core/data/configuration-data.service"; +import {createSuccessfulRemoteDataObject$} from "../../remote-data.utils"; +import {ConfigurationProperty} from "../../../core/shared/configuration-property.model"; describe('FormBuilderService test suite', () => { let testModel: DynamicFormControlModel[]; let testFormConfiguration: SubmissionFormsModel; let service: FormBuilderService; + let configSpy: ConfigurationDataService; + const typeFieldProp = 'submit.type-bind.field'; + const typeFieldTestValue = 'dc.type'; const submissionId = '1234'; @@ -65,15 +71,24 @@ describe('FormBuilderService test suite', () => { return new Promise((resolve) => setTimeout(() => resolve(true), 0)); } - beforeEach(() => { + const createConfigSuccessSpy = (...values: string[]) => jasmine.createSpyObj('configurationDataService', { + findByPropertyName: createSuccessfulRemoteDataObject$({ + ... new ConfigurationProperty(), + name: typeFieldProp, + values: values, + }), + }); + beforeEach(() => { + configSpy = createConfigSuccessSpy(typeFieldTestValue); TestBed.configureTestingModule({ imports: [ReactiveFormsModule], providers: [ { provide: FormBuilderService, useClass: FormBuilderService }, { provide: DynamicFormValidationService, useValue: {} }, { provide: NG_VALIDATORS, useValue: testValidator, multi: true }, - { provide: NG_ASYNC_VALIDATORS, useValue: testAsyncValidator, multi: true } + { provide: NG_ASYNC_VALIDATORS, useValue: testAsyncValidator, multi: true }, + { provide: ConfigurationDataService, useValue: configSpy } ] }); @@ -881,4 +896,11 @@ describe('FormBuilderService test suite', () => { expect(formArray.length === 0).toBe(true); }); + it(`should request the ${typeFieldProp} property and set value "dc_type"`, () => { + service.setTypeBindFieldFromConfig(); + expect(configSpy.findByPropertyName).toHaveBeenCalledTimes(1); + expect(configSpy.findByPropertyName).toHaveBeenCalledWith(typeFieldProp); + expect(service.getTypeField()).toEqual('dc_type'); + }); + }); diff --git a/src/app/shared/form/builder/form-builder.service.ts b/src/app/shared/form/builder/form-builder.service.ts index 532a4fe085..9cca31e755 100644 --- a/src/app/shared/form/builder/form-builder.service.ts +++ b/src/app/shared/form/builder/form-builder.service.ts @@ -1,4 +1,4 @@ -import { Injectable } from '@angular/core'; +import {Injectable, Optional} from '@angular/core'; import { AbstractControl, FormControl, FormGroup } from '@angular/forms'; import { @@ -42,6 +42,8 @@ import { DYNAMIC_FORM_CONTROL_TYPE_RELATION_GROUP } from './ds-dynamic-form-ui/d import { CONCAT_GROUP_SUFFIX, DynamicConcatModel } from './ds-dynamic-form-ui/models/ds-dynamic-concat.model'; import { VIRTUAL_METADATA_PREFIX } from '../../../core/shared/metadata.models'; import { environment } from '../../../../environments/environment'; +import {ConfigurationDataService} from "../../../core/data/configuration-data.service"; +import {getFirstCompletedRemoteData} from "../../../core/shared/operators"; @Injectable() export class FormBuilderService extends DynamicFormService { @@ -66,13 +68,17 @@ export class FormBuilderService extends DynamicFormService { constructor( componentService: DynamicFormComponentService, validationService: DynamicFormValidationService, - protected rowParser: RowParser + protected rowParser: RowParser, + @Optional() protected configService: ConfigurationDataService, ) { super(componentService, validationService); this.formModels = new Map(); this.formGroups = new Map(); - // Replace . with _ in configured type field here, to make configuration more simple and user-friendly - this.typeField = environment.submission.typeBind.field.replace(/\./g, '_'); + if (hasValue(configService)) { + this.setTypeBindFieldFromConfig(); + } else { + this.typeField = 'dc_type'; + } } createDynamicFormControlEvent(control: FormControl, group: FormGroup, model: DynamicFormControlModel, type: string): DynamicFormControlEvent { @@ -278,7 +284,8 @@ export class FormBuilderService extends DynamicFormService { const rawData = typeof json === 'string' ? JSON.parse(json, parseReviver) : json; if (rawData.rows && !isEmpty(rawData.rows)) { rawData.rows.forEach((currentRow) => { - const rowParsed = this.rowParser.parse(submissionId, currentRow, scopeUUID, sectionData, submissionScope, readOnly); + const rowParsed = this.rowParser.parse(submissionId, currentRow, scopeUUID, sectionData, submissionScope, + readOnly, this.typeField); if (isNotNull(rowParsed)) { if (Array.isArray(rowParsed)) { rows = rows.concat(rowParsed); @@ -489,4 +496,30 @@ export class FormBuilderService extends DynamicFormService { return Object.keys(result); } + /** + * Get the type bind field from config + */ + setTypeBindFieldFromConfig(): void { + this.configService.findByPropertyName('submit.type-bind.field').pipe( + getFirstCompletedRemoteData(), + ).subscribe((remoteData: any) => { + // make sure we got a success response from the backend + if (!remoteData.hasSucceeded) { + this.typeField = 'dc_type'; + return; + } + // Read type bind value from response and set if non-empty + const typeFieldConfig = remoteData.payload.values[0]; + if (isEmpty(typeFieldConfig)) { + this.typeField = 'dc_type'; + } else { + this.typeField = typeFieldConfig.replace(/\./g, '_'); + } + }); + } + + getTypeField(): string { + return this.typeField; + } + } diff --git a/src/app/shared/form/builder/parsers/concat-field-parser.ts b/src/app/shared/form/builder/parsers/concat-field-parser.ts index 8085924422..2de5f256dc 100644 --- a/src/app/shared/form/builder/parsers/concat-field-parser.ts +++ b/src/app/shared/form/builder/parsers/concat-field-parser.ts @@ -1,4 +1,4 @@ -import { Inject } from '@angular/core'; +import {Inject} from '@angular/core'; import { FormFieldModel } from '../models/form-field.model'; import { FormFieldMetadataValueObject } from '../models/form-field-metadata-value.model'; import { diff --git a/src/app/shared/form/builder/parsers/date-field-parser.spec.ts b/src/app/shared/form/builder/parsers/date-field-parser.spec.ts index b9adf3ed65..9ab43709ad 100644 --- a/src/app/shared/form/builder/parsers/date-field-parser.spec.ts +++ b/src/app/shared/form/builder/parsers/date-field-parser.spec.ts @@ -12,7 +12,8 @@ describe('DateFieldParser test suite', () => { const parserOptions: ParserOptions = { readOnly: false, submissionScope: null, - collectionUUID: null + collectionUUID: null, + typeField: 'dc_type' }; beforeEach(() => { diff --git a/src/app/shared/form/builder/parsers/disabled-field-parser.spec.ts b/src/app/shared/form/builder/parsers/disabled-field-parser.spec.ts index e3e86d7051..d69f0e48e9 100644 --- a/src/app/shared/form/builder/parsers/disabled-field-parser.spec.ts +++ b/src/app/shared/form/builder/parsers/disabled-field-parser.spec.ts @@ -11,7 +11,8 @@ describe('DisabledFieldParser test suite', () => { const parserOptions: ParserOptions = { readOnly: false, submissionScope: null, - collectionUUID: null + collectionUUID: null, + typeField: 'dc_type' }; beforeEach(() => { diff --git a/src/app/shared/form/builder/parsers/dropdown-field-parser.spec.ts b/src/app/shared/form/builder/parsers/dropdown-field-parser.spec.ts index 82d2aeac63..3dca7558b3 100644 --- a/src/app/shared/form/builder/parsers/dropdown-field-parser.spec.ts +++ b/src/app/shared/form/builder/parsers/dropdown-field-parser.spec.ts @@ -11,7 +11,8 @@ describe('DropdownFieldParser test suite', () => { const parserOptions: ParserOptions = { readOnly: false, submissionScope: 'testScopeUUID', - collectionUUID: null + collectionUUID: null, + typeField: 'dc_type' }; beforeEach(() => { diff --git a/src/app/shared/form/builder/parsers/dropdown-field-parser.ts b/src/app/shared/form/builder/parsers/dropdown-field-parser.ts index 760fc63482..3e5ec0b9da 100644 --- a/src/app/shared/form/builder/parsers/dropdown-field-parser.ts +++ b/src/app/shared/form/builder/parsers/dropdown-field-parser.ts @@ -1,4 +1,4 @@ -import { Inject } from '@angular/core'; +import {Inject} from '@angular/core'; import { FormFieldModel } from '../models/form-field.model'; import { CONFIG_DATA, @@ -22,7 +22,7 @@ export class DropdownFieldParser extends FieldParser { @Inject(SUBMISSION_ID) submissionId: string, @Inject(CONFIG_DATA) configData: FormFieldModel, @Inject(INIT_FORM_VALUES) initFormValues, - @Inject(PARSER_OPTIONS) parserOptions: ParserOptions + @Inject(PARSER_OPTIONS) parserOptions: ParserOptions, ) { super(submissionId, configData, initFormValues, parserOptions); } diff --git a/src/app/shared/form/builder/parsers/field-parser.ts b/src/app/shared/form/builder/parsers/field-parser.ts index c8b8e07bad..35743ec9b7 100644 --- a/src/app/shared/form/builder/parsers/field-parser.ts +++ b/src/app/shared/form/builder/parsers/field-parser.ts @@ -1,9 +1,9 @@ -import { Inject, InjectionToken } from '@angular/core'; +import {Inject, InjectionToken} from '@angular/core'; import { uniqueId } from 'lodash'; import {DynamicFormControlLayout, DynamicFormControlRelation, MATCH_VISIBLE, OR_OPERATOR} from '@ng-dynamic-forms/core'; -import { hasValue, isNotEmpty, isNotNull, isNotUndefined } from '../../../empty.util'; +import {hasValue, isEmpty, isNotEmpty, isNotNull, isNotUndefined} from '../../../empty.util'; import { FormFieldModel } from '../models/form-field.model'; import { FormFieldMetadataValueObject } from '../models/form-field-metadata-value.model'; import { @@ -18,6 +18,8 @@ import { VocabularyOptions } from '../../../../core/submission/vocabularies/mode import { ParserType } from './parser-type'; import { isNgbDateStruct } from '../../../date.util'; import { environment } from '../../../../../environments/environment'; +import {getFirstCompletedRemoteData} from "../../../../core/shared/operators"; +import {map} from "rxjs/operators"; export const SUBMISSION_ID: InjectionToken = new InjectionToken('submissionId'); export const CONFIG_DATA: InjectionToken = new InjectionToken('configData'); @@ -39,8 +41,6 @@ export abstract class FieldParser { @Inject(INIT_FORM_VALUES) protected initFormValues: any, @Inject(PARSER_OPTIONS) protected parserOptions: ParserOptions ) { - // Replace . with _ in configured type field here, to make configuration more simple and user-friendly - this.typeField = environment.submission.typeBind.field.replace(/\./g, '_'); } public abstract modelFactory(fieldValue?: FormFieldMetadataValueObject, label?: boolean): any; @@ -75,7 +75,8 @@ export abstract class FieldParser { metadataFields: this.getAllFieldIds(), hasSelectableMetadata: isNotEmpty(this.configData.selectableMetadata), isDraggable, - typeBindRelations: isNotEmpty(this.configData.typeBind) ? this.getTypeBindRelations(this.configData.typeBind) : null, + typeBindRelations: isNotEmpty(this.configData.typeBind) ? this.getTypeBindRelations(this.configData.typeBind, + this.parserOptions.typeField) : null, groupFactory: () => { let model; if ((arrayCounter === 0)) { @@ -303,7 +304,8 @@ export abstract class FieldParser { // If typeBind is configured if (isNotEmpty(this.configData.typeBind)) { - (controlModel as DsDynamicInputModel).typeBindRelations = this.getTypeBindRelations(this.configData.typeBind); + (controlModel as DsDynamicInputModel).typeBindRelations = this.getTypeBindRelations(this.configData.typeBind, + this.parserOptions.typeField); } return controlModel; @@ -319,11 +321,11 @@ export abstract class FieldParser { * @private * @return DynamicFormControlRelation[] array with one relation in it, for type bind matching to show a field */ - private getTypeBindRelations(configuredTypeBindValues: string[]): DynamicFormControlRelation[] { + private getTypeBindRelations(configuredTypeBindValues: string[], typeField: string): DynamicFormControlRelation[] { const bindValues = []; configuredTypeBindValues.forEach((value) => { bindValues.push({ - id: this.typeField, + id: typeField, value: value }); }); diff --git a/src/app/shared/form/builder/parsers/list-field-parser.spec.ts b/src/app/shared/form/builder/parsers/list-field-parser.spec.ts index 8a05b169fd..30d1913a51 100644 --- a/src/app/shared/form/builder/parsers/list-field-parser.spec.ts +++ b/src/app/shared/form/builder/parsers/list-field-parser.spec.ts @@ -13,7 +13,8 @@ describe('ListFieldParser test suite', () => { const parserOptions: ParserOptions = { readOnly: false, submissionScope: 'testScopeUUID', - collectionUUID: null + collectionUUID: null, + typeField: 'dc_type' }; beforeEach(() => { diff --git a/src/app/shared/form/builder/parsers/lookup-field-parser.spec.ts b/src/app/shared/form/builder/parsers/lookup-field-parser.spec.ts index 87cee9d950..24efcf3462 100644 --- a/src/app/shared/form/builder/parsers/lookup-field-parser.spec.ts +++ b/src/app/shared/form/builder/parsers/lookup-field-parser.spec.ts @@ -12,7 +12,8 @@ describe('LookupFieldParser test suite', () => { const parserOptions: ParserOptions = { readOnly: false, submissionScope: 'testScopeUUID', - collectionUUID: null + collectionUUID: null, + typeField: 'dc_type' }; beforeEach(() => { diff --git a/src/app/shared/form/builder/parsers/lookup-name-field-parser.spec.ts b/src/app/shared/form/builder/parsers/lookup-name-field-parser.spec.ts index 3d02b6952e..d0281681ef 100644 --- a/src/app/shared/form/builder/parsers/lookup-name-field-parser.spec.ts +++ b/src/app/shared/form/builder/parsers/lookup-name-field-parser.spec.ts @@ -12,7 +12,8 @@ describe('LookupNameFieldParser test suite', () => { const parserOptions: ParserOptions = { readOnly: false, submissionScope: 'testScopeUUID', - collectionUUID: null + collectionUUID: null, + typeField: 'dc_type' }; beforeEach(() => { diff --git a/src/app/shared/form/builder/parsers/name-field-parser.spec.ts b/src/app/shared/form/builder/parsers/name-field-parser.spec.ts index 514585f03f..6b520142cc 100644 --- a/src/app/shared/form/builder/parsers/name-field-parser.spec.ts +++ b/src/app/shared/form/builder/parsers/name-field-parser.spec.ts @@ -14,7 +14,8 @@ describe('NameFieldParser test suite', () => { const parserOptions: ParserOptions = { readOnly: false, submissionScope: 'testScopeUUID', - collectionUUID: null + collectionUUID: null, + typeField: 'dc_type' }; beforeEach(() => { diff --git a/src/app/shared/form/builder/parsers/onebox-field-parser.spec.ts b/src/app/shared/form/builder/parsers/onebox-field-parser.spec.ts index 8ecce24194..e7e68a6461 100644 --- a/src/app/shared/form/builder/parsers/onebox-field-parser.spec.ts +++ b/src/app/shared/form/builder/parsers/onebox-field-parser.spec.ts @@ -15,7 +15,8 @@ describe('OneboxFieldParser test suite', () => { const parserOptions: ParserOptions = { readOnly: false, submissionScope: 'testScopeUUID', - collectionUUID: null + collectionUUID: null, + typeField: 'dc_type' }; beforeEach(() => { diff --git a/src/app/shared/form/builder/parsers/parser-options.ts b/src/app/shared/form/builder/parsers/parser-options.ts index 8b0b42008e..f7aac3449d 100644 --- a/src/app/shared/form/builder/parsers/parser-options.ts +++ b/src/app/shared/form/builder/parsers/parser-options.ts @@ -2,4 +2,5 @@ export interface ParserOptions { readOnly: boolean; submissionScope: string; collectionUUID: string; + typeField: string; } diff --git a/src/app/shared/form/builder/parsers/relation-group-field-parser.spec.ts b/src/app/shared/form/builder/parsers/relation-group-field-parser.spec.ts index 111193a637..7d48ad2d00 100644 --- a/src/app/shared/form/builder/parsers/relation-group-field-parser.spec.ts +++ b/src/app/shared/form/builder/parsers/relation-group-field-parser.spec.ts @@ -12,7 +12,8 @@ describe('RelationGroupFieldParser test suite', () => { const parserOptions: ParserOptions = { readOnly: false, submissionScope: 'testScopeUUID', - collectionUUID: 'WORKSPACE' + collectionUUID: 'WORKSPACE', + typeField: 'dc_type' }; beforeEach(() => { diff --git a/src/app/shared/form/builder/parsers/row-parser.spec.ts b/src/app/shared/form/builder/parsers/row-parser.spec.ts index e612534d55..1f9bde8a7f 100644 --- a/src/app/shared/form/builder/parsers/row-parser.spec.ts +++ b/src/app/shared/form/builder/parsers/row-parser.spec.ts @@ -22,6 +22,7 @@ describe('RowParser test suite', () => { const initFormValues = {}; const submissionScope = 'WORKSPACE'; const readOnly = false; + const typeField = 'dc_type'; beforeEach(() => { row1 = { @@ -338,7 +339,7 @@ describe('RowParser test suite', () => { it('should return a DynamicRowGroupModel object', () => { const parser = new RowParser(undefined); - const rowModel = parser.parse(submissionId, row1, scopeUUID, initFormValues, submissionScope, readOnly); + const rowModel = parser.parse(submissionId, row1, scopeUUID, initFormValues, submissionScope, readOnly, typeField); expect(rowModel instanceof DynamicRowGroupModel).toBe(true); }); @@ -346,7 +347,7 @@ describe('RowParser test suite', () => { it('should return a row with three fields', () => { const parser = new RowParser(undefined); - const rowModel = parser.parse(submissionId, row1, scopeUUID, initFormValues, submissionScope, readOnly); + const rowModel = parser.parse(submissionId, row1, scopeUUID, initFormValues, submissionScope, readOnly, typeField); expect((rowModel as DynamicRowGroupModel).group.length).toBe(3); }); @@ -354,7 +355,7 @@ describe('RowParser test suite', () => { it('should return a DynamicRowArrayModel object', () => { const parser = new RowParser(undefined); - const rowModel = parser.parse(submissionId, row2, scopeUUID, initFormValues, submissionScope, readOnly); + const rowModel = parser.parse(submissionId, row2, scopeUUID, initFormValues, submissionScope, readOnly, typeField); expect(rowModel instanceof DynamicRowArrayModel).toBe(true); }); @@ -362,7 +363,7 @@ describe('RowParser test suite', () => { it('should return a row that contains only scoped fields', () => { const parser = new RowParser(undefined); - const rowModel = parser.parse(submissionId, row3, scopeUUID, initFormValues, submissionScope, readOnly); + const rowModel = parser.parse(submissionId, row3, scopeUUID, initFormValues, submissionScope, readOnly, typeField); expect((rowModel as DynamicRowGroupModel).group.length).toBe(1); }); @@ -370,7 +371,7 @@ describe('RowParser test suite', () => { it('should be able to parse a dropdown combo field', () => { const parser = new RowParser(undefined); - const rowModel = parser.parse(submissionId, row4, scopeUUID, initFormValues, submissionScope, readOnly); + const rowModel = parser.parse(submissionId, row4, scopeUUID, initFormValues, submissionScope, readOnly, typeField); expect(rowModel).toBeDefined(); }); @@ -378,7 +379,7 @@ describe('RowParser test suite', () => { it('should be able to parse a lookup-name field', () => { const parser = new RowParser(undefined); - const rowModel = parser.parse(submissionId, row5, scopeUUID, initFormValues, submissionScope, readOnly); + const rowModel = parser.parse(submissionId, row5, scopeUUID, initFormValues, submissionScope, readOnly, typeField); expect(rowModel).toBeDefined(); }); @@ -386,7 +387,7 @@ describe('RowParser test suite', () => { it('should be able to parse a list field', () => { const parser = new RowParser(undefined); - const rowModel = parser.parse(submissionId, row6, scopeUUID, initFormValues, submissionScope, readOnly); + const rowModel = parser.parse(submissionId, row6, scopeUUID, initFormValues, submissionScope, readOnly, typeField); expect(rowModel).toBeDefined(); }); @@ -394,7 +395,7 @@ describe('RowParser test suite', () => { it('should be able to parse a date field', () => { const parser = new RowParser(undefined); - const rowModel = parser.parse(submissionId, row7, scopeUUID, initFormValues, submissionScope, readOnly); + const rowModel = parser.parse(submissionId, row7, scopeUUID, initFormValues, submissionScope, readOnly, typeField); expect(rowModel).toBeDefined(); }); @@ -402,7 +403,7 @@ describe('RowParser test suite', () => { it('should be able to parse a tag field', () => { const parser = new RowParser(undefined); - const rowModel = parser.parse(submissionId, row8, scopeUUID, initFormValues, submissionScope, readOnly); + const rowModel = parser.parse(submissionId, row8, scopeUUID, initFormValues, submissionScope, readOnly, typeField); expect(rowModel).toBeDefined(); }); @@ -410,7 +411,7 @@ describe('RowParser test suite', () => { it('should be able to parse a textarea field', () => { const parser = new RowParser(undefined); - const rowModel = parser.parse(submissionId, row9, scopeUUID, initFormValues, submissionScope, readOnly); + const rowModel = parser.parse(submissionId, row9, scopeUUID, initFormValues, submissionScope, readOnly, typeField); expect(rowModel).toBeDefined(); }); @@ -418,7 +419,7 @@ describe('RowParser test suite', () => { it('should be able to parse a group field', () => { const parser = new RowParser(undefined); - const rowModel = parser.parse(submissionId, row10, scopeUUID, initFormValues, submissionScope, readOnly); + const rowModel = parser.parse(submissionId, row10, scopeUUID, initFormValues, submissionScope, readOnly, typeField); expect(rowModel).toBeDefined(); }); diff --git a/src/app/shared/form/builder/parsers/row-parser.ts b/src/app/shared/form/builder/parsers/row-parser.ts index fe664305b0..764f52ffdf 100644 --- a/src/app/shared/form/builder/parsers/row-parser.ts +++ b/src/app/shared/form/builder/parsers/row-parser.ts @@ -31,7 +31,8 @@ export class RowParser { scopeUUID, initFormValues: any, submissionScope, - readOnly: boolean): DynamicRowGroupModel { + readOnly: boolean, + typeField: string): DynamicRowGroupModel { let fieldModel: any = null; let parsedResult = null; const config: DynamicFormGroupModelConfig = { @@ -47,7 +48,8 @@ export class RowParser { const parserOptions: ParserOptions = { readOnly: readOnly, submissionScope: submissionScope, - collectionUUID: scopeUUID + collectionUUID: scopeUUID, + typeField: typeField }; // Iterate over row's fields diff --git a/src/app/shared/form/builder/parsers/series-field-parser.spec.ts b/src/app/shared/form/builder/parsers/series-field-parser.spec.ts index b044f43833..0761cfe60e 100644 --- a/src/app/shared/form/builder/parsers/series-field-parser.spec.ts +++ b/src/app/shared/form/builder/parsers/series-field-parser.spec.ts @@ -12,7 +12,8 @@ describe('SeriesFieldParser test suite', () => { const parserOptions: ParserOptions = { readOnly: false, submissionScope: 'testScopeUUID', - collectionUUID: null + collectionUUID: null, + typeField: 'dc_type' }; beforeEach(() => { diff --git a/src/app/shared/form/builder/parsers/tag-field-parser.spec.ts b/src/app/shared/form/builder/parsers/tag-field-parser.spec.ts index 7c63235f67..115829f8d3 100644 --- a/src/app/shared/form/builder/parsers/tag-field-parser.spec.ts +++ b/src/app/shared/form/builder/parsers/tag-field-parser.spec.ts @@ -12,7 +12,8 @@ describe('TagFieldParser test suite', () => { const parserOptions: ParserOptions = { readOnly: false, submissionScope: 'testScopeUUID', - collectionUUID: null + collectionUUID: null, + typeField: 'dc_type' }; beforeEach(() => { diff --git a/src/app/shared/form/builder/parsers/textarea-field-parser.spec.ts b/src/app/shared/form/builder/parsers/textarea-field-parser.spec.ts index a81907aa13..855e464f21 100644 --- a/src/app/shared/form/builder/parsers/textarea-field-parser.spec.ts +++ b/src/app/shared/form/builder/parsers/textarea-field-parser.spec.ts @@ -12,7 +12,8 @@ describe('TextareaFieldParser test suite', () => { const parserOptions: ParserOptions = { readOnly: false, submissionScope: null, - collectionUUID: null + collectionUUID: null, + typeField: 'dc_type' }; beforeEach(() => { diff --git a/src/app/submission/submission.module.ts b/src/app/submission/submission.module.ts index 939d1bff29..d9b83d9864 100644 --- a/src/app/submission/submission.module.ts +++ b/src/app/submission/submission.module.ts @@ -42,6 +42,7 @@ import { NgbAccordionModule, NgbModalModule } from '@ng-bootstrap/ng-bootstrap'; import { SubmissionSectionAccessesComponent } from './sections/accesses/section-accesses.component'; import { SubmissionAccessesConfigService } from '../core/config/submission-accesses-config.service'; import { SectionAccessesService } from './sections/accesses/section-accesses.service'; +import {ConfigurationDataService} from "../core/data/configuration-data.service"; const ENTRY_COMPONENTS = [ // put only entry components that use custom decorator @@ -97,7 +98,7 @@ const DECLARATIONS = [ SectionsService, SubmissionUploadsConfigService, SubmissionAccessesConfigService, - SectionAccessesService + SectionAccessesService, ] }) From fd0c8f409e061487c6b57a1a50c18c0c9f3166f5 Mon Sep 17 00:00:00 2001 From: Kim Shepherd Date: Tue, 3 May 2022 14:11:02 +1200 Subject: [PATCH 109/343] [TLC-254] Tests for isObjectEmpty() --- src/app/shared/empty.util.spec.ts | 39 ++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/src/app/shared/empty.util.spec.ts b/src/app/shared/empty.util.spec.ts index 1112883c2a..7516e08ca7 100644 --- a/src/app/shared/empty.util.spec.ts +++ b/src/app/shared/empty.util.spec.ts @@ -9,7 +9,7 @@ import { isNotEmptyOperator, isNotNull, isNotUndefined, - isNull, + isNull, isObjectEmpty, isUndefined } from './empty.util'; @@ -444,6 +444,43 @@ describe('Empty Utils', () => { }); }); + describe('isObjectEmpty', () => { + /* + isObjectEmpty(); // true + isObjectEmpty(null); // true + isObjectEmpty(undefined); // true + isObjectEmpty(''); // true + isObjectEmpty([]); // true + isObjectEmpty({}); // true + isObjectEmpty({name: null}); // true + isObjectEmpty({ name: 'Adam Hawkins', surname : null}); // false + */ + it('should be empty if no parameter passed', () => { + expect(isObjectEmpty()).toBeTrue(); + }) + it('should be empty if null parameter passed', () => { + expect(isObjectEmpty(null)).toBeTrue(); + }) + it('should be empty if undefined parameter passed', () => { + expect(isObjectEmpty(undefined)).toBeTrue(); + }) + it('should be empty if empty string passed', () => { + expect(isObjectEmpty('')).toBeTrue(); + }) + it('should be empty if empty array passed', () => { + expect(isObjectEmpty([])).toBeTrue(); + }) + it('should be empty if empty object passed', () => { + expect(isObjectEmpty({})).toBeTrue(); + }) + it('should be empty if single key with null value passed', () => { + expect(isObjectEmpty({ name: null })).toBeTrue(); + }) + it('should NOT be empty if object with at least one non-null value passed', () => { + expect(isObjectEmpty({ name: 'Adam Hawkins', surname : null })).toBeFalse(); + }) + }); + describe('ensureArrayHasValue', () => { it('should let all arrays pass unchanged, and turn everything else in to empty arrays', () => { const sourceData = { From 22d5643d8b0276922bc6477db29283a6b5360993 Mon Sep 17 00:00:00 2001 From: Yura Bondarenko Date: Tue, 3 May 2022 09:32:31 +0200 Subject: [PATCH 110/343] 90978: Set klaro cookie before each test --- cypress/support/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cypress/support/index.ts b/cypress/support/index.ts index d9b6409a0d..024b46cdde 100644 --- a/cypress/support/index.ts +++ b/cypress/support/index.ts @@ -21,7 +21,7 @@ import './commands'; import 'cypress-axe'; // Runs once before the first test in each "block" -before(() => { +beforeEach(() => { // Pre-agree to all Klaro cookies by setting the klaro-anonymous cookie // This just ensures it doesn't get in the way of matching other objects in the page. cy.setCookie('klaro-anonymous', '{%22authentication%22:true%2C%22preferences%22:true%2C%22acknowledgement%22:true%2C%22google-analytics%22:true}'); From 32a91f64d9d8db83390589628c76882b212c968b Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Tue, 3 May 2022 12:06:48 +0200 Subject: [PATCH 111/343] [CST-5535] Refactoring health page --- package.json | 1 - src/app/app-routing-paths.ts | 2 + src/app/app-routing.module.ts | 19 ++- .../health-info-component.component.html | 28 +++ .../health-info-component.component.scss | 0 .../health-info-component.component.spec.ts | 72 ++++++++ .../health-info-component.component.ts | 35 ++++ .../health-info/health-info.component.html | 7 + .../health-info/health-info.component.scss | 0 .../health-info/health-info.component.spec.ts | 37 ++++ .../health-info/health-info.component.ts | 14 ++ .../health-page/health-page.component.html | 21 +++ .../health-page/health-page.component.scss | 0 .../health-page/health-page.component.spec.ts | 72 ++++++++ src/app/health-page/health-page.component.ts | 41 +++++ src/app/health-page/health-page.module.ts | 35 ++++ ...odule.ts => health-page.routing.module.ts} | 19 +-- .../health-component.component.html | 27 +++ .../health-component.component.scss | 0 .../health-component.component.spec.ts | 77 +++++++++ .../health-component.component.ts | 27 +++ .../health-panel/health-panel.component.html | 21 +++ .../health-panel/health-panel.component.scss | 0 .../health-panel.component.spec.ts | 58 +++++++ .../health-panel/health-panel.component.ts | 21 +++ .../health-status.component.html | 6 + .../health-status.component.scss | 0 .../health-status.component.spec.ts | 48 ++++++ .../health-status/health-status.component.ts | 20 +++ src/app/health-page/health.module.ts | 23 --- .../health-page/health/health.component.html | 39 ----- .../health-page/health/health.component.scss | 8 - .../health/health.component.spec.ts | 160 ------------------ .../health-page/health/health.component.ts | 100 ----------- .../models/health-component.model.ts | 48 ++++++ src/app/shared/mocks/health-endpoint.mocks.ts | 140 +++++++++++++++ 36 files changed, 878 insertions(+), 348 deletions(-) create mode 100644 src/app/health-page/health-info/health-info-component/health-info-component.component.html create mode 100644 src/app/health-page/health-info/health-info-component/health-info-component.component.scss create mode 100644 src/app/health-page/health-info/health-info-component/health-info-component.component.spec.ts create mode 100644 src/app/health-page/health-info/health-info-component/health-info-component.component.ts create mode 100644 src/app/health-page/health-info/health-info.component.html create mode 100644 src/app/health-page/health-info/health-info.component.scss create mode 100644 src/app/health-page/health-info/health-info.component.spec.ts create mode 100644 src/app/health-page/health-info/health-info.component.ts create mode 100644 src/app/health-page/health-page.component.html create mode 100644 src/app/health-page/health-page.component.scss create mode 100644 src/app/health-page/health-page.component.spec.ts create mode 100644 src/app/health-page/health-page.component.ts create mode 100644 src/app/health-page/health-page.module.ts rename src/app/health-page/{health.routing.module.ts => health-page.routing.module.ts} (57%) create mode 100644 src/app/health-page/health-panel/health-component/health-component.component.html create mode 100644 src/app/health-page/health-panel/health-component/health-component.component.scss create mode 100644 src/app/health-page/health-panel/health-component/health-component.component.spec.ts create mode 100644 src/app/health-page/health-panel/health-component/health-component.component.ts create mode 100644 src/app/health-page/health-panel/health-panel.component.html create mode 100644 src/app/health-page/health-panel/health-panel.component.scss create mode 100644 src/app/health-page/health-panel/health-panel.component.spec.ts create mode 100644 src/app/health-page/health-panel/health-panel.component.ts create mode 100644 src/app/health-page/health-panel/health-status/health-status.component.html create mode 100644 src/app/health-page/health-panel/health-status/health-status.component.scss create mode 100644 src/app/health-page/health-panel/health-status/health-status.component.spec.ts create mode 100644 src/app/health-page/health-panel/health-status/health-status.component.ts delete mode 100644 src/app/health-page/health.module.ts delete mode 100644 src/app/health-page/health/health.component.html delete mode 100644 src/app/health-page/health/health.component.scss delete mode 100644 src/app/health-page/health/health.component.spec.ts delete mode 100644 src/app/health-page/health/health.component.ts create mode 100644 src/app/health-page/models/health-component.model.ts create mode 100644 src/app/shared/mocks/health-endpoint.mocks.ts diff --git a/package.json b/package.json index d6c234ef9e..75e22b40f3 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,6 @@ "@angular/core": "~13.2.6", "@angular/forms": "~13.2.6", "@angular/localize": "13.2.6", - "@angular/material": "13.3.5", "@angular/platform-browser": "~13.2.6", "@angular/platform-browser-dynamic": "~13.2.6", "@angular/platform-server": "~13.2.6", diff --git a/src/app/app-routing-paths.ts b/src/app/app-routing-paths.ts index 57767b6f3e..929cdbeaa2 100644 --- a/src/app/app-routing-paths.ts +++ b/src/app/app-routing-paths.ts @@ -116,3 +116,5 @@ export const REQUEST_COPY_MODULE_PATH = 'request-a-copy'; export function getRequestCopyModulePath() { return `/${REQUEST_COPY_MODULE_PATH}`; } + +export const HEALTH_PAGE_PATH = 'health'; diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 80310774c8..243fe05f59 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -3,13 +3,16 @@ import { RouterModule } from '@angular/router'; import { AuthBlockingGuard } from './core/auth/auth-blocking.guard'; import { AuthenticatedGuard } from './core/auth/authenticated.guard'; -import { SiteAdministratorGuard } from './core/data/feature-authorization/feature-authorization-guard/site-administrator.guard'; +import { + SiteAdministratorGuard +} from './core/data/feature-authorization/feature-authorization-guard/site-administrator.guard'; import { ACCESS_CONTROL_MODULE_PATH, ADMIN_MODULE_PATH, BITSTREAM_MODULE_PATH, FORBIDDEN_PATH, FORGOT_PASSWORD_PATH, + HEALTH_PAGE_PATH, INFO_MODULE_PATH, INTERNAL_SERVER_ERROR, LEGACY_BITSTREAM_MODULE_PATH, @@ -27,8 +30,12 @@ import { EndUserAgreementCurrentUserGuard } from './core/end-user-agreement/end- import { SiteRegisterGuard } from './core/data/feature-authorization/feature-authorization-guard/site-register.guard'; import { ThemedPageNotFoundComponent } from './pagenotfound/themed-pagenotfound.component'; import { ThemedForbiddenComponent } from './forbidden/themed-forbidden.component'; -import { GroupAdministratorGuard } from './core/data/feature-authorization/feature-authorization-guard/group-administrator.guard'; -import { ThemedPageInternalServerErrorComponent } from './page-internal-server-error/themed-page-internal-server-error.component'; +import { + GroupAdministratorGuard +} from './core/data/feature-authorization/feature-authorization-guard/group-administrator.guard'; +import { + ThemedPageInternalServerErrorComponent +} from './page-internal-server-error/themed-page-internal-server-error.component'; import { ServerCheckGuard } from './core/server-check/server-check.guard'; @NgModule({ @@ -209,9 +216,9 @@ import { ServerCheckGuard } from './core/server-check/server-check.guard'; .then((m) => m.StatisticsPageRoutingModule) }, { - path: 'health', - loadChildren: () => import('./health-page/health.module') - .then((m) => m.HealthModule) + path: HEALTH_PAGE_PATH, + loadChildren: () => import('./health-page/health-page.module') + .then((m) => m.HealthPageModule) }, { path: ACCESS_CONTROL_MODULE_PATH, diff --git a/src/app/health-page/health-info/health-info-component/health-info-component.component.html b/src/app/health-page/health-info/health-info-component/health-info-component.component.html new file mode 100644 index 0000000000..55c1b3372f --- /dev/null +++ b/src/app/health-page/health-info/health-info-component/health-info-component.component.html @@ -0,0 +1,28 @@ + +
    +
    + +
    + + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    + +

    {{ healthInfoComponentName | titlecase }} : {{healthInfoComponent}}

    +
    diff --git a/src/app/health-page/health-info/health-info-component/health-info-component.component.scss b/src/app/health-page/health-info/health-info-component/health-info-component.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/health-page/health-info/health-info-component/health-info-component.component.spec.ts b/src/app/health-page/health-info/health-info-component/health-info-component.component.spec.ts new file mode 100644 index 0000000000..2297007cd5 --- /dev/null +++ b/src/app/health-page/health-info/health-info-component/health-info-component.component.spec.ts @@ -0,0 +1,72 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { CommonModule } from '@angular/common'; +import { By } from '@angular/platform-browser'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; + +import { NgbCollapseModule } from '@ng-bootstrap/ng-bootstrap'; + +import { HealthInfoComponentComponent } from './health-info-component.component'; +import { HealthInfoComponentOne, HealthInfoComponentTwo } from '../../../shared/mocks/health-endpoint.mocks'; +import { ObjNgFor } from '../../../shared/utils/object-ngfor.pipe'; + +describe('HealthInfoComponentComponent', () => { + let component: HealthInfoComponentComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ + CommonModule, + NgbCollapseModule, + NoopAnimationsModule + ], + declarations: [ + HealthInfoComponentComponent, + ObjNgFor + ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(HealthInfoComponentComponent); + component = fixture.componentInstance; + }); + + describe('when has nested components', () => { + beforeEach(() => { + component.healthInfoComponentName = 'App'; + component.healthInfoComponent = HealthInfoComponentOne; + component.isCollapsed = false; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should display property', () => { + const components = fixture.debugElement.queryAll(By.css('[data-test="component"]')); + expect(components.length).toBe(4); + }); + + }); + + describe('when has plain properties', () => { + beforeEach(() => { + component.healthInfoComponentName = 'Java'; + component.healthInfoComponent = HealthInfoComponentTwo; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should display property', () => { + const property = fixture.debugElement.queryAll(By.css('[data-test="property"]')); + expect(property.length).toBe(1); + }); + + }); +}); diff --git a/src/app/health-page/health-info/health-info-component/health-info-component.component.ts b/src/app/health-page/health-info/health-info-component/health-info-component.component.ts new file mode 100644 index 0000000000..b6c31214c8 --- /dev/null +++ b/src/app/health-page/health-info/health-info-component/health-info-component.component.ts @@ -0,0 +1,35 @@ +import { Component, Input } from '@angular/core'; + +import { HealthInfoComponent } from '../../models/health-component.model'; + +@Component({ + selector: 'ds-health-info-component', + templateUrl: './health-info-component.component.html', + styleUrls: ['./health-info-component.component.scss'] +}) +export class HealthInfoComponentComponent { + + /** + * The HealthInfoComponent object to display + */ + @Input() healthInfoComponent: HealthInfoComponent|string; + + /** + * The HealthInfoComponent object name + */ + @Input() healthInfoComponentName: string; + + /** + * A boolean representing if div should start collapsed + */ + @Input() isNested = false; + + /** + * A boolean representing if div should start collapsed + */ + public isCollapsed = true; + + isPlainProperty(entry: HealthInfoComponent | string): boolean { + return typeof entry === 'string'; + } +} diff --git a/src/app/health-page/health-info/health-info.component.html b/src/app/health-page/health-info/health-info.component.html new file mode 100644 index 0000000000..e4d29adf54 --- /dev/null +++ b/src/app/health-page/health-info/health-info.component.html @@ -0,0 +1,7 @@ + +
    + +
    +
    diff --git a/src/app/health-page/health-info/health-info.component.scss b/src/app/health-page/health-info/health-info.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/health-page/health-info/health-info.component.spec.ts b/src/app/health-page/health-info/health-info.component.spec.ts new file mode 100644 index 0000000000..3af1d71db3 --- /dev/null +++ b/src/app/health-page/health-info/health-info.component.spec.ts @@ -0,0 +1,37 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HealthInfoComponent } from './health-info.component'; +import { HealthInfoResponseObj } from '../../shared/mocks/health-endpoint.mocks'; +import { ObjNgFor } from '../../shared/utils/object-ngfor.pipe'; +import { By } from '@angular/platform-browser'; + +describe('HealthInfoComponent', () => { + let component: HealthInfoComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ + HealthInfoComponent, + ObjNgFor + ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(HealthInfoComponent); + component = fixture.componentInstance; + component.healthInfoResponse = HealthInfoResponseObj; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should create info component properly', () => { + const components = fixture.debugElement.queryAll(By.css('[data-test="info-component"]')); + expect(components.length).toBe(3); + }); +}); diff --git a/src/app/health-page/health-info/health-info.component.ts b/src/app/health-page/health-info/health-info.component.ts new file mode 100644 index 0000000000..a5fb0b282b --- /dev/null +++ b/src/app/health-page/health-info/health-info.component.ts @@ -0,0 +1,14 @@ +import { Component, Input } from '@angular/core'; + +import { HealthInfoResponse } from '../models/health-component.model'; + +@Component({ + selector: 'ds-health-info', + templateUrl: './health-info.component.html', + styleUrls: ['./health-info.component.scss'] +}) +export class HealthInfoComponent { + + @Input() healthInfoResponse: HealthInfoResponse; + +} diff --git a/src/app/health-page/health-page.component.html b/src/app/health-page/health-page.component.html new file mode 100644 index 0000000000..6ec9abddcb --- /dev/null +++ b/src/app/health-page/health-page.component.html @@ -0,0 +1,21 @@ + diff --git a/src/app/health-page/health-page.component.scss b/src/app/health-page/health-page.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/health-page/health-page.component.spec.ts b/src/app/health-page/health-page.component.spec.ts new file mode 100644 index 0000000000..205af8036a --- /dev/null +++ b/src/app/health-page/health-page.component.spec.ts @@ -0,0 +1,72 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { CommonModule } from '@angular/common'; +import { By } from '@angular/platform-browser'; + +import { of } from 'rxjs'; +import { NgbNavModule } from '@ng-bootstrap/ng-bootstrap'; +import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; + +import { HealthPageComponent } from './health-page.component'; +import { HealthDataService } from './health-data.service'; +import { HealthInfoResponseObj, HealthResponseObj } from '../shared/mocks/health-endpoint.mocks'; +import { RawRestResponse } from '../core/dspace-rest/raw-rest-response.model'; +import { TranslateLoaderMock } from '../shared/mocks/translate-loader.mock'; + +describe('HealthPageComponent', () => { + let component: HealthPageComponent; + let fixture: ComponentFixture; + + const healthService = jasmine.createSpyObj('healthDataService', { + getHealth: jasmine.createSpy('getHealth'), + getInfo: jasmine.createSpy('getInfo'), + }); + + const healthRestResponse$ = of({ + payload: HealthResponseObj, + statusCode: 200, + statusText: 'OK' + } as RawRestResponse); + + const healthInfoRestResponse$ = of({ + payload: HealthInfoResponseObj, + statusCode: 200, + statusText: 'OK' + } as RawRestResponse); + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ + CommonModule, + NgbNavModule, + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useClass: TranslateLoaderMock + } + }) + ], + declarations: [ HealthPageComponent ], + providers: [ + { provide: HealthDataService, useValue: healthService } + ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(HealthPageComponent); + component = fixture.componentInstance; + healthService.getHealth.and.returnValue(healthRestResponse$); + healthService.getInfo.and.returnValue(healthInfoRestResponse$); + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should create nav items properly', () => { + const navItems = fixture.debugElement.queryAll(By.css('li.nav-item')); + expect(navItems.length).toBe(2); + }); +}); diff --git a/src/app/health-page/health-page.component.ts b/src/app/health-page/health-page.component.ts new file mode 100644 index 0000000000..e4f4be7a03 --- /dev/null +++ b/src/app/health-page/health-page.component.ts @@ -0,0 +1,41 @@ +import { Component, OnInit } from '@angular/core'; + +import { BehaviorSubject } from 'rxjs'; +import { take } from 'rxjs/operators'; + +import { HealthDataService } from './health-data.service'; +import { HealthInfoResponse, HealthResponse } from './models/health-component.model'; + +@Component({ + selector: 'ds-health-page', + templateUrl: './health-page.component.html', + styleUrls: ['./health-page.component.scss'] +}) +export class HealthPageComponent implements OnInit { + + /** + * Health info endpoint response + */ + healthInfoResponse: BehaviorSubject = new BehaviorSubject(null); + + /** + * Health endpoint response + */ + healthResponse: BehaviorSubject = new BehaviorSubject(null); + + constructor(private healthDataService: HealthDataService) { + } + + /** + * Retrieve responses from rest + */ + ngOnInit(): void { + this.healthDataService.getHealth().pipe(take(1)).subscribe((data: any) => { + this.healthResponse.next(data.payload); + }); + + this.healthDataService.getInfo().pipe(take(1)).subscribe((data) => { + this.healthInfoResponse.next(data.payload); + }); + } +} diff --git a/src/app/health-page/health-page.module.ts b/src/app/health-page/health-page.module.ts new file mode 100644 index 0000000000..02a6a91a5f --- /dev/null +++ b/src/app/health-page/health-page.module.ts @@ -0,0 +1,35 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; + +import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; +import { TranslateModule } from '@ngx-translate/core'; + +import { HealthPageRoutingModule } from './health-page.routing.module'; +import { HealthPanelComponent } from './health-panel/health-panel.component'; +import { HealthStatusComponent } from './health-panel/health-status/health-status.component'; +import { SharedModule } from '../shared/shared.module'; +import { HealthPageComponent } from './health-page.component'; +import { HealthComponentComponent } from './health-panel/health-component/health-component.component'; +import { HealthInfoComponent } from './health-info/health-info.component'; +import { HealthInfoComponentComponent } from './health-info/health-info-component/health-info-component.component'; + + +@NgModule({ + imports: [ + CommonModule, + HealthPageRoutingModule, + NgbModule, + SharedModule, + TranslateModule + ], + declarations: [ + HealthPageComponent, + HealthPanelComponent, + HealthStatusComponent, + HealthComponentComponent, + HealthInfoComponent, + HealthInfoComponentComponent, + ] +}) +export class HealthPageModule { +} diff --git a/src/app/health-page/health.routing.module.ts b/src/app/health-page/health-page.routing.module.ts similarity index 57% rename from src/app/health-page/health.routing.module.ts rename to src/app/health-page/health-page.routing.module.ts index a8d94d9d1f..37c8b626eb 100644 --- a/src/app/health-page/health.routing.module.ts +++ b/src/app/health-page/health-page.routing.module.ts @@ -1,8 +1,11 @@ import { RouterModule } from '@angular/router'; import { NgModule } from '@angular/core'; -import { AuthenticatedGuard } from '../core/auth/authenticated.guard'; -import { HealthComponent } from './health/health.component'; + import { I18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.resolver'; +import { HealthPageComponent } from './health-page.component'; +import { + SiteAdministratorGuard +} from '../core/data/feature-authorization/feature-authorization-guard/site-administrator.guard'; @NgModule({ imports: [ @@ -11,15 +14,9 @@ import { I18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.reso path: '', resolve: { breadcrumb: I18nBreadcrumbResolver }, data: { breadcrumbKey: 'health' }, - canActivate: [AuthenticatedGuard], - children: [ - { - path: '', - component: HealthComponent, - }, - ] - }, - + canActivate: [SiteAdministratorGuard], + component: HealthPageComponent + } ]) ] }) diff --git a/src/app/health-page/health-panel/health-component/health-component.component.html b/src/app/health-page/health-panel/health-component/health-component.component.html new file mode 100644 index 0000000000..8171917767 --- /dev/null +++ b/src/app/health-page/health-panel/health-component/health-component.component.html @@ -0,0 +1,27 @@ + +
    +
    + +
    + + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    + +
    + {{ item.key | titlecase }} : {{item.value}} +
    +
    diff --git a/src/app/health-page/health-panel/health-component/health-component.component.scss b/src/app/health-page/health-panel/health-component/health-component.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/health-page/health-panel/health-component/health-component.component.spec.ts b/src/app/health-page/health-panel/health-component/health-component.component.spec.ts new file mode 100644 index 0000000000..149d504c23 --- /dev/null +++ b/src/app/health-page/health-panel/health-component/health-component.component.spec.ts @@ -0,0 +1,77 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { CommonModule } from '@angular/common'; +import { By } from '@angular/platform-browser'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; + +import { NgbCollapseModule } from '@ng-bootstrap/ng-bootstrap'; + +import { HealthComponentComponent } from './health-component.component'; +import { HealthComponentOne, HealthComponentTwo } from '../../../shared/mocks/health-endpoint.mocks'; +import { ObjNgFor } from '../../../shared/utils/object-ngfor.pipe'; + +describe('HealthComponentComponent', () => { + let component: HealthComponentComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ + CommonModule, + NgbCollapseModule, + NoopAnimationsModule + ], + declarations: [ + HealthComponentComponent, + ObjNgFor + ], + schemas: [NO_ERRORS_SCHEMA] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(HealthComponentComponent); + component = fixture.componentInstance; + }); + + describe('when has nested components', () => { + beforeEach(() => { + component.healthComponentName = 'db'; + component.healthComponent = HealthComponentOne; + component.isCollapsed = false; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should create collapsible divs properly', () => { + const collapseDivs = fixture.debugElement.queryAll(By.css('[data-test="collapse"]')); + expect(collapseDivs.length).toBe(2); + const detailsDivs = fixture.debugElement.queryAll(By.css('[data-test="details"]')); + expect(detailsDivs.length).toBe(6); + }); + }); + + describe('when has details', () => { + beforeEach(() => { + component.healthComponentName = 'geoIp'; + component.healthComponent = HealthComponentTwo; + + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should create detail divs properly', () => { + const detailsDivs = fixture.debugElement.queryAll(By.css('[data-test="details"]')); + expect(detailsDivs.length).toBe(1); + const collapseDivs = fixture.debugElement.queryAll(By.css('[data-test="collapse"]')); + expect(collapseDivs.length).toBe(0); + }); + }); +}); diff --git a/src/app/health-page/health-panel/health-component/health-component.component.ts b/src/app/health-page/health-panel/health-component/health-component.component.ts new file mode 100644 index 0000000000..5ad40c9469 --- /dev/null +++ b/src/app/health-page/health-panel/health-component/health-component.component.ts @@ -0,0 +1,27 @@ +import { Component, Input } from '@angular/core'; + +import { HealthComponent } from '../../models/health-component.model'; + +@Component({ + selector: 'ds-health-component', + templateUrl: './health-component.component.html', + styleUrls: ['./health-component.component.scss'] +}) +export class HealthComponentComponent { + + /** + * The HealthComponent object to display + */ + @Input() healthComponent: HealthComponent; + + /** + * The HealthComponent object name + */ + @Input() healthComponentName: string; + + /** + * A boolean representing if div should start collapsed + */ + public isCollapsed = true; + +} diff --git a/src/app/health-page/health-panel/health-panel.component.html b/src/app/health-page/health-panel/health-panel.component.html new file mode 100644 index 0000000000..d582fb77f3 --- /dev/null +++ b/src/app/health-page/health-panel/health-panel.component.html @@ -0,0 +1,21 @@ +

    {{'health-page.status' | translate}} :

    +
    +
    + +
    + + + +
    +
    +
    +
    +
    + +
    +
    +
    +
    diff --git a/src/app/health-page/health-panel/health-panel.component.scss b/src/app/health-page/health-panel/health-panel.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/health-page/health-panel/health-panel.component.spec.ts b/src/app/health-page/health-panel/health-panel.component.spec.ts new file mode 100644 index 0000000000..da392f7ba8 --- /dev/null +++ b/src/app/health-page/health-panel/health-panel.component.spec.ts @@ -0,0 +1,58 @@ +import { CommonModule } from '@angular/common'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; + +import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; +import { NgbCollapseModule, NgbNavModule } from '@ng-bootstrap/ng-bootstrap'; + +import { TranslateLoaderMock } from '../../shared/mocks/translate-loader.mock'; +import { HealthPanelComponent } from './health-panel.component'; +import { HealthResponseObj } from '../../shared/mocks/health-endpoint.mocks'; +import { ObjNgFor } from '../../shared/utils/object-ngfor.pipe'; + +describe('HealthComponent', () => { + let component: HealthPanelComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ + NgbNavModule, + NgbCollapseModule, + CommonModule, + BrowserAnimationsModule, + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useClass: TranslateLoaderMock + } + }), + ], + declarations: [ + HealthPanelComponent, + ObjNgFor + ], + schemas: [NO_ERRORS_SCHEMA] + }).compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(HealthPanelComponent); + component = fixture.componentInstance; + component.healthResponse = HealthResponseObj; + component.isCollapsed = false; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should render a card for each component', () => { + const components = fixture.debugElement.queryAll(By.css('[data-test="component"]')); + expect(components.length).toBe(5); + }); + +}); diff --git a/src/app/health-page/health-panel/health-panel.component.ts b/src/app/health-page/health-panel/health-panel.component.ts new file mode 100644 index 0000000000..549544c370 --- /dev/null +++ b/src/app/health-page/health-panel/health-panel.component.ts @@ -0,0 +1,21 @@ +import { Component, Input } from '@angular/core'; +import { HealthResponse } from '../models/health-component.model'; + +@Component({ + selector: 'ds-health-panel', + templateUrl: './health-panel.component.html', + styleUrls: ['./health-panel.component.scss'] +}) +export class HealthPanelComponent { + + /** + * Health endpoint response + */ + @Input() healthResponse: HealthResponse; + + /** + * A boolean representing if div should start collapsed + */ + public isCollapsed = true; + +} diff --git a/src/app/health-page/health-panel/health-status/health-status.component.html b/src/app/health-page/health-panel/health-status/health-status.component.html new file mode 100644 index 0000000000..fdd726cddf --- /dev/null +++ b/src/app/health-page/health-panel/health-status/health-status.component.html @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/app/health-page/health-panel/health-status/health-status.component.scss b/src/app/health-page/health-panel/health-status/health-status.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/health-page/health-panel/health-status/health-status.component.spec.ts b/src/app/health-page/health-panel/health-status/health-status.component.spec.ts new file mode 100644 index 0000000000..13df9c23e3 --- /dev/null +++ b/src/app/health-page/health-panel/health-status/health-status.component.spec.ts @@ -0,0 +1,48 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; + +import { HealthStatusComponent } from './health-status.component'; +import { HealthStatus } from '../../models/health-component.model'; + +describe('HealthStatusComponent', () => { + let component: HealthStatusComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ HealthStatusComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(HealthStatusComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should create success icon', () => { + component.status = HealthStatus.UP; + fixture.detectChanges(); + const icon = fixture.debugElement.query(By.css('i.text-success')); + expect(icon).toBeTruthy(); + }); + + it('should create warning icon', () => { + component.status = HealthStatus.UP_WITH_ISSUES; + fixture.detectChanges(); + const icon = fixture.debugElement.query(By.css('i.text-warning')); + expect(icon).toBeTruthy(); + }); + + it('should create success icon', () => { + component.status = HealthStatus.DOWN; + fixture.detectChanges(); + const icon = fixture.debugElement.query(By.css('i.text-danger')); + expect(icon).toBeTruthy(); + }); +}); diff --git a/src/app/health-page/health-panel/health-status/health-status.component.ts b/src/app/health-page/health-panel/health-status/health-status.component.ts new file mode 100644 index 0000000000..9285483a97 --- /dev/null +++ b/src/app/health-page/health-panel/health-status/health-status.component.ts @@ -0,0 +1,20 @@ +import { Component, Input } from '@angular/core'; +import { HealthStatus } from '../../models/health-component.model'; + +@Component({ + selector: 'ds-health-status', + templateUrl: './health-status.component.html', + styleUrls: ['./health-status.component.scss'] +}) +export class HealthStatusComponent { + /** + * The current status to show + */ + @Input() status: HealthStatus; + + /** + * He + */ + HealthStatus = HealthStatus; + +} diff --git a/src/app/health-page/health.module.ts b/src/app/health-page/health.module.ts deleted file mode 100644 index 8731b77f77..0000000000 --- a/src/app/health-page/health.module.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { HealthPageRoutingModule } from './health.routing.module'; -import { HealthComponent } from './health/health.component'; -import { MatExpansionModule } from '@angular/material/expansion'; -import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; -import { TranslateModule } from '@ngx-translate/core'; - - -@NgModule({ - imports: [ - CommonModule, - HealthPageRoutingModule, - MatExpansionModule, - NgbModule, - TranslateModule - ], - declarations: [ - HealthComponent - ] - }) - export class HealthModule { - } diff --git a/src/app/health-page/health/health.component.html b/src/app/health-page/health/health.component.html deleted file mode 100644 index 05f77225fb..0000000000 --- a/src/app/health-page/health/health.component.html +++ /dev/null @@ -1,39 +0,0 @@ -
    - -
    -
    - - - - diff --git a/src/app/health-page/health/health.component.scss b/src/app/health-page/health/health.component.scss deleted file mode 100644 index c085111079..0000000000 --- a/src/app/health-page/health/health.component.scss +++ /dev/null @@ -1,8 +0,0 @@ -.mat-expansion-panel-header { - padding-left: 0px; -} - -.circle-red { - color:red; - align-items: center; -} \ No newline at end of file diff --git a/src/app/health-page/health/health.component.spec.ts b/src/app/health-page/health/health.component.spec.ts deleted file mode 100644 index 4515aef2cb..0000000000 --- a/src/app/health-page/health/health.component.spec.ts +++ /dev/null @@ -1,160 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { MatExpansionModule } from '@angular/material/expansion'; -import { By } from '@angular/platform-browser'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { NgbNavModule } from '@ng-bootstrap/ng-bootstrap'; -import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; -import { of } from 'rxjs'; -import { TranslateLoaderMock } from '../../shared/mocks/translate-loader.mock'; -import { HealthDataService } from '../health-data.service'; -import { HealthPageRoutingModule } from '../health.routing.module'; -import { HealthComponent } from './health.component'; - - function getHealth() { - return of({ - 'payload':{ - 'status':'UP_WITH_ISSUES', - 'components':{ - 'db':{ - 'status':'UP', - 'components':{ - 'dataSource':{ - 'status':'UP', - 'details':{ - 'database':'PostgreSQL', - 'result':1, - 'validationQuery':'SELECT 1' - } - }, - 'dspaceDataSource':{ - 'status':'UP', - 'details':{ - 'database':'PostgreSQL', - 'result':1, - 'validationQuery':'SELECT 1' - } - } - } - }, - 'geoIp':{ - 'status':'UP_WITH_ISSUES', - 'details':{ - 'reason':'The GeoLite Database file is missing (/var/lib/GeoIP/GeoLite2-City.mmdb)! Solr Statistics cannot generate location based reports! Please see the DSpace installation instructions for instructions to install this file.' - } - }, - 'solrOaiCore':{ - 'status':'UP', - 'details':{ - 'status':0, - 'detectedPathType':'particular core' - } - }, - 'solrSearchCore':{ - 'status':'UP', - 'details':{ - 'status':0, - 'detectedPathType':'particular core' - } - }, - 'solrStatisticsCore':{ - 'status':'UP', - 'details':{ - 'status':0, - 'detectedPathType':'particular core' - } - } - } - }, - 'statusCode':200, - 'statusText':'OK' - }); - } - - function getInfo() { - return of({ - 'payload':{ - 'app':{ - 'name':'DSpace at My University', - 'version':'7.3', - 'dir':'/Users/pratikrajkotiya/Documents/Project/FrontEnd/dspace-cris-install', - 'url':'http://localhost:8080/server', - 'db':'jdbc:postgresql://localhost:5432/4science', - 'solr':{ - 'server':'http://localhost:8983/solr', - 'prefix':'' - }, - 'mail':{ - 'server':'smtp.example.com', - 'from-address':'dspace-noreply@myu.edu', - 'feedback-recipient':'dspace-help@myu.edu', - 'mail-admin':'dspace-help@myu.edu', - 'mail-helpdesk':'dspace-help@myu.edu', - 'alert-recipient':'dspace-help@myu.edu' - }, - 'cors':{ - 'allowed-origins':'http://localhost:4000' - }, - 'ui':{ - 'url':'http://localhost:4000' - } - } - }, - 'statusCode':200, - 'statusText':'OK' - }); - } - -function getMockHealthDataService() { - return jasmine.createSpyObj('healthDataService', { - getHealth: getHealth(), - getInfo: getInfo() - }); -} - -describe('HealthComponent', () => { - let component: HealthComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [ - NgbNavModule, - CommonModule, - HealthPageRoutingModule, - MatExpansionModule, - BrowserAnimationsModule, - TranslateModule.forRoot({ - loader: { - provide: TranslateLoader, - useClass: TranslateLoaderMock - } - }), - ], - declarations: [ HealthComponent ], - providers:[{ provide: HealthDataService, useValue: getMockHealthDataService() }] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(HealthComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); - - it('should render health tab.', () => { - const healthTab = fixture.debugElement.query(By.css('#health')); - expect(healthTab).toBeTruthy(); - }); - - it('should render info tab.', () => { - const infoTab = fixture.debugElement.query(By.css('#info')); - expect(infoTab).toBeFalsy(); - }); - -}); diff --git a/src/app/health-page/health/health.component.ts b/src/app/health-page/health/health.component.ts deleted file mode 100644 index 89aa6611f6..0000000000 --- a/src/app/health-page/health/health.component.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { HealthDataService } from '../health-data.service'; - - -enum HealthStatus { - UP = 'UP', - UP_WITH_ISSUES = 'UP_WITH_ISSUES', - DOWN = 'DOWN' -} -@Component({ - selector: 'ds-health', - templateUrl: './health.component.html', - styleUrls: ['./health.component.scss'] -}) -export class HealthComponent implements OnInit { - healthArr: string[]; - serverInfoArr: string[]; - healthGlobalStatus: string; - activeId ='Health'; - constructor(private healthDataService: HealthDataService) { } - - ngOnInit(): void { - this.healthDataService.getHealth().subscribe((data) => { - this.healthArr = this.getHealth(data.payload.components); - this.healthGlobalStatus = data.payload.status; - }); - - this.healthDataService.getInfo().subscribe((data) => { - this.serverInfoArr = this.getInfo(data.payload, null, []); - }); - } - - /** - * @param obj represents a info - * @param key represents a nested key of info - * @param arr represents a key value pair or only key - * @returns {{arr}} of key value pair or only key - */ - getInfo(obj, key, arr) { - if (typeof obj === 'object' && key !== null) { - arr.push({style: {'font-weight': 'bold' ,'font-size.px': key === 'app' ? '30' : '20' }, value: key}); - } - if (typeof obj !== 'object') { - arr.push({style: {'font-size.px': '15'}, value: `${key} = ${obj}`}); - return obj; - } - // tslint:disable-next-line: forin - for (const objKey in obj) { - this.getInfo(obj[objKey], objKey, arr); - } - return arr; - } - - /** - * @param subCompObj represent nested sub component - * @param superCompkey represents a key of super component - * @returns linear components array - */ - getHealthSubComponents(subCompObj, superCompkey) { - const subCompArr = []; - // tslint:disable-next-line: forin - for (const key in subCompObj) { - subCompArr.push({ ...subCompObj[key], components: superCompkey + '.' + key }); - } - return subCompArr; - } - - /** - * @param componentsObj represent health data - * @returns linear components array - */ - getHealth(componentsObj) { - let componentsArr = []; - for (const key in componentsObj) { - if (componentsObj[key].hasOwnProperty('components')) { - componentsArr.push({ ...componentsObj[key], components: key }); - // tslint:disable-next-line: no-string-literal - componentsArr = [...componentsArr, ...this.getHealthSubComponents(componentsObj[key]['components'], key)]; - } else { - componentsArr.push({ ...componentsObj[key], components: key }); - } - } - return componentsArr; - } - - /** - * @param status of perticular block - * @returns {{ string }} class respective status - */ - getHealthIconClass(status: string): string { - if (status === HealthStatus.UP) { - return 'fa fa-check-circle text-success ml-2 mt-1'; - } else if (status === HealthStatus.UP_WITH_ISSUES) { - return 'fa fa-exclamation-triangle text-warning ml-2 mt-1'; - } else { - return 'fa fa-times-circle circle-red ml-2 mt-1'; - } - } - -} diff --git a/src/app/health-page/models/health-component.model.ts b/src/app/health-page/models/health-component.model.ts new file mode 100644 index 0000000000..8461d4d967 --- /dev/null +++ b/src/app/health-page/models/health-component.model.ts @@ -0,0 +1,48 @@ +/** + * Interface for Health Status + */ +export enum HealthStatus { + UP = 'UP', + UP_WITH_ISSUES = 'UP_WITH_ISSUES', + DOWN = 'DOWN' +} + +/** + * Interface describing the Health endpoint response + */ +export interface HealthResponse { + status: HealthStatus; + components: { + [name: string]: HealthComponent; + }; +} + +/** + * Interface describing a single component retrieved from the Health endpoint response + */ +export interface HealthComponent { + status: HealthStatus; + details?: { + [name: string]: number|string; + }; + components?: { + [name: string]: HealthComponent; + }; +} + +/** + * Interface describing the Health info endpoint response + */ +export interface HealthInfoResponse { + [name: string]: HealthInfoComponent|string; +} + +/** + * Interface describing a single component retrieved from the Health info endpoint response + */ +export interface HealthInfoComponent { + [property: string]: HealthInfoComponent|string; +} + + + diff --git a/src/app/shared/mocks/health-endpoint.mocks.ts b/src/app/shared/mocks/health-endpoint.mocks.ts new file mode 100644 index 0000000000..9bd3956139 --- /dev/null +++ b/src/app/shared/mocks/health-endpoint.mocks.ts @@ -0,0 +1,140 @@ +import { + HealthComponent, + HealthInfoComponent, + HealthInfoResponse, + HealthResponse, + HealthStatus +} from '../../health-page/models/health-component.model'; + +export const HealthResponseObj: HealthResponse = { + 'status': HealthStatus.UP_WITH_ISSUES, + 'components': { + 'db': { + 'status': HealthStatus.UP, + 'components': { + 'dataSource': { + 'status': HealthStatus.UP, + 'details': { + 'database': 'PostgreSQL', + 'result': 1, + 'validationQuery': 'SELECT 1' + } + }, + 'dspaceDataSource': { + 'status': HealthStatus.UP, + 'details': { + 'database': 'PostgreSQL', + 'result': 1, + 'validationQuery': 'SELECT 1' + } + } + } + }, + 'geoIp': { + 'status': HealthStatus.UP_WITH_ISSUES, + 'details': { + 'reason': 'The GeoLite Database file is missing (/var/lib/GeoIP/GeoLite2-City.mmdb)! Solr Statistics cannot generate location based reports! Please see the DSpace installation instructions for instructions to install this file.' + } + }, + 'solrOaiCore': { + 'status': HealthStatus.UP, + 'details': { + 'status': 0, + 'detectedPathType': 'particular core' + } + }, + 'solrSearchCore': { + 'status': HealthStatus.UP, + 'details': { + 'status': 0, + 'detectedPathType': 'particular core' + } + }, + 'solrStatisticsCore': { + 'status': HealthStatus.UP, + 'details': { + 'status': 0, + 'detectedPathType': 'particular core' + } + } + } +}; + +export const HealthComponentOne: HealthComponent = { + 'status': HealthStatus.UP, + 'components': { + 'dataSource': { + 'status': HealthStatus.UP, + 'details': { + 'database': 'PostgreSQL', + 'result': 1, + 'validationQuery': 'SELECT 1' + } + }, + 'dspaceDataSource': { + 'status': HealthStatus.UP, + 'details': { + 'database': 'PostgreSQL', + 'result': 1, + 'validationQuery': 'SELECT 1' + } + } + } +}; + +export const HealthComponentTwo: HealthComponent = { + 'status': HealthStatus.UP_WITH_ISSUES, + 'details': { + 'reason': 'The GeoLite Database file is missing (/var/lib/GeoIP/GeoLite2-City.mmdb)! Solr Statistics cannot generate location based reports! Please see the DSpace installation instructions for instructions to install this file.' + } +}; + +export const HealthInfoResponseObj: HealthInfoResponse = { + 'app': { + 'name': 'DSpace at My University', + 'dir': '/home/giuseppe/development/java/install/dspace7-review', + 'url': 'http://localhost:8080/server', + 'db': 'jdbc:postgresql://localhost:5432/dspace7', + 'solr': { + 'server': 'http://localhost:8983/solr', + 'prefix': '' + }, + 'mail': { + 'server': 'smtp.example.com', + 'from-address': 'dspace-noreply@myu.edu', + 'feedback-recipient': 'dspace-help@myu.edu', + 'mail-admin': 'dspace-help@myu.edu', + 'mail-helpdesk': 'dspace-help@myu.edu', + 'alert-recipient': 'dspace-help@myu.edu' + }, + 'cors': { + 'allowed-origins': 'http://localhost:4000' + }, + 'ui': { + 'url': 'http://localhost:4000' + } + }, + 'java': { + 'vendor': 'Private Build', + 'version': '11.0.15', + 'runtime': { + 'name': 'OpenJDK Runtime Environment', + 'version': '11.0.15+10-Ubuntu-0ubuntu0.20.04.1' + }, + 'jvm': { + 'name': 'OpenJDK 64-Bit Server VM', + 'vendor': 'Private Build', + 'version': '11.0.15+10-Ubuntu-0ubuntu0.20.04.1' + } + }, + 'version': '7.3-SNAPSHOT' +}; + +export const HealthInfoComponentOne: HealthInfoComponent = { + 'name': 'DSpace at My University', + 'dir': '/home/giuseppe/development/java/install/dspace7-review', + 'url': 'http://localhost:8080/server', + 'db': 'jdbc:postgresql://localhost:5432/dspace7' +}; + +export const HealthInfoComponentTwo = '7.3-SNAPSHOT'; From 3c2f26f6c18bbf379e9b0be64f713a91cada110f Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Tue, 3 May 2022 15:30:20 +0200 Subject: [PATCH 112/343] [CST-5535] Add environment configuration for Actuators --- src/config/actuators.config.ts | 11 +++++++++++ src/config/app-config.interface.ts | 2 ++ src/config/default-app-config.ts | 5 +++++ src/environments/environment.test.ts | 4 ++++ 4 files changed, 22 insertions(+) create mode 100644 src/config/actuators.config.ts diff --git a/src/config/actuators.config.ts b/src/config/actuators.config.ts new file mode 100644 index 0000000000..8f59a13c98 --- /dev/null +++ b/src/config/actuators.config.ts @@ -0,0 +1,11 @@ +import { Config } from './config.interface'; + +/** + * Config that determines the spring Actuators options + */ +export class ActuatorsConfig implements Config { + /** + * The endpoint path + */ + public endpointPath: string; +} diff --git a/src/config/app-config.interface.ts b/src/config/app-config.interface.ts index a41ec05b82..e8bda53373 100644 --- a/src/config/app-config.interface.ts +++ b/src/config/app-config.interface.ts @@ -15,6 +15,7 @@ import { UIServerConfig } from './ui-server-config.interface'; import { MediaViewerConfig } from './media-viewer-config.interface'; import { BrowseByConfig } from './browse-by-config.interface'; import { BundleConfig } from './bundle-config.interface'; +import { ActuatorsConfig } from './actuators.config'; interface AppConfig extends Config { ui: UIServerConfig; @@ -34,6 +35,7 @@ interface AppConfig extends Config { themes: ThemeConfig[]; mediaViewer: MediaViewerConfig; bundle: BundleConfig; + actuators: ActuatorsConfig } const APP_CONFIG = new InjectionToken('APP_CONFIG'); diff --git a/src/config/default-app-config.ts b/src/config/default-app-config.ts index a7360bd1d1..27950f5269 100644 --- a/src/config/default-app-config.ts +++ b/src/config/default-app-config.ts @@ -15,6 +15,7 @@ import { SubmissionConfig } from './submission-config.interface'; import { ThemeConfig } from './theme.model'; import { UIServerConfig } from './ui-server-config.interface'; import { BundleConfig } from './bundle-config.interface'; +import { ActuatorsConfig } from './actuators.config'; export class DefaultAppConfig implements AppConfig { production = false; @@ -48,6 +49,10 @@ export class DefaultAppConfig implements AppConfig { nameSpace: '/', }; + actuators: ActuatorsConfig = { + endpointPath: '/actuator/health' + }; + // Caching settings cache: CacheConfig = { // NOTE: how long should objects be cached for by default diff --git a/src/environments/environment.test.ts b/src/environments/environment.test.ts index bc1622f5f2..d2f2ad7426 100644 --- a/src/environments/environment.test.ts +++ b/src/environments/environment.test.ts @@ -38,6 +38,10 @@ export const environment: BuildConfig = { baseUrl: 'https://rest.com/api' }, + actuators: { + endpointPath: '/actuator/health' + }, + // Caching settings cache: { // NOTE: how long should objects be cached for by default From 675f3910ccb23a2eb2376d61af067a018db59e72 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Tue, 3 May 2022 15:32:02 +0200 Subject: [PATCH 113/343] [CST-5535] Refactoring health check server side request --- package.json | 1 + server.ts | 31 +++++++++++++++++++------------ yarn.lock | 10 +++++++++- 3 files changed, 29 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index 75e22b40f3..14e2436ccd 100644 --- a/package.json +++ b/package.json @@ -78,6 +78,7 @@ "@nicky-lenaers/ngx-scroll-to": "^9.0.0", "angular-idle-preload": "3.0.0", "angulartics2": "^10.0.0", + "axios": "^0.27.2", "bootstrap": "4.3.1", "caniuse-lite": "^1.0.30001165", "cerialize": "0.1.18", diff --git a/server.ts b/server.ts index 7f8bb9bbdb..14ce33ed36 100644 --- a/server.ts +++ b/server.ts @@ -19,6 +19,7 @@ import 'zone.js/node'; import 'reflect-metadata'; import 'rxjs'; +import axios from 'axios'; import * as pem from 'pem'; import * as https from 'https'; import * as morgan from 'morgan'; @@ -37,14 +38,14 @@ import { REQUEST, RESPONSE } from '@nguniversal/express-engine/tokens'; import { environment } from './src/environments/environment'; import { createProxyMiddleware } from 'http-proxy-middleware'; -import { hasValue, hasNoValue } from './src/app/shared/empty.util'; +import { hasNoValue, hasValue } from './src/app/shared/empty.util'; import { UIServerConfig } from './src/config/ui-server-config.interface'; import { ServerAppModule } from './src/main.server'; import { buildAppConfig } from './src/config/config.server'; -import { AppConfig, APP_CONFIG } from './src/config/app-config.interface'; +import { APP_CONFIG, AppConfig } from './src/config/app-config.interface'; import { extendEnvironmentWithAppConfig } from './src/config/config.util'; /* @@ -160,16 +161,7 @@ export function app() { /** * Checking server status */ - server.get('/app/health', async (req,res) => { - try { - const serverStatus = await https.get(`${environment.rest.baseUrl}/actuator/health`); - res.send(serverStatus); - } catch (error) { - res.send({ - error: error.message - }); - } - }); + server.get('/app/health', healthCheck); // Register the ngApp callback function to handle incoming requests server.get('*', ngApp); @@ -301,6 +293,21 @@ function start() { } } +/* + * The callback function to serve health check requests + */ +function healthCheck(req, res) { + const baseUrl = `${environment.rest.baseUrl}${environment.actuators.endpointPath}`; + axios.get(baseUrl) + .then((response) => { + res.status(response.status).send(response.data); + }) + .catch((error) => { + res.status(error.response.status).send({ + error: error.message + }); + }); +} // Webpack will replace 'require' with '__webpack_require__' // '__non_webpack_require__' is a proxy to Node 'require' // The below code is to ensure that the server is run only when not requiring the bundle. diff --git a/yarn.lock b/yarn.lock index 00c93618d9..a612a985d8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3226,6 +3226,14 @@ axios@0.21.4: dependencies: follow-redirects "^1.14.0" +axios@^0.27.2: + version "0.27.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972" + integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== + dependencies: + follow-redirects "^1.14.9" + form-data "^4.0.0" + axobject-query@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" @@ -6108,7 +6116,7 @@ flatted@^3.1.0, flatted@^3.2.5: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3" integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== -follow-redirects@^1.0.0, follow-redirects@^1.14.0: +follow-redirects@^1.0.0, follow-redirects@^1.14.0, follow-redirects@^1.14.9: version "1.14.9" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.9.tgz#dd4ea157de7bfaf9ea9b3fbd85aa16951f78d8d7" integrity sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w== From 5363ae1ac1e237b87683cbf970f0ead722e6efbe Mon Sep 17 00:00:00 2001 From: Kim Shepherd Date: Wed, 4 May 2022 13:49:59 +1200 Subject: [PATCH 114/343] [TLC-254] mock config data service, get type in form builder service+test --- .../form/builder/form-builder.service.spec.ts | 2 +- .../shared/form/builder/form-builder.service.ts | 2 +- .../mocks/find-id-config-data.service.mock.ts | 14 ++++++++++++++ 3 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 src/app/shared/mocks/find-id-config-data.service.mock.ts diff --git a/src/app/shared/form/builder/form-builder.service.spec.ts b/src/app/shared/form/builder/form-builder.service.spec.ts index d2cd887e82..1f6754e8d1 100644 --- a/src/app/shared/form/builder/form-builder.service.spec.ts +++ b/src/app/shared/form/builder/form-builder.service.spec.ts @@ -897,7 +897,7 @@ describe('FormBuilderService test suite', () => { }); it(`should request the ${typeFieldProp} property and set value "dc_type"`, () => { - service.setTypeBindFieldFromConfig(); + // This should have been called in the service constructor expect(configSpy.findByPropertyName).toHaveBeenCalledTimes(1); expect(configSpy.findByPropertyName).toHaveBeenCalledWith(typeFieldProp); expect(service.getTypeField()).toEqual('dc_type'); diff --git a/src/app/shared/form/builder/form-builder.service.ts b/src/app/shared/form/builder/form-builder.service.ts index 9cca31e755..01de94af3d 100644 --- a/src/app/shared/form/builder/form-builder.service.ts +++ b/src/app/shared/form/builder/form-builder.service.ts @@ -74,7 +74,7 @@ export class FormBuilderService extends DynamicFormService { super(componentService, validationService); this.formModels = new Map(); this.formGroups = new Map(); - if (hasValue(configService)) { + if (hasValue(configService) || true) { this.setTypeBindFieldFromConfig(); } else { this.typeField = 'dc_type'; diff --git a/src/app/shared/mocks/find-id-config-data.service.mock.ts b/src/app/shared/mocks/find-id-config-data.service.mock.ts new file mode 100644 index 0000000000..d378466fcc --- /dev/null +++ b/src/app/shared/mocks/find-id-config-data.service.mock.ts @@ -0,0 +1,14 @@ +import { createSuccessfulRemoteDataObject$ } from '../remote-data.utils'; +import {ConfigurationProperty} from "../../core/shared/configuration-property.model"; + +export function getMockFindByIdDataService(propertyKey: string, ...values: string[]) { + return jasmine.createSpyObj('findByIdDataService', { + findByPropertyName: createSuccessfulRemoteDataObject$({ + ... new ConfigurationProperty(), + name: propertyKey, + values: values, + }) + }) +} + + From 2fbf33b641343697202895faff5bc8b4d661b428 Mon Sep 17 00:00:00 2001 From: Kim Shepherd Date: Wed, 4 May 2022 14:53:47 +1200 Subject: [PATCH 115/343] [TLC-254] Take config data service out of constructor, make optional --- .../form/builder/form-builder.service.spec.ts | 4 ++-- .../shared/form/builder/form-builder.service.ts | 16 ++++++++++------ 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/app/shared/form/builder/form-builder.service.spec.ts b/src/app/shared/form/builder/form-builder.service.spec.ts index 1f6754e8d1..0a613cbb84 100644 --- a/src/app/shared/form/builder/form-builder.service.spec.ts +++ b/src/app/shared/form/builder/form-builder.service.spec.ts @@ -897,10 +897,10 @@ describe('FormBuilderService test suite', () => { }); it(`should request the ${typeFieldProp} property and set value "dc_type"`, () => { - // This should have been called in the service constructor + const typeValue = service.getTypeField(); expect(configSpy.findByPropertyName).toHaveBeenCalledTimes(1); expect(configSpy.findByPropertyName).toHaveBeenCalledWith(typeFieldProp); - expect(service.getTypeField()).toEqual('dc_type'); + expect(typeValue).toEqual('dc_type'); }); }); diff --git a/src/app/shared/form/builder/form-builder.service.ts b/src/app/shared/form/builder/form-builder.service.ts index 01de94af3d..6d244aad2c 100644 --- a/src/app/shared/form/builder/form-builder.service.ts +++ b/src/app/shared/form/builder/form-builder.service.ts @@ -74,11 +74,6 @@ export class FormBuilderService extends DynamicFormService { super(componentService, validationService); this.formModels = new Map(); this.formGroups = new Map(); - if (hasValue(configService) || true) { - this.setTypeBindFieldFromConfig(); - } else { - this.typeField = 'dc_type'; - } } createDynamicFormControlEvent(control: FormControl, group: FormGroup, model: DynamicFormControlModel, type: string): DynamicFormControlEvent { @@ -285,7 +280,7 @@ export class FormBuilderService extends DynamicFormService { if (rawData.rows && !isEmpty(rawData.rows)) { rawData.rows.forEach((currentRow) => { const rowParsed = this.rowParser.parse(submissionId, currentRow, scopeUUID, sectionData, submissionScope, - readOnly, this.typeField); + readOnly, this.getTypeField()); if (isNotNull(rowParsed)) { if (Array.isArray(rowParsed)) { rows = rows.concat(rowParsed); @@ -518,7 +513,16 @@ export class FormBuilderService extends DynamicFormService { }); } + /** + * Get type field. If the type isn't already set, and a ConfigurationDataService is provided, set (with subscribe) + * from back end. Otherwise, get/set a default "dc_type" value + */ getTypeField(): string { + if (hasValue(this.configService) && hasNoValue(this.typeField)) { + this.setTypeBindFieldFromConfig(); + } else if (hasNoValue(this.typeField)) { + this.typeField = 'dc_type'; + } return this.typeField; } From bf9208169e77f5e11e32ca06064c58b982e06c3a Mon Sep 17 00:00:00 2001 From: Kim Shepherd Date: Wed, 4 May 2022 15:04:49 +1200 Subject: [PATCH 116/343] [TLC-254] Lint fixes --- src/app/shared/empty.util.spec.ts | 16 ++++++++-------- .../ds-dynamic-type-bind-relation.service.ts | 4 +--- .../form/builder/form-builder.service.spec.ts | 6 +++--- .../shared/form/builder/form-builder.service.ts | 5 ++--- .../shared/form/builder/parsers/field-parser.ts | 5 +---- .../mocks/find-id-config-data.service.mock.ts | 2 +- src/app/submission/submission.module.ts | 1 - 7 files changed, 16 insertions(+), 23 deletions(-) diff --git a/src/app/shared/empty.util.spec.ts b/src/app/shared/empty.util.spec.ts index 7516e08ca7..94122990ae 100644 --- a/src/app/shared/empty.util.spec.ts +++ b/src/app/shared/empty.util.spec.ts @@ -457,28 +457,28 @@ describe('Empty Utils', () => { */ it('should be empty if no parameter passed', () => { expect(isObjectEmpty()).toBeTrue(); - }) + }); it('should be empty if null parameter passed', () => { expect(isObjectEmpty(null)).toBeTrue(); - }) + }); it('should be empty if undefined parameter passed', () => { expect(isObjectEmpty(undefined)).toBeTrue(); - }) + }); it('should be empty if empty string passed', () => { expect(isObjectEmpty('')).toBeTrue(); - }) + }); it('should be empty if empty array passed', () => { expect(isObjectEmpty([])).toBeTrue(); - }) + }); it('should be empty if empty object passed', () => { expect(isObjectEmpty({})).toBeTrue(); - }) + }); it('should be empty if single key with null value passed', () => { expect(isObjectEmpty({ name: null })).toBeTrue(); - }) + }); it('should NOT be empty if object with at least one non-null value passed', () => { expect(isObjectEmpty({ name: 'Adam Hawkins', surname : null })).toBeFalse(); - }) + }); }); describe('ensureArrayHasValue', () => { diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-type-bind-relation.service.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-type-bind-relation.service.ts index 39f754af24..f8a7376c3e 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-type-bind-relation.service.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-type-bind-relation.service.ts @@ -2,7 +2,7 @@ import { Inject, Injectable, Injector, Optional } from '@angular/core'; import { FormControl } from '@angular/forms'; import { Subscription } from 'rxjs'; -import {map, startWith} from 'rxjs/operators'; +import { startWith } from 'rxjs/operators'; import { AND_OPERATOR, @@ -19,8 +19,6 @@ import {hasNoValue, hasValue, isEmpty} from '../../../empty.util'; import { FormBuilderService } from '../form-builder.service'; import { FormFieldMetadataValueObject } from '../models/form-field-metadata-value.model'; import { DYNAMIC_FORM_CONTROL_TYPE_RELATION_GROUP } from './ds-dynamic-form-constants'; -import {getFirstCompletedRemoteData} from "../../../../core/shared/operators"; -import {ConfigurationDataService} from "../../../../core/data/configuration-data.service"; /** * Service to manage type binding for submission input fields diff --git a/src/app/shared/form/builder/form-builder.service.spec.ts b/src/app/shared/form/builder/form-builder.service.spec.ts index 0a613cbb84..ac9c2b652b 100644 --- a/src/app/shared/form/builder/form-builder.service.spec.ts +++ b/src/app/shared/form/builder/form-builder.service.spec.ts @@ -48,9 +48,9 @@ import { DynamicConcatModel } from './ds-dynamic-form-ui/models/ds-dynamic-conca import { DynamicLookupNameModel } from './ds-dynamic-form-ui/models/lookup/dynamic-lookup-name.model'; import { DynamicRowArrayModel } from './ds-dynamic-form-ui/models/ds-dynamic-row-array-model'; import { FormRowModel } from '../../../core/config/models/config-submission-form.model'; -import {ConfigurationDataService} from "../../../core/data/configuration-data.service"; -import {createSuccessfulRemoteDataObject$} from "../../remote-data.utils"; -import {ConfigurationProperty} from "../../../core/shared/configuration-property.model"; +import {ConfigurationDataService} from '../../../core/data/configuration-data.service'; +import {createSuccessfulRemoteDataObject$} from '../../remote-data.utils'; +import {ConfigurationProperty} from '../../../core/shared/configuration-property.model'; describe('FormBuilderService test suite', () => { diff --git a/src/app/shared/form/builder/form-builder.service.ts b/src/app/shared/form/builder/form-builder.service.ts index 6d244aad2c..9dac46a8aa 100644 --- a/src/app/shared/form/builder/form-builder.service.ts +++ b/src/app/shared/form/builder/form-builder.service.ts @@ -41,9 +41,8 @@ import { dateToString, isNgbDateStruct } from '../../date.util'; import { DYNAMIC_FORM_CONTROL_TYPE_RELATION_GROUP } from './ds-dynamic-form-ui/ds-dynamic-form-constants'; import { CONCAT_GROUP_SUFFIX, DynamicConcatModel } from './ds-dynamic-form-ui/models/ds-dynamic-concat.model'; import { VIRTUAL_METADATA_PREFIX } from '../../../core/shared/metadata.models'; -import { environment } from '../../../../environments/environment'; -import {ConfigurationDataService} from "../../../core/data/configuration-data.service"; -import {getFirstCompletedRemoteData} from "../../../core/shared/operators"; +import { ConfigurationDataService } from '../../../core/data/configuration-data.service'; +import { getFirstCompletedRemoteData } from '../../../core/shared/operators'; @Injectable() export class FormBuilderService extends DynamicFormService { diff --git a/src/app/shared/form/builder/parsers/field-parser.ts b/src/app/shared/form/builder/parsers/field-parser.ts index 35743ec9b7..bd6820d4b3 100644 --- a/src/app/shared/form/builder/parsers/field-parser.ts +++ b/src/app/shared/form/builder/parsers/field-parser.ts @@ -3,7 +3,7 @@ import {Inject, InjectionToken} from '@angular/core'; import { uniqueId } from 'lodash'; import {DynamicFormControlLayout, DynamicFormControlRelation, MATCH_VISIBLE, OR_OPERATOR} from '@ng-dynamic-forms/core'; -import {hasValue, isEmpty, isNotEmpty, isNotNull, isNotUndefined} from '../../../empty.util'; +import { hasValue, isNotEmpty, isNotNull, isNotUndefined } from '../../../empty.util'; import { FormFieldModel } from '../models/form-field.model'; import { FormFieldMetadataValueObject } from '../models/form-field-metadata-value.model'; import { @@ -17,9 +17,6 @@ import { RelationshipOptions } from '../models/relationship-options.model'; import { VocabularyOptions } from '../../../../core/submission/vocabularies/models/vocabulary-options.model'; import { ParserType } from './parser-type'; import { isNgbDateStruct } from '../../../date.util'; -import { environment } from '../../../../../environments/environment'; -import {getFirstCompletedRemoteData} from "../../../../core/shared/operators"; -import {map} from "rxjs/operators"; export const SUBMISSION_ID: InjectionToken = new InjectionToken('submissionId'); export const CONFIG_DATA: InjectionToken = new InjectionToken('configData'); diff --git a/src/app/shared/mocks/find-id-config-data.service.mock.ts b/src/app/shared/mocks/find-id-config-data.service.mock.ts index d378466fcc..b755bb1673 100644 --- a/src/app/shared/mocks/find-id-config-data.service.mock.ts +++ b/src/app/shared/mocks/find-id-config-data.service.mock.ts @@ -1,5 +1,5 @@ import { createSuccessfulRemoteDataObject$ } from '../remote-data.utils'; -import {ConfigurationProperty} from "../../core/shared/configuration-property.model"; +import { ConfigurationProperty } from '../../core/shared/configuration-property.model'; export function getMockFindByIdDataService(propertyKey: string, ...values: string[]) { return jasmine.createSpyObj('findByIdDataService', { diff --git a/src/app/submission/submission.module.ts b/src/app/submission/submission.module.ts index d9b83d9864..05aa765054 100644 --- a/src/app/submission/submission.module.ts +++ b/src/app/submission/submission.module.ts @@ -42,7 +42,6 @@ import { NgbAccordionModule, NgbModalModule } from '@ng-bootstrap/ng-bootstrap'; import { SubmissionSectionAccessesComponent } from './sections/accesses/section-accesses.component'; import { SubmissionAccessesConfigService } from '../core/config/submission-accesses-config.service'; import { SectionAccessesService } from './sections/accesses/section-accesses.service'; -import {ConfigurationDataService} from "../core/data/configuration-data.service"; const ENTRY_COMPONENTS = [ // put only entry components that use custom decorator From ba3069215a2b87296faae85079a53f2e84441498 Mon Sep 17 00:00:00 2001 From: Kim Shepherd Date: Wed, 4 May 2022 15:09:59 +1200 Subject: [PATCH 117/343] [TLC-254] Lint fixes --- src/app/shared/mocks/find-id-config-data.service.mock.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/shared/mocks/find-id-config-data.service.mock.ts b/src/app/shared/mocks/find-id-config-data.service.mock.ts index b755bb1673..c94fa6c0d6 100644 --- a/src/app/shared/mocks/find-id-config-data.service.mock.ts +++ b/src/app/shared/mocks/find-id-config-data.service.mock.ts @@ -8,7 +8,7 @@ export function getMockFindByIdDataService(propertyKey: string, ...values: strin name: propertyKey, values: values, }) - }) + }); } From 9173b9db6061ba19032fd28b6e7e1053f18e84e6 Mon Sep 17 00:00:00 2001 From: Davide Negretti Date: Wed, 4 May 2022 11:35:54 +0200 Subject: [PATCH 118/343] [CST-5674] Fix; enable policy and action type editing; test --- .../resource-policy-form.component.spec.ts | 2 - .../form/resource-policy-form.component.ts | 59 +++++++++---------- 2 files changed, 28 insertions(+), 33 deletions(-) diff --git a/src/app/shared/resource-policies/form/resource-policy-form.component.spec.ts b/src/app/shared/resource-policies/form/resource-policy-form.component.spec.ts index 456eb6db5e..4a2a3376e0 100644 --- a/src/app/shared/resource-policies/form/resource-policy-form.component.spec.ts +++ b/src/app/shared/resource-policies/form/resource-policy-form.component.spec.ts @@ -222,8 +222,6 @@ describe('ResourcePolicyFormComponent test suite', () => { testFixture = createTestComponent(html, TestComponent) as ComponentFixture; testComp = testFixture.componentInstance; - testComp.resourcePolicy = resourcePolicy; - fixture.detectChanges(); }); afterEach(() => { diff --git a/src/app/shared/resource-policies/form/resource-policy-form.component.ts b/src/app/shared/resource-policies/form/resource-policy-form.component.ts index 2783200d8f..09be58fca4 100644 --- a/src/app/shared/resource-policies/form/resource-policy-form.component.ts +++ b/src/app/shared/resource-policies/form/resource-policy-form.component.ts @@ -161,27 +161,31 @@ export class ResourcePolicyFormComponent implements OnInit, OnDestroy { this.formId = this.formService.getUniqueId('resource-policy-form'); this.formModel = this.buildResourcePolicyForm(); - const epersonRD$ = this.ePersonService.findByHref(this.resourcePolicy._links.eperson.href, false).pipe( - getFirstSucceededRemoteData() - ); - const groupRD$ = this.groupService.findByHref(this.resourcePolicy._links.group.href, false).pipe( - getFirstSucceededRemoteData() - ); - const dsoRD$: Observable> = observableCombineLatest([epersonRD$, groupRD$]).pipe( - map((rdArr: RemoteData[]) => { - return rdArr.find((rd: RemoteData) => isNotEmpty(rd.payload)); - }), - hasValueOperator(), - ); - this.subs.push( - dsoRD$.pipe( - filter(() => this.isActive), - ).subscribe((dsoRD: RemoteData) => { - this.resourcePolicyGrant = dsoRD.payload; - this.navActiveId = String(dsoRD.payload.type); - this.resourcePolicyTargetName$.next(this.getResourcePolicyTargetName()); - }) - ); + if (this.isBeingEdited()) { + const epersonRD$ = this.ePersonService.findByHref(this.resourcePolicy._links.eperson.href, false).pipe( + getFirstSucceededRemoteData() + ); + const groupRD$ = this.groupService.findByHref(this.resourcePolicy._links.group.href, false).pipe( + getFirstSucceededRemoteData() + ); + const dsoRD$: Observable> = observableCombineLatest([epersonRD$, groupRD$]).pipe( + map((rdArr: RemoteData[]) => { + return rdArr.find((rd: RemoteData) => isNotEmpty(rd.payload)); + }), + hasValueOperator(), + ); + this.subs.push( + dsoRD$.pipe( + filter(() => this.isActive), + ).subscribe((dsoRD: RemoteData) => { + this.resourcePolicyGrant = dsoRD.payload; + this.navActiveId = String(dsoRD.payload.type); + this.resourcePolicyTargetName$.next(this.getResourcePolicyTargetName()); + }) + ) + } else { + + } } /** @@ -202,19 +206,12 @@ export class ResourcePolicyFormComponent implements OnInit, OnDestroy { */ private buildResourcePolicyForm(): DynamicFormControlModel[] { const formModel: DynamicFormControlModel[] = []; - // TODO to be removed when https://github.com/DSpace/DSpace/issues/7812 will be implemented - const policyTypeConf = Object.assign({}, RESOURCE_POLICY_FORM_POLICY_TYPE_CONFIG, { - disabled: isNotEmpty(this.resourcePolicy) - }); - // TODO to be removed when https://github.com/DSpace/DSpace/issues/7812 will be implemented - const actionConf = Object.assign({}, RESOURCE_POLICY_FORM_ACTION_TYPE_CONFIG, { - disabled: isNotEmpty(this.resourcePolicy) - }); + formModel.push( new DsDynamicInputModel(RESOURCE_POLICY_FORM_NAME_CONFIG), new DsDynamicTextAreaModel(RESOURCE_POLICY_FORM_DESCRIPTION_CONFIG), - new DynamicSelectModel(policyTypeConf), - new DynamicSelectModel(actionConf) + new DynamicSelectModel(RESOURCE_POLICY_FORM_POLICY_TYPE_CONFIG), + new DynamicSelectModel(RESOURCE_POLICY_FORM_ACTION_TYPE_CONFIG) ); const startDateModel = new DynamicDatePickerModel( From d69a02e6cc7a6a8c01a958f887e9c678ba5b0f24 Mon Sep 17 00:00:00 2001 From: Yura Bondarenko Date: Wed, 27 Apr 2022 09:06:55 +0200 Subject: [PATCH 119/343] 90978: Fix e2e tests failing due to interactions before page fully loaded Now that we use initialNavigation: 'enabledBlocking', pages can appear to be loaded before some functionality is fully active. In some cases this trips up Cypress, and it tries to interact with the app too soon. We address this by introducing a new dsBrowserOnly pipe in order to defer the data-test attributes Cypress relies on to CSR. --- cypress/integration/my-dspace.spec.ts | 8 +++---- cypress/integration/search-page.spec.ts | 2 +- .../item-edit-bitstream.component.html | 2 +- .../item-edit-bitstream.component.spec.ts | 7 +++++- ...space-new-external-dropdown.component.html | 1 + ...ce-new-external-dropdown.component.spec.ts | 7 ++++-- ...ace-new-submission-dropdown.component.html | 1 + ...-new-submission-dropdown.component.spec.ts | 7 ++++-- .../search-navbar.component.html | 4 ++-- .../search-navbar.component.spec.ts | 6 ++++- .../auth-nav-menu.component.html | 8 +++---- .../auth-nav-menu.component.spec.ts | 4 +++- src/app/shared/log-in/log-in.component.html | 4 ++-- .../password/log-in-password.component.html | 6 ++--- .../log-in-password.component.spec.ts | 4 +++- src/app/shared/log-out/log-out.component.html | 2 +- .../shared/log-out/log-out.component.spec.ts | 4 +++- .../object-grid/object-grid.component.html | 2 +- .../object-list/object-list.component.html | 2 +- .../search-form/search-form.component.html | 4 ++-- .../search-form/search-form.component.spec.ts | 6 ++++- .../search-filter.component.html | 1 + .../search-filter.component.spec.ts | 6 ++++- src/app/shared/shared.module.ts | 5 ++-- .../filter/sidebar-filter.component.html | 2 +- .../shared/testing/browser-only-mock.pipe.ts | 13 ++++++++++ src/app/shared/testing/test-module.ts | 4 +++- src/app/shared/utils/browser-only.pipe.ts | 24 +++++++++++++++++++ .../view-mode-switch.component.html | 6 ++--- .../view-mode-switch.component.spec.ts | 4 +++- .../submission-form-footer.component.html | 4 ++++ .../submission-form-footer.component.spec.ts | 6 +++-- 32 files changed, 123 insertions(+), 43 deletions(-) create mode 100644 src/app/shared/testing/browser-only-mock.pipe.ts create mode 100644 src/app/shared/utils/browser-only.pipe.ts diff --git a/cypress/integration/my-dspace.spec.ts b/cypress/integration/my-dspace.spec.ts index eb931adda7..fa923dbcbc 100644 --- a/cypress/integration/my-dspace.spec.ts +++ b/cypress/integration/my-dspace.spec.ts @@ -65,7 +65,7 @@ describe('My DSpace page', () => { cy.visit('/mydspace'); // Open the New Submission dropdown - cy.get('#dropdownSubmission').click(); + cy.get('button[data-test="submission-dropdown"]').click(); // Click on the "Item" type in that dropdown cy.get('#entityControlsDropdownMenu button[title="none"]').click(); @@ -98,7 +98,7 @@ describe('My DSpace page', () => { const id = subpaths[2]; // Click the "Save for Later" button to save this submission - cy.get('button#saveForLater').click(); + cy.get('ds-submission-form-footer [data-test="save-for-later"]').click(); // "Save for Later" should send us to MyDSpace cy.url().should('include', '/mydspace'); @@ -122,7 +122,7 @@ describe('My DSpace page', () => { cy.url().should('include', '/workspaceitems/' + id + '/edit'); // Discard our new submission by clicking Discard in Submission form & confirming - cy.get('button#discard').click(); + cy.get('ds-submission-form-footer [data-test="discard"]').click(); cy.get('button#discard_submit').click(); // Discarding should send us back to MyDSpace @@ -135,7 +135,7 @@ describe('My DSpace page', () => { cy.visit('/mydspace'); // Open the New Import dropdown - cy.get('#dropdownImport').click(); + cy.get('button[data-test="import-dropdown"]').click(); // Click on the "Item" type in that dropdown cy.get('#importControlsDropdownMenu button[title="none"]').click(); diff --git a/cypress/integration/search-page.spec.ts b/cypress/integration/search-page.spec.ts index de279c7f2e..623c370c56 100644 --- a/cypress/integration/search-page.spec.ts +++ b/cypress/integration/search-page.spec.ts @@ -24,7 +24,7 @@ describe('Search Page', () => { // Click each filter toggle to open *every* filter // (As we want to scan filter section for accessibility issues as well) - cy.get('.filter-toggle').click({ multiple: true }); + cy.get('[data-test="filter-toggle"]').click({ multiple: true }); // Analyze for accessibility issues testA11y( diff --git a/src/app/item-page/edit-item-page/item-bitstreams/item-edit-bitstream/item-edit-bitstream.component.html b/src/app/item-page/edit-item-page/item-bitstreams/item-edit-bitstream/item-edit-bitstream.component.html index 24db0ec300..5d1edb847f 100644 --- a/src/app/item-page/edit-item-page/item-bitstreams/item-edit-bitstream/item-edit-bitstream.component.html +++ b/src/app/item-page/edit-item-page/item-bitstreams/item-edit-bitstream/item-edit-bitstream.component.html @@ -27,7 +27,7 @@ + [attr.data-test]="'download-button' | dsBrowserOnly"> diff --git a/src/app/shared/log-in/methods/password/log-in-password.component.spec.ts b/src/app/shared/log-in/methods/password/log-in-password.component.spec.ts index 355d328f3f..5238482770 100644 --- a/src/app/shared/log-in/methods/password/log-in-password.component.spec.ts +++ b/src/app/shared/log-in/methods/password/log-in-password.component.spec.ts @@ -17,6 +17,7 @@ import { storeModuleConfig } from '../../../../app.reducer'; import { AuthMethod } from '../../../../core/auth/models/auth.method'; import { AuthMethodType } from '../../../../core/auth/models/auth.method-type'; import { HardRedirectService } from '../../../../core/services/hard-redirect.service'; +import { BrowserOnlyMockPipe } from '../../../testing/browser-only-mock.pipe'; describe('LogInPasswordComponent', () => { @@ -57,7 +58,8 @@ describe('LogInPasswordComponent', () => { TranslateModule.forRoot() ], declarations: [ - LogInPasswordComponent + LogInPasswordComponent, + BrowserOnlyMockPipe, ], providers: [ { provide: AuthService, useClass: AuthServiceStub }, diff --git a/src/app/shared/log-out/log-out.component.html b/src/app/shared/log-out/log-out.component.html index 9151cb0c2d..83e58b3841 100644 --- a/src/app/shared/log-out/log-out.component.html +++ b/src/app/shared/log-out/log-out.component.html @@ -2,5 +2,5 @@ - + diff --git a/src/app/shared/log-out/log-out.component.spec.ts b/src/app/shared/log-out/log-out.component.spec.ts index f15203ed8b..028738a019 100644 --- a/src/app/shared/log-out/log-out.component.spec.ts +++ b/src/app/shared/log-out/log-out.component.spec.ts @@ -12,6 +12,7 @@ import { Router } from '@angular/router'; import { AppState } from '../../app.reducer'; import { LogOutComponent } from './log-out.component'; import { RouterStub } from '../testing/router.stub'; +import { BrowserOnlyMockPipe } from '../testing/browser-only-mock.pipe'; describe('LogOutComponent', () => { @@ -46,7 +47,8 @@ describe('LogOutComponent', () => { TranslateModule.forRoot() ], declarations: [ - LogOutComponent + LogOutComponent, + BrowserOnlyMockPipe, ], providers: [ { provide: Router, useValue: routerStub }, diff --git a/src/app/shared/object-grid/object-grid.component.html b/src/app/shared/object-grid/object-grid.component.html index 07dbcec805..c988e76803 100644 --- a/src/app/shared/object-grid/object-grid.component.html +++ b/src/app/shared/object-grid/object-grid.component.html @@ -18,7 +18,7 @@ >
    -
    +
    diff --git a/src/app/shared/object-list/object-list.component.html b/src/app/shared/object-list/object-list.component.html index 492cb4cf07..927f2b9d2a 100644 --- a/src/app/shared/object-list/object-list.component.html +++ b/src/app/shared/object-list/object-list.component.html @@ -17,7 +17,7 @@ (next)="goNext()" >
      -
    • +
    - - +
    diff --git a/src/app/shared/search-form/search-form.component.spec.ts b/src/app/shared/search-form/search-form.component.spec.ts index 934f00b10c..84c61f569b 100644 --- a/src/app/shared/search-form/search-form.component.spec.ts +++ b/src/app/shared/search-form/search-form.component.spec.ts @@ -14,6 +14,7 @@ import { PaginationServiceStub } from '../testing/pagination-service.stub'; import { DSpaceObjectDataService } from '../../core/data/dspace-object-data.service'; import { createSuccessfulRemoteDataObject$ } from '../remote-data.utils'; import { FindListOptions } from '../../core/data/find-list-options.model'; +import { BrowserOnlyMockPipe } from '../testing/browser-only-mock.pipe'; describe('SearchFormComponent', () => { let comp: SearchFormComponent; @@ -37,7 +38,10 @@ describe('SearchFormComponent', () => { { provide: SearchConfigurationService, useValue: searchConfigService }, { provide: DSpaceObjectDataService, useValue: { findById: () => createSuccessfulRemoteDataObject$(undefined)} } ], - declarations: [SearchFormComponent] + declarations: [ + SearchFormComponent, + BrowserOnlyMockPipe, + ] }).compileComponents(); })); diff --git a/src/app/shared/search/search-filters/search-filter/search-filter.component.html b/src/app/shared/search/search-filters/search-filter/search-filter.component.html index 230f072772..452433e165 100644 --- a/src/app/shared/search/search-filters/search-filter/search-filter.component.html +++ b/src/app/shared/search/search-filters/search-filter/search-filter.component.html @@ -4,6 +4,7 @@ class="filter-name d-flex" [attr.aria-controls]="regionId" [id]="toggleId" [attr.aria-expanded]="false" [attr.aria-label]="((collapsed$ | async) ? 'search.filters.filter.expand' : 'search.filters.filter.collapse') | translate" + [attr.data-test]="'filter-toggle' | dsBrowserOnly" >
    {{'search.filters.filter.' + filter.name + '.head'| translate}} diff --git a/src/app/shared/search/search-filters/search-filter/search-filter.component.spec.ts b/src/app/shared/search/search-filters/search-filter/search-filter.component.spec.ts index 662b380ce8..7abe45ca8c 100644 --- a/src/app/shared/search/search-filters/search-filter/search-filter.component.spec.ts +++ b/src/app/shared/search/search-filters/search-filter/search-filter.component.spec.ts @@ -13,6 +13,7 @@ import { FilterType } from '../../models/filter-type.model'; import { SearchConfigurationServiceStub } from '../../../testing/search-configuration-service.stub'; import { SEARCH_CONFIG_SERVICE } from '../../../../my-dspace-page/my-dspace-page.component'; import { SequenceService } from '../../../../core/shared/sequence.service'; +import { BrowserOnlyMockPipe } from '../../../testing/browser-only-mock.pipe'; describe('SearchFilterComponent', () => { let comp: SearchFilterComponent; @@ -62,7 +63,10 @@ describe('SearchFilterComponent', () => { TestBed.configureTestingModule({ imports: [TranslateModule.forRoot(), RouterTestingModule.withRoutes([]), NoopAnimationsModule], - declarations: [SearchFilterComponent], + declarations: [ + SearchFilterComponent, + BrowserOnlyMockPipe, + ], providers: [ { provide: SearchService, useValue: searchServiceStub }, { diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index 37f4fafb1e..2388c2f13e 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -173,7 +173,7 @@ import { DsSelectComponent } from './ds-select/ds-select.component'; import { LogInOidcComponent } from './log-in/methods/oidc/log-in-oidc.component'; import { ThemedItemListPreviewComponent } from './object-list/my-dspace-result-list-element/item-list-preview/themed-item-list-preview.component'; import { ExternalLinkMenuItemComponent } from './menu/menu-item/external-link-menu-item.component'; - +import { BrowserOnlyPipe } from './utils/browser-only.pipe'; const MODULES = [ // Do NOT include UniversalModule, HttpModule, or JsonpModule here CommonModule, @@ -215,7 +215,8 @@ const PIPES = [ ObjectKeysPipe, ObjectValuesPipe, ConsolePipe, - ObjNgFor + ObjNgFor, + BrowserOnlyPipe, ]; const COMPONENTS = [ diff --git a/src/app/shared/sidebar/filter/sidebar-filter.component.html b/src/app/shared/sidebar/filter/sidebar-filter.component.html index bd392aa715..79afaa7583 100644 --- a/src/app/shared/sidebar/filter/sidebar-filter.component.html +++ b/src/app/shared/sidebar/filter/sidebar-filter.component.html @@ -1,5 +1,5 @@
    -
    +
    {{ label | translate }}
    diff --git a/src/app/shared/testing/browser-only-mock.pipe.ts b/src/app/shared/testing/browser-only-mock.pipe.ts new file mode 100644 index 0000000000..12e5a7b2d7 --- /dev/null +++ b/src/app/shared/testing/browser-only-mock.pipe.ts @@ -0,0 +1,13 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +/** + * Support dsBrowserOnly in unit tests. + */ +@Pipe({ + name: 'dsBrowserOnly' +}) +export class BrowserOnlyMockPipe implements PipeTransform { + transform(value: string): string | undefined { + return value; + } +} diff --git a/src/app/shared/testing/test-module.ts b/src/app/shared/testing/test-module.ts index b43adde8ae..7d45dd41f3 100644 --- a/src/app/shared/testing/test-module.ts +++ b/src/app/shared/testing/test-module.ts @@ -5,6 +5,7 @@ import { SharedModule } from '../shared.module'; import { NgComponentOutletDirectiveStub } from './ng-component-outlet-directive.stub'; import { QueryParamsDirectiveStub } from './query-params-directive.stub'; import { RouterLinkDirectiveStub } from './router-link-directive.stub'; +import { BrowserOnlyMockPipe } from './browser-only-mock.pipe'; /** * This module isn't used. It serves to prevent the AoT compiler @@ -21,7 +22,8 @@ import { RouterLinkDirectiveStub } from './router-link-directive.stub'; QueryParamsDirectiveStub, MySimpleItemActionComponent, RouterLinkDirectiveStub, - NgComponentOutletDirectiveStub + NgComponentOutletDirectiveStub, + BrowserOnlyMockPipe, ], exports: [ QueryParamsDirectiveStub diff --git a/src/app/shared/utils/browser-only.pipe.ts b/src/app/shared/utils/browser-only.pipe.ts new file mode 100644 index 0000000000..fc95bfda22 --- /dev/null +++ b/src/app/shared/utils/browser-only.pipe.ts @@ -0,0 +1,24 @@ +import { Inject, Pipe, PipeTransform, PLATFORM_ID } from '@angular/core'; +import { isPlatformBrowser } from '@angular/common'; + +/** + * A pipe that only returns its intput when run in the browser. + * Used to distinguish client-side rendered content from server-side rendered content. + */ +@Pipe({ + name: 'dsBrowserOnly' +}) +export class BrowserOnlyPipe implements PipeTransform { + constructor( + @Inject(PLATFORM_ID) private platformID: any, + ) { + } + + transform(value: string): string | undefined { + if (isPlatformBrowser((this.platformID))) { + return value; + } else { + return undefined; + } + } +} diff --git a/src/app/shared/view-mode-switch/view-mode-switch.component.html b/src/app/shared/view-mode-switch/view-mode-switch.component.html index 2863a4832b..5f70bc699c 100644 --- a/src/app/shared/view-mode-switch/view-mode-switch.component.html +++ b/src/app/shared/view-mode-switch/view-mode-switch.component.html @@ -7,7 +7,7 @@ routerLinkActive="active" [class.active]="currentMode === viewModeEnum.ListElement" class="btn btn-secondary" - data-test="list-view"> + [attr.data-test]="'list-view' | dsBrowserOnly"> + [attr.data-test]="'grid-view' | dsBrowserOnly"> + [attr.data-test]="'detail-view' | dsBrowserOnly">
    diff --git a/src/app/shared/view-mode-switch/view-mode-switch.component.spec.ts b/src/app/shared/view-mode-switch/view-mode-switch.component.spec.ts index d361857413..5780ea5cf3 100644 --- a/src/app/shared/view-mode-switch/view-mode-switch.component.spec.ts +++ b/src/app/shared/view-mode-switch/view-mode-switch.component.spec.ts @@ -9,6 +9,7 @@ import { SearchService } from '../../core/shared/search/search.service'; import { ViewModeSwitchComponent } from './view-mode-switch.component'; import { SearchServiceStub } from '../testing/search-service.stub'; import { ViewMode } from '../../core/shared/view-mode.model'; +import { BrowserOnlyMockPipe } from '../testing/browser-only-mock.pipe'; @Component({ template: '' }) class DummyComponent { @@ -36,7 +37,8 @@ describe('ViewModeSwitchComponent', () => { ], declarations: [ ViewModeSwitchComponent, - DummyComponent + DummyComponent, + BrowserOnlyMockPipe, ], providers: [ { provide: SearchService, useValue: searchService }, diff --git a/src/app/submission/form/footer/submission-form-footer.component.html b/src/app/submission/form/footer/submission-form-footer.component.html index 7013c55667..e898e1c220 100644 --- a/src/app/submission/form/footer/submission-form-footer.component.html +++ b/src/app/submission/form/footer/submission-form-footer.component.html @@ -3,6 +3,7 @@ +
    +
    + + + +
    + +
    +
    +
    +
    + +
    - diff --git a/src/app/item-page/edit-item-page/item-authorizations/item-authorizations.component.scss b/src/app/item-page/edit-item-page/item-authorizations/item-authorizations.component.scss new file mode 100644 index 0000000000..c3694e6784 --- /dev/null +++ b/src/app/item-page/edit-item-page/item-authorizations/item-authorizations.component.scss @@ -0,0 +1,4 @@ +.auth-bitstream-container { + margin-top: -1em; + margin-bottom: 1.5em; +} diff --git a/src/app/item-page/edit-item-page/item-authorizations/item-authorizations.component.ts b/src/app/item-page/edit-item-page/item-authorizations/item-authorizations.component.ts index 76597a135b..f3313d4cef 100644 --- a/src/app/item-page/edit-item-page/item-authorizations/item-authorizations.component.ts +++ b/src/app/item-page/edit-item-page/item-authorizations/item-authorizations.component.ts @@ -1,3 +1,5 @@ +import { isEqual } from 'lodash'; +import { DSONameService } from './../../../core/breadcrumbs/dso-name.service'; import { Component, OnDestroy, OnInit } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; @@ -25,7 +27,8 @@ interface BundleBitstreamsMapEntry { @Component({ selector: 'ds-item-authorizations', - templateUrl: './item-authorizations.component.html' + templateUrl: './item-authorizations.component.html', + styleUrls:['./item-authorizations.component.scss'] }) /** * Component that handles the item Authorizations @@ -36,14 +39,20 @@ export class ItemAuthorizationsComponent implements OnInit, OnDestroy { * A map that contains all bitstream of the item's bundles * @type {Observable>>>} */ - public bundleBitstreamsMap: Map>> = new Map>>(); + public bundleBitstreamsMap: Map = new Map(); /** - * The list of bundle for the item + * The list of all bundles for the item * @type {Observable>} */ private bundles$: BehaviorSubject = new BehaviorSubject([]); + /** + * The list of bundles to be displayed in the template + * @type {BehaviorSubject} + */ + bundlesToShow$: BehaviorSubject = new BehaviorSubject([]); + /** * The target editing item * @type {Observable} @@ -56,6 +65,37 @@ export class ItemAuthorizationsComponent implements OnInit, OnDestroy { */ private subs: Subscription[] = []; + /** + * The size of the bundles to be loaded on demand + * @type {number} + */ + bunblesPerPage = 6; + + /** + * The number of current page + * @type {number} + */ + bunblesPageSize = 1; + + /** + * The flag to show or not the 'Load more' button + * based on the condition if all the bundles are loaded or not + * @type {boolean} + */ + allBundlesLoaded = false; + + /** + * Initial size of loaded bitstreams + * The size of incrementation used in bitstream pagination + */ + bitstreamSize = 4; + + /** + * The size of the loaded bitstremas at a certain moment + * @private + */ + private bitstreamPageSize = 4; + /** * Initialize instance variables * @@ -64,7 +104,8 @@ export class ItemAuthorizationsComponent implements OnInit, OnDestroy { */ constructor( private linkService: LinkService, - private route: ActivatedRoute + private route: ActivatedRoute, + private nameService: DSONameService ) { } @@ -72,16 +113,53 @@ export class ItemAuthorizationsComponent implements OnInit, OnDestroy { * Initialize the component, setting up the bundle and bitstream within the item */ ngOnInit(): void { + this.getBundlesPerItem(); + } + + /** + * Return the item's UUID + */ + getItemUUID(): Observable { + return this.item$.pipe( + map((item: Item) => item.id), + first((UUID: string) => isNotEmpty(UUID)) + ); + } + + /** + * Return the item's name + */ + getItemName(): Observable { + return this.item$.pipe( + map((item: Item) => this.nameService.getName(item)) + ); + } + + /** + * Return all item's bundles + * + * @return an observable that emits all item's bundles + */ + getItemBundles(): Observable { + return this.bundles$.asObservable(); + } + + /** + * Get all bundles per item + * and all the bitstreams per bundle + * @param page number of current page + */ + getBundlesPerItem(page: number = 1) { this.item$ = this.route.data.pipe( map((data) => data.dso), getFirstSucceededRemoteDataWithNotEmptyPayload(), map((item: Item) => this.linkService.resolveLink( item, - followLink('bundles', {}, followLink('bitstreams')) + followLink('bundles', {findListOptions: {currentPage : page, elementsPerPage: this.bunblesPerPage}}, followLink('bitstreams')) )) ) as Observable; - const bundles$: Observable> = this.item$.pipe( + const bundles$: Observable> = this.item$.pipe( filter((item: Item) => isNotEmpty(item.bundles)), mergeMap((item: Item) => item.bundles), getFirstSucceededRemoteDataWithNotEmptyPayload(), @@ -96,37 +174,40 @@ export class ItemAuthorizationsComponent implements OnInit, OnDestroy { take(1), map((list: PaginatedList) => list.page) ).subscribe((bundles: Bundle[]) => { - this.bundles$.next(bundles); + if (isEqual(bundles.length,0) || bundles.length < this.bunblesPerPage) { + this.allBundlesLoaded = true; + } + if (isEqual(page, 1)) { + this.bundles$.next(bundles); + this.bundlesToShow$.next(bundles); + } else { + this.bundlesToShow$.next(this.bundles$.getValue().concat(bundles)); + this.bundles$.next(this.bundles$.getValue().concat(bundles)); + } }), bundles$.pipe( take(1), mergeMap((list: PaginatedList) => list.page), map((bundle: Bundle) => ({ id: bundle.id, bitstreams: this.getBundleBitstreams(bundle) })) ).subscribe((entry: BundleBitstreamsMapEntry) => { - this.bundleBitstreamsMap.set(entry.id, entry.bitstreams); + let bitstreamMapValues: BitstreamMapValue = { + isCollapsed: true, + allBitstreamsLoaded: false, + bitstreams: null + }; + let bits = entry.bitstreams.pipe( + map((b: PaginatedList) => { + bitstreamMapValues.allBitstreamsLoaded = b?.page.length < this.bitstreamSize ; + let firstLoaded = [...b.page.slice(0, this.bitstreamSize)]; + return firstLoaded; + }) + ); + bitstreamMapValues.bitstreams = bits; + this.bundleBitstreamsMap.set(entry.id, bitstreamMapValues); }) ); } - /** - * Return the item's UUID - */ - getItemUUID(): Observable { - return this.item$.pipe( - map((item: Item) => item.id), - first((UUID: string) => isNotEmpty(UUID)) - ); - } - - /** - * Return all item's bundles - * - * @return an observable that emits all item's bundles - */ - getItemBundles(): Observable { - return this.bundles$.asObservable(); - } - /** * Return all bundle's bitstreams * @@ -142,6 +223,48 @@ export class ItemAuthorizationsComponent implements OnInit, OnDestroy { ); } + /** + * Changes the collapsible state of the area that contains the bitstream list + * @param bundleId Id of bundle responsible for the requested bitstreams + */ + collapseArea(bundleId: string) { + this.bundleBitstreamsMap.get(bundleId).isCollapsed = !this.bundleBitstreamsMap.get(bundleId).isCollapsed; + } + + /** + * Loads as much bundles as initial value of bundleSize to be displayed + */ + onBunbleLoad(){ + this.bunblesPageSize ++; + this.getBundlesPerItem(this.bunblesPageSize); + } + + /** + * Calculates the bitstreams that are going to be loaded on demand, + * based on the number configured on this.bitstreamSize. + * @param bundle parent of bitstreams that are requested to be shown + * @returns Subscription + */ + onBitstreamsLoad(bundle: Bundle) { + return this.getBundleBitstreams(bundle).pipe( + map((res: PaginatedList) => { + let nextBitstreams = res?.page.slice(this.bitstreamPageSize, this.bitstreamPageSize + this.bitstreamSize); + let bitstreamsToShow = this.bundleBitstreamsMap.get(bundle.id).bitstreams.pipe( + map((existingBits: Bitstream[])=> { + return [... existingBits, ...nextBitstreams]; + }) + ); + this.bitstreamPageSize = this.bitstreamPageSize + this.bitstreamSize; + let bitstreamMapValues: BitstreamMapValue = { + bitstreams: bitstreamsToShow , + isCollapsed: this.bundleBitstreamsMap.get(bundle.id).isCollapsed, + allBitstreamsLoaded: res?.page.length <= this.bitstreamPageSize + }; + this.bundleBitstreamsMap.set(bundle.id, bitstreamMapValues); + }) + ).subscribe(); + } + /** * Unsubscribe from all subscriptions */ @@ -151,3 +274,9 @@ export class ItemAuthorizationsComponent implements OnInit, OnDestroy { .forEach((subscription) => subscription.unsubscribe()); } } + +export interface BitstreamMapValue { + bitstreams: Observable; + isCollapsed: boolean; + allBitstreamsLoaded: boolean; +} diff --git a/src/app/shared/resource-policies/resource-policies.component.html b/src/app/shared/resource-policies/resource-policies.component.html index 0a1ccf7952..5d11ac81f2 100644 --- a/src/app/shared/resource-policies/resource-policies.component.html +++ b/src/app/shared/resource-policies/resource-policies.component.html @@ -4,9 +4,16 @@
    - {{ 'resource-policies.table.headers.title.for.' + resourceType | translate }} {{resourceUUID}} + + {{ 'resource-policies.table.headers.title.for.' + resourceType | translate }} + + {{resourceName}} + + ({{resourceUUID}}) + +
    - -
    @@ -21,13 +21,13 @@ [resourceName]="bitstream.name">
    - +
    - +
    diff --git a/src/app/item-page/edit-item-page/item-authorizations/item-authorizations.component.ts b/src/app/item-page/edit-item-page/item-authorizations/item-authorizations.component.ts index f3313d4cef..a833b90b20 100644 --- a/src/app/item-page/edit-item-page/item-authorizations/item-authorizations.component.ts +++ b/src/app/item-page/edit-item-page/item-authorizations/item-authorizations.component.ts @@ -45,13 +45,7 @@ export class ItemAuthorizationsComponent implements OnInit, OnDestroy { * The list of all bundles for the item * @type {Observable>} */ - private bundles$: BehaviorSubject = new BehaviorSubject([]); - - /** - * The list of bundles to be displayed in the template - * @type {BehaviorSubject} - */ - bundlesToShow$: BehaviorSubject = new BehaviorSubject([]); + bundles$: BehaviorSubject = new BehaviorSubject([]); /** * The target editing item @@ -69,13 +63,13 @@ export class ItemAuthorizationsComponent implements OnInit, OnDestroy { * The size of the bundles to be loaded on demand * @type {number} */ - bunblesPerPage = 6; + bunblesPerPage = 1; /** * The number of current page * @type {number} */ - bunblesPageSize = 1; + bunblesPageSize = 6; /** * The flag to show or not the 'Load more' button @@ -179,9 +173,7 @@ export class ItemAuthorizationsComponent implements OnInit, OnDestroy { } if (isEqual(page, 1)) { this.bundles$.next(bundles); - this.bundlesToShow$.next(bundles); } else { - this.bundlesToShow$.next(this.bundles$.getValue().concat(bundles)); this.bundles$.next(this.bundles$.getValue().concat(bundles)); } }), diff --git a/src/app/shared/resource-policies/resource-policies.component.html b/src/app/shared/resource-policies/resource-policies.component.html index 5d11ac81f2..d1fd9266b1 100644 --- a/src/app/shared/resource-policies/resource-policies.component.html +++ b/src/app/shared/resource-policies/resource-policies.component.html @@ -6,7 +6,6 @@
    {{ 'resource-policies.table.headers.title.for.' + resourceType | translate }} - {{resourceName}} ({{resourceUUID}}) diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 76f4f538ea..cef52fde9c 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -848,6 +848,12 @@ "collection.edit.tabs.authorizations.title": "Collection Edit - Authorizations", + "collection.edit.item.authorizations.load-bundle-button": "Load more bundles", + + "collection.edit.item.authorizations.load-more-button": "Load more", + + "collection.edit.item.authorizations.show-bitstreams-button": "Show all Bitstreams' Policies for Bundle", + "collection.edit.tabs.metadata.head": "Edit Metadata", "collection.edit.tabs.metadata.title": "Collection Edit - Metadata", From 6cd41be3b80278fd086ffbf6ad7ad023a5aa3e67 Mon Sep 17 00:00:00 2001 From: Alisa Ismailati Date: Mon, 9 May 2022 12:01:46 +0200 Subject: [PATCH 136/343] [CST-5677] Changed bunblesPerPage value --- .../item-authorizations/item-authorizations.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/item-page/edit-item-page/item-authorizations/item-authorizations.component.ts b/src/app/item-page/edit-item-page/item-authorizations/item-authorizations.component.ts index a833b90b20..f018d1c642 100644 --- a/src/app/item-page/edit-item-page/item-authorizations/item-authorizations.component.ts +++ b/src/app/item-page/edit-item-page/item-authorizations/item-authorizations.component.ts @@ -63,7 +63,7 @@ export class ItemAuthorizationsComponent implements OnInit, OnDestroy { * The size of the bundles to be loaded on demand * @type {number} */ - bunblesPerPage = 1; + bunblesPerPage = 6; /** * The number of current page From 32d7fca27af3d92eda08c998414a2927fb4ad2c3 Mon Sep 17 00:00:00 2001 From: Alisa Ismailati Date: Mon, 9 May 2022 12:02:50 +0200 Subject: [PATCH 137/343] [CST-5677] Changed bunblesPageSize value --- .../item-authorizations/item-authorizations.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/item-page/edit-item-page/item-authorizations/item-authorizations.component.ts b/src/app/item-page/edit-item-page/item-authorizations/item-authorizations.component.ts index f018d1c642..3a7a7d95f2 100644 --- a/src/app/item-page/edit-item-page/item-authorizations/item-authorizations.component.ts +++ b/src/app/item-page/edit-item-page/item-authorizations/item-authorizations.component.ts @@ -69,7 +69,7 @@ export class ItemAuthorizationsComponent implements OnInit, OnDestroy { * The number of current page * @type {number} */ - bunblesPageSize = 6; + bunblesPageSize = 1; /** * The flag to show or not the 'Load more' button From 51058daf27f0d63aecdc3f28a981ddc23b108ef7 Mon Sep 17 00:00:00 2001 From: Kim Shepherd Date: Tue, 10 May 2022 09:25:59 +1200 Subject: [PATCH 138/343] [TLC-254] tidy imports in type bind service --- .../ds-dynamic-form-ui/ds-dynamic-type-bind-relation.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-type-bind-relation.service.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-type-bind-relation.service.ts index f8a7376c3e..5dd4a6627d 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-type-bind-relation.service.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-type-bind-relation.service.ts @@ -15,7 +15,7 @@ import { OR_OPERATOR } from '@ng-dynamic-forms/core'; -import {hasNoValue, hasValue, isEmpty} from '../../../empty.util'; +import {hasNoValue, hasValue} from '../../../empty.util'; import { FormBuilderService } from '../form-builder.service'; import { FormFieldMetadataValueObject } from '../models/form-field-metadata-value.model'; import { DYNAMIC_FORM_CONTROL_TYPE_RELATION_GROUP } from './ds-dynamic-form-constants'; From 0b664431afb6306a67034e70261b406081b805f0 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Tue, 10 May 2022 18:10:50 +0200 Subject: [PATCH 139/343] [CST-5307] Create a standalone component for person claim button --- .../item-pages/person/person.component.html | 14 +- .../person/person.component.spec.ts | 52 +++- .../item-pages/person/person.component.ts | 81 +------ .../person-page-claim-button.component.html | 1 + .../person-page-claim-button.component.scss | 0 ...person-page-claim-button.component.spec.ts | 186 ++++++++++++++ .../person-page-claim-button.component.ts | 85 +++++++ src/app/shared/shared.module.ts | 229 +++++++++++++----- src/assets/i18n/en.json5 | 2 + 9 files changed, 501 insertions(+), 149 deletions(-) create mode 100644 src/app/shared/dso-page/person-page-claim-button/person-page-claim-button.component.html create mode 100644 src/app/shared/dso-page/person-page-claim-button/person-page-claim-button.component.scss create mode 100644 src/app/shared/dso-page/person-page-claim-button/person-page-claim-button.component.spec.ts create mode 100644 src/app/shared/dso-page/person-page-claim-button/person-page-claim-button.component.ts diff --git a/src/app/entity-groups/research-entities/item-pages/person/person.component.html b/src/app/entity-groups/research-entities/item-pages/person/person.component.html index 7505a31327..96cfdbfacd 100644 --- a/src/app/entity-groups/research-entities/item-pages/person/person.component.html +++ b/src/app/entity-groups/research-entities/item-pages/person/person.component.html @@ -4,7 +4,7 @@
    - +
    @@ -20,18 +20,10 @@ [fields]="['person.email']" [label]="'person.page.email'"> - - - - - - - -
    + +
    {{"item.page.link.full" | translate}} diff --git a/src/app/entity-groups/research-entities/item-pages/person/person.component.spec.ts b/src/app/entity-groups/research-entities/item-pages/person/person.component.spec.ts index 93b3cf208d..efbc48a209 100644 --- a/src/app/entity-groups/research-entities/item-pages/person/person.component.spec.ts +++ b/src/app/entity-groups/research-entities/item-pages/person/person.component.spec.ts @@ -17,24 +17,12 @@ const mockItem: Item = Object.assign(new Item(), { value: 'fake@email.com' } ], - // 'person.identifier.orcid': [ - // { - // language: 'en_US', - // value: 'ORCID-1' - // } - // ], 'person.birthDate': [ { language: 'en_US', value: '1993' } ], - // 'person.identifier.staffid': [ - // { - // language: 'en_US', - // value: '1' - // } - // ], 'person.jobTitle': [ { language: 'en_US', @@ -62,4 +50,42 @@ const mockItem: Item = Object.assign(new Item(), { } }); -describe('PersonComponent', getItemPageFieldsTest(mockItem, PersonComponent)); +const mockItemWithTitle: Item = Object.assign(new Item(), { + bundles: createSuccessfulRemoteDataObject$(buildPaginatedList(new PageInfo(), [])), + metadata: { + 'person.email': [ + { + language: 'en_US', + value: 'fake@email.com' + } + ], + 'person.birthDate': [ + { + language: 'en_US', + value: '1993' + } + ], + 'person.jobTitle': [ + { + language: 'en_US', + value: 'Developer' + } + ], + 'dc.title': [ + { + language: 'en_US', + value: 'Doe, John' + } + ] + }, + relationships: createRelationshipsObservable(), + _links: { + self : { + href: 'item-href' + } + } +}); + +describe('PersonComponent with family and given names', getItemPageFieldsTest(mockItem, PersonComponent)); + +describe('PersonComponent with dc.title', getItemPageFieldsTest(mockItemWithTitle, PersonComponent)); diff --git a/src/app/entity-groups/research-entities/item-pages/person/person.component.ts b/src/app/entity-groups/research-entities/item-pages/person/person.component.ts index 33db18681f..27fdd2ab15 100644 --- a/src/app/entity-groups/research-entities/item-pages/person/person.component.ts +++ b/src/app/entity-groups/research-entities/item-pages/person/person.component.ts @@ -1,20 +1,10 @@ -import {Component, OnInit} from '@angular/core'; +import { Component } from '@angular/core'; import { ItemComponent } from '../../../../item-page/simple/item-types/shared/item.component'; import { ViewMode } from '../../../../core/shared/view-mode.model'; -import { listableObjectComponent } from '../../../../shared/object-collection/shared/listable-object/listable-object.decorator'; -import {MetadataValue} from '../../../../core/shared/metadata.models'; -import {FeatureID} from '../../../../core/data/feature-authorization/feature-id'; -import {mergeMap, take} from 'rxjs/operators'; -import {getFirstSucceededRemoteData} from '../../../../core/shared/operators'; -import {RemoteData} from '../../../../core/data/remote-data'; -import {ResearcherProfile} from '../../../../core/profile/model/researcher-profile.model'; -import {isNotUndefined} from '../../../../shared/empty.util'; -import {BehaviorSubject, Observable} from 'rxjs'; -import {RouteService} from '../../../../core/services/route.service'; -import {AuthorizationDataService} from '../../../../core/data/feature-authorization/authorization-data.service'; -import {ResearcherProfileService} from '../../../../core/profile/researcher-profile.service'; -import {NotificationsService} from '../../../../shared/notifications/notifications.service'; -import {TranslateService} from '@ngx-translate/core'; +import { + listableObjectComponent +} from '../../../../shared/object-collection/shared/listable-object/listable-object.decorator'; +import { MetadataValue } from '../../../../core/shared/metadata.models'; @listableObjectComponent('Person', ViewMode.StandalonePage) @Component({ @@ -25,76 +15,25 @@ import {TranslateService} from '@ngx-translate/core'; /** * The component for displaying metadata and relations of an item of the type Person */ -export class PersonComponent extends ItemComponent implements OnInit { - - claimable$: BehaviorSubject = new BehaviorSubject(false); - - constructor(protected routeService: RouteService, - protected authorizationService: AuthorizationDataService, - protected notificationsService: NotificationsService, - protected translate: TranslateService, - protected researcherProfileService: ResearcherProfileService) { - super(routeService); - } - - ngOnInit(): void { - super.ngOnInit(); - - this.authorizationService.isAuthorized(FeatureID.CanClaimItem, this.object._links.self.href).pipe( - take(1) - ).subscribe((isAuthorized: boolean) => { - this.claimable$.next(isAuthorized); - }); - - } - - /** - * Create a new researcher profile claiming the current item. - */ - claim() { - this.researcherProfileService.createFromExternalSource(this.object._links.self.href).pipe( - getFirstSucceededRemoteData(), - mergeMap((rd: RemoteData) => { - return this.researcherProfileService.findRelatedItemId(rd.payload); - })) - .subscribe((id: string) => { - if (isNotUndefined(id)) { - this.notificationsService.success(this.translate.get('researcherprofile.success.claim.title'), - this.translate.get('researcherprofile.success.claim.body')); - this.claimable$.next(false); - } else { - this.notificationsService.error( - this.translate.get('researcherprofile.error.claim.title'), - this.translate.get('researcherprofile.error.claim.body')); - } - }); - } - - /** - * Returns true if the item is claimable, false otherwise. - */ - isClaimable(): Observable { - return this.claimable$; - } +export class PersonComponent extends ItemComponent { /** * Returns the metadata values to be used for the page title. */ - getTitleMetadataValues(): MetadataValue[]{ + getTitleMetadataValues(): MetadataValue[] { const metadataValues = []; const familyName = this.object?.firstMetadata('person.familyName'); const givenName = this.object?.firstMetadata('person.givenName'); const title = this.object?.firstMetadata('dc.title'); - if (familyName){ + if (familyName) { metadataValues.push(familyName); } - if (givenName){ + if (givenName) { metadataValues.push(givenName); } - if (metadataValues.length === 0 && title){ + if (metadataValues.length === 0 && title) { metadataValues.push(title); } return metadataValues; } - } diff --git a/src/app/shared/dso-page/person-page-claim-button/person-page-claim-button.component.html b/src/app/shared/dso-page/person-page-claim-button/person-page-claim-button.component.html new file mode 100644 index 0000000000..12d5d2b47d --- /dev/null +++ b/src/app/shared/dso-page/person-page-claim-button/person-page-claim-button.component.html @@ -0,0 +1 @@ + diff --git a/src/app/shared/dso-page/person-page-claim-button/person-page-claim-button.component.scss b/src/app/shared/dso-page/person-page-claim-button/person-page-claim-button.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/shared/dso-page/person-page-claim-button/person-page-claim-button.component.spec.ts b/src/app/shared/dso-page/person-page-claim-button/person-page-claim-button.component.spec.ts new file mode 100644 index 0000000000..168517b47a --- /dev/null +++ b/src/app/shared/dso-page/person-page-claim-button/person-page-claim-button.component.spec.ts @@ -0,0 +1,186 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; + +import { of as observableOf } from 'rxjs'; +import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; + +import { PersonPageClaimButtonComponent } from './person-page-claim-button.component'; +import { AuthorizationDataService } from '../../../core/data/feature-authorization/authorization-data.service'; +import { NotificationsService } from '../../notifications/notifications.service'; +import { NotificationsServiceStub } from '../../testing/notifications-service.stub'; +import { TranslateLoaderMock } from '../../mocks/translate-loader.mock'; +import { ResearcherProfileService } from '../../../core/profile/researcher-profile.service'; +import { RouteService } from '../../../core/services/route.service'; +import { routeServiceStub } from '../../testing/route-service.stub'; +import { Item } from '../../../core/shared/item.model'; +import { ResearcherProfile } from '../../../core/profile/model/researcher-profile.model'; +import { createFailedRemoteDataObject$, createSuccessfulRemoteDataObject$ } from '../../remote-data.utils'; +import { getTestScheduler } from 'jasmine-marbles'; +import { TestScheduler } from 'rxjs/testing'; + +describe('PersonPageClaimButtonComponent', () => { + let scheduler: TestScheduler; + let component: PersonPageClaimButtonComponent; + let fixture: ComponentFixture; + + const mockItem: Item = Object.assign(new Item(), { + metadata: { + 'person.email': [ + { + language: 'en_US', + value: 'fake@email.com' + } + ], + 'person.birthDate': [ + { + language: 'en_US', + value: '1993' + } + ], + 'person.jobTitle': [ + { + language: 'en_US', + value: 'Developer' + } + ], + 'person.familyName': [ + { + language: 'en_US', + value: 'Doe' + } + ], + 'person.givenName': [ + { + language: 'en_US', + value: 'John' + } + ] + }, + _links: { + self: { + href: 'item-href' + } + } + }); + + const mockResearcherProfile: ResearcherProfile = Object.assign(new ResearcherProfile(), { + id: 'test-id', + visible: true, + type: 'profile', + _links: { + item: { + href: 'https://rest.api/rest/api/profiles/test-id/item' + }, + self: { + href: 'https://rest.api/rest/api/profiles/test-id' + }, + } + }); + + const notificationsService = new NotificationsServiceStub(); + + const authorizationDataService = jasmine.createSpyObj('authorizationDataService', { + isAuthorized: jasmine.createSpy('isAuthorized') + }); + + const researcherProfileService = jasmine.createSpyObj('researcherProfileService', { + createFromExternalSource: jasmine.createSpy('createFromExternalSource'), + findRelatedItemId: jasmine.createSpy('findRelatedItemId'), + }); + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useClass: TranslateLoaderMock + } + }) + ], + declarations: [PersonPageClaimButtonComponent], + providers: [ + { provide: AuthorizationDataService, useValue: authorizationDataService }, + { provide: NotificationsService, useValue: notificationsService }, + { provide: ResearcherProfileService, useValue: researcherProfileService }, + { provide: RouteService, useValue: routeServiceStub }, + ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(PersonPageClaimButtonComponent); + component = fixture.componentInstance; + component.object = mockItem; + }); + + describe('when item can be claimed', () => { + beforeEach(() => { + authorizationDataService.isAuthorized.and.returnValue(observableOf(true)); + researcherProfileService.createFromExternalSource.calls.reset(); + researcherProfileService.findRelatedItemId.calls.reset(); + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should create claim button', () => { + const btn = fixture.debugElement.query(By.css('[data-test="item-claim"]')); + expect(btn).toBeTruthy(); + }); + + describe('claim', () => { + describe('when successfully', () => { + beforeEach(() => { + scheduler = getTestScheduler(); + researcherProfileService.createFromExternalSource.and.returnValue(createSuccessfulRemoteDataObject$(mockResearcherProfile)); + researcherProfileService.findRelatedItemId.and.returnValue(observableOf('test-id')); + }); + + it('should display success notification', () => { + scheduler.schedule(() => component.claim()); + scheduler.flush(); + + expect(researcherProfileService.findRelatedItemId).toHaveBeenCalled(); + expect(notificationsService.success).toHaveBeenCalled(); + }); + }); + + describe('when not successfully', () => { + beforeEach(() => { + scheduler = getTestScheduler(); + researcherProfileService.createFromExternalSource.and.returnValue(createFailedRemoteDataObject$()); + }); + + it('should display success notification', () => { + scheduler.schedule(() => component.claim()); + scheduler.flush(); + + expect(researcherProfileService.findRelatedItemId).not.toHaveBeenCalled(); + expect(notificationsService.error).toHaveBeenCalled(); + }); + }); + }); + + }); + + describe('when item cannot be claimed', () => { + beforeEach(() => { + authorizationDataService.isAuthorized.and.returnValue(observableOf(false)); + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should create claim button', () => { + const btn = fixture.debugElement.query(By.css('[data-test="item-claim"]')); + expect(btn).toBeFalsy(); + }); + + }); +}); diff --git a/src/app/shared/dso-page/person-page-claim-button/person-page-claim-button.component.ts b/src/app/shared/dso-page/person-page-claim-button/person-page-claim-button.component.ts new file mode 100644 index 0000000000..d2e8e888e1 --- /dev/null +++ b/src/app/shared/dso-page/person-page-claim-button/person-page-claim-button.component.ts @@ -0,0 +1,85 @@ +import { Component, Input, OnInit } from '@angular/core'; + +import { BehaviorSubject, Observable, of as observableOf } from 'rxjs'; +import { mergeMap, take } from 'rxjs/operators'; +import { TranslateService } from '@ngx-translate/core'; + +import { RouteService } from '../../../core/services/route.service'; +import { AuthorizationDataService } from '../../../core/data/feature-authorization/authorization-data.service'; +import { NotificationsService } from '../../notifications/notifications.service'; +import { ResearcherProfileService } from '../../../core/profile/researcher-profile.service'; +import { FeatureID } from '../../../core/data/feature-authorization/feature-id'; +import { getFirstCompletedRemoteData } from '../../../core/shared/operators'; +import { RemoteData } from '../../../core/data/remote-data'; +import { ResearcherProfile } from '../../../core/profile/model/researcher-profile.model'; +import { isNotEmpty } from '../../empty.util'; +import { DSpaceObject } from '../../../core/shared/dspace-object.model'; + +@Component({ + selector: 'ds-person-page-claim-button', + templateUrl: './person-page-claim-button.component.html', + styleUrls: ['./person-page-claim-button.component.scss'] +}) +export class PersonPageClaimButtonComponent implements OnInit { + + /** + * The target person item to claim + */ + @Input() object: DSpaceObject; + + /** + * A boolean representing if item can be claimed or not + */ + claimable$: BehaviorSubject = new BehaviorSubject(false); + + constructor(protected routeService: RouteService, + protected authorizationService: AuthorizationDataService, + protected notificationsService: NotificationsService, + protected translate: TranslateService, + protected researcherProfileService: ResearcherProfileService) { + } + + ngOnInit(): void { + this.authorizationService.isAuthorized(FeatureID.CanClaimItem, this.object._links.self.href).pipe( + take(1) + ).subscribe((isAuthorized: boolean) => { + this.claimable$.next(isAuthorized); + }); + + } + + /** + * Create a new researcher profile claiming the current item. + */ + claim() { + this.researcherProfileService.createFromExternalSource(this.object._links.self.href).pipe( + getFirstCompletedRemoteData(), + mergeMap((rd: RemoteData) => { + console.log(rd); + if (rd.hasSucceeded) { + return this.researcherProfileService.findRelatedItemId(rd.payload); + } else { + return observableOf(null); + } + })) + .subscribe((id: string) => { + if (isNotEmpty(id)) { + this.notificationsService.success(this.translate.get('researcherprofile.success.claim.title'), + this.translate.get('researcherprofile.success.claim.body')); + this.claimable$.next(false); + } else { + this.notificationsService.error( + this.translate.get('researcherprofile.error.claim.title'), + this.translate.get('researcherprofile.error.claim.body')); + } + }); + } + + /** + * Returns true if the item is claimable, false otherwise. + */ + isClaimable(): Observable { + return this.claimable$; + } + +} diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index 847b3910e0..b2a36285bb 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -7,7 +7,12 @@ import { DragDropModule } from '@angular/cdk/drag-drop'; import { NouisliderModule } from 'ng2-nouislider'; import { - NgbDatepickerModule, NgbDropdownModule, NgbNavModule, NgbPaginationModule, NgbTimepickerModule, NgbTooltipModule, + NgbDatepickerModule, + NgbDropdownModule, + NgbNavModule, + NgbPaginationModule, + NgbTimepickerModule, + NgbTooltipModule, NgbTypeaheadModule, } from '@ng-bootstrap/ng-bootstrap'; import { MissingTranslationHandler, TranslateModule } from '@ngx-translate/core'; @@ -16,7 +21,9 @@ import { FileUploadModule } from 'ng2-file-upload'; import { InfiniteScrollModule } from 'ngx-infinite-scroll'; import { MomentModule } from 'ngx-moment'; import { ConfirmationModalComponent } from './confirmation-modal/confirmation-modal.component'; -import { ExportMetadataSelectorComponent } from './dso-selector/modal-wrappers/export-metadata-selector/export-metadata-selector.component'; +import { + ExportMetadataSelectorComponent +} from './dso-selector/modal-wrappers/export-metadata-selector/export-metadata-selector.component'; import { FileDropzoneNoUploaderComponent } from './file-dropzone-no-uploader/file-dropzone-no-uploader.component'; import { ItemListElementComponent } from './object-list/item-list-element/item-types/item/item-list-element.component'; import { EnumKeysPipe } from './utils/enum-keys-pipe'; @@ -24,13 +31,21 @@ import { FileSizePipe } from './utils/file-size-pipe'; import { MetadataFieldValidator } from './utils/metadatafield-validator.directive'; import { SafeUrlPipe } from './utils/safe-url-pipe'; import { ConsolePipe } from './utils/console.pipe'; -import { CollectionListElementComponent } from './object-list/collection-list-element/collection-list-element.component'; +import { + CollectionListElementComponent +} from './object-list/collection-list-element/collection-list-element.component'; import { CommunityListElementComponent } from './object-list/community-list-element/community-list-element.component'; -import { SearchResultListElementComponent } from './object-list/search-result-list-element/search-result-list-element.component'; +import { + SearchResultListElementComponent +} from './object-list/search-result-list-element/search-result-list-element.component'; import { ObjectListComponent } from './object-list/object-list.component'; -import { CollectionGridElementComponent } from './object-grid/collection-grid-element/collection-grid-element.component'; +import { + CollectionGridElementComponent +} from './object-grid/collection-grid-element/collection-grid-element.component'; import { CommunityGridElementComponent } from './object-grid/community-grid-element/community-grid-element.component'; -import { AbstractListableElementComponent } from './object-collection/shared/object-collection-element/abstract-listable-element.component'; +import { + AbstractListableElementComponent +} from './object-collection/shared/object-collection-element/abstract-listable-element.component'; import { ObjectGridComponent } from './object-grid/object-grid.component'; import { ObjectCollectionComponent } from './object-collection/object-collection.component'; import { ErrorComponent } from './error/error.component'; @@ -38,7 +53,9 @@ import { LoadingComponent } from './loading/loading.component'; import { PaginationComponent } from './pagination/pagination.component'; import { ThumbnailComponent } from '../thumbnail/thumbnail.component'; import { SearchFormComponent } from './search-form/search-form.component'; -import { SearchResultGridElementComponent } from './object-grid/search-result-grid-element/search-result-grid-element.component'; +import { + SearchResultGridElementComponent +} from './object-grid/search-result-grid-element/search-result-grid-element.component'; import { ViewModeSwitchComponent } from './view-mode-switch/view-mode-switch.component'; import { VarDirective } from './utils/var.directive'; import { AuthNavMenuComponent } from './auth-nav-menu/auth-nav-menu.component'; @@ -53,21 +70,33 @@ import { ChipsComponent } from './chips/chips.component'; import { NumberPickerComponent } from './number-picker/number-picker.component'; import { MockAdminGuard } from './mocks/admin-guard.service.mock'; import { AlertComponent } from './alert/alert.component'; -import { SearchResultDetailElementComponent } from './object-detail/my-dspace-result-detail-element/search-result-detail-element.component'; +import { + SearchResultDetailElementComponent +} from './object-detail/my-dspace-result-detail-element/search-result-detail-element.component'; import { ClaimedTaskActionsComponent } from './mydspace-actions/claimed-task/claimed-task-actions.component'; import { PoolTaskActionsComponent } from './mydspace-actions/pool-task/pool-task-actions.component'; import { ObjectDetailComponent } from './object-detail/object-detail.component'; -import { ItemDetailPreviewComponent } from './object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component'; -import { MyDSpaceItemStatusComponent } from './object-collection/shared/mydspace-item-status/my-dspace-item-status.component'; +import { + ItemDetailPreviewComponent +} from './object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component'; +import { + MyDSpaceItemStatusComponent +} from './object-collection/shared/mydspace-item-status/my-dspace-item-status.component'; import { WorkspaceitemActionsComponent } from './mydspace-actions/workspaceitem/workspaceitem-actions.component'; import { WorkflowitemActionsComponent } from './mydspace-actions/workflowitem/workflowitem-actions.component'; import { ItemSubmitterComponent } from './object-collection/shared/mydspace-item-submitter/item-submitter.component'; import { ItemActionsComponent } from './mydspace-actions/item/item-actions.component'; -import { ClaimedTaskActionsApproveComponent } from './mydspace-actions/claimed-task/approve/claimed-task-actions-approve.component'; -import { ClaimedTaskActionsRejectComponent } from './mydspace-actions/claimed-task/reject/claimed-task-actions-reject.component'; +import { + ClaimedTaskActionsApproveComponent +} from './mydspace-actions/claimed-task/approve/claimed-task-actions-approve.component'; +import { + ClaimedTaskActionsRejectComponent +} from './mydspace-actions/claimed-task/reject/claimed-task-actions-reject.component'; import { ObjNgFor } from './utils/object-ngfor.pipe'; import { BrowseByComponent } from './browse-by/browse-by.component'; -import { BrowseEntryListElementComponent } from './object-list/browse-entry-list-element/browse-entry-list-element.component'; +import { + BrowseEntryListElementComponent +} from './object-list/browse-entry-list-element/browse-entry-list-element.component'; import { DebounceDirective } from './utils/debounce.directive'; import { ClickOutsideDirective } from './utils/click-outside.directive'; import { EmphasizePipe } from './utils/emphasize.pipe'; @@ -76,53 +105,105 @@ import { CapitalizePipe } from './utils/capitalize.pipe'; import { ObjectKeysPipe } from './utils/object-keys-pipe'; import { AuthorityConfidenceStateDirective } from './authority-confidence/authority-confidence-state.directive'; import { LangSwitchComponent } from './lang-switch/lang-switch.component'; -import { PlainTextMetadataListElementComponent } from './object-list/metadata-representation-list-element/plain-text/plain-text-metadata-list-element.component'; -import { ItemMetadataListElementComponent } from './object-list/metadata-representation-list-element/item/item-metadata-list-element.component'; -import { MetadataRepresentationListElementComponent } from './object-list/metadata-representation-list-element/metadata-representation-list-element.component'; +import { + PlainTextMetadataListElementComponent +} from './object-list/metadata-representation-list-element/plain-text/plain-text-metadata-list-element.component'; +import { + ItemMetadataListElementComponent +} from './object-list/metadata-representation-list-element/item/item-metadata-list-element.component'; +import { + MetadataRepresentationListElementComponent +} from './object-list/metadata-representation-list-element/metadata-representation-list-element.component'; import { ObjectValuesPipe } from './utils/object-values-pipe'; import { InListValidator } from './utils/in-list-validator.directive'; import { AutoFocusDirective } from './utils/auto-focus.directive'; import { StartsWithDateComponent } from './starts-with/date/starts-with-date.component'; import { StartsWithTextComponent } from './starts-with/text/starts-with-text.component'; import { DSOSelectorComponent } from './dso-selector/dso-selector/dso-selector.component'; -import { CreateCommunityParentSelectorComponent } from './dso-selector/modal-wrappers/create-community-parent-selector/create-community-parent-selector.component'; -import { CreateItemParentSelectorComponent } from './dso-selector/modal-wrappers/create-item-parent-selector/create-item-parent-selector.component'; -import { CreateCollectionParentSelectorComponent } from './dso-selector/modal-wrappers/create-collection-parent-selector/create-collection-parent-selector.component'; -import { CommunitySearchResultListElementComponent } from './object-list/search-result-list-element/community-search-result/community-search-result-list-element.component'; -import { CollectionSearchResultListElementComponent } from './object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component'; -import { EditItemSelectorComponent } from './dso-selector/modal-wrappers/edit-item-selector/edit-item-selector.component'; -import { EditCommunitySelectorComponent } from './dso-selector/modal-wrappers/edit-community-selector/edit-community-selector.component'; -import { EditCollectionSelectorComponent } from './dso-selector/modal-wrappers/edit-collection-selector/edit-collection-selector.component'; -import { ItemListPreviewComponent } from './object-list/my-dspace-result-list-element/item-list-preview/item-list-preview.component'; -import { MetadataFieldWrapperComponent } from '../item-page/field-components/metadata-field-wrapper/metadata-field-wrapper.component'; +import { + CreateCommunityParentSelectorComponent +} from './dso-selector/modal-wrappers/create-community-parent-selector/create-community-parent-selector.component'; +import { + CreateItemParentSelectorComponent +} from './dso-selector/modal-wrappers/create-item-parent-selector/create-item-parent-selector.component'; +import { + CreateCollectionParentSelectorComponent +} from './dso-selector/modal-wrappers/create-collection-parent-selector/create-collection-parent-selector.component'; +import { + CommunitySearchResultListElementComponent +} from './object-list/search-result-list-element/community-search-result/community-search-result-list-element.component'; +import { + CollectionSearchResultListElementComponent +} from './object-list/search-result-list-element/collection-search-result/collection-search-result-list-element.component'; +import { + EditItemSelectorComponent +} from './dso-selector/modal-wrappers/edit-item-selector/edit-item-selector.component'; +import { + EditCommunitySelectorComponent +} from './dso-selector/modal-wrappers/edit-community-selector/edit-community-selector.component'; +import { + EditCollectionSelectorComponent +} from './dso-selector/modal-wrappers/edit-collection-selector/edit-collection-selector.component'; +import { + ItemListPreviewComponent +} from './object-list/my-dspace-result-list-element/item-list-preview/item-list-preview.component'; +import { + MetadataFieldWrapperComponent +} from '../item-page/field-components/metadata-field-wrapper/metadata-field-wrapper.component'; import { MetadataValuesComponent } from '../item-page/field-components/metadata-values/metadata-values.component'; import { RoleDirective } from './roles/role.directive'; import { UserMenuComponent } from './auth-nav-menu/user-menu/user-menu.component'; -import { ClaimedTaskActionsReturnToPoolComponent } from './mydspace-actions/claimed-task/return-to-pool/claimed-task-actions-return-to-pool.component'; -import { ItemDetailPreviewFieldComponent } from './object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview-field/item-detail-preview-field.component'; -import { CollectionSearchResultGridElementComponent } from './object-grid/search-result-grid-element/collection-search-result/collection-search-result-grid-element.component'; -import { CommunitySearchResultGridElementComponent } from './object-grid/search-result-grid-element/community-search-result/community-search-result-grid-element.component'; +import { + ClaimedTaskActionsReturnToPoolComponent +} from './mydspace-actions/claimed-task/return-to-pool/claimed-task-actions-return-to-pool.component'; +import { + ItemDetailPreviewFieldComponent +} from './object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview-field/item-detail-preview-field.component'; +import { + CollectionSearchResultGridElementComponent +} from './object-grid/search-result-grid-element/collection-search-result/collection-search-result-grid-element.component'; +import { + CommunitySearchResultGridElementComponent +} from './object-grid/search-result-grid-element/community-search-result/community-search-result-grid-element.component'; import { PageSizeSelectorComponent } from './page-size-selector/page-size-selector.component'; import { AbstractTrackableComponent } from './trackable/abstract-trackable.component'; -import { ComcolMetadataComponent } from './comcol/comcol-forms/edit-comcol-page/comcol-metadata/comcol-metadata.component'; +import { + ComcolMetadataComponent +} from './comcol/comcol-forms/edit-comcol-page/comcol-metadata/comcol-metadata.component'; import { ItemSelectComponent } from './object-select/item-select/item-select.component'; import { CollectionSelectComponent } from './object-select/collection-select/collection-select.component'; -import { FilterInputSuggestionsComponent } from './input-suggestions/filter-suggestions/filter-input-suggestions.component'; -import { DsoInputSuggestionsComponent } from './input-suggestions/dso-input-suggestions/dso-input-suggestions.component'; +import { + FilterInputSuggestionsComponent +} from './input-suggestions/filter-suggestions/filter-input-suggestions.component'; +import { + DsoInputSuggestionsComponent +} from './input-suggestions/dso-input-suggestions/dso-input-suggestions.component'; import { ItemGridElementComponent } from './object-grid/item-grid-element/item-types/item/item-grid-element.component'; import { TypeBadgeComponent } from './object-list/type-badge/type-badge.component'; -import { MetadataRepresentationLoaderComponent } from './metadata-representation/metadata-representation-loader.component'; +import { + MetadataRepresentationLoaderComponent +} from './metadata-representation/metadata-representation-loader.component'; import { MetadataRepresentationDirective } from './metadata-representation/metadata-representation.directive'; -import { ListableObjectComponentLoaderComponent } from './object-collection/shared/listable-object/listable-object-component-loader.component'; -import { ItemSearchResultListElementComponent } from './object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component'; +import { + ListableObjectComponentLoaderComponent +} from './object-collection/shared/listable-object/listable-object-component-loader.component'; +import { + ItemSearchResultListElementComponent +} from './object-list/search-result-list-element/item-search-result/item-types/item/item-search-result-list-element.component'; import { ListableObjectDirective } from './object-collection/shared/listable-object/listable-object.directive'; -import { ItemMetadataRepresentationListElementComponent } from './object-list/metadata-representation-list-element/item/item-metadata-representation-list-element.component'; +import { + ItemMetadataRepresentationListElementComponent +} from './object-list/metadata-representation-list-element/item/item-metadata-representation-list-element.component'; import { PageWithSidebarComponent } from './sidebar/page-with-sidebar.component'; import { SidebarDropdownComponent } from './sidebar/sidebar-dropdown.component'; import { SidebarFilterComponent } from './sidebar/filter/sidebar-filter.component'; import { SidebarFilterSelectedOptionComponent } from './sidebar/filter/sidebar-filter-selected-option.component'; -import { SelectableListItemControlComponent } from './object-collection/shared/selectable-list-item-control/selectable-list-item-control.component'; -import { ImportableListItemControlComponent } from './object-collection/shared/importable-list-item-control/importable-list-item-control.component'; +import { + SelectableListItemControlComponent +} from './object-collection/shared/selectable-list-item-control/selectable-list-item-control.component'; +import { + ImportableListItemControlComponent +} from './object-collection/shared/importable-list-item-control/importable-list-item-control.component'; import { ItemVersionsComponent } from './item/item-versions/item-versions.component'; import { SortablejsModule } from 'ngx-sortablejs'; import { LogInContainerComponent } from './log-in/container/log-in-container.component'; @@ -135,10 +216,16 @@ import { ItemVersionsNoticeComponent } from './item/item-versions/notice/item-ve import { FileValidator } from './utils/require-file.validator'; import { FileValueAccessorDirective } from './utils/file-value-accessor.directive'; import { FileSectionComponent } from '../item-page/simple/field-components/file-section/file-section.component'; -import { ModifyItemOverviewComponent } from '../item-page/edit-item-page/modify-item-overview/modify-item-overview.component'; -import { ClaimedTaskActionsLoaderComponent } from './mydspace-actions/claimed-task/switcher/claimed-task-actions-loader.component'; +import { + ModifyItemOverviewComponent +} from '../item-page/edit-item-page/modify-item-overview/modify-item-overview.component'; +import { + ClaimedTaskActionsLoaderComponent +} from './mydspace-actions/claimed-task/switcher/claimed-task-actions-loader.component'; import { ClaimedTaskActionsDirective } from './mydspace-actions/claimed-task/switcher/claimed-task-actions.directive'; -import { ClaimedTaskActionsEditMetadataComponent } from './mydspace-actions/claimed-task/edit-metadata/claimed-task-actions-edit-metadata.component'; +import { + ClaimedTaskActionsEditMetadataComponent +} from './mydspace-actions/claimed-task/edit-metadata/claimed-task-actions-edit-metadata.component'; import { ImpersonateNavbarComponent } from './impersonate-navbar/impersonate-navbar.component'; import { NgForTrackByIdDirective } from './ng-for-track-by-id.directive'; import { FileDownloadLinkComponent } from './file-download-link/file-download-link.component'; @@ -146,34 +233,63 @@ import { CollectionDropdownComponent } from './collection-dropdown/collection-dr import { EntityDropdownComponent } from './entity-dropdown/entity-dropdown.component'; import { VocabularyTreeviewComponent } from './vocabulary-treeview/vocabulary-treeview.component'; import { CurationFormComponent } from '../curation-form/curation-form.component'; -import { PublicationSidebarSearchListElementComponent } from './object-list/sidebar-search-list-element/item-types/publication/publication-sidebar-search-list-element.component'; -import { SidebarSearchListElementComponent } from './object-list/sidebar-search-list-element/sidebar-search-list-element.component'; -import { CollectionSidebarSearchListElementComponent } from './object-list/sidebar-search-list-element/collection/collection-sidebar-search-list-element.component'; -import { CommunitySidebarSearchListElementComponent } from './object-list/sidebar-search-list-element/community/community-sidebar-search-list-element.component'; -import { AuthorizedCollectionSelectorComponent } from './dso-selector/dso-selector/authorized-collection-selector/authorized-collection-selector.component'; +import { + PublicationSidebarSearchListElementComponent +} from './object-list/sidebar-search-list-element/item-types/publication/publication-sidebar-search-list-element.component'; +import { + SidebarSearchListElementComponent +} from './object-list/sidebar-search-list-element/sidebar-search-list-element.component'; +import { + CollectionSidebarSearchListElementComponent +} from './object-list/sidebar-search-list-element/collection/collection-sidebar-search-list-element.component'; +import { + CommunitySidebarSearchListElementComponent +} from './object-list/sidebar-search-list-element/community/community-sidebar-search-list-element.component'; +import { + AuthorizedCollectionSelectorComponent +} from './dso-selector/dso-selector/authorized-collection-selector/authorized-collection-selector.component'; import { DsoPageEditButtonComponent } from './dso-page/dso-page-edit-button/dso-page-edit-button.component'; import { DsoPageVersionButtonComponent } from './dso-page/dso-page-version-button/dso-page-version-button.component'; import { HoverClassDirective } from './hover-class.directive'; -import { ValidationSuggestionsComponent } from './input-suggestions/validation-suggestions/validation-suggestions.component'; +import { + ValidationSuggestionsComponent +} from './input-suggestions/validation-suggestions/validation-suggestions.component'; import { ItemAlertsComponent } from './item/item-alerts/item-alerts.component'; -import { ItemSearchResultGridElementComponent } from './object-grid/search-result-grid-element/item-search-result/item/item-search-result-grid-element.component'; +import { + ItemSearchResultGridElementComponent +} from './object-grid/search-result-grid-element/item-search-result/item/item-search-result-grid-element.component'; import { BitstreamDownloadPageComponent } from './bitstream-download-page/bitstream-download-page.component'; -import { GenericItemPageFieldComponent } from '../item-page/simple/field-components/specific-field/generic/generic-item-page-field.component'; -import { MetadataRepresentationListComponent } from '../item-page/simple/metadata-representation-list/metadata-representation-list.component'; +import { + GenericItemPageFieldComponent +} from '../item-page/simple/field-components/specific-field/generic/generic-item-page-field.component'; +import { + MetadataRepresentationListComponent +} from '../item-page/simple/metadata-representation-list/metadata-representation-list.component'; import { RelatedItemsComponent } from '../item-page/simple/related-items/related-items-component'; import { LinkMenuItemComponent } from './menu/menu-item/link-menu-item.component'; import { OnClickMenuItemComponent } from './menu/menu-item/onclick-menu-item.component'; import { TextMenuItemComponent } from './menu/menu-item/text-menu-item.component'; import { SearchNavbarComponent } from '../search-navbar/search-navbar.component'; -import { ItemVersionsSummaryModalComponent } from './item/item-versions/item-versions-summary-modal/item-versions-summary-modal.component'; -import { ItemVersionsDeleteModalComponent } from './item/item-versions/item-versions-delete-modal/item-versions-delete-modal.component'; +import { + ItemVersionsSummaryModalComponent +} from './item/item-versions/item-versions-summary-modal/item-versions-summary-modal.component'; +import { + ItemVersionsDeleteModalComponent +} from './item/item-versions/item-versions-delete-modal/item-versions-delete-modal.component'; import { ScopeSelectorModalComponent } from './search-form/scope-selector-modal/scope-selector-modal.component'; -import { BitstreamRequestACopyPageComponent } from './bitstream-request-a-copy-page/bitstream-request-a-copy-page.component'; +import { + BitstreamRequestACopyPageComponent +} from './bitstream-request-a-copy-page/bitstream-request-a-copy-page.component'; import { DsSelectComponent } from './ds-select/ds-select.component'; import { LogInOidcComponent } from './log-in/methods/oidc/log-in-oidc.component'; -import { ThemedItemListPreviewComponent } from './object-list/my-dspace-result-list-element/item-list-preview/themed-item-list-preview.component'; -import { ClaimItemSelectorComponent } from './dso-selector/modal-wrappers/claim-item-selector/claim-item-selector.component'; +import { + ThemedItemListPreviewComponent +} from './object-list/my-dspace-result-list-element/item-list-preview/themed-item-list-preview.component'; +import { + ClaimItemSelectorComponent +} from './dso-selector/modal-wrappers/claim-item-selector/claim-item-selector.component'; import { ExternalLinkMenuItemComponent } from './menu/menu-item/external-link-menu-item.component'; +import { PersonPageClaimButtonComponent } from './dso-page/person-page-claim-button/person-page-claim-button.component'; const MODULES = [ // Do NOT include UniversalModule, HttpModule, or JsonpModule here @@ -410,6 +526,7 @@ const SHARED_ITEM_PAGE_COMPONENTS = [ MetadataValuesComponent, DsoPageEditButtonComponent, DsoPageVersionButtonComponent, + PersonPageClaimButtonComponent, ItemAlertsComponent, GenericItemPageFieldComponent, MetadataRepresentationListComponent, diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index e4875d153e..868f79e490 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -2762,6 +2762,8 @@ "person.page.lastname": "Last Name", + "person.page.name": "Name", + "person.page.link.full": "Show all metadata", "person.page.orcid": "ORCID", From 853dcecfb8e5cad295ae7f15ecfaf5433ae408f1 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Tue, 10 May 2022 18:14:00 +0200 Subject: [PATCH 140/343] [CST-5307] Refactoring and adding missing unit tests --- .../core/breadcrumbs/dso-name.service.spec.ts | 31 +- .../researcher-profile.service.spec.ts | 290 +++++++++++++++++ .../profile/researcher-profile.service.ts | 208 ++++++------ .../profile-claim.service.spec.ts | 215 ++++++++++++ .../profile-claim/profile-claim.service.ts | 59 ++-- ...ile-page-researcher-form.component.spec.ts | 7 +- .../profile-page-researcher-form.component.ts | 20 +- .../profile-page.component.spec.ts | 306 +++++++++++------- .../profile-page/profile-page.component.ts | 21 +- yarn.lock | 5 - 10 files changed, 876 insertions(+), 286 deletions(-) create mode 100644 src/app/core/profile/researcher-profile.service.spec.ts create mode 100644 src/app/profile-page/profile-claim/profile-claim.service.spec.ts diff --git a/src/app/core/breadcrumbs/dso-name.service.spec.ts b/src/app/core/breadcrumbs/dso-name.service.spec.ts index 7a399ce748..9f2f76599a 100644 --- a/src/app/core/breadcrumbs/dso-name.service.spec.ts +++ b/src/app/core/breadcrumbs/dso-name.service.spec.ts @@ -78,15 +78,32 @@ describe(`DSONameService`, () => { }); describe(`factories.Person`, () => { - beforeEach(() => { - spyOn(mockPerson, 'firstMetadataValue').and.returnValues(...mockPersonName.split(', ')); + describe(`with person.familyName and person.givenName`, () => { + beforeEach(() => { + spyOn(mockPerson, 'firstMetadataValue').and.returnValues(...mockPersonName.split(', ')); + }); + + it(`should return 'person.familyName, person.givenName'`, () => { + const result = (service as any).factories.Person(mockPerson); + expect(result).toBe(mockPersonName); + expect(mockPerson.firstMetadataValue).toHaveBeenCalledWith('person.familyName'); + expect(mockPerson.firstMetadataValue).toHaveBeenCalledWith('person.givenName'); + expect(mockPerson.firstMetadataValue).not.toHaveBeenCalledWith('dc.title'); + }); }); - it(`should return 'person.familyName, person.givenName'`, () => { - const result = (service as any).factories.Person(mockPerson); - expect(result).toBe(mockPersonName); - expect(mockPerson.firstMetadataValue).toHaveBeenCalledWith('person.familyName'); - expect(mockPerson.firstMetadataValue).toHaveBeenCalledWith('person.givenName'); + describe(`without person.familyName and person.givenName`, () => { + beforeEach(() => { + spyOn(mockPerson, 'firstMetadataValue').and.returnValues(undefined, undefined, mockPersonName); + }); + + it(`should return dc.title`, () => { + const result = (service as any).factories.Person(mockPerson); + expect(result).toBe(mockPersonName); + expect(mockPerson.firstMetadataValue).toHaveBeenCalledWith('person.familyName'); + expect(mockPerson.firstMetadataValue).toHaveBeenCalledWith('person.givenName'); + expect(mockPerson.firstMetadataValue).toHaveBeenCalledWith('dc.title'); + }); }); }); diff --git a/src/app/core/profile/researcher-profile.service.spec.ts b/src/app/core/profile/researcher-profile.service.spec.ts new file mode 100644 index 0000000000..103bae2719 --- /dev/null +++ b/src/app/core/profile/researcher-profile.service.spec.ts @@ -0,0 +1,290 @@ +import { HttpClient, HttpHeaders } from '@angular/common/http'; + +import { cold, getTestScheduler, hot } from 'jasmine-marbles'; +import { of as observableOf } from 'rxjs'; +import { TestScheduler } from 'rxjs/testing'; + +import { NotificationsService } from '../../shared/notifications/notifications.service'; +import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; +import { ObjectCacheService } from '../cache/object-cache.service'; +import { HALEndpointService } from '../shared/hal-endpoint.service'; +import { RequestService } from '../data/request.service'; +import { PageInfo } from '../shared/page-info.model'; +import { buildPaginatedList } from '../data/paginated-list.model'; +import { createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; +import { RestResponse } from '../cache/response.models'; +import { RequestEntry } from '../data/request-entry.model'; +import { ResearcherProfileService } from './researcher-profile.service'; +import { RouterMock } from '../../shared/mocks/router.mock'; +import { ResearcherProfile } from './model/researcher-profile.model'; +import { Item } from '../shared/item.model'; +import { ReplaceOperation } from 'fast-json-patch'; +import { HttpOptions } from '../dspace-rest/dspace-rest.service'; +import { PostRequest } from '../data/request.models'; + +describe('ResearcherProfileService', () => { + let scheduler: TestScheduler; + let service: ResearcherProfileService; + let serviceAsAny: any; + let requestService: RequestService; + let rdbService: RemoteDataBuildService; + let objectCache: ObjectCacheService; + let halService: HALEndpointService; + let responseCacheEntry: RequestEntry; + + const researcherProfileId = 'beef9946-rt56-479e-8f11-b90cbe9f7241'; + const itemId = 'beef9946-rt56-479e-8f11-b90cbe9f7241'; + const researcherProfileItem: Item = Object.assign(new Item(), { + id: itemId, + _links: { + self: { + href: `https://rest.api/rest/api/items/${itemId}` + }, + } + }); + const researcherProfile: ResearcherProfile = Object.assign(new ResearcherProfile(), { + id: researcherProfileId, + visible: false, + type: 'profile', + _links: { + item: { + href: `https://rest.api/rest/api/profiles/${researcherProfileId}/item` + }, + self: { + href: `https://rest.api/rest/api/profiles/${researcherProfileId}` + }, + } + }); + + const researcherProfilePatched: ResearcherProfile = Object.assign(new ResearcherProfile(), { + id: researcherProfileId, + visible: true, + type: 'profile', + _links: { + item: { + href: `https://rest.api/rest/api/profiles/${researcherProfileId}/item` + }, + self: { + href: `https://rest.api/rest/api/profiles/${researcherProfileId}` + }, + } + }); + + const researcherProfileId2 = 'agbf9946-f4ce-479e-8f11-b90cbe9f7241'; + const anotherResearcherProfile: ResearcherProfile = Object.assign(new ResearcherProfile(), { + id: researcherProfileId2, + visible: false, + type: 'profile', + _links: { + self: { + href: `https://rest.api/rest/api/profiles/${researcherProfileId2}` + }, + } + }); + const endpointURL = `https://rest.api/rest/api/profiles`; + const sourceUri = `https://rest.api/rest/api/external-source/profile`; + const requestURL = `https://rest.api/rest/api/profiles/${researcherProfileId}`; + const requestUUID = '8b3c613a-5a4b-438b-9686-be1d5b4a1c5a'; + + const pageInfo = new PageInfo(); + const array = [researcherProfile, anotherResearcherProfile]; + const paginatedList = buildPaginatedList(pageInfo, array); + const researcherProfileRD = createSuccessfulRemoteDataObject(researcherProfile); + const paginatedListRD = createSuccessfulRemoteDataObject(paginatedList); + + beforeEach(() => { + scheduler = getTestScheduler(); + + halService = jasmine.createSpyObj('halService', { + getEndpoint: cold('a', { a: endpointURL }) + }); + + responseCacheEntry = new RequestEntry(); + responseCacheEntry.request = { href: 'https://rest.api/' } as any; + responseCacheEntry.response = new RestResponse(true, 200, 'Success'); + + requestService = jasmine.createSpyObj('requestService', { + generateRequestId: requestUUID, + send: true, + removeByHrefSubstring: {}, + getByHref: observableOf(responseCacheEntry), + getByUUID: observableOf(responseCacheEntry), + setStaleByHrefSubstring: jasmine.createSpy('setStaleByHrefSubstring') + }); + rdbService = jasmine.createSpyObj('rdbService', { + buildSingle: hot('a|', { + a: researcherProfileRD + }), + buildList: hot('a|', { + a: paginatedListRD + }), + buildFromRequestUUID: hot('a|', { + a: researcherProfileRD + }) + }); + objectCache = {} as ObjectCacheService; + const notificationsService = {} as NotificationsService; + const http = {} as HttpClient; + const comparator = {} as any; + const routerStub: any = new RouterMock(); + const itemService = jasmine.createSpyObj('ItemService', { + findByHref: jasmine.createSpy('findByHref') + }); + + service = new ResearcherProfileService( + requestService, + rdbService, + objectCache, + halService, + notificationsService, + http, + routerStub, + comparator, + itemService + ); + serviceAsAny = service; + + spyOn((service as any).dataService, 'create').and.callThrough(); + spyOn((service as any).dataService, 'delete').and.callThrough(); + spyOn((service as any).dataService, 'update').and.callThrough(); + spyOn((service as any).dataService, 'findById').and.callThrough(); + spyOn((service as any).dataService, 'findByHref').and.callThrough(); + spyOn((service as any).dataService, 'searchBy').and.callThrough(); + spyOn((service as any).dataService, 'getLinkPath').and.returnValue(observableOf(endpointURL)); + + }); + + describe('findById', () => { + it('should proxy the call to dataservice.findById with eperson UUID', () => { + scheduler.schedule(() => service.findById(researcherProfileId)); + scheduler.flush(); + + expect((service as any).dataService.findById).toHaveBeenCalledWith(researcherProfileId, true, true); + }); + + it('should return a ResearcherProfile object with the given id', () => { + const result = service.findById(researcherProfileId); + const expected = cold('a|', { + a: researcherProfileRD + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('create', () => { + it('should proxy the call to dataservice.create with eperson UUID', () => { + scheduler.schedule(() => service.create()); + scheduler.flush(); + + expect((service as any).dataService.create).toHaveBeenCalled(); + }); + + it('should return the RemoteData created', () => { + const result = service.create(); + const expected = cold('a|', { + a: researcherProfileRD + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('delete', () => { + it('should proxy the call to dataservice.delete', () => { + scheduler.schedule(() => service.delete(researcherProfile)); + scheduler.flush(); + + expect((service as any).dataService.delete).toHaveBeenCalledWith(researcherProfile.id); + }); + }); + + describe('findRelatedItemId', () => { + describe('with a related item', () => { + + beforeEach(() => { + (service as any).itemService.findByHref.and.returnValue(createSuccessfulRemoteDataObject$(researcherProfileItem)); + }); + + it('should proxy the call to dataservice.findById with eperson UUID', () => { + scheduler.schedule(() => service.findRelatedItemId(researcherProfile)); + scheduler.flush(); + + expect((service as any).itemService.findByHref).toHaveBeenCalledWith(researcherProfile._links.item.href, false); + }); + + it('should return a ResearcherProfile object with the given id', () => { + const result = service.findRelatedItemId(researcherProfile); + const expected = cold('(a|)', { + a: itemId + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('without a related item', () => { + + beforeEach(() => { + (service as any).itemService.findByHref.and.returnValue(createSuccessfulRemoteDataObject$(null)); + }); + + it('should proxy the call to dataservice.findById with eperson UUID', () => { + scheduler.schedule(() => service.findRelatedItemId(researcherProfile)); + scheduler.flush(); + + expect((service as any).itemService.findByHref).toHaveBeenCalledWith(researcherProfile._links.item.href, false); + }); + + it('should return a ResearcherProfile object with the given id', () => { + const result = service.findRelatedItemId(researcherProfile); + const expected = cold('(a|)', { + a: undefined + }); + expect(result).toBeObservable(expected); + }); + }); + }); + + describe('setVisibility', () => { + let patchSpy; + beforeEach(() => { + spyOn((service as any), 'patch').and.returnValue(createSuccessfulRemoteDataObject$(researcherProfilePatched)); + spyOn((service as any), 'findById').and.returnValue(createSuccessfulRemoteDataObject$(researcherProfilePatched)); + }); + + it('should proxy the call to dataservice.patch', () => { + const replaceOperation: ReplaceOperation = { + path: '/visible', + op: 'replace', + value: true + }; + + scheduler.schedule(() => service.setVisibility(researcherProfile, true)); + scheduler.flush(); + + expect((service as any).patch).toHaveBeenCalledWith(researcherProfile, [replaceOperation]); + }); + }); + + describe('createFromExternalSource', () => { + let patchSpy; + beforeEach(() => { + spyOn((service as any), 'patch').and.returnValue(createSuccessfulRemoteDataObject$(researcherProfilePatched)); + spyOn((service as any), 'findById').and.returnValue(createSuccessfulRemoteDataObject$(researcherProfilePatched)); + }); + + it('should proxy the call to dataservice.patch', () => { + const options: HttpOptions = Object.create({}); + let headers = new HttpHeaders(); + headers = headers.append('Content-Type', 'text/uri-list'); + options.headers = headers; + const request = new PostRequest(requestUUID, endpointURL, sourceUri, options); + + scheduler.schedule(() => service.createFromExternalSource(sourceUri)); + scheduler.flush(); + + expect((service as any).requestService.send).toHaveBeenCalledWith(request); + expect((service as any).rdbService.buildFromRequestUUID).toHaveBeenCalledWith(requestUUID); + + }); + }); + +}); diff --git a/src/app/core/profile/researcher-profile.service.ts b/src/app/core/profile/researcher-profile.service.ts index 0220afb964..eab6ea3d48 100644 --- a/src/app/core/profile/researcher-profile.service.ts +++ b/src/app/core/profile/researcher-profile.service.ts @@ -2,27 +2,25 @@ import { HttpClient, HttpHeaders } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { Router } from '@angular/router'; + import { Store } from '@ngrx/store'; -import { Operation, RemoveOperation, ReplaceOperation } from 'fast-json-patch'; -import { combineLatest, Observable, of as observableOf } from 'rxjs'; +import { Operation, ReplaceOperation } from 'fast-json-patch'; +import { Observable, of as observableOf } from 'rxjs'; import { catchError, find, map, switchMap, tap } from 'rxjs/operators'; -import { environment } from '../../../environments/environment'; + import { NotificationsService } from '../../shared/notifications/notifications.service'; import { dataService } from '../cache/builders/build-decorators'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; import { ObjectCacheService } from '../cache/object-cache.service'; -import { ConfigurationDataService } from '../data/configuration-data.service'; import { DataService } from '../data/data.service'; import { DefaultChangeAnalyzer } from '../data/default-change-analyzer.service'; import { ItemDataService } from '../data/item-data.service'; import { RemoteData } from '../data/remote-data'; import { RequestService } from '../data/request.service'; -import { ConfigurationProperty } from '../shared/configuration-property.model'; import { HALEndpointService } from '../shared/hal-endpoint.service'; -import { Item } from '../shared/item.model'; import { NoContent } from '../shared/NoContent.model'; import { - getFinishedRemoteData, + getAllCompletedRemoteData, getFirstCompletedRemoteData, getFirstSucceededRemoteDataPayload } from '../shared/operators'; @@ -31,25 +29,26 @@ import { RESEARCHER_PROFILE } from './model/researcher-profile.resource-type'; import { HttpOptions } from '../dspace-rest/dspace-rest.service'; import { PostRequest } from '../data/request.models'; import { hasValue } from '../../shared/empty.util'; -import {CoreState} from '../core-state.model'; +import { CoreState } from '../core-state.model'; +import { FollowLinkConfig } from '../../shared/utils/follow-link-config.model'; /** * A private DataService implementation to delegate specific methods to. */ class ResearcherProfileServiceImpl extends DataService { - protected linkPath = 'profiles'; + protected linkPath = 'profiles'; - constructor( - protected requestService: RequestService, - protected rdbService: RemoteDataBuildService, - protected store: Store, - protected objectCache: ObjectCacheService, - protected halService: HALEndpointService, - protected notificationsService: NotificationsService, - protected http: HttpClient, - protected comparator: DefaultChangeAnalyzer) { - super(); - } + constructor( + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected store: Store, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + protected notificationsService: NotificationsService, + protected http: HttpClient, + protected comparator: DefaultChangeAnalyzer) { + super(); + } } @@ -60,100 +59,102 @@ class ResearcherProfileServiceImpl extends DataService { @dataService(RESEARCHER_PROFILE) export class ResearcherProfileService { - dataService: ResearcherProfileServiceImpl; + dataService: ResearcherProfileServiceImpl; - responseMsToLive: number = 10 * 1000; + responseMsToLive: number = 10 * 1000; - constructor( - protected requestService: RequestService, - protected rdbService: RemoteDataBuildService, - protected store: Store, - protected objectCache: ObjectCacheService, - protected halService: HALEndpointService, - protected notificationsService: NotificationsService, - protected http: HttpClient, - protected router: Router, - protected comparator: DefaultChangeAnalyzer, - protected itemService: ItemDataService, - protected configurationService: ConfigurationDataService ) { + constructor( + protected requestService: RequestService, + protected rdbService: RemoteDataBuildService, + protected objectCache: ObjectCacheService, + protected halService: HALEndpointService, + protected notificationsService: NotificationsService, + protected http: HttpClient, + protected router: Router, + protected comparator: DefaultChangeAnalyzer, + protected itemService: ItemDataService) { - this.dataService = new ResearcherProfileServiceImpl(requestService, rdbService, store, objectCache, halService, - notificationsService, http, comparator); + this.dataService = new ResearcherProfileServiceImpl(requestService, rdbService, null, objectCache, halService, + notificationsService, http, comparator); - } + } - /** - * Find the researcher profile with the given uuid. - * - * @param uuid the profile uuid - */ - findById(uuid: string): Observable { - return this.dataService.findById(uuid, false) - .pipe ( getFinishedRemoteData(), - map((remoteData) => remoteData.payload)); - } + /** + * Find the researcher profile with the given uuid. + * + * @param uuid the profile uuid + * @param useCachedVersionIfAvailable If this is true, the request will only be sent if there's + * no valid cached version. Defaults to true + * @param reRequestOnStale Whether or not the request should automatically be re- + * requested after the response becomes stale + * @param linksToFollow List of {@link FollowLinkConfig} that indicate which + * {@link HALLink}s should be automatically resolved + */ + public findById(uuid: string, useCachedVersionIfAvailable = true, reRequestOnStale = true, ...linksToFollow: FollowLinkConfig[]): Observable> { + return this.dataService.findById(uuid, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow).pipe( + getAllCompletedRemoteData(), + ); + } - /** - * Create a new researcher profile for the current user. - */ - create(): Observable> { - return this.dataService.create( new ResearcherProfile()); - } + /** + * Create a new researcher profile for the current user. + */ + public create(): Observable> { + return this.dataService.create(new ResearcherProfile()); + } - /** - * Delete a researcher profile. - * - * @param researcherProfile the profile to delete - */ - delete(researcherProfile: ResearcherProfile): Observable { - return this.dataService.delete(researcherProfile.id).pipe( - getFirstCompletedRemoteData(), - tap((response: RemoteData) => { - if (response.isSuccess) { - this.requestService.setStaleByHrefSubstring(researcherProfile._links.self.href); - } + /** + * Delete a researcher profile. + * + * @param researcherProfile the profile to delete + */ + public delete(researcherProfile: ResearcherProfile): Observable { + return this.dataService.delete(researcherProfile.id).pipe( + getFirstCompletedRemoteData(), + tap((response: RemoteData) => { + if (response.isSuccess) { + this.requestService.setStaleByHrefSubstring(researcherProfile._links.self.href); + } + }), + map((response: RemoteData) => response.isSuccess) + ); + } + + /** + * Find the item id related to the given researcher profile. + * + * @param researcherProfile the profile to find for + */ + public findRelatedItemId(researcherProfile: ResearcherProfile): Observable { + return this.itemService.findByHref(researcherProfile._links.item.href, false) + .pipe(getFirstSucceededRemoteDataPayload(), + catchError((error) => { + console.debug(error); + return observableOf(null); }), - map((response: RemoteData) => response.isSuccess) + map((item) => item?.id) ); - } + } - /** - * Find the item id related to the given researcher profile. - * - * @param researcherProfile the profile to find for - */ - findRelatedItemId( researcherProfile: ResearcherProfile ): Observable { - return this.itemService.findByHref(researcherProfile._links.item.href, false) - .pipe (getFirstSucceededRemoteDataPayload(), - catchError((error) => { - console.debug(error); - return observableOf(null); - }), - map((item) => item != null ? item.id : null )); - } + /** + * Change the visibility of the given researcher profile setting the given value. + * + * @param researcherProfile the profile to update + * @param visible the visibility value to set + */ + public setVisibility(researcherProfile: ResearcherProfile, visible: boolean): Observable { - /** - * Change the visibility of the given researcher profile setting the given value. - * - * @param researcherProfile the profile to update - * @param visible the visibility value to set - */ - setVisibility(researcherProfile: ResearcherProfile, visible: boolean): Observable { + const replaceOperation: ReplaceOperation = { + path: '/visible', + op: 'replace', + value: visible + }; - const replaceOperation: ReplaceOperation = { - path: '/visible', - op: 'replace', - value: visible - }; - - return this.patch(researcherProfile, [replaceOperation]).pipe ( - switchMap( ( ) => this.findById(researcherProfile.id)) - ); - } - - patch(researcherProfile: ResearcherProfile, operations: Operation[]): Observable> { - return this.dataService.patch(researcherProfile, operations); - } + return this.patch(researcherProfile, [replaceOperation]).pipe( + switchMap(() => this.findById(researcherProfile.id)), + getFirstSucceededRemoteDataPayload() + ); + } /** * Creates a researcher profile starting from an external source URI @@ -179,4 +180,7 @@ export class ResearcherProfileService { return this.rdbService.buildFromRequestUUID(requestId); } + private patch(researcherProfile: ResearcherProfile, operations: Operation[]): Observable> { + return this.dataService.patch(researcherProfile, operations); + } } diff --git a/src/app/profile-page/profile-claim/profile-claim.service.spec.ts b/src/app/profile-page/profile-claim/profile-claim.service.spec.ts new file mode 100644 index 0000000000..4030c7900c --- /dev/null +++ b/src/app/profile-page/profile-claim/profile-claim.service.spec.ts @@ -0,0 +1,215 @@ +import { cold, getTestScheduler } from 'jasmine-marbles'; + +import { of as observableOf } from 'rxjs'; +import { TestScheduler } from 'rxjs/testing'; + +import { ProfileClaimService } from './profile-claim.service'; +import { SearchService } from '../../core/shared/search/search.service'; +import { ItemSearchResult } from '../../shared/object-collection/shared/item-search-result.model'; +import { SearchObjects } from '../../shared/search/models/search-objects.model'; +import { Item } from '../../core/shared/item.model'; +import { createSuccessfulRemoteDataObject } from '../../shared/remote-data.utils'; +import { EPerson } from '../../core/eperson/models/eperson.model'; + +describe('ProfileClaimService', () => { + let scheduler: TestScheduler; + let service: ProfileClaimService; + let serviceAsAny: any; + let searchService: jasmine.SpyObj; + + const eperson: EPerson = Object.assign(new EPerson(), { + id: 'id', + metadata: { + 'eperson.firstname': [ + { + value: 'John' + } + ], + 'eperson.lastname': [ + { + value: 'Doe' + }, + ], + }, + email: 'fake@email.com' + }); + const item1: Item = Object.assign(new Item(), { + uuid: 'e1c51c69-896d-42dc-8221-1d5f2ad5516e', + metadata: { + 'person.email': [ + { + value: 'fake@email.com' + } + ], + 'person.familyName': [ + { + value: 'Doe' + } + ], + 'person.givenName': [ + { + value: 'John' + } + ] + }, + _links: { + self: { + href: 'item-href' + } + } + }); + const item2: Item = Object.assign(new Item(), { + uuid: 'c8279647-1acc-41ae-b036-951d5f65649b', + metadata: { + 'person.email': [ + { + value: 'fake2@email.com' + } + ], + 'dc.title': [ + { + value: 'John, Doe' + } + ] + }, + _links: { + self: { + href: 'item-href' + } + } + }); + const item3: Item = Object.assign(new Item(), { + uuid: 'c8279647-1acc-41ae-b036-951d5f65649b', + metadata: { + 'person.email': [ + { + value: 'fake3@email.com' + } + ], + 'dc.title': [ + { + value: 'John, Doe' + } + ] + }, + _links: { + self: { + href: 'item-href' + } + } + }); + + const searchResult1 = Object.assign(new ItemSearchResult(), { indexableObject: item1 }); + const searchResult2 = Object.assign(new ItemSearchResult(), { indexableObject: item2 }); + const searchResult3 = Object.assign(new ItemSearchResult(), { indexableObject: item3 }); + + const searchResult = Object.assign(new SearchObjects(), { + page: [searchResult1, searchResult2, searchResult3] + }); + const emptySearchResult = Object.assign(new SearchObjects(), { + page: [] + }); + const searchResultRD = createSuccessfulRemoteDataObject(searchResult); + const emptyRearchResultRD = createSuccessfulRemoteDataObject(emptySearchResult); + + beforeEach(() => { + scheduler = getTestScheduler(); + + searchService = jasmine.createSpyObj('SearchService', { + search: jasmine.createSpy('search') + }); + + service = new ProfileClaimService(searchService); + serviceAsAny = service; + }); + + describe('hasProfilesToSuggest', () => { + + describe('when has suggestions', () => { + beforeEach(() => { + spyOn(service, 'search').and.returnValue(observableOf(searchResultRD)); + }); + + it('should return true', () => { + const result = service.hasProfilesToSuggest(eperson); + const expected = cold('(a|)', { + a: true + }); + expect(result).toBeObservable(expected); + }); + + }); + + describe('when has not suggestions', () => { + beforeEach(() => { + spyOn(service, 'search').and.returnValue(observableOf(emptyRearchResultRD)); + }); + + it('should return false', () => { + const result = service.hasProfilesToSuggest(eperson); + const expected = cold('(a|)', { + a: false + }); + expect(result).toBeObservable(expected); + }); + + }); + + describe('when has not valid eperson', () => { + it('should return false', () => { + const result = service.hasProfilesToSuggest(null); + const expected = cold('(a|)', { + a: false + }); + expect(result).toBeObservable(expected); + }); + + }); + + }); + + describe('search', () => { + + describe('when has search results', () => { + beforeEach(() => { + searchService.search.and.returnValue(observableOf(searchResultRD)); + }); + + it('should return the proper search object', () => { + const result = service.search(eperson); + const expected = cold('(a|)', { + a: searchResultRD + }); + expect(result).toBeObservable(expected); + }); + + }); + + describe('when has not suggestions', () => { + beforeEach(() => { + searchService.search.and.returnValue(observableOf(emptyRearchResultRD)); + }); + + it('should return null', () => { + const result = service.search(eperson); + const expected = cold('(a|)', { + a: emptyRearchResultRD + }); + expect(result).toBeObservable(expected); + }); + + }); + + describe('when has not valid eperson', () => { + it('should return null', () => { + const result = service.search(null); + const expected = cold('(a|)', { + a: null + }); + expect(result).toBeObservable(expected); + }); + + }); + + }); +}); diff --git a/src/app/profile-page/profile-claim/profile-claim.service.ts b/src/app/profile-page/profile-claim/profile-claim.service.ts index 9ee2462778..a61404540b 100644 --- a/src/app/profile-page/profile-claim/profile-claim.service.ts +++ b/src/app/profile-page/profile-claim/profile-claim.service.ts @@ -1,16 +1,16 @@ import { Injectable } from '@angular/core'; + import { Observable, of } from 'rxjs'; -import { mergeMap, take } from 'rxjs/operators'; -import { ConfigurationDataService } from '../../core/data/configuration-data.service'; -import { PaginatedList } from '../../core/data/paginated-list.model'; +import { map } from 'rxjs/operators'; + import { RemoteData } from '../../core/data/remote-data'; import { EPerson } from '../../core/eperson/models/eperson.model'; import { DSpaceObject } from '../../core/shared/dspace-object.model'; import { SearchService } from '../../core/shared/search/search.service'; -import { hasValue } from '../../shared/empty.util'; +import { isEmpty, isNotEmpty } from '../../shared/empty.util'; import { PaginatedSearchOptions } from '../../shared/search/models/paginated-search-options.model'; -import { SearchResult } from '../../shared/search/models/search-result.model'; -import { getFirstSucceededRemoteData } from './../../core/shared/operators'; +import { getFirstCompletedRemoteData } from '../../core/shared/operators'; +import { SearchObjects } from '../../shared/search/models/search-objects.model'; /** * Service that handle profiles claim. @@ -18,8 +18,7 @@ import { getFirstSucceededRemoteData } from './../../core/shared/operators'; @Injectable() export class ProfileClaimService { - constructor(private searchService: SearchService, - private configurationService: ConfigurationDataService) { + constructor(private searchService: SearchService) { } /** @@ -27,27 +26,21 @@ export class ProfileClaimService { * * @param eperson the eperson */ - canClaimProfiles(eperson: EPerson): Observable { - - const query = this.personQueryData(eperson); - - if (!hasValue(query) || query.length === 0) { - return of(false); - } - - return this.lookup(query).pipe( - mergeMap((rd: RemoteData>>) => of(rd.payload.totalElements > 0)) + hasProfilesToSuggest(eperson: EPerson): Observable { + return this.search(eperson).pipe( + map((rd: RemoteData>) => { + return isNotEmpty(rd) && rd.hasSucceeded && rd.payload?.page?.length > 0; + }) ); - } /** * Returns profiles that could be associated with the given user. * @param eperson the user */ - search(eperson: EPerson): Observable>>> { + search(eperson: EPerson): Observable>> { const query = this.personQueryData(eperson); - if (!hasValue(query) || query.length === 0) { + if (isEmpty(query)) { return of(null); } return this.lookup(query); @@ -57,21 +50,31 @@ export class ProfileClaimService { * Search object by the given query. * @param query the query for the search */ - private lookup(query: string): Observable>>> { - if (!hasValue(query)) { + private lookup(query: string): Observable>> { + if (isEmpty(query)) { return of(null); } return this.searchService.search(new PaginatedSearchOptions({ configuration: 'eperson_claims', query: query - })) - .pipe( - getFirstSucceededRemoteData(), - take(1)); + })).pipe( + getFirstCompletedRemoteData() + ); } + /** + * Return the search query for person lookup, from the given eperson + * + * @param eperson The eperson to use for the lookup + */ private personQueryData(eperson: EPerson): string { - return 'dc.title:' + eperson.name; + if (eperson) { + const firstname = eperson.firstMetadataValue('eperson.firstname'); + const lastname = eperson.firstMetadataValue('eperson.lastname'); + return 'dc.title:' + eperson.name + ' OR (person.familyName:' + lastname + ' AND person.givenName:' + firstname + ')'; + } else { + return null; + } } } diff --git a/src/app/profile-page/profile-page-researcher-form/profile-page-researcher-form.component.spec.ts b/src/app/profile-page/profile-page-researcher-form/profile-page-researcher-form.component.spec.ts index d12c445ce4..b928b20eef 100644 --- a/src/app/profile-page/profile-page-researcher-form/profile-page-researcher-form.component.spec.ts +++ b/src/app/profile-page/profile-page-researcher-form/profile-page-researcher-form.component.spec.ts @@ -16,6 +16,7 @@ import { ProfilePageResearcherFormComponent } from './profile-page-researcher-fo import { ProfileClaimService } from '../profile-claim/profile-claim.service'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { AuthService } from 'src/app/core/auth/auth.service'; +import { createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; describe('ProfilePageResearcherFormComponent', () => { @@ -51,7 +52,7 @@ describe('ProfilePageResearcherFormComponent', () => { }); researcherProfileService = jasmine.createSpyObj('researcherProfileService', { - findById: observableOf(profile), + findById: createSuccessfulRemoteDataObject$(profile), create: observableOf(profile), setVisibility: observableOf(profile), delete: observableOf(true), @@ -61,7 +62,7 @@ describe('ProfilePageResearcherFormComponent', () => { notificationsServiceStub = new NotificationsServiceStub(); profileClaimService = jasmine.createSpyObj('profileClaimService', { - canClaimProfiles: observableOf(false), + hasProfilesToSuggest: observableOf(false), }); } @@ -91,7 +92,7 @@ describe('ProfilePageResearcherFormComponent', () => { }); it('should search the researcher profile for the current user', () => { - expect(researcherProfileService.findById).toHaveBeenCalledWith(user.id); + expect(researcherProfileService.findById).toHaveBeenCalledWith(user.id, false); }); describe('createProfile', () => { diff --git a/src/app/profile-page/profile-page-researcher-form/profile-page-researcher-form.component.ts b/src/app/profile-page/profile-page-researcher-form/profile-page-researcher-form.component.ts index 9bb3028ff4..a1887f8b31 100644 --- a/src/app/profile-page/profile-page-researcher-form/profile-page-researcher-form.component.ts +++ b/src/app/profile-page/profile-page-researcher-form/profile-page-researcher-form.component.ts @@ -4,17 +4,18 @@ import { Router } from '@angular/router'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { TranslateService } from '@ngx-translate/core'; import { BehaviorSubject, Observable } from 'rxjs'; -import { filter, mergeMap, switchMap, take, tap } from 'rxjs/operators'; +import { mergeMap, switchMap, take, tap } from 'rxjs/operators'; -import { getFirstCompletedRemoteData } from '../../core/shared/operators'; -import { ClaimItemSelectorComponent } from '../../shared/dso-selector/modal-wrappers/claim-item-selector/claim-item-selector.component'; +import { getFirstCompletedRemoteData, getFirstSucceededRemoteDataPayload } from '../../core/shared/operators'; +import { + ClaimItemSelectorComponent +} from '../../shared/dso-selector/modal-wrappers/claim-item-selector/claim-item-selector.component'; import { NotificationsService } from '../../shared/notifications/notifications.service'; import { AuthService } from '../../core/auth/auth.service'; import { EPerson } from '../../core/eperson/models/eperson.model'; import { ResearcherProfile } from '../../core/profile/model/researcher-profile.model'; import { ResearcherProfileService } from '../../core/profile/researcher-profile.service'; import { ProfileClaimService } from '../profile-claim/profile-claim.service'; -import { isNotEmpty } from '../../shared/empty.util'; @Component({ selector: 'ds-profile-page-researcher-form', @@ -77,10 +78,10 @@ export class ProfilePageResearcherFormComponent implements OnInit { this.processingCreate$.next(true); this.authService.getAuthenticatedUserFromStore().pipe( - switchMap((currentUser) => this.profileClaimService.canClaimProfiles(currentUser))) - .subscribe((canClaimProfiles) => { + switchMap((currentUser) => this.profileClaimService.hasProfilesToSuggest(currentUser))) + .subscribe((hasProfilesToSuggest) => { - if (canClaimProfiles) { + if (hasProfilesToSuggest) { this.processingCreate$.next(false); const modal = this.modalService.open(ClaimItemSelectorComponent); modal.componentInstance.dso = this.user; @@ -174,9 +175,8 @@ export class ProfilePageResearcherFormComponent implements OnInit { * Initializes the researcherProfile and researcherProfileItemId attributes using the profile of the current user. */ private initResearchProfile(): void { - this.researcherProfileService.findById(this.user.id).pipe( - take(1), - filter((researcherProfile) => isNotEmpty(researcherProfile)), + this.researcherProfileService.findById(this.user.id, false).pipe( + getFirstSucceededRemoteDataPayload(), tap((researcherProfile) => this.researcherProfile$.next(researcherProfile)), mergeMap((researcherProfile) => this.researcherProfileService.findRelatedItemId(researcherProfile)), ).subscribe((itemId: string) => { diff --git a/src/app/profile-page/profile-page.component.spec.ts b/src/app/profile-page/profile-page.component.spec.ts index 84aec0c0f1..fcbd4d9e4a 100644 --- a/src/app/profile-page/profile-page.component.spec.ts +++ b/src/app/profile-page/profile-page.component.spec.ts @@ -11,17 +11,17 @@ import { AuthTokenInfo } from '../core/auth/models/auth-token-info.model'; import { EPersonDataService } from '../core/eperson/eperson-data.service'; import { NotificationsService } from '../shared/notifications/notifications.service'; import { authReducer } from '../core/auth/auth.reducer'; -import { createSuccessfulRemoteDataObject$ } from '../shared/remote-data.utils'; +import { createFailedRemoteDataObject$, createSuccessfulRemoteDataObject$ } from '../shared/remote-data.utils'; import { createPaginatedList } from '../shared/testing/utils.test'; import { BehaviorSubject, of as observableOf } from 'rxjs'; import { AuthService } from '../core/auth/auth.service'; import { RestResponse } from '../core/cache/response.models'; import { provideMockStore } from '@ngrx/store/testing'; import { AuthorizationDataService } from '../core/data/feature-authorization/authorization-data.service'; -import { getTestScheduler } from 'jasmine-marbles'; +import { cold, getTestScheduler } from 'jasmine-marbles'; import { By } from '@angular/platform-browser'; -import {ConfigurationDataService} from '../core/data/configuration-data.service'; -import {ConfigurationProperty} from '../core/shared/configuration-property.model'; +import { ConfigurationDataService } from '../core/data/configuration-data.service'; +import { ConfigurationProperty } from '../core/shared/configuration-property.model'; describe('ProfilePageComponent', () => { let component: ProfilePageComponent; @@ -30,16 +30,28 @@ describe('ProfilePageComponent', () => { let initialState: any; let authService; + let authorizationService; let epersonService; let notificationsService; + let configurationService; const canChangePassword = new BehaviorSubject(true); + const validConfiguration = Object.assign(new ConfigurationProperty(), { + name: 'researcher-profile.entity-type', + values: [ + 'Person' + ] + }); + const emptyConfiguration = Object.assign(new ConfigurationProperty(), { + name: 'researcher-profile.entity-type', + values: [] + }); function init() { user = Object.assign(new EPerson(), { id: 'userId', groups: createSuccessfulRemoteDataObject$(createPaginatedList([])), - _links: {self: {href: 'test.com/uuid/1234567654321'}} + _links: { self: { href: 'test.com/uuid/1234567654321' } } }); initialState = { core: { @@ -54,7 +66,7 @@ describe('ProfilePageComponent', () => { } } }; - + authorizationService = jasmine.createSpyObj('authorizationService', { isAuthorized: canChangePassword }); authService = jasmine.createSpyObj('authService', { getAuthenticatedUserFromStore: observableOf(user) }); @@ -67,6 +79,9 @@ describe('ProfilePageComponent', () => { error: {}, warning: {} }); + configurationService = jasmine.createSpyObj('configurationDataService', { + findByPropertyName: jasmine.createSpy('findByPropertyName') + }); } beforeEach(waitForAsync(() => { @@ -82,15 +97,8 @@ describe('ProfilePageComponent', () => { { provide: EPersonDataService, useValue: epersonService }, { provide: NotificationsService, useValue: notificationsService }, { provide: AuthService, useValue: authService }, - { provide: ConfigurationDataService, useValue: jasmine.createSpyObj('configurationDataService', { - findByPropertyName: createSuccessfulRemoteDataObject$(Object.assign(new ConfigurationProperty(), { - name: 'researcher-profile.entity-type', - values: [ - 'Person' - ] - })) - })}, - { provide: AuthorizationDataService, useValue: jasmine.createSpyObj('authorizationService', { isAuthorized: canChangePassword }) }, + { provide: ConfigurationDataService, useValue: configurationService }, + { provide: AuthorizationDataService, useValue: authorizationService }, provideMockStore({ initialState }), ], schemas: [NO_ERRORS_SCHEMA] @@ -100,148 +108,206 @@ describe('ProfilePageComponent', () => { beforeEach(() => { fixture = TestBed.createComponent(ProfilePageComponent); component = fixture.componentInstance; - fixture.detectChanges(); }); - describe('updateProfile', () => { - describe('when the metadata form returns false and the security form returns true', () => { - beforeEach(() => { - component.metadataForm = jasmine.createSpyObj('metadataForm', { - updateProfile: false + describe('', () => { + + beforeEach(() => { + configurationService.findByPropertyName.and.returnValue(createSuccessfulRemoteDataObject$(validConfiguration)); + fixture.detectChanges(); + }); + + describe('updateProfile', () => { + describe('when the metadata form returns false and the security form returns true', () => { + beforeEach(() => { + component.metadataForm = jasmine.createSpyObj('metadataForm', { + updateProfile: false + }); + spyOn(component, 'updateSecurity').and.returnValue(true); + component.updateProfile(); + }); + + it('should not display a warning', () => { + expect(notificationsService.warning).not.toHaveBeenCalled(); }); - spyOn(component, 'updateSecurity').and.returnValue(true); - component.updateProfile(); }); - it('should not display a warning', () => { - expect(notificationsService.warning).not.toHaveBeenCalled(); + describe('when the metadata form returns true and the security form returns false', () => { + beforeEach(() => { + component.metadataForm = jasmine.createSpyObj('metadataForm', { + updateProfile: true + }); + component.updateProfile(); + }); + + it('should not display a warning', () => { + expect(notificationsService.warning).not.toHaveBeenCalled(); + }); + }); + + describe('when the metadata form returns true and the security form returns true', () => { + beforeEach(() => { + component.metadataForm = jasmine.createSpyObj('metadataForm', { + updateProfile: true + }); + component.updateProfile(); + }); + + it('should not display a warning', () => { + expect(notificationsService.warning).not.toHaveBeenCalled(); + }); + }); + + describe('when the metadata form returns false and the security form returns false', () => { + beforeEach(() => { + component.metadataForm = jasmine.createSpyObj('metadataForm', { + updateProfile: false + }); + component.updateProfile(); + }); + + it('should display a warning', () => { + expect(notificationsService.warning).toHaveBeenCalled(); + }); }); }); - describe('when the metadata form returns true and the security form returns false', () => { - beforeEach(() => { - component.metadataForm = jasmine.createSpyObj('metadataForm', { - updateProfile: true + describe('updateSecurity', () => { + describe('when no password value present', () => { + let result; + + beforeEach(() => { + component.setPasswordValue(''); + + result = component.updateSecurity(); + }); + + it('should return false', () => { + expect(result).toEqual(false); + }); + + it('should not call epersonService.patch', () => { + expect(epersonService.patch).not.toHaveBeenCalled(); }); - component.updateProfile(); }); - it('should not display a warning', () => { - expect(notificationsService.warning).not.toHaveBeenCalled(); + describe('when password is filled in, but the password is invalid', () => { + let result; + + beforeEach(() => { + component.setPasswordValue('test'); + component.setInvalid(true); + result = component.updateSecurity(); + }); + + it('should return true', () => { + expect(result).toEqual(true); + expect(epersonService.patch).not.toHaveBeenCalled(); + }); + }); + + describe('when password is filled in, and is valid', () => { + let result; + let operations; + + beforeEach(() => { + component.setPasswordValue('testest'); + component.setInvalid(false); + + operations = [{ op: 'add', path: '/password', value: 'testest' }]; + result = component.updateSecurity(); + }); + + it('should return true', () => { + expect(result).toEqual(true); + }); + + it('should return call epersonService.patch', () => { + expect(epersonService.patch).toHaveBeenCalledWith(user, operations); + }); }); }); - describe('when the metadata form returns true and the security form returns true', () => { - beforeEach(() => { - component.metadataForm = jasmine.createSpyObj('metadataForm', { - updateProfile: true + describe('canChangePassword$', () => { + describe('when the user is allowed to change their password', () => { + beforeEach(() => { + canChangePassword.next(true); }); - component.updateProfile(); - }); - it('should not display a warning', () => { - expect(notificationsService.warning).not.toHaveBeenCalled(); - }); - }); - - describe('when the metadata form returns false and the security form returns false', () => { - beforeEach(() => { - component.metadataForm = jasmine.createSpyObj('metadataForm', { - updateProfile: false + it('should contain true', () => { + getTestScheduler().expectObservable(component.canChangePassword$).toBe('(a)', { a: true }); + }); + + it('should show the security section on the page', () => { + fixture.detectChanges(); + expect(fixture.debugElement.query(By.css('.security-section'))).not.toBeNull(); }); - component.updateProfile(); }); - it('should display a warning', () => { - expect(notificationsService.warning).toHaveBeenCalled(); + describe('when the user is not allowed to change their password', () => { + beforeEach(() => { + canChangePassword.next(false); + }); + + it('should contain false', () => { + getTestScheduler().expectObservable(component.canChangePassword$).toBe('(a)', { a: false }); + }); + + it('should not show the security section on the page', () => { + fixture.detectChanges(); + expect(fixture.debugElement.query(By.css('.security-section'))).toBeNull(); + }); }); }); }); - describe('updateSecurity', () => { - describe('when no password value present', () => { - let result; + describe('isResearcherProfileEnabled', () => { + + describe('when configuration service return values', () => { beforeEach(() => { - component.setPasswordValue(''); + configurationService.findByPropertyName.and.returnValue(createSuccessfulRemoteDataObject$(validConfiguration)); + fixture.detectChanges(); + }); - result = component.updateSecurity(); + it('should return true', () => { + const result = component.isResearcherProfileEnabled(); + const expected = cold('a', { + a: true + }); + expect(result).toBeObservable(expected); + }); + }); + + describe('when configuration service return no values', () => { + + beforeEach(() => { + configurationService.findByPropertyName.and.returnValue(createSuccessfulRemoteDataObject$(emptyConfiguration)); + fixture.detectChanges(); }); it('should return false', () => { - expect(result).toEqual(false); - }); - - it('should not call epersonService.patch', () => { - expect(epersonService.patch).not.toHaveBeenCalled(); + const result = component.isResearcherProfileEnabled(); + const expected = cold('a', { + a: false + }); + expect(result).toBeObservable(expected); }); }); - describe('when password is filled in, but the password is invalid', () => { - let result; + describe('when configuration service return an error', () => { beforeEach(() => { - component.setPasswordValue('test'); - component.setInvalid(true); - result = component.updateSecurity(); - }); - - it('should return true', () => { - expect(result).toEqual(true); - expect(epersonService.patch).not.toHaveBeenCalled(); - }); - }); - - describe('when password is filled in, and is valid', () => { - let result; - let operations; - - beforeEach(() => { - component.setPasswordValue('testest'); - component.setInvalid(false); - - operations = [{ op: 'add', path: '/password', value: 'testest' }]; - result = component.updateSecurity(); - }); - - it('should return true', () => { - expect(result).toEqual(true); - }); - - it('should return call epersonService.patch', () => { - expect(epersonService.patch).toHaveBeenCalledWith(user, operations); - }); - }); - }); - - describe('canChangePassword$', () => { - describe('when the user is allowed to change their password', () => { - beforeEach(() => { - canChangePassword.next(true); - }); - - it('should contain true', () => { - getTestScheduler().expectObservable(component.canChangePassword$).toBe('(a)', { a: true }); - }); - - it('should show the security section on the page', () => { + configurationService.findByPropertyName.and.returnValue(createFailedRemoteDataObject$()); fixture.detectChanges(); - expect(fixture.debugElement.query(By.css('.security-section'))).not.toBeNull(); - }); - }); - - describe('when the user is not allowed to change their password', () => { - beforeEach(() => { - canChangePassword.next(false); }); - it('should contain false', () => { - getTestScheduler().expectObservable(component.canChangePassword$).toBe('(a)', { a: false }); - }); - - it('should not show the security section on the page', () => { - fixture.detectChanges(); - expect(fixture.debugElement.query(By.css('.security-section'))).toBeNull(); + it('should return false', () => { + const result = component.isResearcherProfileEnabled(); + const expected = cold('a', { + a: false + }); + expect(result).toBeObservable(expected); }); }); }); diff --git a/src/app/profile-page/profile-page.component.ts b/src/app/profile-page/profile-page.component.ts index 9c22c8c950..374fa5220b 100644 --- a/src/app/profile-page/profile-page.component.ts +++ b/src/app/profile-page/profile-page.component.ts @@ -1,5 +1,5 @@ import { Component, OnInit, ViewChild } from '@angular/core'; -import {BehaviorSubject, Observable} from 'rxjs'; +import { BehaviorSubject, Observable } from 'rxjs'; import { EPerson } from '../core/eperson/models/eperson.model'; import { ProfilePageMetadataFormComponent } from './profile-page-metadata-form/profile-page-metadata-form.component'; import { NotificationsService } from '../shared/notifications/notifications.service'; @@ -9,18 +9,15 @@ import { RemoteData } from '../core/data/remote-data'; import { PaginatedList } from '../core/data/paginated-list.model'; import { filter, switchMap, tap } from 'rxjs/operators'; import { EPersonDataService } from '../core/eperson/eperson-data.service'; -import { - getAllSucceededRemoteData, - getRemoteDataPayload, - getFirstCompletedRemoteData, getFirstSucceededRemoteDataPayload -} from '../core/shared/operators'; +import { getAllSucceededRemoteData, getFirstCompletedRemoteData, getRemoteDataPayload } from '../core/shared/operators'; import { hasValue, isNotEmpty } from '../shared/empty.util'; import { followLink } from '../shared/utils/follow-link-config.model'; import { AuthService } from '../core/auth/auth.service'; import { Operation } from 'fast-json-patch'; import { AuthorizationDataService } from '../core/data/feature-authorization/authorization-data.service'; import { FeatureID } from '../core/data/feature-authorization/feature-id'; -import {ConfigurationDataService} from '../core/data/configuration-data.service'; +import { ConfigurationDataService } from '../core/data/configuration-data.service'; +import { ConfigurationProperty } from '../core/shared/configuration-property.model'; @Component({ selector: 'ds-profile-page', @@ -94,8 +91,10 @@ export class ProfilePageComponent implements OnInit { this.canChangePassword$ = this.user$.pipe(switchMap((user: EPerson) => this.authorizationService.isAuthorized(FeatureID.CanChangePassword, user._links.self.href))); this.configurationService.findByPropertyName('researcher-profile.entity-type').pipe( - getFirstSucceededRemoteDataPayload() - ).subscribe(() => this.isResearcherProfileEnabled$.next(true)); + getFirstCompletedRemoteData() + ).subscribe((configRD: RemoteData) => { + this.isResearcherProfileEnabled$.next(configRD.hasSucceeded && configRD.payload.values.length > 0); + }); } /** @@ -175,8 +174,8 @@ export class ProfilePageComponent implements OnInit { /** * Returns true if the researcher profile feature is enabled, false otherwise. */ - isResearcherProfileEnabled(){ - return this.isResearcherProfileEnabled$; + isResearcherProfileEnabled(): Observable { + return this.isResearcherProfileEnabled$.asObservable(); } } diff --git a/yarn.lock b/yarn.lock index c06853e625..65c1a61aba 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8884,11 +8884,6 @@ ngx-ui-switch@^11.0.1: resolved "https://registry.yarnpkg.com/ngx-ui-switch/-/ngx-ui-switch-11.0.1.tgz#c7f1e97ebe698f827a26f49951b50492b22c7839" integrity sha512-N8QYT/wW+xJdyh/aeebTSLPA6Sgrwp69H6KAcW0XZueg/LF+FKiqyG6Po/gFHq2gDhLikwyJEMpny8sudTI08w== -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - nice-napi@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/nice-napi/-/nice-napi-1.0.2.tgz#dc0ab5a1eac20ce548802fc5686eaa6bc654927b" From 1e9d393edf1e5ccb5c5849c1e4d9dfe4e8dfc5c6 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Wed, 11 May 2022 11:59:38 +0200 Subject: [PATCH 141/343] [CST-5307] Move profile-claim-item-modal.component to profile page module and add unit tests --- .../profile-claim-item-modal.component.html} | 4 +- ...profile-claim-item-modal.component.spec.ts | 223 ++++++++++++++++++ .../profile-claim-item-modal.component.ts | 105 +++++++++ src/app/profile-page/profile-page.module.ts | 6 +- .../claim-item-selector.component.spec.ts | 45 ---- .../claim-item-selector.component.ts | 69 ------ src/app/shared/shared.module.ts | 8 +- 7 files changed, 336 insertions(+), 124 deletions(-) rename src/app/{shared/dso-selector/modal-wrappers/claim-item-selector/claim-item-selector.component.html => profile-page/profile-claim-item-modal/profile-claim-item-modal.component.html} (93%) create mode 100644 src/app/profile-page/profile-claim-item-modal/profile-claim-item-modal.component.spec.ts create mode 100644 src/app/profile-page/profile-claim-item-modal/profile-claim-item-modal.component.ts delete mode 100644 src/app/shared/dso-selector/modal-wrappers/claim-item-selector/claim-item-selector.component.spec.ts delete mode 100644 src/app/shared/dso-selector/modal-wrappers/claim-item-selector/claim-item-selector.component.ts diff --git a/src/app/shared/dso-selector/modal-wrappers/claim-item-selector/claim-item-selector.component.html b/src/app/profile-page/profile-claim-item-modal/profile-claim-item-modal.component.html similarity index 93% rename from src/app/shared/dso-selector/modal-wrappers/claim-item-selector/claim-item-selector.component.html rename to src/app/profile-page/profile-claim-item-modal/profile-claim-item-modal.component.html index 9df49ba24b..eec9f437f1 100644 --- a/src/app/shared/dso-selector/modal-wrappers/claim-item-selector/claim-item-selector.component.html +++ b/src/app/profile-page/profile-claim-item-modal/profile-claim-item-modal.component.html @@ -14,7 +14,7 @@
    @@ -26,7 +26,7 @@
    diff --git a/src/app/entity-groups/research-entities/item-pages/org-unit/org-unit.component.html b/src/app/entity-groups/research-entities/item-pages/org-unit/org-unit.component.html index 7c8ce67b88..6703634b6b 100644 --- a/src/app/entity-groups/research-entities/item-pages/org-unit/org-unit.component.html +++ b/src/app/entity-groups/research-entities/item-pages/org-unit/org-unit.component.html @@ -57,12 +57,12 @@ [relationTypes]="[{ label: 'isOrgUnitOfPerson', filter: 'isOrgUnitOfPerson', - configuration: 'person' + configuration: 'person-relationships' }, { label: 'isOrgUnitOfProject', filter: 'isOrgUnitOfProject', - configuration: 'project' + configuration: 'project-relationships' }]"> diff --git a/src/app/entity-groups/research-entities/item-pages/person/person.component.html b/src/app/entity-groups/research-entities/item-pages/person/person.component.html index 6e71f775d6..4b7b3bed32 100644 --- a/src/app/entity-groups/research-entities/item-pages/person/person.component.html +++ b/src/app/entity-groups/research-entities/item-pages/person/person.component.html @@ -68,7 +68,8 @@ From 36208d13033f1b33d1bfaf15a84c18a7a3ccb593 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Wed, 11 May 2022 12:01:35 +0200 Subject: [PATCH 143/343] [CST-5307] Fix visibility toggle and address review feedback --- .../profile/researcher-profile.service.ts | 14 ++-- .../profile-claim.service.spec.ts | 16 ++--- .../profile-claim/profile-claim.service.ts | 8 ++- ...rofile-page-researcher-form.component.html | 9 ++- ...ile-page-researcher-form.component.spec.ts | 68 ++++++++++++++----- .../profile-page-researcher-form.component.ts | 19 +++--- src/assets/i18n/en.json5 | 2 + 7 files changed, 89 insertions(+), 47 deletions(-) diff --git a/src/app/core/profile/researcher-profile.service.ts b/src/app/core/profile/researcher-profile.service.ts index eab6ea3d48..0c39396950 100644 --- a/src/app/core/profile/researcher-profile.service.ts +++ b/src/app/core/profile/researcher-profile.service.ts @@ -6,7 +6,7 @@ import { Router } from '@angular/router'; import { Store } from '@ngrx/store'; import { Operation, ReplaceOperation } from 'fast-json-patch'; import { Observable, of as observableOf } from 'rxjs'; -import { catchError, find, map, switchMap, tap } from 'rxjs/operators'; +import { catchError, find, map, tap } from 'rxjs/operators'; import { NotificationsService } from '../../shared/notifications/notifications.service'; import { dataService } from '../cache/builders/build-decorators'; @@ -142,18 +142,14 @@ export class ResearcherProfileService { * @param researcherProfile the profile to update * @param visible the visibility value to set */ - public setVisibility(researcherProfile: ResearcherProfile, visible: boolean): Observable { - + public setVisibility(researcherProfile: ResearcherProfile, visible: boolean): Observable> { const replaceOperation: ReplaceOperation = { path: '/visible', op: 'replace', value: visible }; - return this.patch(researcherProfile, [replaceOperation]).pipe( - switchMap(() => this.findById(researcherProfile.id)), - getFirstSucceededRemoteDataPayload() - ); + return this.patch(researcherProfile, [replaceOperation]); } /** @@ -181,6 +177,8 @@ export class ResearcherProfileService { } private patch(researcherProfile: ResearcherProfile, operations: Operation[]): Observable> { - return this.dataService.patch(researcherProfile, operations); + return this.dataService.patch(researcherProfile, operations).pipe( + getFirstCompletedRemoteData() + ); } } diff --git a/src/app/profile-page/profile-claim/profile-claim.service.spec.ts b/src/app/profile-page/profile-claim/profile-claim.service.spec.ts index 4030c7900c..a06934231b 100644 --- a/src/app/profile-page/profile-claim/profile-claim.service.spec.ts +++ b/src/app/profile-page/profile-claim/profile-claim.service.spec.ts @@ -110,7 +110,7 @@ describe('ProfileClaimService', () => { page: [] }); const searchResultRD = createSuccessfulRemoteDataObject(searchResult); - const emptyRearchResultRD = createSuccessfulRemoteDataObject(emptySearchResult); + const emptySearchResultRD = createSuccessfulRemoteDataObject(emptySearchResult); beforeEach(() => { scheduler = getTestScheduler(); @@ -127,7 +127,7 @@ describe('ProfileClaimService', () => { describe('when has suggestions', () => { beforeEach(() => { - spyOn(service, 'search').and.returnValue(observableOf(searchResultRD)); + spyOn(service, 'searchForSuggestions').and.returnValue(observableOf(searchResultRD)); }); it('should return true', () => { @@ -142,7 +142,7 @@ describe('ProfileClaimService', () => { describe('when has not suggestions', () => { beforeEach(() => { - spyOn(service, 'search').and.returnValue(observableOf(emptyRearchResultRD)); + spyOn(service, 'searchForSuggestions').and.returnValue(observableOf(emptySearchResultRD)); }); it('should return false', () => { @@ -176,7 +176,7 @@ describe('ProfileClaimService', () => { }); it('should return the proper search object', () => { - const result = service.search(eperson); + const result = service.searchForSuggestions(eperson); const expected = cold('(a|)', { a: searchResultRD }); @@ -187,13 +187,13 @@ describe('ProfileClaimService', () => { describe('when has not suggestions', () => { beforeEach(() => { - searchService.search.and.returnValue(observableOf(emptyRearchResultRD)); + searchService.search.and.returnValue(observableOf(emptySearchResultRD)); }); it('should return null', () => { - const result = service.search(eperson); + const result = service.searchForSuggestions(eperson); const expected = cold('(a|)', { - a: emptyRearchResultRD + a: emptySearchResultRD }); expect(result).toBeObservable(expected); }); @@ -202,7 +202,7 @@ describe('ProfileClaimService', () => { describe('when has not valid eperson', () => { it('should return null', () => { - const result = service.search(null); + const result = service.searchForSuggestions(null); const expected = cold('(a|)', { a: null }); diff --git a/src/app/profile-page/profile-claim/profile-claim.service.ts b/src/app/profile-page/profile-claim/profile-claim.service.ts index a61404540b..62517c4b21 100644 --- a/src/app/profile-page/profile-claim/profile-claim.service.ts +++ b/src/app/profile-page/profile-claim/profile-claim.service.ts @@ -27,7 +27,7 @@ export class ProfileClaimService { * @param eperson the eperson */ hasProfilesToSuggest(eperson: EPerson): Observable { - return this.search(eperson).pipe( + return this.searchForSuggestions(eperson).pipe( map((rd: RemoteData>) => { return isNotEmpty(rd) && rd.hasSucceeded && rd.payload?.page?.length > 0; }) @@ -36,9 +36,10 @@ export class ProfileClaimService { /** * Returns profiles that could be associated with the given user. + * * @param eperson the user */ - search(eperson: EPerson): Observable>> { + searchForSuggestions(eperson: EPerson): Observable>> { const query = this.personQueryData(eperson); if (isEmpty(query)) { return of(null); @@ -48,6 +49,7 @@ export class ProfileClaimService { /** * Search object by the given query. + * * @param query the query for the search */ private lookup(query: string): Observable>> { @@ -71,7 +73,7 @@ export class ProfileClaimService { if (eperson) { const firstname = eperson.firstMetadataValue('eperson.firstname'); const lastname = eperson.firstMetadataValue('eperson.lastname'); - return 'dc.title:' + eperson.name + ' OR (person.familyName:' + lastname + ' AND person.givenName:' + firstname + ')'; + return '(dc.title:' + eperson.name + ') OR (person.familyName:' + lastname + ' AND person.givenName:' + firstname + ')'; } else { return null; } diff --git a/src/app/profile-page/profile-page-researcher-form/profile-page-researcher-form.component.html b/src/app/profile-page/profile-page-researcher-form/profile-page-researcher-form.component.html index bb55418744..2d959c1dfe 100644 --- a/src/app/profile-page/profile-page-researcher-form/profile-page-researcher-form.component.html +++ b/src/app/profile-page/profile-page-researcher-form/profile-page-researcher-form.component.html @@ -3,14 +3,17 @@

    {{'researcher.profile.associated' | translate}}

    {{'researcher.profile.status' | translate}} - +

    {{'researcher.profile.not.associated' | translate}}

    - + diff --git a/src/app/shared/rss-feed/rss.component.html b/src/app/shared/rss-feed/rss.component.html new file mode 100644 index 0000000000..8868539b5c --- /dev/null +++ b/src/app/shared/rss-feed/rss.component.html @@ -0,0 +1,5 @@ + +
    + +
    + diff --git a/src/app/shared/rss-feed/rss.component.scss b/src/app/shared/rss-feed/rss.component.scss new file mode 100644 index 0000000000..929bb453ac --- /dev/null +++ b/src/app/shared/rss-feed/rss.component.scss @@ -0,0 +1,12 @@ +:host { + .dropdown-toggle::after { + display: none; + } + .dropdown-item { + padding-left: 20px; + } +} + +.margin-right { + margin-right: .5em; +} \ No newline at end of file diff --git a/src/app/shared/rss-feed/rss.component.spec.ts b/src/app/shared/rss-feed/rss.component.spec.ts new file mode 100644 index 0000000000..bbfd5442b3 --- /dev/null +++ b/src/app/shared/rss-feed/rss.component.spec.ts @@ -0,0 +1,109 @@ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { SortDirection, SortOptions } from '../../core/cache/models/sort-options.model'; +import { ConfigurationDataService } from '../../core/data/configuration-data.service'; +import { RemoteData } from '../../core/data/remote-data'; +import { GroupDataService } from '../../core/eperson/group-data.service'; +import { PaginationService } from '../../core/pagination/pagination.service'; +import { LinkHeadService } from '../../core/services/link-head.service'; +import { Collection } from '../../core/shared/collection.model'; +import { ConfigurationProperty } from '../../core/shared/configuration-property.model'; +import { SearchConfigurationService } from '../../core/shared/search/search-configuration.service'; +import { PaginationComponentOptions } from '../pagination/pagination-component-options.model'; +import { createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../remote-data.utils'; +import { PaginatedSearchOptions } from '../search/paginated-search-options.model'; +import { PaginationServiceStub } from '../testing/pagination-service.stub'; +import { createPaginatedList } from '../testing/utils.test'; +import { RSSComponent } from './rss.component'; +import { of as observableOf } from 'rxjs'; + + + +describe('RssComponent', () => { + let comp: RSSComponent; + let options: SortOptions; + let fixture: ComponentFixture; + let uuid: string; + let query: string; + let groupDataService: GroupDataService; + let linkHeadService: LinkHeadService; + let configurationDataService: ConfigurationDataService; + let paginationService; + + beforeEach(waitForAsync(() => { + const mockCollection: Collection = Object.assign(new Collection(), { + id: 'ce41d451-97ed-4a9c-94a1-7de34f16a9f4', + name: 'test-collection', + _links: { + mappedItems: { + href: 'https://rest.api/collections/ce41d451-97ed-4a9c-94a1-7de34f16a9f4/mappedItems' + }, + self: { + href: 'https://rest.api/collections/ce41d451-97ed-4a9c-94a1-7de34f16a9f4' + } + } + }); + configurationDataService = jasmine.createSpyObj('configurationDataService', { + findByPropertyName: createSuccessfulRemoteDataObject$(Object.assign(new ConfigurationProperty(), { + name: 'test', + values: [ + 'org.dspace.ctask.general.ProfileFormats = test' + ] + })) + }); + linkHeadService = jasmine.createSpyObj('linkHeadService', { + addTag: '' + }); + const mockCollectionRD: RemoteData = createSuccessfulRemoteDataObject(mockCollection); + const mockSearchOptions = observableOf(new PaginatedSearchOptions({ + pagination: Object.assign(new PaginationComponentOptions(), { + id: 'search-page-configuration', + pageSize: 10, + currentPage: 1 + }), + sort: new SortOptions('dc.title', SortDirection.ASC), + scope: mockCollection.id + })); + groupDataService = jasmine.createSpyObj('groupsDataService', { + findAllByHref: createSuccessfulRemoteDataObject$(createPaginatedList([])), + getGroupRegistryRouterLink: '' + }); + paginationService = new PaginationServiceStub(); + const searchConfigService = { + paginatedSearchOptions: mockSearchOptions + }; + TestBed.configureTestingModule({ + providers: [ + { provide: GroupDataService, useValue: groupDataService }, + { provide: LinkHeadService, useValue: linkHeadService }, + { provide: ConfigurationDataService, useValue: configurationDataService }, + { provide: SearchConfigurationService, useValue: searchConfigService}, + { provide: PaginationService, useValue: paginationService } + ], + declarations: [RSSComponent] + }).compileComponents(); + })); + + beforeEach(() => { + options = new SortOptions('dc.title', SortDirection.DESC); + uuid = '2cfcf65e-0a51-4bcb-8592-b8db7b064790'; + query = 'test'; + fixture = TestBed.createComponent(RSSComponent); + comp = fixture.componentInstance; + }); + + it('should formulate the correct url given params in url', () => { + const route = comp.formulateRoute(uuid, options, query); + expect(route).toBe('/opensearch/search?format=atom&scope=2cfcf65e-0a51-4bcb-8592-b8db7b064790&sort=dc.title&sort_direction=DESC&query=test'); + }); + + it('should skip uuid if its null', () => { + const route = comp.formulateRoute(null, options, query); + expect(route).toBe('/opensearch/search?format=atom&sort=dc.title&sort_direction=DESC&query=test'); + }); + + it('should default to query * if none provided', () => { + const route = comp.formulateRoute(null, options, null); + expect(route).toBe('/opensearch/search?format=atom&sort=dc.title&sort_direction=DESC&query=*'); + }); +}); + diff --git a/src/app/shared/rss-feed/rss.component.ts b/src/app/shared/rss-feed/rss.component.ts new file mode 100644 index 0000000000..036148b368 --- /dev/null +++ b/src/app/shared/rss-feed/rss.component.ts @@ -0,0 +1,94 @@ +import { + ChangeDetectionStrategy, + Component, + OnDestroy, + OnInit, + ViewEncapsulation +} from '@angular/core'; +import { BehaviorSubject, Observable } from 'rxjs'; +import { GroupDataService } from '../../core/eperson/group-data.service'; +import { LinkHeadService } from '../../core/services/link-head.service'; +import { ConfigurationDataService } from '../../core/data/configuration-data.service'; +import { getFirstCompletedRemoteData } from '../../core/shared/operators'; +import { environment } from '../../../../src/environments/environment'; +import { SearchConfigurationService } from '../../core/shared/search/search-configuration.service'; +import { SortOptions } from '../../core/cache/models/sort-options.model'; +import { PaginationService } from '../../core/pagination/pagination.service'; + + +/** + * The default pagination controls component. + */ +@Component({ + exportAs: 'rssComponent', + selector: 'ds-rss', + styleUrls: ['rss.component.scss'], + templateUrl: 'rss.component.html', + changeDetection: ChangeDetectionStrategy.Default, + encapsulation: ViewEncapsulation.Emulated +}) +export class RSSComponent implements OnInit, OnDestroy { + + route$: BehaviorSubject; + + isEnabled$: BehaviorSubject = new BehaviorSubject(false); + + uuid: string; + configuration$: Observable; + sortOption$: Observable; + + constructor(private groupDataService: GroupDataService, + private linkHeadService: LinkHeadService, + private configurationService: ConfigurationDataService, + private searchConfigurationService: SearchConfigurationService, + protected paginationService: PaginationService) { + } + ngOnDestroy(): void { + this.linkHeadService.removeTag("rel='alternate'"); + } + + ngOnInit(): void { + this.configuration$ = this.searchConfigurationService.getCurrentConfiguration('default'); + + this.configurationService.findByPropertyName('websvc.opensearch.enable').pipe( + getFirstCompletedRemoteData(), + ).subscribe((result) => { + const enabled = Boolean(result.payload.values[0]); + this.isEnabled$.next(enabled); + }); + + this.searchConfigurationService.getCurrentQuery('').subscribe((query) => { + this.sortOption$ = this.paginationService.getCurrentSort(this.searchConfigurationService.paginationID, null, true); + this.sortOption$.subscribe((sort) => { + this.uuid = this.groupDataService.getUUIDFromString(window.location.href); + + const route = environment.rest.baseUrl + this.formulateRoute(this.uuid, sort, query); + + this.linkHeadService.addTag({ + href: route, + type: 'application/atom+xml', + rel: 'alternate', + title: 'Sitewide Atom feed' + }); + this.route$ = new BehaviorSubject(route); + }); + }); + } + + formulateRoute(uuid: string, sort: SortOptions, query: string): string { + let route = 'search?format=atom'; + if (uuid) { + route += `&scope=${uuid}`; + } + if (sort.direction && sort.field) { + route += `&sort=${sort.field}&sort_direction=${sort.direction}`; + } + if (query) { + route += `&query=${query}`; + } else { + route += `&query=*`; + } + route = '/opensearch/' + route; + return route; + } +} diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index 12b6a482dc..c70aff6192 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -173,10 +173,9 @@ import { BitstreamRequestACopyPageComponent } from './bitstream-request-a-copy-p import { DsSelectComponent } from './ds-select/ds-select.component'; import { LogInOidcComponent } from './log-in/methods/oidc/log-in-oidc.component'; import { ThemedItemListPreviewComponent } from './object-list/my-dspace-result-list-element/item-list-preview/themed-item-list-preview.component'; -import { ExternalLinkMenuItemComponent } from './menu/menu-item/external-link-menu-item.component'; +import { RSSComponent } from './rss-feed/rss.component'; const MODULES = [ - // Do NOT include UniversalModule, HttpModule, or JsonpModule here CommonModule, SortablejsModule, FileUploadModule, @@ -239,6 +238,7 @@ const COMPONENTS = [ AbstractListableElementComponent, ObjectCollectionComponent, PaginationComponent, + RSSComponent, SearchFormComponent, PageWithSidebarComponent, SidebarDropdownComponent, diff --git a/src/environments/environment.dev.ts b/src/environments/environment.dev.ts new file mode 100644 index 0000000000..999abd32ee --- /dev/null +++ b/src/environments/environment.dev.ts @@ -0,0 +1,17 @@ +export const environment = { + ui: { + ssl: false, + host: 'localhost', + port: 18080, + nameSpace: '/' + }, + rest: { + ssl: false, + host: 'localhost', + port: 8080, + nameSpace: '/server' + }, + universal: { + preboot: false + } +}; diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts new file mode 100644 index 0000000000..c31da7b791 --- /dev/null +++ b/src/environments/environment.prod.ts @@ -0,0 +1,17 @@ +export const environment = { + ui: { + ssl: false, + host: 'localhost', + port: 18080, + nameSpace: '/' + }, + rest: { + ssl: false, + host: 'localhost', + port: 8080, + nameSpace: '/server' + }, + universal: { + preboot: true + } +}; From b8a96e48a7b885cc4424b720bfb9dbf012e82f23 Mon Sep 17 00:00:00 2001 From: Nathan Buckingham Date: Fri, 10 Dec 2021 12:25:51 -0500 Subject: [PATCH 148/343] Fix test files to pass down necessary providers --- .../collection-item-mapper.component.spec.ts | 28 ++++++++++++++++- ...page-sub-collection-list.component.spec.ts | 31 +++++++++++++++++++ ...-page-sub-community-list.component.spec.ts | 30 ++++++++++++++++++ src/app/core/services/link-head.service.ts | 8 +---- ...top-level-community-list.component.spec.ts | 30 ++++++++++++++++++ .../edit-relationship-list.component.spec.ts | 29 +++++++++++++++++ .../collection-select.component.spec.ts | 31 ++++++++++++++++++- .../item-select/item-select.component.spec.ts | 30 +++++++++++++++++- src/app/shared/rss-feed/rss.component.scss | 2 +- src/app/shared/rss-feed/rss.component.spec.ts | 7 +++-- .../search-configuration-service.stub.ts | 4 +++ 11 files changed, 216 insertions(+), 14 deletions(-) diff --git a/src/app/collection-page/collection-item-mapper/collection-item-mapper.component.spec.ts b/src/app/collection-page/collection-item-mapper/collection-item-mapper.component.spec.ts index 7f0e6815ed..142604c9b2 100644 --- a/src/app/collection-page/collection-item-mapper/collection-item-mapper.component.spec.ts +++ b/src/app/collection-page/collection-item-mapper/collection-item-mapper.component.spec.ts @@ -43,6 +43,10 @@ import { createPaginatedList } from '../../shared/testing/utils.test'; import { AuthorizationDataService } from '../../core/data/feature-authorization/authorization-data.service'; import { MyDSpacePageComponent, SEARCH_CONFIG_SERVICE } from '../../my-dspace-page/my-dspace-page.component'; import { SearchConfigurationServiceStub } from '../../shared/testing/search-configuration-service.stub'; +import { GroupDataService } from '../../core/eperson/group-data.service'; +import { LinkHeadService } from '../../core/services/link-head.service'; +import { ConfigurationDataService } from '../../core/data/configuration-data.service'; +import { ConfigurationProperty } from '../../core/shared/configuration-property.model'; describe('CollectionItemMapperComponent', () => { let comp: CollectionItemMapperComponent; @@ -143,6 +147,25 @@ describe('CollectionItemMapperComponent', () => { isAuthorized: observableOf(true) }); + const linkHeadService = jasmine.createSpyObj('linkHeadService', { + addTag: '' + }); + + const groupDataService = jasmine.createSpyObj('groupsDataService', { + findAllByHref: createSuccessfulRemoteDataObject$(createPaginatedList([])), + getGroupRegistryRouterLink: '', + getUUIDFromString: '', + }); + + const configurationDataService = jasmine.createSpyObj('configurationDataService', { + findByPropertyName: createSuccessfulRemoteDataObject$(Object.assign(new ConfigurationProperty(), { + name: 'test', + values: [ + 'org.dspace.ctask.general.ProfileFormats = test' + ] + })) + }); + beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ imports: [CommonModule, FormsModule, RouterTestingModule.withRoutes([]), TranslateModule.forRoot(), NgbModule], @@ -159,7 +182,10 @@ describe('CollectionItemMapperComponent', () => { { provide: HostWindowService, useValue: new HostWindowServiceStub(0) }, { provide: ObjectSelectService, useValue: new ObjectSelectServiceStub() }, { provide: RouteService, useValue: routeServiceStub }, - { provide: AuthorizationDataService, useValue: authorizationDataService } + { provide: AuthorizationDataService, useValue: authorizationDataService }, + { provide: GroupDataService, useValue: groupDataService }, + { provide: LinkHeadService, useValue: linkHeadService }, + { provide: ConfigurationDataService, useValue: configurationDataService }, ] }).overrideComponent(CollectionItemMapperComponent, { set: { diff --git a/src/app/community-page/sub-collection-list/community-page-sub-collection-list.component.spec.ts b/src/app/community-page/sub-collection-list/community-page-sub-collection-list.component.spec.ts index ec61fac613..c0ce5369ff 100644 --- a/src/app/community-page/sub-collection-list/community-page-sub-collection-list.component.spec.ts +++ b/src/app/community-page/sub-collection-list/community-page-sub-collection-list.component.spec.ts @@ -25,6 +25,14 @@ import { getMockThemeService } from '../../shared/mocks/theme-service.mock'; import { ThemeService } from '../../shared/theme-support/theme.service'; import { PaginationServiceStub } from '../../shared/testing/pagination-service.stub'; import { FindListOptions } from '../../core/data/find-list-options.model'; +import { GroupDataService } from '../../core/eperson/group-data.service'; +import { LinkHeadService } from '../../core/services/link-head.service'; +import { ConfigurationDataService } from '../../core/data/configuration-data.service'; +import { SearchConfigurationService } from '../../core/shared/search/search-configuration.service'; +import { SearchServiceStub } from '../../shared/testing/search-service.stub'; +import { ConfigurationProperty } from '../../core/shared/configuration-property.model'; +import { createPaginatedList } from '../../shared/testing/utils.test'; +import { SearchConfigurationServiceStub } from '../../shared/testing/search-configuration-service.stub'; describe('CommunityPageSubCollectionList Component', () => { let comp: CommunityPageSubCollectionListComponent; @@ -122,6 +130,25 @@ describe('CommunityPageSubCollectionList Component', () => { themeService = getMockThemeService(); + const linkHeadService = jasmine.createSpyObj('linkHeadService', { + addTag: '' + }); + + const groupDataService = jasmine.createSpyObj('groupsDataService', { + findAllByHref: createSuccessfulRemoteDataObject$(createPaginatedList([])), + getGroupRegistryRouterLink: '', + getUUIDFromString: '', + }); + + const configurationDataService = jasmine.createSpyObj('configurationDataService', { + findByPropertyName: createSuccessfulRemoteDataObject$(Object.assign(new ConfigurationProperty(), { + name: 'test', + values: [ + 'org.dspace.ctask.general.ProfileFormats = test' + ] + })) + }); + beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ imports: [ @@ -138,6 +165,10 @@ describe('CommunityPageSubCollectionList Component', () => { { provide: PaginationService, useValue: paginationService }, { provide: SelectableListService, useValue: {} }, { provide: ThemeService, useValue: themeService }, + { provide: GroupDataService, useValue: groupDataService }, + { provide: LinkHeadService, useValue: linkHeadService }, + { provide: ConfigurationDataService, useValue: configurationDataService }, + { provide: SearchConfigurationService, useValue: new SearchConfigurationServiceStub() }, ], schemas: [NO_ERRORS_SCHEMA] }).compileComponents(); diff --git a/src/app/community-page/sub-community-list/community-page-sub-community-list.component.spec.ts b/src/app/community-page/sub-community-list/community-page-sub-community-list.component.spec.ts index 2bc829a3b0..3392ada994 100644 --- a/src/app/community-page/sub-community-list/community-page-sub-community-list.component.spec.ts +++ b/src/app/community-page/sub-community-list/community-page-sub-community-list.component.spec.ts @@ -25,6 +25,13 @@ import { getMockThemeService } from '../../shared/mocks/theme-service.mock'; import { ThemeService } from '../../shared/theme-support/theme.service'; import { PaginationServiceStub } from '../../shared/testing/pagination-service.stub'; import { FindListOptions } from '../../core/data/find-list-options.model'; +import { GroupDataService } from '../../core/eperson/group-data.service'; +import { LinkHeadService } from '../../core/services/link-head.service'; +import { ConfigurationDataService } from '../../core/data/configuration-data.service'; +import { SearchConfigurationService } from '../../core/shared/search/search-configuration.service'; +import { SearchConfigurationServiceStub } from '../../shared/testing/search-configuration-service.stub'; +import { ConfigurationProperty } from '../../core/shared/configuration-property.model'; +import { createPaginatedList } from '../../shared/testing/utils.test'; describe('CommunityPageSubCommunityListComponent Component', () => { let comp: CommunityPageSubCommunityListComponent; @@ -119,6 +126,25 @@ describe('CommunityPageSubCommunityListComponent Component', () => { } }; + const linkHeadService = jasmine.createSpyObj('linkHeadService', { + addTag: '' + }); + + const groupDataService = jasmine.createSpyObj('groupsDataService', { + findAllByHref: createSuccessfulRemoteDataObject$(createPaginatedList([])), + getGroupRegistryRouterLink: '', + getUUIDFromString: '', + }); + + const configurationDataService = jasmine.createSpyObj('configurationDataService', { + findByPropertyName: createSuccessfulRemoteDataObject$(Object.assign(new ConfigurationProperty(), { + name: 'test', + values: [ + 'org.dspace.ctask.general.ProfileFormats = test' + ] + })) + }); + const paginationService = new PaginationServiceStub(); themeService = getMockThemeService(); @@ -139,6 +165,10 @@ describe('CommunityPageSubCommunityListComponent Component', () => { { provide: PaginationService, useValue: paginationService }, { provide: SelectableListService, useValue: {} }, { provide: ThemeService, useValue: themeService }, + { provide: GroupDataService, useValue: groupDataService }, + { provide: LinkHeadService, useValue: linkHeadService }, + { provide: ConfigurationDataService, useValue: configurationDataService }, + { provide: SearchConfigurationService, useValue: new SearchConfigurationServiceStub() }, ], schemas: [NO_ERRORS_SCHEMA] }).compileComponents(); diff --git a/src/app/core/services/link-head.service.ts b/src/app/core/services/link-head.service.ts index 29ab62ff13..12c3ff197d 100644 --- a/src/app/core/services/link-head.service.ts +++ b/src/app/core/services/link-head.service.ts @@ -1,4 +1,4 @@ -import { Injectable, Optional, RendererFactory2, ViewEncapsulation, Inject } from '@angular/core'; +import { Injectable, RendererFactory2, ViewEncapsulation, Inject } from '@angular/core'; import { DOCUMENT } from '@angular/common'; @Injectable() @@ -22,7 +22,6 @@ export class LinkHeadService { const link = renderer.createElement('link'); const head = this.document.head; - const selector = this._parseSelector(tag); if (head === null) { throw new Error(' not found within DOCUMENT.'); @@ -61,11 +60,6 @@ export class LinkHeadService { } } } - - private _parseSelector(tag: LinkDefinition): string { - const attr: string = tag.rel ? 'rel' : 'hreflang'; - return `${attr}="${tag[attr]}"`; - } } export declare type LinkDefinition = { diff --git a/src/app/home-page/top-level-community-list/top-level-community-list.component.spec.ts b/src/app/home-page/top-level-community-list/top-level-community-list.component.spec.ts index eb52ca9243..2561770942 100644 --- a/src/app/home-page/top-level-community-list/top-level-community-list.component.spec.ts +++ b/src/app/home-page/top-level-community-list/top-level-community-list.component.spec.ts @@ -25,6 +25,13 @@ import { getMockThemeService } from '../../shared/mocks/theme-service.mock'; import { ThemeService } from '../../shared/theme-support/theme.service'; import { PaginationServiceStub } from '../../shared/testing/pagination-service.stub'; import { FindListOptions } from '../../core/data/find-list-options.model'; +import { ConfigurationDataService } from '../../core/data/configuration-data.service'; +import { GroupDataService } from '../../core/eperson/group-data.service'; +import { LinkHeadService } from '../../core/services/link-head.service'; +import { SearchConfigurationService } from '../../core/shared/search/search-configuration.service'; +import { ConfigurationProperty } from '../../core/shared/configuration-property.model'; +import { createPaginatedList } from '../../shared/testing/utils.test'; +import { SearchConfigurationServiceStub } from '../../shared/testing/search-configuration-service.stub'; describe('TopLevelCommunityList Component', () => { let comp: TopLevelCommunityListComponent; @@ -114,6 +121,25 @@ describe('TopLevelCommunityList Component', () => { themeService = getMockThemeService(); + const linkHeadService = jasmine.createSpyObj('linkHeadService', { + addTag: '' + }); + + const groupDataService = jasmine.createSpyObj('groupsDataService', { + findAllByHref: createSuccessfulRemoteDataObject$(createPaginatedList([])), + getGroupRegistryRouterLink: '', + getUUIDFromString: '', + }); + + const configurationDataService = jasmine.createSpyObj('configurationDataService', { + findByPropertyName: createSuccessfulRemoteDataObject$(Object.assign(new ConfigurationProperty(), { + name: 'test', + values: [ + 'org.dspace.ctask.general.ProfileFormats = test' + ] + })) + }); + beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ imports: [ @@ -130,6 +156,10 @@ describe('TopLevelCommunityList Component', () => { { provide: PaginationService, useValue: paginationService }, { provide: SelectableListService, useValue: {} }, { provide: ThemeService, useValue: themeService }, + { provide: GroupDataService, useValue: groupDataService }, + { provide: LinkHeadService, useValue: linkHeadService }, + { provide: ConfigurationDataService, useValue: configurationDataService }, + { provide: SearchConfigurationService, useValue: new SearchConfigurationServiceStub() }, ], schemas: [NO_ERRORS_SCHEMA] }).compileComponents(); diff --git a/src/app/item-page/edit-item-page/item-relationships/edit-relationship-list/edit-relationship-list.component.spec.ts b/src/app/item-page/edit-item-page/item-relationships/edit-relationship-list/edit-relationship-list.component.spec.ts index b0d8046cf4..f9e889bba5 100644 --- a/src/app/item-page/edit-item-page/item-relationships/edit-relationship-list/edit-relationship-list.component.spec.ts +++ b/src/app/item-page/edit-item-page/item-relationships/edit-relationship-list/edit-relationship-list.component.spec.ts @@ -23,6 +23,12 @@ import { PaginationComponent } from '../../../../shared/pagination/pagination.co import { PaginationComponentOptions } from '../../../../shared/pagination/pagination-component-options.model'; import { RelationshipTypeService } from '../../../../core/data/relationship-type.service'; import { FieldChangeType } from '../../../../core/data/object-updates/field-change-type.model'; +import { GroupDataService } from '../../../../core/eperson/group-data.service'; +import { ConfigurationDataService } from '../../../../core/data/configuration-data.service'; +import { LinkHeadService } from '../../../../core/services/link-head.service'; +import { SearchConfigurationService } from '../../../../core/shared/search/search-configuration.service'; +import { SearchConfigurationServiceStub } from '../../../../shared/testing/search-configuration-service.stub'; +import { ConfigurationProperty } from '../../../../core/shared/configuration-property.model'; let comp: EditRelationshipListComponent; let fixture: ComponentFixture; @@ -174,6 +180,25 @@ describe('EditRelationshipListComponent', () => { hostWindowService = new HostWindowServiceStub(1200); + const linkHeadService = jasmine.createSpyObj('linkHeadService', { + addTag: '' + }); + + const groupDataService = jasmine.createSpyObj('groupsDataService', { + findAllByHref: createSuccessfulRemoteDataObject$(createPaginatedList([])), + getGroupRegistryRouterLink: '', + getUUIDFromString: '', + }); + + const configurationDataService = jasmine.createSpyObj('configurationDataService', { + findByPropertyName: createSuccessfulRemoteDataObject$(Object.assign(new ConfigurationProperty(), { + name: 'test', + values: [ + 'org.dspace.ctask.general.ProfileFormats = test' + ] + })) + }); + TestBed.configureTestingModule({ imports: [SharedModule, TranslateModule.forRoot()], declarations: [EditRelationshipListComponent], @@ -185,6 +210,10 @@ describe('EditRelationshipListComponent', () => { { provide: PaginationService, useValue: paginationService }, { provide: HostWindowService, useValue: hostWindowService }, { provide: RelationshipTypeService, useValue: relationshipTypeService }, + { provide: GroupDataService, useValue: groupDataService }, + { provide: LinkHeadService, useValue: linkHeadService }, + { provide: ConfigurationDataService, useValue: configurationDataService }, + { provide: SearchConfigurationService, useValue: new SearchConfigurationServiceStub() }, ], schemas: [ NO_ERRORS_SCHEMA ] diff --git a/src/app/shared/object-select/collection-select/collection-select.component.spec.ts b/src/app/shared/object-select/collection-select/collection-select.component.spec.ts index 5714db2385..1b89fd32c1 100644 --- a/src/app/shared/object-select/collection-select/collection-select.component.spec.ts +++ b/src/app/shared/object-select/collection-select/collection-select.component.spec.ts @@ -17,6 +17,12 @@ import { PaginationService } from '../../../core/pagination/pagination.service'; import { PaginationServiceStub } from '../../testing/pagination-service.stub'; import { of as observableOf } from 'rxjs'; import { AuthorizationDataService } from '../../../core/data/feature-authorization/authorization-data.service'; +import { LinkHeadService } from '../../../core/services/link-head.service'; +import { GroupDataService } from '../../../core/eperson/group-data.service'; +import { ConfigurationDataService } from '../../../core/data/configuration-data.service'; +import { SearchConfigurationService } from '../../../core/shared/search/search-configuration.service'; +import { SearchConfigurationServiceStub } from '../../testing/search-configuration-service.stub'; +import { ConfigurationProperty } from '../../../core/shared/configuration-property.model'; describe('CollectionSelectComponent', () => { let comp: CollectionSelectComponent; @@ -44,6 +50,25 @@ describe('CollectionSelectComponent', () => { isAuthorized: observableOf(true) }); + const linkHeadService = jasmine.createSpyObj('linkHeadService', { + addTag: '' + }); + + const groupDataService = jasmine.createSpyObj('groupsDataService', { + findAllByHref: createSuccessfulRemoteDataObject$(createPaginatedList([])), + getGroupRegistryRouterLink: '', + getUUIDFromString: '', + }); + + const configurationDataService = jasmine.createSpyObj('configurationDataService', { + findByPropertyName: createSuccessfulRemoteDataObject$(Object.assign(new ConfigurationProperty(), { + name: 'test', + values: [ + 'org.dspace.ctask.general.ProfileFormats = test' + ] + })) + }); + const paginationService = new PaginationServiceStub(); beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ @@ -53,7 +78,11 @@ describe('CollectionSelectComponent', () => { { provide: ObjectSelectService, useValue: new ObjectSelectServiceStub([mockCollectionList[1].id]) }, { provide: HostWindowService, useValue: new HostWindowServiceStub(0) }, { provide: PaginationService, useValue: paginationService }, - { provide: AuthorizationDataService, useValue: authorizationDataService } + { provide: AuthorizationDataService, useValue: authorizationDataService }, + { provide: GroupDataService, useValue: groupDataService }, + { provide: LinkHeadService, useValue: linkHeadService }, + { provide: ConfigurationDataService, useValue: configurationDataService }, + { provide: SearchConfigurationService, useValue: new SearchConfigurationServiceStub() }, ], schemas: [NO_ERRORS_SCHEMA] }).compileComponents(); diff --git a/src/app/shared/object-select/item-select/item-select.component.spec.ts b/src/app/shared/object-select/item-select/item-select.component.spec.ts index de52f1c3c2..25340ee862 100644 --- a/src/app/shared/object-select/item-select/item-select.component.spec.ts +++ b/src/app/shared/object-select/item-select/item-select.component.spec.ts @@ -18,6 +18,12 @@ import { PaginationService } from '../../../core/pagination/pagination.service'; import { PaginationServiceStub } from '../../testing/pagination-service.stub'; import { AuthorizationDataService } from '../../../core/data/feature-authorization/authorization-data.service'; import { FeatureID } from '../../../core/data/feature-authorization/feature-id'; +import { ConfigurationDataService } from '../../../core/data/configuration-data.service'; +import { SearchConfigurationService } from '../../../core/shared/search/search-configuration.service'; +import { LinkHeadService } from '../../../core/services/link-head.service'; +import { GroupDataService } from '../../../core/eperson/group-data.service'; +import { SearchConfigurationServiceStub } from '../../testing/search-configuration-service.stub'; +import { ConfigurationProperty } from '../../../core/shared/configuration-property.model'; describe('ItemSelectComponent', () => { let comp: ItemSelectComponent; @@ -70,6 +76,24 @@ describe('ItemSelectComponent', () => { const authorizationDataService = new AuthorizationDataService(null, null, null, null, null, null, null, null, null, null); + const linkHeadService = jasmine.createSpyObj('linkHeadService', { + addTag: '' + }); + + const groupDataService = jasmine.createSpyObj('groupsDataService', { + findAllByHref: createSuccessfulRemoteDataObject$(createPaginatedList([])), + getGroupRegistryRouterLink: '', + getUUIDFromString: '', + }); + + const configurationDataService = jasmine.createSpyObj('configurationDataService', { + findByPropertyName: createSuccessfulRemoteDataObject$(Object.assign(new ConfigurationProperty(), { + name: 'test', + values: [ + 'org.dspace.ctask.general.ProfileFormats = test' + ] + })) + }); beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ @@ -79,7 +103,11 @@ describe('ItemSelectComponent', () => { { provide: ObjectSelectService, useValue: new ObjectSelectServiceStub([mockItemList[1].id]) }, { provide: HostWindowService, useValue: new HostWindowServiceStub(0) }, { provide: PaginationService, useValue: paginationService }, - { provide: AuthorizationDataService, useValue: authorizationDataService } + { provide: AuthorizationDataService, useValue: authorizationDataService }, + { provide: GroupDataService, useValue: groupDataService }, + { provide: LinkHeadService, useValue: linkHeadService }, + { provide: ConfigurationDataService, useValue: configurationDataService }, + { provide: SearchConfigurationService, useValue: new SearchConfigurationServiceStub() }, ], schemas: [NO_ERRORS_SCHEMA] }).compileComponents(); diff --git a/src/app/shared/rss-feed/rss.component.scss b/src/app/shared/rss-feed/rss.component.scss index 929bb453ac..91310eddcb 100644 --- a/src/app/shared/rss-feed/rss.component.scss +++ b/src/app/shared/rss-feed/rss.component.scss @@ -9,4 +9,4 @@ .margin-right { margin-right: .5em; -} \ No newline at end of file +} diff --git a/src/app/shared/rss-feed/rss.component.spec.ts b/src/app/shared/rss-feed/rss.component.spec.ts index bbfd5442b3..cbdc2a2d0e 100644 --- a/src/app/shared/rss-feed/rss.component.spec.ts +++ b/src/app/shared/rss-feed/rss.component.spec.ts @@ -15,6 +15,7 @@ import { PaginationServiceStub } from '../testing/pagination-service.stub'; import { createPaginatedList } from '../testing/utils.test'; import { RSSComponent } from './rss.component'; import { of as observableOf } from 'rxjs'; +import { SearchConfigurationServiceStub } from '../testing/search-configuration-service.stub'; @@ -61,11 +62,11 @@ describe('RssComponent', () => { currentPage: 1 }), sort: new SortOptions('dc.title', SortDirection.ASC), - scope: mockCollection.id })); groupDataService = jasmine.createSpyObj('groupsDataService', { findAllByHref: createSuccessfulRemoteDataObject$(createPaginatedList([])), - getGroupRegistryRouterLink: '' + getGroupRegistryRouterLink: '', + getUUIDFromString: '', }); paginationService = new PaginationServiceStub(); const searchConfigService = { @@ -76,7 +77,7 @@ describe('RssComponent', () => { { provide: GroupDataService, useValue: groupDataService }, { provide: LinkHeadService, useValue: linkHeadService }, { provide: ConfigurationDataService, useValue: configurationDataService }, - { provide: SearchConfigurationService, useValue: searchConfigService}, + { provide: SearchConfigurationService, useValue: new SearchConfigurationServiceStub() }, { provide: PaginationService, useValue: paginationService } ], declarations: [RSSComponent] diff --git a/src/app/shared/testing/search-configuration-service.stub.ts b/src/app/shared/testing/search-configuration-service.stub.ts index 80744ba59a..78b358f0d4 100644 --- a/src/app/shared/testing/search-configuration-service.stub.ts +++ b/src/app/shared/testing/search-configuration-service.stub.ts @@ -17,6 +17,10 @@ export class SearchConfigurationServiceStub { return observableOf('test-id'); } + getCurrentQuery(a) { + return observableOf(a); + } + getCurrentConfiguration(a) { return observableOf(a); } From b5943b48b47009a7f771db99530d57d5be2fd1fc Mon Sep 17 00:00:00 2001 From: Nathan Buckingham Date: Fri, 25 Feb 2022 12:14:16 -0500 Subject: [PATCH 149/343] w2p-86403 fix opensearch is disabled, router issues and links --- src/app/core/services/link-head.service.ts | 3 ++ src/app/shared/rss-feed/rss.component.ts | 32 +++++++++++++++++----- src/app/shared/shared.module.ts | 4 +++ 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/src/app/core/services/link-head.service.ts b/src/app/core/services/link-head.service.ts index 12c3ff197d..af5dddec8d 100644 --- a/src/app/core/services/link-head.service.ts +++ b/src/app/core/services/link-head.service.ts @@ -1,6 +1,9 @@ import { Injectable, RendererFactory2, ViewEncapsulation, Inject } from '@angular/core'; import { DOCUMENT } from '@angular/common'; +/** + * LinkHead Service injects tag into the head element during runtime. + */ @Injectable() export class LinkHeadService { constructor( diff --git a/src/app/shared/rss-feed/rss.component.ts b/src/app/shared/rss-feed/rss.component.ts index 036148b368..11286e19e3 100644 --- a/src/app/shared/rss-feed/rss.component.ts +++ b/src/app/shared/rss-feed/rss.component.ts @@ -14,10 +14,11 @@ import { environment } from '../../../../src/environments/environment'; import { SearchConfigurationService } from '../../core/shared/search/search-configuration.service'; import { SortOptions } from '../../core/cache/models/sort-options.model'; import { PaginationService } from '../../core/pagination/pagination.service'; +import { Router } from '@angular/router'; /** - * The default pagination controls component. + * The Rss feed button componenet. */ @Component({ exportAs: 'rssComponent', @@ -41,6 +42,7 @@ export class RSSComponent implements OnInit, OnDestroy { private linkHeadService: LinkHeadService, private configurationService: ConfigurationDataService, private searchConfigurationService: SearchConfigurationService, + private router: Router, protected paginationService: PaginationService) { } ngOnDestroy(): void { @@ -53,22 +55,22 @@ export class RSSComponent implements OnInit, OnDestroy { this.configurationService.findByPropertyName('websvc.opensearch.enable').pipe( getFirstCompletedRemoteData(), ).subscribe((result) => { - const enabled = Boolean(result.payload.values[0]); + const enabled = (result.payload.values[0] === 'true'); this.isEnabled$.next(enabled); }); this.searchConfigurationService.getCurrentQuery('').subscribe((query) => { this.sortOption$ = this.paginationService.getCurrentSort(this.searchConfigurationService.paginationID, null, true); this.sortOption$.subscribe((sort) => { - this.uuid = this.groupDataService.getUUIDFromString(window.location.href); + this.uuid = this.groupDataService.getUUIDFromString(this.router.url); const route = environment.rest.baseUrl + this.formulateRoute(this.uuid, sort, query); - + this.addLinks(route); this.linkHeadService.addTag({ - href: route, + href: environment.rest.baseUrl + '/opensearch/service', type: 'application/atom+xml', - rel: 'alternate', - title: 'Sitewide Atom feed' + rel: 'search', + title: 'Dspace' }); this.route$ = new BehaviorSubject(route); }); @@ -91,4 +93,20 @@ export class RSSComponent implements OnInit, OnDestroy { route = '/opensearch/' + route; return route; } + + addLinks(route: string): void { + this.linkHeadService.addTag({ + href: route, + type: 'application/atom+xml', + rel: 'alternate', + title: 'Sitewide Atom feed' + }); + route = route.replace('format=atom', 'format=rss'); + this.linkHeadService.addTag({ + href: route, + type: 'application/rss+xml', + rel: 'alternate', + title: 'Sitewide RSS feed' + }); + } } diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index c70aff6192..c6cc3d2bd9 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -174,6 +174,10 @@ import { DsSelectComponent } from './ds-select/ds-select.component'; import { LogInOidcComponent } from './log-in/methods/oidc/log-in-oidc.component'; import { ThemedItemListPreviewComponent } from './object-list/my-dspace-result-list-element/item-list-preview/themed-item-list-preview.component'; import { RSSComponent } from './rss-feed/rss.component'; +import { SearchObjects } from './search/models/search-objects.model'; +import { FacetConfigResponse } from './search/models/facet-config-response.model'; +import { SearchResult } from './search/models/search-result.model'; +import { FacetValues } from './search/models/facet-values.model'; const MODULES = [ CommonModule, From efb76ea88328df3d03706ad3c5f0411dcf7077a9 Mon Sep 17 00:00:00 2001 From: Nathan Buckingham Date: Fri, 25 Feb 2022 12:35:17 -0500 Subject: [PATCH 150/343] Fix tests now that router is apart of the rss component --- .../edit-relationship-list.component.spec.ts | 3 +++ src/app/shared/rss-feed/rss.component.spec.ts | 7 +++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/app/item-page/edit-item-page/item-relationships/edit-relationship-list/edit-relationship-list.component.spec.ts b/src/app/item-page/edit-item-page/item-relationships/edit-relationship-list/edit-relationship-list.component.spec.ts index f9e889bba5..2403d8f443 100644 --- a/src/app/item-page/edit-item-page/item-relationships/edit-relationship-list/edit-relationship-list.component.spec.ts +++ b/src/app/item-page/edit-item-page/item-relationships/edit-relationship-list/edit-relationship-list.component.spec.ts @@ -29,6 +29,8 @@ import { LinkHeadService } from '../../../../core/services/link-head.service'; import { SearchConfigurationService } from '../../../../core/shared/search/search-configuration.service'; import { SearchConfigurationServiceStub } from '../../../../shared/testing/search-configuration-service.stub'; import { ConfigurationProperty } from '../../../../core/shared/configuration-property.model'; +import { Router } from '@angular/router'; +import { RouterMock } from '../../../../shared/mocks/router.mock'; let comp: EditRelationshipListComponent; let fixture: ComponentFixture; @@ -211,6 +213,7 @@ describe('EditRelationshipListComponent', () => { { provide: HostWindowService, useValue: hostWindowService }, { provide: RelationshipTypeService, useValue: relationshipTypeService }, { provide: GroupDataService, useValue: groupDataService }, + { provide: Router, useValue: new RouterMock() }, { provide: LinkHeadService, useValue: linkHeadService }, { provide: ConfigurationDataService, useValue: configurationDataService }, { provide: SearchConfigurationService, useValue: new SearchConfigurationServiceStub() }, diff --git a/src/app/shared/rss-feed/rss.component.spec.ts b/src/app/shared/rss-feed/rss.component.spec.ts index cbdc2a2d0e..b304abda83 100644 --- a/src/app/shared/rss-feed/rss.component.spec.ts +++ b/src/app/shared/rss-feed/rss.component.spec.ts @@ -10,12 +10,14 @@ import { ConfigurationProperty } from '../../core/shared/configuration-property. import { SearchConfigurationService } from '../../core/shared/search/search-configuration.service'; import { PaginationComponentOptions } from '../pagination/pagination-component-options.model'; import { createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ } from '../remote-data.utils'; -import { PaginatedSearchOptions } from '../search/paginated-search-options.model'; import { PaginationServiceStub } from '../testing/pagination-service.stub'; import { createPaginatedList } from '../testing/utils.test'; import { RSSComponent } from './rss.component'; import { of as observableOf } from 'rxjs'; import { SearchConfigurationServiceStub } from '../testing/search-configuration-service.stub'; +import { PaginatedSearchOptions } from '../search/models/paginated-search-options.model'; +import { Router } from '@angular/router'; +import { RouterMock } from '../mocks/router.mock'; @@ -78,7 +80,8 @@ describe('RssComponent', () => { { provide: LinkHeadService, useValue: linkHeadService }, { provide: ConfigurationDataService, useValue: configurationDataService }, { provide: SearchConfigurationService, useValue: new SearchConfigurationServiceStub() }, - { provide: PaginationService, useValue: paginationService } + { provide: PaginationService, useValue: paginationService }, + { provide: Router, useValue: new RouterMock() } ], declarations: [RSSComponent] }).compileComponents(); From ffb34da3e74ce1354f3a29559adf36b856947344 Mon Sep 17 00:00:00 2001 From: Nathan Buckingham Date: Fri, 25 Feb 2022 14:56:36 -0500 Subject: [PATCH 151/343] Create link head spec file --- .../core/services/link-head.service.spec.ts | 45 +++++++++++++++++++ src/app/core/services/link-head.service.ts | 17 +++++-- 2 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 src/app/core/services/link-head.service.spec.ts diff --git a/src/app/core/services/link-head.service.spec.ts b/src/app/core/services/link-head.service.spec.ts new file mode 100644 index 0000000000..017fe6af03 --- /dev/null +++ b/src/app/core/services/link-head.service.spec.ts @@ -0,0 +1,45 @@ +import { DOCUMENT } from '@angular/common'; +import { Renderer2, RendererFactory2 } from '@angular/core'; +import { TestBed, waitForAsync } from '@angular/core/testing'; +import { MockProvider } from 'ng-mocks'; +import { LinkHeadService } from './link-head.service'; + +describe('LinkHeadService', () => { + + let service: LinkHeadService; + + const renderer2: Renderer2 = { + createRenderer: jasmine.createSpy('createRenderer'), + createElement: jasmine.createSpy('createElement'), + setAttribute: jasmine.createSpy('setAttribute'), + appendChild: jasmine.createSpy('appendChild') + } as unknown as Renderer2; + + beforeEach(waitForAsync(() => { + return TestBed.configureTestingModule({ + providers: [ + MockProvider(RendererFactory2, { + createRenderer: () => renderer2 + }), + { provide: Document, useExisting: DOCUMENT }, + ] + }); + })); + + beforeEach(() => { + service = new LinkHeadService(TestBed.inject(RendererFactory2), TestBed.inject(DOCUMENT)); + }); + + describe('link', () => { + it('should create a link tag', () => { + const link = service.addTag({ + href: 'test', + type: 'application/atom+xml', + rel: 'alternate', + title: 'Sitewide Atom feed' + }); + expect(link).not.toBeUndefined(); + }); + }); + +}); diff --git a/src/app/core/services/link-head.service.ts b/src/app/core/services/link-head.service.ts index af5dddec8d..39552a44d3 100644 --- a/src/app/core/services/link-head.service.ts +++ b/src/app/core/services/link-head.service.ts @@ -12,7 +12,13 @@ export class LinkHeadService { ) { } - addTag(tag: LinkDefinition, forceCreation?: boolean) { + + /** + * Method to create a Link tag in the HEAD of the html. + * @param tag LinkDefition is the paramaters to define a link tag. + * @returns Link tag that was created + */ + addTag(tag: LinkDefinition) { try { const renderer = this.rendererFactory.createRenderer(this.document, { @@ -23,7 +29,8 @@ export class LinkHeadService { }); const link = renderer.createElement('link'); - + console.log(tag); + console.log(link); const head = this.document.head; if (head === null) { @@ -35,12 +42,16 @@ export class LinkHeadService { }); renderer.appendChild(head, link); - + return renderer; } catch (e) { console.error('Error within linkService : ', e); } } + /** + * Removes a link tag in header based on the given attrSelector. + * @param attrSelector The attr assigned to a link tag which will be used to determine what link to remove. + */ removeTag(attrSelector: string) { if (attrSelector) { try { From 2b9383d2d59c47d6f90a2f5a43fdabd43d351d14 Mon Sep 17 00:00:00 2001 From: Nathan Buckingham Date: Mon, 18 Apr 2022 12:33:29 -0400 Subject: [PATCH 152/343] remove unused import from rebase --- src/app/shared/shared.module.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index c6cc3d2bd9..c70aff6192 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -174,10 +174,6 @@ import { DsSelectComponent } from './ds-select/ds-select.component'; import { LogInOidcComponent } from './log-in/methods/oidc/log-in-oidc.component'; import { ThemedItemListPreviewComponent } from './object-list/my-dspace-result-list-element/item-list-preview/themed-item-list-preview.component'; import { RSSComponent } from './rss-feed/rss.component'; -import { SearchObjects } from './search/models/search-objects.model'; -import { FacetConfigResponse } from './search/models/facet-config-response.model'; -import { SearchResult } from './search/models/search-result.model'; -import { FacetValues } from './search/models/facet-values.model'; const MODULES = [ CommonModule, From 0bf0e1f2742aa253d4a442a83eebb64ea680902a Mon Sep 17 00:00:00 2001 From: Nathan Buckingham Date: Mon, 18 Apr 2022 13:30:35 -0400 Subject: [PATCH 153/343] add providers to browseby --- .../browse-by/browse-by.component.spec.ts | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/app/shared/browse-by/browse-by.component.spec.ts b/src/app/shared/browse-by/browse-by.component.spec.ts index d71d100ca5..8bda44b11c 100644 --- a/src/app/shared/browse-by/browse-by.component.spec.ts +++ b/src/app/shared/browse-by/browse-by.component.spec.ts @@ -38,6 +38,13 @@ import { HostWindowService } from '../host-window.service'; import { RouteService } from '../../core/services/route.service'; import { routeServiceStub } from '../testing/route-service.stub'; import SpyObj = jasmine.SpyObj; +import { GroupDataService } from '../../core/eperson/group-data.service'; +import { createPaginatedList } from '../testing/utils.test'; +import { LinkHeadService } from '../../core/services/link-head.service'; +import { ConfigurationDataService } from '../../core/data/configuration-data.service'; +import { ConfigurationProperty } from '../../core/shared/configuration-property.model'; +import { SearchConfigurationServiceStub } from '../testing/search-configuration-service.stub'; +import { SearchConfigurationService } from '../../core/shared/search/search-configuration.service'; @listableObjectComponent(BrowseEntry, ViewMode.ListElement, DEFAULT_CONTEXT, 'custom') @Component({ @@ -73,6 +80,25 @@ describe('BrowseByComponent', () => { ]; const mockItemsRD$ = createSuccessfulRemoteDataObject$(buildPaginatedList(new PageInfo(), mockItems)); + const groupDataService = jasmine.createSpyObj('groupsDataService', { + findAllByHref: createSuccessfulRemoteDataObject$(createPaginatedList([])), + getGroupRegistryRouterLink: '', + getUUIDFromString: '', + }); + + const linkHeadService = jasmine.createSpyObj('linkHeadService', { + addTag: '' + }); + + const configurationDataService = jasmine.createSpyObj('configurationDataService', { + findByPropertyName: createSuccessfulRemoteDataObject$(Object.assign(new ConfigurationProperty(), { + name: 'test', + values: [ + 'org.dspace.ctask.general.ProfileFormats = test' + ] + })) + }); + const paginationConfig = Object.assign(new PaginationComponentOptions(), { id: 'test-pagination', currentPage: 1, @@ -103,6 +129,10 @@ describe('BrowseByComponent', () => { ], declarations: [], providers: [ + { provide: SearchConfigurationService, useValue: new SearchConfigurationServiceStub() }, + { provide: ConfigurationDataService, useValue: configurationDataService }, + { provide: LinkHeadService, useValue: linkHeadService }, + { provide: GroupDataService, useValue: groupDataService }, { provide: PaginationService, useValue: paginationService }, { provide: MockThemedBrowseEntryListElementComponent }, { provide: ThemeService, useValue: themeService }, From be8a8f5f6bf9359eecc8034b22c522fe9ac1389f Mon Sep 17 00:00:00 2001 From: Nathan Buckingham Date: Wed, 27 Apr 2022 16:13:01 -0400 Subject: [PATCH 154/343] Add typedocs and websvc.opensearch.svccontext --- src/app/core/services/link-head.service.ts | 2 - src/app/shared/rss-feed/rss.component.spec.ts | 6 +-- src/app/shared/rss-feed/rss.component.ts | 53 +++++++++++++------ src/app/shared/shared.module.ts | 1 + src/environments/environment.dev.ts | 17 ------ src/environments/environment.prod.ts | 17 ------ 6 files changed, 41 insertions(+), 55 deletions(-) delete mode 100644 src/environments/environment.dev.ts delete mode 100644 src/environments/environment.prod.ts diff --git a/src/app/core/services/link-head.service.ts b/src/app/core/services/link-head.service.ts index 39552a44d3..d608618ca4 100644 --- a/src/app/core/services/link-head.service.ts +++ b/src/app/core/services/link-head.service.ts @@ -29,8 +29,6 @@ export class LinkHeadService { }); const link = renderer.createElement('link'); - console.log(tag); - console.log(link); const head = this.document.head; if (head === null) { diff --git a/src/app/shared/rss-feed/rss.component.spec.ts b/src/app/shared/rss-feed/rss.component.spec.ts index b304abda83..fc19c65e60 100644 --- a/src/app/shared/rss-feed/rss.component.spec.ts +++ b/src/app/shared/rss-feed/rss.component.spec.ts @@ -96,17 +96,17 @@ describe('RssComponent', () => { }); it('should formulate the correct url given params in url', () => { - const route = comp.formulateRoute(uuid, options, query); + const route = comp.formulateRoute(uuid, 'opensearch', options, query); expect(route).toBe('/opensearch/search?format=atom&scope=2cfcf65e-0a51-4bcb-8592-b8db7b064790&sort=dc.title&sort_direction=DESC&query=test'); }); it('should skip uuid if its null', () => { - const route = comp.formulateRoute(null, options, query); + const route = comp.formulateRoute(null, 'opensearch', options, query); expect(route).toBe('/opensearch/search?format=atom&sort=dc.title&sort_direction=DESC&query=test'); }); it('should default to query * if none provided', () => { - const route = comp.formulateRoute(null, options, null); + const route = comp.formulateRoute(null, 'opensearch', options, null); expect(route).toBe('/opensearch/search?format=atom&sort=dc.title&sort_direction=DESC&query=*'); }); }); diff --git a/src/app/shared/rss-feed/rss.component.ts b/src/app/shared/rss-feed/rss.component.ts index 11286e19e3..456e627941 100644 --- a/src/app/shared/rss-feed/rss.component.ts +++ b/src/app/shared/rss-feed/rss.component.ts @@ -45,10 +45,17 @@ export class RSSComponent implements OnInit, OnDestroy { private router: Router, protected paginationService: PaginationService) { } + /** + * Removes the linktag created when the component gets removed from the page. + */ ngOnDestroy(): void { this.linkHeadService.removeTag("rel='alternate'"); } + + /** + * Generates the link tags and the url to opensearch when the component is loaded. + */ ngOnInit(): void { this.configuration$ = this.searchConfigurationService.getCurrentConfiguration('default'); @@ -58,26 +65,36 @@ export class RSSComponent implements OnInit, OnDestroy { const enabled = (result.payload.values[0] === 'true'); this.isEnabled$.next(enabled); }); - - this.searchConfigurationService.getCurrentQuery('').subscribe((query) => { - this.sortOption$ = this.paginationService.getCurrentSort(this.searchConfigurationService.paginationID, null, true); - this.sortOption$.subscribe((sort) => { - this.uuid = this.groupDataService.getUUIDFromString(this.router.url); - - const route = environment.rest.baseUrl + this.formulateRoute(this.uuid, sort, query); - this.addLinks(route); - this.linkHeadService.addTag({ - href: environment.rest.baseUrl + '/opensearch/service', - type: 'application/atom+xml', - rel: 'search', - title: 'Dspace' + this.configurationService.findByPropertyName('websvc.opensearch.svccontext').pipe( + getFirstCompletedRemoteData(), + ).subscribe((url) => { + this.searchConfigurationService.getCurrentQuery('').subscribe((query) => { + this.sortOption$ = this.paginationService.getCurrentSort(this.searchConfigurationService.paginationID, null, true); + this.sortOption$.subscribe((sort) => { + this.uuid = this.groupDataService.getUUIDFromString(this.router.url); + const route = environment.rest.baseUrl + this.formulateRoute(this.uuid, url.payload.values[0], sort, query); + this.addLinks(route); + this.linkHeadService.addTag({ + href: environment.rest.baseUrl + '/' + url.payload.values[0] + '/service', + type: 'application/atom+xml', + rel: 'search', + title: 'Dspace' + }); + this.route$ = new BehaviorSubject(route); }); - this.route$ = new BehaviorSubject(route); }); }); } - formulateRoute(uuid: string, sort: SortOptions, query: string): string { + /** + * Function created a route given the different params available to opensearch + * @param uuid The uuid if a scope is present + * @param opensearch openSearch uri + * @param sort The sort options for the opensearch request + * @param query The query string that was provided in the search + * @returns The combine URL to opensearch + */ + formulateRoute(uuid: string, opensearch: string, sort: SortOptions, query: string): string { let route = 'search?format=atom'; if (uuid) { route += `&scope=${uuid}`; @@ -90,10 +107,14 @@ export class RSSComponent implements OnInit, OnDestroy { } else { route += `&query=*`; } - route = '/opensearch/' + route; + route = '/' + opensearch +'/' + route; return route; } + /** + * Creates tags in the header of the page + * @param route The composed url to opensearch + */ addLinks(route: string): void { this.linkHeadService.addTag({ href: route, diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index c70aff6192..7c6fe6657a 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -174,6 +174,7 @@ import { DsSelectComponent } from './ds-select/ds-select.component'; import { LogInOidcComponent } from './log-in/methods/oidc/log-in-oidc.component'; import { ThemedItemListPreviewComponent } from './object-list/my-dspace-result-list-element/item-list-preview/themed-item-list-preview.component'; import { RSSComponent } from './rss-feed/rss.component'; +import { ExternalLinkMenuItemComponent } from './menu/menu-item/external-link-menu-item.component'; const MODULES = [ CommonModule, diff --git a/src/environments/environment.dev.ts b/src/environments/environment.dev.ts deleted file mode 100644 index 999abd32ee..0000000000 --- a/src/environments/environment.dev.ts +++ /dev/null @@ -1,17 +0,0 @@ -export const environment = { - ui: { - ssl: false, - host: 'localhost', - port: 18080, - nameSpace: '/' - }, - rest: { - ssl: false, - host: 'localhost', - port: 8080, - nameSpace: '/server' - }, - universal: { - preboot: false - } -}; diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts deleted file mode 100644 index c31da7b791..0000000000 --- a/src/environments/environment.prod.ts +++ /dev/null @@ -1,17 +0,0 @@ -export const environment = { - ui: { - ssl: false, - host: 'localhost', - port: 18080, - nameSpace: '/' - }, - rest: { - ssl: false, - host: 'localhost', - port: 8080, - nameSpace: '/server' - }, - universal: { - preboot: true - } -}; From 90f1fc186c12719fe5f62f2606ef6daf29d22777 Mon Sep 17 00:00:00 2001 From: Nathan Buckingham Date: Thu, 28 Apr 2022 09:36:09 -0400 Subject: [PATCH 155/343] Link fixes --- src/app/shared/rss-feed/rss.component.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/shared/rss-feed/rss.component.ts b/src/app/shared/rss-feed/rss.component.ts index 456e627941..d397019995 100644 --- a/src/app/shared/rss-feed/rss.component.ts +++ b/src/app/shared/rss-feed/rss.component.ts @@ -89,7 +89,7 @@ export class RSSComponent implements OnInit, OnDestroy { /** * Function created a route given the different params available to opensearch * @param uuid The uuid if a scope is present - * @param opensearch openSearch uri + * @param opensearch openSearch uri * @param sort The sort options for the opensearch request * @param query The query string that was provided in the search * @returns The combine URL to opensearch @@ -107,7 +107,7 @@ export class RSSComponent implements OnInit, OnDestroy { } else { route += `&query=*`; } - route = '/' + opensearch +'/' + route; + route = '/' + opensearch + '/' + route; return route; } From 8785270363a4d54ec1bc22d8c90571b7f9ba081d Mon Sep 17 00:00:00 2001 From: Nathan Buckingham Date: Thu, 28 Apr 2022 15:51:21 -0400 Subject: [PATCH 156/343] w2p-86403 Changed to subscribe and unsubscribe on destory --- src/app/shared/rss-feed/rss.component.ts | 53 ++++++++++++++---------- 1 file changed, 31 insertions(+), 22 deletions(-) diff --git a/src/app/shared/rss-feed/rss.component.ts b/src/app/shared/rss-feed/rss.component.ts index d397019995..56ed052a9f 100644 --- a/src/app/shared/rss-feed/rss.component.ts +++ b/src/app/shared/rss-feed/rss.component.ts @@ -5,7 +5,7 @@ import { OnInit, ViewEncapsulation } from '@angular/core'; -import { BehaviorSubject, Observable } from 'rxjs'; +import { BehaviorSubject, Observable, Subscription } from 'rxjs'; import { GroupDataService } from '../../core/eperson/group-data.service'; import { LinkHeadService } from '../../core/services/link-head.service'; import { ConfigurationDataService } from '../../core/data/configuration-data.service'; @@ -15,6 +15,9 @@ import { SearchConfigurationService } from '../../core/shared/search/search-conf import { SortOptions } from '../../core/cache/models/sort-options.model'; import { PaginationService } from '../../core/pagination/pagination.service'; import { Router } from '@angular/router'; +import { map, switchMap } from 'rxjs/operators'; +import { RemoteData } from '../../core/data/remote-data'; +import { PaginatedSearchOptions } from '../search/models/paginated-search-options.model'; /** @@ -32,12 +35,14 @@ export class RSSComponent implements OnInit, OnDestroy { route$: BehaviorSubject; - isEnabled$: BehaviorSubject = new BehaviorSubject(false); + isEnabled$: BehaviorSubject = new BehaviorSubject(null); uuid: string; configuration$: Observable; sortOption$: Observable; + subs: Subscription[] = []; + constructor(private groupDataService: GroupDataService, private linkHeadService: LinkHeadService, private configurationService: ConfigurationDataService, @@ -50,6 +55,9 @@ export class RSSComponent implements OnInit, OnDestroy { */ ngOnDestroy(): void { this.linkHeadService.removeTag("rel='alternate'"); + this.subs.forEach(sub => { + sub.unsubscribe(); + }); } @@ -59,31 +67,32 @@ export class RSSComponent implements OnInit, OnDestroy { ngOnInit(): void { this.configuration$ = this.searchConfigurationService.getCurrentConfiguration('default'); - this.configurationService.findByPropertyName('websvc.opensearch.enable').pipe( + this.subs.push(this.configurationService.findByPropertyName('websvc.opensearch.enable').pipe( getFirstCompletedRemoteData(), ).subscribe((result) => { const enabled = (result.payload.values[0] === 'true'); this.isEnabled$.next(enabled); - }); - this.configurationService.findByPropertyName('websvc.opensearch.svccontext').pipe( + })); + this.subs.push(this.configurationService.findByPropertyName('websvc.opensearch.svccontext').pipe( getFirstCompletedRemoteData(), - ).subscribe((url) => { - this.searchConfigurationService.getCurrentQuery('').subscribe((query) => { - this.sortOption$ = this.paginationService.getCurrentSort(this.searchConfigurationService.paginationID, null, true); - this.sortOption$.subscribe((sort) => { - this.uuid = this.groupDataService.getUUIDFromString(this.router.url); - const route = environment.rest.baseUrl + this.formulateRoute(this.uuid, url.payload.values[0], sort, query); - this.addLinks(route); - this.linkHeadService.addTag({ - href: environment.rest.baseUrl + '/' + url.payload.values[0] + '/service', - type: 'application/atom+xml', - rel: 'search', - title: 'Dspace' - }); - this.route$ = new BehaviorSubject(route); - }); + map((response: RemoteData) => response.payload.values[0]), + switchMap((openSearchUri: string) => + this.searchConfigurationService.paginatedSearchOptions.pipe( + map((searchOptions: PaginatedSearchOptions) => ({ openSearchUri, searchOptions })) + ) + ), + ).subscribe(({ openSearchUri, searchOptions }) => { + this.uuid = this.groupDataService.getUUIDFromString(this.router.url); + const route = environment.rest.baseUrl + this.formulateRoute(this.uuid, openSearchUri, searchOptions.sort, searchOptions.query); + this.addLinks(route); + this.linkHeadService.addTag({ + href: environment.rest.baseUrl + '/' + openSearchUri + '/service', + type: 'application/atom+xml', + rel: 'search', + title: 'Dspace' }); - }); + this.route$ = new BehaviorSubject(route); + })); } /** @@ -99,7 +108,7 @@ export class RSSComponent implements OnInit, OnDestroy { if (uuid) { route += `&scope=${uuid}`; } - if (sort.direction && sort.field) { + if (sort && sort.direction && sort.field) { route += `&sort=${sort.field}&sort_direction=${sort.direction}`; } if (query) { From 6cd22fa004b52077ad63c02cd302c1c4d4fb1342 Mon Sep 17 00:00:00 2001 From: Nathan Buckingham Date: Wed, 4 May 2022 15:27:10 -0400 Subject: [PATCH 157/343] w2p-86403 prevent from displaying on pages where rss feed doesn't make sense --- src/app/shared/rss-feed/rss.component.html | 2 +- src/app/shared/rss-feed/rss.component.ts | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/app/shared/rss-feed/rss.component.html b/src/app/shared/rss-feed/rss.component.html index 8868539b5c..895a9c2f97 100644 --- a/src/app/shared/rss-feed/rss.component.html +++ b/src/app/shared/rss-feed/rss.component.html @@ -1,4 +1,4 @@ - +
    diff --git a/src/app/shared/rss-feed/rss.component.ts b/src/app/shared/rss-feed/rss.component.ts index 56ed052a9f..20fb040013 100644 --- a/src/app/shared/rss-feed/rss.component.ts +++ b/src/app/shared/rss-feed/rss.component.ts @@ -120,6 +120,17 @@ export class RSSComponent implements OnInit, OnDestroy { return route; } + /** + * Check if the router url contains the specified route + * + * @param {string} route + * @returns + * @memberof MyComponent + */ + hasRoute(route: string) { + return this.router.url.includes(route); + } + /** * Creates tags in the header of the page * @param route The composed url to opensearch From eacbcfd15d803ea02dede2530934458f336a0e46 Mon Sep 17 00:00:00 2001 From: Nathan Buckingham Date: Fri, 6 May 2022 10:15:51 -0400 Subject: [PATCH 158/343] Change to withNotEmptyPayload to pass through if its empty --- src/app/shared/rss-feed/rss.component.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/app/shared/rss-feed/rss.component.ts b/src/app/shared/rss-feed/rss.component.ts index 20fb040013..880ed8b558 100644 --- a/src/app/shared/rss-feed/rss.component.ts +++ b/src/app/shared/rss-feed/rss.component.ts @@ -9,7 +9,7 @@ import { BehaviorSubject, Observable, Subscription } from 'rxjs'; import { GroupDataService } from '../../core/eperson/group-data.service'; import { LinkHeadService } from '../../core/services/link-head.service'; import { ConfigurationDataService } from '../../core/data/configuration-data.service'; -import { getFirstCompletedRemoteData } from '../../core/shared/operators'; +import { getFirstCompletedRemoteData, getFirstSucceededRemoteDataWithNotEmptyPayload } from '../../core/shared/operators'; import { environment } from '../../../../src/environments/environment'; import { SearchConfigurationService } from '../../core/shared/search/search-configuration.service'; import { SortOptions } from '../../core/cache/models/sort-options.model'; @@ -68,14 +68,14 @@ export class RSSComponent implements OnInit, OnDestroy { this.configuration$ = this.searchConfigurationService.getCurrentConfiguration('default'); this.subs.push(this.configurationService.findByPropertyName('websvc.opensearch.enable').pipe( - getFirstCompletedRemoteData(), + getFirstSucceededRemoteDataWithNotEmptyPayload(), ).subscribe((result) => { - const enabled = (result.payload.values[0] === 'true'); + const enabled = (result.values[0] === 'true'); this.isEnabled$.next(enabled); })); this.subs.push(this.configurationService.findByPropertyName('websvc.opensearch.svccontext').pipe( - getFirstCompletedRemoteData(), - map((response: RemoteData) => response.payload.values[0]), + getFirstSucceededRemoteDataWithNotEmptyPayload(), + map((result) => result.values[0]), switchMap((openSearchUri: string) => this.searchConfigurationService.paginatedSearchOptions.pipe( map((searchOptions: PaginatedSearchOptions) => ({ openSearchUri, searchOptions })) From cb1b7ceb0a8e134fc1b277de97b83c34931b2115 Mon Sep 17 00:00:00 2001 From: Nathan Buckingham Date: Fri, 6 May 2022 10:17:30 -0400 Subject: [PATCH 159/343] remove rss feed from search --- src/app/shared/rss-feed/rss.component.html | 2 +- src/app/shared/rss-feed/rss.component.ts | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/app/shared/rss-feed/rss.component.html b/src/app/shared/rss-feed/rss.component.html index 895a9c2f97..e86e72d15a 100644 --- a/src/app/shared/rss-feed/rss.component.html +++ b/src/app/shared/rss-feed/rss.component.html @@ -1,4 +1,4 @@ - +
    diff --git a/src/app/shared/rss-feed/rss.component.ts b/src/app/shared/rss-feed/rss.component.ts index 880ed8b558..1d76daabf1 100644 --- a/src/app/shared/rss-feed/rss.component.ts +++ b/src/app/shared/rss-feed/rss.component.ts @@ -9,14 +9,13 @@ import { BehaviorSubject, Observable, Subscription } from 'rxjs'; import { GroupDataService } from '../../core/eperson/group-data.service'; import { LinkHeadService } from '../../core/services/link-head.service'; import { ConfigurationDataService } from '../../core/data/configuration-data.service'; -import { getFirstCompletedRemoteData, getFirstSucceededRemoteDataWithNotEmptyPayload } from '../../core/shared/operators'; +import { getFirstSucceededRemoteDataWithNotEmptyPayload } from '../../core/shared/operators'; import { environment } from '../../../../src/environments/environment'; import { SearchConfigurationService } from '../../core/shared/search/search-configuration.service'; import { SortOptions } from '../../core/cache/models/sort-options.model'; import { PaginationService } from '../../core/pagination/pagination.service'; import { Router } from '@angular/router'; import { map, switchMap } from 'rxjs/operators'; -import { RemoteData } from '../../core/data/remote-data'; import { PaginatedSearchOptions } from '../search/models/paginated-search-options.model'; From 79bf27c659aff1fb798954ce826dcb949dcdbf69 Mon Sep 17 00:00:00 2001 From: Nathan Buckingham Date: Fri, 6 May 2022 14:03:14 -0400 Subject: [PATCH 160/343] Revert to getFirstCompletedRemoteData but check if payload has completed --- src/app/shared/rss-feed/rss.component.ts | 25 +++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/src/app/shared/rss-feed/rss.component.ts b/src/app/shared/rss-feed/rss.component.ts index 1d76daabf1..9a101e8310 100644 --- a/src/app/shared/rss-feed/rss.component.ts +++ b/src/app/shared/rss-feed/rss.component.ts @@ -9,7 +9,7 @@ import { BehaviorSubject, Observable, Subscription } from 'rxjs'; import { GroupDataService } from '../../core/eperson/group-data.service'; import { LinkHeadService } from '../../core/services/link-head.service'; import { ConfigurationDataService } from '../../core/data/configuration-data.service'; -import { getFirstSucceededRemoteDataWithNotEmptyPayload } from '../../core/shared/operators'; +import { getFirstCompletedRemoteData } from '../../core/shared/operators'; import { environment } from '../../../../src/environments/environment'; import { SearchConfigurationService } from '../../core/shared/search/search-configuration.service'; import { SortOptions } from '../../core/cache/models/sort-options.model'; @@ -17,6 +17,7 @@ import { PaginationService } from '../../core/pagination/pagination.service'; import { Router } from '@angular/router'; import { map, switchMap } from 'rxjs/operators'; import { PaginatedSearchOptions } from '../search/models/paginated-search-options.model'; +import { RemoteData } from '../../core/data/remote-data'; /** @@ -67,20 +68,30 @@ export class RSSComponent implements OnInit, OnDestroy { this.configuration$ = this.searchConfigurationService.getCurrentConfiguration('default'); this.subs.push(this.configurationService.findByPropertyName('websvc.opensearch.enable').pipe( - getFirstSucceededRemoteDataWithNotEmptyPayload(), + getFirstCompletedRemoteData(), ).subscribe((result) => { - const enabled = (result.values[0] === 'true'); - this.isEnabled$.next(enabled); + if (result.hasSucceeded) { + const enabled = (result.payload.values[0] === 'true'); + this.isEnabled$.next(enabled); + } })); this.subs.push(this.configurationService.findByPropertyName('websvc.opensearch.svccontext').pipe( - getFirstSucceededRemoteDataWithNotEmptyPayload(), - map((result) => result.values[0]), - switchMap((openSearchUri: string) => + getFirstCompletedRemoteData(), + map((result: RemoteData) => { + if (result.hasSucceeded) { + return result.payload.values[0]; + } + return null; + }), + switchMap((openSearchUri: string) => this.searchConfigurationService.paginatedSearchOptions.pipe( map((searchOptions: PaginatedSearchOptions) => ({ openSearchUri, searchOptions })) ) ), ).subscribe(({ openSearchUri, searchOptions }) => { + if (!openSearchUri) { + return null; + } this.uuid = this.groupDataService.getUUIDFromString(this.router.url); const route = environment.rest.baseUrl + this.formulateRoute(this.uuid, openSearchUri, searchOptions.sort, searchOptions.query); this.addLinks(route); From 0791287cf9265ff9d329085f5dd9172335c75ca6 Mon Sep 17 00:00:00 2001 From: Nathan Buckingham Date: Fri, 6 May 2022 14:09:08 -0400 Subject: [PATCH 161/343] lint fixes --- src/app/core/core.module.ts | 3 --- src/app/shared/rss-feed/rss.component.ts | 4 ++-- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index f6cde90253..27e2326818 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -164,12 +164,9 @@ import { SequenceService } from './shared/sequence.service'; import { CoreState } from './core-state.model'; import { GroupDataService } from './eperson/group-data.service'; import { SubmissionAccessesModel } from './config/models/config-submission-accesses.model'; -<<<<<<< HEAD import { AccessStatusObject } from '../shared/object-list/access-status-badge/access-status.model'; import { AccessStatusDataService } from './data/access-status-data.service'; -======= import { LinkHeadService } from './services/link-head.service'; ->>>>>>> 354768d98 (w2p-85140 ds-rss component now adds a button to all search pages and community and collection, link-head service adds the rss to the head element) /** * When not in production, endpoint responses can be mocked for testing purposes diff --git a/src/app/shared/rss-feed/rss.component.ts b/src/app/shared/rss-feed/rss.component.ts index 9a101e8310..b694280e3c 100644 --- a/src/app/shared/rss-feed/rss.component.ts +++ b/src/app/shared/rss-feed/rss.component.ts @@ -77,13 +77,13 @@ export class RSSComponent implements OnInit, OnDestroy { })); this.subs.push(this.configurationService.findByPropertyName('websvc.opensearch.svccontext').pipe( getFirstCompletedRemoteData(), - map((result: RemoteData) => { + map((result: RemoteData) => { if (result.hasSucceeded) { return result.payload.values[0]; } return null; }), - switchMap((openSearchUri: string) => + switchMap((openSearchUri: string) => this.searchConfigurationService.paginatedSearchOptions.pipe( map((searchOptions: PaginatedSearchOptions) => ({ openSearchUri, searchOptions })) ) From 42c459a51d5ebcf2eff3423fe239968e24dfcd9c Mon Sep 17 00:00:00 2001 From: Mykhaylo Date: Thu, 12 May 2022 16:13:43 +0200 Subject: [PATCH 162/343] [CST-5303] added labels into i18n --- src/assets/i18n/en.json5 | 48 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 9bdf41346d..bb2bcf8ebc 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -2158,6 +2158,22 @@ "item.preview.dc.title": "Title:", + "item.preview.dc.type": "Type:", + + "item.preview.oaire.citation.issue" : "Issue", + + "item.preview.oaire.citation.volume" : "Volume", + + "item.preview.dc.relation.issn" : "ISSN", + + "item.preview.dc.identifier.isbn" : "ISBN", + + "item.preview.dc.identifier": "Identifier:", + + "item.preview.dc.relation.ispartof" : "Journal or Serie", + + "item.preview.dc.identifier.doi" : "DOI", + "item.preview.person.familyName": "Surname:", "item.preview.person.givenName": "Name:", @@ -3568,6 +3584,22 @@ "submission.import-external.source.arxiv": "arXiv", + "submission.import-external.source.ads": "NASA/ADS", + + "submission.import-external.source.cinii": "CiNii", + + "submission.import-external.source.crossref": "CrossRef", + + "submission.import-external.source.scielo": "SciELO", + + "submission.import-external.source.scopus": "Scopus", + + "submission.import-external.source.vufind": "VuFind", + + "submission.import-external.source.wos": "Web Of Science", + + "submission.import-external.source.epo": "European Patent Office (EPO)", + "submission.import-external.source.loading": "Loading ...", "submission.import-external.source.sherpaJournal": "SHERPA Journals", @@ -3582,10 +3614,14 @@ "submission.import-external.source.pubmed": "Pubmed", + "submission.import-external.source.pubmedeu": "Pubmed Europe", + "submission.import-external.source.lcname": "Library of Congress Names", "submission.import-external.preview.title": "Item Preview", + "submission.import-external.preview.title.Publication": "Publication Preview", + "submission.import-external.preview.subtitle": "The metadata below was imported from an external source. It will be pre-filled when you start the submission.", "submission.import-external.preview.button.import": "Start submission", @@ -3824,6 +3860,18 @@ "submission.sections.describe.relationship-lookup.selection-tab.title.arxiv": "Search Results", + "submission.sections.describe.relationship-lookup.selection-tab.title.crossref": "Search Results", + + "submission.sections.describe.relationship-lookup.selection-tab.title.epo": "Search Results", + + "submission.sections.describe.relationship-lookup.selection-tab.title.scopus": "Search Results", + + "submission.sections.describe.relationship-lookup.selection-tab.title.scielo": "Search Results", + + "submission.sections.describe.relationship-lookup.selection-tab.title.wos": "Search Results", + + "submission.sections.describe.relationship-lookup.selection-tab.title": "Search Results", + "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don\'t you can still use it for this submission.", "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Save a new name variant", From c1f64ff1ef9a6846b9926968ccfd0d8ec2d548f5 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Thu, 12 May 2022 18:50:25 +0200 Subject: [PATCH 163/343] [CST-5329] Add help text to validate only checkbox --- .../metadata-import-page.component.html | 15 +++++++++++---- src/assets/i18n/en.json5 | 2 ++ 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/app/admin/admin-import-metadata-page/metadata-import-page.component.html b/src/app/admin/admin-import-metadata-page/metadata-import-page.component.html index 2c710935d5..24901cc11d 100644 --- a/src/app/admin/admin-import-metadata-page/metadata-import-page.component.html +++ b/src/app/admin/admin-import-metadata-page/metadata-import-page.component.html @@ -1,10 +1,17 @@

    {{'admin.metadata-import.page.help' | translate}}

    -

    - - {{'admin.metadata-import.page.validateOnly' | translate}} -

    +
    +
    + + +
    + + {{'admin.metadata-import.page.validateOnly.hint' | translate}} + +
    Date: Fri, 13 May 2022 13:32:33 -0400 Subject: [PATCH 164/343] for rss sort id should be date.accessioned so defaulted to that when its the case --- src/app/shared/rss-feed/rss.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/shared/rss-feed/rss.component.ts b/src/app/shared/rss-feed/rss.component.ts index b694280e3c..3fdb859bdc 100644 --- a/src/app/shared/rss-feed/rss.component.ts +++ b/src/app/shared/rss-feed/rss.component.ts @@ -118,7 +118,7 @@ export class RSSComponent implements OnInit, OnDestroy { if (uuid) { route += `&scope=${uuid}`; } - if (sort && sort.direction && sort.field) { + if (sort && sort.direction && sort.field && sort.field !== 'id') { route += `&sort=${sort.field}&sort_direction=${sort.direction}`; } if (query) { From 913d128e165e5ef3f3784a2e25dd0bccab26503d Mon Sep 17 00:00:00 2001 From: Tim Donohue Date: Fri, 13 May 2022 16:57:28 -0500 Subject: [PATCH 165/343] Fix accessibility issue: link has no discernible text --- src/app/shared/rss-feed/rss.component.html | 2 +- src/assets/i18n/en.json5 | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/app/shared/rss-feed/rss.component.html b/src/app/shared/rss-feed/rss.component.html index e86e72d15a..91140c50c5 100644 --- a/src/app/shared/rss-feed/rss.component.html +++ b/src/app/shared/rss-feed/rss.component.html @@ -1,5 +1,5 @@
    - +
    diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 110b66c176..520d38cf69 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -1401,6 +1401,9 @@ "error.validation.groupExists": "This group already exists", + "feed.description": "Syndication feed", + + "file-section.error.header": "Error obtaining files for this item", From 4c5c99d05d3a5ba0b5abd2add953f14082ebea55 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Mon, 16 May 2022 16:44:35 +0200 Subject: [PATCH 166/343] [CST-5535] Add missing i18n label --- src/assets/i18n/en.json5 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 44d2d07305..c129187023 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -2503,13 +2503,15 @@ "menu.section.icon.find": "Find menu section", + "menu.section.icon.health": "Health check menu section", + "menu.section.icon.import": "Import menu section", "menu.section.icon.new": "New menu section", "menu.section.icon.pin": "Pin sidebar", - "menu.section.icon.processes": "Processes menu section", + "menu.section.icon.processes": "Processes Health", "menu.section.icon.registries": "Registries menu section", From 0de3c2ed48d6f5861ae008eba84757888e7860fe Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Mon, 16 May 2022 16:45:00 +0200 Subject: [PATCH 167/343] [CST-5535] Replace icons --- .../health-info-component.component.html | 6 +++--- .../health-component/health-component.component.html | 4 ++-- .../health-page/health-panel/health-panel.component.html | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/app/health-page/health-info/health-info-component/health-info-component.component.html b/src/app/health-page/health-info/health-info-component/health-info-component.component.html index 55c1b3372f..8ce7595980 100644 --- a/src/app/health-page/health-info/health-info-component/health-info-component.component.html +++ b/src/app/health-page/health-info/health-info-component/health-info-component.component.html @@ -1,13 +1,13 @@
    -
    +
    - - + +
    diff --git a/src/app/health-page/health-panel/health-component/health-component.component.html b/src/app/health-page/health-panel/health-component/health-component.component.html index 8171917767..4569d06dad 100644 --- a/src/app/health-page/health-panel/health-component/health-component.component.html +++ b/src/app/health-page/health-panel/health-component/health-component.component.html @@ -6,8 +6,8 @@ {{ entry.key | titlecase }}
    - - + +
    diff --git a/src/app/health-page/health-panel/health-panel.component.html b/src/app/health-page/health-panel/health-panel.component.html index d582fb77f3..eebcfe55ec 100644 --- a/src/app/health-page/health-panel/health-panel.component.html +++ b/src/app/health-page/health-panel/health-panel.component.html @@ -1,14 +1,14 @@

    {{'health-page.status' | translate}} :

    -
    +
    - - + +
    From 80ff8a517ce95c16ab21b376d2e4b664dbe4b5d4 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Mon, 16 May 2022 16:46:33 +0200 Subject: [PATCH 168/343] [CST-5535] Rename health-data.service --- src/app/health-page/health-page.component.spec.ts | 4 ++-- src/app/health-page/health-page.component.ts | 4 ++-- .../health-page/{health-data.service.ts => health.service.ts} | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) rename src/app/health-page/{health-data.service.ts => health.service.ts} (97%) diff --git a/src/app/health-page/health-page.component.spec.ts b/src/app/health-page/health-page.component.spec.ts index 205af8036a..f3847ab092 100644 --- a/src/app/health-page/health-page.component.spec.ts +++ b/src/app/health-page/health-page.component.spec.ts @@ -7,7 +7,7 @@ import { NgbNavModule } from '@ng-bootstrap/ng-bootstrap'; import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; import { HealthPageComponent } from './health-page.component'; -import { HealthDataService } from './health-data.service'; +import { HealthService } from './health.service'; import { HealthInfoResponseObj, HealthResponseObj } from '../shared/mocks/health-endpoint.mocks'; import { RawRestResponse } from '../core/dspace-rest/raw-rest-response.model'; import { TranslateLoaderMock } from '../shared/mocks/translate-loader.mock'; @@ -47,7 +47,7 @@ describe('HealthPageComponent', () => { ], declarations: [ HealthPageComponent ], providers: [ - { provide: HealthDataService, useValue: healthService } + { provide: HealthService, useValue: healthService } ] }) .compileComponents(); diff --git a/src/app/health-page/health-page.component.ts b/src/app/health-page/health-page.component.ts index e4f4be7a03..eb07b63add 100644 --- a/src/app/health-page/health-page.component.ts +++ b/src/app/health-page/health-page.component.ts @@ -3,7 +3,7 @@ import { Component, OnInit } from '@angular/core'; import { BehaviorSubject } from 'rxjs'; import { take } from 'rxjs/operators'; -import { HealthDataService } from './health-data.service'; +import { HealthService } from './health.service'; import { HealthInfoResponse, HealthResponse } from './models/health-component.model'; @Component({ @@ -23,7 +23,7 @@ export class HealthPageComponent implements OnInit { */ healthResponse: BehaviorSubject = new BehaviorSubject(null); - constructor(private healthDataService: HealthDataService) { + constructor(private healthDataService: HealthService) { } /** diff --git a/src/app/health-page/health-data.service.ts b/src/app/health-page/health.service.ts similarity index 97% rename from src/app/health-page/health-data.service.ts rename to src/app/health-page/health.service.ts index bd905006aa..7c238769a1 100644 --- a/src/app/health-page/health-data.service.ts +++ b/src/app/health-page/health.service.ts @@ -8,7 +8,7 @@ import { HALEndpointService } from '../core/shared/hal-endpoint.service'; @Injectable({ providedIn: 'root' }) -export class HealthDataService { +export class HealthService { constructor(protected halService: HALEndpointService, protected restService: DspaceRestService) { } From 4f7e37d348dfeccca1cc7e1f8b7efeb526b11207 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Mon, 16 May 2022 18:17:35 +0200 Subject: [PATCH 169/343] [CST-5535] Use accordion for health status components --- .../health-info-component.component.html | 38 ++++++++++++++--- .../health-info-component.component.spec.ts | 4 +- .../health-info/health-info.component.html | 30 ++++++++++++- .../health-info/health-info.component.spec.ts | 8 +++- .../health-info/health-info.component.ts | 12 +++++- .../health-component.component.html | 3 +- .../health-panel/health-panel.component.html | 42 ++++++++++--------- .../health-panel.component.spec.ts | 9 ++-- .../health-panel/health-panel.component.ts | 11 +++-- src/app/shared/mocks/health-endpoint.mocks.ts | 24 ++++++++++- 10 files changed, 139 insertions(+), 42 deletions(-) diff --git a/src/app/health-page/health-info/health-info-component/health-info-component.component.html b/src/app/health-page/health-info/health-info-component/health-info-component.component.html index 8ce7595980..b16e88564f 100644 --- a/src/app/health-page/health-info/health-info-component/health-info-component.component.html +++ b/src/app/health-page/health-info/health-info-component/health-info-component.component.html @@ -1,4 +1,34 @@ - +
    +
    +
    + +
    + + +
    +
    +
    +
    +
    + +
    +
    +
    +
    + +

    {{ entry.key | titlecase }} : {{entry.value}}

    +
    +
    + + + + diff --git a/src/app/health-page/health-info/health-info-component/health-info-component.component.spec.ts b/src/app/health-page/health-info/health-info-component/health-info-component.component.spec.ts index 2297007cd5..437d53a953 100644 --- a/src/app/health-page/health-info/health-info-component/health-info-component.component.spec.ts +++ b/src/app/health-page/health-info/health-info-component/health-info-component.component.spec.ts @@ -46,7 +46,9 @@ describe('HealthInfoComponentComponent', () => { }); it('should display property', () => { - const components = fixture.debugElement.queryAll(By.css('[data-test="component"]')); + const properties = fixture.debugElement.queryAll(By.css('[data-test="property"]')); + expect(properties.length).toBe(14); + const components = fixture.debugElement.queryAll(By.css('[data-test="info-component"]')); expect(components.length).toBe(4); }); diff --git a/src/app/health-page/health-info/health-info.component.html b/src/app/health-page/health-info/health-info.component.html index e4d29adf54..be69df23b4 100644 --- a/src/app/health-page/health-info/health-info.component.html +++ b/src/app/health-page/health-info/health-info.component.html @@ -1,7 +1,33 @@ -
    + + + +
    + +
    + +
    + + +
    +
    +
    +
    + + + +
    +
    + + + + diff --git a/src/app/health-page/health-info/health-info.component.spec.ts b/src/app/health-page/health-info/health-info.component.spec.ts index 3af1d71db3..a7f319b88b 100644 --- a/src/app/health-page/health-info/health-info.component.spec.ts +++ b/src/app/health-page/health-info/health-info.component.spec.ts @@ -4,6 +4,8 @@ import { HealthInfoComponent } from './health-info.component'; import { HealthInfoResponseObj } from '../../shared/mocks/health-endpoint.mocks'; import { ObjNgFor } from '../../shared/utils/object-ngfor.pipe'; import { By } from '@angular/platform-browser'; +import { NgbAccordionModule } from '@ng-bootstrap/ng-bootstrap'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; describe('HealthInfoComponent', () => { let component: HealthInfoComponent; @@ -11,10 +13,14 @@ describe('HealthInfoComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ + imports: [ + NgbAccordionModule, + ], declarations: [ HealthInfoComponent, ObjNgFor - ] + ], + schemas: [NO_ERRORS_SCHEMA] }) .compileComponents(); }); diff --git a/src/app/health-page/health-info/health-info.component.ts b/src/app/health-page/health-info/health-info.component.ts index a5fb0b282b..9fddaeb7e4 100644 --- a/src/app/health-page/health-info/health-info.component.ts +++ b/src/app/health-page/health-info/health-info.component.ts @@ -1,4 +1,4 @@ -import { Component, Input } from '@angular/core'; +import { Component, Input, OnInit } from '@angular/core'; import { HealthInfoResponse } from '../models/health-component.model'; @@ -7,8 +7,16 @@ import { HealthInfoResponse } from '../models/health-component.model'; templateUrl: './health-info.component.html', styleUrls: ['./health-info.component.scss'] }) -export class HealthInfoComponent { +export class HealthInfoComponent implements OnInit { @Input() healthInfoResponse: HealthInfoResponse; + /** + * The first active panel id + */ + activeId: string; + + ngOnInit(): void { + this.activeId = Object.keys(this.healthInfoResponse)[0]; + } } diff --git a/src/app/health-page/health-panel/health-component/health-component.component.html b/src/app/health-page/health-panel/health-component/health-component.component.html index 4569d06dad..7089fe25c6 100644 --- a/src/app/health-page/health-panel/health-component/health-component.component.html +++ b/src/app/health-page/health-panel/health-component/health-component.component.html @@ -22,6 +22,7 @@
    - {{ item.key | titlecase }} : {{item.value}} +

    {{ item.key | titlecase }} : {{item.value}}

    +
    diff --git a/src/app/health-page/health-panel/health-panel.component.html b/src/app/health-page/health-panel/health-panel.component.html index eebcfe55ec..d47a73d820 100644 --- a/src/app/health-page/health-panel/health-panel.component.html +++ b/src/app/health-page/health-panel/health-panel.component.html @@ -1,21 +1,25 @@

    {{'health-page.status' | translate}} :

    -
    -
    - -
    - - - -
    -
    -
    -
    -
    - + + + +
    + +
    + +
    + + +
    +
    -
    -
    -
    + + + + + + + + diff --git a/src/app/health-page/health-panel/health-panel.component.spec.ts b/src/app/health-page/health-panel/health-panel.component.spec.ts index da392f7ba8..1d9c856ddb 100644 --- a/src/app/health-page/health-panel/health-panel.component.spec.ts +++ b/src/app/health-page/health-panel/health-panel.component.spec.ts @@ -5,14 +5,14 @@ import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { NO_ERRORS_SCHEMA } from '@angular/core'; import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; -import { NgbCollapseModule, NgbNavModule } from '@ng-bootstrap/ng-bootstrap'; +import { NgbAccordionModule, NgbNavModule } from '@ng-bootstrap/ng-bootstrap'; import { TranslateLoaderMock } from '../../shared/mocks/translate-loader.mock'; import { HealthPanelComponent } from './health-panel.component'; import { HealthResponseObj } from '../../shared/mocks/health-endpoint.mocks'; import { ObjNgFor } from '../../shared/utils/object-ngfor.pipe'; -describe('HealthComponent', () => { +describe('HealthPanelComponent', () => { let component: HealthPanelComponent; let fixture: ComponentFixture; @@ -20,7 +20,7 @@ describe('HealthComponent', () => { await TestBed.configureTestingModule({ imports: [ NgbNavModule, - NgbCollapseModule, + NgbAccordionModule, CommonModule, BrowserAnimationsModule, TranslateModule.forRoot({ @@ -42,7 +42,6 @@ describe('HealthComponent', () => { fixture = TestBed.createComponent(HealthPanelComponent); component = fixture.componentInstance; component.healthResponse = HealthResponseObj; - component.isCollapsed = false; fixture.detectChanges(); }); @@ -50,7 +49,7 @@ describe('HealthComponent', () => { expect(component).toBeTruthy(); }); - it('should render a card for each component', () => { + it('should render a panel for each component', () => { const components = fixture.debugElement.queryAll(By.css('[data-test="component"]')); expect(components.length).toBe(5); }); diff --git a/src/app/health-page/health-panel/health-panel.component.ts b/src/app/health-page/health-panel/health-panel.component.ts index 549544c370..8bb670e67f 100644 --- a/src/app/health-page/health-panel/health-panel.component.ts +++ b/src/app/health-page/health-panel/health-panel.component.ts @@ -1,4 +1,4 @@ -import { Component, Input } from '@angular/core'; +import { Component, Input, OnInit } from '@angular/core'; import { HealthResponse } from '../models/health-component.model'; @Component({ @@ -6,7 +6,7 @@ import { HealthResponse } from '../models/health-component.model'; templateUrl: './health-panel.component.html', styleUrls: ['./health-panel.component.scss'] }) -export class HealthPanelComponent { +export class HealthPanelComponent implements OnInit { /** * Health endpoint response @@ -14,8 +14,11 @@ export class HealthPanelComponent { @Input() healthResponse: HealthResponse; /** - * A boolean representing if div should start collapsed + * The first active panel id */ - public isCollapsed = true; + activeId: string; + ngOnInit(): void { + this.activeId = Object.keys(this.healthResponse.components)[0]; + } } diff --git a/src/app/shared/mocks/health-endpoint.mocks.ts b/src/app/shared/mocks/health-endpoint.mocks.ts index 9bd3956139..a9246d91a1 100644 --- a/src/app/shared/mocks/health-endpoint.mocks.ts +++ b/src/app/shared/mocks/health-endpoint.mocks.ts @@ -134,7 +134,27 @@ export const HealthInfoComponentOne: HealthInfoComponent = { 'name': 'DSpace at My University', 'dir': '/home/giuseppe/development/java/install/dspace7-review', 'url': 'http://localhost:8080/server', - 'db': 'jdbc:postgresql://localhost:5432/dspace7' + 'db': 'jdbc:postgresql://localhost:5432/dspace7', + 'solr': { + 'server': 'http://localhost:8983/solr', + 'prefix': '' + }, + 'mail': { + 'server': 'smtp.example.com', + 'from-address': 'dspace-noreply@myu.edu', + 'feedback-recipient': 'dspace-help@myu.edu', + 'mail-admin': 'dspace-help@myu.edu', + 'mail-helpdesk': 'dspace-help@myu.edu', + 'alert-recipient': 'dspace-help@myu.edu' + }, + 'cors': { + 'allowed-origins': 'http://localhost:4000' + }, + 'ui': { + 'url': 'http://localhost:4000' + } }; -export const HealthInfoComponentTwo = '7.3-SNAPSHOT'; +export const HealthInfoComponentTwo = { + 'version': '7.3-SNAPSHOT' +}; From c508e0035e46c977bb7b0fad2163eff5109c3d81 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Mon, 16 May 2022 18:49:11 +0200 Subject: [PATCH 170/343] [CST-5535] Add tooltip for status icons --- .../health-status/health-status.component.html | 12 +++++++++--- src/assets/i18n/en.json5 | 8 ++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/app/health-page/health-panel/health-status/health-status.component.html b/src/app/health-page/health-panel/health-status/health-status.component.html index fdd726cddf..38a6f72601 100644 --- a/src/app/health-page/health-panel/health-status/health-status.component.html +++ b/src/app/health-page/health-panel/health-status/health-status.component.html @@ -1,6 +1,12 @@ - - - + + + diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index c129187023..78661ced76 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -1567,6 +1567,14 @@ + "health-page.status.ok.info": "Operational", + + "health-page.status.error.info": "Problems detected", + + "health-page.status.warning.info": "Possible issues detected", + + + "home.description": "", "home.breadcrumbs": "Home", From 73573793a0eacc52789c4df6b7a653040393f407 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Mon, 16 May 2022 18:50:07 +0200 Subject: [PATCH 171/343] [CST-5535] Add i18n keys for section's headers --- .../health-info/health-info.component.html | 2 +- .../health-panel/health-panel.component.html | 2 +- src/assets/i18n/en.json5 | 15 +++++++++++++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/app/health-page/health-info/health-info.component.html b/src/app/health-page/health-info/health-info.component.html index be69df23b4..12764ead45 100644 --- a/src/app/health-page/health-info/health-info.component.html +++ b/src/app/health-page/health-info/health-info.component.html @@ -5,7 +5,7 @@
    diff --git a/src/app/health-page/health-panel/health-panel.component.html b/src/app/health-page/health-panel/health-panel.component.html index d47a73d820..d095ce2f6d 100644 --- a/src/app/health-page/health-panel/health-panel.component.html +++ b/src/app/health-page/health-panel/health-panel.component.html @@ -5,7 +5,7 @@
    diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 78661ced76..c22ec1c3ee 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -1566,6 +1566,21 @@ "grant-request-copy.success": "Successfully granted item request", + "health-page.section.db.title": "Database", + + "health-page.section.geoIp.title": "GeoIp", + + "health-page.section.solrAuthorityCore.title": "Sor: authority core", + + "health-page.section.solrOaiCore.title": "Sor: oai core", + + "health-page.section.solrSearchCore.title": "Sor: search core", + + "health-page.section.solrStatisticsCore.title": "Sor: statistics core", + + "health-page.section-info.app.title": "Application Backend", + + "health-page.section-info.java.title": "Java", "health-page.status.ok.info": "Operational", From 74b68a5e154f1285ad3e7ec9d13fcb30590378d4 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Mon, 16 May 2022 19:19:00 +0200 Subject: [PATCH 172/343] [CST-5535] Add fallback message on rest request error --- .../health-page/health-page.component.html | 45 ++++++++++--------- src/app/health-page/health-page.component.ts | 11 +++-- src/assets/i18n/en.json5 | 2 + 3 files changed, 34 insertions(+), 24 deletions(-) diff --git a/src/app/health-page/health-page.component.html b/src/app/health-page/health-page.component.html index 6ec9abddcb..0647620c73 100644 --- a/src/app/health-page/health-page.component.html +++ b/src/app/health-page/health-page.component.html @@ -1,21 +1,26 @@ -
    - -
    +
    + +
    + + diff --git a/src/app/health-page/health-page.component.ts b/src/app/health-page/health-page.component.ts index eb07b63add..a92e72744b 100644 --- a/src/app/health-page/health-page.component.ts +++ b/src/app/health-page/health-page.component.ts @@ -30,12 +30,15 @@ export class HealthPageComponent implements OnInit { * Retrieve responses from rest */ ngOnInit(): void { - this.healthDataService.getHealth().pipe(take(1)).subscribe((data: any) => { - this.healthResponse.next(data.payload); + this.healthDataService.getHealth().pipe(take(1)).subscribe({ + next: (data: any) => { this.healthResponse.next(data.payload); }, + error: () => { this.healthResponse.next(null); } }); - this.healthDataService.getInfo().pipe(take(1)).subscribe((data) => { - this.healthInfoResponse.next(data.payload); + this.healthDataService.getInfo().pipe(take(1)).subscribe({ + next: (data: any) => { this.healthInfoResponse.next(data.payload); }, + error: () => { this.healthInfoResponse.next(null); } }); + } } diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 4fcdbff335..216b29fcd0 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -1583,6 +1583,8 @@ "grant-request-copy.success": "Successfully granted item request", + "health-page.error.msg": "The health check service is temporarily unavailable", + "health-page.section.db.title": "Database", "health-page.section.geoIp.title": "GeoIp", From 1f9b8ba92a4fcf09e2f0c6cb8661f7b8b6fdd637 Mon Sep 17 00:00:00 2001 From: Art Lowel Date: Tue, 17 May 2022 11:16:46 +0200 Subject: [PATCH 173/343] Fix issue where you'd get stuck in an infinite redirect loop when going to the page of an item with an entity type containing certain special characters --- src/app/item-page/item-page.resolver.spec.ts | 87 ++++++++++++++++++++ src/app/item-page/item-page.resolver.ts | 10 ++- 2 files changed, 95 insertions(+), 2 deletions(-) create mode 100644 src/app/item-page/item-page.resolver.spec.ts diff --git a/src/app/item-page/item-page.resolver.spec.ts b/src/app/item-page/item-page.resolver.spec.ts new file mode 100644 index 0000000000..533f97d0c0 --- /dev/null +++ b/src/app/item-page/item-page.resolver.spec.ts @@ -0,0 +1,87 @@ +import { ItemPageResolver } from './item-page.resolver'; +import { createSuccessfulRemoteDataObject$ } from '../shared/remote-data.utils'; +import { DSpaceObject } from '../core/shared/dspace-object.model'; +import { MetadataValueFilter } from '../core/shared/metadata.models'; +import { first } from 'rxjs/operators'; +import { Router } from '@angular/router'; +import { TestBed } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; + +describe('ItemPageResolver', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [RouterTestingModule.withRoutes([{ + path: 'entities/:entity-type/:id', + component: {} as any + }])] + }); + }); + + describe('resolve', () => { + let resolver: ItemPageResolver; + let itemService: any; + let store: any; + let router: any; + + const uuid = '1234-65487-12354-1235'; + let item: DSpaceObject; + + function runTestsWithEntityType(entityType: string) { + beforeEach(() => { + router = TestBed.inject(Router); + item = Object.assign(new DSpaceObject(), { + uuid: uuid, + firstMetadataValue(_keyOrKeys: string | string[], _valueFilter?: MetadataValueFilter): string { + return entityType; + } + }); + itemService = { + findById: (_id: string) => createSuccessfulRemoteDataObject$(item) + }; + store = jasmine.createSpyObj('store', { + dispatch: {}, + }); + resolver = new ItemPageResolver(itemService, store, router); + }); + + it('should redirect to the correct route for the entity type', (done) => { + spyOn(item, 'firstMetadataValue').and.returnValue(entityType); + spyOn(router, 'navigateByUrl').and.callThrough(); + + resolver.resolve({ params: { id: uuid } } as any, { url: router.parseUrl(`/items/${uuid}`).toString() } as any) + .pipe(first()) + .subscribe( + () => { + expect(router.navigateByUrl).toHaveBeenCalledWith(router.parseUrl(`/entities/${entityType}/${uuid}`).toString()); + done(); + } + ); + }); + + it('should not redirect if we’re already on the correct route', (done) => { + spyOn(item, 'firstMetadataValue').and.returnValue(entityType); + spyOn(router, 'navigateByUrl').and.callThrough(); + + resolver.resolve({ params: { id: uuid } } as any, { url: router.parseUrl(`/entities/${entityType}/${uuid}`).toString() } as any) + .pipe(first()) + .subscribe( + () => { + expect(router.navigateByUrl).not.toHaveBeenCalled(); + done(); + } + ); + }); + } + + describe('when normal entity type is provided', () => { + runTestsWithEntityType('publication'); + }); + + describe('when entity type contains a special character', () => { + runTestsWithEntityType('alligator,loki'); + runTestsWithEntityType('🐊'); + runTestsWithEntityType(' '); + }); + + }); +}); diff --git a/src/app/item-page/item-page.resolver.ts b/src/app/item-page/item-page.resolver.ts index 7edffc5357..e9b287406e 100644 --- a/src/app/item-page/item-page.resolver.ts +++ b/src/app/item-page/item-page.resolver.ts @@ -1,5 +1,5 @@ import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, Resolve, Router, RouterStateSnapshot } from '@angular/router'; +import { ActivatedRouteSnapshot, Router, RouterStateSnapshot } from '@angular/router'; import { Observable } from 'rxjs'; import { RemoteData } from '../core/data/remote-data'; import { ItemDataService } from '../core/data/item-data.service'; @@ -35,8 +35,14 @@ export class ItemPageResolver extends ItemResolver { return super.resolve(route, state).pipe( map((rd: RemoteData) => { if (rd.hasSucceeded && hasValue(rd.payload)) { - const itemRoute = getItemPageRoute(rd.payload); const thisRoute = state.url; + + // Angular uses a custom function for encodeURIComponent, (e.g. it doesn't encode commas + // or semicolons) and thisRoute has been encoded with that function. If we want to compare + // it with itemRoute, we have to run itemRoute through Angular's version as well to ensure + // the same characters are encoded the same way. + const itemRoute = this.router.parseUrl(getItemPageRoute(rd.payload)).toString(); + if (!thisRoute.startsWith(itemRoute)) { const itemId = rd.payload.uuid; const subRoute = thisRoute.substring(thisRoute.indexOf(itemId) + itemId.length, thisRoute.length); From 881af6449542ee174206d5b10ec27b87f0254219 Mon Sep 17 00:00:00 2001 From: Davide Negretti Date: Tue, 17 May 2022 16:36:40 +0200 Subject: [PATCH 174/343] [CST-5674] POST replaced with PUT --- .../resource-policy.service.ts | 4 +-- .../form/resource-policy-form.component.html | 34 +++++++++---------- 2 files changed, 18 insertions(+), 20 deletions(-) diff --git a/src/app/core/resource-policy/resource-policy.service.ts b/src/app/core/resource-policy/resource-policy.service.ts index ca3951109a..8411647bea 100644 --- a/src/app/core/resource-policy/resource-policy.service.ts +++ b/src/app/core/resource-policy/resource-policy.service.ts @@ -29,7 +29,7 @@ import { getFirstCompletedRemoteData } from '../shared/operators'; import { CoreState } from '../core-state.model'; import { FindListOptions } from '../data/find-list-options.model'; import { HttpOptions } from '../dspace-rest/dspace-rest.service'; -import { PostRequest } from '../data/request.models'; +import { PutRequest } from '../data/request.models'; import { GenericConstructor } from '../shared/generic-constructor'; import { ResponseParsingService } from '../data/parsing.service'; import { StatusCodeOnlyResponseParsingService } from '../data/status-code-only-response-parsing.service'; @@ -260,7 +260,7 @@ export class ResourcePolicyService { return targetEndpoint$.pipe(switchMap((targetEndpoint) => { const resourceEndpoint = resourcePolicyHref + '/' + type; - const request = new PostRequest(requestId, resourceEndpoint, targetEndpoint, options); + const request = new PutRequest(requestId, resourceEndpoint, targetEndpoint, options); Object.assign(request, { getResponseParser(): GenericConstructor { return StatusCodeOnlyResponseParsingService; diff --git a/src/app/shared/resource-policies/form/resource-policy-form.component.html b/src/app/shared/resource-policies/form/resource-policy-form.component.html index f7aad55ce8..66c1fc400e 100644 --- a/src/app/shared/resource-policies/form/resource-policy-form.component.html +++ b/src/app/shared/resource-policies/form/resource-policy-form.component.html @@ -8,24 +8,22 @@
    - - -
    -
    + +

    From 618ff0ce19607900bfd165aec9ae7ef01a9b19a2 Mon Sep 17 00:00:00 2001 From: Mykhaylo Date: Tue, 17 May 2022 17:45:27 +0200 Subject: [PATCH 175/343] [CST-5303] added missing labels --- src/assets/i18n/en.json5 | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index bb2bcf8ebc..5bae41d0a1 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -3644,6 +3644,26 @@ "submission.sections.describe.relationship-lookup.external-source.import-button-title.isProjectOfPublication": "Project", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.none = "Import remote item", + + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Event": "Import remote event", + + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Product": "Import remote product", + + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Equipment": "Import remote equipment", + + "submission.sections.describe.relationship-lookup.external-source.import-button-title.OrgUnit = "Import remote organizational unit", + + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Funding": "Import remote fund", + + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Person = "Import remote person", + + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Patent": "Import remote patent", + + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Project = "Import remote project", + + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Publication = "Import remote publication", + "submission.sections.describe.relationship-lookup.external-source.import-modal.isProjectOfPublication.added.new-entity": "New Entity Added!", "submission.sections.describe.relationship-lookup.external-source.import-modal.isProjectOfPublication.title": "Project", From a732f1534de03fbdc89aad33af769dc50f40fb72 Mon Sep 17 00:00:00 2001 From: Mykhaylo Date: Wed, 18 May 2022 09:33:08 +0200 Subject: [PATCH 176/343] [CST-5303] fix wrong format --- src/assets/i18n/en.json5 | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 5bae41d0a1..dffbbd4b7e 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -3644,7 +3644,7 @@ "submission.sections.describe.relationship-lookup.external-source.import-button-title.isProjectOfPublication": "Project", - "submission.sections.describe.relationship-lookup.external-source.import-button-title.none = "Import remote item", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.none": "Import remote item", "submission.sections.describe.relationship-lookup.external-source.import-button-title.Event": "Import remote event", @@ -3652,17 +3652,17 @@ "submission.sections.describe.relationship-lookup.external-source.import-button-title.Equipment": "Import remote equipment", - "submission.sections.describe.relationship-lookup.external-source.import-button-title.OrgUnit = "Import remote organizational unit", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.OrgUnit": "Import remote organizational unit", "submission.sections.describe.relationship-lookup.external-source.import-button-title.Funding": "Import remote fund", - "submission.sections.describe.relationship-lookup.external-source.import-button-title.Person = "Import remote person", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Person": "Import remote person", "submission.sections.describe.relationship-lookup.external-source.import-button-title.Patent": "Import remote patent", - "submission.sections.describe.relationship-lookup.external-source.import-button-title.Project = "Import remote project", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Project": "Import remote project", - "submission.sections.describe.relationship-lookup.external-source.import-button-title.Publication = "Import remote publication", + "submission.sections.describe.relationship-lookup.external-source.import-button-title.Publication": "Import remote publication", "submission.sections.describe.relationship-lookup.external-source.import-modal.isProjectOfPublication.added.new-entity": "New Entity Added!", From d4dc176870d46506ad72670ba391f9f041e1c495 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Wed, 18 May 2022 13:04:04 +0200 Subject: [PATCH 177/343] [CST-5535] Add Possibility to have translation also for properties --- .../health-info-component.component.html | 4 ++-- .../health-info-component.component.scss | 3 +++ .../health-info-component.component.spec.ts | 10 +++++++++- .../health-info-component.component.ts | 12 ++++++++++-- .../health-info/health-info.component.html | 4 ++-- .../health-info/health-info.component.scss | 3 +++ .../health-info/health-info.component.spec.ts | 8 ++++++++ .../health-info/health-info.component.ts | 15 +++++++++++++++ .../health-component.component.html | 4 ++-- .../health-component.component.scss | 3 +++ .../health-component.component.spec.ts | 10 +++++++++- .../health-component.component.ts | 17 ++++++++++++++++- .../health-panel/health-panel.component.html | 4 ++-- .../health-panel/health-panel.component.scss | 3 +++ .../health-panel/health-panel.component.ts | 16 ++++++++++++++++ .../health-status.component.spec.ts | 12 ++++++++++++ src/assets/i18n/en.json5 | 2 ++ 17 files changed, 117 insertions(+), 13 deletions(-) diff --git a/src/app/health-page/health-info/health-info-component/health-info-component.component.html b/src/app/health-page/health-info/health-info-component/health-info-component.component.html index b16e88564f..b607d95f45 100644 --- a/src/app/health-page/health-info/health-info-component/health-info-component.component.html +++ b/src/app/health-page/health-info/health-info-component/health-info-component.component.html @@ -1,6 +1,6 @@
    -
    +
    -

    {{ entry.key | titlecase }} : {{entry.value}}

    +

    {{ getPropertyLabel(entry.key) | titlecase }} : {{entry.value}}

    diff --git a/src/app/health-page/health-info/health-info-component/health-info-component.component.scss b/src/app/health-page/health-info/health-info-component/health-info-component.component.scss index e69de29bb2..a6f0e73413 100644 --- a/src/app/health-page/health-info/health-info-component/health-info-component.component.scss +++ b/src/app/health-page/health-info/health-info-component/health-info-component.component.scss @@ -0,0 +1,3 @@ +.collapse-toggle { + cursor: pointer; +} diff --git a/src/app/health-page/health-info/health-info-component/health-info-component.component.spec.ts b/src/app/health-page/health-info/health-info-component/health-info-component.component.spec.ts index 437d53a953..b4532415b8 100644 --- a/src/app/health-page/health-info/health-info-component/health-info-component.component.spec.ts +++ b/src/app/health-page/health-info/health-info-component/health-info-component.component.spec.ts @@ -8,6 +8,8 @@ import { NgbCollapseModule } from '@ng-bootstrap/ng-bootstrap'; import { HealthInfoComponentComponent } from './health-info-component.component'; import { HealthInfoComponentOne, HealthInfoComponentTwo } from '../../../shared/mocks/health-endpoint.mocks'; import { ObjNgFor } from '../../../shared/utils/object-ngfor.pipe'; +import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; +import { TranslateLoaderMock } from '../../../shared/mocks/translate-loader.mock'; describe('HealthInfoComponentComponent', () => { let component: HealthInfoComponentComponent; @@ -18,7 +20,13 @@ describe('HealthInfoComponentComponent', () => { imports: [ CommonModule, NgbCollapseModule, - NoopAnimationsModule + NoopAnimationsModule, + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useClass: TranslateLoaderMock + } + }) ], declarations: [ HealthInfoComponentComponent, diff --git a/src/app/health-page/health-info/health-info-component/health-info-component.component.ts b/src/app/health-page/health-info/health-info-component/health-info-component.component.ts index b6c31214c8..159462cd6d 100644 --- a/src/app/health-page/health-info/health-info-component/health-info-component.component.ts +++ b/src/app/health-page/health-info/health-info-component/health-info-component.component.ts @@ -1,13 +1,14 @@ import { Component, Input } from '@angular/core'; import { HealthInfoComponent } from '../../models/health-component.model'; +import { HealthComponentComponent } from '../../health-panel/health-component/health-component.component'; @Component({ selector: 'ds-health-info-component', templateUrl: './health-info-component.component.html', styleUrls: ['./health-info-component.component.scss'] }) -export class HealthInfoComponentComponent { +export class HealthInfoComponentComponent extends HealthComponentComponent { /** * The HealthInfoComponent object to display @@ -27,9 +28,16 @@ export class HealthInfoComponentComponent { /** * A boolean representing if div should start collapsed */ - public isCollapsed = true; + public isCollapsed = false; + /** + * Check if the HealthInfoComponent is has only string property or contains object + * + * @param entry The HealthInfoComponent to check + * @return boolean + */ isPlainProperty(entry: HealthInfoComponent | string): boolean { return typeof entry === 'string'; } + } diff --git a/src/app/health-page/health-info/health-info.component.html b/src/app/health-page/health-info/health-info.component.html index 12764ead45..47e4cfb4d2 100644 --- a/src/app/health-page/health-info/health-info.component.html +++ b/src/app/health-page/health-info/health-info.component.html @@ -2,10 +2,10 @@ -
    +
    diff --git a/src/app/health-page/health-info/health-info.component.scss b/src/app/health-page/health-info/health-info.component.scss index e69de29bb2..a6f0e73413 100644 --- a/src/app/health-page/health-info/health-info.component.scss +++ b/src/app/health-page/health-info/health-info.component.scss @@ -0,0 +1,3 @@ +.collapse-toggle { + cursor: pointer; +} diff --git a/src/app/health-page/health-info/health-info.component.spec.ts b/src/app/health-page/health-info/health-info.component.spec.ts index a7f319b88b..5a9b8bf0aa 100644 --- a/src/app/health-page/health-info/health-info.component.spec.ts +++ b/src/app/health-page/health-info/health-info.component.spec.ts @@ -6,6 +6,8 @@ import { ObjNgFor } from '../../shared/utils/object-ngfor.pipe'; import { By } from '@angular/platform-browser'; import { NgbAccordionModule } from '@ng-bootstrap/ng-bootstrap'; import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; +import { TranslateLoaderMock } from '../../shared/mocks/translate-loader.mock'; describe('HealthInfoComponent', () => { let component: HealthInfoComponent; @@ -15,6 +17,12 @@ describe('HealthInfoComponent', () => { await TestBed.configureTestingModule({ imports: [ NgbAccordionModule, + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useClass: TranslateLoaderMock + } + }) ], declarations: [ HealthInfoComponent, diff --git a/src/app/health-page/health-info/health-info.component.ts b/src/app/health-page/health-info/health-info.component.ts index 9fddaeb7e4..d8c629636b 100644 --- a/src/app/health-page/health-info/health-info.component.ts +++ b/src/app/health-page/health-info/health-info.component.ts @@ -1,6 +1,7 @@ import { Component, Input, OnInit } from '@angular/core'; import { HealthInfoResponse } from '../models/health-component.model'; +import { TranslateService } from '@ngx-translate/core'; @Component({ selector: 'ds-health-info', @@ -16,7 +17,21 @@ export class HealthInfoComponent implements OnInit { */ activeId: string; + constructor(private translate: TranslateService) { + } + ngOnInit(): void { this.activeId = Object.keys(this.healthInfoResponse)[0]; } + /** + * Return translated label if exist for the given property + * + * @param property + */ + public getPanelLabel(panelKey: string): string { + const translationKey = `health-page.section-info.${panelKey}.title`; + const translation = this.translate.instant(translationKey); + + return (translation === translationKey) ? panelKey : translation; + } } diff --git a/src/app/health-page/health-panel/health-component/health-component.component.html b/src/app/health-page/health-panel/health-component/health-component.component.html index 7089fe25c6..c254f128d9 100644 --- a/src/app/health-page/health-panel/health-component/health-component.component.html +++ b/src/app/health-page/health-panel/health-component/health-component.component.html @@ -1,6 +1,6 @@
    -
    +
    diff --git a/src/app/health-page/health-panel/health-panel.component.scss b/src/app/health-page/health-panel/health-panel.component.scss index e69de29bb2..a6f0e73413 100644 --- a/src/app/health-page/health-panel/health-panel.component.scss +++ b/src/app/health-page/health-panel/health-panel.component.scss @@ -0,0 +1,3 @@ +.collapse-toggle { + cursor: pointer; +} diff --git a/src/app/health-page/health-panel/health-panel.component.ts b/src/app/health-page/health-panel/health-panel.component.ts index 8bb670e67f..3137334d6f 100644 --- a/src/app/health-page/health-panel/health-panel.component.ts +++ b/src/app/health-page/health-panel/health-panel.component.ts @@ -1,5 +1,6 @@ import { Component, Input, OnInit } from '@angular/core'; import { HealthResponse } from '../models/health-component.model'; +import { TranslateService } from '@ngx-translate/core'; @Component({ selector: 'ds-health-panel', @@ -18,7 +19,22 @@ export class HealthPanelComponent implements OnInit { */ activeId: string; + constructor(private translate: TranslateService) { + } + ngOnInit(): void { this.activeId = Object.keys(this.healthResponse.components)[0]; } + + /** + * Return translated label if exist for the given property + * + * @param property + */ + public getPanelLabel(panelKey: string): string { + const translationKey = `health-page.section.${panelKey}.title`; + const translation = this.translate.instant(translationKey); + + return (translation === translationKey) ? panelKey : translation; + } } diff --git a/src/app/health-page/health-panel/health-status/health-status.component.spec.ts b/src/app/health-page/health-panel/health-status/health-status.component.spec.ts index 13df9c23e3..f0f61ebdbb 100644 --- a/src/app/health-page/health-panel/health-status/health-status.component.spec.ts +++ b/src/app/health-page/health-panel/health-status/health-status.component.spec.ts @@ -3,6 +3,9 @@ import { By } from '@angular/platform-browser'; import { HealthStatusComponent } from './health-status.component'; import { HealthStatus } from '../../models/health-component.model'; +import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; +import { TranslateLoaderMock } from '../../../shared/mocks/translate-loader.mock'; +import { NgbTooltipModule } from '@ng-bootstrap/ng-bootstrap'; describe('HealthStatusComponent', () => { let component: HealthStatusComponent; @@ -10,6 +13,15 @@ describe('HealthStatusComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ + imports: [ + NgbTooltipModule, + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useClass: TranslateLoaderMock + } + }) + ], declarations: [ HealthStatusComponent ] }) .compileComponents(); diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 216b29fcd0..18a406b77b 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -1585,6 +1585,8 @@ "health-page.error.msg": "The health check service is temporarily unavailable", + "health-page.property.status": "Status code", + "health-page.section.db.title": "Database", "health-page.section.geoIp.title": "GeoIp", From ef332af17ea62afce19ef83763ac30b356e63289 Mon Sep 17 00:00:00 2001 From: Giuseppe Digilio Date: Wed, 18 May 2022 13:31:09 +0200 Subject: [PATCH 178/343] [CST-5535] Fix issue with error notice message on health page loading --- .../health-page/health-page.component.html | 2 +- src/app/health-page/health-page.component.ts | 30 ++++++++++++++++--- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/app/health-page/health-page.component.html b/src/app/health-page/health-page.component.html index 0647620c73..605927dc55 100644 --- a/src/app/health-page/health-page.component.html +++ b/src/app/health-page/health-page.component.html @@ -1,4 +1,4 @@ -
    +