@miracledevs/paradigm-web-angular
Version:
An angular wrapper with base functionality and helper services.
498 lines • 33.4 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.Shared/blob/master/LICENSE)
*/
import { ServiceBase } from './base.service';
import { ObjectExtensions } from '@miracledevs/paradigm-ui-web-shared';
import { Injectable } from '@angular/core';
import * as i0 from "@angular/core";
/**
* Represents the response of the geolocation service.
* @record
*/
export function Coordinate() { }
if (false) {
/**
* the latitude as a decimal number (always returned).
* @type {?}
*/
Coordinate.prototype.latitude;
/**
* the longitude as a decimal number (always returned).
* @type {?}
*/
Coordinate.prototype.longitude;
/**
* the accuracy of position (always returned).
* @type {?|undefined}
*/
Coordinate.prototype.accuracy;
/**
* the altitude in meters above the mean sea level (returned if available).
* @type {?|undefined}
*/
Coordinate.prototype.altitude;
/**
* the altitude accuracy of position (returned if available).
* @type {?|undefined}
*/
Coordinate.prototype.altitudeAccuracy;
/**
* the heading as degrees clockwise from North (returned if available).
* @type {?|undefined}
*/
Coordinate.prototype.heading;
/**
* the speed in meters per second (returned if available).
* @type {?|undefined}
*/
Coordinate.prototype.speed;
}
/**
* Represents the \@see navigator.geolocation options.
* @record
*/
export function IPositionOptions() { }
if (false) {
/**
* Indicates if the geolocation should have high accuracy to find the current position.
* @type {?|undefined}
*/
IPositionOptions.prototype.enableHighAccuracy;
/**
* A timeout value for the geolocation query.
* @type {?|undefined}
*/
IPositionOptions.prototype.timeout;
/**
* The maximum age for the request.
* @type {?|undefined}
*/
IPositionOptions.prototype.maximumAge;
}
/**
* Represents a geolocation watcher.
* It listens for geolocation events.
*/
var /**
* Represents a geolocation watcher.
* It listens for geolocation events.
*/
GeolocationWatcher = /** @class */ (function () {
/**
* Creates a new instance of @see GeolocationWatcher
* @param geolocation a reference to the geolocation service.
*/
function GeolocationWatcher(geolocation) {
this.geolocation = geolocation;
this.watchIndex = -1;
}
/**
* Register the watcher and stores the watch operation index.
* @param index the index representing this watch operation.
*/
/**
* Register the watcher and stores the watch operation index.
* @param {?} index the index representing this watch operation.
* @return {?}
*/
GeolocationWatcher.prototype.register = /**
* Register the watcher and stores the watch operation index.
* @param {?} index the index representing this watch operation.
* @return {?}
*/
function (index) {
if (!this.isDisposed()) {
throw new Error('This watcher can not be registered again.');
}
this.watchIndex = index;
};
/**
* Unregisters the watcher.
* Once unregistered, the watcher does not receives any more events.
*/
/**
* Unregisters the watcher.
* Once unregistered, the watcher does not receives any more events.
* @return {?}
*/
GeolocationWatcher.prototype.unregister = /**
* Unregisters the watcher.
* Once unregistered, the watcher does not receives any more events.
* @return {?}
*/
function () {
if (this.isDisposed()) {
throw new Error('This watcher has not been properly registered.');
}
this.beingUnregistered = true;
this.geolocation.unregisterWatcher(this);
this.beingUnregistered = false;
this.watchIndex = -1;
};
/**
* Gets the watch index.
*/
/**
* Gets the watch index.
* @return {?}
*/
GeolocationWatcher.prototype.getWatchIndex = /**
* Gets the watch index.
* @return {?}
*/
function () {
return this.watchIndex;
};
/**
* Indicates if this watcher is disposed.
*/
/**
* Indicates if this watcher is disposed.
* @return {?}
*/
GeolocationWatcher.prototype.isDisposed = /**
* Indicates if this watcher is disposed.
* @return {?}
*/
function () {
return this.watchIndex < 0;
};
/**
* Indicates if the watcher is being unregistered.
*/
/**
* Indicates if the watcher is being unregistered.
* @return {?}
*/
GeolocationWatcher.prototype.isBeingUnregistered = /**
* Indicates if the watcher is being unregistered.
* @return {?}
*/
function () {
return this.beingUnregistered;
};
return GeolocationWatcher;
}());
/**
* Represents a geolocation watcher.
* It listens for geolocation events.
*/
export { GeolocationWatcher };
if (false) {
/**
* The geolocation watch operation index.
* @type {?}
* @private
*/
GeolocationWatcher.prototype.watchIndex;
/**
* Indicates if the watcher is being unregistered.
* @type {?}
* @private
*/
GeolocationWatcher.prototype.beingUnregistered;
/**
* Event called when the geolocation service reports new geolocation information.
* \@param coordinates the new geolocation coordinates.
* @type {?}
*/
GeolocationWatcher.prototype.onInformationReceived;
/**
* Event called when the geolocation service found an error.
* \@param error the error found.
* @type {?}
*/
GeolocationWatcher.prototype.onError;
/**
* @type {?}
* @private
*/
GeolocationWatcher.prototype.geolocation;
}
/**
* Provides a common interface for different geolocation providers.
* @record
*/
export function IGeolocationProvider() { }
if (false) {
/**
* Indicates if the geolocation provider is available.
* @return {?}
*/
IGeolocationProvider.prototype.isAvailable = function () { };
/**
* Gets the current geolocation.
* @return {?}
*/
IGeolocationProvider.prototype.getGeolocation = function () { };
/**
* Registers a new geolocation watcher.
* @return {?}
*/
IGeolocationProvider.prototype.registerWatcher = function () { };
/**
* Unregisters a geolocation watcher.
* @param {?} watcher the watcher that will be unregistered.
* @return {?}
*/
IGeolocationProvider.prototype.unregisterWatcher = function (watcher) { };
}
/**
* Implements the geolocation provider api using the \@see navigator.geolocation
*/
var /**
* Implements the geolocation provider api using the \@see navigator.geolocation
*/
NavigationGeolocationProvider = /** @class */ (function () {
/**
* Creates a new instance of @see NavigationGeolocationProvider
* @param options geolocation options.
*/
function NavigationGeolocationProvider(options) {
this.options = options;
}
/**
* Gets the current geolocation if a service geolocation service is available.
*/
/**
* Gets the current geolocation if a service geolocation service is available.
* @return {?}
*/
NavigationGeolocationProvider.prototype.getGeolocation = /**
* Gets the current geolocation if a service geolocation service is available.
* @return {?}
*/
function () {
var _this = this;
if (this.isAvailable()) {
return new Promise((/**
* @param {?} resolve
* @param {?} reject
* @return {?}
*/
function (resolve, reject) { return _this.getGeoLocator().getCurrentPosition((/**
* @param {?} info
* @return {?}
*/
function (info) { return resolve(info.coords); }), (/**
* @param {?} error
* @return {?}
*/
function (error) { return reject(error.message); }), _this.options); }));
}
return Promise.reject('The geolocation service is not available.');
};
/**
* Registers a geolocation watcher to lister for geolocation events.
*/
/**
* Registers a geolocation watcher to lister for geolocation events.
* @return {?}
*/
NavigationGeolocationProvider.prototype.registerWatcher = /**
* Registers a geolocation watcher to lister for geolocation events.
* @return {?}
*/
function () {
if (this.isAvailable()) {
/** @type {?} */
var watcher_1 = new GeolocationWatcher(this);
watcher_1.register(this.getGeoLocator().watchPosition((/**
* @param {?} info
* @return {?}
*/
function (info) {
if (watcher_1.onInformationReceived) {
watcher_1.onInformationReceived(info.coords);
}
}), (/**
* @param {?} error
* @return {?}
*/
function (error) {
if (watcher_1.onError) {
watcher_1.onError(error.message);
}
}), this.options));
return watcher_1;
}
throw new Error('The geolocation service is not available.');
};
/**
* Unregisters the geolocation watcher.
* @param watcher the watcher that will be unregistered.
*/
/**
* Unregisters the geolocation watcher.
* @param {?} watcher the watcher that will be unregistered.
* @return {?}
*/
NavigationGeolocationProvider.prototype.unregisterWatcher = /**
* Unregisters the geolocation watcher.
* @param {?} watcher the watcher that will be unregistered.
* @return {?}
*/
function (watcher) {
if (!watcher.isBeingUnregistered()) {
throw new Error('Can not call this method directly. Call GeolocationWatcher.unregister instead.');
}
if (this.isAvailable()) {
this.getGeoLocator().clearWatch(watcher.getWatchIndex());
}
};
/**
* Indicates if the geolocation service is available.
*/
/**
* Indicates if the geolocation service is available.
* @return {?}
*/
NavigationGeolocationProvider.prototype.isAvailable = /**
* Indicates if the geolocation service is available.
* @return {?}
*/
function () {
return !ObjectExtensions.isNull(navigator.geolocation) &&
!ObjectExtensions.isNull(navigator.geolocation.getCurrentPosition) &&
!ObjectExtensions.isNull(navigator.geolocation.watchPosition) &&
!ObjectExtensions.isNull(navigator.geolocation.clearWatch);
};
/**
* Gets the geolocation service.
*/
/**
* Gets the geolocation service.
* @private
* @return {?}
*/
NavigationGeolocationProvider.prototype.getGeoLocator = /**
* Gets the geolocation service.
* @private
* @return {?}
*/
function () {
return navigator.geolocation;
};
return NavigationGeolocationProvider;
}());
/**
* Implements the geolocation provider api using the \@see navigator.geolocation
*/
export { NavigationGeolocationProvider };
if (false) {
/**
* @type {?}
* @private
*/
NavigationGeolocationProvider.prototype.options;
}
var GeolocationService = /** @class */ (function (_super) {
tslib_1.__extends(GeolocationService, _super);
/**
* Creates a new instance of @see GeolocationService
* By default @see GeolocationService uses @see NavigationGeolocationProvider as provider.
* The provider can be changed using @see GeolocationService.setGeolocationProvider
*/
function GeolocationService() {
var _this = _super.call(this) || this;
_this.geolocationProvider = new NavigationGeolocationProvider();
return _this;
}
/**
* Sets the geolocation provider.
* @param provider geolocation provider.
*/
/**
* Sets the geolocation provider.
* @param {?} provider geolocation provider.
* @return {?}
*/
GeolocationService.prototype.setGeolocationProvider = /**
* Sets the geolocation provider.
* @param {?} provider geolocation provider.
* @return {?}
*/
function (provider) {
if (!provider) {
throw new Error('The geolocation provider can not be null or undefined.');
}
this.geolocationProvider = provider;
};
/**
* Gets the current geolocation if a service geolocation service is available.
* @param options the geolocation options.
*/
/**
* Gets the current geolocation if a service geolocation service is available.
* @return {?}
*/
GeolocationService.prototype.getGeolocation = /**
* Gets the current geolocation if a service geolocation service is available.
* @return {?}
*/
function () {
return tslib_1.__awaiter(this, void 0, void 0, function () {
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.geolocationProvider.getGeolocation()];
case 1: return [2 /*return*/, _a.sent()];
}
});
});
};
/**
* Registers a geolocation watcher to lister for geolocation events.
* @param options the geolocation options.
*/
/**
* Registers a geolocation watcher to lister for geolocation events.
* @return {?}
*/
GeolocationService.prototype.registerWatcher = /**
* Registers a geolocation watcher to lister for geolocation events.
* @return {?}
*/
function () {
return this.geolocationProvider.registerWatcher();
};
/**
* Indicates if the geolocation service is available.
*/
/**
* Indicates if the geolocation service is available.
* @return {?}
*/
GeolocationService.prototype.isAvailable = /**
* Indicates if the geolocation service is available.
* @return {?}
*/
function () {
return this.geolocationProvider.isAvailable();
};
GeolocationService.decorators = [
{ type: Injectable, args: [{
providedIn: 'root'
},] }
];
/** @nocollapse */
GeolocationService.ctorParameters = function () { return []; };
/** @nocollapse */ GeolocationService.ngInjectableDef = i0.defineInjectable({ factory: function GeolocationService_Factory() { return new GeolocationService(); }, token: GeolocationService, providedIn: "root" });
return GeolocationService;
}(ServiceBase));
export { GeolocationService };
if (false) {
/**
* Reference to a geolocation provider.
* @type {?}
* @private
*/
GeolocationService.prototype.geolocationProvider;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvbG9jYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BtaXJhY2xlZGV2cy9wYXJhZGlnbS13ZWItYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlcy9nZW9sb2NhdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFNQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDdkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7O0FBSzNDLGdDQW9DQzs7Ozs7O0lBL0JHLDhCQUFpQjs7Ozs7SUFLakIsK0JBQWtCOzs7OztJQUtsQiw4QkFBa0I7Ozs7O0lBS2xCLDhCQUFrQjs7Ozs7SUFLbEIsc0NBQTBCOzs7OztJQUsxQiw2QkFBaUI7Ozs7O0lBS2pCLDJCQUFlOzs7Ozs7QUFNbkIsc0NBZ0JDOzs7Ozs7SUFYRyw4Q0FBNkI7Ozs7O0lBSzdCLG1DQUFpQjs7Ozs7SUFLakIsc0NBQW9COzs7Ozs7QUFReEI7Ozs7O0lBd0JJOzs7T0FHRztJQUNILDRCQUFvQixXQUFpQztRQUFqQyxnQkFBVyxHQUFYLFdBQVcsQ0FBc0I7UUFFakQsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRUQ7OztPQUdHOzs7Ozs7SUFDSCxxQ0FBUTs7Ozs7SUFBUixVQUFTLEtBQWE7UUFFbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFDdEI7WUFDSSxNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7U0FDaEU7UUFFRCxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUM1QixDQUFDO0lBRUQ7OztPQUdHOzs7Ozs7SUFDSCx1Q0FBVTs7Ozs7SUFBVjtRQUVJLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUNyQjtZ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LENBQUM7SUFFRDs7O09BR0c7Ozs7O0lBQ0csMkNBQWM7Ozs7SUFBcEI7Ozs7NEJBRVcscUJBQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFDLGNBQWMsRUFBRSxFQUFBOzRCQUF0RCxzQkFBTyxTQUErQyxFQUFDOzs7O0tBQzFEO0lBRUQ7OztPQUdHOzs7OztJQUNILDRDQUFlOzs7O0lBQWY7UUFFSSxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN0RCxDQUFDO0lBRUQ7O09BRUc7Ozs7O0lBQ0gsd0NBQVc7Ozs7SUFBWDtRQUVJLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2xELENBQUM7O2dCQTNESixVQUFVLFNBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCOzs7Ozs2QkFuU0Q7Q0E2VkMsQUE1REQsQ0FHd0MsV0FBVyxHQXlEbEQ7U0F6RFksa0JBQWtCOzs7Ozs7O0lBSzNCLGlEQUFrRCIsInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogUGFyYWRpZ20gRnJhbWV3b3JrIC0gQW5ndWxhciBXcmFwcGVyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTcgTWlyYWNsZSBEZXZzLCBJbmNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL01pcmFjbGVEZXZzL1BhcmFkaWdtLldlYi5TaGFyZWQvYmxvYi9tYXN0ZXIvTElDRU5TRSlcbiAqL1xuXG5pbXBvcnQgeyBTZXJ2aWNlQmFzZSB9IGZyb20gJy4vYmFzZS5zZXJ2aWNlJztcbmltcG9ydCB7IE9iamVjdEV4dGVuc2lvbnMgfSBmcm9tICdAbWlyYWNsZWRldnMvcGFyYWRpZ20tdWktd2ViLXNoYXJlZCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgcmVzcG9uc2Ugb2YgdGhlIGdlb2xvY2F0aW9uIHNlcnZpY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29vcmRpbmF0ZVxue1xuICAgIC8qKlxuICAgICAqIHRoZSBsYXRpdHVkZSBhcyBhIGRlY2ltYWwgbnVtYmVyIChhbHdheXMgcmV0dXJuZWQpLlxuICAgICAqL1xuICAgIGxhdGl0dWRlOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiB0aGUgbG9uZ2l0dWRlIGFzIGEgZGVjaW1hbCBudW1iZXIgKGFsd2F5cyByZXR1cm5lZCkuXG4gICAgICovXG4gICAgbG9uZ2l0dWRlOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiB0aGUgYWNjdXJhY3kgb2YgcG9zaXRpb24gKGFsd2F5cyByZXR1cm5lZCkuXG4gICAgICovXG4gICAgYWNjdXJhY3k/OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiB0aGUgYWx0aXR1ZGUgaW4gbWV0ZXJzIGFib3ZlIHRoZSBtZWFuIHNlYSBsZXZlbCAocmV0dXJuZWQgaWYgYXZhaWxhYmxlKS5cbiAgICAgKi9cbiAgICBhbHRpdHVkZT86IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIHRoZSBhbHRpdHVkZSBhY2N1cmFjeSBvZiBwb3NpdGlvbiAocmV0dXJuZWQgaWYgYXZhaWxhYmxlKS5cbiAgICAgKi9cbiAgICBhbHRpdHVkZUFjY3VyYWN5PzogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogdGhlIGhlYWRpbmcgYXMgZGVncmVlcyBjbG9ja3dpc2UgZnJvbSBOb3J0aCAocmV0dXJuZWQgaWYgYXZhaWxhYmxlKS5cbiAgICAgKi9cbiAgICBoZWFkaW5nPzogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogdGhlIHNwZWVkIGluIG1ldGVycyBwZXIgc2Vjb25kIChyZXR1cm5lZCBpZiBhdmFpbGFibGUpLlxuICAgICAqL1xuICAgIHNwZWVkPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIEBzZWUgbmF2aWdhdG9yLmdlb2xvY2F0aW9uIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVBvc2l0aW9uT3B0aW9uc1xue1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiB0aGUgZ2VvbG9jYXRpb24gc2hvdWxkIGhhdmUgaGlnaCBhY2N1cmFjeSB0byBmaW5kIHRoZSBjdXJyZW50IHBvc2l0aW9uLlxuICAgICAqL1xuICAgIGVuYWJsZUhpZ2hBY2N1cmFjeT86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBBIHRpbWVvdXQgdmFsdWUgZm9yIHRoZSBnZW9sb2NhdGlvbiBxdWVyeS5cbiAgICAgKi9cbiAgICB0aW1lb3V0PzogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gYWdlIGZvciB0aGUgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBtYXhpbXVtQWdlPzogbnVtYmVyO1xufVxuXG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGdlb2xvY2F0aW9uIHdhdGNoZXIuXG4gKiBJdCBsaXN0ZW5zIGZvciBnZW9sb2NhdGlvbiBldmVudHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBHZW9sb2NhdGlvbldhdGNoZXJcbntcbiAgICAvKipcbiAgICAgKiBUaGUgZ2VvbG9jYXRpb24gd2F0Y2ggb3BlcmF0aW9uIGluZGV4LlxuICAgICAqL1xuICAgIHByaXZhdGUgd2F0Y2hJbmRleDogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIHRoZSB3YXRjaGVyIGlzIGJlaW5nIHVucmVnaXN0ZXJlZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGJlaW5nVW5yZWdpc3RlcmVkOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogRXZlbnQgY2FsbGVkIHdoZW4gdGhlIGdlb2xvY2F0aW9uIHNlcnZpY2UgcmVwb3J0cyBuZXcgZ2VvbG9jYXRpb24gaW5mb3JtYXRpb24uXG4gICAgICogQHBhcmFtIGNvb3JkaW5hdGVzIHRoZSBuZXcgZ2VvbG9jYXRpb24gY29vcmRpbmF0ZXMuXG4gICAgICovXG4gICAgb25JbmZvcm1hdGlvblJlY2VpdmVkOiAoY29vcmRpbmF0ZXM6IENvb3JkaW5hdGUpID0+IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBFdmVudCBjYWxsZWQgd2hlbiB0aGUgZ2VvbG9jYXRpb24gc2VydmljZSBmb3VuZCBhbiBlcnJvci5cbiAgICAgKiBAcGFyYW0gZXJyb3IgdGhlIGVycm9yIGZvdW5kLlxuICAgICAqL1xuICAgIG9uRXJyb3I6IChlcnJvcjogc3RyaW5nKSA9PiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBAc2VlIEdlb2xvY2F0aW9uV2F0Y2hlclxuICAgICAqIEBwYXJhbSBnZW9sb2NhdGlvbiBhIHJlZmVyZW5jZSB0byB0aGUgZ2VvbG9jYXRpb24gc2VydmljZS5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGdlb2xvY2F0aW9uOiBJR2VvbG9jYXRpb25Qcm92aWRlcilcbiAgICB7XG4gICAgICAgIHRoaXMud2F0Y2hJbmRleCA9IC0xO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIHRoZSB3YXRjaGVyIGFuZCBzdG9yZXMgdGhlIHdhdGNoIG9wZXJhdGlvbiBpbmRleC5cbiAgICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IHJlcHJlc2VudGluZyB0aGlzIHdhdGNoIG9wZXJhdGlvbi5cbiAgICAgKi9cbiAgICByZWdpc3RlcihpbmRleDogbnVtYmVyKTogdm9pZFxuICAgIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzRGlzcG9zZWQoKSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIHdhdGNoZXIgY2FuIG5vdCBiZSByZWdpc3RlcmVkIGFnYWluLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy53YXRjaEluZGV4ID0gaW5kZXg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW5yZWdpc3RlcnMgdGhlIHdhdGNoZXIuXG4gICAgICogT25jZSB1bnJlZ2lzdGVyZWQsIHRoZSB3YXRjaGVyIGRvZXMgbm90IHJlY2VpdmVzIGFueSBtb3JlIGV2ZW50cy5cbiAgICAgKi9cbiAgICB1bnJlZ2lzdGVyKCk6IHZvaWRcbiAgICB7XG4gICAgICAgIGlmICh0aGlzLmlzRGlzcG9zZWQoKSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIHdhdGNoZXIgaGFzIG5vdCBiZWVuIHByb3Blcmx5IHJlZ2lzdGVyZWQuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmJlaW5nVW5yZWdpc3RlcmVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5nZW9sb2NhdGlvbi51bnJlZ2lzdGVyV2F0Y2hlcih0aGlzKTtcbiAgICAgICAgdGhpcy5iZWluZ1VucmVnaXN0ZXJlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLndhdGNoSW5kZXggPSAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB3YXRjaCBpbmRleC5cbiAgICAgKi9cbiAgICBnZXRXYXRjaEluZGV4KCk6IG51bWJlclxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2F0Y2hJbmRleDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgdGhpcyB3YXRjaGVyIGlzIGRpc3Bvc2VkLlxuICAgICAqL1xuICAgIGlzRGlzcG9zZWQoKTogYm9vbGVhblxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2F0Y2hJbmRleCA8IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIHRoZSB3YXRjaGVyIGlzIGJlaW5nIHVucmVnaXN0ZXJlZC5cbiAgICAgKi9cbiAgICBpc0JlaW5nVW5yZWdpc3RlcmVkKCk6IGJvb2xlYW5cbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLmJlaW5nVW5yZWdpc3RlcmVkO1xuICAgIH1cbn1cblxuLyoqXG4gKiBQcm92aWRlcyBhIGNvbW1vbiBpbnRlcmZhY2UgZm9yIGRpZmZlcmVudCBnZW9sb2NhdGlvbiBwcm92aWRlcnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUdlb2xvY2F0aW9uUHJvdmlkZXJcbntcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGdlb2xvY2F0aW9uIHByb3ZpZGVyIGlzIGF2YWlsYWJsZS5cbiAgICAgKi9cbiAgICBpc0F2YWlsYWJsZSgpOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY3VycmVudCBnZW9sb2NhdGlvbi5cbiAgICAgKi9cbiAgICBnZXRHZW9sb2NhdGlvbigpOiBQcm9taXNlPENvb3JkaW5hdGU+O1xuXG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJzIGEgbmV3IGdlb2xvY2F0aW9uIHdhdGNoZXIuXG4gICAgICovXG4gICAgcmVnaXN0ZXJXYXRjaGVyKCk6IEdlb2xvY2F0aW9uV2F0Y2hlcjtcblxuICAgIC8qKlxuICAgICAqIFVucmVnaXN0ZXJzIGEgZ2VvbG9jYXRpb24gd2F0Y2hlci5cbiAgICAgKiBAcGFyYW0gd2F0Y2hlciB0aGUgd2F0Y2hlciB0aGF0IHdpbGwgYmUgdW5yZWdpc3RlcmVkLlxuICAgICAqL1xuICAgIHVucmVnaXN0ZXJXYXRjaGVyKHdhdGNoZXI6IEdlb2xvY2F0aW9uV2F0Y2hlcik6IHZvaWQ7XG59XG5cbi8qKlxuICogSW1wbGVtZW50cyB0aGUgZ2VvbG9jYXRpb24gcHJvdmlkZXIgYXBpIHVzaW5nIHRoZSBAc2VlIG5hdmlnYXRvci5nZW9sb2NhdGlvblxuICovXG5leHBvcnQgY2xhc3MgTmF2aWdhdGlvbkdlb2xvY2F0aW9uUHJvdmlkZXIgaW1wbGVtZW50cyBJR2VvbG9jYXRpb25Qcm92aWRlclxue1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgQHNlZSBOYXZpZ2F0aW9uR2VvbG9jYXRpb25Qcm92aWRlclxuICAgICAqIEBwYXJhbSBvcHRpb25zIGdlb2xvY2F0aW9uIG9wdGlvbnMuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBvcHRpb25zPzogSVBvc2l0aW9uT3B0aW9ucylcbiAgICB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY3VycmVudCBnZW9sb2NhdGlvbiBpZiBhIHNlcnZpY2UgZ2VvbG9jYXRpb24gc2VydmljZSBpcyBhdmFpbGFibGUuXG4gICAgICovXG4gICAgZ2V0R2VvbG9jYXRpb24oKTogUHJvbWlzZTxDb29yZGluYXRlPlxuICAgIHtcbiAgICAgICAgaWYgKHRoaXMuaXNBdmFpbGFibGUoKSlcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHRoaXMuZ2V0R2VvTG9jYXRvcigpLmdldEN1cnJlbnRQb3NpdGlvbihcbiAgICAgICAgICAgICAgICBpbmZvID0+IHJlc29sdmUoaW5mby5jb29yZHMpLFxuICAgICAgICAgICAgICAgIGVycm9yID0+IHJlamVjdChlcnJvci5tZXNzYWdlKSxcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgnVGhlIGdlb2xvY2F0aW9uIHNlcnZpY2UgaXMgbm90IGF2YWlsYWJsZS4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcnMgYSBnZW9sb2NhdGlvbiB3YXRjaGVyIHRvIGxpc3RlciBmb3IgZ2VvbG9jYXRpb24gZXZlbnRzLlxuICAgICAqL1xuICAgIHJlZ2lzdGVyV2F0Y2hlcigpOiBHZW9sb2NhdGlvbldhdGNoZXJcbiAgICB7XG4gICAgICAgIGlmICh0aGlzLmlzQXZhaWxhYmxlKCkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHdhdGNoZXIgPSBuZXcgR2VvbG9jYXRpb25XYXRjaGVyKHRoaXMpO1xuXG4gICAgICAgICAgICB3YXRjaGVyLnJlZ2lzdGVyKHRoaXMuZ2V0R2VvTG9jYXRvcigpLndhdGNoUG9zaXRpb24oXG4gICAgICAgICAgICAgICAgaW5mbyA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdhdGNoZXIub25JbmZvcm1hdGlvblJlY2VpdmVkKVxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3YXRjaGVyLm9uSW5mb3JtYXRpb25SZWNlaXZlZChpbmZvLmNvb3Jkcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCBlcnJvciA9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdhdGNoZXIub25FcnJvcilcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2F0Y2hlci5vbkVycm9yKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgdGhpcy5vcHRpb25zKSk7XG5cbiAgICAgICAgICAgIHJldHVybiB3YXRjaGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgZ2VvbG9jYXRpb24gc2VydmljZSBpcyBub3QgYXZhaWxhYmxlLicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVucmVnaXN0ZXJzIHRoZSBnZW9sb2NhdGlvbiB3YXRjaGVyLlxuICAgICAqIEBwYXJhbSB3YXRjaGVyIHRoZSB3YXRjaGVyIHRoYXQgd2lsbCBiZSB1bnJlZ2lzdGVyZWQuXG4gICAgICovXG4gICAgdW5yZWdpc3RlcldhdGNoZXIod2F0Y2hlcjogR2VvbG9jYXRpb25XYXRjaGVyKTogdm9pZFxuICAgIHtcbiAgICAgICAgaWYgKCF3YXRjaGVyLmlzQmVpbmdVbnJlZ2lzdGVyZWQoKSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gbm90IGNhbGwgdGhpcyBtZXRob2QgZGlyZWN0bHkuIENhbGwgR2VvbG9jYXRpb25XYXRjaGVyLnVucmVnaXN0ZXIgaW5zdGVhZC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzQXZhaWxhYmxlKCkpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0R2VvTG9jYXRvcigpLmNsZWFyV2F0Y2god2F0Y2hlci5nZXRXYXRjaEluZGV4KCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIHRoZSBnZW9sb2NhdGlvbiBzZXJ2aWNlIGlzIGF2YWlsYWJsZS5cbiAgICAgKi9cbiAgICBpc0F2YWlsYWJsZSgpOiBib29sZWFuXG4gICAge1xuICAgICAgICByZXR1cm4gIU9iamVjdEV4dGVuc2lvbnMuaXNOdWxsKG5hdmlnYXRvci5nZW9sb2NhdGlvbikgJiZcbiAgICAgICAgICAgICFPYmplY3RFeHRlbnNpb25zLmlzTnVsbChuYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKSAmJlxuICAgICAgICAgICAgIU9iamVjdEV4dGVuc2lvbnMuaXNOdWxsKG5hdmlnYXRvci5nZW9sb2NhdGlvbi53YXRjaFBvc2l0aW9uKSAmJlxuICAgICAgICAgICAgIU9iamVjdEV4dGVuc2lvbnMuaXNOdWxsKG5hdmlnYXRvci5nZW9sb2NhdGlvbi5jbGVhcldhdGNoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBnZW9sb2NhdGlvbiBzZXJ2aWNlLlxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0R2VvTG9jYXRvcigpOiBHZW9sb2NhdGlvblxuICAgIHtcbiAgICAgICAgcmV0dXJuIG5hdmlnYXRvci5nZW9sb2NhdGlvbjtcbiAgICB9XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgR2VvbG9jYXRpb25TZXJ2aWNlIGV4dGVuZHMgU2VydmljZUJhc2VcbntcbiAgICAvKipcbiAgICAgKiBSZWZlcmVuY2UgdG8gYSBnZW9sb2NhdGlvbiBwcm92aWRlci5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdlb2xvY2F0aW9uUHJvdmlkZXI6IElHZW9sb2NhdGlvblByb3ZpZGVyO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBAc2VlIEdlb2xvY2F0aW9uU2VydmljZVxuICAgICAqIEJ5IGRlZmF1bHQgQHNlZSBHZW9sb2NhdGlvblNlcnZpY2UgdXNlcyBAc2VlIE5hdmlnYXRpb25HZW9sb2NhdGlvblByb3ZpZGVyIGFzIHByb3ZpZGVyLlxuICAgICAqIFRoZSBwcm92aWRlciBjYW4gYmUgY2hhbmdlZCB1c2luZyBAc2VlIEdlb2xvY2F0aW9uU2VydmljZS5zZXRHZW9sb2NhdGlvblByb3ZpZGVyXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKVxuICAgIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5nZW9sb2NhdGlvblByb3ZpZGVyID0gbmV3IE5hdmlnYXRpb25HZW9sb2NhdGlvblByb3ZpZGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZ2VvbG9jYXRpb24gcHJvdmlkZXIuXG4gICAgICogQHBhcmFtIHByb3ZpZGVyIGdlb2xvY2F0aW9uIHByb3ZpZGVyLlxuICAgICAqL1xuICAgIHNldEdlb2xvY2F0aW9uUHJvdmlkZXIocHJvdmlkZXI6IElHZW9sb2NhdGlvblByb3ZpZGVyKTogdm9pZFxuICAgIHtcbiAgICAgICAgaWYgKCFwcm92aWRlcilcbiAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgZ2VvbG9jYXRpb24gcHJvdmlkZXIgY2FuIG5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZ2VvbG9jYXRpb25Qcm92aWRlciA9IHByb3ZpZGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGN1cnJlbnQgZ2VvbG9jYXRpb24gaWYgYSBzZXJ2aWNlIGdlb2xvY2F0aW9uIHNlcnZpY2UgaXMgYXZhaWxhYmxlLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIHRoZSBnZW9sb2NhdGlvbiBvcHRpb25zLlxuICAgICAqL1xuICAgIGFzeW5jIGdldEdlb2xvY2F0aW9uKCk6IFByb21pc2U8Q29vcmRpbmF0ZT5cbiAgICB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdlb2xvY2F0aW9uUHJvdmlkZXIuZ2V0R2VvbG9jYXRpb24oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcnMgYSBnZW9sb2NhdGlvbiB3YXRjaGVyIHRvIGxpc3RlciBmb3IgZ2VvbG9jYXRpb24gZXZlbnRzLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIHRoZSBnZW9sb2NhdGlvbiBvcHRpb25zLlxuICAgICAqL1xuICAgIHJlZ2lzdGVyV2F0Y2hlcigpOiBHZW9sb2NhdGlvbldhdGNoZXJcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLmdlb2xvY2F0aW9uUHJvdmlkZXIucmVnaXN0ZXJXYXRjaGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIHRoZSBnZW9sb2NhdGlvbiBzZXJ2aWNlIGlzIGF2YWlsYWJsZS5cbiAgICAgKi9cbiAgICBpc0F2YWlsYWJsZSgpOiBib29sZWFuXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5nZW9sb2NhdGlvblByb3ZpZGVyLmlzQXZhaWxhYmxlKCk7XG4gICAgfVxufVxuIl19