UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

545 lines (544 loc) 41.4 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, ElementRef, Input, Output, EventEmitter } from '@angular/core'; import { CLICK_EVENT, BEFORE_CLICK_EVENT } from '../../../share/CustomEventType'; import { NeedFocusService } from '../../../service/NeedFocusService.service'; import { AbstractSelectOneItem } from './AbstractSelectOneItem'; import { UUIDUtils } from '../../../share/utils/UUIDUtils'; import { Option } from '../../../decorator/Option.decorator'; import { EventUtils } from '../../../share/utils/EventUtils'; import { I18N } from '../../../decorator/decorators'; var /** @type {?} */ TYPE_NAME = "phx-simple-radio-btns"; var SimpleRadioButtons = /** @class */ (function (_super) { tslib_1.__extends(SimpleRadioButtons, _super); function SimpleRadioButtons(elementRef, needFocusService) { var _this = _super.call(this, elementRef, needFocusService) || this; _this.DEFAULT_GROUP_NAME = "DEFAULT_SIMPLE_RADIO"; _this.clickEvent = new EventEmitter(); _this.beforeClickEvent = new EventEmitter(); _this.changeEvent = new EventEmitter(); return _this; } /** * @return {?} */ SimpleRadioButtons.prototype.ngOnInit = /** * @return {?} */ function () { _super.prototype.ngOnInit.call(this); if (this.name === null || typeof this.name === 'undefined') { this.name = this.DEFAULT_GROUP_NAME + "_" + UUIDUtils.generateUUID(); } }; /** * @param {?} item * @return {?} */ SimpleRadioButtons.prototype.isChecked = /** * @param {?} item * @return {?} */ function (item) { if (item !== null && typeof item !== 'undefined') { var /** @type {?} */ sItem = this.getSelectedItem(); return (sItem === item); } return false; }; /** * @param {?} $event * @param {?} index * @param {?=} fireEvent * @return {?} */ SimpleRadioButtons.prototype.onRadioBtnClicked = /** * @param {?} $event * @param {?} index * @param {?=} fireEvent * @return {?} */ function ($event, index, fireEvent) { var _this = this; if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } $event.preventDefault(); if (this.isReadOnly()) { return; } if (this.isDisabled()) { return; } var /** @type {?} */ oldIndex = this.getSelectedIndex(); var /** @type {?} */ newIndex = index; EventUtils.handleBrowserEvent(this, 'beforeClickEvent', $event, fireEvent, function ($event) { // doEvent // doEvent _this.setSelectedIndex(newIndex); }, function ($event) { // emitBeforeEvent // emitBeforeEvent _this.emitBeforeClickEvent(oldIndex, newIndex, $event); }, function ($event, result) { // emitAfterEvent // emitAfterEvent _this.emitClickEvent(oldIndex, newIndex, $event); }, function ($event) { // doPrevented }); }; /** * @param {?} oldIndex * @param {?} newIndex * @param {?=} $event * @return {?} */ SimpleRadioButtons.prototype.emitBeforeClickEvent = /** * @param {?} oldIndex * @param {?} newIndex * @param {?=} $event * @return {?} */ function (oldIndex, newIndex, $event) { var /** @type {?} */ eventData = { item: this.getItemAtIndex(newIndex), index: newIndex, oldItem: this.getItemAtIndex(oldIndex), oldIndex: oldIndex }; // emit event var /** @type {?} */ data = eventData; var /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_CLICK_EVENT, this, data, $event); if (this.beforeClickEvent !== null && this.beforeClickEvent !== undefined) { this.beforeClickEvent.emit(ev); } }; /** * @param {?} oldIndex * @param {?} newIndex * @param {?=} $event * @return {?} */ SimpleRadioButtons.prototype.emitClickEvent = /** * @param {?} oldIndex * @param {?} newIndex * @param {?=} $event * @return {?} */ function (oldIndex, newIndex, $event) { var /** @type {?} */ eventData = { item: this.getItemAtIndex(newIndex), index: newIndex, oldItem: this.getItemAtIndex(oldIndex), oldIndex: oldIndex }; // emit event var /** @type {?} */ data = eventData; var /** @type {?} */ ev = EventUtils.newCustomEvent(CLICK_EVENT, this, data, $event); if (this.clickEvent !== null && this.clickEvent !== undefined) { this.clickEvent.emit(ev); } }; /** * @return {?} */ SimpleRadioButtons.prototype.getDescription = /** * @return {?} */ function () { return this.description; }; /** * @param {?} description * @return {?} */ SimpleRadioButtons.prototype.setDescription = /** * @param {?} description * @return {?} */ function (description) { this.description = description; }; /** * @return {?} */ SimpleRadioButtons.prototype.hasDescription = /** * @return {?} */ function () { if (this.description !== null && typeof this.description === 'string' && this.description !== '') { return true; } return false; }; /** * @param {?} inputValue * @param {?} results * @return {?} */ SimpleRadioButtons.prototype.onValidationEnd = /** * @param {?} inputValue * @param {?} results * @return {?} */ function (inputValue, results) { //! do sthing }; /** * @param {?} data * @param {?} inputVal * @return {?} */ SimpleRadioButtons.prototype.onDataChange = /** * @param {?} data * @param {?} inputVal * @return {?} */ function (data, inputVal) { }; /** * @param {?} $event * @return {?} */ SimpleRadioButtons.prototype.doFocus = /** * @param {?} $event * @return {?} */ function ($event) { }; /** * @param {?} $event * @return {?} */ SimpleRadioButtons.prototype.doLostFocus = /** * @param {?} $event * @return {?} */ function ($event) { }; /** * @return {?} */ SimpleRadioButtons.prototype.getClickedEvent = /** * @return {?} */ function () { return this.clickEvent; }; /** * @param {?} event * @return {?} */ SimpleRadioButtons.prototype.setClickedEvent = /** * @param {?} event * @return {?} */ function (event) { this.clickEvent = event; }; /** * @return {?} */ SimpleRadioButtons.prototype.getBeforeClickedEvent = /** * @return {?} */ function () { return this.beforeClickEvent; }; /** * @param {?} event * @return {?} */ SimpleRadioButtons.prototype.setBeforeClickedEvent = /** * @param {?} event * @return {?} */ function (event) { this.beforeClickEvent = event; }; /** * @return {?} */ SimpleRadioButtons.prototype.getName = /** * @return {?} */ function () { return this.name; }; /** * @return {?} */ SimpleRadioButtons.prototype.getItems = /** * @return {?} */ function () { return this.items; }; SimpleRadioButtons.TYPE_NAME = TYPE_NAME; SimpleRadioButtons.decorators = [ { type: Component, args: [{ moduleId: module.id, selector: TYPE_NAME, template: "<div class=\"phx-simple-radio-btns\">\n\t<div class=\"radio-group\">\n\t\t<div class=\"radio\" *ngFor=\"let item of getItems(); let i = index;\"\n\t\t\t(click)=\"onRadioBtnClicked($event, i)\">\n\t\t\t<!-- <button class=\"fake\">\n\t\t\t</button> -->\n\t\t\t<!-- <input type=\"radio\" name=\"{{getName()}}\" [checked]=\"isChecked(item)\" [disabled]=\"isDisabled()\" > -->\n\t\t\t<input type=\"button\" name=\"{{getName()}}\" [class._selected]=\"getSelectedIndex() === i\" [disabled]=\"isDisabled()\">\n\t\t\t<label>\n\t\t\t\t{{item.label}}\n\t\t\t</label>\n\t\t</div>\n\t</div>\n\t<br />\n\t<br />\n\t<div class=\"validation\" [style.display]=\"getValidationResultMessage() ? undefined : 'none'\" [class.normal]=\"isNormal() && !isDisabled()\" [class.success]=\"isSuccess() && !isDisabled()\" [class.warning]=\"isWarning() && !isDisabled()\" [class.error]=\"isError() && !isDisabled()\">\n\t\t<ng-template [ngIf]=\"getValidationResultMessage()\" [ngIfElse]=\"validation_else\">\n\t\t\t{{getValidationResultMessage() | phx_text}}\n\t\t</ng-template>\n\t\t<ng-template #validation_else>\n\t\t\t<!-- We've to put whitespace if there is no validation msg to prevent empty dom -->\n\t\t\t<!-- since if validate msg's <div> dom is empty, the component positioning -->\n\t\t\t<!-- will be misplaced. -->\n\t\t\t{{ '&nbsp;' }}\n\t\t</ng-template>\n\t</div>\n\t<div class=\"description\" [style.display]=\"getValidationResultMessage() ? 'none' : undefined\" [class.normal]=\"isNormal() && !isDisabled()\" [class.success]=\"isSuccess() && !isDisabled()\" [class.warning]=\"isWarning() && !isDisabled()\" [class.error]=\"isError() && !isDisabled()\">\n\t\t<ng-template [ngIf]=\"getDescription()\" [ngIfElse]=\"description_else\">\n\t\t\t{{ getDescription() | phx_text }}\n\t\t</ng-template>\n\t\t<ng-template #description_else>\n\t\t\t<!-- We've to put whitespace if there is no description to prevent empty dom -->\n\t\t\t<!-- since if description's <div> dom is empty, the component positioning -->\n\t\t\t<!-- will be misplaced. -->\n\t\t\t{{ '&nbsp;' }}\n\t\t</ng-template>\n\t</div>\n</div>\n" },] }, ]; /** @nocollapse */ SimpleRadioButtons.ctorParameters = function () { return [ { type: ElementRef, }, { type: NeedFocusService, }, ]; }; SimpleRadioButtons.propDecorators = { "dataParent": [{ type: Input },], "ignoreParentData": [{ type: Input },], "data": [{ type: Input },], "ignoreParentDisabled": [{ type: Input },], "delegateHistory": [{ type: Input },], "onDisabled": [{ type: Input },], "onEnabled": [{ type: Input },], "loadingEnabled": [{ type: Input },], "i18nKey": [{ type: Input },], "bypass": [{ type: Input, args: ['i18nBypass',] },], "options": [{ type: Input },], "disabled": [{ type: Input },], "field": [{ type: Input },], "name": [{ type: Input },], "typeOfData": [{ type: Input },], "readOnly": [{ type: Input },], "help": [{ type: Input },], "dataComparator": [{ type: Input, args: ['comparator',] },], "items": [{ type: Input },], "description": [{ type: Input },], "loadEvent": [{ type: Output, args: ['phxLoad',] },], "startValidateEvent": [{ type: Output, args: ['phxStartValidate',] },], "endValidateEvent": [{ type: Output, args: ['phxEndValidate',] },], "beforeFocusEvent": [{ type: Output, args: ['phxBeforeFocus',] },], "focusEvent": [{ type: Output, args: ['phxFocus',] },], "beforeLostFocusEvent": [{ type: Output, args: ['phxBeforeLostFocus',] },], "lostFocusEvent": [{ type: Output, args: ['phxLostFocus',] },], "beforeChangeEvent": [{ type: Output, args: ['phxBeforeChange',] },], "changeEvent": [{ type: Output, args: ['phxChange',] },], "beforeSelectEvent": [{ type: Output, args: ['phxBeforeSelect',] },], "selectEvent": [{ type: Output, args: ['phxSelect',] },], "beforeClickEvent": [{ type: Output, args: ['phxBeforeClick',] },], "clickEvent": [{ type: Output, args: ['phxClick',] },], }; tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Object) ], SimpleRadioButtons.prototype, "dataParent", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], SimpleRadioButtons.prototype, "ignoreParentData", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Object) ], SimpleRadioButtons.prototype, "data", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], SimpleRadioButtons.prototype, "ignoreParentDisabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], SimpleRadioButtons.prototype, "delegateHistory", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Function) ], SimpleRadioButtons.prototype, "onDisabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Function) ], SimpleRadioButtons.prototype, "onEnabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], SimpleRadioButtons.prototype, "loadingEnabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], SimpleRadioButtons.prototype, "i18nKey", void 0); tslib_1.__decorate([ Option('i18nBypass'), tslib_1.__metadata("design:type", Boolean) ], SimpleRadioButtons.prototype, "bypass", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], SimpleRadioButtons.prototype, "disabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], SimpleRadioButtons.prototype, "field", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], SimpleRadioButtons.prototype, "name", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], SimpleRadioButtons.prototype, "typeOfData", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], SimpleRadioButtons.prototype, "readOnly", void 0); tslib_1.__decorate([ I18N(), Option(), tslib_1.__metadata("design:type", Object) ], SimpleRadioButtons.prototype, "help", void 0); tslib_1.__decorate([ Option('comparator'), tslib_1.__metadata("design:type", Object) ], SimpleRadioButtons.prototype, "dataComparator", void 0); tslib_1.__decorate([ I18N(), Option(), tslib_1.__metadata("design:type", Array) ], SimpleRadioButtons.prototype, "items", void 0); tslib_1.__decorate([ I18N(), Option(), tslib_1.__metadata("design:type", String) ], SimpleRadioButtons.prototype, "description", void 0); tslib_1.__decorate([ Option('load'), tslib_1.__metadata("design:type", EventEmitter) ], SimpleRadioButtons.prototype, "loadEvent", void 0); tslib_1.__decorate([ Option('startValidate'), tslib_1.__metadata("design:type", EventEmitter) ], SimpleRadioButtons.prototype, "startValidateEvent", void 0); tslib_1.__decorate([ Option('endValidate'), tslib_1.__metadata("design:type", EventEmitter) ], SimpleRadioButtons.prototype, "endValidateEvent", void 0); tslib_1.__decorate([ Option('beforeFocus'), tslib_1.__metadata("design:type", EventEmitter) ], SimpleRadioButtons.prototype, "beforeFocusEvent", void 0); tslib_1.__decorate([ Option('focus'), tslib_1.__metadata("design:type", EventEmitter) ], SimpleRadioButtons.prototype, "focusEvent", void 0); tslib_1.__decorate([ Option('beforeLostFocus'), tslib_1.__metadata("design:type", EventEmitter) ], SimpleRadioButtons.prototype, "beforeLostFocusEvent", void 0); tslib_1.__decorate([ Option('lostFocus'), tslib_1.__metadata("design:type", EventEmitter) ], SimpleRadioButtons.prototype, "lostFocusEvent", void 0); tslib_1.__decorate([ Option('beforeChange'), tslib_1.__metadata("design:type", EventEmitter) ], SimpleRadioButtons.prototype, "beforeChangeEvent", void 0); tslib_1.__decorate([ Option('change'), tslib_1.__metadata("design:type", EventEmitter) ], SimpleRadioButtons.prototype, "changeEvent", void 0); tslib_1.__decorate([ Option('beforeSelect'), tslib_1.__metadata("design:type", EventEmitter) ], SimpleRadioButtons.prototype, "beforeSelectEvent", void 0); tslib_1.__decorate([ Option('select'), tslib_1.__metadata("design:type", EventEmitter) ], SimpleRadioButtons.prototype, "selectEvent", void 0); tslib_1.__decorate([ Option('beforeClick'), tslib_1.__metadata("design:type", EventEmitter) ], SimpleRadioButtons.prototype, "beforeClickEvent", void 0); tslib_1.__decorate([ Option('click'), tslib_1.__metadata("design:type", EventEmitter) ], SimpleRadioButtons.prototype, "clickEvent", void 0); return SimpleRadioButtons; }(AbstractSelectOneItem)); export { SimpleRadioButtons }; function SimpleRadioButtons_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ SimpleRadioButtons.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ SimpleRadioButtons.ctorParameters; /** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */ SimpleRadioButtons.propDecorators; /** @type {?} */ SimpleRadioButtons.TYPE_NAME; /** @type {?} */ SimpleRadioButtons.prototype.DEFAULT_GROUP_NAME; /** @type {?} */ SimpleRadioButtons.prototype.dataParent; /** @type {?} */ SimpleRadioButtons.prototype.ignoreParentData; /** @type {?} */ SimpleRadioButtons.prototype.data; /** @type {?} */ SimpleRadioButtons.prototype.ignoreParentDisabled; /** @type {?} */ SimpleRadioButtons.prototype.delegateHistory; /** @type {?} */ SimpleRadioButtons.prototype.onDisabled; /** @type {?} */ SimpleRadioButtons.prototype.onEnabled; /** @type {?} */ SimpleRadioButtons.prototype.loadingEnabled; /** @type {?} */ SimpleRadioButtons.prototype.i18nKey; /** @type {?} */ SimpleRadioButtons.prototype.bypass; /** @type {?} */ SimpleRadioButtons.prototype.options; /** @type {?} */ SimpleRadioButtons.prototype.disabled; /** @type {?} */ SimpleRadioButtons.prototype.field; /** @type {?} */ SimpleRadioButtons.prototype.name; /** @type {?} */ SimpleRadioButtons.prototype.typeOfData; /** @type {?} */ SimpleRadioButtons.prototype.readOnly; /** @type {?} */ SimpleRadioButtons.prototype.help; /** @type {?} */ SimpleRadioButtons.prototype.dataComparator; /** @type {?} */ SimpleRadioButtons.prototype.items; /** @type {?} */ SimpleRadioButtons.prototype.description; /** @type {?} */ SimpleRadioButtons.prototype.loadEvent; /** @type {?} */ SimpleRadioButtons.prototype.startValidateEvent; /** @type {?} */ SimpleRadioButtons.prototype.endValidateEvent; /** @type {?} */ SimpleRadioButtons.prototype.beforeFocusEvent; /** @type {?} */ SimpleRadioButtons.prototype.focusEvent; /** @type {?} */ SimpleRadioButtons.prototype.beforeLostFocusEvent; /** @type {?} */ SimpleRadioButtons.prototype.lostFocusEvent; /** @type {?} */ SimpleRadioButtons.prototype.beforeChangeEvent; /** @type {?} */ SimpleRadioButtons.prototype.changeEvent; /** @type {?} */ SimpleRadioButtons.prototype.beforeSelectEvent; /** @type {?} */ SimpleRadioButtons.prototype.selectEvent; /** @type {?} */ SimpleRadioButtons.prototype.beforeClickEvent; /** @type {?} */ SimpleRadioButtons.prototype.clickEvent; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2ltcGxlUmFkaW9CdXR0b25zLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudC9kYXRhdmlldy9pbnB1dC9TaW1wbGVSYWRpb0J1dHRvbnMuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0YsT0FBTyxFQUFFLFdBQVcsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRWpGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUkzRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDN0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRTdELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUlyRCxxQkFBTSxTQUFTLEdBQVcsdUJBQXVCLENBQUM7O0lBNkNWLDhDQUFxQjtJQTJIM0QsNEJBQVksVUFBc0IsRUFBRSxnQkFBa0M7UUFBdEUsWUFDRSxrQkFBTSxVQUFVLEVBQUUsZ0JBQWdCLENBQUMsU0FLcEM7bUNBN0hvQyxzQkFBc0I7UUEwSHpELEtBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNyQyxLQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMzQyxLQUFJLENBQUMsV0FBVyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7O0tBQ3ZDOzs7O0lBRU0scUNBQVE7Ozs7UUFDYixpQkFB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Q0FBQzswQ0FDTSxZQUFZOzs7UUFFckMsTUFBTSxDQUFDLGNBQWMsQ0FBQzswQ0FDTSxZQUFZOzs7UUFFeEMsTUFBTSxDQUFDLFFBQVEsQ0FBQzswQ0FDTSxZQUFZOzs7UUFHbEMsTUFBTSxDQUFDLGNBQWMsQ0FBQzswQ0FDTSxZQUFZOzs7UUFFeEMsTUFBTSxDQUFDLFFBQVEsQ0FBQzswQ0FDTSxZQUFZOzs7UUFLbEMsTUFBTSxDQUFDLGFBQWEsQ0FBQzswQ0FDTSxZQUFZOzs7UUFDdkMsTUFBTSxDQUFDLE9BQU8sQ0FBQzswQ0FFTSxZQUFZOzs2QkF0THBDO0VBNkR3QyxxQkFBcUI7U0FBaEQsa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIEVsZW1lbnRSZWYsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ0xJQ0tfRVZFTlQsIEJFRk9SRV9DTElDS19FVkVOVCB9IGZyb20gJy4uLy4uLy4uL3NoYXJlL0N1c3RvbUV2ZW50VHlwZSc7XG5pbXBvcnQgeyBJSGFzRGF0YSB9IGZyb20gJy4uLy4uL0lIYXNEYXRhJztcbmltcG9ydCB7IE5lZWRGb2N1c1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlL05lZWRGb2N1c1NlcnZpY2Uuc2VydmljZSc7XG5pbXBvcnQgeyBBYnN0cmFjdFNlbGVjdE9uZUl0ZW0gfSBmcm9tICcuL0Fic3RyYWN0U2VsZWN0T25lSXRlbSc7XG5pbXBvcnQgeyBVVUlEVXRpbHMgfSBmcm9tICcuLi8uLi8uLi9zaGFyZS91dGlscy9VVUlEVXRpbHMnO1xuaW1wb3J0IHsgRGVmYXVsdFNlbGVjdEl0ZW1Nb2RlbCB9IGZyb20gJy4uLy4uL21vZGVsL0RlZmF1bHRTZWxlY3RJdGVtTW9kZWwnO1xuaW1wb3J0IHsgSVNlbGVjdEl0ZW1Nb2RlbCB9IGZyb20gJy4uLy4uL21vZGVsL0lTZWxlY3RJdGVtTW9kZWwnO1xuaW1wb3J0IHsgVmFsaWRhdGlvblJlc3VsdCB9IGZyb20gJy4uLy4uL21vZGVsL1ZhbGlkYXRpb25SZXN1bHQnO1xuaW1wb3J0IHsgT3B0aW9uIH0gZnJvbSAnLi4vLi4vLi4vZGVjb3JhdG9yL09wdGlvbi5kZWNvcmF0b3InO1xuaW1wb3J0IHsgRXZlbnRVdGlscyB9IGZyb20gJy4uLy4uLy4uL3NoYXJlL3V0aWxzL0V2ZW50VXRpbHMnO1xuaW1wb3J0IHsgSURhdGFDb21wYXJhdG9yIH0gZnJvbSAnLi4vLi4vSURhdGFDb21wYXJhdG9yJztcbmltcG9ydCB7IEkxOE4gfSBmcm9tICcuLi8uLi8uLi9kZWNvcmF0b3IvZGVjb3JhdG9ycyc7XG5cbmRlY2xhcmUgdmFyICQ6IGFueTtcblxuY29uc3QgVFlQRV9OQU1FOiBzdHJpbmcgPSBcInBoeC1zaW1wbGUtcmFkaW8tYnRuc1wiO1xuXG5AQ29tcG9uZW50KHtcbiAgbW9kdWxlSWQ6IG1vZHVsZS5pZCxcbiAgc2VsZWN0b3I6IFRZUEVfTkFNRSxcbiAgdGVtcGxhdGU6IGA8ZGl2IGNsYXNzPVwicGh4LXNpbXBsZS1yYWRpby1idG5zXCI+XG5cdDxkaXYgY2xhc3M9XCJyYWRpby1ncm91cFwiPlxuXHRcdDxkaXYgY2xhc3M9XCJyYWRpb1wiICpuZ0Zvcj1cImxldCBpdGVtIG9mIGdldEl0ZW1zKCk7IGxldCBpID0gaW5kZXg7XCJcblx0XHRcdChjbGljayk9XCJvblJhZGlvQnRuQ2xpY2tlZCgkZXZlbnQsIGkpXCI+XG5cdFx0XHQ8IS0tIDxidXR0b24gY2xhc3M9XCJmYWtlXCI+XG5cdFx0XHQ8L2J1dHRvbj4gLS0+XG5cdFx0XHQ8IS0tIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwie3tnZXROYW1lKCl9fVwiIFtjaGVja2VkXT1cImlzQ2hlY2tlZChpdGVtKVwiIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkKClcIiA+IC0tPlxuXHRcdFx0PGlucHV0IHR5cGU9XCJidXR0b25cIiBuYW1lPVwie3tnZXROYW1lKCl9fVwiIFtjbGFzcy5fc2VsZWN0ZWRdPVwiZ2V0U2VsZWN0ZWRJbmRleCgpID09PSBpXCIgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWQoKVwiPlxuXHRcdFx0PGxhYmVsPlxuXHRcdFx0XHR7e2l0ZW0ubGFiZWx9fVxuXHRcdFx0PC9sYWJlbD5cblx0XHQ8L2Rpdj5cblx0PC9kaXY+XG5cdDxiciAvPlxuXHQ8YnIgLz5cblx0PGRpdiBjbGFzcz1cInZhbGlkYXRpb25cIiBbc3R5bGUuZGlzcGxheV09XCJnZXRWYWxpZGF0aW9uUmVzdWx0TWVzc2FnZSgpID8gdW5kZWZpbmVkIDogJ25vbmUnXCIgW2NsYXNzLm5vcm1hbF09XCJpc05vcm1hbCgpICYmICFpc0Rpc2FibGVkKClcIiBbY2xhc3Muc3VjY2Vzc109XCJpc1N1Y2Nlc3MoKSAmJiAhaXNEaXNhYmxlZCgpXCIgW2NsYXNzLndhcm5pbmddPVwiaXNXYXJuaW5nKCkgJiYgIWlzRGlzYWJsZWQoKVwiIFtjbGFzcy5lcnJvcl09XCJpc0Vycm9yKCkgJiYgIWlzRGlzYWJsZWQoKVwiPlxuXHRcdDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJnZXRWYWxpZGF0aW9uUmVzdWx0TWVzc2FnZSgpXCIgW25nSWZFbHNlXT1cInZhbGlkYXRpb25fZWxzZVwiPlxuXHRcdFx0e3tnZXRWYWxpZGF0aW9uUmVzdWx0TWVzc2FnZSgpIHwgcGh4X3RleHR9fVxuXHRcdDwvbmctdGVtcGxhdGU+XG5cdFx0PG5nLXRlbXBsYXRlICN2YWxpZGF0aW9uX2Vsc2U+XG5cdFx0XHQ8IS0tIFdlJ3ZlIHRvIHB1dCB3aGl0ZXNwYWNlIGlmIHRoZXJlIGlzIG5vIHZhbGlkYXRpb24gbXNnIHRvIHByZXZlbnQgZW1wdHkgZG9tIC0tPlxuXHRcdFx0PCEtLSBzaW5jZSBpZiB2YWxpZGF0ZSBtc2cncyA8ZGl2PiBkb20gaXMgZW1wdHksIHRoZSBjb21wb25lbnQgcG9zaXRpb25pbmcgLS0+XG5cdFx0XHQ8IS0tIHdpbGwgYmUgbWlzcGxhY2VkLiAtLT5cblx0XHRcdHt7ICcmbmJzcDsnIH19XG5cdFx0PC9uZy10ZW1wbGF0ZT5cblx0PC9kaXY+XG5cdDxkaXYgY2xhc3M9XCJkZXNjcmlwdGlvblwiIFtzdHlsZS5kaXNwbGF5XT1cImdldFZhbGlkYXRpb25SZXN1bHRNZXNzYWdlKCkgPyAnbm9uZScgOiB1bmRlZmluZWRcIiBbY2xhc3Mubm9ybWFsXT1cImlzTm9ybWFsKCkgJiYgIWlzRGlzYWJsZWQoKVwiIFtjbGFzcy5zdWNjZXNzXT1cImlzU3VjY2VzcygpICYmICFpc0Rpc2FibGVkKClcIiBbY2xhc3Mud2FybmluZ109XCJpc1dhcm5pbmcoKSAmJiAhaXNEaXNhYmxlZCgpXCIgW2NsYXNzLmVycm9yXT1cImlzRXJyb3IoKSAmJiAhaXNEaXNhYmxlZCgpXCI+XG5cdFx0PG5nLXRlbXBsYXRlIFtuZ0lmXT1cImdldERlc2NyaXB0aW9uKClcIiBbbmdJZkVsc2VdPVwiZGVzY3JpcHRpb25fZWxzZVwiPlxuXHRcdFx0e3sgZ2V0RGVzY3JpcHRpb24oKSB8IHBoeF90ZXh0IH19XG5cdFx0PC9uZy10ZW1wbGF0ZT5cblx0XHQ8bmctdGVtcGxhdGUgI2Rlc2NyaXB0aW9uX2Vsc2U+XG5cdFx0XHQ8IS0tIFdlJ3ZlIHRvIHB1dCB3aGl0ZXNwYWNlIGlmIHRoZXJlIGlzIG5vIGRlc2NyaXB0aW9uIHRvIHByZXZlbnQgZW1wdHkgZG9tIC0tPlxuXHRcdFx0PCEtLSBzaW5jZSBpZiBkZXNjcmlwdGlvbidzIDxkaXY+IGRvbSBpcyBlbXB0eSwgdGhlIGNvbXBvbmVudCBwb3NpdGlvbmluZyAtLT5cblx0XHRcdDwhLS0gd2lsbCBiZSBtaXNwbGFjZWQuIC0tPlxuXHRcdFx0e3sgJyZuYnNwOycgfX1cblx0XHQ8L25nLXRlbXBsYXRlPlxuXHQ8L2Rpdj5cbjwvZGl2PlxuYFxufSlcbmV4cG9ydCBjbGFzcyBTaW1wbGVSYWRpb0J1dHRvbnMgZXh0ZW5kcyBBYnN0cmFjdFNlbGVjdE9uZUl0ZW0gaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVFlQRV9OQU1FOiBzdHJpbmcgPSBUWVBFX05BTUU7XG5cbiAgcHJpdmF0ZSBERUZBVUxUX0dST1VQX05BTUU6IHN0cmluZyA9IFwiREVGQVVMVF9TSU1QTEVfUkFESU9cIjtcbiAgLy8gUmUtZGVjbGFyZSBmaWVsZCB0byBkZWNsYXJlIG5nIEBJbnB1dC5cbiAgLy8gLS0tIGZyb20gQWJzdHJhY3RIYXNEYXRhXG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgZGF0YVBhcmVudDogSUhhc0RhdGE7XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgaWdub3JlUGFyZW50RGF0YTogYm9vbGVhbjtcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCBkYXRhOiBhbnk7XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgaWdub3JlUGFyZW50RGlzYWJsZWQ6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgZGVsZWdhdGVIaXN0b3J5OiBib29sZWFuO1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIG9uRGlzYWJsZWQ6IEZ1bmN0aW9uO1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIG9uRW5hYmxlZDogRnVuY3Rpb247XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgbG9hZGluZ0VuYWJsZWQ6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgaTE4bktleTogc3RyaW5nO1xuICBASW5wdXQoJ2kxOG5CeXBhc3MnKVxuICBAT3B0aW9uKCdpMThuQnlwYXNzJylcbiAgcHJvdGVjdGVkIGJ5cGFzczogYm9vbGVhbjtcbiAgQElucHV0KClcbiAgcHJvdGVjdGVkIG9wdGlvbnM6IGFueTtcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCBkaXNhYmxlZDogYm9vbGVhbjtcbiAgLy8gLS0tIGZyb20gQWJzdHJhY3REYXRhVmlld1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIGZpZWxkOiBzdHJpbmc7XG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0SW5wdXREYXRhVmlld1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIG5hbWU6IHN0cmluZztcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCB0eXBlT2ZEYXRhOiBzdHJpbmc7XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgcmVhZE9ubHk6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIEBJMThOKClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCBoZWxwOiBhbnk7XG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0U2VsZWN0SXRlbXNcbiAgQElucHV0KCdjb21wYXJhdG9yJylcbiAgQE9wdGlvbignY29tcGFyYXRvcicpXG4gIHByb3RlY3RlZCBkYXRhQ29tcGFyYXRvcjogSURhdGFDb21wYXJhdG9yPGFueT47XG4gIEBJbnB1dCgpXG4gIEBJMThOKClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCBpdGVtczogRGVmYXVsdFNlbGVjdEl0ZW1Nb2RlbFtdO1xuXG4gIC8vIC0tLVNlbGZcbiAgQEkxOE4oKVxuICBAT3B0aW9uKClcbiAgQElucHV0KClcbiAgcHJvdGVjdGVkIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG5cbiAgLy8gUmUtZGVjbGFyZSBmaWVsZCB0byBkZWNsYXJlIG5nIEBPdXRwdXQuXG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0SGFzRGF0YVxuICBAT3V0cHV0KCdwaHhMb2FkJylcbiAgQE9wdGlvbignbG9hZCcpXG4gIHByb3RlY3RlZCBsb2FkRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICAvLyAtLS0gZnJvbSBBYnN0cmFjdERhdGFWaWV3XG4gIC8vIC0tLSBmcm9tIEFic3RyYWN0SW5wdXREYXRhVmlld1xuICBAT3V0cHV0KCdwaHhTdGFydFZhbGlkYXRlJylcbiAgQE9wdGlvbignc3RhcnRWYWxpZGF0ZScpXG4gIHByb3RlY3RlZCBzdGFydFZhbGlkYXRlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3V0cHV0KCdwaHhFbmRWYWxpZGF0ZScpXG4gIEBPcHRpb24oJ2VuZFZhbGlkYXRlJylcbiAgcHJvdGVjdGVkIGVuZFZhbGlkYXRlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3V0cHV0KCdwaHhCZWZvcmVGb2N1cycpXG4gIEBPcHRpb24oJ2JlZm9yZUZvY3VzJylcbiAgcHJvdGVjdGVkIGJlZm9yZUZvY3VzRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3V0cHV0KCdwaHhGb2N1cycpXG4gIEBPcHRpb24oJ2ZvY3VzJylcbiAgcHJvdGVjdGVkIGZvY3VzRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3V0cHV0KCdwaHhCZWZvcmVMb3N0Rm9jdXMnKVxuICBAT3B0aW9uKCdiZWZvcmVMb3N0Rm9jdXMnKVxuICBwcm90ZWN0ZWQgYmVmb3JlTG9zdEZvY3VzRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3V0cHV0KCdwaHhMb3N0Rm9jdXMnKVxuICBAT3B0aW9uKCdsb3N0Rm9jdXMnKVxuICBwcm90ZWN0ZWQgbG9zdEZvY3VzRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3V0cHV0KCdwaHhCZWZvcmVDaGFuZ2UnKVxuICBAT3B0aW9uKCdiZWZvcmVDaGFuZ2UnKVxuICBwcm90ZWN0ZWQgYmVmb3JlQ2hhbmdlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3V0cHV0KCdwaHhDaGFuZ2UnKVxuICBAT3B0aW9uKCdjaGFuZ2UnKVxuICBwcm90ZWN0ZWQgY2hhbmdlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICAvLyAtLS0gZnJvbSBBYnN0cmFjdFNlbGVjdEl0ZW1zXG4gIEBPdXRwdXQoJ3BoeEJlZm9yZVNlbGVjdCcpXG4gIEBPcHRpb24oJ2JlZm9yZVNlbGVjdCcpXG4gIHByb3RlY3RlZCBiZWZvcmVTZWxlY3RFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPdXRwdXQoJ3BoeFNlbGVjdCcpXG4gIEBPcHRpb24oJ3NlbGVjdCcpXG4gIHByb3RlY3RlZCBzZWxlY3RFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG5cbiAgLy8gLS0tIGZyb20gc2VsZlxuXG4gIEBPdXRwdXQoJ3BoeEJlZm9yZUNsaWNrJylcbiAgQE9wdGlvbignYmVmb3JlQ2xpY2snKVxuICBwcm90ZWN0ZWQgYmVmb3JlQ2xpY2tFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPcHRpb24oJ2NsaWNrJylcbiAgQE91dHB1dCgncGh4Q2xpY2snKVxuICBwcm90ZWN0ZWQgY2xpY2tFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG5cbiAgY29uc3RydWN0b3IoZWxlbWVudFJlZjogRWxlbWVudFJlZiwgbmVlZEZvY3VzU2VydmljZTogTmVlZEZvY3VzU2VydmljZSkge1xuICAgIHN1cGVyKGVsZW1lbnRSZWYsIG5lZWRGb2N1c1NlcnZpY2UpO1xuXG4gICAgdGhpcy5jbGlja0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMuYmVmb3JlQ2xpY2tFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLmNoYW5nZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHN1cGVyLm5nT25Jbml0KCk7XG5cbiAgICBpZiAodGhpcy5uYW1lID09PSBudWxsIHx8IHR5cGVvZiB0aGlzLm5hbWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLm5hbWUgPSB0aGlzLkRFRkFVTFRfR1JPVVBfTkFNRSArIFwiX1wiICsgVVVJRFV0aWxzLmdlbmVyYXRlVVVJRCgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpc0NoZWNrZWQoaXRlbTogSVNlbGVjdEl0ZW1Nb2RlbCk6IGJvb2xlYW4ge1xuICAgIGlmIChpdGVtICE9PSBudWxsICYmIHR5cGVvZiBpdGVtICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgbGV0IHNJdGVtID0gdGhpcy5nZXRTZWxlY3RlZEl0ZW0oKTtcblxuICAgICAgcmV0dXJuIChzSXRlbSA9PT0gaXRlbSk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBvblJhZGlvQnRuQ2xpY2tlZCgkZXZlbnQ6IEV2ZW50LCBpbmRleDogbnVtYmVyLCBmaXJlRXZlbnQ/OiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKGZpcmVFdmVudCA9PT0gbnVsbCB8fCBmaXJlRXZlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZmlyZUV2ZW50ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIGlmICh0aGlzLmlzUmVhZE9ubHkoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzRGlzYWJsZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBvbGRJbmRleCA9IHRoaXMuZ2V0U2VsZWN0ZWRJbmRleCgpO1xuICAgIGxldCBuZXdJbmRleCA9IGluZGV4O1xuXG4gICAgRXZlbnRVdGlscy5oYW5kbGVCcm93c2VyRXZlbnQodGhpcywgJ2JlZm9yZUNsaWNrRXZlbnQnLCAkZXZlbnQsIGZpcmVFdmVudCwgKCRldmVudDogRXZlbnQpID0+IHtcbiAgICAgIC8vIGRvRXZlbnRcbiAgICAgIHRoaXMuc2V0U2VsZWN0ZWRJbmRleChuZXdJbmRleCk7XG4gICAgfSwgKCRldmVudDogRXZlbnQpID0+IHtcbiAgICAgIC8vIGVtaXRCZWZvcmVFdmVudFxuICAgICAgdGhpcy5lbWl0QmVmb3JlQ2xpY2tFdmVudChvbGRJbmRleCwgbmV3SW5kZXgsICRldmVudCk7XG4gICAgfSwgKCRldmVudDogRXZlbnQsIHJlc3VsdDogYW55KSA9PiB7XG4gICAgICAvLyBlbWl0QWZ0ZXJFdmVudFxuICAgICAgdGhpcy5lbWl0Q2xpY2tFdmVudChvbGRJbmRleCwgbmV3SW5kZXgsICRldmVudCk7XG4gICAgfSwgKCRldmVudDogRXZlbnQpID0+IHtcbiAgICAgIC8vIGRvUHJldmVudGVkXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdEJlZm9yZUNsaWNrRXZlbnQob2xkSW5kZXg6IG51bWJlciwgbmV3SW5kZXg6IG51bWJlciwgJGV2ZW50PzogYW55KTogdm9pZCB7XG4gICAgbGV0IGV2ZW50RGF0YTogYW55ID0ge1xuICAgICAgaXRlbTogdGhpcy5nZXRJdGVtQXRJbmRleChuZXdJbmRleCksXG4gICAgICBpbmRleDogbmV3SW5kZXgsXG4gICAgICBvbGRJdGVtOiB0aGlzLmdldEl0ZW1BdEluZGV4KG9sZEluZGV4KSxcbiAgICAgIG9sZEluZGV4OiBvbGRJbmRleFxuICAgIH07XG5cbiAgICAvLyBlbWl0IGV2ZW50XG4gICAgbGV0IGRhdGE6IGFueSA9IGV2ZW50RGF0YTtcbiAgICBsZXQgZXYgPSBFdmVudFV0aWxzLm5ld0N1c3RvbUV2ZW50KEJFRk9SRV9DTElDS19FVkVOVCwgdGhpcywgZGF0YSwgJGV2ZW50KTtcblxuICAgIGlmICh0aGlzLmJlZm9yZUNsaWNrRXZlbnQgIT09IG51bGwgJiYgdGhpcy5iZWZvcmVDbGlja0V2ZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuYmVmb3JlQ2xpY2tFdmVudC5lbWl0KGV2KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdENsaWNrRXZlbnQob2xkSW5kZXg6IG51bWJlciwgbmV3SW5kZXg6IG51bWJlciwgJGV2ZW50PzogYW55KTogdm9pZCB7XG4gICAgbGV0IGV2ZW50RGF0YTogYW55ID0ge1xuICAgICAgaXRlbTogdGhpcy5nZXRJdGVtQXRJbmRleChuZXdJbmRleCksXG4gICAgICBpbmRleDogbmV3SW5kZXgsXG4gICAgICBvbGRJdGVtOiB0aGlzLmdldEl0ZW1BdEluZGV4KG9sZEluZGV4KSxcbiAgICAgIG9sZEluZGV4OiBvbGRJbmRleFxuICAgIH07XG5cbiAgICAvLyBlbWl0IGV2ZW50XG4gICAgbGV0IGRhdGE6IGFueSA9IGV2ZW50RGF0YTtcbiAgICBsZXQgZXYgPSBFdmVudFV0aWxzLm5ld0N1c3RvbUV2ZW50KENMSUNLX0VWRU5ULCB0aGlzLCBkYXRhLCAkZXZlbnQpO1xuXG4gICAgaWYgKHRoaXMuY2xpY2tFdmVudCAhPT0gbnVsbCAmJiB0aGlzLmNsaWNrRXZlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jbGlja0V2ZW50LmVtaXQoZXYpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXREZXNjcmlwdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmRlc2NyaXB0aW9uO1xuICB9XG5cbiAgcHVibGljIHNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gIH1cblxuICBwdWJsaWMgaGFzRGVzY3JpcHRpb24oKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuZGVzY3JpcHRpb24gIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuZGVzY3JpcHRpb24gPT09ICdzdHJpbmcnICYmIHRoaXMuZGVzY3JpcHRpb24gIT09ICcnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25WYWxpZGF0aW9uRW5kKGlucHV0VmFsdWU6IGFueSwgcmVzdWx0czogVmFsaWRhdGlvblJlc3VsdFtdKTogdm9pZCB7XG4gICAgLy8hIGRvIHN0aGluZ1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uRGF0YUNoYW5nZShkYXRhOiBhbnksIGlucHV0VmFsOiBhbnkpOiB2b2lkIHtcbiAgfVxuXG4gIHByb3RlY3RlZCBkb0ZvY3VzKCRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgfVxuXG4gIHByb3RlY3RlZCBkb0xvc3RGb2N1cygkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gIH0gIFxuXG5cbiAgcHVibGljIGdldENsaWNrZWRFdmVudCgpOiBFdmVudEVtaXR0ZXI8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpY2tFdmVudDtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDbGlja2VkRXZlbnQoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMuY2xpY2tFdmVudCA9IGV2ZW50O1xuICB9XG5cbiAgcHVibGljIGdldEJlZm9yZUNsaWNrZWRFdmVudCgpOiBFdmVudEVtaXR0ZXI8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuYmVmb3JlQ2xpY2tFdmVudDtcbiAgfVxuXG4gIHB1YmxpYyBzZXRCZWZvcmVDbGlja2VkRXZlbnQoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMuYmVmb3JlQ2xpY2tFdmVudCA9IGV2ZW50O1xuICB9XG5cbiAgcHVibGljIGdldE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldEl0ZW1zKCk6IERlZmF1bHRTZWxlY3RJdGVtTW9kZWxbXSB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXM7XG4gIH1cbn1cbiJdfQ==