@kephas/angular
Version:
Provides integration capabilities with Angular.
186 lines • 18.2 kB
JavaScript
import { ElementRef, ViewContainerRef, ChangeDetectorRef, Input, forwardRef, QueryList, ViewChildren, Component } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { Logger } from '@kephas/core';
import { Notification } from '@kephas/ui';
/**
* Provides base functionality for a widget.
*
* @export
* @class WidgetBase
*/
export class WidgetBase {
/**
* Creates an instance of WidgetBase.
* @param {ElementRef} elementRef The element reference.
* @param {ViewContainerRef} viewContainerRef The view container reference.
* @memberof WidgetBase
*/
constructor(elementRef, viewContainerRef) {
this.elementRef = elementRef;
this.viewContainerRef = viewContainerRef;
this._isVisible = true;
this._readonly = false;
const injector = viewContainerRef.injector;
this.logger = injector.get(Logger);
this.notification = injector.get(Notification);
this.changeDetector = injector.get(ChangeDetectorRef);
}
/**
* Gets or sets the child editors query.
*
* @readonly
* @type {QueryList<EditorBase<any>>}
* @memberof EditorBase
*/
get childWidgets() {
return this._childWidgets;
}
set childWidgets(value) {
if (this._childWidgets === value) {
return;
}
const oldValue = this._childWidgets;
this._childWidgets = value;
this.onChildWidgetsChanged(oldValue, value);
}
/**
* Gets or sets a value indicating whether the widget is visible.
*
* @readonly
* @type {boolean}
* @memberof WidgetBase
*/
get isVisible() {
return this._isVisible;
}
set isVisible(value) {
if (this._isVisible === value) {
return;
}
this._isVisible = value;
}
/**
* Gets or sets a value indicating whether the editor allows edits or not.
*
* @readonly
* @type {boolean}
* @memberof EditorBase
*/
get readonly() {
return this._readonly;
}
set readonly(value) {
if (this._readonly === value) {
return;
}
const oldValue = this._readonly;
this._readonly = value;
this.onReadOnlyChanged(oldValue, value);
}
/**
* A callback method that is invoked immediately after the
* default change detector has checked the directive's
* data-bound properties for the first time,
* and before any of the view or content children have been checked.
* It is invoked only once when the directive is instantiated.
*
* @memberof WidgetBase
*/
ngOnInit() {
}
/**
* A callback method that is invoked immediately after
* Angular has completed initialization of a component's view.
* It is invoked only once when the view is instantiated.
*
* @memberof WidgetBase
*/
ngAfterViewInit() {
}
/**
* A callback method that is invoked immediately after the
* default change detector has checked data-bound properties
* if at least one has changed, and before the view and content
* children are checked.
*
* @param changes The changed properties.
* @memberof WidgetBase
*/
ngOnChanges(changes) {
}
/**
* A callback method that performs custom clean-up, invoked immediately
* after a directive, pipe, or service instance is destroyed.
*/
ngOnDestroy() {
}
/**
* When overridden in a derived class, this method is called when the read only state changes.
*
* @protected
* @param {boolean} oldValue The old value.
* @param {boolean} newValue The new value.
*
* @memberof WidgetBase
*/
onReadOnlyChanged(oldValue, newValue) {
}
/**
* When overridden in a derived class, this method is called when the child widgets query changed.
*
* @protected
* @param {QueryList<EditorBase<any>>} oldValue The old query.
* @param {QueryList<EditorBase<any>>} newValue The new query.
*
* @memberof EditorBase
*/
onChildWidgetsChanged(oldValue, newValue) {
}
}
WidgetBase.decorators = [
{ type: Component, args: [{
template: ''
},] }
];
WidgetBase.ctorParameters = () => [
{ type: ElementRef },
{ type: ViewContainerRef }
];
WidgetBase.propDecorators = {
childWidgets: [{ type: ViewChildren, args: [WidgetBase,] }],
isVisible: [{ type: Input }],
readonly: [{ type: Input }]
};
/**
* This function provides the component as a WidgetBase,
* to be able to import it over this base class instead of over its own class.
*
* For example, use it as @ViewChild(WidgetBase) or @ViewChildren(WidgetBase).
*
* @export
* @param {Type<any>} componentType The component type.
* @returns {Provider} The provider.
*/
export function provideWidget(componentType) {
return {
provide: WidgetBase,
useExisting: forwardRef(() => componentType)
};
}
/**
* This function provides the component as a NG_VALUE_ACCESSOR.
* Thus, it is possible to bind it like this:
* <my-component [(ngModel)]="boundProperty"></my-component>
*
* @export
* @param {Type<any>} componentType The component type.
* @returns {Provider} The provider.
*/
export function provideValueAccessor(componentType) {
return {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => componentType),
multi: true
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0QmFzZS5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL3dpZGdldEJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFDL0MsS0FBSyxFQUVXLFVBQVUsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFhLFNBQVMsRUFDNUUsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN0QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRTFDOzs7OztHQUtHO0FBSUgsTUFBTSxPQUFnQixVQUFVO0lBZ0M1Qjs7Ozs7T0FLRztJQUNILFlBQ29CLFVBQXNCLEVBQ3RCLGdCQUFrQztRQURsQyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFaOUMsZUFBVSxHQUFHLElBQUksQ0FBQztRQUNsQixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBYXRCLE1BQU0sUUFBUSxHQUFHLGdCQUFnQixDQUFDLFFBQVEsQ0FBQztRQUMzQyxJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxjQUFjLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxJQUNJLFlBQVk7UUFDWixPQUFPLElBQUksQ0FBQyxhQUFjLENBQUM7SUFDL0IsQ0FBQztJQUNELElBQUksWUFBWSxDQUFDLEtBQTRCO1FBQ3pDLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxLQUFLLEVBQUU7WUFDOUIsT0FBTztTQUNWO1FBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUNwQyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztRQUMzQixJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxJQUNJLFNBQVM7UUFDVCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDM0IsQ0FBQztJQUNELElBQUksU0FBUyxDQUFDLEtBQWM7UUFDeEIsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLEtBQUssRUFBRTtZQUMzQixPQUFPO1NBQ1Y7UUFFRCxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUM1QixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsSUFDSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzFCLENBQUM7SUFDRCxJQUFJLFFBQVEsQ0FBQyxLQUFjO1FBQ3ZCLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxLQUFLLEVBQUU7WUFDMUIsT0FBTztTQUNWO1FBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNoQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUN2QixJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILFFBQVE7SUFDUixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsZUFBZTtJQUNmLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILFdBQVcsQ0FBQyxPQUFzQjtJQUNsQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsV0FBVztJQUNYLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNPLGlCQUFpQixDQUFDLFFBQWlCLEVBQUUsUUFBaUI7SUFDaEUsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ08scUJBQXFCLENBQUMsUUFBZ0MsRUFBRSxRQUFnQztJQUNsRyxDQUFDOzs7WUEvS0osU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxFQUFFO2FBQ2I7OztZQWpCRyxVQUFVO1lBQUUsZ0JBQWdCOzs7MkJBeUUzQixZQUFZLFNBQUMsVUFBVTt3QkFxQnZCLEtBQUs7dUJBbUJMLEtBQUs7O0FBZ0ZWOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQUMsYUFBd0I7SUFDbEQsT0FBTztRQUNILE9BQU8sRUFBRSxVQUFVO1FBQ25CLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDO0tBQy9DLENBQUM7QUFDTixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsYUFBd0I7SUFDekQsT0FBTztRQUNILE9BQU8sRUFBRSxpQkFBaUI7UUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxhQUFhLENBQUM7UUFDNUMsS0FBSyxFQUFFLElBQUk7S0FDZCxDQUFDO0FBQ04sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgICBFbGVtZW50UmVmLCBWaWV3Q29udGFpbmVyUmVmLCBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIElucHV0LCBTaW1wbGVDaGFuZ2VzLFxyXG4gICAgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQsXHJcbiAgICBUeXBlLCBQcm92aWRlciwgZm9yd2FyZFJlZiwgUXVlcnlMaXN0LCBWaWV3Q2hpbGRyZW4sIE9uRGVzdHJveSwgQ29tcG9uZW50XHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICdAa2VwaGFzL2NvcmUnO1xyXG5pbXBvcnQgeyBOb3RpZmljYXRpb24gfSBmcm9tICdAa2VwaGFzL3VpJztcclxuXHJcbi8qKlxyXG4gKiBQcm92aWRlcyBiYXNlIGZ1bmN0aW9uYWxpdHkgZm9yIGEgd2lkZ2V0LlxyXG4gKlxyXG4gKiBAZXhwb3J0XHJcbiAqIEBjbGFzcyBXaWRnZXRCYXNlXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICB0ZW1wbGF0ZTogJydcclxufSlcclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFdpZGdldEJhc2UgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgbG9nZ2VyLlxyXG4gICAgICpcclxuICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAqIEB0eXBlIHtMb2dnZXJ9XHJcbiAgICAgKiBAbWVtYmVyb2YgVmFsdWVFZGl0b3JCYXNlXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCByZWFkb25seSBsb2dnZXI6IExvZ2dlcjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIG5vdGlmaWNhdGlvbiBzZXJ2aWNlLlxyXG4gICAgICpcclxuICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAqIEB0eXBlIHtOb3RpZmljYXRpb259XHJcbiAgICAgKiBAbWVtYmVyb2YgVmFsdWVFZGl0b3JCYXNlXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCByZWFkb25seSBub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIGNoYW5nZSBkZXRlY3RvciBzZXJ2aWNlLlxyXG4gICAgICpcclxuICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAqIEB0eXBlIHtDaGFuZ2VEZXRlY3RvclJlZn1cclxuICAgICAqIEBtZW1iZXJvZiBWYWx1ZUVkaXRvckJhc2VcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZjtcclxuXHJcbiAgICBwcml2YXRlIF9pc1Zpc2libGUgPSB0cnVlO1xyXG4gICAgcHJpdmF0ZSBfcmVhZG9ubHkgPSBmYWxzZTtcclxuICAgIHByaXZhdGUgX2NoaWxkV2lkZ2V0cz86IFF1ZXJ5TGlzdDxXaWRnZXRCYXNlPjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgV2lkZ2V0QmFzZS5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudFJlZn0gZWxlbWVudFJlZiBUaGUgZWxlbWVudCByZWZlcmVuY2UuXHJcbiAgICAgKiBAcGFyYW0ge1ZpZXdDb250YWluZXJSZWZ9IHZpZXdDb250YWluZXJSZWYgVGhlIHZpZXcgY29udGFpbmVyIHJlZmVyZW5jZS5cclxuICAgICAqIEBtZW1iZXJvZiBXaWRnZXRCYXNlXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxyXG4gICAgICAgIHB1YmxpYyByZWFkb25seSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxyXG4gICAgKSB7XHJcbiAgICAgICAgY29uc3QgaW5qZWN0b3IgPSB2aWV3Q29udGFpbmVyUmVmLmluamVjdG9yO1xyXG4gICAgICAgIHRoaXMubG9nZ2VyID0gaW5qZWN0b3IuZ2V0KExvZ2dlcik7XHJcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb24gPSBpbmplY3Rvci5nZXQoTm90aWZpY2F0aW9uKTtcclxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yID0gaW5qZWN0b3IuZ2V0KENoYW5nZURldGVjdG9yUmVmKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgb3Igc2V0cyB0aGUgY2hpbGQgZWRpdG9ycyBxdWVyeS5cclxuICAgICAqXHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEB0eXBlIHtRdWVyeUxpc3Q8RWRpdG9yQmFzZTxhbnk+Pn1cclxuICAgICAqIEBtZW1iZXJvZiBFZGl0b3JCYXNlXHJcbiAgICAgKi9cclxuICAgIEBWaWV3Q2hpbGRyZW4oV2lkZ2V0QmFzZSlcclxuICAgIGdldCBjaGlsZFdpZGdldHMoKTogUXVlcnlMaXN0PFdpZGdldEJhc2U+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY2hpbGRXaWRnZXRzITtcclxuICAgIH1cclxuICAgIHNldCBjaGlsZFdpZGdldHModmFsdWU6IFF1ZXJ5TGlzdDxXaWRnZXRCYXNlPikge1xyXG4gICAgICAgIGlmICh0aGlzLl9jaGlsZFdpZGdldHMgPT09IHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5fY2hpbGRXaWRnZXRzO1xyXG4gICAgICAgIHRoaXMuX2NoaWxkV2lkZ2V0cyA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMub25DaGlsZFdpZGdldHNDaGFuZ2VkKG9sZFZhbHVlLCB2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIG9yIHNldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHdpZGdldCBpcyB2aXNpYmxlLlxyXG4gICAgICpcclxuICAgICAqIEByZWFkb25seVxyXG4gICAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICAgKiBAbWVtYmVyb2YgV2lkZ2V0QmFzZVxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IGlzVmlzaWJsZSgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faXNWaXNpYmxlO1xyXG4gICAgfVxyXG4gICAgc2V0IGlzVmlzaWJsZSh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgICAgIGlmICh0aGlzLl9pc1Zpc2libGUgPT09IHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2lzVmlzaWJsZSA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBvciBzZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBlZGl0b3IgYWxsb3dzIGVkaXRzIG9yIG5vdC5cclxuICAgICAqXHJcbiAgICAgKiBAcmVhZG9ubHlcclxuICAgICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAgICogQG1lbWJlcm9mIEVkaXRvckJhc2VcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIGdldCByZWFkb25seSgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZG9ubHk7XHJcbiAgICB9XHJcbiAgICBzZXQgcmVhZG9ubHkodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAodGhpcy5fcmVhZG9ubHkgPT09IHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5fcmVhZG9ubHk7XHJcbiAgICAgICAgdGhpcy5fcmVhZG9ubHkgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLm9uUmVhZE9ubHlDaGFuZ2VkKG9sZFZhbHVlLCB2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGNhbGxiYWNrIG1ldGhvZCB0aGF0IGlzIGludm9rZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlXHJcbiAgICAgKiBkZWZhdWx0IGNoYW5nZSBkZXRlY3RvciBoYXMgY2hlY2tlZCB0aGUgZGlyZWN0aXZlJ3NcclxuICAgICAqIGRhdGEtYm91bmQgcHJvcGVydGllcyBmb3IgdGhlIGZpcnN0IHRpbWUsXHJcbiAgICAgKiBhbmQgYmVmb3JlIGFueSBvZiB0aGUgdmlldyBvciBjb250ZW50IGNoaWxkcmVuIGhhdmUgYmVlbiBjaGVja2VkLlxyXG4gICAgICogSXQgaXMgaW52b2tlZCBvbmx5IG9uY2Ugd2hlbiB0aGUgZGlyZWN0aXZlIGlzIGluc3RhbnRpYXRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWVtYmVyb2YgV2lkZ2V0QmFzZVxyXG4gICAgICovXHJcbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgY2FsbGJhY2sgbWV0aG9kIHRoYXQgaXMgaW52b2tlZCBpbW1lZGlhdGVseSBhZnRlclxyXG4gICAgICogQW5ndWxhciBoYXMgY29tcGxldGVkIGluaXRpYWxpemF0aW9uIG9mIGEgY29tcG9uZW50J3Mgdmlldy5cclxuICAgICAqIEl0IGlzIGludm9rZWQgb25seSBvbmNlIHdoZW4gdGhlIHZpZXcgaXMgaW5zdGFudGlhdGVkLlxyXG4gICAgICpcclxuICAgICAqIEBtZW1iZXJvZiBXaWRnZXRCYXNlXHJcbiAgICAgKi9cclxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgY2FsbGJhY2sgbWV0aG9kIHRoYXQgaXMgaW52b2tlZCBpbW1lZGlhdGVseSBhZnRlciB0aGVcclxuICAgICAqIGRlZmF1bHQgY2hhbmdlIGRldGVjdG9yIGhhcyBjaGVja2VkIGRhdGEtYm91bmQgcHJvcGVydGllc1xyXG4gICAgICogaWYgYXQgbGVhc3Qgb25lIGhhcyBjaGFuZ2VkLCBhbmQgYmVmb3JlIHRoZSB2aWV3IGFuZCBjb250ZW50XHJcbiAgICAgKiBjaGlsZHJlbiBhcmUgY2hlY2tlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gY2hhbmdlcyBUaGUgY2hhbmdlZCBwcm9wZXJ0aWVzLlxyXG4gICAgICogQG1lbWJlcm9mIFdpZGdldEJhc2VcclxuICAgICAqL1xyXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBjYWxsYmFjayBtZXRob2QgdGhhdCBwZXJmb3JtcyBjdXN0b20gY2xlYW4tdXAsIGludm9rZWQgaW1tZWRpYXRlbHlcclxuICAgICAqIGFmdGVyIGEgZGlyZWN0aXZlLCBwaXBlLCBvciBzZXJ2aWNlIGluc3RhbmNlIGlzIGRlc3Ryb3llZC5cclxuICAgICAqL1xyXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGVuIG92ZXJyaWRkZW4gaW4gYSBkZXJpdmVkIGNsYXNzLCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcmVhZCBvbmx5IHN0YXRlIGNoYW5nZXMuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBvbGRWYWx1ZSBUaGUgb2xkIHZhbHVlLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBuZXdWYWx1ZSBUaGUgbmV3IHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIEBtZW1iZXJvZiBXaWRnZXRCYXNlXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBvblJlYWRPbmx5Q2hhbmdlZChvbGRWYWx1ZTogYm9vbGVhbiwgbmV3VmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoZW4gb3ZlcnJpZGRlbiBpbiBhIGRlcml2ZWQgY2xhc3MsIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBjaGlsZCB3aWRnZXRzIHF1ZXJ5IGNoYW5nZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICogQHBhcmFtIHtRdWVyeUxpc3Q8RWRpdG9yQmFzZTxhbnk+Pn0gb2xkVmFsdWUgVGhlIG9sZCBxdWVyeS5cclxuICAgICAqIEBwYXJhbSB7UXVlcnlMaXN0PEVkaXRvckJhc2U8YW55Pj59IG5ld1ZhbHVlIFRoZSBuZXcgcXVlcnkuXHJcbiAgICAgKlxyXG4gICAgICogQG1lbWJlcm9mIEVkaXRvckJhc2VcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIG9uQ2hpbGRXaWRnZXRzQ2hhbmdlZChvbGRWYWx1ZT86IFF1ZXJ5TGlzdDxXaWRnZXRCYXNlPiwgbmV3VmFsdWU/OiBRdWVyeUxpc3Q8V2lkZ2V0QmFzZT4pOiB2b2lkIHtcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgdGhlIGNvbXBvbmVudCBhcyBhIFdpZGdldEJhc2UsXHJcbiAqIHRvIGJlIGFibGUgdG8gaW1wb3J0IGl0IG92ZXIgdGhpcyBiYXNlIGNsYXNzIGluc3RlYWQgb2Ygb3ZlciBpdHMgb3duIGNsYXNzLlxyXG4gKlxyXG4gKiBGb3IgZXhhbXBsZSwgdXNlIGl0IGFzIEBWaWV3Q2hpbGQoV2lkZ2V0QmFzZSkgb3IgQFZpZXdDaGlsZHJlbihXaWRnZXRCYXNlKS5cclxuICpcclxuICogQGV4cG9ydFxyXG4gKiBAcGFyYW0ge1R5cGU8YW55Pn0gY29tcG9uZW50VHlwZSBUaGUgY29tcG9uZW50IHR5cGUuXHJcbiAqIEByZXR1cm5zIHtQcm92aWRlcn0gVGhlIHByb3ZpZGVyLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVXaWRnZXQoY29tcG9uZW50VHlwZTogVHlwZTxhbnk+KTogUHJvdmlkZXIge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBwcm92aWRlOiBXaWRnZXRCYXNlLFxyXG4gICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IGNvbXBvbmVudFR5cGUpXHJcbiAgICB9O1xyXG59XHJcblxyXG4vKipcclxuICogVGhpcyBmdW5jdGlvbiBwcm92aWRlcyB0aGUgY29tcG9uZW50IGFzIGEgTkdfVkFMVUVfQUNDRVNTT1IuXHJcbiAqIFRodXMsIGl0IGlzIHBvc3NpYmxlIHRvIGJpbmQgaXQgbGlrZSB0aGlzOlxyXG4gKiA8bXktY29tcG9uZW50IFsobmdNb2RlbCldPVwiYm91bmRQcm9wZXJ0eVwiPjwvbXktY29tcG9uZW50PlxyXG4gKlxyXG4gKiBAZXhwb3J0XHJcbiAqIEBwYXJhbSB7VHlwZTxhbnk+fSBjb21wb25lbnRUeXBlIFRoZSBjb21wb25lbnQgdHlwZS5cclxuICogQHJldHVybnMge1Byb3ZpZGVyfSBUaGUgcHJvdmlkZXIuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZVZhbHVlQWNjZXNzb3IoY29tcG9uZW50VHlwZTogVHlwZTxhbnk+KTogUHJvdmlkZXIge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBjb21wb25lbnRUeXBlKSxcclxuICAgICAgICBtdWx0aTogdHJ1ZVxyXG4gICAgfTtcclxufVxyXG4iXX0=