UNPKG

easyui-draganddrop

Version:

Drag and drop elements including a file explorer and a rubbish bin.

460 lines (361 loc) 41.6 kB
'use strict'; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } var easyui = require('easyui'), Element = easyui.Element; var util = require('../../util'), Entry = require('../entry'), Entries = require('../entries'), ToggleButton = require('../toggleButton'), DraggableEntry = require('../draggableEntry'); var Directory = function (_DraggableEntry) { _inherits(Directory, _DraggableEntry); function Directory(selector, name, collapsed, explorer) { _classCallCheck(this, Directory); var type = Entry.types.DIRECTORY; var _this = _possibleConstructorReturn(this, (Directory.__proto__ || Object.getPrototypeOf(Directory)).call(this, selector, name, explorer, type)); _this.toggleButton = ToggleButton.fromParentElement(_this, _this.toggleButtonUpdateHandler.bind(_this)); _this.entries = Entries.fromParentElement(_this, Directory); _this.onDoubleClick(_this.doubleClickHandler.bind(_this)); !collapsed ? _this.expand() : _this.collapse(); return _this; } _createClass(Directory, [{ key: 'isDirectory', value: function isDirectory() { return true; } }, { key: 'isBefore', value: function isBefore(entry) { var entryType = entry.getType(); switch (entryType) { case Entry.types.FILE: case Entry.types.MARKER: return true; case Entry.types.DIRECTORY: var name = this.getName(), entryName = entry.getName(), before = name.localeCompare(entryName) < 0; return before; } } }, { key: 'getSubEntries', value: function getSubEntries() { var subEntries = []; this.forEachFile(function (file) { var subEntry = file; /// subEntries.push(subEntry); }); this.forEachDirectory(function (directory) { var subEntry = directory, /// directorySubEntries = directory.getSubEntries(); subEntries.push(subEntry); subEntries = subEntries.concat(directorySubEntries); }); return subEntries; } }, { key: 'getFilePaths', value: function getFilePaths() { var filePaths = []; this.forEachFile(function (file) { var filePath = file.getPath(); filePaths.push(filePath); }); this.forEachDirectory(function (directory) { var directoryFilePaths = directory.getFilePaths(); filePaths = filePaths.concat(directoryFilePaths); }); return filePaths; } }, { key: 'getCollapsedBounds', value: function getCollapsedBounds() { var collapsed = this.isCollapsed(); this.collapse(); var bounds = _get(Directory.prototype.__proto__ || Object.getPrototypeOf(Directory.prototype), 'getBounds', this).call(this), collapsedBounds = bounds; /// if (!collapsed) { this.expand(); } return collapsedBounds; } }, { key: 'isOverlappingDraggableEntry', value: function isOverlappingDraggableEntry(draggableEntry) { var overlappingDraggableEntry = void 0; if (this === draggableEntry) { overlappingDraggableEntry = false; } else { var collapsed = this.isCollapsed(); if (collapsed) { overlappingDraggableEntry = false; } else { var draggableEntryCollapsedBounds = draggableEntry.getCollapsedBounds(), overlappingDraggableEntryCollapsedBounds = _get(Directory.prototype.__proto__ || Object.getPrototypeOf(Directory.prototype), 'isOverlappingCollapsedBounds', this).call(this, draggableEntryCollapsedBounds); overlappingDraggableEntry = overlappingDraggableEntryCollapsedBounds; } } return overlappingDraggableEntry; } }, { key: 'isCollapsed', value: function isCollapsed() { return this.toggleButton.isCollapsed(); } }, { key: 'expand', value: function expand() { this.toggleButton.expand(); } }, { key: 'collapse', value: function collapse() { this.toggleButton.collapse(); } }, { key: 'addFile', value: function addFile(filePath) { var addIfNecessary = true, topmostDirectory = this.topmostDirectory(filePath, addIfNecessary); if (topmostDirectory !== null) { var filePathWithoutTopmostDirectoryName = util.pathWithoutTopmostDirectoryName(filePath); topmostDirectory.addFile(filePathWithoutTopmostDirectoryName); } else { var fileName = filePath, /// entriesFile = this.entries.hasFile(fileName); if (!entriesFile) { var explorer = this.getExplorer(); this.entries.addFile(fileName, explorer); } } } }, { key: 'addDirectory', value: function addDirectory(directoryPath, collapsed) { var addIfNecessary = true, topmostDirectory = this.topmostDirectory(directoryPath, addIfNecessary); if (topmostDirectory !== null) { var directoryPathWithoutTopmostDirectoryName = util.pathWithoutTopmostDirectoryName(directoryPath); topmostDirectory.addDirectory(directoryPathWithoutTopmostDirectoryName, collapsed); } else { var directoryName = directoryPath, /// entriesDirectory = this.entries.hasDirectory(directoryName); if (!entriesDirectory) { var explorer = this.getExplorer(); this.entries.addDirectory(directoryName, collapsed, explorer); } } } }, { key: 'removeFile', value: function removeFile(filePath) { var removeEmptyParentDirectories = null; /// var addIfNecessary = false, topmostDirectory = this.topmostDirectory(filePath, addIfNecessary); if (topmostDirectory !== null) { var filePathWithoutTopmostDirectoryName = util.pathWithoutTopmostDirectoryName(filePath); removeEmptyParentDirectories = topmostDirectory.removeFile(filePathWithoutTopmostDirectoryName); } else { var fileName = filePath, /// entriesFile = this.entries.hasFile(fileName); if (entriesFile) { removeEmptyParentDirectories = this.entries.removeFile(fileName); } } if (removeEmptyParentDirectories === true) { var rootDirectory = this.isRootDirectory(); if (!rootDirectory) { var empty = this.isEmpty(); if (empty) { this.remove(); } } } return removeEmptyParentDirectories; } }, { key: 'removeDirectory', value: function removeDirectory(directoryPath) { var removeEmptyParentDirectories = null; /// var addIfNecessary = false, topmostDirectory = this.topmostDirectory(directoryPath, addIfNecessary); if (topmostDirectory !== null) { var directoryPathWithoutTopmostDirectoryName = util.pathWithoutTopmostDirectoryName(directoryPath); removeEmptyParentDirectories = topmostDirectory.removeDirectory(directoryPathWithoutTopmostDirectoryName); } else { var directoryName = directoryPath, /// entriesDirectory = this.entries.hasDirectory(directoryName); if (entriesDirectory) { removeEmptyParentDirectories = this.entries.removeDirectory(directoryName); } } if (removeEmptyParentDirectories === true) { var rootDirectory = this.isRootDirectory(); if (!rootDirectory) { var empty = this.isEmpty(); if (empty) { this.remove(); } } } return removeEmptyParentDirectories; } }, { key: 'addMarker', value: function addMarker(markerPath, draggableEntryType) { var topmostDirectoryName = util.topmostDirectoryName(markerPath); if (topmostDirectoryName === null) { var markerName = markerPath; /// this.entries.addMarker(markerName, draggableEntryType); } else { var topmostDirectory = this.entries.retrieveDirectory(topmostDirectoryName), markerPathWithoutTopmostDirectoryName = util.pathWithoutTopmostDirectoryName(markerPath); topmostDirectory.addMarker(markerPathWithoutTopmostDirectoryName, draggableEntryType); } } }, { key: 'removeMarker', value: function removeMarker() { var removed = void 0; var entriesMarked = this.entries.isMarked(); if (entriesMarked) { this.entries.removeMarker(); removed = true; } else { removed = this.entries.someDirectory(function (directory) { var removed = directory.removeMarker(); return removed; }); } return removed; } }, { key: 'isMarked', value: function isMarked() { var marked = void 0; var entriesMarked = this.entries.isMarked(); if (entriesMarked) { marked = entriesMarked; } else { var directoryMarked = this.entries.someDirectory(function (directory) { var directoryMarked = directory.isMarked(); return directoryMarked; }); marked = directoryMarked; } return marked; } }, { key: 'isEmpty', value: function isEmpty() { return this.entries.isEmpty(); } }, { key: 'forEachFile', value: function forEachFile(callback) { this.entries.forEachFile(callback); } }, { key: 'forEachDirectory', value: function forEachDirectory(callback) { this.entries.forEachDirectory(callback); } }, { key: 'someDirectory', value: function someDirectory(callback) { this.entries.someDirectory(callback); } }, { key: 'getDraggableEntryPath', value: function getDraggableEntryPath(draggableEntry) { var draggableEntryPath = void 0; var name = this.getName(); if (draggableEntry === this) { draggableEntryPath = name; /// } else { draggableEntryPath = this.entries.getDraggableEntryPath(draggableEntry); if (draggableEntryPath !== null) { draggableEntryPath = name + '/' + draggableEntryPath; } } return draggableEntryPath; } }, { key: 'topmostDirectory', value: function topmostDirectory(path, addIfNecessary) { var topmostDirectory = void 0; var topmostDirectoryName = util.topmostDirectoryName(path); if (topmostDirectoryName === null) { topmostDirectory = null; } else { if (addIfNecessary) { var entriesDirectory = this.entries.hasDirectory(topmostDirectoryName); if (!entriesDirectory) { var collapsed = true, explorer = this.getExplorer(); this.entries.addDirectory(topmostDirectoryName, collapsed, explorer); } } topmostDirectory = this.entries.retrieveDirectory(topmostDirectoryName); } return topmostDirectory; } }, { key: 'getMarkedDirectory', value: function getMarkedDirectory() { var markedDirectory = this.entries.getMarkedDirectory(); if (markedDirectory === null) { var marked = this.isMarked(); if (marked) { markedDirectory = this; } } return markedDirectory; } }, { key: 'getDirectoryOverlappingDraggableEntry', value: function getDirectoryOverlappingDraggableEntry(draggableEntry) { var directoryOverlappingDraggableEntry = null; var overlappingDraggableEntry = this.isOverlappingDraggableEntry(draggableEntry); if (overlappingDraggableEntry) { directoryOverlappingDraggableEntry = this.entries.getDirectoryOverlappingDraggableEntry(draggableEntry); if (directoryOverlappingDraggableEntry === null) { directoryOverlappingDraggableEntry = this; } } return directoryOverlappingDraggableEntry; } }, { key: 'toggleButtonUpdateHandler', value: function toggleButtonUpdateHandler(collapsed) { collapsed ? this.addClass('collapsed') : this.removeClass('collapsed'); } }, { key: 'doubleClickHandler', value: function doubleClickHandler() { this.toggleButton.toggle(); } }], [{ key: 'clone', value: function clone(name, collapsed, explorer) { var directory = new Directory('#directory', name, collapsed, explorer); directory = Element.clone(Directory, directory, name, collapsed, explorer); /// directory.removeAttribute('id'); return directory; } }]); return Directory; }(DraggableEntry); module.exports = Directory; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2VzNi9leHBsb3Jlci9kcmFnZ2FibGVFbnRyeS9kaXJlY3RvcnkuanMiXSwibmFtZXMiOlsiZWFzeXVpIiwicmVxdWlyZSIsIkVsZW1lbnQiLCJ1dGlsIiwiRW50cnkiLCJFbnRyaWVzIiwiVG9nZ2xlQnV0dG9uIiwiRHJhZ2dhYmxlRW50cnkiLCJEaXJlY3RvcnkiLCJzZWxlY3RvciIsIm5hbWUiLCJjb2xsYXBzZWQiLCJleHBsb3JlciIsInR5cGUiLCJ0eXBlcyIsIkRJUkVDVE9SWSIsInRvZ2dsZUJ1dHRvbiIsImZyb21QYXJlbnRFbGVtZW50IiwidG9nZ2xlQnV0dG9uVXBkYXRlSGFuZGxlciIsImJpbmQiLCJlbnRyaWVzIiwib25Eb3VibGVDbGljayIsImRvdWJsZUNsaWNrSGFuZGxlciIsImV4cGFuZCIsImNvbGxhcHNlIiwiZW50cnkiLCJlbnRyeVR5cGUiLCJnZXRUeXBlIiwiRklMRSIsIk1BUktFUiIsImdldE5hbWUiLCJlbnRyeU5hbWUiLCJiZWZvcmUiLCJsb2NhbGVDb21wYXJlIiwic3ViRW50cmllcyIsImZvckVhY2hGaWxlIiwiZmlsZSIsInN1YkVudHJ5IiwicHVzaCIsImZvckVhY2hEaXJlY3RvcnkiLCJkaXJlY3RvcnkiLCJkaXJlY3RvcnlTdWJFbnRyaWVzIiwiZ2V0U3ViRW50cmllcyIsImNvbmNhdCIsImZpbGVQYXRocyIsImZpbGVQYXRoIiwiZ2V0UGF0aCIsImRpcmVjdG9yeUZpbGVQYXRocyIsImdldEZpbGVQYXRocyIsImlzQ29sbGFwc2VkIiwiYm91bmRzIiwiY29sbGFwc2VkQm91bmRzIiwiZHJhZ2dhYmxlRW50cnkiLCJvdmVybGFwcGluZ0RyYWdnYWJsZUVudHJ5IiwiZHJhZ2dhYmxlRW50cnlDb2xsYXBzZWRCb3VuZHMiLCJnZXRDb2xsYXBzZWRCb3VuZHMiLCJvdmVybGFwcGluZ0RyYWdnYWJsZUVudHJ5Q29sbGFwc2VkQm91bmRzIiwiYWRkSWZOZWNlc3NhcnkiLCJ0b3Btb3N0RGlyZWN0b3J5IiwiZmlsZVBhdGhXaXRob3V0VG9wbW9zdERpcmVjdG9yeU5hbWUiLCJwYXRoV2l0aG91dFRvcG1vc3REaXJlY3RvcnlOYW1lIiwiYWRkRmlsZSIsImZpbGVOYW1lIiwiZW50cmllc0ZpbGUiLCJoYXNGaWxlIiwiZ2V0RXhwbG9yZXIiLCJkaXJlY3RvcnlQYXRoIiwiZGlyZWN0b3J5UGF0aFdpdGhvdXRUb3Btb3N0RGlyZWN0b3J5TmFtZSIsImFkZERpcmVjdG9yeSIsImRpcmVjdG9yeU5hbWUiLCJlbnRyaWVzRGlyZWN0b3J5IiwiaGFzRGlyZWN0b3J5IiwicmVtb3ZlRW1wdHlQYXJlbnREaXJlY3RvcmllcyIsInJlbW92ZUZpbGUiLCJyb290RGlyZWN0b3J5IiwiaXNSb290RGlyZWN0b3J5IiwiZW1wdHkiLCJpc0VtcHR5IiwicmVtb3ZlIiwicmVtb3ZlRGlyZWN0b3J5IiwibWFya2VyUGF0aCIsImRyYWdnYWJsZUVudHJ5VHlwZSIsInRvcG1vc3REaXJlY3RvcnlOYW1lIiwibWFya2VyTmFtZSIsImFkZE1hcmtlciIsInJldHJpZXZlRGlyZWN0b3J5IiwibWFya2VyUGF0aFdpdGhvdXRUb3Btb3N0RGlyZWN0b3J5TmFtZSIsInJlbW92ZWQiLCJlbnRyaWVzTWFya2VkIiwiaXNNYXJrZWQiLCJyZW1vdmVNYXJrZXIiLCJzb21lRGlyZWN0b3J5IiwibWFya2VkIiwiZGlyZWN0b3J5TWFya2VkIiwiY2FsbGJhY2siLCJkcmFnZ2FibGVFbnRyeVBhdGgiLCJnZXREcmFnZ2FibGVFbnRyeVBhdGgiLCJwYXRoIiwibWFya2VkRGlyZWN0b3J5IiwiZ2V0TWFya2VkRGlyZWN0b3J5IiwiZGlyZWN0b3J5T3ZlcmxhcHBpbmdEcmFnZ2FibGVFbnRyeSIsImlzT3ZlcmxhcHBpbmdEcmFnZ2FibGVFbnRyeSIsImdldERpcmVjdG9yeU92ZXJsYXBwaW5nRHJhZ2dhYmxlRW50cnkiLCJhZGRDbGFzcyIsInJlbW92ZUNsYXNzIiwidG9nZ2xlIiwiY2xvbmUiLCJyZW1vdmVBdHRyaWJ1dGUiLCJtb2R1bGUiLCJleHBvcnRz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RUEsWUFBSWdELHVDQUF1QyxJQUEzQyxFQUFpRDtBQUMvQ0EsK0NBQXFDLElBQXJDO0FBQ0Q7QUFDRjs7QUFFRCxhQUFPQSxrQ0FBUDtBQUNEOzs7OENBRXlCekYsUyxFQUFXO0FBQ25DQSxrQkFDRSxLQUFLNEYsUUFBTCxDQUFjLFdBQWQsQ0FERixHQUVJLEtBQUtDLFdBQUwsQ0FBaUIsV0FBakIsQ0FGSjtBQUdEOzs7eUNBRW9CO0FBQ25CLFdBQUt4RixZQUFMLENBQWtCeUYsTUFBbEI7QUFDRDs7OzBCQUVZL0YsSSxFQUFNQyxTLEVBQVdDLFEsRUFBVTtBQUN0QyxVQUFJNEIsWUFBWSxJQUFJaEMsU0FBSixDQUFjLFlBQWQsRUFBNEJFLElBQTVCLEVBQWtDQyxTQUFsQyxFQUE2Q0MsUUFBN0MsQ0FBaEI7O0FBRUE0QixrQkFBWXRDLFFBQVF3RyxLQUFSLENBQWNsRyxTQUFkLEVBQXlCZ0MsU0FBekIsRUFBb0M5QixJQUFwQyxFQUEwQ0MsU0FBMUMsRUFBcURDLFFBQXJELENBQVosQ0FIc0MsQ0FHdUM7O0FBRTdFNEIsZ0JBQVVtRSxlQUFWLENBQTBCLElBQTFCOztBQUVBLGFBQU9uRSxTQUFQO0FBQ0Q7Ozs7RUEvWHFCakMsYzs7QUFrWXhCcUcsT0FBT0MsT0FBUCxHQUFpQnJHLFNBQWpCIiwiZmlsZSI6ImRpcmVjdG9yeS5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuY29uc3QgZWFzeXVpID0gcmVxdWlyZSgnZWFzeXVpJyksXG4gICAgICBFbGVtZW50ID0gZWFzeXVpLkVsZW1lbnQ7XG5cbmNvbnN0IHV0aWwgPSByZXF1aXJlKCcuLi8uLi91dGlsJyksXG4gICAgICBFbnRyeSA9IHJlcXVpcmUoJy4uL2VudHJ5JyksXG4gICAgICBFbnRyaWVzID0gcmVxdWlyZSgnLi4vZW50cmllcycpLFxuICAgICAgVG9nZ2xlQnV0dG9uID0gcmVxdWlyZSgnLi4vdG9nZ2xlQnV0dG9uJyksXG4gICAgICBEcmFnZ2FibGVFbnRyeSA9IHJlcXVpcmUoJy4uL2RyYWdnYWJsZUVudHJ5Jyk7XG5cbmNsYXNzIERpcmVjdG9yeSBleHRlbmRzIERyYWdnYWJsZUVudHJ5IHtcbiAgY29uc3RydWN0b3Ioc2VsZWN0b3IsIG5hbWUsIGNvbGxhcHNlZCwgZXhwbG9yZXIpIHtcbiAgICBjb25zdCB0eXBlID0gRW50cnkudHlwZXMuRElSRUNUT1JZO1xuXG4gICAgc3VwZXIoc2VsZWN0b3IsIG5hbWUsIGV4cGxvcmVyLCB0eXBlKTtcbiAgICBcbiAgICB0aGlzLnRvZ2dsZUJ1dHRvbiA9IFRvZ2dsZUJ1dHRvbi5mcm9tUGFyZW50RWxlbWVudCh0aGlzLCB0aGlzLnRvZ2dsZUJ1dHRvblVwZGF0ZUhhbmRsZXIuYmluZCh0aGlzKSApO1xuXG4gICAgdGhpcy5lbnRyaWVzID0gRW50cmllcy5mcm9tUGFyZW50RWxlbWVudCh0aGlzLCBEaXJlY3RvcnkpO1xuXG4gICAgdGhpcy5vbkRvdWJsZUNsaWNrKHRoaXMuZG91YmxlQ2xpY2tIYW5kbGVyLmJpbmQodGhpcykpO1xuXG4gICAgIWNvbGxhcHNlZCA/XG4gICAgICB0aGlzLmV4cGFuZCgpIDpcbiAgICAgICAgdGhpcy5jb2xsYXBzZSgpO1xuICB9XG5cbiAgaXNEaXJlY3RvcnkoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpc0JlZm9yZShlbnRyeSkge1xuICAgIGNvbnN0IGVudHJ5VHlwZSA9IGVudHJ5LmdldFR5cGUoKTtcblxuICAgIHN3aXRjaCAoZW50cnlUeXBlKSB7XG4gICAgICBjYXNlIEVudHJ5LnR5cGVzLkZJTEU6XG4gICAgICBjYXNlIEVudHJ5LnR5cGVzLk1BUktFUjpcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgY2FzZSBFbnRyeS50eXBlcy5ESVJFQ1RPUlk6XG5cbiAgICAgICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0TmFtZSgpLFxuICAgICAgICAgICAgICBlbnRyeU5hbWUgPSBlbnRyeS5nZXROYW1lKCksXG4gICAgICAgICAgICAgIGJlZm9yZSA9IG5hbWUubG9jYWxlQ29tcGFyZShlbnRyeU5hbWUpIDwgMDtcblxuICAgICAgICByZXR1cm4gYmVmb3JlO1xuICAgIH1cbiAgfVxuICBcbiAgZ2V0U3ViRW50cmllcygpIHtcbiAgICBsZXQgc3ViRW50cmllcyA9IFtdO1xuXG4gICAgdGhpcy5mb3JFYWNoRmlsZShmdW5jdGlvbihmaWxlKSB7XG4gICAgICBjb25zdCBzdWJFbnRyeSA9IGZpbGU7IC8vL1xuXG4gICAgICBzdWJFbnRyaWVzLnB1c2goc3ViRW50cnkpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5mb3JFYWNoRGlyZWN0b3J5KGZ1bmN0aW9uKGRpcmVjdG9yeSkge1xuICAgICAgY29uc3Qgc3ViRW50cnkgPSBkaXJlY3RvcnksIC8vL1xuICAgICAgICAgICAgZGlyZWN0b3J5U3ViRW50cmllcyA9IGRpcmVjdG9yeS5nZXRTdWJFbnRyaWVzKCk7XG5cbiAgICAgIHN1YkVudHJpZXMucHVzaChzdWJFbnRyeSk7XG4gICAgICBcbiAgICAgIHN1YkVudHJpZXMgPSBzdWJFbnRyaWVzLmNvbmNhdChkaXJlY3RvcnlTdWJFbnRyaWVzKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBzdWJFbnRyaWVzO1xuICB9XG5cbiAgZ2V0RmlsZVBhdGhzKCkge1xuICAgIGxldCBmaWxlUGF0aHMgPSBbXTtcblxuICAgIHRoaXMuZm9yRWFjaEZpbGUoZnVuY3Rpb24oZmlsZSkge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSBmaWxlLmdldFBhdGgoKTtcblxuICAgICAgZmlsZVBhdGhzLnB1c2goZmlsZVBhdGgpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5mb3JFYWNoRGlyZWN0b3J5KGZ1bmN0aW9uKGRpcmVjdG9yeSkge1xuICAgICAgY29uc3QgZGlyZWN0b3J5RmlsZVBhdGhzID0gZGlyZWN0b3J5LmdldEZpbGVQYXRocygpO1xuICAgICAgXG4gICAgICBmaWxlUGF0aHMgPSBmaWxlUGF0aHMuY29uY2F0KGRpcmVjdG9yeUZpbGVQYXRocyk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZmlsZVBhdGhzO1xuICB9XG5cbiAgZ2V0Q29sbGFwc2VkQm91bmRzKCkge1xuICAgIGNvbnN0IGNvbGxhcHNlZCA9IHRoaXMuaXNDb2xsYXBzZWQoKTtcblxuICAgIHRoaXMuY29sbGFwc2UoKTtcblxuICAgIGNvbnN0IGJvdW5kcyA9IHN1cGVyLmdldEJvdW5kcygpLFxuICAgICAgICBjb2xsYXBzZWRCb3VuZHMgPSBib3VuZHM7ICAvLy9cblxuICAgIGlmICghY29sbGFwc2VkKSB7XG4gICAgICB0aGlzLmV4cGFuZCgpO1xuICAgIH1cblxuICAgIHJldHVybiBjb2xsYXBzZWRCb3VuZHM7XG4gIH1cblxuICBpc092ZXJsYXBwaW5nRHJhZ2dhYmxlRW50cnkoZHJhZ2dhYmxlRW50cnkpIHtcbiAgICBsZXQgb3ZlcmxhcHBpbmdEcmFnZ2FibGVFbnRyeTtcbiAgICBcbiAgICBpZiAodGhpcyA9PT0gZHJhZ2dhYmxlRW50cnkpIHtcbiAgICAgIG92ZXJsYXBwaW5nRHJhZ2dhYmxlRW50cnkgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29sbGFwc2VkID0gdGhpcy5pc0NvbGxhcHNlZCgpO1xuICAgICAgXG4gICAgICBpZiAoY29sbGFwc2VkKSB7XG4gICAgICAgIG92ZXJsYXBwaW5nRHJhZ2dhYmxlRW50cnkgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGRyYWdnYWJsZUVudHJ5Q29sbGFwc2VkQm91bmRzID0gZHJhZ2dhYmxlRW50cnkuZ2V0Q29sbGFwc2VkQm91bmRzKCksXG4gICAgICAgICAgICBvdmVybGFwcGluZ0RyYWdnYWJsZUVudHJ5Q29sbGFwc2VkQm91bmRzID0gc3VwZXIuaXNPdmVybGFwcGluZ0NvbGxhcHNlZEJvdW5kcyhkcmFnZ2FibGVFbnRyeUNvbGxhcHNlZEJvdW5kcyk7XG5cbiAgICAgICAgb3ZlcmxhcHBpbmdEcmFnZ2FibGVFbnRyeSA9IG92ZXJsYXBwaW5nRHJhZ2dhYmxlRW50cnlDb2xsYXBzZWRCb3VuZHM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG92ZXJsYXBwaW5nRHJhZ2dhYmxlRW50cnk7XG4gIH1cblxuICBpc0NvbGxhcHNlZCgpIHsgcmV0dXJuIHRoaXMudG9nZ2xlQnV0dG9uLmlzQ29sbGFwc2VkKCk7IH1cblxuICBleHBhbmQoKSB7IHRoaXMudG9nZ2xlQnV0dG9uLmV4cGFuZCgpOyB9XG5cbiAgY29sbGFwc2UoKSB7IHRoaXMudG9nZ2xlQnV0dG9uLmNvbGxhcHNlKCk7IH1cblxuICBhZGRGaWxlKGZpbGVQYXRoKSB7XG4gICAgY29uc3QgYWRkSWZOZWNlc3NhcnkgPSB0cnVlLFxuICAgICAgICAgIHRvcG1vc3REaXJlY3RvcnkgPSB0aGlzLnRvcG1vc3REaXJlY3RvcnkoZmlsZVBhdGgsIGFkZElmTmVjZXNzYXJ5KTtcblxuICAgIGlmICh0b3Btb3N0RGlyZWN0b3J5ICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBmaWxlUGF0aFdpdGhvdXRUb3Btb3N0RGlyZWN0b3J5TmFtZSA9IHV0aWwucGF0aFdpdGhvdXRUb3Btb3N0RGlyZWN0b3J5TmFtZShmaWxlUGF0aCk7XG5cbiAgICAgIHRvcG1vc3REaXJlY3RvcnkuYWRkRmlsZShmaWxlUGF0aFdpdGhvdXRUb3Btb3N0RGlyZWN0b3J5TmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGZpbGVOYW1lID0gZmlsZVBhdGgsICAvLy9cbiAgICAgICAgICBlbnRyaWVzRmlsZSA9IHRoaXMuZW50cmllcy5oYXNGaWxlKGZpbGVOYW1lKTtcblxuICAgICAgaWYgKCFlbnRyaWVzRmlsZSkge1xuICAgICAgICBjb25zdCBleHBsb3JlciA9IHRoaXMuZ2V0RXhwbG9yZXIoKTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMuZW50cmllcy5hZGRGaWxlKGZpbGVOYW1lLCBleHBsb3Jlcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYWRkRGlyZWN0b3J5KGRpcmVjdG9yeVBhdGgsIGNvbGxhcHNlZCkge1xuICAgIGNvbnN0IGFkZElmTmVjZXNzYXJ5ID0gdHJ1ZSxcbiAgICAgICAgICB0b3Btb3N0RGlyZWN0b3J5ID0gdGhpcy50b3Btb3N0RGlyZWN0b3J5KGRpcmVjdG9yeVBhdGgsIGFkZElmTmVjZXNzYXJ5KTtcblxuICAgIGlmICh0b3Btb3N0RGlyZWN0b3J5ICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBkaXJlY3RvcnlQYXRoV2l0aG91dFRvcG1vc3REaXJlY3RvcnlOYW1lID0gdXRpbC5wYXRoV2l0aG91dFRvcG1vc3REaXJlY3RvcnlOYW1lKGRpcmVjdG9yeVBhdGgpO1xuXG4gICAgICB0b3Btb3N0RGlyZWN0b3J5LmFkZERpcmVjdG9yeShkaXJlY3RvcnlQYXRoV2l0aG91dFRvcG1vc3REaXJlY3RvcnlOYW1lLCBjb2xsYXBzZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBkaXJlY3RvcnlOYW1lID0gZGlyZWN0b3J5UGF0aCwgIC8vL1xuICAgICAgICAgIGVudHJpZXNEaXJlY3RvcnkgPSB0aGlzLmVudHJpZXMuaGFzRGlyZWN0b3J5KGRpcmVjdG9yeU5hbWUpO1xuXG4gICAgICBpZiAoIWVudHJpZXNEaXJlY3RvcnkpIHtcbiAgICAgICAgY29uc3QgZXhwbG9yZXIgPSB0aGlzLmdldEV4cGxvcmVyKCk7XG5cbiAgICAgICAgdGhpcy5lbnRyaWVzLmFkZERpcmVjdG9yeShkaXJlY3RvcnlOYW1lLCBjb2xsYXBzZWQsIGV4cGxvcmVyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZW1vdmVGaWxlKGZpbGVQYXRoKSB7XG4gICAgbGV0IHJlbW92ZUVtcHR5UGFyZW50RGlyZWN0b3JpZXMgPSBudWxsOyAvLy9cblxuICAgIGNvbnN0IGFkZElmTmVjZXNzYXJ5ID0gZmFsc2UsXG4gICAgICAgICAgdG9wbW9zdERpcmVjdG9yeSA9IHRoaXMudG9wbW9zdERpcmVjdG9yeShmaWxlUGF0aCwgYWRkSWZOZWNlc3NhcnkpO1xuXG4gICAgaWYgKHRvcG1vc3REaXJlY3RvcnkgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoV2l0aG91dFRvcG1vc3REaXJlY3RvcnlOYW1lID0gdXRpbC5wYXRoV2l0aG91dFRvcG1vc3REaXJlY3RvcnlOYW1lKGZpbGVQYXRoKTtcblxuICAgICAgcmVtb3ZlRW1wdHlQYXJlbnREaXJlY3RvcmllcyA9IHRvcG1vc3REaXJlY3RvcnkucmVtb3ZlRmlsZShmaWxlUGF0aFdpdGhvdXRUb3Btb3N0RGlyZWN0b3J5TmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGZpbGVOYW1lID0gZmlsZVBhdGgsICAvLy9cbiAgICAgICAgICAgIGVudHJpZXNGaWxlID0gdGhpcy5lbnRyaWVzLmhhc0ZpbGUoZmlsZU5hbWUpO1xuXG4gICAgICBpZiAoZW50cmllc0ZpbGUpIHtcbiAgICAgICAgcmVtb3ZlRW1wdHlQYXJlbnREaXJlY3RvcmllcyA9IHRoaXMuZW50cmllcy5yZW1vdmVGaWxlKGZpbGVOYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVtb3ZlRW1wdHlQYXJlbnREaXJlY3RvcmllcyA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3Qgcm9vdERpcmVjdG9yeSA9IHRoaXMuaXNSb290RGlyZWN0b3J5KCk7XG5cbiAgICAgIGlmICghcm9vdERpcmVjdG9yeSkge1xuICAgICAgICBjb25zdCBlbXB0eSA9IHRoaXMuaXNFbXB0eSgpO1xuXG4gICAgICAgIGlmIChlbXB0eSkge1xuICAgICAgICAgIHRoaXMucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVtb3ZlRW1wdHlQYXJlbnREaXJlY3RvcmllcztcbiAgfVxuXG4gIHJlbW92ZURpcmVjdG9yeShkaXJlY3RvcnlQYXRoKSB7XG4gICAgbGV0IHJlbW92ZUVtcHR5UGFyZW50RGlyZWN0b3JpZXMgPSBudWxsOyAvLy9cblxuICAgIGNvbnN0IGFkZElmTmVjZXNzYXJ5ID0gZmFsc2UsXG4gICAgICAgICAgdG9wbW9zdERpcmVjdG9yeSA9IHRoaXMudG9wbW9zdERpcmVjdG9yeShkaXJlY3RvcnlQYXRoLCBhZGRJZk5lY2Vzc2FyeSk7XG5cbiAgICBpZiAodG9wbW9zdERpcmVjdG9yeSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgZGlyZWN0b3J5UGF0aFdpdGhvdXRUb3Btb3N0RGlyZWN0b3J5TmFtZSA9IHV0aWwucGF0aFdpdGhvdXRUb3Btb3N0RGlyZWN0b3J5TmFtZShkaXJlY3RvcnlQYXRoKTtcblxuICAgICAgcmVtb3ZlRW1wdHlQYXJlbnREaXJlY3RvcmllcyA9IHRvcG1vc3REaXJlY3RvcnkucmVtb3ZlRGlyZWN0b3J5KGRpcmVjdG9yeVBhdGhXaXRob3V0VG9wbW9zdERpcmVjdG9yeU5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBkaXJlY3RvcnlOYW1lID0gZGlyZWN0b3J5UGF0aCwgIC8vL1xuICAgICAgICAgIGVudHJpZXNEaXJlY3RvcnkgPSB0aGlzLmVudHJpZXMuaGFzRGlyZWN0b3J5KGRpcmVjdG9yeU5hbWUpO1xuXG4gICAgICBpZiAoZW50cmllc0RpcmVjdG9yeSkge1xuICAgICAgICByZW1vdmVFbXB0eVBhcmVudERpcmVjdG9yaWVzID0gdGhpcy5lbnRyaWVzLnJlbW92ZURpcmVjdG9yeShkaXJlY3RvcnlOYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVtb3ZlRW1wdHlQYXJlbnREaXJlY3RvcmllcyA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3Qgcm9vdERpcmVjdG9yeSA9IHRoaXMuaXNSb290RGlyZWN0b3J5KCk7XG5cbiAgICAgIGlmICghcm9vdERpcmVjdG9yeSkge1xuICAgICAgICBjb25zdCBlbXB0eSA9IHRoaXMuaXNFbXB0eSgpO1xuXG4gICAgICAgIGlmIChlbXB0eSkge1xuICAgICAgICAgIHRoaXMucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVtb3ZlRW1wdHlQYXJlbnREaXJlY3RvcmllcztcbiAgfVxuICBcbiAgYWRkTWFya2VyKG1hcmtlclBhdGgsIGRyYWdnYWJsZUVudHJ5VHlwZSkge1xuICAgIGNvbnN0IHRvcG1vc3REaXJlY3RvcnlOYW1lID0gdXRpbC50b3Btb3N0RGlyZWN0b3J5TmFtZShtYXJrZXJQYXRoKTtcblxuICAgIGlmICh0b3Btb3N0RGlyZWN0b3J5TmFtZSA9PT0gbnVsbCkge1xuICAgICAgY29uc3QgbWFya2VyTmFtZSA9IG1hcmtlclBhdGg7ICAvLy9cblxuICAgICAgdGhpcy5lbnRyaWVzLmFkZE1hcmtlcihtYXJrZXJOYW1lLCBkcmFnZ2FibGVFbnRyeVR5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0b3Btb3N0RGlyZWN0b3J5ID0gdGhpcy5lbnRyaWVzLnJldHJpZXZlRGlyZWN0b3J5KHRvcG1vc3REaXJlY3RvcnlOYW1lKSxcbiAgICAgICAgICBtYXJrZXJQYXRoV2l0aG91dFRvcG1vc3REaXJlY3RvcnlOYW1lID0gdXRpbC5wYXRoV2l0aG91dFRvcG1vc3REaXJlY3RvcnlOYW1lKG1hcmtlclBhdGgpO1xuXG4gICAgICB0b3Btb3N0RGlyZWN0b3J5LmFkZE1hcmtlcihtYXJrZXJQYXRoV2l0aG91dFRvcG1vc3REaXJlY3RvcnlOYW1lLCBkcmFnZ2FibGVFbnRyeVR5cGUpO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZU1hcmtlcigpIHtcbiAgICBsZXQgcmVtb3ZlZDtcblxuICAgIGNvbnN0IGVudHJpZXNNYXJrZWQgPSB0aGlzLmVudHJpZXMuaXNNYXJrZWQoKTtcbiAgICBcbiAgICBpZiAoZW50cmllc01hcmtlZCkge1xuICAgICAgdGhpcy5lbnRyaWVzLnJlbW92ZU1hcmtlcigpO1xuXG4gICAgICByZW1vdmVkID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVtb3ZlZCA9IHRoaXMuZW50cmllcy5zb21lRGlyZWN0b3J5KGZ1bmN0aW9uKGRpcmVjdG9yeSkge1xuICAgICAgICBjb25zdCByZW1vdmVkID0gZGlyZWN0b3J5LnJlbW92ZU1hcmtlcigpO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHJlbW92ZWQ7XG4gICAgICB9KTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHJlbW92ZWQ7XG4gIH1cblxuICBpc01hcmtlZCgpIHtcbiAgICBsZXQgbWFya2VkO1xuXG4gICAgY29uc3QgZW50cmllc01hcmtlZCA9IHRoaXMuZW50cmllcy5pc01hcmtlZCgpO1xuICAgIFxuICAgIGlmIChlbnRyaWVzTWFya2VkKSB7XG4gICAgICBtYXJrZWQgPSBlbnRyaWVzTWFya2VkO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBkaXJlY3RvcnlNYXJrZWQgPSB0aGlzLmVudHJpZXMuc29tZURpcmVjdG9yeShmdW5jdGlvbihkaXJlY3RvcnkpIHtcbiAgICAgICAgY29uc3QgZGlyZWN0b3J5TWFya2VkID0gZGlyZWN0b3J5LmlzTWFya2VkKCk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gZGlyZWN0b3J5TWFya2VkO1xuICAgICAgfSk7XG5cbiAgICAgIG1hcmtlZCA9IGRpcmVjdG9yeU1hcmtlZDtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIG1hcmtlZDtcbiAgfVxuXG4gIGlzRW1wdHkoKSB7IHJldHVybiB0aGlzLmVudHJpZXMuaXNFbXB0eSgpOyB9XG5cbiAgZm9yRWFjaEZpbGUoY2FsbGJhY2spIHsgdGhpcy5lbnRyaWVzLmZvckVhY2hGaWxlKGNhbGxiYWNrKTsgfVxuXG4gIGZvckVhY2hEaXJlY3RvcnkoY2FsbGJhY2spIHsgdGhpcy5lbnRyaWVzLmZvckVhY2hEaXJlY3RvcnkoY2FsbGJhY2spOyB9XG5cbiAgc29tZURpcmVjdG9yeShjYWxsYmFjaykgeyB0aGlzLmVudHJpZXMuc29tZURpcmVjdG9yeShjYWxsYmFjayk7IH1cblxuICBnZXREcmFnZ2FibGVFbnRyeVBhdGgoZHJhZ2dhYmxlRW50cnkpIHtcbiAgICBsZXQgZHJhZ2dhYmxlRW50cnlQYXRoO1xuXG4gICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0TmFtZSgpO1xuXG4gICAgaWYgKGRyYWdnYWJsZUVudHJ5ID09PSB0aGlzKSB7XG4gICAgICBkcmFnZ2FibGVFbnRyeVBhdGggPSBuYW1lOyAgLy8vXG4gICAgfSBlbHNlIHtcbiAgICAgIGRyYWdnYWJsZUVudHJ5UGF0aCA9IHRoaXMuZW50cmllcy5nZXREcmFnZ2FibGVFbnRyeVBhdGgoZHJhZ2dhYmxlRW50cnkpO1xuXG4gICAgICBpZiAoZHJhZ2dhYmxlRW50cnlQYXRoICE9PSBudWxsKSB7XG4gICAgICAgIGRyYWdnYWJsZUVudHJ5UGF0aCA9IG5hbWUgKyAnLycgKyBkcmFnZ2FibGVFbnRyeVBhdGg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRyYWdnYWJsZUVudHJ5UGF0aDtcbiAgfVxuXG4gIHRvcG1vc3REaXJlY3RvcnkocGF0aCwgYWRkSWZOZWNlc3NhcnkpIHtcbiAgICBsZXQgdG9wbW9zdERpcmVjdG9yeTtcblxuICAgIGNvbnN0IHRvcG1vc3REaXJlY3RvcnlOYW1lID0gdXRpbC50b3Btb3N0RGlyZWN0b3J5TmFtZShwYXRoKTtcblxuICAgIGlmICh0b3Btb3N0RGlyZWN0b3J5TmFtZSA9PT0gbnVsbCkge1xuICAgICAgdG9wbW9zdERpcmVjdG9yeSA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChhZGRJZk5lY2Vzc2FyeSkge1xuICAgICAgICBjb25zdCBlbnRyaWVzRGlyZWN0b3J5ID0gdGhpcy5lbnRyaWVzLmhhc0RpcmVjdG9yeSh0b3Btb3N0RGlyZWN0b3J5TmFtZSk7XG5cbiAgICAgICAgaWYgKCFlbnRyaWVzRGlyZWN0b3J5KSB7XG4gICAgICAgICAgY29uc3QgY29sbGFwc2VkID0gdHJ1ZSxcbiAgICAgICAgICAgICAgZXhwbG9yZXIgPSB0aGlzLmdldEV4cGxvcmVyKCk7XG5cbiAgICAgICAgICB0aGlzLmVudHJpZXMuYWRkRGlyZWN0b3J5KHRvcG1vc3REaXJlY3RvcnlOYW1lLCBjb2xsYXBzZWQsIGV4cGxvcmVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0b3Btb3N0RGlyZWN0b3J5ID0gdGhpcy5lbnRyaWVzLnJldHJpZXZlRGlyZWN0b3J5KHRvcG1vc3REaXJlY3RvcnlOYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdG9wbW9zdERpcmVjdG9yeTtcbiAgfVxuXG4gIGdldE1hcmtlZERpcmVjdG9yeSgpIHtcbiAgICBsZXQgbWFya2VkRGlyZWN0b3J5ID0gdGhpcy5lbnRyaWVzLmdldE1hcmtlZERpcmVjdG9yeSgpO1xuXG4gICAgaWYgKG1hcmtlZERpcmVjdG9yeSA9PT0gbnVsbCkge1xuICAgICAgY29uc3QgbWFya2VkID0gdGhpcy5pc01hcmtlZCgpO1xuICAgICAgXG4gICAgICBpZiAobWFya2VkKSB7XG4gICAgICAgIG1hcmtlZERpcmVjdG9yeSA9IHRoaXM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcmtlZERpcmVjdG9yeTtcbiAgfVxuXG4gIGdldERpcmVjdG9yeU92ZXJsYXBwaW5nRHJhZ2dhYmxlRW50cnkoZHJhZ2dhYmxlRW50cnkpIHtcbiAgICBsZXQgZGlyZWN0b3J5T3ZlcmxhcHBpbmdEcmFnZ2FibGVFbnRyeSA9IG51bGw7XG5cbiAgICBjb25zdCBvdmVybGFwcGluZ0RyYWdnYWJsZUVudHJ5ID0gdGhpcy5pc092ZXJsYXBwaW5nRHJhZ2dhYmxlRW50cnkoZHJhZ2dhYmxlRW50cnkpO1xuXG4gICAgaWYgKG92ZXJsYXBwaW5nRHJhZ2dhYmxlRW50cnkpIHtcbiAgICAgIGRpcmVjdG9yeU92ZXJsYXBwaW5nRHJhZ2dhYmxlRW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0RGlyZWN0b3J5T3ZlcmxhcHBpbmdEcmFnZ2FibGVFbnRyeShkcmFnZ2FibGVFbnRyeSk7XG5cbiAgICAgIGlmIChkaXJlY3RvcnlPdmVybGFwcGluZ0RyYWdnYWJsZUVudHJ5ID09PSBudWxsKSB7XG4gICAgICAgIGRpcmVjdG9yeU92ZXJsYXBwaW5nRHJhZ2dhYmxlRW50cnkgPSB0aGlzO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkaXJlY3RvcnlPdmVybGFwcGluZ0RyYWdnYWJsZUVudHJ5O1xuICB9XG4gIFxuICB0b2dnbGVCdXR0b25VcGRhdGVIYW5kbGVyKGNvbGxhcHNlZCkge1xuICAgIGNvbGxhcHNlZCA/IFxuICAgICAgdGhpcy5hZGRDbGFzcygnY29sbGFwc2VkJykgOiBcbiAgICAgICAgdGhpcy5yZW1vdmVDbGFzcygnY29sbGFwc2VkJyk7XG4gIH1cblxuICBkb3VibGVDbGlja0hhbmRsZXIoKSB7XG4gICAgdGhpcy50b2dnbGVCdXR0b24udG9nZ2xlKCk7XG4gIH1cblxuICBzdGF0aWMgY2xvbmUobmFtZSwgY29sbGFwc2VkLCBleHBsb3Jlcikge1xuICAgIGxldCBkaXJlY3RvcnkgPSBuZXcgRGlyZWN0b3J5KCcjZGlyZWN0b3J5JywgbmFtZSwgY29sbGFwc2VkLCBleHBsb3Jlcik7XG5cbiAgICBkaXJlY3RvcnkgPSBFbGVtZW50LmNsb25lKERpcmVjdG9yeSwgZGlyZWN0b3J5LCBuYW1lLCBjb2xsYXBzZWQsIGV4cGxvcmVyKTsgIC8vL1xuXG4gICAgZGlyZWN0b3J5LnJlbW92ZUF0dHJpYnV0ZSgnaWQnKTtcblxuICAgIHJldHVybiBkaXJlY3Rvcnk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBEaXJlY3Rvcnk7XG4iXX0=