UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

168 lines 23.1 kB
import { Injectable } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { filter, map } from 'rxjs/operators'; import { DateContextQueryParamNames } from './widget-time-context.model'; import { WidgetTimeContextHelperService } from './widget-time-context-helper.service'; import * as i0 from "@angular/core"; import * as i1 from "@angular/router"; import * as i2 from "./widget-time-context-helper.service"; export class WidgetTimeContextQueryService { constructor(activatedRoute, helperService, router) { this.activatedRoute = activatedRoute; this.helperService = helperService; this.router = router; } /** * Returns observable that emits date context query params every time query params change. * Invalid values are filtered out. * * @returns Observable of date context query params. */ queryParamsChange$() { return this.activatedRoute.queryParams.pipe(map((params) => this.processQueryParams(params)), filter((params) => this.queryParamsContainsTimeRange(params))); } /** * Creates widget time context from query parameters. * Interval data takes precedence over date time context described by date "from" and date "to", * so if valid interval is provided, date "from" and date "to" are ignored, and they are recalculated * with interval. * * @returns Widget time context state based on current query params or null if query params provide no valid context. */ dateTimeContextFromQueryParams() { const realtime = this.parseRealtime(this.activatedRoute.snapshot.queryParams[DateContextQueryParamNames.DATE_CONTEXT_REALTIME]); // trying to get date context from query params by interval first const dateContextInterval = this.activatedRoute.snapshot.queryParams[DateContextQueryParamNames.DATE_CONTEXT_INTERVAL]; const aggregation = this.activatedRoute.snapshot.queryParams[DateContextQueryParamNames.DATE_CONTEXT_AGGREGATION]; const isValidInterval = this.helperService.isSelectableInterval(dateContextInterval); if (isValidInterval) { return { date: this.helperService.getDateTimeContextByInterval(dateContextInterval), interval: dateContextInterval, realtime, aggregation }; } // if date context by interval is not provided, try getting date "from" and date "to" from query params const dateTimeContextFromQueryParams = this.getDateContextFromQueryParams(); if (dateTimeContextFromQueryParams) { return { date: dateTimeContextFromQueryParams, interval: 'custom', realtime, aggregation }; } return null; } /** * Sets query parameters related to date time context. * Valid interval (and other than 'custom') takes precedence over context described by date "from" and date "to". * Interval and context described by date "from" and date "to" exclude each other. * * @param widgetTimeContextState Widget time context state. */ setDateContextQueryParams({ interval, date, realtime, aggregation }) { let queryParams; if (interval && interval !== 'custom') { queryParams = { dateContextInterval: interval, dateContextRealtime: realtime, dateContextAggregation: aggregation, dateContextTo: null, dateContextFrom: null }; } else { queryParams = { dateContextFrom: date[0].toISOString(), dateContextTo: date[1].toISOString(), dateContextRealtime: realtime, dateContextAggregation: aggregation, dateContextInterval: null }; } this.router.navigate([], { relativeTo: this.activatedRoute, queryParams, queryParamsHandling: 'merge' }); } /** * Clears all date time context related query parameters. */ clearQueryParams() { const clearingQueryParams = { dateContextFrom: null, dateContextTo: null, dateContextInterval: null, dateContextRealtime: null, dateContextAggregation: null }; this.router.navigate([], { relativeTo: this.activatedRoute, queryParams: clearingQueryParams, replaceUrl: true }); } /** * Parses and validates date context from query params described by date "from" and date "to". * * @returns Date context as tuple of date "from" and date "to", or null if date context is invalid. */ getDateContextFromQueryParams() { const dateContextFrom = this.activatedRoute.snapshot.queryParams[DateContextQueryParamNames.DATE_CONTEXT_FROM]; const dateContextTo = this.activatedRoute.snapshot.queryParams[DateContextQueryParamNames.DATE_CONTEXT_TO]; if (this.helperService.isValidDateRange(dateContextFrom, dateContextTo)) { return [new Date(dateContextFrom), new Date(dateContextTo)]; } return null; } /** * Parses realtime query param. * * @returns Parsed realtime value or null. */ parseRealtime(realtime) { return realtime === 'false' ? false : realtime === 'true' ? true : null; } /** * Maps query params object to proper type. * * @param params Query parameters object with string values only. * * @returns Query params object of proper type. */ processQueryParams(params) { const dateContextRealtime = this.parseRealtime(params.dateContextRealtime); const dateContextInterval = this.helperService.isSelectableInterval(params.dateContextInterval) ? params.dateContextInterval : null; const dateContextAggregation = this.helperService.isValidAggregation(params.dateContextAggregation) ? params.dateContextAggregation : null; return { ...params, dateContextRealtime, dateContextInterval, dateContextAggregation }; } /** * Determines if provided query params contains valid time range. * * @param params Query parameters object. * * @returns True if query params contains valid time range, otherwise false. */ queryParamsContainsTimeRange(params) { if (!params.dateContextInterval && !params.dateContextFrom && !params.dateContextTo) { return false; } const intervalProvided = !!params.dateContextInterval; const dateRangeValid = this.helperService.isValidDateRange(params.dateContextFrom, params.dateContextTo); return intervalProvided || dateRangeValid; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WidgetTimeContextQueryService, deps: [{ token: i1.ActivatedRoute }, { token: i2.WidgetTimeContextHelperService }, { token: i1.Router }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WidgetTimeContextQueryService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WidgetTimeContextQueryService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: () => [{ type: i1.ActivatedRoute }, { type: i2.WidgetTimeContextHelperService }, { type: i1.Router }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LXRpbWUtY29udGV4dC1xdWVyeS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vY29yZS9kYXNoYm9hcmQvd2lnZXQtdGltZS1jb250ZXh0L3dpZGdldC10aW1lLWNvbnRleHQtcXVlcnkuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFekQsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQ0wsMEJBQTBCLEVBRzNCLE1BQU0sNkJBQTZCLENBQUM7QUFDckMsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sc0NBQXNDLENBQUM7Ozs7QUFNdEYsTUFBTSxPQUFPLDZCQUE2QjtJQUN4QyxZQUNVLGNBQThCLEVBQzlCLGFBQTZDLEVBQzdDLE1BQWM7UUFGZCxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsa0JBQWEsR0FBYixhQUFhLENBQWdDO1FBQzdDLFdBQU0sR0FBTixNQUFNLENBQVE7SUFDckIsQ0FBQztJQUVKOzs7OztPQUtHO0lBQ0gsa0JBQWtCO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUN6QyxHQUFHLENBQUMsQ0FBQyxNQUFrRCxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsRUFDNUYsTUFBTSxDQUFDLENBQUMsTUFBbUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQzNGLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILDhCQUE4QjtRQUM1QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUNqQyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsMEJBQTBCLENBQUMscUJBQXFCLENBQUMsQ0FDM0YsQ0FBQztRQUNGLGlFQUFpRTtRQUNqRSxNQUFNLG1CQUFtQixHQUN2QixJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsMEJBQTBCLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUM3RixNQUFNLFdBQVcsR0FDZixJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsMEJBQTBCLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUNoRyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLG9CQUFvQixDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDckYsSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUNwQixPQUFPO2dCQUNMLElBQUksRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLDRCQUE0QixDQUFDLG1CQUFtQixDQUFDO2dCQUMxRSxRQUFRLEVBQUUsbUJBQW1CO2dCQUM3QixRQUFRO2dCQUNSLFdBQVc7YUFDWixDQUFDO1FBQ0osQ0FBQztRQUVELHVHQUF1RztRQUN2RyxNQUFNLDhCQUE4QixHQUFHLElBQUksQ0FBQyw2QkFBNkIsRUFBRSxDQUFDO1FBQzVFLElBQUksOEJBQThCLEVBQUUsQ0FBQztZQUNuQyxPQUFPO2dCQUNMLElBQUksRUFBRSw4QkFBOEI7Z0JBQ3BDLFFBQVEsRUFBRSxRQUFRO2dCQUNsQixRQUFRO2dCQUNSLFdBQVc7YUFDWixDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILHlCQUF5QixDQUFDLEVBQ3hCLFFBQVEsRUFDUixJQUFJLEVBQ0osUUFBUSxFQUNSLFdBQVcsRUFDWTtRQUN2QixJQUFJLFdBQXdFLENBQUM7UUFDN0UsSUFBSSxRQUFRLElBQUksUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3RDLFdBQVcsR0FBRztnQkFDWixtQkFBbUIsRUFBRSxRQUFRO2dCQUM3QixtQkFBbUIsRUFBRSxRQUFRO2dCQUM3QixzQkFBc0IsRUFBRSxXQUFXO2dCQUNuQyxhQUFhLEVBQUUsSUFBSTtnQkFDbkIsZUFBZSxFQUFFLElBQUk7YUFDdEIsQ0FBQztRQUNKLENBQUM7YUFBTSxDQUFDO1lBQ04sV0FBVyxHQUFHO2dCQUNaLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFO2dCQUN0QyxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRTtnQkFDcEMsbUJBQW1CLEVBQUUsUUFBUTtnQkFDN0Isc0JBQXNCLEVBQUUsV0FBVztnQkFDbkMsbUJBQW1CLEVBQUUsSUFBSTthQUMxQixDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRTtZQUN2QixVQUFVLEVBQUUsSUFBSSxDQUFDLGNBQWM7WUFDL0IsV0FBVztZQUNYLG1CQUFtQixFQUFFLE9BQU87U0FDN0IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZ0JBQWdCO1FBQ2QsTUFBTSxtQkFBbUIsR0FBNkM7WUFDcEUsZUFBZSxFQUFFLElBQUk7WUFDckIsYUFBYSxFQUFFLElBQUk7WUFDbkIsbUJBQW1CLEVBQUUsSUFBSTtZQUN6QixtQkFBbUIsRUFBRSxJQUFJO1lBQ3pCLHNCQUFzQixFQUFFLElBQUk7U0FDN0IsQ0FBQztRQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRTtZQUN2QixVQUFVLEVBQUUsSUFBSSxDQUFDLGNBQWM7WUFDL0IsV0FBVyxFQUFFLG1CQUFtQjtZQUNoQyxVQUFVLEVBQUUsSUFBSTtTQUNqQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLDZCQUE2QjtRQUNuQyxNQUFNLGVBQWUsR0FDbkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLDBCQUEwQixDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDekYsTUFBTSxhQUFhLEdBQ2pCLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQywwQkFBMEIsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUV2RixJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxFQUFFLGFBQWEsQ0FBQyxFQUFFLENBQUM7WUFDeEUsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUFDOUQsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxhQUFhLENBQUMsUUFBZ0I7UUFDcEMsT0FBTyxRQUFRLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzFFLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxrQkFBa0IsQ0FDeEIsTUFBa0Q7UUFFbEQsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQzNFLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FDakUsTUFBTSxDQUFDLG1CQUFxQyxDQUM3QztZQUNDLENBQUMsQ0FBRSxNQUFNLENBQUMsbUJBQXNDO1lBQ2hELENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDVCxNQUFNLHNCQUFzQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQ2xFLE1BQU0sQ0FBQyxzQkFBeUMsQ0FDakQ7WUFDQyxDQUFDLENBQUUsTUFBTSxDQUFDLHNCQUEwQztZQUNwRCxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ1QsT0FBTyxFQUFFLEdBQUcsTUFBTSxFQUFFLG1CQUFtQixFQUFFLG1CQUFtQixFQUFFLHNCQUFzQixFQUFFLENBQUM7SUFDekYsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNLLDRCQUE0QixDQUFDLE1BQW1DO1FBQ3RFLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3BGLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQztRQUN0RCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUN4RCxNQUFNLENBQUMsZUFBZSxFQUN0QixNQUFNLENBQUMsYUFBYSxDQUNyQixDQUFDO1FBQ0YsT0FBTyxnQkFBZ0IsSUFBSSxjQUFjLENBQUM7SUFDNUMsQ0FBQzsrR0F2TFUsNkJBQTZCO21IQUE3Qiw2QkFBNkIsY0FEaEIsTUFBTTs7NEZBQ25CLDZCQUE2QjtrQkFEekMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgRGF0ZUNvbnRleHRRdWVyeVBhcmFtTmFtZXMsXG4gIElucHV0RGF0ZUNvbnRleHRRdWVyeVBhcmFtcyxcbiAgV2lkZ2V0VGltZUNvbnRleHRTdGF0ZVxufSBmcm9tICcuL3dpZGdldC10aW1lLWNvbnRleHQubW9kZWwnO1xuaW1wb3J0IHsgV2lkZ2V0VGltZUNvbnRleHRIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnLi93aWRnZXQtdGltZS1jb250ZXh0LWhlbHBlci5zZXJ2aWNlJztcbmltcG9ydCB7IERhdGVUaW1lQ29udGV4dCB9IGZyb20gJy4uL3dpZGdldC1jaGFuZ2UtZXZlbnQubW9kZWwnO1xuaW1wb3J0IHsgYWdncmVnYXRpb25UeXBlIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgSW50ZXJ2YWwgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2ludGVydmFsLXBpY2tlcic7XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgV2lkZ2V0VGltZUNvbnRleHRRdWVyeVNlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIGhlbHBlclNlcnZpY2U6IFdpZGdldFRpbWVDb250ZXh0SGVscGVyU2VydmljZSxcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyXG4gICkge31cblxuICAvKipcbiAgICogUmV0dXJucyBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgZGF0ZSBjb250ZXh0IHF1ZXJ5IHBhcmFtcyBldmVyeSB0aW1lIHF1ZXJ5IHBhcmFtcyBjaGFuZ2UuXG4gICAqIEludmFsaWQgdmFsdWVzIGFyZSBmaWx0ZXJlZCBvdXQuXG4gICAqXG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgb2YgZGF0ZSBjb250ZXh0IHF1ZXJ5IHBhcmFtcy5cbiAgICovXG4gIHF1ZXJ5UGFyYW1zQ2hhbmdlJCgpOiBPYnNlcnZhYmxlPElucHV0RGF0ZUNvbnRleHRRdWVyeVBhcmFtcz4ge1xuICAgIHJldHVybiB0aGlzLmFjdGl2YXRlZFJvdXRlLnF1ZXJ5UGFyYW1zLnBpcGUoXG4gICAgICBtYXAoKHBhcmFtczogUmVjb3JkPERhdGVDb250ZXh0UXVlcnlQYXJhbU5hbWVzLCBzdHJpbmc+KSA9PiB0aGlzLnByb2Nlc3NRdWVyeVBhcmFtcyhwYXJhbXMpKSxcbiAgICAgIGZpbHRlcigocGFyYW1zOiBJbnB1dERhdGVDb250ZXh0UXVlcnlQYXJhbXMpID0+IHRoaXMucXVlcnlQYXJhbXNDb250YWluc1RpbWVSYW5nZShwYXJhbXMpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB3aWRnZXQgdGltZSBjb250ZXh0IGZyb20gcXVlcnkgcGFyYW1ldGVycy5cbiAgICogSW50ZXJ2YWwgZGF0YSB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgZGF0ZSB0aW1lIGNvbnRleHQgZGVzY3JpYmVkIGJ5IGRhdGUgXCJmcm9tXCIgYW5kIGRhdGUgXCJ0b1wiLFxuICAgKiBzbyBpZiB2YWxpZCBpbnRlcnZhbCBpcyBwcm92aWRlZCwgZGF0ZSBcImZyb21cIiBhbmQgZGF0ZSBcInRvXCIgYXJlIGlnbm9yZWQsIGFuZCB0aGV5IGFyZSByZWNhbGN1bGF0ZWRcbiAgICogd2l0aCBpbnRlcnZhbC5cbiAgICpcbiAgICogQHJldHVybnMgV2lkZ2V0IHRpbWUgY29udGV4dCBzdGF0ZSBiYXNlZCBvbiBjdXJyZW50IHF1ZXJ5IHBhcmFtcyBvciBudWxsIGlmIHF1ZXJ5IHBhcmFtcyBwcm92aWRlIG5vIHZhbGlkIGNvbnRleHQuXG4gICAqL1xuICBkYXRlVGltZUNvbnRleHRGcm9tUXVlcnlQYXJhbXMoKTogV2lkZ2V0VGltZUNvbnRleHRTdGF0ZSB8IG51bGwge1xuICAgIGNvbnN0IHJlYWx0aW1lID0gdGhpcy5wYXJzZVJlYWx0aW1lKFxuICAgICAgdGhpcy5hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtc1tEYXRlQ29udGV4dFF1ZXJ5UGFyYW1OYW1lcy5EQVRFX0NPTlRFWFRfUkVBTFRJTUVdXG4gICAgKTtcbiAgICAvLyB0cnlpbmcgdG8gZ2V0IGRhdGUgY29udGV4dCBmcm9tIHF1ZXJ5IHBhcmFtcyBieSBpbnRlcnZhbCBmaXJzdFxuICAgIGNvbnN0IGRhdGVDb250ZXh0SW50ZXJ2YWwgPVxuICAgICAgdGhpcy5hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtc1tEYXRlQ29udGV4dFF1ZXJ5UGFyYW1OYW1lcy5EQVRFX0NPTlRFWFRfSU5URVJWQUxdO1xuICAgIGNvbnN0IGFnZ3JlZ2F0aW9uID1cbiAgICAgIHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXNbRGF0ZUNvbnRleHRRdWVyeVBhcmFtTmFtZXMuREFURV9DT05URVhUX0FHR1JFR0FUSU9OXTtcbiAgICBjb25zdCBpc1ZhbGlkSW50ZXJ2YWwgPSB0aGlzLmhlbHBlclNlcnZpY2UuaXNTZWxlY3RhYmxlSW50ZXJ2YWwoZGF0ZUNvbnRleHRJbnRlcnZhbCk7XG4gICAgaWYgKGlzVmFsaWRJbnRlcnZhbCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0ZTogdGhpcy5oZWxwZXJTZXJ2aWNlLmdldERhdGVUaW1lQ29udGV4dEJ5SW50ZXJ2YWwoZGF0ZUNvbnRleHRJbnRlcnZhbCksXG4gICAgICAgIGludGVydmFsOiBkYXRlQ29udGV4dEludGVydmFsLFxuICAgICAgICByZWFsdGltZSxcbiAgICAgICAgYWdncmVnYXRpb25cbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gaWYgZGF0ZSBjb250ZXh0IGJ5IGludGVydmFsIGlzIG5vdCBwcm92aWRlZCwgdHJ5IGdldHRpbmcgZGF0ZSBcImZyb21cIiBhbmQgZGF0ZSBcInRvXCIgZnJvbSBxdWVyeSBwYXJhbXNcbiAgICBjb25zdCBkYXRlVGltZUNvbnRleHRGcm9tUXVlcnlQYXJhbXMgPSB0aGlzLmdldERhdGVDb250ZXh0RnJvbVF1ZXJ5UGFyYW1zKCk7XG4gICAgaWYgKGRhdGVUaW1lQ29udGV4dEZyb21RdWVyeVBhcmFtcykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0ZTogZGF0ZVRpbWVDb250ZXh0RnJvbVF1ZXJ5UGFyYW1zLFxuICAgICAgICBpbnRlcnZhbDogJ2N1c3RvbScsXG4gICAgICAgIHJlYWx0aW1lLFxuICAgICAgICBhZ2dyZWdhdGlvblxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBxdWVyeSBwYXJhbWV0ZXJzIHJlbGF0ZWQgdG8gZGF0ZSB0aW1lIGNvbnRleHQuXG4gICAqIFZhbGlkIGludGVydmFsIChhbmQgb3RoZXIgdGhhbiAnY3VzdG9tJykgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGNvbnRleHQgZGVzY3JpYmVkIGJ5IGRhdGUgXCJmcm9tXCIgYW5kIGRhdGUgXCJ0b1wiLlxuICAgKiBJbnRlcnZhbCBhbmQgY29udGV4dCBkZXNjcmliZWQgYnkgZGF0ZSBcImZyb21cIiBhbmQgZGF0ZSBcInRvXCIgZXhjbHVkZSBlYWNoIG90aGVyLlxuICAgKlxuICAgKiBAcGFyYW0gd2lkZ2V0VGltZUNvbnRleHRTdGF0ZSBXaWRnZXQgdGltZSBjb250ZXh0IHN0YXRlLlxuICAgKi9cbiAgc2V0RGF0ZUNvbnRleHRRdWVyeVBhcmFtcyh7XG4gICAgaW50ZXJ2YWwsXG4gICAgZGF0ZSxcbiAgICByZWFsdGltZSxcbiAgICBhZ2dyZWdhdGlvblxuICB9OiBXaWRnZXRUaW1lQ29udGV4dFN0YXRlKTogdm9pZCB7XG4gICAgbGV0IHF1ZXJ5UGFyYW1zOiBSZWNvcmQ8RGF0ZUNvbnRleHRRdWVyeVBhcmFtTmFtZXMsIG51bGwgfCBzdHJpbmcgfCBib29sZWFuPjtcbiAgICBpZiAoaW50ZXJ2YWwgJiYgaW50ZXJ2YWwgIT09ICdjdXN0b20nKSB7XG4gICAgICBxdWVyeVBhcmFtcyA9IHtcbiAgICAgICAgZGF0ZUNvbnRleHRJbnRlcnZhbDogaW50ZXJ2YWwsXG4gICAgICAgIGRhdGVDb250ZXh0UmVhbHRpbWU6IHJlYWx0aW1lLFxuICAgICAgICBkYXRlQ29udGV4dEFnZ3JlZ2F0aW9uOiBhZ2dyZWdhdGlvbixcbiAgICAgICAgZGF0ZUNvbnRleHRUbzogbnVsbCxcbiAgICAgICAgZGF0ZUNvbnRleHRGcm9tOiBudWxsXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBxdWVyeVBhcmFtcyA9IHtcbiAgICAgICAgZGF0ZUNvbnRleHRGcm9tOiBkYXRlWzBdLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIGRhdGVDb250ZXh0VG86IGRhdGVbMV0udG9JU09TdHJpbmcoKSxcbiAgICAgICAgZGF0ZUNvbnRleHRSZWFsdGltZTogcmVhbHRpbWUsXG4gICAgICAgIGRhdGVDb250ZXh0QWdncmVnYXRpb246IGFnZ3JlZ2F0aW9uLFxuICAgICAgICBkYXRlQ29udGV4dEludGVydmFsOiBudWxsXG4gICAgICB9O1xuICAgIH1cbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXSwge1xuICAgICAgcmVsYXRpdmVUbzogdGhpcy5hY3RpdmF0ZWRSb3V0ZSxcbiAgICAgIHF1ZXJ5UGFyYW1zLFxuICAgICAgcXVlcnlQYXJhbXNIYW5kbGluZzogJ21lcmdlJ1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyBhbGwgZGF0ZSB0aW1lIGNvbnRleHQgcmVsYXRlZCBxdWVyeSBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgY2xlYXJRdWVyeVBhcmFtcygpOiB2b2lkIHtcbiAgICBjb25zdCBjbGVhcmluZ1F1ZXJ5UGFyYW1zOiBSZWNvcmQ8RGF0ZUNvbnRleHRRdWVyeVBhcmFtTmFtZXMsIG51bGw+ID0ge1xuICAgICAgZGF0ZUNvbnRleHRGcm9tOiBudWxsLFxuICAgICAgZGF0ZUNvbnRleHRUbzogbnVsbCxcbiAgICAgIGRhdGVDb250ZXh0SW50ZXJ2YWw6IG51bGwsXG4gICAgICBkYXRlQ29udGV4dFJlYWx0aW1lOiBudWxsLFxuICAgICAgZGF0ZUNvbnRleHRBZ2dyZWdhdGlvbjogbnVsbFxuICAgIH07XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW10sIHtcbiAgICAgIHJlbGF0aXZlVG86IHRoaXMuYWN0aXZhdGVkUm91dGUsXG4gICAgICBxdWVyeVBhcmFtczogY2xlYXJpbmdRdWVyeVBhcmFtcyxcbiAgICAgIHJlcGxhY2VVcmw6IHRydWVcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgYW5kIHZhbGlkYXRlcyBkYXRlIGNvbnRleHQgZnJvbSBxdWVyeSBwYXJhbXMgZGVzY3JpYmVkIGJ5IGRhdGUgXCJmcm9tXCIgYW5kIGRhdGUgXCJ0b1wiLlxuICAgKlxuICAgKiBAcmV0dXJucyBEYXRlIGNvbnRleHQgYXMgdHVwbGUgb2YgZGF0ZSBcImZyb21cIiBhbmQgZGF0ZSBcInRvXCIsIG9yIG51bGwgaWYgZGF0ZSBjb250ZXh0IGlzIGludmFsaWQuXG4gICAqL1xuICBwcml2YXRlIGdldERhdGVDb250ZXh0RnJvbVF1ZXJ5UGFyYW1zKCk6IERhdGVUaW1lQ29udGV4dCB8IG51bGwge1xuICAgIGNvbnN0IGRhdGVDb250ZXh0RnJvbSA9XG4gICAgICB0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zW0RhdGVDb250ZXh0UXVlcnlQYXJhbU5hbWVzLkRBVEVfQ09OVEVYVF9GUk9NXTtcbiAgICBjb25zdCBkYXRlQ29udGV4dFRvID1cbiAgICAgIHRoaXMuYWN0aXZhdGVkUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXNbRGF0ZUNvbnRleHRRdWVyeVBhcmFtTmFtZXMuREFURV9DT05URVhUX1RPXTtcblxuICAgIGlmICh0aGlzLmhlbHBlclNlcnZpY2UuaXNWYWxpZERhdGVSYW5nZShkYXRlQ29udGV4dEZyb20sIGRhdGVDb250ZXh0VG8pKSB7XG4gICAgICByZXR1cm4gW25ldyBEYXRlKGRhdGVDb250ZXh0RnJvbSksIG5ldyBEYXRlKGRhdGVDb250ZXh0VG8pXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIHJlYWx0aW1lIHF1ZXJ5IHBhcmFtLlxuICAgKlxuICAgKiBAcmV0dXJucyBQYXJzZWQgcmVhbHRpbWUgdmFsdWUgb3IgbnVsbC5cbiAgICovXG4gIHByaXZhdGUgcGFyc2VSZWFsdGltZShyZWFsdGltZTogc3RyaW5nKTogYm9vbGVhbiB8IG51bGwge1xuICAgIHJldHVybiByZWFsdGltZSA9PT0gJ2ZhbHNlJyA/IGZhbHNlIDogcmVhbHRpbWUgPT09ICd0cnVlJyA/IHRydWUgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcHMgcXVlcnkgcGFyYW1zIG9iamVjdCB0byBwcm9wZXIgdHlwZS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyBRdWVyeSBwYXJhbWV0ZXJzIG9iamVjdCB3aXRoIHN0cmluZyB2YWx1ZXMgb25seS5cbiAgICpcbiAgICogQHJldHVybnMgUXVlcnkgcGFyYW1zIG9iamVjdCBvZiBwcm9wZXIgdHlwZS5cbiAgICovXG4gIHByaXZhdGUgcHJvY2Vzc1F1ZXJ5UGFyYW1zKFxuICAgIHBhcmFtczogUmVjb3JkPERhdGVDb250ZXh0UXVlcnlQYXJhbU5hbWVzLCBzdHJpbmc+XG4gICk6IElucHV0RGF0ZUNvbnRleHRRdWVyeVBhcmFtcyB7XG4gICAgY29uc3QgZGF0ZUNvbnRleHRSZWFsdGltZSA9IHRoaXMucGFyc2VSZWFsdGltZShwYXJhbXMuZGF0ZUNvbnRleHRSZWFsdGltZSk7XG4gICAgY29uc3QgZGF0ZUNvbnRleHRJbnRlcnZhbCA9IHRoaXMuaGVscGVyU2VydmljZS5pc1NlbGVjdGFibGVJbnRlcnZhbChcbiAgICAgIHBhcmFtcy5kYXRlQ29udGV4dEludGVydmFsIGFzIEludGVydmFsWydpZCddXG4gICAgKVxuICAgICAgPyAocGFyYW1zLmRhdGVDb250ZXh0SW50ZXJ2YWwgYXMgSW50ZXJ2YWxbJ2lkJ10pXG4gICAgICA6IG51bGw7XG4gICAgY29uc3QgZGF0ZUNvbnRleHRBZ2dyZWdhdGlvbiA9IHRoaXMuaGVscGVyU2VydmljZS5pc1ZhbGlkQWdncmVnYXRpb24oXG4gICAgICBwYXJhbXMuZGF0ZUNvbnRleHRBZ2dyZWdhdGlvbiBhcyBhZ2dyZWdhdGlvblR5cGVcbiAgICApXG4gICAgICA/IChwYXJhbXMuZGF0ZUNvbnRleHRBZ2dyZWdhdGlvbiBhcyBhZ2dyZWdhdGlvblR5cGUpXG4gICAgICA6IG51bGw7XG4gICAgcmV0dXJuIHsgLi4ucGFyYW1zLCBkYXRlQ29udGV4dFJlYWx0aW1lLCBkYXRlQ29udGV4dEludGVydmFsLCBkYXRlQ29udGV4dEFnZ3JlZ2F0aW9uIH07XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiBwcm92aWRlZCBxdWVyeSBwYXJhbXMgY29udGFpbnMgdmFsaWQgdGltZSByYW5nZS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyBRdWVyeSBwYXJhbWV0ZXJzIG9iamVjdC5cbiAgICpcbiAgICogQHJldHVybnMgVHJ1ZSBpZiBxdWVyeSBwYXJhbXMgY29udGFpbnMgdmFsaWQgdGltZSByYW5nZSwgb3RoZXJ3aXNlIGZhbHNlLlxuICAgKi9cbiAgcHJpdmF0ZSBxdWVyeVBhcmFtc0NvbnRhaW5zVGltZVJhbmdlKHBhcmFtczogSW5wdXREYXRlQ29udGV4dFF1ZXJ5UGFyYW1zKTogYm9vbGVhbiB7XG4gICAgaWYgKCFwYXJhbXMuZGF0ZUNvbnRleHRJbnRlcnZhbCAmJiAhcGFyYW1zLmRhdGVDb250ZXh0RnJvbSAmJiAhcGFyYW1zLmRhdGVDb250ZXh0VG8pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgaW50ZXJ2YWxQcm92aWRlZCA9ICEhcGFyYW1zLmRhdGVDb250ZXh0SW50ZXJ2YWw7XG4gICAgY29uc3QgZGF0ZVJhbmdlVmFsaWQgPSB0aGlzLmhlbHBlclNlcnZpY2UuaXNWYWxpZERhdGVSYW5nZShcbiAgICAgIHBhcmFtcy5kYXRlQ29udGV4dEZyb20sXG4gICAgICBwYXJhbXMuZGF0ZUNvbnRleHRUb1xuICAgICk7XG4gICAgcmV0dXJuIGludGVydmFsUHJvdmlkZWQgfHwgZGF0ZVJhbmdlVmFsaWQ7XG4gIH1cbn1cbiJdfQ==