UNPKG

browserfs

Version:

A filesystem in your browser!

505 lines 87 kB
"use strict"; var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; var api_error_1 = require('./api_error'); var file_flag_1 = require('./file_flag'); var path = require('path'); var BaseFileSystem = (function () { function BaseFileSystem() { } BaseFileSystem.prototype.supportsLinks = function () { return false; }; BaseFileSystem.prototype.diskSpace = function (p, cb) { cb(0, 0); }; BaseFileSystem.prototype.openFile = function (p, flag, cb) { throw new api_error_1.ApiError(api_error_1.ErrorCode.ENOTSUP); }; BaseFileSystem.prototype.createFile = function (p, flag, mode, cb) { throw new api_error_1.ApiError(api_error_1.ErrorCode.ENOTSUP); }; BaseFileSystem.prototype.open = function (p, flag, mode, cb) { var _this = this; var must_be_file = function (e, stats) { if (e) { switch (flag.pathNotExistsAction()) { case file_flag_1.ActionType.CREATE_FILE: return _this.stat(path.dirname(p), false, function (e, parentStats) { if (e) { cb(e); } else if (!parentStats.isDirectory()) { cb(api_error_1.ApiError.ENOTDIR(path.dirname(p))); } else { _this.createFile(p, flag, mode, cb); } }); case file_flag_1.ActionType.THROW_EXCEPTION: return cb(api_error_1.ApiError.ENOENT(p)); default: return cb(new api_error_1.ApiError(api_error_1.ErrorCode.EINVAL, 'Invalid FileFlag object.')); } } else { if (stats.isDirectory()) { return cb(api_error_1.ApiError.EISDIR(p)); } switch (flag.pathExistsAction()) { case file_flag_1.ActionType.THROW_EXCEPTION: return cb(api_error_1.ApiError.EEXIST(p)); case file_flag_1.ActionType.TRUNCATE_FILE: return _this.openFile(p, flag, function (e, fd) { if (e) { cb(e); } else { fd.truncate(0, function () { fd.sync(function () { cb(null, fd); }); }); } }); case file_flag_1.ActionType.NOP: return _this.openFile(p, flag, cb); default: return cb(new api_error_1.ApiError(api_error_1.ErrorCode.EINVAL, 'Invalid FileFlag object.')); } } }; this.stat(p, false, must_be_file); }; BaseFileSystem.prototype.rename = function (oldPath, newPath, cb) { cb(new api_error_1.ApiError(api_error_1.ErrorCode.ENOTSUP)); }; BaseFileSystem.prototype.renameSync = function (oldPath, newPath) { throw new api_error_1.ApiError(api_error_1.ErrorCode.ENOTSUP); }; BaseFileSystem.prototype.stat = function (p, isLstat, cb) { cb(new api_error_1.ApiError(api_error_1.ErrorCode.ENOTSUP)); }; BaseFileSystem.prototype.statSync = function (p, isLstat) { throw new api_error_1.ApiError(api_error_1.ErrorCode.ENOTSUP); }; BaseFileSystem.prototype.openFileSync = function (p, flag, mode) { throw new api_error_1.ApiError(api_error_1.ErrorCode.ENOTSUP); }; BaseFileSystem.prototype.createFileSync = function (p, flag, mode) { throw new api_error_1.ApiError(api_error_1.ErrorCode.ENOTSUP); }; BaseFileSystem.prototype.openSync = function (p, flag, mode) { var stats; try { stats = this.statSync(p, false); } catch (e) { switch (flag.pathNotExistsAction()) { case file_flag_1.ActionType.CREATE_FILE: var parentStats = this.statSync(path.dirname(p), false); if (!parentStats.isDirectory()) { throw api_error_1.ApiError.ENOTDIR(path.dirname(p)); } return this.createFileSync(p, flag, mode); case file_flag_1.ActionType.THROW_EXCEPTION: throw api_error_1.ApiError.ENOENT(p); default: throw new api_error_1.ApiError(api_error_1.ErrorCode.EINVAL, 'Invalid FileFlag object.'); } } if (stats.isDirectory()) { throw api_error_1.ApiError.EISDIR(p); } switch (flag.pathExistsAction()) { case file_flag_1.ActionType.THROW_EXCEPTION: throw api_error_1.ApiError.EEXIST(p); case file_flag_1.ActionType.TRUNCATE_FILE: this.unlinkSync(p); return this.createFileSync(p, flag, stats.mode); case file_flag_1.ActionType.NOP: return this.openFileSync(p, flag, mode); default: throw new api_error_1.ApiError(api_error_1.ErrorCode.EINVAL, 'Invalid FileFlag object.'); } }; BaseFileSystem.prototype.unlink = function (p, cb) { cb(new api_error_1.ApiError(api_error_1.ErrorCode.ENOTSUP)); }; BaseFileSystem.prototype.unlinkSync = function (p) { throw new api_error_1.ApiError(api_error_1.ErrorCode.ENOTSUP); }; BaseFileSystem.prototype.rmdir = function (p, cb) { cb(new api_error_1.ApiError(api_error_1.ErrorCode.ENOTSUP)); }; BaseFileSystem.prototype.rmdirSync = function (p) { throw new api_error_1.ApiError(api_error_1.ErrorCode.ENOTSUP); }; BaseFileSystem.prototype.mkdir = function (p, mode, cb) { cb(new api_error_1.ApiError(api_error_1.ErrorCode.ENOTSUP)); }; BaseFileSystem.prototype.mkdirSync = function (p, mode) { throw new api_error_1.ApiError(api_error_1.ErrorCode.ENOTSUP); }; BaseFileSystem.prototype.readdir = function (p, cb) { cb(new api_error_1.ApiError(api_error_1.ErrorCode.ENOTSUP)); }; BaseFileSystem.prototype.readdirSync = function (p) { throw new api_error_1.ApiError(api_error_1.ErrorCode.ENOTSUP); }; BaseFileSystem.prototype.exists = function (p, cb) { this.stat(p, null, function (err) { cb(err == null); }); }; BaseFileSystem.prototype.existsSync = function (p) { try { this.statSync(p, true); return true; } catch (e) { return false; } }; BaseFileSystem.prototype.realpath = function (p, cache, cb) { if (this.supportsLinks()) { var splitPath = p.split(path.sep); for (var i = 0; i < splitPath.length; i++) { var addPaths = splitPath.slice(0, i + 1); splitPath[i] = path.join.apply(null, addPaths); } } else { this.exists(p, function (doesExist) { if (doesExist) { cb(null, p); } else { cb(api_error_1.ApiError.ENOENT(p)); } }); } }; BaseFileSystem.prototype.realpathSync = function (p, cache) { if (this.supportsLinks()) { var splitPath = p.split(path.sep); for (var i = 0; i < splitPath.length; i++) { var addPaths = splitPath.slice(0, i + 1); splitPath[i] = path.join.apply(null, addPaths); } } else { if (this.existsSync(p)) { return p; } else { throw api_error_1.ApiError.ENOENT(p); } } }; BaseFileSystem.prototype.truncate = function (p, len, cb) { this.open(p, file_flag_1.FileFlag.getFileFlag('r+'), 0x1a4, (function (er, fd) { if (er) { return cb(er); } fd.truncate(len, (function (er) { fd.close((function (er2) { cb(er || er2); })); })); })); }; BaseFileSystem.prototype.truncateSync = function (p, len) { var fd = this.openSync(p, file_flag_1.FileFlag.getFileFlag('r+'), 0x1a4); try { fd.truncateSync(len); } catch (e) { throw e; } finally { fd.closeSync(); } }; BaseFileSystem.prototype.readFile = function (fname, encoding, flag, cb) { var oldCb = cb; this.open(fname, flag, 0x1a4, function (err, fd) { if (err) { return cb(err); } cb = function (err, arg) { fd.close(function (err2) { if (err == null) { err = err2; } return oldCb(err, arg); }); }; fd.stat(function (err, stat) { if (err != null) { return cb(err); } var buf = new Buffer(stat.size); fd.read(buf, 0, stat.size, 0, function (err) { if (err != null) { return cb(err); } else if (encoding === null) { return cb(err, buf); } try { cb(null, buf.toString(encoding)); } catch (e) { cb(e); } }); }); }); }; BaseFileSystem.prototype.readFileSync = function (fname, encoding, flag) { var fd = this.openSync(fname, flag, 0x1a4); try { var stat = fd.statSync(); var buf = new Buffer(stat.size); fd.readSync(buf, 0, stat.size, 0); fd.closeSync(); if (encoding === null) { return buf; } return buf.toString(encoding); } finally { fd.closeSync(); } }; BaseFileSystem.prototype.writeFile = function (fname, data, encoding, flag, mode, cb) { var oldCb = cb; this.open(fname, flag, 0x1a4, function (err, fd) { if (err != null) { return cb(err); } cb = function (err) { fd.close(function (err2) { oldCb(err != null ? err : err2); }); }; try { if (typeof data === 'string') { data = new Buffer(data, encoding); } } catch (e) { return cb(e); } fd.write(data, 0, data.length, 0, cb); }); }; BaseFileSystem.prototype.writeFileSync = function (fname, data, encoding, flag, mode) { var fd = this.openSync(fname, flag, mode); try { if (typeof data === 'string') { data = new Buffer(data, encoding); } fd.writeSync(data, 0, data.length, 0); } finally { fd.closeSync(); } }; BaseFileSystem.prototype.appendFile = function (fname, data, encoding, flag, mode, cb) { var oldCb = cb; this.open(fname, flag, mode, function (err, fd) { if (err != null) { return cb(err); } cb = function (err) { fd.close(function (err2) { oldCb(err != null ? err : err2); }); }; if (typeof data === 'string') { data = new Buffer(data, encoding); } fd.write(data, 0, data.length, null, cb); }); }; BaseFileSystem.prototype.appendFileSync = function (fname, data, encoding, flag, mode) { var fd = this.openSync(fname, flag, mode); try { if (typeof data === 'string') { data = new Buffer(data, encoding); } fd.writeSync(data, 0, data.length, null); } finally { fd.closeSync(); } }; BaseFileSystem.prototype.chmod = function (p, isLchmod, mode, cb) { cb(new api_error_1.ApiError(api_error_1.ErrorCode.ENOTSUP)); }; BaseFileSystem.prototype.chmodSync = function (p, isLchmod, mode) { throw new api_error_1.ApiError(api_error_1.ErrorCode.ENOTSUP); }; BaseFileSystem.prototype.chown = function (p, isLchown, uid, gid, cb) { cb(new api_error_1.ApiError(api_error_1.ErrorCode.ENOTSUP)); }; BaseFileSystem.prototype.chownSync = function (p, isLchown, uid, gid) { throw new api_error_1.ApiError(api_error_1.ErrorCode.ENOTSUP); }; BaseFileSystem.prototype.utimes = function (p, atime, mtime, cb) { cb(new api_error_1.ApiError(api_error_1.ErrorCode.ENOTSUP)); }; BaseFileSystem.prototype.utimesSync = function (p, atime, mtime) { throw new api_error_1.ApiError(api_error_1.ErrorCode.ENOTSUP); }; BaseFileSystem.prototype.link = function (srcpath, dstpath, cb) { cb(new api_error_1.ApiError(api_error_1.ErrorCode.ENOTSUP)); }; BaseFileSystem.prototype.linkSync = function (srcpath, dstpath) { throw new api_error_1.ApiError(api_error_1.ErrorCode.ENOTSUP); }; BaseFileSystem.prototype.symlink = function (srcpath, dstpath, type, cb) { cb(new api_error_1.ApiError(api_error_1.ErrorCode.ENOTSUP)); }; BaseFileSystem.prototype.symlinkSync = function (srcpath, dstpath, type) { throw new api_error_1.ApiError(api_error_1.ErrorCode.ENOTSUP); }; BaseFileSystem.prototype.readlink = function (p, cb) { cb(new api_error_1.ApiError(api_error_1.ErrorCode.ENOTSUP)); }; BaseFileSystem.prototype.readlinkSync = function (p) { throw new api_error_1.ApiError(api_error_1.ErrorCode.ENOTSUP); }; return BaseFileSystem; }()); exports.BaseFileSystem = BaseFileSystem; var SynchronousFileSystem = (function (_super) { __extends(SynchronousFileSystem, _super); function SynchronousFileSystem() { _super.apply(this, arguments); } SynchronousFileSystem.prototype.supportsSynch = function () { return true; }; SynchronousFileSystem.prototype.rename = function (oldPath, newPath, cb) { try { this.renameSync(oldPath, newPath); cb(); } catch (e) { cb(e); } }; SynchronousFileSystem.prototype.stat = function (p, isLstat, cb) { try { cb(null, this.statSync(p, isLstat)); } catch (e) { cb(e); } }; SynchronousFileSystem.prototype.open = function (p, flags, mode, cb) { try { cb(null, this.openSync(p, flags, mode)); } catch (e) { cb(e); } }; SynchronousFileSystem.prototype.unlink = function (p, cb) { try { this.unlinkSync(p); cb(); } catch (e) { cb(e); } }; SynchronousFileSystem.prototype.rmdir = function (p, cb) { try { this.rmdirSync(p); cb(); } catch (e) { cb(e); } }; SynchronousFileSystem.prototype.mkdir = function (p, mode, cb) { try { this.mkdirSync(p, mode); cb(); } catch (e) { cb(e); } }; SynchronousFileSystem.prototype.readdir = function (p, cb) { try { cb(null, this.readdirSync(p)); } catch (e) { cb(e); } }; SynchronousFileSystem.prototype.chmod = function (p, isLchmod, mode, cb) { try { this.chmodSync(p, isLchmod, mode); cb(); } catch (e) { cb(e); } }; SynchronousFileSystem.prototype.chown = function (p, isLchown, uid, gid, cb) { try { this.chownSync(p, isLchown, uid, gid); cb(); } catch (e) { cb(e); } }; SynchronousFileSystem.prototype.utimes = function (p, atime, mtime, cb) { try { this.utimesSync(p, atime, mtime); cb(); } catch (e) { cb(e); } }; SynchronousFileSystem.prototype.link = function (srcpath, dstpath, cb) { try { this.linkSync(srcpath, dstpath); cb(); } catch (e) { cb(e); } }; SynchronousFileSystem.prototype.symlink = function (srcpath, dstpath, type, cb) { try { this.symlinkSync(srcpath, dstpath, type); cb(); } catch (e) { cb(e); } }; SynchronousFileSystem.prototype.readlink = function (p, cb) { try { cb(null, this.readlinkSync(p)); } catch (e) { cb(e); } }; return SynchronousFileSystem; }(BaseFileSystem)); exports.SynchronousFileSystem = SynchronousFileSystem; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZV9zeXN0ZW0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZS9maWxlX3N5c3RlbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwwQkFBa0MsYUFBYSxDQUFDLENBQUE7QUFHaEQsMEJBQW1DLGFBQWEsQ0FBQyxDQUFBO0FBQ2pELElBQU8sSUFBSSxXQUFXLE1BQU0sQ0FBQyxDQUFDO0FBcWU5QjtJQUFBO0lBb1pBLENBQUM7SUFuWlEsc0NBQWEsR0FBcEI7UUFDRSxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNNLGtDQUFTLEdBQWhCLFVBQWlCLENBQVMsRUFBRSxFQUF3QztRQUNsRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQU1NLGlDQUFRLEdBQWYsVUFBZ0IsQ0FBUyxFQUFFLElBQWMsRUFBRSxFQUEyQztRQUNwRixNQUFNLElBQUksb0JBQVEsQ0FBQyxxQkFBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFLTSxtQ0FBVSxHQUFqQixVQUFrQixDQUFTLEVBQUUsSUFBYyxFQUFFLElBQVksRUFBRSxFQUEyQztRQUNwRyxNQUFNLElBQUksb0JBQVEsQ0FBQyxxQkFBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFDTSw2QkFBSSxHQUFYLFVBQVksQ0FBUyxFQUFFLElBQWEsRUFBRSxJQUFZLEVBQUUsRUFBOEM7UUFBbEcsaUJBcURDO1FBcERDLElBQUksWUFBWSxHQUFHLFVBQUMsQ0FBVyxFQUFFLEtBQWE7WUFDNUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFTixNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ25DLEtBQUssc0JBQVUsQ0FBQyxXQUFXO3dCQUV6QixNQUFNLENBQUMsS0FBSSxDQUFDLElBQUksQ0FBQyxJQUFJ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QWUsRUFBRSxPQUFlLEVBQUUsRUFBWTtRQUN4RCxJQUFJLENBQUM7WUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNoQyxFQUFFLEVBQUUsQ0FBQztRQUNQLENBQUU7UUFBQSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ1gsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ1IsQ0FBQztJQUNILENBQUM7SUFFTSx1Q0FBTyxHQUFkLFVBQWUsT0FBZSxFQUFFLE9BQWUsRUFBRSxJQUFZLEVBQUUsRUFBWTtRQUN6RSxJQUFJLENBQUM7WUFDSCxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDekMsRUFBRSxFQUFFLENBQUM7UUFDUCxDQUFFO1FBQUEsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNYLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNSLENBQUM7SUFDSCxDQUFDO0lBRU0sd0NBQVEsR0FBZixVQUFnQixDQUFTLEVBQUUsRUFBWTtRQUNyQyxJQUFJLENBQUM7WUFDSCxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQyxDQUFFO1FBQUEsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNYLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNSLENBQUM7SUFDSCxDQUFDO0lBQ0gsNEJBQUM7QUFBRCxDQUFDLEFBckhELENBQTJDLGNBQWMsR0FxSHhEO0FBckhZLDZCQUFxQix3QkFxSGpDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FwaUVycm9yLCBFcnJvckNvZGV9IGZyb20gJy4vYXBpX2Vycm9yJztcbmltcG9ydCBTdGF0cyBmcm9tICcuL25vZGVfZnNfc3RhdHMnO1xuaW1wb3J0IGZpbGUgPSByZXF1aXJlKCcuL2ZpbGUnKTtcbmltcG9ydCB7RmlsZUZsYWcsIEFjdGlvblR5cGV9IGZyb20gJy4vZmlsZV9mbGFnJztcbmltcG9ydCBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgYSBmaWxlc3lzdGVtLiAqKkFsbCoqIEJyb3dzZXJGUyBGaWxlU3lzdGVtcyBzaG91bGQgaW1wbGVtZW50XG4gKiB0aGlzIGludGVyZmFjZS5cbiAqXG4gKiBCZWxvdywgd2UgZGVub3RlIGVhY2ggQVBJIG1ldGhvZCBhcyAqKkNvcmUqKiwgKipTdXBwbGVtZW50YWwqKiwgb3JcbiAqICoqT3B0aW9uYWwqKi5cbiAqXG4gKiAjIyMgQ29yZSBNZXRob2RzXG4gKlxuICogKipDb3JlKiogQVBJIG1ldGhvZHMgKm5lZWQqIHRvIGJlIGltcGxlbWVudGVkIGZvciBiYXNpYyByZWFkL3dyaXRlXG4gKiBmdW5jdGlvbmFsaXR5LlxuICpcbiAqIE5vdGUgdGhhdCByZWFkLW9ubHkgRmlsZVN5c3RlbXMgY2FuIGNob29zZSB0byBub3QgaW1wbGVtZW50IGNvcmUgbWV0aG9kc1xuICogdGhhdCBtdXRhdGUgZmlsZXMgb3IgbWV0YWRhdGEuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHdpbGwgcGFzcyBhXG4gKiBOT1RfU1VQUE9SVEVEIGVycm9yIHRvIHRoZSBjYWxsYmFjay5cbiAqXG4gKiAjIyMgU3VwcGxlbWVudGFsIE1ldGhvZHNcbiAqXG4gKiAqKlN1cHBsZW1lbnRhbCoqIEFQSSBtZXRob2RzIGRvIG5vdCBuZWVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGEgZmlsZXN5c3RlbS5cbiAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGltcGxlbWVudHMgYWxsIG9mIHRoZSBzdXBwbGVtZW50YWwgQVBJIG1ldGhvZHMgaW5cbiAqIHRlcm1zIG9mIHRoZSAqKmNvcmUqKiBBUEkgbWV0aG9kcy5cbiAqXG4gKiBOb3RlIHRoYXQgYSBmaWxlIHN5c3RlbSBtYXkgY2hvb3NlIHRvIGltcGxlbWVudCBzdXBwbGVtZW50YWwgbWV0aG9kcyBmb3JcbiAqIGVmZmljaWVuY3kgcmVhc29ucy5cbiAqXG4gKiBUaGUgY29kZSBmb3Igc29tZSBzdXBwbGVtZW50YWwgbWV0aG9kcyB3YXMgYWRhcHRlZCBkaXJlY3RseSBmcm9tIE5vZGVKUydzXG4gKiBmcy5qcyBzb3VyY2UgY29kZS5cbiAqXG4gKiAjIyMgT3B0aW9uYWwgTWV0aG9kc1xuICpcbiAqICoqT3B0aW9uYWwqKiBBUEkgbWV0aG9kcyBwcm92aWRlIGZ1bmN0aW9uYWxpdHkgdGhhdCBtYXkgbm90IGJlIGF2YWlsYWJsZSBpblxuICogYWxsIGZpbGVzeXN0ZW1zLiBGb3IgZXhhbXBsZSwgYWxsIHN5bWxpbmsvaGFyZGxpbmstcmVsYXRlZCBBUEkgbWV0aG9kcyBmYWxsXG4gKiB1bmRlciB0aGlzIGNhdGVnb3J5LlxuICpcbiAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHdpbGwgcGFzcyBhIE5PVF9TVVBQT1JURUQgZXJyb3IgdG8gdGhlIGNhbGxiYWNrLlxuICpcbiAqICMjIyBBcmd1bWVudCBBc3N1bXB0aW9uc1xuICpcbiAqIFlvdSBjYW4gYXNzdW1lIHRoZSBmb2xsb3dpbmcgYWJvdXQgYXJndW1lbnRzIHBhc3NlZCB0byBlYWNoIEFQSSBtZXRob2Q6XG4gKlxuICogKiAqKkV2ZXJ5IHBhdGggaXMgYW4gYWJzb2x1dGUgcGF0aC4qKiBNZWFuaW5nLCBgLmAsIGAuLmAsIGFuZCBvdGhlciBpdGVtc1xuICogICBhcmUgcmVzb2x2ZWQgaW50byBhbiBhYnNvbHV0ZSBmb3JtLlxuICogKiAqKkFsbCBhcmd1bWVudHMgYXJlIHByZXNlbnQuKiogQW55IG9wdGlvbmFsIGFyZ3VtZW50cyBhdCB0aGUgTm9kZSBBUEkgbGV2ZWxcbiAqICAgaGF2ZSBiZWVuIHBhc3NlZCBpbiB3aXRoIHRoZWlyIGRlZmF1bHQgdmFsdWVzLlxuICogKiAqKlRoZSBjYWxsYmFjayB3aWxsIHJlc2V0IHRoZSBzdGFjayBkZXB0aC4qKiBXaGVuIHlvdXIgZmlsZXN5c3RlbSBjYWxscyB0aGVcbiAqICAgY2FsbGJhY2sgd2l0aCB0aGUgcmVxdWVzdGVkIGluZm9ybWF0aW9uLCBpdCB3aWxsIHVzZSBgc2V0SW1tZWRpYXRlYCB0b1xuICogICByZXNldCB0aGUgSmF2YVNjcmlwdCBzdGFjayBkZXB0aCBiZWZvcmUgY2FsbGluZyB0aGUgdXNlci1zdXBwbGllZCBjYWxsYmFjay5cbiAqIEBjbGFzcyBGaWxlU3lzdGVtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVN5c3RlbSB7XG4gIC8qKlxuICAgKiAqKk9wdGlvbmFsKio6IFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgc3lzdGVtLlxuICAgKiBAbWV0aG9kIEZpbGVTeXN0ZW0jZ2V0TmFtZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXROYW1lKCk6IHN0cmluZztcbiAgLyoqXG4gICAqICoqT3B0aW9uYWwqKjogUGFzc2VzIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gdG8gdGhlIGNhbGxiYWNrOlxuICAgKlxuICAgKiAqIFRvdGFsIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgb24gdGhpcyBmaWxlIHN5c3RlbS5cbiAgICogKiBudW1iZXIgb2YgZnJlZSBieXRlcyBhdmFpbGFibGUgb24gdGhpcyBmaWxlIHN5c3RlbS5cbiAgICpcbiAgICogQG1ldGhvZCBGaWxlU3lzdGVtI2Rpc2tTcGFjZVxuICAgKiBAdG9kbyBUaGlzIGluZm8gaXMgbm90IGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBOb2RlIEFQSS4gUGVyaGFwcyB3ZSBjb3VsZCBkbyBhXG4gICAqICAgcG9seWZpbGwgb2YgZGlza3NwYWNlLmpzLCBvciBhZGQgYSBuZXcgTm9kZSBBUEkgZnVuY3Rpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIHRoZSBsb2NhdGlvbiB0aGF0IGlzIGJlaW5nIHF1ZXJpZWQuIE9ubHlcbiAgICogICB1c2VmdWwgZm9yIGZpbGVzeXN0ZW1zIHRoYXQgc3VwcG9ydCBtb3VudCBwb2ludHMuXG4gICAqIEBwYXJhbSB7RmlsZVN5c3RlbX5kaXNrU3BhY2VDYWxsYmFja30gY2JcbiAgICovXG4gIGRpc2tTcGFjZShwOiBzdHJpbmcsIGNiOiAodG90YWw6IG51bWJlciwgZnJlZTogbnVtYmVyKSA9PiBhbnkpOiB2b2lkO1xuICAvKipcbiAgICogKipDb3JlKio6IElzIHRoaXMgZmlsZXN5c3RlbSByZWFkLW9ubHk/XG4gICAqIEBtZXRob2QgRmlsZVN5c3RlbSNpc1JlYWRPbmx5XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhpcyBGaWxlU3lzdGVtIGlzIGluaGVyZW50bHkgcmVhZC1vbmx5LlxuICAgKi9cbiAgaXNSZWFkT25seSgpOiBib29sZWFuO1xuICAvKipcbiAgICogKipDb3JlKio6IERvZXMgdGhlIGZpbGVzeXN0ZW0gc3VwcG9ydCBvcHRpb25hbCBzeW1saW5rL2hhcmRsaW5rLXJlbGF0ZWRcbiAgICogICBjb21tYW5kcz9cbiAgICogQG1ldGhvZCBGaWxlU3lzdGVtI3N1cHBvcnRzTGlua3NcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgRmlsZVN5c3RlbSBzdXBwb3J0cyB0aGUgb3B0aW9uYWxcbiAgICogICBzeW1saW5rL2hhcmRsaW5rLXJlbGF0ZWQgY29tbWFuZHMuXG4gICAqL1xuICBzdXBwb3J0c0xpbmtzKCk6IGJvb2xlYW47XG4gIC8qKlxuICAgKiAqKkNvcmUqKjogRG9lcyB0aGUgZmlsZXN5c3RlbSBzdXBwb3J0IG9wdGlvbmFsIHByb3BlcnR5LXJlbGF0ZWQgY29tbWFuZHM/XG4gICAqIEBtZXRob2QgRmlsZVN5c3RlbSNzdXBwb3J0c1Byb3BzXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIEZpbGVTeXN0ZW0gc3VwcG9ydHMgdGhlIG9wdGlvbmFsXG4gICAqICAgcHJvcGVydHktcmVsYXRlZCBjb21tYW5kcyAocGVybWlzc2lvbnMsIHV0aW1lcywgZXRjKS5cbiAgICovXG4gIHN1cHBvcnRzUHJvcHMoKTogYm9vbGVhbjtcbiAgLyoqXG4gICAqICoqQ29yZSoqOiBEb2VzIHRoZSBmaWxlc3lzdGVtIHN1cHBvcnQgdGhlIG9wdGlvbmFsIHN5bmNocm9ub3VzIGludGVyZmFjZT9cbiAgICogQG1ldGhvZCBGaWxlU3lzdGVtI3N1cHBvcnRzU3luY2hcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgRmlsZVN5c3RlbSBzdXBwb3J0cyBzeW5jaHJvbm91cyBvcGVyYXRpb25zLlxuICAgKi9cbiAgc3VwcG9ydHNTeW5jaCgpOiBib29sZWFuO1xuICAvLyAqKkNPUkUgQVBJIE1FVEhPRFMqKlxuICAvLyBGaWxlIG9yIGRpcmVjdG9yeSBvcGVyYXRpb25zXG4gIC8qKlxuICAgKiAqKkNvcmUqKjogQXN5bmNocm9ub3VzIHJlbmFtZS4gTm8gYXJndW1lbnRzIG90aGVyIHRoYW4gYSBwb3NzaWJsZSBleGNlcHRpb25cbiAgICogYXJlIGdpdmVuIHRvIHRoZSBjb21wbGV0aW9uIGNhbGxiYWNrLlxuICAgKiBAbWV0aG9kIEZpbGVTeXN0ZW0jcmVuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvbGRQYXRoXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuZXdQYXRoXG4gICAqIEBwYXJhbSB7RmlsZVN5c3RlbX5ub2RlQ2FsbGJhY2t9IGNiXG4gICAqL1xuICByZW5hbWUob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcsIGNiOiAoZXJyPzogQXBpRXJyb3IpID0+IHZvaWQpOiB2b2lkO1xuICAvKipcbiAgICogKipDb3JlKio6IFN5bmNocm9ub3VzIHJlbmFtZS5cbiAgICogQG1ldGhvZCBGaWxlU3lzdGVtI3JlbmFtZVN5bmNcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9sZFBhdGhcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5ld1BhdGhcbiAgICovXG4gIHJlbmFtZVN5bmMob2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiB2b2lkO1xuICAvKipcbiAgICogKipDb3JlKio6IEFzeW5jaHJvbm91cyBgc3RhdGAgb3IgYGxzdGF0YC5cbiAgICogQG1ldGhvZCBGaWxlU3lzdGVtI3N0YXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHtib29sZWFufSBpc0xzdGF0IFRydWUgaWYgdGhpcyBpcyBgbHN0YXRgLCBmYWxzZSBpZiB0aGlzIGlzIHJlZ3VsYXJcbiAgICogICBgc3RhdGAuXG4gICAqIEBwYXJhbSB7RmlsZVN5c3RlbX5ub2RlU3RhdHNDYWxsYmFja30gY2JcbiAgICovXG4gIHN0YXQocDogc3RyaW5nLCBpc0xzdGF0OiBib29sZWFuLCBjYjogKGVycjogQXBpRXJyb3IsIHN0YXQ/OiBTdGF0cykgPT4gdm9pZCk6IHZvaWQ7XG4gIC8qKlxuICAgKiAqKkNvcmUqKjogU3luY2hyb25vdXMgYHN0YXRgIG9yIGBsc3RhdGAuXG4gICAqIEBtZXRob2QgRmlsZVN5c3RlbSNzdGF0U3luY1xuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzTHN0YXQgVHJ1ZSBpZiB0aGlzIGlzIGBsc3RhdGAsIGZhbHNlIGlmIHRoaXMgaXMgcmVndWxhclxuICAgKiAgIGBzdGF0YC5cbiAgICogQHJldHVybiB7QnJvd3NlckZTLm5vZGUuZnMuU3RhdHN9XG4gICAqL1xuICBzdGF0U3luYyhwOiBzdHJpbmcsIGlzTHN0YXQ6IGJvb2xlYW4pOiBTdGF0cztcbiAgLy8gRmlsZSBvcGVyYXRpb25zXG4gIC8qKlxuICAgKiAqKkNvcmUqKjogQXN5bmNocm9ub3VzIGZpbGUgb3Blbi5cbiAgICogQHNlZSBodHRwOi8vd3d3Lm1hbnBhZ2V6LmNvbS9tYW4vMi9vcGVuL1xuICAgKiBAbWV0aG9kIEZpbGVTeXN0ZW0jb3BlblxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcGFyYW0ge0Jyb3dzZXJGUy5GaWxlTW9kZX0gZmxhZ3MgSGFuZGxlcyB0aGUgY29tcGxleGl0eSBvZiB0aGUgdmFyaW91cyBmaWxlXG4gICAqICAgbW9kZXMuIFNlZSBpdHMgQVBJIGZvciBtb3JlIGRldGFpbHMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtb2RlIE1vZGUgdG8gdXNlIHRvIG9wZW4gdGhlIGZpbGUuIENhbiBiZSBpZ25vcmVkIGlmIHRoZVxuICAgKiAgIGZpbGVzeXN0ZW0gZG9lc24ndCBzdXBwb3J0IHBlcm1pc3Npb25zLlxuICAgKiBAcGFyYW0ge0ZpbGVTeXN0ZW1+ZmlsZUNhbGxiYWNrfSBjYlxuICAgKi9cbiAgb3BlbihwOiBzdHJpbmcsIGZsYWc6RmlsZUZsYWcsIG1vZGU6IG51bWJlciwgY2I6IChlcnI6IEFwaUVycm9yLCBmZD86IGZpbGUuRmlsZSkgPT4gYW55KTogdm9pZDtcbiAgLyoqXG4gICAqICoqQ29yZSoqOiBTeW5jaHJvbm91cyBmaWxlIG9wZW4uXG4gICAqIEBzZWUgaHR0cDovL3d3dy5tYW5wYWdlei5jb20vbWFuLzIvb3Blbi9cbiAgICogQG1ldGhvZCBGaWxlU3lzdGVtI29wZW5TeW5jXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEBwYXJhbSB7QnJvd3NlckZTLkZpbGVNb2RlfSBmbGFncyBIYW5kbGVzIHRoZSBjb21wbGV4aXR5IG9mIHRoZSB2YXJpb3VzIGZpbGVcbiAgICogICBtb2Rlcy4gU2VlIGl0cyBBUEkgZm9yIG1vcmUgZGV0YWlscy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IG1vZGUgTW9kZSB0byB1c2UgdG8gb3BlbiB0aGUgZmlsZS4gQ2FuIGJlIGlnbm9yZWQgaWYgdGhlXG4gICAqICAgZmlsZXN5c3RlbSBkb2Vzbid0IHN1cHBvcnQgcGVybWlzc2lvbnMuXG4gICAqIEByZXR1cm4ge0Jyb3dzZXJGUy5GaWxlfVxuICAgKi9cbiAgb3BlblN5bmMocDogc3RyaW5nLCBmbGFnOiBGaWxlRmxhZywgbW9kZTogbnVtYmVyKTogZmlsZS5GaWxlO1xuICAvKipcbiAgICogKipDb3JlKio6IEFzeW5jaHJvbm91cyBgdW5saW5rYC5cbiAgICogQG1ldGhvZCBGaWxlU3lzdGVtI3VubGlua1xuICAgKiBAcGFyYW0gW3N0cmluZ10gcGF0aFxuICAgKiBAcGFyYW0gW0ZpbGVTeXN0ZW1+bm9kZUNhbGxiYWNrXSBjYlxuICAgKi9cbiAgdW5saW5rKHA6IHN0cmluZywgY2I6IEZ1bmN0aW9uKTogdm9pZDtcbiAgLyoqXG4gICAqICoqQ29yZSoqOiBTeW5jaHJvbm91cyBgdW5saW5rYC5cbiAgICogQG1ldGhvZCBGaWxlU3lzdGVtI3VubGlua1N5bmNcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIHVubGlua1N5bmMocDogc3RyaW5nKTogdm9pZDtcbiAgLy8gRGlyZWN0b3J5IG9wZXJhdGlvbnNcbiAgLyoqXG4gICAqICoqQ29yZSoqOiBBc3luY2hyb25vdXMgYHJtZGlyYC5cbiAgICogQG1ldGhvZCBGaWxlU3lzdGVtI3JtZGlyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEBwYXJhbSB7RmlsZVN5c3RlbX5ub2RlQ2FsbGJhY2t9IGNiXG4gICAqL1xuICBybWRpcihwOiBzdHJpbmcsIGNiOiBGdW5jdGlvbik6IHZvaWQ7XG4gIC8qKlxuICAgKiAqKkNvcmUqKjogU3luY2hyb25vdXMgYHJtZGlyYC5cbiAgICogQG1ldGhvZCBGaWxlU3lzdGVtI3JtZGlyU3luY1xuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgcm1kaXJTeW5jKHA6IHN0cmluZyk6IHZvaWQ7XG4gIC8qKlxuICAgKiAqKkNvcmUqKjogQXN5bmNocm9ub3VzIGBta2RpcmAuXG4gICAqIEBtZXRob2QgRmlsZVN5c3RlbSNta2RpclxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxu