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).

415 lines 44.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'; var LambStepTitleDirective = /** @class */ (function () { function LambStepTitleDirective(templateRef) { this.templateRef = templateRef; } LambStepTitleDirective.decorators = [ { type: Directive, args: [{ selector: 'ng-template[lambStepTitle]', },] }, ]; LambStepTitleDirective.ctorParameters = function () { return [ { type: TemplateRef } ]; }; return LambStepTitleDirective; }()); export { LambStepTitleDirective }; if (false) { /** @type {?} */ LambStepTitleDirective.prototype.templateRef; } var LambStepContentDirective = /** @class */ (function () { function LambStepContentDirective(templateRef) { this.templateRef = templateRef; } LambStepContentDirective.decorators = [ { type: Directive, args: [{ selector: 'ng-template[lambStepContent]', },] }, ]; LambStepContentDirective.ctorParameters = function () { return [ { type: TemplateRef } ]; }; return LambStepContentDirective; }()); export { LambStepContentDirective }; if (false) { /** @type {?} */ LambStepContentDirective.prototype.templateRef; } /** @type {?} */ var nextId = 0; var LambStepDirective = /** @class */ (function () { function LambStepDirective() { this.id = "lamb-step-" + nextId++; this.disabled = false; // @Input() disabled = true; this.isValidStep = true; } Object.defineProperty(LambStepDirective.prototype, "validStep", { // public isValidStep: boolean = false; set: // public isValidStep: boolean = false; /** * @param {?} value * @return {?} */ function (value) { this.isValidStep = (value === 'true' || value === true) ? true : false; }, enumerable: true, configurable: true }); 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,] }] }; return LambStepDirective; }()); export { LambStepDirective }; 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; } var LambStepGroupComponent = /** @class */ (function () { function LambStepGroupComponent(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; } Object.defineProperty(LambStepGroupComponent.prototype, "configNames", { set: /** * @param {?} confign * @return {?} */ function (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; }, enumerable: true, configurable: true }); Object.defineProperty(LambStepGroupComponent.prototype, "justify", { set: /** * @param {?} className * @return {?} */ function (className) { if (className === 'fill' || className === 'justified') { this.justifyClass = "nav-" + className; } else { this.justifyClass = "justify-content-" + className; } }, enumerable: true, configurable: true }); /** * @param {?} stepId * @return {?} */ LambStepGroupComponent.prototype.onSelect = /** * @param {?} stepId * @return {?} */ function (stepId) { /** @type {?} */ var selectedStep = this.getStepById(stepId); /** @type {?} */ var selectedActive = this.getStepById(this.activeId); // console.log('selectedStep'); // console.log(selectedStep); if (selectedStep && !selectedStep.disabled && this.activeId !== selectedStep.id) { /** @type {?} */ var defaultPrevented_1 = false; this.stepChange.emit({ activeId: this.activeId, activeData: selectedActive.data || null, nextId: selectedStep.id, preventDefault: function () { defaultPrevented_1 = true; }, }); if (!defaultPrevented_1) { this.activeId = selectedStep.id; } } }; /** * @return {?} */ LambStepGroupComponent.prototype.ngOnInit = /** * @return {?} */ function () { }; /** * @return {?} */ LambStepGroupComponent.prototype.ngAfterContentChecked = /** * @return {?} */ function () { /** @type {?} */ var activeStep = this.getStepById(this.activeId); this.activeId = activeStep ? activeStep.id : (this.steps.length ? this.steps.first.id : null); }; /** * @param {?} id * @return {?} */ LambStepGroupComponent.prototype.getStepById = /** * @param {?} id * @return {?} */ function (id) { /** @type {?} */ var stepsWithId = this.steps.filter(function (step) { return step.id === id; }); return stepsWithId.length ? stepsWithId[0] : null; }; /** * @return {?} */ LambStepGroupComponent.prototype.back = /** * @return {?} */ function () { /** @type {?} */ var back = this.getStepIdSplice(-1); this.onSelect(back); }; /** * @return {?} */ LambStepGroupComponent.prototype.next = /** * @return {?} */ function () { /** @type {?} */ var next = this.getStepIdSplice(+1); this.onSelect(next); }; /** * @return {?} */ LambStepGroupComponent.prototype.complete = /** * @return {?} */ function () { this.onComplete.emit(); }; /** * @param {?} condicion * @return {?} */ LambStepGroupComponent.prototype.getStepIdSplice = /** * @param {?} condicion * @return {?} */ function (condicion) { /** @type {?} */ var actual = this.activeId; /** @type {?} */ var splice = actual.slice(0, actual.length - 1); /** @type {?} */ var index = parseInt(actual.slice((actual.length - 1), actual.length), 10); /** @type {?} */ var next = "" + splice + (index + (condicion)); return next; }; Object.defineProperty(LambStepGroupComponent.prototype, "hidePrevious", { get: /** * @return {?} */ function () { return this.activeId !== 'lamb-step-0'; }, enumerable: true, configurable: true }); Object.defineProperty(LambStepGroupComponent.prototype, "hideNext", { get: /** * @return {?} */ function () { /** @type {?} */ var allLength = (this.steps.length - 1); return this.activeId !== 'lamb-step-' + allLength; }, enumerable: true, configurable: true }); /** * @param {?} stepId * @return {?} */ LambStepGroupComponent.prototype.hideLineRight = /** * @param {?} stepId * @return {?} */ function (stepId) { /** @type {?} */ var step = parseInt(stepId.slice(stepId.length - 1, stepId.length), 10); return (this.steps.length !== (step + 1)); }; /** * @return {?} */ LambStepGroupComponent.prototype.ngOnDestroy = /** * @return {?} */ function () { nextId = 0; }; LambStepGroupComponent.decorators = [ { type: Component, args: [{ selector: 'lamb-step-group', template: "<!-- <ul class=\"nav justify-content-center\" id=\"myStep\" role=\"steplist\"> -->\n<ul [class]=\"'nav lamb-nav-tabs nav-' + type + (orientation == 'horizontal'? ' ' + justifyClass : ' flex-column' )\" id=\"myStep\"\n role=\"steplist\">\n\n <!-- <ng-template ngFor let-step [ngForOf]=\"steps\" *ngFor=\"let step of steps\"> -->\n <ng-template ngFor let-step [ngForOf]=\"steps\">\n <li class=\"nav-item\">\n <a [id]=\"step.id\" class=\"nav-link\" [class.active]=\"step.id === activeId\" [class.disabled]=\"step.disabled || !step.isValidStep\"\n (click)=\"!!onSelect(step.id)\" role=\"step\" [attr.stepindex]=\"(step.disabled || !step.isValidStep ? '-1': undefined)\"\n [attr.aria-controls]=\"(!destroyOnHide || step.id === activeId ? step.id + '-panel': null)\" [attr.aria-expanded]=\"step.id === activeId\"\n [attr.aria-disabled]=\"step.disabled || !step.isValidStep\">\n <!-- data-toggle=\"step\"\n aria-selected=\"true\" -->\n <ng-template [ngIf]=\"step.icon\">\n <span class=\"lamb-round-tabs\" [title]=\"step.title\">\n <i class=\"{{ step.icon }} lamb-icon\"></i>\n </span>\n </ng-template>\n <br>\n <span class=\"lamb-round-text\">\n {{ step.title }}\n </span>\n <ng-template [ngTemplateOutlet]=\"step.titleTemplate?.templateRef\"></ng-template>\n </a>\n </li>\n <li class=\"nav-line\" *ngIf=\"hideLineRight(step.id)\">\n <div class=\"lamb-liner\"></div>\n </li>\n </ng-template>\n\n <!-- <ng-content select=\"lamb-step-head\"></ng-content> -->\n</ul>\n<div class=\"tab-content lamb-content\" id=\"myStepContent\">\n <!-- <ng-content select=\"lamb-step-body\"></ng-content> -->\n <ng-template ngFor let-step [ngForOf]=\"steps\">\n <!-- class=\"step-pane fade {{ step.id === activeId ? 'active': null }}\" -->\n <!-- \n <div [@slideOfRight]=\"((step.id === activeId) && (status === 'next')) ? 'next': 'back'\" class=\"tab-pane {{ step.id === activeId ? 'active': 'active' }}\"\n *ngIf=\"!destroyOnHide || step.id === activeId\" role=\"steppanel\" [attr.aria-labelledby]=\"step.id\" id=\"{{ step.id }}-panel\"\n [attr.aria-expanded]=\"step.id === activeId\"> -->\n\n <div class=\"tab-pane {{ step.id === activeId ? 'active': null }}\" *ngIf=\"!destroyOnHide || step.id === activeId\" role=\"steppanel\"\n [attr.aria-labelledby]=\"step.id\" id=\"{{ step.id }}-panel\" [attr.aria-expanded]=\"step.id === activeId\">\n <div class=\"row\">\n <div class=\"col-md-12\">\n <ng-template [ngTemplateOutlet]=\"step.contentTemplate?.templateRef\"></ng-template>\n </div>\n </div>\n <div class=\"row lamb-button-manage\">\n <div class=\"offset-md-4 col-md-4\">\n <div class=\"row\">\n <div class=\"col-md-6\" *ngIf=\"hidePrevious\">\n <div class=\"form-group text-center space-20\">\n <button class=\"btn btn-sm btn-block btn-outline-rounded btn-default\" (click)=\"back()\">\n <span style=\"margin-right:10px;\" class=\"fa fa-arrow-left\"></span>\n {{ iConfigNames.buttonBack }}\n </button>\n </div>\n </div>\n <div class=\"col-md-6\" *ngIf=\"hideNext\">\n <div class=\"form-group text-center space-20\">\n <button class=\"btn btn-sm btn-block btn-outline-rounded btn-info\" [disabled]=\"!step.isValidStep\" (click)=\"next()\">\n {{ iConfigNames.buttonNext }}\n <span style=\"margin-left:10px;\" class=\"fa fa-arrow-right\"></span>\n </button>\n </div>\n </div>\n <div class=\"col-md-6\" *ngIf=\"hidePrevious && !hideNext\">\n <div class=\"form-group text-center space-20\">\n <button class=\"btn btn-sm btn-block btn-outline-rounded btn-info\" [disabled]=\"!step.isValidStep\" (click)=\"complete()\">\n {{ iConfigNames.buttonFinish }}\n <span style=\"margin-left:10px;\" class=\"fa fa-check\"></span>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n</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 = function () { return [ { 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 }] }; return LambStepGroupComponent; }()); export { LambStepGroupComponent }; 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 var LAMB_STEPS_COMPONENTS = [ LambStepGroupComponent, LambStepDirective, LambStepTitleDirective, LambStepContentDirective, ]; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbGFtYi13ZWItbGliLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvc3RlcHMvc3RlcHMuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQU9BLE9BQU8sRUFDSCxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFDM0IsU0FBUyxFQUFFLFlBQVksRUFDdkIsZUFBZSxFQUFFLFdBQVcsRUFDNUIsTUFBTSxFQUFFLFlBQVksR0FDdkIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRXJFO0lBSUksZ0NBQW1CLFdBQTZCO1FBQTdCLGdCQUFXLEdBQVgsV0FBVyxDQUFrQjtJQUFJLENBQUM7O2dCQUp4RCxTQUFTLFNBQUM7b0JBQ1AsUUFBUSxFQUFFLDRCQUE0QjtpQkFDekM7OztnQkFSb0IsV0FBVzs7SUFXaEMsNkJBQUM7Q0FBQSxBQUxELElBS0M7U0FGWSxzQkFBc0I7OztJQUNuQiw2Q0FBb0M7O0FBR3BEO0lBSUksa0NBQW1CLFdBQTZCO1FBQTdCLGdCQUFXLEdBQVgsV0FBVyxDQUFrQjtJQUFJLENBQUM7O2dCQUp4RCxTQUFTLFNBQUM7b0JBQ1AsUUFBUSxFQUFFLDhCQUE4QjtpQkFDM0M7OztnQkFmb0IsV0FBVzs7SUFrQmhDLCtCQUFDO0NBQUEsQUFMRCxJQUtDO1NBRlksd0JBQXdCOzs7SUFDckIsK0NBQW9DOzs7SUFHaEQsTUFBTSxHQUFHLENBQUM7QUFFZDtJQUFBO1FBTWEsT0FBRSxHQUFHLGVBQWEsTUFBTSxFQUFJLENBQUM7UUFXN0IsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUMxQiw0QkFBNEI7UUFFckIsZ0JBQVcsR0FBRyxJQUFJLENBQUM7SUFVOUIsQ0FBQztJQVBHLHNCQUNJLHdDQUFT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QUFrQzs7SUFadEIsd0NBQThCOzs7QUErRDlDLE1BQU0sS0FBTyxxQkFBcUIsR0FBRztJQUNqQyxzQkFBc0I7SUFDdEIsaUJBQWlCO0lBQ2pCLHNCQUFzQjtJQUN0Qix3QkFBd0I7Q0FDM0IiLCJzb3VyY2VzQ29udGVudCI6WyJcclxuLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCBMYW1iIFRlYW0uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcbiAqL1xyXG5cclxuaW1wb3J0IHtcclxuICAgIENvbXBvbmVudCwgSW5wdXQsIFF1ZXJ5TGlzdCxcclxuICAgIERpcmVjdGl2ZSwgQ29udGVudENoaWxkLFxyXG4gICAgQ29udGVudENoaWxkcmVuLCBUZW1wbGF0ZVJlZiwgQWZ0ZXJDb250ZW50Q2hlY2tlZCxcclxuICAgIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIE9uRGVzdHJveSxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTGFtYlN0ZXBDb25maWcsIENvbmZpZ05hbWVzIH0gZnJvbSAnLi9zdGVwLWNvbmZpZyc7XHJcbmltcG9ydCB7IHNsaWRlT2ZSaWdodCB9IGZyb20gJy4vYW5pbWF0aW9ucy9zbGlkZS1vZi1yaWdodC5hbmltYXRpb24nO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgICBzZWxlY3RvcjogJ25nLXRlbXBsYXRlW2xhbWJTdGVwVGl0bGVdJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIExhbWJTdGVwVGl0bGVEaXJlY3RpdmUge1xyXG4gICAgY29uc3RydWN0b3IocHVibGljIHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+KSB7IH1cclxufVxyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgICBzZWxlY3RvcjogJ25nLXRlbXBsYXRlW2xhbWJTdGVwQ29udGVudF0nLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTGFtYlN0ZXBDb250ZW50RGlyZWN0aXZlIHtcclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55PikgeyB9XHJcbn1cclxuXHJcbmxldCBuZXh0SWQgPSAwO1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6ZGlyZWN0aXZlLXNlbGVjdG9yXHJcbiAgICBzZWxlY3RvcjogJ2xhbWItc3RlcCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBMYW1iU3RlcERpcmVjdGl2ZSB7XHJcblxyXG4gICAgQElucHV0KCkgaWQgPSBgbGFtYi1zdGVwLSR7bmV4dElkKyt9YDtcclxuXHJcbiAgICBASW5wdXQoKSB0aXRsZTogc3RyaW5nO1xyXG5cclxuICAgIEBJbnB1dCgpIGljb246IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEd1YXJkYSBDdWFscXVpZXIgZGF0by4gQ3JlYWRvIHBvciBlbCBFcXVpcG8gTGFtYi5cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgZGF0YTogYW55O1xyXG5cclxuICAgIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XHJcbiAgICAvLyBASW5wdXQoKSBkaXNhYmxlZCA9IHRydWU7XHJcblxyXG4gICAgcHVibGljIGlzVmFsaWRTdGVwID0gdHJ1ZTtcclxuICAgIC8vIHB1YmxpYyBpc1ZhbGlkU3RlcDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBzZXQgdmFsaWRTdGVwKHZhbHVlOiBzdHJpbmcgfCBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5pc1ZhbGlkU3RlcCA9ICh2YWx1ZSA9PT0gJ3RydWUnIHx8IHZhbHVlID09PSB0cnVlKSA/IHRydWUgOiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBAQ29udGVudENoaWxkKExhbWJTdGVwQ29udGVudERpcmVjdGl2ZSkgY29udGVudFRlbXBsYXRlOiBMYW1iU3RlcENvbnRlbnREaXJlY3RpdmU7XHJcbiAgICBAQ29udGVudENoaWxkKExhbWJTdGVwVGl0bGVEaXJlY3RpdmUpIHRpdGxlVGVtcGxhdGU6IExhbWJTdGVwVGl0bGVEaXJlY3RpdmU7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTGFtYlN0ZXBDaGFuZ2VFdmVudCB7XHJcbiAgICAvKipcclxuICAgICAqIElkIGRlIGxhIHBlc3Rhw7FhIGFjdHVhbG1lbnRlIGFjdGl2YS5cclxuICAgICAqL1xyXG4gICAgYWN0aXZlSWQ6IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIElkIGRlIGxhIHBlc3Rhw7FhIHJlY2nDqW4gc2VsZWNjaW9uYWRhLlxyXG4gICAgICovXHJcbiAgICBuZXh0SWQ6IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIGRhdGEgZ3VhcmRhZGEgZW4gbGEgcGVzdGHDsWEgYWN0dWFsbWVudGUgYWN0aXZhLlxyXG4gICAgICovXHJcbiAgICBhY3RpdmVEYXRhOiBhbnk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGdW5jacOzbiBxdWUgZXZpdGFyw6EgZWwgY2FtYmlvIGRlIHBlcnRhw7FhIHNpIHNlIGxsYW1hLlxyXG4gICAgICovXHJcbiAgICBwcmV2ZW50RGVmYXVsdDogKCkgPT4gdm9pZDtcclxuXHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdsYW1iLXN0ZXAtZ3JvdXAnLFxyXG4gICAgdGVtcGxhdGU6IGA8IS0tIDx1bCBjbGFzcz1cIm5hdiBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCIgaWQ9XCJteVN0ZXBcIiByb2xlPVwic3RlcGxpc3RcIj4gLS0+XHJcbjx1bCBbY2xhc3NdPVwiJ25hdiBsYW1iLW5hdi10YWJzIG5hdi0nICsgdHlwZSArIChvcmllbnRhdGlvbiA9PSAnaG9yaXpvbnRhbCc/ICcgJyArIGp1c3RpZnlDbGFzcyA6ICcgZmxleC1jb2x1bW4nIClcIiBpZD1cIm15U3RlcFwiXHJcbiAgICByb2xlPVwic3RlcGxpc3RcIj5cclxuXHJcbiAgICA8IS0tIDxuZy10ZW1wbGF0ZSBuZ0ZvciBsZXQtc3RlcCBbbmdGb3JPZl09XCJzdGVwc1wiICpuZ0Zvcj1cImxldCBzdGVwIG9mIHN0ZXBzXCI+IC0tPlxyXG4gICAgPG5nLXRlbXBsYXRlIG5nRm9yIGxldC1zdGVwIFtuZ0Zvck9mXT1cInN0ZXBzXCI+XHJcbiAgICAgICAgPGxpIGNsYXNzPVwibmF2LWl0ZW1cIj5cclxuICAgICAgICAgICAgPGEgW2lkXT1cInN0ZXAuaWRcIiBjbGFzcz1cIm5hdi1saW5rXCIgW2NsYXNzLmFjdGl2ZV09XCJzdGVwLmlkID09PSBhY3RpdmVJZFwiIFtjbGFzcy5kaXNhYmxlZF09XCJzdGVwLmRpc2FibGVkIHx8ICFzdGVwLmlzVmFsaWRTdGVwXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCIhIW9uU2VsZWN0KHN0ZXAuaWQpXCIgcm9sZT1cInN0ZXBcIiBbYXR0ci5zdGVwaW5kZXhdPVwiKHN0ZXAuZGlzYWJsZWQgfHwgIXN0ZXAuaXNWYWxpZFN0ZXAgPyAnLTEnOiB1bmRlZmluZWQpXCJcclxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwiKCFkZXN0cm95T25IaWRlIHx8IHN0ZXAuaWQgPT09IGFjdGl2ZUlkID8gc3RlcC5pZCArICctcGFuZWwnOiBudWxsKVwiIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwic3RlcC5pZCA9PT0gYWN0aXZlSWRcIlxyXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJzdGVwLmRpc2FibGVkIHx8ICFzdGVwLmlzVmFsaWRTdGVwXCI+XHJcbiAgICAgICAgICAgICAgICA8IS0tIGRhdGEtdG9nZ2xlPVwic3RlcFwiXHJcbiAgICAgICAgICAgICAgICBhcmlhLXNlbGVjdGVkPVwidHJ1ZVwiIC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cInN0ZXAuaWNvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFtYi1yb3VuZC10YWJzXCIgW3RpdGxlXT1cInN0ZXAudGl0bGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJ7eyBzdGVwLmljb24gfX0gbGFtYi1pY29uXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICA8YnI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhbWItcm91bmQtdGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IHN0ZXAudGl0bGUgfX1cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJzdGVwLnRpdGxlVGVtcGxhdGU/LnRlbXBsYXRlUmVmXCI+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgIDwvbGk+XHJcbiAgICAgICAgPGxpIGNsYXNzPVwibmF2LWxpbmVcIiAqbmdJZj1cImhpZGVMaW5lUmlnaHQoc3RlcC5pZClcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxhbWItbGluZXJcIj48L2Rpdj5cclxuICAgICAgICA8L2xpPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICA8IS0tIDxuZy1jb250ZW50IHNlbGVjdD1cImxhbWItc3RlcC1oZWFkXCI+PC9uZy1jb250ZW50PiAtLT5cclxuPC91bD5cclxuPGRpdiBjbGFzcz1cInRhYi1jb250ZW50IGxhbWItY29udGVudFwiIGlkPVwibXlTdGVwQ29udGVudFwiPlxyXG4gICAgPCEtLSA8bmctY29udGVudCBzZWxlY3Q9XCJsYW1iLXN0ZXAtYm9keVwiPjwvbmctY29udGVudD4gLS0+XHJcbiAgICA8bmctdGVtcGxhdGUgbmdGb3IgbGV0LXN0ZXAgW25nRm9yT2ZdPVwic3RlcHNcIj5cclxuICAgICAgICA8IS0tIGNsYXNzPVwic3RlcC1wYW5lIGZhZGUge3sgc3RlcC5pZCA9PT0gYWN0aXZlSWQgPyAnYWN0aXZlJzogbnVsbCB9fVwiIC0tPlxyXG4gICAgICAgIDwhLS0gXHJcbiAgICAgICAgPGRpdiBbQHNsaWRlT2ZSaWdodF09XCIoKHN0ZXAuaWQgPT09IGFjdGl2ZUlkKSAmJiAoc3RhdHVzID09PSAnbmV4dCcpKSA/ICduZXh0JzogJ2JhY2snXCIgY2xhc3M9XCJ0YWItcGFuZSB7eyBzdGVwLmlkID09PSBhY3RpdmVJZCA/ICdhY3RpdmUnOiAnYWN0aXZlJyB9fVwiXHJcbiAgICAgICAgICAgICpuZ0lmPVwiIWRlc3Ryb3lPbkhpZGUgfHwgc3RlcC5pZCA9PT0gYWN0aXZlSWRcIiByb2xlPVwic3RlcHBhbmVsXCIgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cInN0ZXAuaWRcIiBpZD1cInt7IHN0ZXAuaWQgfX0tcGFuZWxcIlxyXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cInN0ZXAuaWQgPT09IGFjdGl2ZUlkXCI+IC0tPlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLXBhbmUge3sgc3RlcC5pZCA9PT0gYWN0aXZlSWQgPyAnYWN0aXZlJzogbnVsbCB9fVwiICpuZ0lmPVwiIWRlc3Ryb3lPbkhpZGUgfHwgc3RlcC5pZCA9PT0gYWN0aXZlSWRcIiByb2xlPVwic3RlcHBhbmVsXCJcclxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cInN0ZXAuaWRcIiBpZD1cInt7IHN0ZXAuaWQgfX0tcGFuZWxcIiBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cInN0ZXAuaWQgPT09IGFjdGl2ZUlkXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwic3RlcC5jb250ZW50VGVtcGxhdGU/LnRlbXBsYXRlUmVmXCI+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBsYW1iLWJ1dHRvbi1tYW5hZ2VcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvZmZzZXQtbWQtNCBjb2wtbWQtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCIgKm5nSWY9XCJoaWRlUHJldmlvdXNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHRleHQtY2VudGVyIHNwYWNlLTIwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLWJsb2NrIGJ0bi1vdXRsaW5lLXJvdW5kZWQgYnRuLWRlZmF1bHRcIiAoY2xpY2spPVwiYmFjaygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwibWFyZ2luLXJpZ2h0OjEwcHg7XCIgY2xhc3M9XCJmYSBmYS1hcnJvdy1sZWZ0XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpQ29uZmlnTmFtZXMuYnV0dG9uQmFjayB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIiAqbmdJZj1cImhpZGVOZXh0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCB0ZXh0LWNlbnRlciBzcGFjZS0yMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1ibG9jayBidG4tb3V0bGluZS1yb3VuZGVkIGJ0bi1pbmZvXCIgW2Rpc2FibGVkXT1cIiFzdGVwLmlzVmFsaWRTdGVwXCIgKGNsaWNrKT1cIm5leHQoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpQ29uZmlnTmFtZXMuYnV0dG9uTmV4dCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cIm1hcmdpbi1sZWZ0OjEwcHg7XCIgY2xhc3M9XCJmYSBmYS1hcnJvdy1yaWdodFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCIgKm5nSWY9XCJoaWRlUHJldmlvdXMgJiYgIWhpZGVOZXh0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCB0ZXh0LWNlbnRlciBzcGFjZS0yMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1ibG9jayBidG4tb3V0bGluZS1yb3VuZGVkIGJ0bi1pbmZvXCIgW2Rpc2FibGVkXT1cIiFzdGVwLmlzVmFsaWRTdGVwXCIgKGNsaWNrKT1cImNvbXBsZXRlKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaUNvbmZpZ05hbWVzLmJ1dHRvbkZpbmlzaCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cIm1hcmdpbi1sZWZ0OjEwcHg7XCIgY2xhc3M9XCJmYSBmYS1jaGVja1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbjwvZGl2PmAsXHJcbiAgICBzdHlsZXM6IFtgLmxhbWItbGluZXJ7aGVpZ2h0OjJweDtwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDo1cmVtO21hcmdpbjowIGF1dG87bGVmdDowO3JpZ2h0OjA7dG9wOjEuOHJlbTt6LWluZGV4OjF9LnRhYi1jb250ZW50e3BhZGRpbmctdG9wOjJyZW19Lm5hdi1saW5re3BhZGRpbmc6MCAwIDVweH0ubmF2LWxpbmsgLmxhbWItcm91bmQtdGV4dHt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7Zm9udC1zaXplOi43cmVtfUBtZWRpYSAobWF4LXdpZHRoOjU1MHB4KXsubGFtYi1saW5lcnt3aWR0aDoxcmVtfS5uYXYtbGluayAubGFtYi1yb3VuZC10ZXh0e2Rpc3BsYXk6bm9uZX19Lm5hdi1saW5rLmFjdGl2ZSBzcGFuLmxhbWItcm91bmQtdGFic3tiYWNrZ3JvdW5kOiNmZmE5MmR9LmxhbWItbmF2LXRhYnN7Ym9yZGVyLWJvdHRvbTp0cmFuc3BhcmVudDtwb3NpdGlvbjpyZWxhdGl2ZTttYXJnaW46MCBhdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt0ZXh0LWFsaWduOmNlbnRlcjtwYWRkaW5nOjAgMS41cmVtfS5sYW1iLW5hdi10YWJzIGxpLm5hdi1saW5le3BhZGRpbmctbGVmdDowO3BhZGRpbmctcmlnaHQ6MH0ubGFtYi1uYXYtdGFicyBsaSBhe3RleHQtZGVjb3JhdGlvbjpub25lfS5sYW1iLWJ1dHRvbi1tYW5hZ2V7bWFyZ2luLXRvcDoxLjVyZW19c3Bhbi5sYW1iLXJvdW5kLXRhYnN7d2lkdGg6NDBweDtoZWlnaHQ6NDBweDtsaW5lLWhlaWdodDo0MHB4O2Rpc3BsYXk6aW5saW5lLWJsb2NrO2JvcmRlci1yYWRpdXM6MTAwcHg7ei1pbmRleDoyO2xlZnQ6LTE7dGV4dC1hbGlnbjpjZW50ZXI7Zm9udC1zaXplOjEuM3JlbTtwb3NpdGlvbjpyZWxhdGl2ZTttYXJnaW4tdG9wOi42cmVtO21hcmdpbi1ib3R0b206MH1gXSxcclxuICAgIC8vIGFuaW1hdGlvbnM6IFtBbmltYXRpb25zLnNsaWRlSW5PdXQsIEFuaW1hdGlvbnMuc2xpZGVPZlJpZ2h0XSxcclxuICAgIGFuaW1hdGlvbnM6IFtzbGlkZU9mUmlnaHRdLFxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIExhbWJTdGVwR3JvdXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyQ29udGVudENoZWNrZWQsIE9uRGVzdHJveSB7XHJcbiAgICBqdXN0aWZ5Q2xhc3M6IHN0cmluZztcclxuICAgIHB1YmxpYyBoaWRlQ29udGVudCA9IGZhbHNlO1xyXG5cclxuICAgIEBDb250ZW50Q2hpbGRyZW4oTGFtYlN0ZXBEaXJlY3RpdmUpIHN0ZXBzOiBRdWVyeUxpc3Q8TGFtYlN0ZXBEaXJlY3RpdmU+O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSWQgZGVsIHN0ZXAgcXVlIHNhbGRyw6EgYWN0aXZhZG8gcG9yIGRlZmVjdG8uXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIGFjdGl2ZUlkOiBzdHJpbmc7XHJcbiAgICAvKipcclxuICAgICAqIFBlcnNvbmFsaXphciBlbCBub21icmUgJ0FudGVyaW9yIHwgc2lndWllbnRlIHkgRmluYWxpemFyJ1xyXG4gICAgICogRm9ybWF0byBkZSB2YXJpYWJsZSA6IG9iamVjdG9cclxuICAgICAqIEVqLiBjb25maWdOYW1lczogb2JqZWN0ID0ge2J1dHRvbkJhY2s6ICdSZWdyZXNhcicsIGJ1dHRvbk5leHQ6ICdHcmFiYXInLCBidXR0b25GaW5pc2g6ICdGaW4nfVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaUNvbmZpZ05hbWVzOiBDb25maWdOYW1lcztcclxuICAgIEBJbnB1dCgpXHJcbiAgICBzZXQgY29uZmlnTmFtZXMoY29uZmlnbjogQ29uZmlnTmFtZXMpIHtcclxuICAgICAgICB0aGlzLmlDb25maWdOYW1lcy5idXR0b25CYWNrID0gY29uZmlnbi5idXR0b25CYWNrIHx8IHRoaXMuaUNvbmZpZ05hbWVzLmJ1dHRvbkJhY2s7XHJcbiAgICAgICAgdGhpcy5pQ29uZmlnTmFtZXMuYnV0dG9uTmV4dCA9IGNvbmZpZ24uYnV0dG9uTmV4dCB8fCB0aGlzLmlDb25maWdOYW1lcy5idXR0b25OZXh0O1xyXG4gICAgICAgIHRoaXMuaUNvbmZpZ05hbWVzLmJ1dHRvbkZpbmlzaCA9IGNvbmZpZ24uYnV0dG9uRmluaXNoIHx8IHRoaXMuaUNvbmZpZ05hbWVzLmJ1dHRvbkZpbmlzaDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEN1YW5kbyBjYW1iaWEgZGUgc3RlcCBzZSBkZXN0cnVpcmEgZWwgY29udGVuaWRvIGFudGVyaW9yIG8gc29sbyBzZSBvY3VsYXRhcsOhP1xyXG4gICAgICovXHJcbiAgICAvLyBASW5wdXQoKSBkZXN0cm95T25IaWRlOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIEBJbnB1dCgpIGRlc3Ryb3lPbkhpZGUgPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEVtaXRlIGN1YW5kbyBoYXkgY2FtYmlvcyBkZSBzdGVwcy5cclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpIHN0ZXBDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPExhbWJTdGVwQ2hhbmdlRXZlbnQ+KCk7XHJcblxyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW91dHB1dC1vbi1wcmVmaXhcclxuICAgIEBPdXRwdXQoKSBvbkNvbXBsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHNldCBqdXN0aWZ5KGNsYXNzTmFtZTogJ3N0YXJ0JyB8ICdjZW50ZXInIHwgJ2VuZCcgfCAnZmlsbCcgfCAnanVzdGlmaWVkJykge1xyXG4gICAgICAgIGlmIChjbGFzc05hbWUgPT09ICdmaWxsJyB8fCBjbGFzc05hbWUgPT09ICdqdXN0aWZpZWQnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuanVzdGlmeUNsYXNzID0gYG5hdi0ke2NsYXNzTmFtZX1gO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuanVzdGlmeUNsYXNzID0gYGp1c3RpZnktY29udGVudC0ke2NsYXNzTmFtZX1gO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvblNlbGVjdChzdGVwSWQ6IHN0cmluZykge1xyXG5cclxuICAgICAgICBjb25zdCBzZWxlY3RlZFN0ZXAgPSB0aGlzLmdldFN0ZXBCeUlkKHN0ZXBJZCk7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRBY3RpdmUgPSB0aGlzLmdldFN0ZXBCeUlkKHRoaXMuYWN0aXZlSWQpO1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdzZWxlY3RlZFN0ZXAnKTtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZyhzZWxlY3RlZFN0ZXApO1xyXG5cclxuICAgICAgICBpZiAoc2VsZWN0ZWRTdGVwICYmICFzZWxlY3RlZFN0ZXAuZGlzYWJsZWQgJiYgdGhpcy5hY3RpdmVJZCAhPT0gc2VsZWN0ZWRTdGVwLmlkKSB7XHJcbiAgICAgICAgICAgIGxldCBkZWZhdWx0UHJldmVudGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuc3RlcENoYW5nZS5lbWl0KFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZUlkOiB0aGlzLmFjdGl2ZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZURhdGE6IHNlbGVjdGVkQWN0aXZlLmRhdGEgfHwgbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICBuZXh0SWQ6IHNlbGVjdGVkU3RlcC5pZCxcclxuICAgICAgICAgICAgICAgICAgICBwcmV2ZW50RGVmYXVsdDogKCkgPT4geyBkZWZhdWx0UHJldmVudGVkID0gdHJ1ZTsgfSxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGlmICghZGVmYXVsdFByZXZlbnRlZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVJZCA9IHNlbGVjdGVkU3RlcC5pZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgY29uZmlnOiBMYW1iU3RlcENvbmZpZykge1xyXG4gICAgICAgIHRoaXMudHlwZSA9IHRoaXMuY29uZmlnLnR5cGU7XHJcbiAgICAgICAgdGhpcy5qdXN0aWZ5ID0gdGhpcy5jb25maWcuanVzdGlmeTtcclxuICAgICAgICB0aGlzLm9yaWVudGF0aW9uID0gdGhpcy5jb25maWcub3JpZW50YXRpb247XHJcbiAgICAgICAgdGhpcy5pQ29uZmlnTmFtZXMgPSB0aGlzLmNvbmZpZy5jb25maWdOYW1lcztcclxuICAgIH1cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptZW1iZXItb3JkZXJpbmdcclxuICAgIEBJbnB1dCgpIG9yaWVudGF0aW9uOiAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnO1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1lbWJlci1vcmRlcmluZ1xyXG4gICAgQElucHV0KCkgdHlwZTogJ3N0ZXBzcycgfCAncGlsbHMnO1xyXG5cclxuICAgIG5nQWZ0ZXJDb250ZW50Q2hlY2tlZCgpIHtcclxuICAgICAgICBjb25zdCBhY3RpdmVTdGVwID0gdGhpcy5nZXRTdGVwQnlJZCh0aGlzLmFjdGl2ZUlkKTtcclxuICAgICAgICB0aGlzLmFjdGl2ZUlkID0gYWN0aXZlU3RlcCA/IGFjdGl2ZVN0ZXAuaWQgOiAodGhpcy5zdGVwcy5sZW5ndGggPyB0aGlzLnN0ZXBzLmZpcnN0LmlkIDogbnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRTdGVwQnlJZChpZDogc3RyaW5nKTogTGFtYlN0ZXBEaXJlY3RpdmUge1xyXG4gICAgICAgIGNvbnN0IHN0ZXBzV2l0aElkOiBMYW1iU3RlcERpcmVjdGl2ZVtdID0gdGhpcy5zdGVwcy5maWx0ZXIoc3RlcCA9PiBzdGVwLmlkID09PSBpZCk7XHJcbiAgICAgICAgcmV0dXJuIHN0ZXBzV2l0aElkLmxlbmd0aCA/IHN0ZXBzV2l0aElkWzBdIDogbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYmFjaygpIHtcclxuICAgICAgICBjb25zdCBiYWNrID0gdGhpcy5nZXRTdGVwSWRTcGxpY2UoLTEpO1xyXG4gICAgICAgIHRoaXMub25TZWxlY3QoYmFjayk7XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgbmV4dCgpIHtcclxuICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5nZXRTdGVwSWRTcGxpY2UoKzEpO1xyXG4gICAgICAgIHRoaXMub25TZWxlY3QobmV4dCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNvbXBsZXRlKCkge1xyXG4gICAgICAgIHRoaXMub25Db21wbGV0ZS5lbWl0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRTdGVwSWRTcGxpY2UoY29uZGljaW9uOiBudW1iZXIpIHtcclxuICAgICAgICBjb25zdCBhY3R1YWwgPSB0aGlzLmFjdGl2ZUlkO1xyXG4gICAgICAgIGNvbnN0IHNwbGljZSA9IGFjdHVhbC5zbGljZSgwLCBhY3R1YWwubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSBwYXJzZUludChhY3R1YWwuc2xpY2UoKGFjdHVhbC5sZW5ndGggLSAxKSwgYWN0dWFsLmxlbmd0aCksIDEwKTtcclxuICAgICAgICBjb25zdCBuZXh0ID0gYCR7c3BsaWNlfSR7KGluZGV4ICsgKGNvbmRpY2lvbikpfWA7XHJcbiAgICAgICAgcmV0dXJuIG5leHQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGhpZGVQcmV2aW91cygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVJZCAhPT0gJ2xhbWItc3RlcC0wJztcclxuICAgIH1cclxuICAgIGdldCBoaWRlTmV4dCgpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCBhbGxMZW5ndGggPSAodGhpcy5zdGVwcy5sZW5ndGggLSAxKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVJZCAhPT0gJ2xhbWItc3RlcC0nICsgYWxsTGVuZ3RoO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBoaWRlTGluZVJpZ2h0KHN0ZXBJZCkge1xyXG4gICAgICAgIGNvbnN0IHN0ZXAgPSBwYXJzZUludChzdGVwSWQuc2xpY2Uoc3RlcElkLmxlbmd0aCAtIDEsIHN0ZXBJZC5sZW5ndGgpLCAxMCk7XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLnN0ZXBzLmxlbmd0aCAhPT0gKHN0ZXAgKyAxKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG5nT25EZXN0cm95KCkge1xyXG4gICAgICAgIG5leHRJZCA9IDA7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBMQU1CX1NURVBTX0NPTVBPTkVOVFMgPSBbXHJcbiAgICBMYW1iU3RlcEdyb3VwQ29tcG9uZW50LFxyXG4gICAgTGFtYlN0ZXBEaXJlY3RpdmUsXHJcbiAgICBMYW1iU3RlcFRpdGxlRGlyZWN0aXZlLFxyXG4gICAgTGFtYlN0ZXBDb250ZW50RGlyZWN0aXZlLFxyXG5dO1xyXG5cclxuIl19