@genialis/resolwe
Version:
Resolwe frontend libraries
148 lines (146 loc) • 21.3 kB
JavaScript
;
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
Object.defineProperty(exports, "__esModule", { value: true });
var _ = require("lodash");
var error_1 = require("../../core/errors/error");
/**
* Transforms a feature into one with some augmented attributes.
*/
function transformFeature(feature) {
return _.assign({}, feature, {
id: feature.source + ":" + feature.feature_id + ":" + feature.species,
});
}
exports.transformFeature = transformFeature;
/**
* Transforms features returned from the API into one with some
* augmented attributes.
*/
function transformFeatures(features) {
return features.map(function (featuresList) { return _.map(featuresList, function (feature) { return transformFeature(feature); }); });
}
exports.transformFeatures = transformFeatures;
/**
* Transforms paginated features returned from the API into one with some
* augmented attributes.
*/
function transformFeaturesPaginated(features) {
return features.map(function (response) {
var mappedResults = _.map(response.results, function (feature) { return transformFeature(feature); });
return _.assign({}, response, { results: mappedResults });
});
}
exports.transformFeaturesPaginated = transformFeaturesPaginated;
/**
* Returns features' source.
*
* Throws `GenError` if source cannot be determined.
*
* @param features Features
*/
function getSourceFromFeatures(features) {
var sources = _.unique(_.map(features, function (feature) { return feature.source; }));
if (_.isEmpty(features)) {
throw new error_1.GenError('No features');
}
if (_.size(sources) > 1) {
throw new error_1.GenError("Features come from multiple sources (" + sources.join(', ') + ")");
}
return _.first(sources);
}
exports.getSourceFromFeatures = getSourceFromFeatures;
/**
* Returns features' species.
*
* Throws `GenError` if species cannot be determined.
*
* @param features Features
*/
function getSpeciesFromFeatures(features) {
var species = _.unique(_.map(features, function (feature) { return feature.species; }));
if (_.isEmpty(features)) {
throw new error_1.GenError('No features');
}
if (_.size(species) > 1) {
throw new error_1.GenError("Features come from multiple species (" + species.join(', ') + ")");
}
return _.first(species);
}
exports.getSpeciesFromFeatures = getSpeciesFromFeatures;
/**
* Transforms query to return response with limited set of fields.
*/
function limitFieldsQuery(query, fields) {
return __assign({}, query, { fields: fields.join(',') });
}
exports.limitFieldsQuery = limitFieldsQuery;
/**
* Returns a type with limited set of fields.
*
* Example:
* ```
* const limitedCollection = shallowPickType(<CollectionHydrateData> {}, ['id', 'data']);
* type LimitedCollection = typeof limitedCollection.type;
* const limitFields = limitedCollection.limitFields;
* ```
*
* To limit subfields look at [uniteDeepPicks]
* @see uniteDeepPicks
*/
function shallowPickType(_type, shallowKeys) {
return {
type: undefined,
limitFields: shallowKeys,
limitQuery: limitFieldsQuery({}, shallowKeys),
};
}
exports.shallowPickType = shallowPickType;
/**
* Returns a type with limited set of fields and limited subfields.
*
* Example:
* ```
* const limitedCollection = uniteDeepPicks([
* deepPickType(<CollectionHydrateData> {}, 'id'),
* deepPickType(<CollectionHydrateData> {}, 'data', '[*]', 'process_progress'),
* deepPickType(<CollectionHydrateData> {}, 'data', '[*]', 'name'),
* ]);
* type LimitedCollection = typeof limitedCollection.type;
* const limitFields = limitedCollection.limitFields;
* ```
*
* To only limit shallow fields look at simpler [shallowPickType]
* @see shallowPickType
*/
function uniteDeepPicks(picks) {
return {
type: undefined,
limitFields: _.map(picks, function (pick) { return pick.limitField; }),
limitQuery: limitFieldsQuery({}, _.map(picks, function (pick) { return pick.limitField; })),
};
}
exports.uniteDeepPicks = uniteDeepPicks;
function deepPickType(_type) {
var keys = [];
for (var _i = 1; _i < arguments.length; _i++) {
keys[_i - 1] = arguments[_i];
}
var keysWithoutStars = _.reject(keys, function (key) { return key === '[*]'; });
return {
type: undefined,
limitField: keysWithoutStars.join('__'),
};
}
exports.deepPickType = deepPickType;
// tslint:enable:max-line-length
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9hcGkvdHlwZXMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLDBCQUE0QjtBQUc1QixpREFBaUQ7QUFJakQ7O0dBRUc7QUFDSCxTQUFnQixnQkFBZ0IsQ0FBQyxPQUFnQjtJQUM3QyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQTJCLEVBQUUsRUFBRSxPQUFPLEVBQUU7UUFDbkQsRUFBRSxFQUFLLE9BQU8sQ0FBQyxNQUFNLFNBQUksT0FBTyxDQUFDLFVBQVUsU0FBSSxPQUFPLENBQUMsT0FBUztLQUNuRSxDQUFDLENBQUM7QUFDUCxDQUFDO0FBSkQsNENBSUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixpQkFBaUIsQ0FBQyxRQUFrQztJQUNoRSxPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQ2YsVUFBQyxZQUFZLElBQUssT0FBQSxDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxVQUFDLE9BQU8sSUFBSyxPQUFBLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxFQUF6QixDQUF5QixDQUFDLEVBQTNELENBQTJELENBQ2hGLENBQUM7QUFDTixDQUFDO0FBSkQsOENBSUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQiwwQkFBMEIsQ0FBQyxRQUFtRDtJQUMxRixPQUFPLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBQyxRQUFRO1FBQ3pCLElBQU0sYUFBYSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxVQUFDLE9BQU8sSUFBSyxPQUFBLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxFQUF6QixDQUF5QixDQUFDLENBQUM7UUFFdEYsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUNYLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLENBQzNDLENBQUM7SUFDTixDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFSRCxnRUFRQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQWdC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QUFJLEVBQUUsU0FBUztRQUNmLFVBQVUsRUFBRSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO0tBQzFDLENBQUM7QUFDTixDQUFDO0FBUEQsb0NBT0M7QUFDRCxnQ0FBZ0MiLCJmaWxlIjoiYXBpL3R5cGVzL3V0aWxzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0ICogYXMgUnggZnJvbSAncngnO1xuXG5pbXBvcnQge0dlbkVycm9yfSBmcm9tICcuLi8uLi9jb3JlL2Vycm9ycy9lcnJvcic7XG5pbXBvcnQge1F1ZXJ5LCBQYWdpbmF0ZWRSZXNwb25zZX0gZnJvbSAnLi9yZXN0JztcbmltcG9ydCB7RmVhdHVyZX0gZnJvbSAnLi9tb2R1bGVzJztcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIGEgZmVhdHVyZSBpbnRvIG9uZSB3aXRoIHNvbWUgYXVnbWVudGVkIGF0dHJpYnV0ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1GZWF0dXJlKGZlYXR1cmU6IEZlYXR1cmUpOiBGZWF0dXJlIHtcbiAgICByZXR1cm4gXy5hc3NpZ248e30sIEZlYXR1cmUsIHt9LCBGZWF0dXJlPih7fSwgZmVhdHVyZSwge1xuICAgICAgICBpZDogYCR7ZmVhdHVyZS5zb3VyY2V9OiR7ZmVhdHVyZS5mZWF0dXJlX2lkfToke2ZlYXR1cmUuc3BlY2llc31gLFxuICAgIH0pO1xufVxuXG4vKipcbiAqIFRyYW5zZm9ybXMgZmVhdHVyZXMgcmV0dXJuZWQgZnJvbSB0aGUgQVBJIGludG8gb25lIHdpdGggc29tZVxuICogYXVnbWVudGVkIGF0dHJpYnV0ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1GZWF0dXJlcyhmZWF0dXJlczogUnguT2JzZXJ2YWJsZTxGZWF0dXJlW10+KTogUnguT2JzZXJ2YWJsZTxGZWF0dXJlW10+IHtcbiAgICByZXR1cm4gZmVhdHVyZXMubWFwKFxuICAgICAgICAoZmVhdHVyZXNMaXN0KSA9PiBfLm1hcChmZWF0dXJlc0xpc3QsIChmZWF0dXJlKSA9PiB0cmFuc2Zvcm1GZWF0dXJlKGZlYXR1cmUpKVxuICAgICk7XG59XG5cbi8qKlxuICogVHJhbnNmb3JtcyBwYWdpbmF0ZWQgZmVhdHVyZXMgcmV0dXJuZWQgZnJvbSB0aGUgQVBJIGludG8gb25lIHdpdGggc29tZVxuICogYXVnbWVudGVkIGF0dHJpYnV0ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm1GZWF0dXJlc1BhZ2luYXRlZChmZWF0dXJlczogUnguT2JzZXJ2YWJsZTxQYWdpbmF0ZWRSZXNwb25zZTxGZWF0dXJlPj4pOiBSeC5PYnNlcnZhYmxlPFBhZ2luYXRlZFJlc3BvbnNlPEZlYXR1cmU+PiB7XG4gICAgcmV0dXJuIGZlYXR1cmVzLm1hcCgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgY29uc3QgbWFwcGVkUmVzdWx0cyA9IF8ubWFwKHJlc3BvbnNlLnJlc3VsdHMsIChmZWF0dXJlKSA9PiB0cmFuc2Zvcm1GZWF0dXJlKGZlYXR1cmUpKTtcblxuICAgICAgICByZXR1cm4gXy5hc3NpZ248e30sIHt9LCB7IHJlc3VsdHM6IEZlYXR1cmVbXSB9LCBQYWdpbmF0ZWRSZXNwb25zZTxGZWF0dXJlPj4oXG4gICAgICAgICAgICB7fSwgcmVzcG9uc2UsIHsgcmVzdWx0czogbWFwcGVkUmVzdWx0cyB9XG4gICAgICAgICk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogUmV0dXJucyBmZWF0dXJlcycgc291cmNlLlxuICpcbiAqIFRocm93cyBgR2VuRXJyb3JgIGlmIHNvdXJjZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZC5cbiAqXG4gKiBAcGFyYW0gZmVhdHVyZXMgRmVhdHVyZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNvdXJjZUZyb21GZWF0dXJlcyhmZWF0dXJlczogRmVhdHVyZVtdKTogc3RyaW5nIHtcbiAgICBjb25zdCBzb3VyY2VzID0gXy51bmlxdWUoXy5tYXAoZmVhdHVyZXMsIChmZWF0dXJlKSA9PiBmZWF0dXJlLnNvdXJjZSkpO1xuXG4gICAgaWYgKF8uaXNFbXB0eShmZWF0dXJlcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEdlbkVycm9yKCdObyBmZWF0dXJlcycpO1xuICAgIH1cbiAgICBpZiAoXy5zaXplKHNvdXJjZXMpID4gMSkge1xuICAgICAgICB0aHJvdyBuZXcgR2VuRXJyb3IoYEZlYXR1cmVzIGNvbWUgZnJvbSBtdWx0aXBsZSBzb3VyY2VzICgke3NvdXJjZXMuam9pbignLCAnKX0pYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF8uZmlyc3Qoc291cmNlcyk7XG59XG5cbi8qKlxuICogUmV0dXJucyBmZWF0dXJlcycgc3BlY2llcy5cbiAqXG4gKiBUaHJvd3MgYEdlbkVycm9yYCBpZiBzcGVjaWVzIGNhbm5vdCBiZSBkZXRlcm1pbmVkLlxuICpcbiAqIEBwYXJhbSBmZWF0dXJlcyBGZWF0dXJlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3BlY2llc0Zyb21GZWF0dXJlcyhmZWF0dXJlczogRmVhdHVyZVtdKTogc3RyaW5nIHtcbiAgICBjb25zdCBzcGVjaWVzID0gXy51bmlxdWUoXy5tYXAoZmVhdHVyZXMsIChmZWF0dXJlKSA9PiBmZWF0dXJlLnNwZWNpZXMpKTtcblxuICAgIGlmIChfLmlzRW1wdHkoZmVhdHVyZXMpKSB7XG4gICAgICAgIHRocm93IG5ldyBHZW5FcnJvcignTm8gZmVhdHVyZXMnKTtcbiAgICB9XG4gICAgaWYgKF8uc2l6ZShzcGVjaWVzKSA+IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEdlbkVycm9yKGBGZWF0dXJlcyBjb21lIGZyb20gbXVsdGlwbGUgc3BlY2llcyAoJHtzcGVjaWVzLmpvaW4oJywgJyl9KWApO1xuICAgIH1cblxuICAgIHJldHVybiBfLmZpcnN0KHNwZWNpZXMpO1xufVxuXG4vKipcbiAqIFRyYW5zZm9ybXMgcXVlcnkgdG8gcmV0dXJuIHJlc3BvbnNlIHdpdGggbGltaXRlZCBzZXQgb2YgZmllbGRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGltaXRGaWVsZHNRdWVyeTxUIGV4dGVuZHMgUXVlcnk+KHF1ZXJ5OiBULCBmaWVsZHM6IHN0cmluZ1tdKTogVCAmIHsgZmllbGRzOiBzdHJpbmcgfSB7XG4gICAgcmV0dXJuIHsgLi4ucXVlcnksIGZpZWxkczogZmllbGRzLmpvaW4oJywnKSB9O1xufVxuXG4vKipcbiAqIFJldHVybnMgYSB0eXBlIHdpdGggbGltaXRlZCBzZXQgb2YgZmllbGRzLlxuICpcbiAqIEV4YW1wbGU6XG4gKiBgYGBcbiAqIGNvbnN0IGxpbWl0ZWRDb2xsZWN0aW9uID0gc2hhbGxvd1BpY2tUeXBlKDxDb2xsZWN0aW9uSHlkcmF0ZURhdGE+IHt9LCBbJ2lkJywgJ2RhdGEnXSk7XG4gKiB0eXBlIExpbWl0ZWRDb2xsZWN0aW9uID0gdHlwZW9mIGxpbWl0ZWRDb2xsZWN0aW9uLnR5cGU7XG4gKiBjb25zdCBsaW1pdEZpZWxkcyA9IGxpbWl0ZWRDb2xsZWN0aW9uLmxpbWl0RmllbGRzO1xuICogYGBgXG4gKlxuICogVG8gbGltaXQgc3ViZmllbGRzIGxvb2sgYXQgW3VuaXRlRGVlcFBpY2tzXVxuICogQHNlZSB1bml0ZURlZXBQaWNrc1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2hhbGxvd1BpY2tUeXBlPFQgZXh0ZW5kcyBvYmplY3QsIEsgZXh0ZW5kcyBrZXlvZiBUPihfdHlwZTogVCwgc2hhbGxvd0tleXM6IEtbXSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IDxQaWNrPFQsIHR5cGVvZiBzaGFsbG93S2V5c1tudW1iZXJdPj4gdW5kZWZpbmVkLFxuICAgICAgICBsaW1pdEZpZWxkczogc2hhbGxvd0tleXMsXG4gICAgICAgIGxpbWl0UXVlcnk6IGxpbWl0RmllbGRzUXVlcnkoe30sIDxzdHJpbmdbXT4gc2hhbGxvd0tleXMpLFxuICAgIH07XG59XG5cbi8vIEZyb20gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNTAzNzQ5MDgvdHJhbnNmb3JtLXVuaW9uLXR5cGUtdG8taW50ZXJzZWN0aW9uLXR5cGVcbmV4cG9ydCB0eXBlIFVuaW9uVG9JbnRlcnNlY3Rpb248VT4gPSAoVSBleHRlbmRzIGFueSA/IChrOiBVKSA9PiB2b2lkIDogbmV2ZXIpIGV4dGVuZHMgKChrOiBpbmZlciBJKSA9PiB2b2lkKSA/IEkgOiBuZXZlcjtcblxuLyoqXG4gKiBSZXR1cm5zIGEgdHlwZSB3aXRoIGxpbWl0ZWQgc2V0IG9mIGZpZWxkcyBhbmQgbGltaXRlZCBzdWJmaWVsZHMuXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYFxuICogY29uc3QgbGltaXRlZENvbGxlY3Rpb24gPSB1bml0ZURlZXBQaWNrcyhbXG4gKiAgICAgZGVlcFBpY2tUeXBlKDxDb2xsZWN0aW9uSHlkcmF0ZURhdGE+IHt9LCAnaWQnKSxcbiAqICAgICBkZWVwUGlja1R5cGUoPENvbGxlY3Rpb25IeWRyYXRlRGF0YT4ge30sICdkYXRhJywgJ1sqXScsICdwcm9jZXNzX3Byb2dyZXNzJyksXG4gKiAgICAgZGVlcFBpY2tUeXBlKDxDb2xsZWN0aW9uSHlkcmF0ZURhdGE+IHt9LCAnZGF0YScsICdbKl0nLCAnbmFtZScpLFxuICogXSk7XG4gKiB0eXBlIExpbWl0ZWRDb2xsZWN0aW9uID0gdHlwZW9mIGxpbWl0ZWRDb2xsZWN0aW9uLnR5cGU7XG4gKiBjb25zdCBsaW1pdEZpZWxkcyA9IGxpbWl0ZWRDb2xsZWN0aW9uLmxpbWl0RmllbGRzO1xuICogYGBgXG4gKlxuICogVG8gb25seSBsaW1pdCBzaGFsbG93IGZpZWxkcyBsb29rIGF0IHNpbXBsZXIgW3NoYWxsb3dQaWNrVHlwZV1cbiAqIEBzZWUgc2hhbGxvd1BpY2tUeXBlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bml0ZURlZXBQaWNrczxUIGV4dGVuZHMgeyB0eXBlOiBhbnksIGxpbWl0RmllbGQ6IHN0cmluZyB9PihwaWNrczogVFtdKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogPFVuaW9uVG9JbnRlcnNlY3Rpb248VFsndHlwZSddPj4gdW5kZWZpbmVkLFxuICAgICAgICBsaW1pdEZpZWxkczogXy5tYXAocGlja3MsIChwaWNrKSA9PiBwaWNrLmxpbWl0RmllbGQpLFxuICAgICAgICBsaW1pdFF1ZXJ5OiBsaW1pdEZpZWxkc1F1ZXJ5KHt9LCBfLm1hcChwaWNrcywgKHBpY2spID0+IHBpY2subGltaXRGaWVsZCkpLFxuICAgIH07XG59XG5cbi8qKiBTYW1lIGFzIFRbS10gYnV0IGlnbm9yZXMgZXJyb3IgaWYgVCBjYW4gYmUgdm9pZC4gKi9cbnR5cGUgRm9yY2VHZXQ8VCwgSyBleHRlbmRzIHN0cmluZyB8IG51bWJlcj4gPSBUIGV4dGVuZHMge1trIGluIEtdOiBhbnl9ID8gVFtLXSA6IG5ldmVyO1xuLyoqIElmIGZpcnN0IHBhcmFtZXRlciBjYW4gYmUgdm9pZCwgcmV0dXJuIHNlY29uZCB8IHZvaWQgKi9cbnR5cGUgSW5oZXJpdFZvaWQ8RnJvbSwgVG8+ID0gRnJvbSBleHRlbmRzIHt9ID8gVG8gOiB2b2lkIHwgVG87XG5cblxuLy8gdHNsaW50OmRpc2FibGU6bWF4LWxpbmUtbGVuZ3RoXG5cbi8qKlxuICogQHNlZSB1bml0ZURlZXBQaWNrc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGVlcFBpY2tUeXBlPEsxIGV4dGVuZHMgc3RyaW5nLFxuICAgIFQgZXh0ZW5kcyB7XG4gICAgICAgIFtrMSBpbiBLMV06IGFueTtcbiAgICB9LFxuICAgIFIgZXh0ZW5kcyB7XG4gICAgICAgIFtrMSBpbiBLMV06IFRbazFdXG4gICAgfT4oX3R5cGU6IFQsIGsxOiBLMSk6IHsgdHlwZTogUiwgbGltaXRGaWVsZDogc3RyaW5nIH07XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWVwUGlja1R5cGU8SzEgZXh0ZW5kcyBzdHJpbmcsIEsyIGV4dGVuZHMgc3RyaW5nLFxuICAgIFQgZXh0ZW5kcyB7XG4gICAgICAgIFtrMSBpbiBLMV06IHZvaWQgfCB7XG4gICAgICAgICAgICBbazIgaW4gSzJdOiBhbnk7XG4gICAgICAgIH07XG4gICAgfSxcbiAgICBSIGV4dGVuZHMge1xuICAgICAgICBbazEgaW4gSzFdOiBJbmhlcml0Vm9pZDxGb3JjZUdldDxULCBrMT4sIHtcbiAgICAgICAgICAgIFtrMiBpbiBLMl06IEZvcmNlR2V0PEZvcmNlR2V0PFQsIGsxPiwgazI+O1xuICAgICAgICB9PjtcbiAgICB9PihfdHlwZTogVCwgazE6IEsxLCBrMjogSzIpOiB7IHR5cGU6IFIsIGxpbWl0RmllbGQ6IHN0cmluZyB9O1xuXG5leHBvcnQgZnVuY3Rpb24gZGVlcFBpY2tUeXBlPEsxIGV4dGVuZHMgJ1sqXScsIEsyIGV4dGVuZHMgc3RyaW5nLFxuICAgIFQgZXh0ZW5kc1xuICAgICAgICBBcnJheTx7XG4gICAgICAgICAgICBbazIgaW4gSzJdOiBhbnk7XG4gICAgICAgIH0+LFxuICAgIFIgZXh0ZW5kc1xuICAgICAgICBBcnJheTx7XG4gICAgICAgICAgICBbazIgaW4gSzJdOiBUW251bWJlcl1bazJdO1xuICAgICAgICB9PlxuICAgID4oX3R5cGU6IFQsIGsxOiBLMSwgazI6IEsyKTogeyB0eXBlOiBSLCBsaW1pdEZpZWxkOiBzdHJpbmcgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRlZXBQaWNrVHlwZTxLMSBleHRlbmRzIHN0cmluZywgSzIgZXh0ZW5kcyBzdHJpbmcsIEszIGV4dGVuZHMgc3RyaW5nLFxuICAgIFQgZXh0ZW5kcyB7XG4gICAgICAgIFtrMSBpbiBLMV06IHZvaWQgfCB7XG4gICAgICAgICAgICBbazIgaW4gSzJdOiB2b2lkIHwge1xuICAgICAgICAgICAgICAgIFtrMyBpbiBLM106IGFueTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgfSxcbiAgICBSIGV4dGVuZHMge1xuICAgICAgICBbazEgaW4gSzFdOiBJbmhlcml0Vm9pZDxGb3JjZUdldDxULCBrMT4sIHtcbiAgICAgICAgICAgIFtrMiBpbiBLMl06IEluaGVyaXRWb2lkPEZvcmNlR2V0PEZvcmNlR2V0PFQsIGsxPiwgazI+LCB7XG4gICAgICAgICAgICAgICAgW2szIGluIEszXTogRm9yY2VHZXQ8Rm9yY2VHZXQ8Rm9yY2VHZXQ8VCwgazE+LCBrMj4sIGszPjtcbiAgICAgICAgICAgIH0+O1xuICAgICAgICB9PjtcbiAgICB9PihfdHlwZTogVCwgazE6IEsxLCBrMjogSzIsIGszOiBLMyk6IHsgdHlwZTogUiwgbGltaXRGaWVsZDogc3RyaW5nIH07XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWVwUGlja1R5cGU8SzEgZXh0ZW5kcyBzdHJpbmcsIEsyIGV4dGVuZHMgJ1sqXScsIEszIGV4dGVuZHMgc3RyaW5nLFxuICAgIFQgZXh0ZW5kcyB7XG4gICAgICAgIFtrMSBpbiBLMV06XG4gICAgICAgICAgICBBcnJheTx7XG4gICAgICAgICAgICAgICAgW2szIGluIEszXTogYW55O1xuICAgICAgICAgICAgfT47XG4gICAgfSxcbiAgICBSIGV4dGVuZHMge1xuICAgICAgICBbazEgaW4gSzFdOlxuICAgICAgICAgICAgQXJyYXk8e1xuICAgICAgICAgICAgICAgIFtrMyBpbiBLM106IFRbazFdW251bWJlcl1bazNdO1xuICAgICAgICAgICAgfT47XG4gICAgfT4oX3R5cGU6IFQsIGsxOiBLMSwgazI6IEsyLCBrMzogSzMpOiB7IHR5cGU6IFIsIGxpbWl0RmllbGQ6IHN0cmluZyB9O1xuXG5leHBvcnQgZnVuY3Rpb24gZGVlcFBpY2tUeXBlPEsxIGV4dGVuZHMgJ1sqXScsIEsyIGV4dGVuZHMgJ1sqXScsIEszIGV4dGVuZHMgc3RyaW5nLFxuICAgIFQgZXh0ZW5kc1xuICAgICAgICBBcnJheTxcbiAgICAgICAgICAgIEFycmF5PHtcbiAgICAgICAgICAgICAgICBbazMgaW4gSzNdOiBhbnk7XG4gICAgICAgICAgICB9PlxuICAgICAgICA+LFxuICAgIFIgZXh0ZW5kc1xuICAgICAgICBBcnJheTxcbiAgICAgICAgICAgIEFycmF5PHtcbiAgICAgICAgICAgICAgICBbazMgaW4gSzNdOiBUW251bWJlcl1bbnVtYmVyXVtrM107XG4gICAgICAgICAgICB9PlxuICAgICAgICA+XG4gICAgPihfdHlwZTogVCwgazE6IEsxLCBrMjogSzIsIGszOiBLMyk6IHsgdHlwZTogUiwgbGltaXRGaWVsZDogc3RyaW5nIH07XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWVwUGlja1R5cGU8SzEgZXh0ZW5kcyBzdHJpbmcsIEsyIGV4dGVuZHMgc3RyaW5nLCBLMyBleHRlbmRzIHN0cmluZywgSzQgZXh0ZW5kcyBzdHJpbmcsXG4gICAgVCBleHRlbmRzIHtcbiAgICAgICAgW2sxIGluIEsxXTogdm9pZCB8IHtcbiAgICAgICAgICAgIFtrMiBpbiBLMl06IHZvaWQgfCB7XG4gICAgICAgICAgICAgICAgW2szIGluIEszXTogdm9pZCB8IHtcbiAgICAgICAgICAgICAgICAgICAgW2s0IGluIEs0XTogYW55O1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgIH0sXG4gICAgUiBleHRlbmRzIHtcbiAgICAgICAgW2sxIGluIEsxXTogSW5oZXJpdFZvaWQ8Rm9yY2VHZXQ8VCwgazE+LCB7XG4gICAgICAgICAgICBbazIgaW4gSzJdOiBJbmhlcml0Vm9pZDxGb3JjZUdldDxGb3JjZUdldDxULCBrMT4sIGsyPiwge1xuICAgICAgICAgICAgICAgIFtrMyBpbiBLM106IEluaGVyaXRWb2lkPEZvcmNlR2V0PEZvcmNlR2V0PEZvcmNlR2V0PFQsIGsxPiwgazI+LCBrMz4sIHtcbiAgICAgICAgICAgICAgICAgICAgW2s0IGluIEs0XTogRm9yY2VHZXQ8Rm9yY2VHZXQ8Rm9yY2VHZXQ8Rm9yY2VHZXQ8VCwgazE+LCBrMj4sIGszPiwgazQ+O1xuICAgICAgICAgICAgICAgIH0+O1xuICAgICAgICAgICAgfT47XG4gICAgICAgIH0+O1xuICAgIH0+KF90eXBlOiBULCBrMTogSzEsIGsyOiBLMiwgazM6IEszLCBrNDogSzQpOiB7IHR5cGU6IFIsIGxpbWl0RmllbGQ6IHN0cmluZyB9O1xuXG5leHBvcnQgZnVuY3Rpb24gZGVlcFBpY2tUeXBlPEsxIGV4dGVuZHMgc3RyaW5nLCBLMiBleHRlbmRzICdbKl0nLCBLMyBleHRlbmRzIHN0cmluZywgSzQgZXh0ZW5kcyBzdHJpbmcsXG4gICAgVCBleHRlbmRzIHtcbiAgICAgICAgW2sxIGluIEsxXTpcbiAgICAgICAgICAgIEFycmF5PHtcbiAgICAgICAgICAgICAgICBbazMgaW4gSzNdOiB2b2lkIHwge1xuICAgICAgICAgICAgICAgICAgICBbazQgaW4gSzRdOiBhbnk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0+O1xuICAgIH0sXG4gICAgUiBleHRlbmRzIHtcbiAgICAgICAgW2sxIGluIEsxXTpcbiAgICAgICAgICAgIEFycmF5PHtcbiAgICAgICAgICAgICAgICBbazMgaW4gSzNdOiBJbmhlcml0Vm9pZDxGb3JjZUdldDxGb3JjZUdldDxGb3JjZUdldDxULCBrMT4sIG51bWJlcj4sIGszPiwge1xuICAgICAgICAgICAgICAgICAgICBbazQgaW4gSzRdOiBGb3JjZUdldDxGb3JjZUdldDxGb3JjZUdldDxGb3JjZUdldDxULCBrMT4sIG51bWJlcj4sIGszPiwgazQ+O1xuICAgICAgICAgICAgICAgIH0+O1xuICAgICAgICAgICAgfT47XG4gICAgfT4oX3R5cGU6IFQsIGsxOiBLMSwgazI6IEsyLCBrMzogSzMsIGs0OiBLNCk6IHsgdHlwZTogUiwgbGltaXRGaWVsZDogc3RyaW5nIH07XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWVwUGlja1R5cGU8SzEgZXh0ZW5kcyBzdHJpbmcsIEsyIGV4dGVuZHMgc3RyaW5nLCBLMyBleHRlbmRzICdbKl0nLCBLNCBleHRlbmRzIHN0cmluZyxcbiAgICBUIGV4dGVuZHMge1xuICAgICAgICBbazEgaW4gSzFdOiB2b2lkIHwge1xuICAgICAgICAgICAgW2syIGluIEsyXTpcbiAgICAgICAgICAgICAgICBBcnJheTx7XG4gICAgICAgICAgICAgICAgICAgIFtrNCBpbiBLNF06IGFueTtcbiAgICAgICAgICAgICAgICB9PjtcbiAgICAgICAgfTtcbiAgICB9LFxuICAgIFIgZXh0ZW5kcyB7XG4gICAgICAgIFtrMSBpbiBLMV06IEluaGVyaXRWb2lkPEZvcmNlR2V0PFQsIGsxPiwge1xuICAgICAgICAgICAgW2syIGluIEsyXTpcbiAgICAgICAgICAgICAgICBBcnJheTx7XG4gICAgICAgICAgICAgICAgICAgIFtrNCBpbiBLNF06IEZvcmNlR2V0PEZvcmNlR2V0PEZvcmNlR2V0PEZvcmNlR2V0PFQsIGsxPiwgazI+LCBudW1iZXI+LCBrND47XG4gICAgICAgICAgICAgICAgfT47XG4gICAgICAgIH0+O1xuICAgIH0+KF90eXBlOiBULCBrMTogSzEsIGsyOiBLMiwgazM6IEszLCBrNDogSzQpOiB7IHR5cGU6IFIsIGxpbWl0RmllbGQ6IHN0cmluZyB9O1xuXG5leHBvcnQgZnVuY3Rpb24gZGVlcFBpY2tUeXBlKF90eXBlOiBhbnksIC4uLmtleXM6IGFueVtdKTogeyB0eXBlOiBhbnksIGxpbWl0RmllbGQ6IHN0cmluZyB9IHtcblxuICAgIGNvbnN0IGtleXNXaXRob3V0U3RhcnMgPSBfLnJlamVjdChrZXlzLCAoa2V5KSA9PiBrZXkgPT09ICdbKl0nKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiB1bmRlZmluZWQsXG4gICAgICAgIGxpbWl0RmllbGQ6IGtleXNXaXRob3V0U3RhcnMuam9pbignX18nKSxcbiAgICB9O1xufVxuLy8gdHNsaW50OmVuYWJsZTptYXgtbGluZS1sZW5ndGhcbiJdfQ==