@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>
291 lines • 20.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
// tslint:disable: max-line-length
import { Component, Input, Output, ViewChild, ElementRef, HostListener, EventEmitter, TemplateRef, } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
var Select = /** @class */ (function () {
function Select() {
this._value = '';
/**
* `inline` or `default` select displays
*/
this.display = 'default';
/**
* Sets the unique ID. Defaults to `select-${total count of selects instantiated}`
*/
this.id = "select-" + Select.selectCount++;
/**
* Set to true to disable component.
*/
this.disabled = false;
/**
* Set to true for a loading select.
*/
this.skeleton = false;
/**
* Set to `true` for an invalid select component.
*/
this.invalid = false;
/**
* Set to `true` for an valid select component.
*/
this.valid = false;
/**
* emits the selected options `value`
*/
this.selected = new EventEmitter();
/**
* placeholder declarations. Replaced by the functions provided to `registerOnChange` and `registerOnTouched`
*/
this.onChangeHandler = (/**
* @param {?} _
* @return {?}
*/
function (_) { });
this.onTouchedHandler = (/**
* @return {?}
*/
function () { });
}
Object.defineProperty(Select.prototype, "value", {
get: /**
* @return {?}
*/
function () {
// return this.select.nativeElement.value;
return this._value;
},
set: /**
* @param {?} v
* @return {?}
*/
function (v) {
this._value = v;
},
enumerable: true,
configurable: true
});
/**
* Receives a value from the model.
*/
/**
* Receives a value from the model.
* @param {?} obj
* @return {?}
*/
Select.prototype.writeValue = /**
* Receives a value from the model.
* @param {?} obj
* @return {?}
*/
function (obj) {
this.value = obj;
};
/**
* Registers a listener that notifies the model when the control updates
*/
/**
* Registers a listener that notifies the model when the control updates
* @param {?} fn
* @return {?}
*/
Select.prototype.registerOnChange = /**
* Registers a listener that notifies the model when the control updates
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onChangeHandler = fn;
};
/**
* Registers a listener that notifies the model when the control is blurred
*/
/**
* Registers a listener that notifies the model when the control is blurred
* @param {?} fn
* @return {?}
*/
Select.prototype.registerOnTouched = /**
* Registers a listener that notifies the model when the control is blurred
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onTouchedHandler = fn;
};
/**
* Sets the disabled state through the model
*/
/**
* Sets the disabled state through the model
* @param {?} isDisabled
* @return {?}
*/
Select.prototype.setDisabledState = /**
* Sets the disabled state through the model
* @param {?} isDisabled
* @return {?}
*/
function (isDisabled) {
this.disabled = isDisabled;
};
/**
* Handles the change event from the `select`.
* Sends events to the change handler and emits a `selected` event.
*/
/**
* Handles the change event from the `select`.
* Sends events to the change handler and emits a `selected` event.
* @param {?} event
* @return {?}
*/
Select.prototype.onChange = /**
* Handles the change event from the `select`.
* Sends events to the change handler and emits a `selected` event.
* @param {?} event
* @return {?}
*/
function (event) {
this.onChangeHandler(event.target.value);
this.selected.emit(event.target.value);
};
/**
* Listens for the host blurring, and notifies the model
*/
/**
* Listens for the host blurring, and notifies the model
* @param {?} target
* @return {?}
*/
Select.prototype.onBlur = /**
* Listens for the host blurring, and notifies the model
* @param {?} target
* @return {?}
*/
function (target) {
this.onTouchedHandler();
};
/**
* @param {?} value
* @return {?}
*/
Select.prototype.isTemplate = /**
* @param {?} value
* @return {?}
*/
function (value) {
return value instanceof TemplateRef;
};
/**
* Tracks the total number of selects instantiated. Used to generate unique IDs
*/
Select.selectCount = 0;
Select.decorators = [
{ type: Component, args: [{
selector: 'suka-select',
template: "\n <div class=\"form-item\">\n <div\n [ngClass]=\"{\n 'select--inline': display === 'inline',\n 'skeleton': skeleton\n }\"\n class=\"select\"\n >\n <label *ngIf=\"skeleton && label\" [for]=\"id\" class=\"label skeleton\"></label>\n <label *ngIf=\"!skeleton && label\" [for]=\"id\" class=\"label\">\n <ng-container *ngIf=\"!isTemplate(label)\">{{label}}</ng-container>\n <ng-template *ngIf=\"isTemplate(label)\" [ngTemplateOutlet]=\"label\"></ng-template>\n </label>\n <div *ngIf=\"helperText\" class=\"form__helper-text\">\n <ng-container *ngIf=\"!isTemplate(helperText)\">{{helperText}}</ng-container>\n <ng-template *ngIf=\"isTemplate(helperText)\" [ngTemplateOutlet]=\"helperText\"></ng-template>\n </div>\n <div class=\"select-input__wrapper\" [attr.data-invalid]=\"(invalid ? true : null)\" [attr.data-valid]=\"(valid ? true : null)\">\n <select\n #select\n [attr.id]=\"id\"\n [disabled]=\"disabled\"\n (change)=\"onChange($event)\"\n [value]=\"value\"\n (blur)=\"onBlur($event)\"\n class=\"select-input\">\n <ng-content></ng-content>\n </select>\n <suka-icon *ngIf=\"invalid\" icon=\"alert-circle\" class=\"select__invalid-icon\"></suka-icon>\n <suka-icon *ngIf=\"valid\" icon=\"check\" class=\"select__valid-icon\"></suka-icon>\n <suka-icon *ngIf=\"!skeleton\" class=\"select__arrow\" icon=\"chevron-down\"></suka-icon>\n </div>\n <div *ngIf=\"invalid\" class=\"form-requirement\">\n <ng-container *ngIf=\"!isTemplate(invalidText)\">{{invalidText}}</ng-container>\n <ng-template *ngIf=\"isTemplate(invalidText)\" [ngTemplateOutlet]=\"invalidText\"></ng-template>\n </div>\n </div>\n </div>\n ",
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: Select,
multi: true
}
],
styles: ["\n [data-invalid] ~ .select__arrow {\n bottom: 2.25rem;\n }\n "]
}] }
];
Select.propDecorators = {
display: [{ type: Input }],
label: [{ type: Input }],
helperText: [{ type: Input }],
invalidText: [{ type: Input }],
id: [{ type: Input }],
disabled: [{ type: Input }],
skeleton: [{ type: Input }],
invalid: [{ type: Input }],
valid: [{ type: Input }],
selected: [{ type: Output }],
select: [{ type: ViewChild, args: ['select', { static: false },] }],
onBlur: [{ type: HostListener, args: ['blur', ['$event.target'],] }]
};
return Select;
}());
export { Select };
if (false) {
/**
* Tracks the total number of selects instantiated. Used to generate unique IDs
* @type {?}
*/
Select.selectCount;
/**
* @type {?}
* @private
*/
Select.prototype._value;
/**
* `inline` or `default` select displays
* @type {?}
*/
Select.prototype.display;
/**
* Label for the select. Appears above the input.
* @type {?}
*/
Select.prototype.label;
/**
* Optional helper text that appears under the label.
* @type {?}
*/
Select.prototype.helperText;
/**
* Sets the invalid text.
* @type {?}
*/
Select.prototype.invalidText;
/**
* Sets the unique ID. Defaults to `select-${total count of selects instantiated}`
* @type {?}
*/
Select.prototype.id;
/**
* Set to true to disable component.
* @type {?}
*/
Select.prototype.disabled;
/**
* Set to true for a loading select.
* @type {?}
*/
Select.prototype.skeleton;
/**
* Set to `true` for an invalid select component.
* @type {?}
*/
Select.prototype.invalid;
/**
* Set to `true` for an valid select component.
* @type {?}
*/
Select.prototype.valid;
/**
* emits the selected options `value`
* @type {?}
*/
Select.prototype.selected;
/** @type {?} */
Select.prototype.select;
/**
* placeholder declarations. Replaced by the functions provided to `registerOnChange` and `registerOnTouched`
* @type {?}
* @protected
*/
Select.prototype.onChangeHandler;
/**
* @type {?}
* @protected
*/
Select.prototype.onTouchedHandler;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BrdXNoa2kvbmctc3VrYS8iLCJzb3VyY2VzIjpbImxpYi9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUVBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixZQUFZLEVBQ1osV0FBVyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6RTtJQUFBO1FBOERVLFdBQU0sR0FBRyxFQUFFLENBQUM7Ozs7UUFLWCxZQUFPLEdBQXlCLFNBQVMsQ0FBQzs7OztRQWdCMUMsT0FBRSxHQUFHLFlBQVUsTUFBTSxDQUFDLFdBQVcsRUFBSSxDQUFDOzs7O1FBSXRDLGFBQVEsR0FBRyxLQUFLLENBQUM7Ozs7UUFJakIsYUFBUSxHQUFHLEtBQUssQ0FBQzs7OztRQUlqQixZQUFPLEdBQUcsS0FBSyxDQUFDOzs7O1FBS2hCLFVBQUssR0FBRyxLQUFLLENBQUM7Ozs7UUFLYixhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQzs7OztRQWlFOUIsb0JBQWU7Ozs7UUFBRyxVQUFDLENBQU0sSUFBTyxDQUFDLEVBQUM7UUFDbEMscUJBQWdCOzs7UUFBRyxjQUFRLENBQUMsRUFBQztJQUN6QyxDQUFDO0lBL0RDLHNCQUFJLHlCQUFLOzs7O1FBQVQ7WUFDRSwwQ0FBMEM7WUFDMUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3JCLENBQUM7Ozs7O1FBRUQsVUFBVSxDQUFDO1lBQ1QsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDbEIsQ0FBQzs7O09BSkE7SUFNRDs7T0FFRzs7Ozs7O0lBQ0gsMkJBQVU7Ozs7O0lBQVYsVUFBVyxHQUFRO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO0lBQ25CLENBQUM7SUFFRDs7T0FFRzs7Ozs7O0lBQ0gsaUNBQWdCOzs7OztJQUFoQixVQUFpQixFQUFPO1FBQ3RCLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRDs7T0FFRzs7Ozs7O0lBQ0gsa0NBQWlCOzs7OztJQUFqQixVQUFrQixFQUFPO1FBQ3ZCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVEOztPQUVHOzs7Ozs7SUFDSCxpQ0FBZ0I7Ozs7O0lBQWhCLFVBQWlCLFVBQW1CO1FBQ2xDLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO0lBQzdCLENBQUM7SUFFRDs7O09BR0c7Ozs7Ozs7SUFDSCx5QkFBUTs7Ozs7O0lBQVIsVUFBUyxLQUFLO1FBQ1osSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOztPQUVHOzs7Ozs7SUFFSCx1QkFBTTs7Ozs7SUFETixVQUNPLE1BQU07UUFDWCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUMxQixDQUFDOzs7OztJQUVNLDJCQUFVOzs7O0lBQWpCLFVBQWtCLEtBQUs7UUFDckIsT0FBTyxLQUFLLFlBQVksV0FBVyxDQUFDO0lBQ3RDLENBQUM7Ozs7SUF6R00sa0JBQVcsR0FBRyxDQUFDLENBQUM7O2dCQTVEeEIsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSxhQUFhO29CQUN2QixRQUFRLEVBQUUsdzNEQXVDVDtvQkFNRCxTQUFTLEVBQUU7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLE1BQU07NEJBQ25CLEtBQUssRUFBRSxJQUFJO3lCQUNaO3FCQUNGOzZCQVhRLDRFQUlSO2lCQVFGOzs7MEJBYUUsS0FBSzt3QkFJTCxLQUFLOzZCQUlMLEtBQUs7OEJBSUwsS0FBSztxQkFJTCxLQUFLOzJCQUlMLEtBQUs7MkJBSUwsS0FBSzswQkFJTCxLQUFLO3dCQUtMLEtBQUs7MkJBS0wsTUFBTTt5QkFFTixTQUFTLFNBQUMsUUFBUSxFQUFFLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBQzt5QkFtRG5DLFlBQVksU0FBQyxNQUFNLEVBQUUsQ0FBQyxlQUFlLENBQUM7O0lBY3pDLGFBQUM7Q0FBQSxBQTVLRCxJQTRLQztTQXBIWSxNQUFNOzs7Ozs7SUFJakIsbUJBQXVCOzs7OztJQUV2Qix3QkFBb0I7Ozs7O0lBS3BCLHlCQUFtRDs7Ozs7SUFJbkQsdUJBQTBDOzs7OztJQUkxQyw0QkFBK0M7Ozs7O0lBSS9DLDZCQUFnRDs7Ozs7SUFJaEQsb0JBQStDOzs7OztJQUkvQywwQkFBMEI7Ozs7O0lBSTFCLDBCQUEwQjs7Ozs7SUFJMUIseUJBQXlCOzs7OztJQUt6Qix1QkFBdUI7Ozs7O0lBS3ZCLDBCQUF3Qzs7SUFFeEMsd0JBQXlEOzs7Ozs7SUErRHpELGlDQUE0Qzs7Ozs7SUFDNUMsa0NBQXVDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gdHNsaW50OmRpc2FibGU6IG1heC1saW5lLWxlbmd0aFxuXG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgSG9zdExpc3RlbmVyLFxuICBFdmVudEVtaXR0ZXIsXG4gIFRlbXBsYXRlUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3VrYS1zZWxlY3QnLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJmb3JtLWl0ZW1cIj5cbiAgICAgIDxkaXZcbiAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICdzZWxlY3QtLWlubGluZSc6IGRpc3BsYXkgPT09ICdpbmxpbmUnLFxuICAgICAgICAgICdza2VsZXRvbic6IHNrZWxldG9uXG4gICAgICAgIH1cIlxuICAgICAgICBjbGFzcz1cInNlbGVjdFwiXG4gICAgICA+XG4gICAgICAgIDxsYWJlbCAqbmdJZj1cInNrZWxldG9uICYmIGxhYmVsXCIgW2Zvcl09XCJpZFwiIGNsYXNzPVwibGFiZWwgc2tlbGV0b25cIj48L2xhYmVsPlxuICAgICAgICA8bGFiZWwgKm5nSWY9XCIhc2tlbGV0b24gJiYgbGFiZWxcIiBbZm9yXT1cImlkXCIgY2xhc3M9XCJsYWJlbFwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNUZW1wbGF0ZShsYWJlbClcIj57e2xhYmVsfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgKm5nSWY9XCJpc1RlbXBsYXRlKGxhYmVsKVwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxhYmVsXCI+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGRpdiAqbmdJZj1cImhlbHBlclRleHRcIiBjbGFzcz1cImZvcm1fX2hlbHBlci10ZXh0XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1RlbXBsYXRlKGhlbHBlclRleHQpXCI+e3toZWxwZXJUZXh0fX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgKm5nSWY9XCJpc1RlbXBsYXRlKGhlbHBlclRleHQpXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiaGVscGVyVGV4dFwiPjwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0LWlucHV0X193cmFwcGVyXCIgW2F0dHIuZGF0YS1pbnZhbGlkXT1cIihpbnZhbGlkID8gdHJ1ZSA6IG51bGwpXCIgW2F0dHIuZGF0YS12YWxpZF09XCIodmFsaWQgPyB0cnVlIDogbnVsbClcIj5cbiAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAjc2VsZWN0XG4gICAgICAgICAgICBbYXR0ci5pZF09XCJpZFwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJ2YWx1ZVwiXG4gICAgICAgICAgICAoYmx1cik9XCJvbkJsdXIoJGV2ZW50KVwiXG4gICAgICAgICAgICBjbGFzcz1cInNlbGVjdC1pbnB1dFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDxzdWthLWljb24gKm5nSWY9XCJpbnZhbGlkXCIgaWNvbj1cImFsZXJ0LWNpcmNsZVwiIGNsYXNzPVwic2VsZWN0X19pbnZhbGlkLWljb25cIj48L3N1a2EtaWNvbj5cbiAgICAgICAgICA8c3VrYS1pY29uICpuZ0lmPVwidmFsaWRcIiBpY29uPVwiY2hlY2tcIiBjbGFzcz1cInNlbGVjdF9fdmFsaWQtaWNvblwiPjwvc3VrYS1pY29uPlxuICAgICAgICAgIDxzdWthLWljb24gKm5nSWY9XCIhc2tlbGV0b25cIiBjbGFzcz1cInNlbGVjdF9fYXJyb3dcIiBpY29uPVwiY2hldnJvbi1kb3duXCI+PC9zdWthLWljb24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiaW52YWxpZFwiIGNsYXNzPVwiZm9ybS1yZXF1aXJlbWVudFwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNUZW1wbGF0ZShpbnZhbGlkVGV4dClcIj57e2ludmFsaWRUZXh0fX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgKm5nSWY9XCJpc1RlbXBsYXRlKGludmFsaWRUZXh0KVwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImludmFsaWRUZXh0XCI+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBbYFxuICAgIFtkYXRhLWludmFsaWRdIH4gLnNlbGVjdF9fYXJyb3cge1xuICAgICAgYm90dG9tOiAyLjI1cmVtO1xuICAgIH1cbiAgYF0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IFNlbGVjdCxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdXG59KVxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBjb21wb25lbnQtY2xhc3Mtc3VmZml4XG5leHBvcnQgY2xhc3MgU2VsZWN0IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICAvKipcbiAgICogVHJhY2tzIHRoZSB0b3RhbCBudW1iZXIgb2Ygc2VsZWN0cyBpbnN0YW50aWF0ZWQuIFVzZWQgdG8gZ2VuZXJhdGUgdW5pcXVlIElEc1xuICAgKi9cbiAgc3RhdGljIHNlbGVjdENvdW50ID0gMDtcblxuICBwcml2YXRlIF92YWx1ZSA9ICcnO1xuXG4gIC8qKlxuICAgKiBgaW5saW5lYCBvciBgZGVmYXVsdGAgc2VsZWN0IGRpc3BsYXlzXG4gICAqL1xuICBASW5wdXQoKSBkaXNwbGF5OiAnaW5saW5lJyB8ICdkZWZhdWx0JyA9ICdkZWZhdWx0JztcbiAgLyoqXG4gICAqIExhYmVsIGZvciB0aGUgc2VsZWN0LiBBcHBlYXJzIGFib3ZlIHRoZSBpbnB1dC5cbiAgICovXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+O1xuICAvKipcbiAgICogT3B0aW9uYWwgaGVscGVyIHRleHQgdGhhdCBhcHBlYXJzIHVuZGVyIHRoZSBsYWJlbC5cbiAgICovXG4gIEBJbnB1dCgpIGhlbHBlclRleHQ6IHN0cmluZyB8IFRlbXBsYXRlUmVmPGFueT47XG4gIC8qKlxuICAgKiBTZXRzIHRoZSBpbnZhbGlkIHRleHQuXG4gICAqL1xuICBASW5wdXQoKSBpbnZhbGlkVGV4dDogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55PjtcbiAgLyoqXG4gICAqIFNldHMgdGhlIHVuaXF1ZSBJRC4gRGVmYXVsdHMgdG8gYHNlbGVjdC0ke3RvdGFsIGNvdW50IG9mIHNlbGVjdHMgaW5zdGFudGlhdGVkfWBcbiAgICovXG4gIEBJbnB1dCgpIGlkID0gYHNlbGVjdC0ke1NlbGVjdC5zZWxlY3RDb3VudCsrfWA7XG4gIC8qKlxuICAgKiBTZXQgdG8gdHJ1ZSB0byBkaXNhYmxlIGNvbXBvbmVudC5cbiAgICovXG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gIC8qKlxuICAgKiBTZXQgdG8gdHJ1ZSBmb3IgYSBsb2FkaW5nIHNlbGVjdC5cbiAgICovXG4gIEBJbnB1dCgpIHNrZWxldG9uID0gZmFsc2U7XG4gIC8qKlxuICAgKiBTZXQgdG8gYHRydWVgIGZvciBhbiBpbnZhbGlkIHNlbGVjdCBjb21wb25lbnQuXG4gICAqL1xuICBASW5wdXQoKSBpbnZhbGlkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFNldCB0byBgdHJ1ZWAgZm9yIGFuIHZhbGlkIHNlbGVjdCBjb21wb25lbnQuXG4gICAqL1xuICBASW5wdXQoKSB2YWxpZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBlbWl0cyB0aGUgc2VsZWN0ZWQgb3B0aW9ucyBgdmFsdWVgXG4gICAqL1xuICBAT3V0cHV0KCkgc2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQFZpZXdDaGlsZCgnc2VsZWN0Jywge3N0YXRpYzogZmFsc2V9KSBzZWxlY3Q6IEVsZW1lbnRSZWY7XG5cbiAgZ2V0IHZhbHVlKCkge1xuICAgIC8vIHJldHVybiB0aGlzLnNlbGVjdC5uYXRpdmVFbGVtZW50LnZhbHVlO1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIHNldCB2YWx1ZSh2KSB7XG4gICAgdGhpcy5fdmFsdWUgPSB2O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY2VpdmVzIGEgdmFsdWUgZnJvbSB0aGUgbW9kZWwuXG4gICAqL1xuICB3cml0ZVZhbHVlKG9iajogYW55KSB7XG4gICAgdGhpcy52YWx1ZSA9IG9iajtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBsaXN0ZW5lciB0aGF0IG5vdGlmaWVzIHRoZSBtb2RlbCB3aGVuIHRoZSBjb250cm9sIHVwZGF0ZXNcbiAgICovXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSkge1xuICAgIHRoaXMub25DaGFuZ2VIYW5kbGVyID0gZm47XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgbGlzdGVuZXIgdGhhdCBub3RpZmllcyB0aGUgbW9kZWwgd2hlbiB0aGUgY29udHJvbCBpcyBibHVycmVkXG4gICAqL1xuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KSB7XG4gICAgdGhpcy5vblRvdWNoZWRIYW5kbGVyID0gZm47XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZGlzYWJsZWQgc3RhdGUgdGhyb3VnaCB0aGUgbW9kZWxcbiAgICovXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbikge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgdGhlIGNoYW5nZSBldmVudCBmcm9tIHRoZSBgc2VsZWN0YC5cbiAgICogU2VuZHMgZXZlbnRzIHRvIHRoZSBjaGFuZ2UgaGFuZGxlciBhbmQgZW1pdHMgYSBgc2VsZWN0ZWRgIGV2ZW50LlxuICAgKi9cbiAgb25DaGFuZ2UoZXZlbnQpIHtcbiAgICB0aGlzLm9uQ2hhbmdlSGFuZGxlcihldmVudC50YXJnZXQudmFsdWUpO1xuICAgIHRoaXMuc2VsZWN0ZWQuZW1pdChldmVudC50YXJnZXQudmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RlbnMgZm9yIHRoZSBob3N0IGJsdXJyaW5nLCBhbmQgbm90aWZpZXMgdGhlIG1vZGVsXG4gICAqL1xuICBASG9zdExpc3RlbmVyKCdibHVyJywgWyckZXZlbnQudGFyZ2V0J10pXG4gIG9uQmx1cih0YXJnZXQpIHtcbiAgICB0aGlzLm9uVG91Y2hlZEhhbmRsZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBpc1RlbXBsYXRlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgVGVtcGxhdGVSZWY7XG4gIH1cblxuICAvKipcbiAgICogcGxhY2Vob2xkZXIgZGVjbGFyYXRpb25zLiBSZXBsYWNlZCBieSB0aGUgZnVuY3Rpb25zIHByb3ZpZGVkIHRvIGByZWdpc3Rlck9uQ2hhbmdlYCBhbmQgYHJlZ2lzdGVyT25Ub3VjaGVkYFxuICAgKi9cbiAgcHJvdGVjdGVkIG9uQ2hhbmdlSGFuZGxlciA9IChfOiBhbnkpID0+IHsgfTtcbiAgcHJvdGVjdGVkIG9uVG91Y2hlZEhhbmRsZXIgPSAoKSA9PiB7IH07XG59XG4iXX0=