UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

444 lines (440 loc) 44 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ 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'; const /** @type {?} */ FORM_VIEW = 'form-view'; const /** @type {?} */ TYPE_NAME = "phx-data-form"; export class DataForm extends AbstractHasData { /** * @param {?} notifyMgr * @param {?} dialogServ * @param {?} elementRef */ constructor(notifyMgr, dialogServ, elementRef) { super(elementRef); this.testCount = 0; this.dataContainer = []; this.descriptions = []; this.changeEvent = new EventEmitter(); // for test notification this.notifyMgr = notifyMgr; this.dialogServ = dialogServ; } /** * @return {?} */ ngOnInit() { super.ngOnInit(); 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"]; let /** @type {?} */ nameFieldChangeEV = this.nameTextField.getChangeEvent(); if (nameFieldChangeEV !== null && typeof nameFieldChangeEV !== 'undefined') { nameFieldChangeEV.subscribe((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); }); } let /** @type {?} */ shortNameChangeEV = this.shortNameTextField.getChangeEvent(); if (shortNameChangeEV !== null && typeof shortNameChangeEV !== 'undefined') { shortNameChangeEV.subscribe((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 {?} */ onEmitChange(event) { let /** @type {?} */ data = { source: event, bubbleStack: [this] }; let /** @type {?} */ ev = EventUtils.newCustomEvent(CHANGE_EVENT, this, data, null); this.changeEvent.emit(ev); } /** * @return {?} */ _getDataContainer() { return this.dataContainer; } /** * @return {?} */ getModel() { return this.model; } /** * @param {?} model * @return {?} */ setModel(model) { this.model = model; } /** * @param {?} data * @return {?} */ setData(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) { for (let /** @type {?} */ c of this.dataChildren) { c.setData(this.dataContainer); } } } /** * @param {?} $event * @return {?} */ showDataClicked($event) { // test notification if (this.notifyMgr !== null && typeof this.notifyMgr !== 'undefined') { this.testCount += 1; let /** @type {?} */ d = new Date(); let /** @type {?} */ clickFunc = () => { console.log('BODY CLICKED'); }; let /** @type {?} */ notification = new Notification("", "TITLE: " + this.testCount, "description", true, "LB", d, 2000); notification.clickHandler = clickFunc; let /** @type {?} */ action1 = new NotificationAction('MORE', (ev) => { console.log('first CLICKED'); if (ev !== null && typeof ev !== 'undefined') { ev.detail.data.instance.showBody(); } }); let /** @type {?} */ action2 = new NotificationAction('CANCEL', () => { console.log('cancel CLICKED'); }, true); notification.addAction(action1); notification.addAction(action2); notification.bodyComponent = TestComponent; this.notifyMgr.notify(notification); } } /** * @param {?} $event * @return {?} */ saveDataClicked($event) { let /** @type {?} */ name = this.nameTextField.getInputValue(); let /** @type {?} */ shortName = this.shortNameTextField.getInputValue(); let /** @type {?} */ dateString = this.dateTextField.getInputValue(); let /** @type {?} */ datePicker = this.datePickerTextField.getData(); let /** @type {?} */ timePicker = this.timePickerTextField.getData(); let /** @type {?} */ areaName = this.areaTextField.getInputValue(); if (this.data.editor !== null && typeof this.data.editor !== 'undefined') { let /** @type {?} */ formView = /** @type {?} */ (this.data.editor.getViewComponentFromType(FORM_VIEW)); let /** @type {?} */ curIndex = formView.getCurrentTabIndex(); let /** @type {?} */ obj = formView.getTabData(curIndex); if (obj !== null && obj.length > 0) { let /** @type {?} */ objs = formView.getTabData(curIndex); let /** @type {?} */ createdArray = []; let /** @type {?} */ updatedArray = []; let /** @type {?} */ objectIdField = this.data.editor.getObjectIdField(); for (let /** @type {?} */ obj of objs) { if (obj[objectIdField] !== null && typeof obj[objectIdField] !== 'undefined') { updatedArray.push(obj); } else { createdArray.push(obj); } } // 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 let /** @type {?} */ newObj = { name: name, shortName: shortName, _created: dateString, datePicker: datePicker, timePicker: timePicker, areaName: areaName }; this.data.editor.createData(newObj); } } } /** * @param {?} $event * @return {?} */ editDataClicked($event) { // test clear all notify if (this.notifyMgr !== null && typeof this.notifyMgr !== 'undefined') { this.notifyMgr.clearAll(); } } /** * @return {?} */ getChangeEvent() { return this.changeEvent; } /** * @return {?} */ isSelfDataDirty() { return false; } /** * @param {?} data * @return {?} */ selfSaveData(data) { } /** * @return {?} */ selfResetData() { } /** * @return {?} */ doPreload() { return new Promise((resolve, reject) => { resolve(null); }); } /** * @return {?} */ doLoaded() { } /** * @return {?} */ getFields() { return this.fields; } /** * @return {?} */ getLabels() { return this.labels; } /** * @return {?} */ getDescriptions() { return this.descriptions; } /** * @return {?} */ getMinDate() { return this.minDate; } /** * @return {?} */ getMaxDate() { return this.maxDate; } /** * @return {?} */ getMinTime() { return this.minTime; } /** * @return {?} */ getMaxTime() { return this.maxTime; } /** * @return {?} */ getRows() { return this.rows; } /** * @return {?} */ getCols() { return this.cols; } } DataForm.TYPE_NAME = TYPE_NAME; DataForm.decorators = [ { type: Component, args: [{ moduleId: module.id, selector: TYPE_NAME, template: `<div class="data-form"> <div class="header"> <div class="left"> <div class="table-wrapper"> <div class="table-cell-wrapper middle"> <div class="title"> Payment voucher </div> <div class="subtitle"> voucherNo: POXXXXXXXXX </div> </div> </div> </div> <div class="right"> <div class="table-wrapper"> <div class="table-cell-wrapper middle"> <div class="title"> ABS Management solution </div> <div class="subtitle"> address sthing </div> </div> </div> </div> </div> <div class="body"> <div class="body-container"> <div class="row"> <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> </div> <div class="row"> <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> </div> <div class="row"> <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> </div> <div class="row"> <div class="col-md-6"> <material-date-picker [phxMin]="getMinDate()" [phxMax]="getMaxDate()" [description]="getDescriptions()[3]"></material-date-picker> </div> <div class="col-md-6"> <material-time-picker [phxMin]="getMinTime()" [phxMax]="getMaxTime()" [description]="getDescriptions()[4]"></material-time-picker> </div> </div> <div class="row"> <div class="col-md-12"> <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> </div> </div> <div class="row"> <div class="col-md-3"><button type="button" class="btn btn-default" (click)="showDataClicked($event)">Show Data</button></div> <div class="col-md-3"><button type="button" class="btn btn-default" (click)="editDataClicked($event)">Edit Data</button></div> <div class="col-md-3"><button type="button" class="btn btn-default" (click)="saveDataClicked($event)">Save Data</button></div> </div> </div> </div> </div> ` },] }, ]; /** @nocollapse */ DataForm.ctorParameters = () => [ { 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',] },], }; 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGF0YUZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vY29tLnBobG94dWkvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50L0RhdGFGb3JtLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxVQUFVLEVBQUUsS0FBSyxFQUFnQixTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVHLE9BQU8sRUFBNEIsWUFBWSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDN0UsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBR2pFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0VBQXNFLENBQUM7QUFDdkcsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUVBQXlFLENBQUM7QUFDN0csT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUVBQXlFLENBQUM7QUFDN0csT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUVBQXVFLENBQUM7QUFLekcsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzFELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQTtBQUN2RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFdkQsdUJBQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQztBQUk5Qix1QkFBTSxTQUFTLEdBQVcsZUFBZSxDQUFDO0FBOEQxQyxNQUFNLGVBQWdCLFNBQVEsZUFBZTs7Ozs7O0lBb0MzQyxZQUFZLFNBQThCLEVBQUUsVUFBeUIsRUFBRSxVQUFzQjtRQUMzRixLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7eUJB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QUMsRUFBRTtnQkFDbkIsUUFBUSxFQUFFLFNBQVM7Z0JBQ25CLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBc0RYO2FBQ0E7Ozs7WUFsRlEsbUJBQW1CO1lBQ25CLGFBQWE7WUFITSxVQUFVOzs7MkJBeUZuQyxLQUFLOzhCQU1MLFNBQVMsU0FBQyxlQUFlO21DQUV6QixTQUFTLFNBQUMsb0JBQW9COzhCQUU5QixTQUFTLFNBQUMsZUFBZTtvQ0FFekIsU0FBUyxTQUFDLHFCQUFxQjtvQ0FFL0IsU0FBUyxTQUFDLHFCQUFxQjs4QkFFL0IsU0FBUyxTQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgRWxlbWVudFJlZiwgSW5wdXQsIEhvc3RMaXN0ZW5lciwgVmlld0NoaWxkLCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1lbnVJdGVtTW9kZWwsIE1lbnVNb2RlbCwgTm90aWZpY2F0aW9uLCBOb3RpZmljYXRpb25BY3Rpb24gfSBmcm9tICcuL21vZGVsL21vZGVscyc7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25NYW5hZ2VyIH0gZnJvbSAnLi4vc2VydmljZS9Ob3RpZmljYXRpb25NYW5hZ2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgRGlhbG9nU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2UvRGlhbG9nU2VydmljZS5zZXJ2aWNlJztcbmltcG9ydCB7IElIYXNEYXRhIH0gZnJvbSAnLi9JSGFzRGF0YSc7XG5pbXBvcnQgeyBJSGFzTW9kZWwgfSBmcm9tICcuL0lIYXNNb2RlbCc7XG5pbXBvcnQgeyBBYnN0cmFjdEhhc0RhdGEgfSBmcm9tICcuL0Fic3RyYWN0SGFzRGF0YSc7XG5pbXBvcnQgeyBNYXRlcmlhbFRleHRCb3ggfSBmcm9tICcuLi90aGVtZS9tYXRlcmlhbC9jb21wb25lbnQvZGF0YXZpZXcvaW5wdXQvTWF0ZXJpYWxUZXh0Qm94LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNYXRlcmlhbERhdGVQaWNrZXIgfSBmcm9tICcuLi90aGVtZS9tYXRlcmlhbC9jb21wb25lbnQvZGF0YXZpZXcvaW5wdXQvTWF0ZXJpYWxEYXRlUGlja2VyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNYXRlcmlhbFRpbWVQaWNrZXIgfSBmcm9tICcuLi90aGVtZS9tYXRlcmlhbC9jb21wb25lbnQvZGF0YXZpZXcvaW5wdXQvTWF0ZXJpYWxUaW1lUGlja2VyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNYXRlcmlhbFRleHRBcmVhIH0gZnJvbSAnLi4vdGhlbWUvbWF0ZXJpYWwvY29tcG9uZW50L2RhdGF2aWV3L2lucHV0L01hdGVyaWFsVGV4dEFyZWEuY29tcG9uZW50JztcbmltcG9ydCB7IFRleHRCb3ggfSBmcm9tICcuL2RhdGF2aWV3L2lucHV0L1RleHRCb3guY29tcG9uZW50JztcbmltcG9ydCB7IFRleHRBcmVhIH0gZnJvbSAnLi9kYXRhdmlldy9pbnB1dC9UZXh0QXJlYS5jb21wb25lbnQnO1xuaW1wb3J0IHsgSUNoYW5nZWFibGUgfSBmcm9tICcuL0lDaGFuZ2VhYmxlJztcbmltcG9ydCB7IEZvcm1WaWV3IH0gZnJvbSAnLi9lZGl0b3IvZWRpdG9yLmludGVybmFsL0Zvcm1WaWV3LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUZXN0Q29tcG9uZW50IH0gZnJvbSAnLi9UZXN0Q29tcG9uZW50LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDSEFOR0VfRVZFTlQgfSBmcm9tICcuLi9zaGFyZS9DdXN0b21FdmVudFR5cGUnXG5pbXBvcnQgeyBFdmVudFV0aWxzIH0gZnJvbSAnLi4vc2hhcmUvdXRpbHMvRXZlbnRVdGlscyc7XG5cbmNvbnN0IEZPUk1fVklFVyA9ICdmb3JtLXZpZXcnO1xuXG5kZWNsYXJlIHZhciAkOiBhbnk7XG5cbmNvbnN0IFRZUEVfTkFNRTogc3RyaW5nID0gXCJwaHgtZGF0YS1mb3JtXCI7XG5cbi8vIGZvciB0ZXN0aW5nIG9ubHkgcmVtb3ZlIHRoaXMgY29tcG9uZW50IHdoZW4gYWxsIGZpc2hpc2hlZFxuQENvbXBvbmVudCh7XG4gIG1vZHVsZUlkOiBtb2R1bGUuaWQsXG4gIHNlbGVjdG9yOiBUWVBFX05BTUUsXG4gIHRlbXBsYXRlOiBgPGRpdiBjbGFzcz1cImRhdGEtZm9ybVwiPlxuXHQ8ZGl2IGNsYXNzPVwiaGVhZGVyXCI+XG5cdFx0PGRpdiBjbGFzcz1cImxlZnRcIj5cblx0XHRcdDxkaXYgY2xhc3M9XCJ0YWJsZS13cmFwcGVyXCI+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJ0YWJsZS1jZWxsLXdyYXBwZXIgbWlkZGxlXCI+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cInRpdGxlXCI+IFBheW1lbnQgdm91Y2hlciA8L2Rpdj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwic3VidGl0bGVcIj4gdm91Y2hlck5vOiBQT1hYWFhYWFhYWCA8L2Rpdj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblx0XHQ8L2Rpdj5cblx0XHQ8ZGl2IGNsYXNzPVwicmlnaHRcIj5cblx0XHRcdDxkaXYgY2xhc3M9XCJ0YWJsZS13cmFwcGVyXCI+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJ0YWJsZS1jZWxsLXdyYXBwZXIgbWlkZGxlXCI+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cInRpdGxlXCI+IEFCUyBNYW5hZ2VtZW50IHNvbHV0aW9uIDwvZGl2PlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJzdWJ0aXRsZVwiPiBhZGRyZXNzIHN0aGluZyA8L2Rpdj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblx0XHQ8L2Rpdj5cblx0PC9kaXY+XG5cdDxkaXYgY2xhc3M9XCJib2R5XCI+XG5cdFx0PGRpdiBjbGFzcz1cImJvZHktY29udGFpbmVyXCI+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwicm93XCI+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj48bWF0ZXJpYWwtdGV4dC1ib3ggcmVxdWlyZWQgI25hbWVUZXh0RmllbGQgW2xhYmVsXT1cImdldExhYmVscygpWzBdXCIgW2Rlc2NyaXB0aW9uXT1cImdldERlc2NyaXB0aW9ucygpWzBdXCIgW2RhdGFdPVwiX2dldERhdGFDb250YWluZXIoKVwiIFtmaWVsZF09XCJnZXRGaWVsZHMoKVswXVwiIFtkYXRhUGFyZW50XT1cInRoaXNcIj48L21hdGVyaWFsLXRleHQtYm94PjwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwicm93XCI+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj48bWF0ZXJpYWwtdGV4dC1ib3ggI3Nob3J0TmFtZVRleHRGaWVsZCBbbGFiZWxdPVwiZ2V0TGFiZWxzKClbMV1cIiBbZGVzY3JpcHRpb25dPVwiZ2V0RGVzY3JpcHRpb25zKClbMV1cIiBbZGF0YV09XCJfZ2V0RGF0YUNvbnRhaW5lcigpXCIgW2ZpZWxkXT1cImdldEZpZWxkcygpWzFdXCIgW2RhdGFQYXJlbnRdPVwidGhpc1wiPjwvbWF0ZXJpYWwtdGV4dC1ib3g+PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblx0XHRcdDxkaXYgY2xhc3M9XCJyb3dcIj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPjxtYXRlcmlhbC10ZXh0LWJveCAjZGF0ZVRleHRGaWVsZCBbbGFiZWxdPVwiZ2V0TGFiZWxzKClbMl1cIiBbZGVzY3JpcHRpb25dPVwiZ2V0RGVzY3JpcHRpb25zKClbMl1cIiBbZGF0YV09XCJfZ2V0RGF0YUNvbnRhaW5lcigpXCIgW2ZpZWxkXT1cImdldEZpZWxkcygpWzJdXCIgW2RhdGFQYXJlbnRdPVwidGhpc1wiPjwvbWF0ZXJpYWwtdGV4dC1ib3g+PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblxuXHRcdFx0PGRpdiBjbGFzcz1cInJvd1wiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cblx0XHRcdFx0XHQ8bWF0ZXJpYWwtZGF0ZS1waWNrZXIgW3BoeE1pbl09XCJnZXRNaW5EYXRlKClcIiBbcGh4TWF4XT1cImdldE1heERhdGUoKVwiIFtkZXNjcmlwdGlvbl09XCJnZXREZXNjcmlwdGlvbnMoKVszXVwiPjwvbWF0ZXJpYWwtZGF0ZS1waWNrZXI+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cblx0XHRcdFx0XHQ8bWF0ZXJpYWwtdGltZS1waWNrZXIgW3BoeE1pbl09XCJnZXRNaW5UaW1lKClcIiBbcGh4TWF4XT1cImdldE1heFRpbWUoKVwiIFtkZXNjcmlwdGlvbl09XCJnZXREZXNjcmlwdGlvbnMoKVs0XVwiPjwvbWF0ZXJpYWwtdGltZS1waWNrZXI+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cblx0XHRcdDxkaXYgY2xhc3M9XCJyb3dcIj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxuXHRcdFx0XHRcdDxtYXRlcmlhbC10ZXh0LWFyZWEgcmVxdWlyZWQgW3Jvd3NdPVwiZ2V0Um93cygpXCIgW2NvbHNdPVwiZ2V0Q29scygpXCIgI2FyZWFUZXh0RmllbGQgW2xhYmVsXT1cImdldExhYmVscygpWzVdXCIgW2Rlc2NyaXB0aW9uXT1cImdldERlc2NyaXB0aW9ucygpWzVdXCIgW2RhdGFdPVwiX2dldERhdGFDb250YWluZXIoKVwiIFtmaWVsZF09XCJnZXRGaWVsZHMoKVs1XVwiIFtkYXRhUGFyZW50XT1cInRoaXNcIj48L21hdGVyaWFsLXRleHQtYXJlYT5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblxuXHRcdFx0PGRpdiBjbGFzcz1cInJvd1wiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29sLW1kLTNcIj48YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiIChjbGljayk9XCJzaG93RGF0YUNsaWNrZWQoJGV2ZW50KVwiPlNob3cgRGF0YTwvYnV0dG9uPjwvZGl2PlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29sLW1kLTNcIj48YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiIChjbGljayk9XCJlZGl0RGF0YUNsaWNrZWQoJGV2ZW50KVwiPkVkaXQgRGF0YTwvYnV0dG9uPjwvZGl2PlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY29sLW1kLTNcIj48YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiIChjbGljayk9XCJzYXZlRGF0YUNsaWNrZWQoJGV2ZW50KVwiPlNhdmUgRGF0YTwvYnV0dG9uPjwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cdFx0PC9kaXY+XG5cdDwvZGl2PlxuPC9kaXY+XG5gXG59KVxuZXhwb3J0IGNsYXNzIERhdGFGb3JtIGV4dGVuZHMgQWJzdHJhY3RIYXNEYXRhIGltcGxlbWVudHMgT25Jbml0LCBJSGFzTW9kZWwsIElDaGFuZ2VhYmxlIHtcblxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFRZUEVfTkFNRTogc3RyaW5nID0gVFlQRV9OQU1FO1xuXG4gIEBJbnB1dCgpXG4gIHByb3RlY3RlZCBkYXRhUGFyZW50OiBJSGFzRGF0YTtcbiAgcHJpdmF0ZSBtb2RlbDogYW55O1xuICBwcml2YXRlIGZpZWxkczogc3RyaW5nW107XG4gIHByaXZhdGUgbGFiZWxzOiBzdHJpbmdbXTtcbiAgcHJpdmF0ZSBkZXNjcmlwdGlvbnM6IHN0cmluZ1tdO1xuICBAVmlld0NoaWxkKCduYW1lVGV4dEZpZWxkJylcbiAgcHJpdmF0ZSBuYW1lVGV4dEZpZWxkOiBNYXRlcmlhbFRleHRCb3g7XG4gIEBWaWV3Q2hpbGQoJ3Nob3J0TmFtZVRleHRGaWVsZCcpXG4gIHByaXZhdGUgc2hvcnROYW1lVGV4dEZpZWxkOiBNYXRlcmlhbFRleHRCb3g7XG4gIEBWaWV3Q2hpbGQoJ2RhdGVUZXh0RmllbGQnKVxuICBwcml2YXRlIGRhdGVUZXh0RmllbGQ6IE1hdGVyaWFsVGV4dEJveDtcbiAgQFZpZXdDaGlsZCgnZGF0ZVBpY2tlclRleHRGaWVsZCcpXG4gIHByaXZhdGUgZGF0ZVBpY2tlclRleHRGaWVsZDogTWF0ZXJpYWxEYXRlUGlja2VyO1xuICBAVmlld0NoaWxkKCd0aW1lUGlja2VyVGV4dEZpZWxkJylcbiAgcHJpdmF0ZSB0aW1lUGlja2VyVGV4dEZpZWxkOiBNYXRlcmlhbFRpbWVQaWNrZXI7XG4gIEBWaWV3Q2hpbGQoJ2FyZWFUZXh0RmllbGQnKVxuICBwcml2YXRlIGFyZWFUZXh0RmllbGQ6IE1hdGVyaWFsVGV4dEFyZWE7XG4gIHByaXZhdGUgZGF0YUNvbnRhaW5lcjogYW55W107XG4gIHByaXZhdGUgY2hhbmdlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICAvLyB0ZXN0XG4gIHByaXZhdGUgbm90aWZ5TWdyOiBOb3RpZmljYXRpb25NYW5hZ2VyO1xuICBwcml2YXRlIGRpYWxvZ1NlcnY6IERpYWxvZ1NlcnZpY2U7XG4gIHByaXZhdGUgbWluRGF0ZTogRGF0ZTtcbiAgcHJpdmF0ZSBtYXhEYXRlOiBEYXRlO1xuICBwcml2YXRlIG1pblRpbWU6IERhdGU7XG4gIHByaXZhdGUgbWF4VGltZTogRGF0ZTtcbiAgcHJpdmF0ZSByb3dzOiBudW1iZXI7XG4gIHByaXZhdGUgY29sczogbnVtYmVyO1xuXG4gIHByaXZhdGUgdGVzdENvdW50OiBudW1iZXIgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKG5vdGlmeU1ncjogTm90aWZpY2F0aW9uTWFuYWdlciwgZGlhbG9nU2VydjogRGlhbG9nU2VydmljZSwgZWxlbWVudFJlZjogRWxlbWVudFJlZikge1xuICAgIHN1cGVyKGVsZW1lbnRSZWYpO1xuICAgIHRoaXMuZGF0YUNvbnRhaW5lciA9IFtdO1xuICAgIHRoaXMuZGVzY3JpcHRpb25zID0gW107XG4gICAgdGhpcy5jaGFuZ2VFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIC8vIGZvciB0ZXN0IG5vdGlmaWNhdGlvblxuICAgIHRoaXMubm90aWZ5TWdyID0gbm90aWZ5TWdyO1xuICAgIHRoaXMuZGlhbG9nU2VydiA9IGRpYWxvZ1NlcnY7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcblxuICAgIHRoaXMuZmllbGRzID0gW1wibmFtZVwiLCBcInNob3J0TmFtZVwiLCBcIl9jcmVhdGVkXCIsIFwiZGF0ZVBpY2tlck5hbWVcIiwgXCJ0aW1lUGlja2VyTmFtZVwiLCBcImFyZWFOYW1lXCJdO1xuICAgIHRoaXMubGFiZWxzID0gW1wiTmFtZVwiLCBcIlNob3J0TmFtZVwiLCBcIkNyZWF0ZSBEYXRlXCIsIFwiRGF0ZVBpY2tlck5hbWVcIiwgXCJUaW1lUGlja2VyTmFtZVwiLCBcIkFyZWFOYW1lXCJdO1xuICAgIHRoaXMuZGVzY3JpcHRpb25zID0gW1wibmFtZSBkZXNjcmlwdGlvblwiLCBcInNob3J0TmFtZSBkZXNjcmlwdGlvblwiLCBcImNyZWF0ZURhdGUgRGVzY3JpcHRpb25cIlxuICAgICAgLCBcImRhdGVQaWNrZXJOYW1lIGRlc2NyaXB0aW9uXCIsIFwidGltZVBpY2tlck5hbWUgZGVzY3JpcHRpb25cIiwgXCJhcmVhTmFtZSBkZXNjcmlwdGlvblwiXTtcblxuICAgIGxldCBuYW1lRmllbGRDaGFuZ2VFViA9IHRoaXMubmFtZVRleHRGaWVsZC5nZXRDaGFuZ2VFdmVudCgpO1xuICAgIGlmIChuYW1lRmllbGRDaGFuZ2VFViAhPT0gbnVsbCAmJiB0eXBlb2YgbmFtZUZpZWxkQ2hhbmdlRVYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBuYW1lRmllbGRDaGFuZ2VFVi5zdWJzY3JpYmUoKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LmRldGFpbC5kYXRhICE9PSBudWxsICYmIHR5cGVvZiBldmVudC5kZXRhaWwuZGF0YSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBpZiAoZXZlbnQuZGV0YWlsLmRhdGEuYnViYmxlU3RhY2sgIT09IG51bGwgJiYgdHlwZW9mIGV2ZW50LmRldGFpbC5kYXRhLmJ1YmJsZVN0YWNrICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgZXZlbnQuZGV0YWlsLmRhdGEuYnViYmxlU3RhY2sucHVzaCh0aGlzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXZlbnQuZGV0YWlsLmRhdGEuYnViYmxlU3RhY2sgPSBbdGhpc107XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMub25FbWl0Q2hhbmdlKGV2ZW50KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBsZXQgc2hvcnROYW1lQ2hhbmdlRVYgPSB0aGlzLnNob3J0TmFtZVRleHRGaWVsZC5nZXRDaGFuZ2VFdmVudCgpO1xuICAgIGlmIChzaG9ydE5hbWVDaGFuZ2VFViAhPT0gbnVsbCAmJiB0eXBlb2Ygc2hvcnROYW1lQ2hhbmdlRVYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBzaG9ydE5hbWVDaGFuZ2VFVi5zdWJzY3JpYmUoKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LmRldGFpbC5kYXRhICE9PSBudWxsICYmIHR5cGVvZiBldmVudC5kZXRhaWwuZGF0YSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBpZiAoZXZlbnQuZGV0YWlsLmRhdGEuYnViYmxlU3RhY2sgIT09IG51bGwgJiYgdHlwZW9mIGV2ZW50LmRldGFpbC5kYXRhLmJ1YmJsZVN0YWNrICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgZXZlbnQuZGV0YWlsLmRhdGEuYnViYmxlU3RhY2sucHVzaCh0aGlzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXZlbnQuZGV0YWlsLmRhdGEuYnViYmxlU3RhY2sgPSBbdGhpc107XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMub25FbWl0Q2hhbmdlKGV2ZW50KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMubWluRGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgdGhpcy5taW5EYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgIHRoaXMubWluRGF0ZS5zZXRNb250aCg1KTtcbiAgICB0aGlzLm1heERhdGUgPSBuZXcgRGF0ZSgpO1xuICAgIHRoaXMubWF4RGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICB0aGlzLm1heERhdGUuc2V0TW9udGgoMTApO1xuXG4gICAgdGhpcy5taW5UaW1lID0gbmV3IERhdGUoKTtcbiAgICB0aGlzLm1pblRpbWUuc2V0SG91cnMoMTAsIDAsIDAsIDApO1xuICAgIHRoaXMubWF4VGltZSA9IG5ldyBEYXRlKCk7XG4gICAgdGhpcy5tYXhUaW1lLnNldEhvdXJzKDE1LCAwLCAwLCAwKTtcblxuICAgIHRoaXMucm93cyA9IDg7XG4gICAgdGhpcy5jb2xzID0gMTAwO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkVtaXRDaGFuZ2UoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGxldCBkYXRhOiBhbnkgPSB7XG4gICAgICBzb3VyY2U6IGV2ZW50LFxuICAgICAgYnViYmxlU3RhY2s6IFt0aGlzXVxuICAgIH07XG4gICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChDSEFOR0VfRVZFTlQsIHRoaXMsIGRhdGEsIG51bGwpO1xuXG4gICAgdGhpcy5jaGFuZ2VFdmVudC5lbWl0KGV2KTtcbiAgfVxuXG4gIHB1YmxpYyBfZ2V0RGF0YUNvbnRhaW5lcigpOiBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YUNvbnRhaW5lcjtcbiAgfVxuXG4gIHB1YmxpYyBnZXRNb2RlbCgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLm1vZGVsO1xuICB9XG5cbiAgcHVibGljIHNldE1vZGVsKG1vZGVsOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm1vZGVsID0gbW9kZWw7XG4gIH1cblxuICBwdWJsaWMgc2V0RGF0YShkYXRhOiBhbnkpOiB2b2lkIHtcbiAgICAvLyBvdmVyaWRlIG1ldGhvZFxuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG5cbiAgICBpZiAoZGF0YSAhPT0gbnVsbCAmJiB0eXBlb2YgZGF0YSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEub2JqZWN0cykpIHtcbiAgICAgICAgdGhpcy5kYXRhQ29udGFpbmVyID0gZGF0YS5vYmplY3RzO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNoaWxkIGFkZCBkYXRhQ29udGFpbmVyIGluc3RlYWRcbiAgICBpZiAodGhpcy5kYXRhQ2hpbGRyZW4gIT09IG51bGwpIHtcbiAgICAgIGZvciAobGV0IGMgb2YgdGhpcy5kYXRhQ2hpbGRyZW4pIHtcbiAgICAgICAgYy5zZXREYXRhKHRoaXMuZGF0YUNvbnRhaW5lcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNob3dEYXRhQ2xpY2tlZCgkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgLy8gdGVzdCBub3RpZmljYXRpb25cbiAgICBpZiAodGhpcy5ub3RpZnlNZ3IgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMubm90aWZ5TWdyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy50ZXN0Q291bnQgKz0gMTtcbiAgICAgIGxldCBkID0gbmV3IERhdGUoKTtcbiAgICAgIGxldCBjbGlja0Z1bmM6IEZ1bmN0aW9uID0gKCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnQk9EWSBDTElDS0VEJyk7XG4gICAgICB9O1xuICAgICAgbGV0IG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uID0gbmV3IE5vdGlmaWNhdGlvbihcIlwiLCBcIlRJVExFOiBcIiArIHRoaXMudGVzdENvdW50LCBcImRlc2NyaXB0aW9uXCIsIHRydWUsIFwiTEJcIiwgZCwgMjAwMCk7XG4gICAgICBub3RpZmljYXRpb24uY2xpY2tIYW5kbGVyID0gY2xpY2tGdW5jO1xuICAgICAgbGV0IGFjdGlvbjE6IE5vdGlmaWNhdGlvbkFjdGlvbiA9IG5ldyBOb3RpZmljYXRpb25BY3Rpb24oJ01PUkUnLCAoZXY6IGFueSkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnZmlyc3QgQ0xJQ0tFRCcpO1xuICAgICAgICBpZiAoZXYgIT09IG51bGwgJiYgdHlwZW9mIGV2ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGV2LmRldGFpbC5kYXRhLmluc3RhbmNlLnNob3dCb2R5KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgbGV0IGFjdGlvbjI6IE5vdGlmaWNhdGlvbkFjdGlvbiA9IG5ldyBOb3RpZmljYXRpb25BY3Rpb24oJ0NBTkNFTCcsICgpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ2NhbmNlbCBDTElDS0VEJyk7XG4gICAgICB9LCB0cnVlKTtcbiAgICAgIG5vdGlmaWNhdGlvbi5hZGRBY3Rpb24oYWN0aW9uMSk7XG4gICAgICBub3RpZmljYXRpb24uYWRkQWN0aW9uKGFjdGlvbjIpO1xuICAgICAgbm90aWZpY2F0aW9uLmJvZHlDb21wb25lbnQgPSBUZXN0Q29tcG9uZW50O1xuICAgICAgdGhpcy5ub3RpZnlNZ3Iubm90aWZ5KG5vdGlmaWNhdGlvbik7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNhdmVEYXRhQ2xpY2tlZCgkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgbGV0IG5hbWU6IHN0cmluZyA9IHRoaXMubmFtZVRleHRGaWVsZC5nZXRJbnB1dFZhbHVlKCk7XG4gICAgbGV0IHNob3J0TmFtZTogc3RyaW5nID0gdGhpcy5zaG9ydE5hbWVUZXh0RmllbGQuZ2V0SW5wdXRWYWx1ZSgpO1xuICAgIGxldCBkYXRlU3RyaW5nOiBzdHJpbmcgPSB0aGlzLmRhdGVUZXh0RmllbGQuZ2V0SW5wdXRWYWx1ZSgpO1xuICAgIGxldCBkYXRlUGlja2VyOiBhbnkgPSB0aGlzLmRhdGVQaWNrZXJUZXh0RmllbGQuZ2V0RGF0YSgpO1xuICAgIGxldCB0aW1lUGlja2VyOiBhbnkgPSB0aGlzLnRpbWVQaWNrZXJUZXh0RmllbGQuZ2V0RGF0YSgpO1xuICAgIGxldCBhcmVhTmFtZTogc3RyaW5nID0gdGhpcy5hcmVhVGV4dEZpZWxkLmdldElucHV0VmFsdWUoKTtcblxuICAgIGlmICh0aGlzLmRhdGEuZWRpdG9yICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmRhdGEuZWRpdG9yICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgbGV0IGZvcm1WaWV3ID0gdGhpcy5kYXRhLmVkaXRvci5nZXRWaWV3Q29tcG9uZW50RnJvbVR5cGUoRk9STV9WSUVXKSBhcyBGb3JtVmlldztcbiAgICAgIGxldCBjdXJJbmRleCA9IGZvcm1WaWV3LmdldEN1cnJlbnRUYWJJbmRleCgpO1xuXG4gICAgICBsZXQgb2JqOiBhbnkgPSBmb3JtVmlldy5nZXRUYWJEYXRhKGN1ckluZGV4KTtcblxuICAgICAgaWYgKG9iaiAhPT0gbnVsbCAmJiBvYmoubGVuZ3RoID4gMCkge1xuICAgICAgICBsZXQgb2JqczogYW55W10gPSBmb3JtVmlldy5nZXRUYWJEYXRhKGN1ckluZGV4KTtcblxuICAgICAgICBsZXQgY3JlYXRlZEFycmF5OiBhbnlbXSA9IFtdO1xuICAgICAgICBsZXQgdXBkYXRlZEFycmF5OiBhbnlbXSA9IFtdO1xuXG4gICAgICAgIGxldCBvYmplY3RJZEZpZWxkOiBzdHJpbmcgPSB0aGlzLmRhdGEuZWRpdG9yLmdldE9iamVjdElkRmllbGQoKTtcbiAgICAgICAgZm9yIChsZXQgb2JqIG9mIG9ianMpIHtcbiAgICAgICAgICBpZiAob2JqW29iamVjdElkRmllbGRdICE9PSBudWxsICYmIHR5cGVvZiBvYmpbb2JqZWN0SWRGaWVsZF0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB1cGRhdGVkQXJyYXkucHVzaChvYmopO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjcmVhdGVkQXJyYXkucHVzaChvYmopO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNyZWF0ZSBkYXRhXG4gICAgICAgIGlmIChjcmVhdGVkQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMuZGF0YS5lZGl0b3IuY3JlYXRlRGF0YShjcmVhdGVkQXJyYXkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHVwZGF0ZSBkYXRhXG4gICAgICAgIGlmICh1cGRhdGVkQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMuZGF0YS5lZGl0b3IudXBkYXRlRGF0YSh1cGRhdGVkQXJyYXkpO1xuICAgICAgICB9XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGNyZWF0ZSBuZXcgb2JqZWN0XG4gICAgICAgIGxldCBuZXdPYmo6IGFueSA9IHtcbiAgICAgICAgICBuYW1lOiBuYW1lLCBzaG9ydE5hbWU6IHNob3J0TmFtZVxuICAgICAgICAgICwgX2NyZWF0ZWQ6IGRhdGVTdHJpbmcsIGRhdGVQaWNrZXI6IGRhdGVQaWNrZXJcbiAgICAgICAgICAsIHRpbWVQaWNrZXI6IHRpbWVQaWNrZXIsIGFyZWFOYW1lOiBhcmVhTmFtZVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmRhdGEuZWRpdG9yLmNyZWF0ZURhdGEobmV3T2JqKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZWRpdERhdGFDbGlja2VkKCRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAvLyB0ZXN0IGNsZWFyIGFsbCBub3RpZnlcbiAgICBpZiAodGhpcy5ub3RpZnlNZ3IgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMubm90aWZ5TWdyICE9PSAndW5kZWZpbmVkJykge1xuXG4gICAgICB0aGlzLm5vdGlmeU1nci5jbGVhckFsbCgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRDaGFuZ2VFdmVudCgpOiBFdmVudEVtaXR0ZXI8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbmdlRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgaXNTZWxmRGF0YURpcnR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxmU2F2ZURhdGEoZGF0YTogYW55KTogdm9pZCB7XG5cbiAgfVxuXG4gIHB1YmxpYyBzZWxmUmVzZXREYXRhKCk6IHZvaWQge1xuXG4gIH1cblxuICBwdWJsaWMgZG9QcmVsb2FkKCk6IFByb21pc2U8YW55PiB7ICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geyAgICAgICByZXNvbHZlKG51bGwpOyAgICAgfSk7ICAgfSAgcHVibGljIGRvTG9hZGVkKCk6IHZvaWQge1xuXG4gIH1cblxuICBwdWJsaWMgZ2V0RmllbGRzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZHM7XG4gIH1cblxuICBwdWJsaWMgZ2V0TGFiZWxzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5sYWJlbHM7XG4gIH1cblxuICBwdWJsaWMgZ2V0RGVzY3JpcHRpb25zKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5kZXNjcmlwdGlvbnM7XG4gIH1cblxuICBwdWJsaWMgZ2V0TWluRGF0ZSgpOiBEYXRlIHtcbiAgICByZXR1cm4gdGhpcy5taW5EYXRlO1xuICB9XG5cbiAgcHVibGljIGdldE1heERhdGUoKTogRGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMubWF4RGF0ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRNaW5UaW1lKCk6IERhdGUge1xuICAgIHJldHVybiB0aGlzLm1pblRpbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0TWF4VGltZSgpOiBEYXRlIHtcbiAgICByZXR1cm4gdGhpcy5tYXhUaW1lO1xuICB9XG5cbiAgcHVibGljIGdldFJvd3MoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5yb3dzO1xuICB9XG5cbiAgcHVibGljIGdldENvbHMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb2xzO1xuICB9XG5cbn1cbiJdfQ==