UNPKG

@tiposaurio/guido-lib

Version:
380 lines 34.5 kB
/** * @fileoverview added by tsickle * Generated from: lib/components/steps/steps.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input, QueryList, Directive, ContentChild, ContentChildren, TemplateRef, Output, EventEmitter, } from '@angular/core'; import { slideOfRight } from './animations/slide-of-right.animation'; import { ConfigNames, AppStepConfig } from './step-config'; // import { LambStepConfig, ConfigNames } from '@lamb/steps/step-config'; // import { slideOfRight } from '@lamb/steps/animations/slide-of-right.animation'; export class AppStepTitleDirective { /** * @param {?} templateRef */ constructor(templateRef) { this.templateRef = templateRef; } } AppStepTitleDirective.decorators = [ { type: Directive, args: [{ selector: 'ng-template[appStepTitle]', },] } ]; /** @nocollapse */ AppStepTitleDirective.ctorParameters = () => [ { type: TemplateRef } ]; if (false) { /** @type {?} */ AppStepTitleDirective.prototype.templateRef; } export class AppStepContentDirective { /** * @param {?} templateRef */ constructor(templateRef) { this.templateRef = templateRef; } } AppStepContentDirective.decorators = [ { type: Directive, args: [{ selector: 'ng-template[appStepContent]', },] } ]; /** @nocollapse */ AppStepContentDirective.ctorParameters = () => [ { type: TemplateRef } ]; if (false) { /** @type {?} */ AppStepContentDirective.prototype.templateRef; } /** @type {?} */ let nextId = 0; export class AppStepDirective { constructor() { this.id = `app-step-${nextId++}`; this.disabled = false; // @Input() disabled = true; this.isValidStep = true; } // public isValidStep: boolean = false; /** * @param {?} value * @return {?} */ set validStep(value) { this.isValidStep = (value === 'true' || value === true) ? true : false; } } AppStepDirective.decorators = [ { type: Directive, args: [{ // tslint:disable-next-line:directive-selector selector: 'gui-step', },] } ]; AppStepDirective.propDecorators = { id: [{ type: Input }], title: [{ type: Input }], icon: [{ type: Input }], data: [{ type: Input }], disabled: [{ type: Input }], validStep: [{ type: Input }], titleTemplate: [{ type: ContentChild, args: [AppStepTitleDirective,] }], contentTemplate: [{ type: ContentChild, args: [AppStepContentDirective,] }] }; if (false) { /** @type {?} */ AppStepDirective.prototype.id; /** @type {?} */ AppStepDirective.prototype.title; /** @type {?} */ AppStepDirective.prototype.icon; /** * Guarda Cualquier dato. Creado por el Equipo Lamb. * @type {?} */ AppStepDirective.prototype.data; /** @type {?} */ AppStepDirective.prototype.disabled; /** @type {?} */ AppStepDirective.prototype.isValidStep; /** @type {?} */ AppStepDirective.prototype.titleTemplate; /** @type {?} */ AppStepDirective.prototype.contentTemplate; } /** * @record */ export function AppStepChangeEvent() { } if (false) { /** * Id de la pestaña actualmente activa. * @type {?} */ AppStepChangeEvent.prototype.activeId; /** * Id de la pestaña recién seleccionada. * @type {?} */ AppStepChangeEvent.prototype.nextId; /** * data guardada en la pestaña actualmente activa. * @type {?} */ AppStepChangeEvent.prototype.activeData; /** * Función que evitará el cambio de pertaña si se llama. * @type {?} */ AppStepChangeEvent.prototype.preventDefault; } export class AppStepGroupComponent { /** * @param {?} config */ constructor(config) { this.config = config; this.hideContent = false; /** * Cuando cambia de step se destruira el contenido anterior o solo se oculatará? */ // @Input() destroyOnHide: boolean = true; this.destroyOnHide = false; /** * Emite cuando hay cambios de steps. */ this.stepChange = new EventEmitter(); // tslint:disable-next-line: no-output-on-prefix this.onComplete = new EventEmitter(); this.type = this.config.type; this.justify = this.config.justify; this.orientation = this.config.orientation; this.iConfigNames = this.config.configNames; } /** * @param {?} confign * @return {?} */ set configNames(confign) { this.iConfigNames.buttonBack = confign.buttonBack || this.iConfigNames.buttonBack; this.iConfigNames.buttonNext = confign.buttonNext || this.iConfigNames.buttonNext; this.iConfigNames.buttonFinish = confign.buttonFinish || this.iConfigNames.buttonFinish; } /** * @param {?} className * @return {?} */ set justify(className) { if (className === 'fill' || className === 'justified') { this.justifyClass = `nav-${className}`; } else { this.justifyClass = `justify-content-${className}`; } } /** * @param {?} stepId * @return {?} */ onSelect(stepId) { /** @type {?} */ const selectedStep = this.getStepById(stepId); /** @type {?} */ const selectedActive = this.getStepById(this.activeId); // console.log('selectedStep'); // console.log(selectedStep); if (selectedStep && !selectedStep.disabled && this.activeId !== selectedStep.id) { /** @type {?} */ let defaultPrevented = false; this.stepChange.emit({ activeId: this.activeId, activeData: selectedActive.data || null, nextId: selectedStep.id, preventDefault: (/** * @return {?} */ () => { defaultPrevented = true; }), }); if (!defaultPrevented) { this.activeId = selectedStep.id; } } } /** * @return {?} */ ngOnInit() { } /** * @return {?} */ ngAfterContentChecked() { /** @type {?} */ const activeStep = this.getStepById(this.activeId); this.activeId = activeStep ? activeStep.id : (this.steps.length ? this.steps.first.id : null); } /** * @private * @param {?} id * @return {?} */ getStepById(id) { /** @type {?} */ const stepsWithId = this.steps.filter((/** * @param {?} step * @return {?} */ step => step.id === id)); return stepsWithId.length ? stepsWithId[0] : null; } /** * @return {?} */ back() { /** @type {?} */ const back = this.getStepIdSplice(-1); this.onSelect(back); } /** * @return {?} */ next() { /** @type {?} */ const next = this.getStepIdSplice(+1); this.onSelect(next); } /** * @return {?} */ complete() { this.onComplete.emit(); } /** * @param {?} stepId * @return {?} */ current(stepId) { this.onSelect(stepId); } /** * @private * @param {?} condicion * @return {?} */ getStepIdSplice(condicion) { /** @type {?} */ const actual = this.activeId; /** @type {?} */ const splice = actual.slice(0, actual.length - 1); /** @type {?} */ const index = parseInt(actual.slice((actual.length - 1), actual.length), 10); /** @type {?} */ const next = `${splice}${(index + (condicion))}`; return next; } /** * @return {?} */ get hidePrevious() { return this.activeId !== 'app-step-0'; } /** * @return {?} */ get hideNext() { /** @type {?} */ const allLength = (this.steps.length - 1); return this.activeId !== 'app-step-' + allLength; } /** * @param {?} stepId * @return {?} */ hideLineRight(stepId) { /** @type {?} */ const step = parseInt(stepId.slice(stepId.length - 1, stepId.length), 10); return (this.steps.length !== (step + 1)); } /** * @return {?} */ ngOnDestroy() { nextId = 0; } } AppStepGroupComponent.decorators = [ { type: Component, args: [{ selector: 'gui-step-group', template: "<!-- <ul class=\"nav justify-content-center\" id=\"myStep\" role=\"steplist\"> -->\r\n<ul [class]=\"'nav lamb-nav-tabs nav-' + type + (orientation == 'horizontal'? ' ' + justifyClass : ' flex-column' )\" id=\"myStep\"\r\n role=\"steplist\">\r\n\r\n <!-- <ng-template ngFor let-step [ngForOf]=\"steps\" *ngFor=\"let step of steps\"> -->\r\n <ng-template ngFor let-step [ngForOf]=\"steps\">\r\n <li class=\"nav-item\">\r\n <a [id]=\"step.id\" class=\"nav-link\" [class.active]=\"step.id === activeId\" [class.disabled]=\"step.disabled || !step.isValidStep\"\r\n role=\"step\" [attr.stepindex]=\"(step.disabled || !step.isValidStep ? '-1': undefined)\"\r\n [attr.aria-controls]=\"(!destroyOnHide || step.id === activeId ? step.id + '-panel': null)\" [attr.aria-expanded]=\"step.id === activeId\"\r\n [attr.aria-disabled]=\"step.disabled || !step.isValidStep\" (click)=\"current(step.id)\"><!---->\r\n <!-- (click)=\"!!onSelect(step.id)\" | Yo Guido declaro haber modificado el codigo de vitmar jhonson, pero si funciona la cosa...vamos con f\u00E9--> \r\n <!-- data-toggle=\"step\" aria-selected=\"true\" -->\r\n <ng-template [ngIf]=\"step.icon\">\r\n <span class=\"lamb-round-tabs\" [title]=\"step.title\">\r\n <i class=\"{{ step.icon }} lamb-icon\"></i>\r\n </span>\r\n </ng-template>\r\n <br>\r\n <span class=\"lamb-round-text\">\r\n {{ step.title }}\r\n </span>\r\n <ng-template [ngTemplateOutlet]=\"step.titleTemplate?.templateRef\"></ng-template>\r\n </a>\r\n </li>\r\n <li class=\"nav-line\" *ngIf=\"hideLineRight(step.id)\">\r\n <div class=\"lamb-liner\"></div>\r\n </li>\r\n </ng-template>\r\n\r\n <!-- <ng-content select=\"lamb-step-head\"></ng-content> -->\r\n</ul>\r\n<div class=\"tab-content lamb-content\" id=\"myStepContent\">\r\n <!-- <ng-content select=\"lamb-step-body\"></ng-content> -->\r\n <ng-template ngFor let-step [ngForOf]=\"steps\">\r\n <!-- class=\"step-pane fade {{ step.id === activeId ? 'active': null }}\" -->\r\n <!--\r\n <div [@slideOfRight]=\"((step.id === activeId) && (status === 'next')) ? 'next': 'back'\" class=\"tab-pane {{ step.id === activeId ? 'active': 'active' }}\"\r\n *ngIf=\"!destroyOnHide || step.id === activeId\" role=\"steppanel\" [attr.aria-labelledby]=\"step.id\" id=\"{{ step.id }}-panel\"\r\n [attr.aria-expanded]=\"step.id === activeId\"> -->\r\n\r\n <div class=\"tab-pane {{ step.id === activeId ? 'active': null }}\" *ngIf=\"!destroyOnHide || step.id === activeId\" role=\"steppanel\"\r\n [attr.aria-labelledby]=\"step.id\" id=\"{{ step.id }}-panel\" [attr.aria-expanded]=\"step.id === activeId\">\r\n <div class=\"container\">\r\n <!---<div class=\"row\">\r\n <div class=\"col-md-12\">-->\r\n <ng-template [ngTemplateOutlet]=\"step.contentTemplate?.templateRef\"></ng-template>\r\n <!--</div>\r\n </div>-->\r\n </div>\r\n <!-- <div class=\"row lamb-button-manage\">\r\n <div class=\"offset-md-4 col-md-4\">\r\n <div class=\"row\">\r\n <div class=\"col-md-6\" *ngIf=\"hidePrevious\">\r\n <div class=\"form-group text-center space-20\">\r\n <button class=\"btn btn-sm btn-block btn-outline-rounded btn-secondary\" (click)=\"back()\">\r\n <span style=\"margin-right:10px;\" class=\"fa fa-arrow-left\"></span>\r\n {{ iConfigNames.buttonBack }}\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\" *ngIf=\"hideNext\">\r\n <div class=\"form-group text-center space-20\">\r\n <button class=\"btn btn-sm btn-block btn-outline-rounded btn-info\" [disabled]=\"!step.isValidStep\" (click)=\"next()\">\r\n {{ iConfigNames.buttonNext }}\r\n <span style=\"margin-left:10px;\" class=\"fa fa-arrow-right\"></span>\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\" *ngIf=\"hidePrevious && !hideNext\">\r\n <div class=\"form-group text-center space-20\">\r\n <button class=\"btn btn-sm btn-block btn-outline-rounded btn-info\" [disabled]=\"!step.isValidStep\" (click)=\"complete()\">\r\n {{ iConfigNames.buttonFinish }}\r\n <span style=\"margin-left:10px;\" class=\"fa fa-check\"></span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div> -->\r\n </div>\r\n </ng-template>\r\n</div>", // animations: [Animations.slideInOut, Animations.slideOfRight], animations: [slideOfRight], styles: [".lamb-liner{height:2px;background:#ececec;position:relative;width:5rem;margin:0 auto;right:0;top:1.8rem;z-index:1;left:.5rem;color:#333}.tab-content{padding-top:.3rem}.nav-link{padding:0 0 5px}.nav-link .lamb-round-text{color:#000;text-transform:uppercase;font-size:.7rem}@media (max-width:550px){.lamb-liner{width:1rem}.nav-link .lamb-round-text{display:none}}.nav-link.active span.lamb-round-tabs{background:#2962ff;color:#fff}.lamb-nav-tabs{border-bottom:transparent;position:relative;margin:0 auto;box-sizing:border-box;text-align:center;padding:0 1.5rem;background-color:#fff;border-radius:1px solid #ccc}.lamb-nav-tabs li.nav-line{padding-left:0;padding-right:0}.lamb-nav-tabs li a{text-decoration:none}.lamb-button-manage{margin-top:1.5rem}span.lamb-round-tabs{width:40px;height:40px;line-height:40px;display:inline-block;border-radius:100px;background:#ececec;z-index:2;left:-1;text-align:center;font-size:1.3rem;position:relative;margin-top:.6rem;margin-bottom:0;color:#333}"] }] } ]; /** @nocollapse */ AppStepGroupComponent.ctorParameters = () => [ { type: AppStepConfig } ]; AppStepGroupComponent.propDecorators = { steps: [{ type: ContentChildren, args: [AppStepDirective,] }], activeId: [{ type: Input }], configNames: [{ type: Input }], destroyOnHide: [{ type: Input }], stepChange: [{ type: Output }], onComplete: [{ type: Output }], justify: [{ type: Input }], orientation: [{ type: Input }], type: [{ type: Input }] }; if (false) { /** @type {?} */ AppStepGroupComponent.prototype.justifyClass; /** @type {?} */ AppStepGroupComponent.prototype.hideContent; /** @type {?} */ AppStepGroupComponent.prototype.steps; /** * Id del step que saldrá activado por defecto. * @type {?} */ AppStepGroupComponent.prototype.activeId; /** * Personalizar el nombre 'Anterior | siguiente y Finalizar' * Formato de variable : objecto * Ej. configNames: object = {buttonBack: 'Regresar', buttonNext: 'Grabar', buttonFinish: 'Fin'} * @type {?} */ AppStepGroupComponent.prototype.iConfigNames; /** * Cuando cambia de step se destruira el contenido anterior o solo se oculatará? * @type {?} */ AppStepGroupComponent.prototype.destroyOnHide; /** * Emite cuando hay cambios de steps. * @type {?} */ AppStepGroupComponent.prototype.stepChange; /** @type {?} */ AppStepGroupComponent.prototype.onComplete; /** @type {?} */ AppStepGroupComponent.prototype.orientation; /** @type {?} */ AppStepGroupComponent.prototype.type; /** * @type {?} * @private */ AppStepGroupComponent.prototype.config; } /** @type {?} */ export const APP_STEPS_COMPONENTS = [ AppStepGroupComponent, AppStepDirective, AppStepTitleDirective, AppStepContentDirective, ]; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHRpcG9zYXVyaW8vZ3VpZG8tbGliLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvc3RlcHMvc3RlcHMuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUNILFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUMzQixTQUFTLEVBQUUsWUFBWSxFQUN2QixlQUFlLEVBQUUsV0FBVyxFQUF1QixNQUFNLEVBQUUsWUFBWSxHQUMxRSxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDckUsT0FBTyxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7OztBQU8zRCxNQUFNLE9BQU8scUJBQXFCOzs7O0lBQzlCLFlBQW1CLFdBQTZCO1FBQTdCLGdCQUFXLEdBQVgsV0FBVyxDQUFrQjtJQUFJLENBQUM7OztZQUp4RCxTQUFTLFNBQUM7Z0JBQ1AsUUFBUSxFQUFFLDJCQUEyQjthQUN4Qzs7OztZQVRvQixXQUFXOzs7O0lBV2hCLDRDQUFvQzs7QUFNcEQsTUFBTSxPQUFPLHVCQUF1Qjs7OztJQUNoQyxZQUFtQixXQUE2QjtRQUE3QixnQkFBVyxHQUFYLFdBQVcsQ0FBa0I7SUFBSSxDQUFDOzs7WUFKeEQsU0FBUyxTQUFDO2dCQUNQLFFBQVEsRUFBRSw2QkFBNkI7YUFDMUM7Ozs7WUFoQm9CLFdBQVc7Ozs7SUFrQmhCLDhDQUFvQzs7O0lBR2hELE1BQU0sR0FBRyxDQUFDO0FBTWQsTUFBTSxPQUFPLGdCQUFnQjtJQUo3QjtRQU1hLE9BQUUsR0FBVyxZQUFZLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFXcEMsYUFBUSxHQUFHLEtBQUssQ0FBQzs7UUFHbkIsZ0JBQVcsR0FBWSxJQUFJLENBQUM7SUFVdkMsQ0FBQzs7Ozs7O0lBUEcsSUFDSSxTQUFTLENBQUMsS0FBdUI7UUFDakMs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QUUsRUFBRSxDQUFDO1FBQ3pFLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlDLENBQUM7Ozs7SUFFTSxXQUFXO1FBQ2QsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNmLENBQUM7OztZQTlJSixTQUFTLFNBQUM7Z0JBQ1AsUUFBUSxFQUFFLGdCQUFnQjtnQkFDMUIsOHZLQUFxQzs7Z0JBR3JDLFVBQVUsRUFBRSxDQUFDLFlBQVksQ0FBQzs7YUFDN0I7Ozs7WUFqRnFCLGFBQWE7OztvQkF1RjlCLGVBQWUsU0FBQyxnQkFBZ0I7dUJBS2hDLEtBQUs7MEJBT0wsS0FBSzs0QkFXTCxLQUFLO3lCQUtMLE1BQU07eUJBR04sTUFBTTtzQkFFTixLQUFLOzBCQXlDTCxLQUFLO21CQUVMLEtBQUs7Ozs7SUEvRU4sNkNBQXFCOztJQUNyQiw0Q0FBb0M7O0lBRXBDLHNDQUFzRTs7Ozs7SUFLdEUseUNBQTBCOzs7Ozs7O0lBTTFCLDZDQUFpQzs7Ozs7SUFZakMsOENBQXdDOzs7OztJQUt4QywyQ0FBOEQ7O0lBRzlELDJDQUErQzs7SUEyQy9DLDRDQUFnRDs7SUFFaEQscUNBQWtDOzs7OztJQVp0Qix1Q0FBNkI7OztBQXFFN0MsTUFBTSxPQUFPLG9CQUFvQixHQUFHO0lBQ2hDLHFCQUFxQjtJQUNyQixnQkFBZ0I7SUFDaEIscUJBQXFCO0lBQ3JCLHVCQUF1QjtDQUMxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgICBDb21wb25lbnQsIElucHV0LCBRdWVyeUxpc3QsXHJcbiAgICBEaXJlY3RpdmUsIENvbnRlbnRDaGlsZCxcclxuICAgIENvbnRlbnRDaGlsZHJlbiwgVGVtcGxhdGVSZWYsIEFmdGVyQ29udGVudENoZWNrZWQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIE9uRGVzdHJveSxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgc2xpZGVPZlJpZ2h0IH0gZnJvbSAnLi9hbmltYXRpb25zL3NsaWRlLW9mLXJpZ2h0LmFuaW1hdGlvbic7XHJcbmltcG9ydCB7IENvbmZpZ05hbWVzLCBBcHBTdGVwQ29uZmlnIH0gZnJvbSAnLi9zdGVwLWNvbmZpZyc7XHJcbi8vIGltcG9ydCB7IExhbWJTdGVwQ29uZmlnLCBDb25maWdOYW1lcyB9IGZyb20gJ0BsYW1iL3N0ZXBzL3N0ZXAtY29uZmlnJztcclxuLy8gaW1wb3J0IHsgc2xpZGVPZlJpZ2h0IH0gZnJvbSAnQGxhbWIvc3RlcHMvYW5pbWF0aW9ucy9zbGlkZS1vZi1yaWdodC5hbmltYXRpb24nO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgICBzZWxlY3RvcjogJ25nLXRlbXBsYXRlW2FwcFN0ZXBUaXRsZV0nLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQXBwU3RlcFRpdGxlRGlyZWN0aXZlIHtcclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55PikgeyB9XHJcbn1cclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gICAgc2VsZWN0b3I6ICduZy10ZW1wbGF0ZVthcHBTdGVwQ29udGVudF0nLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQXBwU3RlcENvbnRlbnREaXJlY3RpdmUge1xyXG4gICAgY29uc3RydWN0b3IocHVibGljIHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+KSB7IH1cclxufVxyXG5cclxubGV0IG5leHRJZCA9IDA7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpkaXJlY3RpdmUtc2VsZWN0b3JcclxuICAgIHNlbGVjdG9yOiAnZ3VpLXN0ZXAnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQXBwU3RlcERpcmVjdGl2ZSB7XHJcblxyXG4gICAgQElucHV0KCkgaWQ6IHN0cmluZyA9IGBhcHAtc3RlcC0ke25leHRJZCsrfWA7XHJcblxyXG4gICAgQElucHV0KCkgdGl0bGU6IHN0cmluZztcclxuXHJcbiAgICBASW5wdXQoKSBpY29uOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHdWFyZGEgQ3VhbHF1aWVyIGRhdG8uIENyZWFkbyBwb3IgZWwgRXF1aXBvIExhbWIuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIGRhdGE6IGFueTtcclxuXHJcbiAgICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgLy8gQElucHV0KCkgZGlzYWJsZWQgPSB0cnVlO1xyXG5cclxuICAgIHB1YmxpYyBpc1ZhbGlkU3RlcDogYm9vbGVhbiA9IHRydWU7XHJcbiAgICAvLyBwdWJsaWMgaXNWYWxpZFN0ZXA6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgc2V0IHZhbGlkU3RlcCh2YWx1ZTogc3RyaW5nIHwgYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMuaXNWYWxpZFN0ZXAgPSAodmFsdWUgPT09ICd0cnVlJyB8fCB2YWx1ZSA9PT0gdHJ1ZSkgPyB0cnVlIDogZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgQENvbnRlbnRDaGlsZChBcHBTdGVwVGl0bGVEaXJlY3RpdmUpIHRpdGxlVGVtcGxhdGU6IEFwcFN0ZXBUaXRsZURpcmVjdGl2ZTtcclxuICAgIEBDb250ZW50Q2hpbGQoQXBwU3RlcENvbnRlbnREaXJlY3RpdmUpIGNvbnRlbnRUZW1wbGF0ZTogQXBwU3RlcENvbnRlbnREaXJlY3RpdmU7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXBwU3RlcENoYW5nZUV2ZW50IHtcclxuICAgIC8qKlxyXG4gICAgICogSWQgZGUgbGEgcGVzdGHDsWEgYWN0dWFsbWVudGUgYWN0aXZhLlxyXG4gICAgICovXHJcbiAgICBhY3RpdmVJZDogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSWQgZGUgbGEgcGVzdGHDsWEgcmVjacOpbiBzZWxlY2Npb25hZGEuXHJcbiAgICAgKi9cclxuICAgIG5leHRJZDogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogZGF0YSBndWFyZGFkYSBlbiBsYSBwZXN0YcOxYSBhY3R1YWxtZW50ZSBhY3RpdmEuXHJcbiAgICAgKi9cclxuICAgIGFjdGl2ZURhdGE6IGFueTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEZ1bmNpw7NuIHF1ZSBldml0YXLDoSBlbCBjYW1iaW8gZGUgcGVydGHDsWEgc2kgc2UgbGxhbWEuXHJcbiAgICAgKi9cclxuICAgIHByZXZlbnREZWZhdWx0OiAoKSA9PiB2b2lkO1xyXG5cclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2d1aS1zdGVwLWdyb3VwJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9zdGVwcy5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9zdGVwcy5jb21wb25lbnQuc2NzcyddLFxyXG4gICAgLy8gYW5pbWF0aW9uczogW0FuaW1hdGlvbnMuc2xpZGVJbk91dCwgQW5pbWF0aW9ucy5zbGlkZU9mUmlnaHRdLFxyXG4gICAgYW5pbWF0aW9uczogW3NsaWRlT2ZSaWdodF0sXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgQXBwU3RlcEdyb3VwQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlckNvbnRlbnRDaGVja2VkLCBPbkRlc3Ryb3kge1xyXG4gICAganVzdGlmeUNsYXNzOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgaGlkZUNvbnRlbnQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBAQ29udGVudENoaWxkcmVuKEFwcFN0ZXBEaXJlY3RpdmUpIHN0ZXBzOiBRdWVyeUxpc3Q8QXBwU3RlcERpcmVjdGl2ZT47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJZCBkZWwgc3RlcCBxdWUgc2FsZHLDoSBhY3RpdmFkbyBwb3IgZGVmZWN0by5cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgYWN0aXZlSWQ6IHN0cmluZztcclxuICAgIC8qKlxyXG4gICAgICogUGVyc29uYWxpemFyIGVsIG5vbWJyZSAnQW50ZXJpb3IgfCBzaWd1aWVudGUgeSBGaW5hbGl6YXInXHJcbiAgICAgKiBGb3JtYXRvIGRlIHZhcmlhYmxlIDogb2JqZWN0b1xyXG4gICAgICogRWouIGNvbmZpZ05hbWVzOiBvYmplY3QgPSB7YnV0dG9uQmFjazogJ1JlZ3Jlc2FyJywgYnV0dG9uTmV4dDogJ0dyYWJhcicsIGJ1dHRvbkZpbmlzaDogJ0Zpbid9XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpQ29uZmlnTmFtZXM6IENvbmZpZ05hbWVzO1xyXG4gICAgQElucHV0KClcclxuICAgIHNldCBjb25maWdOYW1lcyhjb25maWduOiBDb25maWdOYW1lcykge1xyXG4gICAgICAgIHRoaXMuaUNvbmZpZ05hbWVzLmJ1dHRvbkJhY2sgPSBjb25maWduLmJ1dHRvbkJhY2sgfHwgdGhpcy5pQ29uZmlnTmFtZXMuYnV0dG9uQmFjaztcclxuICAgICAgICB0aGlzLmlDb25maWdOYW1lcy5idXR0b25OZXh0ID0gY29uZmlnbi5idXR0b25OZXh0IHx8IHRoaXMuaUNvbmZpZ05hbWVzLmJ1dHRvbk5leHQ7XHJcbiAgICAgICAgdGhpcy5pQ29uZmlnTmFtZXMuYnV0dG9uRmluaXNoID0gY29uZmlnbi5idXR0b25GaW5pc2ggfHwgdGhpcy5pQ29uZmlnTmFtZXMuYnV0dG9uRmluaXNoO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3VhbmRvIGNhbWJpYSBkZSBzdGVwIHNlIGRlc3RydWlyYSBlbCBjb250ZW5pZG8gYW50ZXJpb3IgbyBzb2xvIHNlIG9jdWxhdGFyw6E/XHJcbiAgICAgKi9cclxuICAgIC8vIEBJbnB1dCgpIGRlc3Ryb3lPbkhpZGU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgQElucHV0KCkgZGVzdHJveU9uSGlkZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRW1pdGUgY3VhbmRvIGhheSBjYW1iaW9zIGRlIHN0ZXBzLlxyXG4gICAgICovXHJcbiAgICBAT3V0cHV0KCkgc3RlcENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8QXBwU3RlcENoYW5nZUV2ZW50PigpO1xyXG5cclxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1vdXRwdXQtb24tcHJlZml4XHJcbiAgICBAT3V0cHV0KCkgb25Db21wbGV0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBzZXQganVzdGlmeShjbGFzc05hbWU6ICdzdGFydCcgfCAnY2VudGVyJyB8ICdlbmQnIHwgJ2ZpbGwnIHwgJ2p1c3RpZmllZCcpIHtcclxuICAgICAgICBpZiAoY2xhc3NOYW1lID09PSAnZmlsbCcgfHwgY2xhc3NOYW1lID09PSAnanVzdGlmaWVkJykge1xyXG4gICAgICAgICAgICB0aGlzLmp1c3RpZnlDbGFzcyA9IGBuYXYtJHtjbGFzc05hbWV9YDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmp1c3RpZnlDbGFzcyA9IGBqdXN0aWZ5LWNvbnRlbnQtJHtjbGFzc05hbWV9YDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25TZWxlY3Qoc3RlcElkOiBzdHJpbmcpIHtcclxuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRTdGVwID0gdGhpcy5nZXRTdGVwQnlJZChzdGVwSWQpO1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkQWN0aXZlID0gdGhpcy5nZXRTdGVwQnlJZCh0aGlzLmFjdGl2ZUlkKTtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZygnc2VsZWN0ZWRTdGVwJyk7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coc2VsZWN0ZWRTdGVwKTtcclxuXHJcbiAgICAgICAgaWYgKHNlbGVjdGVkU3RlcCAmJiAhc2VsZWN0ZWRTdGVwLmRpc2FibGVkICYmIHRoaXMuYWN0aXZlSWQgIT09IHNlbGVjdGVkU3RlcC5pZCkge1xyXG4gICAgICAgICAgICBsZXQgZGVmYXVsdFByZXZlbnRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnN0ZXBDaGFuZ2UuZW1pdChcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBhY3RpdmVJZDogdGhpcy5hY3RpdmVJZCxcclxuICAgICAgICAgICAgICAgICAgICBhY3RpdmVEYXRhOiBzZWxlY3RlZEFjdGl2ZS5kYXRhIHx8IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgbmV4dElkOiBzZWxlY3RlZFN0ZXAuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJldmVudERlZmF1bHQ6ICgpID0+IHsgZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7IH0sXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBpZiAoIWRlZmF1bHRQcmV2ZW50ZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlSWQgPSBzZWxlY3RlZFN0ZXAuaWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvbmZpZzogQXBwU3RlcENvbmZpZykge1xyXG4gICAgICAgIHRoaXMudHlwZSA9IHRoaXMuY29uZmlnLnR5cGU7XHJcbiAgICAgICAgdGhpcy5qdXN0aWZ5ID0gdGhpcy5jb25maWcuanVzdGlmeTtcclxuICAgICAgICB0aGlzLm9yaWVudGF0aW9uID0gdGhpcy5jb25maWcub3JpZW50YXRpb247XHJcbiAgICAgICAgdGhpcy5pQ29uZmlnTmFtZXMgPSB0aGlzLmNvbmZpZy5jb25maWdOYW1lcztcclxuICAgIH1cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgfVxyXG5cclxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtZW1iZXItb3JkZXJpbmdcclxuICAgIEBJbnB1dCgpIG9yaWVudGF0aW9uOiAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnO1xyXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1lbWJlci1vcmRlcmluZ1xyXG4gICAgQElucHV0KCkgdHlwZTogJ3N0ZXBzcycgfCAncGlsbHMnO1xyXG5cclxuICAgIG5nQWZ0ZXJDb250ZW50Q2hlY2tlZCgpIHtcclxuICAgICAgICBjb25zdCBhY3RpdmVTdGVwID0gdGhpcy5nZXRTdGVwQnlJZCh0aGlzLmFjdGl2ZUlkKTtcclxuICAgICAgICB0aGlzLmFjdGl2ZUlkID0gYWN0aXZlU3RlcCA/IGFjdGl2ZVN0ZXAuaWQgOiAodGhpcy5zdGVwcy5sZW5ndGggPyB0aGlzLnN0ZXBzLmZpcnN0LmlkIDogbnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRTdGVwQnlJZChpZDogc3RyaW5nKTogQXBwU3RlcERpcmVjdGl2ZSB7XHJcbiAgICAgICAgY29uc3Qgc3RlcHNXaXRoSWQ6IEFwcFN0ZXBEaXJlY3RpdmVbXSA9IHRoaXMuc3RlcHMuZmlsdGVyKHN0ZXAgPT4gc3RlcC5pZCA9PT0gaWQpO1xyXG4gICAgICAgIHJldHVybiBzdGVwc1dpdGhJZC5sZW5ndGggPyBzdGVwc1dpdGhJZFswXSA6IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGJhY2soKSB7XHJcbiAgICAgICAgY29uc3QgYmFjayA9IHRoaXMuZ2V0U3RlcElkU3BsaWNlKC0xKTtcclxuICAgICAgICB0aGlzLm9uU2VsZWN0KGJhY2spO1xyXG5cclxuICAgIH1cclxuICAgIHB1YmxpYyBuZXh0KCkge1xyXG4gICAgICAgIGNvbnN0IG5leHQgPSB0aGlzLmdldFN0ZXBJZFNwbGljZSgrMSk7XHJcblxyXG4gICAgICAgIHRoaXMub25TZWxlY3QobmV4dCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNvbXBsZXRlKCkge1xyXG4gICAgICAgIHRoaXMub25Db21wbGV0ZS5lbWl0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGN1cnJlbnQoc3RlcElkOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLm9uU2VsZWN0KHN0ZXBJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRTdGVwSWRTcGxpY2UoY29uZGljaW9uOiBudW1iZXIpIHtcclxuICAgICAgICBjb25zdCBhY3R1YWwgPSB0aGlzLmFjdGl2ZUlkO1xyXG4gICAgICAgIGNvbnN0IHNwbGljZSA9IGFjdHVhbC5zbGljZSgwLCBhY3R1YWwubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSBwYXJzZUludChhY3R1YWwuc2xpY2UoKGFjdHVhbC5sZW5ndGggLSAxKSwgYWN0dWFsLmxlbmd0aCksIDEwKTtcclxuICAgICAgICBjb25zdCBuZXh0ID0gYCR7c3BsaWNlfSR7KGluZGV4ICsgKGNvbmRpY2lvbikpfWA7XHJcbiAgICAgICAgcmV0dXJuIG5leHQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGhpZGVQcmV2aW91cygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVJZCAhPT0gJ2FwcC1zdGVwLTAnO1xyXG4gICAgfVxyXG4gICAgZ2V0IGhpZGVOZXh0KCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IGFsbExlbmd0aCA9ICh0aGlzLnN0ZXBzLmxlbmd0aCAtIDEpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZUlkICE9PSAnYXBwLXN0ZXAtJyArIGFsbExlbmd0aDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaGlkZUxpbmVSaWdodChzdGVwSWQpIHtcclxuICAgICAgICBjb25zdCBzdGVwID0gcGFyc2VJbnQoc3RlcElkLnNsaWNlKHN0ZXBJZC5sZW5ndGggLSAxLCBzdGVwSWQubGVuZ3RoKSwgMTApO1xyXG4gICAgICAgIHJldHVybiAodGhpcy5zdGVwcy5sZW5ndGggIT09IChzdGVwICsgMSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcclxuICAgICAgICBuZXh0SWQgPSAwO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgQVBQX1NURVBTX0NPTVBPTkVOVFMgPSBbXHJcbiAgICBBcHBTdGVwR3JvdXBDb21wb25lbnQsXHJcbiAgICBBcHBTdGVwRGlyZWN0aXZlLFxyXG4gICAgQXBwU3RlcFRpdGxlRGlyZWN0aXZlLFxyXG4gICAgQXBwU3RlcENvbnRlbnREaXJlY3RpdmUsXHJcbl07XHJcblxyXG4iXX0=