kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
438 lines (434 loc) • 50.2 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.createNewDataEntry = createNewDataEntry;
exports.getNewDatasetColor = getNewDatasetColor;
exports.getWMSCapabilities = getWMSCapabilities;
exports.wmsCapabilitiesToDatasetMetadata = wmsCapabilitiesToDatasetMetadata;
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _uniq = _interopRequireDefault(require("lodash/uniq"));
var _keplerTable = _interopRequireDefault(require("./kepler-table"));
var _tasks = _interopRequireDefault(require("react-palm/tasks"));
var _constants = require("@kepler.gl/constants");
var _utils = require("@kepler.gl/utils");
var _core = require("@loaders.gl/core");
var _pmtiles = require("@loaders.gl/pmtiles");
var _wms = require("@loaders.gl/wms");
var _tilesetUtils = require("./tileset/tileset-utils");
var _rasterTileUtils = require("./tileset/raster-tile-utils");
var _vectorTileUtils = require("./tileset/vector-tile-utils");
var _excluded = ["info", "data"]; // SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
// apply a color for each dataset
// to use as label colors
var datasetColors = ['#8F2FBF', '#005CFF', '#C06C84', '#F8B195', '#547A82', '#3EACA8', '#A2D4AB'].map(_utils.hexToRgb);
function getNewDatasetColor(datasets) {
var presetColors = datasetColors.map(String);
var usedColors = (0, _uniq["default"])(Object.values(datasets).map(function (d) {
return String(d.color);
})).filter(function (c) {
return presetColors.includes(c);
});
if (usedColors.length === presetColors.length) {
// if we already depleted the pool of color
return _utils.datasetColorMaker.next().value;
}
var color = _utils.datasetColorMaker.next().value;
while (usedColors.includes(String(color))) {
color = _utils.datasetColorMaker.next().value;
}
return color;
}
/**
* Take datasets payload from addDataToMap, create datasets entry save to visState
*/
function createNewDataEntry(_ref) {
var _getApplicationConfig;
var info = _ref.info,
data = _ref.data,
opts = (0, _objectWithoutProperties2["default"])(_ref, _excluded);
var datasets = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var TableClass = (_getApplicationConfig = (0, _utils.getApplicationConfig)().table) !== null && _getApplicationConfig !== void 0 ? _getApplicationConfig : _keplerTable["default"];
var dataValidator = _utils.validateInputData;
if (typeof TableClass.getInputDataValidator === 'function') {
dataValidator = TableClass.getInputDataValidator();
}
var validatedData = dataValidator(data);
if (!validatedData) {
return null;
}
// check if dataset already exists, and update it when loading data by batches incrementally
if (info && info.id && datasets[info.id]) {
// get keplerTable from datasets
var keplerTable = datasets[info.id];
// update the data in keplerTable
return UPDATE_TABLE_TASK({
table: keplerTable,
data: validatedData
});
}
info = info || {};
var color = info.color || getNewDatasetColor(datasets);
return CREATE_TABLE_TASK({
info: info,
color: color,
opts: opts,
data: data.arrowTable ? _objectSpread(_objectSpread({}, validatedData), {}, {
arrowTable: data.arrowTable
}) : validatedData
});
}
function updateTable(_x) {
return _updateTable.apply(this, arguments);
}
function _updateTable() {
_updateTable = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(_ref2) {
var table, data, updated;
return _regenerator["default"].wrap(function _callee$(_context) {
while (1) switch (_context.prev = _context.next) {
case 0:
table = _ref2.table, data = _ref2.data;
_context.next = 3;
return table.update(data);
case 3:
updated = _context.sent;
return _context.abrupt("return", updated);
case 5:
case "end":
return _context.stop();
}
}, _callee);
}));
return _updateTable.apply(this, arguments);
}
function createTable(_x2) {
return _createTable.apply(this, arguments);
}
function _createTable() {
_createTable = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(datasetInfo) {
var _getApplicationConfig2;
var info, color, opts, data, refreshedMetadata, metadata, TableClass, table;
return _regenerator["default"].wrap(function _callee2$(_context2) {
while (1) switch (_context2.prev = _context2.next) {
case 0:
info = datasetInfo.info, color = datasetInfo.color, opts = datasetInfo.opts, data = datasetInfo.data; // update metadata for remote tiled datasets
_context2.next = 3;
return refreshRemoteData(datasetInfo);
case 3:
refreshedMetadata = _context2.sent;
metadata = opts.metadata;
if (refreshedMetadata) {
metadata = _objectSpread(_objectSpread({}, opts.metadata), refreshedMetadata);
if (metadata.fields) {
data.fields = metadata.fields;
}
}
TableClass = (_getApplicationConfig2 = (0, _utils.getApplicationConfig)().table) !== null && _getApplicationConfig2 !== void 0 ? _getApplicationConfig2 : _keplerTable["default"];
table = new TableClass(_objectSpread(_objectSpread({
info: info,
color: color
}, opts), {}, {
metadata: metadata
}));
_context2.prev = 8;
_context2.next = 11;
return table.importData({
data: data
});
case 11:
_context2.next = 17;
break;
case 13:
_context2.prev = 13;
_context2.t0 = _context2["catch"](8);
console.error('Failed to create table', _context2.t0);
throw _context2.t0;
case 17:
return _context2.abrupt("return", table);
case 18:
case "end":
return _context2.stop();
}
}, _callee2, null, [[8, 13]]);
}));
return _createTable.apply(this, arguments);
}
var UPDATE_TABLE_TASK = _tasks["default"].fromPromise(updateTable, 'UPDATE_TABLE_TASK');
var CREATE_TABLE_TASK = _tasks["default"].fromPromise(createTable, 'CREATE_TABLE_TASK');
/**
* Fetch metadata for vector tile layers using tilesetMetadataUrl from metadata
* @param datasetInfo
* @returns
*/
function refreshRemoteData(_x3) {
return _refreshRemoteData.apply(this, arguments);
}
function _refreshRemoteData() {
_refreshRemoteData = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(datasetInfo) {
var type;
return _regenerator["default"].wrap(function _callee3$(_context3) {
while (1) switch (_context3.prev = _context3.next) {
case 0:
type = datasetInfo.info.type;
_context3.t0 = type;
_context3.next = _context3.t0 === _constants.DatasetType.VECTOR_TILE ? 4 : _context3.t0 === _constants.DatasetType.RASTER_TILE ? 7 : _context3.t0 === _constants.DatasetType.WMS_TILE ? 10 : _context3.t0 === _constants.DatasetType.TILE_3D ? 13 : 14;
break;
case 4:
_context3.next = 6;
return refreshVectorTileMetadata(datasetInfo);
case 6:
return _context3.abrupt("return", _context3.sent);
case 7:
_context3.next = 9;
return refreshRasterTileMetadata(datasetInfo);
case 9:
return _context3.abrupt("return", _context3.sent);
case 10:
_context3.next = 12;
return refreshWMSMetadata(datasetInfo);
case 12:
return _context3.abrupt("return", _context3.sent);
case 13:
return _context3.abrupt("return", null);
case 14:
return _context3.abrupt("return", null);
case 15:
case "end":
return _context3.stop();
}
}, _callee3);
}));
return _refreshRemoteData.apply(this, arguments);
}
function refreshVectorTileMetadata(_x4) {
return _refreshVectorTileMetadata.apply(this, arguments);
}
function _refreshVectorTileMetadata() {
_refreshVectorTileMetadata = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4(datasetInfo) {
var _ref3, remoteTileFormat, tilesetMetadataUrl, tilesetDataUrl, rawMetadata, tileSource, metadata;
return _regenerator["default"].wrap(function _callee4$(_context4) {
while (1) switch (_context4.prev = _context4.next) {
case 0:
_ref3 = datasetInfo.opts.metadata || {}, remoteTileFormat = _ref3.remoteTileFormat, tilesetMetadataUrl = _ref3.tilesetMetadataUrl, tilesetDataUrl = _ref3.tilesetDataUrl;
if (!(!(remoteTileFormat === _constants.RemoteTileFormat.PMTILES || remoteTileFormat === _constants.RemoteTileFormat.MVT) || typeof tilesetMetadataUrl !== 'string' || typeof tilesetDataUrl !== 'string')) {
_context4.next = 3;
break;
}
return _context4.abrupt("return", null);
case 3:
_context4.prev = 3;
rawMetadata = null;
if (!(remoteTileFormat === _constants.RemoteTileFormat.MVT)) {
_context4.next = 11;
break;
}
_context4.next = 8;
return (0, _tilesetUtils.getMVTMetadata)(tilesetMetadataUrl);
case 8:
rawMetadata = _context4.sent;
_context4.next = 15;
break;
case 11:
tileSource = _pmtiles.PMTilesSource.createDataSource(tilesetMetadataUrl, {});
_context4.next = 14;
return tileSource.metadata;
case 14:
rawMetadata = _context4.sent;
case 15:
if (!rawMetadata) {
_context4.next = 20;
break;
}
metadata = (0, _vectorTileUtils.parseVectorMetadata)(rawMetadata);
_context4.next = 19;
return (0, _vectorTileUtils.getFieldsFromTile)({
remoteTileFormat: remoteTileFormat,
tilesetUrl: tilesetDataUrl,
metadataUrl: tilesetMetadataUrl,
metadata: metadata
});
case 19:
return _context4.abrupt("return", metadata);
case 20:
_context4.next = 24;
break;
case 22:
_context4.prev = 22;
_context4.t0 = _context4["catch"](3);
case 24:
return _context4.abrupt("return", null);
case 25:
case "end":
return _context4.stop();
}
}, _callee4, null, [[3, 22]]);
}));
return _refreshVectorTileMetadata.apply(this, arguments);
}
function refreshRasterTileMetadata(_x5) {
return _refreshRasterTileMetadata.apply(this, arguments);
}
function _refreshRasterTileMetadata() {
_refreshRasterTileMetadata = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(datasetInfo) {
var _ref4, metadataUrl, pmtilesType, tileSource, rawMetadata, response, _rawMetadata, metadata;
return _regenerator["default"].wrap(function _callee5$(_context5) {
while (1) switch (_context5.prev = _context5.next) {
case 0:
_ref4 = datasetInfo.opts.metadata || {}, metadataUrl = _ref4.metadataUrl, pmtilesType = _ref4.pmtilesType;
if (!(typeof metadataUrl !== 'string')) {
_context5.next = 3;
break;
}
return _context5.abrupt("return", null);
case 3:
_context5.prev = 3;
if (!(pmtilesType === _constants.PMTilesType.RASTER)) {
_context5.next = 13;
break;
}
tileSource = _pmtiles.PMTilesSource.createDataSource(metadataUrl, {});
_context5.next = 8;
return tileSource.metadata;
case 8:
rawMetadata = _context5.sent;
if (!rawMetadata) {
_context5.next = 11;
break;
}
return _context5.abrupt("return", (0, _vectorTileUtils.parseVectorMetadata)(rawMetadata));
case 11:
_context5.next = 25;
break;
case 13:
_context5.next = 15;
return fetch(metadataUrl);
case 15:
response = _context5.sent;
if (response.ok) {
_context5.next = 18;
break;
}
throw new Error("Failed Fetch ".concat(metadataUrl));
case 18:
_context5.next = 20;
return response.json();
case 20:
_rawMetadata = _context5.sent;
metadata = (0, _rasterTileUtils.parseRasterMetadata)(_rawMetadata, {
allowCollections: true
});
if (!(metadata instanceof Error)) {
_context5.next = 24;
break;
}
throw new Error("Failed to parse metadata ".concat(metadata.message));
case 24:
return _context5.abrupt("return", metadata);
case 25:
_context5.next = 29;
break;
case 27:
_context5.prev = 27;
_context5.t0 = _context5["catch"](3);
case 29:
return _context5.abrupt("return", null);
case 30:
case "end":
return _context5.stop();
}
}, _callee5, null, [[3, 27]]);
}));
return _refreshRasterTileMetadata.apply(this, arguments);
}
function refreshWMSMetadata(_x6) {
return _refreshWMSMetadata.apply(this, arguments);
}
function _refreshWMSMetadata() {
_refreshWMSMetadata = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6(datasetInfo) {
var _ref5, remoteTileFormat, tilesetDataUrl, data;
return _regenerator["default"].wrap(function _callee6$(_context6) {
while (1) switch (_context6.prev = _context6.next) {
case 0:
_ref5 = datasetInfo.opts.metadata || {}, remoteTileFormat = _ref5.remoteTileFormat, tilesetDataUrl = _ref5.tilesetDataUrl;
if (!(remoteTileFormat !== _constants.RemoteTileFormat.WMS || typeof tilesetDataUrl !== 'string')) {
_context6.next = 3;
break;
}
return _context6.abrupt("return", null);
case 3:
_context6.prev = 3;
_context6.next = 6;
return getWMSCapabilities(tilesetDataUrl);
case 6:
data = _context6.sent;
return _context6.abrupt("return", wmsCapabilitiesToDatasetMetadata(data));
case 10:
_context6.prev = 10;
_context6.t0 = _context6["catch"](3);
case 12:
return _context6.abrupt("return", null);
case 13:
case "end":
return _context6.stop();
}
}, _callee6, null, [[3, 10]]);
}));
return _refreshWMSMetadata.apply(this, arguments);
}
function getWMSCapabilities(_x7) {
return _getWMSCapabilities.apply(this, arguments);
}
function _getWMSCapabilities() {
_getWMSCapabilities = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7(wsmUrl) {
return _regenerator["default"].wrap(function _callee7$(_context7) {
while (1) switch (_context7.prev = _context7.next) {
case 0:
_context7.next = 2;
return (0, _core.load)("".concat(wsmUrl, "?service=WMS&request=GetCapabilities"), _wms.WMSCapabilitiesLoader);
case 2:
return _context7.abrupt("return", _context7.sent);
case 3:
case "end":
return _context7.stop();
}
}, _callee7);
}));
return _getWMSCapabilities.apply(this, arguments);
}
function wmsCapabilitiesToDatasetMetadata(capabilities) {
// Flatten layers if they are nested
var layers = capabilities.layers.flatMap(function (layer) {
if (layer.layers && layer.layers.length > 0) {
return layer.layers;
}
return layer;
});
var availableLayers = [];
if (Array.isArray(layers)) {
availableLayers = layers.map(function (layer) {
var bb = layer.geographicBoundingBox;
var boundingBox = null;
if (Array.isArray(bb) && Array.isArray(bb[0]) && Array.isArray(bb[1])) {
boundingBox = [bb[0][0], bb[0][1], bb[1][0], bb[1][1]];
}
return {
name: layer.name,
title: layer.title || layer.name,
boundingBox: boundingBox,
queryable: layer.queryable
};
});
}
return {
layers: availableLayers,
version: capabilities.version || '1.3.0'
};
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdW5pcSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2tlcGxlclRhYmxlIiwiX3Rhc2tzIiwiX2NvbnN0YW50cyIsIl91dGlscyIsIl9jb3JlIiwiX3BtdGlsZXMiLCJfd21zIiwiX3RpbGVzZXRVdGlscyIsIl9yYXN0ZXJUaWxlVXRpbHMiLCJfdmVjdG9yVGlsZVV0aWxzIiwiX2V4Y2x1ZGVkIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJkYXRhc2V0Q29sb3JzIiwibWFwIiwiaGV4VG9SZ2IiLCJnZXROZXdEYXRhc2V0Q29sb3IiLCJkYXRhc2V0cyIsInByZXNldENvbG9ycyIsIlN0cmluZyIsInVzZWRDb2xvcnMiLCJ1bmlxIiwidmFsdWVzIiwiZCIsImNvbG9yIiwiYyIsImluY2x1ZGVzIiwiZGF0YXNldENvbG9yTWFrZXIiLCJuZXh0IiwidmFsdWUiLCJjcmVhdGVOZXdEYXRhRW50cnkiLCJfcmVmIiwiX2dldEFwcGxpY2F0aW9uQ29uZmlnIiwiaW5mbyIsImRhdGEiLCJvcHRzIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiIsInVuZGVmaW5lZCIsIlRhYmxlQ2xhc3MiLCJnZXRBcHBsaWNhdGlvbkNvbmZpZyIsInRhYmxlIiwiS2VwbGVyVGFibGUiLCJkYXRhVmFsaWRhdG9yIiwidmFsaWRhdGVJbnB1dERhdGEiLCJnZXRJbnB1dERhdGFWYWxpZGF0b3IiLCJ2YWxpZGF0ZWREYXRhIiwiaWQiLCJrZXBsZXJUYWJsZSIsIlVQREFURV9UQUJMRV9UQVNLIiwiQ1JFQVRFX1RBQkxFX1RBU0siLCJhcnJvd1RhYmxlIiwidXBkYXRlVGFibGUiLCJfeCIsIl91cGRhdGVUYWJsZSIsIl9hc3luY1RvR2VuZXJhdG9yMiIsIl9yZWdlbmVyYXRvciIsIm1hcmsiLCJfY2FsbGVlIiwiX3JlZjIiLCJ1cGRhdGVkIiwid3JhcCIsIl9jYWxsZWUkIiwiX2NvbnRleHQiLCJwcmV2IiwidXBkYXRlIiwic2VudCIsImFicnVwdCIsInN0b3AiLCJjcmVhdGVUYWJsZSIsIl94MiIsIl9jcmVhdGVUYWJsZSIsIl9jYWxsZWUyIiwiZGF0YXNldEluZm8iLCJfZ2V0QXBwbGljYXRpb25Db25maWcyIiwicmVmcmVzaGVkTWV0YWRhdGEiLCJtZXRhZGF0YSIsIl9jYWxsZWUyJCIsIl9jb250ZXh0MiIsInJlZnJlc2hSZW1vdGVEYXRhIiwiZmllbGRzIiwiaW1wb3J0RGF0YSIsInQwIiwiY29uc29sZSIsImVycm9yIiwiVGFzayIsImZyb21Qcm9taXNlIiwiX3gzIiwiX3JlZnJlc2hSZW1vdGVEYXRhIiwiX2NhbGxlZTMiLCJ0eXBlIiwiX2NhbGxlZTMkIiwiX2NvbnRleHQzIiwiRGF0YXNldFR5cGUiLCJWRUNUT1JfVElMRSIsIlJBU1RFUl9USUxFIiwiV01TX1RJTEUiLCJUSUxFXzNEIiwicmVmcmVzaFZlY3RvclRpbGVNZXRhZGF0YSIsInJlZnJlc2hSYXN0ZXJUaWxlTWV0YWRhdGEiLCJyZWZyZXNoV01TTWV0YWRhdGEiLCJfeDQiLCJfcmVmcmVzaFZlY3RvclRpbGVNZXRhZGF0YSIsIl9jYWxsZWU0IiwiX3JlZjMiLCJyZW1vdGVUaWxlRm9ybWF0IiwidGlsZXNldE1ldGFkYXRhVXJsIiwidGlsZXNldERhdGFVcmwiLCJyYXdNZXRhZGF0YSIsInRpbGVTb3VyY2UiLCJfY2FsbGVlNCQiLCJfY29udGV4dDQiLCJSZW1vdGVUaWxlRm9ybWF0IiwiUE1USUxFUyIsIk1WVCIsImdldE1WVE1ldGFkYXRhIiwiUE1UaWxlc1NvdXJjZSIsImNyZWF0ZURhdGFTb3VyY2UiLCJwYXJzZVZlY3Rvck1ldGFkYXRhIiwiZ2V0RmllbGRzRnJvbVRpbGUiLCJ0aWxlc2V0VXJsIiwibWV0YWRhdGFVcmwiLCJfeDUiLCJfcmVmcmVzaFJhc3RlclRpbGVNZXRhZGF0YSIsIl9jYWxsZWU1IiwiX3JlZjQiLCJwbXRpbGVzVHlwZSIsInJlc3BvbnNlIiwiX3Jhd01ldGFkYXRhIiwiX2NhbGxlZTUkIiwiX2NvbnRleHQ1IiwiUE1UaWxlc1R5cGUiLCJSQVNURVIiLCJmZXRjaCIsIm9rIiwiRXJyb3IiLCJjb25jYXQiLCJqc29uIiwicGFyc2VSYXN0ZXJNZXRhZGF0YSIsImFsbG93Q29sbGVjdGlvbnMiLCJtZXNzYWdlIiwiX3g2IiwiX3JlZnJlc2hXTVNNZXRhZGF0YSIsIl9jYWxsZWU2IiwiX3JlZjUiLCJfY2FsbGVlNiQiLCJfY29udGV4dDYiLCJXTVMiLCJnZXRXTVNDYXBhYmlsaXRpZXMiLCJ3bXNDYXBhYmlsaXRpZXNUb0RhdGFzZXRNZXRhZGF0YSIsIl94NyIsIl9nZXRXTVNDYXBhYmlsaXRpZXMiLCJfY2FsbGVlNyIsIndzbVVybCIsIl9jYWxsZWU3JCIsIl9jb250ZXh0NyIsImxvYWQiLCJXTVNDYXBhYmlsaXRpZXNMb2FkZXIiLCJjYXBhYmlsaXRpZXMiLCJsYXllcnMiLCJmbGF0TWFwIiwibGF5ZXIiLCJhdmFpbGFibGVMYXllcnMiLCJBcnJheSIsImlzQXJyYXkiLCJiYiIsImdlb2dyYXBoaWNCb3VuZGluZ0JveCIsImJvdW5kaW5nQm94IiwibmFtZSIsInRpdGxlIiwicXVlcnlhYmxlIiwidmVyc2lvbiJdLCJzb3VyY2VzIjpbIi4uL3NyYy9kYXRhc2V0LXV0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCB1bmlxIGZyb20gJ2xvZGFzaC91bmlxJztcbmltcG9ydCBLZXBsZXJUYWJsZSwge0RhdGFzZXRzfSBmcm9tICcuL2tlcGxlci10YWJsZSc7XG5pbXBvcnQge1Byb3RvRGF0YXNldCwgUkdCQ29sb3J9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuaW1wb3J0IFRhc2sgZnJvbSAncmVhY3QtcGFsbS90YXNrcyc7XG5cbmltcG9ydCB7XG4gIERhdGFzZXRUeXBlLFxuICBSYXN0ZXJUaWxlRGF0YXNldE1ldGFkYXRhLFxuICBQTVRpbGVzVHlwZSxcbiAgUmVtb3RlVGlsZUZvcm1hdCxcbiAgVmVjdG9yVGlsZURhdGFzZXRNZXRhZGF0YSxcbiAgV01TRGF0YXNldE1ldGFkYXRhXG59IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7XG4gIGhleFRvUmdiLFxuICB2YWxpZGF0ZUlucHV0RGF0YSxcbiAgZGF0YXNldENvbG9yTWFrZXIsXG4gIGdldEFwcGxpY2F0aW9uQ29uZmlnXG59IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuXG5pbXBvcnQge2xvYWR9IGZyb20gJ0Bsb2FkZXJzLmdsL2NvcmUnO1xuaW1wb3J0IHsvKiBNVlRTb3VyY2UsKi8gVGlsZUpTT059IGZyb20gJ0Bsb2FkZXJzLmdsL212dCc7XG5pbXBvcnQge1BNVGlsZXNTb3VyY2UsIFBNVGlsZXNNZXRhZGF0YX0gZnJvbSAnQGxvYWRlcnMuZ2wvcG10aWxlcyc7XG5pbXBvcnQge1dNU0NhcGFiaWxpdGllcywgV01TQ2FwYWJpbGl0aWVzTG9hZGVyfSBmcm9tICdAbG9hZGVycy5nbC93bXMnO1xuXG5pbXBvcnQge2dldE1WVE1ldGFkYXRhfSBmcm9tICcuL3RpbGVzZXQvdGlsZXNldC11dGlscyc7XG5pbXBvcnQge3BhcnNlUmFzdGVyTWV0YWRhdGF9IGZyb20gJy4vdGlsZXNldC9yYXN0ZXItdGlsZS11dGlscyc7XG5pbXBvcnQge1xuICBwYXJzZVZlY3Rvck1ldGFkYXRhLFxuICBnZXRGaWVsZHNGcm9tVGlsZSxcbiAgVmVjdG9yVGlsZU1ldGFkYXRhXG59IGZyb20gJy4vdGlsZXNldC92ZWN0b3ItdGlsZS11dGlscyc7XG5cbi8vIGFwcGx5IGEgY29sb3IgZm9yIGVhY2ggZGF0YXNldFxuLy8gdG8gdXNlIGFzIGxhYmVsIGNvbG9yc1xuY29uc3QgZGF0YXNldENvbG9ycyA9IFtcbiAgJyM4RjJGQkYnLFxuICAnIzAwNUNGRicsXG4gICcjQzA2Qzg0JyxcbiAgJyNGOEIxOTUnLFxuICAnIzU0N0E4MicsXG4gICcjM0VBQ0E4JyxcbiAgJyNBMkQ0QUInXG5dLm1hcChoZXhUb1JnYik7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROZXdEYXRhc2V0Q29sb3IoZGF0YXNldHM6IERhdGFzZXRzKTogUkdCQ29sb3Ige1xuICBjb25zdCBwcmVzZXRDb2xvcnMgPSBkYXRhc2V0Q29sb3JzLm1hcChTdHJpbmcpO1xuICBjb25zdCB1c2VkQ29sb3JzID0gdW5pcShPYmplY3QudmFsdWVzKGRhdGFzZXRzKS5tYXAoZCA9PiBTdHJpbmcoZC5jb2xvcikpKS5maWx0ZXIoYyA9PlxuICAgIHByZXNldENvbG9ycy5pbmNsdWRlcyhjKVxuICApO1xuXG4gIGlmICh1c2VkQ29sb3JzLmxlbmd0aCA9PT0gcHJlc2V0Q29sb3JzLmxlbmd0aCkge1xuICAgIC8vIGlmIHdlIGFscmVhZHkgZGVwbGV0ZWQgdGhlIHBvb2wgb2YgY29sb3JcbiAgICByZXR1cm4gZGF0YXNldENvbG9yTWFrZXIubmV4dCgpLnZhbHVlO1xuICB9XG5cbiAgbGV0IGNvbG9yID0gZGF0YXNldENvbG9yTWFrZXIubmV4dCgpLnZhbHVlO1xuICB3aGlsZSAodXNlZENvbG9ycy5pbmNsdWRlcyhTdHJpbmcoY29sb3IpKSkge1xuICAgIGNvbG9yID0gZGF0YXNldENvbG9yTWFrZXIubmV4dCgpLnZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIGNvbG9yO1xufVxuXG4vKipcbiAqIFRha2UgZGF0YXNldHMgcGF5bG9hZCBmcm9tIGFkZERhdGFUb01hcCwgY3JlYXRlIGRhdGFzZXRzIGVudHJ5IHNhdmUgdG8gdmlzU3RhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU5ld0RhdGFFbnRyeShcbiAge2luZm8sIGRhdGEsIC4uLm9wdHN9OiBQcm90b0RhdGFzZXQsXG4gIGRhdGFzZXRzOiBEYXRhc2V0cyA9IHt9XG4pOiBEYXRhc2V0cyB8IG51bGwge1xuICBjb25zdCBUYWJsZUNsYXNzID0gZ2V0QXBwbGljYXRpb25Db25maWcoKS50YWJsZSA/PyBLZXBsZXJUYWJsZTtcbiAgbGV0IGRhdGFWYWxpZGF0b3IgPSB2YWxpZGF0ZUlucHV0RGF0YTtcbiAgaWYgKHR5cGVvZiBUYWJsZUNsYXNzLmdldElucHV0RGF0YVZhbGlkYXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGRhdGFWYWxpZGF0b3IgPSBUYWJsZUNsYXNzLmdldElucHV0RGF0YVZhbGlkYXRvcigpO1xuICB9XG5cbiAgY29uc3QgdmFsaWRhdGVkRGF0YSA9IGRhdGFWYWxpZGF0b3IoZGF0YSk7XG4gIGlmICghdmFsaWRhdGVkRGF0YSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gY2hlY2sgaWYgZGF0YXNldCBhbHJlYWR5IGV4aXN0cywgYW5kIHVwZGF0ZSBpdCB3aGVuIGxvYWRpbmcgZGF0YSBieSBiYXRjaGVzIGluY3JlbWVudGFsbHlcbiAgaWYgKGluZm8gJiYgaW5mby5pZCAmJiBkYXRhc2V0c1tpbmZvLmlkXSkge1xuICAgIC8vIGdldCBrZXBsZXJUYWJsZSBmcm9tIGRhdGFzZXRzXG4gICAgY29uc3Qga2VwbGVyVGFibGUgPSBkYXRhc2V0c1tpbmZvLmlkXTtcbiAgICAvLyB1cGRhdGUgdGhlIGRhdGEgaW4ga2VwbGVyVGFibGVcbiAgICByZXR1cm4gVVBEQVRFX1RBQkxFX1RBU0soe3RhYmxlOiBrZXBsZXJUYWJsZSwgZGF0YTogdmFsaWRhdGVkRGF0YX0pO1xuICB9XG5cbiAgaW5mbyA9IGluZm8gfHwge307XG4gIGNvbnN0IGNvbG9yID0gaW5mby5jb2xvciB8fCBnZXROZXdEYXRhc2V0Q29sb3IoZGF0YXNldHMpO1xuXG4gIHJldHVybiBDUkVBVEVfVEFCTEVfVEFTSyh7XG4gICAgaW5mbyxcbiAgICBjb2xvcixcbiAgICBvcHRzLFxuICAgIGRhdGE6IGRhdGEuYXJyb3dUYWJsZSA/IHsuLi52YWxpZGF0ZWREYXRhLCBhcnJvd1RhYmxlOiBkYXRhLmFycm93VGFibGV9IDogdmFsaWRhdGVkRGF0YVxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlVGFibGUoe3RhYmxlLCBkYXRhfSkge1xuICBjb25zdCB1cGRhdGVkID0gYXdhaXQgdGFibGUudXBkYXRlKGRhdGEpOyAvLyBBc3N1bWluZyBgdGFibGVgIGhhcyBhbiBgdXBkYXRlYCBtZXRob2RcbiAgcmV0dXJuIHVwZGF0ZWQ7XG59XG5cbnR5cGUgQ3JlYXRlVGFibGVQcm9wcyA9IHtcbiAgaW5mbzogYW55O1xuICBjb2xvcjogUkdCQ29sb3I7XG4gIG9wdHM6IHtcbiAgICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9O1xuICBkYXRhOiBhbnk7XG59O1xuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVUYWJsZShkYXRhc2V0SW5mbzogQ3JlYXRlVGFibGVQcm9wcykge1xuICBjb25zdCB7aW5mbywgY29sb3IsIG9wdHMsIGRhdGF9ID0gZGF0YXNldEluZm87XG5cbiAgLy8gdXBkYXRlIG1ldGFkYXRhIGZvciByZW1vdGUgdGlsZWQgZGF0YXNldHNcbiAgY29uc3QgcmVmcmVzaGVkTWV0YWRhdGEgPSBhd2FpdCByZWZyZXNoUmVtb3RlRGF0YShkYXRhc2V0SW5mbyk7XG4gIGxldCBtZXRhZGF0YSA9IG9wdHMubWV0YWRhdGE7XG4gIGlmIChyZWZyZXNoZWRNZXRhZGF0YSkge1xuICAgIG1ldGFkYXRhID0gey4uLm9wdHMubWV0YWRhdGEsIC4uLnJlZnJlc2hlZE1ldGFkYXRhfTtcbiAgICBpZiAobWV0YWRhdGEuZmllbGRzKSB7XG4gICAgICBkYXRhLmZpZWxkcyA9IG1ldGFkYXRhLmZpZWxkcztcbiAgICB9XG4gIH1cblxuICBjb25zdCBUYWJsZUNsYXNzID0gZ2V0QXBwbGljYXRpb25Db25maWcoKS50YWJsZSA/PyBLZXBsZXJUYWJsZTtcbiAgY29uc3QgdGFibGUgPSBuZXcgVGFibGVDbGFzcyh7XG4gICAgaW5mbyxcbiAgICBjb2xvcixcbiAgICAuLi5vcHRzLFxuICAgIG1ldGFkYXRhXG4gIH0pO1xuICB0cnkge1xuICAgIGF3YWl0IHRhYmxlLmltcG9ydERhdGEoe2RhdGF9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIHRhYmxlJywgZXJyb3IpO1xuICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgcmV0dXJuIHRhYmxlO1xufVxuY29uc3QgVVBEQVRFX1RBQkxFX1RBU0sgPSBUYXNrLmZyb21Qcm9taXNlKHVwZGF0ZVRhYmxlLCAnVVBEQVRFX1RBQkxFX1RBU0snKTtcbmNvbnN0IENSRUFURV9UQUJMRV9UQVNLID0gVGFzay5mcm9tUHJvbWlzZShjcmVhdGVUYWJsZSwgJ0NSRUFURV9UQUJMRV9UQVNLJyk7XG5cbi8qKlxuICogRmV0Y2ggbWV0YWRhdGEgZm9yIHZlY3RvciB0aWxlIGxheWVycyB1c2luZyB0aWxlc2V0TWV0YWRhdGFVcmwgZnJvbSBtZXRhZGF0YVxuICogQHBhcmFtIGRhdGFzZXRJbmZvXG4gKiBAcmV0dXJuc1xuICovXG5hc3luYyBmdW5jdGlvbiByZWZyZXNoUmVtb3RlRGF0YShkYXRhc2V0SW5mbzogQ3JlYXRlVGFibGVQcm9wcyk6IFByb21pc2U8b2JqZWN0IHwgbnVsbD4ge1xuICBjb25zdCB7dHlwZX0gPSBkYXRhc2V0SW5mby5pbmZvO1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIERhdGFzZXRUeXBlLlZFQ1RPUl9USUxFOlxuICAgICAgcmV0dXJuIGF3YWl0IHJlZnJlc2hWZWN0b3JUaWxlTWV0YWRhdGEoZGF0YXNldEluZm8pO1xuICAgIGNhc2UgRGF0YXNldFR5cGUuUkFTVEVSX1RJTEU6XG4gICAgICByZXR1cm4gYXdhaXQgcmVmcmVzaFJhc3RlclRpbGVNZXRhZGF0YShkYXRhc2V0SW5mbyk7XG4gICAgY2FzZSBEYXRhc2V0VHlwZS5XTVNfVElMRTpcbiAgICAgIHJldHVybiBhd2FpdCByZWZyZXNoV01TTWV0YWRhdGEoZGF0YXNldEluZm8pO1xuICAgIGNhc2UgRGF0YXNldFR5cGUuVElMRV8zRDpcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZWZyZXNoVmVjdG9yVGlsZU1ldGFkYXRhKFxuICBkYXRhc2V0SW5mbzogQ3JlYXRlVGFibGVQcm9wc1xuKTogUHJvbWlzZTxWZWN0b3JUaWxlTWV0YWRhdGEgfCBudWxsPiB7XG4gIGNvbnN0IHtyZW1vdGVUaWxlRm9ybWF0LCB0aWxlc2V0TWV0YWRhdGFVcmwsIHRpbGVzZXREYXRhVXJsfSA9XG4gICAgKGRhdGFzZXRJbmZvLm9wdHMubWV0YWRhdGEgYXMgVmVjdG9yVGlsZURhdGFzZXRNZXRhZGF0YSkgfHwge307XG5cbiAgaWYgKFxuICAgICEocmVtb3RlVGlsZUZvcm1hdCA9PT0gUmVtb3RlVGlsZUZvcm1hdC5QTVRJTEVTIHx8IHJlbW90ZVRpbGVGb3JtYXQgPT09IFJlbW90ZVRpbGVGb3JtYXQuTVZUKSB8fFxuICAgIHR5cGVvZiB0aWxlc2V0TWV0YWRhdGFVcmwgIT09ICdzdHJpbmcnIHx8XG4gICAgdHlwZW9mIHRpbGVzZXREYXRhVXJsICE9PSAnc3RyaW5nJ1xuICApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgbGV0IHJhd01ldGFkYXRhOiBQTVRpbGVzTWV0YWRhdGEgfCBUaWxlSlNPTiB8IG51bGwgPSBudWxsO1xuICAgIGlmIChyZW1vdGVUaWxlRm9ybWF0ID09PSBSZW1vdGVUaWxlRm9ybWF0Lk1WVCkge1xuICAgICAgcmF3TWV0YWRhdGEgPSBhd2FpdCBnZXRNVlRNZXRhZGF0YSh0aWxlc2V0TWV0YWRhdGFVcmwpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0aWxlU291cmNlID0gUE1UaWxlc1NvdXJjZS5jcmVhdGVEYXRhU291cmNlKHRpbGVzZXRNZXRhZGF0YVVybCwge30pO1xuICAgICAgcmF3TWV0YWRhdGEgPSBhd2FpdCB0aWxlU291cmNlLm1ldGFkYXRhO1xuICAgIH1cblxuICAgIGlmIChyYXdNZXRhZGF0YSkge1xuICAgICAgY29uc3QgbWV0YWRhdGEgPSBwYXJzZVZlY3Rvck1ldGFkYXRhKHJhd01ldGFkYXRhKTtcblxuICAgICAgYXdhaXQgZ2V0RmllbGRzRnJvbVRpbGUoe1xuICAgICAgICByZW1vdGVUaWxlRm9ybWF0LFxuICAgICAgICB0aWxlc2V0VXJsOiB0aWxlc2V0RGF0YVVybCxcbiAgICAgICAgbWV0YWRhdGFVcmw6IHRpbGVzZXRNZXRhZGF0YVVybCxcbiAgICAgICAgbWV0YWRhdGFcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gbWV0YWRhdGE7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBpZ25vcmUgZm9yIG5vdywgYW5kIHVzZSBvbGQgbWV0YWRhdGFcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVmcmVzaFJhc3RlclRpbGVNZXRhZGF0YShkYXRhc2V0SW5mbzogQ3JlYXRlVGFibGVQcm9wcyk6IFByb21pc2U8YW55IHwgbnVsbD4ge1xuICBjb25zdCB7bWV0YWRhdGFVcmwsIHBtdGlsZXNUeXBlfSA9IChkYXRhc2V0SW5mby5vcHRzLm1ldGFkYXRhIGFzIFJhc3RlclRpbGVEYXRhc2V0TWV0YWRhdGEpIHx8IHt9O1xuXG4gIGlmICh0eXBlb2YgbWV0YWRhdGFVcmwgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB0cnkge1xuICAgIGlmIChwbXRpbGVzVHlwZSA9PT0gUE1UaWxlc1R5cGUuUkFTVEVSKSB7XG4gICAgICBjb25zdCB0aWxlU291cmNlID0gUE1UaWxlc1NvdXJjZS5jcmVhdGVEYXRhU291cmNlKG1ldGFkYXRhVXJsLCB7fSk7XG4gICAgICBjb25zdCByYXdNZXRhZGF0YTogUE1UaWxlc01ldGFkYXRhID0gYXdhaXQgdGlsZVNvdXJjZS5tZXRhZGF0YTtcblxuICAgICAgaWYgKHJhd01ldGFkYXRhKSB7XG4gICAgICAgIHJldHVybiBwYXJzZVZlY3Rvck1ldGFkYXRhKHJhd01ldGFkYXRhKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaXQncyBzdGFjIHJhc3RlciB0aWxlc1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChtZXRhZGF0YVVybCk7XG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIEZldGNoICR7bWV0YWRhdGFVcmx9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCByYXdNZXRhZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgICAgY29uc3QgbWV0YWRhdGEgPSBwYXJzZVJhc3Rlck1ldGFkYXRhKHJhd01ldGFkYXRhLCB7YWxsb3dDb2xsZWN0aW9uczogdHJ1ZX0pO1xuICAgICAgaWYgKG1ldGFkYXRhIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcGFyc2UgbWV0YWRhdGEgJHttZXRhZGF0YS5tZXNzYWdlfWApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWV0YWRhdGE7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBpZ25vcmUgZm9yIG5vdywgYW5kIHVzZSBvbGQgbWV0YWRhdGFcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVmcmVzaFdNU01ldGFkYXRhKGRhdGFzZXRJbmZvOiBDcmVhdGVUYWJsZVByb3BzKTogUHJvbWlzZTxhbnkgfCBudWxsPiB7XG4gIGNvbnN0IHtyZW1vdGVUaWxlRm9ybWF0LCB0aWxlc2V0RGF0YVVybH0gPVxuICAgIChkYXRhc2V0SW5mby5vcHRzLm1ldGFkYXRhIGFzIFdNU0RhdGFzZXRNZXRhZGF0YSkgfHwge307XG5cbiAgaWYgKHJlbW90ZVRpbGVGb3JtYXQgIT09IFJlbW90ZVRpbGVGb3JtYXQuV01TIHx8IHR5cGVvZiB0aWxlc2V0RGF0YVVybCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IGdldFdNU0NhcGFiaWxpdGllcyh0aWxlc2V0RGF0YVVybCk7XG4gICAgcmV0dXJuIHdtc0NhcGFiaWxpdGllc1RvRGF0YXNldE1ldGFkYXRhKGRhdGEpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICAvLyBpZ25vcmUgZm9yIG5vdywgYW5kIHVzZSBvbGQgbWV0YWRhdGFcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFdNU0NhcGFiaWxpdGllcyh3c21Vcmw6IHN0cmluZyk6IFByb21pc2U8V01TQ2FwYWJpbGl0aWVzPiB7XG4gIHJldHVybiAoYXdhaXQgbG9hZChcbiAgICBgJHt3c21Vcmx9P3NlcnZpY2U9V01TJnJlcXVlc3Q9R2V0Q2FwYWJpbGl0aWVzYCxcbiAgICBXTVNDYXBhYmlsaXRpZXNMb2FkZXJcbiAgKSkgYXMgV01TQ2FwYWJpbGl0aWVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd21zQ2FwYWJpbGl0aWVzVG9EYXRhc2V0TWV0YWRhdGEoY2FwYWJpbGl0aWVzOiBXTVNDYXBhYmlsaXRpZXMpOiBhbnkgfCBudWxsIHtcbiAgLy8gRmxhdHRlbiBsYXllcnMgaWYgdGhleSBhcmUgbmVzdGVkXG4gIGNvbnN0IGxheWVycyA9IGNhcGFiaWxpdGllcy5sYXllcnMuZmxhdE1hcChsYXllciA9PiB7XG4gICAgaWYgKGxheWVyLmxheWVycyAmJiBsYXllci5sYXllcnMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGxheWVyLmxheWVycztcbiAgICB9XG4gICAgcmV0dXJuIGxheWVyO1xuICB9KTtcblxuICBsZXQgYXZhaWxhYmxlTGF5ZXJzOiBXTVNEYXRhc2V0TWV0YWRhdGFbJ2xheWVycyddID0gW107XG4gIGlmIChBcnJheS5pc0FycmF5KGxheWVycykpIHtcbiAgICBhdmFpbGFibGVMYXllcnMgPSBsYXllcnMubWFwKChsYXllcjogYW55KSA9PiB7XG4gICAgICBjb25zdCBiYiA9IGxheWVyLmdlb2dyYXBoaWNCb3VuZGluZ0JveDtcblxuICAgICAgbGV0IGJvdW5kaW5nQm94OiBudW1iZXJbXSB8IG51bGwgPSBudWxsO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYmIpICYmIEFycmF5LmlzQXJyYXkoYmJbMF0pICYmIEFycmF5LmlzQXJyYXkoYmJbMV0pKSB7XG4gICAgICAgIGJvdW5kaW5nQm94ID0gW2JiWzBdWzBdLCBiYlswXVsxXSwgYmJbMV1bMF0sIGJiWzFdWzFdXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogbGF5ZXIubmFtZSxcbiAgICAgICAgdGl0bGU6IGxheWVyLnRpdGxlIHx8IGxheWVyLm5hbWUsXG4gICAgICAgIGJvdW5kaW5nQm94LFxuICAgICAgICBxdWVyeWFibGU6IGxheWVyLnF1ZXJ5YWJsZVxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbGF5ZXJzOiBhdmFpbGFibGVMYXllcnMsXG4gICAgdmVyc2lvbjogY2FwYWJpbGl0aWVzLnZlcnNpb24gfHwgJzEuMy4wJ1xuICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLEtBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFlBQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFFLE1BQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFHLFVBQUEsR0FBQUgsT0FBQTtBQVFBLElBQUFJLE1BQUEsR0FBQUosT0FBQTtBQU9BLElBQUFLLEtBQUEsR0FBQUwsT0FBQTtBQUVBLElBQUFNLFFBQUEsR0FBQU4sT0FBQTtB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