UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

724 lines (723 loc) 62.3 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 { I18N } from '../../../../../decorator/I18N.decorator'; import { Option } from '../../../../../decorator/Option.decorator'; import { EventUtils } from '../../../../../share/utils/EventUtils'; import { CLICK_EVENT, BEFORE_CLICK_EVENT, FOCUS_EVENT, BEFORE_FOCUS_EVENT, LOST_FOCUS_EVENT, BEFORE_LOST_FOCUS_EVENT } from '../../../../../share/CustomEventType'; import { AbstractI18NApplicable } from '../../../../../share/AbstractI18NApplicable'; import { NeedFocusService } from '../../../../../service/NeedFocusService.service'; const /** @type {?} */ TYPE_NAME = "material-button"; const /** @type {?} */ DEFAULT_BUTTON_ICON = 'favorite'; export class MaterialButton extends AbstractI18NApplicable { /** * @param {?} elementRef * @param {?} needFocusService */ constructor(elementRef, needFocusService) { super(); this.elementRef = elementRef; this.needFocusService = needFocusService; this.beforeClickEvent = new EventEmitter(); this.clickEvent = new EventEmitter(); this.beforeFocusEvent = new EventEmitter(); this.focusEvent = new EventEmitter(); this.beforeLostFocusEvent = new EventEmitter(); this.lostFocusEvent = new EventEmitter(); this.icon = DEFAULT_BUTTON_ICON; this.type = "mat-button"; this.color = "basic"; } /** * @return {?} */ ngOnInit() { } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { setTimeout(() => { this.initEventHandlers(); }, 20); } /** * @param {?} styleClass * @return {?} */ setStyleClass(styleClass) { this.styleClass = styleClass; } /** * @return {?} */ getStyleClass() { return this.styleClass; } /** * @return {?} */ isDisable() { return this.disabled; } /** * @param {?} disable * @return {?} */ setDisable(disable) { this.disabled = disable; } /** * @return {?} */ isDisableRipple() { return this.disableRipple; } /** * @param {?} disableRipple * @return {?} */ setDisableRipple(disableRipple) { this.disableRipple = disableRipple; } /** * @param {?} type * @return {?} */ setType(type) { this.type = type; } /** * @return {?} */ getType() { return this.type; } /** * @return {?} */ getColor() { return this.color; } /** * @param {?} color * @return {?} */ setColor(color) { this.color = color; } /** * @return {?} */ getLabel() { return this.label; } /** * @param {?} label * @return {?} */ setLabel(label) { this.label = label; } /** * @return {?} */ getButtonIcon() { return this.icon = this.icon === 'favorite' ? DEFAULT_BUTTON_ICON : this.icon; } /** * @param {?} buttonIcon * @return {?} */ setButtonIcon(buttonIcon) { this.icon = buttonIcon; } /** * @param {?} $event * @param {?=} fireEvent * @return {?} */ onClick($event, fireEvent) { if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } EventUtils.handleBrowserEvent(this, 'beforeClickEvent', $event, fireEvent, ($event) => { // doEvent }, ($event) => { // emitBeforeEvent this.emitBeforeClickEvent($event); }, ($event, result) => { // emitAfterEvent this.emitClickEvent($event); }, ($event) => { // doPrevented }); } /** * @param {?=} $event * @return {?} */ emitBeforeClickEvent($event) { let /** @type {?} */ eventData = null; // emit event let /** @type {?} */ data = eventData; let /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_CLICK_EVENT, this, data, $event); if (this.beforeClickEvent !== null && this.beforeClickEvent !== undefined) { this.beforeClickEvent.emit(ev); } } /** * @param {?=} $event * @return {?} */ emitClickEvent($event) { let /** @type {?} */ eventData = null; // emit event let /** @type {?} */ data = eventData; let /** @type {?} */ ev = EventUtils.newCustomEvent(CLICK_EVENT, this, data, $event); if (this.clickEvent !== null && this.clickEvent !== undefined) { this.clickEvent.emit(ev); } } /** * @return {?} */ getI18NKey() { if (this.i18nKey === null || typeof this.i18nKey === 'undefined' || this.i18nKey === '') { // lower case first charactor let /** @type {?} */ className = this.constructor.name; return className.charAt(0).toLowerCase() + className.slice(1); } return this.name; } /** * @param {?} $event * @return {?} */ onFocusing($event) { this.needFocusService.setFocusingComponent(this, $event); } /** * @param {?} $event * @return {?} */ onLostFocusing($event) { this.needFocusService.resetFocusingComponent($event); } /** * @param {?} $event * @return {?} */ doFocus($event) { if (this.type === "mat-button") { if ($(this.elementRef.nativeElement).find('button.mat-button:focus').length <= 0) { $(this.elementRef.nativeElement).find('button.mat-button').focus(); } } else if (this.type === "mat-raised-button") { if ($(this.elementRef.nativeElement).find('button.mat-raised-button:focus').length <= 0) { $(this.elementRef.nativeElement).find('button.mat-raised-button').focus(); } } else if (this.type === "mat-stroked-button") { if ($(this.elementRef.nativeElement).find('button.mat-stroked-button:focus').length <= 0) { $(this.elementRef.nativeElement).find('button.mat-stroked-button').focus(); } } else if (this.type === "mat-flat-button") { if ($(this.elementRef.nativeElement).find('button.mat-flat-button:focus').length <= 0) { $(this.elementRef.nativeElement).find('button.mat-flat-button').focus(); } } else if (this.type === "mat-icon-button") { if ($(this.elementRef.nativeElement).find('button.mat-icon-button:focus').length <= 0) { $(this.elementRef.nativeElement).find('button.mat-icon-button').focus(); } } } /** * @param {?} $event * @return {?} */ doLostFocus($event) { if (this.type === "mat-button") { if ($(this.elementRef.nativeElement).find('button.mat-button:focus').length > 0) { $(this.elementRef.nativeElement).find('button.mat-button').blur(); } } else if (this.type === "mat-raised-button") { if ($(this.elementRef.nativeElement).find('button.mat-raised-button:focus').length > 0) { $(this.elementRef.nativeElement).find('button.mat-raised-button').blur(); } } else if (this.type === "mat-stroked-button") { if ($(this.elementRef.nativeElement).find('button.mat-stroked-button:focus').length > 0) { $(this.elementRef.nativeElement).find('button.mat-stroked-button').blur(); } } else if (this.type === "mat-flat-button") { if ($(this.elementRef.nativeElement).find('button.mat-flat-button:focus').length > 0) { $(this.elementRef.nativeElement).find('button.mat-flat-button').blur(); } } else if (this.type === "mat-icon-button") { if ($(this.elementRef.nativeElement).find('button.mat-icon-button:focus').length > 0) { $(this.elementRef.nativeElement).find('button.mat-icon-button').blur(); } } } /** * @return {?} */ initEventHandlers() { if (this.type === "mat-button") { $(this.elementRef.nativeElement).find('button.mat-button').focus(($event) => { this.onFocusing($event); }); $(this.elementRef.nativeElement).find('button.mat-button').blur(($event) => { this.onLostFocusing($event); }); } else if (this.type === "mat-raised-button") { $(this.elementRef.nativeElement).find('button.mat-raised-button').focus(($event) => { this.onFocusing($event); }); $(this.elementRef.nativeElement).find('button.mat-raised-button').blur(($event) => { this.onLostFocusing($event); }); } else if (this.type === "mat-stroked-button") { $(this.elementRef.nativeElement).find('button.mat-stroked-button').focus(($event) => { this.onFocusing($event); }); $(this.elementRef.nativeElement).find('button.mat-stroked-button').blur(($event) => { this.onLostFocusing($event); }); } else if (this.type === "mat-flat-button") { $(this.elementRef.nativeElement).find('button.mat-flat-button').focus(($event) => { this.onFocusing($event); }); $(this.elementRef.nativeElement).find('button.mat-flat-button').blur(($event) => { this.onLostFocusing($event); }); } else if (this.type === "mat-icon-button") { $(this.elementRef.nativeElement).find('button.mat-icon-button').focus(($event) => { this.onFocusing($event); }); $(this.elementRef.nativeElement).find('button.mat-icon-button').blur(($event) => { this.onLostFocusing($event); }); } } /** * @param {?=} $event * @return {?} */ emitBeforeFocusEvent($event) { // emit event let /** @type {?} */ data = null; let /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_FOCUS_EVENT, this, data, $event); if (this.beforeFocusEvent !== null && this.beforeFocusEvent !== undefined) { this.beforeFocusEvent.emit(ev); } } /** * @param {?=} $event * @return {?} */ emitBeforeLostFocusEvent($event) { // emit event let /** @type {?} */ data = null; let /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_LOST_FOCUS_EVENT, this, data, $event); if (this.beforeLostFocusEvent !== null && this.beforeLostFocusEvent !== undefined) { this.beforeLostFocusEvent.emit(ev); } } /** * @param {?} $event * @return {?} */ emitLostFocusEvent($event) { let /** @type {?} */ data = null; let /** @type {?} */ ev = EventUtils.newCustomEvent(LOST_FOCUS_EVENT, this, data, $event); if (this.lostFocusEvent !== null && this.lostFocusEvent !== undefined) { this.lostFocusEvent.emit(ev); } } /** * @param {?} $event * @return {?} */ emitFocusEvent($event) { let /** @type {?} */ data = null; let /** @type {?} */ ev = EventUtils.newCustomEvent(FOCUS_EVENT, this, data, $event); if (this.focusEvent !== null && this.focusEvent !== undefined) { this.focusEvent.emit(ev); } } /** * @param {?} $event * @param {?=} fireEvent * @return {?} */ onLostFocus($event, fireEvent) { if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } EventUtils.handleBrowserEvent(this, 'beforeLostFocusEvent', $event, fireEvent, ($event) => { // doEvent this.doLostFocus($event); }, ($event) => { // emitBeforeEvent this.emitBeforeLostFocusEvent($event); }, ($event, result) => { // emitAfterEvent this.emitLostFocusEvent($event); }, ($event) => { // doPrevented // Reset focus on DOM setTimeout(() => { this.doFocus($event); }, 5); }); } /** * @param {?} $event * @param {?=} fireEvent * @return {?} */ onFocus($event, fireEvent) { if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } EventUtils.handleBrowserEvent(this, 'beforeFocusEvent', $event, fireEvent, ($event) => { // doEvent this.doFocus($event); }, ($event) => { // emitBeforeEvent this.emitBeforeFocusEvent($event); }, ($event, result) => { // emitAfterEvent this.emitFocusEvent($event); }, ($event) => { // doPrevented // Reset focus on DOM setTimeout(() => { this.doLostFocus($event); }, 5); }); } /** * @return {?} */ getData() { } /** * @param {?} data * @return {?} */ setData(data) { } /** * @param {?} child * @return {?} */ addDataChild(child) { } /** * @param {?} child * @return {?} */ removeDataChild(child) { } /** * @param {?} dataParent * @return {?} */ setDataParent(dataParent) { if (this.dataParent !== null && typeof this.dataParent !== 'undefined') { if (typeof this.dataParent.removeDataChild === 'function') { this.dataParent.removeDataChild(this); } } this.dataParent = dataParent; if (this.dataParent !== null && typeof this.dataParent !== 'undefined') { if (typeof this.dataParent.addDataChild === 'function') { this.dataParent.addDataChild(this); } } } /** * @return {?} */ getDataParent() { return this.dataParent; } /** * @return {?} */ getDataChildren() { return; } /** * @return {?} */ isDataDirty() { return; } /** * @return {?} */ isIgnoreParentData() { return; } /** * @param {?} ignore * @return {?} */ setIgnoreParentData(ignore) { } /** * @param {?=} data * @return {?} */ saveData(data) { } /** * @return {?} */ resetData() { } /** * @return {?} */ getBeforeClickEvent() { return this.beforeClickEvent; } /** * @param {?} event * @return {?} */ setBeforeClickEvent(event) { this.beforeClickEvent = event; } /** * @return {?} */ getClickEvent() { return this.clickEvent; } /** * @param {?} event * @return {?} */ setClickEvent(event) { this.clickEvent = event; } /** * @return {?} */ getBeforeFocusEvent() { return this.beforeFocusEvent; } /** * @param {?} event * @return {?} */ setBeforeFocusEvent(event) { this.beforeFocusEvent = event; } /** * @return {?} */ getFocusEvent() { return this.focusEvent; } /** * @param {?} event * @return {?} */ setFocusEvent(event) { this.focusEvent = event; } /** * @return {?} */ getBeforeLostFocusEvent() { return this.beforeLostFocusEvent; } /** * @param {?} event * @return {?} */ setBeforeLostFocusEvent(event) { this.beforeLostFocusEvent = event; } /** * @return {?} */ getLostFocusEvent() { return this.lostFocusEvent; } /** * @param {?} event * @return {?} */ setLostFocusEvent(event) { this.lostFocusEvent = event; } } MaterialButton.TYPE_NAME = TYPE_NAME; MaterialButton.decorators = [ { type: Component, args: [{ moduleId: module.id, selector: TYPE_NAME, template: `<div class="material-input"> <button [color]="getColor()" [ngClass]="getStyleClass()" [disableRipple]="isDisableRipple()" [disabled]="isDisable()" *ngIf="getType() === 'mat-button'" mat-button (click)="onClick($event)">{{ getLabel() }}</button> <button [color]="getColor()" [ngClass]="getStyleClass()" [disableRipple]="isDisableRipple()" [disabled]="isDisable()" *ngIf="getType() === 'mat-raised-button'" mat-raised-button (click)="onClick($event)" >{{ getLabel() }}</button> <button [color]="getColor()" [ngClass]="getStyleClass()" [disableRipple]="isDisableRipple()" [disabled]="isDisable()" *ngIf="getType() === 'mat-stroked-button'" mat-stroked-button (click)="onClick($event)" >{{ getLabel() }}</button> <button [color]="getColor()" [ngClass]="getStyleClass()" [disableRipple]="isDisableRipple()" [disabled]="isDisable()" *ngIf="getType() === 'mat-flat-button'" mat-flat-button (click)="onClick($event)" >{{ getLabel() }}</button> <button [color]="getColor()" [ngClass]="getStyleClass()" [disableRipple]="isDisableRipple()" [disabled]="isDisable()" *ngIf="getType() === 'mat-icon-button'" mat-icon-button (click)="onClick($event)" > <mat-icon>{{ getButtonIcon() }}</mat-icon> </button> </div> `, },] }, ]; /** @nocollapse */ MaterialButton.ctorParameters = () => [ { type: ElementRef, }, { type: NeedFocusService, }, ]; MaterialButton.propDecorators = { "beforeClickEvent": [{ type: Output, args: ['phxBeforeClick',] },], "clickEvent": [{ type: Output, args: ['phxClick',] },], "beforeFocusEvent": [{ type: Output, args: ['phxBeforeFocus',] },], "focusEvent": [{ type: Output, args: ['phxFocus',] },], "beforeLostFocusEvent": [{ type: Output, args: ['phxBeforeLostFocus',] },], "lostFocusEvent": [{ type: Output, args: ['phxLostFocus',] },], "disableRipple": [{ type: Input },], "disabled": [{ type: Input },], "color": [{ type: Input },], "type": [{ type: Input },], "styleClass": [{ type: Input },], "name": [{ type: Input },], "icon": [{ type: Input },], "label": [{ type: Input },], }; tslib_1.__decorate([ Option('beforeClick'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialButton.prototype, "beforeClickEvent", void 0); tslib_1.__decorate([ Option('click'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialButton.prototype, "clickEvent", void 0); tslib_1.__decorate([ Option('beforeFocus'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialButton.prototype, "beforeFocusEvent", void 0); tslib_1.__decorate([ Option('focus'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialButton.prototype, "focusEvent", void 0); tslib_1.__decorate([ Option('beforeLostFocus'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialButton.prototype, "beforeLostFocusEvent", void 0); tslib_1.__decorate([ Option('lostFocus'), tslib_1.__metadata("design:type", EventEmitter) ], MaterialButton.prototype, "lostFocusEvent", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Object) ], MaterialButton.prototype, "dataParent", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialButton.prototype, "disableRipple", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Boolean) ], MaterialButton.prototype, "disabled", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], MaterialButton.prototype, "color", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], MaterialButton.prototype, "type", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Object) ], MaterialButton.prototype, "styleClass", void 0); tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], MaterialButton.prototype, "name", void 0); tslib_1.__decorate([ I18N(), Option(), tslib_1.__metadata("design:type", String) ], MaterialButton.prototype, "icon", void 0); tslib_1.__decorate([ I18N(), Option(), tslib_1.__metadata("design:type", String) ], MaterialButton.prototype, "label", void 0); function MaterialButton_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ MaterialButton.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ MaterialButton.ctorParameters; /** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */ MaterialButton.propDecorators; /** @type {?} */ MaterialButton.TYPE_NAME; /** @type {?} */ MaterialButton.prototype.elementRef; /** @type {?} */ MaterialButton.prototype.needFocusService; /** @type {?} */ MaterialButton.prototype.beforeClickEvent; /** @type {?} */ MaterialButton.prototype.clickEvent; /** @type {?} */ MaterialButton.prototype.beforeFocusEvent; /** @type {?} */ MaterialButton.prototype.focusEvent; /** @type {?} */ MaterialButton.prototype.beforeLostFocusEvent; /** @type {?} */ MaterialButton.prototype.lostFocusEvent; /** @type {?} */ MaterialButton.prototype.dataParent; /** @type {?} */ MaterialButton.prototype.disableRipple; /** @type {?} */ MaterialButton.prototype.disabled; /** @type {?} */ MaterialButton.prototype.color; /** @type {?} */ MaterialButton.prototype.type; /** @type {?} */ MaterialButton.prototype.styleClass; /** @type {?} */ MaterialButton.prototype.name; /** @type {?} */ MaterialButton.prototype.icon; /** @type {?} */ MaterialButton.prototype.label; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF0ZXJpYWxCdXR0b24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vY29tLnBobG94dWkvIiwic291cmNlcyI6WyJsaWIvdGhlbWUvbWF0ZXJpYWwvY29tcG9uZW50L2RhdGF2aWV3L2lucHV0L01hdGVyaWFsQnV0dG9uLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQWlCLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDL0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLFdBQVcsRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ25LLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBS25GLHVCQUFNLFNBQVMsR0FBVyxpQkFBaUIsQ0FBQztBQUM1Qyx1QkFBTSxtQkFBbUIsR0FBRyxVQUFVLENBQUM7QUFnQnZDLE1BQU0scUJBQXNCLFNBQVEsc0JBQXNCOzs7OztJQXNEeEQsWUFBWSxVQUFzQixFQUFFLGdCQUFtQztRQUNyRSxLQUFLLEVBQUUsQ0FBQztRQUVSLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztRQUN6QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMzQyxJQUFJLENBQUMsVUFBVSxHQUFH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RUFBRTs7OztJQUdSLE1BQU0sRUFBRTs7OztJQUdSLE1BQU0sRUFBRTs7OztJQUdSLElBQUksRUFBRTtJQUNOLE1BQU0sRUFBRTs7OztJQUdSLElBQUksRUFBRTtJQUNOLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBFbGVtZW50UmVmLCBJbnB1dCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEkxOE4gfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9kZWNvcmF0b3IvSTE4Ti5kZWNvcmF0b3InO1xuaW1wb3J0IHsgT3B0aW9uIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vZGVjb3JhdG9yL09wdGlvbi5kZWNvcmF0b3InO1xuaW1wb3J0IHsgRXZlbnRVdGlscyB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3NoYXJlL3V0aWxzL0V2ZW50VXRpbHMnO1xuaW1wb3J0IHsgQ0xJQ0tfRVZFTlQsIEJFRk9SRV9DTElDS19FVkVOVCwgRk9DVVNfRVZFTlQsIEJFRk9SRV9GT0NVU19FVkVOVCwgTE9TVF9GT0NVU19FVkVOVCwgQkVGT1JFX0xPU1RfRk9DVVNfRVZFTlQgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9zaGFyZS9DdXN0b21FdmVudFR5cGUnO1xuaW1wb3J0IHsgQWJzdHJhY3RJMThOQXBwbGljYWJsZSB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3NoYXJlL0Fic3RyYWN0STE4TkFwcGxpY2FibGUnO1xuaW1wb3J0IHsgTmVlZEZvY3VzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3NlcnZpY2UvTmVlZEZvY3VzU2VydmljZS5zZXJ2aWNlJztcbmltcG9ydCB7IElIYXNEYXRhIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vY29tcG9uZW50L0lIYXNEYXRhJztcbmltcG9ydCB7IElOZWVkRm9jdXMgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9jb21wb25lbnQvSU5lZWRGb2N1cyc7XG5cblxuY29uc3QgVFlQRV9OQU1FOiBzdHJpbmcgPSBcIm1hdGVyaWFsLWJ1dHRvblwiO1xuY29uc3QgREVGQVVMVF9CVVRUT05fSUNPTiA9ICdmYXZvcml0ZSc7XG5cbkBDb21wb25lbnQoe1xuICBtb2R1bGVJZDogbW9kdWxlLmlkLFxuICBzZWxlY3RvcjogVFlQRV9OQU1FLFxuICB0ZW1wbGF0ZTogYDxkaXYgY2xhc3M9XCJtYXRlcmlhbC1pbnB1dFwiPlxuICA8YnV0dG9uIFtjb2xvcl09XCJnZXRDb2xvcigpXCIgW25nQ2xhc3NdPVwiZ2V0U3R5bGVDbGFzcygpXCIgW2Rpc2FibGVSaXBwbGVdPVwiaXNEaXNhYmxlUmlwcGxlKClcIiBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlKClcIiAqbmdJZj1cImdldFR5cGUoKSA9PT0gJ21hdC1idXR0b24nXCIgbWF0LWJ1dHRvbiAoY2xpY2spPVwib25DbGljaygkZXZlbnQpXCI+e3sgZ2V0TGFiZWwoKSB9fTwvYnV0dG9uPlxuICA8YnV0dG9uIFtjb2xvcl09XCJnZXRDb2xvcigpXCIgW25nQ2xhc3NdPVwiZ2V0U3R5bGVDbGFzcygpXCIgW2Rpc2FibGVSaXBwbGVdPVwiaXNEaXNhYmxlUmlwcGxlKClcIiBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlKClcIiAqbmdJZj1cImdldFR5cGUoKSA9PT0gJ21hdC1yYWlzZWQtYnV0dG9uJ1wiIG1hdC1yYWlzZWQtYnV0dG9uIChjbGljayk9XCJvbkNsaWNrKCRldmVudClcIiA+e3sgZ2V0TGFiZWwoKSB9fTwvYnV0dG9uPlxuICA8YnV0dG9uIFtjb2xvcl09XCJnZXRDb2xvcigpXCIgW25nQ2xhc3NdPVwiZ2V0U3R5bGVDbGFzcygpXCIgW2Rpc2FibGVSaXBwbGVdPVwiaXNEaXNhYmxlUmlwcGxlKClcIiBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlKClcIiAqbmdJZj1cImdldFR5cGUoKSA9PT0gJ21hdC1zdHJva2VkLWJ1dHRvbidcIiBtYXQtc3Ryb2tlZC1idXR0b24gKGNsaWNrKT1cIm9uQ2xpY2soJGV2ZW50KVwiID57eyBnZXRMYWJlbCgpIH19PC9idXR0b24+XG4gIDxidXR0b24gW2NvbG9yXT1cImdldENvbG9yKClcIiBbbmdDbGFzc109XCJnZXRTdHlsZUNsYXNzKClcIiBbZGlzYWJsZVJpcHBsZV09XCJpc0Rpc2FibGVSaXBwbGUoKVwiIFtkaXNhYmxlZF09XCJpc0Rpc2FibGUoKVwiICpuZ0lmPVwiZ2V0VHlwZSgpID09PSAnbWF0LWZsYXQtYnV0dG9uJ1wiIG1hdC1mbGF0LWJ1dHRvbiAoY2xpY2spPVwib25DbGljaygkZXZlbnQpXCIgPnt7IGdldExhYmVsKCkgfX08L2J1dHRvbj5cbiAgPGJ1dHRvbiBbY29sb3JdPVwiZ2V0Q29sb3IoKVwiIFtuZ0NsYXNzXT1cImdldFN0eWxlQ2xhc3MoKVwiIFtkaXNhYmxlUmlwcGxlXT1cImlzRGlzYWJsZVJpcHBsZSgpXCIgW2Rpc2FibGVkXT1cImlzRGlzYWJsZSgpXCIgKm5nSWY9XCJnZXRUeXBlKCkgPT09ICdtYXQtaWNvbi1idXR0b24nXCIgbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJvbkNsaWNrKCRldmVudClcIiA+XG4gICAgPG1hdC1pY29uPnt7IGdldEJ1dHRvbkljb24oKSB9fTwvbWF0LWljb24+XG4gIDwvYnV0dG9uPlxuPC9kaXY+XG5gLFxufSlcbmV4cG9ydCBjbGFzcyBNYXRlcmlhbEJ1dHRvbiBleHRlbmRzIEFic3RyYWN0STE4TkFwcGxpY2FibGUgaW1wbGVtZW50cyBPbkluaXQsIElIYXNEYXRhLCBJTmVlZEZvY3VzIHtcbiAgcHJvdGVjdGVkIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY7XG4gIHByb3RlY3RlZCBuZWVkRm9jdXNTZXJ2aWNlOiBOZWVkRm9jdXNTZXJ2aWNlO1xuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVFlQRV9OQU1FOiBzdHJpbmcgPSBUWVBFX05BTUU7XG5cbiAgQE91dHB1dCgncGh4QmVmb3JlQ2xpY2snKVxuICBAT3B0aW9uKCdiZWZvcmVDbGljaycpXG4gIHByb3RlY3RlZCBiZWZvcmVDbGlja0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE91dHB1dCgncGh4Q2xpY2snKVxuICBAT3B0aW9uKCdjbGljaycpXG4gIHByb3RlY3RlZCBjbGlja0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE91dHB1dCgncGh4QmVmb3JlRm9jdXMnKVxuICBAT3B0aW9uKCdiZWZvcmVGb2N1cycpXG4gIHByb3RlY3RlZCBiZWZvcmVGb2N1c0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE91dHB1dCgncGh4Rm9jdXMnKVxuICBAT3B0aW9uKCdmb2N1cycpXG4gIHByb3RlY3RlZCBmb2N1c0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE91dHB1dCgncGh4QmVmb3JlTG9zdEZvY3VzJylcbiAgQE9wdGlvbignYmVmb3JlTG9zdEZvY3VzJylcbiAgcHJvdGVjdGVkIGJlZm9yZUxvc3RGb2N1c0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE91dHB1dCgncGh4TG9zdEZvY3VzJylcbiAgQE9wdGlvbignbG9zdEZvY3VzJylcbiAgcHJvdGVjdGVkIGxvc3RGb2N1c0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcblxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIGRhdGFQYXJlbnQ6IElIYXNEYXRhO1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIGRpc2FibGVSaXBwbGU6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgZGlzYWJsZWQ6IGJvb2xlYW47XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgY29sb3I6IHN0cmluZztcbiAgQElucHV0KClcbiAgQE9wdGlvbigpXG4gIHByb3RlY3RlZCB0eXBlOiBzdHJpbmc7XG4gIEBJbnB1dCgpXG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgc3R5bGVDbGFzczogc3RyaW5nfHN0cmluZ1tdO1xuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIG5hbWU6IHN0cmluZztcbiAgQElucHV0KClcbiAgQEkxOE4oKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIGljb246IHN0cmluZztcbiAgQElucHV0KClcbiAgQEkxOE4oKVxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIGxhYmVsOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZWxlbWVudFJlZjogRWxlbWVudFJlZiwgbmVlZEZvY3VzU2VydmljZSA6IE5lZWRGb2N1c1NlcnZpY2UpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5lbGVtZW50UmVmID0gZWxlbWVudFJlZjtcbiAgICB0aGlzLm5lZWRGb2N1c1NlcnZpY2UgPSBuZWVkRm9jdXNTZXJ2aWNlO1xuICAgIHRoaXMuYmVmb3JlQ2xpY2tFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLmNsaWNrRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgdGhpcy5iZWZvcmVGb2N1c0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMuZm9jdXNFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLmJlZm9yZUxvc3RGb2N1c0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMubG9zdEZvY3VzRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICB0aGlzLmljb24gPSBERUZBVUxUX0JVVFRPTl9JQ09OO1xuICAgIHRoaXMudHlwZSA9IFwibWF0LWJ1dHRvblwiO1xuICAgIHRoaXMuY29sb3IgPSBcImJhc2ljXCI7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gIH1cblxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIHNldFRpbWVvdXQoKCk9PntcbiAgICAgIHRoaXMuaW5pdEV2ZW50SGFuZGxlcnMoKTtcbiAgICB9LDIwKVxuICB9XG5cbiAgcHVibGljIHNldFN0eWxlQ2xhc3Moc3R5bGVDbGFzczogc3RyaW5nfHN0cmluZ1tdKTogdm9pZCB7XG4gICAgdGhpcy5zdHlsZUNsYXNzID0gc3R5bGVDbGFzcztcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdHlsZUNsYXNzKCk6IHN0cmluZ3xzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuc3R5bGVDbGFzcztcbiAgfVxuXG4gIHB1YmxpYyBpc0Rpc2FibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGlzYWJsZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0RGlzYWJsZShkaXNhYmxlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGRpc2FibGU7XG4gIH1cblxuICBwdWJsaWMgaXNEaXNhYmxlUmlwcGxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRpc2FibGVSaXBwbGU7XG4gIH1cblxuICBwdWJsaWMgc2V0RGlzYWJsZVJpcHBsZShkaXNhYmxlUmlwcGxlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlUmlwcGxlID0gZGlzYWJsZVJpcHBsZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRUeXBlKHR5cGU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29sb3IoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb2xvcjtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDb2xvcihjb2xvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jb2xvciA9IGNvbG9yO1xuICB9XG5cbiAgcHVibGljIGdldExhYmVsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubGFiZWw7XG4gIH1cblxuICBwdWJsaWMgc2V0TGFiZWwobGFiZWw6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubGFiZWwgPSBsYWJlbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRCdXR0b25JY29uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaWNvbiA9IHRoaXMuaWNvbiA9PT0gJ2Zhdm9yaXRlJyA/IERFRkFVTFRfQlVUVE9OX0lDT04gOiB0aGlzLmljb247XG4gIH1cblxuICBwdWJsaWMgc2V0QnV0dG9uSWNvbihidXR0b25JY29uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmljb24gPSBidXR0b25JY29uO1xuICB9XG5cbiAgcHVibGljIG9uQ2xpY2soJGV2ZW50OiBhbnksIGZpcmVFdmVudD86IGJvb2xlYW4pIHtcbiAgICBpZiAoZmlyZUV2ZW50ID09PSBudWxsIHx8IGZpcmVFdmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBmaXJlRXZlbnQgPSB0cnVlO1xuICAgIH1cblxuICAgIEV2ZW50VXRpbHMuaGFuZGxlQnJvd3NlckV2ZW50KHRoaXMsICdiZWZvcmVDbGlja0V2ZW50JywgJGV2ZW50LCBmaXJlRXZlbnQsICgkZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAvLyBkb0V2ZW50XG4gICAgfSwgKCRldmVudDogRXZlbnQpID0+IHtcbiAgICAgIC8vIGVtaXRCZWZvcmVFdmVudFxuICAgICAgdGhpcy5lbWl0QmVmb3JlQ2xpY2tFdmVudCgkZXZlbnQpO1xuICAgIH0sICgkZXZlbnQ6IEV2ZW50LCByZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgLy8gZW1pdEFmdGVyRXZlbnRcbiAgICAgIHRoaXMuZW1pdENsaWNrRXZlbnQoJGV2ZW50KTtcbiAgICB9LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgLy8gZG9QcmV2ZW50ZWRcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBlbWl0QmVmb3JlQ2xpY2tFdmVudCgkZXZlbnQ/OiBhbnkpOiB2b2lkIHtcbiAgICBsZXQgZXZlbnREYXRhOiBhbnkgPSBudWxsO1xuXG4gICAgLy8gZW1pdCBldmVudFxuICAgIGxldCBkYXRhOiBhbnkgPSBldmVudERhdGE7XG4gICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChCRUZPUkVfQ0xJQ0tfRVZFTlQsIHRoaXMsIGRhdGEsICRldmVudCk7XG5cbiAgICBpZiAodGhpcy5iZWZvcmVDbGlja0V2ZW50ICE9PSBudWxsICYmIHRoaXMuYmVmb3JlQ2xpY2tFdmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmJlZm9yZUNsaWNrRXZlbnQuZW1pdChldik7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGVtaXRDbGlja0V2ZW50KCRldmVudD86IGFueSk6IHZvaWQge1xuICAgIGxldCBldmVudERhdGE6IGFueSA9IG51bGw7XG5cbiAgICAvLyBlbWl0IGV2ZW50XG4gICAgbGV0IGRhdGE6IGFueSA9IGV2ZW50RGF0YTtcbiAgICBsZXQgZXYgPSBFdmVudFV0aWxzLm5ld0N1c3RvbUV2ZW50KENMSUNLX0VWRU5ULCB0aGlzLCBkYXRhLCAkZXZlbnQpO1xuXG4gICAgaWYgKHRoaXMuY2xpY2tFdmVudCAhPT0gbnVsbCAmJiB0aGlzLmNsaWNrRXZlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jbGlja0V2ZW50LmVtaXQoZXYpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRJMThOS2V5KCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuaTE4bktleSA9PT0gbnVsbCB8fCB0eXBlb2YgdGhpcy5pMThuS2V5ID09PSAndW5kZWZpbmVkJyB8fCB0aGlzLmkxOG5LZXkgPT09ICcnKSB7XG4gICAgICAvLyBsb3dlciBjYXNlIGZpcnN0IGNoYXJhY3RvclxuICAgICAgbGV0IGNsYXNzTmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZTtcbiAgICAgIHJldHVybiBjbGFzc05hbWUuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBjbGFzc05hbWUuc2xpY2UoMSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm5hbWU7XG4gIH1cblxuICBwdWJsaWMgb25Gb2N1c2luZygkZXZlbn