UNPKG

ngx-pluto

Version:
501 lines 47.9 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, ViewEncapsulation, Input, ViewChild, Output, EventEmitter, ElementRef } from "@angular/core"; import * as moment_ from 'moment'; /** @type {?} */ var moment = moment_; import { NpDatePickerHeader } from "./date-picker-header"; import { NpDatePickerService } from "../date-picker.service"; import { TIME_FORMAT, DATE_FORMAT } from "../date-picker-const"; import { NpDatePickerFooter } from "./date-picker-footer"; import { NpTimePickerPanel } from "./time-picker-panel"; import { trigger, transition, style, animate } from "@angular/animations"; /** * Date picker popup组件 */ var NpDatePickerPopup = /** @class */ (function () { function NpDatePickerPopup(datePickerService, elementRef) { this.datePickerService = datePickerService; this.elementRef = elementRef; this.datePickerType = 'date-picker'; this.isShowTime = false; this.date = null; this.onDayClicked = new EventEmitter(); this.onDayMouseover = new EventEmitter(); this.onMonthClicked = new EventEmitter(); this.onYearClicked = new EventEmitter(); this.onTimeClicked = new EventEmitter(); this.onConfirmClicked = new EventEmitter(); this.onItemLabelClicked = new EventEmitter(); this.footerItems = []; this.selectedDate = null; this.isShowDaysPanel = true; this.isShowMonthsPanel = false; this.isShowYearsPanel = false; this.days = []; this.months = []; this.years = []; this.preDay = null; } /** * @return {?} */ NpDatePickerPopup.prototype.ngOnInit = /** * @return {?} */ function () { this.initMoment(); if (this.datePickerType === 'date-picker') { this.showPanel('days'); } else if (this.datePickerType === 'month-picker') { this.showPanel('months'); } else if (this.datePickerType === 'year-picker') { this.showPanel('years'); } else if (this.datePickerType === 'datetime-picker') { this.showPanel('days'); } this.buildPanel(); }; /** * @param {?} changes * @return {?} */ NpDatePickerPopup.prototype.ngOnChanges = /** * @param {?} changes * @return {?} */ function (changes) { /** @type {?} */ var date = (/** @type {?} */ (changes['date'].currentValue)); this.selectedDate = date ? date.clone() : null; }; /** * @param {?} time * @return {?} */ NpDatePickerPopup.prototype.onTimeLabelClicked = /** * @param {?} time * @return {?} */ function (time) { this.time = time; this.onTimeClicked.emit(this.time); }; /** * @param {?} time * @return {?} */ NpDatePickerPopup.prototype.onConfirmButtonClicked = /** * @param {?} time * @return {?} */ function (time) { this.time = time; this.onConfirmClicked.emit(this.time); }; /** * @param {?} item * @return {?} */ NpDatePickerPopup.prototype.onFooterItemLabelClicked = /** * @param {?} item * @return {?} */ function (item) { this.onItemLabelClicked.emit(item); }; /** * @param {?} day * @return {?} */ NpDatePickerPopup.prototype.onDayLabelClicked = /** * @param {?} day * @return {?} */ function (day) { if (day.isWeekDayMin) { return; } if (this.isShowTime) { day.date = moment(day.date.format(DATE_FORMAT) + ' ' + (this.time ? this.time : moment().format(TIME_FORMAT))); } this.showPanel('days'); this.buildPanel(day.date, day.date); this.initTimePicker(day.date); this.onDayClicked.emit(day); }; /** * @param {?} day * @return {?} */ NpDatePickerPopup.prototype.onDayLabelMouseover = /** * @param {?} day * @return {?} */ function (day) { if (this.preDay && this.preDay.date && day.date && this.preDay.date.format(DATE_FORMAT) !== day.date.format(DATE_FORMAT)) { this.onDayMouseover.emit(day); } this.preDay = tslib_1.__assign({}, day); }; /** * @param {?} month * @return {?} */ NpDatePickerPopup.prototype.onMonthLabelClicked = /** * @param {?} month * @return {?} */ function (month) { if (this.datePickerType === 'date-picker' || this.datePickerType === 'datetime-picker' || this.datePickerType === 'date-range-picker') { this.showPanel('days'); this.buildPanel(month.date, this.selectedDate); return; } if (this.datePickerType === 'month-picker') { this.onMonthClicked.emit(month); return; } }; /** * @param {?} year * @return {?} */ NpDatePickerPopup.prototype.onYearLabelClicked = /** * @param {?} year * @return {?} */ function (year) { if (this.datePickerType === 'date-picker' || this.datePickerType === 'datetime-picker' || this.datePickerType === 'date-range-picker') { this.showPanel('days'); this.buildPanel(year.date, this.selectedDate); return; } if (this.datePickerType === 'month-picker') { this.showPanel('months'); this.buildPanel(year.date, this.selectedDate); return; } if (this.datePickerType === 'year-picker') { this.onYearClicked.emit(year); return; } }; /** * @param {?} data * @return {?} */ NpDatePickerPopup.prototype.onYearInHeaderClicked = /** * @param {?} data * @return {?} */ function (data) { this.years = this.datePickerService.buildYearsPanel(data.date, data.year, this.selectedDate); this.showPanel('years'); }; /** * @return {?} */ NpDatePickerPopup.prototype.onMonthInHeaderClicked = /** * @return {?} */ function () { this.months = this.datePickerService.buildMonthsPanel(this.date, this.selectedDate); this.showPanel('months'); }; /** * @param {?} data * @return {?} */ NpDatePickerPopup.prototype.onArrowClicked = /** * @param {?} data * @return {?} */ function (data) { switch (data.arrowType) { case 'double-pre': if (this.isShowDaysPanel || this.isShowMonthsPanel) { this.date = this.date.add(-1, 'year').clone(); } else if (this.isShowYearsPanel) { this.date = this.date.add(-10, 'year').clone(); } break; case 'pre': if (this.isShowDaysPanel) { this.date = this.date.add(-1, 'month').clone(); } break; case 'next': if (this.isShowDaysPanel) { this.date = this.date.add(1, 'month').clone(); } break; case 'double-next': if (this.isShowDaysPanel || this.isShowMonthsPanel) { this.date = this.date.add(1, 'year').clone(); } else if (this.isShowYearsPanel) { this.date = this.date.add(10, 'year').clone(); } break; default: break; } this.buildPanel(); }; /** * @param {?=} date * @param {?=} selectedDate * @return {?} */ NpDatePickerPopup.prototype.buildPanel = /** * @param {?=} date * @param {?=} selectedDate * @return {?} */ function (date, selectedDate) { if (date === void 0) { date = this.date; } if (selectedDate === void 0) { selectedDate = null; } this.date = date && date.isValid() ? date.clone() : moment(); this.selectedDate = selectedDate ? selectedDate.clone() : this.selectedDate; if (this.isShowDaysPanel) { this.days = this.datePickerService.buildDaysPanel(this.date, this.selectedDate); this.nowDay = moment(); return; } if (this.isShowMonthsPanel) { this.months = this.datePickerService.buildMonthsPanel(this.date, this.selectedDate); return; } if (this.isShowYearsPanel) { this.years = this.datePickerService.buildYearsPanel(this.date, this.date.format('YYYY'), this.selectedDate); return; } }; /** * @param {?} hoverDate * @param {?=} dates * @return {?} */ NpDatePickerPopup.prototype.buildPanelForRangePicker = /** * @param {?} hoverDate * @param {?=} dates * @return {?} */ function (hoverDate, dates) { if (dates === void 0) { dates = []; } if (this.isShowDaysPanel) { this.days = this.datePickerService.buildDaysPanelForRangePicker(this.date, this.selectedDate, hoverDate, dates); this.nowDay = moment(); } }; /** * @private * @return {?} */ NpDatePickerPopup.prototype.initMoment = /** * @private * @return {?} */ function () { if (this.date && this.date.isValid()) { this.selectedDate = this.date.clone(); this.initTimePicker(this.selectedDate); } else { this.selectedDate = null; this.date = moment(); } }; /** * @private * @param {?} date * @return {?} */ NpDatePickerPopup.prototype.initTimePicker = /** * @private * @param {?} date * @return {?} */ function (date) { var _this = this; if (this.datePickerType === 'datetime-picker') { this.time = date.format(TIME_FORMAT); if (this.timePickerPanel) { this.timePickerPanel.scrollTo(this.time); } else { setTimeout((/** * @return {?} */ function () { _this.timePickerPanel.scrollTo(_this.time); }), 0); } } }; /** * @private * @param {?} type * @return {?} */ NpDatePickerPopup.prototype.showPanel = /** * @private * @param {?} type * @return {?} */ function (type) { switch (type) { case 'days': this.isShowDaysPanel = true; this.isShowMonthsPanel = false; this.isShowYearsPanel = false; if (this.datePickerHeader) { this.datePickerHeader.isYearLabelRanged = false; this.datePickerHeader.isShowMonthLabel = true; this.datePickerHeader.isShowPreBtn = true; } break; case 'months': this.isShowDaysPanel = false; this.isShowMonthsPanel = true; this.isShowYearsPanel = false; if (this.datePickerHeader) { this.datePickerHeader.isYearLabelRanged = false; this.datePickerHeader.isShowMonthLabel = false; this.datePickerHeader.isShowPreBtn = false; } break; case 'years': this.isShowDaysPanel = false; this.isShowMonthsPanel = false; this.isShowYearsPanel = true; if (this.datePickerHeader) { this.datePickerHeader.isYearLabelRanged = true; this.datePickerHeader.isShowMonthLabel = false; this.datePickerHeader.isShowPreBtn = false; } break; default: this.isShowDaysPanel = true; this.isShowMonthsPanel = false; this.isShowYearsPanel = false; break; } }; NpDatePickerPopup.decorators = [ { type: Component, args: [{ selector: "np-date-picker-popup", template: "<div @date-picker-animations class=\"np-date-picker-popup-wrapper flex-wrap row-flex\">\r\n <div class=\"date-wrapper flex-wrap col-flex\">\r\n <np-date-picker-header #datePickerHeader [date]=\"date\" (onYearClicked)=\"onYearInHeaderClicked($event)\"\r\n (onMonthClicked)=\"onMonthInHeaderClicked()\" (onArrowClicked)=\"onArrowClicked($event)\">\r\n </np-date-picker-header>\r\n <div class=\"date-picker-body\">\r\n <!-- \u65E5\u671F\u9762\u677F -->\r\n <ng-container *ngIf=\"isShowDaysPanel\">\r\n <div class=\"days-panel flex-wrap row-flex wrap\">\r\n <span #dayLabel class=\"day flex-wrap col-flex\" [ngClass]=\"{\r\n 'now-day': nowDay.format('YYYYMMDD') === (day.date && day.date.format('YYYYMMDD')), \r\n 'selected-day': day.isSelected, \r\n 'non-available-day': !day.available && !day.isWeekDayMin,\r\n 'within-hover': day.hoverDateType === 'within-hover' && day.available,\r\n 'within-selected': day.hoverDateType === 'within-selected' && day.available,\r\n 'within-selected-hover': day.hoverDateType === 'within-selected-hover' && day.available\r\n }\" *ngFor=\"let day of days\" (click)=\"onDayLabelClicked(day)\"\r\n (mouseover)=\"onDayLabelMouseover(day)\">{{ day.value }}</span>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- \u6708\u4EFD\u9762\u677F -->\r\n <ng-container *ngIf=\"isShowMonthsPanel\">\r\n <div class=\"months-panel flex-wrap row-flex wrap\">\r\n <span class=\"month flex-wrap col-flex\" [ngClass]=\"{'selected-month': month.isSelected}\"\r\n *ngFor=\"let month of months\" (click)=\"onMonthLabelClicked(month)\">{{ month.value }}</span>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- \u5E74\u4EFD\u9762\u677F -->\r\n <ng-container *ngIf=\"isShowYearsPanel\">\r\n <div class=\"years-panel flex-wrap row-flex wrap\">\r\n <span class=\"year flex-wrap col-flex\"\r\n [ngClass]=\"{'selected-year': year.isSelected, 'non-available-year': !year.available}\"\r\n *ngFor=\"let year of years\" (click)=\"onYearLabelClicked(year)\">{{ year.value }}</span>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <np-date-picker-footer\r\n *ngIf=\"datePickerType === 'date-picker' || datePickerType === 'datetime-picker' || datePickerType === 'date-range-picker'\"\r\n [datePickerType]=\"datePickerType\" [footerItems]=\"footerItems\"\r\n (onItemLabelClicked)=\"onFooterItemLabelClicked($event)\">\r\n </np-date-picker-footer>\r\n </div>\r\n <np-time-picker-panel #timePickerPanel *ngIf=\"isShowTime\" [time]=\"time\" [confirmButtonText]=\"confirmButtonText\"\r\n (onTimeClicked)=\"onTimeLabelClicked($event)\" (onConfirmClicked)=\"onConfirmButtonClicked($event)\">\r\n </np-time-picker-panel>\r\n</div>\r\n", encapsulation: ViewEncapsulation.None, animations: [trigger('date-picker-animations', [ transition(':enter', [ style({ opacity: 0 }), animate(300, style({ opacity: 1 })), ]), transition(':leave', [ animate(300, style({ opacity: 0 })), ]), ])], styles: [".np-date-picker-popup-wrapper .date-wrapper{width:280px}.np-date-picker-popup-wrapper .date-wrapper .date-picker-body .days-panel{justify-content:center;align-items:center;padding:10px 0}.np-date-picker-popup-wrapper .date-wrapper .date-picker-body .days-panel>.day{justify-content:center;align-items:center;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:26px;height:24px;line-height:24px;margin:3px 5px;box-sizing:border-box}.np-date-picker-popup-wrapper .date-wrapper .date-picker-body .months-panel,.np-date-picker-popup-wrapper .date-wrapper .date-picker-body .years-panel{justify-content:center;align-items:center;padding:10px 0}.np-date-picker-popup-wrapper .date-wrapper .date-picker-body .months-panel>.month,.np-date-picker-popup-wrapper .date-wrapper .date-picker-body .months-panel>.year,.np-date-picker-popup-wrapper .date-wrapper .date-picker-body .years-panel>.month,.np-date-picker-popup-wrapper .date-wrapper .date-picker-body .years-panel>.year{justify-content:center;align-items:center;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:60px;height:24px;line-height:66px;margin:22px 14px}"] }] } ]; /** @nocollapse */ NpDatePickerPopup.ctorParameters = function () { return [ { type: NpDatePickerService }, { type: ElementRef } ]; }; NpDatePickerPopup.propDecorators = { date: [{ type: Input }], onDayClicked: [{ type: Output }], onDayMouseover: [{ type: Output }], onMonthClicked: [{ type: Output }], onYearClicked: [{ type: Output }], onTimeClicked: [{ type: Output }], onConfirmClicked: [{ type: Output }], onItemLabelClicked: [{ type: Output }], footerItems: [{ type: Input }], confirmButtonText: [{ type: Input }], datePickerHeader: [{ type: ViewChild, args: ['datePickerHeader',] }], datePickerFooter: [{ type: ViewChild, args: ['datePickerFooter',] }], timePickerPanel: [{ type: ViewChild, args: ['timePickerPanel',] }], dayLabel: [{ type: ViewChild, args: ['dayLabel',] }] }; return NpDatePickerPopup; }()); export { NpDatePickerPopup }; if (false) { /** @type {?} */ NpDatePickerPopup.prototype.datePickerType; /** @type {?} */ NpDatePickerPopup.prototype.isShowTime; /** @type {?} */ NpDatePickerPopup.prototype.date; /** @type {?} */ NpDatePickerPopup.prototype.onDayClicked; /** @type {?} */ NpDatePickerPopup.prototype.onDayMouseover; /** @type {?} */ NpDatePickerPopup.prototype.onMonthClicked; /** @type {?} */ NpDatePickerPopup.prototype.onYearClicked; /** @type {?} */ NpDatePickerPopup.prototype.onTimeClicked; /** @type {?} */ NpDatePickerPopup.prototype.onConfirmClicked; /** @type {?} */ NpDatePickerPopup.prototype.onItemLabelClicked; /** @type {?} */ NpDatePickerPopup.prototype.footerItems; /** @type {?} */ NpDatePickerPopup.prototype.confirmButtonText; /** @type {?} */ NpDatePickerPopup.prototype.datePickerHeader; /** @type {?} */ NpDatePickerPopup.prototype.datePickerFooter; /** @type {?} */ NpDatePickerPopup.prototype.timePickerPanel; /** @type {?} */ NpDatePickerPopup.prototype.dayLabel; /** @type {?} */ NpDatePickerPopup.prototype.selectedDate; /** @type {?} */ NpDatePickerPopup.prototype.isShowDaysPanel; /** @type {?} */ NpDatePickerPopup.prototype.isShowMonthsPanel; /** @type {?} */ NpDatePickerPopup.prototype.isShowYearsPanel; /** @type {?} */ NpDatePickerPopup.prototype.days; /** @type {?} */ NpDatePickerPopup.prototype.months; /** @type {?} */ NpDatePickerPopup.prototype.years; /** @type {?} */ NpDatePickerPopup.prototype.nowDay; /** * 传入到时间面板的当前时间,格式为‘HH:mm:ss’ * @type {?} */ NpDatePickerPopup.prototype.time; /** * @type {?} * @private */ NpDatePickerPopup.prototype.preDay; /** * @type {?} * @private */ NpDatePickerPopup.prototype.datePickerService; /** @type {?} */ NpDatePickerPopup.prototype.elementRef; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1waWNrZXItcG9wdXAuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtcGx1dG8vIiwic291cmNlcyI6WyJsaWIvZGF0ZS1waWNrZXIvY29tcG9uZW50cy9kYXRlLXBpY2tlci1wb3B1cC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQVUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQWlCLFlBQVksRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEksT0FBTyxLQUFLLE9BQU8sTUFBTSxRQUFRLENBQUM7O0lBQU8sTUFBTSxHQUFHLE9BQU87QUFDekQsT0FBTyxFQUFhLGtCQUFrQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDckUsT0FBTyxFQUF3QyxtQkFBbUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRW5HLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDaEUsT0FBTyxFQUF3QixrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2hGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7OztBQUsxRTtJQWlERSwyQkFBb0IsaUJBQXNDLEVBQ2pELFVBQXNCO1FBRFgsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFxQjtRQUNqRCxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBakMvQixtQkFBYyxHQUFtQixhQUFhLENBQUM7UUFDL0MsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUVuQixTQUFJLEdBQW1CLElBQUksQ0FBQztRQUUzQixpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFtQixDQUFDO1FBQ25ELG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQW1CLENBQUM7UUFDckQsbUJBQWMs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cHN1bGF0aW9uLCBPbkluaXQsIElucHV0LCBWaWV3Q2hpbGQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgRXZlbnRFbWl0dGVyLCBFbGVtZW50UmVmIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0ICogYXMgbW9tZW50XyBmcm9tICdtb21lbnQnOyBjb25zdCBtb21lbnQgPSBtb21lbnRfXHJcbmltcG9ydCB7IEFycm93VHlwZSwgTnBEYXRlUGlja2VySGVhZGVyIH0gZnJvbSBcIi4vZGF0ZS1waWNrZXItaGVhZGVyXCI7XHJcbmltcG9ydCB7IERheURhdGFQZXJNb250aCwgTW9udGhEYXRhLCBZZWFyRGF0YSwgTnBEYXRlUGlja2VyU2VydmljZSB9IGZyb20gXCIuLi9kYXRlLXBpY2tlci5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IE5vdGlmeVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2hhcmVkL3NlcnZpY2VzL25vdGlmeS5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFRJTUVfRk9STUFULCBEQVRFX0ZPUk1BVCB9IGZyb20gXCIuLi9kYXRlLXBpY2tlci1jb25zdFwiO1xyXG5pbXBvcnQgeyBEYXRlUGlja2VyRm9vdGVySXRlbSwgTnBEYXRlUGlja2VyRm9vdGVyIH0gZnJvbSBcIi4vZGF0ZS1waWNrZXItZm9vdGVyXCI7XHJcbmltcG9ydCB7IE5wVGltZVBpY2tlclBhbmVsIH0gZnJvbSBcIi4vdGltZS1waWNrZXItcGFuZWxcIjtcclxuaW1wb3J0IHsgdHJpZ2dlciwgdHJhbnNpdGlvbiwgc3R5bGUsIGFuaW1hdGUgfSBmcm9tIFwiQGFuZ3VsYXIvYW5pbWF0aW9uc1wiO1xyXG5cclxuLyoqXHJcbiAqIERhdGUgcGlja2VyIHBvcHVw57uE5Lu2XHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogYG5wLWRhdGUtcGlja2VyLXBvcHVwYCxcclxuICB0ZW1wbGF0ZVVybDogJ2RhdGUtcGlja2VyLXBvcHVwLmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWydkYXRlLXBpY2tlci1wb3B1cC5zY3NzJ10sXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxuICBhbmltYXRpb25zOiBbdHJpZ2dlcignZGF0ZS1waWNrZXItYW5pbWF0aW9ucycsIFtcclxuICAgIHRyYW5zaXRpb24oJzplbnRlcicsIFtcclxuICAgICAgc3R5bGUoeyBvcGFjaXR5OiAwIH0pLFxyXG4gICAgICBhbmltYXRlKDMwMCwgc3R5bGUoeyBvcGFjaXR5OiAxIH0pKSxcclxuICAgIF0pLFxyXG4gICAgdHJhbnNpdGlvbignOmxlYXZlJywgW1xyXG4gICAgICBhbmltYXRlKDMwMCwgc3R5bGUoeyBvcGFjaXR5OiAwIH0pKSxcclxuICAgIF0pLFxyXG4gIF0pXVxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIE5wRGF0ZVBpY2tlclBvcHVwIGltcGxlbWVudHMgT25Jbml0IHtcclxuICBkYXRlUGlja2VyVHlwZTogRGF0ZVBpY2tlclR5cGUgPSAnZGF0ZS1waWNrZXInO1xyXG4gIGlzU2hvd1RpbWU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkgZGF0ZTogbW9tZW50Xy5Nb21lbnQgPSBudWxsO1xyXG5cclxuICBAT3V0cHV0KCkgb25EYXlDbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcjxEYXlEYXRhUGVyTW9udGg+KCk7XHJcbiAgQE91dHB1dCgpIG9uRGF5TW91c2VvdmVyID0gbmV3IEV2ZW50RW1pdHRlcjxEYXlEYXRhUGVyTW9udGg+KCk7XHJcbiAgQE91dHB1dCgpIG9uTW9udGhDbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcjxNb250aERhdGE+KCk7XHJcbiAgQE91dHB1dCgpIG9uWWVhckNsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFllYXJEYXRhPigpO1xyXG4gIEBPdXRwdXQoKSBvblRpbWVDbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcbiAgQE91dHB1dCgpIG9uQ29uZmlybUNsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuICBAT3V0cHV0KCkgb25JdGVtTGFiZWxDbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlUGlja2VyRm9vdGVySXRlbT4oKTtcclxuICBASW5wdXQoKSBmb290ZXJJdGVtczogRGF0ZVBpY2tlckZvb3Rlckl0ZW1bXSA9IFtdO1xyXG4gIEBJbnB1dCgpIGNvbmZpcm1CdXR0b25UZXh0OiBzdHJpbmc7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2RhdGVQaWNrZXJIZWFkZXInKSBkYXRlUGlja2VySGVhZGVyOiBOcERhdGVQaWNrZXJIZWFkZXI7XHJcbiAgQFZpZXdDaGlsZCgnZGF0ZVBpY2tlckZvb3RlcicpIGRhdGVQaWNrZXJGb290ZXI6IE5wRGF0ZVBpY2tlckZvb3RlcjtcclxuICBAVmlld0NoaWxkKCd0aW1lUGlja2VyUGFuZWwnKSB0aW1lUGlja2VyUGFuZWw6IE5wVGltZVBpY2tlclBhbmVsO1xyXG4gIEBWaWV3Q2hpbGQoJ2RheUxhYmVsJykgZGF5TGFiZWw6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xyXG5cclxuICBzZWxlY3RlZERhdGU6IG1vbWVudF8uTW9tZW50ID0gbnVsbDtcclxuICBpc1Nob3dEYXlzUGFuZWw6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIGlzU2hvd01vbnRoc1BhbmVsOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNTaG93WWVhcnNQYW5lbDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBkYXlzOiBBcnJheTxEYXlEYXRhUGVyTW9udGg+ID0gW107XHJcbiAgbW9udGhzOiBBcnJheTxNb250aERhdGE+ID0gW107XHJcbiAgeWVhcnM6IEFycmF5PFllYXJEYXRhPiA9IFtdO1xyXG4gIG5vd0RheTogbW9tZW50Xy5Nb21lbnQ7XHJcbiAgLyoq5Lyg5YWl5Yiw5pe26Ze06Z2i5p2/55qE5b2T5YmN5pe26Ze077yM5qC85byP5Li64oCYSEg6bW06c3PigJkgKi9cclxuICB0aW1lOiBzdHJpbmc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZGF0ZVBpY2tlclNlcnZpY2U6IE5wRGF0ZVBpY2tlclNlcnZpY2UsXHJcbiAgICBwdWJsaWMgZWxlbWVudFJlZjogRWxlbWVudFJlZikgeyB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5pbml0TW9tZW50KCk7XHJcbiAgICBpZiAodGhpcy5kYXRlUGlja2VyVHlwZSA9PT0gJ2RhdGUtcGlja2VyJykge1xyXG4gICAgICB0aGlzLnNob3dQYW5lbCgnZGF5cycpO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmRhdGVQaWNrZXJUeXBlID09PSAnbW9udGgtcGlja2VyJykge1xyXG4gICAgICB0aGlzLnNob3dQYW5lbCgnbW9udGhzJyk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuZGF0ZVBpY2tlclR5cGUgPT09ICd5ZWFyLXBpY2tlcicpIHtcclxuICAgICAgdGhpcy5zaG93UGFuZWwoJ3llYXJzJyk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuZGF0ZVBpY2tlclR5cGUgPT09ICdkYXRldGltZS1waWNrZXInKSB7XHJcbiAgICAgIHRoaXMuc2hvd1BhbmVsKCdkYXlzJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5idWlsZFBhbmVsKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBjb25zdCBkYXRlOiBtb21lbnRfLk1vbWVudCA9IGNoYW5nZXNbJ2RhdGUnXS5jdXJyZW50VmFsdWUgYXMgbW9tZW50Xy5Nb21lbnQ7XHJcbiAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IGRhdGUgPyBkYXRlLmNsb25lKCkgOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgb25UaW1lTGFiZWxDbGlja2VkKHRpbWU6IHN0cmluZykge1xyXG4gICAgdGhpcy50aW1lID0gdGltZTtcclxuICAgIHRoaXMub25UaW1lQ2xpY2tlZC5lbWl0KHRoaXMudGltZSk7XHJcbiAgfVxyXG5cclxuICBvbkNvbmZpcm1CdXR0b25DbGlja2VkKHRpbWU6IHN0cmluZykge1xyXG4gICAgdGhpcy50aW1lID0gdGltZTtcclxuICAgIHRoaXMub25Db25maXJtQ2xpY2tlZC5lbWl0KHRoaXMudGltZSk7XHJcbiAgfVxyXG5cclxuICBvbkZvb3Rlckl0ZW1MYWJlbENsaWNrZWQoaXRlbTogRGF0ZVBpY2tlckZvb3Rlckl0ZW0pIHtcclxuICAgIHRoaXMub25JdGVtTGFiZWxDbGlja2VkLmVtaXQoaXRlbSk7XHJcbiAgfVxyXG5cclxuICBvbkRheUxhYmVsQ2xpY2tlZChkYXk6IERheURhdGFQZXJNb250aCkge1xyXG4gICAgaWYgKGRheS5pc1dlZWtEYXlNaW4pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmlzU2hvd1RpbWUpIHtcclxuICAgICAgZGF5LmRhdGUgPSBtb21lbnQoZGF5LmRhdGUuZm9ybWF0KERBVEVfRk9STUFUKSArICcgJyArICh0aGlzLnRpbWUgPyB0aGlzLnRpbWUgOiBtb21lbnQoKS5mb3JtYXQoVElNRV9GT1JNQVQpKSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zaG93UGFuZWwoJ2RheXMnKTtcclxuICAgIHRoaXMuYnVpbGRQYW5lbChkYXkuZGF0ZSwgZGF5LmRhdGUpO1xyXG4gICAgdGhpcy5pbml0VGltZVBpY2tlcihkYXkuZGF0ZSk7XHJcbiAgICB0aGlzLm9uRGF5Q2xpY2tlZC5lbWl0KGRheSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHByZURheTogRGF5RGF0YVBlck1vbnRoID0gbnVsbDtcclxuICBvbkRheUxhYmVsTW91c2VvdmVyKGRheTogRGF5RGF0YVBlck1vbnRoKSB7XHJcblxyXG4gICAgaWYgKHRoaXMucHJlRGF5ICYmIHRoaXMucHJlRGF5LmRhdGUgJiYgZGF5LmRhdGUgJiYgdGhpcy5wcmVEYXkuZGF0ZS5mb3JtYXQoREFURV9GT1JNQVQpICE9PSBkYXkuZGF0ZS5mb3JtYXQoREFURV9GT1JNQVQpKSB7XHJcbiAgICAgIHRoaXMub25EYXlNb3VzZW92ZXIuZW1pdChkYXkpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucHJlRGF5ID0geyAuLi5kYXkgfTtcclxuICB9XHJcblxyXG4gIG9uTW9udGhMYWJlbENsaWNrZWQobW9udGg6IE1vbnRoRGF0YSkge1xyXG4gICAgaWYgKHRoaXMuZGF0ZVBpY2tlclR5cGUgPT09ICdkYXRlLXBpY2tlcicgfHwgdGhpcy5kYXRlUGlja2VyVHlwZSA9PT0gJ2RhdGV0aW1lLXBpY2tlcicgfHwgdGhpcy5kYXRlUGlja2VyVHlwZSA9PT0gJ2RhdGUtcmFuZ2UtcGlja2VyJykge1xyXG4gICAgICB0aGlzLnNob3dQYW5lbCgnZGF5cycpO1xyXG4gICAgICB0aGlzLmJ1aWxkUGFuZWwobW9udGguZGF0ZSwgdGhpcy5zZWxlY3RlZERhdGUpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZGF0ZVBpY2tlclR5cGUgPT09ICdtb250aC1waWNrZXInKSB7XHJcbiAgICAgIHRoaXMub25Nb250aENsaWNrZWQuZW1pdChtb250aCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uWWVhckxhYmVsQ2xpY2tlZCh5ZWFyOiBZZWFyRGF0YSkge1xyXG4gICAgaWYgKHRoaXMuZGF0ZVBpY2tlclR5cGUgPT09ICdkYXRlLXBpY2tlcicgfHwgdGhpcy5kYXRlUGlja2VyVHlwZSA9PT0gJ2RhdGV0aW1lLXBpY2tlcicgfHwgdGhpcy5kYXRlUGlja2VyVHlwZSA9PT0gJ2RhdGUtcmFuZ2UtcGlja2VyJykge1xyXG4gICAgICB0aGlzLnNob3dQYW5lbCgnZGF5cycpO1xyXG4gICAgICB0aGlzLmJ1aWxkUGFuZWwoeWVhci5kYXRlLCB0aGlzLnNlbGVjdGVkRGF0ZSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5kYXRlUGlja2VyVHlwZSA9PT0gJ21vbnRoLXBpY2tlcicpIHtcclxuICAgICAgdGhpcy5zaG93UGFuZWwoJ21vbnRocycpO1xyXG4gICAgICB0aGlzLmJ1aWxkUGFuZWwoeWVhci5kYXRlLCB0aGlzLnNlbGVjdGVkRGF0ZSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5kYXRlUGlja2VyVHlwZSA9PT0gJ3llYXItcGlja2VyJykge1xyXG4gICAgICB0aGlzLm9uWWVhckNsaWNrZWQuZW1pdCh5ZWFyKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25ZZWFySW5IZWFkZXJDbGlja2VkKGRhdGE6IHsgZGF0ZTogbW9tZW50Xy5Nb21lbnQsIHllYXI6IHN0cmluZywgcmFuZ2VzOiBBcnJheTxudW1iZXI+IH0pIHtcclxuICAgIHRoaXMueWVhcnMgPSB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLmJ1aWxkWWVhcnNQYW5lbChkYXRhLmRhdGUsIGRhdGEueWVhciwgdGhpcy5zZWxlY3RlZERhdGUpO1xyXG4gICAgdGhpcy5zaG93UGFuZWwoJ3llYXJzJyk7XHJcbiAgfVxyXG5cclxuICBvbk1vbnRoSW5IZWFkZXJDbGlja2VkKCkge1xyXG4gICAgdGhpcy5tb250aHMgPSB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLmJ1aWxkTW9udGhzUGFuZWwodGhpcy5kYXRlLCB0aGlzLnNlbGVjdGVkRGF0ZSk7XHJcbiAgICB0aGlzLnNob3dQYW5lbCgnbW9udGhzJyk7XHJcbiAgfVxyXG5cclxuICBvbkFycm93Q2xpY2tlZChkYXRhOiB7IGFycm93VHlwZTogQXJyb3dUeXBlLCBkYXRlOiBtb21lbnRfLk1vbWVudCB9KSB7XHJcbiAgICBzd2l0Y2ggKGRhdGEuYXJyb3dUeXBlKSB7XHJcbiAgICAgIGNhc2UgJ2RvdWJsZS1wcmUnOlxyXG4gICAgICAgIGlmICh0aGlzLmlzU2hvd0RheXNQYW5lbCB8fCB0aGlzLmlzU2hvd01vbnRoc1BhbmVsKSB7XHJcbiAgICAgICAgICB0aGlzLmRhdGUgPSB0aGlzLmRhdGUuYWRkKC0xLCAneWVhcicpLmNsb25lKCk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzU2hvd1llYXJzUGFuZWwpIHtcclxuICAgICAgICAgIHRoaXMuZGF0ZSA9IHRoaXMuZGF0ZS5hZGQoLTEwLCAneWVhcicpLmNsb25lKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAncHJlJzpcclxuICAgICAgICBpZiAodGhpcy5pc1Nob3dEYXlzUGFuZWwpIHtcclxuICAgICAgICAgIHRoaXMuZGF0ZSA9IHRoaXMuZGF0ZS5hZGQoLTEsICdtb250aCcpLmNsb25lKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnbmV4dCc6XHJcbiAgICAgICAgaWYgKHRoaXMuaXNTaG93RGF5c1BhbmVsKSB7XHJcbiAgICAgICAgICB0aGlzLmRhdGUgPSB0aGlzLmRhdGUuYWRkKDEsICdtb250aCcpLmNsb25lKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnZG91YmxlLW5leHQnOlxyXG4gICAgICAgIGlmICh0aGlzLmlzU2hvd0RheXNQYW5lbCB8fCB0aGlzLmlzU2hvd01vbnRoc1BhbmVsKSB7XHJcbiAgICAgICAgICB0aGlzLmRhdGUgPSB0aGlzLmRhdGUuYWRkKDEsICd5ZWFyJykuY2xvbmUoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNTaG93WWVhcnNQYW5lbCkge1xyXG4gICAgICAgICAgdGhpcy5kYXRlID0gdGhpcy5kYXRlLmFkZCgxMCwgJ3llYXInKS5jbG9uZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYnVpbGRQYW5lbCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGJ1aWxkUGFuZWwoZGF0ZTogbW9tZW50Xy5Nb21lbnQgPSB0aGlzLmRhdGUsIHNlbGVjdGVkRGF0ZTogbW9tZW50Xy5Nb21lbnQgPSBudWxsKSB7XHJcbiAgICB0aGlzLmRhdGUgPSBkYXRlICYmIGRhdGUuaXNWYWxpZCgpID8gZGF0ZS5jbG9uZSgpIDogbW9tZW50KCk7XHJcbiAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IHNlbGVjdGVkRGF0ZSA/IHNlbGVjdGVkRGF0ZS5jbG9uZSgpIDogdGhpcy5zZWxlY3RlZERhdGU7XHJcblxyXG4gICAgaWYgKHRoaXMuaXNTaG93RGF5c1BhbmVsKSB7XHJcbiAgICAgIHRoaXMuZGF5cyA9IHRoaXMuZGF0ZVBpY2tlclNlcnZpY2UuYnVpbGREYXlzUGFuZWwodGhpcy5kYXRlLCB0aGlzLnNlbGVjdGVkRGF0ZSk7XHJcblxyXG4gICAgICB0aGlzLm5vd0RheSA9IG1vbWVudCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuaXNTaG93TW9udGhzUGFuZWwpIHtcclxuICAgICAgdGhpcy5tb250aHMgPSB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLmJ1aWxkTW9udGhzUGFuZWwodGhpcy5kYXRlLCB0aGlzLnNlbGVjdGVkRGF0ZSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5pc1Nob3dZZWFyc1BhbmVsKSB7XHJcbiAgICAgIHRoaXMueWVhcnMgPSB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLmJ1aWxkWWVhcnNQYW5lbCh0aGlzLmRhdGUsIHRoaXMuZGF0ZS5mb3JtYXQoJ1lZWVknKSwgdGhpcy5zZWxlY3RlZERhdGUpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYnVpbGRQYW5lbEZvclJhbmdlUGlja2VyKGhvdmVyRGF0ZTogbW9tZW50Xy5Nb21lbnQsIGRhdGVzOiBBcnJheTxtb21lbnRfLk1vbWVudD4gPSBbXSkge1xyXG5cclxuICAgIGlmICh0aGlzLmlzU2hvd0RheXNQYW5lbCkge1xyXG4gICAgICB0aGlzLmRheXMgPSB0aGlzLmRhdGVQaWNrZXJTZXJ2aWNlLmJ1aWxkRGF5c1BhbmVsRm9yUmFuZ2VQaWNrZXIodGhpcy5kYXRlLCB0aGlzLnNlbGVjdGVkRGF0ZSwgaG92ZXJEYXRlLCBkYXRlcyk7XHJcbiAgICAgIHRoaXMubm93RGF5ID0gbW9tZW50KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRNb21lbnQoKSB7XHJcbiAgICBpZiAodGhpcy5kYXRlICYmIHRoaXMuZGF0ZS5pc1ZhbGlkKCkpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZERhdGUgPSB0aGlzLmRhdGUuY2xvbmUoKTtcclxuICAgICAgdGhpcy5pbml0VGltZVBpY2tlcih0aGlzLnNlbGVjdGVkRGF0ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IG51bGw7XHJcbiAgICAgIHRoaXMuZGF0ZSA9IG1vbWVudCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0VGltZVBpY2tlcihkYXRlOiBtb21lbnRfLk1vbWVudCkge1xyXG4gICAgaWYgKHRoaXMuZGF0ZVBpY2tlclR5cGUgPT09ICdkYXRldGltZS1waWNrZXInKSB7XHJcbiAgICAgIHRoaXMudGltZSA9IGRhdGUuZm9ybWF0KFRJTUVfRk9STUFUKTtcclxuICAgICAgaWYgKHRoaXMudGltZVBpY2tlclBhbmVsKSB7XHJcbiAgICAgICAgdGhpcy50aW1lUGlja2VyUGFuZWwuc2Nyb2xsVG8odGhpcy50aW1lKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIHRoaXMudGltZVBpY2tlclBhbmVsLnNjcm9sbFRvKHRoaXMudGltZSk7XHJcbiAgICAgICAgfSwgMCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNob3dQYW5lbCh0eXBlOiAnZGF5cycgfCAnbW9udGhzJyB8ICd5ZWFycycpIHtcclxuICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICBjYXNlICdkYXlzJzpcclxuICAgICAgICB0aGlzLmlzU2hvd0RheXNQYW5lbCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5pc1Nob3dNb250aHNQYW5lbCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuaXNTaG93WWVhcnNQYW5lbCA9IGZhbHNlO1xyXG4gICAgICAgIGlmICh0aGlzLmRhdGVQaWNrZXJIZWFkZXIpIHtcclxuICAgICAgICAgIHRoaXMuZGF0ZVBpY2tlckhlYWRlci5pc1llYXJMYWJlbFJhbmdlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5kYXRlUGlja2VySGVhZGVyLmlzU2hvd01vbnRoTGFiZWwgPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy5kYXRlUGlja2VySGVhZGVyLmlzU2hvd1ByZUJ0biA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdtb250aHMnOlxyXG4gICAgICAgIHRoaXMuaXNTaG93RGF5c1BhbmVsID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pc1Nob3dNb250aHNQYW5lbCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5pc1Nob3dZZWFyc1BhbmVsID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRoaXMuZGF0ZVBpY2tlckhlYWRlcikge1xyXG4gICAgICAgICAgdGhpcy5kYXRlUGlja2VySGVhZGVyLmlzWWVhckxhYmVsUmFuZ2VkID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmRhdGVQaWNrZXJIZWFkZXIuaXNTaG93TW9udGhMYWJlbCA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5kYXRlUGlja2VySGVhZGVyLmlzU2hvd1ByZUJ0biA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAneWVhcnMnOlxyXG4gICAgICAgIHRoaXMuaXNTaG93RGF5c1BhbmVsID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pc1Nob3dNb250aHNQYW5lbCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuaXNTaG93WWVhcnNQYW5lbCA9IHRydWU7XHJcbiAgICAgICAgaWYgKHRoaXMuZGF0ZVBpY2tlckhlYWRlcikge1xyXG4gICAgICAgICAgdGhpcy5kYXRlUGlja2VySGVhZGVyLmlzWWVhckxhYmVsUmFuZ2VkID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuZGF0ZVBpY2tlckhlYWRlci5pc1Nob3dNb250aExhYmVsID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmRhdGVQaWNrZXJIZWFkZXIuaXNTaG93UHJlQnRuID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHRoaXMuaXNTaG93RGF5c1BhbmVsID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmlzU2hvd01vbnRoc1BhbmVsID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pc1Nob3dZZWFyc1BhbmVsID0gZmFsc2U7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgdHlwZSBEYXRlUGlja2VyVHlwZSA9ICdkYXRlLXBpY2tlcicgfCAnZGF0ZXRpbWUtcGlja2VyJyB8ICd5ZWFyLXBpY2tlcicgfCAnbW9udGgtcGlja2VyJyB8ICdkYXRlLXJhbmdlLXBpY2tlcic7Il19