@hyahfoufi/ng-snotify
Version:
Angular 2+ alternative notifications center
272 lines • 34.2 kB
JavaScript
import { __decorate } from "tslib";
import { Inject, Injectable } from '@angular/core';
import { Subject, from } from 'rxjs';
import { TransformArgument } from '../decorators/transform-argument.decorator';
import { mergeDeep, uuid } from '../utils';
import { SetToastType } from '../decorators/set-toast-type.decorator';
import { SnotifyToast } from '../models/snotify-toast.model';
import { SnotifyStyle } from '../enums/snotify-style.enum';
import * as i0 from "@angular/core";
/**
* SnotifyService - create, remove, config toasts
*/
// tslint:disable:unified-signatures
export class SnotifyService {
config;
emitter = new Subject();
toastChanged = new Subject();
toastDeleted = new Subject();
notifications = [];
constructor(config) {
this.config = config;
}
/**
* emit changes in notifications array
*/
emit() {
this.emitter.next(this.notifications.slice());
}
/**
* returns SnotifyToast object
* @param id Number
* @return SnotifyToast|undefined
*/
get(id) {
return this.notifications.find(toast => toast.id === id);
}
/**
* add SnotifyToast to notifications array
* @param toast SnotifyToast
*/
add(toast) {
if (this.config.global.filterDuplicates && this.containsToast(toast)) {
return;
}
if (this.config.global.newOnTop) {
this.notifications.unshift(toast);
}
else {
this.notifications.push(toast);
}
this.emit();
}
/**
* checks if the toast is in the collection.
* @param inToast SnotifyToast
* @returns boolean
*/
containsToast(inToast) {
return this.notifications.some(toast => toast.equals(inToast));
}
/**
* If ID passed, emits toast animation remove, if ID & REMOVE passed, removes toast from notifications array
* @param id number
* @param remove boolean
*/
remove(id, remove) {
if (!id) {
return this.clear();
}
else if (remove) {
this.notifications = this.notifications.filter(toast => toast.id !== id);
return this.emit();
}
this.toastDeleted.next(id);
}
/**
* Clear notifications array
*/
clear() {
this.notifications = [];
this.emit();
}
/**
* Creates toast and add it to array, returns toast id
* @param snotify Snotify
* @return number
*/
create(snotify) {
const config = mergeDeep(this.config.toast, this.config.type[snotify.config.type], snotify.config);
const toast = new SnotifyToast(uuid(), snotify.title, snotify.body, config);
this.add(toast);
return toast;
}
setDefaults(defaults) {
return (this.config = mergeDeep(this.config, defaults));
}
/**
* Transform toast arguments into Snotify object
*/
simple(args) {
return this.create(args);
}
/**
* Transform toast arguments into Snotify object
*/
success(args) {
return this.create(args);
}
/**
* Transform toast arguments into Snotify object
*/
error(args) {
return this.create(args);
}
/**
* Transform toast arguments into Snotify object
*/
info(args) {
return this.create(args);
}
/**
* Transform toast arguments into Snotify object
*/
warning(args) {
return this.create(args);
}
/**
* Transform toast arguments into Snotify object
*/
confirm(args) {
return this.create(args);
}
/**
* Transform toast arguments into Snotify object
*/
prompt(args) {
return this.create(args);
}
/**
* Transform toast arguments into Snotify object
*/
async(args) {
let async;
if (args.action instanceof Promise) {
async = from(args.action);
}
else {
async = args.action;
}
const toast = this.create(args);
toast.on('mounted', () => {
const subscription = async.subscribe((next) => {
this.mergeToast(toast, next);
}, (error) => {
this.mergeToast(toast, error, SnotifyStyle.error);
subscription.unsubscribe();
}, () => {
this.mergeToast(toast, {}, SnotifyStyle.success);
subscription.unsubscribe();
});
});
return toast;
}
mergeToast(toast, next, type) {
if (next.body) {
toast.body = next.body;
}
if (next.title) {
toast.title = next.title;
}
if (type) {
toast.config = mergeDeep(toast.config, this.config.global, this.config.toast[type], { type }, next.config);
}
else {
toast.config = mergeDeep(toast.config, next.config);
}
if (next.html) {
toast.config.html = next.html;
}
this.emit();
this.toastChanged.next(toast);
}
/**
* Creates empty toast with html string inside
* @param html string | SafeHtml
* @param config SnotifyToastConfig
* @returns number
*/
html(html, config) {
return this.create({
title: null,
body: null,
config: {
...config,
...{ html }
}
});
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SnotifyService, deps: [{ token: 'SnotifyToastConfig' }], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SnotifyService });
}
__decorate([
TransformArgument
/**
* Determines current toast type and collects default configuration
*/
,
SetToastType
], SnotifyService.prototype, "simple", null);
__decorate([
TransformArgument
/**
* Determines current toast type and collects default configuration
*/
,
SetToastType
], SnotifyService.prototype, "success", null);
__decorate([
TransformArgument
/**
* Determines current toast type and collects default configuration
*/
,
SetToastType
], SnotifyService.prototype, "error", null);
__decorate([
TransformArgument
/**
* Determines current toast type and collects default configuration
*/
,
SetToastType
], SnotifyService.prototype, "info", null);
__decorate([
TransformArgument
/**
* Determines current toast type and collects default configuration
*/
,
SetToastType
], SnotifyService.prototype, "warning", null);
__decorate([
TransformArgument
/**
* Determines current toast type and collects default configuration
*/
,
SetToastType
], SnotifyService.prototype, "confirm", null);
__decorate([
TransformArgument
/**
* Determines current toast type and collects default configuration
*/
,
SetToastType
], SnotifyService.prototype, "prompt", null);
__decorate([
TransformArgument
/**
* Determines current toast type and collects default configuration
*/
,
SetToastType
], SnotifyService.prototype, "async", null);
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SnotifyService, decorators: [{
type: Injectable
}], ctorParameters: () => [{ type: undefined, decorators: [{
type: Inject,
args: ['SnotifyToastConfig']
}] }], propDecorators: { simple: [], success: [], error: [], info: [], warning: [], confirm: [], prompt: [], async: [] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25vdGlmeS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctc25vdGlmeS9zcmMvbGliL3NlcnZpY2VzL3Nub3RpZnkuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFjLE9BQU8sRUFBZ0IsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSy9ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUV0RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDOztBQUUzRDs7R0FFRztBQUVILG9DQUFvQztBQUNwQyxNQUFNLE9BQU8sY0FBYztJQU13QjtJQUx4QyxPQUFPLEdBQUcsSUFBSSxPQUFPLEVBQWtCLENBQUM7SUFDeEMsWUFBWSxHQUFHLElBQUksT0FBTyxFQUFnQixDQUFDO0lBQzNDLFlBQVksR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO0lBQ3RDLGFBQWEsR0FBbUIsRUFBRSxDQUFDO0lBRTNDLFlBQWlELE1BQXVCO1FBQXZCLFdBQU0sR0FBTixNQUFNLENBQWlCO0lBQUcsQ0FBQztJQUM1RTs7T0FFRztJQUNLLElBQUk7UUFDVixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxHQUFHLENBQUMsRUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLGFB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Q0FBQztRQUNaLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILElBQUksQ0FBQyxJQUF1QixFQUFFLE1BQTJCO1FBQ3ZELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUNqQixLQUFLLEVBQUUsSUFBSTtZQUNYLElBQUksRUFBRSxJQUFJO1lBQ1YsTUFBTSxFQUFFO2dCQUNOLEdBQUcsTUFBTTtnQkFDVCxHQUFHLEVBQUUsSUFBSSxFQUFFO2FBQ1o7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO3dHQTNkVSxjQUFjLGtCQU1MLG9CQUFvQjs0R0FON0IsY0FBYzs7QUEySHpCO0lBTEMsaUJBQWlCO0lBQ2xCOztPQUVHOztJQUNGLFlBQVk7NENBR1o7QUFzQ0Q7SUFMQyxpQkFBaUI7SUFDbEI7O09BRUc7O0lBQ0YsWUFBWTs2Q0FHWjtBQXNDRDtJQUxDLGlCQUFpQjtJQUNsQjs7T0FFRzs7SUFDRixZQUFZOzJDQUdaO0FBc0NEO0lBTEMsaUJBQWlCO0lBQ2xCOztPQUVHOztJQUNGLFlBQVk7MENBR1o7QUFzQ0Q7SUFMQyxpQkFBaUI7SUFDbEI7O09BRUc7O0lBQ0YsWUFBWTs2Q0FHWjtBQXNDRDtJQUxDLGlCQUFpQjtJQUNsQjs7T0FFRzs7SUFDRixZQUFZOzZDQUdaO0FBc0NEO0lBTEMsaUJBQWlCO0lBQ2xCOztPQUVHOztJQUNGLFlBQVk7NENBR1o7QUErQ0Q7SUFMQyxpQkFBaUI7SUFDbEI7O09BRUc7O0lBQ0YsWUFBWTsyQ0E0Qlo7NEZBdmJVLGNBQWM7a0JBRjFCLFVBQVU7OzBCQVFJLE1BQU07MkJBQUMsb0JBQW9CO3lDQXFIeEMsTUFBTSxNQXdDTixPQUFPLE1Bd0NQLEtBQUssTUF3Q0wsSUFBSSxNQXdDSixPQUFPLE1Bd0NQLE9BQU8sTUF3Q1AsTUFBTSxNQWlETixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIGZyb20gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFNub3RpZnlUb2FzdENvbmZpZyB9IGZyb20gJy4uL2ludGVyZmFjZXMvc25vdGlmeS10b2FzdC1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7IFNub3RpZnkgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3Nub3RpZnkuaW50ZXJmYWNlJztcbmltcG9ydCB7IFNub3RpZnlUeXBlVHlwZSB9IGZyb20gJy4uL3R5cGVzL3Nub3RpZnktdHlwZS50eXBlJztcbmltcG9ydCB7IFNhZmVIdG1sIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBUcmFuc2Zvcm1Bcmd1bWVudCB9IGZyb20gJy4uL2RlY29yYXRvcnMvdHJhbnNmb3JtLWFyZ3VtZW50LmRlY29yYXRvcic7XG5pbXBvcnQgeyBtZXJnZURlZXAsIHV1aWQgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBTZXRUb2FzdFR5cGUgfSBmcm9tICcuLi9kZWNvcmF0b3JzL3NldC10b2FzdC10eXBlLmRlY29yYXRvcic7XG5pbXBvcnQgeyBTbm90aWZ5RGVmYXVsdHMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3Nub3RpZnktZGVmYXVsdHMuaW50ZXJmYWNlJztcbmltcG9ydCB7IFNub3RpZnlUb2FzdCB9IGZyb20gJy4uL21vZGVscy9zbm90aWZ5LXRvYXN0Lm1vZGVsJztcbmltcG9ydCB7IFNub3RpZnlTdHlsZSB9IGZyb20gJy4uL2VudW1zL3Nub3RpZnktc3R5bGUuZW51bSc7XG5cbi8qKlxuICogU25vdGlmeVNlcnZpY2UgLSBjcmVhdGUsIHJlbW92ZSwgY29uZmlnIHRvYXN0c1xuICovXG5ASW5qZWN0YWJsZSgpXG4vLyB0c2xpbnQ6ZGlzYWJsZTp1bmlmaWVkLXNpZ25hdHVyZXNcbmV4cG9ydCBjbGFzcyBTbm90aWZ5U2VydmljZSB7XG4gIHJlYWRvbmx5IGVtaXR0ZXIgPSBuZXcgU3ViamVjdDxTbm90aWZ5VG9hc3RbXT4oKTtcbiAgcmVhZG9ubHkgdG9hc3RDaGFuZ2VkID0gbmV3IFN1YmplY3Q8U25vdGlmeVRvYXN0PigpO1xuICByZWFkb25seSB0b2FzdERlbGV0ZWQgPSBuZXcgU3ViamVjdDxudW1iZXI+KCk7XG4gIHByaXZhdGUgbm90aWZpY2F0aW9uczogU25vdGlmeVRvYXN0W10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KCdTbm90aWZ5VG9hc3RDb25maWcnKSBwdWJsaWMgY29uZmlnOiBTbm90aWZ5RGVmYXVsdHMpIHt9XG4gIC8qKlxuICAgKiBlbWl0IGNoYW5nZXMgaW4gbm90aWZpY2F0aW9ucyBhcnJheVxuICAgKi9cbiAgcHJpdmF0ZSBlbWl0KCk6IHZvaWQge1xuICAgIHRoaXMuZW1pdHRlci5uZXh0KHRoaXMubm90aWZpY2F0aW9ucy5zbGljZSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm5zIFNub3RpZnlUb2FzdCBvYmplY3RcbiAgICogQHBhcmFtIGlkIE51bWJlclxuICAgKiBAcmV0dXJuIFNub3RpZnlUb2FzdHx1bmRlZmluZWRcbiAgICovXG4gIGdldChpZDogbnVtYmVyKTogU25vdGlmeVRvYXN0IHtcbiAgICByZXR1cm4gdGhpcy5ub3RpZmljYXRpb25zLmZpbmQodG9hc3QgPT4gdG9hc3QuaWQgPT09IGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBhZGQgU25vdGlmeVRvYXN0IHRvIG5vdGlmaWNhdGlvbnMgYXJyYXlcbiAgICogQHBhcmFtIHRvYXN0IFNub3RpZnlUb2FzdFxuICAgKi9cbiAgcHJpdmF0ZSBhZGQodG9hc3Q6IFNub3RpZnlUb2FzdCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbmZpZy5nbG9iYWwuZmlsdGVyRHVwbGljYXRlcyAmJiB0aGlzLmNvbnRhaW5zVG9hc3QodG9hc3QpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbmZpZy5nbG9iYWwubmV3T25Ub3ApIHtcbiAgICAgIHRoaXMubm90aWZpY2F0aW9ucy51bnNoaWZ0KHRvYXN0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5ub3RpZmljYXRpb25zLnB1c2godG9hc3QpO1xuICAgIH1cbiAgICB0aGlzLmVtaXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBjaGVja3MgaWYgdGhlIHRvYXN0IGlzIGluIHRoZSBjb2xsZWN0aW9uLlxuICAgKiBAcGFyYW0gaW5Ub2FzdCBTbm90aWZ5VG9hc3RcbiAgICogQHJldHVybnMgYm9vbGVhblxuICAgKi9cbiAgcHJpdmF0ZSBjb250YWluc1RvYXN0KGluVG9hc3Q6IFNub3RpZnlUb2FzdCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm5vdGlmaWNhdGlvbnMuc29tZSh0b2FzdCA9PiB0b2FzdC5lcXVhbHMoaW5Ub2FzdCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIElEIHBhc3NlZCwgZW1pdHMgdG9hc3QgYW5pbWF0aW9uIHJlbW92ZSwgaWYgSUQgJiBSRU1PVkUgcGFzc2VkLCByZW1vdmVzIHRvYXN0IGZyb20gbm90aWZpY2F0aW9ucyBhcnJheVxuICAgKiBAcGFyYW0gaWQgbnVtYmVyXG4gICAqIEBwYXJhbSByZW1vdmUgYm9vbGVhblxuICAgKi9cbiAgcmVtb3ZlKGlkPzogbnVtYmVyLCByZW1vdmU/OiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCFpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuY2xlYXIoKTtcbiAgICB9IGVsc2UgaWYgKHJlbW92ZSkge1xuICAgICAgdGhpcy5ub3RpZmljYXRpb25zID0gdGhpcy5ub3RpZmljYXRpb25zLmZpbHRlcih0b2FzdCA9PiB0b2FzdC5pZCAhPT0gaWQpO1xuICAgICAgcmV0dXJuIHRoaXMuZW1pdCgpO1xuICAgIH1cbiAgICB0aGlzLnRvYXN0RGVsZXRlZC5uZXh0KGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBub3RpZmljYXRpb25zIGFycmF5XG4gICAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLm5vdGlmaWNhdGlvbnMgPSBbXTtcbiAgICB0aGlzLmVtaXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRvYXN0IGFuZCBhZGQgaXQgdG8gYXJyYXksIHJldHVybnMgdG9hc3QgaWRcbiAgICogQHBhcmFtIHNub3RpZnkgU25vdGlmeVxuICAgKiBAcmV0dXJuIG51bWJlclxuICAgKi9cbiAgY3JlYXRlKHNub3RpZnk6IFNub3RpZnkpOiBTbm90aWZ5VG9hc3Qge1xuICAgIGNvbnN0IGNvbmZpZyA9IG1lcmdlRGVlcCh0aGlzLmNvbmZpZy50b2FzdCwgdGhpcy5jb25maWcudHlwZVtzbm90aWZ5LmNvbmZpZy50eXBlXSwgc25vdGlmeS5jb25maWcpO1xuICAgIGNvbnN0IHRvYXN0ID0gbmV3IFNub3RpZnlUb2FzdCh1dWlkKCksIHNub3RpZnkudGl0bGUsIHNub3RpZnkuYm9keSwgY29uZmlnKTtcbiAgICB0aGlzLmFkZCh0b2FzdCk7XG4gICAgcmV0dXJuIHRvYXN0O1xuICB9XG5cbiAgc2V0RGVmYXVsdHMoZGVmYXVsdHM6IFNub3RpZnlEZWZhdWx0cyk6IFNub3RpZnlEZWZhdWx0cyB7XG4gICAgcmV0dXJuICh0aGlzLmNvbmZpZyA9IG1lcmdlRGVlcCh0aGlzLmNvbmZpZywgZGVmYXVsdHMpIGFzIFNub3RpZnlEZWZhdWx0cyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRvYXN0IHdpdGggc2ltcGxlIHN0eWxlIHJldHVybnMgdG9hc3QgaWQ7XG4gICAqIEBwYXJhbSBib2R5IHN0cmluZ1xuICAgKiBAcmV0dXJucyBudW1iZXJcbiAgICovXG4gIHNpbXBsZShib2R5OiBzdHJpbmcpOiBTbm90aWZ5VG9hc3Q7XG4gIC8qKlxuICAgKiBDcmVhdGUgdG9hc3Qgd2l0aCBzaW1wbGUgc3R5bGUgcmV0dXJucyB0b2FzdCBpZDtcbiAgICogQHBhcmFtIGJvZHkgc3RyaW5nXG4gICAqIEBwYXJhbSB0aXRsZSBzdHJpbmdcbiAgICogQHJldHVybnMgbnVtYmVyXG4gICAqL1xuICBzaW1wbGUoYm9keTogc3RyaW5nLCB0aXRsZTogc3RyaW5nKTogU25vdGlmeVRvYXN0O1xuICAvKipcbiAgICogQ3JlYXRlIHRvYXN0IHdpdGggc2ltcGxlIHN0eWxlIHJldHVybnMgdG9hc3QgaWQ7XG4gICAqIEBwYXJhbSBib2R5IHN0cmluZ1xuICAgKiBAcGFyYW0gY29uZmlnIFNub3RpZnlUb2FzdENvbmZpZ1xuICAgKiBAcmV0dXJucyBudW1iZXJcbiAgICovXG4gIHNpbXBsZShib2R5OiBzdHJpbmcsIGNvbmZpZzogU25vdGlmeVRvYXN0Q29uZmlnKTogU25vdGlmeVRvYXN0O1xuICAvKipcbiAgICogQ3JlYXRlIHRvYXN0IHdpdGggc2ltcGxlIHN0eWxlICByZXR1cm5zIHRvYXN0IGlkO1xuICAgKiBAcGFyYW0gW2JvZHldIHN0cmluZ1xuICAgKiBAcGFyYW0gW3RpdGxlXSBzdHJpbmdcbiAgICogQHBhcmFtIFtjb25maWddIFNub3RpZnlUb2FzdENvbmZpZ1xuICAgKiBAcmV0dXJucyBudW1iZXJcbiAgICovXG4gIHNpbXBsZShib2R5OiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcsIGNvbmZpZzogU25vdGlmeVRvYXN0Q29uZmlnKTogU25vdGlmeVRvYXN0O1xuICAvKipcbiAgICogVHJhbnNmb3JtIHRvYXN0IGFyZ3VtZW50cyBpbnRvIFNub3RpZnkgb2JqZWN0XG4gICAqL1xuICBAVHJhbnNmb3JtQXJndW1lbnRcbiAgLyoqXG4gICAqIERldGVybWluZXMgY3VycmVudCB0b2FzdCB0eXBlIGFuZCBjb2xsZWN0cyBkZWZhdWx0IGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIEBTZXRUb2FzdFR5cGVcbiAgc2ltcGxlKGFyZ3M6IGFueSk6IFNub3RpZnlUb2FzdCB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKGFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0b2FzdCB3aXRoIHN1Y2Nlc3Mgc3R5bGUgcmV0dXJucyB0b2FzdCBpZDtcbiAgICogQHBhcmFtIGJvZHkgc3RyaW5nXG4gICAqIEByZXR1cm5zIG51bWJlclxuICAgKi9cbiAgc3VjY2Vzcyhib2R5OiBzdHJpbmcpOiBTbm90aWZ5VG9hc3Q7XG4gIC8qKlxuICAgKiBDcmVhdGUgdG9hc3Qgd2l0aCBzdWNjZXNzIHN0eWxlIHJldHVybnMgdG9hc3QgaWQ7XG4gICAqIEBwYXJhbSBib2R5IHN0cmluZ1xuICAgKiBAcGFyYW0gdGl0bGUgc3RyaW5nXG4gICAqIEByZXR1cm5zIG51bWJlclxuICAgKi9cbiAgc3VjY2Vzcyhib2R5OiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcpOiBTbm90aWZ5VG9hc3Q7XG4gIC8qKlxuICAgKiBDcmVhdGUgdG9hc3Qgd2l0aCBzdWNjZXNzIHN0eWxlIHJldHVybnMgdG9hc3QgaWQ7XG4gICAqIEBwYXJhbSBib2R5IHN0cmluZ1xuICAgKiBAcGFyYW0gY29uZmlnIFNub3RpZnlUb2FzdENvbmZpZ1xuICAgKiBAcmV0dXJucyBudW1iZXJcbiAgICovXG4gIHN1Y2Nlc3MoYm9keTogc3RyaW5nLCBjb25maWc6IFNub3RpZnlUb2FzdENvbmZpZyk6IFNub3RpZnlUb2FzdDtcbiAgLyoqXG4gICAqIENyZWF0ZSB0b2FzdCB3aXRoIHN1Y2Nlc3Mgc3R5bGUgIHJldHVybnMgdG9hc3QgaWQ7XG4gICAqIEBwYXJhbSBbYm9keV0gc3RyaW5nXG4gICAqIEBwYXJhbSBbdGl0bGVdIHN0cmluZ1xuICAgKiBAcGFyYW0gW2NvbmZpZ10gU25vdGlmeVRvYXN0Q29uZmlnXG4gICAqIEByZXR1cm5zIG51bWJlclxuICAgKi9cbiAgc3VjY2Vzcyhib2R5OiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcsIGNvbmZpZzogU25vdGlmeVRvYXN0Q29uZmlnKTogU25vdGlmeVRvYXN0O1xuICAvKipcbiAgICogVHJhbnNmb3JtIHRvYXN0IGFyZ3VtZW50cyBpbnRvIFNub3RpZnkgb2JqZWN0XG4gICAqL1xuICBAVHJhbnNmb3JtQXJndW1lbnRcbiAgLyoqXG4gICAqIERldGVybWluZXMgY3VycmVudCB0b2FzdCB0eXBlIGFuZCBjb2xsZWN0cyBkZWZhdWx0IGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIEBTZXRUb2FzdFR5cGVcbiAgc3VjY2VzcyhhcmdzOiBhbnkpOiBTbm90aWZ5VG9hc3Qge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShhcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdG9hc3Qgd2l0aCBlcnJvciBzdHlsZSByZXR1cm5zIHRvYXN0IGlkO1xuICAgKiBAcGFyYW0gYm9keSBzdHJpbmdcbiAgICogQHJldHVybnMgbnVtYmVyXG4gICAqL1xuICBlcnJvcihib2R5OiBzdHJpbmcpOiBTbm90aWZ5VG9hc3Q7XG4gIC8qKlxuICAgKiBDcmVhdGUgdG9hc3Qgd2l0aCBlcnJvciBzdHlsZSByZXR1cm5zIHRvYXN0IGlkO1xuICAgKiBAcGFyYW0gYm9keSBzdHJpbmdcbiAgICogQHBhcmFtIHRpdGxlIHN0cmluZ1xuICAgKiBAcmV0dXJucyBudW1iZXJcbiAgICovXG4gIGVycm9yKGJvZHk6IHN0cmluZywgdGl0bGU6IHN0cmluZyk6IFNub3RpZnlUb2FzdDtcbiAgLyoqXG4gICAqIENyZWF0ZSB0b2FzdCB3aXRoIGVycm9yIHN0eWxlIHJldHVybnMgdG9hc3QgaWQ7XG4gICAqIEBwYXJhbSBib2R5IHN0cmluZ1xuICAgKiBAcGFyYW0gY29uZmlnIFNub3RpZnlUb2FzdENvbmZpZ1xuICAgKiBAcmV0dXJucyBudW1iZXJcbiAgICovXG4gIGVycm9yKGJvZHk6IHN0cmluZywgY29uZmlnOiBTbm90aWZ5VG9hc3RDb25maWcpOiBTbm90aWZ5VG9hc3Q7XG4gIC8qKlxuICAgKiBDcmVhdGUgdG9hc3Qgd2l0aCBlcnJvciBzdHlsZSAgcmV0dXJucyB0b2FzdCBpZDtcbiAgICogQHBhcmFtIFtib2R5XSBzdHJpbmdcbiAgICogQHBhcmFtIFt0aXRsZV0gc3RyaW5nXG4gICAqIEBwYXJhbSBbY29uZmlnXSBTbm90aWZ5VG9hc3RDb25maWdcbiAgICogQHJldHVybnMgbnVtYmVyXG4gICAqL1xuICBlcnJvcihib2R5OiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcsIGNvbmZpZzogU25vdGlmeVRvYXN0Q29uZmlnKTogU25vdGlmeVRvYXN0O1xuICAvKipcbiAgICogVHJhbnNmb3JtIHRvYXN0IGFyZ3VtZW50cyBpbnRvIFNub3RpZnkgb2JqZWN0XG4gICAqL1xuICBAVHJhbnNmb3JtQXJndW1lbnRcbiAgLyoqXG4gICAqIERldGVybWluZXMgY3VycmVudCB0b2FzdCB0eXBlIGFuZCBjb2xsZWN0cyBkZWZhdWx0IGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIEBTZXRUb2FzdFR5cGVcbiAgZXJyb3IoYXJnczogYW55KTogU25vdGlmeVRvYXN0IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRvYXN0IHdpdGggaW5mbyBzdHlsZSByZXR1cm5zIHRvYXN0IGlkO1xuICAgKiBAcGFyYW0gYm9keSBzdHJpbmdcbiAgICogQHJldHVybnMgbnVtYmVyXG4gICAqL1xuICBpbmZvKGJvZHk6IHN0cmluZyk6IFNub3RpZnlUb2FzdDtcbiAgLyoqXG4gICAqIENyZWF0ZSB0b2FzdCB3aXRoIGluZm8gc3R5bGUgcmV0dXJucyB0b2FzdCBpZDtcbiAgICogQHBhcmFtIGJvZHkgc3RyaW5nXG4gICAqIEBwYXJhbSB0aXRsZSBzdHJpbmdcbiAgICogQHJldHVybnMgbnVtYmVyXG4gICAqL1xuICBpbmZvKGJvZHk6IHN0cmluZywgdGl0bGU6IHN0cmluZyk6IFNub3RpZnlUb2FzdDtcbiAgLyoqXG4gICAqIENyZWF0ZSB0b2FzdCB3aXRoIGluZm8gc3R5bGUgcmV0dXJucyB0b2FzdCBpZDtcbiAgICogQHBhcmFtIGJvZHkgc3RyaW5nXG4gICAqIEBwYXJhbSBjb25maWcgU25vdGlmeVRvYXN0Q29uZmlnXG4gICAqIEByZXR1cm5zIG51bWJlclxuICAgKi9cbiAgaW5mbyhib2R5OiBzdHJpbmcsIGNvbmZpZzogU25vdGlmeVRvYXN0Q29uZmlnKTogU25vdGlmeVRvYXN0O1xuICAvKipcbiAgICogQ3JlYXRlIHRvYXN0IHdpdGggaW5mbyBzdHlsZSAgcmV0dXJucyB0b2FzdCBpZDtcbiAgICogQHBhcmFtIFtib2R5XSBzdHJpbmdcbiAgICogQHBhcmFtIFt0aXRsZV0gc3RyaW5nXG4gICAqIEBwYXJhbSBbY29uZmlnXSBTbm90aWZ5VG9hc3RDb25maWdcbiAgICogQHJldHVybnMgbnVtYmVyXG4gICAqL1xuICBpbmZvKGJvZHk6IHN0cmluZywgdGl0bGU6IHN0cmluZywgY29uZmlnOiBTbm90aWZ5VG9hc3RDb25maWcpOiBTbm90aWZ5VG9hc3Q7XG4gIC8qKlxuICAgKiBUcmFuc2Zvcm0gdG9hc3QgYXJndW1lbnRzIGludG8gU25vdGlmeSBvYmplY3RcbiAgICovXG4gIEBUcmFuc2Zvcm1Bcmd1bWVudFxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBjdXJyZW50IHRvYXN0IHR5cGUgYW5kIGNvbGxlY3RzIGRlZmF1bHQgY29uZmlndXJhdGlvblxuICAgKi9cbiAgQFNldFRvYXN0VHlwZVxuICBpbmZvKGFyZ3M6IGFueSk6IFNub3RpZnlUb2FzdCB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKGFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0b2FzdCB3aXRoIHdhcm5pbmcgc3R5bGUgcmV0dXJucyB0b2FzdCBpZDtcbiAgICogQHBhcmFtIGJvZHkgc3RyaW5nXG4gICAqIEByZXR1cm5zIG51bWJlclxuICAgKi9cbiAgd2FybmluZyhib2R5OiBzdHJpbmcpOiBTbm90aWZ5VG9hc3Q7XG4gIC8qKlxuICAgKiBDcmVhdGUgdG9hc3Qgd2l0aCB3YXJuaW5nIHN0eWxlIHJldHVybnMgdG9hc3QgaWQ7XG4gICAqIEBwYXJhbSBib2R5IHN0cmluZ1xuICAgKiBAcGFyYW0gdGl0bGUgc3RyaW5nXG4gICAqIEByZXR1cm5zIG51bWJlclxuICAgKi9cbiAgd2FybmluZyhib2R5OiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcpOiBTbm90aWZ5VG9hc3Q7XG4gIC8qKlxuICAgKiBDcmVhdGUgdG9hc3Qgd2l0aCB3YXJuaW5nIHN0eWxlIHJldHVybnMgdG9hc3QgaWQ7XG4gICAqIEBwYXJhbSBib2R5IHN0cmluZ1xuICAgKiBAcGFyYW0gY29uZmlnIFNub3RpZnlUb2FzdENvbmZpZ1xuICAgKiBAcmV0dXJucyBudW1iZXJcbiAgICovXG4gIHdhcm5pbmcoYm9keTogc3RyaW5nLCBjb25maWc6IFNub3RpZnlUb2FzdENvbmZpZyk6IFNub3RpZnlUb2FzdDtcbiAgLyoqXG4gICAqIENyZWF0ZSB0b2FzdCB3aXRoIHdhcm5pbmcgc3R5bGUgIHJldHVybnMgdG9hc3QgaWQ7XG4gICAqIEBwYXJhbSBbYm9keV0gc3RyaW5nXG4gICAqIEBwYXJhbSBbdGl0bGVdIHN0cmluZ1xuICAgKiBAcGFyYW0gW2NvbmZpZ10gU25vdGlmeVRvYXN0Q29uZmlnXG4gICAqIEByZXR1cm5zIG51bWJlclxuICAgKi9cbiAgd2FybmluZyhib2R5OiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcsIGNvbmZpZzogU25vdGlmeVRvYXN0Q29uZmlnKTogU25vdGlmeVRvYXN0O1xuICAvKipcbiAgICogVHJhbnNmb3JtIHRvYXN0IGFyZ3VtZW50cyBpbnRvIFNub3RpZnkgb2JqZWN0XG4gICAqL1xuICBAVHJhbnNmb3JtQXJndW1lbnRcbiAgLyoqXG4gICAqIERldGVybWluZXMgY3VycmVudCB0b2FzdCB0eXBlIGFuZCBjb2xsZWN0cyBkZWZhdWx0IGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIEBTZXRUb2FzdFR5cGVcbiAgd2FybmluZyhhcmdzOiBhbnkpOiBTbm90aWZ5VG9hc3Qge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShhcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdG9hc3Qgd2l0aCBjb25maXJtIHN0eWxlIHJldHVybnMgdG9hc3QgaWQ7XG4gICAqIEBwYXJhbSBib2R5IHN0cmluZ1xuICAgKiBAcmV0dXJucyBudW1iZXJcbiAgICovXG4gIGNvbmZpcm0oYm9keTogc3RyaW5nKTogU25vdGlmeVRvYXN0O1xuICAvKipcbiAgICogQ3JlYXRlIHRvYXN0IHdpdGggY29uZmlybSBzdHlsZSByZXR1cm5zIHRvYXN0IGlkO1xuICAgKiBAcGFyYW0gYm9keSBzdHJpbmdcbiAgICogQHBhcmFtIHRpdGxlIHN0cmluZ1xuICAgKiBAcmV0dXJucyBudW1iZXJcbiAgICovXG4gIGNvbmZpcm0oYm9keTogc3RyaW5nLCB0aXRsZTogc3RyaW5nKTogU25vdGlmeVRvYXN0O1xuICAvKipcbiAgICogQ3JlYXRlIHRvYXN0IHdpdGggY29uZmlybSBzdHlsZSByZXR1cm5zIHRvYXN0IGlkO1xuICAgKiBAcGFyYW0gYm9keSBzdHJpbmdcbiAgICogQHBhcmFtIGNvbmZpZyBTbm90aWZ5VG9hc3RDb25maWdcbiAgICogQHJldHVybnMgbnVtYmVyXG4gICAqL1xuICBjb25maXJtKGJvZHk6IHN0cmluZywgY29uZmlnOiBTbm90aWZ5VG9hc3RDb25maWcpOiBTbm90aWZ5VG9hc3Q7XG4gIC8qKlxuICAgKiBDcmVhdGUgdG9hc3Qgd2l0aCBjb25maXJtIHN0eWxlICByZXR1cm5zIHRvYXN0IGlkO1xuICAgKiBAcGFyYW0gW2JvZHldIHN0cmluZ1xuICAgKiBAcGFyYW0gW3RpdGxlXSBzdHJpbmdcbiAgICogQHBhcmFtIFtjb25maWddIFNub3RpZnlUb2FzdENvbmZpZ1xuICAgKiBAcmV0dXJucyBudW1iZXJcbiAgICovXG4gIGNvbmZpcm0oYm9keTogc3RyaW5nLCB0aXRsZTogc3RyaW5nLCBjb25maWc6IFNub3RpZnlUb2FzdENvbmZpZyk6IFNub3RpZnlUb2FzdDtcbiAgLyoqXG4gICAqIFRyYW5zZm9ybSB0b2FzdCBhcmd1bWVudHMgaW50byBTbm90aWZ5IG9iamVjdFxuICAgKi9cbiAgQFRyYW5zZm9ybUFyZ3VtZW50XG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIGN1cnJlbnQgdG9hc3QgdHlwZSBhbmQgY29sbGVjdHMgZGVmYXVsdCBjb25maWd1cmF0aW9uXG4gICAqL1xuICBAU2V0VG9hc3RUeXBlXG4gIGNvbmZpcm0oYXJnczogYW55KTogU25vdGlmeVRvYXN0IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRvYXN0IHdpdGggUHJvbXB0IHN0eWxlIHdpdGggdHdvIGJ1dHRvbnMsIHJldHVybnMgdG9hc3QgaWQ7XG4gICAqIEBwYXJhbSBib2R5IHN0cmluZ1xuICAgKiBAcmV0dXJucyBudW1iZXJcbiAgICovXG4gIHByb21wdChib2R5OiBzdHJpbmcpOiBTbm90aWZ5VG9hc3Q7XG4gIC8qKlxuICAgKiBDcmVhdGUgdG9hc3Qgd2l0aCBQcm9tcHQgc3R5bGUgd2l0aCB0d28gYnV0dG9ucywgcmV0dXJucyB0b2FzdCBpZDtcbiAgICogQHBhcmFtIGJvZHkgc3RyaW5nXG4gICAqIEBwYXJhbSB0aXRsZSBzdHJpbmdcbiAgICogQHJldHVybnMgbnVtYmVyXG4gICAqL1xuICBwcm9tcHQoYm9keTogc3RyaW5nLCB0aXRsZTogc3RyaW5nKTogU25vdGlmeVRvYXN0O1xuICAvKipcbiAgICogQ3JlYXRlIHRvYXN0IHdpdGggUHJvbXB0IHN0eWxlIHdpdGggdHdvIGJ1dHRvbnMsIHJldHVybnMgdG9hc3QgaWQ7XG4gICAqIEBwYXJhbSBib2R5IHN0cmluZ1xuICAgKiBAcGFyYW0gY29uZmlnIFNub3RpZnlUb2FzdENvbmZpZ1xuICAgKiBAcmV0dXJucyBudW1iZXJcbiAgICovXG4gIHByb21wdChib2R5OiBzdHJpbmcsIGNvbmZpZzogU25vdGlmeVRvYXN0Q29uZmlnKTogU25vdGlmeVRvYXN0O1xuICAvKipcbiAgICogQ3JlYXRlIHRvYXN0IHdpdGggUHJvbXB0IHN0eWxlIHdpdGggdHdvIGJ1dHRvbnMsIHJldHVybnMgdG9hc3QgaWQ7XG4gICAqIEBwYXJhbSBbYm9keV0gc3RyaW5nXG4gICAqIEBwYXJhbSBbdGl0bGVdIHN0cmluZ1xuICAgKiBAcGFyYW0gW2NvbmZpZ10gU25vdGlmeVRvYXN0Q29uZmlnXG4gICAqIEByZXR1cm5zIG51bWJlclxuICAgKi9cbiAgcHJvbXB0KGJvZHk6IHN0cmluZywgdGl0bGU6IHN0cmluZywgY29uZmlnOiBTbm90aWZ5VG9hc3RDb25maWcpOiBTbm90aWZ5VG9hc3Q7XG4gIC8qKlxuICAgKiBUcmFuc2Zvcm0gdG9hc3QgYXJndW1lbnRzIGludG8gU25vdGlmeSBvYmplY3RcbiAgICovXG4gIEBUcmFuc2Zvcm1Bcmd1bWVudFxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBjdXJyZW50IHRvYXN0IHR5cGUgYW5kIGNvbGxlY3RzIGRlZmF1bHQgY29uZmlndXJhdGlvblxuICAgKi9cbiAgQFNldFRvYXN0VHlwZVxuICBwcm9tcHQoYXJnczogYW55KTogU25vdGlmeVRvYXN0IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhc3luYyB0b2FzdCB3aXRoIEluZm8gc3R5bGUuIFBhc3MgYWN0aW9uLCBhbmQgcmVzb2x2ZSBvciByZWplY3QgaXQuXG4gICAqIEBwYXJhbSBib2R5IHN0cmluZ1xuICAgKiBAcGFyYW0gYWN0aW9uIFByb21pc2U8U25vdGlmeT4gfCBPYnNlcnZhYmxlPFNub3RpZnk+XG4gICAqIEByZXR1cm5zIG51bWJlclxuICAgKi9cbiAgYXN5bmMoYm9keTogc3RyaW5nLCBhY3Rpb246IFByb21pc2U8U25vdGlmeT4gfCBPYnNlcnZhYmxlPFNub3RpZnk+KTogU25vdGlmeVRvYXN0O1xuICAvKipcbiAgICogQ3JlYXRlcyBhc3luYyB0b2FzdCB3aXRoIEluZm8gc3R5bGUuIFBhc3MgYWN0aW9uLCBhbmQgcmVzb2x2ZSBvciByZWplY3QgaXQuXG4gICAqIEBwYXJhbSBib2R5IHN0cmluZ1xuICAgKiBAcGFyYW0gdGl0bGUgc3RyaW5nXG4gICAqIEBwYXJhbSBhY3Rpb24gUHJvbWlzZTxTbm90aWZ5PiB8IE9ic2VydmFibGU8U25vdGlmeT5cbiAgICogQHJldHVybnMgbnVtYmVyXG4gICAqL1xuICBhc3luYyhib2R5OiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcsIGFjdGlvbjogUHJvbWlzZTxTbm90aWZ5PiB8IE9ic2VydmFibGU8U25vdGlmeT4pOiBTbm90aWZ5VG9hc3Q7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGFzeW5jIHRvYXN0IHdpdGggSW5mbyBzdHlsZS4gUGFzcyBhY3Rpb24sIGFuZCByZXNvbHZlIG9yIHJlamVjdCBpdC5cbiAgICogQHBhcmFtIGJvZHkgc3RyaW5nXG4gICAqIEBwYXJhbSBhY3Rpb24gUHJvbWlzZTxTbm90aWZ5PiB8IE9ic2VydmFibGU8U25vdGlmeT5cbiAgICogQHBhcmFtIFtjb25maWddIFNub3RpZnlUb2FzdENvbmZpZ1xuICAgKiBAcmV0dXJucyBudW1iZXJcbiAgICovXG4gIGFzeW5jKGJvZHk6IHN0cmluZywgYWN0aW9uOiBQcm9taXNlPFNub3RpZnk+IHwgT2JzZXJ2YWJsZTxTbm90aWZ5PiwgY29uZmlnOiBTbm90aWZ5VG9hc3RDb25maWcpOiBTbm90aWZ5VG9hc3Q7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGFzeW5jIHRvYXN0IHdpdGggSW5mbyBzdHlsZS4gUGFzcyBhY3Rpb24sIGFuZCByZXNvbHZlIG9yIHJlamVjdCBpdC5cbiAgICogQHBhcmFtIGJvZHkgc3RyaW5nXG4gICAqIEBwYXJhbSB0aXRsZSBzdHJpbmdcbiAgICogQHBhcmFtIGFjdGlvbiBQcm9taXNlPFNub3RpZnk+IHwgT2JzZXJ2YWJsZTxTbm90aWZ5PlxuICAgKiBAcGFyYW0gW2NvbmZpZ10gU25vdGlmeVRvYXN0Q29uZmlnXG4gICAqIEByZXR1cm5zIG51bWJlclxuICAgKi9cbiAgYXN5bmMoXG4gICAgYm9keTogc3RyaW5nLFxuICAgIHRpdGxlOiBzdHJpbmcsXG4gICAgYWN0aW9uOiBQcm9taXNlPFNub3RpZnk+IHwgT2JzZXJ2YWJsZTxTbm90aWZ5PixcbiAgICBjb25maWc6IFNub3RpZnlUb2FzdENvbmZpZ1xuICApOiBTbm90aWZ5VG9hc3Q7XG4gIC8qKlxuICAgKiBUcmFuc2Zvcm0gdG9hc3QgYXJndW1lbnRzIGludG8gU25vdGlmeSBvYmplY3RcbiAgICovXG4gIEBUcmFuc2Zvcm1Bcmd1bWVudFxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBjdXJyZW50IHRvYXN0IHR5cGUgYW5kIGNvbGxlY3RzIGRlZmF1bHQgY29uZmlndXJhdGlvblxuICAgKi9cbiAgQFNldFRvYXN0VHlwZVxuICBhc3luYyhhcmdzOiBhbnkpOiBTbm90aWZ5VG9hc3Qge1xuICAgIGxldCBhc3luYzogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIGlmIChhcmdzLmFjdGlvbiBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgIGFzeW5jID0gZnJvbShhcmdzLmFjdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzeW5jID0gYXJncy5hY3Rpb247XG4gICAgfVxuXG4gICAgY29uc3QgdG9hc3QgPSB0aGlzLmNyZWF0ZShhcmdzKTtcblxuICAgIHRvYXN0Lm9uKCdtb3VudGVkJywgKCkgPT4ge1xuICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gPSBhc3luYy5zdWJzY3JpYmUoXG4gICAgICAgIChuZXh0PzogU25vdGlmeSkgPT4ge1xuICAgICAgICAgIHRoaXMubWVyZ2VUb2FzdCh0b2FzdCwgbmV4dCk7XG4gICAgICAgIH0sXG4gICAgICAgIChlcnJvcj86IFNub3RpZnkpID0+IHtcbiAgICAgICAgICB0aGlzLm1lcmdlVG9hc3QodG9hc3QsIGVycm9yLCBTbm90aWZ5U3R5bGUuZXJyb3IpO1xuICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9LFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5tZXJnZVRvYXN0KHRvYXN0LCB7fSwgU25vdGlmeVN0eWxlLnN1Y2Nlc3MpO1xuICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRvYXN0O1xuICB9XG5cbiAgcHJpdmF0ZSBtZXJnZVRvYXN0KHRvYXN0LCBuZXh0LCB0eXBlPzogU25vdGlmeVR5cGVUeXBlKSB7XG4gICAgaWYgKG5leHQuYm9keSkge1xuICAgICAgdG9hc3QuYm9keSA9IG5leHQuYm9keTtcbiAgICB9XG4gICAgaWYgKG5leHQudGl0bGUpIHtcbiAgICAgIHRvYXN0LnRpdGxlID0gbmV4dC50aXRsZTtcbiAgICB9XG4gICAgaWYgKHR5cGUpIHtcbiAgICAgIHRvYXN0LmNvbmZpZyA9IG1lcmdlRGVlcCh0b2FzdC5jb25maWcsIHRoaXMuY29uZmlnLmdsb2JhbCwgdGhpcy5jb25maWcudG9hc3RbdHlwZV0sIHsgdHlwZSB9LCBuZXh0LmNvbmZpZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRvYXN0LmNvbmZpZyA9IG1lcmdlRGVlcCh0b2FzdC5jb25maWcsIG5leHQuY29uZmlnKTtcbiAgICB9XG4gICAgaWYgKG5leHQuaHRtbCkge1xuICAgICAgdG9hc3QuY29uZmlnLmh0bWwgPSBuZXh0Lmh0bWw7XG4gICAgfVxuICAgIHRoaXMuZW1pdCgpO1xuICAgIHRoaXMudG9hc3RDaGFuZ2VkLm5leHQodG9hc3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgZW1wdHkgdG9hc3Qgd2l0aCBodG1sIHN0cmluZyBpbnNpZGVcbiAgICogQHBhcmFtIGh0bWwgc3RyaW5nIHwgU2FmZUh0bWxcbiAgICogQHBhcmFtIGNvbmZpZyBTbm90aWZ5VG9hc3RDb25maWdcbiAgICogQHJldHVybnMgbnVtYmVyXG4gICAqL1xuICBodG1sKGh0bWw6IHN0cmluZyB8IFNhZmVIdG1sLCBjb25maWc/OiBTbm90aWZ5VG9hc3RDb25maWcpOiBTbm90aWZ5VG9hc3Qge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZSh7XG4gICAgICB0aXRsZTogbnVsbCxcbiAgICAgIGJvZHk6IG51bGwsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgLi4uY29uZmlnLFxuICAgICAgICAuLi57IGh0bWwgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iXX0=