UNPKG

browserfs

Version:

A filesystem in your browser!

377 lines 40.8 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 file_system = require('../core/file_system'); var node_fs_stats_1 = require('../core/node_fs_stats'); var file_1 = require('../core/file'); var util_1 = require('../core/util'); var api_error_1 = require('../core/api_error'); function convertError(e, path) { if (path === void 0) { path = ''; } var errno = e.errno; var parent = e.node; var paths = []; while (parent) { paths.unshift(parent.name); if (parent === parent.parent) { break; } parent = parent.parent; } return new api_error_1.ApiError(errno, api_error_1.ErrorStrings[errno], paths.length > 0 ? '/' + paths.join('/') : path); } var EmscriptenFile = (function (_super) { __extends(EmscriptenFile, _super); function EmscriptenFile(_fs, _FS, _path, _flag, _stream) { _super.call(this); this._fs = _fs; this._FS = _FS; this._path = _path; this._flag = _flag; this._stream = _stream; } EmscriptenFile.prototype.getPos = function () { return undefined; }; EmscriptenFile.prototype.close = function (cb) { var err = null; try { this.closeSync(); } catch (e) { err = e; } finally { cb(err); } }; EmscriptenFile.prototype.closeSync = function () { try { this._FS.close(this._stream); } catch (e) { throw convertError(e, this._path); } }; EmscriptenFile.prototype.stat = function (cb) { try { cb(null, this.statSync()); } catch (e) { cb(e); } }; EmscriptenFile.prototype.statSync = function () { try { return this._fs.statSync(this._path, false); } catch (e) { throw convertError(e, this._path); } }; EmscriptenFile.prototype.truncate = function (len, cb) { var err = null; try { this.truncateSync(len); } catch (e) { err = e; } finally { cb(err); } }; EmscriptenFile.prototype.truncateSync = function (len) { try { this._FS.ftruncate(this._stream.fd, len); } catch (e) { throw convertError(e, this._path); } }; EmscriptenFile.prototype.write = function (buffer, offset, length, position, cb) { try { cb(null, this.writeSync(buffer, offset, length, position), buffer); } catch (e) { cb(e); } }; EmscriptenFile.prototype.writeSync = function (buffer, offset, length, position) { try { var u8 = util_1.buffer2Uint8array(buffer); if (position === null) { position = undefined; } return this._FS.write(this._stream, u8, offset, length, position); } catch (e) { throw convertError(e, this._path); } }; EmscriptenFile.prototype.read = function (buffer, offset, length, position, cb) { try { cb(null, this.readSync(buffer, offset, length, position), buffer); } catch (e) { cb(e); } }; EmscriptenFile.prototype.readSync = function (buffer, offset, length, position) { try { var u8 = util_1.buffer2Uint8array(buffer); if (position === null) { position = undefined; } return this._FS.read(this._stream, u8, offset, length, position); } catch (e) { throw convertError(e, this._path); } }; EmscriptenFile.prototype.sync = function (cb) { cb(); }; EmscriptenFile.prototype.syncSync = function () { }; EmscriptenFile.prototype.chown = function (uid, gid, cb) { var err = null; try { this.chownSync(uid, gid); } catch (e) { err = e; } finally { cb(err); } }; EmscriptenFile.prototype.chownSync = function (uid, gid) { try { this._FS.fchown(this._stream.fd, uid, gid); } catch (e) { throw convertError(e, this._path); } }; EmscriptenFile.prototype.chmod = function (mode, cb) { var err = null; try { this.chmodSync(mode); } catch (e) { err = e; } finally { cb(err); } }; EmscriptenFile.prototype.chmodSync = function (mode) { try { this._FS.fchmod(this._stream.fd, mode); } catch (e) { throw convertError(e, this._path); } }; EmscriptenFile.prototype.utimes = function (atime, mtime, cb) { var err = null; try { this.utimesSync(atime, mtime); } catch (e) { err = e; } finally { cb(err); } }; EmscriptenFile.prototype.utimesSync = function (atime, mtime) { this._fs.utimesSync(this._path, atime, mtime); }; return EmscriptenFile; }(file_1.BaseFile)); exports.EmscriptenFile = EmscriptenFile; var EmscriptenFileSystem = (function (_super) { __extends(EmscriptenFileSystem, _super); function EmscriptenFileSystem(_FS) { _super.call(this); this._FS = _FS; } EmscriptenFileSystem.isAvailable = function () { return true; }; EmscriptenFileSystem.prototype.getName = function () { return this._FS.DB_NAME(); }; EmscriptenFileSystem.prototype.isReadOnly = function () { return false; }; EmscriptenFileSystem.prototype.supportsLinks = function () { return true; }; EmscriptenFileSystem.prototype.supportsProps = function () { return true; }; EmscriptenFileSystem.prototype.supportsSynch = function () { return true; }; EmscriptenFileSystem.prototype.renameSync = function (oldPath, newPath) { try { this._FS.rename(oldPath, newPath); } catch (e) { if (e.errno === api_error_1.ErrorCode.ENOENT) { throw convertError(e, this.existsSync(oldPath) ? newPath : oldPath); } else { throw convertError(e); } } }; EmscriptenFileSystem.prototype.statSync = function (p, isLstat) { try { var stats = isLstat ? this._FS.lstat(p) : this._FS.stat(p); var item_type = this.modeToFileType(stats.mode); return new node_fs_stats_1["default"](item_type, stats.size, stats.mode, stats.atime, stats.mtime, stats.ctime); } catch (e) { throw convertError(e, p); } }; EmscriptenFileSystem.prototype.modeToFileType = function (mode) { if (this._FS.isDir(mode)) { return node_fs_stats_1.FileType.DIRECTORY; } else if (this._FS.isFile(mode)) { return node_fs_stats_1.FileType.FILE; } else if (this._FS.isLink(mode)) { return node_fs_stats_1.FileType.SYMLINK; } }; EmscriptenFileSystem.prototype._tryStats = function (p) { try { return this.statSync(p, false); } catch (e) { return null; } }; EmscriptenFileSystem.prototype.openSync = function (p, flag, mode) { try { var stream = this._FS.open(p, flag.getFlagString(), mode); if (this._FS.isDir(stream.node.mode)) { this._FS.close(stream); throw api_error_1.ApiError.EISDIR(p); } return new EmscriptenFile(this, this._FS, p, flag, stream); } catch (e) { throw convertError(e, p); } }; EmscriptenFileSystem.prototype.unlinkSync = function (p) { try { this._FS.unlink(p); } catch (e) { throw convertError(e, p); } }; EmscriptenFileSystem.prototype.rmdirSync = function (p) { try { this._FS.rmdir(p); } catch (e) { throw convertError(e, p); } }; EmscriptenFileSystem.prototype.mkdirSync = function (p, mode) { try { this._FS.mkdir(p, mode); } catch (e) { throw convertError(e, p); } }; EmscriptenFileSystem.prototype.readdirSync = function (p) { try { return this._FS.readdir(p).filter(function (p) { return p !== '.' && p !== '..'; }); } catch (e) { throw convertError(e, p); } }; EmscriptenFileSystem.prototype.truncateSync = function (p, len) { try { this._FS.truncate(p, len); } catch (e) { throw convertError(e, p); } }; EmscriptenFileSystem.prototype.readFileSync = function (p, encoding, flag) { try { var data = this._FS.readFile(p, { flags: flag.getFlagString() }); var buff = util_1.uint8Array2Buffer(data); if (encoding) { return buff.toString(encoding); } else { return buff; } } catch (e) { throw convertError(e, p); } }; EmscriptenFileSystem.prototype.writeFileSync = function (p, data, encoding, flag, mode) { try { if (encoding) { data = new Buffer(data, encoding); } var u8 = util_1.buffer2Uint8array(data); this._FS.writeFile(p, u8, { flags: flag.getFlagString(), encoding: 'binary' }); this._FS.chmod(p, mode); } catch (e) { throw convertError(e, p); } }; EmscriptenFileSystem.prototype.chmodSync = function (p, isLchmod, mode) { try { isLchmod ? this._FS.lchmod(p, mode) : this._FS.chmod(p, mode); } catch (e) { throw convertError(e, p); } }; EmscriptenFileSystem.prototype.chownSync = function (p, isLchown, uid, gid) { try { isLchown ? this._FS.lchown(p, uid, gid) : this._FS.chown(p, uid, gid); } catch (e) { throw convertError(e, p); } }; EmscriptenFileSystem.prototype.symlinkSync = function (srcpath, dstpath, type) { try { this._FS.symlink(srcpath, dstpath); } catch (e) { throw convertError(e); } }; EmscriptenFileSystem.prototype.readlinkSync = function (p) { try { return this._FS.readlink(p); } catch (e) { throw convertError(e, p); } }; EmscriptenFileSystem.prototype.utimesSync = function (p, atime, mtime) { try { this._FS.utime(p, atime.getTime(), mtime.getTime()); } catch (e) { throw convertError(e, p); } }; return EmscriptenFileSystem; }(file_system.SynchronousFileSystem)); exports.__esModule = true; exports["default"] = EmscriptenFileSystem; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRW1zY3JpcHRlbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iYWNrZW5kL0Vtc2NyaXB0ZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsSUFBTyxXQUFXLFdBQVcscUJBQXFCLENBQUMsQ0FBQztBQUNwRCw4QkFBeUMsdUJBQXVCLENBQUMsQ0FBQTtBQUVqRSxxQkFBNkIsY0FBYyxDQUFDLENBQUE7QUFDNUMscUJBQW1ELGNBQWMsQ0FBQyxDQUFBO0FBQ2xFLDBCQUFnRCxtQkFBbUIsQ0FBQyxDQUFBO0FBUXBFLHNCQUFzQixDQUFrQixFQUFFLElBQWlCO0lBQWpCLG9CQUFpQixHQUFqQixTQUFpQjtJQUN6RCxJQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ3RCLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDcEIsSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO0lBQ2YsT0FBTyxNQUFNLEVBQUUsQ0FBQztRQUNkLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNCLEVBQUUsQ0FBQyxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUM3QixLQUFLLENBQUM7UUFDUixDQUFDO1FBQ0QsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDekIsQ0FBQztJQUNELE1BQU0sQ0FBQyxJQUFJLG9CQUFRLENBQUMsS0FBSyxFQUFFLHdCQUFZLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDbkcsQ0FBQztBQUVEO0lBQW9DLGtDQUFRO0lBQzFDLHdCQUNVLEdBQXlCLEVBQ3pCLEdBQVEsRUFDUixLQUFhLEVBQ2IsS0FBZSxFQUNmLE9B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LEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUN0RCxDQUFFO1FBQUEsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNYLE1BQU0sWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMzQixDQUFDO0lBQ0gsQ0FBQztJQUVILDJCQUFDO0FBQUQsQ0FBQyxBQTFMRCxDQUFrRCxXQUFXLENBQUMscUJBQXFCLEdBMExsRjtBQTFMRDt5Q0EwTEMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmaWxlX3N5c3RlbSA9IHJlcXVpcmUoJy4uL2NvcmUvZmlsZV9zeXN0ZW0nKTtcbmltcG9ydCB7ZGVmYXVsdCBhcyBTdGF0cywgRmlsZVR5cGV9IGZyb20gJy4uL2NvcmUvbm9kZV9mc19zdGF0cyc7XG5pbXBvcnQge0ZpbGVGbGFnLCBBY3Rpb25UeXBlfSBmcm9tICcuLi9jb3JlL2ZpbGVfZmxhZyc7XG5pbXBvcnQge0Jhc2VGaWxlLCBGaWxlfSBmcm9tICcuLi9jb3JlL2ZpbGUnO1xuaW1wb3J0IHt1aW50OEFycmF5MkJ1ZmZlciwgYnVmZmVyMlVpbnQ4YXJyYXl9IGZyb20gJy4uL2NvcmUvdXRpbCc7XG5pbXBvcnQge0FwaUVycm9yLCBFcnJvckNvZGUsIEVycm9yU3RyaW5nc30gZnJvbSAnLi4vY29yZS9hcGlfZXJyb3InO1xuaW1wb3J0IHtTdGF0cyBhcyBFbXNjcmlwdGVuU3RhdHMsIEVtc2NyaXB0ZW5GU05vZGV9IGZyb20gJy4uL2dlbmVyaWMvZW1zY3JpcHRlbl9mcyc7XG5cbmludGVyZmFjZSBFbXNjcmlwdGVuRXJyb3Ige1xuICBub2RlOiBFbXNjcmlwdGVuRlNOb2RlO1xuICBlcnJubzogbnVtYmVyO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0RXJyb3IoZTogRW1zY3JpcHRlbkVycm9yLCBwYXRoOiBzdHJpbmcgPSAnJyk6IEFwaUVycm9yIHtcbiAgY29uc3QgZXJybm8gPSBlLmVycm5vO1xuICBsZXQgcGFyZW50ID0gZS5ub2RlO1xuICBsZXQgcGF0aHMgPSBbXTtcbiAgd2hpbGUgKHBhcmVudCkge1xuICAgIHBhdGhzLnVuc2hpZnQocGFyZW50Lm5hbWUpO1xuICAgIGlmIChwYXJlbnQgPT09IHBhcmVudC5wYXJlbnQpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50O1xuICB9XG4gIHJldHVybiBuZXcgQXBpRXJyb3IoZXJybm8sIEVycm9yU3RyaW5nc1tlcnJub10sIHBhdGhzLmxlbmd0aCA+IDAgPyAnLycgKyBwYXRocy5qb2luKCcvJykgOiBwYXRoKTtcbn1cblxuZXhwb3J0IGNsYXNzIEVtc2NyaXB0ZW5GaWxlIGV4dGVuZHMgQmFzZUZpbGUgaW1wbGVtZW50cyBGaWxlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfZnM6IEVtc2NyaXB0ZW5GaWxlU3lzdGVtLFxuICAgIHByaXZhdGUgX0ZTOiBhbnksXG4gICAgcHJpdmF0ZSBfcGF0aDogc3RyaW5nLFxuICAgIHByaXZhdGUgX2ZsYWc6IEZpbGVGbGFnLFxuICAgIHByaXZhdGUgX3N0cmVhbTogYW55KSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICBwdWJsaWMgZ2V0UG9zKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBwdWJsaWMgY2xvc2UoY2I6IChlcnI/OiBBcGlFcnJvcikgPT4gdm9pZCk6IHZvaWQge1xuICAgIGxldCBlcnI6IEFwaUVycm9yID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgdGhpcy5jbG9zZVN5bmMoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlcnIgPSBlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBjYihlcnIpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgY2xvc2VTeW5jKCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLl9GUy5jbG9zZSh0aGlzLl9zdHJlYW0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IGNvbnZlcnRFcnJvcihlLCB0aGlzLl9wYXRoKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIHN0YXQoY2I6IChlcnI6IEFwaUVycm9yLCBzdGF0cz86IFN0YXRzKSA9PiBhbnkpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgY2IobnVsbCwgdGhpcy5zdGF0U3luYygpKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjYihlKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIHN0YXRTeW5jKCk6IFN0YXRzIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMuX2ZzLnN0YXRTeW5jKHRoaXMuX3BhdGgsIGZhbHNlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBjb252ZXJ0RXJyb3IoZSwgdGhpcy5fcGF0aCk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyB0cnVuY2F0ZShsZW46IG51bWJlciwgY2I6IChlcnI/OiBBcGlFcnJvcikgPT4gdm9pZCk6IHZvaWQge1xuICAgIGxldCBlcnI6IEFwaUVycm9yID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgdGhpcy50cnVuY2F0ZVN5bmMobGVuKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlcnIgPSBlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBjYihlcnIpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgdHJ1bmNhdGVTeW5jKGxlbjogbnVtYmVyKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX0ZTLmZ0cnVuY2F0ZSh0aGlzLl9zdHJlYW0uZmQsIGxlbik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgY29udmVydEVycm9yKGUsIHRoaXMuX3BhdGgpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgd3JpdGUoYnVmZmVyOiBOb2RlQnVmZmVyLCBvZmZzZXQ6IG51bWJlciwgbGVuZ3RoOiBudW1iZXIsIHBvc2l0aW9uOiBudW1iZXIsIGNiOiAoZXJyOiBBcGlFcnJvciwgd3JpdHRlbj86IG51bWJlciwgYnVmZmVyPzogTm9kZUJ1ZmZlcikgPT4gYW55KTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNiKG51bGwsIHRoaXMud3JpdGVTeW5jKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uKSwgYnVmZmVyKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjYihlKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIHdyaXRlU3luYyhidWZmZXI6IE5vZGVCdWZmZXIsIG9mZnNldDogbnVtYmVyLCBsZW5ndGg6IG51bWJlciwgcG9zaXRpb246IG51bWJlcik6IG51bWJlciB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHU4ID0gYnVmZmVyMlVpbnQ4YXJyYXkoYnVmZmVyKTtcbiAgICAgIC8vIEVtc2NyaXB0ZW4gaXMgcGFydGljdWxhciBhYm91dCB3aGF0IHBvc2l0aW9uIGlzIHNldCB0by5cbiAgICAgIGlmIChwb3NpdGlvbiA9PT0gbnVsbCkge1xuICAgICAgICBwb3NpdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLl9GUy53cml0ZSh0aGlzLl9zdHJlYW0sIHU4LCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IGNvbnZlcnRFcnJvcihlLCB0aGlzLl9wYXRoKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIHJlYWQoYnVmZmVyOiBOb2RlQnVmZmVyLCBvZmZzZXQ6IG51bWJlciwgbGVuZ3RoOiBudW1iZXIsIHBvc2l0aW9uOiBudW1iZXIsIGNiOiAoZXJyOiBBcGlFcnJvciwgYnl0ZXNSZWFkPzogbnVtYmVyLCBidWZmZXI/OiBOb2RlQnVmZmVyKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNiKG51bGwsIHRoaXMucmVhZFN5bmMoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24pLCBidWZmZXIpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNiKGUpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgcmVhZFN5bmMoYnVmZmVyOiBOb2RlQnVmZmVyLCBvZmZzZXQ6IG51bWJlciwgbGVuZ3RoOiBudW1iZXIsIHBvc2l0aW9uOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1OCA9IGJ1ZmZlcjJVaW50OGFycmF5KGJ1ZmZlcik7XG4gICAgICAvLyBFbXNjcmlwdGVuIGlzIHBhcnRpY3VsYXIgYWJvdXQgd2hhdCBwb3NpdGlvbiBpcyBzZXQgdG8uXG4gICAgICBpZiAocG9zaXRpb24gPT09IG51bGwpIHtcbiAgICAgICAgcG9zaXRpb24gPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5fRlMucmVhZCh0aGlzLl9zdHJlYW0sIHU4LCBvZmZzZXQsIGxlbmd0aCwgcG9zaXRpb24pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IGNvbnZlcnRFcnJvcihlLCB0aGlzLl9wYXRoKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIHN5bmMoY2I6IChlPzogQXBpRXJyb3IpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAvLyBOT1AuXG4gICAgY2IoKTtcbiAgfVxuICBwdWJsaWMgc3luY1N5bmMoKTogdm9pZCB7XG4gICAgLy8gTk9QLlxuICB9XG4gIHB1YmxpYyBjaG93bih1aWQ6IG51bWJlciwgZ2lkOiBudW1iZXIsIGNiOiAoZT86IEFwaUVycm9yKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgbGV0IGVycjogQXBpRXJyb3IgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmNob3duU3luYyh1aWQsIGdpZCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyID0gZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgY2IoZXJyKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGNob3duU3luYyh1aWQ6IG51bWJlciwgZ2lkOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5fRlMuZmNob3duKHRoaXMuX3N0cmVhbS5mZCwgdWlkLCBnaWQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IGNvbnZlcnRFcnJvcihlLCB0aGlzLl9wYXRoKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGNobW9kKG1vZGU6IG51bWJlciwgY2I6IChlPzogQXBpRXJyb3IpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBsZXQgZXJyOiBBcGlFcnJvciA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuY2htb2RTeW5jKG1vZGUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVyciA9IGU7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGNiKGVycik7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBjaG1vZFN5bmMobW9kZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX0ZTLmZjaG1vZCh0aGlzLl9zdHJlYW0uZmQsIG1vZGUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IGNvbnZlcnRFcnJvcihlLCB0aGlzLl9wYXRoKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIHV0aW1lcyhhdGltZTogRGF0ZSwgbXRpbWU6IERhdGUsIGNiOiAoZT86IEFwaUVycm9yKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgbGV0IGVycjogQXBpRXJyb3IgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLnV0aW1lc1N5bmMoYXRpbWUsIG10aW1lKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlcnIgPSBlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBjYihlcnIpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgdXRpbWVzU3luYyhhdGltZTogRGF0ZSwgbXRpbWU6IERhdGUpOiB2b2lkIHtcbiAgICB0aGlzLl9mcy51dGltZXNTeW5jKHRoaXMuX3BhdGgsIGF0aW1lLCBtdGltZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBBIHNpbXBsZSBpbi1tZW1vcnkgZmlsZSBzeXN0ZW0gYmFja2VkIGJ5IGFuIEluTWVtb3J5U3RvcmUuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVtc2NyaXB0ZW5GaWxlU3lzdGVtIGV4dGVuZHMgZmlsZV9zeXN0ZW0uU3luY2hyb25vdXNGaWxlU3lzdGVtIHtcbiAgcHJpdmF0ZSBfRlM6IGFueTtcblxuICBjb25zdHJ1Y3RvcihfRlM6IGFueSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fRlMgPSBfRlM7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzQXZhaWxhYmxlKCk6IGJvb2xlYW4geyByZXR1cm4gdHJ1ZTsgfVxuICBwdWJsaWMgZ2V0TmFtZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fRlMuREJfTkFNRSgpOyB9XG4gIHB1YmxpYyBpc1JlYWRPbmx5KCk6IGJvb2xlYW4geyByZXR1cm4gZmFsc2U7IH1cbiAgcHVibGljIHN1cHBvcnRzTGlua3MoKTogYm9vbGVhbiB7IHJldHVybiB0cnVlOyB9XG4gIHB1YmxpYyBzdXBwb3J0c1Byb3BzKCk6IGJvb2xlYW4geyByZXR1cm4gdHJ1ZTsgfVxuICBwdWJsaWMgc3VwcG9ydHNTeW5jaCgpOiBib29sZWFuIHsgcmV0dXJuIHRydWU7IH1cblxuICBwdWJsaWMgcmVuYW1lU3luYyhvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLl9GUy5yZW5hbWUob2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUuZXJybm8gPT09IEVycm9yQ29kZS5FTk9FTlQpIHtcbiAgICAgICAgdGhyb3cgY29udmVydEVycm9yKGUsIHRoaXMuZXhpc3RzU3luYyhvbGRQYXRoKSA/IG5ld1BhdGggOiBvbGRQYXRoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGNvbnZlcnRFcnJvcihlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhdFN5bmMocDogc3RyaW5nLCBpc0xzdGF0OiBib29sZWFuKTogU3RhdHMge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGF0cyA9IGlzTHN0YXQgPyB0aGlzLl9GUy5sc3RhdChwKSA6IHRoaXMuX0ZTLnN0YXQocCk7XG4gICAgICBjb25zdCBpdGVtX3R5cGUgPSB0aGlzLm1vZGVUb0ZpbGVUeXBlKHN0YXRzLm1vZGUpO1xuICAgICAgcmV0dXJuIG5ldyBTdGF0cyhcbiAgICAgICAgaXRlbV90eXBlLFxuICAgICAgICBzdGF0cy5zaXplLFxuICAgICAgICBzdGF0cy5tb2RlLFxuICAgICAgICBzdGF0cy5hdGltZSxcbiAgICAgICAgc3RhdHMubXRpbWUsXG4gICAgICAgIHN0YXRzLmN0aW1lXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IGNvbnZlcnRFcnJvcihlLCBwKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1vZGVUb0ZpbGVUeXBlKG1vZGU6IG51bWJlcik6IEZpbGVUeXBlIHtcbiAgICBpZiAodGhpcy5fRlMuaXNEaXIobW9kZSkpIHtcbiAgICAgIHJldHVybiBGaWxlVHlwZS5ESVJFQ1RPUlk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9GUy5pc0ZpbGUobW9kZSkpIHtcbiAgICAgIHJldHVybiBGaWxlVHlwZS5GSUxFO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fRlMuaXNMaW5rKG1vZGUpKSB7XG4gICAgICByZXR1cm4gRmlsZVR5cGUuU1lNTElOSztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTW92ZWQgdG8gc2VwYXJhdGUgZnVuY3Rpb24gdG8gYXZvaWQgcGVyZiBoaXQuXG4gICAqL1xuICBwcml2YXRlIF90cnlTdGF0cyhwOiBzdHJpbmcpOiBTdGF0cyB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLnN0YXRTeW5jKHAsIGZhbHNlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb3BlblN5bmMocDogc3RyaW5nLCBmbGFnOiBGaWxlRmxhZywgbW9kZTogbnVtYmVyKTogRW1zY3JpcHRlbkZpbGUge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdHJlYW0gPSB0aGlzLl9GUy5vcGVuKHAsIGZsYWcuZ2V0RmxhZ1N0cmluZygpLCBtb2RlKTtcbiAgICAgIGlmICh0aGlzLl9GUy5pc0RpcihzdHJlYW0ubm9kZS5tb2RlKSkge1xuICAgICAgICB0aGlzLl9GUy5jbG9zZShzdHJlYW0pO1xuICAgICAgICB0aHJvdyBBcGlFcnJvci5FSVNESVIocCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IEVtc2NyaXB0ZW5GaWxlKHRoaXMsIHRoaXMuX0ZTLCBwLCBmbGFnLCBzdHJlYW0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IGNvbnZlcnRFcnJvcihlLCBwKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdW5saW5rU3luYyhwOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5fRlMudW5saW5rKHApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IGNvbnZlcnRFcnJvcihlLCBwKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcm1kaXJTeW5jKHA6IHN0cmluZyk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLl9GUy5ybWRpcihwKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBjb252ZXJ0RXJyb3IoZSwgcCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG1rZGlyU3luYyhwOiBzdHJpbmcsIG1vZGU6IG51bWJlcik6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLl9GUy5ta2RpcihwLCBtb2RlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBjb252ZXJ0RXJyb3IoZSwgcCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlYWRkaXJTeW5jKHA6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICB0cnkge1xuICAgICAgLy8gRW1zY3JpcHRlbiByZXR1cm5zIGl0ZW1zIGZvciAnLicgYW5kICcuLicuIE5vZGUgZG9lcyBub3QuXG4gICAgICByZXR1cm4gdGhpcy5fRlMucmVhZGRpcihwKS5maWx0ZXIoKHApID0+IHAgIT09ICcuJyAmJiBwICE9PSAnLi4nKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBjb252ZXJ0RXJyb3IoZSwgcCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHRydW5jYXRlU3luYyhwOiBzdHJpbmcsIGxlbjogbnVtYmVyKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX0ZTLnRydW5jYXRlKHAsIGxlbik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgY29udmVydEVycm9yKGUsIHApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZWFkRmlsZVN5bmMocDogc3RyaW5nLCBlbmNvZGluZzogc3RyaW5nLCBmbGFnOiBGaWxlRmxhZyk6IGFueSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRhdGE6IFVpbnQ4QXJyYXkgPSB0aGlzLl9GUy5yZWFkRmlsZShwLCB7IGZsYWdzOiBmbGFnLmdldEZsYWdTdHJpbmcoKSB9KVxuICAgICAgY29uc3QgYnVmZiA9IHVpbnQ4QXJyYXkyQnVmZmVyKGRhdGEpO1xuICAgICAgaWYgKGVuY29kaW5nKSB7XG4gICAgICAgIHJldHVybiBidWZmLnRvU3RyaW5nKGVuY29kaW5nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBidWZmO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IGNvbnZlcnRFcnJvcihlLCBwKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgd3JpdGVGaWxlU3luYyhwOiBzdHJpbmcsIGRhdGE6IGFueSwgZW5jb2Rpbmc6IHN0cmluZywgZmxhZzogRmlsZUZsYWcsIG1vZGU6IG51bWJlcik6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBpZiAoZW5jb2RpbmcpIHtcbiAgICAgICAgZGF0YSA9IG5ldyBCdWZmZXIoZGF0YSwgZW5jb2RpbmcpO1xuICAgICAgfVxuICAgICAgY29uc3QgdTggPSBidWZmZXIyVWludDhhcnJheShkYXRhKTtcbiAgICAgIHRoaXMuX0ZTLndyaXRlRmlsZShwLCB1OCwgeyBmbGFnczogZmxhZy5nZXRGbGFnU3RyaW5nKCksIGVuY29kaW5nOiAnYmluYXJ5JyB9KTtcbiAgICAgIHRoaXMuX0ZTLmNobW9kKHAsIG1vZGUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IGNvbnZlcnRFcnJvcihlLCBwKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY2htb2RTeW5jKHA6IHN0cmluZywgaXNMY2htb2Q6IGJvb2xlYW4sIG1vZGU6IG51bWJlcikge1xuICAgIHRyeSB7XG4gICAgICBpc0xjaG1vZCA/IHRoaXMuX0ZTLmxjaG1vZChwLCBtb2RlKSA6IHRoaXMuX0ZTLmNobW9kKHAsIG1vZGUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IGNvbnZlcnRFcnJvcihlLCBwKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY2hvd25TeW5jKHA6IHN0cmluZywgaXNMY2hvd246IGJvb2xlYW4sIHVpZDogbnVtYmVyLCBnaWQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBpc0xjaG93biA/IHRoaXMuX0ZTLmxjaG93bihwLCB1aWQsIGdpZCkgOiB0aGlzLl9GUy5jaG93bihwLCB1aWQsIGdpZCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgY29udmVydEVycm9yKGUsIHApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzeW1saW5rU3luYyhzcmNwYXRoOiBzdHJpbmcsIGRzdHBhdGg6IHN0cmluZywgdHlwZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX0ZTLnN5bWxpbmsoc3JjcGF0aCwgZHN0cGF0aCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgY29udmVydEVycm9yKGUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZWFkbGlua1N5bmMocDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMuX0ZTLnJlYWRsaW5rKHApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IGNvbnZlcnRFcnJvcihlLCBwKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdXRpbWVzU3luYyhwOiBzdHJpbmcsIGF0aW1lOiBEYXRlLCBtdGltZTogRGF0ZSk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLl9GUy51dGltZShwLCBhdGltZS5nZXRUaW1lKCksIG10aW1lLmdldFRpbWUoKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgY29udmVydEVycm9yKGUsIHApO1xuICAgIH1cbiAgfVxuXG59XG4iXX0=