@bimeister/pupakit.forms
Version:
PupaKit Forms
125 lines • 25.1 kB
JavaScript
import { Injectable } from '@angular/core';
import { filterFalsy, filterNotNil, isNil, shareReplayWithRefCount } from '@bimeister/utilities';
import { BehaviorSubject, combineLatest, NEVER } from 'rxjs';
import { filter, map, switchMap, take } from 'rxjs/operators';
import { dateClearTime } from '../../../declarations/functions/date-clear-time.function';
import { getRangeEndDate } from '../../../declarations/functions/get-range-end-date.function';
import { getRangeStartDate } from '../../../declarations/functions/get-range-start-date.function';
import '../../../declarations/types/date-picker-preview-mode.type';
import '../../../declarations/types/date-picker-selection-mode.type';
import * as i0 from "@angular/core";
const WEEK_DAY_NAMES = ['ПН', 'ВТ', 'СР', 'ЧТ', 'ПТ', 'СБ', 'ВС'];
const INVALID_RANGE_SIZE = 2;
const VALID_RANGE_SIZE = 2;
const DEFAULT_CURRENT_DATE_WITH_CLEARED_TIME = dateClearTime(new Date());
export class DatePickerStateService {
constructor() {
this.weekDayNames = WEEK_DAY_NAMES;
this.currentDate = DEFAULT_CURRENT_DATE_WITH_CLEARED_TIME;
this.hours$ = new BehaviorSubject(null);
this.minutes$ = new BehaviorSubject(null);
this.seconds$ = new BehaviorSubject(null);
this.isBackDating$ = new BehaviorSubject(true);
this.availableEndDate$ = new BehaviorSubject(Infinity);
this.selectionMode$ = new BehaviorSubject('range');
this.previewMode$ = new BehaviorSubject('simple');
this.withSeconds$ = new BehaviorSubject(false);
this.selectedDate$ = new BehaviorSubject(null);
this.selectedRange$ = new BehaviorSubject([]);
this.isSelectionModeDate$ = this.selectionMode$.pipe(map((selectionMode) => selectionMode === 'date'), shareReplayWithRefCount());
this.hoveredDate$ = new BehaviorSubject(null);
this.hoveredRange$ = combineLatest([this.selectedRange$, this.hoveredDate$]).pipe(filter((aggregatedDates) => {
const selectedRange = aggregatedDates[0];
return !Object.is(selectedRange.length, INVALID_RANGE_SIZE);
}), map((aggregatedDates) => {
const selectedRange = aggregatedDates[0];
if (Object.is(selectedRange.length, 0)) {
return [];
}
const selectedDateFromRange = selectedRange[selectedRange.length - 1];
const hoveredDate = aggregatedDates[1];
return [selectedDateFromRange, hoveredDate];
}), shareReplayWithRefCount());
}
processDateSelection(date) {
this.isSelectionModeDate$
.pipe(filterNotNil(), take(1), switchMap((isSelectionModeDate) => {
if (isSelectionModeDate) {
this.selectedDate$.next(date);
return NEVER;
}
return this.selectedRange$;
}), take(1), map((alreadySelectedDates) => Object.is(alreadySelectedDates.length, 1) ? [alreadySelectedDates[alreadySelectedDates.length - 1]] : []))
.subscribe((alreadySelectedDates) => this.selectedRange$.next([...alreadySelectedDates, date]));
}
processDateHover(date) {
this.isSelectionModeDate$.pipe(filterNotNil(), take(1), filterFalsy()).subscribe(() => {
this.hoveredDate$.next(date);
});
}
isSameDate(dateA, dateB) {
return !isNil(dateA) && !isNil(dateB) && Object.is(dateA.valueOf(), dateB.valueOf());
}
dateIsInDateRange(date, dateRange) {
if (isNil(date) || !Array.isArray(dateRange) || Object.is(dateRange.length, 0)) {
return false;
}
const uniqueRangeItemsMs = new Set(dateRange.filter((rangeItem) => !isNil(rangeItem)).map((rangeItem) => rangeItem.valueOf()));
const rangeIsInvalid = !Object.is(uniqueRangeItemsMs.size, VALID_RANGE_SIZE);
if (rangeIsInvalid) {
return false;
}
const rangeStartDate = getRangeStartDate(dateRange);
const rangeEndDate = getRangeEndDate(dateRange);
const rangeStartDateMs = rangeStartDate.valueOf();
const rangeEndDateMs = rangeEndDate.valueOf();
const dateToTestMs = date.valueOf();
return rangeStartDateMs < dateToTestMs && rangeEndDateMs > dateToTestMs;
}
dateIsInDateArray(date, dateArray) {
if (isNil(date) || !Array.isArray(dateArray) || Object.is(dateArray.length, 0)) {
return false;
}
return dateArray.some((dateFromRange) => this.isSameDate(dateFromRange, date));
}
dateIsRangeStartDate(date, dateRange) {
if (isNil(date) || !Array.isArray(dateRange) || Object.is(dateRange.length, 0)) {
return false;
}
const uniqueRangeItemsMs = new Set(dateRange.filter((rangeItem) => !isNil(rangeItem)).map((rangeItem) => rangeItem.valueOf()));
const rangeIsInvalid = !Object.is(uniqueRangeItemsMs.size, VALID_RANGE_SIZE);
if (rangeIsInvalid) {
return false;
}
const rangeStartDate = getRangeStartDate(dateRange);
return this.isSameDate(rangeStartDate, date);
}
dateIsRangeEndDate(date, dateRange) {
if (isNil(date) || !Array.isArray(dateRange) || Object.is(dateRange.length, 0)) {
return false;
}
const uniqueRangeItemsMs = new Set(dateRange.filter((rangeItem) => !isNil(rangeItem)).map((rangeItem) => rangeItem.valueOf()));
const rangeIsInvalid = !Object.is(uniqueRangeItemsMs.size, VALID_RANGE_SIZE);
if (rangeIsInvalid) {
return false;
}
const rangeEndDate = getRangeEndDate(dateRange);
return this.isSameDate(rangeEndDate, date);
}
dateIsNotAvailable(date, isBackDating, availableEndDate) {
return (!isBackDating && date < DEFAULT_CURRENT_DATE_WITH_CLEARED_TIME) || date > availableEndDate;
}
isDateStartInHoveredAndSelectedRange(date, hoveredRange, selectedRange) {
return this.dateIsRangeStartDate(date, hoveredRange) || this.dateIsRangeStartDate(date, selectedRange);
}
isDateEndInHoveredAndSelectedRange(date, hoveredRange, selectedRange) {
return this.dateIsRangeEndDate(date, hoveredRange) || this.dateIsRangeEndDate(date, selectedRange);
}
}
DatePickerStateService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: DatePickerStateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
DatePickerStateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: DatePickerStateService, providedIn: 'any' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: DatePickerStateService, decorators: [{
type: Injectable,
args: [{ providedIn: 'any' }]
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1waWNrZXItc3RhdGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2RhdGUtdGltZS1waWNrZXIvc2VydmljZXMvZGF0ZS1waWNrZXItc3RhdGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pHLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUN6RSxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBEQUEwRCxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw2REFBNkQsQ0FBQztBQUM5RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrREFBK0QsQ0FBQztBQUNsRyxPQUFzQywyREFBMkQsQ0FBQztBQUNsRyxPQUF3Qyw2REFBNkQsQ0FBQzs7QUFFdEcsTUFBTSxjQUFjLEdBQWEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUM1RSxNQUFNLGtCQUFrQixHQUFXLENBQUMsQ0FBQztBQUNyQyxNQUFNLGdCQUFnQixHQUFXLENBQUMsQ0FBQztBQUVuQyxNQUFNLHNDQUFzQyxHQUFTLGFBQWEsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7QUFHL0UsTUFBTSxPQUFPLHNCQUFzQjtJQURuQztRQUVrQixpQkFBWSxHQUFhLGNBQWMsQ0FBQztR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TSxjQUFjLEdBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3RGLElBQUksY0FBYyxFQUFFO1lBQ2xCLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxNQUFNLFlBQVksR0FBUyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEQsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRU0sa0JBQWtCLENBQUMsSUFBVSxFQUFFLFlBQXFCLEVBQUUsZ0JBQStCO1FBQzFGLE9BQU8sQ0FBQyxDQUFDLFlBQVksSUFBSSxJQUFJLEdBQUcsc0NBQXNDLENBQUMsSUFBSSxJQUFJLEdBQUcsZ0JBQWdCLENBQUM7SUFDckcsQ0FBQztJQUVNLG9DQUFvQyxDQUFDLElBQVUsRUFBRSxZQUFvQixFQUFFLGFBQXFCO1FBQ2pHLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ3pHLENBQUM7SUFFTSxrQ0FBa0MsQ0FBQyxJQUFVLEVBQUUsWUFBb0IsRUFBRSxhQUFxQjtRQUMvRixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQztJQUNyRyxDQUFDOztvSEFqSlUsc0JBQXNCO3dIQUF0QixzQkFBc0IsY0FEVCxLQUFLOzRGQUNsQixzQkFBc0I7a0JBRGxDLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZmlsdGVyRmFsc3ksIGZpbHRlck5vdE5pbCwgaXNOaWwsIHNoYXJlUmVwbGF5V2l0aFJlZkNvdW50IH0gZnJvbSAnQGJpbWVpc3Rlci91dGlsaXRpZXMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBORVZFUiwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCBtYXAsIHN3aXRjaE1hcCwgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGRhdGVDbGVhclRpbWUgfSBmcm9tICcuLi8uLi8uLi9kZWNsYXJhdGlvbnMvZnVuY3Rpb25zL2RhdGUtY2xlYXItdGltZS5mdW5jdGlvbic7XG5pbXBvcnQgeyBnZXRSYW5nZUVuZERhdGUgfSBmcm9tICcuLi8uLi8uLi9kZWNsYXJhdGlvbnMvZnVuY3Rpb25zL2dldC1yYW5nZS1lbmQtZGF0ZS5mdW5jdGlvbic7XG5pbXBvcnQgeyBnZXRSYW5nZVN0YXJ0RGF0ZSB9IGZyb20gJy4uLy4uLy4uL2RlY2xhcmF0aW9ucy9mdW5jdGlvbnMvZ2V0LXJhbmdlLXN0YXJ0LWRhdGUuZnVuY3Rpb24nO1xuaW1wb3J0IHsgRGF0ZVBpY2tlclByZXZpZXdNb2RlIH0gZnJvbSAnLi4vLi4vLi4vZGVjbGFyYXRpb25zL3R5cGVzL2RhdGUtcGlja2VyLXByZXZpZXctbW9kZS50eXBlJztcbmltcG9ydCB7IERhdGVQaWNrZXJTZWxlY3Rpb25Nb2RlIH0gZnJvbSAnLi4vLi4vLi4vZGVjbGFyYXRpb25zL3R5cGVzL2RhdGUtcGlja2VyLXNlbGVjdGlvbi1tb2RlLnR5cGUnO1xuXG5jb25zdCBXRUVLX0RBWV9OQU1FUzogc3RyaW5nW10gPSBbJ9Cf0J0nLCAn0JLQoicsICfQodCgJywgJ9Cn0KInLCAn0J/QoicsICfQodCRJywgJ9CS0KEnXTtcbmNvbnN0IElOVkFMSURfUkFOR0VfU0laRTogbnVtYmVyID0gMjtcbmNvbnN0IFZBTElEX1JBTkdFX1NJWkU6IG51bWJlciA9IDI7XG5cbmNvbnN0IERFRkFVTFRfQ1VSUkVOVF9EQVRFX1dJVEhfQ0xFQVJFRF9USU1FOiBEYXRlID0gZGF0ZUNsZWFyVGltZShuZXcgRGF0ZSgpKTtcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAnYW55JyB9KVxuZXhwb3J0IGNsYXNzIERhdGVQaWNrZXJTdGF0ZVNlcnZpY2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgd2Vla0RheU5hbWVzOiBzdHJpbmdbXSA9IFdFRUtfREFZX05BTUVTO1xuICBwdWJsaWMgcmVhZG9ubHkgY3VycmVudERhdGU6IERhdGUgPSBERUZBVUxUX0NVUlJFTlRfREFURV9XSVRIX0NMRUFSRURfVElNRTtcblxuICBwdWJsaWMgcmVhZG9ubHkgaG91cnMkOiBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPihudWxsKTtcbiAgcHVibGljIHJlYWRvbmx5IG1pbnV0ZXMkOiBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPihudWxsKTtcbiAgcHVibGljIHJlYWRvbmx5IHNlY29uZHMkOiBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPihudWxsKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgaXNCYWNrRGF0aW5nJDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKTtcbiAgcHVibGljIHJlYWRvbmx5IGF2YWlsYWJsZUVuZERhdGUkOiBCZWhhdmlvclN1YmplY3Q8RGF0ZSB8IG51bWJlcj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERhdGUgfCBudW1iZXI+KEluZmluaXR5KTtcblxuICBwdWJsaWMgcmVhZG9ubHkgc2VsZWN0aW9uTW9kZSQ6IEJlaGF2aW9yU3ViamVjdDxEYXRlUGlja2VyU2VsZWN0aW9uTW9kZT4gPVxuICAgIG5ldyBCZWhhdmlvclN1YmplY3Q8RGF0ZVBpY2tlclNlbGVjdGlvbk1vZGU+KCdyYW5nZScpO1xuXG4gIHB1YmxpYyByZWFkb25seSBwcmV2aWV3TW9kZSQ6IEJlaGF2aW9yU3ViamVjdDxEYXRlUGlja2VyUHJldmlld01vZGU+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEYXRlUGlja2VyUHJldmlld01vZGU+KFxuICAgICdzaW1wbGUnXG4gICk7XG5cbiAgcHVibGljIHJlYWRvbmx5IHdpdGhTZWNvbmRzJDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG5cbiAgcHVibGljIHJlYWRvbmx5IHNlbGVjdGVkRGF0ZSQ6IEJlaGF2aW9yU3ViamVjdDxEYXRlPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RGF0ZT4obnVsbCk7XG4gIHB1YmxpYyByZWFkb25seSBzZWxlY3RlZFJhbmdlJDogQmVoYXZpb3JTdWJqZWN0PERhdGVbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERhdGVbXT4oW10pO1xuXG4gIHB1YmxpYyByZWFkb25seSBpc1NlbGVjdGlvbk1vZGVEYXRlJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuc2VsZWN0aW9uTW9kZSQucGlwZShcbiAgICBtYXAoKHNlbGVjdGlvbk1vZGU6IERhdGVQaWNrZXJTZWxlY3Rpb25Nb2RlKSA9PiBzZWxlY3Rpb25Nb2RlID09PSAnZGF0ZScpLFxuICAgIHNoYXJlUmVwbGF5V2l0aFJlZkNvdW50KClcbiAgKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgaG92ZXJlZERhdGUkOiBCZWhhdmlvclN1YmplY3Q8RGF0ZT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERhdGU+KG51bGwpO1xuXG4gIHB1YmxpYyByZWFkb25seSBob3ZlcmVkUmFuZ2UkOiBPYnNlcnZhYmxlPERhdGVbXT4gPSBjb21iaW5lTGF0ZXN0KFt0aGlzLnNlbGVjdGVkUmFuZ2UkLCB0aGlzLmhvdmVyZWREYXRlJF0pLnBpcGUoXG4gICAgZmlsdGVyKChhZ2dyZWdhdGVkRGF0ZXM6IFtEYXRlW10sIERhdGVdKSA9PiB7XG4gICAgICBjb25zdCBzZWxlY3RlZFJhbmdlOiBEYXRlW10gPSBhZ2dyZWdhdGVkRGF0ZXNbMF07XG4gICAgICByZXR1cm4gIU9iamVjdC5pcyhzZWxlY3RlZFJhbmdlLmxlbmd0aCwgSU5WQUxJRF9SQU5HRV9TSVpFKTtcbiAgICB9KSxcbiAgICBtYXAoKGFnZ3JlZ2F0ZWREYXRlczogW0RhdGVbXSwgRGF0ZV0pID0+IHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkUmFuZ2U6IERhdGVbXSA9IGFnZ3JlZ2F0ZWREYXRlc1swXTtcbiAgICAgIGlmIChPYmplY3QuaXMoc2VsZWN0ZWRSYW5nZS5sZW5ndGgsIDApKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNlbGVjdGVkRGF0ZUZyb21SYW5nZTogRGF0ZSA9IHNlbGVjdGVkUmFuZ2Vbc2VsZWN0ZWRSYW5nZS5sZW5ndGggLSAxXTtcbiAgICAgIGNvbnN0IGhvdmVyZWREYXRlOiBEYXRlID0gYWdncmVnYXRlZERhdGVzWzFdO1xuICAgICAgcmV0dXJuIFtzZWxlY3RlZERhdGVGcm9tUmFuZ2UsIGhvdmVyZWREYXRlXTtcbiAgICB9KSxcbiAgICBzaGFyZVJlcGxheVdpdGhSZWZDb3VudCgpXG4gICk7XG5cbiAgcHVibGljIHByb2Nlc3NEYXRlU2VsZWN0aW9uKGRhdGU6IERhdGUpOiB2b2lkIHtcbiAgICB0aGlzLmlzU2VsZWN0aW9uTW9kZURhdGUkXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyTm90TmlsKCksXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIHN3aXRjaE1hcCgoaXNTZWxlY3Rpb25Nb2RlRGF0ZTogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIGlmIChpc1NlbGVjdGlvbk1vZGVEYXRlKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZSQubmV4dChkYXRlKTtcbiAgICAgICAgICAgIHJldHVybiBORVZFUjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFJhbmdlJDtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIG1hcCgoYWxyZWFkeVNlbGVjdGVkRGF0ZXM6IERhdGVbXSkgPT5cbiAgICAgICAgICBPYmplY3QuaXMoYWxyZWFkeVNlbGVjdGVkRGF0ZXMubGVuZ3RoLCAxKSA/IFthbHJlYWR5U2VsZWN0ZWREYXRlc1thbHJlYWR5U2VsZWN0ZWREYXRlcy5sZW5ndGggLSAxXV0gOiBbXVxuICAgICAgICApXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChhbHJlYWR5U2VsZWN0ZWREYXRlczogRGF0ZVtdKSA9PiB0aGlzLnNlbGVjdGVkUmFuZ2UkLm5leHQoWy4uLmFscmVhZHlTZWxlY3RlZERhdGVzLCBkYXRlXSkpO1xuICB9XG5cbiAgcHVibGljIHByb2Nlc3NEYXRlSG92ZXIoZGF0ZTogRGF0ZSk6IHZvaWQge1xuICAgIHRoaXMuaXNTZWxlY3Rpb25Nb2RlRGF0ZSQucGlwZShmaWx0ZXJOb3ROaWwoKSwgdGFrZSgxKSwgZmlsdGVyRmFsc3koKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuaG92ZXJlZERhdGUkLm5leHQoZGF0ZSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgaXNTYW1lRGF0ZShkYXRlQTogRGF0ZSwgZGF0ZUI6IERhdGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIWlzTmlsKGRhdGVBKSAmJiAhaXNOaWwoZGF0ZUIpICYmIE9iamVjdC5pcyhkYXRlQS52YWx1ZU9mKCksIGRhdGVCLnZhbHVlT2YoKSk7XG4gIH1cblxuICBwdWJsaWMgZGF0ZUlzSW5EYXRlUmFuZ2UoZGF0ZTogRGF0ZSwgZGF0ZVJhbmdlOiBEYXRlW10pOiBib29sZWFuIHtcbiAgICBpZiAoaXNOaWwoZGF0ZSkgfHwgIUFycmF5LmlzQXJyYXkoZGF0ZVJhbmdlKSB8fCBPYmplY3QuaXMoZGF0ZVJhbmdlLmxlbmd0aCwgMCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgdW5pcXVlUmFuZ2VJdGVtc01zOiBTZXQ8bnVtYmVyPiA9IG5ldyBTZXQ8bnVtYmVyPihcbiAgICAgIGRhdGVSYW5nZS5maWx0ZXIoKHJhbmdlSXRlbTogRGF0ZSkgPT4gIWlzTmlsKHJhbmdlSXRlbSkpLm1hcCgocmFuZ2VJdGVtOiBEYXRlKSA9PiByYW5nZUl0ZW0udmFsdWVPZigpKVxuICAgICk7XG4gICAgY29uc3QgcmFuZ2VJc0ludmFsaWQ6IGJvb2xlYW4gPSAhT2JqZWN0LmlzKHVuaXF1ZVJhbmdlSXRlbXNNcy5zaXplLCBWQUxJRF9SQU5HRV9TSVpFKTtcbiAgICBpZiAocmFuZ2VJc0ludmFsaWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgcmFuZ2VTdGFydERhdGU6IERhdGUgPSBnZXRSYW5nZVN0YXJ0RGF0ZShkYXRlUmFuZ2UpO1xuICAgIGNvbnN0IHJhbmdlRW5kRGF0ZTogRGF0ZSA9IGdldFJhbmdlRW5kRGF0ZShkYXRlUmFuZ2UpO1xuICAgIGNvbnN0IHJhbmdlU3RhcnREYXRlTXM6IG51bWJlciA9IHJhbmdlU3RhcnREYXRlLnZhbHVlT2YoKTtcbiAgICBjb25zdCByYW5nZUVuZERhdGVNczogbnVtYmVyID0gcmFuZ2VFbmREYXRlLnZhbHVlT2YoKTtcbiAgICBjb25zdCBkYXRlVG9UZXN0TXM6IG51bWJlciA9IGRhdGUudmFsdWVPZigpO1xuXG4gICAgcmV0dXJuIHJhbmdlU3RhcnREYXRlTXMgPCBkYXRlVG9UZXN0TXMgJiYgcmFuZ2VFbmREYXRlTXMgPiBkYXRlVG9UZXN0TXM7XG4gIH1cblxuICBwdWJsaWMgZGF0ZUlzSW5EYXRlQXJyYXkoZGF0ZTogRGF0ZSwgZGF0ZUFycmF5OiBEYXRlW10pOiBib29sZWFuIHtcbiAgICBpZiAoaXNOaWwoZGF0ZSkgfHwgIUFycmF5LmlzQXJyYXkoZGF0ZUFycmF5KSB8fCBPYmplY3QuaXMoZGF0ZUFycmF5Lmxlbmd0aCwgMCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGVBcnJheS5zb21lKChkYXRlRnJvbVJhbmdlOiBEYXRlKSA9PiB0aGlzLmlzU2FtZURhdGUoZGF0ZUZyb21SYW5nZSwgZGF0ZSkpO1xuICB9XG5cbiAgcHVibGljIGRhdGVJc1JhbmdlU3RhcnREYXRlKGRhdGU6IERhdGUsIGRhdGVSYW5nZTogRGF0ZVtdKTogYm9vbGVhbiB7XG4gICAgaWYgKGlzTmlsKGRhdGUpIHx8ICFBcnJheS5pc0FycmF5KGRhdGVSYW5nZSkgfHwgT2JqZWN0LmlzKGRhdGVSYW5nZS5sZW5ndGgsIDApKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHVuaXF1ZVJhbmdlSXRlbXNNczogU2V0PG51bWJlcj4gPSBuZXcgU2V0PG51bWJlcj4oXG4gICAgICBkYXRlUmFuZ2UuZmlsdGVyKChyYW5nZUl0ZW06IERhdGUpID0+ICFpc05pbChyYW5nZUl0ZW0pKS5tYXAoKHJhbmdlSXRlbTogRGF0ZSkgPT4gcmFuZ2VJdGVtLnZhbHVlT2YoKSlcbiAgICApO1xuICAgIGNvbnN0IHJhbmdlSXNJbnZhbGlkOiBib29sZWFuID0gIU9iamVjdC5pcyh1bmlxdWVSYW5nZUl0ZW1zTXMuc2l6ZSwgVkFMSURfUkFOR0VfU0laRSk7XG4gICAgaWYgKHJhbmdlSXNJbnZhbGlkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHJhbmdlU3RhcnREYXRlOiBEYXRlID0gZ2V0UmFuZ2VTdGFydERhdGUoZGF0ZVJhbmdlKTtcbiAgICByZXR1cm4gdGhpcy5pc1NhbWVEYXRlKHJhbmdlU3RhcnREYXRlLCBkYXRlKTtcbiAgfVxuXG4gIHB1YmxpYyBkYXRlSXNSYW5nZUVuZERhdGUoZGF0ZTogRGF0ZSwgZGF0ZVJhbmdlOiBEYXRlW10pOiBib29sZWFuIHtcbiAgICBpZiAoaXNOaWwoZGF0ZSkgfHwgIUFycmF5LmlzQXJyYXkoZGF0ZVJhbmdlKSB8fCBPYmplY3QuaXMoZGF0ZVJhbmdlLmxlbmd0aCwgMCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgdW5pcXVlUmFuZ2VJdGVtc01zOiBTZXQ8bnVtYmVyPiA9IG5ldyBTZXQ8bnVtYmVyPihcbiAgICAgIGRhdGVSYW5nZS5maWx0ZXIoKHJhbmdlSXRlbTogRGF0ZSkgPT4gIWlzTmlsKHJhbmdlSXRlbSkpLm1hcCgocmFuZ2VJdGVtOiBEYXRlKSA9PiByYW5nZUl0ZW0udmFsdWVPZigpKVxuICAgICk7XG4gICAgY29uc3QgcmFuZ2VJc0ludmFsaWQ6IGJvb2xlYW4gPSAhT2JqZWN0LmlzKHVuaXF1ZVJhbmdlSXRlbXNNcy5zaXplLCBWQUxJRF9SQU5HRV9TSVpFKTtcbiAgICBpZiAocmFuZ2VJc0ludmFsaWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgcmFuZ2VFbmREYXRlOiBEYXRlID0gZ2V0UmFuZ2VFbmREYXRlKGRhdGVSYW5nZSk7XG4gICAgcmV0dXJuIHRoaXMuaXNTYW1lRGF0ZShyYW5nZUVuZERhdGUsIGRhdGUpO1xuICB9XG5cbiAgcHVibGljIGRhdGVJc05vdEF2YWlsYWJsZShkYXRlOiBEYXRlLCBpc0JhY2tEYXRpbmc6IGJvb2xlYW4sIGF2YWlsYWJsZUVuZERhdGU6IERhdGUgfCBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKCFpc0JhY2tEYXRpbmcgJiYgZGF0ZSA8IERFRkFVTFRfQ1VSUkVOVF9EQVRFX1dJVEhfQ0xFQVJFRF9USU1FKSB8fCBkYXRlID4gYXZhaWxhYmxlRW5kRGF0ZTtcbiAgfVxuXG4gIHB1YmxpYyBpc0RhdGVTdGFydEluSG92ZXJlZEFuZFNlbGVjdGVkUmFuZ2UoZGF0ZTogRGF0ZSwgaG92ZXJlZFJhbmdlOiBEYXRlW10sIHNlbGVjdGVkUmFuZ2U6IERhdGVbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRhdGVJc1JhbmdlU3RhcnREYXRlKGRhdGUsIGhvdmVyZWRSYW5nZSkgfHwgdGhpcy5kYXRlSXNSYW5nZVN0YXJ0RGF0ZShkYXRlLCBzZWxlY3RlZFJhbmdlKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0RhdGVFbmRJbkhvdmVyZWRBbmRTZWxlY3RlZFJhbmdlKGRhdGU6IERhdGUsIGhvdmVyZWRSYW5nZTogRGF0ZVtdLCBzZWxlY3RlZFJhbmdlOiBEYXRlW10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kYXRlSXNSYW5nZUVuZERhdGUoZGF0ZSwgaG92ZXJlZFJhbmdlKSB8fCB0aGlzLmRhdGVJc1JhbmdlRW5kRGF0ZShkYXRlLCBzZWxlY3RlZFJhbmdlKTtcbiAgfVxufVxuIl19