@boldadmin/angular-google-maps
Version:
Google Maps adapter for Angular Framework
247 lines • 21.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Output } from '@angular/core';
import { EventPublisher } from '@boldadmin/event-publisher';
import * as moment from 'moment';
import { mapsText } from './angular-google-maps.constant';
import { AngularGoogleMapsBuilder } from './service/angular-google-maps-builder.service';
import { AngularGoogleMapsGeocoder } from './service/angular-google-maps-geocoder.service';
import { GoogleMapsFactory } from './service/google-maps-factory.service';
import { IconRegistry } from './service/icon-registry/icon-registry';
export class AngularGoogleMapsComponent {
/**
* @param {?} googleMapsFactory
* @param {?} googleMapsBuilder
* @param {?} googleMapsGeocoder
* @param {?} eventPublisher
* @param {?} iconRegistry
*/
constructor(googleMapsFactory, googleMapsBuilder, googleMapsGeocoder, eventPublisher, iconRegistry) {
this.googleMapsFactory = googleMapsFactory;
this.googleMapsBuilder = googleMapsBuilder;
this.googleMapsGeocoder = googleMapsGeocoder;
this.eventPublisher = eventPublisher;
this.iconRegistry = iconRegistry;
this.mapsText = mapsText;
this.address = '';
this.mapOptions = {
center: {
lat: 0,
lng: 0
},
mapTypeControlOptions: {
mapTypeIds: ['roadmap', 'satellite'],
position: this.googleMapsFactory.getGoogleMaps().ControlPosition.LEFT_BOTTOM
},
zoom: 16,
controlSize: 22,
fullscreenControl: false
};
this.markerOptions = {
position: {
lat: 0,
lng: 0
},
draggable: true,
animation: this.googleMapsFactory.getGoogleMaps().Animation.DROP
};
this.circleOptions = {
strokeColor: '#448aff',
strokeOpacity: 0.8,
strokeWeight: 2,
fillColor: '#448aff',
fillOpacity: 0.35,
editable: true,
radius: 70
};
this.previousMarkerIcon = {
url: 'http://cdn.boldadmin.com.s3-website-eu-west-1.amazonaws.com/previous-marker.png'
};
this.currentMarkerIcon = {
url: 'http://cdn.boldadmin.com.s3-website-eu-west-1.amazonaws.com/current-marker.png'
};
}
/**
* @return {?}
*/
ngOnInit() {
this.eventPublisher.subscribe('addressReverseGeocoded', (/**
* @param {?} address
* @return {?}
*/
(address) => this.address = address));
this.iconRegistry.register('expand', './assets/expand.svg');
this.iconRegistry.register('collapse', './assets/collapse.svg');
}
/**
* @return {?}
*/
ngOnDestroy() {
this.eventPublisher.unsubscribeAll('addressReverseGeocoded');
}
/**
* @param {?} focusLocation
* @return {?}
*/
createMapByLocation(focusLocation) {
this.googleMapsGeocoder.reverseGeocode(focusLocation.coordinates, (/**
* @param {?} address
* @return {?}
*/
(address) => this.address = address));
this.circleOptions.radius = focusLocation.radiusInMeters;
this.changeMapCenter(focusLocation.coordinates);
this.googleMapsBuilder
.createMap(this.mapOptions)
.addCenterMarker(this.markerOptions)
.addCircle(this.circleOptions)
.bindCircleToMarker()
.addSearchBox();
}
/**
* @param {?} address
* @return {?}
*/
createMapByAddress(address) {
this.googleMapsGeocoder.geocode(address, (/**
* @param {?} coordinates
* @return {?}
*/
(coordinates) => {
this.changeMapCenter(coordinates);
this.googleMapsBuilder
.createMap(this.mapOptions)
.addCenterMarker(this.markerOptions)
.addCircle(this.circleOptions)
.bindCircleToMarker()
.hideMarker()
.hideCircle()
.addSearchBox();
}));
}
/**
* @return {?}
*/
notifyMapResize() {
this.eventPublisher.notify('resizeMap');
}
/**
* @param {?} timestampCoordinatesList
* @param {?} name
* @return {?}
*/
addTravelPath(timestampCoordinatesList, name) {
timestampCoordinatesList.forEach((/**
* @param {?} timestampCoordinates
* @param {?} index
* @return {?}
*/
(timestampCoordinates, index) => {
/** @type {?} */
const icon = index === 0 ? this.currentMarkerIcon : this.previousMarkerIcon;
/** @type {?} */
const dateTime = moment.utc(timestampCoordinates.timestamp).format('YYYY.MM.DD HH:mm');
this.googleMapsBuilder.addMarker({
position: this.googleMapsFactory.createLatLng(timestampCoordinates.coordinates),
title: `Name: ${name}, Time: ${dateTime}`,
icon: icon
});
}));
/** @type {?} */
const latLngs = timestampCoordinatesList.map((/**
* @param {?} value
* @return {?}
*/
value => this.googleMapsFactory.createLatLng(value.coordinates)));
this.addPolyline(latLngs, '#' + Math.random().toString(16).substr(2, 6));
}
/**
* @private
* @param {?} path
* @param {?} colorCode
* @return {?}
*/
addPolyline(path, colorCode) {
this.googleMapsBuilder.addPolyline({
geodesic: true,
strokeOpacity: 0.8,
strokeWeight: 1,
path: path,
strokeColor: colorCode
});
}
/**
* @private
* @param {?} coordinates
* @return {?}
*/
changeMapCenter(coordinates) {
this.mapOptions.center = { lat: coordinates.latitude, lng: coordinates.longitude };
}
}
AngularGoogleMapsComponent.decorators = [
{ type: Component, args: [{
selector: 'google-maps',
template: "<input id=\"search-input\" name=\"searchBox\" class=\"controls\" type=\"text\"\n placeholder=\"{{mapsText.searchBox}}\"\n [ngModelOptions]=\"{standalone: true}\"\n [(ngModel)]=\"address\"/>\n<mat-icon id=\"expand-icon\" class=\"resize-control\" svgIcon=\"expand\" (click)=\"notifyMapResize()\"></mat-icon>\n<mat-icon id=\"collapse-icon\" class=\"resize-control\" svgIcon=\"collapse\" (click)=\"notifyMapResize()\"></mat-icon>\n\n<div id=\"map\"></div>\n",
providers: [AngularGoogleMapsBuilder]
}] }
];
/** @nocollapse */
AngularGoogleMapsComponent.ctorParameters = () => [
{ type: GoogleMapsFactory },
{ type: AngularGoogleMapsBuilder },
{ type: AngularGoogleMapsGeocoder },
{ type: EventPublisher },
{ type: IconRegistry }
];
AngularGoogleMapsComponent.propDecorators = {
mapOptions: [{ type: Output }],
markerOptions: [{ type: Output }],
circleOptions: [{ type: Output }],
previousMarkerIcon: [{ type: Output }],
currentMarkerIcon: [{ type: Output }]
};
if (false) {
/** @type {?} */
AngularGoogleMapsComponent.prototype.mapsText;
/** @type {?} */
AngularGoogleMapsComponent.prototype.address;
/** @type {?} */
AngularGoogleMapsComponent.prototype.mapOptions;
/** @type {?} */
AngularGoogleMapsComponent.prototype.markerOptions;
/** @type {?} */
AngularGoogleMapsComponent.prototype.circleOptions;
/** @type {?} */
AngularGoogleMapsComponent.prototype.previousMarkerIcon;
/** @type {?} */
AngularGoogleMapsComponent.prototype.currentMarkerIcon;
/**
* @type {?}
* @private
*/
AngularGoogleMapsComponent.prototype.googleMapsFactory;
/**
* @type {?}
* @private
*/
AngularGoogleMapsComponent.prototype.googleMapsBuilder;
/**
* @type {?}
* @private
*/
AngularGoogleMapsComponent.prototype.googleMapsGeocoder;
/**
* @type {?}
* @private
*/
AngularGoogleMapsComponent.prototype.eventPublisher;
/**
* @type {?}
* @private
*/
AngularGoogleMapsComponent.prototype.iconRegistry;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1nb29nbGUtbWFwcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYm9sZGFkbWluL2FuZ3VsYXItZ29vZ2xlLW1hcHMvIiwic291cmNlcyI6WyJhbmd1bGFyLWdvb2dsZS1tYXBzLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ3BFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQTtBQUMzRCxPQUFPLEtBQUssTUFBTSxNQUFNLFFBQVEsQ0FBQTtBQUNoQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0NBQWdDLENBQUE7QUFDekQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sK0NBQStDLENBQUE7QUFDeEYsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sZ0RBQWdELENBQUE7QUFDMUYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUNBQXVDLENBQUE7QUFDekUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVDQUF1QyxDQUFBO0FBZXBFLE1BQU0sT0FBTywwQkFBMEI7Ozs7Ozs7O0lBOENuQyxZQUFvQixpQkFBb0MsRUFDcEMsaUJBQTJDLEVBQzNDLGtCQUE2QyxFQUM3QyxjQUE4QixFQUM5QixZQUEwQjtRQUoxQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBMEI7UUFDM0MsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUEyQjtRQUM3QyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFoRDlDLGFBQVEsR0FBRyxRQUFRLENBQUE7UUFDbkIsWUFBTyxHQUFHLEVBQUUsQ0FBQTtRQUVGLGVBQVUsR0FBZTtZQUMvQixNQUFNLEVBQUU7Z0JBQ0osR0FBRyxFQUFFLENBQUM7Z0JBQ04sR0FBRyxF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QjtRQUN0RCxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDO1lBQy9CLFFBQVEsRUFBRSxJQUFJO1lBQ2QsYUFBYSxFQUFFLEdBQUc7WUFDbEIsWUFBWSxFQUFFLENBQUM7WUFDZixJQUFJLEVBQUUsSUFBSTtZQUNWLFdBQVcsRUFBRSxTQUFTO1NBQ3pCLENBQUMsQ0FBQTtJQUNOLENBQUM7Ozs7OztJQUVPLGVBQWUsQ0FBQyxXQUF3QjtRQUM1QyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxFQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxXQUFXLENBQUMsU0FBUyxFQUFDLENBQUE7SUFDcEYsQ0FBQzs7O1lBOUhKLFNBQVMsU0FBQztnQkFDUCxRQUFRLEVBQUUsYUFBYTtnQkFDdkIsbWVBQXVDO2dCQUN2QyxTQUFTLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQzthQUN4Qzs7OztZQWZRLGlCQUFpQjtZQUZqQix3QkFBd0I7WUFDeEIseUJBQXlCO1lBSnpCLGNBQWM7WUFNZCxZQUFZOzs7eUJBb0JoQixNQUFNOzRCQWNOLE1BQU07NEJBU04sTUFBTTtpQ0FVTixNQUFNO2dDQUlOLE1BQU07Ozs7SUF4Q1AsOENBQW1COztJQUNuQiw2Q0FBWTs7SUFFWixnREFZQzs7SUFFRCxtREFPQzs7SUFFRCxtREFRQzs7SUFFRCx3REFFQzs7SUFFRCx1REFFQzs7Ozs7SUFFVyx1REFBNEM7Ozs7O0lBQzVDLHVEQUFtRDs7Ozs7SUFDbkQsd0RBQXFEOzs7OztJQUNyRCxvREFBc0M7Ozs7O0lBQ3RDLGtEQUFrQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBFdmVudFB1Ymxpc2hlciB9IGZyb20gJ0Bib2xkYWRtaW4vZXZlbnQtcHVibGlzaGVyJ1xuaW1wb3J0ICogYXMgbW9tZW50IGZyb20gJ21vbWVudCdcbmltcG9ydCB7IG1hcHNUZXh0IH0gZnJvbSAnLi9hbmd1bGFyLWdvb2dsZS1tYXBzLmNvbnN0YW50J1xuaW1wb3J0IHsgQW5ndWxhckdvb2dsZU1hcHNCdWlsZGVyIH0gZnJvbSAnLi9zZXJ2aWNlL2FuZ3VsYXItZ29vZ2xlLW1hcHMtYnVpbGRlci5zZXJ2aWNlJ1xuaW1wb3J0IHsgQW5ndWxhckdvb2dsZU1hcHNHZW9jb2RlciB9IGZyb20gJy4vc2VydmljZS9hbmd1bGFyLWdvb2dsZS1tYXBzLWdlb2NvZGVyLnNlcnZpY2UnXG5pbXBvcnQgeyBHb29nbGVNYXBzRmFjdG9yeSB9IGZyb20gJy4vc2VydmljZS9nb29nbGUtbWFwcy1mYWN0b3J5LnNlcnZpY2UnXG5pbXBvcnQgeyBJY29uUmVnaXN0cnkgfSBmcm9tICcuL3NlcnZpY2UvaWNvbi1yZWdpc3RyeS9pY29uLXJlZ2lzdHJ5J1xuaW1wb3J0IHsgQ29vcmRpbmF0ZXMgfSBmcm9tICcuL3ZhbHVlLW9iamVjdC9jb29yZGluYXRlcydcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnLi92YWx1ZS1vYmplY3QvbG9jYXRpb24nXG5pbXBvcnQgeyBUaW1lc3RhbXBDb29yZGluYXRlcyB9IGZyb20gJy4vdmFsdWUtb2JqZWN0L3RpbWVzdGFtcC1jb29yZGluYXRlcydcbmltcG9ydCBDaXJjbGVPcHRpb25zID0gZ29vZ2xlLm1hcHMuQ2lyY2xlT3B0aW9uc1xuaW1wb3J0IEljb24gPSBnb29nbGUubWFwcy5JY29uXG5pbXBvcnQgTGF0TG5nID0gZ29vZ2xlLm1hcHMuTGF0TG5nXG5pbXBvcnQgTWFwT3B0aW9ucyA9IGdvb2dsZS5tYXBzLk1hcE9wdGlvbnNcbmltcG9ydCBNYXJrZXJPcHRpb25zID0gZ29vZ2xlLm1hcHMuTWFya2VyT3B0aW9uc1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2dvb2dsZS1tYXBzJyxcbiAgICB0ZW1wbGF0ZVVybDogJ2FuZ3VsYXItZ29vZ2xlLW1hcHMuaHRtbCcsXG4gICAgcHJvdmlkZXJzOiBbQW5ndWxhckdvb2dsZU1hcHNCdWlsZGVyXVxufSlcbmV4cG9ydCBjbGFzcyBBbmd1bGFyR29vZ2xlTWFwc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICAgIG1hcHNUZXh0ID0gbWFwc1RleHRcbiAgICBhZGRyZXNzID0gJydcblxuICAgIEBPdXRwdXQoKSBtYXBPcHRpb25zOiBNYXBPcHRpb25zID0ge1xuICAgICAgICBjZW50ZXI6IHtcbiAgICAgICAgICAgIGxhdDogMCxcbiAgICAgICAgICAgIGxuZzogMFxuICAgICAgICB9LFxuICAgICAgICBtYXBUeXBlQ29udHJvbE9wdGlvbnM6IHtcbiAgICAgICAgICAgIG1hcFR5cGVJZHM6IFsncm9hZG1hcCcsICdzYXRlbGxpdGUnXSxcbiAgICAgICAgICAgIHBvc2l0aW9uOiB0aGlzLmdvb2dsZU1hcHNGYWN0b3J5LmdldEdvb2dsZU1hcHMoKS5Db250cm9sUG9zaXRpb24uTEVGVF9CT1RUT01cbiAgICAgICAgfSxcbiAgICAgICAgem9vbTogMTYsXG4gICAgICAgIGNvbnRyb2xTaXplOiAyMixcbiAgICAgICAgZnVsbHNjcmVlbkNvbnRyb2w6IGZhbHNlXG4gICAgfVxuXG4gICAgQE91dHB1dCgpIG1hcmtlck9wdGlvbnM6IE1hcmtlck9wdGlvbnMgPSB7XG4gICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgICBsYXQ6IDAsXG4gICAgICAgICAgICBsbmc6IDBcbiAgICAgICAgfSxcbiAgICAgICAgZHJhZ2dhYmxlOiB0cnVlLFxuICAgICAgICBhbmltYXRpb246IHRoaXMuZ29vZ2xlTWFwc0ZhY3RvcnkuZ2V0R29vZ2xlTWFwcygpLkFuaW1hdGlvbi5EUk9QXG4gICAgfVxuXG4gICAgQE91dHB1dCgpIGNpcmNsZU9wdGlvbnM6IENpcmNsZU9wdGlvbnMgPSB7XG4gICAgICAgIHN0cm9rZUNvbG9yOiAnIzQ0OGFmZicsXG4gICAgICAgIHN0cm9rZU9wYWNpdHk6IDAuOCxcbiAgICAgICAgc3Ryb2tlV2VpZ2h0OiAyLFxuICAgICAgICBmaWxsQ29sb3I6ICcjNDQ4YWZmJyxcbiAgICAgICAgZmlsbE9wYWNpdHk6IDAuMzUsXG4gICAgICAgIGVkaXRhYmxlOiB0cnVlLFxuICAgICAgICByYWRpdXM6IDcwXG4gICAgfVxuXG4gICAgQE91dHB1dCgpIHByZXZpb3VzTWFya2VySWNvbjogSWNvbiA9IHtcbiAgICAgICAgdXJsOiAnaHR0cDovL2Nkbi5ib2xkYWRtaW4uY29tLnMzLXdlYnNpdGUtZXUtd2VzdC0xLmFtYXpvbmF3cy5jb20vcHJldmlvdXMtbWFya2VyLnBuZydcbiAgICB9XG5cbiAgICBAT3V0cHV0KCkgY3VycmVudE1hcmtlckljb246IEljb24gPSB7XG4gICAgICAgIHVybDogJ2h0dHA6Ly9jZG4uYm9sZGFkbWluLmNvbS5zMy13ZWJzaXRlLWV1LXdlc3QtMS5hbWF6b25hd3MuY29tL2N1cnJlbnQtbWFya2VyLnBuZydcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGdvb2dsZU1hcHNGYWN0b3J5OiBHb29nbGVNYXBzRmFjdG9yeSxcbiAgICAgICAgICAgICAgICBwcml2YXRlIGdvb2dsZU1hcHNCdWlsZGVyOiBBbmd1bGFyR29vZ2xlTWFwc0J1aWxkZXIsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBnb29nbGVNYXBzR2VvY29kZXI6IEFuZ3VsYXJHb29nbGVNYXBzR2VvY29kZXIsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBldmVudFB1Ymxpc2hlcjogRXZlbnRQdWJsaXNoZXIsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBpY29uUmVnaXN0cnk6IEljb25SZWdpc3RyeSkge1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmV2ZW50UHVibGlzaGVyLnN1YnNjcmliZSgnYWRkcmVzc1JldmVyc2VHZW9jb2RlZCcsIChhZGRyZXNzOiBzdHJpbmcpID0+IHRoaXMuYWRkcmVzcyA9IGFkZHJlc3MpXG4gICAgICAgIHRoaXMuaWNvblJlZ2lzdHJ5LnJlZ2lzdGVyKCdleHBhbmQnLCAnLi9hc3NldHMvZXhwYW5kLnN2ZycpXG4gICAgICAgIHRoaXMuaWNvblJlZ2lzdHJ5LnJlZ2lzdGVyKCdjb2xsYXBzZScsICcuL2Fzc2V0cy9jb2xsYXBzZS5zdmcnKVxuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLmV2ZW50UHVibGlzaGVyLnVuc3Vic2NyaWJlQWxsKCdhZGRyZXNzUmV2ZXJzZUdlb2NvZGVkJylcbiAgICB9XG5cbiAgICBjcmVhdGVNYXBCeUxvY2F0aW9uKGZvY3VzTG9jYXRpb246IExvY2F0aW9uKSB7XG4gICAgICAgIHRoaXMuZ29vZ2xlTWFwc0dlb2NvZGVyLnJldmVyc2VHZW9jb2RlKGZvY3VzTG9jYXRpb24uY29vcmRpbmF0ZXMsIChhZGRyZXNzOiBzdHJpbmcpID0+IHRoaXMuYWRkcmVzcyA9IGFkZHJlc3MpXG4gICAgICAgIHRoaXMuY2lyY2xlT3B0aW9ucy5yYWRpdXMgPSBmb2N1c0xvY2F0aW9uLnJhZGl1c0luTWV0ZXJzXG4gICAgICAgIHRoaXMuY2hhbmdlTWFwQ2VudGVyKGZvY3VzTG9jYXRpb24uY29vcmRpbmF0ZXMpXG4gICAgICAgIHRoaXMuZ29vZ2xlTWFwc0J1aWxkZXJcbiAgICAgICAgICAgIC5jcmVhdGVNYXAodGhpcy5tYXBPcHRpb25zKVxuICAgICAgICAgICAgLmFkZENlbnRlck1hcmtlcih0aGlzLm1hcmtlck9wdGlvbnMpXG4gICAgICAgICAgICAuYWRkQ2lyY2xlKHRoaXMuY2lyY2xlT3B0aW9ucylcbiAgICAgICAgICAgIC5iaW5kQ2lyY2xlVG9NYXJrZXIoKVxuICAgICAgICAgICAgLmFkZFNlYXJjaEJveCgpXG4gICAgfVxuXG4gICAgY3JlYXRlTWFwQnlBZGRyZXNzKGFkZHJlc3M6IHN0cmluZykge1xuICAgICAgICB0aGlzLmdvb2dsZU1hcHNHZW9jb2Rlci5nZW9jb2RlKGFkZHJlc3MsIChjb29yZGluYXRlczogQ29vcmRpbmF0ZXMpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZU1hcENlbnRlcihjb29yZGluYXRlcylcbiAgICAgICAgICAgICAgICB0aGlzLmdvb2dsZU1hcHNCdWlsZGVyXG4gICAgICAgICAgICAgICAgICAgIC5jcmVhdGVNYXAodGhpcy5tYXBPcHRpb25zKVxuICAgICAgICAgICAgICAgICAgICAuYWRkQ2VudGVyTWFya2VyKHRoaXMubWFya2VyT3B0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgLmFkZENpcmNsZSh0aGlzLmNpcmNsZU9wdGlvbnMpXG4gICAgICAgICAgICAgICAgICAgIC5iaW5kQ2lyY2xlVG9NYXJrZXIoKVxuICAgICAgICAgICAgICAgICAgICAuaGlkZU1hcmtlcigpXG4gICAgICAgICAgICAgICAgICAgIC5oaWRlQ2lyY2xlKClcbiAgICAgICAgICAgICAgICAgICAgLmFkZFNlYXJjaEJveCgpXG4gICAgICAgICAgICB9XG4gICAgICAgIClcbiAgICB9XG5cbiAgICBub3RpZnlNYXBSZXNpemUoKSB7XG4gICAgICAgIHRoaXMuZXZlbnRQdWJsaXNoZXIubm90aWZ5KCdyZXNpemVNYXAnKVxuICAgIH1cblxuICAgIGFkZFRyYXZlbFBhdGgodGltZXN0YW1wQ29vcmRpbmF0ZXNMaXN0OiBBcnJheTxUaW1lc3RhbXBDb29yZGluYXRlcz4sIG5hbWU6IHN0cmluZykge1xuICAgICAgICB0aW1lc3RhbXBDb29yZGluYXRlc0xpc3QuZm9yRWFjaCgodGltZXN0YW1wQ29vcmRpbmF0ZXM6IFRpbWVzdGFtcENvb3JkaW5hdGVzLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpY29uID0gaW5kZXggPT09IDAgPyB0aGlzLmN1cnJlbnRNYXJrZXJJY29uIDogdGhpcy5wcmV2aW91c01hcmtlckljb25cbiAgICAgICAgICAgIGNvbnN0IGRhdGVUaW1lID0gbW9tZW50LnV0Yyh0aW1lc3RhbXBDb29yZGluYXRlcy50aW1lc3RhbXApLmZvcm1hdCgnWVlZWS5NTS5ERCBISDptbScpXG4gICAgICAgICAgICB0aGlzLmdvb2dsZU1hcHNCdWlsZGVyLmFkZE1hcmtlcih7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246IHRoaXMuZ29vZ2xlTWFwc0ZhY3RvcnkuY3JlYXRlTGF0TG5nKHRpbWVzdGFtcENvb3JkaW5hdGVzLmNvb3JkaW5hdGVzKSxcbiAgICAgICAgICAgICAgICB0aXRsZTogYE5hbWU6ICR7bmFtZX0sIFRpbWU6ICR7ZGF0ZVRpbWV9YCxcbiAgICAgICAgICAgICAgICBpY29uOiBpY29uXG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IGxhdExuZ3MgPSB0aW1lc3RhbXBDb29yZGluYXRlc0xpc3QubWFwKHZhbHVlID0+IHRoaXMuZ29vZ2xlTWFwc0ZhY3RvcnkuY3JlYXRlTGF0TG5nKHZhbHVlLmNvb3JkaW5hdGVzKSlcbiAgICAgICAgdGhpcy5hZGRQb2x5bGluZShsYXRMbmdzLCAnIycgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDE2KS5zdWJzdHIoMiwgNikpXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGRQb2x5bGluZShwYXRoOiBBcnJheTxMYXRMbmc+LCBjb2xvckNvZGU6IHN0cmluZykge1xuICAgICAgICB0aGlzLmdvb2dsZU1hcHNCdWlsZGVyLmFkZFBvbHlsaW5lKHtcbiAgICAgICAgICAgIGdlb2Rlc2ljOiB0cnVlLFxuICAgICAgICAgICAgc3Ryb2tlT3BhY2l0eTogMC44LFxuICAgICAgICAgICAgc3Ryb2tlV2VpZ2h0OiAxLFxuICAgICAgICAgICAgcGF0aDogcGF0aCxcbiAgICAgICAgICAgIHN0cm9rZUNvbG9yOiBjb2xvckNvZGVcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwcml2YXRlIGNoYW5nZU1hcENlbnRlcihjb29yZGluYXRlczogQ29vcmRpbmF0ZXMpIHtcbiAgICAgICAgdGhpcy5tYXBPcHRpb25zLmNlbnRlciA9IHtsYXQ6IGNvb3JkaW5hdGVzLmxhdGl0dWRlLCBsbmc6IGNvb3JkaW5hdGVzLmxvbmdpdHVkZX1cbiAgICB9XG59XG4iXX0=