UNPKG

easyui-draganddrop

Version:

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

359 lines (294 loc) 28.7 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; }; }(); 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 options = require('../options'), Entry = require('./entry'), File = require('./draggableEntry/file'), FileMarker = require('./entry/fileMarker'), DirectoryMarker = require('./entry/directoryMarker'); var Entries = function (_Element) { _inherits(Entries, _Element); function Entries(selector, Directory) { _classCallCheck(this, Entries); var _this = _possibleConstructorReturn(this, (Entries.__proto__ || Object.getPrototypeOf(Entries)).call(this, selector)); _this.Directory = Directory; return _this; } _createClass(Entries, [{ key: 'addFile', value: function addFile(fileName, explorer) { var file = File.clone(fileName, explorer), entry = file; /// this.addEntry(entry); } }, { key: 'addDirectory', value: function addDirectory(directoryName, collapsed, explorer) { var directory = this.Directory.clone(directoryName, collapsed, explorer), entry = directory; /// this.addEntry(entry); } }, { key: 'removeFile', value: function removeFile(fileName) { var file = this.retrieveFile(fileName), explorer = file.getExplorer(), removeEmptyParentDirectories = explorer.hasOption(options.REMOVE_EMPTY_PARENT_DIRECTORIES); file.remove(); return removeEmptyParentDirectories; } }, { key: 'removeDirectory', value: function removeDirectory(directoryName) { var directory = this.retrieveDirectory(directoryName), explorer = directory.getExplorer(), removeEmptyParentDirectories = explorer.hasOption(options.REMOVE_EMPTY_PARENT_DIRECTORIES); directory.remove(); return removeEmptyParentDirectories; } }, { key: 'hasFile', value: function hasFile(fileName) { var file = this.retrieveFile(fileName); file = file !== null; /// return file; } }, { key: 'hasDirectory', value: function hasDirectory(directoryName) { var directory = this.retrieveDirectory(directoryName); directory = directory !== null; /// return directory; } }, { key: 'addMarker', value: function addMarker(markerName, draggableEntryType) { var marker = void 0; switch (draggableEntryType) { case Entry.types.FILE: marker = FileMarker.clone(markerName); break; case Entry.types.DIRECTORY: marker = DirectoryMarker.clone(markerName); break; } var entry = marker; /// this.addEntry(entry); } }, { key: 'removeMarker', value: function removeMarker() { var marker = this.retrieveMarker(); marker.remove(); } }, { key: 'isMarked', value: function isMarked() { var marker = this.retrieveMarker(), marked = marker !== null; return marked; } }, { key: 'isEmpty', value: function isEmpty() { var entries = this.getEntries(), entriesLength = entries.length, empty = entriesLength === 0; return empty; } }, { key: 'addEntry', value: function addEntry(entry) { var nextEntry = entry, entries = this.getEntries(); var previousEntry = null; entries.some(function (entry) { var nextEntryBefore = nextEntry.isBefore(entry); if (nextEntryBefore) { previousEntry = entry; return true; } else { return false; } }); if (previousEntry === null) { this.append(nextEntry); } else { nextEntry.insertBefore(previousEntry); } } }, { key: 'retrieveFile', value: function retrieveFile(fileName) { return this.retrieveEntryByType(fileName, Entry.types.FILE); } }, { key: 'retrieveDirectory', value: function retrieveDirectory(directoryName) { return this.retrieveEntryByType(directoryName, Entry.types.DIRECTORY); } }, { key: 'retrieveMarker', value: function retrieveMarker() { var marker = null; var type = Entry.types.MARKER; this.someEntryByType(function (entry) { marker = entry; /// return true; }, type); return marker; } }, { key: 'getMarkedDirectory', value: function getMarkedDirectory() { var markedDirectory = null; this.someDirectory(function (directory) { markedDirectory = directory.getMarkedDirectory(); if (markedDirectory !== null) { return true; } else { return false; } }); return markedDirectory; } }, { key: 'getDraggableEntryPath', value: function getDraggableEntryPath(draggableEntry) { var draggableEntryPath = null; this.someEntry(function (entry) { if (entry === draggableEntry) { /// var entryName = entry.getName(); draggableEntryPath = entryName; /// return true; } else { return false; } }); if (draggableEntryPath === null) { this.someDirectory(function (directory) { var directoryDraggableEntryPath = directory.getDraggableEntryPath(draggableEntry); if (directoryDraggableEntryPath !== null) { draggableEntryPath = directoryDraggableEntryPath; /// return true; } else { return false; } }); } return draggableEntryPath; } }, { key: 'getDirectoryOverlappingDraggableEntry', value: function getDirectoryOverlappingDraggableEntry(draggableEntry) { var directoryOverlappingDraggableEntry = null; this.someDirectory(function (directory) { directoryOverlappingDraggableEntry = directory.getDirectoryOverlappingDraggableEntry(draggableEntry); if (directoryOverlappingDraggableEntry !== null) { return true; } else { return false; } }); return directoryOverlappingDraggableEntry; } }, { key: 'forEachFile', value: function forEachFile(callback) { this.forEachEntryByType(callback, Entry.types.FILE); } }, { key: 'forEachDirectory', value: function forEachDirectory(callback) { this.forEachEntryByType(callback, Entry.types.DIRECTORY); } }, { key: 'someFile', value: function someFile(callback) { return this.someEntryByType(callback, Entry.types.FILE); } }, { key: 'someDirectory', value: function someDirectory(callback) { return this.someEntryByType(callback, Entry.types.DIRECTORY); } }, { key: 'forEachEntry', value: function forEachEntry(callback) { var entries = this.getEntries(); entries.forEach(function (entry) { callback(entry); }); } }, { key: 'forEachEntryByType', value: function forEachEntryByType(callback, type) { var entries = this.getEntries(); entries.forEach(function (entry) { var entryType = entry.getType(); if (entryType === type) { callback(entry); } }); } }, { key: 'someEntry', value: function someEntry(callback, type) { var entries = this.getEntries(); return entries.some(function (entry) { return callback(entry); }); } }, { key: 'someEntryByType', value: function someEntryByType(callback, type) { var entries = this.getEntries(); return entries.some(function (entry) { var entryType = entry.getType(); if (entryType === type) { return callback(entry); } else { return false; } }); } }, { key: 'retrieveEntryByType', value: function retrieveEntryByType(name, type) { var foundEntry = null; this.someEntryByType(function (entry) { var entryName = entry.getName(); if (entryName === name) { foundEntry = entry; return true; } else { return false; } }, type); var entry = foundEntry; /// return entry; } }, { key: 'getEntries', value: function getEntries() { var childListElements = this.getChildElements('li'), entries = childListElements; /// return entries; } }], [{ key: 'fromParentElement', value: function fromParentElement(parentElement, Directory) { var selector = '.entries', domElement = parentElement.domElement.querySelector(selector); return Element.fromDOMElement(Entries, domElement, Directory); } }]); return Entries; }(Element); module.exports = Entries; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL2VzNi9leHBsb3Jlci9lbnRyaWVzLmpzIl0sIm5hbWVzIjpbImVhc3l1aSIsInJlcXVpcmUiLCJFbGVtZW50Iiwib3B0aW9ucyIsIkVudHJ5IiwiRmlsZSIsIkZpbGVNYXJrZXIiLCJEaXJlY3RvcnlNYXJrZXIiLCJFbnRyaWVzIiwic2VsZWN0b3IiLCJEaXJlY3RvcnkiLCJmaWxlTmFtZSIsImV4cGxvcmVyIiwiZmlsZSIsImNsb25lIiwiZW50cnkiLCJhZGRFbnRyeSIsImRpcmVjdG9yeU5hbWUiLCJjb2xsYXBzZWQiLCJkaXJlY3RvcnkiLCJyZXRyaWV2ZUZpbGUiLCJnZXRFeHBsb3JlciIsInJlbW92ZUVtcHR5UGFyZW50RGlyZWN0b3JpZXMiLCJoYXNPcHRpb24iLCJSRU1PVkVfRU1QVFlfUEFSRU5UX0RJUkVDVE9SSUVTIiwicmVtb3ZlIiwicmV0cmlldmVEaXJlY3RvcnkiLCJtYXJrZXJOYW1lIiwiZHJhZ2dhYmxlRW50cnlUeXBlIiwibWFya2VyIiwidHlwZXMiLCJGSUxFIiwiRElSRUNUT1JZIiwicmV0cmlldmVNYXJrZXIiLCJtYXJrZWQiLCJlbnRyaWVzIiwiZ2V0RW50cmllcyIsImVudHJpZXNMZW5ndGgiLCJsZW5ndGgiLCJlbXB0eSIsIm5leHRFbnRyeSIsInByZXZpb3VzRW50cnkiLCJzb21lIiwibmV4dEVudHJ5QmVmb3JlIiwiaXNCZWZvcmUiLCJhcHBlbmQiLCJpbnNlcnRCZWZvcmUiLCJyZXRyaWV2ZUVudHJ5QnlUeXBlIiwidHlwZSIsIk1BUktFUiIsInNvbWVFbnRyeUJ5VHlwZSIsIm1hcmtlZERpcmVjdG9yeSIsInNvbWVEaXJlY3RvcnkiLCJnZXRNYXJrZWREaXJlY3RvcnkiLCJkcmFnZ2FibGVFbnRyeSIsImRyYWdnYWJsZUVudHJ5UGF0aCIsInNvbWVFbnRyeSIsImVudHJ5TmFtZSIsImdldE5hbWUiLCJkaXJlY3RvcnlEcmFnZ2FibGVFbnRyeVBhdGgiLCJnZXREcmFnZ2FibGVFbnRyeVBhdGgiLCJkaXJlY3RvcnlPdmVybGFwcGluZ0RyYWdnYWJsZUVudHJ5IiwiZ2V0RGlyZWN0b3J5T3ZlcmxhcHBpbmdEcmFnZ2FibGVFbnRyeSIsImNhbGxiYWNrIiwiZm9yRWFjaEVudHJ5QnlUeXBlIiwiZm9yRWFjaCIsImVudHJ5VHlwZSIsImdldFR5cGUiLCJuYW1lIiwiZm91bmRFbnRyeSIsImNoaWxkTGlzdEVsZW1lbnRzIiwiZ2V0Q2hpbGRFbGVtZW50cyIsInBhcmVudEVsZW1lbnQiLCJkb21FbGVtZW50IiwicXVlcnlTZWxlY3RvciIsImZyb21ET01FbGVtZW50IiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7QUFFQSxJQUFNQSxTQUFTQyxRQUFRLFFBQVIsQ0FBZjtBQUFBLElBQ01DLFVBQVVGLE9BQU9FLE9BRHZCOztBQUdBLElBQU1DLFVBQVVGLFFBQVEsWUFBUixDQUFoQjtBQUFBLElBQ01HLFFBQVFILFFBQVEsU0FBUixDQURkO0FBQUEsSUFFTUksT0FBT0osUUFBUSx1QkFBUixDQUZiO0FBQUEsSUFHTUssYUFBYUwsUUFBUSxvQkFBUixDQUhuQjtBQUFBLElBSU1NLGtCQUFrQk4sUUFBUSx5QkFBUixDQUp4Qjs7SUFNTU8sTzs7O0FBQ0osbUJBQVlDLFFBQVosRUFBc0JDLFNBQXRCLEVBQWlDO0FBQUE7O0FBQUEsa0hBQ3pCRCxRQUR5Qjs7QUFHL0IsVUFBS0MsU0FBTCxHQUFpQkEsU0FBakI7QUFIK0I7QUFJaEM7Ozs7NEJBRU9DLFEsRUFBVUMsUSxFQUFVO0FBQzFCLFVBQU1DLE9BQU9SLEtBQUtTLEtBQUwsQ0FBV0gsUUFBWCxFQUFxQkMsUUFBckIsQ0FBYjtBQUFBLFVBQ01HLFFBQVFGLElBRGQsQ0FEMEIsQ0FFTjs7QUFFcEIsV0FBS0csUUFBTCxDQUFjRCxLQUFkO0FBQ0Q7OztpQ0FFWUUsYSxFQUFlQyxTLEVBQVdOLFEsRUFBVTtBQUMvQyxVQUFNTyxZQUFZLEtBQUtULFNBQUwsQ0FBZUksS0FBZixDQUFxQkcsYUFBckIsRUFBb0NDLFNBQXBDLEVBQStDTixR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SUFWSDs7QUFZQSxVQUFNakMsUUFBUXNELFVBQWQsQ0FmOEIsQ0FlSjs7QUFFMUIsYUFBT3RELEtBQVA7QUFDRDs7O2lDQUVZO0FBQ1gsVUFBTXVELG9CQUFvQixLQUFLQyxnQkFBTCxDQUFzQixJQUF0QixDQUExQjtBQUFBLFVBQ0twQyxVQUFVbUMsaUJBRGYsQ0FEVyxDQUV3Qjs7QUFFbkMsYUFBT25DLE9BQVA7QUFDRDs7O3NDQUV3QnFDLGEsRUFBZTlELFMsRUFBVztBQUNqRCxVQUFNRCxXQUFXLFVBQWpCO0FBQUEsVUFDTWdFLGFBQWFELGNBQWNDLFVBQWQsQ0FBeUJDLGFBQXpCLENBQXVDakUsUUFBdkMsQ0FEbkI7O0FBR0EsYUFBT1AsUUFBUXlFLGNBQVIsQ0FBdUJuRSxPQUF2QixFQUFnQ2lFLFVBQWhDLEVBQTRDL0QsU0FBNUMsQ0FBUDtBQUNEOzs7O0VBN1JtQlIsTzs7QUFnU3RCMEUsT0FBT0MsT0FBUCxHQUFpQnJFLE9BQWpCIiwiZmlsZSI6ImVudHJpZXMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGVhc3l1aSA9IHJlcXVpcmUoJ2Vhc3l1aScpLFxuICAgICAgRWxlbWVudCA9IGVhc3l1aS5FbGVtZW50O1xuXG5jb25zdCBvcHRpb25zID0gcmVxdWlyZSgnLi4vb3B0aW9ucycpLFxuICAgICAgRW50cnkgPSByZXF1aXJlKCcuL2VudHJ5JyksXG4gICAgICBGaWxlID0gcmVxdWlyZSgnLi9kcmFnZ2FibGVFbnRyeS9maWxlJyksXG4gICAgICBGaWxlTWFya2VyID0gcmVxdWlyZSgnLi9lbnRyeS9maWxlTWFya2VyJyksXG4gICAgICBEaXJlY3RvcnlNYXJrZXIgPSByZXF1aXJlKCcuL2VudHJ5L2RpcmVjdG9yeU1hcmtlcicpO1xuXG5jbGFzcyBFbnRyaWVzIGV4dGVuZHMgRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKHNlbGVjdG9yLCBEaXJlY3RvcnkpIHtcbiAgICBzdXBlcihzZWxlY3Rvcik7XG5cbiAgICB0aGlzLkRpcmVjdG9yeSA9IERpcmVjdG9yeTtcbiAgfVxuICBcbiAgYWRkRmlsZShmaWxlTmFtZSwgZXhwbG9yZXIpIHtcbiAgICBjb25zdCBmaWxlID0gRmlsZS5jbG9uZShmaWxlTmFtZSwgZXhwbG9yZXIpLFxuICAgICAgICAgIGVudHJ5ID0gZmlsZTsgLy8vXG5cbiAgICB0aGlzLmFkZEVudHJ5KGVudHJ5KTtcbiAgfVxuXG4gIGFkZERpcmVjdG9yeShkaXJlY3RvcnlOYW1lLCBjb2xsYXBzZWQsIGV4cGxvcmVyKSB7XG4gICAgY29uc3QgZGlyZWN0b3J5ID0gdGhpcy5EaXJlY3RvcnkuY2xvbmUoZGlyZWN0b3J5TmFtZSwgY29sbGFwc2VkLCBleHBsb3JlciksXG4gICAgICAgICAgZW50cnkgPSBkaXJlY3Rvcnk7ICAvLy9cblxuICAgIHRoaXMuYWRkRW50cnkoZW50cnkpO1xuICB9XG5cbiAgcmVtb3ZlRmlsZShmaWxlTmFtZSkge1xuICAgIGNvbnN0IGZpbGUgPSB0aGlzLnJldHJpZXZlRmlsZShmaWxlTmFtZSksXG4gICAgICAgICAgZXhwbG9yZXIgPSBmaWxlLmdldEV4cGxvcmVyKCksXG4gICAgICAgICAgcmVtb3ZlRW1wdHlQYXJlbnREaXJlY3RvcmllcyA9IGV4cGxvcmVyLmhhc09wdGlvbihvcHRpb25zLlJFTU9WRV9FTVBUWV9QQVJFTlRfRElSRUNUT1JJRVMpO1xuXG4gICAgZmlsZS5yZW1vdmUoKTtcbiAgICBcbiAgICByZXR1cm4gcmVtb3ZlRW1wdHlQYXJlbnREaXJlY3RvcmllcztcbiAgfVxuXG4gIHJlbW92ZURpcmVjdG9yeShkaXJlY3RvcnlOYW1lKSB7XG4gICAgY29uc3QgZGlyZWN0b3J5ID0gdGhpcy5yZXRyaWV2ZURpcmVjdG9yeShkaXJlY3RvcnlOYW1lKSxcbiAgICAgICAgICBleHBsb3JlciA9IGRpcmVjdG9yeS5nZXRFeHBsb3JlcigpLFxuICAgICAgICAgIHJlbW92ZUVtcHR5UGFyZW50RGlyZWN0b3JpZXMgPSBleHBsb3Jlci5oYXNPcHRpb24ob3B0aW9ucy5SRU1PVkVfRU1QVFlfUEFSRU5UX0RJUkVDVE9SSUVTKTtcblxuICAgIGRpcmVjdG9yeS5yZW1vdmUoKTtcblxuICAgIHJldHVybiByZW1vdmVFbXB0eVBhcmVudERpcmVjdG9yaWVzO1xuICB9XG5cbiAgaGFzRmlsZShmaWxlTmFtZSkge1xuICAgIGxldCBmaWxlID0gdGhpcy5yZXRyaWV2ZUZpbGUoZmlsZU5hbWUpO1xuXG4gICAgZmlsZSA9IChmaWxlICE9PSBudWxsKTsgLy8vXG5cbiAgICByZXR1cm4gZmlsZTtcbiAgfVxuXG4gIGhhc0RpcmVjdG9yeShkaXJlY3RvcnlOYW1lKSB7XG4gICAgbGV0IGRpcmVjdG9yeSA9IHRoaXMucmV0cmlldmVEaXJlY3RvcnkoZGlyZWN0b3J5TmFtZSk7XG4gICAgXG4gICAgZGlyZWN0b3J5ID0gKGRpcmVjdG9yeSAhPT0gbnVsbCk7IC8vL1xuXG4gICAgcmV0dXJuIGRpcmVjdG9yeTtcbiAgfVxuXG4gIGFkZE1hcmtlcihtYXJrZXJOYW1lLCBkcmFnZ2FibGVFbnRyeVR5cGUpIHtcbiAgICBsZXQgbWFya2VyO1xuXG4gICAgc3dpdGNoIChkcmFnZ2FibGVFbnRyeVR5cGUpIHtcbiAgICAgIGNhc2UgRW50cnkudHlwZXMuRklMRTpcbiAgICAgICAgbWFya2VyID0gRmlsZU1hcmtlci5jbG9uZShtYXJrZXJOYW1lKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgRW50cnkudHlwZXMuRElSRUNUT1JZOlxuICAgICAgICBtYXJrZXIgPSBEaXJlY3RvcnlNYXJrZXIuY2xvbmUobWFya2VyTmFtZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNvbnN0IGVudHJ5ID0gbWFya2VyOyAvLy9cblxuICAgIHRoaXMuYWRkRW50cnkoZW50cnkpO1xuICB9XG5cbiAgcmVtb3ZlTWFya2VyKCkge1xuICAgIGNvbnN0IG1hcmtlciA9IHRoaXMucmV0cmlldmVNYXJrZXIoKTtcblxuICAgIG1hcmtlci5yZW1vdmUoKTtcbiAgfVxuICBcbiAgaXNNYXJrZWQoKSB7XG4gICAgY29uc3QgbWFya2VyID0gdGhpcy5yZXRyaWV2ZU1hcmtlcigpLFxuICAgICAgICAgIG1hcmtlZCA9IChtYXJrZXIhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gbWFya2VkO1xuICB9XG5cbiAgaXNFbXB0eSgpIHtcbiAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5nZXRFbnRyaWVzKCksXG4gICAgICAgICAgZW50cmllc0xlbmd0aCA9IGVudHJpZXMubGVuZ3RoLFxuICAgICAgICAgIGVtcHR5ID0gKGVudHJpZXNMZW5ndGggPT09IDApO1xuXG4gICAgcmV0dXJuIGVtcHR5O1xuICB9XG5cbiAgYWRkRW50cnkoZW50cnkpIHtcbiAgICBjb25zdCBuZXh0RW50cnkgPSBlbnRyeSxcbiAgICAgICAgICBlbnRyaWVzID0gdGhpcy5nZXRFbnRyaWVzKCk7XG5cbiAgICBsZXQgcHJldmlvdXNFbnRyeSA9IG51bGw7XG5cbiAgICBlbnRyaWVzLnNvbWUoZnVuY3Rpb24oZW50cnkpIHtcbiAgICAgIGNvbnN0IG5leHRFbnRyeUJlZm9yZSA9IG5leHRFbnRyeS5pc0JlZm9yZShlbnRyeSk7XG4gICAgICBcbiAgICAgIGlmIChuZXh0RW50cnlCZWZvcmUpIHtcbiAgICAgICAgcHJldmlvdXNFbnRyeSA9IGVudHJ5O1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHByZXZpb3VzRW50cnkgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuYXBwZW5kKG5leHRFbnRyeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRFbnRyeS5pbnNlcnRCZWZvcmUocHJldmlvdXNFbnRyeSk7XG4gICAgfVxuICB9XG5cbiAgcmV0cmlldmVGaWxlKGZpbGVOYW1lKSB7IHJldHVybiB0aGlzLnJldHJpZXZlRW50cnlCeVR5cGUoZmlsZU5hbWUsIEVudHJ5LnR5cGVzLkZJTEUpIH1cblxuICByZXRyaWV2ZURpcmVjdG9yeShkaXJlY3RvcnlOYW1lKSB7IHJldHVybiB0aGlzLnJldHJpZXZlRW50cnlCeVR5cGUoZGlyZWN0b3J5TmFtZSwgRW50cnkudHlwZXMuRElSRUNUT1JZKSB9XG5cbiAgcmV0cmlldmVNYXJrZXIoKSB7XG4gICAgbGV0IG1hcmtlciA9IG51bGw7XG4gICAgXG4gICAgY29uc3QgdHlwZSA9IEVudHJ5LnR5cGVzLk1BUktFUjtcblxuICAgIHRoaXMuc29tZUVudHJ5QnlUeXBlKGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgICBtYXJrZXIgPSBlbnRyeTsgIC8vL1xuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LCB0eXBlKTtcblxuICAgIHJldHVybiBtYXJrZXI7XG4gIH1cblxuICBnZXRNYXJrZWREaXJlY3RvcnkoKSB7XG4gICAgbGV0IG1hcmtlZERpcmVjdG9yeSA9IG51bGw7XG5cbiAgICB0aGlzLnNvbWVEaXJlY3RvcnkoZnVuY3Rpb24oZGlyZWN0b3J5KSB7XG4gICAgICBtYXJrZWREaXJlY3RvcnkgPSBkaXJlY3RvcnkuZ2V0TWFya2VkRGlyZWN0b3J5KCk7XG5cbiAgICAgIGlmIChtYXJrZWREaXJlY3RvcnkgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbWFya2VkRGlyZWN0b3J5O1xuICB9XG4gIFxuICBnZXREcmFnZ2FibGVFbnRyeVBhdGgoZHJhZ2dhYmxlRW50cnkpIHtcbiAgICBsZXQgZHJhZ2dhYmxlRW50cnlQYXRoID0gbnVsbDtcbiAgICBcbiAgICB0aGlzLnNvbWVFbnRyeShmdW5jdGlvbihlbnRyeSkge1xuICAgICAgaWYgKGVudHJ5ID09PSBkcmFnZ2FibGVFbnRyeSkgeyAgLy8vXG4gICAgICAgIGNvbnN0IGVudHJ5TmFtZSA9IGVudHJ5LmdldE5hbWUoKTtcbiAgICAgICAgXG4gICAgICAgIGRyYWdnYWJsZUVudHJ5UGF0aCA9IGVudHJ5TmFtZTsgIC8vL1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgaWYgKGRyYWdnYWJsZUVudHJ5UGF0aCA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5zb21lRGlyZWN0b3J5KGZ1bmN0aW9uKGRpcmVjdG9yeSkge1xuICAgICAgICBjb25zdCBkaXJlY3RvcnlEcmFnZ2FibGVFbnRyeVBhdGggPSBkaXJlY3RvcnkuZ2V0RHJhZ2dhYmxlRW50cnlQYXRoKGRyYWdnYWJsZUVudHJ5KTtcbiAgICAgICAgXG4gICAgICAgIGlmIChkaXJlY3RvcnlEcmFnZ2FibGVFbnRyeVBhdGggIT09IG51bGwpIHtcbiAgICAgICAgICBkcmFnZ2FibGVFbnRyeVBhdGggPSBkaXJlY3RvcnlEcmFnZ2FibGVFbnRyeVBhdGg7IC8vL1xuICAgICAgICAgIFxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBkcmFnZ2FibGVFbnRyeVBhdGg7XG4gIH1cblxuICBnZXREaXJlY3RvcnlPdmVybGFwcGluZ0RyYWdnYWJsZUVudHJ5KGRyYWdnYWJsZUVudHJ5KSB7XG4gICAgbGV0IGRpcmVjdG9yeU92ZXJsYXBwaW5nRHJhZ2dhYmxlRW50cnkgPSBudWxsO1xuXG4gICAgdGhpcy5zb21lRGlyZWN0b3J5KGZ1bmN0aW9uKGRpcmVjdG9yeSkge1xuICAgICAgZGlyZWN0b3J5T3ZlcmxhcHBpbmdEcmFnZ2FibGVFbnRyeSA9IGRpcmVjdG9yeS5nZXREaXJlY3RvcnlPdmVybGFwcGluZ0RyYWdnYWJsZUVudHJ5KGRyYWdnYWJsZUVudHJ5KTtcblxuICAgICAgaWYgKGRpcmVjdG9yeU92ZXJsYXBwaW5nRHJhZ2dhYmxlRW50cnkgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZGlyZWN0b3J5T3ZlcmxhcHBpbmdEcmFnZ2FibGVFbnRyeTtcbiAgfVxuXG4gIGZvckVhY2hGaWxlKGNhbGxiYWNrKSB7IHRoaXMuZm9yRWFjaEVudHJ5QnlUeXBlKGNhbGxiYWNrLCBFbnRyeS50eXBlcy5GSUxFKSB9XG5cbiAgZm9yRWFjaERpcmVjdG9yeShjYWxsYmFjaykgeyB0aGlzLmZvckVhY2hFbnRyeUJ5VHlwZShjYWxsYmFjaywgRW50cnkudHlwZXMuRElSRUNUT1JZKSB9XG5cbiAgc29tZUZpbGUoY2FsbGJhY2spIHsgcmV0dXJuIHRoaXMuc29tZUVudHJ5QnlUeXBlKGNhbGxiYWNrLCBFbnRyeS50eXBlcy5GSUxFKSB9XG5cbiAgc29tZURpcmVjdG9yeShjYWxsYmFjaykgeyByZXR1cm4gdGhpcy5zb21lRW50cnlCeVR5cGUoY2FsbGJhY2ssIEVudHJ5LnR5cGVzLkRJUkVDVE9SWSkgfVxuXG4gIGZvckVhY2hFbnRyeShjYWxsYmFjaykge1xuICAgIGNvbnN0IGVudHJpZXMgPSB0aGlzLmdldEVudHJpZXMoKTtcblxuICAgIGVudHJpZXMuZm9yRWFjaChmdW5jdGlvbihlbnRyeSkge1xuICAgICAgY2FsbGJhY2soZW50cnkpO1xuICAgIH0pO1xuICB9XG5cbiAgZm9yRWFjaEVudHJ5QnlUeXBlKGNhbGxiYWNrLCB0eXBlKSB7XG4gICAgY29uc3QgZW50cmllcyA9IHRoaXMuZ2V0RW50cmllcygpO1xuXG4gICAgZW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgICBjb25zdCBlbnRyeVR5cGUgPSBlbnRyeS5nZXRUeXBlKCk7XG5cbiAgICAgIGlmIChlbnRyeVR5cGUgPT09IHR5cGUpIHtcbiAgICAgICAgY2FsbGJhY2soZW50cnkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc29tZUVudHJ5KGNhbGxiYWNrLCB0eXBlKSB7XG4gICAgY29uc3QgZW50cmllcyA9IHRoaXMuZ2V0RW50cmllcygpO1xuXG4gICAgcmV0dXJuIGVudHJpZXMuc29tZShmdW5jdGlvbihlbnRyeSkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVudHJ5KTtcbiAgICB9KTtcbiAgfVxuXG4gIHNvbWVFbnRyeUJ5VHlwZShjYWxsYmFjaywgdHlwZSkge1xuICAgIGNvbnN0IGVudHJpZXMgPSB0aGlzLmdldEVudHJpZXMoKTtcblxuICAgIHJldHVybiBlbnRyaWVzLnNvbWUoZnVuY3Rpb24oZW50cnkpIHtcbiAgICAgIGNvbnN0IGVudHJ5VHlwZSA9IGVudHJ5LmdldFR5cGUoKTtcblxuICAgICAgaWYgKGVudHJ5VHlwZSA9PT0gdHlwZSkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZW50cnkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0cmlldmVFbnRyeUJ5VHlwZShuYW1lLCB0eXBlKSB7XG4gICAgbGV0IGZvdW5kRW50cnkgPSBudWxsO1xuXG4gICAgdGhpcy5zb21lRW50cnlCeVR5cGUoZnVuY3Rpb24oZW50cnkpIHtcbiAgICAgIGNvbnN0IGVudHJ5TmFtZSA9IGVudHJ5LmdldE5hbWUoKTtcblxuICAgICAgaWYgKGVudHJ5TmFtZSA9PT0gbmFtZSkge1xuICAgICAgICBmb3VuZEVudHJ5ID0gZW50cnk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSwgdHlwZSk7XG5cbiAgICBjb25zdCBlbnRyeSA9IGZvdW5kRW50cnk7IC8vL1xuXG4gICAgcmV0dXJuIGVudHJ5O1xuICB9XG5cbiAgZ2V0RW50cmllcygpIHtcbiAgICBjb25zdCBjaGlsZExpc3RFbGVtZW50cyA9IHRoaXMuZ2V0Q2hpbGRFbGVtZW50cygnbGknKSxcbiAgICAgICAgIGVudHJpZXMgPSBjaGlsZExpc3RFbGVtZW50czsgIC8vL1xuXG4gICAgcmV0dXJuIGVudHJpZXM7XG4gIH1cblxuICBzdGF0aWMgZnJvbVBhcmVudEVsZW1lbnQocGFyZW50RWxlbWVudCwgRGlyZWN0b3J5KSB7XG4gICAgY29uc3Qgc2VsZWN0b3IgPSAnLmVudHJpZXMnLFxuICAgICAgICAgIGRvbUVsZW1lbnQgPSBwYXJlbnRFbGVtZW50LmRvbUVsZW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG5cbiAgICByZXR1cm4gRWxlbWVudC5mcm9tRE9NRWxlbWVudChFbnRyaWVzLCBkb21FbGVtZW50LCBEaXJlY3RvcnkpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gRW50cmllcztcbiJdfQ==