@blox/material
Version:
Material Components for Angular
208 lines • 30 kB
JavaScript
import { DOCUMENT } from '@angular/common';
import { Inject, Injectable } from '@angular/core';
import { MDCSnackbarFoundation, numbers } from '@material/snackbar';
import { util } from '@material/snackbar';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
const CLASS_LEADING = 'mdc-snackbar--leading';
const CLASS_STACKED = 'mdc-snackbar--stacked';
/**
* This class provides information about a posted snackbar message.
* It can also be used to subscribe to action clicks.
*/
export class MdcSnackbarRef {
}
// internal representation of the snackbar
class MdcSnackbarInfo extends MdcSnackbarRef {
constructor(message) {
super();
this.message = message;
/** @internal */
this._action = new Subject();
/** @internal */
this._opened = new Subject();
/** @internal */
this._closed = new Subject();
}
action() {
return this._action.asObservable();
}
afterOpened() {
return this._opened.asObservable();
}
afterClosed() {
return this._closed.asObservable();
}
}
/**
* A service for showing spec-aligned material design snackbar/toast messages.
*/
export class MdcSnackbarService {
constructor(doc) {
this.onDestroy$ = new Subject();
this.closed = new Subject();
this.root = null;
this.label = null;
this.actionButton = null;
this.actionLabel = null;
this.adapter = {
addClass: (name) => this.root.classList.add(name),
announce: () => util.announce(this.label, this.label),
notifyClosed: (reason) => this.closed.next(reason),
notifyClosing: () => { },
notifyOpened: () => { var _a; return (_a = this.current) === null || _a === void 0 ? void 0 : _a._opened.next(); },
notifyOpening: () => { },
removeClass: (name) => this.root.classList.remove(name)
};
this.handleActionClick = (evt) => {
try {
(this.queue.length > 0) && this.queue[0]._action.next();
}
finally {
this.foundation.handleActionButtonClick(evt);
}
};
this.handleKeyDown = (evt) => this.foundation.handleKeyDown(evt);
this.foundation = null;
this.queue = [];
this.document = doc;
}
init() {
if (!this.foundation) {
this.root = this.document.createElement('div');
this.root.classList.add('mdc-snackbar');
let surface = this.document.createElement('div');
surface.classList.add('mdc-snackbar__surface');
this.root.appendChild(surface);
this.label = this.document.createElement('div');
this.label.setAttribute('role', 'status');
this.label.setAttribute('aria-live', 'polite');
this.label.classList.add('mdc-snackbar__label');
surface.appendChild(this.label);
let actions = this.document.createElement('div');
actions.classList.add('mdc-snackbar__actions');
surface.appendChild(actions);
this.actionButton = this.document.createElement('button');
this.actionButton.classList.add('mdc-button');
this.actionButton.classList.add('mdc-snackbar__action');
this.actionButton.setAttribute('type', 'button');
actions.appendChild(this.actionButton);
let ripple = this.document.createElement('div');
ripple.classList.add('mdc-button__ripple');
this.actionButton.appendChild(ripple);
this.actionLabel = this.document.createElement('span');
this.actionLabel.classList.add('mdc-button__label');
this.actionButton.appendChild(this.actionLabel);
this.document.body.appendChild(this.root);
this.foundation = new MDCSnackbarFoundation(this.adapter);
this.actionButton.addEventListener('click', this.handleActionClick);
this.root.addEventListener('keydown', this.handleKeyDown);
this.closed.pipe(takeUntil(this.onDestroy$)).subscribe(reason => this.closeCurrent(reason));
}
}
/** @internal */
onDestroy() {
this.onDestroy$.next();
this.onDestroy$.complete();
if (this.foundation) {
this.actionButton.removeEventListener('click', this.handleActionClick);
this.root.removeEventListener('keydown', this.handleKeyDown);
this.foundation.destroy();
this.root.parentElement.removeChild(this.root);
this.root = null;
this.label = null;
this.actionButton = null;
this.actionLabel = null;
}
}
/**
* Show a snackbar/toast message. If a snackbar message is already showing, the new
* message will be queued to show after earlier message have been shown.
* The returned `MdcSnackbarRef` provides methods to subscribe to opened, closed, and
* action click events.
*
* @param message Queue a snackbar message to show.
*/
show(message) {
if (!message)
throw new Error('message parameter is not set in call to MdcSnackbarService.show');
this.init();
const ref = new MdcSnackbarInfo(message);
this.queue.push(ref);
if (this.queue.length === 1) {
// showing needs to be triggered after snackbarRef is returned to caller,
// so that caller can subscribe to `afterShow` before it is triggered:
Promise.resolve().then(() => {
this.showNext();
});
}
return ref;
}
showNext() {
if (this.queue.length === 0)
return;
const info = this.queue[0];
this.label.textContent = info.message.message || '';
this.actionLabel.textContent = info.message.actionText || '';
if (info.message.stacked)
this.root.classList.add(CLASS_STACKED);
else
this.root.classList.remove(CLASS_STACKED);
try {
this.foundation.setTimeoutMs(info.message.timeout || numbers.DEFAULT_AUTO_DISMISS_TIMEOUT_MS);
}
catch (error) {
console.warn(error.message);
this.foundation.setTimeoutMs(numbers.DEFAULT_AUTO_DISMISS_TIMEOUT_MS);
}
this.foundation.open();
}
closeCurrent(reason) {
const info = this.queue.shift();
info._closed.next(reason);
info._opened.complete();
info._action.complete();
info._closed.complete();
if (this.queue.length > 0)
this.showNext();
}
get current() {
return this.queue.length > 0 ? this.queue[0] : null;
}
/**
* Set this property to true to show snackbars start-aligned instead of center-aligned. Desktop and tablet only.
*/
get leading() {
return this.foundation ? this.root.classList.contains(CLASS_LEADING) : false;
}
set leading(value) {
this.init();
if (value)
this.root.classList.add(CLASS_LEADING);
else
this.root.classList.remove(CLASS_LEADING);
}
/**
* By default the snackbar closes when the user presses ESC, while it's focused. Set this to
* false to not close the snackbar when the user presses ESC.
*/
get closeOnEscape() {
return this.foundation ? this.foundation.getCloseOnEscape() : true;
}
set closeOnEscape(value) {
this.init();
this.foundation.setCloseOnEscape(!!value);
}
}
MdcSnackbarService.ɵprov = i0.ɵɵdefineInjectable({ factory: function MdcSnackbarService_Factory() { return new MdcSnackbarService(i0.ɵɵinject(i1.DOCUMENT)); }, token: MdcSnackbarService, providedIn: "root" });
MdcSnackbarService.decorators = [
{ type: Injectable, args: [{
providedIn: 'root'
},] }
];
MdcSnackbarService.ctorParameters = () => [
{ type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] }
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWRjLnNuYWNrYmFyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9zbmFja2Jhci9tZGMuc25hY2tiYXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFzQixxQkFBcUIsRUFBRSxPQUFPLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN4RixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDMUMsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7OztBQUczQyxNQUFNLGFBQWEsR0FBRyx1QkFBdUIsQ0FBQztBQUM5QyxNQUFNLGFBQWEsR0FBRyx1QkFBdUIsQ0FBQztBQUc5Qzs7O0dBR0c7QUFDSCxNQUFNLE9BQWdCLGNBQWM7Q0FzQm5DO0FBRUQsMENBQTBDO0FBQzFDLE1BQU0sZUFBZ0IsU0FBUSxjQUFjO0lBUXhDLFlBQW1CLE9BQTJCO1FBQzFDLEtBQUssRUFBRSxDQUFDO1FBRE8sWUFBTyxHQUFQLE9BQU8sQ0FBb0I7UUFQOUMsZ0JBQWdCO1FBQ1QsWUFBTyxHQUFrQixJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzlDLGdCQUFnQjtRQUNULFlBQU8sR0FBa0IsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUM5QyxnQkFBZ0I7UUFDVCxZQUFPLEdBQW9CLElBQUksT0FBTyxFQUFFLENBQUM7SUFJaEQsQ0FBQztJQUVELE1BQU07UUFDRixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVELFdBQVc7UUFDUCxPQUFPLElBQUksQ0FB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QyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUN4RCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLE9BQU87UUFDUCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFLLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ2xGLENBQUM7SUFFRCxJQUFJLE9BQU8sQ0FBQyxLQUFjO1FBQ3RCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNaLElBQUksS0FBSztZQUNMLElBQUksQ0FBQyxJQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQzs7WUFFeEMsSUFBSSxDQUFDLElBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFJLGFBQWE7UUFDYixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3ZFLENBQUM7SUFFRCxJQUFJLGFBQWEsQ0FBQyxLQUFjO1FBQzVCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNaLElBQUksQ0FBQyxVQUFXLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9DLENBQUM7Ozs7WUExS0osVUFBVSxTQUFDO2dCQUNSLFVBQVUsRUFBRSxNQUFNO2FBQ3JCOzs7NENBNkJnQixNQUFNLFNBQUMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTURDU25hY2tiYXJBZGFwdGVyLCBNRENTbmFja2JhckZvdW5kYXRpb24sIG51bWJlcnMgfSBmcm9tICdAbWF0ZXJpYWwvc25hY2tiYXInO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0BtYXRlcmlhbC9zbmFja2Jhcic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBNZGNTbmFja2Jhck1lc3NhZ2UgfSBmcm9tICcuL21kYy5zbmFja2Jhci5tZXNzYWdlJztcblxuY29uc3QgQ0xBU1NfTEVBRElORyA9ICdtZGMtc25hY2tiYXItLWxlYWRpbmcnO1xuY29uc3QgQ0xBU1NfU1RBQ0tFRCA9ICdtZGMtc25hY2tiYXItLXN0YWNrZWQnO1xuXG5cbi8qKlxuICogVGhpcyBjbGFzcyBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCBhIHBvc3RlZCBzbmFja2JhciBtZXNzYWdlLlxuICogSXQgY2FuIGFsc28gYmUgdXNlZCB0byBzdWJzY3JpYmUgdG8gYWN0aW9uIGNsaWNrcy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE1kY1NuYWNrYmFyUmVmIHtcbiAgICAvKipcbiAgICAgKiBTdWJzY3JpYmUgdG8gdGhpcyBvYnNlcnZhYmxlIHRvIGJlIGluZm9ybWVkIHdoZW4gYSB1c2VyIGNsaWNrcyB0aGUgYWN0aW9uXG4gICAgICogZm9yIHRoZSBzaG93biBzbmFja2Jhci4gTm90ZSB0aGF0IHRoZSBvYnNlcnZhYmxlIHdpbGwgY29tcGxldGUgd2hlbiB0aGUgc25hY2tiYXJcbiAgICAgKiBkaXNhcHBlYXJzIGZyb20gc2NyZWVuLCBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIHVuc3Vic2NyaWJlLlxuICAgICAqL1xuICAgIGFic3RyYWN0IGFjdGlvbigpOiBPYnNlcnZhYmxlPHZvaWQ+O1xuXG4gICAgLyoqXG4gICAgICogU3Vic2NyaWJlIHRvIHRoaXMgb2JzZXJ2YWJsZSB0byBiZSBpbmZvcm1lZCB3aGVuIHRoZSBtZXNzYWdlIGlzIGRpc3BsYXllZC5cbiAgICAgKiBOb3RlIHRoYXQgdGhlIG9ic2VydmFibGUgd2lsbCBjb21wbGV0ZSB3aGVuIHRoZSBzbmFja2JhciBkaXNhcHBlYXJzIGZyb20gc2NyZWVuLFxuICAgICAqIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gdW5zdWJzY3JpYmUuXG4gICAgICovXG4gICAgYWJzdHJhY3QgYWZ0ZXJPcGVuZWQoKTogT2JzZXJ2YWJsZTx2b2lkPjtcblxuICAgIC8qKlxuICAgICAqIFN1YnNjcmliZSB0byB0aGlzIG9ic2VydmFibGUgdG8gYmUgaW5mb3JtZWQgd2hlbiB0aGUgbWVzc2FnZSBoYXMgZGlzYXBwZWFyZWQuXG4gICAgICogTm90ZSB0aGF0IHRoZSBvYnNlcnZhYmxlIHdpbGwgY29tcGxldGUgaW1tZWRpYXRlbHkgYWZ0ZXJ3YXJkcywgc28gdGhlcmUgaXNcbiAgICAgKiBubyBuZWVkIHRvIHVuc3Vic2NyaWJlLlxuICAgICAqIFRoZSBvYnNlcnZlZCB2YWx1ZSBpcyB0aGUgYHJlYXNvbmAgc3RyaW5nIHRoYXQgd2FzIHByb3ZpZGVkIGZvciBjbG9zaW5nIHRoZSBzbmFja2Jhci5cbiAgICAgKi9cbiAgICBhYnN0cmFjdCBhZnRlckNsb3NlZCgpOiBPYnNlcnZhYmxlPHN0cmluZz47XG59XG5cbi8vIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzbmFja2JhclxuY2xhc3MgTWRjU25hY2tiYXJJbmZvIGV4dGVuZHMgTWRjU25hY2tiYXJSZWYge1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBwdWJsaWMgX2FjdGlvbjogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHB1YmxpYyBfb3BlbmVkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgcHVibGljIF9jbG9zZWQ6IFN1YmplY3Q8c3RyaW5nPiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbWVzc2FnZTogTWRjU25hY2tiYXJNZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgYWN0aW9uKCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWN0aW9uLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIGFmdGVyT3BlbmVkKCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fb3BlbmVkLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIGFmdGVyQ2xvc2VkKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jbG9zZWQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxufVxuXG4vKipcbiAqIEEgc2VydmljZSBmb3Igc2hvd2luZyBzcGVjLWFsaWduZWQgbWF0ZXJpYWwgZGVzaWduIHNuYWNrYmFyL3RvYXN0IG1lc3NhZ2VzLlxuICovXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIE1kY1NuYWNrYmFyU2VydmljZSB7XG4gICAgcHJpdmF0ZSBvbkRlc3Ryb3kkOiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdCgpO1xuICAgIHByaXZhdGUgY2xvc2VkOiBTdWJqZWN0PHN0cmluZz4gPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG4gICAgcHJpdmF0ZSByb290OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgbGFiZWw6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBhY3Rpb25CdXR0b246IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBhY3Rpb25MYWJlbDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIGFkYXB0ZXI6IE1EQ1NuYWNrYmFyQWRhcHRlciA9IHtcbiAgICAgICAgYWRkQ2xhc3M6IChuYW1lKSA9PiB0aGlzLnJvb3QhLmNsYXNzTGlzdC5hZGQobmFtZSksXG4gICAgICAgIGFubm91bmNlOiAoKSA9PiB1dGlsLmFubm91bmNlKHRoaXMubGFiZWwhLCB0aGlzLmxhYmVsISksXG4gICAgICAgIG5vdGlmeUNsb3NlZDogKHJlYXNvbikgPT4gdGhpcy5jbG9zZWQubmV4dChyZWFzb24pLFxuICAgICAgICBub3RpZnlDbG9zaW5nOiAoKSA9PiB7fSxcbiAgICAgICAgbm90aWZ5T3BlbmVkOiAoKSA9PiB0aGlzLmN1cnJlbnQ/Ll9vcGVuZWQubmV4dCgpLFxuICAgICAgICBub3RpZnlPcGVuaW5nOiAoKSA9PiB7fSxcbiAgICAgICAgcmVtb3ZlQ2xhc3M6IChuYW1lKSA9PiB0aGlzLnJvb3QhLmNsYXNzTGlzdC5yZW1vdmUobmFtZSlcbiAgICB9O1xuICAgIHByaXZhdGUgaGFuZGxlQWN0aW9uQ2xpY2sgPSAoZXZ0OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAodGhpcy5xdWV1ZS5sZW5ndGggPiAwKSAmJiB0aGlzLnF1ZXVlWzBdLl9hY3Rpb24ubmV4dCgpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5mb3VuZGF0aW9uIS5oYW5kbGVBY3Rpb25CdXR0b25DbGljayhldnQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBwcml2YXRlIGhhbmRsZUtleURvd24gPSAoZXZ0OiBLZXlib2FyZEV2ZW50KSA9PiB0aGlzLmZvdW5kYXRpb24hLmhhbmRsZUtleURvd24oZXZ0KTtcbiAgICBwcml2YXRlIGZvdW5kYXRpb246IE1EQ1NuYWNrYmFyRm91bmRhdGlvbiB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgcXVldWU6IE1kY1NuYWNrYmFySW5mb1tdID0gW107XG4gICAgcHJpdmF0ZSBkb2N1bWVudDogRG9jdW1lbnQ7XG5cbiAgICBjb25zdHJ1Y3RvcihASW5qZWN0KERPQ1VNRU5UKSBkb2M6IGFueSkge1xuICAgICAgICB0aGlzLmRvY3VtZW50ID0gZG9jIGFzIERvY3VtZW50O1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmZvdW5kYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMucm9vdCA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICB0aGlzLnJvb3QuY2xhc3NMaXN0LmFkZCgnbWRjLXNuYWNrYmFyJyk7XG4gICAgICAgICAgICBsZXQgc3VyZmFjZSA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBzdXJmYWNlLmNsYXNzTGlzdC5hZGQoJ21kYy1zbmFja2Jhcl9fc3VyZmFjZScpO1xuICAgICAgICAgICAgdGhpcy5yb290LmFwcGVuZENoaWxkKHN1cmZhY2UpO1xuICAgICAgICAgICAgdGhpcy5sYWJlbCA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICB0aGlzLmxhYmVsLnNldEF0dHJpYnV0ZSgncm9sZScsICdzdGF0dXMnKTtcbiAgICAgICAgICAgIHRoaXMubGFiZWwuc2V0QXR0cmlidXRlKCdhcmlhLWxpdmUnLCAncG9saXRlJyk7XG4gICAgICAgICAgICB0aGlzLmxhYmVsLmNsYXNzTGlzdC5hZGQoJ21kYy1zbmFja2Jhcl9fbGFiZWwnKTtcbiAgICAgICAgICAgIHN1cmZhY2UuYXBwZW5kQ2hpbGQodGhpcy5sYWJlbCk7XG4gICAgICAgICAgICBsZXQgYWN0aW9ucyA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBhY3Rpb25zLmNsYXNzTGlzdC5hZGQoJ21kYy1zbmFja2Jhcl9fYWN0aW9ucycpO1xuICAgICAgICAgICAgc3VyZmFjZS5hcHBlbmRDaGlsZChhY3Rpb25zKTtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uQnV0dG9uID0gdGhpcy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ21kYy1idXR0b24nKTtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ21kYy1zbmFja2Jhcl9fYWN0aW9uJyk7XG4gICAgICAgICAgICB0aGlzLmFjdGlvbkJ1dHRvbi5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAnYnV0dG9uJyk7XG4gICAgICAgICAgICBhY3Rpb25zLmFwcGVuZENoaWxkKHRoaXMuYWN0aW9uQnV0dG9uKTtcbiAgICAgICAgICAgIGxldCByaXBwbGUgPSB0aGlzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgcmlwcGxlLmNsYXNzTGlzdC5hZGQoJ21kYy1idXR0b25fX3JpcHBsZScpO1xuICAgICAgICAgICAgdGhpcy5hY3Rpb25CdXR0b24uYXBwZW5kQ2hpbGQocmlwcGxlKTtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uTGFiZWwgPSB0aGlzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uTGFiZWwuY2xhc3NMaXN0LmFkZCgnbWRjLWJ1dHRvbl9fbGFiZWwnKTtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uQnV0dG9uLmFwcGVuZENoaWxkKHRoaXMuYWN0aW9uTGFiZWwpO1xuICAgICAgICAgICAgdGhpcy5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMucm9vdCk7XG4gICAgICAgICAgICB0aGlzLmZvdW5kYXRpb24gPSBuZXcgTURDU25hY2tiYXJGb3VuZGF0aW9uKHRoaXMuYWRhcHRlcik7XG5cbiAgICAgICAgICAgIHRoaXMuYWN0aW9uQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVBY3Rpb25DbGljayk7XG4gICAgICAgICAgICB0aGlzLnJvb3QuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuaGFuZGxlS2V5RG93bik7XG5cbiAgICAgICAgICAgIHRoaXMuY2xvc2VkLnBpcGUodGFrZVVudGlsKHRoaXMub25EZXN0cm95JCkpLnN1YnNjcmliZShyZWFzb24gPT4gdGhpcy5jbG9zZUN1cnJlbnQocmVhc29uKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgb25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLm9uRGVzdHJveSQubmV4dCgpO1xuICAgICAgICB0aGlzLm9uRGVzdHJveSQuY29tcGxldGUoKTtcbiAgICAgICAgaWYgKHRoaXMuZm91bmRhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5hY3Rpb25CdXR0b24hLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5oYW5kbGVBY3Rpb25DbGljayk7XG4gICAgICAgICAgICB0aGlzLnJvb3QhLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmhhbmRsZUtleURvd24pO1xuICAgICAgICAgICAgdGhpcy5mb3VuZGF0aW9uLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMucm9vdCEucGFyZW50RWxlbWVudCEucmVtb3ZlQ2hpbGQodGhpcy5yb290ISk7XG4gICAgICAgICAgICB0aGlzLnJvb3QgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5sYWJlbCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmFjdGlvbkJ1dHRvbiA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmFjdGlvbkxhYmVsID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNob3cgYSBzbmFja2Jhci90b2FzdCBtZXNzYWdlLiBJZiBhIHNuYWNrYmFyIG1lc3NhZ2UgaXMgYWxyZWFkeSBzaG93aW5nLCB0aGUgbmV3XG4gICAgICogbWVzc2FnZSB3aWxsIGJlIHF1ZXVlZCB0byBzaG93IGFmdGVyIGVhcmxpZXIgbWVzc2FnZSBoYXZlIGJlZW4gc2hvd24uXG4gICAgICogVGhlIHJldHVybmVkIGBNZGNTbmFja2JhclJlZmAgcHJvdmlkZXMgbWV0aG9kcyB0byBzdWJzY3JpYmUgdG8gb3BlbmVkLCBjbG9zZWQsIGFuZCBcbiAgICAgKiBhY3Rpb24gY2xpY2sgZXZlbnRzLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBtZXNzYWdlIFF1ZXVlIGEgc25hY2tiYXIgbWVzc2FnZSB0byBzaG93LlxuICAgICAqL1xuICAgIHNob3cobWVzc2FnZTogTWRjU25hY2tiYXJNZXNzYWdlKTogTWRjU25hY2tiYXJSZWYge1xuICAgICAgICBpZiAoIW1lc3NhZ2UpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21lc3NhZ2UgcGFyYW1ldGVyIGlzIG5vdCBzZXQgaW4gY2FsbCB0byBNZGNTbmFja2JhclNlcnZpY2Uuc2hvdycpO1xuICAgICAgICB0aGlzLmluaXQoKTtcbiAgICAgICAgY29uc3QgcmVmID0gbmV3IE1kY1NuYWNrYmFySW5mbyhtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5xdWV1ZS5wdXNoKHJlZik7XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgLy8gc2hvd2luZyBuZWVkcyB0byBiZSB0cmlnZ2VyZWQgYWZ0ZXIgc25hY2tiYXJSZWYgaXMgcmV0dXJuZWQgdG8gY2FsbGVyLFxuICAgICAgICAgICAgLy8gc28gdGhhdCBjYWxsZXIgY2FuIHN1YnNjcmliZSB0byBgYWZ0ZXJTaG93YCBiZWZvcmUgaXQgaXMgdHJpZ2dlcmVkOlxuICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93TmV4dCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlZjtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNob3dOZXh0KCkge1xuICAgICAgICBpZiAodGhpcy5xdWV1ZS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNvbnN0IGluZm8gPSB0aGlzLnF1ZXVlWzBdO1xuICAgICAgICB0aGlzLmxhYmVsIS50ZXh0Q29udGVudCA9IGluZm8ubWVzc2FnZS5tZXNzYWdlIHx8ICcnO1xuICAgICAgICB0aGlzLmFjdGlvbkxhYmVsIS50ZXh0Q29udGVudCA9IGluZm8ubWVzc2FnZS5hY3Rpb25UZXh0IHx8ICcnO1xuICAgICAgICBpZiAoaW5mby5tZXNzYWdlLnN0YWNrZWQpXG4gICAgICAgICAgICB0aGlzLnJvb3QhLmNsYXNzTGlzdC5hZGQoQ0xBU1NfU1RBQ0tFRCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMucm9vdCEuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19TVEFDS0VEKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuZm91bmRhdGlvbiEuc2V0VGltZW91dE1zKGluZm8ubWVzc2FnZS50aW1lb3V0IHx8IG51bWJlcnMuREVGQVVMVF9BVVRPX0RJU01JU1NfVElNRU9VVF9NUyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oZXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICB0aGlzLmZvdW5kYXRpb24hLnNldFRpbWVvdXRNcyhudW1iZXJzLkRFRkFVTFRfQVVUT19ESVNNSVNTX1RJTUVPVVRfTVMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZm91bmRhdGlvbiEub3BlbigpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2xvc2VDdXJyZW50KHJlYXNvbjogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGluZm8gPSB0aGlzLnF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgIGluZm8hLl9jbG9zZWQubmV4dChyZWFzb24pO1xuICAgICAgICBpbmZvIS5fb3BlbmVkLmNvbXBsZXRlKCk7XG4gICAgICAgIGluZm8hLl9hY3Rpb24uY29tcGxldGUoKTtcbiAgICAgICAgaW5mbyEuX2Nsb3NlZC5jb21wbGV0ZSgpO1xuICAgICAgICBpZiAodGhpcy5xdWV1ZS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgdGhpcy5zaG93TmV4dCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IGN1cnJlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlLmxlbmd0aCA+IDAgPyB0aGlzLnF1ZXVlWzBdIDogbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhpcyBwcm9wZXJ0eSB0byB0cnVlIHRvIHNob3cgc25hY2tiYXJzIHN0YXJ0LWFsaWduZWQgaW5zdGVhZCBvZiBjZW50ZXItYWxpZ25lZC4gRGVza3RvcCBhbmQgdGFibGV0IG9ubHkuXG4gICAgICovXG4gICAgZ2V0IGxlYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvdW5kYXRpb24gPyB0aGlzLnJvb3QhLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19MRUFESU5HKSA6IGZhbHNlO1xuICAgIH1cblxuICAgIHNldCBsZWFkaW5nKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuaW5pdCgpO1xuICAgICAgICBpZiAodmFsdWUpXG4gICAgICAgICAgICB0aGlzLnJvb3QhLmNsYXNzTGlzdC5hZGQoQ0xBU1NfTEVBRElORyk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMucm9vdCEuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19MRUFESU5HKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCeSBkZWZhdWx0IHRoZSBzbmFja2JhciBjbG9zZXMgd2hlbiB0aGUgdXNlciBwcmVzc2VzIEVTQywgd2hpbGUgaXQncyBmb2N1c2VkLiBTZXQgdGhpcyB0b1xuICAgICAqIGZhbHNlIHRvIG5vdCBjbG9zZSB0aGUgc25hY2tiYXIgd2hlbiB0aGUgdXNlciBwcmVzc2VzIEVTQy5cbiAgICAgKi9cbiAgICBnZXQgY2xvc2VPbkVzY2FwZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm91bmRhdGlvbiA/IHRoaXMuZm91bmRhdGlvbi5nZXRDbG9zZU9uRXNjYXBlKCkgOiB0cnVlO1xuICAgIH1cblxuICAgIHNldCBjbG9zZU9uRXNjYXBlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuaW5pdCgpO1xuICAgICAgICB0aGlzLmZvdW5kYXRpb24hLnNldENsb3NlT25Fc2NhcGUoISF2YWx1ZSk7XG4gICAgfVxufVxuIl19