filestack-js
Version:
Official JavaScript library for Filestack
187 lines (185 loc) • 18 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getFile = void 0;
var tslib_1 = require("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.
*/
var file_1 = require("./file");
var utils_1 = require("./../../utils");
var filestack_error_1 = require("./../../../filestack_error");
var base64Regexp = /data:([a-zA-Z]*\/[a-zA-Z]*);base64,([^\"]*)/i;
/**
* Check if file is blob
* @param input
*/
var isFileBlob = function (input) { return input.toString() === '[object Blob]'; };
/**
* Check if input is instance of browser file
*
* @browser
* @param input
*/
var isFileBrowser = function (input) { return input instanceof File; };
/**
* Check if file is base64 string
*
* @param input
*/
var isFileBase = function (input) {
if (typeof input !== 'string') {
return false;
}
if (input.indexOf('base64') > -1) {
input = input.match(base64Regexp).pop();
}
try {
return btoa(atob(input)) === input;
}
catch (err) {
/* istanbul ignore next */
return false;
}
};
/**
* Check if file is instance of named interface
*
* @param input
*/
var isFileNamed = function (input) { return input && input['file'] && input['name']; };
/**
* Convert encoded base64 string or dataURI to blob
*
* @browser
* @param b64data String to decode
* @param sliceSize Byte quantity to split data into
* @private
* @returns {Blob}
*/
var b64toBlob = function (b64Data, sliceSize) {
if (sliceSize === void 0) { sliceSize = 512; }
var contentType = '';
if (b64Data.indexOf('base64') > -1) {
var matches = b64Data.match(base64Regexp);
b64Data = matches.pop();
contentType = matches[1];
}
var byteCharacters = atob(b64Data);
var byteArrays = [];
for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {
var slice = byteCharacters.slice(offset, offset + sliceSize);
var byteNumbers = new Array(slice.length);
for (var i = 0; i < slice.length; i += 1) {
byteNumbers[i] = slice.charCodeAt(i);
}
byteArrays.push(new Uint8Array(byteNumbers));
}
return new Blob(byteArrays, { type: contentType });
};
/**
* Read file as array buffer
*
* @browser
* @private
* @param blob
* @returns {Boolean}
*/
var readFile = function (file) { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
return tslib_1.__generator(this, function (_a) {
/* istanbul ignore next */
if (!File || !FileReader || !Blob) {
return [2 /*return*/, Promise.reject(new filestack_error_1.FilestackError('The File APIs are not fully supported by your browser'))];
}
return [2 /*return*/, Promise.resolve({
slice: function (start, end) {
return readPart(start, end, file);
},
release: function () {
file = null;
},
})];
});
}); };
/**
* Read file par instead of whole file to avoid browser crashing
*
* @param start - star byte
* @param end - end byte
* @param file - file to slice
*/
var readPart = function (start, end, file) {
return new Promise(function (resolve, reject) {
var r = new FileReader();
var blob = file.slice(start, end);
r.onload = function () { return resolve(r.result); };
r.onerror = reject;
r.readAsArrayBuffer(blob);
});
};
/**
* Accepts b64string or blob file
*
* @browser
* @param {*} fileOrString
* @returns {Promise<File>}
*/
var getFile = function (input, sanitizeOptions, mimetype) {
var filename;
var file;
if (isFileNamed(input)) {
filename = input.name;
input = input.file;
}
if (isFileBrowser(input)) {
file = input;
filename = input.name;
}
else if (isFileBase(input)) {
file = b64toBlob(input);
}
else if (isFileBlob(input)) {
file = input;
}
else {
return Promise.reject(new filestack_error_1.FilestackError('Unsupported input file type'));
}
return readFile(file).then(function (res) { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var mime, minimumBytes, _a;
return tslib_1.__generator(this, function (_b) {
switch (_b.label) {
case 0:
mime = file.type;
minimumBytes = 4100;
if (!(!file.type || file.type.length === 0 || file.type === 'text/plain')) return [3 /*break*/, 3];
_a = utils_1.getMimetype;
return [4 /*yield*/, res.slice(0, minimumBytes)];
case 1: return [4 /*yield*/, _a.apply(void 0, [_b.sent(), filename])];
case 2:
mime = _b.sent();
_b.label = 3;
case 3: return [2 /*return*/, new file_1.File({
name: filename,
size: file.size,
type: mimetype || mime,
slice: res.slice,
release: res.release,
}, sanitizeOptions)];
}
});
}); });
};
exports.getFile = getFile;
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvYXBpL3VwbG9hZC9maWxlX3Rvb2xzLmJyb3dzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILCtCQUF3QztBQUN4Qyx1Q0FBNkQ7QUFDN0QsOERBQTREO0FBVTVELElBQU0sWUFBWSxHQUFHLDhDQUE4QyxDQUFDO0FBRXBFOzs7R0FHRztBQUNILElBQU0sVUFBVSxHQUFHLFVBQUMsS0FBZ0IsSUFBb0IsT0FBQSxLQUFLLENBQUMsUUFBUSxFQUFFLEtBQUssZUFBZSxFQUFwQyxDQUFvQyxDQUFDO0FBRTdGOzs7OztHQUtHO0FBQ0gsSUFBTSxhQUFhLEdBQUcsVUFBQyxLQUFnQixJQUFvQixPQUFBLEtBQUssWUFBWSxJQUFJLEVBQXJCLENBQXFCLENBQUM7QUFFakY7Ozs7R0FJRztBQUNILElBQU0sVUFBVSxHQUFHLFVBQUMsS0FBZ0I7SUFDbEMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7UUFDN0IsT0FBTyxLQUFLLENBQUM7S0FDZDtJQUVELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtRQUNoQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztLQUN6QztJQUVELElBQUk7UUFDRixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUM7S0FDcEM7SUFBQyxPQUFPLEdBQUcsRUFBRTtRQUNaLDBCQUEwQjtRQUMxQixPQUFPLEtBQUssQ0FBQztLQUNkO0FBQ0gsQ0FBQyxDQUFDO0FBRUY7Ozs7R0FJRztBQUNILElBQU0sV0FBVyxHQUFHLFVBQUMsS0FBZ0IsSUFBOEIsT0FBQSxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBdkMsQ0FBdUMsQ0FB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QkFHdkUsc0JBQU8sSUFBSSxXQUFNLENBQ2Y7d0JBQ0UsSUFBSSxFQUFFLFFBQVE7d0JBQ2QsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO3dCQUNmLElBQUksRUFBRSxRQUFRLElBQUksSUFBSTt3QkFDdEIsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLO3dCQUNoQixPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQU87cUJBQ3JCLEVBQ0QsZUFBZSxDQUNoQixFQUFDOzs7U0FDSCxDQUNGLENBQUM7QUFDSixDQUFDLENBQUM7QUF4Q1csUUFBQSxPQUFPLFdBd0NsQiIsImZpbGUiOiJsaWIvYXBpL3VwbG9hZC9maWxlX3Rvb2xzLmJyb3dzZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE5IGJ5IEZpbGVzdGFjay5cbiAqIFNvbWUgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgRmlsZSBhcyBGc0ZpbGUgfSBmcm9tICcuL2ZpbGUnO1xuaW1wb3J0IHsgU2FuaXRpemVPcHRpb25zLCBnZXRNaW1ldHlwZSB9IGZyb20gJy4vLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgRmlsZXN0YWNrRXJyb3IgfSBmcm9tICcuLy4uLy4uLy4uL2ZpbGVzdGFja19lcnJvcic7XG5cbmV4cG9ydCB0eXBlIFJhd0ZpbGUgPSBCbG9iIHwgQnVmZmVyIHwgRmlsZSB8IHN0cmluZztcbmV4cG9ydCB0eXBlIE5hbWVkSW5wdXRGaWxlID0ge1xuICBuYW1lPzogc3RyaW5nO1xuICBmaWxlOiBSYXdGaWxlO1xufTtcblxudHlwZSBJbnB1dEZpbGUgPSBSYXdGaWxlIHwgTmFtZWRJbnB1dEZpbGU7XG5cbmNvbnN0IGJhc2U2NFJlZ2V4cCA9IC9kYXRhOihbYS16QS1aXSpcXC9bYS16QS1aXSopO2Jhc2U2NCwoW15cXFwiXSopL2k7XG5cbi8qKlxuICogQ2hlY2sgaWYgZmlsZSBpcyBibG9iXG4gKiBAcGFyYW0gaW5wdXRcbiAqL1xuY29uc3QgaXNGaWxlQmxvYiA9IChpbnB1dDogSW5wdXRGaWxlKTogaW5wdXQgaXMgQmxvYiA9PiBpbnB1dC50b1N0cmluZygpID09PSAnW29iamVjdCBCbG9iXSc7XG5cbi8qKlxuICogQ2hlY2sgaWYgaW5wdXQgaXMgaW5zdGFuY2Ugb2YgYnJvd3NlciBmaWxlXG4gKlxuICogQGJyb3dzZXJcbiAqIEBwYXJhbSBpbnB1dFxuICovXG5jb25zdCBpc0ZpbGVCcm93c2VyID0gKGlucHV0OiBJbnB1dEZpbGUpOiBpbnB1dCBpcyBGaWxlID0+IGlucHV0IGluc3RhbmNlb2YgRmlsZTtcblxuLyoqXG4gKiBDaGVjayBpZiBmaWxlIGlzIGJhc2U2NCBzdHJpbmdcbiAqXG4gKiBAcGFyYW0gaW5wdXRcbiAqL1xuY29uc3QgaXNGaWxlQmFzZSA9IChpbnB1dDogSW5wdXRGaWxlKTogaW5wdXQgaXMgc3RyaW5nID0+IHtcbiAgaWYgKHR5cGVvZiBpbnB1dCAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoaW5wdXQuaW5kZXhPZignYmFzZTY0JykgPiAtMSkge1xuICAgIGlucHV0ID0gaW5wdXQubWF0Y2goYmFzZTY0UmVnZXhwKS5wb3AoKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGJ0b2EoYXRvYihpbnB1dCkpID09PSBpbnB1dDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgZmlsZSBpcyBpbnN0YW5jZSBvZiBuYW1lZCBpbnRlcmZhY2VcbiAqXG4gKiBAcGFyYW0gaW5wdXRcbiAqL1xuY29uc3QgaXNGaWxlTmFtZWQgPSAoaW5wdXQ6IElucHV0RmlsZSk6IGlucHV0IGlzIE5hbWVkSW5wdXRGaWxlID0+IGlucHV0ICYmIGlucHV0WydmaWxlJ10gJiYgaW5wdXRbJ25hbWUnXTtcblxuLyoqXG4gKiBDb252ZXJ0IGVuY29kZWQgYmFzZTY0IHN0cmluZyBvciBkYXRhVVJJIHRvIGJsb2JcbiAqXG4gKiBAYnJvd3NlclxuICogQHBhcmFtIGI2NGRhdGEgICAgIFN0cmluZyB0byBkZWNvZGVcbiAqIEBwYXJhbSBzbGljZVNpemUgICBCeXRlIHF1YW50aXR5IHRvIHNwbGl0IGRhdGEgaW50b1xuICogQHByaXZhdGVcbiAqIEByZXR1cm5zIHtCbG9ifVxuICovXG5jb25zdCBiNjR0b0Jsb2IgPSAoYjY0RGF0YTogc3RyaW5nLCBzbGljZVNpemUgPSA1MTIpOiBCbG9iID0+IHtcbiAgbGV0IGNvbnRlbnRUeXBlID0gJyc7XG5cbiAgaWYgKGI2NERhdGEuaW5kZXhPZignYmFzZTY0JykgPiAtMSkge1xuICAgIGNvbnN0IG1hdGNoZXMgPSBiNjREYXRhLm1hdGNoKGJhc2U2NFJlZ2V4cCk7XG4gICAgYjY0RGF0YSA9IG1hdGNoZXMucG9wKCk7XG4gICAgY29udGVudFR5cGUgPSBtYXRjaGVzWzFdO1xuICB9XG5cbiAgY29uc3QgYnl0ZUNoYXJhY3RlcnMgPSBhdG9iKGI2NERhdGEpO1xuICBjb25zdCBieXRlQXJyYXlzOiBhbnlbXSA9IFtdO1xuXG4gIGZvciAobGV0IG9mZnNldCA9IDA7IG9mZnNldCA8IGJ5dGVDaGFyYWN0ZXJzLmxlbmd0aDsgb2Zmc2V0ICs9IHNsaWNlU2l6ZSkge1xuICAgIGNvbnN0IHNsaWNlID0gYnl0ZUNoYXJhY3RlcnMuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBzbGljZVNpemUpO1xuICAgIGNvbnN0IGJ5dGVOdW1iZXJzID0gbmV3IEFycmF5KHNsaWNlLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzbGljZS5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgYnl0ZU51bWJlcnNbaV0gPSBzbGljZS5jaGFyQ29kZUF0KGkpO1xuICAgIH1cblxuICAgIGJ5dGVBcnJheXMucHVzaChuZXcgVWludDhBcnJheShieXRlTnVtYmVycykpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBCbG9iKGJ5dGVBcnJheXMsIHsgdHlwZTogY29udGVudFR5cGUgfSk7XG59O1xuXG4vKipcbiAqIFJlYWQgZmlsZSBhcyBhcnJheSBidWZmZXJcbiAqXG4gKiBAYnJvd3NlclxuICogQHByaXZhdGVcbiAqIEBwYXJhbSBibG9iXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAqL1xuY29uc3QgcmVhZEZpbGUgPSBhc3luYyAoZmlsZSk6IFByb21pc2U8YW55PiA9PiB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGlmICghRmlsZSB8fCAhRmlsZVJlYWRlciB8fCAhQmxvYikge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRmlsZXN0YWNrRXJyb3IoJ1RoZSBGaWxlIEFQSXMgYXJlIG5vdCBmdWxseSBzdXBwb3J0ZWQgYnkgeW91ciBicm93c2VyJykpO1xuICB9XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7XG4gICAgc2xpY2U6IGZ1bmN0aW9uKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKSB7XG4gICAgICByZXR1cm4gcmVhZFBhcnQoc3RhcnQsIGVuZCwgZmlsZSk7XG4gICAgfSxcbiAgICByZWxlYXNlOiAoKSA9PiB7XG4gICAgICBmaWxlID0gbnVsbDtcbiAgICB9LFxuICB9KTtcbn07XG5cbi8qKlxuICogUmVhZCBmaWxlIHBhciBpbnN0ZWFkIG9mIHdob2xlIGZpbGUgdG8gYXZvaWQgYnJvd3NlciBjcmFzaGluZ1xuICpcbiAqIEBwYXJhbSBzdGFydCAtIHN0YXIgYnl0ZVxuICogQHBhcmFtIGVuZCAgLSBlbmQgYnl0ZVxuICogQHBhcmFtIGZpbGUgLSBmaWxlIHRvIHNsaWNlXG4gKi9cbmNvbnN0IHJlYWRQYXJ0ID0gKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyLCBmaWxlKTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCByID0gbmV3IEZpbGVSZWFkZXIoKTtcblxuICAgIGNvbnN0IGJsb2IgPSBmaWxlLnNsaWNlKHN0YXJ0LCBlbmQpO1xuICAgIHIub25sb2FkID0gKCkgPT4gcmVzb2x2ZShyLnJlc3VsdCk7XG4gICAgci5vbmVycm9yID0gcmVqZWN0O1xuICAgIHIucmVhZEFzQXJyYXlCdWZmZXIoYmxvYik7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBBY2NlcHRzIGI2NHN0cmluZyBvciBibG9iIGZpbGVcbiAqXG4gKiBAYnJvd3NlclxuICogQHBhcmFtIHsqfSBmaWxlT3JTdHJpbmdcbiAqIEByZXR1cm5zIHtQcm9taXNlPEZpbGU+fVxuICovXG5leHBvcnQgY29uc3QgZ2V0RmlsZSA9IChpbnB1dDogSW5wdXRGaWxlLCBzYW5pdGl6ZU9wdGlvbnM/OiBTYW5pdGl6ZU9wdGlvbnMsIG1pbWV0eXBlPzogc3RyaW5nKTogUHJvbWlzZTxGc0ZpbGU+ID0+IHtcbiAgbGV0IGZpbGVuYW1lO1xuICBsZXQgZmlsZTogQmxvYjtcblxuICBpZiAoaXNGaWxlTmFtZWQoaW5wdXQpKSB7XG4gICAgZmlsZW5hbWUgPSBpbnB1dC5uYW1lO1xuICAgIGlucHV0ID0gaW5wdXQuZmlsZTtcbiAgfVxuXG4gIGlmIChpc0ZpbGVCcm93c2VyKGlucHV0KSkge1xuICAgIGZpbGUgPSBpbnB1dDtcbiAgICBmaWxlbmFtZSA9IGlucHV0Lm5hbWU7XG4gIH0gZWxzZSBpZiAoaXNGaWxlQmFzZShpbnB1dCkpIHtcbiAgICBmaWxlID0gYjY0dG9CbG9iKGlucHV0KTtcbiAgfSBlbHNlIGlmIChpc0ZpbGVCbG9iKGlucHV0KSkge1xuICAgIGZpbGUgPSBpbnB1dDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEZpbGVzdGFja0Vycm9yKCdVbnN1cHBvcnRlZCBpbnB1dCBmaWxlIHR5cGUnKSk7XG4gIH1cblxuICByZXR1cm4gcmVhZEZpbGUoZmlsZSkudGhlbihcbiAgICBhc3luYyByZXMgPT4ge1xuICAgICAgbGV0IG1pbWUgPSBmaWxlLnR5cGU7XG4gICAgICBsZXQgbWluaW11bUJ5dGVzID0gNDEwMDtcbiAgICAgIGlmICghZmlsZS50eXBlICB8fCBmaWxlLnR5cGUubGVuZ3RoID09PSAwIHx8IGZpbGUudHlwZSA9PT0gJ3RleHQvcGxhaW4nKSB7XG4gICAgICAgIG1pbWUgPSBhd2FpdCBnZXRNaW1ldHlwZShhd2FpdCByZXMuc2xpY2UoMCwgbWluaW11bUJ5dGVzKSwgZmlsZW5hbWUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IEZzRmlsZShcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IGZpbGVuYW1lLFxuICAgICAgICAgIHNpemU6IGZpbGUuc2l6ZSxcbiAgICAgICAgICB0eXBlOiBtaW1ldHlwZSB8fCBtaW1lLFxuICAgICAgICAgIHNsaWNlOiByZXMuc2xpY2UsXG4gICAgICAgICAgcmVsZWFzZTogcmVzLnJlbGVhc2UsXG4gICAgICAgIH0sXG4gICAgICAgIHNhbml0aXplT3B0aW9uc1xuICAgICAgKTtcbiAgICB9XG4gICk7XG59O1xuIl19