e5core-angular-ui
Version:
e5 Anywhere Angular UI
438 lines • 44.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, EventEmitter, Input, Output, ViewChildren, QueryList, Inject, LOCALE_ID } from '@angular/core';
import { DiariseUnit } from '../../enums/diarise-unit';
import { BehaviorSubject } from 'rxjs';
import { WorkMenuItemFoundationService, WorkItemFoundationService } from 'e5core-angular-services';
import { DatePipe } from '@angular/common';
import { DiariseReasonModel } from '../../models/diarise-reason.model';
export class E5coreUiWorkDiariseComponent {
/**
* @param {?} workItemFoundationService
* @param {?} workMenuItemService
* @param {?} locale
* @param {?} datePipe
*/
constructor(workItemFoundationService, workMenuItemService, locale, datePipe) {
this.workItemFoundationService = workItemFoundationService;
this.workMenuItemService = workMenuItemService;
this.locale = locale;
this.datePipe = datePipe;
this.dateChange = new EventEmitter();
this.reasonTextChange = new EventEmitter();
this.reasonChange = new EventEmitter();
this.diariseWork = new EventEmitter();
this.timeChange = new EventEmitter();
this.diariseReasonOption = '';
this.showDiariseTime = true;
this.showDiariseButton = true;
this.showDiariseReasonDropdown = true;
}
/**
* @return {?}
*/
get diariseDate() {
return this._diariseDate;
}
/**
* @param {?} value
* @return {?}
*/
set diariseDate(value) {
this._diariseDate = value;
}
/**
* @return {?}
*/
ngOnInit() {
if (typeof this.workItem$ === 'undefined') {
console.error('e5core-ui-work-diarise [workItem$] must have a BehaviorSubject<WorkItemModel>');
return;
}
if (this.displayedTime == null) {
/** @type {?} */
const currentTime = this.formatAMPM(new Date());
this.displayedTime = currentTime;
}
if (this.displayedDate == null) {
this.displayedDate = new Date();
}
if (typeof this.workItem$ != null) {
this.workItem$.subscribe(w => {
this.workId = w.workId;
if (this.showDiariseReasonDropdown) {
this.reasons = new Array();
if (this.workId !== '00000000-0000-0000-0000-000000000000') {
this.GetDiariseReasons();
}
}
});
}
}
/**
* @private
* @param {?} clickedDiariseOption
* @return {?}
*/
calculateDiariseDate(clickedDiariseOption) {
/** @type {?} */
const unit = parseInt(DiariseUnit[clickedDiariseOption.diariseUnit], 10);
/** @type {?} */
const increment = parseInt(clickedDiariseOption.value.toString(), 10);
this.diariseDate = new Date();
switch (unit) {
case DiariseUnit.Tomorrow:
{
this.diariseDate.setDate(this.diariseDate.getDate() + 1);
break;
}
case DiariseUnit.Days:
{
this.diariseDate.setDate(this.diariseDate.getDate() + increment);
break;
}
case DiariseUnit.Months:
{
this.diariseDate.setMonth(this.diariseDate.getMonth() + increment);
break;
}
case DiariseUnit.Weeks:
{
this.diariseDate.setDate(this.diariseDate.getDate() + increment * 7);
break;
}
case DiariseUnit.Year:
{
this.diariseDate.setFullYear(this.diariseDate.getFullYear() + increment);
break;
}
}
}
/**
* @private
* @return {?}
*/
setDatePickerDate() {
// for(let datePicker of this.datePickerComponents.toArray()){
// datePicker.displayedDate = this.diariseDate;
this.displayedDate = this.diariseDate;
}
/**
* @private
* @param {?} tempDate
* @return {?}
*/
formatAMPM(tempDate) {
/** @type {?} */
let minuteString;
/** @type {?} */
let hours = tempDate.getHours();
/** @type {?} */
const minutes = tempDate.getMinutes();
/** @type {?} */
const ampm = hours >= 12 ? 'pm' : 'am';
hours = hours % 12;
hours = hours ? hours : 12; // the hour '0' should be '12'
minuteString = minutes < 10 ? '0' + minutes.toString() : minutes.toString();
/** @type {?} */
const strTime = hours.toString() + ':' + minuteString + ' ' + ampm;
return strTime;
}
/**
* @param {?} $event
* @return {?}
*/
onDiarisePeriodOptionClick($event) {
this.calculateDiariseDate($event.diariseOption);
this.setDatePickerDate();
this.diarisePeriodOption = $event.diariseOption;
}
/**
* @param {?} $event
* @return {?}
*/
onDiariseButtonClick($event) {
// ---Working Code------------------------------------------
// let temp = {"AssessmentExplanationcode":"This is a test"};
// let menuData = {
// "WorkItemChanges": WorkItemChanges,
// "TaskChanges": null,
// "AdditionalProperties": {
// "result": "ok",
// "DiariseReason": this.diariseReasonOption,
// "DiariseUntilDate": formattedDiariseUntilDate,
// "DiariseUntilHours": diariseHours,
// "DiariseUntilMinutes": diariseMinutes
// }
// }
// _let diariseEvent : WorkDiariseEvent = {diariseOption:this.diarisePeriodOption,
// diariseUntilDate:diariseUntilDate, diariseUntilHours : diariseHours,
// diariseUntilMinutes : diariseMinutes, diariseTextReason : this.diariseReasonTextValue,
// diariseReasonOption : this.diariseReasonOption, menuData:menuData, source:"button"} ;
// ---Working Code------------------------------------------
this.diariseWorkEvent = this.ConstructWorkDiariseEvent('button');
this.DiariseWorkItem();
}
/**
* @param {?} $event
* @return {?}
*/
onDiariseDateChange($event) {
this.displayedDate = $event;
this.diariseWorkEvent = this.ConstructWorkDiariseEvent('date');
this.dateChange.emit(this.diariseWorkEvent);
}
/**
* @param {?} $event
* @return {?}
*/
onDiariseReasonTextChange($event) {
this.diariseReasonTextValue = $event;
this.diariseReasonOption = $event;
this.diariseWorkEvent = this.ConstructWorkDiariseEvent('reasonText');
this.reasonTextChange.emit(this.diariseWorkEvent);
}
/**
* @param {?} $event
* @return {?}
*/
onDiariseReasonChange($event) {
this.diariseReasonOption = $event.value;
this.diariseWorkEvent = this.ConstructWorkDiariseEvent('reasonDropdown');
this.reasonChange.emit(this.diariseWorkEvent);
}
/**
* @param {?} time
* @return {?}
*/
onTimeChange(time) {
this.displayedTime = time;
/** @type {?} */
const diariseWorkEvent = this.ConstructWorkDiariseEvent('time');
this.timeChange.emit(diariseWorkEvent);
}
/**
* @return {?}
*/
GetDiariseReasons() {
this.workItemFoundationService.getDiariseReasons(this.workId).subscribe(s => {
/** @type {?} */
const tempReasons = s.map(item => new DiariseReasonModel(item));
this.reasons = tempReasons;
}, error => {
console.error(error);
});
}
/**
* @return {?}
*/
DiariseWorkItem() {
this.diariseWorkEvent = this.ConstructWorkDiariseEvent('diariseWorkItem');
/** @type {?} */
var options = { menuItemCode: "diarise" };
this.workMenuItemService.invokeMenuItem(this.workId, -1, this.diariseWorkEvent.menuData, options).subscribe(s => {
this.diariseWork.emit(this.diariseWorkEvent);
}, error => {
console.error(error);
});
}
/**
* @param {?} eventSource
* @return {?}
*/
ConstructWorkDiariseEvent(eventSource) {
/** @type {?} */
const WorkItemChanges = {};
if (this.diariseReasonPropertyId != null && this.diariseReasonTextValue != null) {
WorkItemChanges[this.diariseReasonPropertyId] = this.diariseReasonTextValue;
}
/** @type {?} */
const diariseUntilTime = this.ConvertTime12to24(this.displayedTime).split(':');
/** @type {?} */
const diariseHours = parseInt(diariseUntilTime[0], 10);
/** @type {?} */
const diariseMinutes = parseInt(diariseUntilTime[1], 10);
/** @type {?} */
const diariseUntilDate = this.datePipe.transform(this.displayedDate, 'dd/MM/yyyy');
/** @type {?} */
const additionalProperties = {
result: 'ok',
DiariseReason: this.diariseReasonOption,
DiariseUntilDate: diariseUntilDate,
DiaiseUntilHours: diariseHours,
DiariseUntilMinutes: diariseMinutes
};
/** @type {?} */
const menuData = {
'WorkItemChanges': WorkItemChanges,
'TaskChanges': null,
'AdditionalProperties': {
'result': 'ok',
'DiariseReason': this.diariseReasonOption,
'DiariseUntilDate': diariseUntilDate,
'DiariseUntilHours': diariseHours,
'DiariseUntilMinutes': diariseMinutes
}
};
// let additionalProperties: AdditionalProperties = {result:"ok", DiariseReason:this.diariseReasonOption,
// DiariseUntilDate:formattedDiariseUntilDate,DiaiseUntilHours:diariseHours, DiariseUntilMinutes:diariseMinutes};
// let menuData:DiariseMenuDataModel = {WorkItemChanges: WorkItemChanges, TaskChanges : null,
// AdditionalProperties:additionalProperties };
/** @type {?} */
const diariseEvent = {
diariseOption: this.diarisePeriodOption,
diariseUntilDate: diariseUntilDate,
diariseUntilHours: diariseHours,
diariseUntilMinutes: diariseMinutes,
diariseTextReason: this.diariseReasonTextValue,
diariseReasonOption: this.diariseReasonOption,
menuData: menuData,
source: eventSource
};
return diariseEvent;
}
/**
* @param {?} time12h
* @return {?}
*/
ConvertTime12to24(time12h) {
const [time, modifier] = time12h.split(' ');
// tslint:disable-next-line:prefer-const
let [hours, minutes] = time.split(':');
if (hours === '12') {
hours = '00';
}
if (modifier.toUpperCase() === 'PM') {
hours = parseInt(hours, 10) + 12;
}
return hours + ':' + minutes;
}
}
E5coreUiWorkDiariseComponent.decorators = [
{ type: Component, args: [{
selector: 'e5core-ui-work-diarise',
template: `<e5core-ui-work-diarise-material
[periodOptions]='periodOptions'
[reasons]='reasons'
[displayedDate] ='displayedDate'
[displayedTime] = 'displayedTime'
[diariseReasonPropertyId] ='diariseReasonPropertyId'
[diariseReasonPlaceHolder] ='diariseReasonPlaceHolder'
[diariseReasonTextValue]='diariseReasonTextValue'
[showDiariseButton]='showDiariseButton'
[showDiariseTime]='showDiariseTime'
(diariseWork)='onDiariseButtonClick($event)'
(reasonTextChange)='onDiariseReasonTextChange($event)'
(reasonChange)='onDiariseReasonChange($event)'
(dateChange)='onDiariseDateChange($event)'
(timeChange)="onTimeChange($event)"
(periodChange)="onDiarisePeriodOptionClick($event)"
[showDiariseReasonDropdown]='showDiariseReasonDropdown'
>
</e5core-ui-work-diarise-material>`
}] }
];
/** @nocollapse */
E5coreUiWorkDiariseComponent.ctorParameters = () => [
{ type: WorkItemFoundationService },
{ type: WorkMenuItemFoundationService },
{ type: String, decorators: [{ type: Inject, args: [LOCALE_ID,] }] },
{ type: DatePipe }
];
E5coreUiWorkDiariseComponent.propDecorators = {
workItem$: [{ type: Input }],
diariseReasons$: [{ type: Input }],
dateChange: [{ type: Output }],
reasonTextChange: [{ type: Output }],
reasonChange: [{ type: Output }],
diariseWork: [{ type: Output }],
timeChange: [{ type: Output }],
periodOptions: [{ type: Input }],
reasons: [{ type: Input }],
diariseReasonPropertyId: [{ type: Input }],
displayedDate: [{ type: Input }],
displayedTime: [{ type: Input }],
diariseReasonPlaceHolder: [{ type: Input }],
diariseReasonTextValue: [{ type: Input }],
diariseReasonOption: [{ type: Input }],
showDiariseTime: [{ type: Input }],
showDiariseButton: [{ type: Input }],
showDiariseReasonDropdown: [{ type: Input }],
datePickerComponents: [{ type: ViewChildren, args: ['datepicker',] }]
};
if (false) {
/** @type {?} */
E5coreUiWorkDiariseComponent.prototype.workItem$;
/** @type {?} */
E5coreUiWorkDiariseComponent.prototype.diariseReasons$;
/** @type {?} */
E5coreUiWorkDiariseComponent.prototype.dateChange;
/** @type {?} */
E5coreUiWorkDiariseComponent.prototype.reasonTextChange;
/** @type {?} */
E5coreUiWorkDiariseComponent.prototype.reasonChange;
/** @type {?} */
E5coreUiWorkDiariseComponent.prototype.diariseWork;
/** @type {?} */
E5coreUiWorkDiariseComponent.prototype.timeChange;
/** @type {?} */
E5coreUiWorkDiariseComponent.prototype.periodOptions;
/** @type {?} */
E5coreUiWorkDiariseComponent.prototype.reasons;
/** @type {?} */
E5coreUiWorkDiariseComponent.prototype.diariseReasonPropertyId;
/** @type {?} */
E5coreUiWorkDiariseComponent.prototype.displayedDate;
/** @type {?} */
E5coreUiWorkDiariseComponent.prototype.displayedTime;
/** @type {?} */
E5coreUiWorkDiariseComponent.prototype.diariseReasonPlaceHolder;
/** @type {?} */
E5coreUiWorkDiariseComponent.prototype.diariseReasonTextValue;
/** @type {?} */
E5coreUiWorkDiariseComponent.prototype.diariseReasonOption;
/** @type {?} */
E5coreUiWorkDiariseComponent.prototype.showDiariseTime;
/** @type {?} */
E5coreUiWorkDiariseComponent.prototype.showDiariseButton;
/** @type {?} */
E5coreUiWorkDiariseComponent.prototype.showDiariseReasonDropdown;
/** @type {?} */
E5coreUiWorkDiariseComponent.prototype.workItemModel;
/** @type {?} */
E5coreUiWorkDiariseComponent.prototype.workId;
/** @type {?} */
E5coreUiWorkDiariseComponent.prototype.diarisePeriodOption;
/** @type {?} */
E5coreUiWorkDiariseComponent.prototype.diariseWorkEvent;
/**
* @type {?}
* @private
*/
E5coreUiWorkDiariseComponent.prototype._diariseDate;
/** @type {?} */
E5coreUiWorkDiariseComponent.prototype.datePickerComponents;
/**
* @type {?}
* @private
*/
E5coreUiWorkDiariseComponent.prototype.workItemFoundationService;
/**
* @type {?}
* @private
*/
E5coreUiWorkDiariseComponent.prototype.workMenuItemService;
/**
* @type {?}
* @private
*/
E5coreUiWorkDiariseComponent.prototype.locale;
/**
* @type {?}
* @private
*/
E5coreUiWorkDiariseComponent.prototype.datePipe;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZTVjb3JlLXVpLXdvcmstZGlhcmlzZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9lNWNvcmUtYW5ndWxhci11aS8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL2U1Y29yZS11aS13b3JrLWRpYXJpc2UvZTVjb3JlLXVpLXdvcmstZGlhcmlzZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBSTNILE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV2RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXZDLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25HLE9BQU8sRUFBYyxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQTBCdkUsTUFBTSxPQUFPLDRCQUE0Qjs7Ozs7OztJQW1DckMsWUFDWSx5QkFBb0QsRUFDcEQsbUJBQWtELEVBQy9CLE1BQWMsRUFDakMsUUFBa0I7UUFIbEIsOEJBQXlCLEdBQXpCLHlCQUF5QixDQUEyQjtRQUNwRCx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQStCO1FBQy9CLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDakMsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQXBDcEIsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDckMscUJBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUMzQyxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDdkMsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBb0IsQ0FB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Ozs7O1lBM0J1Qyx5QkFBeUI7WUFBeEQsNkJBQTZCO3lDQWtFN0IsTUFBTSxTQUFDLFNBQVM7WUFqRUosUUFBUTs7O3dCQTRCeEIsS0FBSzs4QkFDTCxLQUFLO3lCQUNMLE1BQU07K0JBQ04sTUFBTTsyQkFDTixNQUFNOzBCQUNOLE1BQU07eUJBQ04sTUFBTTs0QkFFTixLQUFLO3NCQUNMLEtBQUs7c0NBQ0wsS0FBSzs0QkFDTCxLQUFLOzRCQUNMLEtBQUs7dUNBQ0wsS0FBSztxQ0FDTCxLQUFLO2tDQUNMLEtBQUs7OEJBQ0wsS0FBSztnQ0FDTCxLQUFLO3dDQUNMLEtBQUs7bUNBY0wsWUFBWSxTQUFDLFlBQVk7Ozs7SUFoQzFCLGlEQUFtRDs7SUFDbkQsdURBQStEOztJQUMvRCxrREFBK0M7O0lBQy9DLHdEQUFxRDs7SUFDckQsb0RBQWlEOztJQUNqRCxtREFBNkQ7O0lBQzdELGtEQUErQzs7SUFFL0MscURBQTZDOztJQUM3QywrQ0FBdUM7O0lBQ3ZDLCtEQUF5Qzs7SUFDekMscURBQTZCOztJQUM3QixxREFBK0I7O0lBQy9CLGdFQUEwQzs7SUFDMUMsOERBQXlDOztJQUN6QywyREFBa0M7O0lBQ2xDLHVEQUFnQzs7SUFDaEMseURBQWtDOztJQUNsQyxpRUFBMEM7O0lBRTFDLHFEQUE2Qjs7SUFDN0IsOENBQWU7O0lBQ2YsMkRBQXdDOztJQUN4Qyx3REFBbUM7Ozs7O0lBQ25DLG9EQUEyQjs7SUFRM0IsNERBQ29FOzs7OztJQUVoRSxpRUFBNEQ7Ozs7O0lBQzVELDJEQUEwRDs7Ozs7SUFDMUQsOENBQXlDOzs7OztJQUN6QyxnREFBMEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBWaWV3Q2hpbGRyZW4sIFF1ZXJ5TGlzdCwgSW5qZWN0LCBMT0NBTEVfSUQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEU1Y29yZVVpV29ya0RpYXJpc2VCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnQvZTVjb3JlLXVpLXdvcmstZGlhcmlzZS1iYXNlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEaWFyaXNlT3B0aW9uTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZGlhcmlzZS1vcHRpb24ubW9kZWwnO1xuaW1wb3J0IHsgRGlhcmlzZU9wdGlvbkNsaWNrRXZlbnQgfSBmcm9tICcuLi8uLi9ldmVudHMvZGlhcmlzZS1vcHRpb24tY2xpY2stZXZlbnQnO1xuaW1wb3J0IHsgRGlhcmlzZVVuaXQgfSBmcm9tICcuLi8uLi9lbnVtcy9kaWFyaXNlLXVuaXQnO1xuaW1wb3J0IHsgRTVjb3JlVWlEYXRlcGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi4vZTVjb3JlLXVpLWRhdGVwaWNrZXIvZTVjb3JlLXVpLWRhdGVwaWNrZXIuY29tcG9uZW50JztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgV29ya0l0ZW1Nb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy93b3JrLWl0ZW0nO1xuaW1wb3J0IHsgV29ya01lbnVJdGVtRm91bmRhdGlvblNlcnZpY2UsIFdvcmtJdGVtRm91bmRhdGlvblNlcnZpY2UgfSBmcm9tICdlNWNvcmUtYW5ndWxhci1zZXJ2aWNlcyc7XG5pbXBvcnQgeyBmb3JtYXREYXRlLCBEYXRlUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBEaWFyaXNlUmVhc29uTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZGlhcmlzZS1yZWFzb24ubW9kZWwnO1xuaW1wb3J0IHsgRGlhcmlzZU1lbnVEYXRhTW9kZWwsIEFkZGl0aW9uYWxQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2RpYXJpc2UtbWVudS1kYXRhLW1vZGVsJztcbmltcG9ydCB7IERpYXJpc2VXb3JrRXZlbnQgfSBmcm9tICcuLi8uLi9ldmVudHMvZGlhcmlzZS13b3JrLWV2ZW50JztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdlNWNvcmUtdWktd29yay1kaWFyaXNlJyxcbiAgICB0ZW1wbGF0ZTogYDxlNWNvcmUtdWktd29yay1kaWFyaXNlLW1hdGVyaWFsXG4gICAgICAgICAgICAgICBbcGVyaW9kT3B0aW9uc109J3BlcmlvZE9wdGlvbnMnXG4gICAgICAgICAgICAgICBbcmVhc29uc109J3JlYXNvbnMnXG4gICAgICAgICAgICAgICBbZGlzcGxheWVkRGF0ZV0gPSdkaXNwbGF5ZWREYXRlJ1xuICAgICAgICAgICAgICAgW2Rpc3BsYXllZFRpbWVdID0gJ2Rpc3BsYXllZFRpbWUnXG4gICAgICAgICAgICAgICBbZGlhcmlzZVJlYXNvblByb3BlcnR5SWRdID0nZGlhcmlzZVJlYXNvblByb3BlcnR5SWQnXG4gICAgICAgICAgICAgICBbZGlhcmlzZVJlYXNvblBsYWNlSG9sZGVyXSA9J2RpYXJpc2VSZWFzb25QbGFjZUhvbGRlcidcbiAgICAgICAgICAgICAgIFtkaWFyaXNlUmVhc29uVGV4dFZhbHVlXT0nZGlhcmlzZVJlYXNvblRleHRWYWx1ZSdcbiAgICAgICAgICAgICAgIFtzaG93RGlhcmlzZUJ1dHRvbl09J3Nob3dEaWFyaXNlQnV0dG9uJ1xuICAgICAgICAgICAgICAgW3Nob3dEaWFyaXNlVGltZV09J3Nob3dEaWFyaXNlVGltZSdcbiAgICAgICAgICAgICAgIChkaWFyaXNlV29yayk9J29uRGlhcmlzZUJ1dHRvbkNsaWNrKCRldmVudCknXG4gICAgICAgICAgICAgICAocmVhc29uVGV4dENoYW5nZSk9J29uRGlhcmlzZVJlYXNvblRleHRDaGFuZ2UoJGV2ZW50KSdcbiAgICAgICAgICAgICAgIChyZWFzb25DaGFuZ2UpPSdvbkRpYXJpc2VSZWFzb25DaGFuZ2UoJGV2ZW50KSdcbiAgICAgICAgICAgICAgIChkYXRlQ2hhbmdlKT0nb25EaWFyaXNlRGF0ZUNoYW5nZSgkZXZlbnQpJ1xuICAgICAgICAgICAgICAgKHRpbWVDaGFuZ2UpPVwib25UaW1lQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgKHBlcmlvZENoYW5nZSk9XCJvbkRpYXJpc2VQZXJpb2RPcHRpb25DbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgIFtzaG93RGlhcmlzZVJlYXNvbkRyb3Bkb3duXT0nc2hvd0RpYXJpc2VSZWFzb25Ecm9wZG93bidcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgIDwvZTVjb3JlLXVpLXdvcmstZGlhcmlzZS1tYXRlcmlhbD5gXG59KVxuZXhwb3J0IGNsYXNzIEU1Y29yZVVpV29ya0RpYXJpc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIEBJbnB1dCgpIHdvcmtJdGVtJDogQmVoYXZpb3JTdWJqZWN0PFdvcmtJdGVtTW9kZWw+O1xuICAgIEBJbnB1dCgpIGRpYXJpc2VSZWFzb25zJDogQmVoYXZpb3JTdWJqZWN0PERpYXJpc2VSZWFzb25Nb2RlbD4gO1xuICAgIEBPdXRwdXQoKSBkYXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgQE91dHB1dCgpIHJlYXNvblRleHRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgICBAT3V0cHV0KCkgcmVhc29uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgQE91dHB1dCgpIGRpYXJpc2VXb3JrID0gbmV3IEV2ZW50RW1pdHRlcjxEaWFyaXNlV29ya0V2ZW50PigpO1xuICAgIEBPdXRwdXQoKSB0aW1lQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgICBASW5wdXQoKSBwZXJpb2RPcHRpb25zOiBEaWFyaXNlT3B0aW9uTW9kZWxbXTtcbiAgICBASW5wdXQoKSByZWFzb25zOiBEaWFyaXNlUmVhc29uTW9kZWxbXTtcbiAgICBASW5wdXQoKSBkaWFyaXNlUmVhc29uUHJvcGVydHlJZDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGRpc3BsYXllZERhdGU6IERhdGU7XG4gICAgQElucHV0KCkgZGlzcGxheWVkVGltZTogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGRpYXJpc2VSZWFzb25QbGFjZUhvbGRlcjogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGRpYXJpc2VSZWFzb25UZXh0VmFsdWU6IHN0cmluZyA7XG4gICAgQElucHV0KCkgZGlhcmlzZVJlYXNvbk9wdGlvbiA9ICcnO1xuICAgIEBJbnB1dCgpIHNob3dEaWFyaXNlVGltZSA9IHRydWU7XG4gICAgQElucHV0KCkgc2hvd0RpYXJpc2VCdXR0b24gPSB0cnVlO1xuICAgIEBJbnB1dCgpIHNob3dEaWFyaXNlUmVhc29uRHJvcGRvd24gPSB0cnVlO1xuXG4gICAgd29ya0l0ZW1Nb2RlbDogV29ya0l0ZW1Nb2RlbDtcbiAgICB3b3JrSWQ6IHN0cmluZztcbiAgICBkaWFyaXNlUGVyaW9kT3B0aW9uOiBEaWFyaXNlT3B0aW9uTW9kZWw7XG4gICAgZGlhcmlzZVdvcmtFdmVudDogRGlhcmlzZVdvcmtFdmVudDtcbiAgICBwcml2YXRlIF9kaWFyaXNlRGF0ZTogRGF0ZTtcbiAgICBwdWJsaWMgZ2V0IGRpYXJpc2VEYXRlKCk6IERhdGUge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlhcmlzZURhdGU7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgZGlhcmlzZURhdGUodmFsdWU6IERhdGUpIHtcbiAgICAgICAgdGhpcy5fZGlhcmlzZURhdGUgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBAVmlld0NoaWxkcmVuKCdkYXRlcGlja2VyJylcbiAgICBwdWJsaWMgZGF0ZVBpY2tlckNvbXBvbmVudHM6IFF1ZXJ5TGlzdDxFNWNvcmVVaURhdGVwaWNrZXJDb21wb25lbnQ+O1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHdvcmtJdGVtRm91bmRhdGlvblNlcnZpY2U6IFdvcmtJdGVtRm91bmRhdGlvblNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgd29ya01lbnVJdGVtU2VydmljZTogV29ya01lbnVJdGVtRm91bmRhdGlvblNlcnZpY2UsXG4gICAgICAgIEBJbmplY3QoTE9DQUxFX0lEKSBwcml2YXRlIGxvY2FsZTogc3RyaW5nLFxuICAgICAgICBwcml2YXRlIGRhdGVQaXBlOiBEYXRlUGlwZSkge1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuXG4gICAgICAgIGlmwqAgKHR5cGVvZsKgdGhpcy53b3JrSXRlbSTCoD09PcKgJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2U1Y29yZS11aS13b3JrLWRpYXJpc2UgW3dvcmtJdGVtJF0gbXVzdCBoYXZlIGEgQmVoYXZpb3JTdWJqZWN0PFdvcmtJdGVtTW9kZWw+Jyk7XG4gICAgICAgICAgICByZXR1cm7CoDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRpc3BsYXllZFRpbWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFRpbWUgPSB0aGlzLmZvcm1hdEFNUE0obmV3IERhdGUoKSk7XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXllZFRpbWUgPSBjdXJyZW50VGltZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRpc3BsYXllZERhdGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZWREYXRlID0gbmV3IERhdGUoKTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgaWbCoCAodHlwZW9mwqB0aGlzLndvcmtJdGVtJMKgIT3CoG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMud29ya0l0ZW0kLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICB3ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53b3JrSWQgPSB3LndvcmtJZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0RpYXJpc2VSZWFzb25Ecm9wZG93bikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWFzb25zID0gbmV3IEFycmF5PERpYXJpc2VSZWFzb25Nb2RlbD4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLndvcmtJZCAhPT0gJzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLkdldERpYXJpc2VSZWFzb25zKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApIDtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVEaWFyaXNlRGF0ZShjbGlja2VkRGlhcmlzZU9wdGlvbjogRGlhcmlzZU9wdGlvbk1vZGVsKTogdm9pZCB7XG5cbiAgICAgICAgY29uc3QgdW5pdCA9IHBhcnNlSW50KERpYXJpc2VVbml0W2NsaWNrZWREaWFyaXNlT3B0aW9uLmRpYXJpc2VVbml0XSwgMTApO1xuICAgICAgICBjb25zdCBpbmNyZW1lbnQgPSBwYXJzZUludChjbGlja2VkRGlhcmlzZU9wdGlvbi52YWx1ZS50b1N0cmluZygpLCAxMCk7XG4gICAgICAgIHRoaXMuZGlhcmlzZURhdGUgPSBuZXcgRGF0ZSgpO1xuICAgICAgICBzd2l0Y2ggKHVuaXQpIHtcbiAgICAgICAgICAgIGNhc2UgRGlhcmlzZVVuaXQuVG9tb3Jyb3c6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpYXJpc2VEYXRlLnNldERhdGUodGhpcy5kaWFyaXNlRGF0ZS5nZXREYXRlKCkgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBEaWFyaXNlVW5pdC5EYXlzOlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaWFyaXNlRGF0ZS5zZXREYXRlKHRoaXMuZGlhcmlzZURhdGUuZ2V0RGF0ZSgpICsgaW5jcmVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBEaWFyaXNlVW5pdC5Nb250aHM6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpYXJpc2VEYXRlLnNldE1vbnRoKHRoaXMuZGlhcmlzZURhdGUuZ2V0TW9udGgoKSArIGluY3JlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgRGlhcmlzZVVuaXQuV2Vla3M6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpYXJpc2VEYXRlLnNldERhdGUodGhpcy5kaWFyaXNlRGF0ZS5nZXREYXRlKCkgKyBpbmNyZW1lbnQgKiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBEaWFyaXNlVW5pdC5ZZWFyOlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaWFyaXNlRGF0ZS5zZXRGdWxsWWVhcih0aGlzLmRpYXJpc2VEYXRlLmdldEZ1bGxZZWFyKCkgKyBpbmNyZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0RGF0ZVBpY2tlckRhdGUoKSB7XG4gICAgICAgIC8vIGZvcihsZXQgZGF0ZVBpY2tlciBvZiB0aGlzLmRhdGVQaWNrZXJDb21wb25lbnRzLnRvQXJyYXkoKSl7XG4gICAgICAgIC8vICAgZGF0ZVBpY2tlci5kaXNwbGF5ZWREYXRlID0gdGhpcy5kaWFyaXNlRGF0ZTtcbiAgICAgICAgdGhpcy5kaXNwbGF5ZWREYXRlID0gdGhpcy5kaWFyaXNlRGF0ZTtcblxuICAgIH1cblxuICAgIHByaXZhdGUgZm9ybWF0QU1QTSh0ZW1wRGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgICAgIGxldCBtaW51dGVTdHJpbmc6IHN0cmluZztcbiAgICAgICAgbGV0IGhvdXJzID0gdGVtcERhdGUuZ2V0SG91cnMoKTtcbiAgICAgICAgY29uc3QgbWludXRlcyA9IHRlbXBEYXRlLmdldE1pbnV0ZXMoKTtcbiAgICAgICAgY29uc3QgYW1wbSA9IGhvdXJzID49IDEyID8gJ3BtJyA6ICdhbSc7XG4gICAgICAgIGhvdXJzID0gaG91cnMgJSAxMjtcbiAgICAgICAgaG91cnMgPSBob3VycyA/IGhvdXJzIDogMTI7IC8vIHRoZSBob3VyICcwJyBzaG91bGQgYmUgJzEyJ1xuICAgICAgICBtaW51dGVTdHJpbmcgPSBtaW51dGVzIDwgMTAgPyAnMCcgKyBtaW51dGVzLnRvU3RyaW5nKCkgOiBtaW51dGVzLnRvU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IHN0clRpbWUgPSBob3Vycy50b1N0cmluZygpICsgJzonICsgbWludXRlU3RyaW5nICsgJyAnICsgYW1wbTtcbiAgICAgICAgcmV0dXJuIHN0clRpbWU7XG4gICAgfVxuXG4gICAgb25EaWFyaXNlUGVyaW9kT3B0aW9uQ2xpY2soJGV2ZW50OiBhbnkpIHtcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVEaWFyaXNlRGF0ZSgkZXZlbnQuZGlhcmlzZU9wdGlvbik7XG4gICAgICAgIHRoaXMuc2V0RGF0ZVBpY2tlckRhdGUoKTtcbiAgICAgICAgdGhpcy5kaWFyaXNlUGVyaW9kT3B0aW9uID0gJGV2ZW50LmRpYXJpc2VPcHRpb247XG4gICAgfVxuXG4gICAgb25EaWFyaXNlQnV0dG9uQ2xpY2soJGV2ZW50OiBEaWFyaXNlV29ya0V2ZW50KSB7XG5cbiAgICAgICAgLy8gIC0tLVdvcmtpbmcgQ29kZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICAvLyBcdGxldCB0ZW1wID0ge1wiQXNzZXNzbWVudEV4cGxhbmF0aW9uY29kZVwiOlwiVGhpcyBpcyBhIHRlc3RcIn07XG4gICAgICAgIC8vICAgbGV0IG1lbnVEYXRhID0ge1xuICAgICAgICAvLyBcdFwiV29ya0l0ZW1DaGFuZ2VzXCI6IFdvcmtJdGVtQ2hhbmdlcyxcbiAgICAgICAgLy8gXHRcIlRhc2tDaGFuZ2VzXCI6IG51bGwsXG4gICAgICAgIC8vIFx0XCJBZGRpdGlvbmFsUHJvcGVydGllc1wiOiB7XG4gICAgICAgIC8vIFx0XHRcInJlc3VsdFwiOiBcIm9rXCIsXG4gICAgICAgIC8vIFx0XHRcIkRpYXJpc2VSZWFzb25cIjogdGhpcy5kaWFyaXNlUmVhc29uT3B0aW9uLFxuICAgICAgICAvLyBcdFx0XCJEaWFyaXNlVW50aWxEYXRlXCI6IGZvcm1hdHRlZERpYXJpc2VVbnRpbERhdGUsXG4gICAgICAgIC8vIFx0XHRcIkRpYXJpc2VVbnRpbEhvdXJzXCI6IGRpYXJpc2VIb3VycyxcbiAgICAgICAgLy8gXHRcdFwiRGlhcmlzZVVudGlsTWludXRlc1wiOiBkaWFyaXNlTWludXRlc1xuICAgICAgICAvLyBcdH1cbiAgICAgICAgLy8gfVxuICAgICAgICAvLyAgX2xldCBkaWFyaXNlRXZlbnQgOiBXb3JrRGlhcmlzZUV2ZW50ID0ge2RpYXJpc2VPcHRpb246dGhpcy5kaWFyaXNlUGVyaW9kT3B0aW9uLFxuICAgICAgICAvLyAgZGlhcmlzZVVudGlsRGF0ZTpkaWFyaXNlVW50aWxEYXRlLCBkaWFyaXNlVW50aWxIb3VycyA6IGRpYXJpc2VIb3VycyxcbiAgICAgICAgLy8gIGRpYXJpc2VVbnRpbE1pbnV0ZXMgOiBkaWFyaXNlTWludXRlcywgZGlhcmlzZVRleHRSZWFzb24gOiB0aGlzLmRpYXJpc2VSZWFzb25UZXh0VmFsdWUsXG4gICAgICAgIC8vICBkaWFyaXNlUmVhc29uT3B0aW9uIDogdGhpcy5kaWFyaXNlUmVhc29uT3B0aW9uLCBtZW51RGF0YTptZW51RGF0YSwgc291cmNlOlwiYnV0dG9uXCJ9IDtcbiAgICAgICAgLy8gIC0tLVdvcmtpbmcgQ29kZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgICAgIHRoaXMuZGlhcmlzZVdvcmtFdmVudCA9ICB0aGlzLkNvbnN0cnVjdFdvcmtEaWFyaXNlRXZlbnQoJ2J1dHRvbicpO1xuICAgICAgICB0aGlzLkRpYXJpc2VXb3JrSXRlbSgpO1xuICAgIH1cblxuICAgIG9uRGlhcmlzZURhdGVDaGFuZ2UoJGV2ZW50OiBhbnkpIHtcbiAgICAgICAgdGhpcy5kaXNwbGF5ZWREYXRlID0gJGV2ZW50O1xuICAgICAgICB0aGlzLmRpYXJpc2VXb3JrRXZlbnQgPSAgdGhpcy5Db25zdHJ1Y3RXb3JrRGlhcmlzZUV2ZW50KCdkYXRlJykgO1xuICAgICAgICB0aGlzLmRhdGVDaGFuZ2UuZW1pdCh0aGlzLmRpYXJpc2VXb3JrRXZlbnQpO1xuICAgIH1cblxuICAgIG9uRGlhcmlzZVJlYXNvblRleHRDaGFuZ2UoJGV2ZW50OiBhbnkpIHtcbiAgICAgICAgdGhpcy5kaWFyaXNlUmVhc29uVGV4dFZhbHVlID0gJGV2ZW50O1xuICAgICAgICB0aGlzLmRpYXJpc2VSZWFzb25PcHRpb24gPSAkZXZlbnQ7XG4gICAgICAgIHRoaXMuZGlhcmlzZVdvcmtFdmVudCA9ICB0aGlzLkNvbnN0cnVjdFdvcmtEaWFyaXNlRXZlbnQoJ3JlYXNvblRleHQnKSA7XG4gICAgICAgIHRoaXMucmVhc29uVGV4dENoYW5nZS5lbWl0KHRoaXMuZGlhcmlzZVdvcmtFdmVudCk7XG4gICAgfVxuXG4gICAgb25EaWFyaXNlUmVhc29uQ2hhbmdlKCRldmVudDogYW55KSB7XG4gICAgICAgIHRoaXMuZGlhcmlzZVJlYXNvbk9wdGlvbiA9ICRldmVudC52YWx1ZTtcbiAgICAgICAgdGhpcy5kaWFyaXNlV29ya0V2ZW50ID0gIHRoaXMuQ29uc3RydWN0V29ya0RpYXJpc2VFdmVudCgncmVhc29uRHJvcGRvd24nKSA7XG4gICAgICAgIHRoaXMucmVhc29uQ2hhbmdlLmVtaXQodGhpcy5kaWFyaXNlV29ya0V2ZW50KTtcbiAgICB9XG5cbiAgICBvblRpbWVDaGFuZ2UodGltZTogYW55KSB7XG4gICAgICAgIHRoaXMuZGlzcGxheWVkVGltZSA9IHRpbWU7XG4gICAgICAgIGNvbnN0IGRpYXJpc2VXb3JrRXZlbnQ6IERpYXJpc2VXb3JrRXZlbnQgPSB0aGlzLkNvbnN0cnVjdFdvcmtEaWFyaXNlRXZlbnQoJ3RpbWUnKSA7XG4gICAgICAgIHRoaXMudGltZUNoYW5nZS5lbWl0KGRpYXJpc2VXb3JrRXZlbnQpO1xuICAgIH1cblxuICAgIEdldERpYXJpc2VSZWFzb25zKCk6IHZvaWQge1xuXG4gICAgICAgIHRoaXMud29ya0l0ZW1Gb3VuZGF0aW9uU2VydmljZS5nZXREaWFyaXNlUmVhc29ucyh0aGlzLndvcmtJZCkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgcyA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcFJlYXNvbnM6IGFueSA9IHMubWFwKGl0ZW0gPT4gbmV3IERpYXJpc2VSZWFzb25Nb2RlbChpdGVtKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWFzb25zID0gdGVtcFJlYXNvbnM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICApIDtcbiAgICB9XG5cbiAgICBwdWJsaWMgRGlhcmlzZVdvcmtJdGVtKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRpYXJpc2VXb3JrRXZlbnQgPSAgdGhpcy5Db25zdHJ1Y3RXb3JrRGlhcmlzZUV2ZW50KCdkaWFyaXNlV29ya0l0ZW0nKTtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSB7bWVudUl0ZW1Db2RlOiBcImRpYXJpc2VcIn07XG4gICAgICAgIHRoaXMud29ya01lbnVJdGVtU2VydmljZS5pbnZva2VNZW51SXRlbSh0aGlzLndvcmtJZCwgLTEsIHRoaXMuZGlhcmlzZVdvcmtFdmVudC5tZW51RGF0YSwgb3B0aW9ucykuc3Vic2NyaWJlKFxuICAgICAgICAgICAgcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlhcmlzZVdvcmsuZW1pdCh0aGlzLmRpYXJpc2VXb3JrRXZlbnQpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKSA7XG4gICAgfVxuXG4gICAgcHVibGljIENvbnN0cnVjdFdvcmtEaWFyaXNlRXZlbnQoZXZlbnRTb3VyY2U6IGFueSk6IERpYXJpc2VXb3JrRXZlbnQge1xuICAgICAgICBjb25zdCBXb3JrSXRlbUNoYW5nZXMgPSB7fTtcbiAgICAgICAgaWYgKHRoaXMuZGlhcmlzZVJlYXNvblByb3BlcnR5SWQgIT0gbnVsbCAmJiB0aGlzLmRpYXJpc2VSZWFzb25UZXh0VmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgV29ya0l0ZW1DaGFuZ2VzW3RoaXMuZGlhcmlzZVJlYXNvblByb3BlcnR5SWRdID0gdGhpcy5kaWFyaXNlUmVhc29uVGV4dFZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGlhcmlzZVVudGlsVGltZSA9IHRoaXMuQ29udmVydFRpbWUxMnRvMjQodGhpcy5kaXNwbGF5ZWRUaW1lKS5zcGxpdCgnOicpO1xuICAgICAgICBjb25zdCBkaWFyaXNlSG91cnMgPSBwYXJzZUludChkaWFyaXNlVW50aWxUaW1lWzBdLCAxMCk7XG4gICAgICAgIGNvbnN0IGRpYXJpc2VNaW51dGVzID0gcGFyc2VJbnQoZGlhcmlzZVVudGlsVGltZVsxXSwgMTApO1xuICAgICAgICBjb25zdCBkaWFyaXNlVW50aWxEYXRlID0gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0odGhpcy5kaXNwbGF5ZWREYXRlLCAnZGQvTU0veXl5eScpIDtcblxuICAgICAgICBjb25zdCBhZGRpdGlvbmFsUHJvcGVydGllczogQWRkaXRpb25hbFByb3BlcnRpZXMgPSB7XG4gICAgICAgICAgICByZXN1bHQ6ICdvaycsXG4gICAgICAgICAgICBEaWFyaXNlUmVhc29uOiB0aGlzLmRpYXJpc2VSZWFzb25PcHRpb24sXG4gICAgICAgICAgICBEaWFyaXNlVW50aWxEYXRlOiBkaWFyaXNlVW50aWxEYXRlLFxuICAgICAgICAgICAgRGlhaXNlVW50aWxIb3VyczogZGlhcmlzZUhvdXJzLFxuICAgICAgICAgICAgRGlhcmlzZVVudGlsTWludXRlczogZGlhcmlzZU1pbnV0ZXNcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbWVudURhdGEgPSB7XG4gICAgICAgICAgICAnV29ya0l0ZW1DaGFuZ2VzJzogV29ya0l0ZW1DaGFuZ2VzLFxuICAgICAgICAgICAgJ1Rhc2tDaGFuZ2VzJzogbnVsbCxcbiAgICAgICAgICAgICdBZGRpdGlvbmFsUHJvcGVydGllcyc6IHtcbiAgICAgICAgICAgICAgICAncmVzdWx0JzogJ29rJyxcbiAgICAgICAgICAgICAgICAnRGlhcmlzZVJlYXNvbic6IHRoaXMuZGlhcmlzZVJlYXNvbk9wdGlvbixcbiAgICAgICAgICAgICAgICAnRGlhcmlzZVVudGlsRGF0ZSc6IGRpYXJpc2VVbnRpbERhdGUsXG4gICAgICAgICAgICAgICAgJ0RpYXJpc2VVbnRpbEhvdXJzJzogZGlhcmlzZUhvdXJzLFxuICAgICAgICAgICAgICAgICdEaWFyaXNlVW50aWxNaW51dGVzJzogZGlhcmlzZU1pbnV0ZXNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSA7XG5cbiAgICAgICAgLy8gbGV0IGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBBZGRpdGlvbmFsUHJvcGVydGllcyA9IHtyZXN1bHQ6XCJva1wiLCBEaWFyaXNlUmVhc29uOnRoaXMuZGlhcmlzZVJlYXNvbk9wdGlvbixcbiAgICAgICAgLy8gIERpYXJpc2VVbnRpbERhdGU6Zm9ybWF0dGVkRGlhcmlzZVVudGlsRGF0ZSxEaWFpc2VVbnRpbEhvdXJzOmRpYXJpc2VIb3VycywgRGlhcmlzZVVudGlsTWludXRlczpkaWFyaXNlTWludXRlc307XG4gICAgICAgIC8vIGxldCBtZW51RGF0YTpEaWFyaXNlTWVudURhdGFNb2RlbCA9IHtXb3JrSXRlbUNoYW5nZXM6IFdvcmtJdGVtQ2hhbmdlcywgVGFza0NoYW5nZXMgOiBudWxsLFxuICAgICAgICAvLyAgQWRkaXRpb25hbFByb3BlcnRpZXM6YWRkaXRpb25hbFByb3BlcnRpZXMgfTtcblxuICAgICAgICBjb25zdCBkaWFyaXNlRXZlbnQ6IERpYXJpc2VXb3JrRXZlbnQgPSB7XG4gICAgICAgICAgICBkaWFyaXNlT3B0aW9uOiB0aGlzLmRpYXJpc2VQZXJpb2RPcHRpb24sXG4gICAgICAgICAgICBkaWFyaXNlVW50aWxEYXRlOiBkaWFyaXNlVW50aWxEYXRlLFxuICAgICAgICAgICAgZGlhcmlzZVVudGlsSG91cnMgOiBkaWFyaXNlSG91cnMsXG4gICAgICAgICAgICBkaWFyaXNlVW50aWxNaW51dGVzIDogZGlhcmlzZU1pbnV0ZXMsXG4gICAgICAgICAgICBkaWFyaXNlVGV4dFJlYXNvbiA6IHRoaXMuZGlhcmlzZVJlYXNvblRleHRWYWx1ZSxcbiAgICAgICAgICAgIGRpYXJpc2VSZWFzb25PcHRpb24gOiB0aGlzLmRpYXJpc2VSZWFzb25PcHRpb24sXG4gICAgICAgICAgICBtZW51RGF0YTogbWVudURhdGEsXG4gICAgICAgICAgICBzb3VyY2U6IGV2ZW50U291cmNlXG4gICAgICAgIH0gO1xuICAgICAgICByZXR1cm4gZGlhcmlzZUV2ZW50O1xuICAgIH1cblxuICAgIENvbnZlcnRUaW1lMTJ0bzI0KHRpbWUxMmgpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBbdGltZSwgbW9kaWZpZXJdID0gdGltZTEyaC5zcGxpdCgnICcpO1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6cHJlZmVyLWNvbnN0XG4gICAgICAgIGxldCBbaG91cnMsIG1pbnV0ZXNdID0gdGltZS5zcGxpdCgnOicpO1xuICAgICAgICBpZiAoaG91cnMgPT09ICcxMicpIHtcbiAgICAgICAgICAgIGhvdXJzID0gJzAwJztcbiAgICAgICAgfVxuICAgICAgICBpZiAobW9kaWZpZXIudG9VcHBlckNhc2UoKSA9PT0gJ1BNJykge1xuICAgICAgICAgICAgaG91cnMgPSBwYXJzZUludChob3VycywgMTApICsgMTI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaG91cnMgKyAnOicgKyBtaW51dGVzO1xuICAgIH1cbn1cbiJdfQ==