browserfs
Version:
A filesystem in your browser!
209 lines • 29.6 kB
JavaScript
;
var util = require('../core/util');
var api_error_1 = require('../core/api_error');
function getIEByteArray(IEByteArray) {
var rawBytes = IEBinaryToArray_ByteStr(IEByteArray);
var lastChr = IEBinaryToArray_ByteStr_Last(IEByteArray);
var data_str = rawBytes.replace(/[\s\S]/g, function (match) {
var v = match.charCodeAt(0);
return String.fromCharCode(v & 0xff, v >> 8);
}) + lastChr;
var data_array = new Array(data_str.length);
for (var i = 0; i < data_str.length; i++) {
data_array[i] = data_str.charCodeAt(i);
}
return data_array;
}
function downloadFileIE(async, p, type, cb) {
switch (type) {
case 'buffer':
case 'json':
break;
default:
return cb(new api_error_1.ApiError(api_error_1.ErrorCode.EINVAL, "Invalid download type: " + type));
}
var req = new XMLHttpRequest();
req.open('GET', p, async);
req.setRequestHeader("Accept-Charset", "x-user-defined");
req.onreadystatechange = function (e) {
var data_array;
if (req.readyState === 4) {
if (req.status === 200) {
switch (type) {
case 'buffer':
data_array = getIEByteArray(req.responseBody);
return cb(null, new Buffer(data_array));
case 'json':
return cb(null, JSON.parse(req.responseText));
}
}
else {
return cb(new api_error_1.ApiError(req.status, "XHR error."));
}
}
};
req.send();
}
function asyncDownloadFileIE(p, type, cb) {
downloadFileIE(true, p, type, cb);
}
function syncDownloadFileIE(p, type) {
var rv;
downloadFileIE(false, p, type, function (err, data) {
if (err)
throw err;
rv = data;
});
return rv;
}
function asyncDownloadFileModern(p, type, cb) {
var req = new XMLHttpRequest();
req.open('GET', p, true);
var jsonSupported = true;
switch (type) {
case 'buffer':
req.responseType = 'arraybuffer';
break;
case 'json':
try {
req.responseType = 'json';
jsonSupported = req.responseType === 'json';
}
catch (e) {
jsonSupported = false;
}
break;
default:
return cb(new api_error_1.ApiError(api_error_1.ErrorCode.EINVAL, "Invalid download type: " + type));
}
req.onreadystatechange = function (e) {
if (req.readyState === 4) {
if (req.status === 200) {
switch (type) {
case 'buffer':
return cb(null, new Buffer(req.response ? req.response : 0));
case 'json':
if (jsonSupported) {
return cb(null, req.response);
}
else {
return cb(null, JSON.parse(req.responseText));
}
}
}
else {
return cb(new api_error_1.ApiError(req.status, "XHR error."));
}
}
};
req.send();
}
function syncDownloadFileModern(p, type) {
var req = new XMLHttpRequest();
req.open('GET', p, false);
var data = null;
var err = null;
req.overrideMimeType('text/plain; charset=x-user-defined');
req.onreadystatechange = function (e) {
if (req.readyState === 4) {
if (req.status === 200) {
switch (type) {
case 'buffer':
var text = req.responseText;
data = new Buffer(text.length);
for (var i = 0; i < text.length; i++) {
data.writeUInt8(text.charCodeAt(i), i);
}
return;
case 'json':
data = JSON.parse(req.responseText);
return;
}
}
else {
err = new api_error_1.ApiError(req.status, "XHR error.");
return;
}
}
};
req.send();
if (err) {
throw err;
}
return data;
}
function syncDownloadFileIE10(p, type) {
var req = new XMLHttpRequest();
req.open('GET', p, false);
switch (type) {
case 'buffer':
req.responseType = 'arraybuffer';
break;
case 'json':
break;
default:
throw new api_error_1.ApiError(api_error_1.ErrorCode.EINVAL, "Invalid download type: " + type);
}
var data;
var err;
req.onreadystatechange = function (e) {
if (req.readyState === 4) {
if (req.status === 200) {
switch (type) {
case 'buffer':
data = new Buffer(req.response);
break;
case 'json':
data = JSON.parse(req.response);
break;
}
}
else {
err = new api_error_1.ApiError(req.status, "XHR error.");
}
}
};
req.send();
if (err) {
throw err;
}
return data;
}
function getFileSize(async, p, cb) {
var req = new XMLHttpRequest();
req.open('HEAD', p, async);
req.onreadystatechange = function (e) {
if (req.readyState === 4) {
if (req.status == 200) {
try {
return cb(null, parseInt(req.getResponseHeader('Content-Length') || '-1', 10));
}
catch (e) {
return cb(new api_error_1.ApiError(api_error_1.ErrorCode.EIO, "XHR HEAD error: Could not read content-length."));
}
}
else {
return cb(new api_error_1.ApiError(req.status, "XHR HEAD error."));
}
}
};
req.send();
}
exports.asyncDownloadFile = (util.isIE && typeof Blob === 'undefined') ? asyncDownloadFileIE : asyncDownloadFileModern;
exports.syncDownloadFile = (util.isIE && typeof Blob === 'undefined') ? syncDownloadFileIE : (util.isIE && typeof Blob !== 'undefined') ? syncDownloadFileIE10 : syncDownloadFileModern;
function getFileSizeSync(p) {
var rv;
getFileSize(false, p, function (err, size) {
if (err) {
throw err;
}
rv = size;
});
return rv;
}
exports.getFileSizeSync = getFileSizeSync;
function getFileSizeAsync(p, cb) {
getFileSize(true, p, cb);
}
exports.getFileSizeAsync = getFileSizeAsync;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieGhyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2dlbmVyaWMveGhyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFLQSxJQUFPLElBQUksV0FBVyxjQUFjLENBQUMsQ0FBQztBQUN0QywwQkFBa0MsbUJBQW1CLENBQUMsQ0FBQTtBQU90RCx3QkFBd0IsV0FBZ0I7SUFDdEMsSUFBSSxRQUFRLEdBQUcsdUJBQXVCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDcEQsSUFBSSxPQUFPLEdBQUcsNEJBQTRCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDeEQsSUFBSSxRQUFRLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsVUFBUyxLQUFLO1FBQ3ZELElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDM0IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxHQUFDLElBQUksRUFBRSxDQUFDLElBQUUsQ0FBQyxDQUFDLENBQUE7SUFDMUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDO0lBQ2IsSUFBSSxVQUFVLEdBQUcsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzVDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3pDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFDRCxNQUFNLENBQUMsVUFBVSxDQUFDO0FBQ3BCLENBQUM7QUFFRCx3QkFBd0IsS0FBYyxFQUFFLENBQVMsRUFBRSxJQUFZLEVBQUUsRUFBdUM7SUFDdEcsTUFBTSxDQUFBLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNaLEtBQUssUUFBUSxDQUFDO1FB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QixtQkFFL0IsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29udGFpbnMgdXRpbGl0eSBtZXRob2RzIGZvciBwZXJmb3JtaW5nIGEgdmFyaWV0eSBvZiB0YXNrcyB3aXRoXG4gKiBYbWxIdHRwUmVxdWVzdCBhY3Jvc3MgYnJvd3NlcnMuXG4gKi9cblxuaW1wb3J0IHV0aWwgPSByZXF1aXJlKCcuLi9jb3JlL3V0aWwnKTtcbmltcG9ydCB7QXBpRXJyb3IsIEVycm9yQ29kZX0gZnJvbSAnLi4vY29yZS9hcGlfZXJyb3InO1xuXG4vLyBTZWUgY29yZS9wb2x5ZmlsbHMgZm9yIHRoZSBWQlNjcmlwdCBkZWZpbml0aW9uIG9mIHRoZXNlIGZ1bmN0aW9ucy5cbmRlY2xhcmUgdmFyIElFQmluYXJ5VG9BcnJheV9CeXRlU3RyOiAodmJhcnI6IGFueSkgPT4gc3RyaW5nO1xuZGVjbGFyZSB2YXIgSUVCaW5hcnlUb0FycmF5X0J5dGVTdHJfTGFzdDogKHZiYXJyOiBhbnkpID0+IHN0cmluZztcbi8vIENvbnZlcnRzICdyZXNwb25zZUJvZHknIGluIElFIGludG8gdGhlIGVxdWl2YWxlbnQgJ3Jlc3BvbnNlVGV4dCcgdGhhdCBvdGhlclxuLy8gYnJvd3NlcnMgd291bGQgZ2VuZXJhdGUuXG5mdW5jdGlvbiBnZXRJRUJ5dGVBcnJheShJRUJ5dGVBcnJheTogYW55KTogbnVtYmVyW10ge1xuICB2YXIgcmF3Qnl0ZXMgPSBJRUJpbmFyeVRvQXJyYXlfQnl0ZVN0cihJRUJ5dGVBcnJheSk7XG4gIHZhciBsYXN0Q2hyID0gSUVCaW5hcnlUb0FycmF5X0J5dGVTdHJfTGFzdChJRUJ5dGVBcnJheSk7XG4gIHZhciBkYXRhX3N0ciA9IHJhd0J5dGVzLnJlcGxhY2UoL1tcXHNcXFNdL2csIGZ1bmN0aW9uKG1hdGNoKSB7XG4gICAgdmFyIHYgPSBtYXRjaC5jaGFyQ29kZUF0KDApXG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodiYweGZmLCB2Pj44KVxuICB9KSArIGxhc3RDaHI7XG4gIHZhciBkYXRhX2FycmF5ID0gbmV3IEFycmF5KGRhdGFfc3RyLmxlbmd0aCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YV9zdHIubGVuZ3RoOyBpKyspIHtcbiAgICBkYXRhX2FycmF5W2ldID0gZGF0YV9zdHIuY2hhckNvZGVBdChpKTtcbiAgfVxuICByZXR1cm4gZGF0YV9hcnJheTtcbn1cblxuZnVuY3Rpb24gZG93bmxvYWRGaWxlSUUoYXN5bmM6IGJvb2xlYW4sIHA6IHN0cmluZywgdHlwZTogc3RyaW5nLCBjYjogKGVycjogQXBpRXJyb3IsIGRhdGE/OiBhbnkpID0+IHZvaWQpOiB2b2lkIHtcbiAgc3dpdGNoKHR5cGUpIHtcbiAgICBjYXNlICdidWZmZXInOlxuICAgICAgLy8gRmFsbHRocm91Z2hcbiAgICBjYXNlICdqc29uJzpcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gY2IobmV3IEFwaUVycm9yKEVycm9yQ29kZS5FSU5WQUwsIFwiSW52YWxpZCBkb3dubG9hZCB0eXBlOiBcIiArIHR5cGUpKTtcbiAgfVxuXG4gIHZhciByZXEgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgcmVxLm9wZW4oJ0dFVCcsIHAsIGFzeW5jKTtcbiAgcmVxLnNldFJlcXVlc3RIZWFkZXIoXCJBY2NlcHQtQ2hhcnNldFwiLCBcIngtdXNlci1kZWZpbmVkXCIpO1xuICByZXEub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oZSkge1xuICAgIHZhciBkYXRhX2FycmF5O1xuICAgIGlmIChyZXEucmVhZHlTdGF0ZSA9PT0gNCkge1xuICAgICAgaWYgKHJlcS5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICBzd2l0Y2godHlwZSkge1xuICAgICAgICAgIGNhc2UgJ2J1ZmZlcic6XG4gICAgICAgICAgICBkYXRhX2FycmF5ID0gZ2V0SUVCeXRlQXJyYXkocmVxLnJlc3BvbnNlQm9keSk7XG4gICAgICAgICAgICByZXR1cm4gY2IobnVsbCwgbmV3IEJ1ZmZlcihkYXRhX2FycmF5KSk7XG4gICAgICAgICAgY2FzZSAnanNvbic6XG4gICAgICAgICAgICByZXR1cm4gY2IobnVsbCwgSlNPTi5wYXJzZShyZXEucmVzcG9uc2VUZXh0KSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjYihuZXcgQXBpRXJyb3IocmVxLnN0YXR1cywgXCJYSFIgZXJyb3IuXCIpKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJlcS5zZW5kKCk7XG59XG5cbmZ1bmN0aW9uIGFzeW5jRG93bmxvYWRGaWxlSUUocDogc3RyaW5nLCB0eXBlOiAnYnVmZmVyJywgY2I6IChlcnI6IEFwaUVycm9yLCBkYXRhPzogTm9kZUJ1ZmZlcikgPT4gdm9pZCk6IHZvaWQ7XG5mdW5jdGlvbiBhc3luY0Rvd25sb2FkRmlsZUlFKHA6IHN0cmluZywgdHlwZTogJ2pzb24nLCBjYjogKGVycjogQXBpRXJyb3IsIGRhdGE/OiBhbnkpID0+IHZvaWQpOiB2b2lkO1xuZnVuY3Rpb24gYXN5bmNEb3dubG9hZEZpbGVJRShwOiBzdHJpbmcsIHR5cGU6IHN0cmluZywgY2I6IChlcnI6IEFwaUVycm9yLCBkYXRhPzogYW55KSA9PiB2b2lkKTogdm9pZDtcbmZ1bmN0aW9uIGFzeW5jRG93bmxvYWRGaWxlSUUocDogc3RyaW5nLCB0eXBlOiBzdHJpbmcsIGNiOiAoZXJyOiBBcGlFcnJvciwgZGF0YT86IGFueSkgPT4gdm9pZCk6IHZvaWQge1xuICBkb3dubG9hZEZpbGVJRSh0cnVlLCBwLCB0eXBlLCBjYik7XG59XG5cbmZ1bmN0aW9uIHN5bmNEb3dubG9hZEZpbGVJRShwOiBzdHJpbmcsIHR5cGU6ICdidWZmZXInKTogTm9kZUJ1ZmZlcjtcbmZ1bmN0aW9uIHN5bmNEb3dubG9hZEZpbGVJRShwOiBzdHJpbmcsIHR5cGU6ICdqc29uJyk6IGFueTtcbmZ1bmN0aW9uIHN5bmNEb3dubG9hZEZpbGVJRShwOiBzdHJpbmcsIHR5cGU6IHN0cmluZyk6IGFueTtcbmZ1bmN0aW9uIHN5bmNEb3dubG9hZEZpbGVJRShwOiBzdHJpbmcsIHR5cGU6IHN0cmluZyk6IGFueSB7XG4gIHZhciBydjtcbiAgZG93bmxvYWRGaWxlSUUoZmFsc2UsIHAsIHR5cGUsIGZ1bmN0aW9uKGVycjogQXBpRXJyb3IsIGRhdGE/OiBhbnkpIHtcbiAgICBpZiAoZXJyKSB0aHJvdyBlcnI7XG4gICAgcnYgPSBkYXRhO1xuICB9KTtcbiAgcmV0dXJuIHJ2O1xufVxuXG5mdW5jdGlvbiBhc3luY0Rvd25sb2FkRmlsZU1vZGVybihwOiBzdHJpbmcsIHR5cGU6ICdidWZmZXInLCBjYjogKGVycjogQXBpRXJyb3IsIGRhdGE/OiBOb2RlQnVmZmVyKSA9PiB2b2lkKTogdm9pZDtcbmZ1bmN0aW9uIGFzeW5jRG93bmxvYWRGaWxlTW9kZXJuKHA6IHN0cmluZywgdHlwZTogJ2pzb24nLCBjYjogKGVycjogQXBpRXJyb3IsIGRhdGE/OiBhbnkpID0+IHZvaWQpOiB2b2lkO1xuZnVuY3Rpb24gYXN5bmNEb3dubG9hZEZpbGVNb2Rlcm4ocDogc3RyaW5nLCB0eXBlOiBzdHJpbmcsIGNiOiAoZXJyOiBBcGlFcnJvciwgZGF0YT86IGFueSkgPT4gdm9pZCk6IHZvaWQ7XG5mdW5jdGlvbiBhc3luY0Rvd25sb2FkRmlsZU1vZGVybihwOiBzdHJpbmcsIHR5cGU6IHN0cmluZywgY2I6IChlcnI6IEFwaUVycm9yLCBkYXRhPzogYW55KSA9PiB2b2lkKTogdm9pZCB7XG4gIHZhciByZXEgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgcmVxLm9wZW4oJ0dFVCcsIHAsIHRydWUpO1xuICB2YXIganNvblN1cHBvcnRlZCA9IHRydWU7XG4gIHN3aXRjaCh0eXBlKSB7XG4gICAgY2FzZSAnYnVmZmVyJzpcbiAgICAgIHJlcS5yZXNwb25zZVR5cGUgPSAnYXJyYXlidWZmZXInO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnanNvbic6XG4gICAgIC8vIFNvbWUgYnJvd3NlcnMgZG9uJ3Qgc3VwcG9ydCB0aGUgSlNPTiByZXNwb25zZSB0eXBlLlxuICAgICAvLyBUaGV5IGVpdGhlciByZXNldCByZXNwb25zZVR5cGUsIG9yIHRocm93IGFuIGV4Y2VwdGlvbi5cbiAgICAgLy8gQHNlZSBodHRwczovL2dpdGh1Yi5jb20vTW9kZXJuaXpyL01vZGVybml6ci9ibG9iL21hc3Rlci9zcmMvdGVzdFhoclR5cGUuanNcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlcS5yZXNwb25zZVR5cGUgPSAnanNvbic7XG4gICAgICAgIGpzb25TdXBwb3J0ZWQgPSByZXEucmVzcG9uc2VUeXBlID09PSAnanNvbic7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGpzb25TdXBwb3J0ZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gY2IobmV3IEFwaUVycm9yKEVycm9yQ29kZS5FSU5WQUwsIFwiSW52YWxpZCBkb3dubG9hZCB0eXBlOiBcIiArIHR5cGUpKTtcbiAgfVxuICByZXEub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oZSkge1xuICAgIGlmIChyZXEucmVhZHlTdGF0ZSA9PT0gNCkge1xuICAgICAgaWYgKHJlcS5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICBzd2l0Y2godHlwZSkge1xuICAgICAgICAgIGNhc2UgJ2J1ZmZlcic6XG4gICAgICAgICAgICAvLyBYWFg6IFdlYktpdC1iYXNlZCBicm93c2VycyByZXR1cm4gKm51bGwqIHdoZW4gWEhSaW5nIGFuIGVtcHR5IGZpbGUuXG4gICAgICAgICAgICByZXR1cm4gY2IobnVsbCwgbmV3IEJ1ZmZlcihyZXEucmVzcG9uc2UgPyByZXEucmVzcG9uc2UgOiAwKSk7XG4gICAgICAgICAgY2FzZSAnanNvbic6XG4gICAgICAgICAgICBpZiAoanNvblN1cHBvcnRlZCkge1xuICAgICAgICAgICAgICByZXR1cm4gY2IobnVsbCwgcmVxLnJlc3BvbnNlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBjYihudWxsLCBKU09OLnBhcnNlKHJlcS5yZXNwb25zZVRleHQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGNiKG5ldyBBcGlFcnJvcihyZXEuc3RhdHVzLCBcIlhIUiBlcnJvci5cIikpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgcmVxLnNlbmQoKTtcbn1cblxuZnVuY3Rpb24gc3luY0Rvd25sb2FkRmlsZU1vZGVybihwOiBzdHJpbmcsIHR5cGU6ICdidWZmZXInKTogTm9kZUJ1ZmZlcjtcbmZ1bmN0aW9uIHN5bmNEb3dubG9hZEZpbGVNb2Rlcm4ocDogc3RyaW5nLCB0eXBlOiAnanNvbicpOiBhbnk7XG5mdW5jdGlvbiBzeW5jRG93bmxvYWRGaWxlTW9kZXJuKHA6IHN0cmluZywgdHlwZTogc3RyaW5nKTogYW55O1xuZnVuY3Rpb24gc3luY0Rvd25sb2FkRmlsZU1vZGVybihwOiBzdHJpbmcsIHR5cGU6IHN0cmluZyk6IGFueSB7XG4gIHZhciByZXEgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgcmVxLm9wZW4oJ0dFVCcsIHAsIGZhbHNlKTtcblxuICAvLyBPbiBtb3N0IHBsYXRmb3Jtcywgd2UgY2Fubm90IHNldCB0aGUgcmVzcG9uc2VUeXBlIG9mIHN5bmNocm9ub3VzIGRvd25sb2Fkcy5cbiAgLy8gQHRvZG8gVGVzdCBmb3IgdGhpczsgSUUxMCBhbGxvd3MgdGhpcywgYXMgZG8gb2xkZXIgdmVyc2lvbnMgb2YgQ2hyb21lL0ZGLlxuICB2YXIgZGF0YSA9IG51bGw7XG4gIHZhciBlcnIgPSBudWxsO1xuICAvLyBDbGFzc2ljIGhhY2sgdG8gZG93bmxvYWQgYmluYXJ5IGRhdGEgYXMgYSBzdHJpbmcuXG4gIHJlcS5vdmVycmlkZU1pbWVUeXBlKCd0ZXh0L3BsYWluOyBjaGFyc2V0PXgtdXNlci1kZWZpbmVkJyk7XG4gIHJlcS5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbihlKSB7XG4gICAgaWYgKHJlcS5yZWFkeVN0YXRlID09PSA0KSB7XG4gICAgICBpZiAocmVxLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgIHN3aXRjaCh0eXBlKSB7XG4gICAgICAgICAgY2FzZSAnYnVmZmVyJzpcbiAgICAgICAgICAgIC8vIENvbnZlcnQgdGhlIHRleHQgaW50byBhIGJ1ZmZlci5cbiAgICAgICAgICAgIHZhciB0ZXh0ID0gcmVxLnJlc3BvbnNlVGV4dDtcbiAgICAgICAgICAgIGRhdGEgPSBuZXcgQnVmZmVyKHRleHQubGVuZ3RoKTtcbiAgICAgICAgICAgIC8vIFRocm93IGF3YXkgdGhlIHVwcGVyIGJpdHMgb2YgZWFjaCBjaGFyYWN0ZXIuXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgLy8gVGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgdGhyb3cgYXdheSB0aGUgdXBwZXIgYml0IG9mIGVhY2hcbiAgICAgICAgICAgICAgLy8gY2hhcmFjdGVyIGZvciB1cy5cbiAgICAgICAgICAgICAgZGF0YS53cml0ZVVJbnQ4KHRleHQuY2hhckNvZGVBdChpKSwgaSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgY2FzZSAnanNvbic6XG4gICAgICAgICAgICBkYXRhID0gSlNPTi5wYXJzZShyZXEucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyID0gbmV3IEFwaUVycm9yKHJlcS5zdGF0dXMsIFwiWEhSIGVycm9yLlwiKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgcmVxLnNlbmQoKTtcbiAgaWYgKGVycikge1xuICAgIHRocm93IGVycjtcbiAgfVxuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBJRTEwIGFsbG93cyB1cyB0byBwZXJmb3JtIHN5bmNocm9ub3VzIGJpbmFyeSBmaWxlIGRvd25sb2Fkcy5cbiAqIEB0b2RvIEZlYXR1cmUgZGV0ZWN0IHRoaXMsIGFzIG9sZGVyIHZlcnNpb25zIG9mIEZGL0Nocm9tZSBkbyB0b28hXG4gKi9cbmZ1bmN0aW9uIHN5bmNEb3dubG9hZEZpbGVJRTEwKHA6IHN0cmluZywgdHlwZTogJ2J1ZmZlcicpOiBOb2RlQnVmZmVyO1xuZnVuY3Rpb24gc3luY0Rvd25sb2FkRmlsZUlFMTAocDogc3RyaW5nLCB0eXBlOiAnanNvbicpOiBhbnk7XG5mdW5jdGlvbiBzeW5jRG93bmxvYWRGaWxlSUUxMChwOiBzdHJpbmcsIHR5cGU6IHN0cmluZyk6IGFueTtcbmZ1bmN0aW9uIHN5bmNEb3dubG9hZEZpbGVJRTEwKHA6IHN0cmluZywgdHlwZTogc3RyaW5nKTogYW55IHtcbiAgdmFyIHJlcSA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICByZXEub3BlbignR0VUJywgcCwgZmFsc2UpO1xuICBzd2l0Y2godHlwZSkge1xuICAgIGNhc2UgJ2J1ZmZlcic6XG4gICAgICByZXEucmVzcG9uc2VUeXBlID0gJ2FycmF5YnVmZmVyJztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2pzb24nOlxuICAgICAgLy8gSUUxMCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBKU09OIHR5cGUuXG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEFwaUVycm9yKEVycm9yQ29kZS5FSU5WQUwsIFwiSW52YWxpZCBkb3dubG9hZCB0eXBlOiBcIiArIHR5cGUpO1xuICB9XG4gIHZhciBkYXRhO1xuICB2YXIgZXJyO1xuICByZXEub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oZSkge1xuICAgIGlmIChyZXEucmVhZHlTdGF0ZSA9PT0gNCkge1xuICAgICAgaWYgKHJlcS5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICBzd2l0Y2godHlwZSkge1xuICAgICAgICAgIGNhc2UgJ2J1ZmZlcic6XG4gICAgICAgICAgICBkYXRhID0gbmV3IEJ1ZmZlcihyZXEucmVzcG9uc2UpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnanNvbic6XG4gICAgICAgICAgICBkYXRhID0gSlNPTi5wYXJzZShyZXEucmVzcG9uc2UpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVyciA9IG5ldyBBcGlFcnJvcihyZXEuc3RhdHVzLCBcIlhIUiBlcnJvci5cIik7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICByZXEuc2VuZCgpO1xuICBpZiAoZXJyKSB7XG4gICAgdGhyb3cgZXJyO1xuICB9XG4gIHJldHVybiBkYXRhO1xufVxuXG5mdW5jdGlvbiBnZXRGaWxlU2l6ZShhc3luYzogYm9vbGVhbiwgcDogc3RyaW5nLCBjYjogKGVycjogQXBpRXJyb3IsIHNpemU/OiBudW1iZXIpID0+IHZvaWQpOiB2b2lkIHtcbiAgdmFyIHJlcSA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICByZXEub3BlbignSEVBRCcsIHAsIGFzeW5jKTtcbiAgcmVxLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKGUpIHtcbiAgICBpZiAocmVxLnJlYWR5U3RhdGUgPT09IDQpIHtcbiAgICAgIGlmIChyZXEuc3RhdHVzID09IDIwMCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBjYihudWxsLCBwYXJzZUludChyZXEuZ2V0UmVzcG9uc2VIZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoJykgfHwgJy0xJywgMTApKTtcbiAgICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgICAgLy8gSW4gdGhlIGV2ZW50IHRoYXQgdGhlIGhlYWRlciBpc24ndCBwcmVzZW50IG9yIHRoZXJlIGlzIGFuIGVycm9yLi4uXG4gICAgICAgICAgcmV0dXJuIGNiKG5ldyBBcGlFcnJvcihFcnJvckNvZGUuRUlPLCBcIlhIUiBIRUFEIGVycm9yOiBDb3VsZCBub3QgcmVhZCBjb250ZW50LWxlbmd0aC5cIikpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gY2IobmV3IEFwaUVycm9yKHJlcS5zdGF0dXMsIFwiWEhSIEhFQUQgZXJyb3IuXCIpKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJlcS5zZW5kKCk7XG59XG5cbi8qKlxuICogQXN5bmNocm9ub3VzbHkgZG93bmxvYWQgYSBmaWxlIGFzIGEgYnVmZmVyIG9yIGEgSlNPTiBvYmplY3QuXG4gKiBOb3RlIHRoYXQgdGhlIHRoaXJkIGZ1bmN0aW9uIHNpZ25hdHVyZSB3aXRoIGEgbm9uLXNwZWNpYWxpemVkIHR5cGUgaXNcbiAqIGludmFsaWQsIGJ1dCBUeXBlU2NyaXB0IHJlcXVpcmVzIGl0IHdoZW4geW91IHNwZWNpYWxpemUgc3RyaW5nIGFyZ3VtZW50cyB0b1xuICogY29uc3RhbnRzLlxuICovXG5leHBvcnQgdmFyIGFzeW5jRG93bmxvYWRGaWxlOiB7XG4gIChwOiBzdHJpbmcsIHR5cGU6ICdidWZmZXInLCBjYjogKGVycjogQXBpRXJyb3IsIGRhdGE/OiBOb2RlQnVmZmVyKSA9PiB2b2lkKTogdm9pZDtcbiAgKHA6IHN0cmluZywgdHlwZTogJ2pzb24nLCBjYjogKGVycjogQXBpRXJyb3IsIGRhdGE/OiBhbnkpID0+IHZvaWQpOiB2b2lkO1xuICAocDogc3RyaW5nLCB0eXBlOiBzdHJpbmcsIGNiOiAoZXJyOiBBcGlFcnJvciwgZGF0YT86IGFueSkgPT4gdm9pZCk6IHZvaWQ7XG59ID0gKHV0aWwuaXNJRSAmJiB0eXBlb2YgQmxvYiA9PT0gJ3VuZGVmaW5lZCcpID8gYXN5bmNEb3dubG9hZEZpbGVJRSA6IGFzeW5jRG93bmxvYWRGaWxlTW9kZXJuO1xuXG4vKipcbiAqIFN5bmNocm9ub3VzbHkgZG93bmxvYWQgYSBmaWxlIGFzIGEgYnVmZmVyIG9yIGEgSlNPTiBvYmplY3QuXG4gKiBOb3RlIHRoYXQgdGhlIHRoaXJkIGZ1bmN0aW9uIHNpZ25hdHVyZSB3aXRoIGEgbm9uLXNwZWNpYWxpemVkIHR5cGUgaXNcbiAqIGludmFsaWQsIGJ1dCBUeXBlU2NyaXB0IHJlcXVpcmVzIGl0IHdoZW4geW91IHNwZWNpYWxpemUgc3RyaW5nIGFyZ3VtZW50cyB0b1xuICogY29uc3RhbnRzLlxuICovXG5leHBvcnQgdmFyIHN5bmNEb3dubG9hZEZpbGU6IHtcbiAgKHA6IHN0cmluZywgdHlwZTogJ2J1ZmZlcicpOiBOb2RlQnVmZmVyO1xuICAocDogc3RyaW5nLCB0eXBlOiAnanNvbicpOiBhbnk7XG4gIChwOiBzdHJpbmcsIHR5cGU6IHN0cmluZyk6IGFueTtcbn0gPSAodXRpbC5pc0lFICYmIHR5cGVvZiBCbG9iID09PSAndW5kZWZpbmVkJykgPyBzeW5jRG93bmxvYWRGaWxlSUUgOiAodXRpbC5pc0lFICYmIHR5cGVvZiBCbG9iICE9PSAndW5kZWZpbmVkJykgPyBzeW5jRG93bmxvYWRGaWxlSUUxMCA6IHN5bmNEb3dubG9hZEZpbGVNb2Rlcm47XG5cbi8qKlxuICogU3luY2hyb25vdXNseSByZXRyaWV2ZXMgdGhlIHNpemUgb2YgdGhlIGdpdmVuIGZpbGUgaW4gYnl0ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWxlU2l6ZVN5bmMocDogc3RyaW5nKTogbnVtYmVyIHtcbiAgdmFyIHJ2OiBudW1iZXI7XG4gIGdldEZpbGVTaXplKGZhbHNlLCBwLCBmdW5jdGlvbihlcnI6IEFwaUVycm9yLCBzaXplPzogbnVtYmVyKSB7XG4gICAgaWYgKGVycikge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICBydiA9IHNpemU7XG4gIH0pO1xuICByZXR1cm4gcnY7XG59XG5cbi8qKlxuICogQXN5bmNocm9ub3VzbHkgcmV0cmlldmVzIHRoZSBzaXplIG9mIHRoZSBnaXZlbiBmaWxlIGluIGJ5dGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmlsZVNpemVBc3luYyhwOiBzdHJpbmcsIGNiOiAoZXJyOiBBcGlFcnJvciwgc2l6ZT86IG51bWJlcikgPT4gdm9pZCk6IHZvaWQge1xuICBnZXRGaWxlU2l6ZSh0cnVlLCBwLCBjYik7XG59XG4iXX0=