ngm-masonry
Version:
Angular Module for displaying a feed of items in a masonry layout using https://github.com/glebmlk/ngx-masonry
238 lines • 19.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { isPlatformBrowser } from '@angular/common';
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Inject, Input, NgZone, Output, PLATFORM_ID, } from '@angular/core';
/** @type {?} */
var imagesLoaded;
/** @type {?} */
var masonryConstructor;
var NgmMasonryComponent = /** @class */ (function () {
function NgmMasonryComponent(platformId, element, ngZone, changeDetectorRef) {
this.platformId = platformId;
this.element = element;
this.ngZone = ngZone;
this.changeDetectorRef = changeDetectorRef;
// Inputs
this.options = {};
this.useImagesLoaded = false;
this.updateLayout = false;
// Outputs
this.layoutComplete = new EventEmitter();
this.removeComplete = new EventEmitter();
}
/**
* @return {?}
*/
NgmMasonryComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
this.ngZone.runOutsideAngular(function () {
if (_this.useImagesLoaded && imagesLoaded === undefined) {
imagesLoaded = require('imagesloaded');
}
if (isPlatformBrowser(_this.platformId) && masonryConstructor === undefined) {
masonryConstructor = require('masonry-layout');
}
// Create masonry options object
if (!_this.options) {
_this.options = {};
}
// Set default itemSelector
if (!_this.options.itemSelector) {
_this.options.itemSelector = '[ngmMasonryItem], ngmMasonryItem';
}
if (isPlatformBrowser(_this.platformId)) {
// Initialize Masonry
_this._msnry = new masonryConstructor(_this.element.nativeElement, _this.options);
// Bind to events
_this._msnry.on('layoutComplete', function (items) {
_this.layoutComplete.emit(items);
_this.changeDetectorRef.markForCheck();
});
_this._msnry.on('removeComplete', function (items) {
_this.removeComplete.emit(items);
_this.changeDetectorRef.markForCheck();
});
}
});
};
/**
* @param {?} changes
* @return {?}
*/
NgmMasonryComponent.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
// only update layout if it's not the first change
if (changes.updateLayout) {
if (!changes.updateLayout.firstChange) {
this.layout();
}
}
};
/**
* @return {?}
*/
NgmMasonryComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
if (this._msnry) {
this._msnry.destroy();
}
};
/**
* @return {?}
*/
NgmMasonryComponent.prototype.layout = /**
* @return {?}
*/
function () {
var _this = this;
requestAnimationFrame(function () {
_this._msnry.layout();
_this.changeDetectorRef.markForCheck();
});
};
/**
* @return {?}
*/
NgmMasonryComponent.prototype.reloadItems = /**
* @return {?}
*/
function () {
var _this = this;
requestAnimationFrame(function () {
_this._msnry.reloadItems();
_this.changeDetectorRef.markForCheck();
});
};
// public add(element: HTMLElement, prepend: boolean = false) {
// public add(element: HTMLElement, prepend: boolean = false) {
/**
* @param {?} element
* @return {?}
*/
NgmMasonryComponent.prototype.add =
// public add(element: HTMLElement, prepend: boolean = false) {
/**
* @param {?} element
* @return {?}
*/
function (element) {
var _this = this;
this.ngZone.runOutsideAngular(function () {
/** @type {?} */
var isFirstItem = false;
// Check if first item
if (_this._msnry.items.length === 0) {
isFirstItem = true;
}
if (_this.useImagesLoaded) {
imagesLoaded(element, function (instance) {
_this.element.nativeElement.appendChild(element);
// Tell Masonry that a child element has been added
setTimeout(function () {
_this._msnry.appended(element);
_this.changeDetectorRef.markForCheck();
});
// layout if first item
if (isFirstItem) {
_this.layout();
}
});
_this.element.nativeElement.removeChild(element);
}
else {
// Tell Masonry that a child element has been added
setTimeout(function () {
_this._msnry.appended(element);
_this.changeDetectorRef.markForCheck();
});
// layout if first item
if (isFirstItem) {
_this.layout();
}
}
});
};
/**
* @param {?} element
* @return {?}
*/
NgmMasonryComponent.prototype.remove = /**
* @param {?} element
* @return {?}
*/
function (element) {
// Tell Masonry that a child element has been removed
this._msnry.remove(element);
// Layout items
this.layout();
};
NgmMasonryComponent.decorators = [
{ type: Component, args: [{
selector: '[ngm-masonry], ngm-masonry',
template: '<ng-content></ng-content>',
changeDetection: ChangeDetectionStrategy.OnPush,
styles: ["\n :host {\n display: block;\n }\n "]
}] }
];
/** @nocollapse */
NgmMasonryComponent.ctorParameters = function () { return [
{ type: undefined, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] },
{ type: ElementRef },
{ type: NgZone },
{ type: ChangeDetectorRef }
]; };
NgmMasonryComponent.propDecorators = {
options: [{ type: Input }],
useImagesLoaded: [{ type: Input }],
updateLayout: [{ type: Input }],
layoutComplete: [{ type: Output }],
removeComplete: [{ type: Output }]
};
return NgmMasonryComponent;
}());
export { NgmMasonryComponent };
if (false) {
/** @type {?} */
NgmMasonryComponent.prototype._msnry;
/** @type {?} */
NgmMasonryComponent.prototype.options;
/** @type {?} */
NgmMasonryComponent.prototype.useImagesLoaded;
/** @type {?} */
NgmMasonryComponent.prototype.updateLayout;
/** @type {?} */
NgmMasonryComponent.prototype.layoutComplete;
/** @type {?} */
NgmMasonryComponent.prototype.removeComplete;
/**
* @type {?}
* @private
*/
NgmMasonryComponent.prototype.platformId;
/**
* @type {?}
* @private
*/
NgmMasonryComponent.prototype.element;
/**
* @type {?}
* @private
*/
NgmMasonryComponent.prototype.ngZone;
/**
* @type {?}
* @private
*/
NgmMasonryComponent.prototype.changeDetectorRef;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdtLW1hc29ucnkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmdtLW1hc29ucnkvIiwic291cmNlcyI6WyJuZ20tbWFzb25yeS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ2xELE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUlOLE1BQU0sRUFDTixXQUFXLEdBRWQsTUFBTSxlQUFlLENBQUM7O0lBR25CLFlBQWlCOztJQUNqQixrQkFBdUI7QUFJM0I7SUFhSSw2QkFDMEMsVUFBZSxFQUNwQyxPQUFtQixFQUNuQixNQUFjLEVBQ2QsaUJBQW9DO1FBSGYsZUFBVSxHQUFWLFVBQVUsQ0FBSztRQUNwQyxZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQ25CLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1COztRQU16QyxZQUFPLEdBQXVCLEVBQUUsQ0FBQztRQUNqQyxvQkFBZSxHQUFZLEtBQUssQ0FBQztRQUN4QyxpQkFBWSxHQUFZLEtBQUssQ0FBQzs7UUFHN0IsbUJBQWMsR0FBd0IsSUFBSSxZQUFZLEVBQVMsQ0FBQztRQUNoRSxtQkFBYyxHQUF3QixJQUFJLFlBQVksRUFBUyxDQUFDO0lBWHZFLENBQUM7Ozs7SUFhSixzQ0FBUTs7O0lBQVI7UUFBQSxpQkFzQ0M7UUFyQ0csSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztZQUMxQixJQUFJLEtBQUksQ0FBQyxlQUFlLElBQUksWUFBWSxLQUFLLFNBQVMsRUFBRTtnQkFDcEQsWUFBWSxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQzthQUMxQztZQUVELElBQUksaUJBQWlCLENBQUMsS0FBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLGtCQUFrQixLQUFLLFNBQVMsRUFBRTtnQkFDeEUsa0JBQWtCLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7YUFDbEQ7WUFFRCxnQ0FBZ0M7WUFDaEMsSUFBSSxDQUFDLEtBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ2YsS0FBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7YUFDckI7WUFFRCwyQkFBMkI7WUFDM0IsSUFBSSxDQUFDLEtBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFO2dCQUM1QixLQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksR0FBRyxrQ0FBa0MsQ0FBQzthQUNsRTtZQUVELElBQUksaUJBQWlCLENBQUMsS0FBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFO2dCQUNwQyxxQkFBcUI7Z0JBQ3JCLEtBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxrQkFBa0IsQ0FDaEMsS0FBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQzFCLEtBQUksQ0FBQyxPQUFPLENBQ2YsQ0FBQztnQkFFRixpQkFBaUI7Z0JBQ2pCLEtBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLGdCQUFnQixFQUFFLFVBQUMsS0FBVTtvQkFDeEMsS0FBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ2hDLEtBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDMUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsS0FBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsVUFBQyxLQUFVO29CQUN4QyxLQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDaEMsS0FBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUMxQyxDQUFDLENBQUMsQ0FBQzthQUNOO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDOzs7OztJQUVELHlDQUFXOzs7O0lBQVgsVUFBWSxPQUFzQjtRQUM5QixrREFBa0Q7UUFDbEQsSUFBSSxPQUFPLENBQUMsWUFBWSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRTtnQkFDbkMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2FBQ2pCO1NBQ0o7SUFDTCxDQUFDOzs7O0lBRUQseUNBQVc7OztJQUFYO1FBQ0ksSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUN6QjtJQUNMLENBQUM7Ozs7SUFFTSxvQ0FBTTs7O0lBQWI7UUFBQSxpQkFLQztRQUpHLHFCQUFxQixDQUFDO1lBQ2xCLEtBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDckIsS0FBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzFDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzs7OztJQUVNLHlDQUFXOzs7SUFBbEI7UUFBQSxpQkFLQztRQUpHLHFCQUFxQixDQUFDO1lBQ2xCLEtBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDMUIsS0FBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzFDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELCtEQUErRDs7Ozs7O0lBQ3hELGlDQUFHOzs7Ozs7SUFBVixVQUFXLE9BQW9CO1FBQS9CLGlCQXVDQztRQXRDRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDOztnQkFDdEIsV0FBVyxHQUFHLEtBQUs7WUFFdkIsc0JBQXNCO1lBQ3RCLElBQUksS0FBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtnQkFDaEMsV0FBVyxHQUFHLElBQUksQ0FBQzthQUN0QjtZQUVELElBQUksS0FBSSxDQUFDLGVBQWUsRUFBRTtnQkFDdEIsWUFBWSxDQUFDLE9BQU8sRUFBRSxVQUFDLFFBQWE7b0JBQ2hDLEtBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFFaEQsbURBQW1EO29CQUNuRCxVQUFVLENBQUM7d0JBQ1AsS0FBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7d0JBQzlCLEtBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztvQkFDMUMsQ0FBQyxDQUFDLENBQUM7b0JBRUgsdUJBQXVCO29CQUN2QixJQUFJLFdBQVcsRUFBRTt3QkFDYixLQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7cUJBQ2pCO2dCQUNMLENBQUMsQ0FBQyxDQUFDO2dCQUVILEtBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUNuRDtpQkFBTTtnQkFDSCxtREFBbUQ7Z0JBQ25ELFVBQVUsQ0FBQztvQkFDUCxLQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDOUIsS0FBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUMxQyxDQUFDLENBQUMsQ0FBQztnQkFFSCx1QkFBdUI7Z0JBQ3ZCLElBQUksV0FBVyxFQUFFO29CQUNiLEtBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztpQkFDakI7YUFDSjtRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzs7Ozs7SUFFTSxvQ0FBTTs7OztJQUFiLFVBQWMsT0FBb0I7UUFDOUIscURBQXFEO1FBQ3JELElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTVCLGVBQWU7UUFDZixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDbEIsQ0FBQzs7Z0JBcEpKLFNBQVMsU0FBQztvQkFDUCxRQUFRLEVBQUUsNEJBQTRCO29CQUN0QyxRQUFRLEVBQUUsMkJBQTJCO29CQVFyQyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTs2QkFOM0MsaUZBSUM7aUJBR1I7Ozs7Z0RBR1EsTUFBTSxTQUFDLFdBQVc7Z0JBakN2QixVQUFVO2dCQUlWLE1BQU07Z0JBTk4saUJBQWlCOzs7MEJBNENoQixLQUFLO2tDQUNMLEtBQUs7K0JBQ0wsS0FBSztpQ0FHTCxNQUFNO2lDQUNOLE1BQU07O0lBd0hYLDBCQUFDO0NBQUEsQUFySkQsSUFxSkM7U0F6SVksbUJBQW1COzs7SUFRNUIscUNBQW1COztJQUduQixzQ0FBaUQ7O0lBQ2pELDhDQUFpRDs7SUFDakQsMkNBQXVDOztJQUd2Qyw2Q0FBMEU7O0lBQzFFLDZDQUEwRTs7Ozs7SUFmdEUseUNBQXFEOzs7OztJQUNyRCxzQ0FBb0M7Ozs7O0lBQ3BDLHFDQUErQjs7Ozs7SUFDL0IsZ0RBQXFEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtpc1BsYXRmb3JtQnJvd3Nlcn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEluamVjdCxcbiAgICBJbnB1dCxcbiAgICBOZ1pvbmUsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFBMQVRGT1JNX0lELFxuICAgIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5kZWNsYXJlIHZhciByZXF1aXJlOiBhbnk7XG5sZXQgaW1hZ2VzTG9hZGVkOiBhbnk7XG5sZXQgbWFzb25yeUNvbnN0cnVjdG9yOiBhbnk7XG5cbmltcG9ydCB7SU5nbU1hc29ucnlPcHRpb25zfSBmcm9tICcuL25nbS1tYXNvbnJ5LW9wdGlvbnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ1tuZ20tbWFzb25yeV0sIG5nbS1tYXNvbnJ5JyxcbiAgICB0ZW1wbGF0ZTogJzxuZy1jb250ZW50PjwvbmctY29udGVudD4nLFxuICAgIHN0eWxlczogW1xuICAgICAgICBgXG4gICAgICAgICAgICA6aG9zdCB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgICB9XG4gICAgICAgIGAsXG4gICAgXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgTmdtTWFzb25yeUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHJlYWRvbmx5IHBsYXRmb3JtSWQ6IGFueSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50OiBFbGVtZW50UmVmLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG5nWm9uZTogTmdab25lLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICApIHt9XG5cbiAgICBwdWJsaWMgX21zbnJ5OiBhbnk7XG5cbiAgICAvLyBJbnB1dHNcbiAgICBASW5wdXQoKSBwdWJsaWMgb3B0aW9uczogSU5nbU1hc29ucnlPcHRpb25zID0ge307XG4gICAgQElucHV0KCkgcHVibGljIHVzZUltYWdlc0xvYWRlZDogQm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHVwZGF0ZUxheW91dDogQm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLy8gT3V0cHV0c1xuICAgIEBPdXRwdXQoKSBsYXlvdXRDb21wbGV0ZTogRXZlbnRFbWl0dGVyPGFueVtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55W10+KCk7XG4gICAgQE91dHB1dCgpIHJlbW92ZUNvbXBsZXRlOiBFdmVudEVtaXR0ZXI8YW55W10+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKTtcblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy51c2VJbWFnZXNMb2FkZWQgJiYgaW1hZ2VzTG9hZGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBpbWFnZXNMb2FkZWQgPSByZXF1aXJlKCdpbWFnZXNsb2FkZWQnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkgJiYgbWFzb25yeUNvbnN0cnVjdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBtYXNvbnJ5Q29uc3RydWN0b3IgPSByZXF1aXJlKCdtYXNvbnJ5LWxheW91dCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDcmVhdGUgbWFzb25yeSBvcHRpb25zIG9iamVjdFxuICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2V0IGRlZmF1bHQgaXRlbVNlbGVjdG9yXG4gICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5pdGVtU2VsZWN0b3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuaXRlbVNlbGVjdG9yID0gJ1tuZ21NYXNvbnJ5SXRlbV0sIG5nbU1hc29ucnlJdGVtJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHtcbiAgICAgICAgICAgICAgICAvLyBJbml0aWFsaXplIE1hc29ucnlcbiAgICAgICAgICAgICAgICB0aGlzLl9tc25yeSA9IG5ldyBtYXNvbnJ5Q29uc3RydWN0b3IoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMsXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIC8vIEJpbmQgdG8gZXZlbnRzXG4gICAgICAgICAgICAgICAgdGhpcy5fbXNucnkub24oJ2xheW91dENvbXBsZXRlJywgKGl0ZW1zOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXlvdXRDb21wbGV0ZS5lbWl0KGl0ZW1zKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLl9tc25yeS5vbigncmVtb3ZlQ29tcGxldGUnLCAoaXRlbXM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUNvbXBsZXRlLmVtaXQoaXRlbXMpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgICAgIC8vIG9ubHkgdXBkYXRlIGxheW91dCBpZiBpdCdzIG5vdCB0aGUgZmlyc3QgY2hhbmdlXG4gICAgICAgIGlmIChjaGFuZ2VzLnVwZGF0ZUxheW91dCkge1xuICAgICAgICAgICAgaWYgKCFjaGFuZ2VzLnVwZGF0ZUxheW91dC5maXJzdENoYW5nZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX21zbnJ5KSB7XG4gICAgICAgICAgICB0aGlzLl9tc25yeS5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbGF5b3V0KCkge1xuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fbXNucnkubGF5b3V0KCk7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVsb2FkSXRlbXMoKSB7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9tc25yeS5yZWxvYWRJdGVtcygpO1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gcHVibGljIGFkZChlbGVtZW50OiBIVE1MRWxlbWVudCwgcHJlcGVuZDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgcHVibGljIGFkZChlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICBsZXQgaXNGaXJzdEl0ZW0gPSBmYWxzZTtcblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgZmlyc3QgaXRlbVxuICAgICAgICAgICAgaWYgKHRoaXMuX21zbnJ5Lml0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGlzRmlyc3RJdGVtID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMudXNlSW1hZ2VzTG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgaW1hZ2VzTG9hZGVkKGVsZW1lbnQsIChpbnN0YW5jZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFRlbGwgTWFzb25yeSB0aGF0IGEgY2hpbGQgZWxlbWVudCBoYXMgYmVlbiBhZGRlZFxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21zbnJ5LmFwcGVuZGVkKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gbGF5b3V0IGlmIGZpcnN0IGl0ZW1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzRmlyc3RJdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxheW91dCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5yZW1vdmVDaGlsZChlbGVtZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVGVsbCBNYXNvbnJ5IHRoYXQgYSBjaGlsZCBlbGVtZW50IGhhcyBiZWVuIGFkZGVkXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21zbnJ5LmFwcGVuZGVkKGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgLy8gbGF5b3V0IGlmIGZpcnN0IGl0ZW1cbiAgICAgICAgICAgICAgICBpZiAoaXNGaXJzdEl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXlvdXQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmUoZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgLy8gVGVsbCBNYXNvbnJ5IHRoYXQgYSBjaGlsZCBlbGVtZW50IGhhcyBiZWVuIHJlbW92ZWRcbiAgICAgICAgdGhpcy5fbXNucnkucmVtb3ZlKGVsZW1lbnQpO1xuXG4gICAgICAgIC8vIExheW91dCBpdGVtc1xuICAgICAgICB0aGlzLmxheW91dCgpO1xuICAgIH1cbn1cbiJdfQ==