filestack-js
Version:
Official JavaScript library for Filestack
251 lines (249 loc) • 22.7 kB
JavaScript
import { __assign, __awaiter, __generator } from "tslib";
/*
* Copyright (c) 2019 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 { md5, sanitizeName } from './../../utils';
/**
* File representation to unify file object in nodejs and browser
*
* @export
* @class File
*/
var File = /** @class */ (function () {
function File(_file, _sanitizeOptions) {
this._file = _file;
this._sanitizeOptions = _sanitizeOptions;
this._file.name = sanitizeName(this._file.name, this._sanitizeOptions);
}
Object.defineProperty(File.prototype, "name", {
/**
* Returns file name
*
* @returns {string}
* @memberof File
*/
get: function () {
return this._file.name;
},
/**
* Sets new file name and cleanup extra chars
*
* @memberof File
*/
set: function (val) {
this._file.name = sanitizeName(val, this._sanitizeOptions);
},
enumerable: false,
configurable: true
});
Object.defineProperty(File.prototype, "filename", {
/**
* Alias for name getter
*
* @readonly
* @type {string}
* @memberof File
*/
get: function () {
return this.name;
},
enumerable: false,
configurable: true
});
Object.defineProperty(File.prototype, "customName", {
/**
* Sets custom name using string or function
* Name will be sanitized
*
* @memberof File
*/
set: function (val) {
switch (typeof val) {
case 'string':
this.name = val;
break;
case 'function':
var newName = val(this);
if (typeof newName !== 'string') {
throw new Error("Name function must return a string. Current return type is ".concat(typeof val));
}
this.name = val(this);
break;
}
},
enumerable: false,
configurable: true
});
Object.defineProperty(File.prototype, "type", {
/**
* Returns file type
*
* @default 'application/octet-stream'
* @returns {string}
* @memberof File
*/
get: function () {
/* istanbul ignore next */
return this._file.type || 'application/octet-stream';
},
enumerable: false,
configurable: true
});
Object.defineProperty(File.prototype, "mimetype", {
/**
* Alias for file type
*
* @readonly
* @type {string}
* @memberof File
*/
get: function () {
return this.type;
},
enumerable: false,
configurable: true
});
Object.defineProperty(File.prototype, "size", {
/**
* Returns file size
*
* @returns {number}
* @memberof File
*/
get: function () {
return this._file.size;
},
enumerable: false,
configurable: true
});
/**
* Returns number of parts and part size according to max limit
* @param {number} size - part size in bytes
* @returns {PartSize}
* @memberof File
*/
File.prototype.getPartsCount = function (size, intelligentChunk) {
var DEFAULT_FILE_SIZE_LIMIT = 59 * 1024 * 1024 * 1024;
var INTELLIGENT_FILE_SIZE_LIMIT = 79 * 1024 * 1024 * 1024;
var FILE_SIZE_LIMIT = intelligentChunk ? INTELLIGENT_FILE_SIZE_LIMIT : DEFAULT_FILE_SIZE_LIMIT;
var MAX_S3_CHUNKS_ALLOWED = 10000;
// When file size is greater than 60GB, chunk size is calculated dynamically
// Chunk count is set to the max number of chunks allowed over s3
if (this._file.size >= FILE_SIZE_LIMIT) {
var dynamicPartSize = Math.ceil(this._file.size / MAX_S3_CHUNKS_ALLOWED); // size is set in bytes
return {
partsCount: Math.ceil(this._file.size / dynamicPartSize),
chunkSize: dynamicPartSize,
};
}
return {
partsCount: Math.ceil(this._file.size / size),
chunkSize: size,
};
};
/**
* Returns part metadata
*
* @param {number} [partNum=0]
* @param {*} size
* @returns {FilePartMetadata}
* @memberof File
*/
File.prototype.getPartMetadata = function (partNum, size) {
var startByte = size * partNum;
if (startByte > this._file.size) {
throw new Error("Start byte of the part is higher than buffer size");
}
var endByte = Math.min(startByte + size, this._file.size);
return {
partNumber: partNum,
startByte: startByte,
endByte: endByte,
size: endByte - startByte,
};
};
/**
* Returns part metadata + buffer
*
* @param {FilePartMetadata} meta
* @returns {FilePart}
* @memberof File
*/
File.prototype.getPartByMetadata = function (meta, md5Enabled) {
if (md5Enabled === void 0) { md5Enabled = true; }
return __awaiter(this, void 0, void 0, function () {
var slice;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this._file.slice(meta.startByte, meta.endByte)];
case 1:
slice = _a.sent();
return [2 /*return*/, Promise.resolve(__assign(__assign({}, meta), { buffer: slice, md5: md5Enabled ? md5(slice) : undefined }))];
}
});
});
};
/**
* Returns part chunk
*
* @param {FilePartMetadata} meta
* @param {number} offset
* @param {number} chunkSize
* @returns {FilePart}
* @memberof File
*/
File.prototype.getChunkByMetadata = function (meta, offset, chunkSize, md5Enabled) {
if (md5Enabled === void 0) { md5Enabled = true; }
return __awaiter(this, void 0, void 0, function () {
var startByte, endByte, slice;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
startByte = meta.startByte + offset;
endByte = Math.min(startByte + chunkSize, meta.endByte);
return [4 /*yield*/, this._file.slice(startByte, endByte)];
case 1:
slice = _a.sent();
return [2 /*return*/, Promise.resolve(__assign(__assign({}, meta), { buffer: slice, md5: md5Enabled ? md5(slice) : undefined, size: slice.byteLength, startByte: startByte, endByte: endByte, offset: offset }))];
}
});
});
};
/**
* Cleanup file buffer to release memory
*
* @memberof File
*/
File.prototype.release = function () {
if (this._file.release) {
this._file.release();
}
};
File.prototype.toJSON = function () {
return {
name: this.name,
status: this.status,
type: this.type,
size: this.size,
url: this.url,
handle: this.handle,
uploadTags: this.uploadTags,
};
};
return File;
}());
export { File };
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvYXBpL3VwbG9hZC9maWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUUsR0FBRyxFQUFFLFlBQVksRUFBbUIsTUFBTSxlQUFlLENBQUM7QUEyQ25FOzs7OztHQUtHO0FBQ0g7SUFrQkUsY0FBNkIsS0FBbUIsRUFBbUIsZ0JBQWtDO1FBQXhFLFVBQUssR0FBTCxLQUFLLENBQWM7UUFBbUIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNuRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDekUsQ0FBQztJQVFELHNCQUFXLHNCQUFJO1FBTmY7Ozs7O1dBS0c7YUFDSDtZQUNFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFDekIsQ0FBQztRQWFEOzs7O1dBSUc7YUFDSCxVQUFnQixHQUFXO1lBQ3pCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLFlBQVksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDN0QsQ0FBQzs7O09BcEJBO0lBU0Qsc0JBQVcsMEJBQVE7UUFQbkI7Ozs7OztXQU1HO2FBQ0g7WUFDRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDbkIsQ0FBQzs7O09BQUE7SUFpQkQsc0JBQVcsNEJBQVU7UUFOckI7Ozs7O1dBS0c7YUFDSCxVQUFzQixHQUFzQztZQUMxRCxRQUFRLE9BQU8sR0FBRyxFQUFFO2dCQUNsQixLQUFLLFFBQVE7b0JBQ1gsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7b0JBQ2hCLE1BQU07Z0JBQ1IsS0FBSyxVQUFVO29CQUNiLElBQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDMUIsSUFB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LEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO1lBQ2IsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtTQUM1QixDQUFDO0lBQ0osQ0FBQztJQUNILFdBQUM7QUFBRCxDQWxPQSxBQWtPQyxJQUFBIiwiZmlsZSI6ImxpYi9hcGkvdXBsb2FkL2ZpbGUuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IGJ5IEZpbGVzdGFjay5cbiAqIFNvbWUgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgbWQ1LCBzYW5pdGl6ZU5hbWUsIFNhbml0aXplT3B0aW9ucyB9IGZyb20gJy4vLi4vLi4vdXRpbHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVwbG9hZFRhZ3Mge1xuICBba2V5OiBzdHJpbmddOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZUluc3RhbmNlIHtcbiAgbmFtZTogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIHNpemU6IG51bWJlcjtcbiAgc2xpY2U6IChzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcikgPT4gUHJvbWlzZTxBcnJheUJ1ZmZlcj47XG4gIHJlbGVhc2U/OiAoKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgY29uc3QgZW51bSBGaWxlU3RhdGUge1xuICBJTklUID0gJ0luaXRpYWxpemVkJyxcbiAgUFJPR1JFU1MgPSAnUHJvZ3Jlc3MnLFxuICBTVE9SRUQgPSAnU3RvcmVkJyxcbiAgSU5UUkFOU0lUID0gJ0luVHJhbnNpdCcsXG4gIEZBSUxFRCA9ICdGYWlsZWQnLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVQYXJ0TWV0YWRhdGEge1xuICBzdGFydEJ5dGU6IG51bWJlcjtcbiAgZW5kQnl0ZTogbnVtYmVyO1xuICBwYXJ0TnVtYmVyOiBudW1iZXI7XG4gIHNpemU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWxlUGFydCBleHRlbmRzIEZpbGVQYXJ0TWV0YWRhdGEge1xuICBidWZmZXI6IEJ1ZmZlciB8IEFycmF5QnVmZmVyO1xuICBtZDU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZUNodW5rIGV4dGVuZHMgRmlsZVBhcnQge1xuICBvZmZzZXQ6IG51bWJlcjsgLy8gb2Zmc2V0IGZvciBjaHVuayAtIGZyb20gcGFydCBzdGFydFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRTaXplIHtcbiAgcGFydHNDb3VudDogbnVtYmVyO1xuICBjaHVua1NpemU6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBGaWxlIHJlcHJlc2VudGF0aW9uIHRvIHVuaWZ5IGZpbGUgb2JqZWN0IGluIG5vZGVqcyBhbmQgYnJvd3NlclxuICpcbiAqIEBleHBvcnRcbiAqIEBjbGFzcyBGaWxlXG4gKi9cbmV4cG9ydCBjbGFzcyBGaWxlIHtcblxuICBwdWJsaWMgc3RhdHVzOiBGaWxlU3RhdGU7XG5cbiAgcHVibGljIGhhbmRsZTogc3RyaW5nO1xuXG4gIHB1YmxpYyB1cmw6IHN0cmluZztcblxuICBwdWJsaWMgY29udGFpbmVyOiBzdHJpbmc7XG5cbiAgcHVibGljIGtleTogc3RyaW5nO1xuXG4gIHB1YmxpYyB3b3JrZmxvd3M6IGFueVtdO1xuXG4gIHB1YmxpYyB1cGxvYWRUYWdzOiBVcGxvYWRUYWdzO1xuXG4gIHB1YmxpYyBhbHQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IF9maWxlOiBGaWxlSW5zdGFuY2UsIHByaXZhdGUgcmVhZG9ubHkgX3Nhbml0aXplT3B0aW9ucz86IFNhbml0aXplT3B0aW9ucykge1xuICAgIHRoaXMuX2ZpbGUubmFtZSA9IHNhbml0aXplTmFtZSh0aGlzLl9maWxlLm5hbWUsIHRoaXMuX3Nhbml0aXplT3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBmaWxlIG5hbWVcbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICogQG1lbWJlcm9mIEZpbGVcbiAgICovXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9maWxlLm5hbWU7XG4gIH1cblxuICAvKipcbiAgICogQWxpYXMgZm9yIG5hbWUgZ2V0dGVyXG4gICAqXG4gICAqIEByZWFkb25seVxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgRmlsZVxuICAgKi9cbiAgcHVibGljIGdldCBmaWxlbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm5hbWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBuZXcgZmlsZSBuYW1lICBhbmQgY2xlYW51cCBleHRyYSBjaGFyc1xuICAgKlxuICAgKiBAbWVtYmVyb2YgRmlsZVxuICAgKi9cbiAgcHVibGljIHNldCBuYW1lKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5fZmlsZS5uYW1lID0gc2FuaXRpemVOYW1lKHZhbCwgdGhpcy5fc2FuaXRpemVPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGN1c3RvbSBuYW1lIHVzaW5nIHN0cmluZyBvciBmdW5jdGlvblxuICAgKiBOYW1lIHdpbGwgYmUgc2FuaXRpemVkXG4gICAqXG4gICAqIEBtZW1iZXJvZiBGaWxlXG4gICAqL1xuICBwdWJsaWMgc2V0IGN1c3RvbU5hbWUodmFsOiAoKGZpbGU6IHRoaXMpID0+IHN0cmluZykgfCBzdHJpbmcpIHtcbiAgICBzd2l0Y2ggKHR5cGVvZiB2YWwpIHtcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIHRoaXMubmFtZSA9IHZhbDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICAgIGNvbnN0IG5ld05hbWUgPSB2YWwodGhpcyk7XG4gICAgICAgIGlmICh0eXBlb2YgbmV3TmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5hbWUgZnVuY3Rpb24gbXVzdCByZXR1cm4gYSBzdHJpbmcuIEN1cnJlbnQgcmV0dXJuIHR5cGUgaXMgJHt0eXBlb2YgdmFsfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5uYW1lID0gdmFsKHRoaXMpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBmaWxlIHR5cGVcbiAgICpcbiAgICogQGRlZmF1bHQgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSdcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICogQG1lbWJlcm9mIEZpbGVcbiAgICovXG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBzdHJpbmcge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgcmV0dXJuIHRoaXMuX2ZpbGUudHlwZSB8fCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJztcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGlhcyBmb3IgZmlsZSB0eXBlXG4gICAqXG4gICAqIEByZWFkb25seVxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAbWVtYmVyb2YgRmlsZVxuICAgKi9cbiAgcHVibGljIGdldCBtaW1ldHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnR5cGU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBmaWxlIHNpemVcbiAgICpcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICogQG1lbWJlcm9mIEZpbGVcbiAgICovXG4gIHB1YmxpYyBnZXQgc2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9maWxlLnNpemU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBudW1iZXIgb2YgcGFydHMgYW5kIHBhcnQgc2l6ZSBhY2NvcmRpbmcgdG8gbWF4IGxpbWl0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIC0gcGFydCBzaXplIGluIGJ5dGVzXG4gICAqIEByZXR1cm5zIHtQYXJ0U2l6ZX1cbiAgICogQG1lbWJlcm9mIEZpbGVcbiAgICovXG4gIHB1YmxpYyBnZXRQYXJ0c0NvdW50IChzaXplOiBudW1iZXIsIGludGVsbGlnZW50Q2h1bms6IGJvb2xlYW4pOiBQYXJ0U2l6ZSB7XG4gICAgY29uc3QgREVGQVVMVF9GSUxFX1NJWkVfTElNSVQgPSA1OSAqIDEwMjQgKiAxMDI0ICogMTAyNDtcbiAgICBjb25zdCBJTlRFTExJR0VOVF9GSUxFX1NJWkVfTElNSVQgPSA3OSAqIDEwMjQgKiAxMDI0ICogMTAyNDtcbiAgICBjb25zdCBGSUxFX1NJWkVfTElNSVQgPSBpbnRlbGxpZ2VudENodW5rID8gSU5URUxMSUdFTlRfRklMRV9TSVpFX0xJTUlUIDogREVGQVVMVF9GSUxFX1NJWkVfTElNSVQ7XG4gICAgY29uc3QgTUFYX1MzX0NIVU5LU19BTExPV0VEID0gMTAwMDA7XG5cbiAgICAvLyBXaGVuIGZpbGUgc2l6ZSBpcyBncmVhdGVyIHRoYW4gNjBHQiwgY2h1bmsgc2l6ZSBpcyBjYWxjdWxhdGVkIGR5bmFtaWNhbGx5XG4gICAgLy8gQ2h1bmsgY291bnQgaXMgc2V0IHRvIHRoZSBtYXggbnVtYmVyIG9mIGNodW5rcyBhbGxvd2VkIG92ZXIgczNcbiAgICBpZiAodGhpcy5fZmlsZS5zaXplID49IEZJTEVfU0laRV9MSU1JVCkge1xuICAgICAgY29uc3QgZHluYW1pY1BhcnRTaXplID0gTWF0aC5jZWlsKHRoaXMuX2ZpbGUuc2l6ZSAvIE1BWF9TM19DSFVOS1NfQUxMT1dFRCk7IC8vIHNpemUgaXMgc2V0IGluIGJ5dGVzXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhcnRzQ291bnQ6IE1hdGguY2VpbCh0aGlzLl9maWxlLnNpemUgLyBkeW5hbWljUGFydFNpemUpLFxuICAgICAgICBjaHVua1NpemU6IGR5bmFtaWNQYXJ0U2l6ZSxcbiAgICAgIH07XG5cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcGFydHNDb3VudDogTWF0aC5jZWlsKHRoaXMuX2ZpbGUuc2l6ZSAvIHNpemUpLFxuICAgICAgY2h1bmtTaXplOiBzaXplLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBwYXJ0IG1ldGFkYXRhXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbcGFydE51bT0wXVxuICAgKiBAcGFyYW0geyp9IHNpemVcbiAgICogQHJldHVybnMge0ZpbGVQYXJ0TWV0YWRhdGF9XG4gICAqIEBtZW1iZXJvZiBGaWxlXG4gICAqL1xuICBwdWJsaWMgZ2V0UGFydE1ldGFkYXRhIChwYXJ0TnVtOiBudW1iZXIsIHNpemU6IG51bWJlcik6IEZpbGVQYXJ0TWV0YWRhdGEge1xuICAgIGNvbnN0IHN0YXJ0Qnl0ZSA9IHNpemUgKiBwYXJ0TnVtO1xuXG4gICAgaWYgKHN0YXJ0Qnl0ZSA+IHRoaXMuX2ZpbGUuc2l6ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTdGFydCBieXRlIG9mIHRoZSBwYXJ0IGlzIGhpZ2hlciB0aGFuIGJ1ZmZlciBzaXplYCk7XG4gICAgfVxuXG4gICAgY29uc3QgZW5kQnl0ZSA9IE1hdGgubWluKHN0YXJ0Qnl0ZSArIHNpemUsIHRoaXMuX2ZpbGUuc2l6ZSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgcGFydE51bWJlcjogcGFydE51bSxcbiAgICAgIHN0YXJ0Qnl0ZSxcbiAgICAgIGVuZEJ5dGUsXG4gICAgICBzaXplOiBlbmRCeXRlIC0gc3RhcnRCeXRlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBwYXJ0IG1ldGFkYXRhICsgYnVmZmVyXG4gICAqXG4gICAqIEBwYXJhbSB7RmlsZVBhcnRNZXRhZGF0YX0gbWV0YVxuICAgKiBAcmV0dXJucyB7RmlsZVBhcnR9XG4gICAqIEBtZW1iZXJvZiBGaWxlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0UGFydEJ5TWV0YWRhdGEobWV0YTogRmlsZVBhcnRNZXRhZGF0YSwgbWQ1RW5hYmxlZDogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPEZpbGVQYXJ0PiB7XG4gICAgbGV0IHNsaWNlID0gYXdhaXQgdGhpcy5fZmlsZS5zbGljZShtZXRhLnN0YXJ0Qnl0ZSwgbWV0YS5lbmRCeXRlKTtcblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgLi4ubWV0YSxcbiAgICAgIGJ1ZmZlcjogc2xpY2UsXG4gICAgICBtZDU6IG1kNUVuYWJsZWQgPyBtZDUoc2xpY2UpIDogdW5kZWZpbmVkLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgcGFydCBjaHVua1xuICAgKlxuICAgKiBAcGFyYW0ge0ZpbGVQYXJ0TWV0YWRhdGF9IG1ldGFcbiAgICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldFxuICAgKiBAcGFyYW0ge251bWJlcn0gY2h1bmtTaXplXG4gICAqIEByZXR1cm5zIHtGaWxlUGFydH1cbiAgICogQG1lbWJlcm9mIEZpbGVcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDaHVua0J5TWV0YWRhdGEobWV0YTogRmlsZVBhcnRNZXRhZGF0YSwgb2Zmc2V0OiBudW1iZXIsIGNodW5rU2l6ZTogbnVtYmVyLCBtZDVFbmFibGVkOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8RmlsZUNodW5rPiB7XG4gICAgY29uc3Qgc3RhcnRCeXRlID0gbWV0YS5zdGFydEJ5dGUgKyBvZmZzZXQ7XG4gICAgY29uc3QgZW5kQnl0ZSA9IE1hdGgubWluKHN0YXJ0Qnl0ZSArIGNodW5rU2l6ZSwgbWV0YS5lbmRCeXRlKTtcblxuICAgIGxldCBzbGljZSA9IGF3YWl0IHRoaXMuX2ZpbGUuc2xpY2Uoc3RhcnRCeXRlLCBlbmRCeXRlKTtcblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgLi4ubWV0YSxcbiAgICAgIGJ1ZmZlcjogc2xpY2UsXG4gICAgICBtZDU6IG1kNUVuYWJsZWQgPyBtZDUoc2xpY2UpIDogdW5kZWZpbmVkLFxuICAgICAgc2l6ZTogc2xpY2UuYnl0ZUxlbmd0aCxcbiAgICAgIHN0YXJ0Qnl0ZSxcbiAgICAgIGVuZEJ5dGUsXG4gICAgICBvZmZzZXQsXG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIENsZWFudXAgZmlsZSBidWZmZXIgdG8gcmVsZWFzZSBtZW1vcnlcbiAgICpcbiAgICogQG1lbWJlcm9mIEZpbGVcbiAgICovXG4gIHB1YmxpYyByZWxlYXNlKCkge1xuICAgIGlmICh0aGlzLl9maWxlLnJlbGVhc2UpIHtcbiAgICAgIHRoaXMuX2ZpbGUucmVsZWFzZSgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICBzaXplOiB0aGlzLnNpemUsXG4gICAgICB1cmw6IHRoaXMudXJsLFxuICAgICAgaGFuZGxlOiB0aGlzLmhhbmRsZSxcbiAgICAgIHVwbG9hZFRhZ3M6IHRoaXMudXBsb2FkVGFncyxcbiAgICB9O1xuICB9XG59XG4iXX0=