@hxui/angular
Version:
An Angular library based on the [HXUI design system](https://hxui.io).
280 lines • 39.7 kB
JavaScript
import { ApplicationRef, Component, ComponentFactoryResolver, ElementRef, Injector, NgZone, } from '@angular/core';
import { trigger, state, style, animate, transition } from '@angular/animations';
import { DomPortalOutlet } from '@angular/cdk/portal';
import { Subject } from 'rxjs';
import { InspectorSize } from './inspector-size.enum';
import { InspectorLocation } from "./inspector-location.enum";
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
export class InspectorComponent {
constructor(elementRef, zone, componentFactoryResolver, injector, appRef) {
this.elementRef = elementRef;
this.zone = zone;
this.componentFactoryResolver = componentFactoryResolver;
this.injector = injector;
this.appRef = appRef;
this.onSlideInComplete$ = new Subject();
this.onSlideInStart$ = new Subject();
this.onSlideOutComplete$ = new Subject();
this.onSlideOutStart$ = new Subject();
this.onResizeComplete$ = new Subject();
this.onBackDropClick$ = new Subject();
this.parameters = {};
this.state = 'slideOut';
this.size = 'small';
this.sizes = ['small', 'large', 'offsetWidth', 'fullWidth'];
this.previousSize = 'small';
/** Used to temporarily hide external icon when displaying multiple inspectors */
this.hideClose = false;
/** Does inspector have external close icon? */
this.hasClose = true;
/** Side of display inspector is located */
this.location = InspectorLocation.Right;
this.InspectorLocation = InspectorLocation;
this.animationCount = 0;
this.close = () => {
this.slideOut();
};
this.slideIn = () => {
this.state = 'slideIn';
};
this.slideOut = () => {
this.state = 'slideOut';
};
this.slideStart = ($event) => {
if ($event.fromState === 'void') {
this.onSlideInStart$.next(true);
}
else {
this.onSlideOutStart$.next(true);
}
};
this.slideDone = ($event) => {
// initial slide in done
if ($event.fromState === 'void') {
if (this.animationCount < 1) {
this.animationCount++;
}
else {
this.allAnimationsDone();
}
}
// slide out done
if ($event.fromState === 'slideIn' && $event.toState === 'slideOut') {
this.onSlideOutComplete$.next(true);
this.detachComponent();
}
};
this.sizeDone = ($event) => {
// initial size animation
if ($event.fromState === 'void') {
if (this.animationCount < 1) {
this.animationCount++;
}
else {
this.allAnimationsDone();
}
}
// size done
if (($event.fromState === 'small' && $event.toState === 'large') || ($event.fromState === 'large' && $event.toState === 'small')) {
this.onResizeComplete$.next(($event.toState === 'large') ? InspectorSize.Large : InspectorSize.Small);
}
};
}
ngOnInit() {
setTimeout(() => {
this.attachComponent();
this.slideIn();
});
}
resize(size) {
this.size = this.sizes[size];
}
allAnimationsDone() {
this.animationCount = 0;
this.onSlideInComplete$.next(true);
}
attachComponent() {
// Create a portalHost from a DOM element
this.portalHost = new DomPortalOutlet(this.elementRef.nativeElement.querySelector('.portalHost'), this.componentFactoryResolver, this.appRef, this.injector);
// Attach portal to host
const componentRef = this.portalHost.attach(this.componentPortal);
// pass the @Input parameters to the instance
Object.assign(componentRef.instance, this.parameters);
}
detachComponent() {
this.portalHost.detach();
}
onBackdropClick() {
this.onBackDropClick$.next(true);
}
}
InspectorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: InspectorComponent, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }, { token: i0.ComponentFactoryResolver }, { token: i0.Injector }, { token: i0.ApplicationRef }], target: i0.ɵɵFactoryTarget.Component });
InspectorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: InspectorComponent, selector: "hxa-inspector", ngImport: i0, template: "<div \r\n class=\"hxa-inspector\" \r\n *ngIf=\"location === InspectorLocation.Right\"\r\n [@slideFromRight]=\"state\"\r\n (@slideFromRight.done)=\"slideDone($event)\"\r\n (@slideFromRight.start)=\"slideStart($event)\"\r\n [@sizeFromRight]=\"size\"\r\n (@sizeFromRight.done)=\"sizeDone($event)\"\r\n>\r\n <div class=\"portalHost\"></div>\r\n <a class=\"close right\" [ngClass]=\"{ 'hide': hideClose }\" *ngIf=\"hasClose\" (click)=\"close()\"></a>\r\n</div>\r\n<div \r\n class=\"hxa-inspector\" \r\n *ngIf=\"location === InspectorLocation.Left\"\r\n [@slideFromLeft]=\"state\"\r\n (@slideFromLeft.done)=\"slideDone($event)\"\r\n (@slideFromLeft.start)=\"slideStart($event)\"\r\n [@sizeFromLeft]=\"size\"\r\n (@sizeFromLeft.done)=\"sizeDone($event)\"\r\n>\r\n <div class=\"portalHost\"></div>\r\n <a class=\"close left\" [ngClass]=\"{ 'hide': hideClose }\" *ngIf=\"hasClose\" (click)=\"close()\"></a>\r\n</div>\r\n", styles: [":host{display:block}.hxa-inspector{height:100vh;background-color:#fff}.closeButton{position:absolute;left:-40px;top:0}.close{top:.8rem;width:32px;height:32px;opacity:1;transition:all .25s ease-out;position:absolute}.close.right{left:-3rem}.close.left{right:-3rem}.close:hover{opacity:.3}.close:before,.close:after{position:absolute;left:15px;content:\" \";height:35px;width:3px;background-color:#fff}.close:before{transform:rotate(45deg)}.close:after{transform:rotate(-45deg)}.close.hide:before,.close.hide:after{transform:rotate(0);opacity:0}.portalHost{height:100%}\n"], directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], animations: [
trigger('slideFromRight', [
state('slideOut', style({
transform: 'translate3d(100%, 0, 0)',
})),
state('slideIn', style({
transform: 'translate3d(0, 0, 0)'
})),
transition('slideOut => slideIn', animate('200ms ease-in')),
transition('slideIn => slideOut', animate('200ms ease-out')),
transition('void => *', [
style({ transform: 'translate3d(100%, 0, 0)' }),
animate('200ms ease-in')
]),
]),
trigger('slideFromLeft', [
state('slideOut', style({
transform: 'translateX(-100%)'
})),
state('slideIn', style({
transform: 'translateX(0)'
})),
transition('slideOut => slideIn', animate('200ms ease-in')),
transition('slideIn => slideOut', animate('200ms ease-out')),
transition('void => *', [
style({ transform: 'translateX(-100%)' }),
animate('200ms ease-in')
]),
]),
trigger('sizeFromRight', [
state('small', style({
width: '37rem'
})),
state('large', style({
width: '90vw'
})),
state('fullWidth', style({
width: '100vw'
})),
state('offsetWidth', style({
width: '47rem'
})),
transition('small => large', animate('200ms ease-in')),
transition('large => small', animate('200ms ease-out')),
transition('small => fullWidth', animate('200ms ease-out')),
transition('large => fullWidth', animate('200ms ease-out')),
transition('fullWidth => small', animate('200ms ease-in')),
transition('fullWidth => large', animate('200ms ease-in')),
transition('small => offsetWidth', animate('200ms ease-out')),
transition('offsetWidth => small', animate('200ms ease-in')),
transition('void => *', [
style({ width: '0' }),
animate('200ms ease-in')
]),
]),
trigger('sizeFromLeft', [
state('small', style({
width: '37rem'
})),
state('large', style({
width: '90vw'
})),
state('fullWidth', style({
width: '100vw'
})),
state('offsetWidth', style({
width: '47rem'
})),
transition('small => large', animate('200ms ease-in')),
transition('large => small', animate('200ms ease-out')),
transition('small => fullWidth', animate('200ms ease-out')),
transition('large => fullWidth', animate('200ms ease-out')),
transition('fullWidth => small', animate('200ms ease-in')),
transition('fullWidth => large', animate('200ms ease-in')),
transition('small => offsetWidth', animate('200ms ease-out')),
transition('offsetWidth => small', animate('200ms ease-in')),
transition('void => *', [
style({ width: '37rem' }),
animate('200ms ease-in')
]),
])
] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: InspectorComponent, decorators: [{
type: Component,
args: [{ selector: 'hxa-inspector', animations: [
trigger('slideFromRight', [
state('slideOut', style({
transform: 'translate3d(100%, 0, 0)',
})),
state('slideIn', style({
transform: 'translate3d(0, 0, 0)'
})),
transition('slideOut => slideIn', animate('200ms ease-in')),
transition('slideIn => slideOut', animate('200ms ease-out')),
transition('void => *', [
style({ transform: 'translate3d(100%, 0, 0)' }),
animate('200ms ease-in')
]),
]),
trigger('slideFromLeft', [
state('slideOut', style({
transform: 'translateX(-100%)'
})),
state('slideIn', style({
transform: 'translateX(0)'
})),
transition('slideOut => slideIn', animate('200ms ease-in')),
transition('slideIn => slideOut', animate('200ms ease-out')),
transition('void => *', [
style({ transform: 'translateX(-100%)' }),
animate('200ms ease-in')
]),
]),
trigger('sizeFromRight', [
state('small', style({
width: '37rem'
})),
state('large', style({
width: '90vw'
})),
state('fullWidth', style({
width: '100vw'
})),
state('offsetWidth', style({
width: '47rem'
})),
transition('small => large', animate('200ms ease-in')),
transition('large => small', animate('200ms ease-out')),
transition('small => fullWidth', animate('200ms ease-out')),
transition('large => fullWidth', animate('200ms ease-out')),
transition('fullWidth => small', animate('200ms ease-in')),
transition('fullWidth => large', animate('200ms ease-in')),
transition('small => offsetWidth', animate('200ms ease-out')),
transition('offsetWidth => small', animate('200ms ease-in')),
transition('void => *', [
style({ width: '0' }),
animate('200ms ease-in')
]),
]),
trigger('sizeFromLeft', [
state('small', style({
width: '37rem'
})),
state('large', style({
width: '90vw'
})),
state('fullWidth', style({
width: '100vw'
})),
state('offsetWidth', style({
width: '47rem'
})),
transition('small => large', animate('200ms ease-in')),
transition('large => small', animate('200ms ease-out')),
transition('small => fullWidth', animate('200ms ease-out')),
transition('large => fullWidth', animate('200ms ease-out')),
transition('fullWidth => small', animate('200ms ease-in')),
transition('fullWidth => large', animate('200ms ease-in')),
transition('small => offsetWidth', animate('200ms ease-out')),
transition('offsetWidth => small', animate('200ms ease-in')),
transition('void => *', [
style({ width: '37rem' }),
animate('200ms ease-in')
]),
])
], template: "<div \r\n class=\"hxa-inspector\" \r\n *ngIf=\"location === InspectorLocation.Right\"\r\n [@slideFromRight]=\"state\"\r\n (@slideFromRight.done)=\"slideDone($event)\"\r\n (@slideFromRight.start)=\"slideStart($event)\"\r\n [@sizeFromRight]=\"size\"\r\n (@sizeFromRight.done)=\"sizeDone($event)\"\r\n>\r\n <div class=\"portalHost\"></div>\r\n <a class=\"close right\" [ngClass]=\"{ 'hide': hideClose }\" *ngIf=\"hasClose\" (click)=\"close()\"></a>\r\n</div>\r\n<div \r\n class=\"hxa-inspector\" \r\n *ngIf=\"location === InspectorLocation.Left\"\r\n [@slideFromLeft]=\"state\"\r\n (@slideFromLeft.done)=\"slideDone($event)\"\r\n (@slideFromLeft.start)=\"slideStart($event)\"\r\n [@sizeFromLeft]=\"size\"\r\n (@sizeFromLeft.done)=\"sizeDone($event)\"\r\n>\r\n <div class=\"portalHost\"></div>\r\n <a class=\"close left\" [ngClass]=\"{ 'hide': hideClose }\" *ngIf=\"hasClose\" (click)=\"close()\"></a>\r\n</div>\r\n", styles: [":host{display:block}.hxa-inspector{height:100vh;background-color:#fff}.closeButton{position:absolute;left:-40px;top:0}.close{top:.8rem;width:32px;height:32px;opacity:1;transition:all .25s ease-out;position:absolute}.close.right{left:-3rem}.close.left{right:-3rem}.close:hover{opacity:.3}.close:before,.close:after{position:absolute;left:15px;content:\" \";height:35px;width:3px;background-color:#fff}.close:before{transform:rotate(45deg)}.close:after{transform:rotate(-45deg)}.close.hide:before,.close.hide:after{transform:rotate(0);opacity:0}.portalHost{height:100%}\n"] }]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }, { type: i0.ComponentFactoryResolver }, { type: i0.Injector }, { type: i0.ApplicationRef }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zcGVjdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2h4LXVpL3NyYy9saWIvaW5zcGVjdG9yL2luc3BlY3Rvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9oeC11aS9zcmMvbGliL2luc3BlY3Rvci9pbnNwZWN0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGNBQWMsRUFDZCxTQUFTLEVBQ1Qsd0JBQXdCLEVBQ3hCLFVBQVUsRUFDVixRQUFRLEVBQ1IsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxPQUFPLEVBQ1AsS0FBSyxFQUNMLEtBQUssRUFDTCxPQUFPLEVBQ1AsVUFBVSxFQUNYLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFtQixlQUFlLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNwRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQzs7O0FBeUY1RCxNQUFNLE9BQU8sa0JBQWtCO0lBNkI3QixZQUFvQixVQUFzQixFQUN0QixJQUFZLEVBQ1osd0JBQWtELEVBQ2xELFFBQWtCLEVBQ2xCLE1BQXNCO1FBSnRCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNaLDZCQUF3QixHQUF4Qix3QkFBd0IsQ0FBMEI7UUFDbEQsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixXQUFNLEdBQU4sTUFBTSxDQUFnQjtRQS9CMUMsdUJBQWtCLEdBQUcsSUFBSSxPQUFPLEVBQVcsQ0FBQztRQUM1QyxvQkFBZSxHQUFHLElBQUksT0FBTyxFQUFXLENBQUM7UUFD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QUNmLENBQUMsQ0FBQzs0QkFDSCxLQUFLLENBQUMsT0FBTyxFQUFJLEtBQUssQ0FBQztnQ0FDckIsS0FBSyxFQUFFLE1BQU07NkJBQ2QsQ0FBQyxDQUFDOzRCQUNILEtBQUssQ0FBQyxXQUFXLEVBQUksS0FBSyxDQUFDO2dDQUN6QixLQUFLLEVBQUUsT0FBTzs2QkFDZixDQUFDLENBQUM7NEJBQ0gsS0FBSyxDQUFDLGFBQWEsRUFBSSxLQUFLLENBQUM7Z0NBQzNCLEtBQUssRUFBRSxPQUFPOzZCQUNmLENBQUMsQ0FBQzs0QkFDSCxVQUFVLENBQUMsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDOzRCQUN0RCxVQUFVLENBQUMsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7NEJBQ3ZELFVBQVUsQ0FBQyxvQkFBb0IsRUFBRSxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQzs0QkFDM0QsVUFBVSxDQUFDLG9CQUFvQixFQUFFLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDOzRCQUMzRCxVQUFVLENBQUMsb0JBQW9CLEVBQUUsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDOzRCQUMxRCxVQUFVLENBQUMsb0JBQW9CLEVBQUUsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDOzRCQUMxRCxVQUFVLENBQUMsc0JBQXNCLEVBQUUsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7NEJBQzdELFVBQVUsQ0FBQyxzQkFBc0IsRUFBRSxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7NEJBQzVELFVBQVUsQ0FBQyxXQUFXLEVBQUU7Z0NBQ3RCLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUMsQ0FBQztnQ0FDeEIsT0FBTyxDQUFDLGVBQWUsQ0FBQzs2QkFDekIsQ0FBQzt5QkFDSCxDQUFDO3FCQUNIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBcHBsaWNhdGlvblJlZiwgXHJcbiAgQ29tcG9uZW50LCBcclxuICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIFxyXG4gIEVsZW1lbnRSZWYsIFxyXG4gIEluamVjdG9yLCBcclxuICBOZ1pvbmUsXHJcbiAgT25Jbml0LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIHRyaWdnZXIsXHJcbiAgc3RhdGUsXHJcbiAgc3R5bGUsXHJcbiAgYW5pbWF0ZSxcclxuICB0cmFuc2l0aW9uXHJcbn0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XHJcbmltcG9ydCB7IENvbXBvbmVudFBvcnRhbCwgRG9tUG9ydGFsT3V0bGV0fSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcclxuaW1wb3J0IHtTdWJqZWN0fSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHtJbnNwZWN0b3JTaXplfSBmcm9tICcuL2luc3BlY3Rvci1zaXplLmVudW0nO1xyXG5pbXBvcnQge0luc3BlY3RvckxvY2F0aW9ufSBmcm9tIFwiLi9pbnNwZWN0b3ItbG9jYXRpb24uZW51bVwiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdoeGEtaW5zcGVjdG9yJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vaW5zcGVjdG9yLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9pbnNwZWN0b3IuY29tcG9uZW50LnNjc3MnXSxcclxuICBhbmltYXRpb25zOiBbXHJcbiAgICB0cmlnZ2VyKCdzbGlkZUZyb21SaWdodCcsIFtcclxuICAgICAgc3RhdGUoJ3NsaWRlT3V0Jywgc3R5bGUoe1xyXG4gICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDEwMCUsIDAsIDApJyxcclxuICAgICAgfSkpLFxyXG4gICAgICBzdGF0ZSgnc2xpZGVJbicsICAgc3R5bGUoe1xyXG4gICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJ1xyXG4gICAgICB9KSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ3NsaWRlT3V0ID0+IHNsaWRlSW4nLCBhbmltYXRlKCcyMDBtcyBlYXNlLWluJykpLFxyXG4gICAgICB0cmFuc2l0aW9uKCdzbGlkZUluID0+IHNsaWRlT3V0JywgYW5pbWF0ZSgnMjAwbXMgZWFzZS1vdXQnKSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ3ZvaWQgPT4gKicsIFtcclxuICAgICAgICBzdHlsZSh7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDEwMCUsIDAsIDApJyB9KSxcclxuICAgICAgICBhbmltYXRlKCcyMDBtcyBlYXNlLWluJylcclxuICAgICAgXSksXHJcbiAgICBdKSxcclxuICAgIHRyaWdnZXIoJ3NsaWRlRnJvbUxlZnQnLCBbXHJcbiAgICAgIHN0YXRlKCdzbGlkZU91dCcsIHN0eWxlKHtcclxuICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKC0xMDAlKSdcclxuICAgICAgfSkpLFxyXG4gICAgICBzdGF0ZSgnc2xpZGVJbicsICAgc3R5bGUoe1xyXG4gICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoMCknXHJcbiAgICAgIH0pKSxcclxuICAgICAgdHJhbnNpdGlvbignc2xpZGVPdXQgPT4gc2xpZGVJbicsIGFuaW1hdGUoJzIwMG1zIGVhc2UtaW4nKSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ3NsaWRlSW4gPT4gc2xpZGVPdXQnLCBhbmltYXRlKCcyMDBtcyBlYXNlLW91dCcpKSxcclxuICAgICAgdHJhbnNpdGlvbigndm9pZCA9PiAqJywgW1xyXG4gICAgICAgIHN0eWxlKHt0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKC0xMDAlKSd9KSxcclxuICAgICAgICBhbmltYXRlKCcyMDBtcyBlYXNlLWluJylcclxuICAgICAgXSksXHJcbiAgICBdKSxcclxuICAgIHRyaWdnZXIoJ3NpemVGcm9tUmlnaHQnLCBbXHJcbiAgICAgIHN0YXRlKCdzbWFsbCcsIHN0eWxlKHtcclxuICAgICAgICB3aWR0aDogJzM3cmVtJ1xyXG4gICAgICB9KSksXHJcbiAgICAgIHN0YXRlKCdsYXJnZScsICAgc3R5bGUoe1xyXG4gICAgICAgIHdpZHRoOiAnOTB2dydcclxuICAgICAgfSkpLFxyXG4gICAgICBzdGF0ZSgnZnVsbFdpZHRoJywgICBzdHlsZSh7XHJcbiAgICAgICAgd2lkdGg6ICcxMDB2dydcclxuICAgICAgfSkpLFxyXG4gICAgICBzdGF0ZSgnb2Zmc2V0V2lkdGgnLCAgIHN0eWxlKHtcclxuICAgICAgICB3aWR0aDogJzQ3cmVtJ1xyXG4gICAgICB9KSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ3NtYWxsID0+IGxhcmdlJywgYW5pbWF0ZSgnMjAwbXMgZWFzZS1pbicpKSxcclxuICAgICAgdHJhbnNpdGlvbignbGFyZ2UgPT4gc21hbGwnLCBhbmltYXRlKCcyMDBtcyBlYXNlLW91dCcpKSxcclxuICAgICAgdHJhbnNpdGlvbignc21hbGwgPT4gZnVsbFdpZHRoJywgYW5pbWF0ZSgnMjAwbXMgZWFzZS1vdXQnKSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ2xhcmdlID0+IGZ1bGxXaWR0aCcsIGFuaW1hdGUoJzIwMG1zIGVhc2Utb3V0JykpLFxyXG4gICAgICB0cmFuc2l0aW9uKCdmdWxsV2lkdGggPT4gc21hbGwnLCBhbmltYXRlKCcyMDBtcyBlYXNlLWluJykpLFxyXG4gICAgICB0cmFuc2l0aW9uKCdmdWxsV2lkdGggPT4gbGFyZ2UnLCBhbmltYXRlKCcyMDBtcyBlYXNlLWluJykpLFxyXG4gICAgICB0cmFuc2l0aW9uKCdzbWFsbCA9PiBvZmZzZXRXaWR0aCcsIGFuaW1hdGUoJzIwMG1zIGVhc2Utb3V0JykpLFxyXG4gICAgICB0cmFuc2l0aW9uKCdvZmZzZXRXaWR0aCA9PiBzbWFsbCcsIGFuaW1hdGUoJzIwMG1zIGVhc2UtaW4nKSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ3ZvaWQgPT4gKicsIFtcclxuICAgICAgICBzdHlsZSh7IHdpZHRoOiAnMCd9KSxcclxuICAgICAgICBhbmltYXRlKCcyMDBtcyBlYXNlLWluJylcclxuICAgICAgXSksXHJcbiAgICBdKSxcclxuICAgIHRyaWdnZXIoJ3NpemVGcm9tTGVmdCcsIFtcclxuICAgICAgc3RhdGUoJ3NtYWxsJywgc3R5bGUoe1xyXG4gICAgICAgIHdpZHRoOiAnMzdyZW0nXHJcbiAgICAgIH0pKSxcclxuICAgICAgc3RhdGUoJ2xhcmdlJywgICBzdHlsZSh7XHJcbiAgICAgICAgd2lkdGg6ICc5MHZ3J1xyXG4gICAgICB9KSksXHJcbiAgICAgIHN0YXRlKCdmdWxsV2lkdGgnLCAgIHN0eWxlKHtcclxuICAgICAgICB3aWR0aDogJzEwMHZ3J1xyXG4gICAgICB9KSksXHJcbiAgICAgIHN0YXRlKCdvZmZzZXRXaWR0aCcsICAgc3R5bGUoe1xyXG4gICAgICAgIHdpZHRoOiAnNDdyZW0nXHJcbiAgICAgIH0pKSxcclxuICAgICAgdHJhbnNpdGlvbignc21hbGwgPT4gbGFyZ2UnLCBhbmltYXRlKCcyMDBtcyBlYXNlLWluJykpLFxyXG4gICAgICB0cmFuc2l0aW9uKCdsYXJnZSA9PiBzbWFsbCcsIGFuaW1hdGUoJzIwMG1zIGVhc2Utb3V0JykpLFxyXG4gICAgICB0cmFuc2l0aW9uKCdzbWFsbCA9PiBmdWxsV2lkdGgnLCBhbmltYXRlKCcyMDBtcyBlYXNlLW91dCcpKSxcclxuICAgICAgdHJhbnNpdGlvbignbGFyZ2UgPT4gZnVsbFdpZHRoJywgYW5pbWF0ZSgnMjAwbXMgZWFzZS1vdXQnKSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ2Z1bGxXaWR0aCA9PiBzbWFsbCcsIGFuaW1hdGUoJzIwMG1zIGVhc2UtaW4nKSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ2Z1bGxXaWR0aCA9PiBsYXJnZScsIGFuaW1hdGUoJzIwMG1zIGVhc2UtaW4nKSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ3NtYWxsID0+IG9mZnNldFdpZHRoJywgYW5pbWF0ZSgnMjAwbXMgZWFzZS1vdXQnKSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ29mZnNldFdpZHRoID0+IHNtYWxsJywgYW5pbWF0ZSgnMjAwbXMgZWFzZS1pbicpKSxcclxuICAgICAgdHJhbnNpdGlvbigndm9pZCA9PiAqJywgW1xyXG4gICAgICAgIHN0eWxlKHsgd2lkdGg6ICczN3JlbSd9KSxcclxuICAgICAgICBhbmltYXRlKCcyMDBtcyBlYXNlLWluJylcclxuICAgICAgXSksXHJcbiAgICBdKVxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIEluc3BlY3RvckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gIG9uU2xpZGVJbkNvbXBsZXRlJCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XHJcbiAgb25TbGlkZUluU3RhcnQkID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuICBvblNsaWRlT3V0Q29tcGxldGUkID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuICBvblNsaWRlT3V0U3RhcnQkID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuICBvblJlc2l6ZUNvbXBsZXRlJCA9IG5ldyBTdWJqZWN0PEluc3BlY3RvclNpemU+KCk7XHJcbiAgb25CYWNrRHJvcENsaWNrJCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XHJcbiAgY29tcG9uZW50UG9ydGFsOiBDb21wb25lbnRQb3J0YWw8YW55PjtcclxuICBwYXJhbWV0ZXJzOiBPYmplY3QgPSB7fTtcclxuICBzdGF0ZSA9ICdzbGlkZU91dCc7XHJcbiAgc2l6ZSA9ICdzbWFsbCc7XHJcbiAgc2l6ZXMgPSBbJ3NtYWxsJywgJ2xhcmdlJywgJ29mZnNldFdpZHRoJywgJ2Z1bGxXaWR0aCddO1xyXG4gIHByZXZpb3VzU2l6ZSA9ICdzbWFsbCc7XHJcblxyXG4gIC8qKiBVc2VkIHRvIHRlbXBvcmFyaWx5IGhpZGUgZXh0ZXJuYWwgaWNvbiB3aGVuIGRpc3BsYXlpbmcgbXVsdGlwbGUgaW5zcGVjdG9ycyAqL1xyXG4gIHB1YmxpYyBoaWRlQ2xvc2UgPSBmYWxzZTtcclxuXHJcbiAgLyoqIERvZXMgaW5zcGVjdG9yIGhhdmUgZXh0ZXJuYWwgY2xvc2UgaWNvbj8gKi9cclxuICBwdWJsaWMgaGFzQ2xvc2UgPSB0cnVlO1xyXG5cclxuICAvKiogU2lkZSBvZiBkaXNwbGF5IGluc3BlY3RvciBpcyBsb2NhdGVkICovXHJcbiAgcHVibGljIGxvY2F0aW9uID0gSW5zcGVjdG9yTG9jYXRpb24uUmlnaHQ7XHJcblxyXG4gIHB1YmxpYyBJbnNwZWN0b3JMb2NhdGlvbiA9IEluc3BlY3RvckxvY2F0aW9uO1xyXG5cclxuICBwcml2YXRlIHBvcnRhbEhvc3Q6IERvbVBvcnRhbE91dGxldDtcclxuICBwcml2YXRlIGFuaW1hdGlvbkNvdW50ID0gMDtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgem9uZTogTmdab25lLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBhcHBSZWY6IEFwcGxpY2F0aW9uUmVmKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICBzZXRUaW1lb3V0KCgpPT4ge1xyXG4gICAgICB0aGlzLmF0dGFjaENvbXBvbmVudCgpO1xyXG4gICAgICB0aGlzLnNsaWRlSW4oKTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuXHJcbiAgY2xvc2UgPSAoKSA9PiB7XHJcbiAgICB0aGlzLnNsaWRlT3V0KCk7XHJcbiAgfVxyXG5cclxuICBzbGlkZUluID0gKCkgPT4ge1xyXG4gICAgdGhpcy5zdGF0ZSA9ICdzbGlkZUluJztcclxuICB9XHJcblxyXG4gIHNsaWRlT3V0ID0gKCkgPT4ge1xyXG4gICAgdGhpcy5zdGF0ZSA9ICdzbGlkZU91dCc7XHJcbiAgfVxyXG5cclxuICByZXNpemUoc2l6ZTogSW5zcGVjdG9yU2l6ZSkge1xyXG4gICAgdGhpcy5zaXplID0gdGhpcy5zaXplc1tzaXplXTtcclxuICB9XHJcblxyXG4gIHNsaWRlU3RhcnQgPSAoJGV2ZW50KSA9PiB7XHJcbiAgICBpZiAoJGV2ZW50LmZyb21TdGF0ZSA9PT0gJ3ZvaWQnKSB7XHJcbiAgICAgIHRoaXMub25TbGlkZUluU3RhcnQkLm5leHQodHJ1ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm9uU2xpZGVPdXRTdGFydCQubmV4dCh0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNsaWRlRG9uZSA9ICgkZXZlbnQpID0+IHtcclxuXHJcbiAgICAvLyBpbml0aWFsIHNsaWRlIGluIGRvbmVcclxuICAgIGlmICgkZXZlbnQuZnJvbVN0YXRlID09PSAndm9pZCcpIHtcclxuICAgICAgaWYgKHRoaXMuYW5pbWF0aW9uQ291bnQgPCAxKSB7XHJcbiAgICAgICAgdGhpcy5hbmltYXRpb25Db3VudCsrO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuYWxsQW5pbWF0aW9uc0RvbmUoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIHNsaWRlIG91dCBkb25lXHJcbiAgICBpZiAoJGV2ZW50LmZyb21TdGF0ZSA9PT0gJ3NsaWRlSW4nICYmICRldmVudC50b1N0YXRlID09PSAnc2xpZGVPdXQnKSB7XHJcbiAgICAgIHRoaXMub25TbGlkZU91dENvbXBsZXRlJC5uZXh0KHRydWUpO1xyXG4gICAgICB0aGlzLmRldGFjaENvbXBvbmVudCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2l6ZURvbmUgPSAoJGV2ZW50KSA9PiB7XHJcblxyXG4gICAgLy8gaW5pdGlhbCBzaXplIGFuaW1hdGlvblxyXG4gICAgaWYgKCRldmVudC5mcm9tU3RhdGUgPT09ICd2b2lkJykge1xyXG4gICAgICBpZiAodGhpcy5hbmltYXRpb25Db3VudCA8IDEpIHtcclxuICAgICAgICB0aGlzLmFuaW1hdGlvbkNvdW50Kys7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5hbGxBbmltYXRpb25zRG9uZSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gc2l6ZSBkb25lXHJcbiAgICBpZiAoKCRldmVudC5mcm9tU3RhdGUgPT09ICdzbWFsbCcgJiYgJGV2ZW50LnRvU3RhdGUgPT09ICdsYXJnZScpIHx8ICgkZXZlbnQuZnJvbVN0YXRlID09PSAnbGFyZ2UnICYmICRldmVudC50b1N0YXRlID09PSAnc21hbGwnKSkge1xyXG4gICAgICB0aGlzLm9uUmVzaXplQ29tcGxldGUkLm5leHQoKCRldmVudC50b1N0YXRlID09PSAnbGFyZ2UnKSA/IEluc3BlY3RvclNpemUuTGFyZ2UgOiBJbnNwZWN0b3JTaXplLlNtYWxsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFsbEFuaW1hdGlvbnNEb25lKCkge1xyXG4gICAgdGhpcy5hbmltYXRpb25Db3VudCA9IDA7XHJcbiAgICB0aGlzLm9uU2xpZGVJbkNvbXBsZXRlJC5uZXh0KHRydWUpO1xyXG4gIH1cclxuXHJcblxyXG4gIGF0dGFjaENvbXBvbmVudCgpIHtcclxuICAgIC8vIENyZWF0ZSBhIHBvcnRhbEhvc3QgZnJvbSBhIERPTSBlbGVtZW50XHJcbiAgICB0aGlzLnBvcnRhbEhvc3QgPSBuZXcgRG9tUG9ydGFsT3V0bGV0KFxyXG4gICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcucG9ydGFsSG9zdCcpLFxyXG4gICAgICB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcclxuICAgICAgdGhpcy5hcHBSZWYsXHJcbiAgICAgIHRoaXMuaW5qZWN0b3JcclxuICAgICk7XHJcblxyXG4gICAgLy8gQXR0YWNoIHBvcnRhbCB0byBob3N0XHJcbiAgICBjb25zdCBjb21wb25lbnRSZWYgPSAgdGhpcy5wb3J0YWxIb3N0LmF0dGFjaCh0aGlzLmNvbXBvbmVudFBvcnRhbCk7XHJcblxyXG4gICAgLy8gcGFzcyB0aGUgQElucHV0IHBhcmFtZXRlcnMgdG8gdGhlIGluc3RhbmNlXHJcbiAgICBPYmplY3QuYXNzaWduKGNvbXBvbmVudFJlZi5pbnN0YW5jZSwgdGhpcy5wYXJhbWV0ZXJzKTtcclxuICB9XHJcblxyXG4gIGRldGFjaENvbXBvbmVudCgpe1xyXG4gICAgdGhpcy5wb3J0YWxIb3N0LmRldGFjaCgpO1xyXG4gIH1cclxuXHJcbiAgb25CYWNrZHJvcENsaWNrKCl7XHJcbiAgICB0aGlzLm9uQmFja0Ryb3BDbGljayQubmV4dCh0cnVlKTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBcclxuICBjbGFzcz1cImh4YS1pbnNwZWN0b3JcIiBcclxuICAqbmdJZj1cImxvY2F0aW9uID09PSBJbnNwZWN0b3JMb2NhdGlvbi5SaWdodFwiXHJcbiAgW0BzbGlkZUZyb21SaWdodF09XCJzdGF0ZVwiXHJcbiAgKEBzbGlkZUZyb21SaWdodC5kb25lKT1cInNsaWRlRG9uZSgkZXZlbnQpXCJcclxuICAoQHNsaWRlRnJvbVJpZ2h0LnN0YXJ0KT1cInNsaWRlU3RhcnQoJGV2ZW50KVwiXHJcbiAgW0BzaXplRnJvbVJpZ2h0XT1cInNpemVcIlxyXG4gIChAc2l6ZUZyb21SaWdodC5kb25lKT1cInNpemVEb25lKCRldmVudClcIlxyXG4+XHJcbiAgPGRpdiBjbGFzcz1cInBvcnRhbEhvc3RcIj48L2Rpdj5cclxuICA8YSBjbGFzcz1cImNsb3NlIHJpZ2h0XCIgW25nQ2xhc3NdPVwieyAnaGlkZSc6IGhpZGVDbG9zZSB9XCIgKm5nSWY9XCJoYXNDbG9zZVwiIChjbGljayk9XCJjbG9zZSgpXCI+PC9hPlxyXG48L2Rpdj5cclxuPGRpdiBcclxuICBjbGFzcz1cImh4YS1pbnNwZWN0b3JcIiBcclxuICAqbmdJZj1cImxvY2F0aW9uID09PSBJbnNwZWN0b3JMb2NhdGlvbi5MZWZ0XCJcclxuICBbQHNsaWRlRnJvbUxlZnRdPVwic3RhdGVcIlxyXG4gIChAc2xpZGVGcm9tTGVmdC5kb25lKT1cInNsaWRlRG9uZSgkZXZlbnQpXCJcclxuICAoQHNsaWRlRnJvbUxlZnQuc3RhcnQpPVwic2xpZGVTdGFydCgkZXZlbnQpXCJcclxuICBbQHNpemVGcm9tTGVmdF09XCJzaXplXCJcclxuICAoQHNpemVGcm9tTGVmdC5kb25lKT1cInNpemVEb25lKCRldmVudClcIlxyXG4+XHJcbiAgPGRpdiBjbGFzcz1cInBvcnRhbEhvc3RcIj48L2Rpdj5cclxuICA8YSBjbGFzcz1cImNsb3NlIGxlZnRcIiBbbmdDbGFzc109XCJ7ICdoaWRlJzogaGlkZUNsb3NlIH1cIiAqbmdJZj1cImhhc0Nsb3NlXCIgKGNsaWNrKT1cImNsb3NlKClcIj48L2E+XHJcbjwvZGl2PlxyXG4iXX0=