UNPKG

@bi8/am-dyn-form

Version:

ng update @angular/cli yarn add @angular/cli

437 lines 56.6 kB
import * as tslib_1 from "tslib"; import { Subject, Observable, ReplaySubject, BehaviorSubject } from 'rxjs'; import { filter, map, takeWhile, tap } from 'rxjs/operators'; import { of } from 'rxjs/internal/observable/of'; import { pipeFromArray } from 'rxjs/internal/util/pipe'; export var NotificationType; (function (NotificationType) { NotificationType["init"] = "init"; NotificationType["busy"] = "busy"; NotificationType["idle"] = "idle"; NotificationType["paramFunc"] = "paramFunc"; NotificationType["inputNext"] = "inputNext"; NotificationType["inputComplete"] = "inputComplete"; NotificationType["inputError"] = "inputError"; NotificationType["outputFuncError"] = "outputFuncError"; NotificationType["outputNext"] = "outputNext"; NotificationType["outputError"] = "outputError"; NotificationType["outputComplete"] = "outputComplete"; NotificationType["close"] = "close"; NotificationType["enable"] = "enable"; NotificationType["disable"] = "disable"; })(NotificationType || (NotificationType = {})); var Channel = /** @class */ (function () { function Channel(fn, options) { var _this = this; this.fn = fn; this.closed = false; this.enabled = true; if (options) { this.input = options.input || new Subject(); this.output = options.output || new ReplaySubject(1); this.enabled = options.enabled || true; this.name = options.name || 'channel'; this.debug = options.debug || false; this.paramFn = options.paramFn; this.notificationFn = options.notificationFn; } else { this.input = new Subject(); this.output = new ReplaySubject(1); this.enabled = true; this.name = 'channel'; this.debug = false; } this.notifications = new BehaviorSubject({ type: NotificationType.init }); //this.observeNotifications().subscribe(); if (this.notificationFn) { this.observeNotifications().subscribe(this.notificationFn); } this.input.pipe(takeWhile(function (value) { return !_this.closed; }), filter(function (value) { return _this.enabled; }), map(function (input) { _this.emitNotification({ type: NotificationType.busy }); if (_this.paramFn) { var result = _this.paramFn(input); _this.emitNotification({ type: NotificationType.paramFunc, data: { before: input, after: result } }); return result; } else { return input; } }), tap(function (data) { _this.inputBusy = true; _this.emitNotification({ type: NotificationType.inputNext, data: data }); })).subscribe({ next: function (value) { try { _this.outputBusy = true; var observable = _this.fn(value); observable.pipe(tap(function (data) { _this.emitNotification({ type: NotificationType.outputNext, data: data }); })).subscribe({ next: function (response) { return _this.output.next(response); }, error: function (err) { _this.emitNotification({ type: NotificationType.outputError, error: err }); _this.output.error(err); }, complete: function () { _this.outputBusy = false; _this.emitNotification({ type: NotificationType.outputComplete }); _this.emitNotification({ type: NotificationType.idle }); } }); } catch (err) { _this.emitNotification({ type: NotificationType.outputFuncError, error: err }); _this.outputBusy = false; } }, error: function (err) { _this.emitNotification({ type: NotificationType.outputFuncError, error: err }); }, complete: function () { _this.inputBusy = false; } }); } Channel.prototype.isBusy = function () { return this.inputBusy || this.outputBusy; }; Channel.prototype.isInputBusy = function () { return this.inputBusy; }; Channel.prototype.isOutputBusy = function () { return this.outputBusy; }; Channel.prototype.next = function (value) { this.input.next(value); return this; }; Channel.prototype.emit = function (value) { this.output.next(value); }; Channel.prototype.observe = function (value) { var _this = this; var ops = []; for (var _i = 1; _i < arguments.length; _i++) { ops[_i - 1] = arguments[_i]; } setInterval(function () { _this.next(value); }); return this.output.pipe(pipeFromArray(tslib_1.__spread(ops))); }; Channel.prototype.link = function (observer) { var _this = this; var ops = []; for (var _i = 1; _i < arguments.length; _i++) { ops[_i - 1] = arguments[_i]; } observer.pipe(pipeFromArray(tslib_1.__spread(ops))).subscribe(function (value) { return _this.next(value); }); }; Channel.prototype.pipe = function (observer) { var _this = this; var ops = []; for (var _i = 1; _i < arguments.length; _i++) { ops[_i - 1] = arguments[_i]; } observer.pipe(pipeFromArray(tslib_1.__spread(ops))).subscribe(function (value) { return _this.emit(value); }); }; Channel.prototype.asObservable = function () { return this.output.asObservable(); }; Channel.prototype.observeNotifications = function () { return this.notifications.asObservable(); }; Channel.prototype.emitNotification = function (notification) { notification.name = this.name; if (this.debug) { switch (notification.type) { case NotificationType.inputError: case NotificationType.outputError: case NotificationType.outputFuncError: console.error("[" + notification.name + ":" + notification.type + "] ", notification.error || ''); break; default: console.debug("[" + notification.name + ":" + notification.type + "] ", notification.data || ''); break; } } this.notifications.next(notification); }; Channel.prototype.enable = function () { this.enabled = false; return this; }; Channel.prototype.disable = function () { this.enabled = true; return this; }; Channel.prototype.close = function () { this.closed = true; this.input.unsubscribe(); this.output.unsubscribe(); }; return Channel; }()); export { Channel }; var ChannelSwitch = /** @class */ (function () { function ChannelSwitch() { var _this = this; var channels = []; for (var _i = 0; _i < arguments.length; _i++) { channels[_i] = arguments[_i]; } this.channels = new Map(); channels.forEach(function (config) { _this.channels.set(config.key, config.channel); }); } ChannelSwitch.prototype.set = function (key, channel) { this.channels.set(key, channel); return channel; }; ChannelSwitch.prototype.get = function (key) { return this.channels.get(key); }; ChannelSwitch.prototype.isBusy = function (key) { var channel = this.channels.get(key); return channel ? channel.isBusy() : false; }; ChannelSwitch.prototype.isInputBusy = function (key) { var channel = this.channels.get(key); return channel ? channel.isInputBusy() : false; }; ChannelSwitch.prototype.isOutputBusy = function (key) { var channel = this.channels.get(key); return channel ? channel.isOutputBusy() : false; }; ChannelSwitch.prototype.next = function (key, value) { var channel = this.channels.get(key); return channel ? channel.next(value) : null; }; ChannelSwitch.prototype.emit = function (key, value) { var channel = this.channels.get(key); return channel ? channel.emit(value) : false; }; ChannelSwitch.prototype.observe = function (key, value) { var ops = []; for (var _i = 2; _i < arguments.length; _i++) { ops[_i - 2] = arguments[_i]; } var channel = this.channels.get(key); return channel ? channel.observe.apply(channel, tslib_1.__spread([value], ops)) : null; }; ChannelSwitch.prototype.link = function (key, observer) { var ops = []; for (var _i = 2; _i < arguments.length; _i++) { ops[_i - 2] = arguments[_i]; } var channel = this.channels.get(key); if (channel) { channel.link.apply(channel, tslib_1.__spread([observer], ops)); } }; ChannelSwitch.prototype.pipe = function (key, observer) { var ops = []; for (var _i = 2; _i < arguments.length; _i++) { ops[_i - 2] = arguments[_i]; } var channel = this.channels.get(key); if (channel) { channel.pipe.apply(channel, tslib_1.__spread([observer], ops)); } }; ChannelSwitch.prototype.asObservable = function (key) { var channel = this.channels.get(key); return channel ? channel.asObservable() : null; }; ChannelSwitch.prototype.observeNotifications = function (key) { var channel = this.channels.get(key); return channel ? channel.observeNotifications() : null; }; ChannelSwitch.prototype.enable = function (key) { var channel = this.channels.get(key); return channel ? channel.enable() : null; }; ChannelSwitch.prototype.disable = function (key) { var channel = this.channels.get(key); return channel ? channel.disable() : null; }; ChannelSwitch.prototype.close = function (key) { var channel = this.channels.get(key); return channel ? channel.close() : null; }; return ChannelSwitch; }()); export { ChannelSwitch }; var DSPipe = /** @class */ (function () { function DSPipe(ds, key, obs, ops, enabled) { if (enabled === void 0) { enabled = true; } this.ds = ds; this.key = key; this.obs = obs; this.ops = ops; this.enabled = enabled; this.connect(); } DSPipe.prototype.isConnected = function () { return !(!this.sub); }; DSPipe.prototype.connect = function () { var _this = this; if (this.isConnected()) { return; } this.sub = this.obs.pipe(pipeFromArray(tslib_1.__spread(this.ops))).subscribe(function (value) { console.log("----> pipe (" + _this.key + ")", value); _this.ds.next(_this.key, value); }); }; DSPipe.prototype.disconnect = function () { if (!this.isConnected()) { return; } this.sub.unsubscribe(); }; DSPipe.prototype.setOperators = function () { var ops = []; for (var _i = 0; _i < arguments.length; _i++) { ops[_i] = arguments[_i]; } this.disconnect(); this.ops = ops; this.connect(); }; DSPipe.prototype.enable = function () { this.enabled = true; }; DSPipe.prototype.disable = function () { this.enabled = false; }; return DSPipe; }()); export { DSPipe }; var ObservableDS = /** @class */ (function () { function ObservableDS(options) { this.connected = false; this.fnMap = new Map(); this.subjectMap = new Map(); this.input$ = new Subject(); this.inputSub = null; this.events$ = new Subject(); this.pipes = []; if (options) { if (options.autoconnect) { this.connect(); } if (options.key && options.obs) { this.addObservable(options.key, options.obs); } } else { // we connect by default this.connect(); } } ObservableDS.prototype.isConnected = function () { return !(!this.inputSub); }; ObservableDS.prototype.connect = function () { var _this = this; if (this.isConnected()) { return; } this.inputSub = this.input$.pipe(filter(function (input) { if (_this.fnMap.has(input.id)) { return true; } console.error("[obs] observable with id '" + input.id + "' not found"); return false; }), map(function (input) { var obsFn = _this.fnMap.get(input.id); return { event: input, fn: obsFn(input.value), sub: _this.subjectMap.get(input.id) }; })) .subscribe(function (input) { return _this.relay(input.event, input.fn, input.sub); }); this.connected = true; }; ObservableDS.prototype.relay = function (event, obs, subject) { var _this = this; //console.log(`-----> relay (${subject}: `, event); obs.pipe(takeWhile(function () { return _this.connected; }), //tap((response) => { console.log(`-----> tap relay: `, response); subject.next(response) }), tap(function (response) { return _this.emit({ input: event, output: response }); })).subscribe(); }; ObservableDS.prototype.emit = function (event) { this.events$.next(event); }; ObservableDS.prototype.asObservable = function () { return this.events$.asObservable(); }; ObservableDS.prototype.disconnect = function () { if (!this.isConnected()) { return; } this.inputSub.unsubscribe(); var bla = of([1, 2, 3]); var blaf = bla.subscribe(); blaf.add(blaf); var duff = new Subject(); blaf.add(duff.asObservable().subscribe()); }; ObservableDS.prototype.next = function (key, value, options) { if (!this.connected) { return; } var event = { id: key, options: options, value: value }; //console.log(`-----> next (${event})`, event); this.input$.next(event); }; ObservableDS.prototype.addPipe = function (obs, key) { var operators = []; for (var _i = 2; _i < arguments.length; _i++) { operators[_i - 2] = arguments[_i]; } var pipe = new DSPipe(this, key, obs, operators); this.pipes.push(pipe); return pipe; }; ObservableDS.prototype.clearPipes = function () { var pipes = []; for (var _i = 0; _i < arguments.length; _i++) { pipes[_i] = arguments[_i]; } pipes.forEach(function (pipe, index) { pipe.disconnect(); pipes = pipes.splice(index, 1); }); }; ObservableDS.prototype.clearAllPipes = function () { this.clearPipes.apply(this, tslib_1.__spread(this.pipes)); }; ObservableDS.prototype.getPipes = function () { return this.pipes; }; ObservableDS.prototype.addObservable = function (key, obs, options) { if (!options) { options = { behave: true }; } this.fnMap.set(key, obs instanceof Observable ? function () { return obs; } : obs); this.subjectMap.set(key, options.behave ? new BehaviorSubject([]) : new Subject()); }; ObservableDS.prototype.observe = function (key, value, options) { var subject = this.subjectMap.get(key); try { return subject.asObservable(); } finally { if (value) { this.next(key, value); } } }; ObservableDS.prototype.destroy = function () { }; return ObservableDS; }()); export { ObservableDS }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluLWRhdGFzb3VyY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYmk4L2FtLWR5bi1mb3JtLyIsInNvdXJjZXMiOlsiYXBwL21vZHVsZXMvYW0tZHluLWZvcm0vZHluLWRhdGFzb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBa0MsZUFBZSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3pHLE9BQU8sRUFBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFFL0MsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBTXRELE1BQU0sQ0FBTixJQUFZLGdCQWVYO0FBZkQsV0FBWSxnQkFBZ0I7SUFDMUIsaUNBQWEsQ0FBQTtJQUNiLGlDQUFhLENBQUE7SUFDYixpQ0FBYSxDQUFBO0lBQ2IsMkNBQXVCLENBQUE7SUFDdkIsMkNBQXVCLENBQUE7SUFDdkIsbURBQStCLENBQUE7SUFDL0IsNkNBQXlCLENBQUE7SUFDekIsdURBQW1DLENBQUE7SUFDbkMsNkNBQXlCLENBQUE7SUFDekIsK0NBQTJCLENBQUE7SUFDM0IscURBQWlDLENBQUE7SUFDakMsbUNBQWUsQ0FBQTtJQUNmLHFDQUFpQixDQUFBO0lBQ2pCLHVDQUFtQixDQUFBO0FBQ3JCLENBQUMsRUFmVyxnQkFBZ0IsS0FBaEIsZ0JBQWdCLFFBZTNCO0FBaUJEO0lBYUUsaUJBQW9CLEVBQXNCLEVBQUUsT0FRM0M7UUFSRCxpQkFtRkM7UUFuRm1CLE9BQUUsR0FBRixFQUFFLENBQW9CO1FBWmxDLFdBQU0sR0FBWSxLQUFLLENBQUM7UUFHeEIsWUFBTyxHQUFZLElBQUksQ0FBQztRQWtCOUIsSUFBSSxPQUFPLEVBQUU7WUFDWCxJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FB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SUFBSSxFQUFDLENBQUM7U0FDMUI7UUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxZQUFZLFVBQVUsQ0FBQyxDQUFDLENBQUMsY0FBTSxPQUFBLEdBQUcsRUFBSCxDQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pFLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLGVBQWUsQ0FBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLEVBQU8sQ0FBQyxDQUFDO0lBQy9GLENBQUM7SUFFRCw4QkFBTyxHQUFQLFVBQVEsR0FBUSxFQUFFLEtBQVcsRUFBRSxPQUF5QjtRQUN0RCxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2QyxJQUFJO1lBQ0YsT0FBTyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7U0FDL0I7Z0JBQVM7WUFDUixJQUFJLEtBQUssRUFBRTtnQkFDVCxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQzthQUN2QjtTQUNGO0lBQ0gsQ0FBQztJQUVELDhCQUFPLEdBQVA7SUFDQSxDQUFDO0lBQ0gsbUJBQUM7QUFBRCxDQUFDLEFBdElELElBc0lDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtTdWJqZWN0LCBPYnNlcnZhYmxlLCBSZXBsYXlTdWJqZWN0LCBTdWJzY3JpcHRpb24sIE9wZXJhdG9yRnVuY3Rpb24sIEJlaGF2aW9yU3ViamVjdH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7ZmlsdGVyLCBtYXAsIHRha2VXaGlsZSwgdGFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7b2Z9IGZyb20gJ3J4anMvaW50ZXJuYWwvb2JzZXJ2YWJsZS9vZic7XHJcbmltcG9ydCB7cGlwZX0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7cGlwZUZyb21BcnJheX0gZnJvbSAncnhqcy9pbnRlcm5hbC91dGlsL3BpcGUnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBPYnNlcnZhYmxlRm48QSwgVD4ge1xyXG4gIChwYXJhbT86IEEpOiBPYnNlcnZhYmxlPFQ+O1xyXG59XHJcblxyXG5leHBvcnQgZW51bSBOb3RpZmljYXRpb25UeXBlIHtcclxuICBpbml0ID0gJ2luaXQnLFxyXG4gIGJ1c3kgPSAnYnVzeScsXHJcbiAgaWRsZSA9ICdpZGxlJyxcclxuICBwYXJhbUZ1bmMgPSAncGFyYW1GdW5jJyxcclxuICBpbnB1dE5leHQgPSAnaW5wdXROZXh0JyxcclxuICBpbnB1dENvbXBsZXRlID0gJ2lucHV0Q29tcGxldGUnLFxyXG4gIGlucHV0RXJyb3IgPSAnaW5wdXRFcnJvcicsXHJcbiAgb3V0cHV0RnVuY0Vycm9yID0gJ291dHB1dEZ1bmNFcnJvcicsXHJcbiAgb3V0cHV0TmV4dCA9ICdvdXRwdXROZXh0JyxcclxuICBvdXRwdXRFcnJvciA9ICdvdXRwdXRFcnJvcicsXHJcbiAgb3V0cHV0Q29tcGxldGUgPSAnb3V0cHV0Q29tcGxldGUnLFxyXG4gIGNsb3NlID0gJ2Nsb3NlJyxcclxuICBlbmFibGUgPSAnZW5hYmxlJyxcclxuICBkaXNhYmxlID0gJ2Rpc2FibGUnXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ2hhbm5lbE5vdGlmaWNhdGlvbiB7XHJcbiAgdHlwZTogTm90aWZpY2F0aW9uVHlwZSxcclxuICBuYW1lPzogc3RyaW5nLFxyXG4gIGRhdGE/OiBhbnksXHJcbiAgZXJyb3I/OiBhbnksXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTm90aWZpY2F0aW9uRm4ge1xyXG4gIChpbnB1dDogQ2hhbm5lbE5vdGlmaWNhdGlvbilcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBQYXJhbWV0ZXJGbjxBLCBUPiB7XHJcbiAgKGlucHV0OiBBKTogVFxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQ2hhbm5lbDxBIGV4dGVuZHMgYW55LCBUIGV4dGVuZHMgYW55PiB7XHJcbiAgcHJpdmF0ZSBjbG9zZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIGlucHV0OiBTdWJqZWN0PEE+O1xyXG4gIHByaXZhdGUgb3V0cHV0OiBTdWJqZWN0PFQ+O1xyXG4gIHByaXZhdGUgZW5hYmxlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHJpdmF0ZSBpbnB1dEJ1c3k6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSBvdXRwdXRCdXN5OiBib29sZWFuO1xyXG4gIHByaXZhdGUgbmFtZTogc3RyaW5nO1xyXG4gIHByaXZhdGUgbm90aWZpY2F0aW9ucztcclxuICBwcml2YXRlIGRlYnVnOiBib29sZWFuO1xyXG4gIHByaXZhdGUgcGFyYW1GbjogUGFyYW1ldGVyRm48YW55LCBhbnk+O1xyXG4gIHByaXZhdGUgbm90aWZpY2F0aW9uRm46IE5vdGlmaWNhdGlvbkZuO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZuOiBPYnNlcnZhYmxlRm48QSwgVD4sIG9wdGlvbnM/OiB7XHJcbiAgICBpbnB1dD86IFN1YmplY3Q8QT4sXHJcbiAgICBvdXRwdXQ/OiBTdWJqZWN0PFQ+LFxyXG4gICAgZW5hYmxlZD86IGJvb2xlYW4sXHJcbiAgICBuYW1lPzogc3RyaW5nLFxyXG4gICAgZGVidWc/OiBib29sZWFuLFxyXG4gICAgcGFyYW1Gbj86IFBhcmFtZXRlckZuPGFueSwgYW55PixcclxuICAgIG5vdGlmaWNhdGlvbkZuPzogTm90aWZpY2F0aW9uRm5cclxuICB9KSB7XHJcbiAgICBpZiAob3B0aW9ucykge1xyXG4gICAgICB0aGlzLmlucHV0ID0gb3B0aW9ucy5pbnB1dCB8fCBuZXcgU3ViamVjdDxBPigpO1xyXG4gICAgICB0aGlzLm91dHB1dCA9IG9wdGlvbnMub3V0cHV0IHx8IG5ldyBSZXBsYXlTdWJqZWN0PFQ+KDEpO1xyXG4gICAgICB0aGlzLmVuYWJsZWQgPSBvcHRpb25zLmVuYWJsZWQgfHwgdHJ1ZTtcclxuICAgICAgdGhpcy5uYW1lID0gb3B0aW9ucy5uYW1lIHx8ICdjaGFubmVsJztcclxuICAgICAgdGhpcy5kZWJ1ZyA9IG9wdGlvbnMuZGVidWcgfHwgZmFsc2U7XHJcbiAgICAgIHRoaXMucGFyYW1GbiA9IG9wdGlvbnMucGFyYW1GbjtcclxuICAgICAgdGhpcy5ub3RpZmljYXRpb25GbiA9IG9wdGlvbnMubm90aWZpY2F0aW9uRm47XHJcblxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pbnB1dCA9IG5ldyBTdWJqZWN0PEE+KCk7XHJcbiAgICAgIHRoaXMub3V0cHV0ID0gbmV3IFJlcGxheVN1YmplY3Q8VD4oMSk7XHJcbiAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWU7XHJcbiAgICAgIHRoaXMubmFtZSA9ICdjaGFubmVsJztcclxuICAgICAgdGhpcy5kZWJ1ZyA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubm90aWZpY2F0aW9ucyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q2hhbm5lbE5vdGlmaWNhdGlvbj4oe3R5cGU6IE5vdGlmaWNhdGlvblR5cGUuaW5pdH0pO1xyXG4gICAgLy90aGlzLm9ic2VydmVOb3RpZmljYXRpb25zKCkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgaWYgKHRoaXMubm90aWZpY2F0aW9uRm4pIHtcclxuICAgICAgdGhpcy5vYnNlcnZlTm90aWZpY2F0aW9ucygpLnN1YnNjcmliZSh0aGlzLm5vdGlmaWNhdGlvbkZuKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmlucHV0LnBpcGUoXHJcbiAgICAgIHRha2VXaGlsZSgodmFsdWU6IEEpID0+ICF0aGlzLmNsb3NlZCksXHJcbiAgICAgIGZpbHRlcigodmFsdWU6IEEpID0+IHRoaXMuZW5hYmxlZCksXHJcbiAgICAgIG1hcCgoaW5wdXQpID0+IHtcclxuICAgICAgICB0aGlzLmVtaXROb3RpZmljYXRpb24oe3R5cGU6IE5vdGlmaWNhdGlvblR5cGUuYnVzeX0pO1xyXG4gICAgICAgIGlmICh0aGlzLnBhcmFtRm4pIHtcclxuICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLnBhcmFtRm4oaW5wdXQpO1xyXG4gICAgICAgICAgdGhpcy5lbWl0Tm90aWZpY2F0aW9uKHt0eXBlOiBOb3RpZmljYXRpb25UeXBlLnBhcmFtRnVuYywgZGF0YToge2JlZm9yZTogaW5wdXQsIGFmdGVyOiByZXN1bHR9fSk7XHJcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gaW5wdXQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSxcclxuICAgICAgdGFwKChkYXRhKSA9PiB7XHJcbiAgICAgICAgdGhpcy5pbnB1dEJ1c3kgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuZW1pdE5vdGlmaWNhdGlvbih7dHlwZTogTm90aWZpY2F0aW9uVHlwZS5pbnB1dE5leHQsIGRhdGE6IGRhdGF9KTtcclxuICAgICAgfSlcclxuICAgICkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHZhbHVlOiBBKSA9PiB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIHRoaXMub3V0cHV0QnVzeSA9IHRydWU7XHJcbiAgICAgICAgICBsZXQgb2JzZXJ2YWJsZSA9IHRoaXMuZm4odmFsdWUpO1xyXG5cclxuICAgICAgICAgIG9ic2VydmFibGUucGlwZSh0YXAoKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5lbWl0Tm90aWZpY2F0aW9uKHt0eXBlOiBOb3RpZmljYXRpb25UeXBlLm91dHB1dE5leHQsIGRhdGE6IGRhdGF9KTtcclxuXHJcbiAgICAgICAgICB9KSkuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgbmV4dDogKHJlc3BvbnNlKSA9PiB0aGlzLm91dHB1dC5uZXh0KHJlc3BvbnNlKSxcclxuICAgICAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLmVtaXROb3RpZmljYXRpb24oe3R5cGU6IE5vdGlmaWNhdGlvblR5cGUub3V0cHV0RXJyb3IsIGVycm9yOiBlcnJ9KTtcclxuICAgICAgICAgICAgICB0aGlzLm91dHB1dC5lcnJvcihlcnIpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBjb21wbGV0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMub3V0cHV0QnVzeSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIHRoaXMuZW1pdE5vdGlmaWNhdGlvbih7dHlwZTogTm90aWZpY2F0aW9uVHlwZS5vdXRwdXRDb21wbGV0ZX0pO1xyXG4gICAgICAgICAgICAgIHRoaXMuZW1pdE5vdGlmaWNhdGlvbih7dHlwZTogTm90aWZpY2F0aW9uVHlwZS5pZGxlfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgdGhpcy5lbWl0Tm90aWZpY2F0aW9uKHt0eXBlOiBOb3RpZmljYXRpb25UeXBlLm91dHB1dEZ1bmNFcnJvciwgZXJyb3I6IGVycn0pO1xyXG4gICAgICAgICAgdGhpcy5vdXRwdXRCdXN5ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5lbWl0Tm90aWZpY2F0aW9uKHt0eXBlOiBOb3RpZmljYXRpb25UeXBlLm91dHB1dEZ1bmNFcnJvciwgZXJyb3I6IGVycn0pO1xyXG4gICAgICB9LFxyXG4gICAgICBjb21wbGV0ZTogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuaW5wdXRCdXN5ID0gZmFsc2VcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBpc0J1c3koKSB7XHJcbiAgICByZXR1cm4gdGhpcy5pbnB1dEJ1c3kgfHwgdGhpcy5vdXRwdXRCdXN5O1xyXG4gIH1cclxuXHJcbiAgaXNJbnB1dEJ1c3koKSB7XHJcbiAgICByZXR1cm4gdGhpcy5pbnB1dEJ1c3k7XHJcbiAgfVxyXG5cclxuICBpc091dHB1dEJ1c3koKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vdXRwdXRCdXN5O1xyXG4gIH1cclxuXHJcbiAgbmV4dCh2YWx1ZT86IEEpOiBDaGFubmVsPEEsIFQ+IHtcclxuICAgIHRoaXMuaW5wdXQubmV4dCh2YWx1ZSk7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIGVtaXQodmFsdWU6IFQpIHtcclxuICAgIHRoaXMub3V0cHV0Lm5leHQodmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgb2JzZXJ2ZSh2YWx1ZT86IEEsIC4uLm9wczogT3BlcmF0b3JGdW5jdGlvbjxhbnksIGFueT5bXSk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICB0aGlzLm5leHQodmFsdWUpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMub3V0cHV0LnBpcGUocGlwZUZyb21BcnJheShbLi4ub3BzXSkpO1xyXG4gIH1cclxuXHJcbiAgbGluayhvYnNlcnZlcjogT2JzZXJ2YWJsZTxBPiwgLi4ub3BzOiBPcGVyYXRvckZ1bmN0aW9uPGFueSwgYW55PltdKSB7XHJcbiAgICBvYnNlcnZlci5waXBlKHBpcGVGcm9tQXJyYXkoWy4uLm9wc10pKS5zdWJzY3JpYmUoKHZhbHVlOiBBKSA9PiB0aGlzLm5leHQodmFsdWUpKTtcclxuICB9XHJcblxyXG4gIHBpcGUob2JzZXJ2ZXI6IE9ic2VydmFibGU8VD4sIC4uLm9wczogT3BlcmF0b3JGdW5jdGlvbjxhbnksIGFueT5bXSkge1xyXG4gICAgb2JzZXJ2ZXIucGlwZShwaXBlRnJvbUFycmF5KFsuLi5vcHNdKSkuc3Vic2NyaWJlKCh2YWx1ZTogVCkgPT4gdGhpcy5lbWl0KHZhbHVlKSk7XHJcbiAgfVxyXG5cclxuICBhc09ic2VydmFibGUoKTogT2JzZXJ2YWJsZTxUPiB7XHJcbiAgICByZXR1cm4gdGhpcy5vdXRwdXQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgfVxyXG5cclxuICBvYnNlcnZlTm90aWZpY2F0aW9ucygpOiBPYnNlcnZhYmxlPENoYW5uZWxOb3RpZmljYXRpb24+IHtcclxuICAgIHJldHVybiB0aGlzLm5vdGlmaWNhdGlvbnMuYXNPYnNlcnZhYmxlKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZW1pdE5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IENoYW5uZWxOb3RpZmljYXRpb24pIHtcclxuICAgIG5vdGlmaWNhdGlvbi5uYW1lID0gdGhpcy5uYW1lO1xyXG4gICAgaWYgKHRoaXMuZGVidWcpIHtcclxuICAgICAgc3dpdGNoIChub3RpZmljYXRpb24udHlwZSkge1xyXG4gICAgICAgIGNhc2UgTm90aWZpY2F0aW9uVHlwZS5pbnB1dEVycm9yOlxyXG4gICAgICAgIGNhc2UgTm90aWZpY2F0aW9uVHlwZS5vdXRwdXRFcnJvcjpcclxuICAgICAgICBjYXNlIE5vdGlmaWNhdGlvblR5cGUub3V0cHV0RnVuY0Vycm9yOlxyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihgWyR7bm90aWZpY2F0aW9uLm5hbWV9OiR7bm90aWZpY2F0aW9uLnR5cGV9XSBgLCBub3RpZmljYXRpb24uZXJyb3IgfHwgJycpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGNvbnNvbGUuZGVidWcoYFske25vdGlmaWNhdGlvbi5uYW1lfToke25vdGlmaWNhdGlvbi50eXBlfV0gYCwgbm90aWZpY2F0aW9uLmRhdGEgfHwgJycpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMubm90aWZpY2F0aW9ucy5uZXh0KG5vdGlmaWNhdGlvbik7XHJcbiAgfVxyXG5cclxuICBlbmFibGUoKTogQ2hhbm5lbDxBLCBUPiB7XHJcbiAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgZGlzYWJsZSgpOiBDaGFubmVsPEEsIFQ+IHtcclxuICAgIHRoaXMuZW5hYmxlZCA9IHRydWU7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIGNsb3NlKCkge1xyXG4gICAgdGhpcy5jbG9zZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5pbnB1dC51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5vdXRwdXQudW5zdWJzY3JpYmUoKTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBDaGFubmVsU3dpdGNoIHtcclxuICBwcml2YXRlIGNoYW5uZWxzID0gbmV3IE1hcDxhbnksIENoYW5uZWw8YW55LCBhbnk+PigpO1xyXG5cclxuICBjb25zdHJ1Y3RvciguLi5jaGFubmVsczogeyBrZXk6IGFueSwgY2hhbm5lbDogQ2hhbm5lbDxhbnksIGFueT4gfVtdKSB7XHJcbiAgICBjaGFubmVscy5mb3JFYWNoKChjb25maWcpID0+IHtcclxuICAgICAgdGhpcy5jaGFubmVscy5zZXQoY29uZmlnLmtleSwgY29uZmlnLmNoYW5uZWwpO1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHNldChrZXk6IGFueSwgY2hhbm5lbDogQ2hhbm5lbDxhbnksIGFueT4pOiBDaGFubmVsPGFueSwgYW55PiB7XHJcbiAgICB0aGlzLmNoYW5uZWxzLnNldChrZXksIGNoYW5uZWwpO1xyXG4gICAgcmV0dXJuIGNoYW5uZWw7XHJcbiAgfVxyXG5cclxuICBnZXQoa2V5OiBhbnkpOiBDaGFubmVsPGFueSwgYW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5jaGFubmVscy5nZXQoa2V5KTtcclxuICB9XHJcblxyXG4gIGlzQnVzeShrZXk6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGNoYW5uZWwgPSB0aGlzLmNoYW5uZWxzLmdldChrZXkpO1xyXG4gICAgcmV0dXJuIGNoYW5uZWwgPyBjaGFubmVsLmlzQnVzeSgpIDogZmFsc2U7XHJcbiAgfVxyXG5cclxuICBpc0lucHV0QnVzeShrZXk6IGFueSkge1xyXG4gICAgbGV0IGNoYW5uZWwgPSB0aGlzLmNoYW5uZWxzLmdldChrZXkpO1xyXG4gICAgcmV0dXJuIGNoYW5uZWwgPyBjaGFubmVsLmlzSW5wdXRCdXN5KCkgOiBmYWxzZTtcclxuICB9XHJcblxyXG4gIGlzT3V0cHV0QnVzeShrZXk6IGFueSkge1xyXG4gICAgbGV0IGNoYW5uZWwgPSB0aGlzLmNoYW5uZWxzLmdldChrZXkpO1xyXG4gICAgcmV0dXJuIGNoYW5uZWwgPyBjaGFubmVsLmlzT3V0cHV0QnVzeSgpIDogZmFsc2U7XHJcbiAgfVxyXG5cclxuICBuZXh0KGtleTogYW55LCB2YWx1ZT86IGFueSk6IENoYW5uZWw8YW55LCBhbnk+IHtcclxuICAgIGxldCBjaGFubmVsID0gdGhpcy5jaGFubmVscy5nZXQoa2V5KTtcclxuICAgIHJldHVybiBjaGFubmVsID8gY2hhbm5lbC5uZXh0KHZhbHVlKSA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBlbWl0KGtleTogYW55LCB2YWx1ZTogYW55KSB7XHJcbiAgICBsZXQgY2hhbm5lbCA9IHRoaXMuY2hhbm5lbHMuZ2V0KGtleSk7XHJcbiAgICByZXR1cm4gY2hhbm5lbCA/IGNoYW5uZWwuZW1pdCh2YWx1ZSkgOiBmYWxzZTtcclxuICB9XHJcblxyXG4gIG9ic2VydmUoa2V5OiBhbnksIHZhbHVlPzogYW55LCAuLi5vcHM6IE9wZXJhdG9yRnVuY3Rpb248YW55LCBhbnk+W10pOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgbGV0IGNoYW5uZWwgPSB0aGlzLmNoYW5uZWxzLmdldChrZXkpO1xyXG4gICAgcmV0dXJuIGNoYW5uZWwgPyBjaGFubmVsLm9ic2VydmUodmFsdWUsIC4uLm9wcykgOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgbGluayhrZXk6IGFueSwgb2JzZXJ2ZXI6IE9ic2VydmFibGU8YW55PiwgLi4ub3BzOiBPcGVyYXRvckZ1bmN0aW9uPGFueSwgYW55PltdKSB7XHJcbiAgICBsZXQgY2hhbm5lbCA9IHRoaXMuY2hhbm5lbHMuZ2V0KGtleSk7XHJcbiAgICBpZiAoY2hhbm5lbCkge1xyXG4gICAgICBjaGFubmVsLmxpbmsob2JzZXJ2ZXIsIC4uLm9wcyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwaXBlKGtleTogYW55LCBvYnNlcnZlcjogT2JzZXJ2YWJsZTxhbnk+LCAuLi5vcHM6IE9wZXJhdG9yRnVuY3Rpb248YW55LCBhbnk+W10pIHtcclxuICAgIGxldCBjaGFubmVsID0gdGhpcy5jaGFubmVscy5nZXQoa2V5KTtcclxuICAgIGlmIChjaGFubmVsKSB7XHJcbiAgICAgIGNoYW5uZWwucGlwZShvYnNlcnZlciwgLi4ub3BzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzT2JzZXJ2YWJsZShrZXk6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBsZXQgY2hhbm5lbCA9IHRoaXMuY2hhbm5lbHMuZ2V0KGtleSk7XHJcbiAgICByZXR1cm4gY2hhbm5lbCA/IGNoYW5uZWwuYXNPYnNlcnZhYmxlKCkgOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgb2JzZXJ2ZU5vdGlmaWNhdGlvbnMoa2V5OiBhbnkpOiBPYnNlcnZhYmxlPENoYW5uZWxOb3RpZmljYXRpb24+IHtcclxuICAgIGxldCBjaGFubmVsID0gdGhpcy5jaGFubmVscy5nZXQoa2V5KTtcclxuICAgIHJldHVybiBjaGFubmVsID8gY2hhbm5lbC5vYnNlcnZlTm90aWZpY2F0aW9ucygpIDogbnVsbDtcclxuICB9XHJcblxyXG4gIGVuYWJsZShrZXk6IGFueSk6IENoYW5uZWw8YW55LCBhbnk+IHtcclxuICAgIGxldCBjaGFubmVsID0gdGhpcy5jaGFubmVscy5nZXQoa2V5KTtcclxuICAgIHJldHVybiBjaGFubmVsID8gY2hhbm5lbC5lbmFibGUoKSA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBkaXNhYmxlKGtleTogYW55KTogQ2hhbm5lbDxhbnksIGFueT4ge1xyXG4gICAgbGV0IGNoYW5uZWwgPSB0aGlzLmNoYW5uZWxzLmdldChrZXkpO1xyXG4gICAgcmV0dXJuIGNoYW5uZWwgPyBjaGFubmVsLmRpc2FibGUoKSA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBjbG9zZShrZXk6IGFueSkge1xyXG4gICAgbGV0IGNoYW5uZWwgPSB0aGlzLmNoYW5uZWxzLmdldChrZXkpO1xyXG4gICAgcmV0dXJuIGNoYW5uZWwgPyBjaGFubmVsLmNsb3NlKCkgOiBudWxsO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBEU09ic2VydmFibGVGbiB7XHJcbiAgKHZhbHVlPzogYW55KTogT2JzZXJ2YWJsZTxhbnk+O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIERTT3BlcmF0b3Ige1xyXG4gIG9wZXJhdG9yOiBPcGVyYXRvckZ1bmN0aW9uPGFueSwgYW55PixcclxuICBpZDogYW55XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSU9ic2VydmVPcHRpb25zIHtcclxuICBiZWhhdmU6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRFNJbnB1dE9wdGlvbnMge1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIERTT3V0cHV0T3B0aW9ucyB7XHJcbiAgYmVoYXZlOiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIERTSW5wdXRFdmVudCB7XHJcbiAgaWQ6IGFueTtcclxuICBvcHRpb25zPzogRFNJbnB1dE9wdGlvbnMsXHJcbiAgdmFsdWU/OiBhbnlcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBEU0V2ZW50IHtcclxuICBpbnB1dDogRFNJbnB1dEV2ZW50LFxyXG4gIG91dHB1dDogYW55O1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgRFNQaXBlIHtcclxuXHJcbiAgcHJpdmF0ZSBzdWI6IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkczogSU9ic2VydmFibGVEUyxcclxuICAgICAgICAgICAgICBwcml2YXRlIGtleTogYW55LFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgb2JzOiBPYnNlcnZhYmxlPGFueT4sXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBvcHM6IE9wZXJhdG9yRnVuY3Rpb248YW55LCBhbnk+W10sXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBlbmFibGVkOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgdGhpcy5jb25uZWN0KCk7XHJcbiAgfVxyXG5cclxuICBpc0Nvbm5lY3RlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhKCF0aGlzLnN1Yik7XHJcbiAgfVxyXG5cclxuICBjb25uZWN0KCkge1xyXG4gICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQoKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zdWIgPSB0aGlzLm9icy5waXBlKHBpcGVGcm9tQXJyYXkoWy4uLnRoaXMub3BzXSkpLnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgY29uc29sZS5sb2coYC0tLS0+IHBpcGUgKCR7dGhpcy5rZXl9KWAsIHZhbHVlKTtcclxuICAgICAgdGhpcy5kcy5uZXh0KHRoaXMua2V5LCB2YWx1ZSk7XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZGlzY29ubmVjdCgpIHtcclxuICAgIGlmICghdGhpcy5pc0Nvbm5lY3RlZCgpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuc3ViLnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBzZXRPcGVyYXRvcnMoLi4ub3BzOiBPcGVyYXRvckZ1bmN0aW9uPGF