ngy-tutorial
Version:
269 lines (268 loc) • 28.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ViewChild, ElementRef, Inject } from '@angular/core';
import { trigger, transition, animate, keyframes, style, query } from '@angular/animations';
import { PromptComponent } from '../prompt/prompt.component';
import { DOCUMENT } from '@angular/common';
import { NgyTutorialService } from '../ngy-tutorial.service';
export class NgyTutorialComponent {
/**
* @param {?} svc
* @param {?} document
*/
constructor(svc, document) {
this.svc = svc;
this.document = document;
this.enabled = false;
this.steps = [];
this.currentStep = 0;
this.svc.toShow.subscribe(stps => {
this.steps = stps;
this.currentStep = 0;
if (this.steps.length) {
this.enabled = true;
setTimeout(() => {
this.setupUIForStep();
});
}
else {
this.enabled = false;
}
});
this.svc.currentStep.subscribe(step => {
this.currentStep = step;
if (this.currentStep >= this.steps.length || this.currentStep < 0) {
this.svc.hideTutorial();
}
if (this.enabled) {
setTimeout(() => {
this.setupUIForStep();
});
}
});
}
/**
* @return {?}
*/
ngOnInit() {
}
/**
* @private
* @return {?}
*/
setupUIForStep() {
/** @type {?} */
const step = this.steps[this.currentStep];
if (step) {
this.resetCovers();
this.prompt.ngOnInit();
if (!step.options.relatedElement) {
this.coverAll();
}
else {
/** @type {?} */
const elem = this.document.body.querySelector(`#${step.options.relatedElement}`);
if (elem) {
this.coverShowElement(elem);
this.prompt.setPromptForElement(elem, step.options.placement);
if (step.options.disableInteraction) {
this.coverElement(elem);
}
}
else {
this.coverAll();
}
}
}
}
/**
* @private
* @param {?} element
* @return {?}
*/
coverElement(element) {
/** @type {?} */
const positionInfo = element.getBoundingClientRect();
/** @type {?} */
const margin = 10;
this.setPosition(this.elementCover.nativeElement, positionInfo.left - margin, positionInfo.top - margin, positionInfo.width + 2 * margin, positionInfo.height + 2 * margin);
}
/**
* @private
* @return {?}
*/
coverAll() {
if (this.topCover) {
this.topCover.nativeElement.style.left = '0';
this.topCover.nativeElement.style.top = '0';
this.topCover.nativeElement.style.height = '100vh';
this.prompt.setPromptForElement();
}
}
/**
* @private
* @param {?} element
* @return {?}
*/
coverShowElement(element) {
/** @type {?} */
const positionInfo = element.getBoundingClientRect();
/** @type {?} */
const margin = 10;
/** @type {?} */
const viewW = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
/** @type {?} */
const viewH = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
this.setPosition(this.topCover.nativeElement, 0, 0, viewW, positionInfo.top - margin);
this.setPosition(this.leftCover.nativeElement, 0, positionInfo.top - margin, positionInfo.left - margin, positionInfo.height + 2 * margin);
this.setPosition(this.rightCover.nativeElement, positionInfo.left + positionInfo.width + margin, positionInfo.top - margin, viewW - positionInfo.left - positionInfo.width - margin, positionInfo.height + 2 * margin);
this.setPosition(this.bottomCover.nativeElement, 0, positionInfo.top + positionInfo.height + margin, viewW, viewH - positionInfo.top - positionInfo.height - margin);
}
/**
* @private
* @param {?} element
* @param {?} left
* @param {?} top
* @param {?} width
* @param {?} height
* @return {?}
*/
setPosition(element, left, top, width, height) {
element.style.left = `${left}px`;
element.style.top = `${top}px`;
element.style.width = `${width}px`;
element.style.height = `${height}px`;
}
/**
* @private
* @return {?}
*/
resetCovers() {
if (this.topCover) {
this.topCover.nativeElement.style.removeProperty('height');
this.topCover.nativeElement.style.removeProperty('width');
this.topCover.nativeElement.style.removeProperty('top');
this.topCover.nativeElement.style.removeProperty('left');
}
if (this.leftCover) {
this.leftCover.nativeElement.style.removeProperty('height');
this.leftCover.nativeElement.style.removeProperty('width');
this.leftCover.nativeElement.style.removeProperty('top');
this.leftCover.nativeElement.style.removeProperty('left');
}
if (this.rightCover) {
this.rightCover.nativeElement.style.removeProperty('height');
this.rightCover.nativeElement.style.removeProperty('width');
this.rightCover.nativeElement.style.removeProperty('top');
this.rightCover.nativeElement.style.removeProperty('left');
}
if (this.bottomCover) {
this.bottomCover.nativeElement.style.removeProperty('height');
this.bottomCover.nativeElement.style.removeProperty('width');
this.bottomCover.nativeElement.style.removeProperty('top');
this.bottomCover.nativeElement.style.removeProperty('left');
}
if (this.elementCover) {
this.elementCover.nativeElement.style.removeProperty('height');
this.elementCover.nativeElement.style.removeProperty('width');
this.elementCover.nativeElement.style.removeProperty('top');
this.elementCover.nativeElement.style.removeProperty('left');
}
}
}
NgyTutorialComponent.decorators = [
{ type: Component, args: [{
selector: 'lib-ngy-tutorial',
template: `<lib-ngy-tutorial-prompt *ngIf="enabled" [step]="steps[currentStep]" [stepNumber]="currentStep" [totalSteps]="steps.length" #prompt></lib-ngy-tutorial-prompt>
<div class="window-cover full-width" #topCover *ngIf="enabled" >
</div>
<div class="window-cover" #leftCover *ngIf="enabled" >
</div>
<div class="window-cover" #rightCover *ngIf="enabled" >
</div>
<div class="window-cover full-width" #bottomCover *ngIf="enabled" >
</div>
<div class="element-cover" #elementCover>
</div>`,
styles: [`:host{position:fixed;left:0;top:0;width:0;height:0}.window-cover{position:fixed;background:rgba(0,0,0,.8);z-index:998}.window-cover.full-width{width:100vw}.element-cover{position:fixed;z-index:998}lib-ngy-tutorial-prompt{top:0;left:0;position:fixed;z-index:999}`],
animations: [
trigger('fadeAnimation', [
transition('void => *', [
query(':self', animate('0.3s ease-in-out', keyframes([
style({ opacity: 0 }),
style({ opacity: 1 }),
])), { optional: true }),
]),
transition('* => void', [
query(':self', animate('0.3s ease-in-out', keyframes([
style({ opacity: 1 }),
style({ opacity: 0 }),
])), { optional: true }),
]),
]),
]
},] },
];
NgyTutorialComponent.ctorParameters = () => [
{ type: NgyTutorialService },
{ type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] }
];
NgyTutorialComponent.propDecorators = {
topCover: [{ type: ViewChild, args: ['topCover',] }],
leftCover: [{ type: ViewChild, args: ['leftCover',] }],
rightCover: [{ type: ViewChild, args: ['rightCover',] }],
bottomCover: [{ type: ViewChild, args: ['bottomCover',] }],
elementCover: [{ type: ViewChild, args: ['elementCover',] }],
prompt: [{ type: ViewChild, args: ['prompt',] }]
};
if (false) {
/** @type {?} */
NgyTutorialComponent.prototype.enabled;
/** @type {?} */
NgyTutorialComponent.prototype.steps;
/** @type {?} */
NgyTutorialComponent.prototype.currentStep;
/**
* @type {?}
* @private
*/
NgyTutorialComponent.prototype.topCover;
/**
* @type {?}
* @private
*/
NgyTutorialComponent.prototype.leftCover;
/**
* @type {?}
* @private
*/
NgyTutorialComponent.prototype.rightCover;
/**
* @type {?}
* @private
*/
NgyTutorialComponent.prototype.bottomCover;
/**
* @type {?}
* @private
*/
NgyTutorialComponent.prototype.elementCover;
/**
* @type {?}
* @private
*/
NgyTutorialComponent.prototype.prompt;
/**
* @type {?}
* @private
*/
NgyTutorialComponent.prototype.svc;
/**
* @type {?}
* @private
*/
NgyTutorialComponent.prototype.document;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHV0b3JpYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd5LXR1dG9yaWFsLyIsInNvdXJjZXMiOlsibGliL3R1dG9yaWFsL3R1dG9yaWFsLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRixPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUU1RixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBb0M3RCxNQUFNOzs7OztJQVdKLFlBQ1UsR0FBdUIsRUFDTCxRQUFhO1FBRC9CLFFBQUcsR0FBSCxHQUFHLENBQW9CO1FBQ0wsYUFBUSxHQUFSLFFBQVEsQ0FBSztRQVh6QyxZQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ2hCLFVBQUssR0FBb0IsRUFBRSxDQUFDO1FBQzVCLGdCQUFXLEdBQUcsQ0FBQyxDQUFDO1FBV2QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQy9CLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1lBQ3JCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUU7Z0JBQ3JCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO2dCQUNwQixVQUFVLENBQUMsR0FBRyxFQUFFO29CQUNkLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDeEIsQ0FBQyxDQUFDLENBQUM7YUFDSjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQzthQUN0QjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3BDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1lBQ3hCLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsRUFBRTtnQkFDakUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQzthQUN6QjtZQUNELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDaEIsVUFBVSxDQUFDLEdBQUcsRUFBRTtvQkFDZCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3hCLENBQUMsQ0FBQyxDQUFDO2FBQ0o7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Ozs7SUFFRCxRQUFRO0lBRVIsQ0FBQzs7Ozs7SUFFTyxjQUFjOztjQUNkLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDekMsSUFBSSxJQUFJLEVBQUU7WUFDUixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUU7Z0JBQ2hDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQzthQUNqQjtpQkFBTTs7c0JBQ0MsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ2hGLElBQUksSUFBSSxFQUFFO29CQUNSLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFDOUQsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUFFO3dCQUNuQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO3FCQUN6QjtpQkFDRjtxQkFBTTtvQkFDTCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7aUJBQ2pCO2FBQ0Y7U0FDRjtJQUNILENBQUM7Ozs7OztJQUNPLFlBQVksQ0FBQyxPQUFnQjs7Y0FDN0IsWUFBWSxHQUFHLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRTs7Y0FDOUMsTUFBTSxHQUFHLEVBQUU7UUFDakIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFDOUMsWUFBWSxDQUFDLElBQUksR0FBRyxNQUFNLEVBQzFCLFlBQVksQ0FBQyxHQUFHLEdBQUcsTUFBTSxFQUN6QixZQUFZLENBQUMsS0FBSyxHQUFHLENBQUMsR0FBRyxNQUFNLEVBQy9CLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0lBQ3RDLENBQUM7Ozs7O0lBQ08sUUFBUTtRQUNkLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztZQUM3QyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUM1QyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQztZQUNuRCxJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixFQUFFLENBQUM7U0FDbkM7SUFDSCxDQUFDOzs7Ozs7SUFDTyxnQkFBZ0IsQ0FBQyxPQUFnQjs7Y0FDakMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRTs7Y0FDOUMsTUFBTSxHQUFHLEVBQUU7O2NBQ1gsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUM7O2NBQzlFLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDO1FBQ3RGLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQzFDLENBQUMsRUFDRCxDQUFDLEVBQ0QsS0FBSyxFQUNMLFlBQVksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUM7UUFDN0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFDM0MsQ0FBQyxFQUNELFlBQVksQ0FBQyxHQUFHLEdBQUcsTUFBTSxFQUN6QixZQUFZLENBQUMsSUFBSSxHQUFHLE1BQU0sRUFDMUIsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFDNUMsWUFBWSxDQUFDLElBQUksR0FBRyxZQUFZLENBQUMsS0FBSyxHQUFHLE1BQU0sRUFDL0MsWUFBWSxDQUFDLEdBQUcsR0FBRyxNQUFNLEVBQ3pCLEtBQUssR0FBRyxZQUFZLENBQUMsSUFBSSxHQUFHLFlBQVksQ0FBQyxLQUFLLEdBQUcsTUFBTSxFQUN2RCxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUM3QyxDQUFDLEVBQ0QsWUFBWSxDQUFDLEdBQUcsR0FBRyxZQUFZLENBQUMsTUFBTSxHQUFHLE1BQU0sRUFDL0MsS0FBSyxFQUNMLEtBQUssR0FBRyxZQUFZLENBQUMsR0FBRyxHQUFHLFlBQVksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUM7SUFFN0QsQ0FBQzs7Ozs7Ozs7OztJQUVPLFdBQVcsQ0FBQyxPQUFZLEVBQUUsSUFBWSxFQUFFLEdBQVcsRUFBRSxLQUFhLEVBQUUsTUFBYztRQUN4RixPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxHQUFHLElBQUksSUFBSSxDQUFDO1FBQ2pDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUM7UUFDL0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsR0FBRyxLQUFLLElBQUksQ0FBQztRQUNuQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDO0lBQ3ZDLENBQUM7Ozs7O0lBQ08sV0FBVztRQUNqQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMzRCxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzFELElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUMxRDtRQUNELElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNsQixJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzVELElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDM0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6RCxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzNEO1FBQ0QsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ25CLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDN0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM1RCxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFELElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDNUQ7UUFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDcEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM5RCxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzdELElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUM3RDtRQUNELElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNyQixJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQy9ELElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDOUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM1RCxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzlEO0lBQ0gsQ0FBQzs7O1lBckxGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsa0JBQWtCO2dCQUM1QixRQUFRLEVBQUU7Ozs7Ozs7Ozs7O09BV0w7Z0JBQ0wsTUFBTSxFQUFFLENBQUMsdVFBQXVRLENBQUM7Z0JBQ2pSLFVBQVUsRUFBRTtvQkFDVixPQUFPLENBQUMsZUFBZSxFQUFFO3dCQUN2QixVQUFVLENBQUMsV0FBVyxFQUFFOzRCQUN0QixLQUFLLENBQUMsT0FBTyxFQUNYLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxTQUFTLENBQUM7Z0NBQ3BDLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztnQ0FDckIsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDOzZCQUN0QixDQUFDLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzt5QkFDM0IsQ0FBQzt3QkFDRixVQUFVLENBQUMsV0FBVyxFQUFFOzRCQUN0QixLQUFLLENBQUMsT0FBTyxFQUNYLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxTQUFTLENBQUM7Z0NBQ3BDLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztnQ0FDckIsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDOzZCQUN0QixDQUFDLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzt5QkFDM0IsQ0FBQztxQkFDSCxDQUFDO2lCQUNIO2FBQ0Y7OztZQW5DUSxrQkFBa0I7NENBaUR0QixNQUFNLFNBQUMsUUFBUTs7O3VCQVJqQixTQUFTLFNBQUMsVUFBVTt3QkFDcEIsU0FBUyxTQUFDLFdBQVc7eUJBQ3JCLFNBQVMsU0FBQyxZQUFZOzBCQUN0QixTQUFTLFNBQUMsYUFBYTsyQkFDdkIsU0FBUyxTQUFDLGNBQWM7cUJBQ3hCLFNBQVMsU0FBQyxRQUFROzs7O0lBUm5CLHVDQUFnQjs7SUFDaEIscUNBQTRCOztJQUM1QiwyQ0FBZ0I7Ozs7O0lBQ2hCLHdDQUFvRDs7Ozs7SUFDcEQseUNBQXNEOzs7OztJQUN0RCwwQ0FBd0Q7Ozs7O0lBQ3hELDJDQUEwRDs7Ozs7SUFDMUQsNENBQTREOzs7OztJQUM1RCxzQ0FBcUQ7Ozs7O0lBRW5ELG1DQUErQjs7Ozs7SUFDL0Isd0NBQXVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0cmlnZ2VyLCB0cmFuc2l0aW9uLCBhbmltYXRlLCBrZXlmcmFtZXMsIHN0eWxlLCBxdWVyeSB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHsgSVR1dG9yaWFsU3RlcCB9IGZyb20gJy4uL2FwaS9pLXR1dG9yaWFsLXN0ZXAnO1xuaW1wb3J0IHsgUHJvbXB0Q29tcG9uZW50IH0gZnJvbSAnLi4vcHJvbXB0L3Byb21wdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgU3RlcFByb21wdFBsYWNlbWVudCB9IGZyb20gJy4uL2FwaS9pLW9wdGlvbnMnO1xuaW1wb3J0IHsgTmd5VHV0b3JpYWxTZXJ2aWNlIH0gZnJvbSAnLi4vbmd5LXR1dG9yaWFsLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItbmd5LXR1dG9yaWFsJyxcbiAgdGVtcGxhdGU6IGA8bGliLW5neS10dXRvcmlhbC1wcm9tcHQgKm5nSWY9XCJlbmFibGVkXCIgQGZhZGVBbmltYXRpb24gW3N0ZXBdPVwic3RlcHNbY3VycmVudFN0ZXBdXCIgW3N0ZXBOdW1iZXJdPVwiY3VycmVudFN0ZXBcIiBbdG90YWxTdGVwc109XCJzdGVwcy5sZW5ndGhcIiAjcHJvbXB0PjwvbGliLW5neS10dXRvcmlhbC1wcm9tcHQ+XG48ZGl2IGNsYXNzPVwid2luZG93LWNvdmVyIGZ1bGwtd2lkdGhcIiAjdG9wQ292ZXIgKm5nSWY9XCJlbmFibGVkXCIgQGZhZGVBbmltYXRpb24+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJ3aW5kb3ctY292ZXJcIiAjbGVmdENvdmVyICpuZ0lmPVwiZW5hYmxlZFwiIEBmYWRlQW5pbWF0aW9uPlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwid2luZG93LWNvdmVyXCIgI3JpZ2h0Q292ZXIgKm5nSWY9XCJlbmFibGVkXCIgQGZhZGVBbmltYXRpb24+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJ3aW5kb3ctY292ZXIgZnVsbC13aWR0aFwiICNib3R0b21Db3ZlciAqbmdJZj1cImVuYWJsZWRcIiBAZmFkZUFuaW1hdGlvbj5cbjwvZGl2PlxuPGRpdiBjbGFzcz1cImVsZW1lbnQtY292ZXJcIiAjZWxlbWVudENvdmVyPlxuXG48L2Rpdj5gLFxuICBzdHlsZXM6IFtgOmhvc3R7cG9zaXRpb246Zml4ZWQ7bGVmdDowO3RvcDowO3dpZHRoOjA7aGVpZ2h0OjB9LndpbmRvdy1jb3Zlcntwb3NpdGlvbjpmaXhlZDtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjgpO3otaW5kZXg6OTk4fS53aW5kb3ctY292ZXIuZnVsbC13aWR0aHt3aWR0aDoxMDB2d30uZWxlbWVudC1jb3Zlcntwb3NpdGlvbjpmaXhlZDt6LWluZGV4Ojk5OH1saWItbmd5LXR1dG9yaWFsLXByb21wdHt0b3A6MDtsZWZ0OjA7cG9zaXRpb246Zml4ZWQ7ei1pbmRleDo5OTl9YF0sXG4gIGFuaW1hdGlvbnM6IFtcbiAgICB0cmlnZ2VyKCdmYWRlQW5pbWF0aW9uJywgW1xuICAgICAgdHJhbnNpdGlvbigndm9pZCA9PiAqJywgW1xuICAgICAgICBxdWVyeSgnOnNlbGYnLFxuICAgICAgICAgIGFuaW1hdGUoJzAuM3MgZWFzZS1pbi1vdXQnLCBrZXlmcmFtZXMoW1xuICAgICAgICAgICAgc3R5bGUoeyBvcGFjaXR5OiAwIH0pLFxuICAgICAgICAgICAgc3R5bGUoeyBvcGFjaXR5OiAxIH0pLFxuICAgICAgICAgIF0pKSwgeyBvcHRpb25hbDogdHJ1ZSB9KSxcbiAgICAgIF0pLFxuICAgICAgdHJhbnNpdGlvbignKiA9PiB2b2lkJywgW1xuICAgICAgICBxdWVyeSgnOnNlbGYnLFxuICAgICAgICAgIGFuaW1hdGUoJzAuM3MgZWFzZS1pbi1vdXQnLCBrZXlmcmFtZXMoW1xuICAgICAgICAgICAgc3R5bGUoeyBvcGFjaXR5OiAxIH0pLFxuICAgICAgICAgICAgc3R5bGUoeyBvcGFjaXR5OiAwIH0pLFxuICAgICAgICAgIF0pKSwgeyBvcHRpb25hbDogdHJ1ZSB9KSxcbiAgICAgIF0pLFxuICAgIF0pLFxuICBdXG59KVxuZXhwb3J0IGNsYXNzIE5neVR1dG9yaWFsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBlbmFibGVkID0gZmFsc2U7XG4gIHN0ZXBzOiBJVHV0b3JpYWxTdGVwW10gPSBbXTtcbiAgY3VycmVudFN0ZXAgPSAwO1xuICBAVmlld0NoaWxkKCd0b3BDb3ZlcicpIHByaXZhdGUgdG9wQ292ZXI6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ2xlZnRDb3ZlcicpIHByaXZhdGUgbGVmdENvdmVyOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdyaWdodENvdmVyJykgcHJpdmF0ZSByaWdodENvdmVyOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdib3R0b21Db3ZlcicpIHByaXZhdGUgYm90dG9tQ292ZXI6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ2VsZW1lbnRDb3ZlcicpIHByaXZhdGUgZWxlbWVudENvdmVyOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdwcm9tcHQnKSBwcml2YXRlIHByb21wdDogUHJvbXB0Q29tcG9uZW50O1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHN2YzogTmd5VHV0b3JpYWxTZXJ2aWNlLFxuICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IGFueSxcbiAgKSB7XG4gICAgdGhpcy5zdmMudG9TaG93LnN1YnNjcmliZShzdHBzID0+IHtcbiAgICAgIHRoaXMuc3RlcHMgPSBzdHBzO1xuICAgICAgdGhpcy5jdXJyZW50U3RlcCA9IDA7XG4gICAgICBpZiAodGhpcy5zdGVwcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zZXR1cFVJRm9yU3RlcCgpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuc3ZjLmN1cnJlbnRTdGVwLnN1YnNjcmliZShzdGVwID0+IHtcbiAgICAgIHRoaXMuY3VycmVudFN0ZXAgPSBzdGVwO1xuICAgICAgaWYgKHRoaXMuY3VycmVudFN0ZXAgPj0gdGhpcy5zdGVwcy5sZW5ndGggfHwgdGhpcy5jdXJyZW50U3RlcCA8IDApIHtcbiAgICAgICAgdGhpcy5zdmMuaGlkZVR1dG9yaWFsKCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5lbmFibGVkKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0dXBVSUZvclN0ZXAoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcblxuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cFVJRm9yU3RlcCgpIHtcbiAgICBjb25zdCBzdGVwID0gdGhpcy5zdGVwc1t0aGlzLmN1cnJlbnRTdGVwXTtcbiAgICBpZiAoc3RlcCkge1xuICAgICAgdGhpcy5yZXNldENvdmVycygpO1xuICAgICAgdGhpcy5wcm9tcHQubmdPbkluaXQoKTtcbiAgICAgIGlmICghc3RlcC5vcHRpb25zLnJlbGF0ZWRFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuY292ZXJBbGwoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGVsZW0gPSB0aGlzLmRvY3VtZW50LmJvZHkucXVlcnlTZWxlY3RvcihgIyR7c3RlcC5vcHRpb25zLnJlbGF0ZWRFbGVtZW50fWApO1xuICAgICAgICBpZiAoZWxlbSkge1xuICAgICAgICAgIHRoaXMuY292ZXJTaG93RWxlbWVudChlbGVtKTtcbiAgICAgICAgICB0aGlzLnByb21wdC5zZXRQcm9tcHRGb3JFbGVtZW50KGVsZW0sIHN0ZXAub3B0aW9ucy5wbGFjZW1lbnQpO1xuICAgICAgICAgIGlmIChzdGVwLm9wdGlvbnMuZGlzYWJsZUludGVyYWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmNvdmVyRWxlbWVudChlbGVtKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jb3ZlckFsbCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByaXZhdGUgY292ZXJFbGVtZW50KGVsZW1lbnQ6IEVsZW1lbnQpIHtcbiAgICBjb25zdCBwb3NpdGlvbkluZm8gPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IG1hcmdpbiA9IDEwO1xuICAgIHRoaXMuc2V0UG9zaXRpb24odGhpcy5lbGVtZW50Q292ZXIubmF0aXZlRWxlbWVudCxcbiAgICAgIHBvc2l0aW9uSW5mby5sZWZ0IC0gbWFyZ2luLFxuICAgICAgcG9zaXRpb25JbmZvLnRvcCAtIG1hcmdpbixcbiAgICAgIHBvc2l0aW9uSW5mby53aWR0aCArIDIgKiBtYXJnaW4sXG4gICAgICBwb3NpdGlvbkluZm8uaGVpZ2h0ICsgMiAqIG1hcmdpbik7XG4gIH1cbiAgcHJpdmF0ZSBjb3ZlckFsbCgpIHtcbiAgICBpZiAodGhpcy50b3BDb3Zlcikge1xuICAgICAgdGhpcy50b3BDb3Zlci5uYXRpdmVFbGVtZW50LnN0eWxlLmxlZnQgPSAnMCc7XG4gICAgICB0aGlzLnRvcENvdmVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUudG9wID0gJzAnO1xuICAgICAgdGhpcy50b3BDb3Zlci5uYXRpdmVFbGVtZW50LnN0eWxlLmhlaWdodCA9ICcxMDB2aCc7XG4gICAgICB0aGlzLnByb21wdC5zZXRQcm9tcHRGb3JFbGVtZW50KCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgY292ZXJTaG93RWxlbWVudChlbGVtZW50OiBFbGVtZW50KSB7XG4gICAgY29uc3QgcG9zaXRpb25JbmZvID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBtYXJnaW4gPSAxMDtcbiAgICBjb25zdCB2aWV3VyA9IE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCwgd2luZG93LmlubmVyV2lkdGggfHwgMCk7XG4gICAgY29uc3Qgdmlld0ggPSBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LCB3aW5kb3cuaW5uZXJIZWlnaHQgfHwgMCk7XG4gICAgdGhpcy5zZXRQb3NpdGlvbih0aGlzLnRvcENvdmVyLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIHZpZXdXLFxuICAgICAgcG9zaXRpb25JbmZvLnRvcCAtIG1hcmdpbik7XG4gICAgdGhpcy5zZXRQb3NpdGlvbih0aGlzLmxlZnRDb3Zlci5uYXRpdmVFbGVtZW50LFxuICAgICAgMCxcbiAgICAgIHBvc2l0aW9uSW5mby50b3AgLSBtYXJnaW4sXG4gICAgICBwb3NpdGlvbkluZm8ubGVmdCAtIG1hcmdpbixcbiAgICAgIHBvc2l0aW9uSW5mby5oZWlnaHQgKyAyICogbWFyZ2luKTtcbiAgICB0aGlzLnNldFBvc2l0aW9uKHRoaXMucmlnaHRDb3Zlci5uYXRpdmVFbGVtZW50LFxuICAgICAgcG9zaXRpb25JbmZvLmxlZnQgKyBwb3NpdGlvbkluZm8ud2lkdGggKyBtYXJnaW4sXG4gICAgICBwb3NpdGlvbkluZm8udG9wIC0gbWFyZ2luLFxuICAgICAgdmlld1cgLSBwb3NpdGlvbkluZm8ubGVmdCAtIHBvc2l0aW9uSW5mby53aWR0aCAtIG1hcmdpbixcbiAgICAgIHBvc2l0aW9uSW5mby5oZWlnaHQgKyAyICogbWFyZ2luKTtcbiAgICB0aGlzLnNldFBvc2l0aW9uKHRoaXMuYm90dG9tQ292ZXIubmF0aXZlRWxlbWVudCxcbiAgICAgIDAsXG4gICAgICBwb3NpdGlvbkluZm8udG9wICsgcG9zaXRpb25JbmZvLmhlaWdodCArIG1hcmdpbixcbiAgICAgIHZpZXdXLFxuICAgICAgdmlld0ggLSBwb3NpdGlvbkluZm8udG9wIC0gcG9zaXRpb25JbmZvLmhlaWdodCAtIG1hcmdpbik7XG5cbiAgfVxuXG4gIHByaXZhdGUgc2V0UG9zaXRpb24oZWxlbWVudDogYW55LCBsZWZ0OiBudW1iZXIsIHRvcDogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcikge1xuICAgIGVsZW1lbnQuc3R5bGUubGVmdCA9IGAke2xlZnR9cHhgO1xuICAgIGVsZW1lbnQuc3R5bGUudG9wID0gYCR7dG9wfXB4YDtcbiAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gYCR7d2lkdGh9cHhgO1xuICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7aGVpZ2h0fXB4YDtcbiAgfVxuICBwcml2YXRlIHJlc2V0Q292ZXJzKCkge1xuICAgIGlmICh0aGlzLnRvcENvdmVyKSB7XG4gICAgICB0aGlzLnRvcENvdmVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2hlaWdodCcpO1xuICAgICAgdGhpcy50b3BDb3Zlci5uYXRpdmVFbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCd3aWR0aCcpO1xuICAgICAgdGhpcy50b3BDb3Zlci5uYXRpdmVFbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCd0b3AnKTtcbiAgICAgIHRoaXMudG9wQ292ZXIubmF0aXZlRWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnbGVmdCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5sZWZ0Q292ZXIpIHtcbiAgICAgIHRoaXMubGVmdENvdmVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2hlaWdodCcpO1xuICAgICAgdGhpcy5sZWZ0Q292ZXIubmF0aXZlRWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnd2lkdGgnKTtcbiAgICAgIHRoaXMubGVmdENvdmVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ3RvcCcpO1xuICAgICAgdGhpcy5sZWZ0Q292ZXIubmF0aXZlRWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnbGVmdCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5yaWdodENvdmVyKSB7XG4gICAgICB0aGlzLnJpZ2h0Q292ZXIubmF0aXZlRWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnaGVpZ2h0Jyk7XG4gICAgICB0aGlzLnJpZ2h0Q292ZXIubmF0aXZlRWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnd2lkdGgnKTtcbiAgICAgIHRoaXMucmlnaHRDb3Zlci5uYXRpdmVFbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCd0b3AnKTtcbiAgICAgIHRoaXMucmlnaHRDb3Zlci5uYXRpdmVFbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCdsZWZ0Jyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmJvdHRvbUNvdmVyKSB7XG4gICAgICB0aGlzLmJvdHRvbUNvdmVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2hlaWdodCcpO1xuICAgICAgdGhpcy5ib3R0b21Db3Zlci5uYXRpdmVFbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCd3aWR0aCcpO1xuICAgICAgdGhpcy5ib3R0b21Db3Zlci5uYXRpdmVFbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCd0b3AnKTtcbiAgICAgIHRoaXMuYm90dG9tQ292ZXIubmF0aXZlRWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnbGVmdCcpO1xuICAgIH1cbiAgICBpZiAodGhpcy5lbGVtZW50Q292ZXIpIHtcbiAgICAgIHRoaXMuZWxlbWVudENvdmVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2hlaWdodCcpO1xuICAgICAgdGhpcy5lbGVtZW50Q292ZXIubmF0aXZlRWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnd2lkdGgnKTtcbiAgICAgIHRoaXMuZWxlbWVudENvdmVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ3RvcCcpO1xuICAgICAgdGhpcy5lbGVtZW50Q292ZXIubmF0aXZlRWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnbGVmdCcpO1xuICAgIH1cbiAgfVxufVxuXG4iXX0=