@stratio/egeo
Version:
570 lines • 39.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/st-radio/st-radio.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/*
* © 2017 Stratio Big Data Inc., Sucursal en España.
*
* This software is licensed under the Apache License, Version 2.0.
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the terms of the License for more details.
*
* SPDX-License-Identifier: Apache-2.0.
*/
import { Component, Input, EventEmitter, Output, Optional, forwardRef, Directive, ContentChildren, QueryList } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { RadioChange } from './st-radio.change';
import { SelectOneDispatcher } from '../utils/unique-dispatcher';
/** @type {?} */
export var MD_RADIO_GROUP_CONTROL_VALUE_ACCESSOR = {
provide: NG_VALUE_ACCESSOR,
// tslint:disable-next-line:no-use-before-declare
useExisting: forwardRef((/**
* @return {?}
*/
function () { return StRadioGroupComponent; })),
multi: true
};
/** @type {?} */
var _uniqueIdCounter = 0;
// tslint:disable-next-line:max-classes-per-file
var StRadioGroupComponent = /** @class */ (function () {
function StRadioGroupComponent() {
this.change = new EventEmitter();
// tslint:disable-next-line:no-use-before-declare
this._radios = null;
this._value = null;
this._selected = null;
this._disabled = false;
this._name = "st-radio-group-" + _uniqueIdCounter++;
this._controlValueAccessorChangeFn = (/**
* @param {?} value
* @return {?}
*/
function (value) { });
this.onTouched = (/**
* @return {?}
*/
function () { });
}
Object.defineProperty(StRadioGroupComponent.prototype, "value", {
get: /**
* @return {?}
*/
function () {
return this._value;
},
set: /**
* @param {?} newValue
* @return {?}
*/
function (newValue) {
if (this._value !== newValue) {
this._value = newValue;
}
this.updatedSelectRadioFromValue();
this.checkSelectRadio();
},
enumerable: true,
configurable: true
});
Object.defineProperty(StRadioGroupComponent.prototype, "name", {
get: /**
* @return {?}
*/
function () {
return this._name;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._name = value;
this.updateRadioName();
},
enumerable: true,
configurable: true
});
Object.defineProperty(StRadioGroupComponent.prototype, "selected", {
get: /**
* @return {?}
*/
function () {
return this._selected;
},
set: /**
* @param {?} selected
* @return {?}
*/
function (selected) {
this._selected = selected;
this.value = selected ? selected.value : null;
this.checkSelectRadio();
},
enumerable: true,
configurable: true
});
Object.defineProperty(StRadioGroupComponent.prototype, "disabled", {
get: /**
* @return {?}
*/
function () { return this._disabled; },
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._disabled = (value != null && value !== false) ? true : null;
},
enumerable: true,
configurable: true
});
/**
* @param {?} value
* @return {?}
*/
StRadioGroupComponent.prototype.writeValue = /**
* @param {?} value
* @return {?}
*/
function (value) {
this.value = value;
};
/**
* @param {?} fn
* @return {?}
*/
StRadioGroupComponent.prototype.registerOnChange = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this._controlValueAccessorChangeFn = fn;
};
/**
* @param {?} fn
* @return {?}
*/
StRadioGroupComponent.prototype.registerOnTouched = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onTouched = fn;
};
/**
* @return {?}
*/
StRadioGroupComponent.prototype.emitChangeEvent = /**
* @return {?}
*/
function () {
/** @type {?} */
var event = new RadioChange();
event.source = this._selected;
event.value = this._value;
this.change.emit(event);
};
/**
* @return {?}
*/
StRadioGroupComponent.prototype.checkSelectRadio = /**
* @return {?}
*/
function () {
if (this.selected && !this._selected.checked) {
this._selected.checked = true;
}
};
/**
* @return {?}
*/
StRadioGroupComponent.prototype.touch = /**
* @return {?}
*/
function () {
if (this.onTouched) {
this.onTouched();
}
};
/**
* @param {?} isDisabled
* @return {?}
*/
StRadioGroupComponent.prototype.setDisabledState = /**
* @param {?} isDisabled
* @return {?}
*/
function (isDisabled) {
this.disabled = isDisabled;
};
/**
* @private
* @return {?}
*/
StRadioGroupComponent.prototype.updateRadioName = /**
* @private
* @return {?}
*/
function () {
var _this = this;
if (this._radios) {
this._radios.forEach((/**
* @param {?} radio
* @return {?}
*/
function (radio) {
radio.name = _this.name;
}));
}
};
/**
* @private
* @return {?}
*/
StRadioGroupComponent.prototype.updatedSelectRadioFromValue = /**
* @private
* @return {?}
*/
function () {
var _this = this;
/** @type {?} */
var isAlreadySelected = this._selected != null && this._selected.value === this._value;
if (this._radios != null && !isAlreadySelected) {
this._selected = null;
this._radios.forEach((/**
* @param {?} radio
* @return {?}
*/
function (radio) {
radio.checked = _this.value === radio.value;
if (radio.checked) {
_this._selected = radio;
}
}));
}
};
StRadioGroupComponent.decorators = [
{ type: Directive, args: [{
selector: 'st-radio-group',
providers: [MD_RADIO_GROUP_CONTROL_VALUE_ACCESSOR],
host: {
role: 'radiogroup'
}
},] }
];
/** @nocollapse */
StRadioGroupComponent.ctorParameters = function () { return []; };
StRadioGroupComponent.propDecorators = {
change: [{ type: Output }],
qaTag: [{ type: Input }],
value: [{ type: Input }],
name: [{ type: Input }],
selected: [{ type: Input }],
disabled: [{ type: Input }],
_radios: [{ type: ContentChildren, args: [forwardRef((/**
* @return {?}
*/
function () { return StRadioComponent; })), { descendants: true },] }]
};
return StRadioGroupComponent;
}());
export { StRadioGroupComponent };
if (false) {
/** @type {?} */
StRadioGroupComponent.prototype.change;
/** @type {?} */
StRadioGroupComponent.prototype.qaTag;
/** @type {?} */
StRadioGroupComponent.prototype._radios;
/** @type {?} */
StRadioGroupComponent.prototype._value;
/** @type {?} */
StRadioGroupComponent.prototype._selected;
/** @type {?} */
StRadioGroupComponent.prototype._disabled;
/** @type {?} */
StRadioGroupComponent.prototype._name;
/** @type {?} */
StRadioGroupComponent.prototype._controlValueAccessorChangeFn;
/** @type {?} */
StRadioGroupComponent.prototype.onTouched;
}
/** @type {?} */
var idUnique = 0;
/**
* \@description {Component} [Radio]
*
* The radio component is used normally in a form acting as the standard html radio input but also user can use it out of a form like a template driven form.
*
* \@example
*
* {html}
*
* ```
* <st-radio-group class ="radio-inline">
* <st-radio value="1">Enabled</st-radio>
* <st-radio value="2" [disabled]="true">Disabled</st-radio>
* <st-radio value="2" [checked]= "true" [disabled]="true">Disabled checked</st-radio>
* </st-radio-group>
* ```
*
*/
var StRadioComponent = /** @class */ (function () {
function StRadioComponent(radioGroup, _radioDispatcher) {
var _this = this;
this._radioDispatcher = _radioDispatcher;
/**
* \@Input {string} [id='st-radio-<unique id>'] Input Id value
*/
this.id = "st-radio-" + idUnique++;
/**
* \@Input {string} [qaTag='st-radio-<unique id>'] Id value for qa test
*/
this.qaTag = "st-radio-" + idUnique++;
/**
* \@Output {boolean} [change=''] Boolean emitted when radio button is changed
*/
this.change = new EventEmitter();
this._value = null;
this.radioGroup = radioGroup;
_radioDispatcher.listen((/**
* @param {?} id
* @param {?} name
* @return {?}
*/
function (id, name) {
if (id !== _this.id && name === _this.name) {
_this.checked = false;
}
}));
}
Object.defineProperty(StRadioComponent.prototype, "checked", {
/** @Input {boolean} [checked=''] Boolean to check the radio button */
get: /**
* \@Input {boolean} [checked=''] Boolean to check the radio button
* @return {?}
*/
function () {
return this._checked;
},
set: /**
* @param {?} newCheckedState
* @return {?}
*/
function (newCheckedState) {
if (this._checked !== newCheckedState) {
this._checked = newCheckedState;
}
if (newCheckedState && this.radioGroup && this.radioGroup.value !== this.value) {
this.radioGroup.selected = this;
}
else if (!newCheckedState && this.radioGroup && this.radioGroup.value === this.value) {
this.radioGroup.selected = null;
}
if (newCheckedState) {
this._radioDispatcher.notify(this.id, this.name);
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(StRadioComponent.prototype, "disabled", {
/** @Input {boolean} [disabled=''] Boolean to disable the radio button */
get: /**
* \@Input {boolean} [disabled=''] Boolean to disable the radio button
* @return {?}
*/
function () {
return this._disabled || (this.radioGroup != null && this.radioGroup.disabled);
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._disabled = (value != null && value !== false) ? true : null;
},
enumerable: true,
configurable: true
});
Object.defineProperty(StRadioComponent.prototype, "value", {
/** @Input {boolean} [value=''] Value of the radio button */
get: /**
* \@Input {boolean} [value=''] Value of the radio button
* @return {?}
*/
function () {
return this._value;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
if (this._value !== value) {
this._value = value;
if (this.radioGroup != null) {
if (!this.checked) {
this.checked = this.radioGroup.value === value;
}
else {
this.radioGroup.selected = null;
}
}
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(StRadioComponent.prototype, "inputId", {
get: /**
* @return {?}
*/
function () {
return this.id + "-input";
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
StRadioComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
if (this.radioGroup && this.radioGroup.value) {
this.checked = this.radioGroup.value === this._value;
}
if (this.radioGroup) {
this.name = this.radioGroup.name;
}
};
/**
* @return {?}
*/
StRadioComponent.prototype.onInputBlur = /**
* @return {?}
*/
function () {
if (this.radioGroup) {
this.radioGroup.touch();
}
};
/**
* @param {?} event
* @return {?}
*/
StRadioComponent.prototype.onInputClick = /**
* @param {?} event
* @return {?}
*/
function (event) {
event.stopPropagation();
};
/**
* @param {?} event
* @return {?}
*/
StRadioComponent.prototype.toggleRadio = /**
* @param {?} event
* @return {?}
*/
function (event) {
event.stopPropagation();
/** @type {?} */
var groupValueChanged = this.radioGroup && this.value !== this.radioGroup.value;
if (!this.disabled) {
this.checked = !this.checked;
this.emitChangeEvent();
}
if (this.radioGroup) {
this.radioGroup._controlValueAccessorChangeFn(this.value);
if (groupValueChanged) {
this.radioGroup.emitChangeEvent();
}
}
};
/**
* @private
* @return {?}
*/
StRadioComponent.prototype.emitChangeEvent = /**
* @private
* @return {?}
*/
function () {
/** @type {?} */
var event = new RadioChange();
event.source = this;
event.value = this._value;
this.change.emit(event);
};
StRadioComponent.decorators = [
{ type: Component, args: [{
selector: 'st-radio',
template: "<!--\n\n \u00A9 2017 Stratio Big Data Inc., Sucursal en Espa\u00F1a.\n\n This software is licensed under the Apache License, Version 2.0.\n This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;\n without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n See the terms of the License for more details.\n\n SPDX-License-Identifier: Apache-2.0.\n\n-->\n<label [attr.for]=\"inputId\" class=\"st-radio\" [ngClass]=\"{'disabled': disabled}\" #label [attr.id]=\"qaTag\">\n <input\n type=\"radio\"\n [id]=\"inputId\"\n [attr.id]=\"\"\n [name]=\"name\"\n [hidden]=\"true\"\n [checked]=\"checked\"\n [disabled]=\"disabled\"\n (blur)=\"onInputBlur()\"\n (change)=\"toggleRadio($event)\"\n (click)=\"onInputClick($event)\"\n [value]=\"value\">\n\n <div class=\"custom-radio\" [ngClass]=\"{'checked' : checked, 'disabled': disabled}\"></div>\n <ng-content></ng-content>\n</label>\n",
host: {
'[class.sth-radio-checked]': 'checked',
'[attr.id]': 'id'
},
styles: ["@charset \"UTF-8\";.st-radio{box-sizing:border-box;display:flex;align-content:center;align-items:center;cursor:pointer}.st-radio.disabled .custom-radio{cursor:default}.st-radio .custom-radio{width:15px;height:15px;cursor:pointer;display:inline-block;border-radius:100%;text-align:center;position:relative;box-sizing:border-box;margin-right:5px}.st-radio .custom-radio.checked:before{display:block;position:absolute;content:'';border-radius:100%;height:5px;width:5px;top:4px;left:4px;margin:auto;box-sizing:border-box}"]
}] }
];
/** @nocollapse */
StRadioComponent.ctorParameters = function () { return [
{ type: StRadioGroupComponent, decorators: [{ type: Optional }] },
{ type: SelectOneDispatcher }
]; };
StRadioComponent.propDecorators = {
id: [{ type: Input }],
qaTag: [{ type: Input }],
name: [{ type: Input }],
checked: [{ type: Input }],
disabled: [{ type: Input }],
value: [{ type: Input }],
change: [{ type: Output }]
};
return StRadioComponent;
}());
export { StRadioComponent };
if (false) {
/** @type {?} */
StRadioComponent.prototype.radioGroup;
/**
* \@Input {string} [id='st-radio-<unique id>'] Input Id value
* @type {?}
*/
StRadioComponent.prototype.id;
/**
* \@Input {string} [qaTag='st-radio-<unique id>'] Id value for qa test
* @type {?}
*/
StRadioComponent.prototype.qaTag;
/**
* \@Input {string} [name=''] Input name value
* @type {?}
*/
StRadioComponent.prototype.name;
/**
* \@Output {boolean} [change=''] Boolean emitted when radio button is changed
* @type {?}
*/
StRadioComponent.prototype.change;
/** @type {?} */
StRadioComponent.prototype._value;
/** @type {?} */
StRadioComponent.prototype._checked;
/** @type {?} */
StRadioComponent.prototype._disabled;
/**
* @type {?}
* @private
*/
StRadioComponent.prototype._radioDispatcher;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3QtcmFkaW8uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHN0cmF0aW8vZWdlby8iLCJzb3VyY2VzIjpbImxpYi9zdC1yYWRpby9zdC1yYWRpby5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBVUEsT0FBTyxFQUNKLFNBQVMsRUFDVCxLQUFLLEVBQ0wsWUFBWSxFQUNaLE1BQU0sRUFFTixRQUFRLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUM3RCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFekUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDOztBQUVqRSxNQUFNLEtBQU8scUNBQXFDLEdBQVE7SUFDdkQsT0FBTyxFQUFFLGlCQUFpQjs7SUFFMUIsV0FBVyxFQUFFLFVBQVU7OztJQUFDLGNBQU0sT0FBQSxxQkFBcUIsRUFBckIsQ0FBcUIsRUFBQztJQUNwRCxLQUFLLEVBQUUsSUFBSTtDQUNiOztJQUVHLGdCQUFnQixHQUFHLENBQUM7O0FBR3hCO0lBZ0VHO1FBdERBLFdBQU0sR0FBOEIsSUFBSSxZQUFZLEVBQWUsQ0FBQzs7UUErQ3BFLFlBQU8sR0FBZ0MsSUFBSSxDQUFDO1FBRTVDLFdBQU0sR0FBUSxJQUFJLENBQUM7UUFDbkIsY0FBUyxHQUFxQixJQUFJLENBQUM7UUFDbkMsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUMzQixVQUFLLEdBQVcsb0JBQWtCLGdCQUFnQixFQUFJLENBQUM7UUFLdkQsa0NBQTZCOzs7O1FBQXlCLFVBQUMsS0FBSyxJQUFPLENBQUMsRUFBQztRQUVyRSxjQUFTOzs7UUFBYyxjQUFRLENBQUMsRUFBQztJQUo3QixDQUFDO0lBbERMLHNCQUNJLHdDQUFLOzs7O1FBRFQ7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RUQsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2xCLElBQUksQ0FBQyxVQUFVLENBQUMsNkJBQTZCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRTFELElBQUksaUJBQWlCLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQyxVQUFVLENBQUMsZUFBZSxFQUFFLENBQUM7YUFDcEM7U0FDSDtJQUNKLENBQUM7Ozs7O0lBRU8sMENBQWU7Ozs7SUFBdkI7O1lBQ08sS0FBSyxHQUFHLElBQUksV0FBVyxFQUFFO1FBQzdCLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMxQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQixDQUFDOztnQkF4SUgsU0FBUyxTQUFDO29CQUNSLFFBQVEsRUFBRSxVQUFVO29CQUNwQixxZ0NBQXdDO29CQUV4QyxJQUFJLEVBQUU7d0JBQ0gsMkJBQTJCLEVBQUUsU0FBUzt3QkFDdEMsV0FBVyxFQUFFLElBQUk7cUJBQ25COztpQkFDSDs7OztnQkF5RTZCLHFCQUFxQix1QkFBNUMsUUFBUTtnQkFuUE4sbUJBQW1COzs7cUJBK0t4QixLQUFLO3dCQUVMLEtBQUs7dUJBRUwsS0FBSzswQkFFTCxLQUFLOzJCQXNCTCxLQUFLO3dCQVNMLEtBQUs7eUJBb0JMLE1BQU07O0lBbUVWLHVCQUFDO0NBQUEsQUF6SUQsSUF5SUM7U0FoSVksZ0JBQWdCOzs7SUFFMUIsc0NBQWtDOzs7OztJQUVsQyw4QkFBK0M7Ozs7O0lBRS9DLGlDQUFrRDs7Ozs7SUFFbEQsZ0NBQXNCOzs7OztJQXFEdEIsa0NBQThFOztJQU05RSxrQ0FBbUI7O0lBQ25CLG9DQUFrQjs7SUFDbEIscUNBQW1COzs7OztJQUloQiw0Q0FBNkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogwqkgMjAxNyBTdHJhdGlvIEJpZyBEYXRhIEluYy4sIFN1Y3Vyc2FsIGVuIEVzcGHDsWEuXG4gKlxuICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTtcbiAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuXG4gKiBTZWUgdGhlIHRlcm1zIG9mIHRoZSBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAuXG4gKi9cbmltcG9ydCB7XG4gICBDb21wb25lbnQsXG4gICBJbnB1dCxcbiAgIEV2ZW50RW1pdHRlcixcbiAgIE91dHB1dCxcbiAgIE9uSW5pdCxcbiAgIE9wdGlvbmFsLCBmb3J3YXJkUmVmLCBEaXJlY3RpdmUsIENvbnRlbnRDaGlsZHJlbiwgUXVlcnlMaXN0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IFJhZGlvQ2hhbmdlIH0gZnJvbSAnLi9zdC1yYWRpby5jaGFuZ2UnO1xuaW1wb3J0IHsgU2VsZWN0T25lRGlzcGF0Y2hlciB9IGZyb20gJy4uL3V0aWxzL3VuaXF1ZS1kaXNwYXRjaGVyJztcblxuZXhwb3J0IGNvbnN0IE1EX1JBRElPX0dST1VQX0NPTlRST0xfVkFMVUVfQUNDRVNTT1I6IGFueSA9IHtcbiAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVzZS1iZWZvcmUtZGVjbGFyZVxuICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU3RSYWRpb0dyb3VwQ29tcG9uZW50KSxcbiAgIG11bHRpOiB0cnVlXG59O1xuXG5sZXQgX3VuaXF1ZUlkQ291bnRlciA9IDA7XG5cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtY2xhc3Nlcy1wZXItZmlsZVxuQERpcmVjdGl2ZSh7XG4gICBzZWxlY3RvcjogJ3N0LXJhZGlvLWdyb3VwJyxcbiAgIHByb3ZpZGVyczogW01EX1JBRElPX0dST1VQX0NPTlRST0xfVkFMVUVfQUNDRVNTT1JdLFxuICAgaG9zdDoge1xuICAgICAgcm9sZTogJ3JhZGlvZ3JvdXAnXG4gICB9XG59KVxuZXhwb3J0IGNsYXNzIFN0UmFkaW9Hcm91cENvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcblxuICAgQE91dHB1dCgpXG4gICBjaGFuZ2U6IEV2ZW50RW1pdHRlcjxSYWRpb0NoYW5nZT4gPSBuZXcgRXZlbnRFbWl0dGVyPFJhZGlvQ2hhbmdlPigpO1xuXG4gICBASW5wdXQoKVxuICAgcWFUYWc6IHN0cmluZztcblxuICAgQElucHV0KClcbiAgIGdldCB2YWx1ZSgpOiBhbnkge1xuICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICAgfVxuXG4gICBzZXQgdmFsdWUobmV3VmFsdWU6IGFueSkge1xuICAgICAgaWYgKHRoaXMuX3ZhbHVlICE9PSBuZXdWYWx1ZSkge1xuICAgICAgICAgdGhpcy5fdmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy51cGRhdGVkU2VsZWN0UmFkaW9Gcm9tVmFsdWUoKTtcbiAgICAgIHRoaXMuY2hlY2tTZWxlY3RSYWRpbygpO1xuICAgfVxuXG4gICBASW5wdXQoKVxuICAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICAgfVxuXG4gICBzZXQgbmFtZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICB0aGlzLl9uYW1lID0gdmFsdWU7XG4gICAgICB0aGlzLnVwZGF0ZVJhZGlvTmFtZSgpO1xuICAgfVxuXG4gICBASW5wdXQoKVxuICAgZ2V0IHNlbGVjdGVkKCk6IFN0UmFkaW9Db21wb25lbnQge1xuICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkO1xuICAgfVxuICAgc2V0IHNlbGVjdGVkKHNlbGVjdGVkOiBTdFJhZGlvQ29tcG9uZW50KSB7XG4gICAgICB0aGlzLl9zZWxlY3RlZCA9IHNlbGVjdGVkO1xuICAgICAgdGhpcy52YWx1ZSA9IHNlbGVjdGVkID8gc2VsZWN0ZWQudmFsdWUgOiBudWxsO1xuICAgICAgdGhpcy5jaGVja1NlbGVjdFJhZGlvKCk7XG4gICB9XG5cbiAgIEBJbnB1dCgpXG4gICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9kaXNhYmxlZDsgfVxuICAgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICB0aGlzLl9kaXNhYmxlZCA9ICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlICE9PSBmYWxzZSkgPyB0cnVlIDogbnVsbDtcbiAgIH1cblxuICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVzZS1iZWZvcmUtZGVjbGFyZVxuICAgQENvbnRlbnRDaGlsZHJlbihmb3J3YXJkUmVmKCgpID0+IFN0UmFkaW9Db21wb25lbnQpLCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pXG4gICBfcmFkaW9zOiBRdWVyeUxpc3Q8U3RSYWRpb0NvbXBvbmVudD4gPSBudWxsO1xuXG4gICBfdmFsdWU6IGFueSA9IG51bGw7XG4gICBfc2VsZWN0ZWQ6IFN0UmFkaW9Db21wb25lbnQgPSBudWxsO1xuICAgX2Rpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gICBfbmFtZTogc3RyaW5nID0gYHN0LXJhZGlvLWdyb3VwLSR7X3VuaXF1ZUlkQ291bnRlcisrfWA7XG5cbiAgIGNvbnN0cnVjdG9yKFxuICAgKSB7IH1cblxuICAgX2NvbnRyb2xWYWx1ZUFjY2Vzc29yQ2hhbmdlRm46ICh2YWx1ZTogYW55KSA9PiB2b2lkID0gKHZhbHVlKSA9PiB7IH07XG5cbiAgIG9uVG91Y2hlZDogKCkgPT4gYW55ID0gKCkgPT4geyB9O1xuXG4gICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgIH1cblxuICAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBhbnkpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgIHRoaXMuX2NvbnRyb2xWYWx1ZUFjY2Vzc29yQ2hhbmdlRm4gPSBmbjtcbiAgIH1cblxuICAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgIH1cblxuICAgZW1pdENoYW5nZUV2ZW50KCk6IHZvaWQge1xuICAgICAgbGV0IGV2ZW50ID0gbmV3IFJhZGlvQ2hhbmdlKCk7XG4gICAgICBldmVudC5zb3VyY2UgPSB0aGlzLl9zZWxlY3RlZDtcbiAgICAgIGV2ZW50LnZhbHVlID0gdGhpcy5fdmFsdWU7XG4gICAgICB0aGlzLmNoYW5nZS5lbWl0KGV2ZW50KTtcbiAgIH1cblxuICAgY2hlY2tTZWxlY3RSYWRpbygpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkICYmICF0aGlzLl9zZWxlY3RlZC5jaGVja2VkKSB7XG4gICAgICAgICB0aGlzLl9zZWxlY3RlZC5jaGVja2VkID0gdHJ1ZTtcbiAgICAgIH1cbiAgIH1cblxuICAgdG91Y2goKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5vblRvdWNoZWQpIHtcbiAgICAgICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgICB9XG4gICB9XG5cbiAgIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICB9XG5cbiAgIHByaXZhdGUgdXBkYXRlUmFkaW9OYW1lKCk6IHZvaWQge1xuICAgICAgaWYgKHRoaXMuX3JhZGlvcykge1xuICAgICAgICAgdGhpcy5fcmFkaW9zLmZvckVhY2goKHJhZGlvKSA9PiB7XG4gICAgICAgICAgICByYWRpby5uYW1lID0gdGhpcy5uYW1lO1xuICAgICAgICAgfSk7XG4gICAgICB9XG4gICB9XG5cbiAgIHByaXZhdGUgdXBkYXRlZFNlbGVjdFJhZGlvRnJvbVZhbHVlKCk6IHZvaWQge1xuICAgICAgbGV0IGlzQWxyZWFkeVNlbGVjdGVkID0gdGhpcy5fc2VsZWN0ZWQgIT0gbnVsbCAmJiB0aGlzLl9zZWxlY3RlZC52YWx1ZSA9PT0gdGhpcy5fdmFsdWU7XG5cbiAgICAgIGlmICh0aGlzLl9yYWRpb3MgIT0gbnVsbCAmJiAhaXNBbHJlYWR5U2VsZWN0ZWQpIHtcbiAgICAgICAgIHRoaXMuX3NlbGVjdGVkID0gbnVsbDtcbiAgICAgICAgIHRoaXMuX3JhZGlvcy5mb3JFYWNoKChyYWRpbykgPT4ge1xuICAgICAgICAgICAgcmFkaW8uY2hlY2tlZCA9IHRoaXMudmFsdWUgPT09IHJhZGlvLnZhbHVlO1xuICAgICAgICAgICAgaWYgKHJhZGlvLmNoZWNrZWQpIHtcbiAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkID0gcmFkaW87XG4gICAgICAgICAgICB9XG4gICAgICAgICB9KTtcbiAgICAgIH1cbiAgIH1cbn1cblxuXG5sZXQgaWRVbmlxdWU6IG51bWJlciA9IDA7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIHtDb21wb25lbnR9IFtSYWRpb11cbiAqXG4gKiBUaGUgcmFkaW8gY29tcG9uZW50IGlzIHVzZWQgbm9ybWFsbHkgaW4gYSBmb3JtIGFjdGluZyBhcyB0aGUgc3RhbmRhcmQgaHRtbCByYWRpbyBpbnB1dCBidXQgYWxzbyB1c2VyIGNhbiB1c2UgaXQgb3V0IG9mIGEgZm9ybSBsaWtlIGEgdGVtcGxhdGUgZHJpdmVuIGZvcm0uXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiB7aHRtbH1cbiAqXG4gKiBgYGBcbiAqIDxzdC1yYWRpby1ncm91cCBjbGFzcyA9XCJyYWRpby1pbmxpbmVcIj5cbiAqICAgIDxzdC1yYWRpbyB2YWx1ZT1cIjFcIj5FbmFibGVkPC9zdC1yYWRpbz5cbiAqICAgIDxzdC1yYWRpbyB2YWx1ZT1cIjJcIiBbZGlzYWJsZWRdPVwidHJ1ZVwiPkRpc2FibGVkPC9zdC1yYWRpbz5cbiAqICAgIDxzdC1yYWRpbyB2YWx1ZT1cIjJcIiBbY2hlY2tlZF09IFwidHJ1ZVwiIFtkaXNhYmxlZF09XCJ0cnVlXCI+RGlzYWJsZWQgY2hlY2tlZDwvc3QtcmFkaW8+XG4gKiA8L3N0LXJhZGlvLWdyb3VwPlxuICogYGBgXG4gKlxuICovXG5AQ29tcG9uZW50KHtcbiAgIHNlbGVjdG9yOiAnc3QtcmFkaW8nLFxuICAgdGVtcGxhdGVVcmw6ICcuL3N0LXJhZGlvLmNvbXBvbmVudC5odG1sJyxcbiAgIHN0eWxlVXJsczogWycuL3N0LXJhZGlvLmNvbXBvbmVudC5zY3NzJ10sXG4gICBob3N0OiB7XG4gICAgICAnW2NsYXNzLnN0aC1yYWRpby1jaGVja2VkXSc6ICdjaGVja2VkJyxcbiAgICAgICdbYXR0ci5pZF0nOiAnaWQnXG4gICB9XG59KVxuZXhwb3J0IGNsYXNzIFN0UmFkaW9Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gICByYWRpb0dyb3VwOiBTdFJhZGlvR3JvdXBDb21wb25lbnQ7XG4gICAvKiogQElucHV0IHtzdHJpbmd9IFtpZD0nc3QtcmFkaW8tPHVuaXF1ZSBpZD4nXSBJbnB1dCBJZCB2YWx1ZSAqL1xuICAgQElucHV0KCkgaWQ6IHN0cmluZyA9IGBzdC1yYWRpby0ke2lkVW5pcXVlKyt9YDtcbiAgIC8qKiBASW5wdXQge3N0cmluZ30gW3FhVGFnPSdzdC1yYWRpby08dW5pcXVlIGlkPiddIElkIHZhbHVlIGZvciBxYSB0ZXN0ICovXG4gICBASW5wdXQoKSBxYVRhZzogc3RyaW5nID0gYHN0LXJhZGlvLSR7aWRVbmlxdWUrK31gO1xuICAgLyoqIEBJbnB1dCB7c3RyaW5nfSBbbmFtZT0nJ10gSW5wdXQgbmFtZSB2YWx1ZSAqL1xuICAgQElucHV0KCkgbmFtZTogc3RyaW5nO1xuICAgLyoqIEBJbnB1dCB7Ym9vbGVhbn0gW2NoZWNrZWQ9JyddIEJvb2xlYW4gdG8gY2hlY2sgdGhlIHJhZGlvIGJ1dHRvbiAqL1xuICAgQElucHV0KClcbiAgIGdldCBjaGVja2VkKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuX2NoZWNrZWQ7XG4gICB9XG5cbiAgIHNldCBjaGVja2VkKG5ld0NoZWNrZWRTdGF0ZTogYm9vbGVhbikge1xuXG4gICAgICBpZiAodGhpcy5fY2hlY2tlZCAhPT0gbmV3Q2hlY2tlZFN0YXRlKSB7XG4gICAgICAgICB0aGlzLl9jaGVja2VkID0gbmV3Q2hlY2tlZFN0YXRlO1xuICAgICAgfVxuXG4gICAgICBpZiAobmV3Q2hlY2tlZFN0YXRlICYmIHRoaXMucmFkaW9Hcm91cCAmJiB0aGlzLnJhZGlvR3JvdXAudmFsdWUgIT09IHRoaXMudmFsdWUpIHtcbiAgICAgICAgIHRoaXMucmFkaW9Hcm91cC5zZWxlY3RlZCA9IHRoaXM7XG4gICAgICB9IGVsc2UgaWYgKCFuZXdDaGVja2VkU3RhdGUgJiYgdGhpcy5yYWRpb0dyb3VwICYmIHRoaXMucmFkaW9Hcm91cC52YWx1ZSA9PT0gdGhpcy52YWx1ZSkge1xuICAgICAgICAgdGhpcy5yYWRpb0dyb3VwLnNlbGVjdGVkID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKG5ld0NoZWNrZWRTdGF0ZSkge1xuICAgICAgICAgdGhpcy5fcmFkaW9EaXNwYXRjaGVyLm5vdGlmeSh0aGlzLmlkLCB0aGlzLm5hbWUpO1xuICAgICAgfVxuICAgfVxuICAgLyoqIEBJbnB1dCB7Ym9vbGVhbn0gW2Rpc2FibGVkPScnXSBCb29sZWFuIHRvIGRpc2FibGUgdGhlIHJhZGlvIGJ1dHRvbiAqL1xuICAgQElucHV0KClcbiAgIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZCB8fCAodGhpcy5yYWRpb0dyb3VwICE9IG51bGwgJiYgdGhpcy5yYWRpb0dyb3VwLmRpc2FibGVkKTtcbiAgIH1cblxuICAgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICB0aGlzLl9kaXNhYmxlZCA9ICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlICE9PSBmYWxzZSkgPyB0cnVlIDogbnVsbDtcbiAgIH1cbiAgIC8qKiBASW5wdXQge2Jvb2xlYW59IFt2YWx1ZT0nJ10gVmFsdWUgb2YgdGhlIHJhZGlvIGJ1dHRvbiAqL1xuICAgQElucHV0KClcbiAgIGdldCB2YWx1ZSgpOiBhbnkge1xuICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICAgfVxuXG4gICBzZXQgdmFsdWUodmFsdWU6IGFueSkge1xuICAgICAgaWYgKHRoaXMuX3ZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcblxuICAgICAgICAgaWYgKHRoaXMucmFkaW9Hcm91cCAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY2hlY2tlZCkge1xuICAgICAgICAgICAgICAgdGhpcy5jaGVja2VkID0gdGhpcy5yYWRpb0dyb3VwLnZhbHVlID09PSB2YWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICB0aGlzLnJhZGlvR3JvdXAuc2VsZWN0ZWQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgfVxuICAgICAgfVxuICAgfVxuXG4gICAvKiogQE91dHB1dCB7Ym9vbGVhbn0gW2NoYW5nZT0nJ10gQm9vbGVhbiBlbWl0dGVkIHdoZW4gcmFkaW8gYnV0dG9uIGlzIGNoYW5nZWQgKi9cbiAgIEBPdXRwdXQoKSBjaGFuZ2U6IEV2ZW50RW1pdHRlcjxSYWRpb0NoYW5nZT4gPSBuZXcgRXZlbnRFbWl0dGVyPFJhZGlvQ2hhbmdlPigpO1xuXG4gICBnZXQgaW5wdXRJZCgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIGAke3RoaXMuaWR9LWlucHV0YDtcbiAgIH1cblxuICAgX3ZhbHVlOiBhbnkgPSBudWxsO1xuICAgX2NoZWNrZWQ6IGJvb2xlYW47XG4gICBfZGlzYWJsZWQ6IGJvb2xlYW47XG5cbiAgIGNvbnN0cnVjdG9yKFxuICAgICAgQE9wdGlvbmFsKCkgcmFkaW9Hcm91cDogU3RSYWRpb0dyb3VwQ29tcG9uZW50LFxuICAgICAgcHJpdmF0ZSBfcmFkaW9EaXNwYXRjaGVyOiBTZWxlY3RPbmVEaXNwYXRjaGVyXG4gICApIHtcblxuICAgICAgdGhpcy5yYWRpb0dyb3VwID0gcmFkaW9Hcm91cDtcbiAgICAgIF9yYWRpb0Rpc3BhdGNoZXIubGlzdGVuKChpZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgIGlmIChpZCAhPT0gdGhpcy5pZCAmJiBuYW1lID09PSB0aGlzLm5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICAgfVxuICAgICAgfSk7XG4gICB9XG5cbiAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgaWYgKHRoaXMucmFkaW9Hcm91cCAmJiB0aGlzLnJhZGlvR3JvdXAudmFsdWUpIHtcbiAgICAgICAgIHRoaXMuY2hlY2tlZCA9IHRoaXMucmFkaW9Hcm91cC52YWx1ZSA9PT0gdGhpcy5fdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnJhZGlvR3JvdXApIHtcbiAgICAgICAgIHRoaXMubmFtZSA9IHRoaXMucmFkaW9Hcm91cC5uYW1lO1xuICAgICAgfVxuICAgfVxuXG4gICBvbklucHV0Qmx1cigpOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLnJhZGlvR3JvdXApIHtcbiAgICAgICAgIHRoaXMucmFkaW9Hcm91cC50b3VjaCgpO1xuICAgICAgfVxuICAgfVxuXG4gICBvbklucHV0Q2xpY2soZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgIH1cblxuICAgdG9nZ2xlUmFkaW8oZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGxldCBncm91cFZhbHVlQ2hhbmdlZCA9IHRoaXMucmFkaW9Hcm91cCAmJiB0aGlzLnZhbHVlICE9PSB0aGlzLnJhZGlvR3JvdXAudmFsdWU7XG5cbiAgICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgdGhpcy5jaGVja2VkID0gIXRoaXMuY2hlY2tlZDtcbiAgICAgICAgIHRoaXMuZW1pdENoYW5nZUV2ZW50KCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnJhZGlvR3JvdXApIHtcbiAgICAgICAgIHRoaXMucmFkaW9Hcm91cC5fY29udHJvbFZhbHVlQWNjZXNzb3JDaGFuZ2VGbih0aGlzLnZhbHVlKTtcblxuICAgICAgICAgaWYgKGdyb3VwVmFsdWVDaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLnJhZGlvR3JvdXAuZW1pdENoYW5nZUV2ZW50KCk7XG4gICAgICAgICB9XG4gICAgICB9XG4gICB9XG5cbiAgIHByaXZhdGUgZW1pdENoYW5nZUV2ZW50KCk6IHZvaWQge1xuICAgICAgbGV0IGV2ZW50ID0gbmV3IFJhZGlvQ2hhbmdlKCk7XG4gICAgICBldmVudC5zb3VyY2UgPSB0aGlzO1xuICAgICAgZXZlbnQudmFsdWUgPSB0aGlzLl92YWx1ZTtcbiAgICAgIHRoaXMuY2hhbmdlLmVtaXQoZXZlbnQpO1xuICAgfVxufVxuIl19