angular-cesium
Version:
Angular library for working with Cesium.
93 lines • 16.5 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { Injectable } from '@angular/core';
import { CesiumService } from '../cesium/cesium.service';
var GeoUtilsService = /** @class */ (function () {
function GeoUtilsService(cesiumService) {
this.cesiumService = cesiumService;
}
GeoUtilsService_1 = GeoUtilsService;
GeoUtilsService.pointByLocationDistanceAndAzimuth = function (currentLocation, meterDistance, radianAzimuth, deprecated) {
var distance = meterDistance / Cesium.Ellipsoid.WGS84.maximumRadius;
var cartographicLocation = currentLocation instanceof Cesium.Cartesian3 ? Cesium.Cartographic.fromCartesian(currentLocation) : currentLocation;
var cartesianLocation = currentLocation instanceof Cesium.Cartesian3
? currentLocation
: Cesium.Cartesian3.fromRadians(currentLocation.longitude, currentLocation.latitude, currentLocation.height);
var resultPosition;
var resultDistance;
var counter = 0;
var distanceFactorRangeMax = 0.1;
var distanceFactorRangeMin = -0.1;
while (counter === 0 ||
(counter < 16 && Math.max(resultDistance, meterDistance) / Math.min(resultDistance, meterDistance) > 1.000001)) {
var factor = distanceFactorRangeMin + (distanceFactorRangeMax - distanceFactorRangeMin) / 2;
resultPosition = GeoUtilsService_1._pointByLocationDistanceAndAzimuth(cartographicLocation, distance * (1 + factor), radianAzimuth);
resultDistance = this.distance(cartesianLocation, resultPosition);
if (resultDistance > meterDistance) {
distanceFactorRangeMax = distanceFactorRangeMin + (distanceFactorRangeMax - distanceFactorRangeMin) / 2;
}
else {
distanceFactorRangeMin = distanceFactorRangeMin + (distanceFactorRangeMax - distanceFactorRangeMin) / 2;
}
counter++;
}
return resultPosition;
};
GeoUtilsService._pointByLocationDistanceAndAzimuth = function (cartographicLocation, distance, radianAzimuth) {
var curLat = cartographicLocation.latitude;
var curLon = cartographicLocation.longitude;
var destinationLat = Math.asin(Math.sin(curLat) * Math.cos(distance) + Math.cos(curLat) * Math.sin(distance) * Math.cos(radianAzimuth));
var destinationLon = curLon +
Math.atan2(Math.sin(radianAzimuth) * Math.sin(distance) * Math.cos(curLat), Math.cos(distance) - Math.sin(curLat) * Math.sin(destinationLat));
destinationLon = ((destinationLon + 3 * Math.PI) % (2 * Math.PI)) - Math.PI;
return Cesium.Cartesian3.fromRadians(destinationLon, destinationLat);
};
GeoUtilsService.distance = function (pos0, pos1) {
return Cesium.Cartesian3.distance(pos0, pos1);
};
GeoUtilsService.getPositionsDelta = function (position0, position1) {
return {
x: position1.x - position0.x,
y: position1.y - position0.y,
z: position1.z - position0.z,
};
};
GeoUtilsService.addDeltaToPosition = function (position, delta, updateReference) {
if (updateReference === void 0) { updateReference = false; }
if (updateReference) {
position.x += delta.x;
position.y += delta.y;
position.z += delta.z;
var cartographic = Cesium.Cartographic.fromCartesian(position);
cartographic.height = 0;
var cartesian = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, cartographic.height);
position.x = cartesian.x;
position.y = cartesian.y;
position.z = cartesian.z;
return position;
}
else {
var cartesian = new Cesium.Cartesian3(position.x + delta.x, position.y + delta.y, position.z + delta.z);
var cartographic = Cesium.Cartographic.fromCartesian(cartesian);
cartographic.height = 0;
return Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, cartographic.height);
}
};
GeoUtilsService.middleCartesian3Point = function (position0, position1) {
return new Cesium.Cartesian3(position1.x - position0.x / 2, position1.y - position0.y / 2, position1.z - position0.z / 2);
};
GeoUtilsService.prototype.screenPositionToCartesian3 = function (screenPos) {
var camera = this.cesiumService.getViewer().camera;
return camera.pickEllipsoid(screenPos);
};
var GeoUtilsService_1;
GeoUtilsService.ctorParameters = function () { return [
{ type: CesiumService }
]; };
GeoUtilsService = GeoUtilsService_1 = __decorate([
Injectable(),
__metadata("design:paramtypes", [CesiumService])
], GeoUtilsService);
return GeoUtilsService;
}());
export { GeoUtilsService };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvLXV0aWxzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9hbmd1bGFyLWNlc2l1bS8iLCJzb3VyY2VzIjpbImxpYi9hbmd1bGFyLWNlc2l1bS9zZXJ2aWNlcy9nZW8tdXRpbHMvZ2VvLXV0aWxzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBS3pEO0lBeUZFLHlCQUFvQixhQUE0QjtRQUE1QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtJQUNoRCxDQUFDO3dCQTFGVSxlQUFlO0lBQ25CLGlEQUFpQyxHQUF4QyxVQUF5QyxlQUFvQixFQUFFLGFBQXFCLEVBQUUsYUFBcUIsRUFBRSxVQUFXO1FBQ3RILElBQU0sUUFBUSxHQUFHLGFBQWEsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUM7UUFDdEUsSUFBTSxvQkFBb0IsR0FDeEIsZUFBZSxZQUFZLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUM7UUFDdEgsSUFBTSxpQkFBaUIsR0FDckIsZUFBZSxZQUFZLE1BQU0sQ0FBQyxVQUFVO1lBQzFDLENBQUMsQ0FBQyxlQUFlO1lBQ2pCLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsU0FBUyxFQUFFLGVBQWUsQ0FBQyxRQUFRLEVBQUUsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRWpILElBQUksY0FBYyxDQUFDO1FBQ25CLElBQUksY0FBYyxDQUFDO1FBQ25CLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztRQUNoQixJQUFJLHNCQUFzQixHQUFHLEdBQUcsQ0FBQztRQUNqQyxJQUFJLHNCQUFzQixHQUFHLENBQUMsR0FBRyxDQUFDO1FBQ2xDLE9BQ0UsT0FBTyxLQUFLLENBQUM7WUFDYixDQUFDLE9BQU8sR0FBRyxFQUFFLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsYUFBYSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsYUFBYSxDQUFDLEdBQUcsUUFBUSxDQUFDLEVBQzVHO1lBQ0YsSUFBTSxNQUFNLEdBQUcsc0JBQXNCLEdBQUcsQ0FBQyxzQkFBc0IsR0FBRyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5RixjQUFjLEdBQUcsaUJBQWUsQ0FBQyxrQ0FBa0MsQ0FBQyxvQkFBb0IsRUFBRSxRQUFRLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFDbEksY0FBYyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLEVBQUUsY0FBYyxDQUFDLENBQUM7WUFFbEUsSUFBSSxjQUFjLEdBQUcsYUFBYSxFQUFFO2dCQUNsQyxzQkFBc0IsR0FBRyxzQkFBc0IsR0FBRyxDQUFDLHNCQUFzQixHQUFHLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ3pHO2lCQUFNO2dCQUNMLHNCQUFzQixHQUFHLHNCQUFzQixHQUFHLENBQUMsc0JBQXNCLEdBQUcsc0JBQXNCLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDekc7WUFDRCxPQUFPLEVBQUUsQ0FBQztTQUNYO1FBRUQsT0FBTyxjQUFjLENBQUM7SUFDeEIsQ0FBQztJQUVNLGtEQUFrQyxHQUF6QyxVQUEwQyxvQkFBeUIsRUFBRSxRQUFnQixFQUFFLGFBQXFCO1FBQzFHLElBQU0sTUFBTSxHQUFHLG9CQUFvQixDQUFDLFFBQVEsQ0FBQztRQUM3QyxJQUFNLE1BQU0sR0FBRyxvQkFBb0IsQ0FBQyxTQUFTLENBQUM7UUFDOUMsSUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FDOUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUN4RyxDQUFDO1FBRUYsSUFBSSxjQUFjLEdBQ2hCLE1BQU07WUFDTixJQUFJLENBQUMsS0FBSyxDQUNSLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUMvRCxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FDakUsQ0FBQztRQUVKLGNBQWMsR0FBRyxDQUFDLENBQUMsY0FBYyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUU1RSxPQUFPLE1BQU0sQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLGNBQWMsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRU0sd0JBQVEsR0FBZixVQUFnQixJQUFnQixFQUFFLElBQWdCO1FBQ2hELE9BQU8sTUFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFTSxpQ0FBaUIsR0FBeEIsVUFBeUIsU0FBcUIsRUFBRSxTQUFxQjtRQUNuRSxPQUFPO1lBQ0wsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUM7WUFDNUIsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUM7WUFDNUIsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUM7U0FDN0IsQ0FBQztJQUNKLENBQUM7SUFFTSxrQ0FBa0IsR0FBekIsVUFBMEIsUUFBb0IsRUFBRSxLQUFXLEVBQUUsZUFBdUI7UUFBdkIsZ0NBQUEsRUFBQSx1QkFBdUI7UUFDbEYsSUFBSSxlQUFlLEVBQUU7WUFDbkIsUUFBUSxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLFFBQVEsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN0QixRQUFRLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDdEIsSUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDakUsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDeEIsSUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNwSCxRQUFRLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDekIsUUFBUSxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ3pCLFFBQVEsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUN6QixPQUFPLFFBQVEsQ0FBQztTQUNqQjthQUFNO1lBQ0wsSUFBTSxTQUFTLEdBQUcsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUcsSUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDbEUsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDeEIsT0FBTyxNQUFNLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzFHO0lBQ0gsQ0FBQztJQUVNLHFDQUFxQixHQUE1QixVQUE2QixTQUFxQixFQUFFLFNBQXFCO1FBQ3ZFLE9BQU8sSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDNUgsQ0FBQztJQUtELG9EQUEwQixHQUExQixVQUEyQixTQUFtQztRQUM1RCxJQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxDQUFDLE1BQU0sQ0FBQztRQUNyRCxPQUFPLE1BQU0sQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDekMsQ0FBQzs7O2dCQU5rQyxhQUFhOztJQXpGckMsZUFBZTtRQUQzQixVQUFVLEVBQUU7eUNBMEZ3QixhQUFhO09BekZyQyxlQUFlLENBZ0czQjtJQUFELHNCQUFDO0NBQUEsQUFoR0QsSUFnR0M7U0FoR1ksZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENlc2l1bVNlcnZpY2UgfSBmcm9tICcuLi9jZXNpdW0vY2VzaXVtLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2FydGVzaWFuMyB9IGZyb20gJy4uLy4uL21vZGVscy9jYXJ0ZXNpYW4zJztcbmltcG9ydCB7IFZlYzMgfSBmcm9tICcuLi8uLi9tb2RlbHMvdmVjMyc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBHZW9VdGlsc1NlcnZpY2Uge1xuICBzdGF0aWMgcG9pbnRCeUxvY2F0aW9uRGlzdGFuY2VBbmRBemltdXRoKGN1cnJlbnRMb2NhdGlvbjogYW55LCBtZXRlckRpc3RhbmNlOiBudW1iZXIsIHJhZGlhbkF6aW11dGg6IG51bWJlciwgZGVwcmVjYXRlZD8pIHtcbiAgICBjb25zdCBkaXN0YW5jZSA9IG1ldGVyRGlzdGFuY2UgLyBDZXNpdW0uRWxsaXBzb2lkLldHUzg0Lm1heGltdW1SYWRpdXM7XG4gICAgY29uc3QgY2FydG9ncmFwaGljTG9jYXRpb24gPVxuICAgICAgY3VycmVudExvY2F0aW9uIGluc3RhbmNlb2YgQ2VzaXVtLkNhcnRlc2lhbjMgPyBDZXNpdW0uQ2FydG9ncmFwaGljLmZyb21DYXJ0ZXNpYW4oY3VycmVudExvY2F0aW9uKSA6IGN1cnJlbnRMb2NhdGlvbjtcbiAgICBjb25zdCBjYXJ0ZXNpYW5Mb2NhdGlvbiA9XG4gICAgICBjdXJyZW50TG9jYXRpb24gaW5zdGFuY2VvZiBDZXNpdW0uQ2FydGVzaWFuM1xuICAgICAgICA/IGN1cnJlbnRMb2NhdGlvblxuICAgICAgICA6IENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21SYWRpYW5zKGN1cnJlbnRMb2NhdGlvbi5sb25naXR1ZGUsIGN1cnJlbnRMb2NhdGlvbi5sYXRpdHVkZSwgY3VycmVudExvY2F0aW9uLmhlaWdodCk7XG5cbiAgICBsZXQgcmVzdWx0UG9zaXRpb247XG4gICAgbGV0IHJlc3VsdERpc3RhbmNlO1xuICAgIGxldCBjb3VudGVyID0gMDtcbiAgICBsZXQgZGlzdGFuY2VGYWN0b3JSYW5nZU1heCA9IDAuMTtcbiAgICBsZXQgZGlzdGFuY2VGYWN0b3JSYW5nZU1pbiA9IC0wLjE7XG4gICAgd2hpbGUgKFxuICAgICAgY291bnRlciA9PT0gMCB8fFxuICAgICAgKGNvdW50ZXIgPCAxNiAmJiBNYXRoLm1heChyZXN1bHREaXN0YW5jZSwgbWV0ZXJEaXN0YW5jZSkgLyBNYXRoLm1pbihyZXN1bHREaXN0YW5jZSwgbWV0ZXJEaXN0YW5jZSkgPiAxLjAwMDAwMSlcbiAgICAgICkge1xuICAgICAgY29uc3QgZmFjdG9yID0gZGlzdGFuY2VGYWN0b3JSYW5nZU1pbiArIChkaXN0YW5jZUZhY3RvclJhbmdlTWF4IC0gZGlzdGFuY2VGYWN0b3JSYW5nZU1pbikgLyAyO1xuICAgICAgcmVzdWx0UG9zaXRpb24gPSBHZW9VdGlsc1NlcnZpY2UuX3BvaW50QnlMb2NhdGlvbkRpc3RhbmNlQW5kQXppbXV0aChjYXJ0b2dyYXBoaWNMb2NhdGlvbiwgZGlzdGFuY2UgKiAoMSArIGZhY3RvciksIHJhZGlhbkF6aW11dGgpO1xuICAgICAgcmVzdWx0RGlzdGFuY2UgPSB0aGlzLmRpc3RhbmNlKGNhcnRlc2lhbkxvY2F0aW9uLCByZXN1bHRQb3NpdGlvbik7XG5cbiAgICAgIGlmIChyZXN1bHREaXN0YW5jZSA+IG1ldGVyRGlzdGFuY2UpIHtcbiAgICAgICAgZGlzdGFuY2VGYWN0b3JSYW5nZU1heCA9IGRpc3RhbmNlRmFjdG9yUmFuZ2VNaW4gKyAoZGlzdGFuY2VGYWN0b3JSYW5nZU1heCAtIGRpc3RhbmNlRmFjdG9yUmFuZ2VNaW4pIC8gMjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpc3RhbmNlRmFjdG9yUmFuZ2VNaW4gPSBkaXN0YW5jZUZhY3RvclJhbmdlTWluICsgKGRpc3RhbmNlRmFjdG9yUmFuZ2VNYXggLSBkaXN0YW5jZUZhY3RvclJhbmdlTWluKSAvIDI7XG4gICAgICB9XG4gICAgICBjb3VudGVyKys7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFBvc2l0aW9uO1xuICB9XG5cbiAgc3RhdGljIF9wb2ludEJ5TG9jYXRpb25EaXN0YW5jZUFuZEF6aW11dGgoY2FydG9ncmFwaGljTG9jYXRpb246IGFueSwgZGlzdGFuY2U6IG51bWJlciwgcmFkaWFuQXppbXV0aDogbnVtYmVyKSB7XG4gICAgY29uc3QgY3VyTGF0ID0gY2FydG9ncmFwaGljTG9jYXRpb24ubGF0aXR1ZGU7XG4gICAgY29uc3QgY3VyTG9uID0gY2FydG9ncmFwaGljTG9jYXRpb24ubG9uZ2l0dWRlO1xuICAgIGNvbnN0IGRlc3RpbmF0aW9uTGF0ID0gTWF0aC5hc2luKFxuICAgICAgTWF0aC5zaW4oY3VyTGF0KSAqIE1hdGguY29zKGRpc3RhbmNlKSArIE1hdGguY29zKGN1ckxhdCkgKiBNYXRoLnNpbihkaXN0YW5jZSkgKiBNYXRoLmNvcyhyYWRpYW5BemltdXRoKSxcbiAgICApO1xuXG4gICAgbGV0IGRlc3RpbmF0aW9uTG9uID1cbiAgICAgIGN1ckxvbiArXG4gICAgICBNYXRoLmF0YW4yKFxuICAgICAgICBNYXRoLnNpbihyYWRpYW5BemltdXRoKSAqIE1hdGguc2luKGRpc3RhbmNlKSAqIE1hdGguY29zKGN1ckxhdCksXG4gICAgICAgIE1hdGguY29zKGRpc3RhbmNlKSAtIE1hdGguc2luKGN1ckxhdCkgKiBNYXRoLnNpbihkZXN0aW5hdGlvbkxhdCksXG4gICAgICApO1xuXG4gICAgZGVzdGluYXRpb25Mb24gPSAoKGRlc3RpbmF0aW9uTG9uICsgMyAqIE1hdGguUEkpICUgKDIgKiBNYXRoLlBJKSkgLSBNYXRoLlBJO1xuXG4gICAgcmV0dXJuIENlc2l1bS5DYXJ0ZXNpYW4zLmZyb21SYWRpYW5zKGRlc3RpbmF0aW9uTG9uLCBkZXN0aW5hdGlvbkxhdCk7XG4gIH1cblxuICBzdGF0aWMgZGlzdGFuY2UocG9zMDogQ2FydGVzaWFuMywgcG9zMTogQ2FydGVzaWFuMyk6IG51bWJlciB7XG4gICAgcmV0dXJuIENlc2l1bS5DYXJ0ZXNpYW4zLmRpc3RhbmNlKHBvczAsIHBvczEpO1xuICB9XG5cbiAgc3RhdGljIGdldFBvc2l0aW9uc0RlbHRhKHBvc2l0aW9uMDogQ2FydGVzaWFuMywgcG9zaXRpb24xOiBDYXJ0ZXNpYW4zKTogVmVjMyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IHBvc2l0aW9uMS54IC0gcG9zaXRpb24wLngsXG4gICAgICB5OiBwb3NpdGlvbjEueSAtIHBvc2l0aW9uMC55LFxuICAgICAgejogcG9zaXRpb24xLnogLSBwb3NpdGlvbjAueixcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIGFkZERlbHRhVG9Qb3NpdGlvbihwb3NpdGlvbjogQ2FydGVzaWFuMywgZGVsdGE6IFZlYzMsIHVwZGF0ZVJlZmVyZW5jZSA9IGZhbHNlKTogQ2FydGVzaWFuMyB7XG4gICAgaWYgKHVwZGF0ZVJlZmVyZW5jZSkge1xuICAgICAgcG9zaXRpb24ueCArPSBkZWx0YS54O1xuICAgICAgcG9zaXRpb24ueSArPSBkZWx0YS55O1xuICAgICAgcG9zaXRpb24ueiArPSBkZWx0YS56O1xuICAgICAgY29uc3QgY2FydG9ncmFwaGljID0gQ2VzaXVtLkNhcnRvZ3JhcGhpYy5mcm9tQ2FydGVzaWFuKHBvc2l0aW9uKTtcbiAgICAgIGNhcnRvZ3JhcGhpYy5oZWlnaHQgPSAwO1xuICAgICAgY29uc3QgY2FydGVzaWFuID0gQ2VzaXVtLkNhcnRlc2lhbjMuZnJvbVJhZGlhbnMoY2FydG9ncmFwaGljLmxvbmdpdHVkZSwgY2FydG9ncmFwaGljLmxhdGl0dWRlLCBjYXJ0b2dyYXBoaWMuaGVpZ2h0KTtcbiAgICAgIHBvc2l0aW9uLnggPSBjYXJ0ZXNpYW4ueDtcbiAgICAgIHBvc2l0aW9uLnkgPSBjYXJ0ZXNpYW4ueTtcbiAgICAgIHBvc2l0aW9uLnogPSBjYXJ0ZXNpYW4uejtcbiAgICAgIHJldHVybiBwb3NpdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY2FydGVzaWFuID0gbmV3IENlc2l1bS5DYXJ0ZXNpYW4zKHBvc2l0aW9uLnggKyBkZWx0YS54LCBwb3NpdGlvbi55ICsgZGVsdGEueSwgcG9zaXRpb24ueiArIGRlbHRhLnopO1xuICAgICAgY29uc3QgY2FydG9ncmFwaGljID0gQ2VzaXVtLkNhcnRvZ3JhcGhpYy5mcm9tQ2FydGVzaWFuKGNhcnRlc2lhbik7XG4gICAgICBjYXJ0b2dyYXBoaWMuaGVpZ2h0ID0gMDtcbiAgICAgIHJldHVybiBDZXNpdW0uQ2FydGVzaWFuMy5mcm9tUmFkaWFucyhjYXJ0b2dyYXBoaWMubG9uZ2l0dWRlLCBjYXJ0b2dyYXBoaWMubGF0aXR1ZGUsIGNhcnRvZ3JhcGhpYy5oZWlnaHQpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBtaWRkbGVDYXJ0ZXNpYW4zUG9pbnQocG9zaXRpb24wOiBDYXJ0ZXNpYW4zLCBwb3NpdGlvbjE6IENhcnRlc2lhbjMpIHtcbiAgICByZXR1cm4gbmV3IENlc2l1bS5DYXJ0ZXNpYW4zKHBvc2l0aW9uMS54IC0gcG9zaXRpb24wLnggLyAyLCBwb3NpdGlvbjEueSAtIHBvc2l0aW9uMC55IC8gMiwgcG9zaXRpb24xLnogLSBwb3NpdGlvbjAueiAvIDIpO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZXNpdW1TZXJ2aWNlOiBDZXNpdW1TZXJ2aWNlKSB7XG4gIH1cblxuICBzY3JlZW5Qb3NpdGlvblRvQ2FydGVzaWFuMyhzY3JlZW5Qb3M6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSkge1xuICAgIGNvbnN0IGNhbWVyYSA9IHRoaXMuY2VzaXVtU2VydmljZS5nZXRWaWV3ZXIoKS5jYW1lcmE7XG4gICAgcmV0dXJuIGNhbWVyYS5waWNrRWxsaXBzb2lkKHNjcmVlblBvcyk7XG4gIH1cbn1cbiJdfQ==