@miracledevs/paradigm-web-angular
Version:
An angular wrapper with base functionality and helper services.
264 lines • 22.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
/*!
* Paradigm Framework - Angular Wrapper
* Copyright (c) 2017 Miracle Devs, Inc
* Licensed under MIT (https://github.com/MiracleDevs/Paradigm.Web.Angular/blob/master/LICENSE)
*/
import { Injectable } from '@angular/core';
import { ServiceBase } from './base.service';
import { Dictionary, ArrayList, Guid, ObjectExtensions } from '@miracledevs/paradigm-ui-web-shared';
import { getMessageName } from '../decorators/message';
import * as i0 from "@angular/core";
/**
* Represents a message bus registration token.
* @template T
*/
export class RegistrationToken {
/**
* Creates a new instance of \@see RegistrationToken
* @param {?} messageBus a reference to the message bus.
* @param {?} type the message type.
*/
constructor(messageBus, type) {
this.messageBus = messageBus;
this.innerType = type;
this.innerGuid = Guid.new();
}
/**
* Gets the message type.
* @return {?}
*/
get type() {
return this.innerType;
}
/**
* Gets the registration guid.
* @return {?}
*/
get guid() {
return this.innerGuid;
}
/**
* Removes the callback from the message bus.
* @return {?}
*/
unregister() {
this.messageBus.unregister(this);
}
}
if (false) {
/**
* A reference to the \@see MessageBusService.
* @type {?}
* @private
*/
RegistrationToken.prototype.messageBus;
/**
* The inner message type.
* @type {?}
* @private
*/
RegistrationToken.prototype.innerType;
/**
* A guid identifying this registration.
* @type {?}
* @private
*/
RegistrationToken.prototype.innerGuid;
}
/**
* Represents a message bus callback handler.
* It holds a method that must be called when certain
* message is received.
* @template T
*/
export class MessageBusHandler {
/**
* Creates a new instance of \@see MessageBusHandler
* @param {?} messageBus a reference to the message bus.
* @param {?} type the message type.
* @param {?} handler the message handler.
*/
constructor(messageBus, type, handler) {
this.innerHandler = handler;
this.innerToken = new RegistrationToken(messageBus, type);
}
/**
* Gets the registration token that identifies this handler.
* @return {?}
*/
get token() { return this.innerToken; }
/**
* Gets the handler function that should be called when the message is received.
* @return {?}
*/
get handler() { return this.innerHandler; }
}
if (false) {
/**
* The registration token that identifies this handler.
* @type {?}
* @private
*/
MessageBusHandler.prototype.innerToken;
/**
* The handler or function that should be called when the message is received.
* @type {?}
* @private
*/
MessageBusHandler.prototype.innerHandler;
}
export class MessageBusService extends ServiceBase {
/**
* Creates a new instance of \@see MessageBusService
*/
constructor() {
super();
this.handlers = new Dictionary();
}
/**
* Gets the amount of messages registered.
* @return {?}
*/
count() {
return this.handlers.count();
}
/**
* Indicates if the given message type is registered and has handlers associated to it.
* @template T
* @param {?} messageType the message type.
* @return {?}
*/
isRegistered(messageType) {
/** @type {?} */
const type = getMessageName(messageType);
return this.handlers.containsKey(type);
}
/**
* Gets the amount of handler or observers a given message has.
* @template T
* @param {?} messageType the message type.
* @return {?}
*/
handlerCount(messageType) {
/** @type {?} */
const type = getMessageName(messageType);
if (!this.handlers.containsKey(type)) {
return 0;
}
return this.handlers.get(type).count();
}
/**
* Registers a new message handler.
* The handler will be called every time a message of \@see messageType is called.
* @template T
* @param {?} messageType the message type.
* @param {?} handler the message handler.
* @return {?}
*/
register(messageType, handler) {
/** @type {?} */
const type = getMessageName(messageType);
if (!this.handlers.containsKey(type)) {
this.handlers.add(type, new ArrayList());
}
/** @type {?} */
const messageBusHandler = new MessageBusHandler(this, messageType, handler);
this.handlers.get(type).add(messageBusHandler);
return messageBusHandler.token;
}
/**
* Removes a handler registration from the collection.
* @template T
* @param {?} token the registration token.
* @return {?}
*/
unregister(token) {
/** @type {?} */
const type = getMessageName(token.type);
if (!this.handlers.containsKey(type)) {
throw new Error('Token has been already unregistered.');
}
/** @type {?} */
const handler = this.handlers.get(type);
handler.removeAll((/**
* @param {?} x
* @return {?}
*/
x => x.token.guid === token.guid));
if (!handler.any()) {
this.handlers.remove(type);
}
}
/**
* Unregisters all the message handlers.
* @return {?}
*/
unregisterAll() {
this.handlers.clear();
}
/**
* Sends a message to all the registered handlers.
* @template T
* @param {?} message the message to be sent.
* @param {?=} token if specified, the message will be sent only to one handler.
* @return {?}
*/
send(message, token) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
if (ObjectExtensions.isNull(message)) {
throw new Error('Can not send a null message.');
}
if (ObjectExtensions.isNull(message.constructor)) {
throw new Error('Message does not have a constructor, and the system can not infer the type.');
}
/** @type {?} */
const type = getMessageName((/** @type {?} */ (message.constructor)));
if (!this.handlers.containsKey(type)) {
return false;
}
/** @type {?} */
const handlers = this.handlers.get(type)
.where((/**
* @param {?} x
* @return {?}
*/
x => token == null || token.guid === x.token.guid))
.select((/**
* @param {?} x
* @return {?}
*/
x => x.handler));
/** @type {?} */
let accepted = false;
for (let i = (handlers.count() - 1); i >= 0; i--) {
/** @type {?} */
const handler = handlers.get(i);
accepted = true;
yield handler(message);
}
return accepted;
});
}
}
MessageBusService.decorators = [
{ type: Injectable, args: [{
providedIn: 'root'
},] }
];
/** @nocollapse */
MessageBusService.ctorParameters = () => [];
/** @nocollapse */ MessageBusService.ngInjectableDef = i0.defineInjectable({ factory: function MessageBusService_Factory() { return new MessageBusService(); }, token: MessageBusService, providedIn: "root" });
if (false) {
/**
* A collection of message types and all their handlers or observers.
* @type {?}
* @private
*/
MessageBusService.prototype.handlers;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1idXMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BtaXJhY2xlZGV2cy9wYXJhZGlnbS13ZWItYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlcy9tZXNzYWdlLWJ1cy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFNQSxPQUFPLEVBQUUsVUFBVSxFQUFRLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNwRyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7OztBQVF2RCxNQUFNLE9BQU8saUJBQWlCOzs7Ozs7SUFzQzFCLFlBQVksVUFBNkIsRUFBRSxJQUFhO1FBRXBELElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2hDLENBQUM7Ozs7O0lBdkJELElBQUksSUFBSTtRQUVKLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDOzs7OztJQUtELElBQUksSUFBSTtRQUVKLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDOzs7OztJQWlCRCxVQUFVO1FBRU4sSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckMsQ0FBQztDQUNKOzs7Ozs7O0lBL0NHLHVDQUFzQzs7Ozs7O0lBS3RDLHNDQUEyQjs7Ozs7O0lBSzNCLHNDQUF3Qjs7Ozs7Ozs7QUE0QzVCLE1BQU0sT0FBTyxpQkFBaUI7Ozs7Ozs7SUE0QjFCLFlBQVksVUFBNkIsRUFBRSxJQUFhLEVBQUUsT0FBMEI7UUFFaEYsSUFBSSxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUM7UUFDNUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLGlCQUFpQixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM5RCxDQUFDOzs7OztJQWpCRCxJQUFJLEtBQUssS0FBMkIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQzs7Ozs7SUFLN0QsSUFBSSxPQUFPLEtBQXdCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7Q0FhakU7Ozs7Ozs7SUE1QkcsdUNBQXlDOzs7Ozs7SUFLekMseUNBQXdDOztBQTRCNUMsTUFBTSxPQUFPLGlCQUFrQixTQUFRLFdBQVc7Ozs7SUFVOUM7UUFFSSxLQUFLLEVBQUUsQ0FBQztRQUNSLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxVQUFVLEVBQTZDLENBQUM7SUFDaEYsQ0FBQzs7Ozs7SUFLRCxLQUFLO1FBRUQsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2pDLENBQUM7Ozs7Ozs7SUFNRCxZQUFZLENBQUksV0FBb0I7O2NBRTFCLElBQUksR0FBRyxjQUFjLENBQUMsV0FBVyxDQUFDO1FBQ3hDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0MsQ0FBQzs7Ozs7OztJQU1ELFlBQVksQ0FBSSxXQUFvQjs7Y0FFMUIsSUFBSSxHQUFHLGNBQWMsQ0FBQyxXQUFXLENBQUM7UUFFeEMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUNwQztZQUNJLE9BQU8sQ0FBQyxDQUFDO1NBQ1o7UUFFRCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzNDLENBQUM7Ozs7Ozs7OztJQVFELFFBQVEsQ0FBSSxXQUFvQixFQUFFLE9BQTBCOztjQUVsRCxJQUFJLEdBQUcsY0FBYyxDQUFDLFdBQVcsQ0FBQztRQUV4QyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQ3BDO1lBQ0ksSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksU0FBUyxFQUF3QixDQUFDLENBQUM7U0FDbEU7O2NBRUssaUJBQWlCLEdBQUcsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLE9BQU8sQ0FBQztRQUMzRSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUUvQyxPQUFPLGlCQUFpQixDQUFDLEtBQUssQ0FBQztJQUNuQyxDQUFDOzs7Ozs7O0lBTUQsVUFBVSxDQUFJLEtBQTJCOztjQUUvQixJQUFJLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFFdkMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUNwQztZQUNJLE1BQU0sSUFBSSxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztTQUMzRDs7Y0FFSyxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQ3ZDLE9BQU8sQ0FBQyxTQUFTOzs7O1FBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsSUFBSSxFQUFDLENBQUM7UUFFcEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFDbEI7WUFDSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM5QjtJQUNMLENBQUM7Ozs7O0lBS0QsYUFBYTtRQUVULElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDMUIsQ0FBQzs7Ozs7Ozs7SUFPSyxJQUFJLENBQUksT0FBVSxFQUFFLEtBQTRCOztZQUVsRCxJQUFJLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFDcEM7Z0JBQ0ksTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO2FBQ25EO1lBRUQsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUNoRDtnQkFDSSxNQUFNLElBQUksS0FBSyxDQUFDLDZFQUE2RSxDQUFDLENBQUM7YUFDbEc7O2tCQUVLLElBQUksR0FBRyxjQUFjLENBQUMsbUJBQUEsT0FBTyxDQUFDLFdBQVcsRUFBVyxDQUFDO1lBRTNELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFDcEM7Z0JBQ0ksT0FBTyxLQUFLLENBQUM7YUFDaEI7O2tCQUVLLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7aUJBQ25DLEtBQUs7Ozs7WUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBQztpQkFDeEQsTUFBTTs7OztZQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBQzs7Z0JBRXZCLFFBQVEsR0FBRyxLQUFLO1lBRXBCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFDaEQ7O3NCQUNVLE9BQU8sR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDL0IsUUFBUSxHQUFHLElBQUksQ0FBQztnQkFDaEIsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDMUI7WUFFRCxPQUFPLFFBQVEsQ0FBQztRQUNwQixDQUFDO0tBQUE7OztZQTlJSixVQUFVLFNBQUM7Z0JBQ1IsVUFBVSxFQUFFLE1BQU07YUFDckI7Ozs7Ozs7Ozs7O0lBTUcscUNBQXdFIiwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBQYXJhZGlnbSBGcmFtZXdvcmsgLSBBbmd1bGFyIFdyYXBwZXJcbiAqIENvcHlyaWdodCAoYykgMjAxNyBNaXJhY2xlIERldnMsIEluY1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vTWlyYWNsZURldnMvUGFyYWRpZ20uV2ViLkFuZ3VsYXIvYmxvYi9tYXN0ZXIvTElDRU5TRSlcbiAqL1xuXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTZXJ2aWNlQmFzZSB9IGZyb20gJy4vYmFzZS5zZXJ2aWNlJztcbmltcG9ydCB7IERpY3Rpb25hcnksIEFycmF5TGlzdCwgR3VpZCwgT2JqZWN0RXh0ZW5zaW9ucyB9IGZyb20gJ0BtaXJhY2xlZGV2cy9wYXJhZGlnbS11aS13ZWItc2hhcmVkJztcbmltcG9ydCB7IGdldE1lc3NhZ2VOYW1lIH0gZnJvbSAnLi4vZGVjb3JhdG9ycy9tZXNzYWdlJztcblxuXG5leHBvcnQgdHlwZSBNZXNzYWdlSGFuZGxlcjxUPiA9IChtZXNzYWdlOiBUKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgbWVzc2FnZSBidXMgcmVnaXN0cmF0aW9uIHRva2VuLlxuICovXG5leHBvcnQgY2xhc3MgUmVnaXN0cmF0aW9uVG9rZW48VD5cbntcbiAgICAvKipcbiAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgQHNlZSBNZXNzYWdlQnVzU2VydmljZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIG1lc3NhZ2VCdXM6IE1lc3NhZ2VCdXNTZXJ2aWNlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGlubmVyIG1lc3NhZ2UgdHlwZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGlubmVyVHlwZTogVHlwZTxUPjtcblxuICAgIC8qKlxuICAgICAqIEEgZ3VpZCBpZGVudGlmeWluZyB0aGlzIHJlZ2lzdHJhdGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGlubmVyR3VpZDogR3VpZDtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG1lc3NhZ2UgdHlwZS5cbiAgICAgKi9cbiAgICBnZXQgdHlwZSgpOiBUeXBlPFQ+XG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5pbm5lclR5cGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcmVnaXN0cmF0aW9uIGd1aWQuXG4gICAgICovXG4gICAgZ2V0IGd1aWQoKTogR3VpZFxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5uZXJHdWlkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgQHNlZSBSZWdpc3RyYXRpb25Ub2tlblxuICAgICAqIEBwYXJhbSBtZXNzYWdlQnVzIGEgcmVmZXJlbmNlIHRvIHRoZSBtZXNzYWdlIGJ1cy5cbiAgICAgKiBAcGFyYW0gdHlwZSB0aGUgbWVzc2FnZSB0eXBlLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2VCdXM6IE1lc3NhZ2VCdXNTZXJ2aWNlLCB0eXBlOiBUeXBlPFQ+KVxuICAgIHtcbiAgICAgICAgdGhpcy5tZXNzYWdlQnVzID0gbWVzc2FnZUJ1cztcbiAgICAgICAgdGhpcy5pbm5lclR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmlubmVyR3VpZCA9IEd1aWQubmV3KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgY2FsbGJhY2sgZnJvbSB0aGUgbWVzc2FnZSBidXMuXG4gICAgICovXG4gICAgdW5yZWdpc3RlcigpOiB2b2lkXG4gICAge1xuICAgICAgICB0aGlzLm1lc3NhZ2VCdXMudW5yZWdpc3Rlcih0aGlzKTtcbiAgICB9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIG1lc3NhZ2UgYnVzIGNhbGxiYWNrIGhhbmRsZXIuXG4gKiBJdCBob2xkcyBhIG1ldGhvZCB0aGF0IG11c3QgYmUgY2FsbGVkIHdoZW4gY2VydGFpblxuICogbWVzc2FnZSBpcyByZWNlaXZlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIE1lc3NhZ2VCdXNIYW5kbGVyPFQ+XG57XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lzdHJhdGlvbiB0b2tlbiB0aGF0IGlkZW50aWZpZXMgdGhpcyBoYW5kbGVyLlxuICAgICAqL1xuICAgIHByaXZhdGUgaW5uZXJUb2tlbjogUmVnaXN0cmF0aW9uVG9rZW48VD47XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaGFuZGxlciBvciBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgbWVzc2FnZSBpcyByZWNlaXZlZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGlubmVySGFuZGxlcjogTWVzc2FnZUhhbmRsZXI8VD47XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSByZWdpc3RyYXRpb24gdG9rZW4gdGhhdCBpZGVudGlmaWVzIHRoaXMgaGFuZGxlci5cbiAgICAgKi9cbiAgICBnZXQgdG9rZW4oKTogUmVnaXN0cmF0aW9uVG9rZW48VD4geyByZXR1cm4gdGhpcy5pbm5lclRva2VuOyB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBoYW5kbGVyIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHRoZSBtZXNzYWdlIGlzIHJlY2VpdmVkLlxuICAgICAqL1xuICAgIGdldCBoYW5kbGVyKCk6IE1lc3NhZ2VIYW5kbGVyPFQ+IHsgcmV0dXJuIHRoaXMuaW5uZXJIYW5kbGVyOyB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIEBzZWUgTWVzc2FnZUJ1c0hhbmRsZXJcbiAgICAgKiBAcGFyYW0gbWVzc2FnZUJ1cyBhIHJlZmVyZW5jZSB0byB0aGUgbWVzc2FnZSBidXMuXG4gICAgICogQHBhcmFtIHR5cGUgdGhlIG1lc3NhZ2UgdHlwZS5cbiAgICAgKiBAcGFyYW0gaGFuZGxlciB0aGUgbWVzc2FnZSBoYW5kbGVyLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2VCdXM6IE1lc3NhZ2VCdXNTZXJ2aWNlLCB0eXBlOiBUeXBlPFQ+LCBoYW5kbGVyOiBNZXNzYWdlSGFuZGxlcjxUPilcbiAgICB7XG4gICAgICAgIHRoaXMuaW5uZXJIYW5kbGVyID0gaGFuZGxlcjtcbiAgICAgICAgdGhpcy5pbm5lclRva2VuID0gbmV3IFJlZ2lzdHJhdGlvblRva2VuKG1lc3NhZ2VCdXMsIHR5cGUpO1xuICAgIH1cbn1cblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBNZXNzYWdlQnVzU2VydmljZSBleHRlbmRzIFNlcnZpY2VCYXNlXG57XG4gICAgLyoqXG4gICAgICogQSBjb2xsZWN0aW9uIG9mIG1lc3NhZ2UgdHlwZXMgYW5kIGFsbCB0aGVpciBoYW5kbGVycyBvciBvYnNlcnZlcnMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBoYW5kbGVyczogRGljdGlvbmFyeTxzdHJpbmcsIEFycmF5TGlzdDxNZXNzYWdlQnVzSGFuZGxlcjxhbnk+Pj47XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIEBzZWUgTWVzc2FnZUJ1c1NlcnZpY2VcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpXG4gICAge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmhhbmRsZXJzID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBBcnJheUxpc3Q8TWVzc2FnZUJ1c0hhbmRsZXI8YW55Pj4+KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYW1vdW50IG9mIG1lc3NhZ2VzIHJlZ2lzdGVyZWQuXG4gICAgICovXG4gICAgY291bnQoKTogbnVtYmVyXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVycy5jb3VudCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiB0aGUgZ2l2ZW4gbWVzc2FnZSB0eXBlIGlzIHJlZ2lzdGVyZWQgYW5kIGhhcyBoYW5kbGVycyBhc3NvY2lhdGVkIHRvIGl0LlxuICAgICAqIEBwYXJhbSBtZXNzYWdlVHlwZSB0aGUgbWVzc2FnZSB0eXBlLlxuICAgICAqL1xuICAgIGlzUmVnaXN0ZXJlZDxUPihtZXNzYWdlVHlwZTogVHlwZTxUPik6IGJvb2xlYW5cbiAgICB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBnZXRNZXNzYWdlTmFtZShtZXNzYWdlVHlwZSk7XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXJzLmNvbnRhaW5zS2V5KHR5cGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGFtb3VudCBvZiBoYW5kbGVyIG9yIG9ic2VydmVycyBhIGdpdmVuIG1lc3NhZ2UgaGFzLlxuICAgICAqIEBwYXJhbSBtZXNzYWdlVHlwZSB0aGUgbWVzc2FnZSB0eXBlLlxuICAgICAqL1xuICAgIGhhbmRsZXJDb3VudDxUPihtZXNzYWdlVHlwZTogVHlwZTxUPik6IG51bWJlclxuICAgIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IGdldE1lc3NhZ2VOYW1lKG1lc3NhZ2VUeXBlKTtcblxuICAgICAgICBpZiAoIXRoaXMuaGFuZGxlcnMuY29udGFpbnNLZXkodHlwZSkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlcnMuZ2V0KHR5cGUpLmNvdW50KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJzIGEgbmV3IG1lc3NhZ2UgaGFuZGxlci5cbiAgICAgKiBUaGUgaGFuZGxlciB3aWxsIGJlIGNhbGxlZCBldmVyeSB0aW1lIGEgbWVzc2FnZSBvZiBAc2VlIG1lc3NhZ2VUeXBlIGlzIGNhbGxlZC5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZVR5cGUgdGhlIG1lc3NhZ2UgdHlwZS5cbiAgICAgKiBAcGFyYW0gaGFuZGxlciB0aGUgbWVzc2FnZSBoYW5kbGVyLlxuICAgICAqL1xuICAgIHJlZ2lzdGVyPFQ+KG1lc3NhZ2VUeXBlOiBUeXBlPFQ+LCBoYW5kbGVyOiBNZXNzYWdlSGFuZGxlcjxUPik6IFJlZ2lzdHJhdGlvblRva2VuPFQ+XG4gICAge1xuICAgICAgICBjb25zdCB0eXBlID0gZ2V0TWVzc2FnZU5hbWUobWVzc2FnZVR5cGUpO1xuXG4gICAgICAgIGlmICghdGhpcy5oYW5kbGVycy5jb250YWluc0tleSh0eXBlKSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVycy5hZGQodHlwZSwgbmV3IEFycmF5TGlzdDxNZXNzYWdlQnVzSGFuZGxlcjxUPj4oKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtZXNzYWdlQnVzSGFuZGxlciA9IG5ldyBNZXNzYWdlQnVzSGFuZGxlcih0aGlzLCBtZXNzYWdlVHlwZSwgaGFuZGxlcik7XG4gICAgICAgIHRoaXMuaGFuZGxlcnMuZ2V0KHR5cGUpLmFkZChtZXNzYWdlQnVzSGFuZGxlcik7XG5cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VCdXNIYW5kbGVyLnRva2VuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSBoYW5kbGVyIHJlZ2lzdHJhdGlvbiBmcm9tIHRoZSBjb2xsZWN0aW9uLlxuICAgICAqIEBwYXJhbSB0b2tlbiB0aGUgcmVnaXN0cmF0aW9uIHRva2VuLlxuICAgICAqL1xuICAgIHVucmVnaXN0ZXI8VD4odG9rZW46IFJlZ2lzdHJhdGlvblRva2VuPFQ+KTogdm9pZFxuICAgIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IGdldE1lc3NhZ2VOYW1lKHRva2VuLnR5cGUpO1xuXG4gICAgICAgIGlmICghdGhpcy5oYW5kbGVycy5jb250YWluc0tleSh0eXBlKSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUb2tlbiBoYXMgYmVlbiBhbHJlYWR5IHVucmVnaXN0ZXJlZC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmhhbmRsZXJzLmdldCh0eXBlKTtcbiAgICAgICAgaGFuZGxlci5yZW1vdmVBbGwoeCA9PiB4LnRva2VuLmd1aWQgPT09IHRva2VuLmd1aWQpO1xuXG4gICAgICAgIGlmICghaGFuZGxlci5hbnkoKSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVycy5yZW1vdmUodHlwZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVbnJlZ2lzdGVycyBhbGwgdGhlIG1lc3NhZ2UgaGFuZGxlcnMuXG4gICAgICovXG4gICAgdW5yZWdpc3RlckFsbCgpOiB2b2lkXG4gICAge1xuICAgICAgICB0aGlzLmhhbmRsZXJzLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VuZHMgYSBtZXNzYWdlIHRvIGFsbCB0aGUgcmVnaXN0ZXJlZCBoYW5kbGVycy5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBiZSBzZW50LlxuICAgICAqIEBwYXJhbSB0b2tlbiBpZiBzcGVjaWZpZWQsIHRoZSBtZXNzYWdlIHdpbGwgYmUgc2VudCBvbmx5IHRvIG9uZSBoYW5kbGVyLlxuICAgICAqL1xuICAgIGFzeW5jIHNlbmQ8VD4obWVzc2FnZTogVCwgdG9rZW4/OiBSZWdpc3RyYXRpb25Ub2tlbjxUPik6IFByb21pc2U8Ym9vbGVhbj5cbiAgICB7XG4gICAgICAgIGlmIChPYmplY3RFeHRlbnNpb25zLmlzTnVsbChtZXNzYWdlKSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gbm90IHNlbmQgYSBudWxsIG1lc3NhZ2UuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoT2JqZWN0RXh0ZW5zaW9ucy5pc051bGwobWVzc2FnZS5jb25zdHJ1Y3RvcikpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTWVzc2FnZSBkb2VzIG5vdCBoYXZlIGEgY29uc3RydWN0b3IsIGFuZCB0aGUgc3lzdGVtIGNhbiBub3QgaW5mZXIgdGhlIHR5cGUuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0eXBlID0gZ2V0TWVzc2FnZU5hbWUobWVzc2FnZS5jb25zdHJ1Y3RvciBhcyBUeXBlPFQ+KTtcblxuICAgICAgICBpZiAoIXRoaXMuaGFuZGxlcnMuY29udGFpbnNLZXkodHlwZSkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5oYW5kbGVycy5nZXQodHlwZSlcbiAgICAgICAgICAgIC53aGVyZSh4ID0+IHRva2VuID09IG51bGwgfHwgdG9rZW4uZ3VpZCA9PT0geC50b2tlbi5ndWlkKVxuICAgICAgICAgICAgLnNlbGVjdCh4ID0+IHguaGFuZGxlcik7XG5cbiAgICAgICAgbGV0IGFjY2VwdGVkID0gZmFsc2U7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IChoYW5kbGVycy5jb3VudCgpIC0gMSk7IGkgPj0gMDsgaS0tKVxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gaGFuZGxlcnMuZ2V0KGkpO1xuICAgICAgICAgICAgYWNjZXB0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgYXdhaXQgaGFuZGxlcihtZXNzYWdlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhY2NlcHRlZDtcbiAgICB9XG59XG4iXX0=