UNPKG

lamb-web-lib

Version:

LambWebLib. Es un proyecto angular de tipo Librería. que contiene una Suit de componentes reutilizables para el proyecto [Lamb Financial](https://lamb.upeu.edu.pe).

440 lines (437 loc) 41.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ /** * @license * Copyright Lamb Team. All Rights Reserved. * Licensed under the MIT License. See License.txt in the project root for license information. */ import { Component, Input, QueryList, Directive, ContentChild, ContentChildren, TemplateRef, Output, EventEmitter, } from '@angular/core'; import { LambStepConfig, ConfigNames } from './step-config'; import { slideOfRight } from './animations/slide-of-right.animation'; export class LambStepTitleDirective { /** * @param {?} templateRef */ constructor(templateRef) { this.templateRef = templateRef; } } LambStepTitleDirective.decorators = [ { type: Directive, args: [{ selector: 'ng-template[lambStepTitle]', },] }, ]; LambStepTitleDirective.ctorParameters = () => [ { type: TemplateRef } ]; if (false) { /** @type {?} */ LambStepTitleDirective.prototype.templateRef; } export class LambStepContentDirective { /** * @param {?} templateRef */ constructor(templateRef) { this.templateRef = templateRef; } } LambStepContentDirective.decorators = [ { type: Directive, args: [{ selector: 'ng-template[lambStepContent]', },] }, ]; LambStepContentDirective.ctorParameters = () => [ { type: TemplateRef } ]; if (false) { /** @type {?} */ LambStepContentDirective.prototype.templateRef; } /** @type {?} */ let nextId = 0; export class LambStepDirective { constructor() { this.id = `lamb-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; } } LambStepDirective.decorators = [ { type: Directive, args: [{ // tslint:disable-next-line:directive-selector selector: 'lamb-step', },] }, ]; LambStepDirective.propDecorators = { id: [{ type: Input }], title: [{ type: Input }], icon: [{ type: Input }], data: [{ type: Input }], disabled: [{ type: Input }], validStep: [{ type: Input }], contentTemplate: [{ type: ContentChild, args: [LambStepContentDirective,] }], titleTemplate: [{ type: ContentChild, args: [LambStepTitleDirective,] }] }; if (false) { /** @type {?} */ LambStepDirective.prototype.id; /** @type {?} */ LambStepDirective.prototype.title; /** @type {?} */ LambStepDirective.prototype.icon; /** * Guarda Cualquier dato. Creado por el Equipo Lamb. * @type {?} */ LambStepDirective.prototype.data; /** @type {?} */ LambStepDirective.prototype.disabled; /** @type {?} */ LambStepDirective.prototype.isValidStep; /** @type {?} */ LambStepDirective.prototype.contentTemplate; /** @type {?} */ LambStepDirective.prototype.titleTemplate; } /** * @record */ export function LambStepChangeEvent() { } if (false) { /** * Id de la pestaña actualmente activa. * @type {?} */ LambStepChangeEvent.prototype.activeId; /** * Id de la pestaña recién seleccionada. * @type {?} */ LambStepChangeEvent.prototype.nextId; /** * data guardada en la pestaña actualmente activa. * @type {?} */ LambStepChangeEvent.prototype.activeData; /** * Función que evitará el cambio de pertaña si se llama. * @type {?} */ LambStepChangeEvent.prototype.preventDefault; } export class LambStepGroupComponent { /** * @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: () => { 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); } /** * @param {?} id * @return {?} */ getStepById(id) { /** @type {?} */ const stepsWithId = this.steps.filter(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 {?} 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 !== 'lamb-step-0'; } /** * @return {?} */ get hideNext() { /** @type {?} */ const allLength = (this.steps.length - 1); return this.activeId !== 'lamb-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; } } LambStepGroupComponent.decorators = [ { type: Component, args: [{ selector: 'lamb-step-group', template: `<!-- <ul class="nav justify-content-center" id="myStep" role="steplist"> --> <ul [class]="'nav lamb-nav-tabs nav-' + type + (orientation == 'horizontal'? ' ' + justifyClass : ' flex-column' )" id="myStep" role="steplist"> <!-- <ng-template ngFor let-step [ngForOf]="steps" *ngFor="let step of steps"> --> <ng-template ngFor let-step [ngForOf]="steps"> <li class="nav-item"> <a [id]="step.id" class="nav-link" [class.active]="step.id === activeId" [class.disabled]="step.disabled || !step.isValidStep" (click)="!!onSelect(step.id)" role="step" [attr.stepindex]="(step.disabled || !step.isValidStep ? '-1': undefined)" [attr.aria-controls]="(!destroyOnHide || step.id === activeId ? step.id + '-panel': null)" [attr.aria-expanded]="step.id === activeId" [attr.aria-disabled]="step.disabled || !step.isValidStep"> <!-- data-toggle="step" aria-selected="true" --> <ng-template [ngIf]="step.icon"> <span class="lamb-round-tabs" [title]="step.title"> <i class="{{ step.icon }} lamb-icon"></i> </span> </ng-template> <br> <span class="lamb-round-text"> {{ step.title }} </span> <ng-template [ngTemplateOutlet]="step.titleTemplate?.templateRef"></ng-template> </a> </li> <li class="nav-line" *ngIf="hideLineRight(step.id)"> <div class="lamb-liner"></div> </li> </ng-template> <!-- <ng-content select="lamb-step-head"></ng-content> --> </ul> <div class="tab-content lamb-content" id="myStepContent"> <!-- <ng-content select="lamb-step-body"></ng-content> --> <ng-template ngFor let-step [ngForOf]="steps"> <!-- class="step-pane fade {{ step.id === activeId ? 'active': null }}" --> <!-- <div [@slideOfRight]="((step.id === activeId) && (status === 'next')) ? 'next': 'back'" class="tab-pane {{ step.id === activeId ? 'active': 'active' }}" *ngIf="!destroyOnHide || step.id === activeId" role="steppanel" [attr.aria-labelledby]="step.id" id="{{ step.id }}-panel" [attr.aria-expanded]="step.id === activeId"> --> <div class="tab-pane {{ step.id === activeId ? 'active': null }}" *ngIf="!destroyOnHide || step.id === activeId" role="steppanel" [attr.aria-labelledby]="step.id" id="{{ step.id }}-panel" [attr.aria-expanded]="step.id === activeId"> <div class="row"> <div class="col-md-12"> <ng-template [ngTemplateOutlet]="step.contentTemplate?.templateRef"></ng-template> </div> </div> <div class="row lamb-button-manage"> <div class="offset-md-4 col-md-4"> <div class="row"> <div class="col-md-6" *ngIf="hidePrevious"> <div class="form-group text-center space-20"> <button class="btn btn-sm btn-block btn-outline-rounded btn-default" (click)="back()"> <span style="margin-right:10px;" class="fa fa-arrow-left"></span> {{ iConfigNames.buttonBack }} </button> </div> </div> <div class="col-md-6" *ngIf="hideNext"> <div class="form-group text-center space-20"> <button class="btn btn-sm btn-block btn-outline-rounded btn-info" [disabled]="!step.isValidStep" (click)="next()"> {{ iConfigNames.buttonNext }} <span style="margin-left:10px;" class="fa fa-arrow-right"></span> </button> </div> </div> <div class="col-md-6" *ngIf="hidePrevious && !hideNext"> <div class="form-group text-center space-20"> <button class="btn btn-sm btn-block btn-outline-rounded btn-info" [disabled]="!step.isValidStep" (click)="complete()"> {{ iConfigNames.buttonFinish }} <span style="margin-left:10px;" class="fa fa-check"></span> </button> </div> </div> </div> </div> </div> </div> </ng-template> </div>`, styles: [`.lamb-liner{height:2px;position:relative;width:5rem;margin:0 auto;left:0;right:0;top:1.8rem;z-index:1}.tab-content{padding-top:2rem}.nav-link{padding:0 0 5px}.nav-link .lamb-round-text{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:#ffa92d}.lamb-nav-tabs{border-bottom:transparent;position:relative;margin:0 auto;box-sizing:border-box;text-align:center;padding:0 1.5rem}.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;z-index:2;left:-1;text-align:center;font-size:1.3rem;position:relative;margin-top:.6rem;margin-bottom:0}`], // animations: [Animations.slideInOut, Animations.slideOfRight], animations: [slideOfRight], },] }, ]; LambStepGroupComponent.ctorParameters = () => [ { type: LambStepConfig } ]; LambStepGroupComponent.propDecorators = { steps: [{ type: ContentChildren, args: [LambStepDirective,] }], 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 {?} */ LambStepGroupComponent.prototype.justifyClass; /** @type {?} */ LambStepGroupComponent.prototype.hideContent; /** @type {?} */ LambStepGroupComponent.prototype.steps; /** * Id del step que saldrá activado por defecto. * @type {?} */ LambStepGroupComponent.prototype.activeId; /** * Personalizar el nombre 'Anterior | siguiente y Finalizar' * Formato de variable : objecto * Ej. configNames: object = {buttonBack: 'Regresar', buttonNext: 'Grabar', buttonFinish: 'Fin'} * @type {?} */ LambStepGroupComponent.prototype.iConfigNames; /** * Cuando cambia de step se destruira el contenido anterior o solo se oculatará? * @type {?} */ LambStepGroupComponent.prototype.destroyOnHide; /** * Emite cuando hay cambios de steps. * @type {?} */ LambStepGroupComponent.prototype.stepChange; /** @type {?} */ LambStepGroupComponent.prototype.onComplete; /** @type {?} */ LambStepGroupComponent.prototype.orientation; /** @type {?} */ LambStepGroupComponent.prototype.type; /** @type {?} */ LambStepGroupComponent.prototype.config; } /** @type {?} */ export const LAMB_STEPS_COMPONENTS = [ LambStepGroupComponent, LambStepDirective, LambStepTitleDirective, LambStepContentDirective, ]; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbGFtYi13ZWItbGliLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvc3RlcHMvc3RlcHMuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQU9BLE9BQU8sRUFDSCxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFDM0IsU0FBUyxFQUFFLFlBQVksRUFDdkIsZUFBZSxFQUFFLFdBQVcsRUFDNUIsTUFBTSxFQUFFLFlBQVksR0FDdkIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBS3JFLE1BQU07Ozs7SUFDRixZQUFtQixXQUE2QjtRQUE3QixnQkFBVyxHQUFYLFdBQVcsQ0FBa0I7SUFBSSxDQUFDOzs7WUFKeEQsU0FBUyxTQUFDO2dCQUNQLFFBQVEsRUFBRSw0QkFBNEI7YUFDekM7OztZQVJvQixXQUFXOzs7O0lBVWhCLDZDQUFvQzs7QUFNcEQsTUFBTTs7OztJQUNGLFlBQW1CLFdBQTZCO1FBQTdCLGdCQUFXLEdBQVgsV0FBVyxDQUFrQjtJQUFJLENBQUM7OztZQUp4RCxTQUFTLFNBQUM7Z0JBQ1AsUUFBUSxFQUFFLDhCQUE4QjthQUMzQzs7O1lBZm9CLFdBQVc7Ozs7SUFpQmhCLCtDQUFvQzs7O0lBR2hELE1BQU0sR0FBRyxDQUFDO0FBTWQsTUFBTTtJQUpOO1FBTWEsT0FBRSxHQUFHLGFBQWEsTUFBTSxFQUFFLEVBQUUsQ0FBQztRQVc3QixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQzFCLDRCQUE0QjtRQUVyQixnQkFBVyxHQUFHLElBQUksQ0FBQztJQVU5QixDQUFDOzs7Ozs7SUFQRyxJQUNJLFNBQVMsQ0FBQyxLQUF1QjtRQUNqQyxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsS0FBSyxLQUFLLE1B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LENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3pFLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUMsQ0FBQzs7OztJQUVNLFdBQVc7UUFDZCxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ2YsQ0FBQzs7O1lBeE5KLFNBQVMsU0FBQztnQkFDUCxRQUFRLEVBQUUsaUJBQWlCO2dCQUMzQixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BZ0ZQO2dCQUNILE1BQU0sRUFBRSxDQUFDLCswQkFBKzBCLENBQUM7O2dCQUV6MUIsVUFBVSxFQUFFLENBQUMsWUFBWSxDQUFDO2FBQzdCOzs7WUFoS1EsY0FBYzs7O29CQXNLbEIsZUFBZSxTQUFDLGlCQUFpQjt1QkFLakMsS0FBSzswQkFPTCxLQUFLOzRCQVdMLEtBQUs7eUJBS0wsTUFBTTt5QkFHTixNQUFNO3NCQUVOLEtBQUs7MEJBeUNMLEtBQUs7bUJBRUwsS0FBSzs7OztJQS9FTiw4Q0FBcUI7O0lBQ3JCLDZDQUEyQjs7SUFFM0IsdUNBQXdFOzs7OztJQUt4RSwwQ0FBMEI7Ozs7Ozs7SUFNMUIsOENBQWlDOzs7OztJQVlqQywrQ0FBK0I7Ozs7O0lBSy9CLDRDQUErRDs7SUFHL0QsNENBQStDOztJQTJDL0MsNkNBQWdEOztJQUVoRCxzQ0FBa0M7O0lBWnRCLHdDQUE4Qjs7O0FBK0Q5QyxNQUFNLE9BQU8scUJBQXFCLEdBQUc7SUFDakMsc0JBQXNCO0lBQ3RCLGlCQUFpQjtJQUNqQixzQkFBc0I7SUFDdEIsd0JBQXdCO0NBQzNCIiwic291cmNlc0NvbnRlbnQiOlsiXHJcbi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgTGFtYiBUZWFtLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxyXG4gKi9cclxuXHJcbmltcG9ydCB7XHJcbiAgICBDb21wb25lbnQsIElucHV0LCBRdWVyeUxpc3QsXHJcbiAgICBEaXJlY3RpdmUsIENvbnRlbnRDaGlsZCxcclxuICAgIENvbnRlbnRDaGlsZHJlbiwgVGVtcGxhdGVSZWYsIEFmdGVyQ29udGVudENoZWNrZWQsXHJcbiAgICBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkRlc3Ryb3ksXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IExhbWJTdGVwQ29uZmlnLCBDb25maWdOYW1lcyB9IGZyb20gJy4vc3RlcC1jb25maWcnO1xyXG5pbXBvcnQgeyBzbGlkZU9mUmlnaHQgfSBmcm9tICcuL2FuaW1hdGlvbnMvc2xpZGUtb2YtcmlnaHQuYW5pbWF0aW9uJztcclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gICAgc2VsZWN0b3I6ICduZy10ZW1wbGF0ZVtsYW1iU3RlcFRpdGxlXScsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBMYW1iU3RlcFRpdGxlRGlyZWN0aXZlIHtcclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55PikgeyB9XHJcbn1cclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gICAgc2VsZWN0b3I6ICduZy10ZW1wbGF0ZVtsYW1iU3RlcENvbnRlbnRdJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIExhbWJTdGVwQ29udGVudERpcmVjdGl2ZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgdGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPGFueT4pIHsgfVxyXG59XHJcblxyXG5sZXQgbmV4dElkID0gMDtcclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmRpcmVjdGl2ZS1zZWxlY3RvclxyXG4gICAgc2VsZWN0b3I6ICdsYW1iLXN0ZXAnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTGFtYlN0ZXBEaXJlY3RpdmUge1xyXG5cclxuICAgIEBJbnB1dCgpIGlkID0gYGxhbWItc3RlcC0ke25leHRJZCsrfWA7XHJcblxyXG4gICAgQElucHV0KCkgdGl0bGU6IHN0cmluZztcclxuXHJcbiAgICBASW5wdXQoKSBpY29uOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHdWFyZGEgQ3VhbHF1aWVyIGRhdG8uIENyZWFkbyBwb3IgZWwgRXF1aXBvIExhbWIuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIGRhdGE6IGFueTtcclxuXHJcbiAgICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgLy8gQElucHV0KCkgZGlzYWJsZWQgPSB0cnVlO1xyXG5cclxuICAgIHB1YmxpYyBpc1ZhbGlkU3RlcCA9IHRydWU7XHJcbiAgICAvLyBwdWJsaWMgaXNWYWxpZFN0ZXA6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgc2V0IHZhbGlkU3RlcCh2YWx1ZTogc3RyaW5nIHwgYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMuaXNWYWxpZFN0ZXAgPSAodmFsdWUgPT09ICd0cnVlJyB8fCB2YWx1ZSA9PT0gdHJ1ZSkgPyB0cnVlIDogZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgQENvbnRlbnRDaGlsZChMYW1iU3RlcENvbnRlbnREaXJlY3RpdmUpIGNvbnRlbnRUZW1wbGF0ZTogTGFtYlN0ZXBDb250ZW50RGlyZWN0aXZlO1xyXG4gICAgQENvbnRlbnRDaGlsZChMYW1iU3RlcFRpdGxlRGlyZWN0aXZlKSB0aXRsZVRlbXBsYXRlOiBMYW1iU3RlcFRpdGxlRGlyZWN0aXZlO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIExhbWJTdGVwQ2hhbmdlRXZlbnQge1xyXG4gICAgLyoqXHJcbiAgICAgKiBJZCBkZSBsYSBwZXN0YcOxYSBhY3R1YWxtZW50ZSBhY3RpdmEuXHJcbiAgICAgKi9cclxuICAgIGFjdGl2ZUlkOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJZCBkZSBsYSBwZXN0YcOxYSByZWNpw6luIHNlbGVjY2lvbmFkYS5cclxuICAgICAqL1xyXG4gICAgbmV4dElkOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBkYXRhIGd1YXJkYWRhIGVuIGxhIHBlc3Rhw7FhIGFjdHVhbG1lbnRlIGFjdGl2YS5cclxuICAgICAqL1xyXG4gICAgYWN0aXZlRGF0YTogYW55O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRnVuY2nDs24gcXVlIGV2aXRhcsOhIGVsIGNhbWJpbyBkZSBwZXJ0YcOxYSBzaSBzZSBsbGFtYS5cclxuICAgICAqL1xyXG4gICAgcHJldmVudERlZmF1bHQ6ICgpID0+IHZvaWQ7XHJcblxyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnbGFtYi1zdGVwLWdyb3VwJyxcclxuICAgIHRlbXBsYXRlOiBgPCEtLSA8dWwgY2xhc3M9XCJuYXYganVzdGlmeS1jb250ZW50LWNlbnRlclwiIGlkPVwibXlTdGVwXCIgcm9sZT1cInN0ZXBsaXN0XCI+IC0tPlxyXG48dWwgW2NsYXNzXT1cIiduYXYgbGFtYi1uYXYtdGFicyBuYXYtJyArIHR5cGUgKyAob3JpZW50YXRpb24gPT0gJ2hvcml6b250YWwnPyAnICcgKyBqdXN0aWZ5Q2xhc3MgOiAnIGZsZXgtY29sdW1uJyApXCIgaWQ9XCJteVN0ZXBcIlxyXG4gICAgcm9sZT1cInN0ZXBsaXN0XCI+XHJcblxyXG4gICAgPCEtLSA8bmctdGVtcGxhdGUgbmdGb3IgbGV0LXN0ZXAgW25nRm9yT2ZdPVwic3RlcHNcIiAqbmdGb3I9XCJsZXQgc3RlcCBvZiBzdGVwc1wiPiAtLT5cclxuICAgIDxuZy10ZW1wbGF0ZSBuZ0ZvciBsZXQtc3RlcCBbbmdGb3JPZl09XCJzdGVwc1wiPlxyXG4gICAgICAgIDxsaSBjbGFzcz1cIm5hdi1pdGVtXCI+XHJcbiAgICAgICAgICAgIDxhIFtpZF09XCJzdGVwLmlkXCIgY2xhc3M9XCJuYXYtbGlua1wiIFtjbGFzcy5hY3RpdmVdPVwic3RlcC5pZCA9PT0gYWN0aXZlSWRcIiBbY2xhc3MuZGlzYWJsZWRdPVwic3RlcC5kaXNhYmxlZCB8fCAhc3RlcC5pc1ZhbGlkU3RlcFwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiISFvblNlbGVjdChzdGVwLmlkKVwiIHJvbGU9XCJzdGVwXCIgW2F0dHIuc3RlcGluZGV4XT1cIihzdGVwLmRpc2FibGVkIHx8ICFzdGVwLmlzVmFsaWRTdGVwID8gJy0xJzogdW5kZWZpbmVkKVwiXHJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cIighZGVzdHJveU9uSGlkZSB8fCBzdGVwLmlkID09PSBhY3RpdmVJZCA/IHN0ZXAuaWQgKyAnLXBhbmVsJzogbnVsbClcIiBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cInN0ZXAuaWQgPT09IGFjdGl2ZUlkXCJcclxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwic3RlcC5kaXNhYmxlZCB8fCAhc3RlcC5pc1ZhbGlkU3RlcFwiPlxyXG4gICAgICAgICAgICAgICAgPCEtLSBkYXRhLXRvZ2dsZT1cInN0ZXBcIlxyXG4gICAgICAgICAgICAgICAgYXJpYS1zZWxlY3RlZD1cInRydWVcIiAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJzdGVwLmljb25cIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhbWItcm91bmQtdGFic1wiIFt0aXRsZV09XCJzdGVwLnRpdGxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwie3sgc3RlcC5pY29uIH19IGxhbWItaWNvblwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPGJyPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYW1iLXJvdW5kLXRleHRcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBzdGVwLnRpdGxlIH19XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwic3RlcC50aXRsZVRlbXBsYXRlPy50ZW1wbGF0ZVJlZlwiPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvYT5cclxuICAgICAgICA8L2xpPlxyXG4gICAgICAgIDxsaSBjbGFzcz1cIm5hdi1saW5lXCIgKm5nSWY9XCJoaWRlTGluZVJpZ2h0KHN0ZXAuaWQpXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsYW1iLWxpbmVyXCI+PC9kaXY+XHJcbiAgICAgICAgPC9saT5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPCEtLSA8bmctY29udGVudCBzZWxlY3Q9XCJsYW1iLXN0ZXAtaGVhZFwiPjwvbmctY29udGVudD4gLS0+XHJcbjwvdWw+XHJcbjxkaXYgY2xhc3M9XCJ0YWItY29udGVudCBsYW1iLWNvbnRlbnRcIiBpZD1cIm15U3RlcENvbnRlbnRcIj5cclxuICAgIDwhLS0gPG5nLWNvbnRlbnQgc2VsZWN0PVwibGFtYi1zdGVwLWJvZHlcIj48L25nLWNvbnRlbnQ+IC0tPlxyXG4gICAgPG5nLXRlbXBsYXRlIG5nRm9yIGxldC1zdGVwIFtuZ0Zvck9mXT1cInN0ZXBzXCI+XHJcbiAgICAgICAgPCEtLSBjbGFzcz1cInN0ZXAtcGFuZSBmYWRlIHt7IHN0ZXAuaWQgPT09IGFjdGl2ZUlkID8gJ2FjdGl2ZSc6IG51bGwgfX1cIiAtLT5cclxuICAgICAgICA8IS0tIFxyXG4gICAgICAgIDxkaXYgW0BzbGlkZU9mUmlnaHRdPVwiKChzdGVwLmlkID09PSBhY3RpdmVJZCkgJiYgKHN0YXR1cyA9PT0gJ25leHQnKSkgPyAnbmV4dCc6ICdiYWNrJ1wiIGNsYXNzPVwidGFiLXBhbmUge3sgc3RlcC5pZCA9PT0gYWN0aXZlSWQgPyAnYWN0aXZlJzogJ2FjdGl2ZScgfX1cIlxyXG4gICAgICAgICAgICAqbmdJZj1cIiFkZXN0cm95T25IaWRlIHx8IHN0ZXAuaWQgPT09IGFjdGl2ZUlkXCIgcm9sZT1cInN0ZXBwYW5lbFwiIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJzdGVwLmlkXCIgaWQ9XCJ7eyBzdGVwLmlkIH19LXBhbmVsXCJcclxuICAgICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJzdGVwLmlkID09PSBhY3RpdmVJZFwiPiAtLT5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRhYi1wYW5lIHt7IHN0ZXAuaWQgPT09IGFjdGl2ZUlkID8gJ2FjdGl2ZSc6IG51bGwgfX1cIiAqbmdJZj1cIiFkZXN0cm95T25IaWRlIHx8IHN0ZXAuaWQgPT09IGFjdGl2ZUlkXCIgcm9sZT1cInN0ZXBwYW5lbFwiXHJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJzdGVwLmlkXCIgaWQ9XCJ7eyBzdGVwLmlkIH19LXBhbmVsXCIgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJzdGVwLmlkID09PSBhY3RpdmVJZFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInN0ZXAuY29udGVudFRlbXBsYXRlPy50ZW1wbGF0ZVJlZlwiPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbGFtYi1idXR0b24tbWFuYWdlXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib2Zmc2V0LW1kLTQgY29sLW1kLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiICpuZ0lmPVwiaGlkZVByZXZpb3VzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCB0ZXh0LWNlbnRlciBzcGFjZS0yMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1ibG9jayBidG4tb3V0bGluZS1yb3VuZGVkIGJ0bi1kZWZhdWx0XCIgKGNsaWNrKT1cImJhY2soKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cIm1hcmdpbi1yaWdodDoxMHB4O1wiIGNsYXNzPVwiZmEgZmEtYXJyb3ctbGVmdFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaUNvbmZpZ05hbWVzLmJ1dHRvbkJhY2sgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCIgKm5nSWY9XCJoaWRlTmV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgdGV4dC1jZW50ZXIgc3BhY2UtMjBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tYmxvY2sgYnRuLW91dGxpbmUtcm91bmRlZCBidG4taW5mb1wiIFtkaXNhYmxlZF09XCIhc3RlcC5pc1ZhbGlkU3RlcFwiIChjbGljayk9XCJuZXh0KClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaUNvbmZpZ05hbWVzLmJ1dHRvbk5leHQgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJtYXJnaW4tbGVmdDoxMHB4O1wiIGNsYXNzPVwiZmEgZmEtYXJyb3ctcmlnaHRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiICpuZ0lmPVwiaGlkZVByZXZpb3VzICYmICFoaWRlTmV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgdGV4dC1jZW50ZXIgc3BhY2UtMjBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tYmxvY2sgYnRuLW91dGxpbmUtcm91bmRlZCBidG4taW5mb1wiIFtkaXNhYmxlZF09XCIhc3RlcC5pc1ZhbGlkU3RlcFwiIChjbGljayk9XCJjb21wbGV0ZSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGlDb25maWdOYW1lcy5idXR0b25GaW5pc2ggfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJtYXJnaW4tbGVmdDoxMHB4O1wiIGNsYXNzPVwiZmEgZmEtY2hlY2tcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG48L2Rpdj5gLFxyXG4gICAgc3R5bGVzOiBbYC5sYW1iLWxpbmVye2hlaWdodDoycHg7cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6NXJlbTttYXJnaW46MCBhdXRvO2xlZnQ6MDtyaWdodDowO3RvcDoxLjhyZW07ei1pbmRleDoxfS50YWItY29udGVudHtwYWRkaW5nLXRvcDoycmVtfS5uYXYtbGlua3twYWRkaW5nOjAgMCA1cHh9Lm5hdi1saW5rIC5sYW1iLXJvdW5kLXRleHR7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2ZvbnQtc2l6ZTouN3JlbX1AbWVkaWEgKG1heC13aWR0aDo1NTBweCl7LmxhbWItbGluZXJ7d2lkdGg6MXJlbX0ubmF2LWxpbmsgLmxhbWItcm91bmQtdGV4dHtkaXNwbGF5Om5vbmV9fS5uYXYtbGluay5hY3RpdmUgc3Bhbi5sYW1iLXJvdW5kLXRhYnN7YmFja2dyb3VuZDojZmZhOTJkfS5sYW1iLW5hdi10YWJze2JvcmRlci1ib3R0b206dHJhbnNwYXJlbnQ7cG9zaXRpb246cmVsYXRpdmU7bWFyZ2luOjAgYXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7dGV4dC1hbGlnbjpjZW50ZXI7cGFkZGluZzowIDEuNXJlbX0ubGFtYi1uYXYtdGFicyBsaS5uYXYtbGluZXtwYWRkaW5nLWxlZnQ6MDtwYWRkaW5nLXJpZ2h0OjB9LmxhbWItbmF2LXRhYnMgbGkgYXt0ZXh0LWRlY29yYXRpb246bm9uZX0ubGFtYi1idXR0b24tbWFuYWdle21hcmdpbi10b3A6MS41cmVtfXNwYW4ubGFtYi1yb3VuZC10YWJze3dpZHRoOjQwcHg7aGVpZ2h0OjQwcHg7bGluZS1oZWlnaHQ6NDBweDtkaXNwbGF5OmlubGluZS1ibG9jaztib3JkZXItcmFkaXVzOjEwMHB4O3otaW5kZXg6MjtsZWZ0Oi0xO3RleHQtYWxpZ246Y2VudGVyO2ZvbnQtc2l6ZToxLjNyZW07cG9zaXRpb246cmVsYXRpdmU7bWFyZ2luLXRvcDouNnJlbTttYXJnaW4tYm90dG9tOjB9YF0sXHJcbiAgICAvLyBhbmltYXRpb25zOiBbQW5pbWF0aW9ucy5zbGlkZUluT3V0LCBBbmltYXRpb25zLnNsaWRlT2ZSaWdodF0sXHJcbiAgICBhbmltYXRpb25zOiBbc2xpZGVPZlJpZ2h0XSxcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBMYW1iU3RlcEdyb3VwQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlckNvbnRlbnRDaGVja2VkLCBPbkRlc3Ryb3kge1xyXG4gICAganVzdGlmeUNsYXNzOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgaGlkZUNvbnRlbnQgPSBmYWxzZTtcclxuXHJcbiAgICBAQ29udGVudENoaWxkcmVuKExhbWJTdGVwRGlyZWN0aXZlKSBzdGVwczogUXVlcnlMaXN0PExhbWJTdGVwRGlyZWN0aXZlPjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIElkIGRlbCBzdGVwIHF1ZSBzYWxkcsOhIGFjdGl2YWRvIHBvciBkZWZlY3RvLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBhY3RpdmVJZDogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBQZXJzb25hbGl6YXIgZWwgbm9tYnJlICdBbnRlcmlvciB8IHNpZ3VpZW50ZSB5IEZpbmFsaXphcidcclxuICAgICAqIEZvcm1hdG8gZGUgdmFyaWFibGUgOiBvYmplY3RvXHJcbiAgICAgKiBFai4gY29uZmlnTmFtZXM6IG9iamVjdCA9IHtidXR0b25CYWNrOiAnUmVncmVzYXInLCBidXR0b25OZXh0OiAnR3JhYmFyJywgYnV0dG9uRmluaXNoOiAnRmluJ31cclxuICAgICAqL1xyXG4gICAgcHVibGljIGlDb25maWdOYW1lczogQ29uZmlnTmFtZXM7XHJcbiAgICBASW5wdXQoKVxyXG4gICAgc2V0IGNvbmZpZ05hbWVzKGNvbmZpZ246IENvbmZpZ05hbWVzKSB7XHJcbiAgICAgICAgdGhpcy5pQ29uZmlnTmFtZXMuYnV0dG9uQmFjayA9IGNvbmZpZ24uYnV0dG9uQmFjayB8fCB0aGlzLmlDb25maWdOYW1lcy5idXR0b25CYWNrO1xyXG4gICAgICAgIHRoaXMuaUNvbmZpZ05hbWVzLmJ1dHRvbk5leHQgPSBjb25maWduLmJ1dHRvbk5leHQgfHwgdGhpcy5pQ29uZmlnTmFtZXMuYnV0dG9uTmV4dDtcclxuICAgICAgICB0aGlzLmlDb25maWdOYW1lcy5idXR0b25GaW5pc2ggPSBjb25maWduLmJ1dHRvbkZpbmlzaCB8fCB0aGlzLmlDb25maWdOYW1lcy5idXR0b25GaW5pc2g7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDdWFuZG8gY2FtYmlhIGRlIHN0ZXAgc2UgZGVzdHJ1aXJhIGVsIGNvbnRlbmlkbyBhbnRlcmlvciBvIHNvbG8gc2Ugb2N1bGF0YXLDoT9cclxuICAgICAqL1xyXG4gICAgLy8gQElucHV0KCkgZGVzdHJveU9uSGlkZTogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBASW5wdXQoKSBkZXN0cm95T25IaWRlID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbWl0ZSBjdWFuZG8gaGF5IGNhbWJpb3MgZGUgc3RlcHMuXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKSBzdGVwQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxMYW1iU3RlcENoYW5nZUV2ZW50PigpO1xyXG5cclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1vdXRwdXQtb24tcHJlZml4XHJcbiAgICBAT3V0cHV0KCkgb25Db21wbGV0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBzZXQganVzdGlmeShjbGFzc05hbWU6ICdzdGFydCcgfCAnY2VudGVyJyB8ICdlbmQnIHwgJ2ZpbGwnIHwgJ2p1c3RpZmllZCcpIHtcclxuICAgICAgICBpZiAoY2xhc3NOYW1lID09PSAnZmlsbCcgfHwgY2xhc3NOYW1lID09PSAnanVzdGlmaWVkJykge1xyXG4gICAgICAgICAgICB0aGlzLmp1c3RpZnlDbGFzcyA9IGBuYXYtJHtjbGFzc05hbWV9YDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmp1c3RpZnlDbGFzcyA9IGBqdXN0aWZ5LWNvbnRlbnQtJHtjbGFzc05hbWV9YDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25TZWxlY3Qoc3RlcElkOiBzdHJpbmcpIHtcclxuXHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRTdGVwID0gdGhpcy5nZXRTdGVwQnlJZChzdGVwSWQpO1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkQWN0aXZlID0gdGhpcy5nZXRTdGVwQnlJZCh0aGlzLmFjdGl2ZUlkKTtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZygnc2VsZWN0ZWRTdGVwJyk7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coc2VsZWN0ZWRTdGVwKTtcclxuXHJcbiAgICAgICAgaWYgKHNlbGVjdGVkU3RlcCAmJiAhc2VsZWN0ZWRTdGVwLmRpc2FibGVkICYmIHRoaXMuYWN0aXZlSWQgIT09IHNlbGVjdGVkU3RlcC5pZCkge1xyXG4gICAgICAgICAgICBsZXQgZGVmYXVsdFByZXZlbnRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnN0ZXBDaGFuZ2UuZW1pdChcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBhY3RpdmVJZDogdGhpcy5hY3RpdmVJZCxcclxuICAgICAgICAgICAgICAgICAgICBhY3RpdmVEYXRhOiBzZWxlY3RlZEFjdGl2ZS5kYXRhIHx8IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgbmV4dElkOiBzZWxlY3RlZFN0ZXAuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJldmVudERlZmF1bHQ6ICgpID0+IHsgZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7IH0sXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBpZiAoIWRlZmF1bHRQcmV2ZW50ZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlSWQgPSBzZWxlY3RlZFN0ZXAuaWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvbmZpZzogTGFtYlN0ZXBDb25maWcpIHtcclxuICAgICAgICB0aGlzLnR5cGUgPSB0aGlzLmNvbmZpZy50eXBlO1xyXG4gICAgICAgIHRoaXMuanVzdGlmeSA9IHRoaXMuY29uZmlnLmp1c3RpZnk7XHJcbiAgICAgICAgdGhpcy5vcmllbnRhdGlvbiA9IHRoaXMuY29uZmlnLm9yaWVudGF0aW9uO1xyXG4gICAgICAgIHRoaXMuaUNvbmZpZ05hbWVzID0gdGhpcy5jb25maWcuY29uZmlnTmFtZXM7XHJcbiAgICB9XHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgIH1cclxuXHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWVtYmVyLW9yZGVyaW5nXHJcbiAgICBASW5wdXQoKSBvcmllbnRhdGlvbjogJ2hvcml6b250YWwnIHwgJ3ZlcnRpY2FsJztcclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptZW1iZXItb3JkZXJpbmdcclxuICAgIEBJbnB1dCgpIHR5cGU6ICdzdGVwc3MnIHwgJ3BpbGxzJztcclxuXHJcbiAgICBuZ0FmdGVyQ29udGVudENoZWNrZWQoKSB7XHJcbiAgICAgICAgY29uc3QgYWN0aXZlU3RlcCA9IHRoaXMuZ2V0U3RlcEJ5SWQodGhpcy5hY3RpdmVJZCk7XHJcbiAgICAgICAgdGhpcy5hY3RpdmVJZCA9IGFjdGl2ZVN0ZXAgPyBhY3RpdmVTdGVwLmlkIDogKHRoaXMuc3RlcHMubGVuZ3RoID8gdGhpcy5zdGVwcy5maXJzdC5pZCA6IG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0U3RlcEJ5SWQoaWQ6IHN0cmluZyk6IExhbWJTdGVwRGlyZWN0aXZlIHtcclxuICAgICAgICBjb25zdCBzdGVwc1dpdGhJZDogTGFtYlN0ZXBEaXJlY3RpdmVbXSA9IHRoaXMuc3RlcHMuZmlsdGVyKHN0ZXAgPT4gc3RlcC5pZCA9PT0gaWQpO1xyXG4gICAgICAgIHJldHVybiBzdGVwc1dpdGhJZC5sZW5ndGggPyBzdGVwc1dpdGhJZFswXSA6IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGJhY2soKSB7XHJcbiAgICAgICAgY29uc3QgYmFjayA9IHRoaXMuZ2V0U3RlcElkU3BsaWNlKC0xKTtcclxuICAgICAgICB0aGlzLm9uU2VsZWN0KGJhY2spO1xyXG4gICAgfVxyXG4gICAgcHVibGljIG5leHQoKSB7XHJcbiAgICAgICAgY29uc3QgbmV4dCA9IHRoaXMuZ2V0U3RlcElkU3BsaWNlKCsxKTtcclxuICAgICAgICB0aGlzLm9uU2VsZWN0KG5leHQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjb21wbGV0ZSgpIHtcclxuICAgICAgICB0aGlzLm9uQ29tcGxldGUuZW1pdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0U3RlcElkU3BsaWNlKGNvbmRpY2lvbjogbnVtYmVyKSB7XHJcbiAgICAgICAgY29uc3QgYWN0dWFsID0gdGhpcy5hY3RpdmVJZDtcclxuICAgICAgICBjb25zdCBzcGxpY2UgPSBhY3R1YWwuc2xpY2UoMCwgYWN0dWFsLmxlbmd0aCAtIDEpO1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQoYWN0dWFsLnNsaWNlKChhY3R1YWwubGVuZ3RoIC0gMSksIGFjdHVhbC5sZW5ndGgpLCAxMCk7XHJcbiAgICAgICAgY29uc3QgbmV4dCA9IGAke3NwbGljZX0keyhpbmRleCArIChjb25kaWNpb24pKX1gO1xyXG4gICAgICAgIHJldHVybiBuZXh0O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBoaWRlUHJldmlvdXMoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlSWQgIT09ICdsYW1iLXN0ZXAtMCc7XHJcbiAgICB9XHJcbiAgICBnZXQgaGlkZU5leHQoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgY29uc3QgYWxsTGVuZ3RoID0gKHRoaXMuc3RlcHMubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlSWQgIT09ICdsYW1iLXN0ZXAtJyArIGFsbExlbmd0aDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaGlkZUxpbmVSaWdodChzdGVwSWQpIHtcclxuICAgICAgICBjb25zdCBzdGVwID0gcGFyc2VJbnQoc3RlcElkLnNsaWNlKHN0ZXBJZC5sZW5ndGggLSAxLCBzdGVwSWQubGVuZ3RoKSwgMTApO1xyXG4gICAgICAgIHJldHVybiAodGhpcy5zdGVwcy5sZW5ndGggIT09IChzdGVwICsgMSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcclxuICAgICAgICBuZXh0SWQgPSAwO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgTEFNQl9TVEVQU19DT01QT05FTlRTID0gW1xyXG4gICAgTGFtYlN0ZXBHcm91cENvbXBvbmVudCxcclxuICAgIExhbWJTdGVwRGlyZWN0aXZlLFxyXG4gICAgTGFtYlN0ZXBUaXRsZURpcmVjdGl2ZSxcclxuICAgIExhbWJTdGVwQ29udGVudERpcmVjdGl2ZSxcclxuXTtcclxuXHJcbiJdfQ==