UNPKG

angular2-notifications

Version:

> A light and easy to use notifications library for Angular 2. ~~It features both regular page notifications (toasts) and push notifications.~~

209 lines 30.2 kB
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core'; import { NotificationAnimationType } from '../../enums/notification-animation-type.enum'; import * as i0 from "@angular/core"; import * as i1 from "../../services/notifications.service"; import * as i2 from "@angular/common"; import * as i3 from "../notification/notification.component"; export class SimpleNotificationsComponent { service; cd; constructor(service, cd) { this.service = service; this.cd = cd; } set options(opt) { this.usingComponentOptions = true; this.attachChanges(opt); } create = new EventEmitter(); destroy = new EventEmitter(); notifications = []; position = ['bottom', 'right']; lastNotificationCreated; listener; // Received values lastOnBottom = true; maxStack = 8; preventLastDuplicates = false; preventDuplicates = false; // Sent values timeOut = 0; maxLength = 0; clickToClose = true; clickIconToClose = false; showProgressBar = true; pauseOnHover = true; theClass = ''; rtl = false; animate = NotificationAnimationType.FromRight; usingComponentOptions = false; ngOnInit() { /** * Only attach global options if config * options were never sent through input */ if (!this.usingComponentOptions) { this.attachChanges(this.service.globalOptions); } this.listener = this.service.emitter .subscribe(item => { switch (item.command) { case 'cleanAll': this.notifications = []; break; case 'clean': this.cleanSingle(item.id); break; case 'set': if (item.add) { this.add(item.notification); } else { this.defaultBehavior(item); } break; default: this.defaultBehavior(item); break; } if (!this.cd.destroyed) { this.cd.detectChanges(); } }); } ngOnDestroy() { if (this.listener) { this.listener.unsubscribe(); } this.cd.detach(); } // Default behavior on event defaultBehavior(value) { this.notifications.splice(this.notifications.indexOf(value.notification), 1); this.destroy.emit(this.buildEmit(value.notification, false)); } // Add the new notification to the notification array add(item) { item.createdOn = new Date(); const toBlock = this.preventLastDuplicates || this.preventDuplicates ? this.block(item) : false; // Save this as the last created notification this.lastNotificationCreated = item; // Override icon if set if (item.override && item.override.icons && item.override.icons[item.type]) { item.icon = item.override.icons[item.type]; } if (!toBlock) { // Check if the notification should be added at the start or the end of the array if (this.lastOnBottom) { if (this.notifications.length >= this.maxStack) { this.notifications.splice(0, 1); } this.notifications.push(item); } else { if (this.notifications.length >= this.maxStack) { this.notifications.splice(this.notifications.length - 1, 1); } this.notifications.splice(0, 0, item); } this.create.emit(this.buildEmit(item, true)); } } // Check if notifications should be prevented block(item) { const toCheck = item.html ? this.checkHtml : this.checkStandard; if (this.preventDuplicates && this.notifications.length > 0) { for (const notification of this.notifications) { if (toCheck(notification, item)) { return true; } } } if (this.preventLastDuplicates) { let comp; if (this.preventLastDuplicates === 'visible' && this.notifications.length > 0) { if (this.lastOnBottom) { comp = this.notifications[this.notifications.length - 1]; } else { comp = this.notifications[0]; } } else if (this.preventLastDuplicates === 'all' && this.lastNotificationCreated) { comp = this.lastNotificationCreated; } else { return false; } return toCheck(comp, item); } return false; } checkStandard(checker, item) { return checker.type === item.type && checker.title === item.title && checker.content === item.content; } checkHtml(checker, item) { return checker.html ? checker.type === item.type && checker.title === item.title && checker.content === item.content && checker.html === item.html : false; } // Attach all the changes received in the options object attachChanges(options) { for (const key in options) { if (this.hasOwnProperty(key)) { this[key] = options[key]; } else if (key === 'icons') { this.service.icons = options[key]; } } } buildEmit(notification, to) { const toEmit = { createdOn: notification.createdOn, type: notification.type, icon: notification.icon, id: notification.id }; if (notification.html) { toEmit.html = notification.html; } else { toEmit.title = notification.title; toEmit.content = notification.content; } if (!to) { toEmit.destroyedOn = new Date(); } return toEmit; } cleanSingle(id) { let indexOfDelete = 0; let doDelete = false; let noti; this.notifications.forEach((notification, idx) => { if (notification.id === id) { indexOfDelete = idx; noti = notification; doDelete = true; } }); if (doDelete) { this.notifications.splice(indexOfDelete, 1); this.destroy.emit(this.buildEmit(noti, false)); } } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.11", ngImport: i0, type: SimpleNotificationsComponent, deps: [{ token: i1.NotificationsService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.11", type: SimpleNotificationsComponent, selector: "simple-notifications", inputs: { options: "options" }, outputs: { create: "create", destroy: "destroy" }, ngImport: i0, template: "<div class=\"simple-notification-wrapper\" [ngClass]=\"position\">\r\n <simple-notification\r\n *ngFor=\"let a of notifications; let i = index\"\r\n [item]=\"a\"\r\n [timeOut]=\"timeOut\"\r\n [clickToClose]=\"clickToClose\"\r\n [clickIconToClose]=\"clickIconToClose\"\r\n [maxLength]=\"maxLength\"\r\n [showProgressBar]=\"showProgressBar\"\r\n [pauseOnHover]=\"pauseOnHover\"\r\n [theClass]=\"theClass\"\r\n [rtl]=\"rtl\"\r\n [animate]=\"animate\"\r\n [position]=\"i\">\r\n </simple-notification>\r\n</div>", styles: [".simple-notification-wrapper{position:fixed;width:300px;z-index:1000}.simple-notification-wrapper.left{left:20px}.simple-notification-wrapper.top{top:20px}.simple-notification-wrapper.right{right:20px}.simple-notification-wrapper.bottom{bottom:20px}.simple-notification-wrapper.center{left:50%;transform:translate(-50%)}.simple-notification-wrapper.middle{top:50%;transform:translateY(-50%)}.simple-notification-wrapper.middle.center{transform:translate(-50%,-50%)}@media (max-width: 340px){.simple-notification-wrapper{width:auto;left:20px;right:20px}}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i3.NotificationComponent, selector: "simple-notification", inputs: ["timeOut", "showProgressBar", "pauseOnHover", "clickToClose", "clickIconToClose", "maxLength", "theClass", "rtl", "animate", "position", "item"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.11", ngImport: i0, type: SimpleNotificationsComponent, decorators: [{ type: Component, args: [{ selector: 'simple-notifications', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"simple-notification-wrapper\" [ngClass]=\"position\">\r\n <simple-notification\r\n *ngFor=\"let a of notifications; let i = index\"\r\n [item]=\"a\"\r\n [timeOut]=\"timeOut\"\r\n [clickToClose]=\"clickToClose\"\r\n [clickIconToClose]=\"clickIconToClose\"\r\n [maxLength]=\"maxLength\"\r\n [showProgressBar]=\"showProgressBar\"\r\n [pauseOnHover]=\"pauseOnHover\"\r\n [theClass]=\"theClass\"\r\n [rtl]=\"rtl\"\r\n [animate]=\"animate\"\r\n [position]=\"i\">\r\n </simple-notification>\r\n</div>", styles: [".simple-notification-wrapper{position:fixed;width:300px;z-index:1000}.simple-notification-wrapper.left{left:20px}.simple-notification-wrapper.top{top:20px}.simple-notification-wrapper.right{right:20px}.simple-notification-wrapper.bottom{bottom:20px}.simple-notification-wrapper.center{left:50%;transform:translate(-50%)}.simple-notification-wrapper.middle{top:50%;transform:translateY(-50%)}.simple-notification-wrapper.middle.center{transform:translate(-50%,-50%)}@media (max-width: 340px){.simple-notification-wrapper{width:auto;left:20px;right:20px}}\n"] }] }], ctorParameters: function () { return [{ type: i1.NotificationsService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { options: [{ type: Input }], create: [{ type: Output }], destroy: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxlLW5vdGlmaWNhdGlvbnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhcjItbm90aWZpY2F0aW9ucy9zcmMvbGliL2NvbXBvbmVudHMvc2ltcGxlLW5vdGlmaWNhdGlvbnMvc2ltcGxlLW5vdGlmaWNhdGlvbnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhcjItbm90aWZpY2F0aW9ucy9zcmMvbGliL2NvbXBvbmVudHMvc2ltcGxlLW5vdGlmaWNhdGlvbnMvc2ltcGxlLW5vdGlmaWNhdGlvbnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsaUJBQWlCLEVBQThCLE1BQU0sZUFBZSxDQUFDO0FBRWxLLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDOzs7OztBQVl6RixNQUFNLE9BQU8sNEJBQTRCO0lBRTdCO0lBQ0E7SUFGVixZQUNVLE9BQTZCLEVBQzdCLEVBQXFCO1FBRHJCLFlBQU8sR0FBUCxPQUFPLENBQXNCO1FBQzdCLE9BQUUsR0FBRixFQUFFLENBQW1CO0lBQzNCLENBQUM7SUFFTCxJQUFhLE9BQU8sQ0FBQyxHQUFZO1FBQy9CLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUM7UUFDbEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRVMsTUFBTSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFDNUIsT0FBTyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFFdkMsYUFBYSxHQUFtQixFQUFFLENBQUM7SUFDbkMsUUFBUSxHQUFhLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRWpDLHVC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TTtnQkFDRyxPQUFPO3NCQUFoQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgVmlld0VuY2Fwc3VsYXRpb24sIENoYW5nZURldGVjdG9yUmVmLCBWaWV3UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBOb3RpZmljYXRpb25BbmltYXRpb25UeXBlIH0gZnJvbSAnLi4vLi4vZW51bXMvbm90aWZpY2F0aW9uLWFuaW1hdGlvbi10eXBlLmVudW0nO1xyXG5pbXBvcnQgeyBOb3RpZmljYXRpb24gfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL25vdGlmaWNhdGlvbi50eXBlJztcclxuaW1wb3J0IHsgT3B0aW9ucywgUG9zaXRpb24gfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL29wdGlvbnMudHlwZSc7XHJcbmltcG9ydCB7IE5vdGlmaWNhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbm90aWZpY2F0aW9ucy5zZXJ2aWNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc2ltcGxlLW5vdGlmaWNhdGlvbnMnLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3NpbXBsZS1ub3RpZmljYXRpb25zLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9zaW1wbGUtbm90aWZpY2F0aW9ucy5jb21wb25lbnQuY3NzJ10sXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcclxufSlcclxuZXhwb3J0IGNsYXNzIFNpbXBsZU5vdGlmaWNhdGlvbnNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHNlcnZpY2U6IE5vdGlmaWNhdGlvbnNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWZcclxuICApIHsgfVxyXG5cclxuICBASW5wdXQoKSBzZXQgb3B0aW9ucyhvcHQ6IE9wdGlvbnMpIHtcclxuICAgIHRoaXMudXNpbmdDb21wb25lbnRPcHRpb25zID0gdHJ1ZTtcclxuICAgIHRoaXMuYXR0YWNoQ2hhbmdlcyhvcHQpO1xyXG4gIH1cclxuXHJcbiAgQE91dHB1dCgpIGNyZWF0ZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgZGVzdHJveSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgbm90aWZpY2F0aW9uczogTm90aWZpY2F0aW9uW10gPSBbXTtcclxuICBwb3NpdGlvbjogUG9zaXRpb24gPSBbJ2JvdHRvbScsICdyaWdodCddO1xyXG5cclxuICBwcml2YXRlIGxhc3ROb3RpZmljYXRpb25DcmVhdGVkOiBOb3RpZmljYXRpb247XHJcbiAgcHJpdmF0ZSBsaXN0ZW5lcjogU3Vic2NyaXB0aW9uO1xyXG5cclxuICAvLyBSZWNlaXZlZCB2YWx1ZXNcclxuICBwcml2YXRlIGxhc3RPbkJvdHRvbSA9IHRydWU7XHJcbiAgcHJpdmF0ZSBtYXhTdGFjayA9IDg7XHJcbiAgcHJpdmF0ZSBwcmV2ZW50TGFzdER1cGxpY2F0ZXM6IGFueSA9IGZhbHNlO1xyXG4gIHByaXZhdGUgcHJldmVudER1cGxpY2F0ZXMgPSBmYWxzZTtcclxuXHJcbiAgLy8gU2VudCB2YWx1ZXNcclxuICB0aW1lT3V0ID0gMDtcclxuICBtYXhMZW5ndGggPSAwO1xyXG4gIGNsaWNrVG9DbG9zZSA9IHRydWU7XHJcbiAgY2xpY2tJY29uVG9DbG9zZSA9IGZhbHNlO1xyXG4gIHNob3dQcm9ncmVzc0JhciA9IHRydWU7XHJcbiAgcGF1c2VPbkhvdmVyID0gdHJ1ZTtcclxuICB0aGVDbGFzcyA9ICcnO1xyXG4gIHJ0bCA9IGZhbHNlO1xyXG4gIGFuaW1hdGU6IE5vdGlmaWNhdGlvbkFuaW1hdGlvblR5cGUgPSBOb3RpZmljYXRpb25BbmltYXRpb25UeXBlLkZyb21SaWdodDtcclxuXHJcbiAgcHJpdmF0ZSB1c2luZ0NvbXBvbmVudE9wdGlvbnMgPSBmYWxzZTtcclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPbmx5IGF0dGFjaCBnbG9iYWwgb3B0aW9ucyBpZiBjb25maWdcclxuICAgICAqIG9wdGlvbnMgd2VyZSBuZXZlciBzZW50IHRocm91Z2ggaW5wdXRcclxuICAgICAqL1xyXG4gICAgaWYgKCF0aGlzLnVzaW5nQ29tcG9uZW50T3B0aW9ucykge1xyXG4gICAgICB0aGlzLmF0dGFjaENoYW5nZXMoXHJcbiAgICAgICAgdGhpcy5zZXJ2aWNlLmdsb2JhbE9wdGlvbnNcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmxpc3RlbmVyID0gdGhpcy5zZXJ2aWNlLmVtaXR0ZXJcclxuICAgICAgLnN1YnNjcmliZShpdGVtID0+IHtcclxuICAgICAgICBzd2l0Y2ggKGl0ZW0uY29tbWFuZCkge1xyXG4gICAgICAgICAgY2FzZSAnY2xlYW5BbGwnOlxyXG4gICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnMgPSBbXTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSAnY2xlYW4nOlxyXG4gICAgICAgICAgICB0aGlzLmNsZWFuU2luZ2xlKGl0ZW0uaWQhKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgY2FzZSAnc2V0JzpcclxuICAgICAgICAgICAgaWYgKGl0ZW0uYWRkKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5hZGQoaXRlbS5ub3RpZmljYXRpb24hKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRCZWhhdmlvcihpdGVtKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRCZWhhdmlvcihpdGVtKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghKHRoaXMuY2QgYXMgVmlld1JlZikuZGVzdHJveWVkKSB7XHJcbiAgICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICBpZiAodGhpcy5saXN0ZW5lcikge1xyXG4gICAgICB0aGlzLmxpc3RlbmVyLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNkLmRldGFjaCgpO1xyXG4gIH1cclxuXHJcbiAgLy8gRGVmYXVsdCBiZWhhdmlvciBvbiBldmVudFxyXG4gIGRlZmF1bHRCZWhhdmlvcih2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm5vdGlmaWNhdGlvbnMuc3BsaWNlKHRoaXMubm90aWZpY2F0aW9ucy5pbmRleE9mKHZhbHVlLm5vdGlmaWNhdGlvbiksIDEpO1xyXG4gICAgdGhpcy5kZXN0cm95LmVtaXQodGhpcy5idWlsZEVtaXQodmFsdWUubm90aWZpY2F0aW9uLCBmYWxzZSkpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vIEFkZCB0aGUgbmV3IG5vdGlmaWNhdGlvbiB0byB0aGUgbm90aWZpY2F0aW9uIGFycmF5XHJcbiAgYWRkKGl0ZW06IE5vdGlmaWNhdGlvbik6IHZvaWQge1xyXG4gICAgaXRlbS5jcmVhdGVkT24gPSBuZXcgRGF0ZSgpO1xyXG5cclxuICAgIGNvbnN0IHRvQmxvY2s6IGJvb2xlYW4gPSB0aGlzLnByZXZlbnRMYXN0RHVwbGljYXRlcyB8fCB0aGlzLnByZXZlbnREdXBsaWNhdGVzID8gdGhpcy5ibG9jayhpdGVtKSA6IGZhbHNlO1xyXG5cclxuICAgIC8vIFNhdmUgdGhpcyBhcyB0aGUgbGFzdCBjcmVhdGVkIG5vdGlmaWNhdGlvblxyXG4gICAgdGhpcy5sYXN0Tm90aWZpY2F0aW9uQ3JlYXRlZCA9IGl0ZW07XHJcbiAgICAvLyBPdmVycmlkZSBpY29uIGlmIHNldFxyXG4gICAgaWYgKGl0ZW0ub3ZlcnJpZGUgJiYgaXRlbS5vdmVycmlkZS5pY29ucyAmJiBpdGVtLm92ZXJyaWRlLmljb25zW2l0ZW0udHlwZV0pIHtcclxuICAgICAgaXRlbS5pY29uID0gaXRlbS5vdmVycmlkZS5pY29uc1tpdGVtLnR5cGVdO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdG9CbG9jaykge1xyXG4gICAgICAvLyBDaGVjayBpZiB0aGUgbm90aWZpY2F0aW9uIHNob3VsZCBiZSBhZGRlZCBhdCB0aGUgc3RhcnQgb3IgdGhlIGVuZCBvZiB0aGUgYXJyYXlcclxuICAgICAgaWYgKHRoaXMubGFzdE9uQm90dG9tKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubm90aWZpY2F0aW9ucy5sZW5ndGggPj0gdGhpcy5tYXhTdGFjaykge1xyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zLnNwbGljZSgwLCAxKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9ucy5wdXNoKGl0ZW0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICh0aGlzLm5vdGlmaWNhdGlvbnMubGVuZ3RoID49IHRoaXMubWF4U3RhY2spIHtcclxuICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9ucy5zcGxpY2UodGhpcy5ub3RpZmljYXRpb25zLmxlbmd0aCAtIDEsIDEpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zLnNwbGljZSgwLCAwLCBpdGVtKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5jcmVhdGUuZW1pdCh0aGlzLmJ1aWxkRW1pdChpdGVtLCB0cnVlKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBDaGVjayBpZiBub3RpZmljYXRpb25zIHNob3VsZCBiZSBwcmV2ZW50ZWRcclxuICBibG9jayhpdGVtOiBOb3RpZmljYXRpb24pOiBib29sZWFuIHtcclxuXHJcbiAgICBjb25zdCB0b0NoZWNrID0gaXRlbS5odG1sID8gdGhpcy5jaGVja0h0bWwgOiB0aGlzLmNoZWNrU3RhbmRhcmQ7XHJcblxyXG4gICAgaWYgKHRoaXMucHJldmVudER1cGxpY2F0ZXMgJiYgdGhpcy5ub3RpZmljYXRpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgZm9yIChjb25zdCBub3RpZmljYXRpb24gb2YgdGhpcy5ub3RpZmljYXRpb25zKSB7XHJcbiAgICAgICAgaWYgKHRvQ2hlY2sobm90aWZpY2F0aW9uLCBpdGVtKSkge1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMucHJldmVudExhc3REdXBsaWNhdGVzKSB7XHJcblxyXG4gICAgICBsZXQgY29tcDogTm90aWZpY2F0aW9uO1xyXG5cclxuICAgICAgaWYgKHRoaXMucHJldmVudExhc3REdXBsaWNhdGVzID09PSAndmlzaWJsZScgJiYgdGhpcy5ub3RpZmljYXRpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBpZiAodGhpcy5sYXN0T25Cb3R0b20pIHtcclxuICAgICAgICAgIGNvbXAgPSB0aGlzLm5vdGlmaWNhdGlvbnNbdGhpcy5ub3RpZmljYXRpb25zLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb21wID0gdGhpcy5ub3RpZmljYXRpb25zWzBdO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmICh0aGlzLnByZXZlbnRMYXN0RHVwbGljYXRlcyA9PT0gJ2FsbCcgJiYgdGhpcy5sYXN0Tm90aWZpY2F0aW9uQ3JlYXRlZCkge1xyXG4gICAgICAgIGNvbXAgPSB0aGlzLmxhc3ROb3RpZmljYXRpb25DcmVhdGVkO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdG9DaGVjayhjb21wLCBpdGVtKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBjaGVja1N0YW5kYXJkKGNoZWNrZXI6IE5vdGlmaWNhdGlvbiwgaXRlbTogTm90aWZpY2F0aW9uKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gY2hlY2tlci50eXBlID09PSBpdGVtLnR5cGUgJiYgY2hlY2tlci50aXRsZSA9PT0gaXRlbS50aXRsZSAmJiBjaGVja2VyLmNvbnRlbnQgPT09IGl0ZW0uY29udGVudDtcclxuICB9XHJcblxyXG4gIGNoZWNrSHRtbChjaGVja2VyOiBOb3RpZmljYXRpb24sIGl0ZW06IE5vdGlmaWNhdGlvbik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGNoZWNrZXIuaHRtbCA/XHJcbiAgICAgIGNoZWNrZXIudHlwZSA9PT0gaXRlbS50eXBlICYmIGNoZWNrZXIudGl0bGUgPT09IGl0ZW0udGl0bGUgJiYgY2hlY2tlci5jb250ZW50ID09PSBpdGVtLmNvbnRlbnQgJiYgY2hlY2tlci5odG1sID09PSBpdGVtLmh0bWwgOlxyXG4gICAgICBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vIEF0dGFjaCBhbGwgdGhlIGNoYW5nZXMgcmVjZWl2ZWQgaW4gdGhlIG9wdGlvbnMgb2JqZWN0XHJcbiAgYXR0YWNoQ2hhbmdlcyhvcHRpb25zOiBhbnkpIHtcclxuICAgIGZvciAoY29uc3Qga2V5IGluIG9wdGlvbnMpIHtcclxuICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xyXG4gICAgICAgICh0aGlzIGFzIGFueSlba2V5XSA9IG9wdGlvbnNba2V5XTtcclxuICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdpY29ucycpIHtcclxuICAgICAgICB0aGlzLnNlcnZpY2UuaWNvbnMgPSBvcHRpb25zW2tleV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGJ1aWxkRW1pdChub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbiwgdG86IGJvb2xlYW4pIHtcclxuICAgIGNvbnN0IHRvRW1pdDogTm90aWZpY2F0aW9uID0ge1xyXG4gICAgICBjcmVhdGVkT246IG5vdGlmaWNhdGlvbi5jcmVhdGVkT24sXHJcbiAgICAgIHR5cGU6IG5vdGlmaWNhdGlvbi50eXBlLFxyXG4gICAgICBpY29uOiBub3RpZmljYXRpb24uaWNvbixcclxuICAgICAgaWQ6IG5vdGlmaWNhdGlvbi5pZFxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAobm90aWZpY2F0aW9uLmh0bWwpIHtcclxuICAgICAgdG9FbWl0Lmh0bWwgPSBub3RpZmljYXRpb24uaHRtbDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRvRW1pdC50aXRsZSA9IG5vdGlmaWNhdGlvbi50aXRsZTtcclxuICAgICAgdG9FbWl0LmNvbnRlbnQgPSBub3RpZmljYXRpb24uY29udGVudDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRvKSB7XHJcbiAgICAgIHRvRW1pdC5kZXN0cm95ZWRPbiA9IG5ldyBEYXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRvRW1pdDtcclxuICB9XHJcblxyXG4gIGNsZWFuU2luZ2xlKGlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCBpbmRleE9mRGVsZXRlID0gMDtcclxuICAgIGxldCBkb0RlbGV0ZSA9IGZhbHNlO1xyXG4gICAgbGV0IG5vdGk7XHJcblxyXG4gICAgdGhpcy5ub3RpZmljYXRpb25zLmZvckVhY2goKG5vdGlmaWNhdGlvbiwgaWR4KSA9PiB7XHJcbiAgICAgIGlmIChub3RpZmljYXRpb24uaWQgPT09IGlkKSB7XHJcbiAgICAgICAgaW5kZXhPZkRlbGV0ZSA9IGlkeDtcclxuICAgICAgICBub3RpID0gbm90aWZpY2F0aW9uO1xyXG4gICAgICAgIGRvRGVsZXRlID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKGRvRGVsZXRlKSB7XHJcbiAgICAgIHRoaXMubm90aWZpY2F0aW9ucy5zcGxpY2UoaW5kZXhPZkRlbGV0ZSwgMSk7XHJcbiAgICAgIHRoaXMuZGVzdHJveS5lbWl0KHRoaXMuYnVpbGRFbWl0KG5vdGksIGZhbHNlKSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJzaW1wbGUtbm90aWZpY2F0aW9uLXdyYXBwZXJcIiBbbmdDbGFzc109XCJwb3NpdGlvblwiPlxyXG4gICAgPHNpbXBsZS1ub3RpZmljYXRpb25cclxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGEgb2Ygbm90aWZpY2F0aW9uczsgbGV0IGkgPSBpbmRleFwiXHJcbiAgICAgICAgICAgIFtpdGVtXT1cImFcIlxyXG4gICAgICAgICAgICBbdGltZU91dF09XCJ0aW1lT3V0XCJcclxuICAgICAgICAgICAgW2NsaWNrVG9DbG9zZV09XCJjbGlja1RvQ2xvc2VcIlxyXG4gICAgICAgICAgICBbY2xpY2tJY29uVG9DbG9zZV09XCJjbGlja0ljb25Ub0Nsb3NlXCJcclxuICAgICAgICAgICAgW21heExlbmd0aF09XCJtYXhMZW5ndGhcIlxyXG4gICAgICAgICAgICBbc2hvd1Byb2dyZXNzQmFyXT1cInNob3dQcm9ncmVzc0JhclwiXHJcbiAgICAgICAgICAgIFtwYXVzZU9uSG92ZXJdPVwicGF1c2VPbkhvdmVyXCJcclxuICAgICAgICAgICAgW3RoZUNsYXNzXT1cInRoZUNsYXNzXCJcclxuICAgICAgICAgICAgW3J0bF09XCJydGxcIlxyXG4gICAgICAgICAgICBbYW5pbWF0ZV09XCJhbmltYXRlXCJcclxuICAgICAgICAgICAgW3Bvc2l0aW9uXT1cImlcIj5cclxuICAgIDwvc2ltcGxlLW5vdGlmaWNhdGlvbj5cclxuPC9kaXY+Il19