filestack-js
Version:
Official JavaScript library for Filestack
232 lines (230 loc) • 24.4 kB
JavaScript
/*
* Copyright (c) 2018 by Filestack.
* Some rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { __assign, __awaiter, __generator } from "tslib";
import { ExtensionsMap } from './extensions';
import { fileTypeFromBuffer } from 'file-type';
import isutf8 from 'isutf8';
/**
* Resolve cdn url based on handle type
*
* @private
* @param session session object
* @param handle file handle (hash, src://alias, url)
*/
export var resolveCdnUrl = function (session, handle) {
var cdnURL = session.urls.cdnUrl;
if (handle && (handle.indexOf('src:') === 0 || handle.indexOf('http') === 0)) {
if (!session.apikey) {
throw new Error('Api key is required when storage alias is provided');
}
// apikey is required for alias or external sources call
return "".concat(cdnURL, "/").concat(session.apikey);
}
return cdnURL;
};
/**
* Resolve all urls with provided cnames
*
* @private
* @param urls
* @param cname
*/
export var resolveHost = function (urls, cname) {
if (!cname) {
return urls;
}
var hosts = /filestackapi.com|filestackcontent.com/i;
Object.keys(urls).forEach(function (key) {
urls[key] = urls[key].replace(hosts, cname);
});
return urls;
};
/**
* Removes empty options from object
*
* @private
* @param obj
*/
export var removeEmpty = function (obj) {
var newObj = __assign({}, obj);
Object.keys(newObj).forEach(function (k) { return !newObj[k] && typeof newObj[k] !== 'boolean' && delete newObj[k]; });
return newObj;
};
/**
* Returns unique time
*/
var last;
export var uniqueTime = function () {
var time = Date.now();
last = time === last ? time + 1 : time;
return last;
};
/**
* Generates random string with provided length
*
* @param len
*/
export var uniqueId = function (len) {
if (len === void 0) { len = 10; }
return new Array(len).join().replace(/(.|$)/g, function () { return ((Math.random() * 36) | 0).toString(36)[Math.random() < 0.5 ? 'toString' : 'toUpperCase'](); });
};
/**
* Check if input is a svg
*
* @param {Uint8Array | Buffer} file
* @returns {string} - mimetype
*/
export var getMimetype = function (file, name) { return __awaiter(void 0, void 0, void 0, function () {
var type, e_1, excludedMimetypes, mime_1;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 2, , 3]);
return [4 /*yield*/, fileTypeFromBuffer(file)];
case 1:
type = _a.sent();
return [3 /*break*/, 3];
case 2:
e_1 = _a.sent();
console.warn('An exception occurred while processing the buffer:', e_1.message);
return [3 /*break*/, 3];
case 3:
excludedMimetypes = ['text/plain', 'application/octet-stream', 'application/x-ms', 'application/x-msi', 'application/zip', 'audio/x-m4a'];
if (type && excludedMimetypes.indexOf(type.mime) === -1) {
return [2 /*return*/, type.mime];
}
if (name && name.indexOf('.') > -1) {
mime_1 = extensionToMime(name);
if (mime_1) {
return [2 /*return*/, mime_1];
}
}
try {
if (isutf8(file)) {
return [2 /*return*/, 'text/plain'];
}
}
catch (e) {
/* istanbul ignore next */
console.warn('Additional mimetype checks (text/plain) are currently not supported for browsers');
}
// this is only fallback, omit it in coverage
/* istanbul ignore next */
// if we cant find types by extensions and we have magic bytes fallback to it
if (type) {
return [2 /*return*/, type.mime];
}
return [2 /*return*/, 'application/octet-stream'];
}
});
}); };
/**
* Change extension to according mimetype using ext=>mimetype map
*
* @param ext - string
* @return string|boolean
*/
export var extensionToMime = function (ext) {
if (!ext || ext.length === 0) {
return;
}
if (ext.split('/').length === 2) {
return ext;
}
if (ext.indexOf('.') > -1) {
ext = ext.split('.').pop();
}
ext = ext.toLocaleLowerCase();
var keys = Object.keys(ExtensionsMap);
var mapLen = keys.length;
for (var i = 0; i < mapLen; i++) {
if (ExtensionsMap[keys[i]].indexOf(ext) > -1) {
return keys[i];
}
}
return;
};
/**
* Sanitize file name
*
* @param name
* @param {bool} options - enable,disable sanitizer, default enabled
* @param {string} options.replacement - replacement for sanitized chars defaults to "-"
* @param {string[]} options.exclude - array with excluded chars default - `['\', '{', '}','|', '%', '`', '"', "'", '~', '[', ']', '#', '|', '^', '<', '>']`
*/
export var sanitizeName = function (name, options) {
if (options === void 0) { options = true; }
if (typeof options === 'boolean' && !options) {
return name;
}
var ext;
var replacement = typeof options !== 'boolean' && options.replacement ? options.replacement : '-';
var exclude = typeof options !== 'boolean' && options.exclude ? options.exclude : ['\\', '{', '}', '|', '%', '`', '"', "'", '~', '[', ']', '#', '|', '^', '<', '>'];
if (!name || name.length === 0) {
return 'undefined';
}
var fileParts = name.split('.');
if (fileParts.length > 1) {
ext = fileParts.pop();
}
return "".concat(fileParts
.join('.')
.split('')
.map(function (char) { return (exclude.indexOf(char) > -1 ? replacement : char); })
.join('')).concat(ext ? '.' + ext : '');
};
/**
* Filter object to given fields
*
* @param toFilter
* @param requiredFields
*/
export var filterObject = function (toFilter, requiredFields) {
if (!requiredFields || requiredFields.length === 0) {
return toFilter;
}
if (Object.keys(toFilter).length === 0) {
return toFilter;
}
return Object.keys(toFilter)
.filter(function (f) { return requiredFields.indexOf(f) > -1; })
.reduce(function (obj, key) {
var _a;
return (__assign(__assign({}, obj), (_a = {}, _a[key] = toFilter[key], _a)));
}, {});
};
/**
* Deep cleanup object from functions
*
* @param obj
*/
export var cleanUpCallbacks = function (obj) {
if (!obj || Object.keys(obj).length === 0) {
return obj;
}
Object.keys(obj).forEach(function (k) {
if (typeof obj[k] === 'function') {
obj[k] = undefined;
}
if (obj[k] === Object(obj[k])) {
obj[k] = cleanUpCallbacks(obj[k]);
}
});
return obj;
};
export * from './index.node';
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvdXRpbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHOztBQUlILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDN0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQy9DLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUU1Qjs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsSUFBTSxhQUFhLEdBQUcsVUFBQyxPQUFnQixFQUFFLE1BQWM7SUFDNUQsSUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7SUFFbkMsSUFBSSxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO1FBQzVFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFO1lBQ25CLE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQztTQUN2RTtRQUVELHdEQUF3RDtRQUN4RCxPQUFPLFVBQUcsTUFBTSxjQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUUsQ0FBQztLQUN0QztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMsQ0FBQztBQUVGOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxJQUFNLFdBQVcsR0FBRyxVQUFDLElBQVcsRUFBRSxLQUFhO0lBQ3BELElBQUksQ0FBQyxLQUFLLEVBQUU7UUFDVixPQUFPLElBQUksQ0FBQztLQUNiO0lBRUQsSUFBTSxLQUFLLEdBQUcsd0NBQXdDLENBQUM7SUFFdkQsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBQSxHQUFHO1FBQzNCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FB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QUMsT0FBTyxDQUFDLFVBQUEsQ0FBQztRQUN4QixJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLFVBQVUsRUFBRTtZQUNoQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDO1NBQ3BCO1FBRUQsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQzdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNuQztJQUNILENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDLENBQUM7QUFFRixjQUFjLGNBQWMsQ0FBQyIsImZpbGUiOiJsaWIvdXRpbHMvaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE4IGJ5IEZpbGVzdGFjay5cbiAqIFNvbWUgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBTZXNzaW9uIH0gZnJvbSAnLi4vY2xpZW50JztcbmltcG9ydCB7IEhvc3RzIH0gZnJvbSAnLi8uLi8uLi9jb25maWcnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uc01hcCB9IGZyb20gJy4vZXh0ZW5zaW9ucyc7XG5pbXBvcnQgeyBmaWxlVHlwZUZyb21CdWZmZXIgfSBmcm9tICdmaWxlLXR5cGUnO1xuaW1wb3J0IGlzdXRmOCBmcm9tICdpc3V0ZjgnO1xuXG4vKipcbiAqIFJlc29sdmUgY2RuIHVybCBiYXNlZCBvbiBoYW5kbGUgdHlwZVxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gc2Vzc2lvbiBzZXNzaW9uIG9iamVjdFxuICogQHBhcmFtIGhhbmRsZSBmaWxlIGhhbmRsZSAoaGFzaCwgc3JjOi8vYWxpYXMsIHVybClcbiAqL1xuZXhwb3J0IGNvbnN0IHJlc29sdmVDZG5VcmwgPSAoc2Vzc2lvbjogU2Vzc2lvbiwgaGFuZGxlOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBjZG5VUkwgPSBzZXNzaW9uLnVybHMuY2RuVXJsO1xuXG4gIGlmIChoYW5kbGUgJiYgKGhhbmRsZS5pbmRleE9mKCdzcmM6JykgPT09IDAgfHwgaGFuZGxlLmluZGV4T2YoJ2h0dHAnKSA9PT0gMCkpIHtcbiAgICBpZiAoIXNlc3Npb24uYXBpa2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FwaSBrZXkgaXMgcmVxdWlyZWQgd2hlbiBzdG9yYWdlIGFsaWFzIGlzIHByb3ZpZGVkJyk7XG4gICAgfVxuXG4gICAgLy8gYXBpa2V5IGlzIHJlcXVpcmVkIGZvciBhbGlhcyBvciBleHRlcm5hbCBzb3VyY2VzIGNhbGxcbiAgICByZXR1cm4gYCR7Y2RuVVJMfS8ke3Nlc3Npb24uYXBpa2V5fWA7XG4gIH1cblxuICByZXR1cm4gY2RuVVJMO1xufTtcblxuLyoqXG4gKiBSZXNvbHZlIGFsbCB1cmxzIHdpdGggcHJvdmlkZWQgY25hbWVzXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB1cmxzXG4gKiBAcGFyYW0gY25hbWVcbiAqL1xuZXhwb3J0IGNvbnN0IHJlc29sdmVIb3N0ID0gKHVybHM6IEhvc3RzLCBjbmFtZTogc3RyaW5nKTogSG9zdHMgPT4ge1xuICBpZiAoIWNuYW1lKSB7XG4gICAgcmV0dXJuIHVybHM7XG4gIH1cblxuICBjb25zdCBob3N0cyA9IC9maWxlc3RhY2thcGkuY29tfGZpbGVzdGFja2NvbnRlbnQuY29tL2k7XG5cbiAgT2JqZWN0LmtleXModXJscykuZm9yRWFjaChrZXkgPT4ge1xuICAgIHVybHNba2V5XSA9IHVybHNba2V5XS5yZXBsYWNlKGhvc3RzLCBjbmFtZSk7XG4gIH0pO1xuXG4gIHJldHVybiB1cmxzO1xufTtcblxuLyoqXG4gKiBSZW1vdmVzIGVtcHR5IG9wdGlvbnMgZnJvbSBvYmplY3RcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIG9ialxuICovXG5leHBvcnQgY29uc3QgcmVtb3ZlRW1wdHkgPSAob2JqOiBhbnkpID0+IHtcbiAgY29uc3QgbmV3T2JqID0geyAuLi5vYmogfTtcbiAgT2JqZWN0LmtleXMobmV3T2JqKS5mb3JFYWNoKGsgPT4gIW5ld09ialtrXSAmJiB0eXBlb2YgbmV3T2JqW2tdICE9PSAnYm9vbGVhbicgJiYgZGVsZXRlIG5ld09ialtrXSk7XG4gIHJldHVybiBuZXdPYmo7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdW5pcXVlIHRpbWVcbiAqL1xubGV0IGxhc3Q7XG5leHBvcnQgY29uc3QgdW5pcXVlVGltZSA9ICgpID0+IHtcbiAgY29uc3QgdGltZSA9IERhdGUubm93KCk7XG4gIGxhc3QgPSB0aW1lID09PSBsYXN0ID8gdGltZSArIDEgOiB0aW1lO1xuICByZXR1cm4gbGFzdDtcbn07XG5cbi8qKlxuICogR2VuZXJhdGVzIHJhbmRvbSBzdHJpbmcgd2l0aCBwcm92aWRlZCBsZW5ndGhcbiAqXG4gKiBAcGFyYW0gbGVuXG4gKi9cbmV4cG9ydCBjb25zdCB1bmlxdWVJZCA9IChsZW46IG51bWJlciA9IDEwKTogc3RyaW5nID0+IHtcbiAgcmV0dXJuIG5ldyBBcnJheShsZW4pLmpvaW4oKS5yZXBsYWNlKC8oLnwkKS9nLCAoKSA9PiAoKE1hdGgucmFuZG9tKCkgKiAzNikgfCAwKS50b1N0cmluZygzNilbTWF0aC5yYW5kb20oKSA8IDAuNSA/ICd0b1N0cmluZycgOiAndG9VcHBlckNhc2UnXSgpKTtcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgaW5wdXQgaXMgYSBzdmdcbiAqXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXkgfCBCdWZmZXJ9IGZpbGVcbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gbWltZXR5cGVcbiAqL1xuZXhwb3J0IGNvbnN0IGdldE1pbWV0eXBlID0gYXN5bmMgKGZpbGU6IFVpbnQ4QXJyYXkgfCBCdWZmZXIsIG5hbWU/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICBsZXQgdHlwZTtcblxuICB0cnkge1xuICAgIHR5cGUgPSBhd2FpdCBmaWxlVHlwZUZyb21CdWZmZXIoZmlsZSBhcyBVaW50OEFycmF5KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUud2FybignQW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHByb2Nlc3NpbmcgdGhlIGJ1ZmZlcjonLCBlLm1lc3NhZ2UpO1xuICB9XG5cbiAgY29uc3QgZXhjbHVkZWRNaW1ldHlwZXMgPSBbJ3RleHQvcGxhaW4nLCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywgJ2FwcGxpY2F0aW9uL3gtbXMnLCAnYXBwbGljYXRpb24veC1tc2knLCAnYXBwbGljYXRpb24vemlwJywgJ2F1ZGlvL3gtbTRhJ107XG5cbiAgaWYgKHR5cGUgJiYgZXhjbHVkZWRNaW1ldHlwZXMuaW5kZXhPZih0eXBlLm1pbWUpID09PSAtMSkge1xuICAgIHJldHVybiB0eXBlLm1pbWU7XG4gIH1cblxuICBpZiAobmFtZSAmJiBuYW1lLmluZGV4T2YoJy4nKSA+IC0xKSB7XG4gICAgY29uc3QgbWltZSA9IGV4dGVuc2lvblRvTWltZShuYW1lKTtcblxuICAgIGlmIChtaW1lKSB7XG4gICAgICByZXR1cm4gbWltZTtcbiAgICB9XG4gIH1cblxuICB0cnkge1xuICAgIGlmIChpc3V0ZjgoZmlsZSkpIHtcbiAgICAgIHJldHVybiAndGV4dC9wbGFpbic7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBjb25zb2xlLndhcm4oJ0FkZGl0aW9uYWwgbWltZXR5cGUgY2hlY2tzICh0ZXh0L3BsYWluKSBhcmUgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgZm9yIGJyb3dzZXJzJyk7XG4gIH1cbiAgLy8gdGhpcyBpcyBvbmx5IGZhbGxiYWNrLCBvbWl0IGl0IGluIGNvdmVyYWdlXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5cbiAgLy8gaWYgd2UgY2FudCBmaW5kIHR5cGVzIGJ5IGV4dGVuc2lvbnMgYW5kIHdlIGhhdmUgbWFnaWMgYnl0ZXMgZmFsbGJhY2sgdG8gaXRcbiAgaWYgKHR5cGUpIHtcbiAgICByZXR1cm4gdHlwZS5taW1lO1xuICB9XG5cbiAgcmV0dXJuICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nO1xufTtcblxuLyoqXG4gKiBDaGFuZ2UgZXh0ZW5zaW9uIHRvIGFjY29yZGluZyBtaW1ldHlwZSB1c2luZyBleHQ9Pm1pbWV0eXBlIG1hcFxuICpcbiAqIEBwYXJhbSBleHQgLSBzdHJpbmdcbiAqIEByZXR1cm4gc3RyaW5nfGJvb2xlYW5cbiAqL1xuZXhwb3J0IGNvbnN0IGV4dGVuc2lvblRvTWltZSA9IChleHQ6IHN0cmluZykgPT4ge1xuICBpZiAoIWV4dCB8fCBleHQubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGV4dC5zcGxpdCgnLycpLmxlbmd0aCA9PT0gMikge1xuICAgIHJldHVybiBleHQ7XG4gIH1cblxuICBpZiAoZXh0LmluZGV4T2YoJy4nKSA+IC0xKSB7XG4gICAgZXh0ID0gZXh0LnNwbGl0KCcuJykucG9wKCk7XG4gIH1cblxuICBleHQgPSBleHQudG9Mb2NhbGVMb3dlckNhc2UoKTtcblxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoRXh0ZW5zaW9uc01hcCk7XG4gIGNvbnN0IG1hcExlbiA9IGtleXMubGVuZ3RoO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbWFwTGVuOyBpKyspIHtcbiAgICBpZiAoRXh0ZW5zaW9uc01hcFtrZXlzW2ldXS5pbmRleE9mKGV4dCkgPiAtMSkge1xuICAgICAgcmV0dXJuIGtleXNbaV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuO1xufTtcblxuLyoqXG4gKiBTYW5pdGl6ZXIgT3B0aW9uc1xuICovXG5leHBvcnQgdHlwZSBTYW5pdGl6ZU9wdGlvbnMgPVxuICB8IGJvb2xlYW5cbiAgfCB7XG4gICAgICBleGNsdWRlPzogc3RyaW5nW107XG4gICAgICByZXBsYWNlbWVudD86IHN0cmluZztcbiAgICB9O1xuXG4vKipcbiAqIFNhbml0aXplIGZpbGUgbmFtZVxuICpcbiAqIEBwYXJhbSBuYW1lXG4gKiBAcGFyYW0ge2Jvb2x9IG9wdGlvbnMgIC0gZW5hYmxlLGRpc2FibGUgc2FuaXRpemVyLCBkZWZhdWx0IGVuYWJsZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLnJlcGxhY2VtZW50IC0gcmVwbGFjZW1lbnQgZm9yIHNhbml0aXplZCBjaGFycyBkZWZhdWx0cyB0byBcIi1cIlxuICogQHBhcmFtIHtzdHJpbmdbXX0gb3B0aW9ucy5leGNsdWRlIC0gYXJyYXkgd2l0aCBleGNsdWRlZCBjaGFycyBkZWZhdWx0IC0gYFsnXFwnLCAneycsICd9JywnfCcsICclJywgJ2AnLCAnXCInLCBcIidcIiwgJ34nLCAnWycsICddJywgJyMnLCAnfCcsICdeJywgJzwnLCAnPiddYFxuICovXG5leHBvcnQgY29uc3Qgc2FuaXRpemVOYW1lID0gKG5hbWU6IHN0cmluZywgb3B0aW9uczogU2FuaXRpemVPcHRpb25zID0gdHJ1ZSk6IHN0cmluZyA9PiB7XG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Jvb2xlYW4nICYmICFvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5hbWU7XG4gIH1cblxuICBsZXQgZXh0O1xuXG4gIGNvbnN0IHJlcGxhY2VtZW50ID0gdHlwZW9mIG9wdGlvbnMgIT09ICdib29sZWFuJyAmJiBvcHRpb25zLnJlcGxhY2VtZW50ID8gb3B0aW9ucy5yZXBsYWNlbWVudCA6ICctJztcbiAgY29uc3QgZXhjbHVkZSA9IHR5cGVvZiBvcHRpb25zICE9PSAnYm9vbGVhbicgJiYgb3B0aW9ucy5leGNsdWRlID8gb3B0aW9ucy5leGNsdWRlIDogWydcXFxcJywgJ3snLCAnfScsICd8JywgJyUnLCAnYCcsICdcIicsIFwiJ1wiLCAnficsICdbJywgJ10nLCAnIycsICd8JywgJ14nLCAnPCcsICc+J107XG5cbiAgaWYgKCFuYW1lIHx8IG5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICd1bmRlZmluZWQnO1xuICB9XG5cbiAgY29uc3QgZmlsZVBhcnRzID0gbmFtZS5zcGxpdCgnLicpO1xuXG4gIGlmIChmaWxlUGFydHMubGVuZ3RoID4gMSkge1xuICAgIGV4dCA9IGZpbGVQYXJ0cy5wb3AoKTtcbiAgfVxuXG4gIHJldHVybiBgJHtmaWxlUGFydHNcbiAgICAuam9pbignLicpXG4gICAgLnNwbGl0KCcnKVxuICAgIC5tYXAoY2hhciA9PiAoZXhjbHVkZS5pbmRleE9mKGNoYXIpID4gLTEgPyByZXBsYWNlbWVudCA6IGNoYXIpKVxuICAgIC5qb2luKCcnKX0ke2V4dCA/ICcuJyArIGV4dCA6ICcnfWA7XG59O1xuXG4vKipcbiAqIEZpbHRlciBvYmplY3QgdG8gZ2l2ZW4gZmllbGRzXG4gKlxuICogQHBhcmFtIHRvRmlsdGVyXG4gKiBAcGFyYW0gcmVxdWlyZWRGaWVsZHNcbiAqL1xuZXhwb3J0IGNvbnN0IGZpbHRlck9iamVjdCA9ICh0b0ZpbHRlciwgcmVxdWlyZWRGaWVsZHM6IHN0cmluZ1tdKSA9PiB7XG4gIGlmICghcmVxdWlyZWRGaWVsZHMgfHwgcmVxdWlyZWRGaWVsZHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHRvRmlsdGVyO1xuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKHRvRmlsdGVyKS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdG9GaWx0ZXI7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmtleXModG9GaWx0ZXIpXG4gICAgLmZpbHRlcihmID0+IHJlcXVpcmVkRmllbGRzLmluZGV4T2YoZikgPiAtMSlcbiAgICAucmVkdWNlKChvYmosIGtleSkgPT4gKHsgLi4ub2JqLCBba2V5XTogdG9GaWx0ZXJba2V5XSB9KSwge30pO1xufTtcblxuLyoqXG4gKiBEZWVwIGNsZWFudXAgb2JqZWN0IGZyb20gZnVuY3Rpb25zXG4gKlxuICogQHBhcmFtIG9ialxuICovXG5leHBvcnQgY29uc3QgY2xlYW5VcENhbGxiYWNrcyA9IChvYmo6IGFueSkgPT4ge1xuICBpZiAoIW9iaiB8fCBPYmplY3Qua2V5cyhvYmopLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goayA9PiB7XG4gICAgaWYgKHR5cGVvZiBvYmpba10gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG9ialtrXSA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAob2JqW2tdID09PSBPYmplY3Qob2JqW2tdKSkge1xuICAgICAgb2JqW2tdID0gY2xlYW5VcENhbGxiYWNrcyhvYmpba10pO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIG9iajtcbn07XG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgubm9kZSc7XG4iXX0=