@uex/web-extensions
Version:
Uex extensions for Angular 6+ web projects
473 lines • 35.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/modules/button/button.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input, ElementRef } from '@angular/core';
import * as _ from 'lodash';
import { RippleDirective } from './directives/ripple.directive';
/**
* Define estilos de botões para elementos. Por razões de acessibilidade, os botões usam um elemento button padrão.
*
* É uma abstração para os [botões do Bootstrap 4]{\@link https://getbootstrap.com/docs/4.1/components/buttons}, com algumas melhorias e estilos personalizados.
*
* Demo: {\@link https://gituex.gitlab.io/extensions/web-extensions#components/button}
*/
export class ButtonComponent extends RippleDirective {
/**
* @ignore
* @param {?} elementRef
*/
constructor(elementRef) {
super(elementRef);
this.elementRef = elementRef;
/**
* Define o atributo "title" de layout que será aplicado ao botão
*/
this.type = 'button';
this._color = 'primary';
this._mode = 'raised';
this._size = 'default';
this._rounded = false;
this._block = false;
this._icon_only = false;
this._icon_right = false;
this._icon_left = false;
this._classes = [];
this.is_button = false;
}
/**
* Define o modo de layout que será aplicado ao botão
* @private
* @param {?} mode
* @return {?}
*/
set _setMode(mode) {
this._mode = mode;
this._updateClasses();
}
/**
* Define a cor que será aplicada ao botão
* @private
* @param {?} color
* @return {?}
*/
set _setColor(color) {
this._color = color;
this._updateClasses();
}
/**
* Define o tamanho que será aplicado ao botão
* @private
* @param {?} size
* @return {?}
*/
set _setSize(size) {
this._size = size;
this._updateClasses();
}
/**
* Define se será aplicada borda arredondada ao botão
* @private
* @param {?} rounded
* @return {?}
*/
set _setRounded(rounded) {
this._rounded = this._getAttribute(rounded, true);
this._updateClasses();
}
/**
* Define se será aplicada largura "100%" arredondada ao botão
* @private
* @param {?} block
* @return {?}
*/
set _setBlock(block) {
this._block = this._getAttribute(block, true);
this._updateClasses();
}
/**
* Define se o botão deverá se ajustar para receber apenas um icone
* @private
* @param {?} icon_only
* @return {?}
*/
set _setIconOnly(icon_only) {
this._icon_only = this._getAttribute(icon_only, true);
this._updateClasses();
}
/**
* Define se o botão deverá se ajustar para receber um icone a direita
* @private
* @param {?} icon_right
* @return {?}
*/
set _setIconRight(icon_right) {
this._icon_right = this._getAttribute(icon_right, true);
this._updateClasses();
}
/**
* Define se o botão deverá se ajustar para receber um icone a esquerda
* @private
* @param {?} icon_left
* @return {?}
*/
set _setIconLeft(icon_left) {
this._icon_left = this._getAttribute(icon_left, true);
this._updateClasses();
}
/**
* @return {?}
*/
ngOnInit() {
this.is_button = this.elementRef.nativeElement.tagName == 'BUTTON';
this._updateClasses();
}
/**
* Distância do elemento para o topo do elemento pai mais próximo posicionado com relative
* @return {?}
*/
get offsetTop() {
return this.elementRef.nativeElement.offsetTop;
}
/**
* Dispara o gatilho de focus do botão
*
* @param {?=} has_delay
* @return {?}
*/
focus(has_delay = false) {
if (has_delay) {
setTimeout((/**
* @return {?}
*/
() => this._doFocus()), 300);
}
else {
this._doFocus();
}
}
/**
* \@internal
* @return {?}
*/
hasRipple() {
return !this.no_ripple && !this._isOutline();
}
/**
* \@internal
* @return {?}
*/
isDarkRipple() {
return this.hasRipple() && this._isClear();
}
// Modes
/**
* @private
* @return {?}
*/
_isFab() {
return this._mode == 'fab';
}
/**
* @private
* @return {?}
*/
_isFabFlat() {
return this._mode == 'fab-flat';
}
/**
* @private
* @return {?}
*/
_isClear() {
return this._mode == 'clear';
}
/**
* @private
* @return {?}
*/
_isIcon() {
return this._mode == 'icon';
}
/**
* @private
* @return {?}
*/
_isOutline() {
return this._mode == 'outline';
}
/**
* @private
* @return {?}
*/
_isRaised() {
return this._mode == 'raised';
}
// Sizes
/**
* @private
* @return {?}
*/
_isXSmall() {
return this._size == 'micro' || this._size == 'xsmall' || this._size == 'xs';
}
/**
* @private
* @return {?}
*/
_isSmall() {
return this._size == 'mini' || this._size == 'small' || this._size == 'sm';
}
/**
* @private
* @return {?}
*/
_isLarge() {
return this._size == 'large' || this._size == 'lg';
}
/**
* @private
* @return {?}
*/
_isXLarge() {
return this._size == 'xlarge' || this._size == 'xl';
}
// Miscellaneous
/**
* @private
* @return {?}
*/
_isRounded() {
return this._rounded && !this._isIcon() && !this._isFab() && !this._isFabFlat();
}
/**
* @private
* @return {?}
*/
_isBlock() {
return this._block && !this._isIcon() && !this._isFab() && !this._isFabFlat();
}
/**
* @private
* @return {?}
*/
_isIconOnly() {
return this._icon_only && !this._isIcon() && !this._isFab() && !this._isFabFlat();
}
/**
* @private
* @return {?}
*/
_isIconRight() {
return this._icon_right && !this._isIcon() && !this._isFab() && !this._isFabFlat();
}
/**
* @private
* @return {?}
*/
_isIconLeft() {
return this._icon_left && !this._isIcon() && !this._isFab() && !this._isFabFlat();
}
// Colors
/**
* @private
* @return {?}
*/
_updateClasses() {
this._clearClasses();
this._classes.push('btn');
if (this._isFab()) {
this._classes.push('btn-fab');
}
if (this._isFabFlat()) {
this._classes.push('btn-fab-flat');
}
if (this._isClear()) {
this._classes.push('btn-clear');
}
if (this._isIcon()) {
this._classes.push('btn-icon');
}
if (this._isOutline()) {
this._classes.push('btn-outline');
}
if (this._isRaised()) {
this._classes.push('btn-raised');
}
if (this._isRounded()) {
this._classes.push('btn-rounded');
}
if (this._isBlock()) {
this._classes.push('btn-block');
}
if (this._isIconOnly()) {
this._classes.push('btn-icon-only');
}
if (this._isIconRight()) {
this._classes.push('btn-icon-right');
}
if (this._isIconLeft()) {
this._classes.push('btn-icon-left');
}
if (this._isXSmall()) {
this._classes.push('btn-xs');
}
if (this._isSmall()) {
this._classes.push('btn-sm');
}
if (this._isLarge()) {
this._classes.push('btn-lg');
}
if (this._isXLarge()) {
this._classes.push('btn-xl');
}
if (this._color == 'link') {
this._classes.push(`btn-${this._color}`);
}
else {
this._classes.push(`btn-${this._isOutline() ? 'outline-' : ''}${this._color || 'default'}`);
}
this._setClasses();
}
/**
* @private
* @return {?}
*/
_clearClasses() {
if (this._classes) {
/** @type {?} */
const current_classes = this.elementRef.nativeElement.className.split(' ');
this._classes.forEach((/**
* @param {?} _class
* @return {?}
*/
(_class) => {
/** @type {?} */
const index = current_classes.indexOf(_class);
if (index > -1) {
current_classes.splice(index, 1);
}
}));
this._classes = [];
this.elementRef.nativeElement.className = current_classes.join(' ');
}
}
/**
* @private
* @return {?}
*/
_setClasses() {
/** @type {?} */
const current_classes = this.elementRef.nativeElement.className.split(' ').filter((/**
* @param {?} i
* @return {?}
*/
(i) => !!i));
this.elementRef.nativeElement.className = _.concat(current_classes, this._classes).join(' ');
}
/**
* @private
* @return {?}
*/
_doFocus() {
this.elementRef.nativeElement.focus();
}
/**
* @private
* @template T
* @param {?} value
* @param {?=} boolean
* @return {?}
*/
_getAttribute(value, boolean = false) {
if (boolean) {
return (_.isString(value) && value !== 'false') || (_.isBoolean(value) && !!value);
}
return !!value ? value : null;
}
}
ButtonComponent.decorators = [
{ type: Component, args: [{
selector: '[uex-button]',
template: "<ng-content></ng-content>\r\n",
host: {
'class': 'uex-button',
'[attr.type]': 'is_button ? type : null',
'[class.with-ripple]': 'hasRipple()',
'[class.ripple-dark]': 'isDarkRipple()'
}
}] }
];
/** @nocollapse */
ButtonComponent.ctorParameters = () => [
{ type: ElementRef }
];
ButtonComponent.propDecorators = {
type: [{ type: Input, args: ['type',] }],
_setMode: [{ type: Input, args: ['mode',] }],
_setColor: [{ type: Input, args: ['color',] }],
_setSize: [{ type: Input, args: ['size',] }],
_setRounded: [{ type: Input, args: ['rounded',] }],
_setBlock: [{ type: Input, args: ['block',] }],
_setIconOnly: [{ type: Input, args: ['icon-only',] }],
_setIconRight: [{ type: Input, args: ['icon-right',] }],
_setIconLeft: [{ type: Input, args: ['icon-left',] }]
};
if (false) {
/**
* Define o atributo "title" de layout que será aplicado ao botão
* @type {?}
*/
ButtonComponent.prototype.type;
/**
* @type {?}
* @private
*/
ButtonComponent.prototype._color;
/**
* @type {?}
* @private
*/
ButtonComponent.prototype._mode;
/**
* @type {?}
* @private
*/
ButtonComponent.prototype._size;
/**
* @type {?}
* @private
*/
ButtonComponent.prototype._rounded;
/**
* @type {?}
* @private
*/
ButtonComponent.prototype._block;
/**
* @type {?}
* @private
*/
ButtonComponent.prototype._icon_only;
/**
* @type {?}
* @private
*/
ButtonComponent.prototype._icon_right;
/**
* @type {?}
* @private
*/
ButtonComponent.prototype._icon_left;
/**
* @type {?}
* @private
*/
ButtonComponent.prototype._classes;
/** @type {?} */
ButtonComponent.prototype.is_button;
/** @type {?} */
ButtonComponent.prototype.elementRef;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnV0dG9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0B1ZXgvd2ViLWV4dGVuc2lvbnMvIiwic291cmNlcyI6WyJsaWIvbW9kdWxlcy9idXR0b24vYnV0dG9uLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU3RCxPQUFPLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUU1QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sK0JBQStCLENBQUM7Ozs7Ozs7O0FBbUJoRSxNQUFNLE9BQU8sZUFBZ0IsU0FBUSxlQUFlOzs7OztJQWtGbEQsWUFDUyxVQUFzQjtRQUU3QixLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFGWCxlQUFVLEdBQVYsVUFBVSxDQUFZOzs7O1FBOUVoQixTQUFJLEdBQUcsUUFBUSxDQUFDO1FBbUZ2QixXQUFNLEdBQUcsU0FBUyxDQUFDO1FBQ25CLFVBQUssR0FBZSxRQUFRLENBQUM7UUFDN0IsVUFBSyxHQUFlLFNBQVMsQ0FBQztRQUM5QixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFDZixlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ25CLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFFbkIsYUFBUSxHQUFrQixFQUFFLENBQUM7UUFFOUIsY0FBUyxHQUFHLEtBQUssQ0FBQztJQWJ6QixDQUFDOzs7Ozs7O0lBNUVELElBQ1ksUUFBUSxDQUFDLElBQWdCO1FBQ25DLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QixDQUFDOzs7Ozs7O0lBS0QsSUFDWSxTQUFTLENBQUMsS0FBYTtRQUNqQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FB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WUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUFFO1FBRTNELElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFO1lBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7U0FBRTtRQUM3RCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQUU7UUFDekQsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUU7WUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztTQUFFO1FBQ2hFLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFO1lBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztTQUFFO1FBQ2xFLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7U0FBRTtRQUVoRSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQUU7UUFDdkQsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUFFO1FBQ3RELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7U0FBRTtRQUN0RCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRTtZQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQUU7UUFFdkQsSUFBSSxJQUFJLENBQUMsTUFB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U0FBQyxXQUFXOzs7Ozs7O0lBcEVsQiwrQkFBK0I7Ozs7O0lBbUYvQixpQ0FBMkI7Ozs7O0lBQzNCLGdDQUFxQzs7Ozs7SUFDckMsZ0NBQXNDOzs7OztJQUN0QyxtQ0FBeUI7Ozs7O0lBQ3pCLGlDQUF1Qjs7Ozs7SUFDdkIscUNBQTJCOzs7OztJQUMzQixzQ0FBNEI7Ozs7O0lBQzVCLHFDQUEyQjs7Ozs7SUFFM0IsbUNBQXFDOztJQUVyQyxvQ0FBeUI7O0lBaEJ2QixxQ0FBNkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XHJcblxyXG5pbXBvcnQgeyBSaXBwbGVEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZXMvcmlwcGxlLmRpcmVjdGl2ZSc7XHJcblxyXG4vKipcclxuICogRGVmaW5lIGVzdGlsb3MgZGUgYm90w7VlcyBwYXJhIGVsZW1lbnRvcy4gUG9yIHJhesO1ZXMgZGUgYWNlc3NpYmlsaWRhZGUsIG9zIGJvdMO1ZXMgdXNhbSB1bSBlbGVtZW50byBidXR0b24gcGFkcsOjby5cclxuICpcclxuICogw4kgdW1hIGFic3RyYcOnw6NvIHBhcmEgb3MgW2JvdMO1ZXMgZG8gQm9vdHN0cmFwIDRde0BsaW5rIGh0dHBzOi8vZ2V0Ym9vdHN0cmFwLmNvbS9kb2NzLzQuMS9jb21wb25lbnRzL2J1dHRvbnN9LCBjb20gYWxndW1hcyBtZWxob3JpYXMgZSBlc3RpbG9zIHBlcnNvbmFsaXphZG9zLlxyXG4gKlxyXG4gKiBEZW1vOiB7QGxpbmsgaHR0cHM6Ly9naXR1ZXguZ2l0bGFiLmlvL2V4dGVuc2lvbnMvd2ViLWV4dGVuc2lvbnMjY29tcG9uZW50cy9idXR0b259XHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ1t1ZXgtYnV0dG9uXScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2J1dHRvbi5jb21wb25lbnQuaHRtbCcsXHJcbiAgaG9zdDoge1xyXG4gICAgJ2NsYXNzJzogJ3VleC1idXR0b24nLFxyXG4gICAgJ1thdHRyLnR5cGVdJzogJ2lzX2J1dHRvbiA/IHR5cGUgOiBudWxsJyxcclxuICAgICdbY2xhc3Mud2l0aC1yaXBwbGVdJzogJ2hhc1JpcHBsZSgpJyxcclxuICAgICdbY2xhc3MucmlwcGxlLWRhcmtdJzogJ2lzRGFya1JpcHBsZSgpJ1xyXG4gIH1cclxufSlcclxuZXhwb3J0IGNsYXNzIEJ1dHRvbkNvbXBvbmVudCBleHRlbmRzIFJpcHBsZURpcmVjdGl2ZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIERlZmluZSBvIGF0cmlidXRvIFwidGl0bGVcIiBkZSBsYXlvdXQgcXVlIHNlcsOhIGFwbGljYWRvIGFvIGJvdMOjb1xyXG4gICAqL1xyXG4gIEBJbnB1dCgndHlwZScpIHR5cGUgPSAnYnV0dG9uJztcclxuXHJcbiAgLyoqXHJcbiAgICogRGVmaW5lIG8gbW9kbyBkZSBsYXlvdXQgcXVlIHNlcsOhIGFwbGljYWRvIGFvIGJvdMOjb1xyXG4gICAqL1xyXG4gIEBJbnB1dCgnbW9kZScpXHJcbiAgcHJpdmF0ZSBzZXQgX3NldE1vZGUobW9kZTogQnV0dG9uTW9kZSkge1xyXG4gICAgdGhpcy5fbW9kZSA9IG1vZGU7XHJcbiAgICB0aGlzLl91cGRhdGVDbGFzc2VzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWZpbmUgYSBjb3IgcXVlIHNlcsOhIGFwbGljYWRhIGFvIGJvdMOjb1xyXG4gICAqL1xyXG4gIEBJbnB1dCgnY29sb3InKVxyXG4gIHByaXZhdGUgc2V0IF9zZXRDb2xvcihjb2xvcjogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9jb2xvciA9IGNvbG9yO1xyXG4gICAgdGhpcy5fdXBkYXRlQ2xhc3NlcygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVmaW5lIG8gdGFtYW5obyBxdWUgc2Vyw6EgYXBsaWNhZG8gYW8gYm90w6NvXHJcbiAgICovXHJcbiAgQElucHV0KCdzaXplJylcclxuICBwcml2YXRlIHNldCBfc2V0U2l6ZShzaXplOiBCdXR0b25TaXplKSB7XHJcbiAgICB0aGlzLl9zaXplID0gc2l6ZTtcclxuICAgIHRoaXMuX3VwZGF0ZUNsYXNzZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlZmluZSBzZSBzZXLDoSBhcGxpY2FkYSBib3JkYSBhcnJlZG9uZGFkYSBhbyBib3TDo29cclxuICAgKi9cclxuICBASW5wdXQoJ3JvdW5kZWQnKVxyXG4gIHByaXZhdGUgc2V0IF9zZXRSb3VuZGVkKHJvdW5kZWQ6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX3JvdW5kZWQgPSB0aGlzLl9nZXRBdHRyaWJ1dGUocm91bmRlZCwgdHJ1ZSk7XHJcbiAgICB0aGlzLl91cGRhdGVDbGFzc2VzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWZpbmUgc2Ugc2Vyw6EgYXBsaWNhZGEgbGFyZ3VyYSBcIjEwMCVcIiBhcnJlZG9uZGFkYSBhbyBib3TDo29cclxuICAgKi9cclxuICBASW5wdXQoJ2Jsb2NrJylcclxuICBwcml2YXRlIHNldCBfc2V0QmxvY2soYmxvY2s6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2Jsb2NrID0gdGhpcy5fZ2V0QXR0cmlidXRlKGJsb2NrLCB0cnVlKTtcclxuICAgIHRoaXMuX3VwZGF0ZUNsYXNzZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlZmluZSBzZSBvIGJvdMOjbyBkZXZlcsOhIHNlIGFqdXN0YXIgcGFyYSByZWNlYmVyIGFwZW5hcyB1bSBpY29uZVxyXG4gICAqL1xyXG4gIEBJbnB1dCgnaWNvbi1vbmx5JylcclxuICBwcml2YXRlIHNldCBfc2V0SWNvbk9ubHkoaWNvbl9vbmx5OiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9pY29uX29ubHkgPSB0aGlzLl9nZXRBdHRyaWJ1dGUoaWNvbl9vbmx5LCB0cnVlKTtcclxuICAgIHRoaXMuX3VwZGF0ZUNsYXNzZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlZmluZSBzZSBvIGJvdMOjbyBkZXZlcsOhIHNlIGFqdXN0YXIgcGFyYSByZWNlYmVyIHVtIGljb25lIGEgZGlyZWl0YVxyXG4gICAqL1xyXG4gIEBJbnB1dCgnaWNvbi1yaWdodCcpXHJcbiAgcHJpdmF0ZSBzZXQgX3NldEljb25SaWdodChpY29uX3JpZ2h0OiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9pY29uX3JpZ2h0ID0gdGhpcy5fZ2V0QXR0cmlidXRlKGljb25fcmlnaHQsIHRydWUpO1xyXG4gICAgdGhpcy5fdXBkYXRlQ2xhc3NlcygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVmaW5lIHNlIG8gYm90w6NvIGRldmVyw6Egc2UgYWp1c3RhciBwYXJhIHJlY2ViZXIgdW0gaWNvbmUgYSBlc3F1ZXJkYVxyXG4gICAqL1xyXG4gIEBJbnB1dCgnaWNvbi1sZWZ0JylcclxuICBwcml2YXRlIHNldCBfc2V0SWNvbkxlZnQoaWNvbl9sZWZ0OiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9pY29uX2xlZnQgPSB0aGlzLl9nZXRBdHRyaWJ1dGUoaWNvbl9sZWZ0LCB0cnVlKTtcclxuICAgIHRoaXMuX3VwZGF0ZUNsYXNzZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyBlbGVtZW50UmVmOiBFbGVtZW50UmVmXHJcbiAgKSB7XHJcbiAgICBzdXBlcihlbGVtZW50UmVmKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NvbG9yID0gJ3ByaW1hcnknO1xyXG4gIHByaXZhdGUgX21vZGU6IEJ1dHRvbk1vZGUgPSAncmFpc2VkJztcclxuICBwcml2YXRlIF9zaXplOiBCdXR0b25TaXplID0gJ2RlZmF1bHQnO1xyXG4gIHByaXZhdGUgX3JvdW5kZWQgPSBmYWxzZTtcclxuICBwcml2YXRlIF9ibG9jayA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2ljb25fb25seSA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2ljb25fcmlnaHQgPSBmYWxzZTtcclxuICBwcml2YXRlIF9pY29uX2xlZnQgPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBfY2xhc3NlczogQXJyYXk8c3RyaW5nPiA9IFtdO1xyXG5cclxuICBwdWJsaWMgaXNfYnV0dG9uID0gZmFsc2U7XHJcblxyXG4gIHB1YmxpYyBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuaXNfYnV0dG9uID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQudGFnTmFtZSA9PSAnQlVUVE9OJztcclxuICAgIHRoaXMuX3VwZGF0ZUNsYXNzZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERpc3TDom5jaWEgZG8gZWxlbWVudG8gcGFyYSBvIHRvcG8gZG8gZWxlbWVudG8gcGFpIG1haXMgcHLDs3hpbW8gcG9zaWNpb25hZG8gY29tIHJlbGF0aXZlXHJcbiAgICovXHJcbiAgcHVibGljIGdldCBvZmZzZXRUb3AoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5vZmZzZXRUb3A7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEaXNwYXJhIG8gZ2F0aWxobyBkZSBmb2N1cyBkbyBib3TDo29cclxuICAgKlxyXG4gICAqIEBwYXJhbSBbaGFzX2RlbGF5PWZhbHNlXSAtIEFkaWNpb25hIHVtIGRlbGF5IGRlIDMwMG1zIHBhcmEgZGlzcGFyYXIgbyBnYXRpbGhvIGRlcG9pc1xyXG4gICAqL1xyXG4gIHB1YmxpYyBmb2N1cyhoYXNfZGVsYXk6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgaWYgKGhhc19kZWxheSkge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuX2RvRm9jdXMoKSwgMzAwKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX2RvRm9jdXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIHB1YmxpYyBoYXNSaXBwbGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gIXRoaXMubm9fcmlwcGxlICYmICF0aGlzLl9pc091dGxpbmUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIHB1YmxpYyBpc0RhcmtSaXBwbGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5oYXNSaXBwbGUoKSAmJiB0aGlzLl9pc0NsZWFyKCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8gTW9kZXNcclxuXHJcbiAgcHJpdmF0ZSBfaXNGYWIoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fbW9kZSA9PSAnZmFiJztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2lzRmFiRmxhdCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9tb2RlID09ICdmYWItZmxhdCc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pc0NsZWFyKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX21vZGUgPT0gJ2NsZWFyJztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2lzSWNvbigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9tb2RlID09ICdpY29uJztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2lzT3V0bGluZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9tb2RlID09ICdvdXRsaW5lJztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2lzUmFpc2VkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX21vZGUgPT0gJ3JhaXNlZCc7XHJcbiAgfVxyXG5cclxuICAvLyBTaXplc1xyXG5cclxuICBwcml2YXRlIF9pc1hTbWFsbCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9zaXplID09ICdtaWNybycgfHwgdGhpcy5fc2l6ZSA9PSAneHNtYWxsJyB8fCB0aGlzLl9zaXplID09ICd4cyc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pc1NtYWxsKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NpemUgPT0gJ21pbmknIHx8IHRoaXMuX3NpemUgPT0gJ3NtYWxsJyB8fCB0aGlzLl9zaXplID09ICdzbSc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pc0xhcmdlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NpemUgPT0gJ2xhcmdlJyB8fCB0aGlzLl9zaXplID09ICdsZyc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pc1hMYXJnZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9zaXplID09ICd4bGFyZ2UnIHx8IHRoaXMuX3NpemUgPT0gJ3hsJztcclxuICB9XHJcblxyXG4gIC8vIE1pc2NlbGxhbmVvdXNcclxuXHJcbiAgcHJpdmF0ZSBfaXNSb3VuZGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JvdW5kZWQgJiYgIXRoaXMuX2lzSWNvbigpICYmICF0aGlzLl9pc0ZhYigpICYmICF0aGlzLl9pc0ZhYkZsYXQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2lzQmxvY2soKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fYmxvY2sgJiYgIXRoaXMuX2lzSWNvbigpICYmICF0aGlzLl9pc0ZhYigpICYmICF0aGlzLl9pc0ZhYkZsYXQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2lzSWNvbk9ubHkoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faWNvbl9vbmx5ICYmICF0aGlzLl9pc0ljb24oKSAmJiAhdGhpcy5faXNGYWIoKSAmJiAhdGhpcy5faXNGYWJGbGF0KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pc0ljb25SaWdodCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pY29uX3JpZ2h0ICYmICF0aGlzLl9pc0ljb24oKSAmJiAhdGhpcy5faXNGYWIoKSAmJiAhdGhpcy5faXNGYWJGbGF0KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pc0ljb25MZWZ0KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ljb25fbGVmdCAmJiAhdGhpcy5faXNJY29uKCkgJiYgIXRoaXMuX2lzRmFiKCkgJiYgIXRoaXMuX2lzRmFiRmxhdCgpO1xyXG4gIH1cclxuXHJcbiAgLy8gQ29sb3JzXHJcblxyXG4gIHByaXZhdGUgX3VwZGF0ZUNsYXNzZXMoKSB7XHJcbiAgICB0aGlzLl9jbGVhckNsYXNzZXMoKTtcclxuXHJcbiAgICB0aGlzLl9jbGFzc2VzLnB1c2goJ2J0bicpO1xyXG5cclxuICAgIGlmICh0aGlzLl9pc0ZhYigpKSB7IHRoaXMuX2NsYXNzZXMucHVzaCgnYnRuLWZhYicpOyB9XHJcbiAgICBpZiAodGhpcy5faXNGYWJGbGF0KCkpIHsgdGhpcy5fY2xhc3Nlcy5wdXNoKCdidG4tZmFiLWZsYXQnKTsgfVxyXG4gICAgaWYgKHRoaXMuX2lzQ2xlYXIoKSkgeyB0aGlzLl9jbGFzc2VzLnB1c2goJ2J0bi1jbGVhcicpOyB9XHJcbiAgICBpZiAodGhpcy5faXNJY29uKCkpIHsgdGhpcy5fY2xhc3Nlcy5wdXNoKCdidG4taWNvbicpOyB9XHJcbiAgICBpZiAodGhpcy5faXNPdXRsaW5lKCkpIHsgdGhpcy5fY2xhc3Nlcy5wdXNoKCdidG4tb3V0bGluZScpOyB9XHJcbiAgICBpZiAodGhpcy5faXNSYWlzZWQoKSkgeyB0aGlzLl9jbGFzc2VzLnB1c2goJ2J0bi1yYWlzZWQnKTsgfVxyXG5cclxuICAgIGlmICh0aGlzLl9pc1JvdW5kZWQoKSkgeyB0aGlzLl9jbGFzc2VzLnB1c2goJ2J0bi1yb3VuZGVkJyk7IH1cclxuICAgIGlmICh0aGlzLl9pc0Jsb2NrKCkpIHsgdGhpcy5fY2xhc3Nlcy5wdXNoKCdidG4tYmxvY2snKTsgfVxyXG4gICAgaWYgKHRoaXMuX2lzSWNvbk9ubHkoKSkgeyB0aGlzLl9jbGFzc2VzLnB1c2goJ2J0bi1pY29uLW9ubHknKTsgfVxyXG4gICAgaWYgKHRoaXMuX2lzSWNvblJpZ2h0KCkpIHsgdGhpcy5fY2xhc3Nlcy5wdXNoKCdidG4taWNvbi1yaWdodCcpOyB9XHJcbiAgICBpZiAodGhpcy5faXNJY29uTGVmdCgpKSB7IHRoaXMuX2NsYXNzZXMucHVzaCgnYnRuLWljb24tbGVmdCcpOyB9XHJcblxyXG4gICAgaWYgKHRoaXMuX2lzWFNtYWxsKCkpIHsgdGhpcy5fY2xhc3Nlcy5wdXNoKCdidG4teHMnKTsgfVxyXG4gICAgaWYgKHRoaXMuX2lzU21hbGwoKSkgeyB0aGlzLl9jbGFzc2VzLnB1c2goJ2J0bi1zbScpOyB9XHJcbiAgICBpZiAodGhpcy5faXNMYXJnZSgpKSB7IHRoaXMuX2NsYXNzZXMucHVzaCgnYnRuLWxnJyk7IH1cclxuICAgIGlmICh0aGlzLl9pc1hMYXJnZSgpKSB7IHRoaXMuX2NsYXNzZXMucHVzaCgnYnRuLXhsJyk7IH1cclxuXHJcbiAgICBpZiAodGhpcy5fY29sb3IgPT0gJ2xpbmsnKSB7XHJcbiAgICAgIHRoaXMuX2NsYXNzZXMucHVzaChgYnRuLSR7dGhpcy5fY29sb3J9YCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9jbGFzc2VzLnB1c2goYGJ0bi0ke3RoaXMuX2lzT3V0bGluZSgpID8gJ291dGxpbmUtJyA6ICcnfSR7dGhpcy5fY29sb3IgfHwgJ2RlZmF1bHQnfWApO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX3NldENsYXNzZXMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NsZWFyQ2xhc3NlcygpIHtcclxuICAgIGlmICh0aGlzLl9jbGFzc2VzKSB7XHJcbiAgICAgIGNvbnN0IGN1cnJlbnRfY2xhc3NlcyA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTmFtZS5zcGxpdCgnICcpO1xyXG4gICAgICB0aGlzLl9jbGFzc2VzLmZvckVhY2goKF9jbGFzcykgPT4ge1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gY3VycmVudF9jbGFzc2VzLmluZGV4T2YoX2NsYXNzKTtcclxuICAgICAgICBpZiAoaW5kZXggPiAtMSkgeyBjdXJyZW50X2NsYXNzZXMuc3BsaWNlKGluZGV4LCAxKTsgfVxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5fY2xhc3NlcyA9IFtdO1xyXG4gICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGFzc05hbWUgPSBjdXJyZW50X2NsYXNzZXMuam9pbignICcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc2V0Q2xhc3NlcygpIHtcclxuICAgIGNvbnN0IGN1cnJlbnRfY2xhc3NlcyA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTmFtZS5zcGxpdCgnICcpLmZpbHRlcigoaSkgPT4gISFpKTtcclxuICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTmFtZSA9IF8uY29uY2F0KGN1cnJlbnRfY2xhc3NlcywgdGhpcy5fY2xhc3Nlcykuam9pbignICcpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZG9Gb2N1cygpIHtcclxuICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXRBdHRyaWJ1dGU8VD4odmFsdWU6IGFueSwgYm9vbGVhbjogYm9vbGVhbiA9IGZhbHNlKTogYW55IHtcclxuICAgIGlmIChib29sZWFuKSB7IHJldHVybiAoXy5pc1N0cmluZyh2YWx1ZSkgJiYgdmFsdWUgIT09ICdmYWxzZScpIHx8IChfLmlzQm9vbGVhbih2YWx1ZSkgJiYgISF2YWx1ZSk7IH1cclxuICAgIHJldHVybiAhIXZhbHVlID8gdmFsdWUgOiBudWxsO1xyXG4gIH1cclxufVxyXG5cclxudHlwZSBCdXR0b25Nb2RlRGVmYXVsdCA9ICdmbGF0JztcclxudHlwZSBCdXR0b25Nb2RlRmFiID0gJ2ZhYicgfCAnZmFiLWZsYXQnO1xyXG50eXBlIEJ1dHRvbk1vZGVDbGVhciA9ICdjbGVhcic7XHJcbnR5cGUgQnV0dG9uTW9kZUljb24gPSAnaWNvbic7XHJcbnR5cGUgQnV0dG9uTW9kZVJhaXNlZCA9ICdyYWlzZWQnO1xyXG50eXBlIEJ1dHRvbk1vZGVPdXRsaW5lID0gJ291dGxpbmUnO1xyXG5cclxuLyoqXHJcbiAqIE1vZG9zIHN1cG9ydGFkb3MgcGVsbyBib3TDo29cclxuICovXHJcbmV4cG9ydCB0eXBlIEJ1dHRvbk1vZGUgPSBCdXR0b25Nb2RlRGVmYXVsdCB8IEJ1dHRvbk1vZGVGYWIgfCBCdXR0b25Nb2RlQ2xlYXIgfCBCdXR0b25Nb2RlSWNvbiB8IEJ1dHRvbk1vZGVSYWlzZWQgfCBCdXR0b25Nb2RlT3V0bGluZTtcclxuXHJcbnR5cGUgQnV0dG9uU2l6ZURlZmF1bHQgPSAnZGVmYXVsdCc7XHJcbnR5cGUgQnV0dG9uU2l6ZVhTbWFsbCA9ICdtaWNybycgfCAneHNtYWxsJyB8ICd4cyc7XHJcbnR5cGUgQnV0dG9uU2l6ZVNtYWxsID0gJ21pbmknIHwgJ3NtYWxsJyB8ICdzbSc7XHJcbnR5cGUgQnV0dG9uU2l6ZUxhcmdlID0gJ2xhcmdlJyB8ICdsZyc7XHJcbnR5cGUgQnV0dG9uU2l6ZVhMYXJnZSA9ICd4bGFyZ2UnIHwgJ3hsJztcclxuXHJcbi8qKlxyXG4gKiBUYW1hbmhvcyBzdXBvcnRhZG9zIHBlbG8gYm90w6NvXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBCdXR0b25TaXplID0gQnV0dG9uU2l6ZURlZmF1bHQgfCBCdXR0b25TaXplWFNtYWxsIHwgQnV0dG9uU2l6ZVNtYWxsIHwgQnV0dG9uU2l6ZUxhcmdlIHwgQnV0dG9uU2l6ZVhMYXJnZTtcclxuIl19