UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

751 lines (750 loc) 60.4 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { EventEmitter } from '@angular/core'; import { ACTIVATE_EVENT, DEACTIVATE_EVENT, ENABLE_EVENT, DISABLE_EVENT, BEFORE_ACTIVATE_EVENT, BEFORE_DEACTIVATE_EVENT, BEFORE_ENABLE_EVENT, BEFORE_DISABLE_EVENT } from '../../share/CustomEventType'; import { AbstractDataView } from './AbstractDataView'; import { Option } from '../../decorator/Option.decorator'; import { EventUtils } from '../../share/utils/EventUtils'; // unsupported: template constraints. /** * @abstract * @template T */ export class AbstractAccordion extends AbstractDataView { /** * @param {?} elementRef */ constructor(elementRef) { super(elementRef); this.itemStatus = []; this.autoInit = false; this.multipleExpand = true; this.activateEvent = new EventEmitter(); this.deactivateEvent = new EventEmitter(); this.enableEvent = new EventEmitter(); this.disableEvent = new EventEmitter(); this.beforeActivateEvent = new EventEmitter(); this.beforeDeactivateEvent = new EventEmitter(); this.beforeEnableEvent = new EventEmitter(); this.beforeDisableEvent = new EventEmitter(); } /** * @return {?} */ ngOnInit() { this.setAccordionItems(this.items); if (this.autoInit !== null && typeof this.autoInit !== 'undefined') { if (this.autoInit) { this.init(); } } } /** * @param {?} item * @return {?} */ generateItemStatus(item) { let /** @type {?} */ result = { active: false, enable: false }; if (item !== null && typeof item !== 'undefined') { result.active = item.active; result.enable = item.enable; } return result; } /** * @param {?} index * @param {?=} exceptIndex * @return {?} */ collapseItem(index, exceptIndex) { if (index !== null && typeof index !== 'undefined') { if (exceptIndex !== null && exceptIndex !== undefined) { if (index === exceptIndex) { return; } } let /** @type {?} */ item = this.getAccordionItem(index); if (item !== null) { if (item.active) { item.active = false; // update status let /** @type {?} */ status = this.itemStatus[index]; status.active = false; } this.onAccordionDeactived(index, item); } } } /** * @param {?} index * @return {?} */ _activateItem(index) { if (index === null || index === undefined || index <= -1) { return null; } let /** @type {?} */ item = this.getAccordionItem(index); if (item !== null) { if (!item.active) { item.active = true; // update status let /** @type {?} */ status = this.itemStatus[index]; status.active = true; if (!this.multipleExpand) { this.collapseItemAllExceptIndex(index); } this.onAccordionActived(index, item); return item; } } return null; } /** * @param {?} index * @return {?} */ _deactivateItem(index) { if (index === null || index === undefined || index <= -1) { return null; } let /** @type {?} */ item = this.getAccordionItem(index); if (item !== null) { if (item.active) { item.active = false; // update status let /** @type {?} */ status = this.itemStatus[index]; status.active = false; this.onAccordionDeactived(index, item); return item; } } return null; } /** * @param {?} index * @return {?} */ _enableItem(index) { if (index === null || index === undefined || index <= -1) { return null; } let /** @type {?} */ item = this.getAccordionItem(index); if (item !== null && item !== undefined) { if (!item.enable) { item.enable = true; // update status let /** @type {?} */ status = this.itemStatus[index]; status.enable = true; this.onAccordionEnabled(index, item); return item; } } return null; } /** * @param {?} index * @return {?} */ _disableItem(index) { if (index === null || index === undefined || index <= -1) { return null; } let /** @type {?} */ item = this.getAccordionItem(index); if (item !== null && item !== undefined) { if (item.enable) { this.deactivate(index); item.enable = false; // update status let /** @type {?} */ status = this.itemStatus[index]; status.enable = false; this.onAccordionDisabled(index, item); return item; } } return null; } /** * @param {?} item * @param {?} index * @param {?=} $event * @return {?} */ emitBeforeActivateEvent(item, index, $event) { // emit beforeEvent let /** @type {?} */ bData = { item: item, index: index }; let /** @type {?} */ beforeEV = EventUtils.newCustomEvent(BEFORE_ACTIVATE_EVENT, this, bData, $event); this.beforeActivateEvent.emit(beforeEV); } /** * @param {?} item * @param {?} index * @param {?=} $event * @return {?} */ emitActivateEvent(item, index, $event) { // emit event let /** @type {?} */ data = { item: item, index: index }; let /** @type {?} */ ev = EventUtils.newCustomEvent(ACTIVATE_EVENT, this, data, $event); this.activateEvent.emit(ev); } /** * @param {?} item * @param {?} index * @param {?=} $event * @return {?} */ emitBeforeDeactivateEvent(item, index, $event) { // emit beforeEvent let /** @type {?} */ bData = { item: item, index: index }; let /** @type {?} */ beforeEV = EventUtils.newCustomEvent(BEFORE_DEACTIVATE_EVENT, this, bData, $event); this.beforeDeactivateEvent.emit(beforeEV); } /** * @param {?} item * @param {?} index * @param {?=} $event * @return {?} */ emitDeactivateEvent(item, index, $event) { // emit event let /** @type {?} */ data = { item: item, index: index }; let /** @type {?} */ ev = EventUtils.newCustomEvent(DEACTIVATE_EVENT, this, data, $event); this.deactivateEvent.emit(ev); } /** * @param {?} item * @param {?} index * @param {?=} $event * @return {?} */ emitBeforeEnableEvent(item, index, $event) { // emit beforeEvent let /** @type {?} */ bData = { item: item, index: index }; let /** @type {?} */ beforeEV = EventUtils.newCustomEvent(BEFORE_ENABLE_EVENT, this, bData, null); this.beforeEnableEvent.emit(beforeEV); } /** * @param {?} item * @param {?} index * @param {?=} $event * @return {?} */ emitEnableEvent(item, index, $event) { // emit event let /** @type {?} */ data = { item: item, index: index }; let /** @type {?} */ ev = EventUtils.newCustomEvent(ENABLE_EVENT, this, data, $event); this.enableEvent.emit(ev); } /** * @param {?} item * @param {?} index * @param {?=} $event * @return {?} */ emitBeforeDisableEvent(item, index, $event) { // emit beforeEvent let /** @type {?} */ bData = { item: item, index: index }; let /** @type {?} */ beforeEV = EventUtils.newCustomEvent(BEFORE_DISABLE_EVENT, this, bData, null); this.beforeDisableEvent.emit(beforeEV); } /** * @param {?} item * @param {?} index * @param {?=} $event * @return {?} */ emitDisableEvent(item, index, $event) { // emit event let /** @type {?} */ data = { item: item, index: index }; let /** @type {?} */ ev = EventUtils.newCustomEvent(DISABLE_EVENT, this, data, $event); this.disableEvent.emit(ev); } /** * @param {?} index * @param {?=} $event * @param {?=} fireEvent * @return {?} */ activate(index, $event, fireEvent) { if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } let /** @type {?} */ item = this.getAccordionItem(index); if (!item.active) { EventUtils.handleBrowserEvent(this, 'beforeActivateEvent', $event, fireEvent, ($event) => { // doEvent this._activateItem(index); }, ($event) => { // emitBeforeEvent this.emitBeforeActivateEvent(item, index, $event); }, ($event) => { // emitAfterEvent this.emitActivateEvent(item, index, $event); }, ($event) => { // doPrevented }); return true; } else { return false; } } /** * @param {?} index * @param {?=} $event * @param {?=} fireEvent * @return {?} */ deactivate(index, $event, fireEvent) { if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } let /** @type {?} */ item = this.getAccordionItem(index); if (item.active) { EventUtils.handleBrowserEvent(this, 'beforeDeactivateEvent', $event, fireEvent, ($event) => { // doEvent this._deactivateItem(index); }, ($event) => { // emitBeforeEvent this.emitBeforeDeactivateEvent(item, index, $event); }, ($event) => { // emitAfterEvent this.emitDeactivateEvent(item, index, $event); }, ($event) => { // doPrevented }); return true; } else { return false; } } /** * @param {?} index * @param {?=} $event * @param {?=} fireEvent * @return {?} */ enable(index, $event, fireEvent) { if (index === null || index === undefined || index <= -1) { return null; } if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } let /** @type {?} */ item = this.getAccordionItem(index); if (!item.enable) { EventUtils.handleBrowserEvent(this, 'beforeEnableEvent', $event, fireEvent, ($event) => { // doEvent this._enableItem(index); }, ($event) => { // emitBeforeEvent this.emitBeforeEnableEvent(item, index, $event); }, ($event) => { // emitAfterEvent this.emitEnableEvent(item, index, $event); }, ($event) => { // doPrevented }); return true; } else { return false; } } /** * @param {?} index * @param {?=} $event * @param {?=} fireEvent * @return {?} */ disable(index, $event, fireEvent) { if (index === null || index === undefined || index <= -1) { return null; } if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } let /** @type {?} */ item = this.getAccordionItem(index); if (item.enable) { EventUtils.handleBrowserEvent(this, 'beforeDisableEvent', $event, fireEvent, ($event) => { // doEvent this._disableItem(index); }, ($event) => { // emitBeforeEvent this.emitBeforeDisableEvent(item, index, $event); }, ($event) => { // emitAfterEvent this.emitDisableEvent(item, index, $event); }, ($event) => { // doPrevented }); return true; } else { return false; } } /** * @param {?} items * @return {?} */ setAccordionItems(items) { this.items = items; this.itemStatus = []; if (this.items !== null && typeof this.items !== 'undefined') { for (let /** @type {?} */ item of this.items) { // change status if (!item.enable) { item.active = false; } let /** @type {?} */ wrapItem = this.generateItemStatus(item); this.itemStatus.push(wrapItem); } } } /** * @return {?} */ getAccordionItems() { return this.items; } /** * @param {?} index * @return {?} */ getAccordionItem(index) { if (this.items !== null && typeof this.items !== 'undefined') { if (index < this.items.length) { let /** @type {?} */ item = this.items[index]; return item; } } return null; } /** * @param {?} index * @return {?} */ isActive(index) { if (index !== null && typeof index !== 'undefined') { if (index < this.items.length) { return this.items[index].active; } } return false; } /** * @param {?} index * @return {?} */ isEnable(index) { if (index !== null && typeof index !== 'undefined') { if (index < this.items.length) { return this.items[index].enable; } } return false; } /** * @param {?} item * @return {?} */ getAccordionIndex(item) { if (item !== null && item !== undefined) { let /** @type {?} */ items = this.getAccordionItems(); return items.indexOf(item); } return -1; } /** * @param {?=} exceptIndex * @return {?} */ collapseItemAllExceptIndex(exceptIndex) { let /** @type {?} */ items = this.getAccordionItems(); if (items !== null && items !== undefined) { for (let /** @type {?} */ item of this.items) { let /** @type {?} */ index = this.getAccordionIndex(item); this.collapseItem(index, exceptIndex); } } } /** * @return {?} */ isFixedHeight() { if (this.fixedHeight === null || typeof this.fixedHeight === 'undefined' || this.fixedHeight === '') { return false; } return true; } /** * @return {?} */ getFixedHeight() { return this.fixedHeight; } /** * @param {?} fixedHeight * @return {?} */ setFixedHeight(fixedHeight) { this.fixedHeight = fixedHeight; } /** * @param {?} activateEvent * @return {?} */ setActivateEvent(activateEvent) { this.activateEvent = activateEvent; } /** * @return {?} */ getActivateEvent() { return this.activateEvent; } /** * @param {?} deactivateEvent * @return {?} */ setDeactivateEvent(deactivateEvent) { this.deactivateEvent = deactivateEvent; } /** * @return {?} */ getDeactivateEvent() { return this.deactivateEvent; } /** * @param {?} enableEvent * @return {?} */ setEnableEvent(enableEvent) { this.enableEvent = enableEvent; } /** * @return {?} */ getEnableEvent() { return this.enableEvent; } /** * @param {?} disableEvent * @return {?} */ setDisableEvent(disableEvent) { this.disableEvent = disableEvent; } /** * @return {?} */ getDisableEvent() { return this.disableEvent; } /** * @param {?} beforeActivateEvent * @return {?} */ setBeforeActivateEvent(beforeActivateEvent) { this.beforeActivateEvent = beforeActivateEvent; } /** * @return {?} */ getBeforeActivateEvent() { return this.beforeActivateEvent; } /** * @param {?} beforeDeactivateEvent * @return {?} */ setBeforeDeactivateEvent(beforeDeactivateEvent) { this.beforeDeactivateEvent = beforeDeactivateEvent; } /** * @return {?} */ getBeforeDeactivateEvent() { return this.beforeDeactivateEvent; } /** * @param {?} beforeEnableEvent * @return {?} */ setBeforeEnableEvent(beforeEnableEvent) { this.beforeEnableEvent = beforeEnableEvent; } /** * @return {?} */ getBeforeEnableEvent() { return this.beforeEnableEvent; } /** * @param {?} beforeDisableEvent * @return {?} */ setBeforeDisableEvent(beforeDisableEvent) { this.beforeDisableEvent = beforeDisableEvent; } /** * @return {?} */ getBeforeDisableEvent() { return this.beforeDisableEvent; } /** * @param {?} isAutoInit * @return {?} */ setAutoInit(isAutoInit) { this.autoInit = isAutoInit; } /** * @return {?} */ isAutoInit() { return this.autoInit; } } tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", String) ], AbstractAccordion.prototype, "fixedHeight", void 0); tslib_1.__decorate([ Option('beforeActivate'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractAccordion.prototype, "beforeActivateEvent", void 0); tslib_1.__decorate([ Option('activate'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractAccordion.prototype, "activateEvent", void 0); tslib_1.__decorate([ Option('beforeDeactivate'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractAccordion.prototype, "beforeDeactivateEvent", void 0); tslib_1.__decorate([ Option('deactivate'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractAccordion.prototype, "deactivateEvent", void 0); tslib_1.__decorate([ Option('beforeEnable'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractAccordion.prototype, "beforeEnableEvent", void 0); tslib_1.__decorate([ Option('enable'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractAccordion.prototype, "enableEvent", void 0); tslib_1.__decorate([ Option('beforeDisable'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractAccordion.prototype, "beforeDisableEvent", void 0); tslib_1.__decorate([ Option('disable'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractAccordion.prototype, "disableEvent", void 0); function AbstractAccordion_tsickle_Closure_declarations() { /** @type {?} */ AbstractAccordion.prototype.itemStatus; /** @type {?} */ AbstractAccordion.prototype.items; /** @type {?} */ AbstractAccordion.prototype.fixedHeight; /** @type {?} */ AbstractAccordion.prototype.beforeActivateEvent; /** @type {?} */ AbstractAccordion.prototype.activateEvent; /** @type {?} */ AbstractAccordion.prototype.beforeDeactivateEvent; /** @type {?} */ AbstractAccordion.prototype.deactivateEvent; /** @type {?} */ AbstractAccordion.prototype.beforeEnableEvent; /** @type {?} */ AbstractAccordion.prototype.enableEvent; /** @type {?} */ AbstractAccordion.prototype.beforeDisableEvent; /** @type {?} */ AbstractAccordion.prototype.disableEvent; /** @type {?} */ AbstractAccordion.prototype.autoInit; /** @type {?} */ AbstractAccordion.prototype.multipleExpand; /** * @abstract * @return {?} */ AbstractAccordion.prototype.init = function () { }; /** * @abstract * @param {?} index * @param {?} item * @return {?} */ AbstractAccordion.prototype.onAccordionActived = function (index, item) { }; /** * @abstract * @param {?} index * @param {?} item * @return {?} */ AbstractAccordion.prototype.onAccordionDeactived = function (index, item) { }; /** * @abstract * @param {?} index * @param {?} item * @return {?} */ AbstractAccordion.prototype.onAccordionEnabled = function (index, item) { }; /** * @abstract * @param {?} index * @param {?} item * @return {?} */ AbstractAccordion.prototype.onAccordionDisabled = function (index, item) { }; /** * @abstract * @return {?} */ AbstractAccordion.prototype.reload = function () { }; /** * @abstract * @return {?} */ AbstractAccordion.prototype.reRender = function () { }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3RBY2NvcmRpb24uanMiLCJzb3VyY2VSb290Ijoibmc6Ly9jb20ucGhsb3h1aS8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnQvZGF0YXZpZXcvQWJzdHJhY3RBY2NvcmRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQVUsWUFBWSxFQUFjLE1BQU0sZUFBZSxDQUFDO0FBRWpFLE9BQU8sRUFDTCxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFDN0QscUJBQXFCLEVBQUUsdUJBQXVCLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQzFGLE1BQU0sNkJBQTZCLENBQUM7QUFDckMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDdEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQzFELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7Ozs7O0FBRTFELE1BQU0sd0JBQWdFLFNBQVEsZ0JBQWdCOzs7O0lBeUI1RixZQUFZLFVBQXNCO1FBQ2hDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNsQixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUN0QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUMzQixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDeEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzFDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUN0QyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDOUMsSUFBSSxDQUFD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c0NBQ00sWUFBWTs7O0lBQ2xDLE1BQU0sQ0FBQyxlQUFlLENBQUM7c0NBQ00sWUFBWTs7O0lBQ3pDLE1BQU0sQ0FBQyxTQUFTLENBQUM7c0NBQ00sWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9uSW5pdCwgRXZlbnRFbWl0dGVyLCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY2NvcmRpb25JdGVtTW9kZWwgfSBmcm9tICcuLi9tb2RlbC9BY2NvcmRpb25JdGVtTW9kZWwnO1xuaW1wb3J0IHtcclxuICBBQ1RJVkFURV9FVkVOVCwgREVBQ1RJVkFURV9FVkVOVCwgRU5BQkxFX0VWRU5ULCBESVNBQkxFX0VWRU5ULFxuICBCRUZPUkVfQUNUSVZBVEVfRVZFTlQsIEJFRk9SRV9ERUFDVElWQVRFX0VWRU5ULCBCRUZPUkVfRU5BQkxFX0VWRU5ULCBCRUZPUkVfRElTQUJMRV9FVkVOVFxyXG59IGZyb20gJy4uLy4uL3NoYXJlL0N1c3RvbUV2ZW50VHlwZSc7XG5pbXBvcnQgeyBBYnN0cmFjdERhdGFWaWV3IH0gZnJvbSAnLi9BYnN0cmFjdERhdGFWaWV3JztcbmltcG9ydCB7IE9wdGlvbiB9IGZyb20gJy4uLy4uL2RlY29yYXRvci9PcHRpb24uZGVjb3JhdG9yJztcbmltcG9ydCB7IEV2ZW50VXRpbHMgfSBmcm9tICcuLi8uLi9zaGFyZS91dGlscy9FdmVudFV0aWxzJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QWNjb3JkaW9uPFQgZXh0ZW5kcyBBY2NvcmRpb25JdGVtTW9kZWw+IGV4dGVuZHMgQWJzdHJhY3REYXRhVmlldyBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgcHJpdmF0ZSBpdGVtU3RhdHVzOiBhbnlbXTtcbiAgcHJvdGVjdGVkIGl0ZW1zOiBUW107XG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgZml4ZWRIZWlnaHQ6IHN0cmluZzsgLy8gaGVpZ2h0IGZvciBkZXRlcm1pbmUgaWYgYWNjb3JkaWFuIGluIGZpeEhlaWdodCBvciBub3QuXG4gIEBPcHRpb24oJ2JlZm9yZUFjdGl2YXRlJylcbiAgcHJvdGVjdGVkIGJlZm9yZUFjdGl2YXRlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3B0aW9uKCdhY3RpdmF0ZScpXG4gIHByb3RlY3RlZCBhY3RpdmF0ZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE9wdGlvbignYmVmb3JlRGVhY3RpdmF0ZScpXG4gIHByb3RlY3RlZCBiZWZvcmVEZWFjdGl2YXRlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3B0aW9uKCdkZWFjdGl2YXRlJylcbiAgcHJvdGVjdGVkIGRlYWN0aXZhdGVFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPcHRpb24oJ2JlZm9yZUVuYWJsZScpXG4gIHByb3RlY3RlZCBiZWZvcmVFbmFibGVFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPcHRpb24oJ2VuYWJsZScpXG4gIHByb3RlY3RlZCBlbmFibGVFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPcHRpb24oJ2JlZm9yZURpc2FibGUnKVxuICBwcm90ZWN0ZWQgYmVmb3JlRGlzYWJsZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE9wdGlvbignZGlzYWJsZScpXG4gIHByb3RlY3RlZCBkaXNhYmxlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBwcm90ZWN0ZWQgYXV0b0luaXQ6IGJvb2xlYW47XG4gIHByb3RlY3RlZCBtdWx0aXBsZUV4cGFuZDogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7XG4gICAgc3VwZXIoZWxlbWVudFJlZik7XG4gICAgdGhpcy5pdGVtU3RhdHVzID0gW107XG4gICAgdGhpcy5hdXRvSW5pdCA9IGZhbHNlO1xuICAgIHRoaXMubXVsdGlwbGVFeHBhbmQgPSB0cnVlO1xuICAgIHRoaXMuYWN0aXZhdGVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLmRlYWN0aXZhdGVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLmVuYWJsZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMuZGlzYWJsZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMuYmVmb3JlQWN0aXZhdGVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLmJlZm9yZURlYWN0aXZhdGVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLmJlZm9yZUVuYWJsZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMuYmVmb3JlRGlzYWJsZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc2V0QWNjb3JkaW9uSXRlbXModGhpcy5pdGVtcyk7XG4gICAgaWYgKHRoaXMuYXV0b0luaXQgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuYXV0b0luaXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAodGhpcy5hdXRvSW5pdCkge1xuICAgICAgICB0aGlzLmluaXQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlSXRlbVN0YXR1cyhpdGVtOiBUKTogYW55IHtcbiAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgYWN0aXZlOiBmYWxzZSxcbiAgICAgIGVuYWJsZTogZmFsc2VcbiAgICB9O1xuXG4gICAgaWYgKGl0ZW0gIT09IG51bGwgJiYgdHlwZW9mIGl0ZW0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXN1bHQuYWN0aXZlID0gaXRlbS5hY3RpdmU7XG4gICAgICByZXN1bHQuZW5hYmxlID0gaXRlbS5lbmFibGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgY29sbGFwc2VJdGVtKGluZGV4OiBudW1iZXIsIGV4Y2VwdEluZGV4PzogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKGluZGV4ICE9PSBudWxsICYmIHR5cGVvZiBpbmRleCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmIChleGNlcHRJbmRleCAhPT0gbnVsbCAmJiBleGNlcHRJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChpbmRleCA9PT0gZXhjZXB0SW5kZXgpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IGl0ZW0gPSB0aGlzLmdldEFjY29yZGlvbkl0ZW0oaW5kZXgpO1xuXG4gICAgICBpZiAoaXRlbSAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoaXRlbS5hY3RpdmUpIHtcbiAgICAgICAgICBpdGVtLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgIC8vIHVwZGF0ZSBzdGF0dXNcbiAgICAgICAgICBsZXQgc3RhdHVzID0gdGhpcy5pdGVtU3RhdHVzW2luZGV4XTtcbiAgICAgICAgICBzdGF0dXMuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9uQWNjb3JkaW9uRGVhY3RpdmVkKGluZGV4LCBpdGVtKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9hY3RpdmF0ZUl0ZW0oaW5kZXg6IG51bWJlcik6IGFueSB7XG4gICAgaWYgKGluZGV4ID09PSBudWxsIHx8IGluZGV4ID09PSB1bmRlZmluZWQgfHwgaW5kZXggPD0gLTEpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxldCBpdGVtID0gdGhpcy5nZXRBY2NvcmRpb25JdGVtKGluZGV4KTtcbiAgICBpZiAoaXRlbSAhPT0gbnVsbCkge1xuICAgICAgaWYgKCFpdGVtLmFjdGl2ZSkge1xuICAgICAgICBpdGVtLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgIC8vIHVwZGF0ZSBzdGF0dXNcbiAgICAgICAgbGV0IHN0YXR1cyA9IHRoaXMuaXRlbVN0YXR1c1tpbmRleF07XG4gICAgICAgIHN0YXR1cy5hY3RpdmUgPSB0cnVlO1xuXG4gICAgICAgIGlmICghdGhpcy5tdWx0aXBsZUV4cGFuZCkge1xuICAgICAgICAgIHRoaXMuY29sbGFwc2VJdGVtQWxsRXhjZXB0SW5kZXgoaW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vbkFjY29yZGlvbkFjdGl2ZWQoaW5kZXgsIGl0ZW0pO1xuXG4gICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGVhY3RpdmF0ZUl0ZW0oaW5kZXg6IG51bWJlcik6IGFueSB7XG4gICAgaWYgKGluZGV4ID09PSBudWxsIHx8IGluZGV4ID09PSB1bmRlZmluZWQgfHwgaW5kZXggPD0gLTEpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxldCBpdGVtID0gdGhpcy5nZXRBY2NvcmRpb25JdGVtKGluZGV4KTtcblxuICAgIGlmIChpdGVtICE9PSBudWxsKSB7XG4gICAgICBpZiAoaXRlbS5hY3RpdmUpIHtcbiAgICAgICAgaXRlbS5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgLy8gdXBkYXRlIHN0YXR1c1xuICAgICAgICBsZXQgc3RhdHVzID0gdGhpcy5pdGVtU3RhdHVzW2luZGV4XTtcbiAgICAgICAgc3RhdHVzLmFjdGl2ZSA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMub25BY2NvcmRpb25EZWFjdGl2ZWQoaW5kZXgsIGl0ZW0pO1xuXG4gICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBfZW5hYmxlSXRlbShpbmRleDogbnVtYmVyKTogYW55IHtcbiAgICBpZiAoaW5kZXggPT09IG51bGwgfHwgaW5kZXggPT09IHVuZGVmaW5lZCB8fCBpbmRleCA8PSAtMSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgbGV0IGl0ZW0gPSB0aGlzLmdldEFjY29yZGlvbkl0ZW0oaW5kZXgpO1xuICAgIGlmIChpdGVtICE9PSBudWxsICYmIGl0ZW0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCFpdGVtLmVuYWJsZSkge1xuICAgICAgICBpdGVtLmVuYWJsZSA9IHRydWU7XG4gICAgICAgIC8vIHVwZGF0ZSBzdGF0dXNcbiAgICAgICAgbGV0IHN0YXR1cyA9IHRoaXMuaXRlbVN0YXR1c1tpbmRleF07XG4gICAgICAgIHN0YXR1cy5lbmFibGUgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMub25BY2NvcmRpb25FbmFibGVkKGluZGV4LCBpdGVtKTtcblxuICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgX2Rpc2FibGVJdGVtKGluZGV4OiBudW1iZXIpOiBhbnkge1xuICAgIGlmIChpbmRleCA9PT0gbnVsbCB8fCBpbmRleCA9PT0gdW5kZWZpbmVkIHx8IGluZGV4IDw9IC0xKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBsZXQgaXRlbSA9IHRoaXMuZ2V0QWNjb3JkaW9uSXRlbShpbmRleCk7XG4gICAgaWYgKGl0ZW0gIT09IG51bGwgJiYgaXRlbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoaXRlbS5lbmFibGUpIHtcbiAgICAgICAgdGhpcy5kZWFjdGl2YXRlKGluZGV4KTtcblxuICAgICAgICBpdGVtLmVuYWJsZSA9IGZhbHNlO1xuICAgICAgICAvLyB1cGRhdGUgc3RhdHVzXG4gICAgICAgIGxldCBzdGF0dXMgPSB0aGlzLml0ZW1TdGF0dXNbaW5kZXhdO1xuICAgICAgICBzdGF0dXMuZW5hYmxlID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5vbkFjY29yZGlvbkRpc2FibGVkKGluZGV4LCBpdGVtKTtcblxuICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBlbWl0QmVmb3JlQWN0aXZhdGVFdmVudChpdGVtOiBhbnksIGluZGV4OiBudW1iZXIsICRldmVudD86IGFueSk6IHZvaWQge1xuICAgIC8vIGVtaXQgYmVmb3JlRXZlbnRcbiAgICBsZXQgYkRhdGE6IGFueSA9IHtcbiAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICBpbmRleDogaW5kZXhcbiAgICB9O1xuICAgIGxldCBiZWZvcmVFViA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoQkVGT1JFX0FDVElWQVRFX0VWRU5ULCB0aGlzLCBiRGF0YSwgJGV2ZW50KTtcbiAgICB0aGlzLmJlZm9yZUFjdGl2YXRlRXZlbnQuZW1pdChiZWZvcmVFVik7XG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdEFjdGl2YXRlRXZlbnQoaXRlbTogYW55LCBpbmRleDogbnVtYmVyLCAkZXZlbnQ/OiBhbnkpOiB2b2lkIHtcbiAgICAvLyBlbWl0IGV2ZW50XG4gICAgbGV0IGRhdGE6IGFueSA9IHtcbiAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICBpbmRleDogaW5kZXhcbiAgICB9O1xuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoQUNUSVZBVEVfRVZFTlQsIHRoaXMsIGRhdGEsICRldmVudCk7XG5cbiAgICB0aGlzLmFjdGl2YXRlRXZlbnQuZW1pdChldik7XG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdEJlZm9yZURlYWN0aXZhdGVFdmVudChpdGVtOiBhbnksIGluZGV4OiBudW1iZXIsICRldmVudD86IGFueSk6IHZvaWQge1xuICAgIC8vIGVtaXQgYmVmb3JlRXZlbnRcbiAgICBsZXQgYkRhdGE6IGFueSA9IHtcbiAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICBpbmRleDogaW5kZXhcbiAgICB9O1xuICAgIGxldCBiZWZvcmVFViA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoQkVGT1JFX0RFQUNUSVZBVEVfRVZFTlQsIHRoaXMsIGJEYXRhLCAkZXZlbnQpO1xuICAgIHRoaXMuYmVmb3JlRGVhY3RpdmF0ZUV2ZW50LmVtaXQoYmVmb3JlRVYpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGVtaXREZWFjdGl2YXRlRXZlbnQoaXRlbTogYW55LCBpbmRleDogbnVtYmVyLCAkZXZlbnQ/OiBhbnkpOiB2b2lkIHtcbiAgICAvLyBlbWl0IGV2ZW50XG4gICAgbGV0IGRhdGE6IGFueSA9IHtcbiAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICBpbmRleDogaW5kZXhcbiAgICB9O1xuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoREVBQ1RJVkFURV9FVkVOVCwgdGhpcywgZGF0YSwgJGV2ZW50KTtcblxuICAgIHRoaXMuZGVhY3RpdmF0ZUV2ZW50LmVtaXQoZXYpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGVtaXRCZWZvcmVFbmFibGVFdmVudChpdGVtOiBhbnksIGluZGV4OiBudW1iZXIsICRldmVudD86IGFueSk6IHZvaWQge1xuICAgIC8vIGVtaXQgYmVmb3JlRXZlbnRcbiAgICBsZXQgYkRhdGE6IGFueSA9IHtcbiAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICBpbmRleDogaW5kZXhcbiAgICB9O1xuICAgIGxldCBiZWZvcmVFViA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoQkVGT1JFX0VOQUJMRV9FVkVOVCwgdGhpcywgYkRhdGEsIG51bGwpO1xuICAgIHRoaXMuYmVmb3JlRW5hYmxlRXZlbnQuZW1pdChiZWZvcmVFVik7XG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdEVuYWJsZUV2ZW50KGl0ZW06IGFueSwgaW5kZXg6IG51bWJlciwgJGV2ZW50PzogYW55KTogdm9pZCB7XG4gICAgLy8gZW1pdCBldmVudFxuICAgIGxldCBkYXRhOiBhbnkgPSB7XG4gICAgICBpdGVtOiBpdGVtLFxuICAgICAgaW5kZXg6IGluZGV4XG4gICAgfTtcbiAgICBsZXQgZXYgPSBFdmVudFV0aWxzLm5ld0N1c3RvbUV2ZW50KEVOQUJMRV9FVkVOVCwgdGhpcywgZGF0YSwgJGV2ZW50KTtcblxuICAgIHRoaXMuZW5hYmxlRXZlbnQuZW1pdChldik7XG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdEJlZm9yZURpc2FibGVFdmVudChpdGVtOiBhbnksIGluZGV4OiBudW1iZXIsICRldmVudD86IGFueSk6IHZvaWQge1xuICAgIC8vIGVtaXQgYmVmb3JlRXZlbnRcbiAgICBsZXQgYkRhdGE6IGFueSA9IHtcbiAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICBpbmRleDogaW5kZXhcbiAgICB9O1xuICAgIGxldCBiZWZvcmVFViA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoQkVGT1JFX0RJU0FCTEVfRVZFTlQsIHRoaXMsIGJEYXRhLCBudWxsKTtcbiAgICB0aGlzLmJlZm9yZURpc2FibGVFdmVudC5lbWl0KGJlZm9yZUVWKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBlbWl0RGlzYWJsZUV2ZW50KGl0ZW06IGFueSwgaW5kZXg6IG51bWJlciwgJGV2ZW50PzogYW55KTogdm9pZCB7XG4gICAgLy8gZW1pdCBldmVudFxuICAgIGxldCBkYXRhOiBhbnkgPSB7XG4gICAgICBpdGVtOiBpdGVtLFxuICAgICAgaW5kZXg6IGluZGV4XG4gICAgfTtcbiAgICBsZXQgZXYgPSBFdmVudFV0aWxzLm5ld0N1c3RvbUV2ZW50KERJU0FCTEVfRVZFTlQsIHRoaXMsIGRhdGEsICRldmVudCk7XG5cbiAgICB0aGlzLmRpc2FibGVFdmVudC5lbWl0KGV2KTtcbi