UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

493 lines (492 loc) 47.4 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, ElementRef, Input, ViewChild, EventEmitter } from '@angular/core'; import { Notification, NotificationAction } from './model/models'; import { NotificationManager } from '../service/NotificationManager.service'; import { DialogService } from '../service/DialogService.service'; import { AbstractHasData } from './AbstractHasData'; import { MaterialTextBox } from '../theme/material/component/dataview/input/MaterialTextBox.component'; import { MaterialDatePicker } from '../theme/material/component/dataview/input/MaterialDatePicker.component'; import { MaterialTimePicker } from '../theme/material/component/dataview/input/MaterialTimePicker.component'; import { MaterialTextArea } from '../theme/material/component/dataview/input/MaterialTextArea.component'; import { TestComponent } from './TestComponent.component'; import { CHANGE_EVENT } from '../share/CustomEventType'; import { EventUtils } from '../share/utils/EventUtils'; var /** @type {?} */ FORM_VIEW = 'form-view'; var /** @type {?} */ TYPE_NAME = "phx-data-form"; var DataForm = /** @class */ (function (_super) { tslib_1.__extends(DataForm, _super); function DataForm(notifyMgr, dialogServ, elementRef) { var _this = _super.call(this, elementRef) || this; _this.testCount = 0; _this.dataContainer = []; _this.descriptions = []; _this.changeEvent = new EventEmitter(); // for test notification // for test notification _this.notifyMgr = notifyMgr; _this.dialogServ = dialogServ; return _this; } /** * @return {?} */ DataForm.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; _super.prototype.ngOnInit.call(this); this.fields = ["name", "shortName", "_created", "datePickerName", "timePickerName", "areaName"]; this.labels = ["Name", "ShortName", "Create Date", "DatePickerName", "TimePickerName", "AreaName"]; this.descriptions = ["name description", "shortName description", "createDate Description", "datePickerName description", "timePickerName description", "areaName description"]; var /** @type {?} */ nameFieldChangeEV = this.nameTextField.getChangeEvent(); if (nameFieldChangeEV !== null && typeof nameFieldChangeEV !== 'undefined') { nameFieldChangeEV.subscribe(function (event) { if (event.detail.data !== null && typeof event.detail.data !== 'undefined') { if (event.detail.data.bubbleStack !== null && typeof event.detail.data.bubbleStack !== 'undefined') { event.detail.data.bubbleStack.push(_this); } else { event.detail.data.bubbleStack = [_this]; } } _this.onEmitChange(event); }); } var /** @type {?} */ shortNameChangeEV = this.shortNameTextField.getChangeEvent(); if (shortNameChangeEV !== null && typeof shortNameChangeEV !== 'undefined') { shortNameChangeEV.subscribe(function (event) { if (event.detail.data !== null && typeof event.detail.data !== 'undefined') { if (event.detail.data.bubbleStack !== null && typeof event.detail.data.bubbleStack !== 'undefined') { event.detail.data.bubbleStack.push(_this); } else { event.detail.data.bubbleStack = [_this]; } } _this.onEmitChange(event); }); } this.minDate = new Date(); this.minDate.setHours(0, 0, 0, 0); this.minDate.setMonth(5); this.maxDate = new Date(); this.maxDate.setHours(0, 0, 0, 0); this.maxDate.setMonth(10); this.minTime = new Date(); this.minTime.setHours(10, 0, 0, 0); this.maxTime = new Date(); this.maxTime.setHours(15, 0, 0, 0); this.rows = 8; this.cols = 100; }; /** * @param {?} event * @return {?} */ DataForm.prototype.onEmitChange = /** * @param {?} event * @return {?} */ function (event) { var /** @type {?} */ data = { source: event, bubbleStack: [this] }; var /** @type {?} */ ev = EventUtils.newCustomEvent(CHANGE_EVENT, this, data, null); this.changeEvent.emit(ev); }; /** * @return {?} */ DataForm.prototype._getDataContainer = /** * @return {?} */ function () { return this.dataContainer; }; /** * @return {?} */ DataForm.prototype.getModel = /** * @return {?} */ function () { return this.model; }; /** * @param {?} model * @return {?} */ DataForm.prototype.setModel = /** * @param {?} model * @return {?} */ function (model) { this.model = model; }; /** * @param {?} data * @return {?} */ DataForm.prototype.setData = /** * @param {?} data * @return {?} */ function (data) { // overide method this.data = data; if (data !== null && typeof data !== 'undefined') { if (Array.isArray(data.objects)) { this.dataContainer = data.objects; } } // child add dataContainer instead if (this.dataChildren !== null) { try { for (var _a = tslib_1.__values(this.dataChildren), _b = _a.next(); !_b.done; _b = _a.next()) { var c = _b.value; c.setData(this.dataContainer); } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (_b && !_b.done && (_c = _a.return)) _c.call(_a); } finally { if (e_1) throw e_1.error; } } } var e_1, _c; }; /** * @param {?} $event * @return {?} */ DataForm.prototype.showDataClicked = /** * @param {?} $event * @return {?} */ function ($event) { // test notification if (this.notifyMgr !== null && typeof this.notifyMgr !== 'undefined') { this.testCount += 1; var /** @type {?} */ d = new Date(); var /** @type {?} */ clickFunc = function () { console.log('BODY CLICKED'); }; var /** @type {?} */ notification = new Notification("", "TITLE: " + this.testCount, "description", true, "LB", d, 2000); notification.clickHandler = clickFunc; var /** @type {?} */ action1 = new NotificationAction('MORE', function (ev) { console.log('first CLICKED'); if (ev !== null && typeof ev !== 'undefined') { ev.detail.data.instance.showBody(); } }); var /** @type {?} */ action2 = new NotificationAction('CANCEL', function () { console.log('cancel CLICKED'); }, true); notification.addAction(action1); notification.addAction(action2); notification.bodyComponent = TestComponent; this.notifyMgr.notify(notification); } }; /** * @param {?} $event * @return {?} */ DataForm.prototype.saveDataClicked = /** * @param {?} $event * @return {?} */ function ($event) { var /** @type {?} */ name = this.nameTextField.getInputValue(); var /** @type {?} */ shortName = this.shortNameTextField.getInputValue(); var /** @type {?} */ dateString = this.dateTextField.getInputValue(); var /** @type {?} */ datePicker = this.datePickerTextField.getData(); var /** @type {?} */ timePicker = this.timePickerTextField.getData(); var /** @type {?} */ areaName = this.areaTextField.getInputValue(); if (this.data.editor !== null && typeof this.data.editor !== 'undefined') { var /** @type {?} */ formView = /** @type {?} */ (this.data.editor.getViewComponentFromType(FORM_VIEW)); var /** @type {?} */ curIndex = formView.getCurrentTabIndex(); var /** @type {?} */ obj = formView.getTabData(curIndex); if (obj !== null && obj.length > 0) { var /** @type {?} */ objs = formView.getTabData(curIndex); var /** @type {?} */ createdArray = []; var /** @type {?} */ updatedArray = []; var /** @type {?} */ objectIdField = this.data.editor.getObjectIdField(); try { for (var objs_1 = tslib_1.__values(objs), objs_1_1 = objs_1.next(); !objs_1_1.done; objs_1_1 = objs_1.next()) { var obj_1 = objs_1_1.value; if (obj_1[objectIdField] !== null && typeof obj_1[objectIdField] !== 'undefined') { updatedArray.push(obj_1); } else { createdArray.push(obj_1); } } } catch (e_2_1) { e_2 = { error: e_2_1 }; } finally { try { if (objs_1_1 && !objs_1_1.done && (_a = objs_1.return)) _a.call(objs_1); } finally { if (e_2) throw e_2.error; } } // create data if (createdArray.length > 0) { this.data.editor.createData(createdArray); } // update data if (updatedArray.length > 0) { this.data.editor.updateData(updatedArray); } } else { // create new object var /** @type {?} */ newObj = { name: name, shortName: shortName, _created: dateString, datePicker: datePicker, timePicker: timePicker, areaName: areaName }; this.data.editor.createData(newObj); } } var e_2, _a; }; /** * @param {?} $event * @return {?} */ DataForm.prototype.editDataClicked = /** * @param {?} $event * @return {?} */ function ($event) { // test clear all notify if (this.notifyMgr !== null && typeof this.notifyMgr !== 'undefined') { this.notifyMgr.clearAll(); } }; /** * @return {?} */ DataForm.prototype.getChangeEvent = /** * @return {?} */ function () { return this.changeEvent; }; /** * @return {?} */ DataForm.prototype.isSelfDataDirty = /** * @return {?} */ function () { return false; }; /** * @param {?} data * @return {?} */ DataForm.prototype.selfSaveData = /** * @param {?} data * @return {?} */ function (data) { }; /** * @return {?} */ DataForm.prototype.selfResetData = /** * @return {?} */ function () { }; /** * @return {?} */ DataForm.prototype.doPreload = /** * @return {?} */ function () { return new Promise(function (resolve, reject) { resolve(null); }); }; /** * @return {?} */ DataForm.prototype.doLoaded = /** * @return {?} */ function () { }; /** * @return {?} */ DataForm.prototype.getFields = /** * @return {?} */ function () { return this.fields; }; /** * @return {?} */ DataForm.prototype.getLabels = /** * @return {?} */ function () { return this.labels; }; /** * @return {?} */ DataForm.prototype.getDescriptions = /** * @return {?} */ function () { return this.descriptions; }; /** * @return {?} */ DataForm.prototype.getMinDate = /** * @return {?} */ function () { return this.minDate; }; /** * @return {?} */ DataForm.prototype.getMaxDate = /** * @return {?} */ function () { return this.maxDate; }; /** * @return {?} */ DataForm.prototype.getMinTime = /** * @return {?} */ function () { return this.minTime; }; /** * @return {?} */ DataForm.prototype.getMaxTime = /** * @return {?} */ function () { return this.maxTime; }; /** * @return {?} */ DataForm.prototype.getRows = /** * @return {?} */ function () { return this.rows; }; /** * @return {?} */ DataForm.prototype.getCols = /** * @return {?} */ function () { return this.cols; }; DataForm.TYPE_NAME = TYPE_NAME; DataForm.decorators = [ { type: Component, args: [{ moduleId: module.id, selector: TYPE_NAME, template: "<div class=\"data-form\">\n\t<div class=\"header\">\n\t\t<div class=\"left\">\n\t\t\t<div class=\"table-wrapper\">\n\t\t\t\t<div class=\"table-cell-wrapper middle\">\n\t\t\t\t\t<div class=\"title\"> Payment voucher </div>\n\t\t\t\t\t<div class=\"subtitle\"> voucherNo: POXXXXXXXXX </div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"right\">\n\t\t\t<div class=\"table-wrapper\">\n\t\t\t\t<div class=\"table-cell-wrapper middle\">\n\t\t\t\t\t<div class=\"title\"> ABS Management solution </div>\n\t\t\t\t\t<div class=\"subtitle\"> address sthing </div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\t<div class=\"body\">\n\t\t<div class=\"body-container\">\n\t\t\t<div class=\"row\">\n\t\t\t\t<div class=\"col-md-12\"><material-text-box required #nameTextField [label]=\"getLabels()[0]\" [description]=\"getDescriptions()[0]\" [data]=\"_getDataContainer()\" [field]=\"getFields()[0]\" [dataParent]=\"this\"></material-text-box></div>\n\t\t\t</div>\n\t\t\t<div class=\"row\">\n\t\t\t\t<div class=\"col-md-12\"><material-text-box #shortNameTextField [label]=\"getLabels()[1]\" [description]=\"getDescriptions()[1]\" [data]=\"_getDataContainer()\" [field]=\"getFields()[1]\" [dataParent]=\"this\"></material-text-box></div>\n\t\t\t</div>\n\t\t\t<div class=\"row\">\n\t\t\t\t<div class=\"col-md-12\"><material-text-box #dateTextField [label]=\"getLabels()[2]\" [description]=\"getDescriptions()[2]\" [data]=\"_getDataContainer()\" [field]=\"getFields()[2]\" [dataParent]=\"this\"></material-text-box></div>\n\t\t\t</div>\n\n\t\t\t<div class=\"row\">\n\t\t\t\t<div class=\"col-md-6\">\n\t\t\t\t\t<material-date-picker [phxMin]=\"getMinDate()\" [phxMax]=\"getMaxDate()\" [description]=\"getDescriptions()[3]\"></material-date-picker>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"col-md-6\">\n\t\t\t\t\t<material-time-picker [phxMin]=\"getMinTime()\" [phxMax]=\"getMaxTime()\" [description]=\"getDescriptions()[4]\"></material-time-picker>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"row\">\n\t\t\t\t<div class=\"col-md-12\">\n\t\t\t\t\t<material-text-area required [rows]=\"getRows()\" [cols]=\"getCols()\" #areaTextField [label]=\"getLabels()[5]\" [description]=\"getDescriptions()[5]\" [data]=\"_getDataContainer()\" [field]=\"getFields()[5]\" [dataParent]=\"this\"></material-text-area>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"row\">\n\t\t\t\t<div class=\"col-md-3\"><button type=\"button\" class=\"btn btn-default\" (click)=\"showDataClicked($event)\">Show Data</button></div>\n\t\t\t\t<div class=\"col-md-3\"><button type=\"button\" class=\"btn btn-default\" (click)=\"editDataClicked($event)\">Edit Data</button></div>\n\t\t\t\t<div class=\"col-md-3\"><button type=\"button\" class=\"btn btn-default\" (click)=\"saveDataClicked($event)\">Save Data</button></div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</div>\n" },] }, ]; /** @nocollapse */ DataForm.ctorParameters = function () { return [ { type: NotificationManager, }, { type: DialogService, }, { type: ElementRef, }, ]; }; DataForm.propDecorators = { "dataParent": [{ type: Input },], "nameTextField": [{ type: ViewChild, args: ['nameTextField',] },], "shortNameTextField": [{ type: ViewChild, args: ['shortNameTextField',] },], "dateTextField": [{ type: ViewChild, args: ['dateTextField',] },], "datePickerTextField": [{ type: ViewChild, args: ['datePickerTextField',] },], "timePickerTextField": [{ type: ViewChild, args: ['timePickerTextField',] },], "areaTextField": [{ type: ViewChild, args: ['areaTextField',] },], }; return DataForm; }(AbstractHasData)); export { DataForm }; function DataForm_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ DataForm.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ DataForm.ctorParameters; /** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */ DataForm.propDecorators; /** @type {?} */ DataForm.TYPE_NAME; /** @type {?} */ DataForm.prototype.dataParent; /** @type {?} */ DataForm.prototype.model; /** @type {?} */ DataForm.prototype.fields; /** @type {?} */ DataForm.prototype.labels; /** @type {?} */ DataForm.prototype.descriptions; /** @type {?} */ DataForm.prototype.nameTextField; /** @type {?} */ DataForm.prototype.shortNameTextField; /** @type {?} */ DataForm.prototype.dateTextField; /** @type {?} */ DataForm.prototype.datePickerTextField; /** @type {?} */ DataForm.prototype.timePickerTextField; /** @type {?} */ DataForm.prototype.areaTextField; /** @type {?} */ DataForm.prototype.dataContainer; /** @type {?} */ DataForm.prototype.changeEvent; /** @type {?} */ DataForm.prototype.notifyMgr; /** @type {?} */ DataForm.prototype.dialogServ; /** @type {?} */ DataForm.prototype.minDate; /** @type {?} */ DataForm.prototype.maxDate; /** @type {?} */ DataForm.prototype.minTime; /** @type {?} */ DataForm.prototype.maxTime; /** @type {?} */ DataForm.prototype.rows; /** @type {?} */ DataForm.prototype.cols; /** @type {?} */ DataForm.prototype.testCount; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGF0YUZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vY29tLnBobG94dWkvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50L0RhdGFGb3JtLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsVUFBVSxFQUFFLEtBQUssRUFBZ0IsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RyxPQUFPLEVBQTRCLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUdqRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNFQUFzRSxDQUFDO0FBQ3ZHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlFQUF5RSxDQUFDO0FBQzdHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlFQUF5RSxDQUFDO0FBQzdHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVFQUF1RSxDQUFDO0FBS3pHLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFDdkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXZELHFCQUFNLFNBQVMsR0FBRyxXQUFXLENBQUM7QUFJOUIscUJBQU0sU0FBUyxHQUFXLGVBQWUsQ0FBQzs7SUE4RFosb0NBQWU7SUFvQzNDLGtCQUFZLFNBQThCLEVBQUUsVUFBeUIsRUFBRSxVQUFzQjtRQUE3RixZQUNFLGtCQUFNLFVBQVUsQ0FBQyxTQVFsQjswQkFYMkIsQ0FBQztRQUkzQixL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O1FBQ1osTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7O3lCQWpSd0IsU0FBUzs7Z0JBN0RyRCxTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLE1BQU0sQ0FBQyxFQUFFO29CQUNuQixRQUFRLEVBQUUsU0FBUztvQkFDbkIsUUFBUSxFQUFFLDZ4RkFzRFg7aUJBQ0E7Ozs7Z0JBbEZRLG1CQUFtQjtnQkFDbkIsYUFBYTtnQkFITSxVQUFVOzs7K0JBeUZuQyxLQUFLO2tDQU1MLFNBQVMsU0FBQyxlQUFlO3VDQUV6QixTQUFTLFNBQUMsb0JBQW9CO2tDQUU5QixTQUFTLFNBQUMsZUFBZTt3Q0FFekIsU0FBUyxTQUFDLHFCQUFxQjt3Q0FFL0IsU0FBUyxTQUFDLHFCQUFxQjtrQ0FFL0IsU0FBUyxTQUFDLGVBQWU7O21CQXpHNUI7RUFxRjhCLGVBQWU7U0FBaEMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBFbGVtZW50UmVmLCBJbnB1dCwgSG9zdExpc3RlbmVyLCBWaWV3Q2hpbGQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWVudUl0ZW1Nb2RlbCwgTWVudU1vZGVsLCBOb3RpZmljYXRpb24sIE5vdGlmaWNhdGlvbkFjdGlvbiB9IGZyb20gJy4vbW9kZWwvbW9kZWxzJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvbk1hbmFnZXIgfSBmcm9tICcuLi9zZXJ2aWNlL05vdGlmaWNhdGlvbk1hbmFnZXIuc2VydmljZSc7XG5pbXBvcnQgeyBEaWFsb2dTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZS9EaWFsb2dTZXJ2aWNlLnNlcnZpY2UnO1xuaW1wb3J0IHsgSUhhc0RhdGEgfSBmcm9tICcuL0lIYXNEYXRhJztcbmltcG9ydCB7IElIYXNNb2RlbCB9IGZyb20gJy4vSUhhc01vZGVsJztcbmltcG9ydCB7IEFic3RyYWN0SGFzRGF0YSB9IGZyb20gJy4vQWJzdHJhY3RIYXNEYXRhJztcbmltcG9ydCB7IE1hdGVyaWFsVGV4dEJveCB9IGZyb20gJy4uL3RoZW1lL21hdGVyaWFsL2NvbXBvbmVudC9kYXRhdmlldy9pbnB1dC9NYXRlcmlhbFRleHRCb3guY29tcG9uZW50JztcbmltcG9ydCB7IE1hdGVyaWFsRGF0ZVBpY2tlciB9IGZyb20gJy4uL3RoZW1lL21hdGVyaWFsL2NvbXBvbmVudC9kYXRhdmlldy9pbnB1dC9NYXRlcmlhbERhdGVQaWNrZXIuY29tcG9uZW50JztcbmltcG9ydCB7IE1hdGVyaWFsVGltZVBpY2tlciB9IGZyb20gJy4uL3RoZW1lL21hdGVyaWFsL2NvbXBvbmVudC9kYXRhdmlldy9pbnB1dC9NYXRlcmlhbFRpbWVQaWNrZXIuY29tcG9uZW50JztcbmltcG9ydCB7IE1hdGVyaWFsVGV4dEFyZWEgfSBmcm9tICcuLi90aGVtZS9tYXRlcmlhbC9jb21wb25lbnQvZGF0YXZpZXcvaW5wdXQvTWF0ZXJpYWxUZXh0QXJlYS5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGV4dEJveCB9IGZyb20gJy4vZGF0YXZpZXcvaW5wdXQvVGV4dEJveC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGV4dEFyZWEgfSBmcm9tICcuL2RhdGF2aWV3L2lucHV0L1RleHRBcmVhLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJQ2hhbmdlYWJsZSB9IGZyb20gJy4vSUNoYW5nZWFibGUnO1xuaW1wb3J0IHsgRm9ybVZpZXcgfSBmcm9tICcuL2VkaXRvci9lZGl0b3IuaW50ZXJuYWwvRm9ybVZpZXcuY29tcG9uZW50JztcbmltcG9ydCB7IFRlc3RDb21wb25lbnQgfSBmcm9tICcuL1Rlc3RDb21wb25lbnQuY29tcG9uZW50JztcbmltcG9ydCB7IENIQU5HRV9FVkVOVCB9IGZyb20gJy4uL3NoYXJlL0N1c3RvbUV2ZW50VHlwZSdcbmltcG9ydCB7IEV2ZW50VXRpbHMgfSBmcm9tICcuLi9zaGFyZS91dGlscy9FdmVudFV0aWxzJztcblxuY29uc3QgRk9STV9WSUVXID0gJ2Zvcm0tdmlldyc7XG5cbmRlY2xhcmUgdmFyICQ6IGFueTtcblxuY29uc3QgVFlQRV9OQU1FOiBzdHJpbmcgPSBcInBoeC1kYXRhLWZvcm1cIjtcblxuLy8gZm9yIHRlc3Rpbmcgb25seSByZW1vdmUgdGhpcyBjb21wb25lbnQgd2hlbiBhbGwgZmlzaGlzaGVkXG5AQ29tcG9uZW50KHtcbiAgbW9kdWxlSWQ6IG1vZHVsZS5pZCxcbiAgc2VsZWN0b3I6IFRZUEVfTkFNRSxcbiAgdGVtcGxhdGU6IGA8ZGl2IGNsYXNzPVwiZGF0YS1mb3JtXCI+XG5cdDxkaXYgY2xhc3M9XCJoZWFkZXJcIj5cblx0XHQ8ZGl2IGNsYXNzPVwibGVmdFwiPlxuXHRcdFx0PGRpdiBjbGFzcz1cInRhYmxlLXdyYXBwZXJcIj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cInRhYmxlLWNlbGwtd3JhcHBlciBtaWRkbGVcIj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwidGl0bGVcIj4gUGF5bWVudCB2b3VjaGVyIDwvZGl2PlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJzdWJ0aXRsZVwiPiB2b3VjaGVyTm86IFBPWFhYWFhYWFhYIDwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvZGl2PlxuXHRcdDwvZGl2PlxuXHRcdDxkaXYgY2xhc3M9XCJyaWdodFwiPlxuXHRcdFx0PGRpdiBjbGFzcz1cInRhYmxlLXdyYXBwZXJcIj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cInRhYmxlLWNlbGwtd3JhcHBlciBtaWRkbGVcIj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwidGl0bGVcIj4gQUJTIE1hbmFnZW1lbnQgc29sdXRpb24gPC9kaXY+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cInN1YnRpdGxlXCI+IGFkZHJlc3Mgc3RoaW5nIDwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvZGl2PlxuXHRcdDwvZGl2PlxuXHQ8L2Rpdj5cblx0PGRpdiBjbGFzcz1cImJvZHlcIj5cblx0XHQ8ZGl2IGNsYXNzPVwiYm9keS1jb250YWluZXJcIj5cblx0XHRcdDxkaXYgY2xhc3M9XCJyb3dcIj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPjxtYXRlcmlhbC10ZXh0LWJveCByZXF1aXJlZCAjbmFtZVRleHRGaWVsZCBbbGFiZWxdPVwiZ2V0TGFiZWxzKClbMF1cIiBbZGVzY3JpcHRpb25dPVwiZ2V0RGVzY3JpcHRpb25zKClbMF1cIiBbZGF0YV09XCJfZ2V0RGF0YUNvbnRhaW5lcigpXCIgW2ZpZWxkXT1cImdldEZpZWxkcygpWzBdXCIgW2RhdGFQYXJlbnRdPVwidGhpc1wiPjwvbWF0ZXJpYWwtdGV4dC1ib3g+PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblx0XHRcdDxkaXYgY2xhc3M9XCJyb3dcIj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPjxtYXRlcmlhbC10ZXh0LWJveCAjc2hvcnROYW1lVGV4dEZpZWxkIFtsYWJlbF09XCJnZXRMYWJlbHMoKVsxXVwiIFtkZXNjcmlwdGlvbl09XCJnZXREZXNjcmlwdGlvbnMoKVsxXVwiIFtkYXRhXT1cIl9nZXREYXRhQ29udGFpbmVyKClcIiBbZmllbGRdPVwiZ2V0RmllbGRzKClbMV1cIiBbZGF0YVBhcmVudF09XCJ0aGlzXCI+PC9tYXRlcmlhbC10ZXh0LWJveD48L2Rpdj5cblx0XHRcdDwvZGl2PlxuXHRcdFx0PGRpdiBjbGFzcz1cInJvd1wiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+PG1hdGVyaWFsLXRleHQtYm94ICNkYXRlVGV4dEZpZWxkIFtsYWJlbF09XCJnZXRMYWJlbHMoKVsyXVwiIFtkZXNjcmlwdGlvbl09XCJnZXREZXNjcmlwdGlvbnMoKVsyXVwiIFtkYXRhXT1cIl9nZXREYXRhQ29udGFpbmVyKClcIiBbZmllbGRdPVwiZ2V0RmllbGRzKClbMl1cIiBbZGF0YVBhcmVudF09XCJ0aGlzXCI+PC9tYXRlcmlhbC10ZXh0LWJveD48L2Rpdj5cblx0XHRcdDwvZGl2PlxuXG5cdFx0XHQ8ZGl2IGNsYXNzPVwicm93XCI+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxuXHRcdFx0XHRcdDxtYXRlcmlhbC1kYXRlLXBpY2tlciBbcGh4TWluXT1cImdldE1pbkRhdGUoKVwiIFtwaHhNYXhdPVwiZ2V0TWF4RGF0ZSgpXCIgW2Rlc2NyaXB0aW9uXT1cImdldERlc2NyaXB0aW9ucygpWzNdXCI+PC9tYXRlcmlhbC1kYXRlLXBpY2tlcj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxuXHRcdFx0XHRcdDxtYXRlcmlhbC10aW1lLXBpY2tlciBbcGh4TWluXT1cImdldE1pblRpbWUoKVwiIFtwaHhNYXhdPVwiZ2V0TWF4VGltZSgpXCIgW2Rlc2NyaXB0aW9uXT1cImdldERlc2NyaXB0aW9ucygpWzRdXCI+PC9tYXRlcmlhbC10aW1lLXBpY2tlcj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblxuXHRcdFx0PGRpdiBjbGFzcz1cInJvd1wiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XG5cdFx0XHRcdFx0PG1hdGVyaWFsLXRleHQtYXJlYSByZXF1aXJlZCBbcm93c109XCJnZXRSb3dzKClcIiBbY29sc109XCJnZXRDb2xzKClcIiAjYXJlYVRleHRGaWVsZCBbbGFiZWxdPVwiZ2V0TGFiZWxzKClbNV1cIiBbZGVzY3JpcHRpb25dPVwiZ2V0RGVzY3JpcHRpb25zKClbNV1cIiBbZGF0YV09XCJfZ2V0RGF0YUNvbnRhaW5lcigpXCIgW2ZpZWxkXT1cImdldEZpZWxkcygpWzVdXCIgW2RhdGFQYXJlbnRdPVwidGhpc1wiPjwvbWF0ZXJpYWwtdGV4dC1hcmVhPlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvZGl2PlxuXG5cdFx0XHQ8ZGl2IGNsYXNzPVwicm93XCI+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJjb2wtbWQtM1wiPjxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCIgKGNsaWNrKT1cInNob3dEYXRhQ2xpY2tlZCgkZXZlbnQpXCI+U2hvdyBEYXRhPC9idXR0b24+PC9kaXY+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJjb2wtbWQtM1wiPjxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCIgKGNsaWNrKT1cImVkaXREYXRhQ2xpY2tlZCgkZXZlbnQpXCI+RWRpdCBEYXRhPC9idXR0b24+PC9kaXY+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJjb2wtbWQtM1wiPjxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCIgKGNsaWNrKT1cInNhdmVEYXRhQ2xpY2tlZCgkZXZlbnQpXCI+U2F2ZSBEYXRhPC9idXR0b24+PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblx0XHQ8L2Rpdj5cblx0PC9kaXY+XG48L2Rpdj5cbmBcbn0pXG5leHBvcnQgY2xhc3MgRGF0YUZvcm0gZXh0ZW5kcyBBYnN0cmFjdEhhc0RhdGEgaW1wbGVtZW50cyBPbkluaXQsIElIYXNNb2RlbCwgSUNoYW5nZWFibGUge1xuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVFlQRV9OQU1FOiBzdHJpbmcgPSBUWVBFX05BTUU7XG5cbiAgQElucHV0KClcbiAgcHJvdGVjdGVkIGRhdGFQYXJlbnQ6IElIYXNEYXRhO1xuICBwcml2YXRlIG1vZGVsOiBhbnk7XG4gIHByaXZhdGUgZmllbGRzOiBzdHJpbmdbXTtcbiAgcHJpdmF0ZSBsYWJlbHM6IHN0cmluZ1tdO1xuICBwcml2YXRlIGRlc2NyaXB0aW9uczogc3RyaW5nW107XG4gIEBWaWV3Q2hpbGQoJ25hbWVUZXh0RmllbGQnKVxuICBwcml2YXRlIG5hbWVUZXh0RmllbGQ6IE1hdGVyaWFsVGV4dEJveDtcbiAgQFZpZXdDaGlsZCgnc2hvcnROYW1lVGV4dEZpZWxkJylcbiAgcHJpdmF0ZSBzaG9ydE5hbWVUZXh0RmllbGQ6IE1hdGVyaWFsVGV4dEJveDtcbiAgQFZpZXdDaGlsZCgnZGF0ZVRleHRGaWVsZCcpXG4gIHByaXZhdGUgZGF0ZVRleHRGaWVsZDogTWF0ZXJpYWxUZXh0Qm94O1xuICBAVmlld0NoaWxkKCdkYXRlUGlja2VyVGV4dEZpZWxkJylcbiAgcHJpdmF0ZSBkYXRlUGlja2VyVGV4dEZpZWxkOiBNYXRlcmlhbERhdGVQaWNrZXI7XG4gIEBWaWV3Q2hpbGQoJ3RpbWVQaWNrZXJUZXh0RmllbGQnKVxuICBwcml2YXRlIHRpbWVQaWNrZXJUZXh0RmllbGQ6IE1hdGVyaWFsVGltZVBpY2tlcjtcbiAgQFZpZXdDaGlsZCgnYXJlYVRleHRGaWVsZCcpXG4gIHByaXZhdGUgYXJlYVRleHRGaWVsZDogTWF0ZXJpYWxUZXh0QXJlYTtcbiAgcHJpdmF0ZSBkYXRhQ29udGFpbmVyOiBhbnlbXTtcbiAgcHJpdmF0ZSBjaGFuZ2VFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIC8vIHRlc3RcbiAgcHJpdmF0ZSBub3RpZnlNZ3I6IE5vdGlmaWNhdGlvbk1hbmFnZXI7XG4gIHByaXZhdGUgZGlhbG9nU2VydjogRGlhbG9nU2VydmljZTtcbiAgcHJpdmF0ZSBtaW5EYXRlOiBEYXRlO1xuICBwcml2YXRlIG1heERhdGU6IERhdGU7XG4gIHByaXZhdGUgbWluVGltZTogRGF0ZTtcbiAgcHJpdmF0ZSBtYXhUaW1lOiBEYXRlO1xuICBwcml2YXRlIHJvd3M6IG51bWJlcjtcbiAgcHJpdmF0ZSBjb2xzOiBudW1iZXI7XG5cbiAgcHJpdmF0ZSB0ZXN0Q291bnQ6IG51bWJlciA9IDA7XG5cbiAgY29uc3RydWN0b3Iobm90aWZ5TWdyOiBOb3RpZmljYXRpb25NYW5hZ2VyLCBkaWFsb2dTZXJ2OiBEaWFsb2dTZXJ2aWNlLCBlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7XG4gICAgc3VwZXIoZWxlbWVudFJlZik7XG4gICAgdGhpcy5kYXRhQ29udGFpbmVyID0gW107XG4gICAgdGhpcy5kZXNjcmlwdGlvbnMgPSBbXTtcbiAgICB0aGlzLmNoYW5nZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgLy8gZm9yIHRlc3Qgbm90aWZpY2F0aW9uXG4gICAgdGhpcy5ub3RpZnlNZ3IgPSBub3RpZnlNZ3I7XG4gICAgdGhpcy5kaWFsb2dTZXJ2ID0gZGlhbG9nU2VydjtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xuXG4gICAgdGhpcy5maWVsZHMgPSBbXCJuYW1lXCIsIFwic2hvcnROYW1lXCIsIFwiX2NyZWF0ZWRcIiwgXCJkYXRlUGlja2VyTmFtZVwiLCBcInRpbWVQaWNrZXJOYW1lXCIsIFwiYXJlYU5hbWVcIl07XG4gICAgdGhpcy5sYWJlbHMgPSBbXCJOYW1lXCIsIFwiU2hvcnROYW1lXCIsIFwiQ3JlYXRlIERhdGVcIiwgXCJEYXRlUGlja2VyTmFtZVwiLCBcIlRpbWVQaWNrZXJOYW1lXCIsIFwiQXJlYU5hbWVcIl07XG4gICAgdGhpcy5kZXNjcmlwdGlvbnMgPSBbXCJuYW1lIGRlc2NyaXB0aW9uXCIsIFwic2hvcnROYW1lIGRlc2NyaXB0aW9uXCIsIFwiY3JlYXRlRGF0ZSBEZXNjcmlwdGlvblwiXG4gICAgICAsIFwiZGF0ZVBpY2tlck5hbWUgZGVzY3JpcHRpb25cIiwgXCJ0aW1lUGlja2VyTmFtZSBkZXNjcmlwdGlvblwiLCBcImFyZWFOYW1lIGRlc2NyaXB0aW9uXCJdO1xuXG4gICAgbGV0IG5hbWVGaWVsZENoYW5nZUVWID0gdGhpcy5uYW1lVGV4dEZpZWxkLmdldENoYW5nZUV2ZW50KCk7XG4gICAgaWYgKG5hbWVGaWVsZENoYW5nZUVWICE9PSBudWxsICYmIHR5cGVvZiBuYW1lRmllbGRDaGFuZ2VFViAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIG5hbWVGaWVsZENoYW5nZUVWLnN1YnNjcmliZSgoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICBpZiAoZXZlbnQuZGV0YWlsLmRhdGEgIT09IG51bGwgJiYgdHlwZW9mIGV2ZW50LmRldGFpbC5kYXRhICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGlmIChldmVudC5kZXRhaWwuZGF0YS5idWJibGVTdGFjayAhPT0gbnVsbCAmJiB0eXBlb2YgZXZlbnQuZGV0YWlsLmRhdGEuYnViYmxlU3RhY2sgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBldmVudC5kZXRhaWwuZGF0YS5idWJibGVTdGFjay5wdXNoKHRoaXMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBldmVudC5kZXRhaWwuZGF0YS5idWJibGVTdGFjayA9IFt0aGlzXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vbkVtaXRDaGFuZ2UoZXZlbnQpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGxldCBzaG9ydE5hbWVDaGFuZ2VFViA9IHRoaXMuc2hvcnROYW1lVGV4dEZpZWxkLmdldENoYW5nZUV2ZW50KCk7XG4gICAgaWYgKHNob3J0TmFtZUNoYW5nZUVWICE9PSBudWxsICYmIHR5cGVvZiBzaG9ydE5hbWVDaGFuZ2VFViAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHNob3J0TmFtZUNoYW5nZUVWLnN1YnNjcmliZSgoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICBpZiAoZXZlbnQuZGV0YWlsLmRhdGEgIT09IG51bGwgJiYgdHlwZW9mIGV2ZW50LmRldGFpbC5kYXRhICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGlmIChldmVudC5kZXRhaWwuZGF0YS5idWJibGVTdGFjayAhPT0gbnVsbCAmJiB0eXBlb2YgZXZlbnQuZGV0YWlsLmRhdGEuYnViYmxlU3RhY2sgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBldmVudC5kZXRhaWwuZGF0YS5idWJibGVTdGFjay5wdXNoKHRoaXMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBldmVudC5kZXRhaWwuZGF0YS5idWJibGVTdGFjayA9IFt0aGlzXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vbkVtaXRDaGFuZ2UoZXZlbnQpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5taW5EYXRlID0gbmV3IERhdGUoKTtcbiAgICB0aGlzLm1pbkRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgdGhpcy5taW5EYXRlLnNldE1vbnRoKDUpO1xuICAgIHRoaXMubWF4RGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgdGhpcy5tYXhEYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgIHRoaXMubWF4RGF0ZS5zZXRNb250aCgxMCk7XG5cbiAgICB0aGlzLm1pblRpbWUgPSBuZXcgRGF0ZSgpO1xuICAgIHRoaXMubWluVGltZS5zZXRIb3VycygxMCwgMCwgMCwgMCk7XG4gICAgdGhpcy5tYXhUaW1lID0gbmV3IERhdGUoKTtcbiAgICB0aGlzLm1heFRpbWUuc2V0SG91cnMoMTUsIDAsIDAsIDApO1xuXG4gICAgdGhpcy5yb3dzID0gODtcbiAgICB0aGlzLmNvbHMgPSAxMDA7XG4gIH1cblxuICBwcml2YXRlIG9uRW1pdENoYW5nZShldmVudDogYW55KTogdm9pZCB7XG4gICAgbGV0IGRhdGE6IGFueSA9IHtcbiAgICAgIHNvdXJjZTogZXZlbnQsXG4gICAgICBidWJibGVTdGFjazogW3RoaXNdXG4gICAgfTtcbiAgICBsZXQgZXYgPSBFdmVudFV0aWxzLm5ld0N1c3RvbUV2ZW50KENIQU5HRV9FVkVOVCwgdGhpcywgZGF0YSwgbnVsbCk7XG5cbiAgICB0aGlzLmNoYW5nZUV2ZW50LmVtaXQoZXYpO1xuICB9XG5cbiAgcHVibGljIF9nZXREYXRhQ29udGFpbmVyKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhQ29udGFpbmVyO1xuICB9XG5cbiAgcHVibGljIGdldE1vZGVsKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWw7XG4gIH1cblxuICBwdWJsaWMgc2V0TW9kZWwobW9kZWw6IGFueSk6IHZvaWQge1xuICAgIHRoaXMubW9kZWwgPSBtb2RlbDtcbiAgfVxuXG4gIHB1YmxpYyBzZXREYXRhKGRhdGE6IGFueSk6IHZvaWQge1xuICAgIC8vIG92ZXJpZGUgbWV0aG9kXG4gICAgdGhpcy5kYXRhID0gZGF0YTtcblxuICAgIGlmIChkYXRhICE9PSBudWxsICYmIHR5cGVvZiBkYXRhICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YS5vYmplY3RzKSkge1xuICAgICAgICB0aGlzLmRhdGFDb250YWluZXIgPSBkYXRhLm9iamVjdHM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gY2hpbGQgYWRkIGRhdGFDb250YWluZXIgaW5zdGVhZFxuICAgIGlmICh0aGlzLmRhdGFDaGlsZHJlbiAhPT0gbnVsbCkge1xuICAgICAgZm9yIChsZXQgYyBvZiB0aGlzLmRhdGFDaGlsZHJlbikge1xuICAgICAgICBjLnNldERhdGEodGhpcy5kYXRhQ29udGFpbmVyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2hvd0RhdGFDbGlja2VkKCRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAvLyB0ZXN0IG5vdGlmaWNhdGlvblxuICAgIGlmICh0aGlzLm5vdGlmeU1nciAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5ub3RpZnlNZ3IgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLnRlc3RDb3VudCArPSAxO1xuICAgICAgbGV0IGQgPSBuZXcgRGF0ZSgpO1xuICAgICAgbGV0IGNsaWNrRnVuYzogRnVuY3Rpb24gPSAoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdCT0RZIENMSUNLRUQnKTtcbiAgICAgIH07XG4gICAgICBsZXQgbm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24gPSBuZXcgTm90aWZpY2F0aW9uKFwiXCIsIFwiVElUTEU6IFwiICsgdGhpcy50ZXN0Q291bnQsIFwiZGVzY3JpcHRpb25cIiwgdHJ1ZSwgXCJMQlwiLCBkLCAyMDAwKTtcbiAgICAgIG5vdGlmaWNhdGlvbi5jbGlja0hhbmRsZXIgPSBjbGlja0Z1bmM7XG4gICAgICBsZXQgYWN0aW9uMTogTm90aWZpY2F0aW9uQWN0aW9uID0gbmV3IE5vdGlmaWNhdGlvbkFjdGlvbignTU9SRScsIChldjogYW55KSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdmaXJzdCBDTElDS0VEJyk7XG4gICAgICAgIGlmIChldiAhPT0gbnVsbCAmJiB0eXBlb2YgZXYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgZXYuZGV0YWlsLmRhdGEuaW5zdGFuY2Uuc2hvd0JvZHkoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBsZXQgYWN0aW9uMjogTm90aWZpY2F0aW9uQWN0aW9uID0gbmV3IE5vdGlmaWNhdGlvbkFjdGlvbignQ0FOQ0VMJywgKCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnY2FuY2VsIENMSUNLRUQnKTtcbiAgICAgIH0sIHRydWUpO1xuICAgICAgbm90aWZpY2F0aW9uLmFkZEFjdGlvbihhY3Rpb24xKTtcbiAgICAgIG5vdGlmaWNhdGlvbi5hZGRBY3Rpb24oYWN0aW9uMik7XG4gICAgICBub3RpZmljYXRpb24uYm9keUNvbXBvbmVudCA9IFRlc3RDb21wb25lbnQ7XG4gICAgICB0aGlzLm5vdGlmeU1nci5ub3RpZnkobm90aWZpY2F0aW9uKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2F2ZURhdGFDbGlja2VkKCRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBsZXQgbmFtZTogc3RyaW5nID0gdGhpcy5uYW1lVGV4dEZpZWxkLmdldElucHV0VmFsdWUoKTtcbiAgICBsZXQgc2hvcnROYW1lOiBzdHJpbmcgPSB0aGlzLnNob3J0TmFtZVRleHRGaWVsZC5nZXRJbnB1dFZhbHVlKCk7XG4gICAgbGV0IGRhdGVTdHJpbmc6IHN0cmluZyA9IHRoaXMuZGF0ZVRleHRGaWVsZC5nZXRJbnB1dFZhbHVlKCk7XG4gICAgbGV0IGRhdGVQaWNrZXI6IGFueSA9IHRoaXMuZGF0ZVBpY2tlclRleHRGaWVsZC5nZXREYXRhKCk7XG4gICAgbGV0IHRpbWVQaWNrZXI6IGFueSA9IHRoaXMudGltZVBpY2tlclRleHRGaWVsZC5nZXREYXRhKCk7XG4gICAgbGV0IGFyZWFOYW1lOiBzdHJpbmcgPSB0aGlzLmFyZWFUZXh0RmllbGQuZ2V0SW5wdXRWYWx1ZSgpO1xuXG4gICAgaWYgKHRoaXMuZGF0YS5lZGl0b3IgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuZGF0YS5lZGl0b3IgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBsZXQgZm9ybVZpZXcgPSB0aGlzLmRhdGEuZWRpdG9yLmdldFZpZXdDb21wb25lbnRGcm9tVHlwZShGT1JNX1ZJRVcpIGFzIEZvcm1WaWV3O1xuICAgICAgbGV0IGN1ckluZGV4ID0gZm9ybVZpZXcuZ2V0Q3VycmVudFRhYkluZGV4KCk7XG5cbiAgICAgIGxldCBvYmo6IGFueSA9IGZvcm1WaWV3LmdldFRhYkRhdGEoY3VySW5kZXgpO1xuXG4gICAgICBpZiAob2JqICE9PSBudWxsICYmIG9iai5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxldCBvYmpzOiBhbnlbXSA9IGZvcm1WaWV3LmdldFRhYkRhdGEoY3VySW5kZXgpO1xuXG4gICAgICAgIGxldCBjcmVhdGVkQXJyYXk6IGFueVtdID0gW107XG4gICAgICAgIGxldCB1cGRhdGVkQXJyYXk6IGFueVtdID0gW107XG5cbiAgICAgICAgbGV0IG9iamVjdElkRmllbGQ6IHN0cmluZyA9IHRoaXMuZGF0YS5lZGl0b3IuZ2V0T2JqZWN0SWRGaWVsZCgpO1xuICAgICAgICBmb3IgKGxldCBvYmogb2Ygb2Jqcykge1xuICAgICAgICAgIGlmIChvYmpbb2JqZWN0SWRGaWVsZF0gIT09IG51bGwgJiYgdHlwZW9mIG9ialtvYmplY3RJZEZpZWxkXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHVwZGF0ZWRBcnJheS5wdXNoKG9iaik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNyZWF0ZWRBcnJheS5wdXNoKG9iaik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gY3JlYXRlIGRhdGFcbiAgICAgICAgaWYgKGNyZWF0ZWRBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5kYXRhLmVkaXRvci5jcmVhdGVEYXRhKGNyZWF0ZWRBcnJheSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdXBkYXRlIGRhdGFcbiAgICAgICAgaWYgKHVwZGF0ZWRBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5kYXRhLmVkaXRvci51cGRhdGVEYXRhKHVwZGF0ZWRBcnJheSk7XG4gICAgICAgIH1cblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gY3JlYXRlIG5ldyBvYmplY3RcbiAgICAgICAgbGV0IG5ld09iajogYW55ID0ge1xuICAgICAgICAgIG5hbWU6IG5hbWUsIHNob3J0TmFtZTogc2hvcnROYW1lXG4gICAgICAgICAgLCBfY3JlYXRlZDogZGF0ZVN0cmluZywgZGF0ZVBpY2tlcjogZGF0ZVBpY2tlclxuICAgICAgICAgICwgdGltZVBpY2tlcjogdGltZVBpY2tlciwgYXJlYU5hbWU6IGFyZWFOYW1lXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZGF0YS5lZGl0b3IuY3JlYXRlRGF0YShuZXdPYmopO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBlZGl0RGF0YUNsaWNrZWQoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIC8vIHRlc3QgY2xlYXIgYWxsIG5vdGlmeVxuICAgIGlmICh0aGlzLm5vdGlmeU1nciAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5ub3RpZnlNZ3IgIT09ICd1bmRlZmluZWQnKSB7XG5cbiAgICAgIHRoaXMubm90aWZ5TWdyLmNsZWFyQWxsKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldENoYW5nZUV2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5jaGFuZ2VFdmVudDtcbiAgfVxuXG4gIHB1YmxpYyBpc1NlbGZEYXRhRGlydHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIHNlbGZTYXZlRGF0YShkYXRhOiBhbnkpOiB2b2lkIHtcblxuICB9XG5cbiAgcHVibGljIHNlbGZSZXNldERhdGEoKTogdm9pZCB7XG5cbiAgfVxuXG4gIHB1YmxpYyBkb1ByZWxvYWQoKTogUHJvbWlzZTxhbnk+IHsgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7ICAgICAgIHJlc29sdmUobnVsbCk7ICAgICB9KTsgICB9ICBwdWJsaWMgZG9Mb2FkZWQoKTogdm9pZCB7XG5cbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWVsZHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmZpZWxkcztcbiAgfVxuXG4gIHB1YmxpYyBnZXRMYWJlbHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmxhYmVscztcbiAgfVxuXG4gIHB1YmxpYyBnZXREZXNjcmlwdGlvbnMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmRlc2NyaXB0aW9ucztcbiAgfVxuXG4gIHB1YmxpYyBnZXRNaW5EYXRlKCk6IERhdGUge1xuICAgIHJldHVybiB0aGlzLm1pbkRhdGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0TWF4RGF0ZSgpOiBEYXRlIHtcbiAgICByZXR1cm4gdGhpcy5tYXhEYXRlO1xuICB9XG5cbiAgcHVibGljIGdldE1pblRpbWUoKTogRGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMubWluVGltZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRNYXhUaW1lKCk6IERhdGUge1xuICAgIHJldHVybiB0aGlzLm1heFRpbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0Um93cygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnJvd3M7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29scygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNvbHM7XG4gIH1cblxufVxuIl19