ng-devui
Version:
DevUI components based on Angular
148 lines • 38.2 kB
JavaScript
import { DOCUMENT } from '@angular/common';
import { Component, ElementRef, HostBinding, Inject, Renderer2 } from '@angular/core';
import { I18nService } from 'ng-devui/i18n';
import { PositionService } from 'ng-devui/position';
import { fromEvent } from 'rxjs';
import { debounceTime, throttleTime } from 'rxjs/operators';
import { StepsGuideService } from './steps-guide.service';
import * as i0 from "@angular/core";
import * as i1 from "./steps-guide.service";
import * as i2 from "ng-devui/position";
import * as i3 from "ng-devui/i18n";
import * as i4 from "@angular/common";
import * as i5 from "ng-devui/utils";
export class StepsGuideComponent {
get class() {
return 'devui-step-item ' + this.position;
}
get display() {
return 'block';
}
constructor(stepService, renderer, positionService, elm, i18n, doc) {
this.stepService = stepService;
this.renderer = renderer;
this.positionService = positionService;
this.elm = elm;
this.i18n = i18n;
this.doc = doc;
this.position = 'top';
this.zIndex = 1100;
this.dots = [];
this.SCROLL_REFRESH_INTERVAL = 100;
this.DOT_HORIZONTAL_MARGIN = 27;
this.DOT_VERTICAL_MARGIN = 22;
this.document = this.doc;
}
ngOnInit() {
this.dots = new Array(this.stepsCount);
this.elm.nativeElement.style.zIndex = this.zIndex;
this.i18nCommonText = this.i18n.getI18nText().stepsGuide;
const i18nSubscription = this.i18n.langChange().subscribe((data) => {
this.i18nCommonText = data.stepsGuide;
});
this.subScriber = fromEvent(window, 'resize')
.pipe(debounceTime(this.SCROLL_REFRESH_INTERVAL))
.subscribe(() => {
this.updatePosition();
});
this.subScriber.add(i18nSubscription);
}
ngAfterViewInit() {
this.updatePosition();
if (!this.scrollElement) {
const currentScrollElement = this.positionService.getScrollParent(this.triggerElement);
this.scrollElement = currentScrollElement === this.document.body ? window : currentScrollElement;
}
const scrollSubscriber = fromEvent(this.scrollElement, 'scroll')
.pipe(throttleTime(this.SCROLL_REFRESH_INTERVAL, undefined, { leading: true, trailing: true }))
.subscribe(() => {
this.updatePosition();
});
this.subScriber.add(scrollSubscriber);
}
ngOnDestroy() {
if (this.subScriber) {
this.subScriber.unsubscribe();
}
}
updatePosition() {
const resPosition = this.position === 'right' ? 'right-top' : this.position;
const calcPosition = this.position === 'left' ? 'left-top' : resPosition;
const rect = this.positionService.positionElements(this.triggerElement, this.elm.nativeElement, calcPosition, true);
const targetRect = this.triggerElement.getBoundingClientRect();
let left = rect.left;
let top = rect.top;
switch (rect.placementPrimary) {
case 'top':
left = targetRect.left + this.triggerElement.clientWidth / 2 - this.elm.nativeElement.clientWidth / 2;
top = top + this.triggerElement.clientHeight / 2 - this.DOT_HORIZONTAL_MARGIN;
break;
case 'bottom':
left = targetRect.left + this.triggerElement.clientWidth / 2 - this.elm.nativeElement.clientWidth / 2;
top = top + this.DOT_HORIZONTAL_MARGIN / 2;
break;
case 'left':
left = left + this.triggerElement.clientWidth / 2 - this.DOT_HORIZONTAL_MARGIN;
top = top + this.triggerElement.clientHeight / 2 - this.DOT_VERTICAL_MARGIN;
break;
case 'right':
left = left - this.triggerElement.clientWidth / 2 + this.DOT_HORIZONTAL_MARGIN;
top = top + this.triggerElement.clientHeight / 2 - this.DOT_VERTICAL_MARGIN;
break;
default:
}
switch (rect.placementSecondary) {
case 'left':
left = targetRect.left;
break;
case 'right':
left = targetRect.left - this.elm.nativeElement.clientWidth + this.triggerElement.clientWidth;
break;
default:
}
this.renderer.setStyle(this.elm.nativeElement, 'left', `${left}px`);
this.renderer.setStyle(this.elm.nativeElement, 'top', `${top}px`);
if (this.leftFix) {
this.renderer.setStyle(this.elm.nativeElement, 'marginLeft', `${this.leftFix}px`);
}
if (this.topFix) {
this.renderer.setStyle(this.elm.nativeElement, 'marginTop', `${this.topFix}px`);
}
}
next() {
const newStep = (this.stepIndex + 1 < this.stepsCount && this.stepIndex + 1) || this.stepsCount - 1;
this.stepService.setCurrentIndex(newStep);
this.close(newStep, 'next');
}
prev() {
const newStep = (this.stepIndex - 1 > 0 && this.stepIndex - 1) || 0;
this.stepService.setCurrentIndex(newStep);
this.close(newStep, 'prev');
}
closeAll() {
try {
localStorage.setItem(`devui_guide_${this.pageName}`, '0');
}
catch (error) {
console.error(error);
}
this.close(this.stepService.getCurrentStep(), 'close');
}
close(step, type) { }
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StepsGuideComponent, deps: [{ token: i1.StepsGuideService }, { token: i0.Renderer2 }, { token: i2.PositionService }, { token: i0.ElementRef }, { token: i3.I18nService }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: StepsGuideComponent, selector: "ng-component", host: { properties: { "class": "this.class", "style.display": "this.display" } }, ngImport: i0, template: "<div class=\"devui-shining-dot\"></div>\n<div class=\"devui-shining-plus\"></div>\n<div class=\"devui-arrow\"></div>\n<div class=\"devui-guide-container\">\n <p class=\"devui-title\">{{ title }}</p>\n <div class=\"icon icon-close\" (click)=\"closeAll()\"></div>\n <ng-template [ngTemplateOutlet]=\"content | dIsTemplatePipe : plainText\"></ng-template>\n <ng-template #plainText>\n <div class=\"devui-content\" [innerHTML]=\"content | safe : 'html'\"></div>\n </ng-template>\n <div class=\"devui-ctrl\">\n <div *ngIf=\"dots.length > 1 && !extraConfig?.hideStepNav\" class=\"devui-dots\">\n <em *ngFor=\"let dot of dots; index as i\" class=\"icon icon-dot-status {{ i === stepIndex ? 'devui-active' : '' }}\"></em>\n </div>\n <div class=\"devui-guide-btn\">\n <div *ngIf=\"stepIndex > 0 && !extraConfig?.hidePreStep\" class=\"devui-prev-step\" (click)=\"prev()\">{{ i18nCommonText.previous }}</div>\n <div *ngIf=\"stepIndex + 1 < stepsCount\" (click)=\"next()\">{{ i18nCommonText.next }}</div>\n <div *ngIf=\"stepIndex === stepsCount - 1\" (click)=\"closeAll()\">{{ i18nCommonText.finish }}</div>\n </div>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";.devui-font-size-base{font-size:var(--devui-font-size, 12px)}.devui-font-base{font-size:var(--devui-font-size, 12px);font-weight:var(--devui-font-content-weight, normal);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-modal-title{font-size:var(--devui-font-size-modal-title, 18px)}.devui-font-modal-title{font-size:var(--devui-font-size-modal-title, 18px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-page-title{font-size:var(--devui-font-size-page-title, 16px)}.devui-font-page-title{font-size:var(--devui-font-size-page-title, 16px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-secondary-title{font-size:var(--devui-font-size-card-title, 14px)}.devui-font-secondary-title{font-size:var(--devui-font-size-card-title, 14px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}:host.devui-step-item{width:400px;min-height:160px;background:var(--devui-brand, #0a59f7);box-shadow:var(--devui-shadow-length-feedback-overlay, 0 8px 24px 0) var(--devui-light-shadow, rgba(0, 0, 0, .08));border-radius:var(--devui-border-radius-feedback, 4px);font-size:var(--devui-font-size, 12px);color:var(--devui-light-text, #ffffff);padding:20px;position:absolute}:host.devui-step-item .devui-title{font-size:var(--devui-font-size-page-title, 16px);opacity:1;margin:0 0 20px;padding:0}:host.devui-step-item>.devui-arrow,:host.devui-step-item>.devui-arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}:host.devui-step-item>.devui-arrow{border-width:8px}:host.devui-step-item.left>.devui-arrow{top:23px;right:-6px;margin-top:-3px;border-right-width:0;transform:rotate(-135deg);border-left-color:var(--devui-brand, #0a59f7)}:host.devui-step-item.top>.devui-arrow,:host.devui-step-item.top-left>.devui-arrow,:host.devui-step-item.top-right>.devui-arrow{bottom:-6px;border-bottom-width:0;border-top-color:var(--devui-brand, #0a59f7);transform:rotate(135deg)}:host.devui-step-item.top>.devui-arrow{left:calc(50% - 4px)}:host.devui-step-item.top-left>.devui-arrow{left:23px}:host.devui-step-item.top-right>.devui-arrow{right:23px;transform:rotate(-135deg)}:host.devui-step-item.right>.devui-arrow{top:23px;left:-6px;margin-top:-3px;border-left-width:0;transform:rotate(135deg);border-right-color:var(--devui-brand, #0a59f7)}:host.devui-step-item.bottom>.devui-arrow,:host.devui-step-item.bottom-left>.devui-arrow,:host.devui-step-item.bottom-right>.devui-arrow{top:-6px;margin-left:3px;border-top-width:0;border-bottom-color:var(--devui-brand, #0a59f7)}:host.devui-step-item.bottom>.devui-arrow{left:calc(50% - 4px);transform:rotate(-135deg)}:host.devui-step-item.bottom-right>.devui-arrow{right:23px;transform:rotate(135deg)}:host.devui-step-item.bottom-left>.devui-arrow{left:23px;transform:rotate(-135deg)}:host.devui-step-item>.devui-shining-dot,:host.devui-step-item .devui-shining-plus{position:absolute;background:var(--devui-brand, #0a59f7);width:6px;height:6px;border-radius:var(--devui-border-radius-feedback, 4px)}:host.devui-step-item.left>.devui-shining-dot,:host.devui-step-item.left>.devui-shining-plus{top:21px;right:-30px}:host.devui-step-item.right>.devui-shining-dot,:host.devui-step-item.right>.devui-shining-plus{top:21px;left:-30px}:host.devui-step-item.top>.devui-shining-dot,:host.devui-step-item.top>.devui-shining-plus{left:calc(50% - 3px);bottom:-30px}:host.devui-step-item.top-left>.devui-shining-dot,:host.devui-step-item.top-left>.devui-shining-plus{left:21px;bottom:-30px}:host.devui-step-item.top-right>.devui-shining-dot,:host.devui-step-item.top-right>.devui-shining-plus{right:21px;bottom:-30px}:host.devui-step-item.bottom>.devui-shining-dot,:host.devui-step-item.bottom>.devui-shining-plus{left:calc(50% - 3px);top:-30px}:host.devui-step-item.bottom-right>.devui-shining-dot,:host.devui-step-item.bottom-right>.devui-shining-plus{top:-30px;right:21px}:host.devui-step-item.bottom-left>.devui-shining-dot,:host.devui-step-item.bottom-left>.devui-shining-plus{top:-30px;left:21px}:host.devui-step-item .devui-shining-plus{animation:devui-glow 2s 0s infinite}:host.devui-step-item .devui-guide-container{position:relative}:host.devui-step-item .devui-guide-container>.icon-close{position:absolute;top:0;right:0;cursor:pointer}:host.devui-step-item .devui-guide-container .devui-ctrl{display:flex;flex-wrap:wrap}:host.devui-step-item .devui-guide-container .devui-ctrl .devui-dots{color:var(--devui-light-text, #ffffff);position:relative;top:25px;font-size:var(--devui-font-size, 12px);height:30px}:host.devui-step-item .devui-guide-container .devui-ctrl .devui-dots>em{opacity:.2;margin:0 5px 0 2px}:host.devui-step-item .devui-guide-container .devui-ctrl .devui-dots>em.devui-active{opacity:1}:host.devui-step-item .devui-guide-container .devui-ctrl .devui-guide-btn{display:flex;flex-flow:row nowrap;flex-grow:1;justify-content:flex-end;padding:20px 0 0;white-space:nowrap}:host.devui-step-item .devui-guide-container .devui-ctrl .devui-guide-btn>div{color:var(--devui-light-text, #ffffff);background:#ffffff1a;border-radius:var(--devui-border-radius, 2px);padding:5px 15px;cursor:pointer;margin-left:10px}:host.devui-step-item .devui-guide-container .devui-ctrl .devui-guide-btn>div.devui-prev-step{background:none;border:solid 1px rgba(255,255,255,.1)}@keyframes devui-glow{0%{transform:scale(1);opacity:.5}25%{transform:scale(2);opacity:.3}50%{transform:scale(3);opacity:.1}75%{transform:scale(2);opacity:.3}to{transform:scale(1);opacity:.5}}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i5.IsTemplatePipe, name: "dIsTemplatePipe" }, { kind: "pipe", type: i5.SafePipe, name: "safe" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StepsGuideComponent, decorators: [{
type: Component,
args: [{ preserveWhitespaces: false, template: "<div class=\"devui-shining-dot\"></div>\n<div class=\"devui-shining-plus\"></div>\n<div class=\"devui-arrow\"></div>\n<div class=\"devui-guide-container\">\n <p class=\"devui-title\">{{ title }}</p>\n <div class=\"icon icon-close\" (click)=\"closeAll()\"></div>\n <ng-template [ngTemplateOutlet]=\"content | dIsTemplatePipe : plainText\"></ng-template>\n <ng-template #plainText>\n <div class=\"devui-content\" [innerHTML]=\"content | safe : 'html'\"></div>\n </ng-template>\n <div class=\"devui-ctrl\">\n <div *ngIf=\"dots.length > 1 && !extraConfig?.hideStepNav\" class=\"devui-dots\">\n <em *ngFor=\"let dot of dots; index as i\" class=\"icon icon-dot-status {{ i === stepIndex ? 'devui-active' : '' }}\"></em>\n </div>\n <div class=\"devui-guide-btn\">\n <div *ngIf=\"stepIndex > 0 && !extraConfig?.hidePreStep\" class=\"devui-prev-step\" (click)=\"prev()\">{{ i18nCommonText.previous }}</div>\n <div *ngIf=\"stepIndex + 1 < stepsCount\" (click)=\"next()\">{{ i18nCommonText.next }}</div>\n <div *ngIf=\"stepIndex === stepsCount - 1\" (click)=\"closeAll()\">{{ i18nCommonText.finish }}</div>\n </div>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";.devui-font-size-base{font-size:var(--devui-font-size, 12px)}.devui-font-base{font-size:var(--devui-font-size, 12px);font-weight:var(--devui-font-content-weight, normal);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-modal-title{font-size:var(--devui-font-size-modal-title, 18px)}.devui-font-modal-title{font-size:var(--devui-font-size-modal-title, 18px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-page-title{font-size:var(--devui-font-size-page-title, 16px)}.devui-font-page-title{font-size:var(--devui-font-size-page-title, 16px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-secondary-title{font-size:var(--devui-font-size-card-title, 14px)}.devui-font-secondary-title{font-size:var(--devui-font-size-card-title, 14px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}:host.devui-step-item{width:400px;min-height:160px;background:var(--devui-brand, #0a59f7);box-shadow:var(--devui-shadow-length-feedback-overlay, 0 8px 24px 0) var(--devui-light-shadow, rgba(0, 0, 0, .08));border-radius:var(--devui-border-radius-feedback, 4px);font-size:var(--devui-font-size, 12px);color:var(--devui-light-text, #ffffff);padding:20px;position:absolute}:host.devui-step-item .devui-title{font-size:var(--devui-font-size-page-title, 16px);opacity:1;margin:0 0 20px;padding:0}:host.devui-step-item>.devui-arrow,:host.devui-step-item>.devui-arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}:host.devui-step-item>.devui-arrow{border-width:8px}:host.devui-step-item.left>.devui-arrow{top:23px;right:-6px;margin-top:-3px;border-right-width:0;transform:rotate(-135deg);border-left-color:var(--devui-brand, #0a59f7)}:host.devui-step-item.top>.devui-arrow,:host.devui-step-item.top-left>.devui-arrow,:host.devui-step-item.top-right>.devui-arrow{bottom:-6px;border-bottom-width:0;border-top-color:var(--devui-brand, #0a59f7);transform:rotate(135deg)}:host.devui-step-item.top>.devui-arrow{left:calc(50% - 4px)}:host.devui-step-item.top-left>.devui-arrow{left:23px}:host.devui-step-item.top-right>.devui-arrow{right:23px;transform:rotate(-135deg)}:host.devui-step-item.right>.devui-arrow{top:23px;left:-6px;margin-top:-3px;border-left-width:0;transform:rotate(135deg);border-right-color:var(--devui-brand, #0a59f7)}:host.devui-step-item.bottom>.devui-arrow,:host.devui-step-item.bottom-left>.devui-arrow,:host.devui-step-item.bottom-right>.devui-arrow{top:-6px;margin-left:3px;border-top-width:0;border-bottom-color:var(--devui-brand, #0a59f7)}:host.devui-step-item.bottom>.devui-arrow{left:calc(50% - 4px);transform:rotate(-135deg)}:host.devui-step-item.bottom-right>.devui-arrow{right:23px;transform:rotate(135deg)}:host.devui-step-item.bottom-left>.devui-arrow{left:23px;transform:rotate(-135deg)}:host.devui-step-item>.devui-shining-dot,:host.devui-step-item .devui-shining-plus{position:absolute;background:var(--devui-brand, #0a59f7);width:6px;height:6px;border-radius:var(--devui-border-radius-feedback, 4px)}:host.devui-step-item.left>.devui-shining-dot,:host.devui-step-item.left>.devui-shining-plus{top:21px;right:-30px}:host.devui-step-item.right>.devui-shining-dot,:host.devui-step-item.right>.devui-shining-plus{top:21px;left:-30px}:host.devui-step-item.top>.devui-shining-dot,:host.devui-step-item.top>.devui-shining-plus{left:calc(50% - 3px);bottom:-30px}:host.devui-step-item.top-left>.devui-shining-dot,:host.devui-step-item.top-left>.devui-shining-plus{left:21px;bottom:-30px}:host.devui-step-item.top-right>.devui-shining-dot,:host.devui-step-item.top-right>.devui-shining-plus{right:21px;bottom:-30px}:host.devui-step-item.bottom>.devui-shining-dot,:host.devui-step-item.bottom>.devui-shining-plus{left:calc(50% - 3px);top:-30px}:host.devui-step-item.bottom-right>.devui-shining-dot,:host.devui-step-item.bottom-right>.devui-shining-plus{top:-30px;right:21px}:host.devui-step-item.bottom-left>.devui-shining-dot,:host.devui-step-item.bottom-left>.devui-shining-plus{top:-30px;left:21px}:host.devui-step-item .devui-shining-plus{animation:devui-glow 2s 0s infinite}:host.devui-step-item .devui-guide-container{position:relative}:host.devui-step-item .devui-guide-container>.icon-close{position:absolute;top:0;right:0;cursor:pointer}:host.devui-step-item .devui-guide-container .devui-ctrl{display:flex;flex-wrap:wrap}:host.devui-step-item .devui-guide-container .devui-ctrl .devui-dots{color:var(--devui-light-text, #ffffff);position:relative;top:25px;font-size:var(--devui-font-size, 12px);height:30px}:host.devui-step-item .devui-guide-container .devui-ctrl .devui-dots>em{opacity:.2;margin:0 5px 0 2px}:host.devui-step-item .devui-guide-container .devui-ctrl .devui-dots>em.devui-active{opacity:1}:host.devui-step-item .devui-guide-container .devui-ctrl .devui-guide-btn{display:flex;flex-flow:row nowrap;flex-grow:1;justify-content:flex-end;padding:20px 0 0;white-space:nowrap}:host.devui-step-item .devui-guide-container .devui-ctrl .devui-guide-btn>div{color:var(--devui-light-text, #ffffff);background:#ffffff1a;border-radius:var(--devui-border-radius, 2px);padding:5px 15px;cursor:pointer;margin-left:10px}:host.devui-step-item .devui-guide-container .devui-ctrl .devui-guide-btn>div.devui-prev-step{background:none;border:solid 1px rgba(255,255,255,.1)}@keyframes devui-glow{0%{transform:scale(1);opacity:.5}25%{transform:scale(2);opacity:.3}50%{transform:scale(3);opacity:.1}75%{transform:scale(2);opacity:.3}to{transform:scale(1);opacity:.5}}\n"] }]
}], ctorParameters: () => [{ type: i1.StepsGuideService }, { type: i0.Renderer2 }, { type: i2.PositionService }, { type: i0.ElementRef }, { type: i3.I18nService }, { type: undefined, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }], propDecorators: { class: [{
type: HostBinding,
args: ['class']
}], display: [{
type: HostBinding,
args: ['style.display']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcHMtZ3VpZGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vZGV2dWkvc3RlcHMtZ3VpZGUvc3RlcHMtZ3VpZGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vZGV2dWkvc3RlcHMtZ3VpZGUvc3RlcHMtZ3VpZGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBaUIsU0FBUyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFxQixTQUFTLEVBQWUsTUFBTSxlQUFlLENBQUM7QUFDckksT0FBTyxFQUFpQixXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3BELE9BQU8sRUFBZ0IsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7Ozs7QUFRMUQsTUFBTSxPQUFPLG1CQUFtQjtJQUM5QixJQUNJLEtBQUs7UUFDUCxPQUFPLGtCQUFrQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDNUMsQ0FBQztJQUNELElBQ0ksT0FBTztRQUNULE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFxQkQsWUFDVSxXQUE4QixFQUM5QixRQUFtQixFQUNuQixlQUFnQyxFQUNoQyxHQUFlLEVBQ2YsSUFBaUIsRUFDQyxHQUFRO1FBTDFCLGdCQUFXLEdBQVgsV0FBVyxDQUFtQjtRQUM5QixhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ25CLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQyxRQUFHLEdBQUgsR0FBRyxDQUFZO1FBQ2YsU0FBSSxHQUFKLElB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QUM7SUFDekQsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSyxJQUFHLENBQUM7K0dBbEpWLG1CQUFtQixnS0FtQ3BCLFFBQVE7bUdBbkNQLG1CQUFtQixzSUNkaEMsK29DQXFCQTs7NEZEUGEsbUJBQW1CO2tCQUwvQixTQUFTOzBDQUdhLEtBQUs7OzBCQXFDdkIsTUFBTTsyQkFBQyxRQUFRO3lDQWpDZCxLQUFLO3NCQURSLFdBQVc7dUJBQUMsT0FBTztnQkFLaEIsT0FBTztzQkFEVixXQUFXO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgSG9zdEJpbmRpbmcsIEluamVjdCwgT25EZXN0cm95LCBPbkluaXQsIFJlbmRlcmVyMiwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgSTE4bkludGVyZmFjZSwgSTE4blNlcnZpY2UgfSBmcm9tICduZy1kZXZ1aS9pMThuJztcclxuaW1wb3J0IHsgUG9zaXRpb25TZXJ2aWNlIH0gZnJvbSAnbmctZGV2dWkvcG9zaXRpb24nO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24sIGZyb21FdmVudCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIHRocm90dGxlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgU3RlcHNHdWlkZVNlcnZpY2UgfSBmcm9tICcuL3N0ZXBzLWd1aWRlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFeHRyYUNvbmZpZyB9IGZyb20gJy4vc3RlcHMtZ3VpZGUudHlwZXMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgdGVtcGxhdGVVcmw6ICcuL3N0ZXBzLWd1aWRlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9zdGVwcy1ndWlkZS5jb21wb25lbnQuc2NzcyddLFxyXG4gIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgU3RlcHNHdWlkZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzJylcclxuICBnZXQgY2xhc3MoKSB7XHJcbiAgICByZXR1cm4gJ2RldnVpLXN0ZXAtaXRlbSAnICsgdGhpcy5wb3NpdGlvbjtcclxuICB9XHJcbiAgQEhvc3RCaW5kaW5nKCdzdHlsZS5kaXNwbGF5JylcclxuICBnZXQgZGlzcGxheSgpIHtcclxuICAgIHJldHVybiAnYmxvY2snO1xyXG4gIH1cclxuICB0cmlnZ2VyRWxlbWVudDogSFRNTEVsZW1lbnQ7XHJcbiAgc2Nyb2xsRWxlbWVudDogSFRNTEVsZW1lbnQ7XHJcbiAgcGFnZU5hbWU6IHN0cmluZzsgLy8g6aG16Z2i5ZCN56ew77yM55So5LqO5qCH6K6w5b2T6aG15biu5Yqp5L+h5oGv5piv5ZCm5YWz6ZetXHJcbiAgdGl0bGU6IHN0cmluZzsgLy8g5byV5a+85qCH6aKYXHJcbiAgY29udGVudDogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55PjsgLy8g5byV5a+85LuL57uN5YaF5a65XHJcbiAgc3RlcHNDb3VudDogbnVtYmVyOyAvLyDmgLvmraXpqqTmlbBcclxuICBzdGVwSW5kZXg6IG51bWJlcjsgLy8g6K+l5q2l6aqk5bqP5Y+3XHJcbiAgcG9zaXRpb24gPSAndG9wJztcclxuICBsZWZ0Rml4OiBudW1iZXI7XHJcbiAgdG9wRml4OiBudW1iZXI7XHJcbiAgekluZGV4ID0gMTEwMDtcclxuICBleHRyYUNvbmZpZzogRXh0cmFDb25maWc7XHJcbiAgZG90czogQXJyYXk8dW5kZWZpbmVkPiA9IFtdO1xyXG4gIHN1YlNjcmliZXI6IFN1YnNjcmlwdGlvbjtcclxuICBTQ1JPTExfUkVGUkVTSF9JTlRFUlZBTCA9IDEwMDtcclxuICBpMThuQ29tbW9uVGV4dDogSTE4bkludGVyZmFjZVsnc3RlcHNHdWlkZSddO1xyXG4gIERPVF9IT1JJWk9OVEFMX01BUkdJTiA9IDI3O1xyXG4gIERPVF9WRVJUSUNBTF9NQVJHSU4gPSAyMjtcclxuICBkb2N1bWVudDogRG9jdW1lbnQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBzdGVwU2VydmljZTogU3RlcHNHdWlkZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICBwcml2YXRlIHBvc2l0aW9uU2VydmljZTogUG9zaXRpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBlbG06IEVsZW1lbnRSZWYsXHJcbiAgICBwcml2YXRlIGkxOG46IEkxOG5TZXJ2aWNlLFxyXG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2M6IGFueVxyXG4gICkge1xyXG4gICAgdGhpcy5kb2N1bWVudCA9IHRoaXMuZG9jO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmRvdHMgPSBuZXcgQXJyYXkodGhpcy5zdGVwc0NvdW50KTtcclxuICAgIHRoaXMuZWxtLm5hdGl2ZUVsZW1lbnQuc3R5bGUuekluZGV4ID0gdGhpcy56SW5kZXg7XHJcbiAgICB0aGlzLmkxOG5Db21tb25UZXh0ID0gdGhpcy5pMThuLmdldEkxOG5UZXh0KCkuc3RlcHNHdWlkZTtcclxuICAgIGNvbnN0IGkxOG5TdWJzY3JpcHRpb24gPSB0aGlzLmkxOG4ubGFuZ0NoYW5nZSgpLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xyXG4gICAgICB0aGlzLmkxOG5Db21tb25UZXh0ID0gZGF0YS5zdGVwc0d1aWRlO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5zdWJTY3JpYmVyID0gZnJvbUV2ZW50KHdpbmRvdywgJ3Jlc2l6ZScpXHJcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZSh0aGlzLlNDUk9MTF9SRUZSRVNIX0lOVEVSVkFMKSlcclxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVQb3NpdGlvbigpO1xyXG4gICAgICB9KTtcclxuICAgIHRoaXMuc3ViU2NyaWJlci5hZGQoaTE4blN1YnNjcmlwdGlvbik7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICB0aGlzLnVwZGF0ZVBvc2l0aW9uKCk7XHJcbiAgICBpZiAoIXRoaXMuc2Nyb2xsRWxlbWVudCkge1xyXG4gICAgICBjb25zdCBjdXJyZW50U2Nyb2xsRWxlbWVudCA9IHRoaXMucG9zaXRpb25TZXJ2aWNlLmdldFNjcm9sbFBhcmVudCh0aGlzLnRyaWdnZXJFbGVtZW50KTtcclxuICAgICAgdGhpcy5zY3JvbGxFbGVtZW50ID0gY3VycmVudFNjcm9sbEVsZW1lbnQgPT09IHRoaXMuZG9jdW1lbnQuYm9keSA/IHdpbmRvdyA6IGN1cnJlbnRTY3JvbGxFbGVtZW50O1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc2Nyb2xsU3Vic2NyaWJlciA9IGZyb21FdmVudCh0aGlzLnNjcm9sbEVsZW1lbnQsICdzY3JvbGwnKVxyXG4gICAgICAucGlwZSh0aHJvdHRsZVRpbWUodGhpcy5TQ1JPTExfUkVGUkVTSF9JTlRFUlZBTCwgdW5kZWZpbmVkLCB7IGxlYWRpbmc6IHRydWUsIHRyYWlsaW5nOiB0cnVlIH0pKVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVBvc2l0aW9uKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgdGhpcy5zdWJTY3JpYmVyLmFkZChzY3JvbGxTdWJzY3JpYmVyKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgaWYgKHRoaXMuc3ViU2NyaWJlcikge1xyXG4gICAgICB0aGlzLnN1YlNjcmliZXIudW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVwZGF0ZVBvc2l0aW9uKCkge1xyXG4gICAgY29uc3QgcmVzUG9zaXRpb24gPSB0aGlzLnBvc2l0aW9uID09PSAncmlnaHQnID8gJ3JpZ2h0LXRvcCcgOiB0aGlzLnBvc2l0aW9uO1xyXG4gICAgY29uc3QgY2FsY1Bvc2l0aW9uID0gdGhpcy5wb3NpdGlvbiA9PT0gJ2xlZnQnID8gJ2xlZnQtdG9wJyA6IHJlc1Bvc2l0aW9uO1xyXG4gICAgY29uc3QgcmVjdCA9IHRoaXMucG9zaXRpb25TZXJ2aWNlLnBvc2l0aW9uRWxlbWVudHModGhpcy50cmlnZ2VyRWxlbWVudCwgdGhpcy5lbG0ubmF0aXZlRWxlbWVudCwgY2FsY1Bvc2l0aW9uLCB0cnVlKTtcclxuICAgIGNvbnN0IHRhcmdldFJlY3QgPSB0aGlzLnRyaWdnZXJFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgbGV0IGxlZnQgPSByZWN0LmxlZnQ7XHJcbiAgICBsZXQgdG9wID0gcmVjdC50b3A7XHJcblxyXG4gICAgc3dpdGNoIChyZWN0LnBsYWNlbWVudFByaW1hcnkpIHtcclxuICAgIGNhc2UgJ3RvcCc6XHJcbiAgICAgIGxlZnQgPSB0YXJnZXRSZWN0LmxlZnQgKyB0aGlzLnRyaWdnZXJFbGVtZW50LmNsaWVudFdpZHRoIC8gMiAtIHRoaXMuZWxtLm5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGggLyAyO1xyXG4gICAgICB0b3AgPSB0b3AgKyB0aGlzLnRyaWdnZXJFbGVtZW50LmNsaWVudEhlaWdodCAvIDIgLSB0aGlzLkRPVF9IT1JJWk9OVEFMX01BUkdJTjtcclxuICAgICAgYnJlYWs7XHJcbiAgICBjYXNlICdib3R0b20nOlxyXG4gICAgICBsZWZ0ID0gdGFyZ2V0UmVjdC5sZWZ0ICsgdGhpcy50cmlnZ2VyRWxlbWVudC5jbGllbnRXaWR0aCAvIDIgLSB0aGlzLmVsbS5uYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoIC8gMjtcclxuICAgICAgdG9wID0gdG9wICsgdGhpcy5ET1RfSE9SSVpPTlRBTF9NQVJHSU4gLyAyO1xyXG4gICAgICBicmVhaztcclxuICAgIGNhc2UgJ2xlZnQnOlxyXG4gICAgICBsZWZ0ID0gbGVmdCArIHRoaXMudHJpZ2dlckVsZW1lbnQuY2xpZW50V2lkdGggLyAyIC0gdGhpcy5ET1RfSE9SSVpPTlRBTF9NQVJHSU47XHJcbiAgICAgIHRvcCA9IHRvcCArIHRoaXMudHJpZ2dlckVsZW1lbnQuY2xpZW50SGVpZ2h0IC8gMiAtIHRoaXMuRE9UX1ZFUlRJQ0FMX01BUkdJTjtcclxuICAgICAgYnJlYWs7XHJcbiAgICBjYXNlICdyaWdodCc6XHJcbiAgICAgIGxlZnQgPSBsZWZ0IC0gdGhpcy50cmlnZ2VyRWxlbWVudC5jbGllbnRXaWR0aCAvIDIgKyB0aGlzLkRPVF9IT1JJWk9OVEFMX01BUkdJTjtcclxuICAgICAgdG9wID0gdG9wICsgdGhpcy50cmlnZ2VyRWxlbWVudC5jbGllbnRIZWlnaHQgLyAyIC0gdGhpcy5ET1RfVkVSVElDQUxfTUFSR0lOO1xyXG4gICAgICBicmVhaztcclxuICAgIGRlZmF1bHQ6XHJcbiAgICB9XHJcblxyXG4gICAgc3dpdGNoIChyZWN0LnBsYWNlbWVudFNlY29uZGFyeSkge1xyXG4gICAgY2FzZSAnbGVmdCc6XHJcbiAgICAgIGxlZnQgPSB0YXJnZXRSZWN0LmxlZnQ7XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgY2FzZSAncmlnaHQnOlxyXG4gICAgICBsZWZ0ID0gdGFyZ2V0UmVjdC5sZWZ0IC0gdGhpcy5lbG0ubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aCArIHRoaXMudHJpZ2dlckVsZW1lbnQuY2xpZW50V2lkdGg7XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgZGVmYXVsdDpcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWxtLm5hdGl2ZUVsZW1lbnQsICdsZWZ0JywgYCR7bGVmdH1weGApO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsbS5uYXRpdmVFbGVtZW50LCAndG9wJywgYCR7dG9wfXB4YCk7XHJcblxyXG4gICAgaWYgKHRoaXMubGVmdEZpeCkge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWxtLm5hdGl2ZUVsZW1lbnQsICdtYXJnaW5MZWZ0JywgYCR7dGhpcy5sZWZ0Rml4fXB4YCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy50b3BGaXgpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmVsbS5uYXRpdmVFbGVtZW50LCAnbWFyZ2luVG9wJywgYCR7dGhpcy50b3BGaXh9cHhgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5leHQoKSB7XHJcbiAgICBjb25zdCBuZXdTdGVwID0gKHRoaXMuc3RlcEluZGV4ICsgMSA8IHRoaXMuc3RlcHNDb3VudCAmJiB0aGlzLnN0ZXBJbmRleCArIDEpIHx8IHRoaXMuc3RlcHNDb3VudCAtIDE7XHJcbiAgICB0aGlzLnN0ZXBTZXJ2aWNlLnNldEN1cnJlbnRJbmRleChuZXdTdGVwKTtcclxuICAgIHRoaXMuY2xvc2UobmV3U3RlcCwgJ25leHQnKTtcclxuICB9XHJcblxyXG4gIHByZXYoKSB7XHJcbiAgICBjb25zdCBuZXdTdGVwID0gKHRoaXMuc3RlcEluZGV4IC0gMSA+IDAgJiYgdGhpcy5zdGVwSW5kZXggLSAxKSB8fCAwO1xyXG4gICAgdGhpcy5zdGVwU2VydmljZS5zZXRDdXJyZW50SW5kZXgobmV3U3RlcCk7XHJcbiAgICB0aGlzLmNsb3NlKG5ld1N0ZXAsICdwcmV2Jyk7XHJcbiAgfVxyXG5cclxuICBjbG9zZUFsbCgpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGBkZXZ1aV9ndWlkZV8ke3RoaXMucGFnZU5hbWV9YCwgJzAnKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jbG9zZSh0aGlzLnN0ZXBTZXJ2aWNlLmdldEN1cnJlbnRTdGVwKCksICdjbG9zZScpO1xyXG4gIH1cclxuXHJcbiAgY2xvc2Uoc3RlcCwgdHlwZT8pIHt9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImRldnVpLXNoaW5pbmctZG90XCI+PC9kaXY+XG48ZGl2IGNsYXNzPVwiZGV2dWktc2hpbmluZy1wbHVzXCI+PC9kaXY+XG48ZGl2IGNsYXNzPVwiZGV2dWktYXJyb3dcIj48L2Rpdj5cbjxkaXYgY2xhc3M9XCJkZXZ1aS1ndWlkZS1jb250YWluZXJcIj5cbiAgPHAgY2xhc3M9XCJkZXZ1aS10aXRsZVwiPnt7IHRpdGxlIH19PC9wPlxuICA8ZGl2IGNsYXNzPVwiaWNvbiBpY29uLWNsb3NlXCIgKGNsaWNrKT1cImNsb3NlQWxsKClcIj48L2Rpdj5cbiAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNvbnRlbnQgfCBkSXNUZW1wbGF0ZVBpcGUgOiBwbGFpblRleHRcIj48L25nLXRlbXBsYXRlPlxuICA8bmctdGVtcGxhdGUgI3BsYWluVGV4dD5cbiAgICA8ZGl2IGNsYXNzPVwiZGV2dWktY29udGVudFwiIFtpbm5lckhUTUxdPVwiY29udGVudCB8IHNhZmUgOiAnaHRtbCdcIj48L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cbiAgPGRpdiBjbGFzcz1cImRldnVpLWN0cmxcIj5cbiAgICA8ZGl2ICpuZ0lmPVwiZG90cy5sZW5ndGggPiAxICYmICFleHRyYUNvbmZpZz8uaGlkZVN0ZXBOYXZcIiBjbGFzcz1cImRldnVpLWRvdHNcIj5cbiAgICAgIDxlbSAqbmdGb3I9XCJsZXQgZG90IG9mIGRvdHM7IGluZGV4IGFzIGlcIiBjbGFzcz1cImljb24gaWNvbi1kb3Qtc3RhdHVzIHt7IGkgPT09IHN0ZXBJbmRleCA/ICdkZXZ1aS1hY3RpdmUnIDogJycgfX1cIj48L2VtPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJkZXZ1aS1ndWlkZS1idG5cIj5cbiAgICAgIDxkaXYgKm5nSWY9XCJzdGVwSW5kZXggPiAwICYmICFleHRyYUNvbmZpZz8uaGlkZVByZVN0ZXBcIiBjbGFzcz1cImRldnVpLXByZXYtc3RlcFwiIChjbGljayk9XCJwcmV2KClcIj57eyBpMThuQ29tbW9uVGV4dC5wcmV2aW91cyB9fTwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cInN0ZXBJbmRleCArIDEgPCBzdGVwc0NvdW50XCIgKGNsaWNrKT1cIm5leHQoKVwiPnt7IGkxOG5Db21tb25UZXh0Lm5leHQgfX08L2Rpdj5cbiAgICAgIDxkaXYgKm5nSWY9XCJzdGVwSW5kZXggPT09IHN0ZXBzQ291bnQgLSAxXCIgKGNsaWNrKT1cImNsb3NlQWxsKClcIj57eyBpMThuQ29tbW9uVGV4dC5maW5pc2ggfX08L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==