@yoursabhishekabhi7/modal-popup-ng-all
Version:
Reusable Angular modal popup components supporting Angular 14 to 18
148 lines • 26 kB
JavaScript
import { Component, Input, ViewChild, ViewContainerRef, TemplateRef, ElementRef } from '@angular/core';
import { TemplateWrapperComponent } from './template-wrapper/template-wrapper.component';
import * as i0 from "@angular/core";
import * as i1 from "./modal-popup.service";
import * as i2 from "@angular/common";
export class AngularModalPopup {
componentFactoryResolver;
modalService;
injector;
elementRef;
title;
body;
RAMDOM_ID = -1;
options;
dynamicComponentContainer;
isVisible = false;
content;
constructor(componentFactoryResolver, modalService, injector, elementRef) {
this.componentFactoryResolver = componentFactoryResolver;
this.modalService = modalService;
this.injector = injector;
this.elementRef = elementRef;
}
ngOnInit() {
this.modalService.modalOpen$.subscribe(isOpen => {
this.isVisible = isOpen;
});
}
onAttached() { }
// Method to dynamically inject another component into the modal
injectComponent(options, componentOrTemplate, RAMDOM_ID) {
this.title = options.title;
this.body = options.body;
this.options = options;
this.dynamicComponentContainer.clear(); // Clear the container
this.RAMDOM_ID = RAMDOM_ID;
if (componentOrTemplate instanceof TemplateRef) {
const componentRef_1 = this.dynamicComponentContainer.createComponent(TemplateWrapperComponent);
componentRef_1.instance.template = componentOrTemplate;
if (componentRef_1?.location) {
const popupHeader = componentRef_1?.location?.nativeElement?.querySelector('popup-header');
if (popupHeader) {
const content = document.querySelector('.btn-controller');
if (content) {
content.insertBefore(popupHeader, content.firstChild);
const existingPopupHeaders = content.querySelectorAll('popup-header');
if (existingPopupHeaders.length > 1) {
for (let i = 1; i < existingPopupHeaders.length; i++) {
existingPopupHeaders[i].remove(); // Remove old instances, keep the first one
}
}
}
}
}
}
else {
const factory = this.componentFactoryResolver.resolveComponentFactory(componentOrTemplate);
const componentRef_2 = this.dynamicComponentContainer.createComponent(factory);
if (componentRef_2?.location) {
const popupHeader = componentRef_2?.location?.nativeElement?.querySelector('popup-header');
if (popupHeader) {
const content = document.querySelector('.btn-controller');
if (content) {
content.insertBefore(popupHeader, content.firstChild);
const existingPopupHeaders = content.querySelectorAll('popup-header');
if (existingPopupHeaders.length > 1) {
for (let i = 1; i < existingPopupHeaders.length; i++) {
existingPopupHeaders[i].remove(); // Remove old instances, keep the first one
}
}
}
}
}
}
}
ngAfterViewInit() { }
close(RAMDOM_ID) {
this.dynamicComponentContainer.remove();
this.dynamicComponentContainer.clear(); // Clear the container
}
ClosePopup() {
this.close(this.RAMDOM_ID);
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: AngularModalPopup, deps: [{ token: i0.ComponentFactoryResolver }, { token: i1.ModalService }, { token: i0.Injector }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: AngularModalPopup, selector: "modal-popup", inputs: { title: "title", body: "body", RAMDOM_ID: "RAMDOM_ID" }, host: { attributes: { "tabindex": "-1" }, classAttribute: "mat-mdc-dialog-container mdc-dialog" }, viewQueries: [{ propertyName: "dynamicComponentContainer", first: true, predicate: ["dynamicComponentContainer"], descendants: true, read: ViewContainerRef, static: true }, { propertyName: "content", first: true, predicate: ["content"], descendants: true, read: ElementRef }], ngImport: i0, template: `
<div class="angular-mat-modal">
<div class="angular-bg" [ngClass]="{'bg-hide':options?.bghide==true}" [ngStyle]="{
'min-width': options?.size?.minWidth,
'width': options?.size?.width,
'max-width': options?.size?.maxWidth,
'min-height': options?.size?.minHeight,
'height': options?.size?.height,
'max-height': options?.size?.maxHeight
}">
<div class="header" [ngClass]="{'hide-header':options?.headerhide==true}">
<h2 [style]="options?.HeaderTitleStyle">{{ title }}</h2>
<div class="btn-controller" [style]="options?.HeaderButtonControllerStyle">
<button [style]="options?.HeaderCloseButtonStyle" class="close-btn" (click)="close(this.RAMDOM_ID)">X</button>
</div>
</div>
<div class="components-append" [ngStyle]="options?.bodyStyle">
<ng-container #dynamicComponentContainer></ng-container> <!-- Container for dynamic component -->
</div>
</div>
</div>
`, isInline: true, styles: ["::ng-deep .cdk-overlay-container{pointer-events:none;top:0;left:0;height:100%;width:100%;position:fixed}::ng-deep .cdk-overlay-backdrop{position:absolute;inset:0;z-index:1000;pointer-events:auto;-webkit-tap-highlight-color:transparent;transition:opacity .4s cubic-bezier(.25,.8,.25,1);opacity:0}::ng-deep .cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:1;background:#00000049}::ng-deep .cdk-global-overlay-wrapper{height:100vh;padding:0;width:100vw;position:absolute;top:0;left:0;z-index:1000;display:flex}::ng-deep .cdk-overlay-pane{position:absolute;pointer-events:auto;box-sizing:border-box;z-index:1000;display:flex;max-width:100%;max-height:100%;padding:30px}.angular-bg{display:flex;min-width:500px;max-width:100%;height:auto;overflow-x:hidden;overflow-y:auto;outline:0;flex-direction:column;gap:20px;background-color:#fff;padding:20px;border-radius:10px;box-shadow:0 0 14px 8px #bfbfbf;margin:auto}.angular-bg .header{display:flex;width:100%;flex-direction:row;gap:20px;background-color:#fff;border-bottom:2px solid #afafaf;padding-bottom:10px}.angular-bg .header .close-btn{margin:auto 0 auto auto;background:transparent;border-radius:5px;padding:0!important;font-size:15px;border:2px solid #a2a2a2;cursor:pointer;width:80px}.angular-bg .header .close-btn:hover{color:#5f9ea0}.btn-controller{margin:auto 0 auto auto;display:flex}.bg-hide{background:transparent!important}.hide-header{display:none!important;opacity:0!important;visibility:hidden!important}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: AngularModalPopup, decorators: [{
type: Component,
args: [{ selector: 'modal-popup', template: `
<div class="angular-mat-modal">
<div class="angular-bg" [ngClass]="{'bg-hide':options?.bghide==true}" [ngStyle]="{
'min-width': options?.size?.minWidth,
'width': options?.size?.width,
'max-width': options?.size?.maxWidth,
'min-height': options?.size?.minHeight,
'height': options?.size?.height,
'max-height': options?.size?.maxHeight
}">
<div class="header" [ngClass]="{'hide-header':options?.headerhide==true}">
<h2 [style]="options?.HeaderTitleStyle">{{ title }}</h2>
<div class="btn-controller" [style]="options?.HeaderButtonControllerStyle">
<button [style]="options?.HeaderCloseButtonStyle" class="close-btn" (click)="close(this.RAMDOM_ID)">X</button>
</div>
</div>
<div class="components-append" [ngStyle]="options?.bodyStyle">
<ng-container #dynamicComponentContainer></ng-container> <!-- Container for dynamic component -->
</div>
</div>
</div>
`, host: {
'class': 'mat-mdc-dialog-container mdc-dialog',
'tabindex': '-1'
}, styles: ["::ng-deep .cdk-overlay-container{pointer-events:none;top:0;left:0;height:100%;width:100%;position:fixed}::ng-deep .cdk-overlay-backdrop{position:absolute;inset:0;z-index:1000;pointer-events:auto;-webkit-tap-highlight-color:transparent;transition:opacity .4s cubic-bezier(.25,.8,.25,1);opacity:0}::ng-deep .cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:1;background:#00000049}::ng-deep .cdk-global-overlay-wrapper{height:100vh;padding:0;width:100vw;position:absolute;top:0;left:0;z-index:1000;display:flex}::ng-deep .cdk-overlay-pane{position:absolute;pointer-events:auto;box-sizing:border-box;z-index:1000;display:flex;max-width:100%;max-height:100%;padding:30px}.angular-bg{display:flex;min-width:500px;max-width:100%;height:auto;overflow-x:hidden;overflow-y:auto;outline:0;flex-direction:column;gap:20px;background-color:#fff;padding:20px;border-radius:10px;box-shadow:0 0 14px 8px #bfbfbf;margin:auto}.angular-bg .header{display:flex;width:100%;flex-direction:row;gap:20px;background-color:#fff;border-bottom:2px solid #afafaf;padding-bottom:10px}.angular-bg .header .close-btn{margin:auto 0 auto auto;background:transparent;border-radius:5px;padding:0!important;font-size:15px;border:2px solid #a2a2a2;cursor:pointer;width:80px}.angular-bg .header .close-btn:hover{color:#5f9ea0}.btn-controller{margin:auto 0 auto auto;display:flex}.bg-hide{background:transparent!important}.hide-header{display:none!important;opacity:0!important;visibility:hidden!important}\n"] }]
}], ctorParameters: () => [{ type: i0.ComponentFactoryResolver }, { type: i1.ModalService }, { type: i0.Injector }, { type: i0.ElementRef }], propDecorators: { title: [{
type: Input
}], body: [{
type: Input
}], RAMDOM_ID: [{
type: Input
}], dynamicComponentContainer: [{
type: ViewChild,
args: ['dynamicComponentContainer', { read: ViewContainerRef, static: true }]
}], content: [{
type: ViewChild,
args: ['content', { read: ElementRef }]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwtcG9wdXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW9kYWwtcG9wdXAtbmcxNC0xOC9zcmMvbGliL2Jvb3Qtc3RhcnAtY29tcG9uZW50cy9tb2RhbC1wb3B1cC9tb2RhbC1wb3B1cC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFvQyxXQUFXLEVBQXdCLFVBQVUsRUFBdUQsTUFBTSxlQUFlLENBQUM7QUFFcE4sT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sK0NBQStDLENBQUM7Ozs7QUE0SXpGLE1BQU0sT0FBTyxpQkFBaUI7SUFVbEI7SUFDQTtJQUNBO0lBQ0E7SUFaRCxLQUFLLENBQXFCO0lBQzFCLElBQUksQ0FBcUI7SUFDekIsU0FBUyxHQUFXLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLE9BQU8sQ0FBVztJQUNnRSx5QkFBeUIsQ0FBb0I7SUFDL0gsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUMwQixPQUFPLENBQWM7SUFFakUsWUFDVSx3QkFBa0QsRUFDbEQsWUFBMEIsRUFDMUIsUUFBa0IsRUFDbEIsVUFBc0I7UUFIdEIsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUEwQjtRQUNsRCxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ2xCLGVBQVUsR0FBVixVQUFVLENBQVk7SUFBSSxDQUFDO0lBRXJDLFFBQVE7UUFDTixJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDOUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUM7UUFDMUIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsVUFBVSxLQUFJLENBQUM7SUFFZixnRUFBZ0U7SUFDaEUsZUFBZSxDQUFJLE9BQWdCLEVBQUUsbUJBQXdELEVBQUUsU0FBaUI7UUFDOUcsSUFBSSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMseUJBQXlCLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxzQkFBc0I7UUFDOUQsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxtQkFBbUIsWUFBWSxXQUFXLEVBQUUsQ0FBQztZQUMvQyxNQUFNLGNBQWMsR0FBMkMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLGVBQWUsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1lBQ3hJLGNBQWMsQ0FBQyxRQUFRLENBQUMsUUFBUSxHQUFHLG1CQUFtQixDQUFDO1lBQ3ZELElBQUksY0FBYyxFQUFFLFFBQVEsRUFBRSxDQUFDO2dCQUM3QixNQUFNLFdBQVcsR0FBRyxjQUFjLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQzNGLElBQUksV0FBVyxFQUFFLENBQUM7b0JBQ2hCLE1BQU0sT0FBTyxHQUFRLFFBQVEsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsQ0FBQztvQkFDL0QsSUFBSSxPQUFPLEVBQUUsQ0FBQzt3QkFDWixPQUFPLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7d0JBQ3RELE1BQU0sb0JBQW9CLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxDQUFDO3dCQUN0RSxJQUFJLG9CQUFvQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQzs0QkFDcEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dDQUNyRCxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLDJDQUEyQzs0QkFDL0UsQ0FBQzt3QkFDSCxDQUFDO29CQUNILENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyx1QkFBdUIsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQzNGLE1BQU0sY0FBYyxHQUEwQixJQUFJLENBQUMseUJBQXlCLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3RHLElBQUksY0FBYyxFQUFFLFFBQVEsRUFBRSxDQUFDO2dCQUM3QixNQUFNLFdBQVcsR0FBRyxjQUFjLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQzNGLElBQUksV0FBVyxFQUFFLENBQUM7b0JBQ2hCLE1BQU0sT0FBTyxHQUFRLFFBQVEsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsQ0FBQztvQkFDL0QsSUFBSSxPQUFPLEVBQUUsQ0FBQzt3QkFDWixPQUFPLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7d0JBQ3RELE1BQU0sb0JBQW9CLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxDQUFDO3dCQUN0RSxJQUFJLG9CQUFvQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQzs0QkFDcEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dDQUNyRCxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLDJDQUEyQzs0QkFDL0UsQ0FBQzt3QkFDSCxDQUFDO29CQUNILENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELGVBQWUsS0FBVSxDQUFDO0lBRTFCLEtBQUssQ0FBQyxTQUFjO1FBQ2xCLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN4QyxJQUFJLENBQUMseUJBQXlCLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxzQkFBc0I7SUFDaEUsQ0FBQztJQUVELFVBQVU7UUFDUixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUM1QixDQUFDO3VHQTlFVSxpQkFBaUI7MkZBQWpCLGlCQUFpQiwyVUFLb0IsZ0JBQWdCLDJHQUVsQyxVQUFVLDZCQTlJOUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCVDs7MkZBa0hVLGlCQUFpQjtrQkF6STdCLFNBQVM7K0JBQ0UsYUFBYSxZQUNiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQlQsUUE2R0s7d0JBQ0osT0FBTyxFQUFFLHFDQUFxQzt3QkFDOUMsVUFBVSxFQUFFLElBQUk7cUJBQ2pCO3dLQUdRLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFFNEUseUJBQXlCO3NCQUExRyxTQUFTO3VCQUFDLDJCQUEyQixFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBRXBDLE9BQU87c0JBQWxELFNBQVM7dUJBQUMsU0FBUyxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudFR5cGUgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmLCBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIE9uSW5pdCwgVGVtcGxhdGVSZWYsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIENvbXBvbmVudFJlZiwgSW5qZWN0b3IsIEFmdGVyVmlld0luaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTW9kYWxTZXJ2aWNlIH0gZnJvbSAnLi9tb2RhbC1wb3B1cC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVGVtcGxhdGVXcmFwcGVyQ29tcG9uZW50IH0gZnJvbSAnLi90ZW1wbGF0ZS13cmFwcGVyL3RlbXBsYXRlLXdyYXBwZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHsgT3B0aW9ucyB9IGZyb20gJy4vbW9kYWwtb3B0aW9ucydcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbW9kYWwtcG9wdXAnLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgPGRpdiBjbGFzcz1cImFuZ3VsYXItbWF0LW1vZGFsXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYW5ndWxhci1iZ1wiIFtuZ0NsYXNzXT1cInsnYmctaGlkZSc6b3B0aW9ucz8uYmdoaWRlPT10cnVlfVwiIFtuZ1N0eWxlXT1cIntcclxuICAgICAgJ21pbi13aWR0aCc6IG9wdGlvbnM/LnNpemU/Lm1pbldpZHRoLFxyXG4gICAgICAnd2lkdGgnOiBvcHRpb25zPy5zaXplPy53aWR0aCxcclxuICAgICAgJ21heC13aWR0aCc6IG9wdGlvbnM/LnNpemU/Lm1heFdpZHRoLFxyXG4gICAgICAnbWluLWhlaWdodCc6IG9wdGlvbnM/LnNpemU/Lm1pbkhlaWdodCxcclxuICAgICAgJ2hlaWdodCc6IG9wdGlvbnM/LnNpemU/LmhlaWdodCxcclxuICAgICAgJ21heC1oZWlnaHQnOiBvcHRpb25zPy5zaXplPy5tYXhIZWlnaHRcclxuICAgIH1cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyXCIgW25nQ2xhc3NdPVwieydoaWRlLWhlYWRlcic6b3B0aW9ucz8uaGVhZGVyaGlkZT09dHJ1ZX1cIj5cclxuICAgICAgICAgICAgPGgyIFtzdHlsZV09XCJvcHRpb25zPy5IZWFkZXJUaXRsZVN0eWxlXCI+e3sgdGl0bGUgfX08L2gyPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWNvbnRyb2xsZXJcIiBbc3R5bGVdPVwib3B0aW9ucz8uSGVhZGVyQnV0dG9uQ29udHJvbGxlclN0eWxlXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gW3N0eWxlXT1cIm9wdGlvbnM/LkhlYWRlckNsb3NlQnV0dG9uU3R5bGVcIiBjbGFzcz1cImNsb3NlLWJ0blwiIChjbGljayk9XCJjbG9zZSh0aGlzLlJBTURPTV9JRClcIj5YPC9idXR0b24+ICAgIFxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgIDxkaXYgY2xhc3M9XCJjb21wb25lbnRzLWFwcGVuZFwiIFtuZ1N0eWxlXT1cIm9wdGlvbnM/LmJvZHlTdHlsZVwiPlxyXG4gICAgICAgPG5nLWNvbnRhaW5lciAjZHluYW1pY0NvbXBvbmVudENvbnRhaW5lcj48L25nLWNvbnRhaW5lcj4gPCEtLSBDb250YWluZXIgZm9yIGR5bmFtaWMgY29tcG9uZW50IC0tPlxyXG4gICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcbiAgYCxcclxuICBzdHlsZXM6IFtgXHJcblxyXG4gICAgICA6Om5nLWRlZXAgLmNkay1vdmVybGF5LWNvbnRhaW5lcntcclxuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcclxuICAgICAgICB0b3A6IDA7XHJcbiAgICAgICAgbGVmdDogMDtcclxuICAgICAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICA6Om5nLWRlZXAgLmNkay1vdmVybGF5LWJhY2tkcm9wIHtcclxuICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgICAgICAgIHRvcDogMDtcclxuICAgICAgICAgIGJvdHRvbTogMDtcclxuICAgICAgICAgIGxlZnQ6IDA7XHJcbiAgICAgICAgICByaWdodDogMDtcclxuICAgICAgICAgIHotaW5kZXg6IDEwMDA7XHJcbiAgICAgICAgICBwb2ludGVyLWV2ZW50czogYXV0bztcclxuICAgICAgICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7XHJcbiAgICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IC40cyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtcclxuICAgICAgICAgIG9wYWNpdHk6IDA7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIDo6bmctZGVlcCAuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZyB7XHJcbiAgICAgICAgICBvcGFjaXR5OiAxO1xyXG4gICAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAuMjg4KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgOjpuZy1kZWVwIC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlciB7XHJcbiAgICAgICAgaGVpZ2h0OiAxMDB2aDtcclxuICAgICAgICBwYWRkaW5nOiAwO1xyXG4gICAgICAgIHdpZHRoOiAxMDB2dztcclxuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICAgICAgdG9wOiAwO1xyXG4gICAgICAgIGxlZnQ6IDA7XHJcbiAgICAgICAgei1pbmRleDogMTAwMDtcclxuICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICB9XHJcblxyXG4gICAgICA6Om5nLWRlZXAgLmNkay1vdmVybGF5LXBhbmUge1xyXG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgICAgICBwb2ludGVyLWV2ZW50czogYXV0bztcclxuICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgICAgIHotaW5kZXg6IDEwMDA7XHJcbiAgICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgICBtYXgtd2lkdGg6IDEwMCU7XHJcbiAgICAgICAgbWF4LWhlaWdodDogMTAwJTtcclxuICAgICAgICBwYWRkaW5nOiAzMHB4O1xyXG4gICAgICB9XHJcblxyXG4gICAgLmFuZ3VsYXItYmcge1xyXG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgICAgbWluLXdpZHRoOiA1MDBweDtcclxuICAgICAgICBtYXgtd2lkdGg6IDEwMCU7XHJcbiAgICAgICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjtcclxuICAgICAgICBvdmVyZmxvdy15OiBhdXRvO1xyXG4gICAgICAgIG91dGxpbmU6IDA7XHJcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICAgICAgICBnYXA6IDIwcHg7XHJcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcclxuICAgICAgICBwYWRkaW5nOiAyMHB4O1xyXG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7XHJcbiAgICAgICAgYm94LXNoYWRvdzogMHB4IDBweCAxNHB4IDhweCAjYmZiZmJmO1xyXG4gICAgICAgIG1hcmdpbjogYXV0bztcclxuICAgIH1cclxuXHJcbiAgICAuYW5ndWxhci1iZyAuaGVhZGVyIHtcclxuICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XHJcbiAgICAgICAgZ2FwOiAyMHB4O1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XHJcbiAgICAgICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkICNhZmFmYWY7XHJcbiAgICAgICAgcGFkZGluZy1ib3R0b206IDEwcHg7XHJcbiAgICB9XHJcblxyXG4gICAgLmFuZ3VsYXItYmcgLmhlYWRlciAuY2xvc2UtYnRuIHtcclxuICAgICAgICBtYXJnaW46IGF1dG87XHJcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiAwO1xyXG4gICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xyXG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDVweDtcclxuICAgICAgICBwYWRkaW5nOiAwcHggIWltcG9ydGFudDtcclxuICAgICAgICBmb250LXNpemU6IDE1cHg7XHJcbiAgICAgICAgYm9yZGVyOiAycHggc29saWQgI2EyYTJhMjtcclxuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICAgICAgd2lkdGg6ODBweDtcclxuICAgIH1cclxuXHJcbiAgICAuYW5ndWxhci1iZyAuaGVhZGVyIC5jbG9zZS1idG46aG92ZXIge1xyXG4gICAgICAgIGNvbG9yOiBjYWRldGJsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLmJ0bi1jb250cm9sbGVye1xyXG4gICAgICBtYXJnaW46YXV0bztcclxuICAgICAgbWFyZ2luLXJpZ2h0OjBweDtcclxuICAgICAgZGlzcGxheTpmbGV4O1xyXG4gICAgfVxyXG4gICAgLmJnLWhpZGV7XHJcbiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50O1xyXG4gIH1cclxuICAuaGlkZS1oZWFkZXJ7XHJcbiAgICBkaXNwbGF5Om5vbmUgIWltcG9ydGFudDtcclxuICAgIG9wYWNpdHk6MCAhaW1wb3J0YW50O1xyXG4gICAgdmlzaWJpbGl0eTpoaWRkZW4gIWltcG9ydGFudDtcclxuICB9XHJcbiAgYF0sXHJcbiAgaG9zdDoge1xyXG4gICAgJ2NsYXNzJzogJ21hdC1tZGMtZGlhbG9nLWNvbnRhaW5lciBtZGMtZGlhbG9nJyxcclxuICAgICd0YWJpbmRleCc6ICctMSdcclxuICB9LFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQW5ndWxhck1vZGFsUG9wdXAgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xyXG4gIEBJbnB1dCgpIHRpdGxlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgQElucHV0KCkgYm9keTogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gIEBJbnB1dCgpIFJBTURPTV9JRDogbnVtYmVyID0gLTE7XHJcbiAgb3B0aW9ucz86IE9wdGlvbnM7XHJcbiAgQFZpZXdDaGlsZCgnZHluYW1pY0NvbXBvbmVudENvbnRhaW5lcicsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiwgc3RhdGljOiB0cnVlIH0pIGR5bmFtaWNDb21wb25lbnRDb250YWluZXIhOiBWaWV3Q29udGFpbmVyUmVmO1xyXG4gIGlzVmlzaWJsZSA9IGZhbHNlO1xyXG4gIEBWaWV3Q2hpbGQoJ2NvbnRlbnQnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSkgY29udGVudCE6IEVsZW1lbnRSZWY7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcclxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBNb2RhbFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcclxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZikgeyB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5tb2RhbFNlcnZpY2UubW9kYWxPcGVuJC5zdWJzY3JpYmUoaXNPcGVuID0+IHtcclxuICAgICAgdGhpcy5pc1Zpc2libGUgPSBpc09wZW47XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uQXR0YWNoZWQoKSB7fVxyXG5cclxuICAvLyBNZXRob2QgdG8gZHluYW1pY2FsbHkgaW5qZWN0IGFub3RoZXIgY29tcG9uZW50IGludG8gdGhlIG1vZGFsXHJcbiAgaW5qZWN0Q29tcG9uZW50PFQ+KG9wdGlvbnM6IE9wdGlvbnMsIGNvbXBvbmVudE9yVGVtcGxhdGU6IENvbXBvbmVudFR5cGU8VD4gfCBUZW1wbGF0ZVJlZjxhbnk+LCBSQU1ET01fSUQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy50aXRsZSA9IG9wdGlvbnMudGl0bGU7XHJcbiAgICB0aGlzLmJvZHkgPSBvcHRpb25zLmJvZHk7XHJcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xyXG4gICAgdGhpcy5keW5hbWljQ29tcG9uZW50Q29udGFpbmVyLmNsZWFyKCk7IC8vIENsZWFyIHRoZSBjb250YWluZXJcclxuICAgIHRoaXMuUkFNRE9NX0lEID0gUkFNRE9NX0lEO1xyXG4gICAgaWYgKGNvbXBvbmVudE9yVGVtcGxhdGUgaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZikge1xyXG4gICAgICBjb25zdCBjb21wb25lbnRSZWZfMTogQ29tcG9uZW50UmVmPFRlbXBsYXRlV3JhcHBlckNvbXBvbmVudD4gPSB0aGlzLmR5bmFtaWNDb21wb25lbnRDb250YWluZXIuY3JlYXRlQ29tcG9uZW50KFRlbXBsYXRlV3JhcHBlckNvbXBvbmVudCk7XHJcbiAgICAgIGNvbXBvbmVudFJlZl8xLmluc3RhbmNlLnRlbXBsYXRlID0gY29tcG9uZW50T3JUZW1wbGF0ZTtcclxuICAgICAgaWYgKGNvbXBvbmVudFJlZl8xPy5sb2NhdGlvbikge1xyXG4gICAgICAgIGNvbnN0IHBvcHVwSGVhZGVyID0gY29tcG9uZW50UmVmXzE/LmxvY2F0aW9uPy5uYXRpdmVFbGVtZW50Py5xdWVyeVNlbGVjdG9yKCdwb3B1cC1oZWFkZXInKTtcclxuICAgICAgICBpZiAocG9wdXBIZWFkZXIpIHtcclxuICAgICAgICAgIGNvbnN0IGNvbnRlbnQ6IGFueSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5idG4tY29udHJvbGxlcicpO1xyXG4gICAgICAgICAgaWYgKGNvbnRlbnQpIHtcclxuICAgICAgICAgICAgY29udGVudC5pbnNlcnRCZWZvcmUocG9wdXBIZWFkZXIsIGNvbnRlbnQuZmlyc3RDaGlsZCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nUG9wdXBIZWFkZXJzID0gY29udGVudC5xdWVyeVNlbGVjdG9yQWxsKCdwb3B1cC1oZWFkZXInKTtcclxuICAgICAgICAgICAgaWYgKGV4aXN0aW5nUG9wdXBIZWFkZXJzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGV4aXN0aW5nUG9wdXBIZWFkZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBleGlzdGluZ1BvcHVwSGVhZGVyc1tpXS5yZW1vdmUoKTsgLy8gUmVtb3ZlIG9sZCBpbnN0YW5jZXMsIGtlZXAgdGhlIGZpcnN0IG9uZVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgZmFjdG9yeSA9IHRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KGNvbXBvbmVudE9yVGVtcGxhdGUpO1xyXG4gICAgICBjb25zdCBjb21wb25lbnRSZWZfMjogQ29tcG9uZW50UmVmPHVua25vd24+ID0gdGhpcy5keW5hbWljQ29tcG9uZW50Q29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChmYWN0b3J5KTtcclxuICAgICAgaWYgKGNvbXBvbmVudFJlZl8yPy5sb2NhdGlvbikge1xyXG4gICAgICAgIGNvbnN0IHBvcHVwSGVhZGVyID0gY29tcG9uZW50UmVmXzI/LmxvY2F0aW9uPy5uYXRpdmVFbGVtZW50Py5xdWVyeVNlbGVjdG9yKCdwb3B1cC1oZWFkZXInKTtcclxuICAgICAgICBpZiAocG9wdXBIZWFkZXIpIHtcclxuICAgICAgICAgIGNvbnN0IGNvbnRlbnQ6IGFueSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5idG4tY29udHJvbGxlcicpO1xyXG4gICAgICAgICAgaWYgKGNvbnRlbnQpIHtcclxuICAgICAgICAgICAgY29udGVudC5pbnNlcnRCZWZvcmUocG9wdXBIZWFkZXIsIGNvbnRlbnQuZmlyc3RDaGlsZCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nUG9wdXBIZWFkZXJzID0gY29udGVudC5xdWVyeVNlbGVjdG9yQWxsKCdwb3B1cC1oZWFkZXInKTtcclxuICAgICAgICAgICAgaWYgKGV4aXN0aW5nUG9wdXBIZWFkZXJzLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGV4aXN0aW5nUG9wdXBIZWFkZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBleGlzdGluZ1BvcHVwSGVhZGVyc1tpXS5yZW1vdmUoKTsgLy8gUmVtb3ZlIG9sZCBpbnN0YW5jZXMsIGtlZXAgdGhlIGZpcnN0IG9uZVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge31cclxuXHJcbiAgY2xvc2UoUkFNRE9NX0lEOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuZHluYW1pY0NvbXBvbmVudENvbnRhaW5lci5yZW1vdmUoKTtcclxuICAgIHRoaXMuZHluYW1pY0NvbXBvbmVudENvbnRhaW5lci5jbGVhcigpOyAvLyBDbGVhciB0aGUgY29udGFpbmVyXHJcbiAgfVxyXG5cclxuICBDbG9zZVBvcHVwKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jbG9zZSh0aGlzLlJBTURPTV9JRClcclxuICB9XHJcbn0iXX0=