UNPKG

chi-app-lib

Version:

This is a custom component (input dropdown grid textarea map captcha) published to npm.

415 lines 32.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input, Output, EventEmitter } from '@angular/core'; import * as mapboxgl from 'mapbox-gl'; var ChiMapComponent = /** @class */ (function () { function ChiMapComponent() { this.marker = []; this.id = this.idGenerator(); this.maxZoom = 18; this.minZoom = 5; this.zoom = 5; this.center = [51.4, 35.7]; this.southWest = { lat: 24.350969, lng: 44.0 }; this.northEast = { lat: 39.912996, lng: 63.5 }; this.mode = 'select'; // view // view this.zoomControl = true; this.dragging = true; this.zoomMarker = 17; this.showMarker = true; this.coordinate = new EventEmitter(); this.getMap = new EventEmitter(); // (mapboxgl as any).accessToken = 'pk.eyJ1IjoiZGFuc3dpY2siLCJhIjoieUZiWmwtVSJ9.0cPQywdbPVmvHiHJ6NwdXA'; } /** * @param {?} changes * @return {?} */ ChiMapComponent.prototype.ngOnChanges = /** * @param {?} changes * @return {?} */ function (changes) { /** @type {?} */ var height = changes.height; /** @type {?} */ var isDrag = changes.dragging; /** @type {?} */ var coordinateOrigin = changes.resetCoordinate; if ((coordinateOrigin || {})['currentValue']) { this.resetMarker(); } if ((isDrag || {})['currentValue'] === false || (isDrag || {})['currentValue'] === true) { this.disabledDrag(); } }; /** * @return {?} */ ChiMapComponent.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; setTimeout((/** * @param {?} _ * @return {?} */ function (_) { _this.initMap(); }), 100); }; /** * @return {?} */ ChiMapComponent.prototype.idGenerator = /** * @return {?} */ function () { /** @type {?} */ var number = Math.random(); number.toString(36); return number.toString(36).substr(2, 9); }; /** * @return {?} */ ChiMapComponent.prototype.disabledDrag = /** * @return {?} */ function () { if (!this.map) { return; } if (!this.dragging) { this.map.dragPan.disable(); } else { this.map.dragPan.enable(); } }; /** * @param {?} url * @param {?} resourceType * @return {?} */ ChiMapComponent.prototype.encryptTileUrl = /** * @param {?} url * @param {?} resourceType * @return {?} */ function (url, resourceType) { if (resourceType === 'Tile' && url.match('hash')) { /** @type {?} */ var arr = url.split('/'); url = url.split('hash')[0] + 'hash/' + hashThis(arr[arr.length - 3] + '/' + arr[arr.length - 2] + '/' + arr[arr.length - 1], true); return { url: url }; } if (resourceType === 'Tile' && url.match('google')) { /** @type {?} */ var arr = (url.split('pl&'))[1].split('/'); /** @type {?} */ var a = url.split('&'); url = (a[0] + '&' + a[1] + '&x=' + arr[arr.length - 2] + '&y=' + arr[arr.length - 1] + '&z=' + arr[arr.length - 3]).replace('.jpeg', ''); return { url: url }; } else { return { url: url }; } }; /** * @return {?} */ ChiMapComponent.prototype.initMap = /** * @return {?} */ function () { var _this = this; this.map = new mapboxgl.Map({ transformRequest: this.encryptTileUrl, container: 'chi-map' + this.id, // container id style: { 'version': 8, 'sources': { 'simple-tiles': { 'type': 'raster', // point to our third-party tiles. Note that some examples // show a 'url' property. This only applies to tilesets with // corresponding TileJSON (such as mapbox tiles). 'tiles': [this.mapUrl], 'tileSize': 256 } }, 'layers': [{ 'id': 'simple-tiles', 'type': 'raster', 'source': 'simple-tiles' }] }, center: this.center, zoom: this.minZoom, // starting zoom minZoom: this.minZoom, maxZoom: this.maxZoom, maxBounds: [[this.southWest.lng, this.southWest.lat], [this.northEast.lng, this.northEast.lat]] }); this.map.scrollZoom.setWheelZoomRate(1); /** @type {?} */ var nav = new mapboxgl.NavigationControl({ showCompass: false, showZoom: this.zoomControl }); this.map.addControl(nav, 'top-left'); // disable map rotation using right click + drag this.map.dragRotate.disable(); // disable map rotation using touch rotation gesture this.map.touchZoomRotate.disableRotation(); this.map.dragRotate.disable(); if (this.zoomControl) { this.map.scrollZoom.enable(); } else { this.map.scrollZoom.disable(); } this.disabledDrag(); if (this.mode === 'select') { this.map.on('dragstart', (/** * @param {?} evt * @return {?} */ function (evt) { _this.updateCoordinate(); })); this.map.on('drag', (/** * @param {?} evt * @return {?} */ function (evt) { _this.updateCoordinate(); })); this.map.on('dragend', (/** * @param {?} evt * @return {?} */ function (evt) { _this.updateCoordinate(); })); this.map.on('zoomend', (/** * @param {?} evt * @return {?} */ function (evt) { _this.updateCoordinate(); })); } if (this.showMarker) { this.setMarker(); } this.getMap.emit(this.map); }; /** * @return {?} */ ChiMapComponent.prototype.updateCoordinate = /** * @return {?} */ function () { /** @type {?} */ var center = this.map.getCenter(); this.updatePositionMarker(center.lat, center.lng); this.coordinate.emit(center); }; /** * @return {?} */ ChiMapComponent.prototype.setMarker = /** * @return {?} */ function () { var _this = this; /** @type {?} */ var positionMarker = this.coordinateMarker || this.map.getCenter(); /** @type {?} */ var geojson = { 'type': 'FeatureCollection', 'features': [ { 'type': 'Feature', 'properties': { 'iconSize': this.markerSize }, 'geometry': { 'type': 'Point', 'coordinates': positionMarker } } ] }; // add markers to map geojson.features.forEach((/** * @param {?} marker * @return {?} */ function (marker) { // create a DOM element for the marker /** @type {?} */ var el = document.createElement('div'); el.className = 'marker'; el.style.backgroundImage = 'url(' + _this.markerUrl + ')'; el.style.width = marker.properties.iconSize[0] + 'px'; el.style.height = marker.properties.iconSize[1] + 'px'; el.draggable = false; // add marker to map /** @type {?} */ var markerIcon = new mapboxgl.Marker(el, { offset: _this.markerAnchor }) .setLngLat(marker.geometry.coordinates) .addTo(_this.map); _this.marker.push(markerIcon); })); this.paneToMarker(positionMarker.lat, positionMarker.lng || positionMarker.lon); this.coordinate.emit(positionMarker); }; /** * @param {?} lat * @param {?} lng * @return {?} */ ChiMapComponent.prototype.paneToMarker = /** * @param {?} lat * @param {?} lng * @return {?} */ function (lat, lng) { this.map.flyTo({ // These options control the ending camera position: centered at // the target, at zoom level 9, and north up. center: [lng, lat], zoom: this.zoomMarker }); }; /** * @param {?} lat * @param {?} lng * @return {?} */ ChiMapComponent.prototype.updatePositionMarker = /** * @param {?} lat * @param {?} lng * @return {?} */ function (lat, lng) { for (var i = 0; i < this.marker.length; i++) { this.marker[i]._lngLat = { lat: lat, lng: lng }; this.marker[i]._update(); } }; /** * @return {?} */ ChiMapComponent.prototype.resetMarker = /** * @return {?} */ function () { this.updatePositionMarker(this.coordinateMarker.lat, this.coordinateMarker.lng); this.paneToMarker(this.coordinateMarker.lat, this.coordinateMarker.lng || this.coordinateMarker.lon); }; ChiMapComponent.decorators = [ { type: Component, args: [{ selector: 'lib-chi-map', template: "<div id=\"chi-map{{id}}\" [ngStyle]=\"{'width': width , 'height': height}\" class=\"chi-map\"></div>\n", styles: [".chi-map{position:relative;direction:rtl;z-index:10021;transition:height .5s ease-in-out}"] }] } ]; /** @nocollapse */ ChiMapComponent.ctorParameters = function () { return []; }; ChiMapComponent.propDecorators = { mapUrl: [{ type: Input }], maxZoom: [{ type: Input }], minZoom: [{ type: Input }], zoom: [{ type: Input }], center: [{ type: Input }], southWest: [{ type: Input }], northEast: [{ type: Input }], mode: [{ type: Input }], zoomControl: [{ type: Input }], dragging: [{ type: Input }], markerUrl: [{ type: Input }], markerSize: [{ type: Input }], markerAnchor: [{ type: Input }], coordinateMarker: [{ type: Input }], resetCoordinate: [{ type: Input }], zoomMarker: [{ type: Input }], width: [{ type: Input }], height: [{ type: Input }], showMarker: [{ type: Input }], coordinate: [{ type: Output }], getMap: [{ type: Output }] }; return ChiMapComponent; }()); export { ChiMapComponent }; if (false) { /** @type {?} */ ChiMapComponent.prototype.map; /** @type {?} */ ChiMapComponent.prototype.baseMaps; /** @type {?} */ ChiMapComponent.prototype.mapOptions; /** @type {?} */ ChiMapComponent.prototype.marker; /** @type {?} */ ChiMapComponent.prototype.id; /** @type {?} */ ChiMapComponent.prototype.mapUrl; /** @type {?} */ ChiMapComponent.prototype.maxZoom; /** @type {?} */ ChiMapComponent.prototype.minZoom; /** @type {?} */ ChiMapComponent.prototype.zoom; /** @type {?} */ ChiMapComponent.prototype.center; /** @type {?} */ ChiMapComponent.prototype.southWest; /** @type {?} */ ChiMapComponent.prototype.northEast; /** @type {?} */ ChiMapComponent.prototype.mode; /** @type {?} */ ChiMapComponent.prototype.zoomControl; /** @type {?} */ ChiMapComponent.prototype.dragging; /** @type {?} */ ChiMapComponent.prototype.markerUrl; /** @type {?} */ ChiMapComponent.prototype.markerSize; /** @type {?} */ ChiMapComponent.prototype.markerAnchor; /** @type {?} */ ChiMapComponent.prototype.coordinateMarker; /** @type {?} */ ChiMapComponent.prototype.resetCoordinate; /** @type {?} */ ChiMapComponent.prototype.zoomMarker; /** @type {?} */ ChiMapComponent.prototype.width; /** @type {?} */ ChiMapComponent.prototype.height; /** @type {?} */ ChiMapComponent.prototype.showMarker; /** @type {?} */ ChiMapComponent.prototype.coordinate; /** @type {?} */ ChiMapComponent.prototype.getMap; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hpLW1hcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9jaGktYXBwLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9jaGktbWFwL2NoaS1tYXAuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUF5QyxNQUFNLGVBQWUsQ0FBQztBQUNySCxPQUFPLEtBQUssUUFBUSxNQUFNLFdBQVcsQ0FBQztBQUd0QztJQW1DRTtRQXpCQSxXQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ1osT0FBRSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVmLFlBQU8sR0FBRyxFQUFFLENBQUM7UUFDYixZQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ1osU0FBSSxHQUFHLENBQUMsQ0FBQztRQUNULFdBQU0sR0FBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMzQixjQUFTLEdBQUcsRUFBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUMsQ0FBQztRQUN4QyxjQUFTLEdBQUcsRUFBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUMsQ0FBQztRQUN4QyxTQUFJLEdBQUcsUUFBUSxDQUFDLENBQUMsT0FBTzs7UUFDeEIsZ0JBQVcsR0FBRyxJQUFJLENBQUM7UUFDbkIsYUFBUSxHQUFHLElBQUksQ0FBQztRQU1oQixlQUFVLEdBQUcsRUFBRSxDQUFDO1FBR2hCLGVBQVUsR0FBRyxJQUFJLENBQUM7UUFDakIsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDckMsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFLekMsd0dBQXdHO0lBQzFHLENBQUM7Ozs7O0lBRUQscUNBQVc7Ozs7SUFBWCxVQUFZLE9BQXNCOztZQUMxQixNQUFNLEdBQWlCLE9BQU8sQ0FBQyxNQUFNOztZQUNyQyxN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QUNOLE1BQU07O0lBMk5ULHNCQUFDO0NBQUEsQUEzUEQsSUEyUEM7U0F0UFksZUFBZTs7O0lBRTFCLDhCQUFXOztJQUNYLG1DQUFxQjs7SUFDckIscUNBQVc7O0lBQ1gsaUNBQVk7O0lBQ1osNkJBQXdCOztJQUN4QixpQ0FBZ0I7O0lBQ2hCLGtDQUFzQjs7SUFDdEIsa0NBQXFCOztJQUNyQiwrQkFBa0I7O0lBQ2xCLGlDQUFvQzs7SUFDcEMsb0NBQWlEOztJQUNqRCxvQ0FBaUQ7O0lBQ2pELCtCQUF5Qjs7SUFDekIsc0NBQTRCOztJQUM1QixtQ0FBeUI7O0lBQ3pCLG9DQUFtQjs7SUFDbkIscUNBQW9COztJQUNwQix1Q0FBc0I7O0lBQ3RCLDJDQUEwQjs7SUFDMUIsMENBQXlCOztJQUN6QixxQ0FBeUI7O0lBQ3pCLGdDQUFlOztJQUNmLGlDQUFnQjs7SUFDaEIscUNBQTJCOztJQUMzQixxQ0FBK0M7O0lBQy9DLGlDQUEyQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBTaW1wbGVDaGFuZ2V9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0ICogYXMgbWFwYm94Z2wgZnJvbSAnbWFwYm94LWdsJztcbmRlY2xhcmUgZnVuY3Rpb24gaGFzaFRoaXModGV4dCwgZW5jcnlwdCk6IGFueTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWNoaS1tYXAnLFxuICB0ZW1wbGF0ZVVybDogJy4vY2hpLW1hcC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NoaS1tYXAuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBDaGlNYXBDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG5cbiAgcHVibGljIG1hcDtcbiAgcHVibGljIGJhc2VNYXBzOiBhbnk7XG4gIG1hcE9wdGlvbnM7XG4gIG1hcmtlciA9IFtdO1xuICBpZCA9IHRoaXMuaWRHZW5lcmF0b3IoKTtcbiAgQElucHV0KCkgbWFwVXJsO1xuICBASW5wdXQoKSBtYXhab29tID0gMTg7XG4gIEBJbnB1dCgpIG1pblpvb20gPSA1O1xuICBASW5wdXQoKSB6b29tID0gNTtcbiAgQElucHV0KCkgY2VudGVyOiBhbnkgPSBbNTEuNCwgMzUuN107XG4gIEBJbnB1dCgpIHNvdXRoV2VzdCA9IHtsYXQ6IDI0LjM1MDk2OSwgbG5nOiA0NC4wfTtcbiAgQElucHV0KCkgbm9ydGhFYXN0ID0ge2xhdDogMzkuOTEyOTk2LCBsbmc6IDYzLjV9O1xuICBASW5wdXQoKSBtb2RlID0gJ3NlbGVjdCc7IC8vIHZpZXdcbiAgQElucHV0KCkgem9vbUNvbnRyb2wgPSB0cnVlO1xuICBASW5wdXQoKSBkcmFnZ2luZyA9IHRydWU7XG4gIEBJbnB1dCgpIG1hcmtlclVybDtcbiAgQElucHV0KCkgbWFya2VyU2l6ZTtcbiAgQElucHV0KCkgbWFya2VyQW5jaG9yO1xuICBASW5wdXQoKSBjb29yZGluYXRlTWFya2VyO1xuICBASW5wdXQoKSByZXNldENvb3JkaW5hdGU7XG4gIEBJbnB1dCgpIHpvb21NYXJrZXIgPSAxNztcbiAgQElucHV0KCkgd2lkdGg7XG4gIEBJbnB1dCgpIGhlaWdodDtcbiAgQElucHV0KCkgc2hvd01hcmtlciA9IHRydWU7XG4gIEBPdXRwdXQoKSBjb29yZGluYXRlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBnZXRNYXAgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuXG4gIGNvbnN0cnVjdG9yKCkge1xuXG4gICAgLy8gKG1hcGJveGdsIGFzIGFueSkuYWNjZXNzVG9rZW4gPSAncGsuZXlKMUlqb2laR0Z1YzNkcFkyc2lMQ0poSWpvaWVVWmlXbXd0VlNKOS4wY1BReXdkYlBWbXZIaUhKNk53ZFhBJztcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBjb25zdCBoZWlnaHQ6IFNpbXBsZUNoYW5nZSA9IGNoYW5nZXMuaGVpZ2h0O1xuICAgIGNvbnN0IGlzRHJhZzogU2ltcGxlQ2hhbmdlID0gY2hhbmdlcy5kcmFnZ2luZztcbiAgICBjb25zdCBjb29yZGluYXRlT3JpZ2luOiBTaW1wbGVDaGFuZ2UgPSBjaGFuZ2VzLnJlc2V0Q29vcmRpbmF0ZTtcbiAgICBpZiAoKGNvb3JkaW5hdGVPcmlnaW4gfHwge30pWydjdXJyZW50VmFsdWUnXSkge1xuICAgICAgdGhpcy5yZXNldE1hcmtlcigpO1xuICAgIH1cbiAgICBpZiAoKGlzRHJhZyB8fCB7fSlbJ2N1cnJlbnRWYWx1ZSddID09PSBmYWxzZSB8fCAoaXNEcmFnIHx8IHt9KVsnY3VycmVudFZhbHVlJ10gPT09IHRydWUpIHtcbiAgICAgIHRoaXMuZGlzYWJsZWREcmFnKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG5cbiAgICBzZXRUaW1lb3V0KF8gPT4ge1xuICAgICAgdGhpcy5pbml0TWFwKCk7XG4gICAgfSwgMTAwKTtcblxuICB9XG5cbiAgaWRHZW5lcmF0b3IoKSB7XG4gICAgY29uc3QgbnVtYmVyID0gTWF0aC5yYW5kb20oKTtcbiAgICBudW1iZXIudG9TdHJpbmcoMzYpO1xuICAgIHJldHVybiBudW1iZXIudG9TdHJpbmcoMzYpLnN1YnN0cigyLCA5KTtcbiAgfVxuXG4gIGRpc2FibGVkRHJhZygpIHtcbiAgICBpZiAoIXRoaXMubWFwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5kcmFnZ2luZykge1xuICAgICAgdGhpcy5tYXAuZHJhZ1Bhbi5kaXNhYmxlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubWFwLmRyYWdQYW4uZW5hYmxlKCk7XG4gICAgfVxuICB9XG5cbiAgZW5jcnlwdFRpbGVVcmwodXJsLCByZXNvdXJjZVR5cGUpIHtcblxuICAgIGlmIChyZXNvdXJjZVR5cGUgPT09ICdUaWxlJyAmJiB1cmwubWF0Y2goJ2hhc2gnKSkge1xuXG4gICAgICBjb25zdCBhcnIgPSB1cmwuc3BsaXQoJy8nKTtcbiAgICAgIHVybCA9IHVybC5zcGxpdCgnaGFzaCcpWzBdICsgJ2hhc2gvJyArIGhhc2hUaGlzKGFyclthcnIubGVuZ3RoIC0gM10gKyAnLycgKyBhcnJbYXJyLmxlbmd0aCAtIDJdICsgJy8nICsgYXJyW2Fyci5sZW5ndGggLSAxXSwgdHJ1ZSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB1cmw6IHVybFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHJlc291cmNlVHlwZSA9PT0gJ1RpbGUnICYmIHVybC5tYXRjaCgnZ29vZ2xlJykpIHtcblxuICAgICAgY29uc3QgYXJyID0gKHVybC5zcGxpdCgncGwmJykpWzFdLnNwbGl0KCcvJyk7XG4gICAgICBjb25zdCBhID0gdXJsLnNwbGl0KCcmJyk7XG4gICAgICB1cmwgPSAoYVswXSArICcmJyArIGFbMV0gKyAnJng9JyArIGFyclthcnIubGVuZ3RoIC0gMl0gKyAnJnk9JyArIGFyclthcnIubGVuZ3RoIC0gMV0gKyAnJno9JyArIGFyclthcnIubGVuZ3RoIC0gM10pLnJlcGxhY2UoJy5qcGVnJywgJycpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXJsOiB1cmxcbiAgICAgIH07XG5cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXJsOiB1cmxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgaW5pdE1hcCgpIHtcbiAgICB0aGlzLm1hcCA9IG5ldyBtYXBib3hnbC5NYXAoe1xuICAgICAgdHJhbnNmb3JtUmVxdWVzdDogdGhpcy5lbmNyeXB0VGlsZVVybCxcbiAgICAgIGNvbnRhaW5lcjogJ2NoaS1tYXAnICsgdGhpcy5pZCwgLy8gY29udGFpbmVyIGlkXG4gICAgICBzdHlsZToge1xuICAgICAgICAndmVyc2lvbic6IDgsXG4gICAgICAgICdzb3VyY2VzJzoge1xuICAgICAgICAgICdzaW1wbGUtdGlsZXMnOiB7XG4gICAgICAgICAgICAndHlwZSc6ICdyYXN0ZXInLFxuICAgICAgICAgICAgLy8gcG9pbnQgdG8gb3VyIHRoaXJkLXBhcnR5IHRpbGVzLiBOb3RlIHRoYXQgc29tZSBleGFtcGxlc1xuICAgICAgICAgICAgLy8gc2hvdyBhICd1cmwnIHByb3BlcnR5LiBUaGlzIG9ubHkgYXBwbGllcyB0byB0aWxlc2V0cyB3aXRoXG4gICAgICAgICAgICAvLyBjb3JyZXNwb25kaW5nIFRpbGVKU09OIChzdWNoIGFzIG1hcGJveCB0aWxlcykuXG4gICAgICAgICAgICAndGlsZXMnOiBbdGhpcy5tYXBVcmxdLFxuICAgICAgICAgICAgJ3RpbGVTaXplJzogMjU2XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAnbGF5ZXJzJzogW3tcbiAgICAgICAgICAnaWQnOiAnc2ltcGxlLXRpbGVzJyxcbiAgICAgICAgICAndHlwZSc6ICdyYXN0ZXInLFxuICAgICAgICAgICdzb3VyY2UnOiAnc2ltcGxlLXRpbGVzJ1xuICAgICAgICB9XVxuICAgICAgfSxcbiAgICAgIGNlbnRlcjogdGhpcy5jZW50ZXIsXG4gICAgICB6b29tOiB0aGlzLm1pblpvb20sIC8vIHN0YXJ0aW5nIHpvb21cbiAgICAgIG1pblpvb206IHRoaXMubWluWm9vbSxcbiAgICAgIG1heFpvb206IHRoaXMubWF4Wm9vbSxcbiAgICAgIG1heEJvdW5kczogW1t0aGlzLnNvdXRoV2VzdC5sbmcsIHRoaXMuc291dGhXZXN0LmxhdF0sIFt0aGlzLm5vcnRoRWFzdC5sbmcsIHRoaXMubm9ydGhFYXN0LmxhdF1dXG4gICAgfSk7XG4gICAgdGhpcy5tYXAuc2Nyb2xsWm9vbS5zZXRXaGVlbFpvb21SYXRlKDEpO1xuXG4gICAgY29uc3QgbmF2ID0gbmV3IG1hcGJveGdsLk5hdmlnYXRpb25Db250cm9sKHtcbiAgICAgIHNob3dDb21wYXNzOiBmYWxzZSxcbiAgICAgIHNob3dab29tOiB0aGlzLnpvb21Db250cm9sXG4gICAgfSk7XG4gICAgdGhpcy5tYXAuYWRkQ29udHJvbChuYXYsICd0b3AtbGVmdCcpO1xuICAgIC8vIGRpc2FibGUgbWFwIHJvdGF0aW9uIHVzaW5nIHJpZ2h0IGNsaWNrICsgZHJhZ1xuICAgIHRoaXMubWFwLmRyYWdSb3RhdGUuZGlzYWJsZSgpO1xuXG4gICAgLy8gZGlzYWJsZSBtYXAgcm90YXRpb24gdXNpbmcgdG91Y2ggcm90YXRpb24gZ2VzdHVyZVxuICAgIHRoaXMubWFwLnRvdWNoWm9vbVJvdGF0ZS5kaXNhYmxlUm90YXRpb24oKTtcbiAgICB0aGlzLm1hcC5kcmFnUm90YXRlLmRpc2FibGUoKTtcblxuICAgIGlmICh0aGlzLnpvb21Db250cm9sKSB7XG4gICAgICB0aGlzLm1hcC5zY3JvbGxab29tLmVuYWJsZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1hcC5zY3JvbGxab29tLmRpc2FibGUoKTtcbiAgICB9XG5cblxuICAgIHRoaXMuZGlzYWJsZWREcmFnKCk7XG5cbiAgICBpZiAodGhpcy5tb2RlID09PSAnc2VsZWN0Jykge1xuXG4gICAgICB0aGlzLm1hcC5vbignZHJhZ3N0YXJ0JywgKGV2dCkgPT4ge1xuXG4gICAgICAgIHRoaXMudXBkYXRlQ29vcmRpbmF0ZSgpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLm1hcC5vbignZHJhZycsIChldnQpID0+IHtcblxuICAgICAgICB0aGlzLnVwZGF0ZUNvb3JkaW5hdGUoKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5tYXAub24oJ2RyYWdlbmQnLCAoZXZ0KSA9PiB7XG4gICAgICAgIHRoaXMudXBkYXRlQ29vcmRpbmF0ZSgpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLm1hcC5vbignem9vbWVuZCcsIChldnQpID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVDb29yZGluYXRlKCk7XG4gICAgICB9KTtcblxuICAgIH1cblxuICAgIGlmICh0aGlzLnNob3dNYXJrZXIpIHtcbiAgICAgIHRoaXMuc2V0TWFya2VyKCk7XG4gICAgfVxuICAgIHRoaXMuZ2V0TWFwLmVtaXQodGhpcy5tYXApO1xuXG4gIH1cblxuICB1cGRhdGVDb29yZGluYXRlKCkge1xuICAgIGNvbnN0IGNlbnRlciA9IHRoaXMubWFwLmdldENlbnRlcigpO1xuICAgIHRoaXMudXBkYXRlUG9zaXRpb25NYXJrZXIoY2VudGVyLmxhdCwgY2VudGVyLmxuZyk7XG4gICAgdGhpcy5jb29yZGluYXRlLmVtaXQoY2VudGVyKTtcbiAgfVxuXG4gIHNldE1hcmtlcigpIHtcblxuICAgIGNvbnN0IHBvc2l0aW9uTWFya2VyID0gdGhpcy5jb29yZGluYXRlTWFya2VyIHx8IHRoaXMubWFwLmdldENlbnRlcigpO1xuICAgIGNvbnN0IGdlb2pzb24gPSB7XG4gICAgICAndHlwZSc6ICdGZWF0dXJlQ29sbGVjdGlvbicsXG4gICAgICAnZmVhdHVyZXMnOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAndHlwZSc6ICdGZWF0dXJlJyxcbiAgICAgICAgICAncHJvcGVydGllcyc6IHtcbiAgICAgICAgICAgICdpY29uU2l6ZSc6IHRoaXMubWFya2VyU2l6ZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ2dlb21ldHJ5Jzoge1xuICAgICAgICAgICAgJ3R5cGUnOiAnUG9pbnQnLFxuICAgICAgICAgICAgJ2Nvb3JkaW5hdGVzJzogcG9zaXRpb25NYXJrZXJcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9O1xuXG4gICAgLy8gYWRkIG1hcmtlcnMgdG8gbWFwXG4gICAgZ2VvanNvbi5mZWF0dXJlcy5mb3JFYWNoKG1hcmtlciA9PiB7XG4gICAgICAvLyBjcmVhdGUgYSBET00gZWxlbWVudCBmb3IgdGhlIG1hcmtlclxuICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGVsLmNsYXNzTmFtZSA9ICdtYXJrZXInO1xuICAgICAgZWwuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gJ3VybCgnICsgdGhpcy5tYXJrZXJVcmwgKyAnKSc7XG4gICAgICBlbC5zdHlsZS53aWR0aCA9IG1hcmtlci5wcm9wZXJ0aWVzLmljb25TaXplWzBdICsgJ3B4JztcbiAgICAgIGVsLnN0eWxlLmhlaWdodCA9IG1hcmtlci5wcm9wZXJ0aWVzLmljb25TaXplWzFdICsgJ3B4JztcbiAgICAgIGVsLmRyYWdnYWJsZSA9IGZhbHNlO1xuXG4gICAgICAvLyBhZGQgbWFya2VyIHRvIG1hcFxuXG5cbiAgICAgIGNvbnN0IG1hcmtlckljb24gPSBuZXcgbWFwYm94Z2wuTWFya2VyKGVsLCB7b2Zmc2V0OiB0aGlzLm1hcmtlckFuY2hvcn0pXG4gICAgICAgIC5zZXRMbmdMYXQobWFya2VyLmdlb21ldHJ5LmNvb3JkaW5hdGVzKVxuICAgICAgICAuYWRkVG8odGhpcy5tYXApO1xuICAgICAgdGhpcy5tYXJrZXIucHVzaChtYXJrZXJJY29uKTtcblxuICAgIH0pO1xuXG4gICAgdGhpcy5wYW5lVG9NYXJrZXIocG9zaXRpb25NYXJrZXIubGF0LCBwb3NpdGlvbk1hcmtlci5sbmcgfHwgcG9zaXRpb25NYXJrZXIubG9uKTtcbiAgICB0aGlzLmNvb3JkaW5hdGUuZW1pdChwb3NpdGlvbk1hcmtlcik7XG4gIH1cblxuICBwYW5lVG9NYXJrZXIobGF0LCBsbmcpIHtcbiAgICB0aGlzLm1hcC5mbHlUbyh7XG4gICAgICAvLyBUaGVzZSBvcHRpb25zIGNvbnRyb2wgdGhlIGVuZGluZyBjYW1lcmEgcG9zaXRpb246IGNlbnRlcmVkIGF0XG4gICAgICAvLyB0aGUgdGFyZ2V0LCBhdCB6b29tIGxldmVsIDksIGFuZCBub3J0aCB1cC5cbiAgICAgIGNlbnRlcjogW2xuZywgbGF0XSxcbiAgICAgIHpvb206IHRoaXMuem9vbU1hcmtlclxuICAgIH0pO1xuICB9XG5cbiAgdXBkYXRlUG9zaXRpb25NYXJrZXIobGF0LCBsbmcpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubWFya2VyLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLm1hcmtlcltpXS5fbG5nTGF0ID0ge2xhdDogbGF0LCBsbmc6IGxuZ307XG4gICAgICB0aGlzLm1hcmtlcltpXS5fdXBkYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgcmVzZXRNYXJrZXIoKSB7XG4gICAgdGhpcy51cGRhdGVQb3NpdGlvbk1hcmtlcih0aGlzLmNvb3JkaW5hdGVNYXJrZXIubGF0LCB0aGlzLmNvb3JkaW5hdGVNYXJrZXIubG5nKTtcbiAgICB0aGlzLnBhbmVUb01hcmtlcih0aGlzLmNvb3JkaW5hdGVNYXJrZXIubGF0LCB0aGlzLmNvb3JkaW5hdGVNYXJrZXIubG5nIHx8IHRoaXMuY29vcmRpbmF0ZU1hcmtlci5sb24pO1xuICB9XG5cblxufVxuIl19