UNPKG

@miracledevs/paradigm-web-angular

Version:

An angular wrapper with base functionality and helper services.

407 lines 28.3 kB
/** * @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 */ var /** * Represents a message bus registration token. * @template T */ RegistrationToken = /** @class */ (function () { /** * Creates a new instance of @see RegistrationToken * @param messageBus a reference to the message bus. * @param type the message type. */ function RegistrationToken(messageBus, type) { this.messageBus = messageBus; this.innerType = type; this.innerGuid = Guid.new(); } Object.defineProperty(RegistrationToken.prototype, "type", { /** * Gets the message type. */ get: /** * Gets the message type. * @return {?} */ function () { return this.innerType; }, enumerable: true, configurable: true }); Object.defineProperty(RegistrationToken.prototype, "guid", { /** * Gets the registration guid. */ get: /** * Gets the registration guid. * @return {?} */ function () { return this.innerGuid; }, enumerable: true, configurable: true }); /** * Removes the callback from the message bus. */ /** * Removes the callback from the message bus. * @return {?} */ RegistrationToken.prototype.unregister = /** * Removes the callback from the message bus. * @return {?} */ function () { this.messageBus.unregister(this); }; return RegistrationToken; }()); /** * Represents a message bus registration token. * @template T */ export { RegistrationToken }; 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 */ var /** * Represents a message bus callback handler. * It holds a method that must be called when certain * message is received. * @template T */ MessageBusHandler = /** @class */ (function () { /** * 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. */ function MessageBusHandler(messageBus, type, handler) { this.innerHandler = handler; this.innerToken = new RegistrationToken(messageBus, type); } Object.defineProperty(MessageBusHandler.prototype, "token", { /** * Gets the registration token that identifies this handler. */ get: /** * Gets the registration token that identifies this handler. * @return {?} */ function () { return this.innerToken; }, enumerable: true, configurable: true }); Object.defineProperty(MessageBusHandler.prototype, "handler", { /** * Gets the handler function that should be called when the message is received. */ get: /** * Gets the handler function that should be called when the message is received. * @return {?} */ function () { return this.innerHandler; }, enumerable: true, configurable: true }); return MessageBusHandler; }()); /** * Represents a message bus callback handler. * It holds a method that must be called when certain * message is received. * @template T */ export { MessageBusHandler }; 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; } var MessageBusService = /** @class */ (function (_super) { tslib_1.__extends(MessageBusService, _super); /** * Creates a new instance of @see MessageBusService */ function MessageBusService() { var _this = _super.call(this) || this; _this.handlers = new Dictionary(); return _this; } /** * Gets the amount of messages registered. */ /** * Gets the amount of messages registered. * @return {?} */ MessageBusService.prototype.count = /** * Gets the amount of messages registered. * @return {?} */ function () { return this.handlers.count(); }; /** * Indicates if the given message type is registered and has handlers associated to it. * @param messageType the message type. */ /** * Indicates if the given message type is registered and has handlers associated to it. * @template T * @param {?} messageType the message type. * @return {?} */ MessageBusService.prototype.isRegistered = /** * Indicates if the given message type is registered and has handlers associated to it. * @template T * @param {?} messageType the message type. * @return {?} */ function (messageType) { /** @type {?} */ var type = getMessageName(messageType); return this.handlers.containsKey(type); }; /** * Gets the amount of handler or observers a given message has. * @param messageType the message type. */ /** * Gets the amount of handler or observers a given message has. * @template T * @param {?} messageType the message type. * @return {?} */ MessageBusService.prototype.handlerCount = /** * Gets the amount of handler or observers a given message has. * @template T * @param {?} messageType the message type. * @return {?} */ function (messageType) { /** @type {?} */ var 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. * @param messageType the message type. * @param handler the message handler. */ /** * 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 {?} */ MessageBusService.prototype.register = /** * 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 {?} */ function (messageType, handler) { /** @type {?} */ var type = getMessageName(messageType); if (!this.handlers.containsKey(type)) { this.handlers.add(type, new ArrayList()); } /** @type {?} */ var messageBusHandler = new MessageBusHandler(this, messageType, handler); this.handlers.get(type).add(messageBusHandler); return messageBusHandler.token; }; /** * Removes a handler registration from the collection. * @param token the registration token. */ /** * Removes a handler registration from the collection. * @template T * @param {?} token the registration token. * @return {?} */ MessageBusService.prototype.unregister = /** * Removes a handler registration from the collection. * @template T * @param {?} token the registration token. * @return {?} */ function (token) { /** @type {?} */ var type = getMessageName(token.type); if (!this.handlers.containsKey(type)) { throw new Error('Token has been already unregistered.'); } /** @type {?} */ var handler = this.handlers.get(type); handler.removeAll((/** * @param {?} x * @return {?} */ function (x) { return x.token.guid === token.guid; })); if (!handler.any()) { this.handlers.remove(type); } }; /** * Unregisters all the message handlers. */ /** * Unregisters all the message handlers. * @return {?} */ MessageBusService.prototype.unregisterAll = /** * Unregisters all the message handlers. * @return {?} */ function () { this.handlers.clear(); }; /** * Sends a message to all the registered handlers. * @param message the message to be sent. * @param token if specified, the message will be sent only to one handler. */ /** * 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 {?} */ MessageBusService.prototype.send = /** * 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 {?} */ function (message, token) { return tslib_1.__awaiter(this, void 0, void 0, function () { var type, handlers, accepted, i, handler; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: 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 = getMessageName((/** @type {?} */ (message.constructor))); if (!this.handlers.containsKey(type)) { return [2 /*return*/, false]; } handlers = this.handlers.get(type) .where((/** * @param {?} x * @return {?} */ function (x) { return token == null || token.guid === x.token.guid; })) .select((/** * @param {?} x * @return {?} */ function (x) { return x.handler; })); accepted = false; i = (handlers.count() - 1); _a.label = 1; case 1: if (!(i >= 0)) return [3 /*break*/, 4]; handler = handlers.get(i); accepted = true; return [4 /*yield*/, handler(message)]; case 2: _a.sent(); _a.label = 3; case 3: i--; return [3 /*break*/, 1]; case 4: return [2 /*return*/, accepted]; } }); }); }; MessageBusService.decorators = [ { type: Injectable, args: [{ providedIn: 'root' },] } ]; /** @nocollapse */ MessageBusService.ctorParameters = function () { return []; }; /** @nocollapse */ MessageBusService.ngInjectableDef = i0.defineInjectable({ factory: function MessageBusService_Factory() { return new MessageBusService(); }, token: MessageBusService, providedIn: "root" }); return MessageBusService; }(ServiceBase)); export { MessageBusService }; if (false) { /** * A collection of message types and all their handlers or observers. * @type {?} * @private */ MessageBusService.prototype.handlers; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1idXMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BtaXJhY2xlZGV2cy9wYXJhZGlnbS13ZWItYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlcy9tZXNzYWdlLWJ1cy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFNQSxPQUFPLEVBQUUsVUFBVSxFQUFRLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNwRyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7OztBQVF2RDs7Ozs7SUFpQ0k7Ozs7T0FJRztJQUNILDJCQUFZLFVBQTZCLEVBQUUsSUFBYTtRQUVwRCxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBdkJELHNCQUFJLG1DQUFJO1FBSFI7O1dBRUc7Ozs7O1FBQ0g7WUFFSSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDMUIsQ0FBQzs7O09BQUE7SUFLRCxzQkFBSSxtQ0FBSTtRQUhSOztXQUVHOzs7OztRQUNIO1lBRUksT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQzFCLENBQUM7OztPQUFBO0lBY0Q7O09BRUc7Ozs7O0lBQ0gsc0NBQVU7Ozs7SUFBVjtRQUVJLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFDTCx3QkFBQztBQUFELENBQUMsQUFwREQsSUFvREM7Ozs7Ozs7Ozs7OztJQS9DRyx1Q0FBc0M7Ozs7OztJQUt0QyxzQ0FBMkI7Ozs7OztJQUszQixzQ0FBd0I7Ozs7Ozs7O0FBNEM1Qjs7Ozs7OztJQXNCSTs7Ozs7T0FLRztJQUNILDJCQUFZLFVBQTZCLEVBQUUsSUFBYSxFQUFFLE9BQTBCO1FBRWhGLElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDO1FBQzVCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQWpCRCxzQkFBSSxvQ0FBSztRQUhUOztXQUVHOzs7OztRQUNILGNBQW9DLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7OztPQUFBO0lBSzdELHNCQUFJLHNDQUFPO1FBSFg7O1dBRUc7Ozs7O1FBQ0gsY0FBbUMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQzs7O09BQUE7SUFhbEUsd0JBQUM7QUFBRCxDQUFDLEFBakNELElBaUNDOzs7Ozs7Ozs7Ozs7OztJQTVCRyx1Q0FBeUM7Ozs7OztJQUt6Qyx5Q0FBd0M7O0FBeUI1QztJQUd1Qyw2Q0FBVztJQU85Qzs7T0FFRztJQUNIO1FBQUEsWUFFSSxpQkFBTyxTQUVWO1FBREcsS0FBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLFVBQVUsRUFBNkMsQ0FBQzs7SUFDaEYsQ0FBQztJQUVEOztPQUVHOzs7OztJQUNILGlDQUFLOzs7O0lBQUw7UUFFSSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVEOzs7T0FHRzs7Ozs7OztJQUNILHdDQUFZOzs7Ozs7SUFBWixVQUFnQixXQUFvQjs7WUFFMUIsSUFBSSxHQUFHLGNBQWMsQ0FBQyxXQUFXLENBQUM7UUFDeEMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQ7OztPQUdHOzs7Ozs7O0lBQ0gsd0NBQVk7Ozs7OztJQUFaLFVBQWdCLFdBQW9COztZQUUxQixJQUFJLEdBQUcsY0FBYyxDQUFDLFdBQVcsQ0FBQztRQUV4QyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQ3BDO1lBQ0ksT0FBTyxDQUFDLENBQUM7U0FDWjtRQUVELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDM0MsQ0FBQztJQUVEOzs7OztPQUtHOzs7Ozs7Ozs7SUFDSCxvQ0FBUTs7Ozs7Ozs7SUFBUixVQUFZLFdBQW9CLEVBQUUsT0FBMEI7O1lBRWxELElBQUksR0FBRyxjQUFjLENBQUMsV0FBVyxDQUFDO1FBRXhDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFDcEM7WUFDSSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxTQUFTLEVBQXdCLENBQUMsQ0FBQztTQUNsRTs7WUFFSyxpQkFBaUIsR0FBRyxJQUFJLGlCQUFpQixDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsT0FBTyxDQUFDO1FBQzNFLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRS9DLE9BQU8saUJBQWlCLENBQUMsS0FBSyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7O09BR0c7Ozs7Ozs7SUFDSCxzQ0FBVTs7Ozs7O0lBQVYsVUFBYyxLQUEyQjs7WUFFL0IsSUFBSSxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBRXZDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFDcEM7WUFDSSxNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7U0FDM0Q7O1lBRUssT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztRQUN2QyxPQUFPLENBQUMsU0FBUzs7OztRQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDLElBQUksRUFBM0IsQ0FBMkIsRUFBQyxDQUFDO1FBRXBELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQ2xCO1lBQ0ksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDOUI7SUFDTCxDQUFDO0lBRUQ7O09BRUc7Ozs7O0lBQ0gseUNBQWE7Ozs7SUFBYjtRQUVJLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVEOzs7O09BSUc7Ozs7Ozs7O0lBQ0csZ0NBQUk7Ozs7Ozs7SUFBVixVQUFjLE9BQVUsRUFBRSxLQUE0Qjs7Ozs7O3dCQUVsRCxJQUFJLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFDcEM7NEJBQ0ksTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO3lCQUNuRDt3QkFFRCxJQUFJLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQ2hEOzRCQUNJLE1BQU0sSUFBSSxLQUFLLENBQUMsNkVBQTZFLENBQUMsQ0FBQzt5QkFDbEc7d0JBRUssSUFBSSxHQUFHLGNBQWMsQ0FBQyxtQkFBQSxPQUFPLENBQUMsV0FBVyxFQUFXLENBQUM7d0JBRTNELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFDcEM7NEJBQ0ksc0JBQU8sS0FBSyxFQUFDO3lCQUNoQjt3QkFFSyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDOzZCQUNuQyxLQUFLOzs7O3dCQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUE1QyxDQUE0QyxFQUFDOzZCQUN4RCxNQUFNOzs7O3dCQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLE9BQU8sRUFBVCxDQUFTLEVBQUM7d0JBRXZCLFFBQVEsR0FBRyxLQUFLO3dCQUVYLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7Ozs2QkFBRSxDQUFBLENBQUMsSUFBSSxDQUFDLENBQUE7d0JBRWpDLE9BQU8sR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzt3QkFDL0IsUUFBUSxHQUFHLElBQUksQ0FBQzt3QkFDaEIscUJBQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFBOzt3QkFBdEIsU0FBc0IsQ0FBQzs7O3dCQUprQixDQUFDLEVBQUUsQ0FBQTs7NEJBT2hELHNCQUFPLFFBQVEsRUFBQzs7OztLQUNuQjs7Z0JBOUlKLFVBQVUsU0FBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckI7Ozs7OzRCQWpIRDtDQThQQyxBQS9JRCxDQUd1QyxXQUFXLEdBNElqRDtTQTVJWSxpQkFBaUI7Ozs7Ozs7SUFLMUIscUNBQXdFIiwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBQYXJhZGlnbSBGcmFtZXdvcmsgLSBBbmd1bGFyIFdyYXBwZXJcbiAqIENvcHlyaWdodCAoYykgMjAxNyBNaXJhY2xlIERldnMsIEluY1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vTWlyYWNsZURldnMvUGFyYWRpZ20uV2ViLkFuZ3VsYXIvYmxvYi9tYXN0ZXIvTElDRU5TRSlcbiAqL1xuXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTZXJ2aWNlQmFzZSB9IGZyb20gJy4vYmFzZS5zZXJ2aWNlJztcbmltcG9ydCB7IERpY3Rpb25hcnksIEFycmF5TGlzdCwgR3VpZCwgT2JqZWN0RXh0ZW5zaW9ucyB9IGZyb20gJ0BtaXJhY2xlZGV2cy9wYXJhZGlnbS11aS13ZWItc2hhcmVkJztcbmltcG9ydCB7IGdldE1lc3NhZ2VOYW1lIH0gZnJvbSAnLi4vZGVjb3JhdG9ycy9tZXNzYWdlJztcblxuXG5leHBvcnQgdHlwZSBNZXNzYWdlSGFuZGxlcjxUPiA9IChtZXNzYWdlOiBUKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgbWVzc2FnZSBidXMgcmVnaXN0cmF0aW9uIHRva2VuLlxuICovXG5leHBvcnQgY2xhc3MgUmVnaXN0cmF0aW9uVG9rZW48VD5cbntcbiAgICAvKipcbiAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgQHNlZSBNZXNzYWdlQnVzU2VydmljZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIG1lc3NhZ2VCdXM6IE1lc3NhZ2VCdXNTZXJ2aWNlO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGlubmVyIG1lc3NhZ2UgdHlwZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGlubmVyVHlwZTogVHlwZTxUPjtcblxuICAgIC8qKlxuICAgICAqIEEgZ3VpZCBpZGVudGlmeWluZyB0aGlzIHJlZ2lzdHJhdGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGlubmVyR3VpZDogR3VpZDtcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG1lc3NhZ2UgdHlwZS5cbiAgICAgKi9cbiAgICBnZXQgdHlwZSgpOiBUeXBlPFQ+XG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5pbm5lclR5cGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcmVnaXN0cmF0aW9uIGd1aWQuXG4gICAgICovXG4gICAgZ2V0IGd1aWQoKTogR3VpZFxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5uZXJHdWlkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgQHNlZSBSZWdpc3RyYXRpb25Ub2tlblxuICAgICAqIEBwYXJhbSBtZXNzYWdlQnVzIGEgcmVmZXJlbmNlIHRvIHRoZSBtZXNzYWdlIGJ1cy5cbiAgICAgKiBAcGFyYW0gdHlwZSB0aGUgbWVzc2FnZSB0eXBlLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2VCdXM6IE1lc3NhZ2VCdXNTZXJ2aWNlLCB0eXBlOiBUeXBlPFQ+KVxuICAgIHtcbiAgICAgICAgdGhpcy5tZXNzYWdlQnVzID0gbWVzc2FnZUJ1cztcbiAgICAgICAgdGhpcy5pbm5lclR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLmlubmVyR3VpZCA9IEd1aWQubmV3KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgY2FsbGJhY2sgZnJvbSB0aGUgbWVzc2FnZSBidXMuXG4gICAgICovXG4gICAgdW5yZWdpc3RlcigpOiB2b2lkXG4gICAge1xuICAgICAgICB0aGlzLm1lc3NhZ2VCdXMudW5yZWdpc3Rlcih0aGlzKTtcbiAgICB9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIG1lc3NhZ2UgYnVzIGNhbGxiYWNrIGhhbmRsZXIuXG4gKiBJdCBob2xkcyBhIG1ldGhvZCB0aGF0IG11c3QgYmUgY2FsbGVkIHdoZW4gY2VydGFpblxuICogbWVzc2FnZSBpcyByZWNlaXZlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIE1lc3NhZ2VCdXNIYW5kbGVyPFQ+XG57XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lzdHJhdGlvbiB0b2tlbiB0aGF0IGlkZW50aWZpZXMgdGhpcyBoYW5kbGVyLlxuICAgICAqL1xuICAgIHByaXZhdGUgaW5uZXJUb2tlbjogUmVnaXN0cmF0aW9uVG9rZW48VD47XG5cbiAgICAvKipcbiAgICAgKiBUaGUgaGFuZGxlciBvciBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgbWVzc2FnZSBpcyByZWNlaXZlZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGlubmVySGFuZGxlcjogTWVzc2FnZUhhbmRsZXI8VD47XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSByZWdpc3RyYXRpb24gdG9rZW4gdGhhdCBpZGVudGlmaWVzIHRoaXMgaGFuZGxlci5cbiAgICAgKi9cbiAgICBnZXQgdG9rZW4oKTogUmVnaXN0cmF0aW9uVG9rZW48VD4geyByZXR1cm4gdGhpcy5pbm5lclRva2VuOyB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBoYW5kbGVyIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHRoZSBtZXNzYWdlIGlzIHJlY2VpdmVkLlxuICAgICAqL1xuICAgIGdldCBoYW5kbGVyKCk6IE1lc3NhZ2VIYW5kbGVyPFQ+IHsgcmV0dXJuIHRoaXMuaW5uZXJIYW5kbGVyOyB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIEBzZWUgTWVzc2FnZUJ1c0hhbmRsZXJcbiAgICAgKiBAcGFyYW0gbWVzc2FnZUJ1cyBhIHJlZmVyZW5jZSB0byB0aGUgbWVzc2FnZSBidXMuXG4gICAgICogQHBhcmFtIHR5cGUgdGhlIG1lc3NhZ2UgdHlwZS5cbiAgICAgKiBAcGFyYW0gaGFuZGxlciB0aGUgbWVzc2FnZSBoYW5kbGVyLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2VCdXM6IE1lc3NhZ2VCdXNTZXJ2aWNlLCB0eXBlOiBUeXBlPFQ+LCBoYW5kbGVyOiBNZXNzYWdlSGFuZGxlcjxUPilcbiAgICB7XG4gICAgICAgIHRoaXMuaW5uZXJIYW5kbGVyID0gaGFuZGxlcjtcbiAgICAgICAgdGhpcy5pbm5lclRva2VuID0gbmV3IFJlZ2lzdHJhdGlvblRva2VuKG1lc3NhZ2VCdXMsIHR5cGUpO1xuICAgIH1cbn1cblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBNZXNzYWdlQnVzU2VydmljZSBleHRlbmRzIFNlcnZpY2VCYXNlXG57XG4gICAgLyoqXG4gICAgICogQSBjb2xsZWN0aW9uIG9mIG1lc3NhZ2UgdHlwZXMgYW5kIGFsbCB0aGVpciBoYW5kbGVycyBvciBvYnNlcnZlcnMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBoYW5kbGVyczogRGljdGlvbmFyeTxzdHJpbmcsIEFycmF5TGlzdDxNZXNzYWdlQnVzSGFuZGxlcjxhbnk+Pj47XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIEBzZWUgTWVzc2FnZUJ1c1NlcnZpY2VcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcigpXG4gICAge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmhhbmRsZXJzID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBBcnJheUxpc3Q8TWVzc2FnZUJ1c0hhbmRsZXI8YW55Pj4+KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYW1vdW50IG9mIG1lc3NhZ2VzIHJlZ2lzdGVyZWQuXG4gICAgICovXG4gICAgY291bnQoKTogbnVtYmVyXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVycy5jb3VudCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiB0aGUgZ2l2ZW4gbWVzc2FnZSB0eXBlIGlzIHJlZ2lzdGVyZWQgYW5kIGhhcyBoYW5kbGVycyBhc3NvY2lhdGVkIHRvIGl0LlxuICAgICAqIEBwYXJhbSBtZXNzYWdlVHlwZSB0aGUgbWVzc2FnZSB0eXBlLlxuICAgICAqL1xuICAgIGlzUmVnaXN0ZXJlZDxUPihtZXNzYWdlVHlwZTogVHlwZTxUPik6IGJvb2xlYW5cbiAgICB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBnZXRNZXNzYWdlTmFtZShtZXNzYWdlVHlwZSk7XG4gICAgICAgIHJldHVybiB0aGlzLmhhbmRsZXJzLmNvbnRhaW5zS2V5KHR5cGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGFtb3VudCBvZiBoYW5kbGVyIG9yIG9ic2VydmVycyBhIGdpdmVuIG1lc3NhZ2UgaGFzLlxuICAgICAqIEBwYXJhbSBtZXNzYWdlVHlwZSB0aGUgbWVzc2FnZSB0eXBlLlxuICAgICAqL1xuICAgIGhhbmRsZXJDb3VudDxUPihtZXNzYWdlVHlwZTogVHlwZTxUPik6IG51bWJlclxuICAgIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IGdldE1lc3NhZ2VOYW1lKG1lc3NhZ2VUeXBlKTtcblxuICAgICAgICBpZiAoIXRoaXMuaGFuZGxlcnMuY29udGFpbnNLZXkodHlwZSkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlcnMuZ2V0KHR5cGUpLmNvdW50KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJzIGEgbmV3IG1lc3NhZ2UgaGFuZGxlci5cbiAgICAgKiBUaGUgaGFuZGxlciB3aWxsIGJlIGNhbGxlZCBldmVyeSB0aW1lIGEgbWVzc2FnZSBvZiBAc2VlIG1lc3NhZ2VUeXBlIGlzIGNhbGxlZC5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZVR5cGUgdGhlIG1lc3NhZ2UgdHlwZS5cbiAgICAgKiBAcGFyYW0gaGFuZGxlciB0aGUgbWVzc2FnZSBoYW5kbGVyLlxuICAgICAqL1xuICAgIHJlZ2lzdGVyPFQ+KG1lc3NhZ2VUeXBlOiBUeXBlPFQ+LCBoYW5kbGVyOiBNZXNzYWdlSGFuZGxlcjxUPik6IFJlZ2lzdHJhdGlvblRva2VuPFQ+XG4gICAge1xuICAgICAgICBjb25zdCB0eXBlID0gZ2V0TWVzc2FnZU5hbWUobWVzc2FnZVR5cGUpO1xuXG4gICAgICAgIGlmICghdGhpcy5oYW5kbGVycy5jb250YWluc0tleSh0eXBlKSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVycy5hZGQodHlwZSwgbmV3IEFycmF5TGlzdDxNZXNzYWdlQnVzSGFuZGxlcjxUPj4oKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtZXNzYWdlQnVzSGFuZGxlciA9IG5ldyBNZXNzYWdlQnVzSGFuZGxlcih0aGlzLCBtZXNzYWdlVHlwZSwgaGFuZGxlcik7XG4gICAgICAgIHRoaXMuaGFuZGxlcnMuZ2V0KHR5cGUpLmFkZChtZXNzYWdlQnVzSGFuZGxlcik7XG5cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VCdXNIYW5kbGVyLnRva2VuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSBoYW5kbGVyIHJlZ2lzdHJhdGlvbiBmcm9tIHRoZSBjb2xsZWN0aW9uLlxuICAgICAqIEBwYXJhbSB0b2tlbiB0aGUgcmVnaXN0cmF0aW9uIHRva2VuLlxuICAgICAqL1xuICAgIHVucmVnaXN0ZXI8VD4odG9rZW46IFJlZ2lzdHJhdGlvblRva2VuPFQ+KTogdm9pZFxuICAgIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IGdldE1lc3NhZ2VOYW1lKHRva2VuLnR5cGUpO1xuXG4gICAgICAgIGlmICghdGhpcy5oYW5kbGVycy5jb250YWluc0tleSh0eXBlKSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUb2tlbiBoYXMgYmVlbiBhbHJlYWR5IHVucmVnaXN0ZXJlZC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmhhbmRsZXJzLmdldCh0eXBlKTtcbiAgICAgICAgaGFuZGxlci5yZW1vdmVBbGwoeCA9PiB4LnRva2VuLmd1aWQgPT09IHRva2VuLmd1aWQpO1xuXG4gICAgICAgIGlmICghaGFuZGxlci5hbnkoKSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVycy5yZW1vdmUodHlwZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVbnJlZ2lzdGVycyBhbGwgdGhlIG1lc3NhZ2UgaGFuZGxlcnMuXG4gICAgICovXG4gICAgdW5yZWdpc3RlckFsbCgpOiB2b2lkXG4gICAge1xuICAgICAgICB0aGlzLmhhbmRsZXJzLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VuZHMgYSBtZXNzYWdlIHRvIGFsbCB0aGUgcmVnaXN0ZXJlZCBoYW5kbGVycy5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBiZSBzZW50LlxuICAgICAqIEBwYXJhbSB0b2tlbiBpZiBzcGVjaWZpZWQsIHRoZSBtZXNzYWdlIHdpbGwgYmUgc2VudCBvbmx5IHRvIG9uZSBoYW5kbGVyLlxuICAgICAqL1xuICAgIGFzeW5jIHNlbmQ8VD4obWVzc2FnZTogVCwgdG9rZW4/OiBSZWdpc3RyYXRpb25Ub2tlbjxUPik6IFByb21pc2U8Ym9vbGVhbj5cbiAgICB7XG4gICAgICAgIGlmIChPYmplY3RFeHRlbnNpb25zLmlzTnVsbChtZXNzYWdlKSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gbm90IHNlbmQgYSBudWxsIG1lc3NhZ2UuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoT2JqZWN0RXh0ZW5zaW9ucy5pc051bGwobWVzc2FnZS5jb25zdHJ1Y3RvcikpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTWVzc2FnZSBkb2VzIG5vdCBoYXZlIGEgY29uc3RydWN0b3IsIGFuZCB0aGUgc3lzdGVtIGNhbiBub3QgaW5mZXIgdGhlIHR5cGUuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0eXBlID0gZ2V0TWVzc2FnZU5hbWUobWVzc2FnZS5jb25zdHJ1Y3RvciBhcyBUeXBlPFQ+KTtcblxuICAgICAgICBpZiAoIXRoaXMuaGFuZGxlcnMuY29udGFpbnNLZXkodHlwZSkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5oYW5kbGVycy5nZXQodHlwZSlcbiAgICAgICAgICAgIC53aGVyZSh4ID0+IHRva2VuID09IG51bGwgfHwgdG9rZW4uZ3VpZCA9PT0geC50b2tlbi5ndWlkKVxuICAgICAgICAgICAgLnNlbGVjdCh4ID0+IHguaGFuZGxlcik7XG5cbiAgICAgICAgbGV0IGFjY2VwdGVkID0gZmFsc2U7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IChoYW5kbGVycy5jb3VudCgpIC0gMSk7IGkgPj0gMDsgaS0tKVxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gaGFuZGxlcnMuZ2V0KGkpO1xuICAgICAgICAgICAgYWNjZXB0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgYXdhaXQgaGFuZGxlcihtZXNzYWdlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhY2NlcHRlZDtcbiAgICB9XG59XG4iXX0=