UNPKG

@ux-aspects/ux-aspects

Version:

Open source user interface framework for building modern, responsive, mobile big data applications

151 lines 24.9 kB
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, forwardRef, inject, Input, Output, ViewChild } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { FocusIndicatorDirective } from '../../directives/accessibility'; import { FocusableItemToken } from '../menu'; import { RadioButtonGroupDirective } from './radio-button-group/radio-button-group.directive'; import * as i0 from "@angular/core"; import * as i1 from "../../directives/accessibility/focus-indicator/focus-indicator.directive"; export const RADIOBUTTON_VALUE_ACCESSOR = { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => RadioButtonComponent), multi: true }; let uniqueRadioId = 0; export class RadioButtonComponent { constructor() { this._changeDetector = inject(ChangeDetectorRef); this._group = inject(RadioButtonGroupDirective, { optional: true }); /** Provide a default unique id value for the radiobutton */ this._radioButtonId = `ux-radio-button-${++uniqueRadioId}`; /** Specify a unique Id for this component */ this.id = this._radioButtonId; /** If set to `true` the radio button will not change state when clicked. */ this.clickable = true; /** If this value is set to `true` then the radio button will be disabled */ this.disabled = false; /** If set to `true` the checkbox will be displayed without a border and background. */ this.simplified = false; /** Specify an aria label for the input element */ this.ariaLabel = ''; /** Specify an aria labelledby property for the input element */ this.ariaLabelledby = null; /** Specify an aria describedby property for the input element */ this.ariaDescribedby = null; /** Emits when the value has been changed. */ this.valueChange = new EventEmitter(); /** Determine if the underlying input component has been focused with the keyboard */ this._focused = false; /** Internally store the current tabindex */ this._internalTabindex = null; /** Used to inform Angular forms that the component has been touched */ // eslint-disable-next-line @typescript-eslint/no-empty-function this.onTouchedCallback = () => { }; /** Used to inform Angular forms that the component value has changed */ // eslint-disable-next-line @typescript-eslint/no-empty-function this.onChangeCallback = () => { }; } ngOnChanges(changes) { if (changes.disabled && this._group && !changes.disabled.firstChange) { this._group.determineAndSetInternalTabIndex(); } } /** Select the current option */ select() { if (this.disabled || !this.clickable) { return; } // toggle the checked state this.value = this.option; // if there is a group set the selected value if (this._group) { this._group.value = this.option; this._group.emitChange(this.option); } // emit the value this.valueChange.emit(this.value); // update the value if used within a form control this.onChangeCallback(this.value); // mark the component as touched this.onTouchedCallback(); } // Functions required to update ng-model writeValue(value) { if (value !== this.value) { this.value = value; this._changeDetector.detectChanges(); } } /** Allow Angular forms for provide us with a callback for when the input value changes */ registerOnChange(fn) { this.onChangeCallback = fn; } /** Allow Angular forms for provide us with a callback for when the touched state changes */ registerOnTouched(fn) { this.onTouchedCallback = fn; } /** Allow Angular forms to disable the component */ setDisabledState(isDisabled) { this.disabled = isDisabled; this._changeDetector.markForCheck(); } /** Set the internal tab index of the radio button */ setInternalTabindex(tabIndex) { this._internalTabindex = tabIndex; this._changeDetector.detectChanges(); } /** Focus the input element */ focus(origin) { this._focusIndicator.focus(origin); } setInputTabIndex(tabindex) { this.tabindex = tabindex; this._changeDetector.detectChanges(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: RadioButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: RadioButtonComponent, selector: "ux-radio-button", inputs: { id: "id", name: "name", inputRole: "inputRole", value: "value", required: "required", tabindex: "tabindex", clickable: "clickable", disabled: "disabled", simplified: "simplified", option: "option", ariaLabel: ["aria-label", "ariaLabel"], ariaLabelledby: ["aria-labelledby", "ariaLabelledby"], ariaDescribedby: ["aria-describedby", "ariaDescribedby"] }, outputs: { valueChange: "valueChange" }, providers: [RADIOBUTTON_VALUE_ACCESSOR, { provide: FocusableItemToken, useExisting: RadioButtonComponent }], viewQueries: [{ propertyName: "_focusIndicator", first: true, predicate: FocusIndicatorDirective, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<label\n [attr.for]=\"(id || _radioButtonId) + '-input'\"\n class=\"ux-radio-button\"\n [class.ux-radio-button-checked]=\"value === option\"\n [class.ux-radio-button-simplified]=\"simplified\"\n [class.ux-radio-button-disabled]=\"disabled\"\n [class.ux-radio-button-focused]=\"_focused\"\n>\n <div class=\"ux-radio-button-container\">\n <input\n #input\n class=\"ux-radio-button-input\"\n uxFocusIndicator\n type=\"radio\"\n [id]=\"(id || _radioButtonId) + '-input'\"\n [attr.role]=\"inputRole\"\n [checked]=\"value === option\"\n [disabled]=\"disabled\"\n [tabindex]=\"tabindex ?? _internalTabindex\"\n [attr.name]=\"name\"\n [required]=\"required\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledby\"\n [attr.aria-describedby]=\"ariaDescribedby\"\n [attr.aria-checked]=\"value === option\"\n (indicator)=\"_focused = $event\"\n (change)=\"select()\"\n (click)=\"$event.stopPropagation()\"\n />\n </div>\n\n <span class=\"ux-radio-button-label\">\n <ng-content></ng-content>\n </span>\n\n</label>\n", dependencies: [{ kind: "directive", type: i1.FocusIndicatorDirective, selector: "[uxFocusIndicator]", inputs: ["checkChildren", "mouseFocusIndicator", "touchFocusIndicator", "keyboardFocusIndicator", "programmaticFocusIndicator"], outputs: ["indicator"], exportAs: ["ux-focus-indicator"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: RadioButtonComponent, decorators: [{ type: Component, args: [{ selector: 'ux-radio-button', providers: [RADIOBUTTON_VALUE_ACCESSOR, { provide: FocusableItemToken, useExisting: RadioButtonComponent }], changeDetection: ChangeDetectionStrategy.OnPush, template: "<label\n [attr.for]=\"(id || _radioButtonId) + '-input'\"\n class=\"ux-radio-button\"\n [class.ux-radio-button-checked]=\"value === option\"\n [class.ux-radio-button-simplified]=\"simplified\"\n [class.ux-radio-button-disabled]=\"disabled\"\n [class.ux-radio-button-focused]=\"_focused\"\n>\n <div class=\"ux-radio-button-container\">\n <input\n #input\n class=\"ux-radio-button-input\"\n uxFocusIndicator\n type=\"radio\"\n [id]=\"(id || _radioButtonId) + '-input'\"\n [attr.role]=\"inputRole\"\n [checked]=\"value === option\"\n [disabled]=\"disabled\"\n [tabindex]=\"tabindex ?? _internalTabindex\"\n [attr.name]=\"name\"\n [required]=\"required\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledby\"\n [attr.aria-describedby]=\"ariaDescribedby\"\n [attr.aria-checked]=\"value === option\"\n (indicator)=\"_focused = $event\"\n (change)=\"select()\"\n (click)=\"$event.stopPropagation()\"\n />\n </div>\n\n <span class=\"ux-radio-button-label\">\n <ng-content></ng-content>\n </span>\n\n</label>\n" }] }], propDecorators: { id: [{ type: Input }], name: [{ type: Input }], inputRole: [{ type: Input }], value: [{ type: Input }], required: [{ type: Input }], tabindex: [{ type: Input }], clickable: [{ type: Input }], disabled: [{ type: Input }], simplified: [{ type: Input }], option: [{ type: Input }], ariaLabel: [{ type: Input, args: ['aria-label'] }], ariaLabelledby: [{ type: Input, args: ['aria-labelledby'] }], ariaDescribedby: [{ type: Input, args: ['aria-describedby'] }], valueChange: [{ type: Output }], _focusIndicator: [{ type: ViewChild, args: [FocusIndicatorDirective] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFkaW9idXR0b24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvcmFkaW9idXR0b24vcmFkaW9idXR0b24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvcmFkaW9idXR0b24vcmFkaW9idXR0b24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFpQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUssT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUU3QyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQzs7O0FBRTlGLE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHO0lBQ3RDLE9BQU8sRUFBRSxpQkFBaUI7SUFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQztJQUNuRCxLQUFLLEVBQUUsSUFBSTtDQUNkLENBQUM7QUFFRixJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUM7QUFXdEIsTUFBTSxPQUFPLG9CQUFvQjtJQVRqQztRQVVxQixvQkFBZSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRTVDLFdBQU0sR0FBRyxNQUFNLENBQUMseUJBQXlCLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUVoRiw0REFBNEQ7UUFDNUQsbUJBQWMsR0FBVyxtQkFBbUIsRUFB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QUFrQjtnQkFHZixXQUFXO3NCQUFwQixNQUFNO2dCQUlQLGVBQWU7c0JBRGQsU0FBUzt1QkFBQyx1QkFBdUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGb2N1c09yaWdpbiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9hMTF5JztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIGZvcndhcmRSZWYsIGluamVjdCwgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEZvY3VzSW5kaWNhdG9yRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9hY2Nlc3NpYmlsaXR5JztcbmltcG9ydCB7IEZvY3VzYWJsZUl0ZW1Ub2tlbiB9IGZyb20gJy4uL21lbnUnO1xuaW1wb3J0IHsgRm9jdXNhYmxlQ29udHJvbCB9IGZyb20gJy4uL21lbnUvaW50ZXJmYWNlcy9mb2N1c2FibGUtY29udHJvbC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmFkaW9CdXR0b25Hcm91cERpcmVjdGl2ZSB9IGZyb20gJy4vcmFkaW8tYnV0dG9uLWdyb3VwL3JhZGlvLWJ1dHRvbi1ncm91cC5kaXJlY3RpdmUnO1xuXG5leHBvcnQgY29uc3QgUkFESU9CVVRUT05fVkFMVUVfQUNDRVNTT1IgPSB7XG4gICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gUmFkaW9CdXR0b25Db21wb25lbnQpLFxuICAgIG11bHRpOiB0cnVlXG59O1xuXG5sZXQgdW5pcXVlUmFkaW9JZCA9IDA7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndXgtcmFkaW8tYnV0dG9uJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vcmFkaW9idXR0b24uY29tcG9uZW50Lmh0bWwnLFxuICAgIHByb3ZpZGVyczogW1JBRElPQlVUVE9OX1ZBTFVFX0FDQ0VTU09SLCB7XG4gICAgICAgIHByb3ZpZGU6IEZvY3VzYWJsZUl0ZW1Ub2tlbixcbiAgICAgICAgdXNlRXhpc3Rpbmc6IFJhZGlvQnV0dG9uQ29tcG9uZW50XG4gICAgfV0sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgUmFkaW9CdXR0b25Db21wb25lbnQ8VCA9IHVua25vd24+IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uQ2hhbmdlcywgRm9jdXNhYmxlQ29udHJvbCB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2hhbmdlRGV0ZWN0b3IgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZ3JvdXAgPSBpbmplY3QoUmFkaW9CdXR0b25Hcm91cERpcmVjdGl2ZSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblxuICAgIC8qKiBQcm92aWRlIGEgZGVmYXVsdCB1bmlxdWUgaWQgdmFsdWUgZm9yIHRoZSByYWRpb2J1dHRvbiAqL1xuICAgIF9yYWRpb0J1dHRvbklkOiBzdHJpbmcgPSBgdXgtcmFkaW8tYnV0dG9uLSR7Kyt1bmlxdWVSYWRpb0lkfWA7XG5cbiAgICAvKiogU3BlY2lmeSBhIHVuaXF1ZSBJZCBmb3IgdGhpcyBjb21wb25lbnQgKi9cbiAgICBASW5wdXQoKSBpZDogc3RyaW5nID0gdGhpcy5fcmFkaW9CdXR0b25JZDtcblxuICAgIC8qKiBTcGVjaWZ5IGEgZm9ybSBuYW1lIGZvciB0aGUgaW5wdXQgZWxlbWVudCAqL1xuICAgIEBJbnB1dCgpIG5hbWU6IHN0cmluZyB8IG51bGw7XG5cbiAgICAvKiogU3BlY2lmeSB0aGUgcm9sZSBvZiB0aGUgaW5wdXQgZWxlbWVudC4gKi9cbiAgICBASW5wdXQoKSBpbnB1dFJvbGU6IHN0cmluZztcblxuICAgIC8qKiBUaGlzIHNob3VsZCBiZSBhIHR3byB3YXkgYmluZGluZyBhbmQgd2lsbCBzdG9yZSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG9wdGlvbi4gRWFjaCByYWRpbyBidXR0b24gaW4gdGhlIHNhbWUgZ3JvdXAgc2hvdWxkIGhhdmUgdGhlIHNhbWUgdmFsdWUgdmFyaWFibGUuICovXG4gICAgQElucHV0KCkgdmFsdWU6IFQ7XG5cbiAgICAvKiogU3BlY2lmeSBpZiB0aGlzIGlzIGEgcmVxdWlyZWQgaW5wdXQgKi9cbiAgICBASW5wdXQoKSByZXF1aXJlZDogYm9vbGVhbjtcblxuICAgIC8qKiBTcGVjaWZ5IHRoZSB0YWJpbmRleCAqL1xuICAgIEBJbnB1dCgpIHRhYmluZGV4OiBudW1iZXI7XG5cbiAgICAvKiogSWYgc2V0IHRvIGB0cnVlYCB0aGUgcmFkaW8gYnV0dG9uIHdpbGwgbm90IGNoYW5nZSBzdGF0ZSB3aGVuIGNsaWNrZWQuICovXG4gICAgQElucHV0KCkgY2xpY2thYmxlOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKiBJZiB0aGlzIHZhbHVlIGlzIHNldCB0byBgdHJ1ZWAgdGhlbiB0aGUgcmFkaW8gYnV0dG9uIHdpbGwgYmUgZGlzYWJsZWQgKi9cbiAgICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqIElmIHNldCB0byBgdHJ1ZWAgdGhlIGNoZWNrYm94IHdpbGwgYmUgZGlzcGxheWVkIHdpdGhvdXQgYSBib3JkZXIgYW5kIGJhY2tncm91bmQuICovXG4gICAgQElucHV0KCkgc2ltcGxpZmllZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBzaG91bGQgY29udGFpbiB0aGUgdmFsdWUgdGhhdCB0aGlzIHJhZGlvIGJ1dHRvbiByZXByZXNlbnRzLiBUaGlzIHdpbGwgYmUgc3RvcmVkIGluIHRoZSB2YWx1ZSB2YXJpYWJsZSB3aGVuIHRoZSByYWRpbyBidXR0b24gaXMgc2VsZWN0ZWQuXG4gICAgICogTm8gdHdvIHJhZGlvIGJ1dHRvbnMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgb3B0aW9uIHZhbHVlIHdpdGhpbiB0aGUgc2FtZSBncm91cCBvZiByYWRpbyBidXR0b25zLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIG9wdGlvbjogVDtcblxuICAgIC8qKiBTcGVjaWZ5IGFuIGFyaWEgbGFiZWwgZm9yIHRoZSBpbnB1dCBlbGVtZW50ICovXG4gICAgQElucHV0KCdhcmlhLWxhYmVsJykgYXJpYUxhYmVsOiBzdHJpbmcgPSAnJztcblxuICAgIC8qKiBTcGVjaWZ5IGFuIGFyaWEgbGFiZWxsZWRieSBwcm9wZXJ0eSBmb3IgdGhlIGlucHV0IGVsZW1lbnQgKi9cbiAgICBASW5wdXQoJ2FyaWEtbGFiZWxsZWRieScpIGFyaWFMYWJlbGxlZGJ5OiBzdHJpbmcgPSBudWxsO1xuXG4gICAgLyoqIFNwZWNpZnkgYW4gYXJpYSBkZXNjcmliZWRieSBwcm9wZXJ0eSBmb3IgdGhlIGlucHV0IGVsZW1lbnQgKi9cbiAgICBASW5wdXQoJ2FyaWEtZGVzY3JpYmVkYnknKSBhcmlhRGVzY3JpYmVkYnk6IHN0cmluZyA9IG51bGw7XG5cbiAgICAvKiogRW1pdHMgd2hlbiB0aGUgdmFsdWUgaGFzIGJlZW4gY2hhbmdlZC4gKi9cbiAgICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxUPiA9IG5ldyBFdmVudEVtaXR0ZXI8VD4oKTtcblxuICAgIC8qKiBHZXQgdGhlIGZvY3VzIGluZGljYXRvciB0byBzZXQgZm9jdXMgKi9cbiAgICBAVmlld0NoaWxkKEZvY3VzSW5kaWNhdG9yRGlyZWN0aXZlKVxuICAgIF9mb2N1c0luZGljYXRvcj86IEZvY3VzSW5kaWNhdG9yRGlyZWN0aXZlO1xuXG4gICAgLyoqIERldGVybWluZSBpZiB0aGUgdW5kZXJseWluZyBpbnB1dCBjb21wb25lbnQgaGFzIGJlZW4gZm9jdXNlZCB3aXRoIHRoZSBrZXlib2FyZCAqL1xuICAgIF9mb2N1c2VkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKiogSW50ZXJuYWxseSBzdG9yZSB0aGUgY3VycmVudCB0YWJpbmRleCAqL1xuICAgIF9pbnRlcm5hbFRhYmluZGV4OiBudW1iZXIgPSBudWxsO1xuXG4gICAgLyoqIFVzZWQgdG8gaW5mb3JtIEFuZ3VsYXIgZm9ybXMgdGhhdCB0aGUgY29tcG9uZW50IGhhcyBiZWVuIHRvdWNoZWQgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgb25Ub3VjaGVkQ2FsbGJhY2s6ICgpID0+IHZvaWQgPSAoKSA9PiB7IH07XG5cbiAgICAvKiogVXNlZCB0byBpbmZvcm0gQW5ndWxhciBmb3JtcyB0aGF0IHRoZSBjb21wb25lbnQgdmFsdWUgaGFzIGNoYW5nZWQgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgb25DaGFuZ2VDYWxsYmFjazogKF86IGFueSkgPT4gdm9pZCA9ICgpID0+IHsgfTtcblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgaWYgKGNoYW5nZXMuZGlzYWJsZWQgJiYgdGhpcy5fZ3JvdXAgJiYgIWNoYW5nZXMuZGlzYWJsZWQuZmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuX2dyb3VwLmRldGVybWluZUFuZFNldEludGVybmFsVGFiSW5kZXgoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBTZWxlY3QgdGhlIGN1cnJlbnQgb3B0aW9uICovXG4gICAgc2VsZWN0KCk6IHZvaWQge1xuXG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkIHx8ICF0aGlzLmNsaWNrYWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG9nZ2xlIHRoZSBjaGVja2VkIHN0YXRlXG4gICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLm9wdGlvbjtcblxuICAgICAgICAvLyBpZiB0aGVyZSBpcyBhIGdyb3VwIHNldCB0aGUgc2VsZWN0ZWQgdmFsdWVcbiAgICAgICAgaWYgKHRoaXMuX2dyb3VwKSB7XG4gICAgICAgICAgICB0aGlzLl9ncm91cC52YWx1ZSA9IHRoaXMub3B0aW9uO1xuICAgICAgICAgICAgdGhpcy5fZ3JvdXAuZW1pdENoYW5nZSh0aGlzLm9wdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlbWl0IHRoZSB2YWx1ZVxuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodGhpcy52YWx1ZSk7XG5cbiAgICAgICAgLy8gdXBkYXRlIHRoZSB2YWx1ZSBpZiB1c2VkIHdpdGhpbiBhIGZvcm0gY29udHJvbFxuICAgICAgICB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sodGhpcy52YWx1ZSk7XG5cbiAgICAgICAgLy8gbWFyayB0aGUgY29tcG9uZW50IGFzIHRvdWNoZWRcbiAgICAgICAgdGhpcy5vblRvdWNoZWRDYWxsYmFjaygpO1xuICAgIH1cblxuICAgIC8vIEZ1bmN0aW9ucyByZXF1aXJlZCB0byB1cGRhdGUgbmctbW9kZWxcbiAgICB3cml0ZVZhbHVlKHZhbHVlOiBUKTogdm9pZCB7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdGhpcy52YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEFsbG93IEFuZ3VsYXIgZm9ybXMgZm9yIHByb3ZpZGUgdXMgd2l0aCBhIGNhbGxiYWNrIGZvciB3aGVuIHRoZSBpbnB1dCB2YWx1ZSBjaGFuZ2VzICovXG5cbiAgICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjayA9IGZuO1xuICAgIH1cblxuICAgIC8qKiBBbGxvdyBBbmd1bGFyIGZvcm1zIGZvciBwcm92aWRlIHVzIHdpdGggYSBjYWxsYmFjayBmb3Igd2hlbiB0aGUgdG91Y2hlZCBzdGF0ZSBjaGFuZ2VzICovXG4gICAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblRvdWNoZWRDYWxsYmFjayA9IGZuO1xuICAgIH1cblxuICAgIC8qKiBBbGxvdyBBbmd1bGFyIGZvcm1zIHRvIGRpc2FibGUgdGhlIGNvbXBvbmVudCAqL1xuICAgIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgLyoqIFNldCB0aGUgaW50ZXJuYWwgdGFiIGluZGV4IG9mIHRoZSByYWRpbyBidXR0b24gKi9cbiAgICBzZXRJbnRlcm5hbFRhYmluZGV4KHRhYkluZGV4KTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2ludGVybmFsVGFiaW5kZXggPSB0YWJJbmRleDtcbiAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8qKiBGb2N1cyB0aGUgaW5wdXQgZWxlbWVudCAqL1xuICAgIGZvY3VzKG9yaWdpbjogRm9jdXNPcmlnaW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZm9jdXNJbmRpY2F0b3IuZm9jdXMob3JpZ2luKTtcbiAgICB9XG5cbiAgICBzZXRJbnB1dFRhYkluZGV4KHRhYmluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50YWJpbmRleCA9IHRhYmluZGV4O1xuICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxufVxuIiwiPGxhYmVsXG4gICAgW2F0dHIuZm9yXT1cIihpZCB8fCBfcmFkaW9CdXR0b25JZCkgKyAnLWlucHV0J1wiXG4gICAgY2xhc3M9XCJ1eC1yYWRpby1idXR0b25cIlxuICAgIFtjbGFzcy51eC1yYWRpby1idXR0b24tY2hlY2tlZF09XCJ2YWx1ZSA9PT0gb3B0aW9uXCJcbiAgICBbY2xhc3MudXgtcmFkaW8tYnV0dG9uLXNpbXBsaWZpZWRdPVwic2ltcGxpZmllZFwiXG4gICAgW2NsYXNzLnV4LXJhZGlvLWJ1dHRvbi1kaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgW2NsYXNzLnV4LXJhZGlvLWJ1dHRvbi1mb2N1c2VkXT1cIl9mb2N1c2VkXCJcbj5cbiAgICA8ZGl2IGNsYXNzPVwidXgtcmFkaW8tYnV0dG9uLWNvbnRhaW5lclwiPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICNpbnB1dFxuICAgICAgICAgICAgY2xhc3M9XCJ1eC1yYWRpby1idXR0b24taW5wdXRcIlxuICAgICAgICAgICAgdXhGb2N1c0luZGljYXRvclxuICAgICAgICAgICAgdHlwZT1cInJhZGlvXCJcbiAgICAgICAgICAgIFtpZF09XCIoaWQgfHwgX3JhZGlvQnV0dG9uSWQpICsgJy1pbnB1dCdcIlxuICAgICAgICAgICAgW2F0dHIucm9sZV09XCJpbnB1dFJvbGVcIlxuICAgICAgICAgICAgW2NoZWNrZWRdPVwidmFsdWUgPT09IG9wdGlvblwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgW3RhYmluZGV4XT1cInRhYmluZGV4ID8/IF9pbnRlcm5hbFRhYmluZGV4XCJcbiAgICAgICAgICAgIFthdHRyLm5hbWVdPVwibmFtZVwiXG4gICAgICAgICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWxcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImFyaWFMYWJlbGxlZGJ5XCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiYXJpYURlc2NyaWJlZGJ5XCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtY2hlY2tlZF09XCJ2YWx1ZSA9PT0gb3B0aW9uXCJcbiAgICAgICAgICAgIChpbmRpY2F0b3IpPVwiX2ZvY3VzZWQgPSAkZXZlbnRcIlxuICAgICAgICAgICAgKGNoYW5nZSk9XCJzZWxlY3QoKVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgLz5cbiAgICA8L2Rpdj5cblxuICAgIDxzcGFuIGNsYXNzPVwidXgtcmFkaW8tYnV0dG9uLWxhYmVsXCI+XG4gICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8L3NwYW4+XG5cbjwvbGFiZWw+XG4iXX0=