@hxui/angular
Version:
* * *
346 lines • 40.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
import { Component, Input, ChangeDetectorRef } from '@angular/core';
import { Subject } from 'rxjs/index';
import { Visibility } from '../enums';
import { DatepickerConfig } from './datepicker.config';
import * as moment_ from 'moment';
/** @type {?} */
var moment = moment_;
var DatepickerComponent = /** @class */ (function () {
function DatepickerComponent(_changeDetectionRef, datePickerConfig) {
this._changeDetectionRef = _changeDetectionRef;
this.datePickerConfig = datePickerConfig;
this.OpenDiv = true;
this.showCalendar = true;
this.activeVariable = true;
this.placement = 'bottom';
this.allowInterval = false;
this.selectedDueDateInterval = '0 day(s)';
this.visibilityEnum = Visibility;
this.visibility = Visibility.Hidden;
this.days = new Array();
this.week = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'];
this.cellCount = 41;
/**
* Subject for notifying that the calendar has been hidden from the view
*/
this._onHide = new Subject();
}
// Populates the days array with the current month, and completes the view with partial dates from sibling months
// Populates the days array with the current month, and completes the view with partial dates from sibling months
/**
* @return {?}
*/
DatepickerComponent.prototype.renderCalendar =
// Populates the days array with the current month, and completes the view with partial dates from sibling months
/**
* @return {?}
*/
function () {
for (var i = 0; i <= this.cellCount; i++) {
// date will be set to the first day of the month set in this.viewDate
/** @type {?} */
var date = new Date(this.viewDate.getFullYear(), this.viewDate.getMonth());
// Shifts the week to start from Monday, rather than Sunday, this causes the index to start at 1
/** @type {?} */
var dayOffset = date.getDay() === 0 ? 7 : date.getDay();
this.days[i] = new Date(date.setDate(2 - dayOffset + i));
}
};
/**
* @return {?}
*/
DatepickerComponent.prototype.previousMonth = /**
* @return {?}
*/
function () {
this.viewDate = new Date(this.viewDate.getFullYear(), this.viewDate.getMonth() - 1);
this.renderCalendar();
};
/**
* @return {?}
*/
DatepickerComponent.prototype.nextMonth = /**
* @return {?}
*/
function () {
this.viewDate = new Date(this.viewDate.getFullYear(), this.viewDate.getMonth() + 1);
this.renderCalendar();
};
/**
* @param {?} inputDate
* @return {?}
*/
DatepickerComponent.prototype.isCurrentMonth = /**
* @param {?} inputDate
* @return {?}
*/
function (inputDate) {
return inputDate.getMonth() === this.viewDate.getMonth();
};
/**
* @param {?} inputDate
* @return {?}
*/
DatepickerComponent.prototype.isCurrentDay = /**
* @param {?} inputDate
* @return {?}
*/
function (inputDate) {
return inputDate.getTime() === this.presentDate.getTime();
};
/**
* @param {?} inputDate
* @return {?}
*/
DatepickerComponent.prototype.isSelectedDay = /**
* @param {?} inputDate
* @return {?}
*/
function (inputDate) {
if (this.selectedDate) {
return inputDate.getTime() === this.selectedDate.getTime();
}
return false;
};
/**
* @param {?} inputDate
* @return {?}
*/
DatepickerComponent.prototype.isInvalidDay = /**
* @param {?} inputDate
* @return {?}
*/
function (inputDate) {
return this.validators.map(function (fn) { return fn(inputDate); }).reduce(function (prev, next) { return prev || next; }, false);
};
/**
* @param {?} date
* @return {?}
*/
DatepickerComponent.prototype.setSelectedDate = /**
* @param {?} date
* @return {?}
*/
function (date) {
if (!this.isInvalidDay(date)) {
this.selectedDate = date;
this.onDateSelected(date);
}
};
/**
* @param {?} changes
* @return {?}
*/
DatepickerComponent.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
if (!!changes.selectedDate.currentValue) {
this.viewDate = new Date(this.selectedDate.getFullYear(), this.selectedDate.getMonth());
}
};
/**
* @return {?}
*/
DatepickerComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
/** @type {?} */
var date = this.selectedDate ? this.selectedDate : new Date();
this.presentDate = new Date(date.getFullYear(), date.getMonth(), date.getDate());
this.viewDate = this.viewDate || new Date(date.getFullYear(), date.getMonth());
this.renderCalendar();
if (this.datePickerConfig.tabSelected === 'tab1') {
this.activeVariable1 = false;
this.activeVariable = true;
}
if (this.datePickerConfig.tabSelected === 'tab2') {
this.activeVariable1 = true;
this.activeVariable = false;
}
};
/**
* Shows the tooltip
* @param delay Amount of milliseconds to the delay showing the tooltip.
*/
/**
* Shows the tooltip
* @param {?} delay Amount of milliseconds to the delay showing the tooltip.
* @return {?}
*/
DatepickerComponent.prototype.show = /**
* Shows the tooltip
* @param {?} delay Amount of milliseconds to the delay showing the tooltip.
* @return {?}
*/
function (delay) {
var _this = this;
// Cancel the delayed hide if it is scheduled
if (this._hideTimeoutId) {
clearTimeout(this._hideTimeoutId);
}
this._showTimeoutId = window.setTimeout(function () {
// Schedule for change detection incase the tooltip is used within a
// component with OnPush change detection
_this._changeDetectionRef.markForCheck();
_this.visibility = Visibility.Visible;
}, delay);
if (this.allowInterval) {
this.OpenDiv = true;
this.showCalendar = false;
}
else {
this.OpenDiv = false;
this.showCalendar = true;
}
};
/**
* Hide the tooltip after the provided delay in ms.
* @param delay Amount of milliseconds to delay hiding the tooltip.
*/
/**
* Hide the tooltip after the provided delay in ms.
* @param {?} delay Amount of milliseconds to delay hiding the tooltip.
* @return {?}
*/
DatepickerComponent.prototype.hide = /**
* Hide the tooltip after the provided delay in ms.
* @param {?} delay Amount of milliseconds to delay hiding the tooltip.
* @return {?}
*/
function (delay) {
var _this = this;
// Cancel the delayed show if it is scheduled
if (this._showTimeoutId) {
clearTimeout(this._showTimeoutId);
}
this._hideTimeoutId = window.setTimeout(function () {
_this.visibility = Visibility.Hidden;
_this._onHide.next();
}, delay);
};
/** Returns an observable that notifies when the tooltip has been hidden from view. */
/**
* Returns an observable that notifies when the tooltip has been hidden from view.
* @return {?}
*/
DatepickerComponent.prototype.afterHidden = /**
* Returns an observable that notifies when the tooltip has been hidden from view.
* @return {?}
*/
function () {
return this._onHide.asObservable();
};
/**
* @return {?}
*/
DatepickerComponent.prototype.isVisible = /**
* @return {?}
*/
function () {
return this.visibility === Visibility.Visible;
};
/**
* @param {?} tabname
* @return {?}
*/
DatepickerComponent.prototype.onTabSelect = /**
* @param {?} tabname
* @return {?}
*/
function (tabname) {
if (tabname === 'tab1') {
this.datePickerConfig.tabSelected = tabname;
}
else {
this.datePickerConfig.tabSelected = tabname;
}
};
DatepickerComponent.decorators = [
{ type: Component, args: [{
selector: 'hxa-datepicker',
template: "<div class=\"hxui-reset\" *ngIf=\"OpenDiv\">\n <div class=\"hxa-tabs\">\n <hx-tabset class=\"hxa-tabset\">\n <hx-tab heading=\"Set interval\" (select)=\"onTabSelect('tab1')\" [active]=\"activeVariable\">\n <hxa-datepicker-interval></hxa-datepicker-interval>\n </hx-tab>\n <hx-tab heading=\"Specific date\" (select)=\"onTabSelect('tab2')\" [active]=\"activeVariable1\">\n <div class=\"hxui-reset\">\n <div class=\"hx-card hxa-datepicker-container\">\n <div class=\"hx-card-header hxa-datepicker-header\">\n <div class=\"hxa-datepicker-month\">\n <div class=\"hxa-datepicker-icon\" title=\"Previous Month\" (click)=\"previousMonth()\">\n <a class=\"hx-button is-transparent\"><i class=\"hx-icon icon-angle-left\"></i></a>\n </div>\n <div class=\"hxa-datepicker-month-title\">\n <span>{{viewDate.toLocaleString(\"en-au\", { month: \"long\", year: \"numeric\" })}}</span></div>\n <div class=\"hxa-datepicker-icon\" title=\"Next Month\" (click)=\"nextMonth()\">\n <a class=\"hx-button is-transparent\"><i class=\"hx-icon icon-angle-right\"></i></a>\n </div>\n </div>\n <div class=\"hxa-datepicker-week\">\n <div class=\"hxa-datepicker-weekday\" *ngFor=\"let weekday of week\">\n {{weekday | slice:0:3}}\n </div>\n </div>\n </div>\n <div class=\"hxa-datepicker-contents\">\n <div class=\"hxa-datepicker-day\" *ngFor=\"let day of days\"\n [ngClass]=\"{'hxa-datepicker-day-siblingmonth': !isCurrentMonth(day),\n 'hxa-datepicker-day-currentday': isCurrentDay(day),\n 'hxa-datepicker-day-selectedday': isSelectedDay(day),\n 'hxa-datepicker-day-invalidday': isInvalidDay(day)}\"\n (click)=\"setSelectedDate(day)\">\n <a class=\"hx-button is-transparent\">{{day.getDate()}}</a>\n </div>\n </div>\n </div>\n </div>\n </hx-tab>\n </hx-tabset>\n </div>\n</div>\n<div class=\"hxui-reset\" *ngIf=\"showCalendar\">\n <div class=\"hx-card hxa-datepicker-container\">\n <div class=\"hx-card-header hxa-datepicker-header\">\n <div class=\"hxa-datepicker-month\">\n <div class=\"hxa-datepicker-icon\" title=\"Previous Month\" (click)=\"previousMonth()\">\n <a class=\"hx-button is-transparent\"><i class=\"hx-icon icon-angle-left\"></i></a>\n </div>\n <div class=\"hxa-datepicker-month-title\">\n <span>{{viewDate.toLocaleString(\"en-au\", { month: \"long\", year: \"numeric\" })}}</span></div>\n <div class=\"hxa-datepicker-icon\" title=\"Next Month\" (click)=\"nextMonth()\">\n <a class=\"hx-button is-transparent\"><i class=\"hx-icon icon-angle-right\"></i></a>\n </div>\n </div>\n <div class=\"hxa-datepicker-week\">\n <div class=\"hxa-datepicker-weekday\" *ngFor=\"let weekday of week\">\n {{weekday | slice:0:3}}\n </div>\n </div>\n </div>\n <div class=\"hxa-datepicker-contents\">\n <div class=\"hxa-datepicker-day\" *ngFor=\"let day of days\"\n [ngClass]=\"{'hxa-datepicker-day-siblingmonth': !isCurrentMonth(day),\n 'hxa-datepicker-day-currentday': isCurrentDay(day),\n 'hxa-datepicker-day-selectedday': isSelectedDay(day),\n 'hxa-datepicker-day-invalidday': isInvalidDay(day)}\"\n (click)=\"setSelectedDate(day)\">\n <a class=\"hx-button is-transparent\">{{day.getDate()}}</a>\n </div>\n </div>\n </div>\n</div>\n\n",
styles: [".hxa-datepicker-container{max-width:19rem;width:19rem;height:21rem;display:flex;flex-direction:column;font-size:1rem}.hxa-datepicker-header{padding:.5rem .5rem 0;flex-direction:column;align-items:initial;justify-content:space-around;font-weight:100}.hxa-datepicker-icon{cursor:pointer;display:flex;flex:1;flex-direction:column;justify-content:center;align-items:center}.hxa-datepicker-icon .hx-button{position:initial!important;top:initial!important}.hxa-datepicker-icon .hx-button.is-transparent:hover{color:#000}.hxa-datepicker-icon .hx-icon{font-size:2em;position:initial!important;top:initial!important;color:#0d4d78}.hxa-datepicker-month{display:flex;text-align:center;margin-bottom:.5rem}.hxa-datepicker-month-title{font-size:1.25em;font-weight:400;flex:3;display:flex;justify-content:center;align-items:center;color:#0d4d78}.hxa-datepicker-week{display:flex;width:100%;text-align:center}.hxa-datepicker-weekday{flex:1;color:#0d4d78;font-size:.85em}.hxa-datepicker-contents{padding:.5rem;background-color:rgba(246,246,249,.5);display:flex;flex-flow:row wrap;flex:1;justify-content:space-around;align-content:space-around}.hxa-datepicker-day{flex:1 1 14%;height:16.666%;display:flex;justify-content:center;align-items:center}.hxa-datepicker-day .hx-button{position:initial;top:initial;flex:1;font-weight:400;height:100%;padding:0;color:#41b987}.hxa-datepicker-day-siblingmonth .hx-button{color:#3b3b3b;font-weight:100}.hxa-datepicker-day-selectedday .hx-button{color:#fff;background:#41b987}.hxa-datepicker-day-invalidday .hx-button{color:#e0e0e1!important;pointer-events:none}.hxa-datepicker-day-currentday .hx-button{border:2px solid #41b987}:host{max-width:24rem;border:1px solid #d3d3d3;background:#fff}:host .hxa-tabs ::ng-deep hx-tabset ::ng-deep ul{background-color:#fff;margin-bottom:0}:host .hxa-tabs ::ng-deep hx-tabset ::ng-deep ul ::ng-deep li{width:50%}:host .hxa-tabs ::ng-deep hx-tabset ::ng-deep ul ::ng-deep li a span{font-size:medium;margin:auto}:host .hxa-tabs ::ng-deep hx-tabset ::ng-deep .hx-tab-content{padding:0}"]
},] },
];
/** @nocollapse */
DatepickerComponent.ctorParameters = function () { return [
{ type: ChangeDetectorRef },
{ type: DatepickerConfig }
]; };
DatepickerComponent.propDecorators = {
selectedDate: [{ type: Input }],
validators: [{ type: Input }],
placement: [{ type: Input }],
allowInterval: [{ type: Input }],
selectedDueDateInterval: [{ type: Input }]
};
return DatepickerComponent;
}());
export { DatepickerComponent };
if (false) {
/** @type {?} */
DatepickerComponent.prototype.OpenDiv;
/** @type {?} */
DatepickerComponent.prototype.showCalendar;
/** @type {?} */
DatepickerComponent.prototype.tabname1;
/** @type {?} */
DatepickerComponent.prototype.activeVariable;
/** @type {?} */
DatepickerComponent.prototype.activeVariable1;
/** @type {?} */
DatepickerComponent.prototype.selectedDate;
/** @type {?} */
DatepickerComponent.prototype.validators;
/** @type {?} */
DatepickerComponent.prototype.placement;
/** @type {?} */
DatepickerComponent.prototype.allowInterval;
/** @type {?} */
DatepickerComponent.prototype.selectedDueDateInterval;
/** @type {?} */
DatepickerComponent.prototype.onDateSelected;
/** @type {?} */
DatepickerComponent.prototype.visibilityEnum;
/** @type {?} */
DatepickerComponent.prototype.visibility;
/** @type {?} */
DatepickerComponent.prototype.viewDate;
/** @type {?} */
DatepickerComponent.prototype.days;
/** @type {?} */
DatepickerComponent.prototype.week;
/** @type {?} */
DatepickerComponent.prototype.presentDate;
/** @type {?} */
DatepickerComponent.prototype.cellCount;
/** @type {?} */
DatepickerComponent.prototype._dp;
/**
* Subject for notifying that the calendar has been hidden from the view
* @type {?}
*/
DatepickerComponent.prototype._onHide;
/**
* The timeout ID of any current timer set to show the calendar
* @type {?}
*/
DatepickerComponent.prototype._showTimeoutId;
/**
* The timeout ID of any current timer set to hide the calendar
* @type {?}
*/
DatepickerComponent.prototype._hideTimeoutId;
/** @type {?} */
DatepickerComponent.prototype._changeDetectionRef;
/** @type {?} */
DatepickerComponent.prototype.datePickerConfig;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AaHh1aS9hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUNBLE9BQU8sRUFDTCxTQUFTLEVBQWtCLEtBQUssRUFDaEMsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBYSxPQUFPLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0MsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUNwQyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEtBQUssT0FBTyxNQUFNLFFBQVEsQ0FBQzs7SUFDNUIsTUFBTSxHQUFHLE9BQU87QUFFdEI7SUF1SEUsNkJBQW9CLG1CQUFzQyxFQUFVLGdCQUFrQztRQUFsRix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQW1CO1FBQVUscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQXZDL0YsWUFBTyxHQUFZLElBQUksQ0FBQztRQUN4QixpQkFBWSxHQUFZLElBQUksQ0FBQztRQUU3QixtQkFBYyxHQUFZLElBQUksQ0FBQztRQVV0QyxjQUFTLEdBQXdDLFFBQVEsQ0FBQztRQUcxRCxrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUd0Qiw0QkFBdUIsR0FBRyxVQUFVLENBQUM7UUFHckMsbUJBQWMsR0FBRyxVQUFVLENBQUM7UUFDNUIsZUFBVSxHQUFlLFVBQVUsQ0FBQyxNQUFNLENBQUM7UUFFM0MsU0FBSSxHQUFnQixJQUFJLEtBQUssRUFBUSxDQUFDO1FBQ3RDLFNBQUksR0FBa0IsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUU3RixjQUFTLEdBQUcsRUFBRSxDQUFDOzs7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aEQsQ0FBQzs7Ozs7SUFDRCx5Q0FBVzs7OztJQUFYLFVBQVksT0FBZTtRQUN4QixJQUFJLE9BQU8sS0FBSyxNQUFNLEVBQUU7WUFDdkIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUM7U0FDNUM7YUFBTTtZQUNOLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDO1NBQzVDO0lBQ0gsQ0FBQzs7Z0JBeFBILFNBQVMsU0FBQztvQkFDVCxRQUFRLEVBQUUsZ0JBQWdCO29CQUMxQixRQUFRLEVBQUUsc3BIQTBFWDtvQkFDQyxNQUFNLEVBQUUsQ0FBQywyL0RBQTIvRCxDQUFDO2lCQUN0Z0U7Ozs7Z0JBdEZDLGlCQUFpQjtnQkFJWCxnQkFBZ0I7OzsrQkEwRnJCLEtBQUs7NkJBR0wsS0FBSzs0QkFHTCxLQUFLO2dDQUdMLEtBQUs7MENBR0wsS0FBSzs7SUF1SlIsMEJBQUM7Q0FBQSxBQXpQRCxJQXlQQztTQTFLWSxtQkFBbUI7OztJQUM5QixzQ0FBK0I7O0lBQy9CLDJDQUFvQzs7SUFDcEMsdUNBQXdCOztJQUN4Qiw2Q0FBc0M7O0lBQ3RDLDhDQUFnQzs7SUFFaEMsMkNBQ21COztJQUVuQix5Q0FDMkM7O0lBRTNDLHdDQUMwRDs7SUFFMUQsNENBQ3NCOztJQUV0QixzREFDcUM7O0lBRXJDLDZDQUEwQzs7SUFDMUMsNkNBQTRCOztJQUM1Qix5Q0FBMkM7O0lBQzNDLHVDQUFlOztJQUNmLG1DQUFzQzs7SUFDdEMsbUNBQXFHOztJQUNyRywwQ0FBMEI7O0lBQzFCLHdDQUF1Qjs7SUFDdkIsa0NBQWdEOzs7OztJQUVoRCxzQ0FBdUQ7Ozs7O0lBR3ZELDZDQUErQjs7Ozs7SUFHL0IsNkNBQStCOztJQUVuQixrREFBOEM7O0lBQUUsK0NBQTBDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0ZXBpY2tlckludGVydmFsQ29tcG9uZW50IH0gZnJvbSAnLi9kYXRlcGlja2VyLWludGVydmFsLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7XHJcbiAgQ29tcG9uZW50LCBPbkluaXQsIE91dHB1dCwgSW5wdXQsIFNpbXBsZUNoYW5nZXMsIE9uQ2hhbmdlcyxcclxuICBDaGFuZ2VEZXRlY3RvclJlZlxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge09ic2VydmFibGUsIFN1YmplY3R9IGZyb20gJ3J4anMvaW5kZXgnO1xyXG5pbXBvcnQge1Zpc2liaWxpdHl9IGZyb20gJy4uL2VudW1zJztcclxuaW1wb3J0IHtEYXRlcGlja2VyQ29uZmlnfSBmcm9tICcuL2RhdGVwaWNrZXIuY29uZmlnJztcclxuaW1wb3J0ICogYXMgbW9tZW50XyBmcm9tICdtb21lbnQnO1xyXG5jb25zdCBtb21lbnQgPSBtb21lbnRfO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdoeGEtZGF0ZXBpY2tlcicsXHJcbiAgdGVtcGxhdGU6IGA8ZGl2IGNsYXNzPVwiaHh1aS1yZXNldFwiICpuZ0lmPVwiT3BlbkRpdlwiPlxyXG4gIDxkaXYgY2xhc3M9XCJoeGEtdGFic1wiPlxyXG4gICAgPGh4LXRhYnNldCBjbGFzcz1cImh4YS10YWJzZXRcIj5cclxuICAgICAgPGh4LXRhYiAgaGVhZGluZz1cIlNldCBpbnRlcnZhbFwiIChzZWxlY3QpPVwib25UYWJTZWxlY3QoJ3RhYjEnKVwiIFthY3RpdmVdPVwiYWN0aXZlVmFyaWFibGVcIj5cclxuICAgICAgICA8aHhhLWRhdGVwaWNrZXItaW50ZXJ2YWw+PC9oeGEtZGF0ZXBpY2tlci1pbnRlcnZhbD5cclxuICAgICAgPC9oeC10YWI+XHJcbiAgICAgIDxoeC10YWIgIGhlYWRpbmc9XCJTcGVjaWZpYyBkYXRlXCIgKHNlbGVjdCk9XCJvblRhYlNlbGVjdCgndGFiMicpXCIgW2FjdGl2ZV09XCJhY3RpdmVWYXJpYWJsZTFcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaHh1aS1yZXNldFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImh4LWNhcmQgaHhhLWRhdGVwaWNrZXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoeC1jYXJkLWhlYWRlciBoeGEtZGF0ZXBpY2tlci1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaHhhLWRhdGVwaWNrZXItbW9udGhcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoeGEtZGF0ZXBpY2tlci1pY29uXCIgdGl0bGU9XCJQcmV2aW91cyBNb250aFwiIChjbGljayk9XCJwcmV2aW91c01vbnRoKClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImh4LWJ1dHRvbiBpcy10cmFuc3BhcmVudFwiPjxpIGNsYXNzPVwiaHgtaWNvbiBpY29uLWFuZ2xlLWxlZnRcIj48L2k+PC9hPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaHhhLWRhdGVwaWNrZXItbW9udGgtdGl0bGVcIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4+e3t2aWV3RGF0ZS50b0xvY2FsZVN0cmluZyhcImVuLWF1XCIsIHsgbW9udGg6IFwibG9uZ1wiLCB5ZWFyOiBcIm51bWVyaWNcIiB9KX19PC9zcGFuPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImh4YS1kYXRlcGlja2VyLWljb25cIiB0aXRsZT1cIk5leHQgTW9udGhcIiAoY2xpY2spPVwibmV4dE1vbnRoKClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImh4LWJ1dHRvbiBpcy10cmFuc3BhcmVudFwiPjxpIGNsYXNzPVwiaHgtaWNvbiBpY29uLWFuZ2xlLXJpZ2h0XCI+PC9pPjwvYT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoeGEtZGF0ZXBpY2tlci13ZWVrXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaHhhLWRhdGVwaWNrZXItd2Vla2RheVwiICpuZ0Zvcj1cImxldCB3ZWVrZGF5IG9mIHdlZWtcIj5cclxuICAgICAgICAgICAgICAgICAge3t3ZWVrZGF5IHwgc2xpY2U6MDozfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImh4YS1kYXRlcGlja2VyLWNvbnRlbnRzXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImh4YS1kYXRlcGlja2VyLWRheVwiICpuZ0Zvcj1cImxldCBkYXkgb2YgZGF5c1wiXHJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2h4YS1kYXRlcGlja2VyLWRheS1zaWJsaW5nbW9udGgnOiAhaXNDdXJyZW50TW9udGgoZGF5KSxcclxuICAgICAgICAgICAgICAgICdoeGEtZGF0ZXBpY2tlci1kYXktY3VycmVudGRheSc6IGlzQ3VycmVudERheShkYXkpLFxyXG4gICAgICAgICAgICAgICAgJ2h4YS1kYXRlcGlja2VyLWRheS1zZWxlY3RlZGRheSc6IGlzU2VsZWN0ZWREYXkoZGF5KSxcclxuICAgICAgICAgICAgICAgICdoeGEtZGF0ZXBpY2tlci1kYXktaW52YWxpZGRheSc6IGlzSW52YWxpZERheShkYXkpfVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2V0U2VsZWN0ZWREYXRlKGRheSlcIj5cclxuICAgICAgICAgICAgICA8YSBjbGFzcz1cImh4LWJ1dHRvbiBpcy10cmFuc3BhcmVudFwiPnt7ZGF5LmdldERhdGUoKX19PC9hPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2h4LXRhYj5cclxuICAgIDwvaHgtdGFic2V0PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuPGRpdiBjbGFzcz1cImh4dWktcmVzZXRcIiAqbmdJZj1cInNob3dDYWxlbmRhclwiPlxyXG4gIDxkaXYgY2xhc3M9XCJoeC1jYXJkIGh4YS1kYXRlcGlja2VyLWNvbnRhaW5lclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImh4LWNhcmQtaGVhZGVyIGh4YS1kYXRlcGlja2VyLWhlYWRlclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiaHhhLWRhdGVwaWNrZXItbW9udGhcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaHhhLWRhdGVwaWNrZXItaWNvblwiIHRpdGxlPVwiUHJldmlvdXMgTW9udGhcIiAoY2xpY2spPVwicHJldmlvdXNNb250aCgpXCI+XHJcbiAgICAgICAgICAgIDxhIGNsYXNzPVwiaHgtYnV0dG9uIGlzLXRyYW5zcGFyZW50XCI+PGkgY2xhc3M9XCJoeC1pY29uIGljb24tYW5nbGUtbGVmdFwiPjwvaT48L2E+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImh4YS1kYXRlcGlja2VyLW1vbnRoLXRpdGxlXCI+XHJcbiAgICAgICAgICA8c3Bhbj57e3ZpZXdEYXRlLnRvTG9jYWxlU3RyaW5nKFwiZW4tYXVcIiwgeyBtb250aDogXCJsb25nXCIsIHllYXI6IFwibnVtZXJpY1wiIH0pfX08L3NwYW4+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImh4YS1kYXRlcGlja2VyLWljb25cIiB0aXRsZT1cIk5leHQgTW9udGhcIiAoY2xpY2spPVwibmV4dE1vbnRoKClcIj5cclxuICAgICAgICAgICAgPGEgY2xhc3M9XCJoeC1idXR0b24gaXMtdHJhbnNwYXJlbnRcIj48aSBjbGFzcz1cImh4LWljb24gaWNvbi1hbmdsZS1yaWdodFwiPjwvaT48L2E+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiaHhhLWRhdGVwaWNrZXItd2Vla1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJoeGEtZGF0ZXBpY2tlci13ZWVrZGF5XCIgKm5nRm9yPVwibGV0IHdlZWtkYXkgb2Ygd2Vla1wiPlxyXG4gICAgICAgICAge3t3ZWVrZGF5IHwgc2xpY2U6MDozfX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJoeGEtZGF0ZXBpY2tlci1jb250ZW50c1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiaHhhLWRhdGVwaWNrZXItZGF5XCIgKm5nRm9yPVwibGV0IGRheSBvZiBkYXlzXCJcclxuICAgICAgICBbbmdDbGFzc109XCJ7J2h4YS1kYXRlcGlja2VyLWRheS1zaWJsaW5nbW9udGgnOiAhaXNDdXJyZW50TW9udGgoZGF5KSxcclxuICAgICAgICAnaHhhLWRhdGVwaWNrZXItZGF5LWN1cnJlbnRkYXknOiBpc0N1cnJlbnREYXkoZGF5KSxcclxuICAgICAgICAnaHhhLWRhdGVwaWNrZXItZGF5LXNlbGVjdGVkZGF5JzogaXNTZWxlY3RlZERheShkYXkpLFxyXG4gICAgICAgICdoeGEtZGF0ZXBpY2tlci1kYXktaW52YWxpZGRheSc6IGlzSW52YWxpZERheShkYXkpfVwiXHJcbiAgICAgICAgKGNsaWNrKT1cInNldFNlbGVjdGVkRGF0ZShkYXkpXCI+XHJcbiAgICAgIDxhIGNsYXNzPVwiaHgtYnV0dG9uIGlzLXRyYW5zcGFyZW50XCI+e3tkYXkuZ2V0RGF0ZSgpfX08L2E+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuYCxcclxuICBzdHlsZXM6IFtgLmh4YS1kYXRlcGlja2VyLWNvbnRhaW5lcnttYXgtd2lkdGg6MTlyZW07d2lkdGg6MTlyZW07aGVpZ2h0OjIxcmVtO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Zm9udC1zaXplOjFyZW19Lmh4YS1kYXRlcGlja2VyLWhlYWRlcntwYWRkaW5nOi41cmVtIC41cmVtIDA7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2FsaWduLWl0ZW1zOmluaXRpYWw7anVzdGlmeS1jb250ZW50OnNwYWNlLWFyb3VuZDtmb250LXdlaWdodDoxMDB9Lmh4YS1kYXRlcGlja2VyLWljb257Y3Vyc29yOnBvaW50ZXI7ZGlzcGxheTpmbGV4O2ZsZXg6MTtmbGV4LWRpcmVjdGlvbjpjb2x1bW47anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXJ9Lmh4YS1kYXRlcGlja2VyLWljb24gLmh4LWJ1dHRvbntwb3NpdGlvbjppbml0aWFsIWltcG9ydGFudDt0b3A6aW5pdGlhbCFpbXBvcnRhbnR9Lmh4YS1kYXRlcGlja2VyLWljb24gLmh4LWJ1dHRvbi5pcy10cmFuc3BhcmVudDpob3Zlcntjb2xvcjojMDAwfS5oeGEtZGF0ZXBpY2tlci1pY29uIC5oeC1pY29ue2ZvbnQtc2l6ZToyZW07cG9zaXRpb246aW5pdGlhbCFpbXBvcnRhbnQ7dG9wOmluaXRpYWwhaW1wb3J0YW50O2NvbG9yOiMwZDRkNzh9Lmh4YS1kYXRlcGlja2VyLW1vbnRoe2Rpc3BsYXk6ZmxleDt0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW4tYm90dG9tOi41cmVtfS5oeGEtZGF0ZXBpY2tlci1tb250aC10aXRsZXtmb250LXNpemU6MS4yNWVtO2ZvbnQtd2VpZ2h0OjQwMDtmbGV4OjM7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO2NvbG9yOiMwZDRkNzh9Lmh4YS1kYXRlcGlja2VyLXdlZWt7ZGlzcGxheTpmbGV4O3dpZHRoOjEwMCU7dGV4dC1hbGlnbjpjZW50ZXJ9Lmh4YS1kYXRlcGlja2VyLXdlZWtkYXl7ZmxleDoxO2NvbG9yOiMwZDRkNzg7Zm9udC1zaXplOi44NWVtfS5oeGEtZGF0ZXBpY2tlci1jb250ZW50c3twYWRkaW5nOi41cmVtO2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDYsMjQ2LDI0OSwuNSk7ZGlzcGxheTpmbGV4O2ZsZXgtZmxvdzpyb3cgd3JhcDtmbGV4OjE7anVzdGlmeS1jb250ZW50OnNwYWNlLWFyb3VuZDthbGlnbi1jb250ZW50OnNwYWNlLWFyb3VuZH0uaHhhLWRhdGVwaWNrZXItZGF5e2ZsZXg6MSAxIDE0JTtoZWlnaHQ6MTYuNjY2JTtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXJ9Lmh4YS1kYXRlcGlja2VyLWRheSAuaHgtYnV0dG9ue3Bvc2l0aW9uOmluaXRpYWw7dG9wOmluaXRpYWw7ZmxleDoxO2ZvbnQtd2VpZ2h0OjQwMDtoZWlnaHQ6MTAwJTtwYWRkaW5nOjA7Y29sb3I6IzQxYjk4N30uaHhhLWRhdGVwaWNrZXItZGF5LXNpYmxpbmdtb250aCAuaHgtYnV0dG9ue2NvbG9yOiMzYjNiM2I7Zm9udC13ZWlnaHQ6MTAwfS5oeGEtZGF0ZXBpY2tlci1kYXktc2VsZWN0ZWRkYXkgLmh4LWJ1dHRvbntjb2xvcjojZmZmO2JhY2tncm91bmQ6IzQxYjk4N30uaHhhLWRhdGVwaWNrZXItZGF5LWludmFsaWRkYXkgLmh4LWJ1dHRvbntjb2xvcjojZTBlMGUxIWltcG9ydGFudDtwb2ludGVyLWV2ZW50czpub25lfS5oeGEtZGF0ZXBpY2tlci1kYXktY3VycmVudGRheSAuaHgtYnV0dG9ue2JvcmRlcjoycHggc29saWQgIzQxYjk4N306aG9zdHttYXgtd2lkdGg6MjRyZW07Ym9yZGVyOjFweCBzb2xpZCAjZDNkM2QzO2JhY2tncm91bmQ6I2ZmZn06aG9zdCAuaHhhLXRhYnMgOjpuZy1kZWVwIGh4LXRhYnNldCA6Om5nLWRlZXAgdWx7YmFja2dyb3VuZC1jb2xvcjojZmZmO21hcmdpbi1ib3R0b206MH06aG9zdCAuaHhhLXRhYnMgOjpuZy1kZWVwIGh4LXRhYnNldCA6Om5nLWRlZXAgdWwgOjpuZy1kZWVwIGxpe3dpZHRoOjUwJX06aG9zdCAuaHhhLXRhYnMgOjpuZy1kZWVwIGh4LXRhYnNldCA6Om5nLWRlZXAgdWwgOjpuZy1kZWVwIGxpIGEgc3Bhbntmb250LXNpemU6bWVkaXVtO21hcmdpbjphdXRvfTpob3N0IC5oeGEtdGFicyA6Om5nLWRlZXAgaHgtdGFic2V0IDo6bmctZGVlcCAuaHgtdGFiLWNvbnRlbnR7cGFkZGluZzowfWBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEYXRlcGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xyXG4gIHB1YmxpYyBPcGVuRGl2OiBCb29sZWFuID0gdHJ1ZTtcclxuICBwdWJsaWMgc2hvd0NhbGVuZGFyOiBCb29sZWFuID0gdHJ1ZTtcclxuICBwdWJsaWMgdGFibmFtZTE6IFN0cmluZztcclxuICBwdWJsaWMgYWN0aXZlVmFyaWFibGU6IEJvb2xlYW4gPSB0cnVlO1xyXG4gIHB1YmxpYyBhY3RpdmVWYXJpYWJsZTE6IEJvb2xlYW47XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2VsZWN0ZWREYXRlOiBEYXRlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHZhbGlkYXRvcnM6IEFycmF5PChkYXRlOiBEYXRlKSA9PiBib29sZWFuPjtcclxuXHJcbiAgQElucHV0KClcclxuICBwbGFjZW1lbnQ6ICd0b3AnIHwgJ2JvdHRvbScgfCAnbGVmdCcgfCAncmlnaHQnID0gJ2JvdHRvbSc7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgYWxsb3dJbnRlcnZhbCA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHNlbGVjdGVkRHVlRGF0ZUludGVydmFsID0gJzAgZGF5KHMpJztcclxuXHJcbiAgb25EYXRlU2VsZWN0ZWQ6IChpbnB1dERhdGU6IERhdGUpID0+IHZvaWQ7XHJcbiAgdmlzaWJpbGl0eUVudW0gPSBWaXNpYmlsaXR5O1xyXG4gIHZpc2liaWxpdHk6IFZpc2liaWxpdHkgPSBWaXNpYmlsaXR5LkhpZGRlbjtcclxuICB2aWV3RGF0ZTogRGF0ZTtcclxuICBkYXlzOiBBcnJheTxEYXRlPiA9IG5ldyBBcnJheTxEYXRlPigpO1xyXG4gIHdlZWs6IEFycmF5PHN0cmluZz4gPSBbJ01vbmRheScsICdUdWVzZGF5JywgJ1dlZG5lc2RheScsICdUaHVyc2RheScsICdGcmlkYXknLCAnU2F0dXJkYXknLCAnU3VuZGF5J107XHJcbiAgcHJpdmF0ZSBwcmVzZW50RGF0ZTogRGF0ZTtcclxuICBwcml2YXRlIGNlbGxDb3VudCA9IDQxO1xyXG4gIHByaXZhdGUgX2RwOiBEYXRlcGlja2VySW50ZXJ2YWxDb21wb25lbnQgfCBudWxsO1xyXG4gIC8qKiBTdWJqZWN0IGZvciBub3RpZnlpbmcgdGhhdCB0aGUgY2FsZW5kYXIgaGFzIGJlZW4gaGlkZGVuIGZyb20gdGhlIHZpZXcgKi9cclxuICBwcml2YXRlIHJlYWRvbmx5IF9vbkhpZGU6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIC8qKiBUaGUgdGltZW91dCBJRCBvZiBhbnkgY3VycmVudCB0aW1lciBzZXQgdG8gc2hvdyB0aGUgY2FsZW5kYXIgKi9cclxuICBwcml2YXRlIF9zaG93VGltZW91dElkOiBudW1iZXI7XHJcblxyXG4gIC8qKiBUaGUgdGltZW91dCBJRCBvZiBhbnkgY3VycmVudCB0aW1lciBzZXQgdG8gaGlkZSB0aGUgY2FsZW5kYXIgKi9cclxuICBwcml2YXRlIF9oaWRlVGltZW91dElkOiBudW1iZXI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2NoYW5nZURldGVjdGlvblJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgZGF0ZVBpY2tlckNvbmZpZzogRGF0ZXBpY2tlckNvbmZpZykge1xyXG4gICAgfVxyXG5cclxuICAvLyBQb3B1bGF0ZXMgdGhlIGRheXMgYXJyYXkgd2l0aCB0aGUgY3VycmVudCBtb250aCwgYW5kIGNvbXBsZXRlcyB0aGUgdmlldyB3aXRoIHBhcnRpYWwgZGF0ZXMgZnJvbSBzaWJsaW5nIG1vbnRoc1xyXG4gIHB1YmxpYyByZW5kZXJDYWxlbmRhcigpOiB2b2lkIHtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IHRoaXMuY2VsbENvdW50OyBpKyspIHtcclxuICAgICAgLy8gZGF0ZSB3aWxsIGJlIHNldCB0byB0aGUgZmlyc3QgZGF5IG9mIHRoZSBtb250aCBzZXQgaW4gdGhpcy52aWV3RGF0ZVxyXG4gICAgICBjb25zdCBkYXRlOiBEYXRlID0gbmV3IERhdGUodGhpcy52aWV3RGF0ZS5nZXRGdWxsWWVhcigpLCB0aGlzLnZpZXdEYXRlLmdldE1vbnRoKCkpO1xyXG4gICAgICAvLyBTaGlmdHMgdGhlIHdlZWsgdG8gc3RhcnQgZnJvbSBNb25kYXksIHJhdGhlciB0aGFuIFN1bmRheSwgdGhpcyBjYXVzZXMgdGhlIGluZGV4IHRvIHN0YXJ0IGF0IDFcclxuICAgICAgY29uc3QgZGF5T2Zmc2V0ID0gZGF0ZS5nZXREYXkoKSA9PT0gMCA/IDcgOiBkYXRlLmdldERheSgpO1xyXG4gICAgICB0aGlzLmRheXNbaV0gPSBuZXcgRGF0ZShkYXRlLnNldERhdGUoMiAtIGRheU9mZnNldCArIGkpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBwdWJsaWMgcHJldmlvdXNNb250aCgpOiB2b2lkIHtcclxuICAgIHRoaXMudmlld0RhdGUgPSBuZXcgRGF0ZSh0aGlzLnZpZXdEYXRlLmdldEZ1bGxZZWFyKCksIHRoaXMudmlld0RhdGUuZ2V0TW9udGgoKSAtIDEpO1xyXG4gICAgdGhpcy5yZW5kZXJDYWxlbmRhcigpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5leHRNb250aCgpOiB2b2lkIHtcclxuICAgIHRoaXMudmlld0RhdGUgPSBuZXcgRGF0ZSh0aGlzLnZpZXdEYXRlLmdldEZ1bGxZZWFyKCksIHRoaXMudmlld0RhdGUuZ2V0TW9udGgoKSArIDEpO1xyXG4gICAgdGhpcy5yZW5kZXJDYWxlbmRhcigpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzQ3VycmVudE1vbnRoKGlucHV0RGF0ZTogRGF0ZSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGlucHV0RGF0ZS5nZXRNb250aCgpID09PSB0aGlzLnZpZXdEYXRlLmdldE1vbnRoKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNDdXJyZW50RGF5KGlucHV0RGF0ZTogRGF0ZSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGlucHV0RGF0ZS5nZXRUaW1lKCkgPT09IHRoaXMucHJlc2VudERhdGUuZ2V0VGltZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzU2VsZWN0ZWREYXkoaW5wdXREYXRlOiBEYXRlKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZERhdGUpIHtcclxuICAgICAgcmV0dXJuIGlucHV0RGF0ZS5nZXRUaW1lKCkgPT09IHRoaXMuc2VsZWN0ZWREYXRlLmdldFRpbWUoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNJbnZhbGlkRGF5KGlucHV0RGF0ZTogRGF0ZSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMudmFsaWRhdG9ycy5tYXAoKGZuKSA9PiBmbihpbnB1dERhdGUpKS5yZWR1Y2UoKHByZXYsIG5leHQpID0+IHByZXYgfHwgbmV4dCwgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFNlbGVjdGVkRGF0ZShkYXRlOiBEYXRlKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuaXNJbnZhbGlkRGF5KGRhdGUpKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gZGF0ZTtcclxuICAgICAgdGhpcy5vbkRhdGVTZWxlY3RlZChkYXRlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmICghIWNoYW5nZXMuc2VsZWN0ZWREYXRlLmN1cnJlbnRWYWx1ZSkge1xyXG4gICAgICB0aGlzLnZpZXdEYXRlID0gbmV3IERhdGUodGhpcy5zZWxlY3RlZERhdGUuZ2V0RnVsbFllYXIoKSwgdGhpcy5zZWxlY3RlZERhdGUuZ2V0TW9udGgoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGRhdGU6IERhdGUgPSB0aGlzLnNlbGVjdGVkRGF0ZSA/IHRoaXMuc2VsZWN0ZWREYXRlIDogbmV3IERhdGUoKTtcclxuICAgIHRoaXMucHJlc2VudERhdGUgPSBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgZGF0ZS5nZXREYXRlKCkpO1xyXG4gICAgdGhpcy52aWV3RGF0ZSA9IHRoaXMudmlld0RhdGUgfHwgbmV3IERhdGUoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCkpO1xyXG4gICAgdGhpcy5yZW5kZXJDYWxlbmRhcigpO1xyXG4gICAgaWYgKCB0aGlzLmRhdGVQaWNrZXJDb25maWcudGFiU2VsZWN0ZWQgPT09ICd0YWIxJykge1xyXG4gICAgIHRoaXMuYWN0aXZlVmFyaWFibGUxID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuYWN0aXZlVmFyaWFibGUgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKCB0aGlzLmRhdGVQaWNrZXJDb25maWcudGFiU2VsZWN0ZWQgPT09ICd0YWIyJykge1xyXG4gICAgICB0aGlzLmFjdGl2ZVZhcmlhYmxlMSA9IHRydWU7XHJcbiAgICAgIHRoaXMuYWN0aXZlVmFyaWFibGUgPSBmYWxzZTtcclxuICAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTaG93cyB0aGUgdG9vbHRpcFxyXG4gICAqIEBwYXJhbSBkZWxheSBBbW91bnQgb2YgbWlsbGlzZWNvbmRzIHRvIHRoZSBkZWxheSBzaG93aW5nIHRoZSB0b29sdGlwLlxyXG4gICAqL1xyXG4gIHNob3coZGVsYXk6IG51bWJlcik6IHZvaWQge1xyXG4gICAgLy8gQ2FuY2VsIHRoZSBkZWxheWVkIGhpZGUgaWYgaXQgaXMgc2NoZWR1bGVkXHJcbiAgICBpZiAodGhpcy5faGlkZVRpbWVvdXRJZCkge1xyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5faGlkZVRpbWVvdXRJZCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9zaG93VGltZW91dElkID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAvLyBTY2hlZHVsZSBmb3IgY2hhbmdlIGRldGVjdGlvbiBpbmNhc2UgdGhlIHRvb2x0aXAgaXMgdXNlZCB3aXRoaW4gYVxyXG4gICAgICAvLyBjb21wb25lbnQgd2l0aCBPblB1c2ggY2hhbmdlIGRldGVjdGlvblxyXG4gICAgICB0aGlzLl9jaGFuZ2VEZXRlY3Rpb25SZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgIHRoaXMudmlzaWJpbGl0eSA9IFZpc2liaWxpdHkuVmlzaWJsZTtcclxuICAgIH0sIGRlbGF5KTtcclxuXHJcbiAgICBpZiAodGhpcy5hbGxvd0ludGVydmFsKSB7XHJcbiAgICAgICB0aGlzLk9wZW5EaXYgPSB0cnVlO1xyXG4gICAgICAgdGhpcy5zaG93Q2FsZW5kYXIgPSBmYWxzZTtcclxuXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgIHRoaXMuT3BlbkRpdiA9IGZhbHNlO1xyXG4gICAgIHRoaXMuc2hvd0NhbGVuZGFyID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhpZGUgdGhlIHRvb2x0aXAgYWZ0ZXIgdGhlIHByb3ZpZGVkIGRlbGF5IGluIG1zLlxyXG4gICAqIEBwYXJhbSBkZWxheSBBbW91bnQgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5IGhpZGluZyB0aGUgdG9vbHRpcC5cclxuICAgKi9cclxuICBoaWRlKGRlbGF5OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIC8vIENhbmNlbCB0aGUgZGVsYXllZCBzaG93IGlmIGl0IGlzIHNjaGVkdWxlZFxyXG4gICAgaWYgKHRoaXMuX3Nob3dUaW1lb3V0SWQpIHtcclxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3Nob3dUaW1lb3V0SWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX2hpZGVUaW1lb3V0SWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMudmlzaWJpbGl0eSA9IFZpc2liaWxpdHkuSGlkZGVuO1xyXG4gICAgICB0aGlzLl9vbkhpZGUubmV4dCgpO1xyXG4gICAgfSwgZGVsYXkpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJldHVybnMgYW4gb2JzZXJ2YWJsZSB0aGF0IG5vdGlmaWVzIHdoZW4gdGhlIHRvb2x0aXAgaGFzIGJlZW4gaGlkZGVuIGZyb20gdmlldy4gKi9cclxuICBhZnRlckhpZGRlbigpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgIHJldHVybiB0aGlzLl9vbkhpZGUuYXNPYnNlcnZhYmxlKCk7XHJcbiAgfVxyXG5cclxuICBpc1Zpc2libGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy52aXNpYmlsaXR5ID09PSBWaXNpYmlsaXR5LlZpc2libGU7XHJcbiAgfVxyXG4gIG9uVGFiU2VsZWN0KHRhYm5hbWU6IFN0cmluZykge1xyXG4gICAgIGlmICh0YWJuYW1lID09PSAndGFiMScpIHtcclxuICAgICAgdGhpcy5kYXRlUGlja2VyQ29uZmlnLnRhYlNlbGVjdGVkID0gdGFibmFtZTtcclxuICAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmRhdGVQaWNrZXJDb25maWcudGFiU2VsZWN0ZWQgPSB0YWJuYW1lO1xyXG4gICAgIH1cclxuICAgfVxyXG59XHJcbiJdfQ==