kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
244 lines (199 loc) • 23.7 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.readFile = readFile;
exports.getFileHandler = getFileHandler;
exports.getFileType = getFileType;
exports.loadCsv = loadCsv;
exports.loadJSON = loadJSON;
exports.readJSONFile = readJSONFile;
exports.isGeoJson = isGeoJson;
exports.isFeature = isFeature;
exports.isFeatureCollection = isFeatureCollection;
exports.isRowObject = isRowObject;
exports.isKeplerGlMap = isKeplerGlMap;
exports.determineJsonProcess = determineJsonProcess;
exports.filesToDataPayload = filesToDataPayload;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _window = require("global/window");
var _console = _interopRequireDefault(require("global/console"));
var _dataProcessor = require("./data-processor");
var _utils = require("../utils/utils");
var _defaultSettings = require("../constants/default-settings");
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
var FILE_HANDLERS = {
csv: loadCsv,
json: loadJSON
};
function readFile(_ref) {
var file = _ref.file,
_ref$fileCache = _ref.fileCache,
fileCache = _ref$fileCache === void 0 ? [] : _ref$fileCache;
return new Promise(function (resolve, reject) {
var _getFileHandler = getFileHandler(file),
handler = _getFileHandler.handler,
format = _getFileHandler.format;
if (!handler) {
_console["default"].warn("Canont determine file handler for file ".concat(file.name, ". It must have a valid file extension"));
resolve(fileCache);
}
handler({
file: file,
format: format
}).then(function (result) {
if (!result || !result.data) {
// return fileCache, to keep process other files
resolve(fileCache);
}
resolve([].concat((0, _toConsumableArray2["default"])(fileCache), [{
data: result.data,
info: {
label: file.name,
format: result.format
}
}]));
});
});
}
function getFileHandler(fileBlob) {
var type = getFileType(fileBlob.name);
return {
handler: FILE_HANDLERS[type],
format: type
};
}
function getFileType(filename) {
if (filename.endsWith('csv')) {
return 'csv';
} else if (filename.endsWith('json') || filename.endsWith('geojson')) {
// Read GeoJson from browser
return 'json';
} // Wait to add other file type handler
return 'other';
}
function readCSVFile(fileBlob) {
return new Promise(function (resolve, reject) {
var fileReader = new _window.FileReader();
fileReader.onload = function (_ref2) {
var result = _ref2.target.result;
resolve(result);
};
fileReader.readAsText(fileBlob);
});
}
function loadCsv(_ref3) {
var file = _ref3.file,
format = _ref3.format,
_ref3$processor = _ref3.processor,
processor = _ref3$processor === void 0 ? _dataProcessor.processCsvData : _ref3$processor;
return readCSVFile(file).then(function (rawData) {
return rawData ? {
data: processor(rawData),
format: format
} : null;
});
}
function loadJSON(_ref4) {
var file = _ref4.file,
_ref4$processor = _ref4.processor,
processor = _ref4$processor === void 0 ? _dataProcessor.processGeojson : _ref4$processor;
return readJSONFile(file).then(function (content) {
if (isKeplerGlMap(content)) {
return {
format: _defaultSettings.DATASET_FORMATS.keplergl,
data: (0, _dataProcessor.processKeplerglJSON)(content)
};
} else if (isRowObject(content)) {
return {
format: _defaultSettings.DATASET_FORMATS.row,
data: (0, _dataProcessor.processRowObject)(content)
};
} else if (isGeoJson(content)) {
return {
format: _defaultSettings.DATASET_FORMATS.geojson,
data: (0, _dataProcessor.processGeojson)(content)
};
} // unsupported json format
_console["default"].warn("unsupported Json format ".concat(file.name));
return null;
});
}
function readJSONFile(fileBlob) {
return new Promise(function (resolve, reject) {
var fileReader = new _window.FileReader();
fileReader.onload = function (_ref5) {
var result = _ref5.target.result;
try {
var json = JSON.parse(result);
resolve(json);
} catch (err) {
reject(null);
}
};
fileReader.readAsText(fileBlob, 'UTF-8');
});
}
function isGeoJson(json) {
// json can be feature collection
// or simgle feature
return (0, _utils.isPlainObject)(json) && (isFeature(json) || isFeatureCollection(json));
}
function isFeature(json) {
return json.type === 'Feature' && json.geometry;
}
function isFeatureCollection(json) {
return json.type === 'FeatureCollection' && json.features;
}
function isRowObject(json) {
return Array.isArray(json) && (0, _utils.isPlainObject)(json[0]);
}
function isKeplerGlMap(json) {
return (0, _utils.isPlainObject)(json) && json.datasets && json.config && json.info && json.info.app === 'kepler.gl';
}
function determineJsonProcess(_ref6, defaultProcessor) {
var dataset = _ref6.dataset,
format = _ref6.format;
if (isKeplerGlMap(dataset)) {
return _dataProcessor.processKeplerglJSON;
}
return defaultProcessor;
}
function filesToDataPayload(fileCache) {
// seperate out files which could be a single datasets. or a keplergl map json
var collection = fileCache.reduce(function (accu, file) {
var data = file.data,
_file$info = file.info,
info = _file$info === void 0 ? {} : _file$info;
var format = info.format;
if (format === _defaultSettings.DATASET_FORMATS.keplergl) {
// if file contains a single kepler map dataset & config
accu.keplerMaps.push(_objectSpread({}, data, {
options: {
centerMap: !(data.config && data.config.mapState)
}
}));
} else if (_defaultSettings.DATASET_FORMATS[format]) {
// if file contains only data
var newDataset = {
data: data,
info: _objectSpread({
id: info.id || (0, _utils.generateHashId)(4)
}, info)
};
accu.datasets.push(newDataset);
}
return accu;
}, {
datasets: [],
keplerMaps: []
}); // add kepler map first with config
// add datasets later in one add data call
return collection.keplerMaps.concat({
datasets: collection.datasets
});
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcm9jZXNzb3JzL2ZpbGUtaGFuZGxlci5qcyJdLCJuYW1lcyI6WyJGSUxFX0hBTkRMRVJTIiwiY3N2IiwibG9hZENzdiIsImpzb24iLCJsb2FkSlNPTiIsInJlYWRGaWxlIiwiZmlsZSIsImZpbGVDYWNoZSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiZ2V0RmlsZUhhbmRsZXIiLCJoYW5kbGVyIiwiZm9ybWF0IiwiQ29uc29sZSIsIndhcm4iLCJuYW1lIiwidGhlbiIsInJlc3VsdCIsImRhdGEiLCJpbmZvIiwibGFiZWwiLCJmaWxlQmxvYiIsInR5cGUiLCJnZXRGaWxlVHlwZSIsImZpbGVuYW1lIiwiZW5kc1dpdGgiLCJyZWFkQ1NWRmlsZSIsImZpbGVSZWFkZXIiLCJGaWxlUmVhZGVyIiwib25sb2FkIiwidGFyZ2V0IiwicmVhZEFzVGV4dCIsInByb2Nlc3NvciIsInByb2Nlc3NDc3ZEYXRhIiwicmF3RGF0YSIsInByb2Nlc3NHZW9qc29uIiwicmVhZEpTT05GaWxlIiwiY29udGVudCIsImlzS2VwbGVyR2xNYXAiLCJEQVRBU0VUX0ZPUk1BVFMiLCJrZXBsZXJnbCIsImlzUm93T2JqZWN0Iiwicm93IiwiaXNHZW9Kc29uIiwiZ2VvanNvbiIsIkpTT04iLCJwYXJzZSIsImVyciIsImlzRmVhdHVyZSIsImlzRmVhdHVyZUNvbGxlY3Rpb24iLCJnZW9tZXRyeSIsImZlYXR1cmVzIiwiQXJyYXkiLCJpc0FycmF5IiwiZGF0YXNldHMiLCJjb25maWciLCJhcHAiLCJkZXRlcm1pbmVKc29uUHJvY2VzcyIsImRlZmF1bHRQcm9jZXNzb3IiLCJkYXRhc2V0IiwicHJvY2Vzc0tlcGxlcmdsSlNPTiIsImZpbGVzVG9EYXRhUGF5bG9hZCIsImNvbGxlY3Rpb24iLCJyZWR1Y2UiLCJhY2N1Iiwia2VwbGVyTWFwcyIsInB1c2giLCJvcHRpb25zIiwiY2VudGVyTWFwIiwibWFwU3RhdGUiLCJuZXdEYXRhc2V0IiwiaWQiLCJjb25jYXQiXSwi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QSxTQUFTLEVBQUUsRUFBRWxELElBQUksQ0FBQ3FDLE1BQUwsSUFBZXJDLElBQUksQ0FBQ3FDLE1BQUwsQ0FBWWMsUUFBN0I7QUFESjtBQUZYO0FBTUQsS0FSRCxNQVFPLElBQUk5QixpQ0FBZ0IzQixNQUFoQixDQUFKLEVBQTZCO0FBQ2xDO0FBQ0EsVUFBTTBELFVBQVUsR0FBRztBQUNqQnBELFFBQUFBLElBQUksRUFBSkEsSUFEaUI7QUFFakJDLFFBQUFBLElBQUk7QUFDRm9ELFVBQUFBLEVBQUUsRUFBRXBELElBQUksQ0FBQ29ELEVBQUwsSUFBVywyQkFBZSxDQUFmO0FBRGIsV0FFQ3BELElBRkQ7QUFGYSxPQUFuQjtBQU9BNkMsTUFBQUEsSUFBSSxDQUFDVixRQUFMLENBQWNZLElBQWQsQ0FBbUJJLFVBQW5CO0FBQ0Q7O0FBQ0QsV0FBT04sSUFBUDtBQUNELEdBeEJnQixFQXlCakI7QUFBQ1YsSUFBQUEsUUFBUSxFQUFFLEVBQVg7QUFBZVcsSUFBQUEsVUFBVSxFQUFFO0FBQTNCLEdBekJpQixDQUFuQixDQUY0QyxDQThCNUM7QUFDQTs7QUFDQSxTQUFPSCxVQUFVLENBQUNHLFVBQVgsQ0FBc0JPLE1BQXRCLENBQTZCO0FBQUNsQixJQUFBQSxRQUFRLEVBQUVRLFVBQVUsQ0FBQ1I7QUFBdEIsR0FBN0IsQ0FBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIwIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHtGaWxlUmVhZGVyfSBmcm9tICdnbG9iYWwvd2luZG93JztcbmltcG9ydCBDb25zb2xlIGZyb20gJ2dsb2JhbC9jb25zb2xlJztcbmltcG9ydCB7XG4gIHByb2Nlc3NDc3ZEYXRhLFxuICBwcm9jZXNzR2VvanNvbixcbiAgcHJvY2Vzc0tlcGxlcmdsSlNPTixcbiAgcHJvY2Vzc1Jvd09iamVjdFxufSBmcm9tICcuL2RhdGEtcHJvY2Vzc29yJztcbmltcG9ydCB7aXNQbGFpbk9iamVjdCwgZ2VuZXJhdGVIYXNoSWR9IGZyb20gJ3V0aWxzL3V0aWxzJztcbmltcG9ydCB7REFUQVNFVF9GT1JNQVRTfSBmcm9tICdjb25zdGFudHMvZGVmYXVsdC1zZXR0aW5ncyc7XG5cbmNvbnN0IEZJTEVfSEFORExFUlMgPSB7XG4gIGNzdjogbG9hZENzdixcbiAganNvbjogbG9hZEpTT05cbn07XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkRmlsZSh7ZmlsZSwgZmlsZUNhY2hlID0gW119KSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qge2hhbmRsZXIsIGZvcm1hdH0gPSBnZXRGaWxlSGFuZGxlcihmaWxlKTtcbiAgICBpZiAoIWhhbmRsZXIpIHtcbiAgICAgIENvbnNvbGUud2FybihcbiAgICAgICAgYENhbm9udCBkZXRlcm1pbmUgZmlsZSBoYW5kbGVyIGZvciBmaWxlICR7ZmlsZS5uYW1lfS4gSXQgbXVzdCBoYXZlIGEgdmFsaWQgZmlsZSBleHRlbnNpb25gXG4gICAgICApO1xuICAgICAgcmVzb2x2ZShmaWxlQ2FjaGUpO1xuICAgIH1cblxuICAgIGhhbmRsZXIoe2ZpbGUsIGZvcm1hdH0pLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgIGlmICghcmVzdWx0IHx8ICFyZXN1bHQuZGF0YSkge1xuICAgICAgICAvLyByZXR1cm4gZmlsZUNhY2hlLCB0byBrZWVwIHByb2Nlc3Mgb3RoZXIgZmlsZXNcbiAgICAgICAgcmVzb2x2ZShmaWxlQ2FjaGUpO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZShbXG4gICAgICAgIC4uLmZpbGVDYWNoZSxcbiAgICAgICAge1xuICAgICAgICAgIGRhdGE6IHJlc3VsdC5kYXRhLFxuICAgICAgICAgIGluZm86IHtcbiAgICAgICAgICAgIGxhYmVsOiBmaWxlLm5hbWUsXG4gICAgICAgICAgICBmb3JtYXQ6IHJlc3VsdC5mb3JtYXRcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF0pO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpbGVIYW5kbGVyKGZpbGVCbG9iKSB7XG4gIGNvbnN0IHR5cGUgPSBnZXRGaWxlVHlwZShmaWxlQmxvYi5uYW1lKTtcblxuICByZXR1cm4ge2hhbmRsZXI6IEZJTEVfSEFORExFUlNbdHlwZV0sIGZvcm1hdDogdHlwZX07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWxlVHlwZShmaWxlbmFtZSkge1xuICBpZiAoZmlsZW5hbWUuZW5kc1dpdGgoJ2NzdicpKSB7XG4gICAgcmV0dXJuICdjc3YnO1xuICB9IGVsc2UgaWYgKGZpbGVuYW1lLmVuZHNXaXRoKCdqc29uJykgfHwgZmlsZW5hbWUuZW5kc1dpdGgoJ2dlb2pzb24nKSkge1xuICAgIC8vIFJlYWQgR2VvSnNvbiBmcm9tIGJyb3dzZXJcbiAgICByZXR1cm4gJ2pzb24nO1xuICB9XG5cbiAgLy8gV2FpdCB0byBhZGQgb3RoZXIgZmlsZSB0eXBlIGhhbmRsZXJcbiAgcmV0dXJuICdvdGhlcic7XG59XG5cbmZ1bmN0aW9uIHJlYWRDU1ZGaWxlKGZpbGVCbG9iKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgZmlsZVJlYWRlci5vbmxvYWQgPSAoe3RhcmdldDoge3Jlc3VsdH19KSA9PiB7XG4gICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgfTtcblxuICAgIGZpbGVSZWFkZXIucmVhZEFzVGV4dChmaWxlQmxvYik7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbG9hZENzdih7ZmlsZSwgZm9ybWF0LCBwcm9jZXNzb3IgPSBwcm9jZXNzQ3N2RGF0YX0pIHtcbiAgcmV0dXJuIHJlYWRDU1ZGaWxlKGZpbGUpLnRoZW4ocmF3RGF0YSA9PiAocmF3RGF0YSA/IHtkYXRhOiBwcm9jZXNzb3IocmF3RGF0YSksIGZvcm1hdH0gOiBudWxsKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkSlNPTih7ZmlsZSwgcHJvY2Vzc29yID0gcHJvY2Vzc0dlb2pzb259KSB7XG4gIHJldHVybiByZWFkSlNPTkZpbGUoZmlsZSkudGhlbihjb250ZW50ID0+IHtcbiAgICBpZiAoaXNLZXBsZXJHbE1hcChjb250ZW50KSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZm9ybWF0OiBEQVRBU0VUX0ZPUk1BVFMua2VwbGVyZ2wsXG4gICAgICAgIGRhdGE6IHByb2Nlc3NLZXBsZXJnbEpTT04oY29udGVudClcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChpc1Jvd09iamVjdChjb250ZW50KSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZm9ybWF0OiBEQVRBU0VUX0ZPUk1BVFMucm93LFxuICAgICAgICBkYXRhOiBwcm9jZXNzUm93T2JqZWN0KGNvbnRlbnQpXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoaXNHZW9Kc29uKGNvbnRlbnQpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBmb3JtYXQ6IERBVEFTRVRfRk9STUFUUy5nZW9qc29uLFxuICAgICAgICBkYXRhOiBwcm9jZXNzR2VvanNvbihjb250ZW50KVxuICAgICAgfTtcbiAgICB9XG4gICAgLy8gdW5zdXBwb3J0ZWQganNvbiBmb3JtYXRcbiAgICBDb25zb2xlLndhcm4oYHVuc3VwcG9ydGVkIEpzb24gZm9ybWF0ICR7ZmlsZS5uYW1lfWApO1xuICAgIHJldHVybiBudWxsO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRKU09ORmlsZShmaWxlQmxvYikge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IGZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgIGZpbGVSZWFkZXIub25sb2FkID0gKHt0YXJnZXQ6IHtyZXN1bHR9fSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QganNvbiA9IEpTT04ucGFyc2UocmVzdWx0KTtcbiAgICAgICAgcmVzb2x2ZShqc29uKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZWplY3QobnVsbCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZpbGVSZWFkZXIucmVhZEFzVGV4dChmaWxlQmxvYiwgJ1VURi04Jyk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNHZW9Kc29uKGpzb24pIHtcbiAgLy8ganNvbiBjYW4gYmUgZmVhdHVyZSBjb2xsZWN0aW9uXG4gIC8vIG9yIHNpbWdsZSBmZWF0dXJlXG4gIHJldHVybiBpc1BsYWluT2JqZWN0KGpzb24pICYmIChpc0ZlYXR1cmUoanNvbikgfHwgaXNGZWF0dXJlQ29sbGVjdGlvbihqc29uKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0ZlYXR1cmUoanNvbikge1xuICByZXR1cm4ganNvbi50eXBlID09PSAnRmVhdHVyZScgJiYganNvbi5nZW9tZXRyeTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRmVhdHVyZUNvbGxlY3Rpb24oanNvbikge1xuICByZXR1cm4ganNvbi50eXBlID09PSAnRmVhdHVyZUNvbGxlY3Rpb24nICYmIGpzb24uZmVhdHVyZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1Jvd09iamVjdChqc29uKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGpzb24pICYmIGlzUGxhaW5PYmplY3QoanNvblswXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0tlcGxlckdsTWFwKGpzb24pIHtcbiAgcmV0dXJuIChcbiAgICBpc1BsYWluT2JqZWN0KGpzb24pICYmXG4gICAganNvbi5kYXRhc2V0cyAmJlxuICAgIGpzb24uY29uZmlnICYmXG4gICAganNvbi5pbmZvICYmXG4gICAganNvbi5pbmZvLmFwcCA9PT0gJ2tlcGxlci5nbCdcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRldGVybWluZUpzb25Qcm9jZXNzKHtkYXRhc2V0LCBmb3JtYXR9LCBkZWZhdWx0UHJvY2Vzc29yKSB7XG4gIGlmIChpc0tlcGxlckdsTWFwKGRhdGFzZXQpKSB7XG4gICAgcmV0dXJuIHByb2Nlc3NLZXBsZXJnbEpTT047XG4gIH1cblxuICByZXR1cm4gZGVmYXVsdFByb2Nlc3Nvcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbGVzVG9EYXRhUGF5bG9hZChmaWxlQ2FjaGUpIHtcbiAgLy8gc2VwZXJhdGUgb3V0IGZpbGVzIHdoaWNoIGNvdWxkIGJlIGEgc2luZ2xlIGRhdGFzZXRzLiBvciBhIGtlcGxlcmdsIG1hcCBqc29uXG4gIGNvbnN0IGNvbGxlY3Rpb24gPSBmaWxlQ2FjaGUucmVkdWNlKFxuICAgIChhY2N1LCBmaWxlKSA9PiB7XG4gICAgICBjb25zdCB7ZGF0YSwgaW5mbyA9IHt9fSA9IGZpbGU7XG4gICAgICBjb25zdCB7Zm9ybWF0fSA9IGluZm87XG4gICAgICBpZiAoZm9ybWF0ID09PSBEQVRBU0VUX0ZPUk1BVFMua2VwbGVyZ2wpIHtcbiAgICAgICAgLy8gaWYgZmlsZSBjb250YWlucyBhIHNpbmdsZSBrZXBsZXIgbWFwIGRhdGFzZXQgJiBjb25maWdcbiAgICAgICAgYWNjdS5rZXBsZXJNYXBzLnB1c2goe1xuICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgY2VudGVyTWFwOiAhKGRhdGEuY29uZmlnICYmIGRhdGEuY29uZmlnLm1hcFN0YXRlKVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKERBVEFTRVRfRk9STUFUU1tmb3JtYXRdKSB7XG4gICAgICAgIC8vIGlmIGZpbGUgY29udGFpbnMgb25seSBkYXRhXG4gICAgICAgIGNvbnN0IG5ld0RhdGFzZXQgPSB7XG4gICAgICAgICAgZGF0YSxcbiAgICAgICAgICBpbmZvOiB7XG4gICAgICAgICAgICBpZDogaW5mby5pZCB8fCBnZW5lcmF0ZUhhc2hJZCg0KSxcbiAgICAgICAgICAgIC4uLmluZm9cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGFjY3UuZGF0YXNldHMucHVzaChuZXdEYXRhc2V0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2N1O1xuICAgIH0sXG4gICAge2RhdGFzZXRzOiBbXSwga2VwbGVyTWFwczogW119XG4gICk7XG5cbiAgLy8gYWRkIGtlcGxlciBtYXAgZmlyc3Qgd2l0aCBjb25maWdcbiAgLy8gYWRkIGRhdGFzZXRzIGxhdGVyIGluIG9uZSBhZGQgZGF0YSBjYWxsXG4gIHJldHVybiBjb2xsZWN0aW9uLmtlcGxlck1hcHMuY29uY2F0KHtkYXRhc2V0czogY29sbGVjdGlvbi5kYXRhc2V0c30pO1xufVxuIl19
;