angular-gallery
Version:
Responsive gallery for Angular with touch screen support.
333 lines • 40 kB
JavaScript
import { __decorate } from "tslib";
import { ChangeDetectorRef, Component, ElementRef, EventEmitter, HostBinding, HostListener, Input, Output, OnDestroy, SimpleChanges } from '@angular/core';
import { Touches } from './touches';
import { Carousel } from './carousel';
import { EventService as OverlayEventService } from './overlay/event.service';
let CarouselComponent = class CarouselComponent {
constructor(elementRef, ref, overlayEventService) {
this.elementRef = elementRef;
this.ref = ref;
this.overlayEventService = overlayEventService;
this.minTimeout = 30;
this._cellWidth = 200;
this._transitionDuration = 200;
this.events = new EventEmitter();
this.height = 200;
this.margin = 10;
this.objectFit = 'cover';
this.minSwipeDistance = 50;
this.transitionTimingFunction = 'ease';
this.counterSeparator = " / ";
this.overflowCellsLimit = 3;
this.listeners = 'mouse and touch';
this.arrows = true;
this.arrowsTheme = 'light';
this.hostClassCarousel = true;
/* Touchstart */
this.handleTouchstart = (event) => {
event.preventDefault();
this.carousel.handleTouchstart(event);
this.isMoving = true;
this.events.emit({
type: 'touchstart',
event
});
};
/* Touchmove */
this.handleHorizontalSwipe = (event) => {
event.preventDefault();
this.carousel.handleHorizontalSwipe(event);
this.events.emit({
type: 'swipe',
event
});
};
/* Touchend */
this.handleTouchend = (event) => {
const touches = event.touches;
this.carousel.handleTouchend(event);
this.isMoving = false;
this.events.emit({
type: 'touchend',
event
});
};
/* Tap */
this.handleTap = (event) => {
const i = this.carousel.slideCounter;
const cellIndex = this.carousel.currentCellIndex;
const fileIndex = this.carousel.getFileIndex(i);
const file = this.carousel.getFile(cellIndex);
this.events.emit({
type: 'click',
file: file,
index: fileIndex
});
};
}
get isLandscape() {
return window.innerWidth > window.innerHeight;
}
get isSafari() {
const ua = navigator.userAgent.toLowerCase();
if (ua.indexOf('safari') !== -1) {
return !(ua.indexOf('chrome') > -1);
}
}
get counter() {
return this.carousel.slideCounter + 1 + this.counterSeparator + this.images.length;
}
set images(images) {
this._images = images;
}
get images() {
return this._images;
}
get isNgContent() {
return this.elementRef.nativeElement.querySelector('.carousel-content-wrapper').children.length > 0;
}
set transitionDuration(value) {
this._transitionDuration = value;
}
get transitionDuration() {
if (this._transitionDuration === 0) {
return 1;
}
else {
return this._transitionDuration;
}
}
set cellWidth(value) {
if (value) {
this._cellWidth = value;
}
}
set isCounter(value) {
if (value) {
this._isCounter = value;
}
}
get isCounter() {
return this._isCounter && this.images.length > 1;
}
set overlayProperties(properties) {
this._properties = properties;
this._images = this._properties.metadata.images;
this._cellWidth = this._properties.metadata.width;
this.height = this._properties.metadata.height;
this.objectFit = this._properties.metadata.objectFit;
this.margin = this._properties.metadata.margin;
this.transitionDuration = this._properties.metadata.transitionDuration;
this.overflowCellsLimit = this._properties.metadata.overflowCellsLimit;
this.minSwipeDistance = this._properties.metadata.minSwipeDistance;
this.transitionTimingFunction = this._properties.metadata.transitionTimingFunction;
this._isCounter = this._properties.metadata.counter;
this.counterSeparator = this._properties.metadata.counterSeparator;
this.arrows = this._properties.metadata.arrows;
}
get properties() {
return this._properties;
}
get cellLimit() {
if (this.carousel) {
return this.carousel.cellLimit;
}
}
onWindowResize(event) {
this.landscapeMode = this.isLandscape;
this.ref.detectChanges();
this.initCarousel();
this.carousel.lineUpCells();
}
ngOnInit() {
this.touches = new Touches({
element: this.elementRef.nativeElement.querySelector('.carousel-cells'),
listeners: this.listeners
});
this.touches.on('touchstart', this.handleTouchstart);
this.touches.on('horizontal-swipe', this.handleHorizontalSwipe);
this.touches.on('touchend', this.handleTouchend);
this.touches.on('mousedown', this.handleTouchstart);
this.touches.on('mouseup', this.handleTouchend);
this.touches.on('tap', this.handleTap);
this.initCarousel();
this.setDimensions();
this.setInitialIndex();
}
ngAfterViewInit() {
this.carousel.lineUpCells();
}
ngOnChanges(changes) {
if (changes.width || changes.height) {
this.setDimensions();
this.initCarousel();
this.carousel.lineUpCells();
}
}
ngOnDestroy() {
this.touches.destroy();
}
initCarousel() {
this.carousel = new Carousel({
element: this.elementRef.nativeElement.querySelector('.carousel-cells'),
container: this.elementRef.nativeElement,
images: this.images,
cellWidth: this.getCellWidth(),
overflowCellsLimit: this.overflowCellsLimit,
visibleWidth: this.width,
margin: this.margin,
minSwipeDistance: this.minSwipeDistance,
transitionDuration: this.transitionDuration,
transitionTimingFunction: this.transitionTimingFunction,
videoProperties: this.videoProperties
});
}
setDimensions() {
this.hostStyleHeight = this.height + 'px';
this.hostStyleWidth = this.width + 'px';
}
getFile(index) {
return this.carousel.getFile(index);
}
handleTransitionendCellContainer(event) {
this.carousel.handleSlideEnd();
}
toggleVideo(video) {
event.preventDefault();
if (this.videoProperties.noPlay) {
return;
}
if (video.paused) {
video.play();
this.isVideoPlaying = true;
}
else {
video.pause();
this.isVideoPlaying = false;
}
this.ref.detectChanges();
}
getCurrentIndex() {
return this.carousel.slideCounter;
}
getCellWidth() {
if (this._cellWidth === '100%') {
return this.elementRef.nativeElement.clientWidth;
}
else {
return this._cellWidth;
}
}
next() {
this.carousel.next(1);
}
prev() {
this.carousel.prev(1);
}
select(index) {
this.carousel.select(index);
}
isNextArrowDisabled() {
return this.carousel.isNextArrowDisabled();
}
isPrevArrowDisabled() {
return this.carousel.isPrevArrowDisabled();
}
close() {
this.overlayEventService.emitChangeEvent({
type: 'Hide'
});
}
setInitialIndex() {
if (this._properties.metadata.index != undefined) {
this.select(this._properties.metadata.index);
}
}
};
CarouselComponent.ctorParameters = () => [
{ type: ElementRef },
{ type: ChangeDetectorRef },
{ type: OverlayEventService }
];
__decorate([
Input()
], CarouselComponent.prototype, "images", null);
__decorate([
Output()
], CarouselComponent.prototype, "events", void 0);
__decorate([
Input()
], CarouselComponent.prototype, "height", void 0);
__decorate([
Input()
], CarouselComponent.prototype, "width", void 0);
__decorate([
Input()
], CarouselComponent.prototype, "borderRadius", void 0);
__decorate([
Input()
], CarouselComponent.prototype, "margin", void 0);
__decorate([
Input()
], CarouselComponent.prototype, "objectFit", void 0);
__decorate([
Input()
], CarouselComponent.prototype, "minSwipeDistance", void 0);
__decorate([
Input()
], CarouselComponent.prototype, "transitionDuration", null);
__decorate([
Input()
], CarouselComponent.prototype, "transitionTimingFunction", void 0);
__decorate([
Input()
], CarouselComponent.prototype, "videoProperties", void 0);
__decorate([
Input()
], CarouselComponent.prototype, "counterSeparator", void 0);
__decorate([
Input()
], CarouselComponent.prototype, "overflowCellsLimit", void 0);
__decorate([
Input()
], CarouselComponent.prototype, "listeners", void 0);
__decorate([
Input('cellWidth')
], CarouselComponent.prototype, "cellWidth", null);
__decorate([
Input('counter')
], CarouselComponent.prototype, "isCounter", null);
__decorate([
Input()
], CarouselComponent.prototype, "arrows", void 0);
__decorate([
Input()
], CarouselComponent.prototype, "arrowsOutside", void 0);
__decorate([
Input()
], CarouselComponent.prototype, "arrowsTheme", void 0);
__decorate([
Input()
], CarouselComponent.prototype, "overlayProperties", null);
__decorate([
HostBinding('class.carousel')
], CarouselComponent.prototype, "hostClassCarousel", void 0);
__decorate([
HostBinding('style.height')
], CarouselComponent.prototype, "hostStyleHeight", void 0);
__decorate([
HostBinding('style.width')
], CarouselComponent.prototype, "hostStyleWidth", void 0);
__decorate([
HostListener('window:resize', ['$event'])
], CarouselComponent.prototype, "onWindowResize", null);
CarouselComponent = __decorate([
Component({
selector: 'carousel, [carousel]',
exportAs: 'carousel',
template: "<div class=\"carousel-backdrop\"></div>\n\n<div class=\"carousel-close\" (click)=\"close()\"></div>\n\n<div class=\"carousel-counter\" *ngIf=\"isCounter\">{{counter}}</div>\n\n<div class=\"carousel-container\" [class.carousel-moving]=\"isMoving\">\n\t<div class=\"carousel-cells\" (transitionend)=\"handleTransitionendCellContainer($event)\">\n\t\t<ng-template ngFor let-image [ngForOf]=\"images\" let-i=\"index\">\n\t\t\t<div class=\"carousel-cell\" \n\t\t\t\t*ngIf=\"i < cellLimit\" \n\t\t\t\t[style.width]=\"getCellWidth()+'px'\"\n\t\t\t\t[style.border-radius]=\"borderRadius+'px'\">\n\t\t\t\t<!-- Image -->\n\t\t\t\t<img \n\t\t\t\t\t*ngIf=\"getFile(i) && getFile(i)['image']\" \n\t\t\t\t\t[src]=\"getFile(i)['image']['path']\"\n\t\t\t\t\t[style.object-fit]=\"objectFit\"\n\t\t\t\t\tdraggable=\"false\" />\n\n\t\t\t\t<!-- Video -->\n\t\t\t\t<ng-template [ngIf]=\"getFile(i) && getFile(i)['type'] === 'video'\">\n\t\t\t\t\t<div class=\"carousel-play\" (click)=\"toggleVideo(video)\"></div>\n\n\t\t\t\t\t<video #video\n\t\t\t\t\t\t[loop]=\"videoProperties.loop\"\n\t\t\t\t\t\t[muted]=\"videoProperties.muted\"\n\t\t\t\t\t\t[controls]=\"isSafari\"\n\t\t\t\t\t\t[style.object-fit]=\"objectFit\"\n\t\t\t\t\t\t[style.border-radius]=\"borderRadius+'px'\">\n\t\t\t\t\t\t\n\t\t\t\t\t\t<source [src]=\"getFile(i)['path']\" type=\"video/mp4\">\n\t\t\t\t\t</video>\n\t\t\t\t</ng-template>\n\t\t\t</div>\n\t\t</ng-template>\n\t</div>\n</div>\n\n<div class=\"carousel-arrows\" \n\t[class.carousel-arrows-outside]=\"arrowsOutside\" \n\t[class.carousel-dark-arrows]=\"arrowsTheme === 'dark'\"\n\t*ngIf=\"arrows\">\n\t\n\t<div class=\"carousel-arrow carousel-arrow-prev\" [class.carousel-arrow-disabled]=\"isPrevArrowDisabled()\" (click)=\"prev()\"></div>\n\t<div class=\"carousel-arrow carousel-arrow-next\" [class.carousel-arrow-disabled]=\"isNextArrowDisabled()\" (click)=\"next()\"></div>\n</div>",
styles: [":host{position:relative;display:block;top:0;left:0;width:100%;height:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:10000;transform-origin:top left;box-sizing:border-box}:host .carousel-container{overflow:hidden;width:100%;height:100%;cursor:-webkit-grab;cursor:grab}:host .carousel-container.carousel-moving{cursor:-webkit-grabbing;cursor:grabbing}:host .carousel-counter{text-align:right;position:absolute;z-index:30;transition:opacity .2s;top:15px;left:10px;border-radius:13px;background-color:rgba(23,37,68,.3);font-size:13px;color:#fff;padding:5px 7px;line-height:initial}:host .carousel-cells{transition:transform .2s;width:100%;height:100%;display:block}:host .carousel-cells ::ng-deep .carousel-cell.swiper-prev-image{transform:translate3d(-100%,0,0)}:host .carousel-cells ::ng-deep .carousel-cell.swiper-next-image{transform:translate3d(100%,0,0)}:host .carousel-cells ::ng-deep .carousel-cell{width:100%;height:100%;text-align:center;position:absolute;display:flex;align-items:center;justify-content:center;overflow:hidden}:host .carousel-cells ::ng-deep .carousel-cell img,:host .carousel-cells ::ng-deep .carousel-cell video{width:100%;height:100%;position:relative;-o-object-fit:contain;object-fit:contain}:host .carousel-cells ::ng-deep .carousel-cell img.swiper-hide{display:none}:host .carousel-cells ::ng-deep .carousel-cell .carousel-play{position:absolute;top:0;left:0;bottom:0;right:0;z-index:1}:host .carousel-arrow{width:40px;height:40px;background-color:#fff;background-repeat:no-repeat;background-size:31px;background-position:center;border-radius:100px;position:absolute;top:50%;margin-top:-20px;z-index:10;cursor:pointer;box-shadow:0 0 5px rgba(0,0,0,.15)}:host .carousel-arrow-prev{left:10px;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0Ij48cGF0aCBkPSJNMTUuNDEgMTYuNTlMMTAuODMgMTJsNC41OC00LjU5TDE0IDZsLTYgNiA2IDYgMS40MS0xLjQxeiIvPjxwYXRoIGQ9Ik0wIDBoMjR2MjRIMFYweiIgZmlsbD0ibm9uZSIvPjwvc3ZnPg==)}:host .carousel-arrow-next{right:10px;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0Ij48cGF0aCBkPSJNOC41OSAxNi41OUwxMy4xNyAxMiA4LjU5IDcuNDEgMTAgNmw2IDYtNiA2LTEuNDEtMS40MXoiLz48cGF0aCBkPSJNMCAwaDI0djI0SDBWMHoiIGZpbGw9Im5vbmUiLz48L3N2Zz4=)}:host .carousel-arrows-outside .carousel-arrow-prev{left:-60px}:host .carousel-arrows-outside .carousel-arrow-next{right:-60px}:host .carousel-dark-arrows .carousel-arrow{-webkit-filter:invert(1);filter:invert(1)}:host .carousel-arrow-disabled{cursor:default;opacity:.5}:host .carousel-close{position:fixed;top:10px;right:10px;width:40px;height:40px;z-index:100;cursor:pointer;background-repeat:no-repeat;background-size:31px;background-position:center;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0Ij48cGF0aCBkPSJNMTkgNi40MUwxNy41OSA1IDEyIDEwLjU5IDYuNDEgNSA1IDYuNDEgMTAuNTkgMTIgNSAxNy41OSA2LjQxIDE5IDEyIDEzLjQxIDE3LjU5IDE5IDE5IDE3LjU5IDEzLjQxIDEyeiIvPjxwYXRoIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz48L3N2Zz4=);-webkit-filter:invert(1);filter:invert(1)}:host .carousel-backdrop{position:fixed;top:0;left:0;right:0;bottom:0;background-color:#000;opacity:.5}"]
})
], CarouselComponent);
export { CarouselComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2Fyb3VzZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vYW5ndWxhci1nYWxsZXJ5LyIsInNvdXJjZXMiOlsibGliL2Nhcm91c2VsLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBR3pKLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUVwQyxPQUFPLEVBQUMsWUFBWSxJQUFJLG1CQUFtQixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFVNUUsSUFBYSxpQkFBaUIsR0FBOUIsTUFBYSxpQkFBaUI7SUErSDFCLFlBQ1ksVUFBc0IsRUFDdEIsR0FBc0IsRUFDdEIsbUJBQXdDO1FBRnhDLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDdEIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQTVIcEQsZUFBVSxHQUFHLEVBQUUsQ0FBQztRQUloQixlQUFVLEdBQW9CLEdBQUcsQ0FBQztRQUdsQyx3QkFBbUIsR0FBVyxHQUFHLENBQUM7UUE2QnhCLFdBQU0sR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUVyRCxXQUFNLEdBQVcsR0FBRyxDQUFDO1FBR3JCLFdBQU0sR0FBVyxFQUFFLENBQUM7UUFDcEIsY0FBUyxHQUFpQyxPQUFPLENBQUM7UUFDbEQscUJBQWdCLEdBQVcsRUFBRSxDQUFDO1FBYzlCLDZCQUF3QixHQUErRCxNQUFNLENBQUM7UUFFOUYscUJBQWdCLEdBQVcsS0FBSyxDQUFDO1FBQ2pDLHVCQUFrQixHQUFXLENBQUMsQ0FBQztRQUMvQixjQUFT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SUFBUixLQUFLLEVBQUU7aURBQXdCO0FBQ3ZCO0lBQVIsS0FBSyxFQUFFO3dEQUF3QjtBQUN2QjtJQUFSLEtBQUssRUFBRTtzREFBeUM7QUFFeEM7SUFBUixLQUFLLEVBQUU7MERBY1A7QUFZOEI7SUFBOUIsV0FBVyxDQUFDLGdCQUFnQixDQUFDOzREQUFtQztBQUNwQztJQUE1QixXQUFXLENBQUMsY0FBYyxDQUFDOzBEQUF5QjtBQUN6QjtJQUEzQixXQUFXLENBQUMsYUFBYSxDQUFDO3lEQUF3QjtBQUduRDtJQURDLFlBQVksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQzt1REFPekM7QUE3SFEsaUJBQWlCO0lBUDdCLFNBQVMsQ0FBQztRQUNWLFFBQVEsRUFBRSxzQkFBc0I7UUFDN0IsUUFBUSxFQUFFLFVBQVU7UUFDdkIsMDJEQUF3Qzs7S0FFeEMsQ0FBQztHQUVXLGlCQUFpQixDQThTN0I7U0E5U1ksaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEhvc3RCaW5kaW5nLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPdXRwdXQsIE9uRGVzdHJveSwgU2ltcGxlQ2hhbmdlc30gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7SW1hZ2VzfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHtUb3VjaGVzfSBmcm9tICcuL3RvdWNoZXMnO1xuaW1wb3J0IHtDYXJvdXNlbH0gZnJvbSAnLi9jYXJvdXNlbCc7XG5pbXBvcnQge092ZXJsYXlQcm9wZXJ0aWVzfSBmcm9tICcuL292ZXJsYXkvaW50ZXJmYWNlcyc7XG5pbXBvcnQge0V2ZW50U2VydmljZSBhcyBPdmVybGF5RXZlbnRTZXJ2aWNlfSBmcm9tICcuL292ZXJsYXkvZXZlbnQuc2VydmljZSc7IFxuXG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ2Nhcm91c2VsLCBbY2Fyb3VzZWxdJyxcbiAgICBleHBvcnRBczogJ2Nhcm91c2VsJyxcblx0dGVtcGxhdGVVcmw6ICcuL2Nhcm91c2VsLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9jYXJvdXNlbC5jb21wb25lbnQuc2FzcyddXG59KVxuXG5leHBvcnQgY2xhc3MgQ2Fyb3VzZWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICAgIF9pZDogc3RyaW5nO1xuICAgIF9pbWFnZXM6IEltYWdlcztcbiAgICB0b3VjaGVzOiBhbnk7XG4gICAgY2Fyb3VzZWw6IGFueTtcbiAgICBsYW5kc2NhcGVNb2RlOiBhbnk7XG4gICAgbWluVGltZW91dCA9IDMwO1xuICAgIGlzVmlkZW9QbGF5aW5nOiBib29sZWFuO1xuICAgIF9pc0NvdW50ZXI6IGJvb2xlYW47XG4gICAgX3dpZHRoOiBudW1iZXI7XG4gICAgX2NlbGxXaWR0aDogbnVtYmVyIHwgJzEwMCUnID0gMjAwO1xuICAgIGlzTW92aW5nOiBib29sZWFuO1xuICAgIF9wcm9wZXJ0aWVzOiBPdmVybGF5UHJvcGVydGllcztcbiAgICBfdHJhbnNpdGlvbkR1cmF0aW9uOiBudW1iZXIgPSAyMDA7XG5cbiAgICBnZXQgaXNMYW5kc2NhcGUoKXtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5pbm5lcldpZHRoID4gd2luZG93LmlubmVySGVpZ2h0O1xuICAgIH1cblxuICAgIGdldCBpc1NhZmFyaSgpOiBhbnkge1xuICAgICAgICBjb25zdCB1YSA9IG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKHVhLmluZGV4T2YoJ3NhZmFyaScpICE9PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuICEodWEuaW5kZXhPZignY2hyb21lJykgPiAtMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgY291bnRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2Fyb3VzZWwuc2xpZGVDb3VudGVyICsgMSArIHRoaXMuY291bnRlclNlcGFyYXRvciArIHRoaXMuaW1hZ2VzLmxlbmd0aDtcbiAgICB9XG5cbiAgICBASW5wdXQoKVxuICAgIHNldCBpbWFnZXMoaW1hZ2VzOiBJbWFnZXMgJiBhbnkpIHtcbiAgICAgICAgdGhpcy5faW1hZ2VzID0gaW1hZ2VzO1xuICAgIH1cbiAgICBnZXQgaW1hZ2VzKCl7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbWFnZXM7XG4gICAgfVxuXG4gICAgZ2V0IGlzTmdDb250ZW50KCl7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuY2Fyb3VzZWwtY29udGVudC13cmFwcGVyJykuY2hpbGRyZW4ubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICBAT3V0cHV0KCkgZXZlbnRzOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gICAgQElucHV0KCkgaGVpZ2h0OiBudW1iZXIgPSAyMDA7XG4gICAgQElucHV0KCkgd2lkdGg6IG51bWJlcjtcbiAgICBASW5wdXQoKSBib3JkZXJSYWRpdXM6IG51bWJlcjtcbiAgICBASW5wdXQoKSBtYXJnaW46IG51bWJlciA9IDEwO1xuICAgIEBJbnB1dCgpIG9iamVjdEZpdDogJ2NvbnRhaW4nIHwgJ2NvdmVyJyB8ICdub25lJyA9ICdjb3Zlcic7XG4gICAgQElucHV0KCkgbWluU3dpcGVEaXN0YW5jZTogbnVtYmVyID0gNTA7XG5cbiAgICBASW5wdXQoKVxuICAgIHNldCB0cmFuc2l0aW9uRHVyYXRpb24odmFsdWU6IG51bWJlcikge1xuICAgICAgICB0aGlzLl90cmFuc2l0aW9uRHVyYXRpb24gPSB2YWx1ZTtcbiAgICB9XG4gICAgZ2V0IHRyYW5zaXRpb25EdXJhdGlvbigpe1xuICAgICAgICBpZiAodGhpcy5fdHJhbnNpdGlvbkR1cmF0aW9uID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc2l0aW9uRHVyYXRpb247XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASW5wdXQoKSB0cmFuc2l0aW9uVGltaW5nRnVuY3Rpb246ICdlYXNlJyB8ICdlYXNlLWluJyB8ICdlYXNlLW91dCcgfCAnZWFzZS1pbi1vdXQnIHwgJ2xpbmVhcicgPSAnZWFzZSc7XG4gICAgQElucHV0KCkgdmlkZW9Qcm9wZXJ0aWVzOiBhbnk7XG4gICAgQElucHV0KCkgY291bnRlclNlcGFyYXRvcjogc3RyaW5nID0gXCIgLyBcIjtcbiAgICBASW5wdXQoKSBvdmVyZmxvd0NlbGxzTGltaXQ6IG51bWJlciA9IDM7XG4gICAgQElucHV0KCkgbGlzdGVuZXJzOiAnYXV0bycgfCAnbW91c2UgYW5kIHRvdWNoJyA9ICdtb3VzZSBhbmQgdG91Y2gnO1xuXG4gICAgQElucHV0KCdjZWxsV2lkdGgnKSBzZXQgY2VsbFdpZHRoKHZhbHVlOiBudW1iZXIgfCAnMTAwJScpIHtcbiAgICAgICAgaWYgKHZhbHVlKXtcbiAgICAgICAgICAgIHRoaXMuX2NlbGxXaWR0aCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQElucHV0KCdjb3VudGVyJykgc2V0IGlzQ291bnRlcih2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAodmFsdWUpe1xuICAgICAgICAgICAgdGhpcy5faXNDb3VudGVyID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGlzQ291bnRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzQ291bnRlciAmJiB0aGlzLmltYWdlcy5sZW5ndGggPiAxO1xuICAgIH1cblxuICAgIEBJbnB1dCgpIGFycm93czogYm9vbGVhbiA9IHRydWU7XG4gICAgQElucHV0KCkgYXJyb3dzT3V0c2lkZTogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBhcnJvd3NUaGVtZTogJ2xpZ2h0JyB8ICdkYXJrJyA9ICdsaWdodCc7XG5cbiAgICBASW5wdXQoKSBzZXQgb3ZlcmxheVByb3BlcnRpZXMgKHByb3BlcnRpZXM6IE92ZXJsYXlQcm9wZXJ0aWVzKSB7XG4gICAgICAgIHRoaXMuX3Byb3BlcnRpZXMgPSBwcm9wZXJ0aWVzO1xuICAgICAgICB0aGlzLl9pbWFnZXMgPSB0aGlzLl9wcm9wZXJ0aWVzLm1ldGFkYXRhLmltYWdlcztcbiAgICAgICAgdGhpcy5fY2VsbFdpZHRoID0gdGhpcy5fcHJvcGVydGllcy5tZXRhZGF0YS53aWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSB0aGlzLl9wcm9wZXJ0aWVzLm1ldGFkYXRhLmhlaWdodDtcbiAgICAgICAgdGhpcy5vYmplY3RGaXQgPSB0aGlzLl9wcm9wZXJ0aWVzLm1ldGFkYXRhLm9iamVjdEZpdDtcbiAgICAgICAgdGhpcy5tYXJnaW4gPSB0aGlzLl9wcm9wZXJ0aWVzLm1ldGFkYXRhLm1hcmdpbjtcbiAgICAgICAgdGhpcy50cmFuc2l0aW9uRHVyYXRpb24gPSB0aGlzLl9wcm9wZXJ0aWVzLm1ldGFkYXRhLnRyYW5zaXRpb25EdXJhdGlvbjtcbiAgICAgICAgdGhpcy5vdmVyZmxvd0NlbGxzTGltaXQgPSB0aGlzLl9wcm9wZXJ0aWVzLm1ldGFkYXRhLm92ZXJmbG93Q2VsbHNMaW1pdDtcbiAgICAgICAgdGhpcy5taW5Td2lwZURpc3RhbmNlID0gdGhpcy5fcHJvcGVydGllcy5tZXRhZGF0YS5taW5Td2lwZURpc3RhbmNlO1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25UaW1pbmdGdW5jdGlvbiA9IHRoaXMuX3Byb3BlcnRpZXMubWV0YWRhdGEudHJhbnNpdGlvblRpbWluZ0Z1bmN0aW9uO1xuICAgICAgICB0aGlzLl9pc0NvdW50ZXIgPSB0aGlzLl9wcm9wZXJ0aWVzLm1ldGFkYXRhLmNvdW50ZXI7XG4gICAgICAgIHRoaXMuY291bnRlclNlcGFyYXRvciA9IHRoaXMuX3Byb3BlcnRpZXMubWV0YWRhdGEuY291bnRlclNlcGFyYXRvcjtcbiAgICAgICAgdGhpcy5hcnJvd3MgPSB0aGlzLl9wcm9wZXJ0aWVzLm1ldGFkYXRhLmFycm93cztcbiAgICB9XG5cbiAgICBnZXQgcHJvcGVydGllcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Byb3BlcnRpZXM7XG4gICAgfVxuXG4gICAgZ2V0IGNlbGxMaW1pdCgpIHtcbiAgICAgICAgaWYgKHRoaXMuY2Fyb3VzZWwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNhcm91c2VsLmNlbGxMaW1pdDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuY2Fyb3VzZWwnKSBob3N0Q2xhc3NDYXJvdXNlbDogYm9vbGVhbiA9IHRydWU7XG4gICAgQEhvc3RCaW5kaW5nKCdzdHlsZS5oZWlnaHQnKSBob3N0U3R5bGVIZWlnaHQ6IHN0cmluZztcbiAgICBASG9zdEJpbmRpbmcoJ3N0eWxlLndpZHRoJykgaG9zdFN0eWxlV2lkdGg6IHN0cmluZztcblxuICAgIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnLCBbJyRldmVudCddKVxuICAgIG9uV2luZG93UmVzaXplKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgdGhpcy5sYW5kc2NhcGVNb2RlID0gdGhpcy5pc0xhbmRzY2FwZTtcbiAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgICAgIHRoaXMuaW5pdENhcm91c2VsKCk7XG4gICAgICAgIHRoaXMuY2Fyb3VzZWwubGluZVVwQ2VsbHMoKTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLCBcbiAgICAgICAgcHJpdmF0ZSByZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwcml2YXRlIG92ZXJsYXlFdmVudFNlcnZpY2U6IE92ZXJsYXlFdmVudFNlcnZpY2Upe1xuICAgIH1cblxuICAgIG5nT25Jbml0KCl7XG4gICAgICAgIHRoaXMudG91Y2hlcyA9IG5ldyBUb3VjaGVzKHtcbiAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jYXJvdXNlbC1jZWxscycpLFxuICAgICAgICAgICAgbGlzdGVuZXJzOiB0aGlzLmxpc3RlbmVyc1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnRvdWNoZXMub24oJ3RvdWNoc3RhcnQnLCB0aGlzLmhhbmRsZVRvdWNoc3RhcnQpO1xuICAgICAgICB0aGlzLnRvdWNoZXMub24oJ2hvcml6b250YWwtc3dpcGUnLCB0aGlzLmhhbmRsZUhvcml6b250YWxTd2lwZSk7XG4gICAgICAgIHRoaXMudG91Y2hlcy5vbigndG91Y2hlbmQnLCB0aGlzLmhhbmRsZVRvdWNoZW5kKTtcbiAgICAgICAgdGhpcy50b3VjaGVzLm9uKCdtb3VzZWRvd24nLCB0aGlzLmhhbmRsZVRvdWNoc3RhcnQpO1xuICAgICAgICB0aGlzLnRvdWNoZXMub24oJ21vdXNldXAnLCB0aGlzLmhhbmRsZVRvdWNoZW5kKTtcbiAgICAgICAgdGhpcy50b3VjaGVzLm9uKCd0YXAnLCB0aGlzLmhhbmRsZVRhcCk7XG5cbiAgICAgICAgdGhpcy5pbml0Q2Fyb3VzZWwoKTtcbiAgICAgICAgdGhpcy5zZXREaW1lbnNpb25zKCk7XG4gICAgICAgIHRoaXMuc2V0SW5pdGlhbEluZGV4KCk7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICB0aGlzLmNhcm91c2VsLmxpbmVVcENlbGxzKCk7XG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgICAgICBpZiAoY2hhbmdlcy53aWR0aCB8fCBjaGFuZ2VzLmhlaWdodCkge1xuICAgICAgICAgICAgdGhpcy5zZXREaW1lbnNpb25zKCk7XG4gICAgICAgICAgICB0aGlzLmluaXRDYXJvdXNlbCgpO1xuICAgICAgICAgICAgdGhpcy5jYXJvdXNlbC5saW5lVXBDZWxscygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMudG91Y2hlcy5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgaW5pdENhcm91c2VsKCkge1xuICAgICAgICB0aGlzLmNhcm91c2VsID0gbmV3IENhcm91c2VsKHtcbiAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jYXJvdXNlbC1jZWxscycpLFxuICAgICAgICAgICAgY29udGFpbmVyOiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCxcbiAgICAgICAgICAgIGltYWdlczogdGhpcy5pbWFnZXMsXG4gICAgICAgICAgICBjZWxsV2lkdGg6IHRoaXMuZ2V0Q2VsbFdpZHRoKCksXG4gICAgICAgICAgICBvdmVyZmxvd0NlbGxzTGltaXQ6IHRoaXMub3ZlcmZsb3dDZWxsc0xpbWl0LFxuICAgICAgICAgICAgdmlzaWJsZVdpZHRoOiB0aGlzLndpZHRoLFxuICAgICAgICAgICAgbWFyZ2luOiB0aGlzLm1hcmdpbixcbiAgICAgICAgICAgIG1pblN3aXBlRGlzdGFuY2U6IHRoaXMubWluU3dpcGVEaXN0YW5jZSxcbiAgICAgICAgICAgIHRyYW5zaXRpb25EdXJhdGlvbjogdGhpcy50cmFuc2l0aW9uRHVyYXRpb24sXG4gICAgICAgICAgICB0cmFuc2l0aW9uVGltaW5nRnVuY3Rpb246IHRoaXMudHJhbnNpdGlvblRpbWluZ0Z1bmN0aW9uLFxuICAgICAgICAgICAgdmlkZW9Qcm9wZXJ0aWVzOiB0aGlzLnZpZGVvUHJvcGVydGllc1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXREaW1lbnNpb25zKCkge1xuICAgICAgICB0aGlzLmhvc3RTdHlsZUhlaWdodCA9IHRoaXMuaGVpZ2h0ICsgJ3B4JztcbiAgICAgICAgdGhpcy5ob3N0U3R5bGVXaWR0aCA9IHRoaXMud2lkdGggKyAncHgnO1xuICAgIH1cblxuICAgIGdldEZpbGUoaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2Fyb3VzZWwuZ2V0RmlsZShpbmRleCk7XG4gICAgfVxuXG4gICAgLyogVG91Y2hzdGFydCAqL1xuICAgIGhhbmRsZVRvdWNoc3RhcnQgPSAoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmNhcm91c2VsLmhhbmRsZVRvdWNoc3RhcnQoZXZlbnQpO1xuICAgICAgICB0aGlzLmlzTW92aW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5ldmVudHMuZW1pdCh7XG4gICAgICAgICAgICB0eXBlOiAndG91Y2hzdGFydCcsXG4gICAgICAgICAgICBldmVudFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiBUb3VjaG1vdmUgKi9cbiAgICBoYW5kbGVIb3Jpem9udGFsU3dpcGUgPSAoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmNhcm91c2VsLmhhbmRsZUhvcml6b250YWxTd2lwZShldmVudCk7XG4gICAgICAgIHRoaXMuZXZlbnRzLmVtaXQoe1xuICAgICAgICAgICAgdHlwZTogJ3N3aXBlJyxcbiAgICAgICAgICAgIGV2ZW50XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qIFRvdWNoZW5kICovXG4gICAgaGFuZGxlVG91Y2hlbmQgPSAoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCB0b3VjaGVzID0gZXZlbnQudG91Y2hlcztcbiAgICAgICAgdGhpcy5jYXJvdXNlbC5oYW5kbGVUb3VjaGVuZChldmVudCk7XG4gICAgICAgIHRoaXMuaXNNb3ZpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5ldmVudHMuZW1pdCh7XG4gICAgICAgICAgICB0eXBlOiAndG91Y2hlbmQnLFxuICAgICAgICAgICAgZXZlbnRcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyogVGFwICovXG4gICAgaGFuZGxlVGFwID0gKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMuY2Fyb3VzZWwuc2xpZGVDb3VudGVyO1xuICAgICAgICBjb25zdCBjZWxsSW5kZXggPSB0aGlzLmNhcm91c2VsLmN1cnJlbnRDZWxsSW5kZXg7XG4gICAgICAgIGNvbnN0IGZpbGVJbmRleCA9IHRoaXMuY2Fyb3VzZWwuZ2V0RmlsZUluZGV4KGkpO1xuICAgICAgICBjb25zdCBmaWxlID0gdGhpcy5jYXJvdXNlbC5nZXRGaWxlKGNlbGxJbmRleCk7XG5cbiAgICAgICAgdGhpcy5ldmVudHMuZW1pdCh7XG4gICAgICAgICAgICB0eXBlOiAnY2xpY2snLFxuICAgICAgICAgICAgZmlsZTogZmlsZSxcbiAgICAgICAgICAgIGluZGV4OiBmaWxlSW5kZXhcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaGFuZGxlVHJhbnNpdGlvbmVuZENlbGxDb250YWluZXIoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5jYXJvdXNlbC5oYW5kbGVTbGlkZUVuZCgpO1xuICAgIH1cblxuICAgIHRvZ2dsZVZpZGVvKHZpZGVvKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmICh0aGlzLnZpZGVvUHJvcGVydGllcy5ub1BsYXkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2aWRlby5wYXVzZWQpIHtcbiAgICAgICAgICAgIHZpZGVvLnBsYXkoKTtcbiAgICAgICAgICAgIHRoaXMuaXNWaWRlb1BsYXlpbmcgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmlkZW8ucGF1c2UoKTtcbiAgICAgICAgICAgIHRoaXMuaXNWaWRlb1BsYXlpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBnZXRDdXJyZW50SW5kZXgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhcm91c2VsLnNsaWRlQ291bnRlcjtcbiAgICB9XG5cbiAgICBnZXRDZWxsV2lkdGgoKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKHRoaXMuX2NlbGxXaWR0aCA9PT0gJzEwMCUnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY2VsbFdpZHRoO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmV4dCgpIHtcbiAgICAgICAgdGhpcy5jYXJvdXNlbC5uZXh0KDEpO1xuICAgIH1cblxuICAgIHByZXYoKSB7XG4gICAgICAgIHRoaXMuY2Fyb3VzZWwucHJldigxKTtcbiAgICB9XG5cbiAgICBzZWxlY3QoaW5kZXg6IG51bWJlcikge1xuICAgICAgICB0aGlzLmNhcm91c2VsLnNlbGVjdChpbmRleCk7XG4gICAgfVxuXG4gICAgaXNOZXh0QXJyb3dEaXNhYmxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2Fyb3VzZWwuaXNOZXh0QXJyb3dEaXNhYmxlZCgpO1xuICAgIH1cblxuICAgIGlzUHJldkFycm93RGlzYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhcm91c2VsLmlzUHJldkFycm93RGlzYWJsZWQoKTtcbiAgICB9XG5cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgdGhpcy5vdmVybGF5RXZlbnRTZXJ2aWNlLmVtaXRDaGFuZ2VFdmVudCh7XG4gICAgICAgICAgICB0eXBlOiAnSGlkZSdcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0SW5pdGlhbEluZGV4KCkge1xuICAgICAgICBpZiAodGhpcy5fcHJvcGVydGllcy5tZXRhZGF0YS5pbmRleCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0KHRoaXMuX3Byb3BlcnRpZXMubWV0YWRhdGEuaW5kZXgpO1xuICAgICAgICB9XG4gICAgfVxufSJdfQ==