@kushki/ng-suka
Version:
<p align="center"> <h1 align="center">Suka Components Angular</h1> <p align="center"> An Angular implementation of the Suka Design System </p> </p>
374 lines • 25.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
// tslint:disable: variable-name
import { ContentChildren, Component, EventEmitter, forwardRef, Input, Output, QueryList, HostBinding } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { ButtonRadio } from './button-radio.component';
// tslint:disable-next-line: component-class-suffix
export class ButtonRadioGroup {
constructor() {
/**
* Emits event notifying other classes of a change using a `ButtonRadioChange` class.
*/
// tslint:disable-next-line: no-output-native
this.change = new EventEmitter();
/**
* Set to true to disable the whole buttonRadio group
*/
this.disabled = false;
/**
* Binds 'form-item' value to the class for `ButtonRadioGroup`.
*/
this.buttonRadioButtonGroupClass = true;
/**
* To track whether the `ButtonRadioGroup` has been initialized.
*/
this.isInitialized = false;
/**
* Reflects whether or not the input is disabled and cannot be selected.
*/
this._disabled = false;
/**
* Reflects whether or not the dropdown is loading.
*/
this._skeleton = false;
/**
* The value of the selected option within the `ButtonRadioGroup`.
*/
this._value = null;
/**
* The `ButtonRadio` within the `ButtonRadioGroup` that is selected.
*/
this._selected = null;
/**
* The name attribute associated with the `ButtonRadioGroup`.
*/
this._name = `button-radio-group-${ButtonRadioGroup.buttonRadioGroupCount++}`;
/**
* Needed to properly implement ControlValueAccessor.
*/
this.onTouched = (/**
* @return {?}
*/
() => { });
/**
* Method set in registerOnChange to propagate changes back to the form.
*/
this.propagateChange = (/**
* @param {?} _
* @return {?}
*/
(_) => { });
}
/**
* Sets the passed in `ButtonRadio` item as the selected input within the `ButtonRadioGroup`.
* @param {?} selected
* @return {?}
*/
set selected(selected) {
this._selected = selected;
this.value = selected ? selected.value : null;
this.checkSelectedButtonRadio();
}
/**
* Returns the `ButtonRadio` that is selected within the `ButtonRadioGroup`.
* @return {?}
*/
get selected() {
return this._selected;
}
/**
* Sets the value/state of the selected `ButtonRadio` within the `ButtonRadioGroup` to the passed in value.
* @param {?} newValue
* @return {?}
*/
set value(newValue) {
if (this._value !== newValue) {
this._value = newValue;
this.updateSelectedButtonRadioFromValue();
this.checkSelectedButtonRadio();
}
}
/**
* Returns the value/state of the selected `ButtonRadio` within the `ButtonRadioGroup`.
* @return {?}
*/
get value() {
return this._value;
}
/**
* Replaces the name associated with the `ButtonRadioGroup` with the provided parameter.
* @param {?} name
* @return {?}
*/
set name(name) {
this._name = name;
this.updateButtonRadios();
}
/**
* Returns the associated name of the `ButtonRadioGroup`.
* @return {?}
*/
get name() {
return this._name;
}
/**
* Returns the skeleton value in the `ButtonRadioGroup` if there is one.
* @return {?}
*/
get skeleton() {
return this._skeleton;
}
/**
* Sets the skeleton value for all `ButtonRadio` to the skeleton value of `ButtonRadioGroup`.
* @param {?} value
* @return {?}
*/
set skeleton(value) {
this._skeleton = value;
this.updateChildren();
}
/**
* Updates the selected `ButtonRadio` to be checked (selected).
* @return {?}
*/
checkSelectedButtonRadio() {
if (this.selected && !this._selected.checked) {
this.selected.checked = true;
}
}
/**
* Use the value of the `ButtonRadioGroup` to update the selected buttonRadio to the right state (selected state).
* @return {?}
*/
updateSelectedButtonRadioFromValue() {
/** @type {?} */
const alreadySelected = this._selected != null && this._selected.value === this._value;
if (this.buttonRadios && !alreadySelected) {
this._selected = null;
this.buttonRadios.forEach((/**
* @param {?} buttonRadio
* @return {?}
*/
buttonRadio => {
if (buttonRadio.checked) {
this._selected = buttonRadio;
}
}));
}
}
/**
* Creates a class of `ButtonRadioChange` to emit the change in the `ButtonRadioGroup`.
* @param {?} event
* @return {?}
*/
emitChangeEvent(event) {
this.change.emit(event);
this.propagateChange(event.value);
this.onTouched();
}
/**
* Synchronizes buttonRadio properties.
* @return {?}
*/
updateButtonRadios() {
if (this.buttonRadios) {
setTimeout((/**
* @return {?}
*/
() => {
this.buttonRadios.forEach((/**
* @param {?} buttonRadio
* @return {?}
*/
buttonRadio => buttonRadio.name = this.name));
}));
}
}
/**
* Updates the value of the `ButtonRadioGroup` using the provided parameter.
* @param {?} value
* @return {?}
*/
writeValue(value) {
this.value = value;
}
/**
* @return {?}
*/
ngAfterContentInit() {
this.buttonRadios.changes.subscribe((/**
* @return {?}
*/
() => {
this.updateButtonRadios();
this.updateButtonRadioChangeHandler();
}));
this.updateChildren();
this.updateButtonRadioChangeHandler();
}
/**
* @return {?}
*/
ngAfterViewInit() {
this.updateButtonRadios();
}
/**
* Used to set method to propagate changes back to the form.
* @param {?} fn
* @return {?}
*/
registerOnChange(fn) {
this.propagateChange = fn;
}
/**
* Registers a callback to be triggered when the control has been touched.
* @param {?} fn Callback to be triggered when the checkbox is touched.
* @return {?}
*/
registerOnTouched(fn) {
this.onTouched = fn;
}
/**
* @protected
* @return {?}
*/
updateChildren() {
if (this.buttonRadios) {
this.buttonRadios.forEach((/**
* @param {?} child
* @return {?}
*/
child => child.skeleton = this.skeleton));
}
}
/**
* @protected
* @return {?}
*/
updateButtonRadioChangeHandler() {
this.buttonRadios.forEach((/**
* @param {?} buttonRadio
* @return {?}
*/
buttonRadio => {
buttonRadio.registerButtonRadioChangeHandler((/**
* @param {?} event
* @return {?}
*/
(event) => {
// update selected and value from the event
this._selected = event.source;
this._value = event.value;
// bubble the event
this.emitChangeEvent(event);
}));
}));
}
}
ButtonRadioGroup.buttonRadioGroupCount = 0;
ButtonRadioGroup.decorators = [
{ type: Component, args: [{
selector: 'suka-button-radio-group',
template: `
<div
class="button-radio-group"
role="buttonRadiogroup">
<ng-content></ng-content>
</div>
`,
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: ButtonRadioGroup,
multi: true
}
]
}] }
];
ButtonRadioGroup.propDecorators = {
change: [{ type: Output }],
buttonRadios: [{ type: ContentChildren, args: [forwardRef((/**
* @return {?}
*/
() => ButtonRadio)),] }],
selected: [{ type: Input }],
value: [{ type: Input }],
name: [{ type: Input }],
disabled: [{ type: Input }],
skeleton: [{ type: Input }],
buttonRadioButtonGroupClass: [{ type: HostBinding, args: ['class.form-item',] }]
};
if (false) {
/** @type {?} */
ButtonRadioGroup.buttonRadioGroupCount;
/**
* Emits event notifying other classes of a change using a `ButtonRadioChange` class.
* @type {?}
*/
ButtonRadioGroup.prototype.change;
/**
* The `ButtonRadio` input items in the `ButtonRadioGroup`.
* @type {?}
*/
ButtonRadioGroup.prototype.buttonRadios;
/**
* Set to true to disable the whole buttonRadio group
* @type {?}
*/
ButtonRadioGroup.prototype.disabled;
/**
* Binds 'form-item' value to the class for `ButtonRadioGroup`.
* @type {?}
*/
ButtonRadioGroup.prototype.buttonRadioButtonGroupClass;
/**
* To track whether the `ButtonRadioGroup` has been initialized.
* @type {?}
* @protected
*/
ButtonRadioGroup.prototype.isInitialized;
/**
* Reflects whether or not the input is disabled and cannot be selected.
* @type {?}
* @protected
*/
ButtonRadioGroup.prototype._disabled;
/**
* Reflects whether or not the dropdown is loading.
* @type {?}
* @protected
*/
ButtonRadioGroup.prototype._skeleton;
/**
* The value of the selected option within the `ButtonRadioGroup`.
* @type {?}
* @protected
*/
ButtonRadioGroup.prototype._value;
/**
* The `ButtonRadio` within the `ButtonRadioGroup` that is selected.
* @type {?}
* @protected
*/
ButtonRadioGroup.prototype._selected;
/**
* The name attribute associated with the `ButtonRadioGroup`.
* @type {?}
* @protected
*/
ButtonRadioGroup.prototype._name;
/**
* Needed to properly implement ControlValueAccessor.
* @type {?}
*/
ButtonRadioGroup.prototype.onTouched;
/**
* Method set in registerOnChange to propagate changes back to the form.
* @type {?}
*/
ButtonRadioGroup.prototype.propagateChange;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnV0dG9uLXJhZGlvLWdyb3VwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BrdXNoa2kvbmctc3VrYS8iLCJzb3VyY2VzIjpbImxpYi9idXR0b24tcmFkaW8vYnV0dG9uLXJhZGlvLWdyb3VwLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUVBLE9BQU8sRUFFTCxlQUFlLEVBQ2YsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsV0FBVyxFQUVaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBd0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFvQnZELG1EQUFtRDtBQUNuRCxNQUFNLE9BQU8sZ0JBQWdCO0lBbEI3Qjs7Ozs7UUF5QlksV0FBTSxHQUFvQyxJQUFJLFlBQVksRUFBcUIsQ0FBQzs7OztRQThEakYsYUFBUSxHQUFHLEtBQUssQ0FBQzs7OztRQXFCTSxnQ0FBMkIsR0FBRyxJQUFJLENBQUM7Ozs7UUFLekQsa0JBQWEsR0FBRyxLQUFLLENBQUM7Ozs7UUFJdEIsY0FBUyxHQUFHLEtBQUssQ0FBQzs7OztRQUlsQixjQUFTLEdBQUcsS0FBSyxDQUFDOzs7O1FBSWxCLFdBQU0sR0FBUSxJQUFJLENBQUM7Ozs7UUFJbkIsY0FBUyxHQUFnQixJQUFJLENBQUM7Ozs7UUFJOUIsVUFBSyxHQUFHLHNCQUFzQixnQkFBZ0IsQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLENBQUM7Ozs7UUFzRm5GLGNBQVM7OztRQUFjLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBQzs7OztRQUtqQyxvQkFBZTs7OztRQUFHLENBQUMsQ0FBTSxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUM7SUFtQnBDLENBQUM7Ozs7OztJQWhOQyxJQUNJLFFBQVEsQ0FBQyxRQUE0QjtRQUN2QyxJQUFJLENBQUMs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TSxzQ0FBcUIsR0FBRyxDQUFDLENBQUM7O1lBbkJsQyxTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLHlCQUF5QjtnQkFDbkMsUUFBUSxFQUFFOzs7Ozs7R0FNVDtnQkFDRCxTQUFTLEVBQUU7b0JBQ1Q7d0JBQ0UsT0FBTyxFQUFFLGlCQUFpQjt3QkFDMUIsV0FBVyxFQUFFLGdCQUFnQjt3QkFDN0IsS0FBSyxFQUFFLElBQUk7cUJBQ1o7aUJBQ0Y7YUFDRjs7O3FCQVNFLE1BQU07MkJBS04sZUFBZSxTQUFDLFVBQVU7OztnQkFBQyxHQUFHLEVBQUUsQ0FBQyxXQUFXLEVBQUM7dUJBSzdDLEtBQUs7b0JBaUJMLEtBQUs7bUJBb0JMLEtBQUs7dUJBZUwsS0FBSzt1QkFLTCxLQUFLOzBDQWdCTCxXQUFXLFNBQUMsaUJBQWlCOzs7O0lBekY5Qix1Q0FBaUM7Ozs7O0lBTWpDLGtDQUEwRjs7Ozs7SUFLMUYsd0NBQXFGOzs7OztJQXlEckYsb0NBQTBCOzs7OztJQXFCMUIsdURBQW1FOzs7Ozs7SUFLbkUseUNBQWdDOzs7Ozs7SUFJaEMscUNBQTRCOzs7Ozs7SUFJNUIscUNBQTRCOzs7Ozs7SUFJNUIsa0NBQTZCOzs7Ozs7SUFJN0IscUNBQXdDOzs7Ozs7SUFJeEMsaUNBQW1GOzs7OztJQXNGbkYscUNBQWlDOzs7OztJQUtqQywyQ0FBa0MiLCJzb3VyY2VzQ29udGVudCI6WyIvLyB0c2xpbnQ6ZGlzYWJsZTogdmFyaWFibGUtbmFtZVxuXG5pbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIEhvc3RCaW5kaW5nLFxuICBBZnRlclZpZXdJbml0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQnV0dG9uUmFkaW8gfSBmcm9tICcuL2J1dHRvbi1yYWRpby5jb21wb25lbnQnO1xuaW1wb3J0IHsgQnV0dG9uUmFkaW9DaGFuZ2UgfSBmcm9tICcuL2J1dHRvbi1yYWRpby1jaGFuZ2UuY2xhc3MnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzdWthLWJ1dHRvbi1yYWRpby1ncm91cCcsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJidXR0b24tcmFkaW8tZ3JvdXBcIlxuICAgICAgcm9sZT1cImJ1dHRvblJhZGlvZ3JvdXBcIj5cbiAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogQnV0dG9uUmFkaW9Hcm91cCxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdXG59KVxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBjb21wb25lbnQtY2xhc3Mtc3VmZml4XG5leHBvcnQgY2xhc3MgQnV0dG9uUmFkaW9Hcm91cCBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgc3RhdGljIGJ1dHRvblJhZGlvR3JvdXBDb3VudCA9IDA7XG5cbiAgLyoqXG4gICAqIEVtaXRzIGV2ZW50IG5vdGlmeWluZyBvdGhlciBjbGFzc2VzIG9mIGEgY2hhbmdlIHVzaW5nIGEgYEJ1dHRvblJhZGlvQ2hhbmdlYCBjbGFzcy5cbiAgICovXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tb3V0cHV0LW5hdGl2ZVxuICBAT3V0cHV0KCkgY2hhbmdlOiBFdmVudEVtaXR0ZXI8QnV0dG9uUmFkaW9DaGFuZ2U+ID0gbmV3IEV2ZW50RW1pdHRlcjxCdXR0b25SYWRpb0NoYW5nZT4oKTtcblxuICAvKipcbiAgICogVGhlIGBCdXR0b25SYWRpb2AgaW5wdXQgaXRlbXMgaW4gdGhlIGBCdXR0b25SYWRpb0dyb3VwYC5cbiAgICovXG4gIEBDb250ZW50Q2hpbGRyZW4oZm9yd2FyZFJlZigoKSA9PiBCdXR0b25SYWRpbykpIGJ1dHRvblJhZGlvczogUXVlcnlMaXN0PEJ1dHRvblJhZGlvPjtcblxuICAvKipcbiAgICogU2V0cyB0aGUgcGFzc2VkIGluIGBCdXR0b25SYWRpb2AgaXRlbSBhcyB0aGUgc2VsZWN0ZWQgaW5wdXQgd2l0aGluIHRoZSBgQnV0dG9uUmFkaW9Hcm91cGAuXG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgc2VsZWN0ZWQoc2VsZWN0ZWQ6IEJ1dHRvblJhZGlvIHwgbnVsbCkge1xuICAgIHRoaXMuX3NlbGVjdGVkID0gc2VsZWN0ZWQ7XG4gICAgdGhpcy52YWx1ZSA9IHNlbGVjdGVkID8gc2VsZWN0ZWQudmFsdWUgOiBudWxsO1xuICAgIHRoaXMuY2hlY2tTZWxlY3RlZEJ1dHRvblJhZGlvKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgYEJ1dHRvblJhZGlvYCB0aGF0IGlzIHNlbGVjdGVkIHdpdGhpbiB0aGUgYEJ1dHRvblJhZGlvR3JvdXBgLlxuICAgKi9cbiAgZ2V0IHNlbGVjdGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZS9zdGF0ZSBvZiB0aGUgc2VsZWN0ZWQgYEJ1dHRvblJhZGlvYCB3aXRoaW4gdGhlIGBCdXR0b25SYWRpb0dyb3VwYCB0byB0aGUgcGFzc2VkIGluIHZhbHVlLlxuICAgKi9cbiAgQElucHV0KClcbiAgc2V0IHZhbHVlKG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBpZiAodGhpcy5fdmFsdWUgIT09IG5ld1ZhbHVlKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IG5ld1ZhbHVlO1xuXG4gICAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkQnV0dG9uUmFkaW9Gcm9tVmFsdWUoKTtcbiAgICAgIHRoaXMuY2hlY2tTZWxlY3RlZEJ1dHRvblJhZGlvKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHZhbHVlL3N0YXRlIG9mIHRoZSBzZWxlY3RlZCBgQnV0dG9uUmFkaW9gIHdpdGhpbiB0aGUgYEJ1dHRvblJhZGlvR3JvdXBgLlxuICAgKi9cbiAgZ2V0IHZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyB0aGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIGBCdXR0b25SYWRpb0dyb3VwYCB3aXRoIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXIuXG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgbmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9uYW1lID0gbmFtZTtcbiAgICB0aGlzLnVwZGF0ZUJ1dHRvblJhZGlvcygpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBhc3NvY2lhdGVkIG5hbWUgb2YgdGhlIGBCdXR0b25SYWRpb0dyb3VwYC5cbiAgICovXG4gIGdldCBuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0byB0cnVlIHRvIGRpc2FibGUgdGhlIHdob2xlIGJ1dHRvblJhZGlvIGdyb3VwXG4gICAqL1xuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBza2VsZXRvbiB2YWx1ZSBpbiB0aGUgYEJ1dHRvblJhZGlvR3JvdXBgIGlmIHRoZXJlIGlzIG9uZS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBza2VsZXRvbigpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9za2VsZXRvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBza2VsZXRvbiB2YWx1ZSBmb3IgYWxsIGBCdXR0b25SYWRpb2AgdG8gdGhlIHNrZWxldG9uIHZhbHVlIG9mIGBCdXR0b25SYWRpb0dyb3VwYC5cbiAgICovXG4gIHNldCBza2VsZXRvbih2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5fc2tlbGV0b24gPSB2YWx1ZTtcbiAgICB0aGlzLnVwZGF0ZUNoaWxkcmVuKCk7XG4gIH1cblxuICAvKipcbiAgICogQmluZHMgJ2Zvcm0taXRlbScgdmFsdWUgdG8gdGhlIGNsYXNzIGZvciBgQnV0dG9uUmFkaW9Hcm91cGAuXG4gICAqL1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmZvcm0taXRlbScpIGJ1dHRvblJhZGlvQnV0dG9uR3JvdXBDbGFzcyA9IHRydWU7XG5cbiAgLyoqXG4gICAqIFRvIHRyYWNrIHdoZXRoZXIgdGhlIGBCdXR0b25SYWRpb0dyb3VwYCBoYXMgYmVlbiBpbml0aWFsaXplZC5cbiAgICovXG4gIHByb3RlY3RlZCBpc0luaXRpYWxpemVkID0gZmFsc2U7XG4gIC8qKlxuICAgKiBSZWZsZWN0cyB3aGV0aGVyIG9yIG5vdCB0aGUgaW5wdXQgaXMgZGlzYWJsZWQgYW5kIGNhbm5vdCBiZSBzZWxlY3RlZC5cbiAgICovXG4gIHByb3RlY3RlZCBfZGlzYWJsZWQgPSBmYWxzZTtcbiAgLyoqXG4gICAqIFJlZmxlY3RzIHdoZXRoZXIgb3Igbm90IHRoZSBkcm9wZG93biBpcyBsb2FkaW5nLlxuICAgKi9cbiAgcHJvdGVjdGVkIF9za2VsZXRvbiA9IGZhbHNlO1xuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIHRoZSBzZWxlY3RlZCBvcHRpb24gd2l0aGluIHRoZSBgQnV0dG9uUmFkaW9Hcm91cGAuXG4gICAqL1xuICBwcm90ZWN0ZWQgX3ZhbHVlOiBhbnkgPSBudWxsO1xuICAvKipcbiAgICogVGhlIGBCdXR0b25SYWRpb2Agd2l0aGluIHRoZSBgQnV0dG9uUmFkaW9Hcm91cGAgdGhhdCBpcyBzZWxlY3RlZC5cbiAgICovXG4gIHByb3RlY3RlZCBfc2VsZWN0ZWQ6IEJ1dHRvblJhZGlvID0gbnVsbDtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIGF0dHJpYnV0ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGBCdXR0b25SYWRpb0dyb3VwYC5cbiAgICovXG4gIHByb3RlY3RlZCBfbmFtZSA9IGBidXR0b24tcmFkaW8tZ3JvdXAtJHtCdXR0b25SYWRpb0dyb3VwLmJ1dHRvblJhZGlvR3JvdXBDb3VudCsrfWA7XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIHNlbGVjdGVkIGBCdXR0b25SYWRpb2AgdG8gYmUgY2hlY2tlZCAoc2VsZWN0ZWQpLlxuICAgKi9cbiAgY2hlY2tTZWxlY3RlZEJ1dHRvblJhZGlvKCkge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkICYmICF0aGlzLl9zZWxlY3RlZC5jaGVja2VkKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkLmNoZWNrZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVc2UgdGhlIHZhbHVlIG9mIHRoZSBgQnV0dG9uUmFkaW9Hcm91cGAgdG8gdXBkYXRlIHRoZSBzZWxlY3RlZCBidXR0b25SYWRpbyB0byB0aGUgcmlnaHQgc3RhdGUgKHNlbGVjdGVkIHN0YXRlKS5cbiAgICovXG4gIHVwZGF0ZVNlbGVjdGVkQnV0dG9uUmFkaW9Gcm9tVmFsdWUoKSB7XG4gICAgY29uc3QgYWxyZWFkeVNlbGVjdGVkID0gdGhpcy5fc2VsZWN0ZWQgIT0gbnVsbCAmJiB0aGlzLl9zZWxlY3RlZC52YWx1ZSA9PT0gdGhpcy5fdmFsdWU7XG5cbiAgICBpZiAodGhpcy5idXR0b25SYWRpb3MgJiYgIWFscmVhZHlTZWxlY3RlZCkge1xuICAgICAgdGhpcy5fc2VsZWN0ZWQgPSBudWxsO1xuICAgICAgdGhpcy5idXR0b25SYWRpb3MuZm9yRWFjaChidXR0b25SYWRpbyA9PiB7XG4gICAgICAgIGlmIChidXR0b25SYWRpby5jaGVja2VkKSB7XG4gICAgICAgICAgdGhpcy5fc2VsZWN0ZWQgPSBidXR0b25SYWRpbztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBjbGFzcyBvZiBgQnV0dG9uUmFkaW9DaGFuZ2VgIHRvIGVtaXQgdGhlIGNoYW5nZSBpbiB0aGUgYEJ1dHRvblJhZGlvR3JvdXBgLlxuICAgKi9cbiAgZW1pdENoYW5nZUV2ZW50KGV2ZW50OiBCdXR0b25SYWRpb0NoYW5nZSkge1xuICAgIHRoaXMuY2hhbmdlLmVtaXQoZXZlbnQpO1xuICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKGV2ZW50LnZhbHVlKTtcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN5bmNocm9uaXplcyBidXR0b25SYWRpbyBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgdXBkYXRlQnV0dG9uUmFkaW9zKCkge1xuICAgIGlmICh0aGlzLmJ1dHRvblJhZGlvcykge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuYnV0dG9uUmFkaW9zLmZvckVhY2goYnV0dG9uUmFkaW8gPT4gYnV0dG9uUmFkaW8ubmFtZSA9IHRoaXMubmFtZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgdmFsdWUgb2YgdGhlIGBCdXR0b25SYWRpb0dyb3VwYCB1c2luZyB0aGUgcHJvdmlkZWQgcGFyYW1ldGVyLlxuICAgKi9cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIHRoaXMuYnV0dG9uUmFkaW9zLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlQnV0dG9uUmFkaW9zKCk7XG4gICAgICB0aGlzLnVwZGF0ZUJ1dHRvblJhZGlvQ2hhbmdlSGFuZGxlcigpO1xuICAgIH0pO1xuXG4gICAgdGhpcy51cGRhdGVDaGlsZHJlbigpO1xuICAgIHRoaXMudXBkYXRlQnV0dG9uUmFkaW9DaGFuZ2VIYW5kbGVyKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy51cGRhdGVCdXR0b25SYWRpb3MoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIHRvIHNldCBtZXRob2QgdG8gcHJvcGFnYXRlIGNoYW5nZXMgYmFjayB0byB0aGUgZm9ybS5cbiAgICovXG4gIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpIHtcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSA9IGZuO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRvIGJlIHRyaWdnZXJlZCB3aGVuIHRoZSBjb250cm9sIGhhcyBiZWVuIHRvdWNoZWQuXG4gICAqIEBwYXJhbSBmbiBDYWxsYmFjayB0byBiZSB0cmlnZ2VyZWQgd2hlbiB0aGUgY2hlY2tib3ggaXMgdG91Y2hlZC5cbiAgICovXG4gIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KSB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBOZWVkZWQgdG8gcHJvcGVybHkgaW1wbGVtZW50IENvbnRyb2xWYWx1ZUFjY2Vzc29yLlxuICAgKi9cbiAgb25Ub3VjaGVkOiAoKSA9PiBhbnkgPSAoKSA9PiB7IH07XG5cbiAgLyoqXG4gICAqIE1ldGhvZCBzZXQgaW4gcmVnaXN0ZXJPbkNoYW5nZSB0byBwcm9wYWdhdGUgY2hhbmdlcyBiYWNrIHRvIHRoZSBmb3JtLlxuICAgKi9cbiAgcHJvcGFnYXRlQ2hhbmdlID0gKF86IGFueSkgPT4geyB9O1xuXG4gIHByb3RlY3RlZCB1cGRhdGVDaGlsZHJlbigpIHtcbiAgICBpZiAodGhpcy5idXR0b25SYWRpb3MpIHtcbiAgICAgIHRoaXMuYnV0dG9uUmFkaW9zLmZvckVhY2goY2hpbGQgPT4gY2hpbGQuc2tlbGV0b24gPSB0aGlzLnNrZWxldG9uKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgdXBkYXRlQnV0dG9uUmFkaW9DaGFuZ2VIYW5kbGVyKCkge1xuICAgIHRoaXMuYnV0dG9uUmFkaW9zLmZvckVhY2goYnV0dG9uUmFkaW8gPT4ge1xuICAgICAgYnV0dG9uUmFkaW8ucmVnaXN0ZXJCdXR0b25SYWRpb0NoYW5nZUhhbmRsZXIoKGV2ZW50OiBCdXR0b25SYWRpb0NoYW5nZSkgPT4ge1xuICAgICAgICAvLyB1cGRhdGUgc2VsZWN0ZWQgYW5kIHZhbHVlIGZyb20gdGhlIGV2ZW50XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkID0gZXZlbnQuc291cmNlO1xuICAgICAgICB0aGlzLl92YWx1ZSA9IGV2ZW50LnZhbHVlO1xuICAgICAgICAvLyBidWJibGUgdGhlIGV2ZW50XG4gICAgICAgIHRoaXMuZW1pdENoYW5nZUV2ZW50KGV2ZW50KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG4iXX0=