UNPKG

@kephas/ngx-core

Version:

Provides integration capabilities with Angular 13+.

202 lines 20.3 kB
import { Input, ElementRef, ViewContainerRef, Component } from '@angular/core'; import { WidgetBase } from './widgetBase'; import * as i0 from "@angular/core"; /** * Provides a base implementation for value editors. * * @export * @abstract * @class ValueEditorBase * @implements {OnInit} * @implements {AfterViewInit} * @implements {ControlValueAccessor} * @template TValue The value type. */ export class ValueEditorBase extends WidgetBase { /** * Creates an instance of ValueEditorBase. * * @param {ElementRef} elementRef The element reference. * @param {ViewContainerRef} viewContainerRef The view container reference. * @memberof ValueEditorBase */ constructor(elementRef, viewContainerRef) { super(elementRef, viewContainerRef); /** * Gets or sets a value indicating whether the value is changed from the change event. * * @protected * @memberof ValueEditorBase */ this.valueChangeFromEvent = false; /** * Gets or sets a value indicating whether the value is changed from the value property. * * @protected * @memberof ValueEditorBase */ this.valueChangeFromValue = false; this._onChange = (_) => { // The implementation will get overwritten by Angular in RegisterOnChange. }; this._onTouched = () => { // The implementation will get overwritten by Angular in RegisterOnTouched. }; } /** * Gets or sets the value to edit. * * @type {TValue} * @memberOf ValueEditorBase */ get value() { return this.getEditorValue(); } set value(value) { if (this._valueBeforeChange === value) { return; } this.updateEditor(value); } /** * Updates the underlying editor with the provided value. * * @protected * @param {TValue} value * @returns {boolean} * @memberof ValueEditorBase */ updateEditor(value) { if (this.valueChangeFromValue) { return false; } const prevValueChangeFromValue = this.valueChangeFromValue; this.valueChangeFromValue = true; try { const oldValue = this._valueBeforeChange; this.onValueChanging(oldValue, value); this._valueBeforeChange = value; if (!this.valueChangeFromEvent) { this.setEditorValue(value); value = this.getEditorValue(); } this.onValueChanged(oldValue, value); } catch (error) { this.logger.error(error, 'Error while updating the editor.'); throw error; } finally { this.valueChangeFromValue = prevValueChangeFromValue; } return true; } /** * Overridable method invoked when the value is about to be changed. * * @protected * @param {(TValue | undefined)} oldValue The old value. * @param {(TValue | undefined)} newValue The new value. * @memberof ValueEditorBase */ onValueChanging(oldValue, newValue) { } /** * Overridable method invoked after the value was changed. * * @protected * @param {(TValue | undefined)} oldValue The old value. * @param {(TValue | undefined)} newValue The new value. * @memberof ValueEditorBase */ onValueChanged(oldValue, newValue) { this._onChange(newValue); } /** * Callback invoked from the change event of the underlying editor. * * @protected * @param {*} e * @returns * @memberof PropertyEditorComponent */ onEditorChange(e) { if (this.valueChangeFromValue) { return; } const prevValueChangeFromEvent = this.valueChangeFromEvent; this.valueChangeFromEvent = true; try { const newValue = this.getEditorValueOnChange(e); this.value = newValue; } catch (error) { this.notification.notifyError(error); } finally { this.valueChangeFromEvent = prevValueChangeFromEvent; } } /** * Gets the underlying editor's value upon change. * * @protected * @param {*} e The change event arguments. * @returns {TValue} The widget value. * @memberof ValueEditorBase */ getEditorValueOnChange(e) { return this.getEditorValue(); } /** * Write a new value to the element. * * @param {*} obj The new value. * * @memberOf PropertyEditorComponent */ writeValue(obj) { this.value = obj; } /** * Set the function to be called when the control receives a change event. * * @param {*} fn The callback function. * * @memberOf PropertyEditorComponent */ registerOnChange(fn) { this._onChange = fn; } /** * Set the function to be called when the control receives a touch event. * * @param {*} fn The callback function. * * @memberOf PropertyEditorComponent */ registerOnTouched(fn) { this._onTouched = fn; } /** * This function is called when the control status changes to or from "DISABLED". * Depending on the value, it will enable or disable the appropriate DOM element. * * @param {boolean} isDisabled True if the state is disabled. * * @memberOf PropertyEditorComponent */ setDisabledState(isDisabled) { } } ValueEditorBase.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: ValueEditorBase, deps: [{ token: i0.ElementRef }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Component }); ValueEditorBase.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: ValueEditorBase, selector: "ng-component", inputs: { value: "value" }, usesInheritance: true, ngImport: i0, template: '', isInline: true }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: ValueEditorBase, decorators: [{ type: Component, args: [{ template: '' }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ViewContainerRef }]; }, propDecorators: { value: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsdWVFZGl0b3JCYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2VwaGFzL25neC1jb3JlL3NyYy9saWIvY29tcG9uZW50cy92YWx1ZUVkaXRvckJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILEtBQUssRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsU0FBUyxFQUNqRCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDOztBQUUxQzs7Ozs7Ozs7OztHQVVHO0FBSUgsTUFBTSxPQUFnQixlQUNsQixTQUFRLFVBQVU7SUFxQ2xCOzs7Ozs7T0FNRztJQUNILFlBQ0ksVUFBc0IsRUFDdEIsZ0JBQWtDO1FBRWxDLEtBQUssQ0FBQyxVQUFVLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQTdCeEM7Ozs7O1dBS0c7UUFDTyx5QkFBb0IsR0FBRyxLQUFLLENBQUM7UUFFdkM7Ozs7O1dBS0c7UUFDTyx5QkFBb0IsR0FBRyxLQUFLLENBQUM7UUFvTS9CLGNBQVMsR0FBRyxDQUFDLENBQU0sRUFBRSxFQUFFO1lBQzNCLDBFQUEwRTtRQUM5RSxDQUFDLENBQUM7UUFFTSxlQUFVLEdBQUcsR0FBRyxFQUFFO1lBQ3RCLDJFQUEyRTtRQUMvRSxDQUFDLENBQUM7SUExTEYsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsSUFDSSxLQUFLO1FBQ0wsT0FBTyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUNELElBQUksS0FBSyxDQUFDLEtBQWE7UUFDbkIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEtBQUssS0FBSyxFQUFFO1lBQ25DLE9BQU87U0FDVjtRQUVELElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDTyxZQUFZLENBQUMsS0FBYTtRQUNoQyxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUMzQixPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUVELE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDO1FBQzNELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7UUFFakMsSUFBSTtZQUNBLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztZQUN6QyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN0QyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO1lBRWhDLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUU7Z0JBQzVCLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzNCLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7YUFDakM7WUFFRCxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUN4QztRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ1osSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBYyxFQUFFLGtDQUFrQyxDQUFDLENBQUM7WUFDdEUsTUFBTSxLQUFLLENBQUM7U0FDZjtnQkFBUztZQUNOLElBQUksQ0FBQyxvQkFBb0IsR0FBRyx3QkFBd0IsQ0FBQztTQUN4RDtRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ08sZUFBZSxDQUFDLFFBQTRCLEVBQUUsUUFBNEI7SUFDcEYsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDTyxjQUFjLENBQUMsUUFBNEIsRUFBRSxRQUE0QjtRQUMvRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ08sY0FBYyxDQUFDLENBQU07UUFDM0IsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUU7WUFDM0IsT0FBTztTQUNWO1FBRUQsTUFBTSx3QkFBd0IsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUM7UUFDM0QsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztRQUNqQyxJQUFJO1lBQ0EsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hELElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDO1NBQ3pCO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDWixJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN4QztnQkFBUztZQUNOLElBQUksQ0FBQyxvQkFBb0IsR0FBRyx3QkFBd0IsQ0FBQztTQUN4RDtJQUNMLENBQUM7SUFvQkQ7Ozs7Ozs7T0FPRztJQUNPLHNCQUFzQixDQUFDLENBQU07UUFDbkMsT0FBTyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUdEOzs7Ozs7T0FNRztJQUNILFVBQVUsQ0FBQyxHQUFRO1FBQ2YsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7SUFDckIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILGdCQUFnQixDQUFDLEVBQU87UUFDcEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILGlCQUFpQixDQUFDLEVBQU87UUFDckIsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxnQkFBZ0IsQ0FBQyxVQUFtQjtJQUNwQyxDQUFDOzs0R0FwT2lCLGVBQWU7Z0dBQWYsZUFBZSx1R0FGekIsRUFBRTsyRkFFUSxlQUFlO2tCQUhwQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxFQUFFO2lCQUNiO2dJQTRETyxLQUFLO3NCQURSLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgSW5wdXQsIEVsZW1lbnRSZWYsIFZpZXdDb250YWluZXJSZWYsIENvbXBvbmVudFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgV2lkZ2V0QmFzZSB9IGZyb20gJy4vd2lkZ2V0QmFzZSc7XHJcblxyXG4vKipcclxuICogUHJvdmlkZXMgYSBiYXNlIGltcGxlbWVudGF0aW9uIGZvciB2YWx1ZSBlZGl0b3JzLlxyXG4gKlxyXG4gKiBAZXhwb3J0XHJcbiAqIEBhYnN0cmFjdFxyXG4gKiBAY2xhc3MgVmFsdWVFZGl0b3JCYXNlXHJcbiAqIEBpbXBsZW1lbnRzIHtPbkluaXR9XHJcbiAqIEBpbXBsZW1lbnRzIHtBZnRlclZpZXdJbml0fVxyXG4gKiBAaW1wbGVtZW50cyB7Q29udHJvbFZhbHVlQWNjZXNzb3J9XHJcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgVGhlIHZhbHVlIHR5cGUuXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICB0ZW1wbGF0ZTogJydcclxufSlcclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFZhbHVlRWRpdG9yQmFzZTxUVmFsdWU+XHJcbiAgICBleHRlbmRzIFdpZGdldEJhc2VcclxuICAgIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBvciBzZXRzIHRoZSB2YWx1ZSBkZXNjcmlwdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICogQG1lbWJlcm9mIFZhbHVlRWRpdG9yQmFzZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZGVzY3JpcHRpb24/OiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIG9yIHNldHMgdGhlIHZhbHVlIHByb21wdC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAgICogQG1lbWJlcm9mIFZhbHVlRWRpdG9yQmFzZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcHJvbXB0Pzogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBvciBzZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB2YWx1ZSBpcyBjaGFuZ2VkIGZyb20gdGhlIGNoYW5nZSBldmVudC5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgKiBAbWVtYmVyb2YgVmFsdWVFZGl0b3JCYXNlXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCB2YWx1ZUNoYW5nZUZyb21FdmVudCA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBvciBzZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB2YWx1ZSBpcyBjaGFuZ2VkIGZyb20gdGhlIHZhbHVlIHByb3BlcnR5LlxyXG4gICAgICpcclxuICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAqIEBtZW1iZXJvZiBWYWx1ZUVkaXRvckJhc2VcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIHZhbHVlQ2hhbmdlRnJvbVZhbHVlID0gZmFsc2U7XHJcblxyXG4gICAgcHJpdmF0ZSBfdmFsdWVCZWZvcmVDaGFuZ2U/OiBUVmFsdWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFZhbHVlRWRpdG9yQmFzZS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnRSZWZ9IGVsZW1lbnRSZWYgVGhlIGVsZW1lbnQgcmVmZXJlbmNlLlxyXG4gICAgICogQHBhcmFtIHtWaWV3Q29udGFpbmVyUmVmfSB2aWV3Q29udGFpbmVyUmVmIFRoZSB2aWV3IGNvbnRhaW5lciByZWZlcmVuY2UuXHJcbiAgICAgKiBAbWVtYmVyb2YgVmFsdWVFZGl0b3JCYXNlXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXHJcbiAgICAgICAgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKGVsZW1lbnRSZWYsIHZpZXdDb250YWluZXJSZWYpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBvciBzZXRzIHRoZSB2YWx1ZSB0byBlZGl0LlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtUVmFsdWV9XHJcbiAgICAgKiBAbWVtYmVyT2YgVmFsdWVFZGl0b3JCYXNlXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBnZXQgdmFsdWUoKTogVFZhbHVlIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRFZGl0b3JWYWx1ZSgpO1xyXG4gICAgfVxyXG4gICAgc2V0IHZhbHVlKHZhbHVlOiBUVmFsdWUpIHtcclxuICAgICAgICBpZiAodGhpcy5fdmFsdWVCZWZvcmVDaGFuZ2UgPT09IHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlRWRpdG9yKHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgdGhlIHVuZGVybHlpbmcgZWRpdG9yIHdpdGggdGhlIHByb3ZpZGVkIHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAqIEBwYXJhbSB7VFZhbHVlfSB2YWx1ZVxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XHJcbiAgICAgKiBAbWVtYmVyb2YgVmFsdWVFZGl0b3JCYXNlXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCB1cGRhdGVFZGl0b3IodmFsdWU6IFRWYWx1ZSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICh0aGlzLnZhbHVlQ2hhbmdlRnJvbVZhbHVlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHByZXZWYWx1ZUNoYW5nZUZyb21WYWx1ZSA9IHRoaXMudmFsdWVDaGFuZ2VGcm9tVmFsdWU7XHJcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZUZyb21WYWx1ZSA9IHRydWU7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5fdmFsdWVCZWZvcmVDaGFuZ2U7XHJcbiAgICAgICAgICAgIHRoaXMub25WYWx1ZUNoYW5naW5nKG9sZFZhbHVlLCB2YWx1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlQmVmb3JlQ2hhbmdlID0gdmFsdWU7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMudmFsdWVDaGFuZ2VGcm9tRXZlbnQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0RWRpdG9yVmFsdWUodmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmdldEVkaXRvclZhbHVlKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMub25WYWx1ZUNoYW5nZWQob2xkVmFsdWUsIHZhbHVlKTtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihlcnJvciBhcyBFcnJvciwgJ0Vycm9yIHdoaWxlIHVwZGF0aW5nIHRoZSBlZGl0b3IuJyk7XHJcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xyXG4gICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICAgIHRoaXMudmFsdWVDaGFuZ2VGcm9tVmFsdWUgPSBwcmV2VmFsdWVDaGFuZ2VGcm9tVmFsdWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE92ZXJyaWRhYmxlIG1ldGhvZCBpbnZva2VkIHdoZW4gdGhlIHZhbHVlIGlzIGFib3V0IHRvIGJlIGNoYW5nZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICogQHBhcmFtIHsoVFZhbHVlIHwgdW5kZWZpbmVkKX0gb2xkVmFsdWUgVGhlIG9sZCB2YWx1ZS5cclxuICAgICAqIEBwYXJhbSB7KFRWYWx1ZSB8IHVuZGVmaW5lZCl9IG5ld1ZhbHVlIFRoZSBuZXcgdmFsdWUuXHJcbiAgICAgKiBAbWVtYmVyb2YgVmFsdWVFZGl0b3JCYXNlXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBvblZhbHVlQ2hhbmdpbmcob2xkVmFsdWU6IFRWYWx1ZSB8IHVuZGVmaW5lZCwgbmV3VmFsdWU6IFRWYWx1ZSB8IHVuZGVmaW5lZCk6IHZvaWQge1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3ZlcnJpZGFibGUgbWV0aG9kIGludm9rZWQgYWZ0ZXIgdGhlIHZhbHVlIHdhcyBjaGFuZ2VkLlxyXG4gICAgICpcclxuICAgICAqIEBwcm90ZWN0ZWRcclxuICAgICAqIEBwYXJhbSB7KFRWYWx1ZSB8IHVuZGVmaW5lZCl9IG9sZFZhbHVlIFRoZSBvbGQgdmFsdWUuXHJcbiAgICAgKiBAcGFyYW0geyhUVmFsdWUgfCB1bmRlZmluZWQpfSBuZXdWYWx1ZSBUaGUgbmV3IHZhbHVlLlxyXG4gICAgICogQG1lbWJlcm9mIFZhbHVlRWRpdG9yQmFzZVxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgb25WYWx1ZUNoYW5nZWQob2xkVmFsdWU6IFRWYWx1ZSB8IHVuZGVmaW5lZCwgbmV3VmFsdWU6IFRWYWx1ZSB8IHVuZGVmaW5lZCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX29uQ2hhbmdlKG5ld1ZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGxiYWNrIGludm9rZWQgZnJvbSB0aGUgY2hhbmdlIGV2ZW50IG9mIHRoZSB1bmRlcmx5aW5nIGVkaXRvci5cclxuICAgICAqXHJcbiAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgKiBAcGFyYW0geyp9IGVcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKiBAbWVtYmVyb2YgUHJvcGVydHlFZGl0b3JDb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIG9uRWRpdG9yQ2hhbmdlKGU6IGFueSkge1xyXG4gICAgICAgIGlmICh0aGlzLnZhbHVlQ2hhbmdlRnJvbVZhbHVlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHByZXZWYWx1ZUNoYW5nZUZyb21FdmVudCA9IHRoaXMudmFsdWVDaGFuZ2VGcm9tRXZlbnQ7XHJcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZUZyb21FdmVudCA9IHRydWU7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzLmdldEVkaXRvclZhbHVlT25DaGFuZ2UoZSk7XHJcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBuZXdWYWx1ZTtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbi5ub3RpZnlFcnJvcihlcnJvcik7XHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZUNoYW5nZUZyb21FdmVudCA9IHByZXZWYWx1ZUNoYW5nZUZyb21FdmVudDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgdW5kZXJseWluZyBlZGl0b3IuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICogQHBhcmFtIHtUVmFsdWV9IHZhbHVlIFRoZSB2YWx1ZSB0byBiZSBzZXQuXHJcbiAgICAgKiBAbWVtYmVyb2YgVmFsdWVFZGl0b3JCYXNlXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBhYnN0cmFjdCBzZXRFZGl0b3JWYWx1ZSh2YWx1ZTogVFZhbHVlKTogdm9pZDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHVuZGVybHlpbmcgZWRpdG9yJ3MgdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICogQHJldHVybnMge1RWYWx1ZX0gVGhlIHdpZGdldCB2YWx1ZS5cclxuICAgICAqIEBtZW1iZXJvZiBWYWx1ZUVkaXRvckJhc2VcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IGdldEVkaXRvclZhbHVlKCk6IFRWYWx1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHVuZGVybHlpbmcgZWRpdG9yJ3MgdmFsdWUgdXBvbiBjaGFuZ2UuXHJcbiAgICAgKlxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICogQHBhcmFtIHsqfSBlIFRoZSBjaGFuZ2UgZXZlbnQgYXJndW1lbnRzLlxyXG4gICAgICogQHJldHVybnMge1RWYWx1ZX0gVGhlIHdpZGdldCB2YWx1ZS5cclxuICAgICAqIEBtZW1iZXJvZiBWYWx1ZUVkaXRvckJhc2VcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGdldEVkaXRvclZhbHVlT25DaGFuZ2UoZTogYW55KTogVFZhbHVlIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRFZGl0b3JWYWx1ZSgpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFdyaXRlIGEgbmV3IHZhbHVlIHRvIHRoZSBlbGVtZW50LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Kn0gb2JqIFRoZSBuZXcgdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogQG1lbWJlck9mIFByb3BlcnR5RWRpdG9yQ29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIHdyaXRlVmFsdWUob2JqOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnZhbHVlID0gb2JqO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0IHRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgY29udHJvbCByZWNlaXZlcyBhIGNoYW5nZSBldmVudC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyp9IGZuIFRoZSBjYWxsYmFjayBmdW5jdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWVtYmVyT2YgUHJvcGVydHlFZGl0b3JDb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UgPSBmbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldCB0aGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGNvbnRyb2wgcmVjZWl2ZXMgYSB0b3VjaCBldmVudC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0geyp9IGZuIFRoZSBjYWxsYmFjayBmdW5jdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAbWVtYmVyT2YgUHJvcGVydHlFZGl0b3JDb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX29uVG91Y2hlZCA9IGZuO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgY29udHJvbCBzdGF0dXMgY2hhbmdlcyB0byBvciBmcm9tIFwiRElTQUJMRURcIi5cclxuICAgICAqIERlcGVuZGluZyBvbiB0aGUgdmFsdWUsIGl0IHdpbGwgZW5hYmxlIG9yIGRpc2FibGUgdGhlIGFwcHJvcHJpYXRlIERPTSBlbGVtZW50LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNEaXNhYmxlZCBUcnVlIGlmIHRoZSBzdGF0ZSBpcyBkaXNhYmxlZC5cclxuICAgICAqXHJcbiAgICAgKiBAbWVtYmVyT2YgUHJvcGVydHlFZGl0b3JDb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfb25DaGFuZ2UgPSAoXzogYW55KSA9PiB7XHJcbiAgICAgICAgLy8gVGhlIGltcGxlbWVudGF0aW9uIHdpbGwgZ2V0IG92ZXJ3cml0dGVuIGJ5IEFuZ3VsYXIgaW4gUmVnaXN0ZXJPbkNoYW5nZS5cclxuICAgIH07XHJcblxyXG4gICAgcHJpdmF0ZSBfb25Ub3VjaGVkID0gKCkgPT4ge1xyXG4gICAgICAgIC8vIFRoZSBpbXBsZW1lbnRhdGlvbiB3aWxsIGdldCBvdmVyd3JpdHRlbiBieSBBbmd1bGFyIGluIFJlZ2lzdGVyT25Ub3VjaGVkLlxyXG4gICAgfTtcclxufVxyXG4iXX0=