UNPKG

sb-element

Version:

This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 12.0.1. It is a component library constructed around the SCSS library [Sb-Theming](https://github.com/SeverinBuchser/SbTheming) and supports [Angular Schematics]

180 lines 19.1 kB
import { Injectable } from '@angular/core'; import { Color, Size } from "../../core"; import { Queue } from '../../models/queue/queue'; import * as i0 from "@angular/core"; /** * Provides a global service to display alerts. * * The alert service can be used by any component which either whishes to show * or to create an alert to be shown. * * If a component wants to show alerts, the * component has to call [subscribe]{@link #subscribe} with the component as the * parameter. The component also needs to implement the * {@link AlertServiceSubscriber} interface so the service can inform the * subscriber about the incoming alerts. * * If a component wants to create an alert, the service provides different * methods which have predefined colors. The different methods take a `message` * which is a `string` and an optional `size` parameter, which is also a * `string`. The methods then passes the alert to the * {@link AlertServiceSubscriber} with a predefinded color. There is also a * method, which lets you customize everything: [alert]{@link #alert}. All these * methods then add the created alert to the [alertQueue]{@link #alertQueue}, * and then call [work]{@link #work}. This method times the alerts and then * informs the subscriber when a alert needs to be shown (when an alert is * ready to be shown). * * The lifecycle of an {@link Alert} inside the service: * 1. The {@link Alert} gets created via a create call (like * [alert]{@link #alert}). * 2. The {@link Alert} gets placed into the [alertQueue]{@link #alertQueue}. * 3. The [work]{@link #work} method then removes an {@link Alert} out of the * queue and tells the subscribers to show the removed {@link Alert}. The * {@link Alert} gets collected by the garbage collector after the {@link Alert} * has been shown. * 4. If all subscribers have finished showing the {@link Alert}, the work * method checks if the [alertQueue]{@link #alertQueue} is empty or not. If the * queue is empty, the [work]{@link #work} method terminates. If not, go to step * 3 again. * */ export class SbAlertService { constructor() { /** * An array of all subscribers. */ this.subscribers = new Array(); /** * The queue of all [Alerts]{@link Alert} which need to be shown. */ this.alertQueue = new Queue(); /** * Flag to inidcate if the service is busy working on the * [alertQueue]{@link #alertQueue} or not. */ this.isBusy = false; } /** * Adds a new subscriber into [subscribers]{@link #subscribers}. * * @param{AlertServiceSubscriber} subscriber The new subscriber */ subscribe(subscriber) { this.subscribers.push(subscriber); } /** * Creates and shows an {@link Alert} with color `warn`. * * @param{string} message The message of the alert * @param{string} size The size of the alert */ warn(message, size = Size.MEDIUM) { this.alert(message, size, Color.WARN); } /** * Creates and shows an {@link Alert} with color `success`. * * @param{string} message The message of the alert * @param{string} size The size of the alert */ success(message, size = Size.MEDIUM) { this.alert(message, size, Color.SUCCESS); } /** * Creates and shows an {@link Alert} with color `info`. * * @param{string} message The message of the alert * @param{string} size The size of the alert */ inform(message, size = Size.MEDIUM) { this.alert(message, size, Color.INFO); } /** * Creates and shows an {@link Alert} with color `primary`. * * @param{string} message The message of the alert * @param{string} size The size of the alert */ primary(message, size = Size.MEDIUM) { this.alert(message, size, Color.PRIMARY); } /** * Creates and shows an {@link Alert} with color `secondary`. * * @param{string} message The message of the alert * @param{string} size The size of the alert */ secondary(message, size = Size.MEDIUM) { this.alert(message, size, Color.SECONDARY); } /** * Creates and shows an {@link Alert}. * * The `message`, `size` and `color` of the {@link Alert} can be specified as * parameters. The {@link Alert} gets created with these parameters and * placed into the [alertQueue]{@link #alertQueue}. After that, the * [work]{@link #work} method gets called. * * @param{string} message The message of the alert * @param{string} size The size of the alert * @param{string} color The color of the alert */ alert(message, size = Size.MEDIUM, color = Color.WARN) { this.alertQueue.enqueue({ message, size, color }); this.work(); } /** * Works on the [alertQueue]{@link #alertQueue}. * * If the service is not busy working on the [alertQueue]{@link #alertQueue} * and the [alertQueue]{@link #alertQueue} is not empty, meaning that there * are still [Alerts]{@link Alert} to process, the method will set the * [isBusy]{@link #isBusy} flag, remove the next {@link Alert} from the queue * and show the {@link Alert} by calling [showAlert]{@link #showAlert}. * * Once the show call has finished, the [isBusy]{@link #isBusy} flag is unset * and the [work]{@link #work} method gets called again. * * If a current work call is still in progress, meaning the * [isBusy]{@link #isBusy} flag is set, a new work call will do nothing. */ async work() { if (!this.alertQueue.isEmpty() && !this.isBusy) { this.isBusy = true; let alert = this.alertQueue.dequeue(); if (alert) { this.showAlert(alert).then(() => { this.isBusy = false; this.work(); }); } else { this.isBusy = false; } } } /** * Notifies all subscibers to show an {@link Alert}. * * @param{Alert} alert The `Alert` to show * @returns{Promise<any>} A promise, which is resolved when all subscribers * have finished showing the `alert` */ async showAlert(alert) { return Promise.all(this.subscribers.map(subscriber => subscriber.alert(alert))); } } SbAlertService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.0", ngImport: i0, type: SbAlertService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); SbAlertService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.0", ngImport: i0, type: SbAlertService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.0", ngImport: i0, type: SbAlertService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxlcnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NiLWVsZW1lbnQvc3JjL2xpYi9ub3RpZmljYXRpb24vYWxlcnQvYWxlcnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBR3pDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7QUFFakQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9DRztBQUlILE1BQU0sT0FBTyxjQUFjO0lBSDNCO1FBS0U7O1dBRUc7UUFDSyxnQkFBVyxHQUNmLElBQUksS0FBSyxFQUEwQixDQUFDO1FBRXhDOztXQUVHO1FBQ0ssZUFBVSxHQUFtQixJQUFJLEtBQUssRUFBVyxDQUFDO1FBRTFEOzs7V0FHRztRQUNLLFdBQU0sR0FBWSxLQUFLLENBQUM7S0E2SGpDO0lBM0hDOzs7O09BSUc7SUFDSSxTQUFTLENBQUMsVUFBa0M7UUFDakQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksSUFBSSxDQUFDLE9BQWUsRUFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU07UUFDN0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxPQUFPLENBQUMsT0FBZSxFQUFFLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTTtRQUNoRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBQyxPQUFlLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNO1FBQy9DLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksT0FBTyxDQUFDLE9BQWUsRUFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU07UUFDaEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxTQUFTLENBQUMsT0FBZSxFQUFFLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTTtRQUNsRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7T0FXRztJQUNJLEtBQUssQ0FBQyxPQUFlLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJO1FBQ2xFLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDO1lBQ3RCLE9BQU87WUFDUCxJQUFJO1lBQ0osS0FBSztTQUNOLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNLLEtBQUssQ0FBQyxJQUFJO1FBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUM5QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztZQUNuQixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3RDLElBQUksS0FBSyxFQUFFO2dCQUNULElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtvQkFDOUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7b0JBQ3BCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDZCxDQUFDLENBQUMsQ0FBQzthQUNKO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO2FBQ3JCO1NBQ0Y7SUFDSCxDQUFDO0lBR0Q7Ozs7OztPQU1HO0lBQ0ssS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFjO1FBQ3BDLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUNuRCxVQUFVLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUN4QixDQUFDLENBQUM7SUFDTCxDQUFDOzsyR0E3SVUsY0FBYzsrR0FBZCxjQUFjLGNBRmIsTUFBTTsyRkFFUCxjQUFjO2tCQUgxQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbG9yLCBTaXplIH0gZnJvbSBcIi4uLy4uL2NvcmVcIjtcbmltcG9ydCB7IFNiQWxlcnQgfSBmcm9tICcuL2FsZXJ0JztcbmltcG9ydCB7IEFsZXJ0U2VydmljZVN1YnNjcmliZXIgfSBmcm9tICcuL2FsZXJ0LXNlcnZpY2Utc3Vic2NyaWJlcic7XG5pbXBvcnQgeyBRdWV1ZSB9IGZyb20gJy4uLy4uL21vZGVscy9xdWV1ZS9xdWV1ZSc7XG5cbi8qKlxuICogUHJvdmlkZXMgYSBnbG9iYWwgc2VydmljZSB0byBkaXNwbGF5IGFsZXJ0cy5cbiAqXG4gKiBUaGUgYWxlcnQgc2VydmljZSBjYW4gYmUgdXNlZCBieSBhbnkgY29tcG9uZW50IHdoaWNoIGVpdGhlciB3aGlzaGVzIHRvIHNob3dcbiAqIG9yIHRvIGNyZWF0ZSBhbiBhbGVydCB0byBiZSBzaG93bi5cbiAqXG4gKiBJZiBhIGNvbXBvbmVudCB3YW50cyB0byBzaG93IGFsZXJ0cywgdGhlXG4gKiBjb21wb25lbnQgaGFzIHRvIGNhbGwgW3N1YnNjcmliZV17QGxpbmsgI3N1YnNjcmliZX0gd2l0aCB0aGUgY29tcG9uZW50IGFzIHRoZVxuICogcGFyYW1ldGVyLiBUaGUgY29tcG9uZW50IGFsc28gbmVlZHMgdG8gaW1wbGVtZW50IHRoZVxuICoge0BsaW5rIEFsZXJ0U2VydmljZVN1YnNjcmliZXJ9IGludGVyZmFjZSBzbyB0aGUgc2VydmljZSBjYW4gaW5mb3JtIHRoZVxuICogc3Vic2NyaWJlciBhYm91dCB0aGUgaW5jb21pbmcgYWxlcnRzLlxuICpcbiAqIElmIGEgY29tcG9uZW50IHdhbnRzIHRvIGNyZWF0ZSBhbiBhbGVydCwgdGhlIHNlcnZpY2UgcHJvdmlkZXMgZGlmZmVyZW50XG4gKiBtZXRob2RzIHdoaWNoIGhhdmUgcHJlZGVmaW5lZCBjb2xvcnMuIFRoZSBkaWZmZXJlbnQgbWV0aG9kcyB0YWtlIGEgYG1lc3NhZ2VgXG4gKiB3aGljaCBpcyBhIGBzdHJpbmdgIGFuZCBhbiBvcHRpb25hbCBgc2l6ZWAgcGFyYW1ldGVyLCB3aGljaCBpcyBhbHNvIGFcbiAqIGBzdHJpbmdgLiBUaGUgbWV0aG9kcyB0aGVuIHBhc3NlcyB0aGUgYWxlcnQgdG8gdGhlXG4gKiB7QGxpbmsgQWxlcnRTZXJ2aWNlU3Vic2NyaWJlcn0gd2l0aCBhIHByZWRlZmluZGVkIGNvbG9yLiBUaGVyZSBpcyBhbHNvIGFcbiAqIG1ldGhvZCwgd2hpY2ggbGV0cyB5b3UgY3VzdG9taXplIGV2ZXJ5dGhpbmc6IFthbGVydF17QGxpbmsgI2FsZXJ0fS4gQWxsIHRoZXNlXG4gKiBtZXRob2RzIHRoZW4gYWRkIHRoZSBjcmVhdGVkIGFsZXJ0IHRvIHRoZSBbYWxlcnRRdWV1ZV17QGxpbmsgI2FsZXJ0UXVldWV9LFxuICogYW5kIHRoZW4gY2FsbCBbd29ya117QGxpbmsgI3dvcmt9LiBUaGlzIG1ldGhvZCB0aW1lcyB0aGUgYWxlcnRzIGFuZCB0aGVuXG4gKiBpbmZvcm1zIHRoZSBzdWJzY3JpYmVyIHdoZW4gYSBhbGVydCBuZWVkcyB0byBiZSBzaG93biAod2hlbiBhbiBhbGVydCBpc1xuICogcmVhZHkgdG8gYmUgc2hvd24pLlxuICpcbiAqIFRoZSBsaWZlY3ljbGUgb2YgYW4ge0BsaW5rIEFsZXJ0fSBpbnNpZGUgdGhlIHNlcnZpY2U6XG4gKiAxLiBUaGUge0BsaW5rIEFsZXJ0fSBnZXRzIGNyZWF0ZWQgdmlhIGEgY3JlYXRlIGNhbGwgKGxpa2VcbiAqIFthbGVydF17QGxpbmsgI2FsZXJ0fSkuXG4gKiAyLiBUaGUge0BsaW5rIEFsZXJ0fSBnZXRzIHBsYWNlZCBpbnRvIHRoZSBbYWxlcnRRdWV1ZV17QGxpbmsgI2FsZXJ0UXVldWV9LlxuICogMy4gVGhlIFt3b3JrXXtAbGluayAjd29ya30gbWV0aG9kIHRoZW4gcmVtb3ZlcyBhbiB7QGxpbmsgQWxlcnR9IG91dCBvZiB0aGVcbiAqIHF1ZXVlIGFuZCB0ZWxscyB0aGUgc3Vic2NyaWJlcnMgdG8gc2hvdyB0aGUgcmVtb3ZlZCB7QGxpbmsgQWxlcnR9LiBUaGVcbiAqIHtAbGluayBBbGVydH0gZ2V0cyBjb2xsZWN0ZWQgYnkgdGhlIGdhcmJhZ2UgY29sbGVjdG9yIGFmdGVyIHRoZSB7QGxpbmsgQWxlcnR9XG4gKiBoYXMgYmVlbiBzaG93bi5cbiAqIDQuIElmIGFsbCBzdWJzY3JpYmVycyBoYXZlIGZpbmlzaGVkIHNob3dpbmcgdGhlIHtAbGluayBBbGVydH0sIHRoZSB3b3JrXG4gKiBtZXRob2QgY2hlY2tzIGlmIHRoZSBbYWxlcnRRdWV1ZV17QGxpbmsgI2FsZXJ0UXVldWV9IGlzIGVtcHR5IG9yIG5vdC4gSWYgdGhlXG4gKiBxdWV1ZSBpcyBlbXB0eSwgdGhlIFt3b3JrXXtAbGluayAjd29ya30gbWV0aG9kIHRlcm1pbmF0ZXMuIElmIG5vdCwgZ28gdG8gc3RlcFxuICogMyBhZ2Fpbi5cbiAqXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFNiQWxlcnRTZXJ2aWNlIHtcblxuICAvKipcbiAgICogQW4gYXJyYXkgb2YgYWxsIHN1YnNjcmliZXJzLlxuICAgKi9cbiAgcHJpdmF0ZSBzdWJzY3JpYmVyczogQXJyYXk8QWxlcnRTZXJ2aWNlU3Vic2NyaWJlcj5cbiAgICA9IG5ldyBBcnJheTxBbGVydFNlcnZpY2VTdWJzY3JpYmVyPigpO1xuXG4gIC8qKlxuICAgKiBUaGUgcXVldWUgb2YgYWxsIFtBbGVydHNde0BsaW5rIEFsZXJ0fSB3aGljaCBuZWVkIHRvIGJlIHNob3duLlxuICAgKi9cbiAgcHJpdmF0ZSBhbGVydFF1ZXVlOiBRdWV1ZTxTYkFsZXJ0PiA9IG5ldyBRdWV1ZTxTYkFsZXJ0PigpO1xuXG4gIC8qKlxuICAgKiBGbGFnIHRvIGluaWRjYXRlIGlmIHRoZSBzZXJ2aWNlIGlzIGJ1c3kgd29ya2luZyBvbiB0aGVcbiAgICogW2FsZXJ0UXVldWVde0BsaW5rICNhbGVydFF1ZXVlfSBvciBub3QuXG4gICAqL1xuICBwcml2YXRlIGlzQnVzeTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBBZGRzIGEgbmV3IHN1YnNjcmliZXIgaW50byBbc3Vic2NyaWJlcnNde0BsaW5rICNzdWJzY3JpYmVyc30uXG4gICAqXG4gICAqIEBwYXJhbXtBbGVydFNlcnZpY2VTdWJzY3JpYmVyfSBzdWJzY3JpYmVyIFRoZSBuZXcgc3Vic2NyaWJlclxuICAgKi9cbiAgcHVibGljIHN1YnNjcmliZShzdWJzY3JpYmVyOiBBbGVydFNlcnZpY2VTdWJzY3JpYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpYmVycy5wdXNoKHN1YnNjcmliZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW5kIHNob3dzIGFuIHtAbGluayBBbGVydH0gd2l0aCBjb2xvciBgd2FybmAuXG4gICAqXG4gICAqIEBwYXJhbXtzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2Ugb2YgdGhlIGFsZXJ0XG4gICAqIEBwYXJhbXtzdHJpbmd9IHNpemUgVGhlIHNpemUgb2YgdGhlIGFsZXJ0XG4gICAqL1xuICBwdWJsaWMgd2FybihtZXNzYWdlOiBzdHJpbmcsIHNpemUgPSBTaXplLk1FRElVTSk6IHZvaWQge1xuICAgIHRoaXMuYWxlcnQobWVzc2FnZSwgc2l6ZSwgQ29sb3IuV0FSTik7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbmQgc2hvd3MgYW4ge0BsaW5rIEFsZXJ0fSB3aXRoIGNvbG9yIGBzdWNjZXNzYC5cbiAgICpcbiAgICogQHBhcmFte3N0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSBvZiB0aGUgYWxlcnRcbiAgICogQHBhcmFte3N0cmluZ30gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgYWxlcnRcbiAgICovXG4gIHB1YmxpYyBzdWNjZXNzKG1lc3NhZ2U6IHN0cmluZywgc2l6ZSA9IFNpemUuTUVESVVNKTogdm9pZCB7XG4gICAgdGhpcy5hbGVydChtZXNzYWdlLCBzaXplLCBDb2xvci5TVUNDRVNTKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuZCBzaG93cyBhbiB7QGxpbmsgQWxlcnR9IHdpdGggY29sb3IgYGluZm9gLlxuICAgKlxuICAgKiBAcGFyYW17c3RyaW5nfSBtZXNzYWdlIFRoZSBtZXNzYWdlIG9mIHRoZSBhbGVydFxuICAgKiBAcGFyYW17c3RyaW5nfSBzaXplIFRoZSBzaXplIG9mIHRoZSBhbGVydFxuICAgKi9cbiAgcHVibGljIGluZm9ybShtZXNzYWdlOiBzdHJpbmcsIHNpemUgPSBTaXplLk1FRElVTSk6IHZvaWQge1xuICAgIHRoaXMuYWxlcnQobWVzc2FnZSwgc2l6ZSwgQ29sb3IuSU5GTyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbmQgc2hvd3MgYW4ge0BsaW5rIEFsZXJ0fSB3aXRoIGNvbG9yIGBwcmltYXJ5YC5cbiAgICpcbiAgICogQHBhcmFte3N0cmluZ30gbWVzc2FnZSBUaGUgbWVzc2FnZSBvZiB0aGUgYWxlcnRcbiAgICogQHBhcmFte3N0cmluZ30gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgYWxlcnRcbiAgICovXG4gIHB1YmxpYyBwcmltYXJ5KG1lc3NhZ2U6IHN0cmluZywgc2l6ZSA9IFNpemUuTUVESVVNKTogdm9pZCB7XG4gICAgdGhpcy5hbGVydChtZXNzYWdlLCBzaXplLCBDb2xvci5QUklNQVJZKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuZCBzaG93cyBhbiB7QGxpbmsgQWxlcnR9IHdpdGggY29sb3IgYHNlY29uZGFyeWAuXG4gICAqXG4gICAqIEBwYXJhbXtzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2Ugb2YgdGhlIGFsZXJ0XG4gICAqIEBwYXJhbXtzdHJpbmd9IHNpemUgVGhlIHNpemUgb2YgdGhlIGFsZXJ0XG4gICAqL1xuICBwdWJsaWMgc2Vjb25kYXJ5KG1lc3NhZ2U6IHN0cmluZywgc2l6ZSA9IFNpemUuTUVESVVNKTogdm9pZCB7XG4gICAgdGhpcy5hbGVydChtZXNzYWdlLCBzaXplLCBDb2xvci5TRUNPTkRBUlkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW5kIHNob3dzIGFuIHtAbGluayBBbGVydH0uXG4gICAqXG4gICAqIFRoZSBgbWVzc2FnZWAsIGBzaXplYCBhbmQgYGNvbG9yYCBvZiB0aGUge0BsaW5rIEFsZXJ0fSBjYW4gYmUgc3BlY2lmaWVkIGFzXG4gICAqIHBhcmFtZXRlcnMuIFRoZSB7QGxpbmsgQWxlcnR9IGdldHMgY3JlYXRlZCB3aXRoIHRoZXNlIHBhcmFtZXRlcnMgYW5kXG4gICAqIHBsYWNlZCBpbnRvIHRoZSBbYWxlcnRRdWV1ZV17QGxpbmsgI2FsZXJ0UXVldWV9LiBBZnRlciB0aGF0LCB0aGVcbiAgICogW3dvcmtde0BsaW5rICN3b3JrfSBtZXRob2QgZ2V0cyBjYWxsZWQuXG4gICAqXG4gICAqIEBwYXJhbXtzdHJpbmd9IG1lc3NhZ2UgVGhlIG1lc3NhZ2Ugb2YgdGhlIGFsZXJ0XG4gICAqIEBwYXJhbXtzdHJpbmd9IHNpemUgVGhlIHNpemUgb2YgdGhlIGFsZXJ0XG4gICAqIEBwYXJhbXtzdHJpbmd9IGNvbG9yIFRoZSBjb2xvciBvZiB0aGUgYWxlcnRcbiAgICovXG4gIHB1YmxpYyBhbGVydChtZXNzYWdlOiBzdHJpbmcsIHNpemUgPSBTaXplLk1FRElVTSwgY29sb3IgPSBDb2xvci5XQVJOKTogdm9pZCB7XG4gICAgdGhpcy5hbGVydFF1ZXVlLmVucXVldWUoe1xuICAgICAgbWVzc2FnZSxcbiAgICAgIHNpemUsXG4gICAgICBjb2xvclxuICAgIH0pO1xuICAgIHRoaXMud29yaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdvcmtzIG9uIHRoZSBbYWxlcnRRdWV1ZV17QGxpbmsgI2FsZXJ0UXVldWV9LlxuICAgKlxuICAgKiBJZiB0aGUgc2VydmljZSBpcyBub3QgYnVzeSB3b3JraW5nIG9uIHRoZSBbYWxlcnRRdWV1ZV17QGxpbmsgI2FsZXJ0UXVldWV9XG4gICAqIGFuZCB0aGUgW2FsZXJ0UXVldWVde0BsaW5rICNhbGVydFF1ZXVlfSBpcyBub3QgZW1wdHksIG1lYW5pbmcgdGhhdCB0aGVyZVxuICAgKiBhcmUgc3RpbGwgW0FsZXJ0c117QGxpbmsgQWxlcnR9IHRvIHByb2Nlc3MsIHRoZSBtZXRob2Qgd2lsbCBzZXQgdGhlXG4gICAqIFtpc0J1c3lde0BsaW5rICNpc0J1c3l9IGZsYWcsIHJlbW92ZSB0aGUgbmV4dCB7QGxpbmsgQWxlcnR9IGZyb20gdGhlIHF1ZXVlXG4gICAqIGFuZCBzaG93IHRoZSB7QGxpbmsgQWxlcnR9IGJ5IGNhbGxpbmcgW3Nob3dBbGVydF17QGxpbmsgI3Nob3dBbGVydH0uXG4gICAqXG4gICAqIE9uY2UgdGhlIHNob3cgY2FsbCBoYXMgZmluaXNoZWQsIHRoZSBbaXNCdXN5XXtAbGluayAjaXNCdXN5fSBmbGFnIGlzIHVuc2V0XG4gICAqIGFuZCB0aGUgW3dvcmtde0BsaW5rICN3b3JrfSBtZXRob2QgZ2V0cyBjYWxsZWQgYWdhaW4uXG4gICAqXG4gICAqIElmIGEgY3VycmVudCB3b3JrIGNhbGwgaXMgc3RpbGwgaW4gcHJvZ3Jlc3MsIG1lYW5pbmcgdGhlXG4gICAqIFtpc0J1c3lde0BsaW5rICNpc0J1c3l9IGZsYWcgaXMgc2V0LCBhIG5ldyB3b3JrIGNhbGwgd2lsbCBkbyBub3RoaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3b3JrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5hbGVydFF1ZXVlLmlzRW1wdHkoKSAmJiAhdGhpcy5pc0J1c3kpIHtcbiAgICAgIHRoaXMuaXNCdXN5ID0gdHJ1ZTtcbiAgICAgIGxldCBhbGVydCA9IHRoaXMuYWxlcnRRdWV1ZS5kZXF1ZXVlKCk7XG4gICAgICBpZiAoYWxlcnQpIHtcbiAgICAgICAgdGhpcy5zaG93QWxlcnQoYWxlcnQpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaXNCdXN5ID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy53b3JrKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pc0J1c3kgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBOb3RpZmllcyBhbGwgc3Vic2NpYmVycyB0byBzaG93IGFuIHtAbGluayBBbGVydH0uXG4gICAqXG4gICAqIEBwYXJhbXtBbGVydH0gYWxlcnQgVGhlIGBBbGVydGAgdG8gc2hvd1xuICAgKiBAcmV0dXJuc3tQcm9taXNlPGFueT59IEEgcHJvbWlzZSwgd2hpY2ggaXMgcmVzb2x2ZWQgd2hlbiBhbGwgc3Vic2NyaWJlcnNcbiAgICogaGF2ZSBmaW5pc2hlZCBzaG93aW5nIHRoZSBgYWxlcnRgXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNob3dBbGVydChhbGVydDogU2JBbGVydCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHRoaXMuc3Vic2NyaWJlcnMubWFwKHN1YnNjcmliZXIgPT5cbiAgICAgIHN1YnNjcmliZXIuYWxlcnQoYWxlcnQpXG4gICAgKSk7XG4gIH1cbn1cbiJdfQ==