UNPKG

easyui-draganddrop

Version:

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

369 lines (301 loc) 29.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, React = easyui.React; var options = require('../options'), Entry = require('./entry'), File = require('./draggableEntry/file'), FileMarker = require('./entry/marker/file'), DirectoryMarker = require('./entry/marker/directory'); 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 name = fileName, file = React.createElement(File, { name: name, explorer: explorer, className: 'file' }), entry = file; /// this.addEntry(entry); } }, { key: 'addDirectory', value: function addDirectory(directoryName, explorer, collapsed) { var name = directoryName, directory = React.createElement(this.Directory, { name: name, explorer: explorer, collapsed: collapsed, className: 'directory' }), 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; var name = markerName; /// switch (draggableEntryType) { case Entry.types.FILE: marker = React.createElement(FileMarker, { name: name, className: 'marker' }); break; case Entry.types.DIRECTORY: marker = React.createElement(DirectoryMarker, { name: name, className: 'marker' }); 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: 'fromProperties', value: function fromProperties(properties) { var Directory = properties.Directory; return Element.fromProperties(Entries, properties, Directory); } }]); return Entries; }(Element); Object.assign(Entries, { tagName: 'ul', ignoredAttributes: ['Directory'] }); module.exports = Entries; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL2VzNi9leHBsb3Jlci9lbnRyaWVzLmpzIl0sIm5hbWVzIjpbImVhc3l1aSIsInJlcXVpcmUiLCJFbGVtZW50IiwiUmVhY3QiLCJvcHRpb25zIiwiRW50cnkiLCJGaWxlIiwiRmlsZU1hcmtlciIsIkRpcmVjdG9yeU1hcmtlciIsIkVudHJpZXMiLCJzZWxlY3RvciIsIkRpcmVjdG9yeSIsImZpbGVOYW1lIiwiZXhwbG9yZXIiLCJuYW1lIiwiZmlsZSIsImVudHJ5IiwiYWRkRW50cnkiLCJkaXJlY3RvcnlOYW1lIiwiY29sbGFwc2VkIiwiZGlyZWN0b3J5IiwicmV0cmlldmVGaWxlIiwiZ2V0RXhwbG9yZXIiLCJyZW1vdmVFbXB0eVBhcmVudERpcmVjdG9yaWVzIiwiaGFzT3B0aW9uIiwiUkVNT1ZFX0VNUFRZX1BBUkVOVF9ESVJFQ1RPUklFUyIsInJlbW92ZSIsInJldHJpZXZlRGlyZWN0b3J5IiwibWFya2VyTmFtZSIsImRyYWdnYWJsZUVudHJ5VHlwZSIsIm1hcmtlciIsInR5cGVzIiwiRklMRSIsIkRJUkVDVE9SWSIsInJldHJpZXZlTWFya2VyIiwibWFya2VkIiwiZW50cmllcyIsImdldEVudHJpZXMiLCJlbnRyaWVzTGVuZ3RoIiwibGVuZ3RoIiwiZW1wdHkiLCJuZXh0RW50cnkiLCJwcmV2aW91c0VudHJ5Iiwic29tZSIsIm5leHRFbnRyeUJlZm9yZSIsImlzQmVmb3JlIiwiYXBwZW5kIiwiaW5zZXJ0QmVmb3JlIiwicmV0cmlldmVFbnRyeUJ5VHlwZSIsInR5cGUiLCJNQVJLRVIiLCJzb21lRW50cnlCeVR5cGUiLCJtYXJrZWREaXJlY3RvcnkiLCJzb21lRGlyZWN0b3J5IiwiZ2V0TWFya2VkRGlyZWN0b3J5IiwiZHJhZ2dhYmxlRW50cnkiLCJkcmFnZ2FibGVFbnRyeVBhdGgiLCJzb21lRW50cnkiLCJlbnRyeU5hbWUiLCJnZXROYW1lIiwiZGlyZWN0b3J5RHJhZ2dhYmxlRW50cnlQYXRoIiwiZ2V0RHJhZ2dhYmxlRW50cnlQYXRoIiwiZGlyZWN0b3J5T3ZlcmxhcHBpbmdEcmFnZ2FibGVFbnRyeSIsImdldERpcmVjdG9yeU92ZXJsYXBwaW5nRHJhZ2dhYmxlRW50cnkiLCJjYWxsYmFjayIsImZvckVhY2hFbnRyeUJ5VHlwZSIsImZvckVhY2giLCJlbnRyeVR5cGUiLCJnZXRUeXBlIiwiZm91bmRFbnRyeSIsImNoaWxkTGlzdEVsZW1lbnRzIiwiZ2V0Q2hpbGRFbGVtZW50cyIsInByb3BlcnRpZXMiLCJmcm9tUHJvcGVydGllcyIsIk9iamVjdCIsImFzc2lnbiIsInRhZ05hbWUiLCJpZ25vcmVkQXR0cmlidXRlcyIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0FBRUEsSUFBTUEsU0FBU0MsUUFBUSxRQUFSLENBQWY7QUFBQSxJQUNNQyxVQUFVRixPQUFPRSxPQUR2QjtBQUFBLElBRU1DLFFBQVFILE9BQU9HLEtBRnJCOztBQUlBLElBQU1DLFVBQVVILFFBQVEsWUFBUixDQUFoQjtBQUFBLElBQ01JLFFBQVFKLFFBQVEsU0FBUixDQURkO0FBQUEsSUFFTUssT0FBT0wsUUFBUSx1QkFBUixDQUZiO0FBQUEsSUFHTU0sYUFBYU4sUUFBUSxxQkFBUixDQUhuQjtBQUFBLElBSU1PLGtCQUFrQlAsUUFBUSwwQkFBUixDQUp4Qjs7SUFNTVEsTzs7O0FBQ0osbUJBQVlDLFFBQVosRUFBc0JDLFNBQXRCLEVBQWlDO0FBQUE7O0FBQUEsa0hBQ3pCRCxRQUR5Qjs7QUFHL0IsVUFBS0MsU0FBTCxHQUFpQkEsU0FBakI7QUFIK0I7QUFJaEM7Ozs7NEJBRU9DLFEsRUFBVUMsUSxFQUFVO0FBQzFCLFVBQU1DLE9BQU9GLFFBQWI7QUFBQSxVQUNNRyxPQUFPLG9CQUFDLElBQUQsSUFBTSxNQUFNRCxJQUFaLEVBQWtCLFVBQVVELFFBQTVCLEVBQXNDLFdBQVUsTUFBaEQsR0FEYjtBQUFBLFVBRU1HLFFBQVFELElBRmQsQ0FEMEIsQ0FHTjs7QUFFcEIsV0FBS0UsUUFBTCxDQUFjRCxLQUFkO0FBQ0Q7OztpQ0FFWUUsYSxF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YSxJQUFqQjs7QUFFQSxXQUFLbEIsZUFBTCxDQUFxQixVQUFTbkMsS0FBVCxFQUFnQjtBQUNuQyxZQUFNMEMsWUFBWTFDLE1BQU0yQyxPQUFOLEVBQWxCOztBQUVBLFlBQUlELGNBQWM1QyxJQUFsQixFQUF3QjtBQUN0QnVELHVCQUFhckQsS0FBYjs7QUFFQSxpQkFBTyxJQUFQO0FBQ0QsU0FKRCxNQUlPO0FBQ0wsaUJBQU8sS0FBUDtBQUNEO0FBQ0YsT0FWRCxFQVVHaUMsSUFWSDs7QUFZQSxVQUFNakMsUUFBUXFELFVBQWQsQ0FmOEIsQ0FlSjs7QUFFMUIsYUFBT3JELEtBQVA7QUFDRDs7O2lDQUVZO0FBQ1gsVUFBTXNELG9CQUFvQixLQUFLQyxnQkFBTCxDQUFzQixJQUF0QixDQUExQjtBQUFBLFVBQ01uQyxVQUFVa0MsaUJBRGhCLENBRFcsQ0FFeUI7O0FBRXBDLGFBQU9sQyxPQUFQO0FBQ0Q7OzttQ0FFcUJvQyxVLEVBQVk7QUFBQSxVQUN4QjdELFNBRHdCLEdBQ1Y2RCxVQURVLENBQ3hCN0QsU0FEd0I7OztBQUdoQyxhQUFPVCxRQUFRdUUsY0FBUixDQUF1QmhFLE9BQXZCLEVBQWdDK0QsVUFBaEMsRUFBNEM3RCxTQUE1QyxDQUFQO0FBQ0Q7Ozs7RUFoU21CVCxPOztBQW1TdEJ3RSxPQUFPQyxNQUFQLENBQWNsRSxPQUFkLEVBQXVCO0FBQ3JCbUUsV0FBUyxJQURZO0FBRXJCQyxxQkFBbUIsQ0FDakIsV0FEaUI7QUFGRSxDQUF2Qjs7QUFPQUMsT0FBT0MsT0FBUCxHQUFpQnRFLE9BQWpCIiwiZmlsZSI6ImVudHJpZXMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGVhc3l1aSA9IHJlcXVpcmUoJ2Vhc3l1aScpLFxuICAgICAgRWxlbWVudCA9IGVhc3l1aS5FbGVtZW50LFxuICAgICAgUmVhY3QgPSBlYXN5dWkuUmVhY3Q7XG5cbmNvbnN0IG9wdGlvbnMgPSByZXF1aXJlKCcuLi9vcHRpb25zJyksXG4gICAgICBFbnRyeSA9IHJlcXVpcmUoJy4vZW50cnknKSxcbiAgICAgIEZpbGUgPSByZXF1aXJlKCcuL2RyYWdnYWJsZUVudHJ5L2ZpbGUnKSxcbiAgICAgIEZpbGVNYXJrZXIgPSByZXF1aXJlKCcuL2VudHJ5L21hcmtlci9maWxlJyksXG4gICAgICBEaXJlY3RvcnlNYXJrZXIgPSByZXF1aXJlKCcuL2VudHJ5L21hcmtlci9kaXJlY3RvcnknKTtcblxuY2xhc3MgRW50cmllcyBleHRlbmRzIEVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihzZWxlY3RvciwgRGlyZWN0b3J5KSB7XG4gICAgc3VwZXIoc2VsZWN0b3IpO1xuXG4gICAgdGhpcy5EaXJlY3RvcnkgPSBEaXJlY3Rvcnk7XG4gIH1cbiAgXG4gIGFkZEZpbGUoZmlsZU5hbWUsIGV4cGxvcmVyKSB7XG4gICAgY29uc3QgbmFtZSA9IGZpbGVOYW1lLFxuICAgICAgICAgIGZpbGUgPSA8RmlsZSBuYW1lPXtuYW1lfSBleHBsb3Jlcj17ZXhwbG9yZXJ9IGNsYXNzTmFtZT1cImZpbGVcIiAvPixcbiAgICAgICAgICBlbnRyeSA9IGZpbGU7IC8vL1xuXG4gICAgdGhpcy5hZGRFbnRyeShlbnRyeSk7XG4gIH1cblxuICBhZGREaXJlY3RvcnkoZGlyZWN0b3J5TmFtZSwgZXhwbG9yZXIsIGNvbGxhcHNlZCkge1xuICAgIGNvbnN0IG5hbWUgPSBkaXJlY3RvcnlOYW1lLFxuICAgICAgICAgIGRpcmVjdG9yeSA9IDx0aGlzLkRpcmVjdG9yeSBuYW1lPXtuYW1lfSBleHBsb3Jlcj17ZXhwbG9yZXJ9IGNvbGxhcHNlZD17Y29sbGFwc2VkfSBjbGFzc05hbWU9XCJkaXJlY3RvcnlcIiAvPixcbiAgICAgICAgICBlbnRyeSA9IGRpcmVjdG9yeTsgIC8vL1xuXG4gICAgdGhpcy5hZGRFbnRyeShlbnRyeSk7XG4gIH1cblxuICByZW1vdmVGaWxlKGZpbGVOYW1lKSB7XG4gICAgY29uc3QgZmlsZSA9IHRoaXMucmV0cmlldmVGaWxlKGZpbGVOYW1lKSxcbiAgICAgICAgICBleHBsb3JlciA9IGZpbGUuZ2V0RXhwbG9yZXIoKSxcbiAgICAgICAgICByZW1vdmVFbXB0eVBhcmVudERpcmVjdG9yaWVzID0gZXhwbG9yZXIuaGFzT3B0aW9uKG9wdGlvbnMuUkVNT1ZFX0VNUFRZX1BBUkVOVF9ESVJFQ1RPUklFUyk7XG5cbiAgICBmaWxlLnJlbW92ZSgpO1xuICAgIFxuICAgIHJldHVybiByZW1vdmVFbXB0eVBhcmVudERpcmVjdG9yaWVzO1xuICB9XG5cbiAgcmVtb3ZlRGlyZWN0b3J5KGRpcmVjdG9yeU5hbWUpIHtcbiAgICBjb25zdCBkaXJlY3RvcnkgPSB0aGlzLnJldHJpZXZlRGlyZWN0b3J5KGRpcmVjdG9yeU5hbWUpLFxuICAgICAgICAgIGV4cGxvcmVyID0gZGlyZWN0b3J5LmdldEV4cGxvcmVyKCksXG4gICAgICAgICAgcmVtb3ZlRW1wdHlQYXJlbnREaXJlY3RvcmllcyA9IGV4cGxvcmVyLmhhc09wdGlvbihvcHRpb25zLlJFTU9WRV9FTVBUWV9QQVJFTlRfRElSRUNUT1JJRVMpO1xuXG4gICAgZGlyZWN0b3J5LnJlbW92ZSgpO1xuXG4gICAgcmV0dXJuIHJlbW92ZUVtcHR5UGFyZW50RGlyZWN0b3JpZXM7XG4gIH1cblxuICBoYXNGaWxlKGZpbGVOYW1lKSB7XG4gICAgbGV0IGZpbGUgPSB0aGlzLnJldHJpZXZlRmlsZShmaWxlTmFtZSk7XG5cbiAgICBmaWxlID0gKGZpbGUgIT09IG51bGwpOyAvLy9cblxuICAgIHJldHVybiBmaWxlO1xuICB9XG5cbiAgaGFzRGlyZWN0b3J5KGRpcmVjdG9yeU5hbWUpIHtcbiAgICBsZXQgZGlyZWN0b3J5ID0gdGhpcy5yZXRyaWV2ZURpcmVjdG9yeShkaXJlY3RvcnlOYW1lKTtcbiAgICBcbiAgICBkaXJlY3RvcnkgPSAoZGlyZWN0b3J5ICE9PSBudWxsKTsgLy8vXG5cbiAgICByZXR1cm4gZGlyZWN0b3J5O1xuICB9XG5cbiAgYWRkTWFya2VyKG1hcmtlck5hbWUsIGRyYWdnYWJsZUVudHJ5VHlwZSkge1xuICAgIGxldCBtYXJrZXI7XG4gICAgXG4gICAgY29uc3QgbmFtZSA9IG1hcmtlck5hbWU7ICAvLy9cblxuICAgIHN3aXRjaCAoZHJhZ2dhYmxlRW50cnlUeXBlKSB7XG4gICAgICBjYXNlIEVudHJ5LnR5cGVzLkZJTEU6XG4gICAgICAgIG1hcmtlciA9IDxGaWxlTWFya2VyIG5hbWU9e25hbWV9IGNsYXNzTmFtZT1cIm1hcmtlclwiIC8+O1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBFbnRyeS50eXBlcy5ESVJFQ1RPUlk6XG4gICAgICAgIG1hcmtlciA9IDxEaXJlY3RvcnlNYXJrZXIgbmFtZT17bmFtZX0gY2xhc3NOYW1lPVwibWFya2VyXCIgLz47XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNvbnN0IGVudHJ5ID0gbWFya2VyOyAvLy9cblxuICAgIHRoaXMuYWRkRW50cnkoZW50cnkpO1xuICB9XG5cbiAgcmVtb3ZlTWFya2VyKCkge1xuICAgIGNvbnN0IG1hcmtlciA9IHRoaXMucmV0cmlldmVNYXJrZXIoKTtcblxuICAgIG1hcmtlci5yZW1vdmUoKTtcbiAgfVxuICBcbiAgaXNNYXJrZWQoKSB7XG4gICAgY29uc3QgbWFya2VyID0gdGhpcy5yZXRyaWV2ZU1hcmtlcigpLFxuICAgICAgICAgIG1hcmtlZCA9IChtYXJrZXIhPT0gbnVsbCk7XG5cbiAgICByZXR1cm4gbWFya2VkO1xuICB9XG5cbiAgaXNFbXB0eSgpIHtcbiAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5nZXRFbnRyaWVzKCksXG4gICAgICAgICAgZW50cmllc0xlbmd0aCA9IGVudHJpZXMubGVuZ3RoLFxuICAgICAgICAgIGVtcHR5ID0gKGVudHJpZXNMZW5ndGggPT09IDApO1xuXG4gICAgcmV0dXJuIGVtcHR5O1xuICB9XG5cbiAgYWRkRW50cnkoZW50cnkpIHtcbiAgICBjb25zdCBuZXh0RW50cnkgPSBlbnRyeSxcbiAgICAgICAgICBlbnRyaWVzID0gdGhpcy5nZXRFbnRyaWVzKCk7XG5cbiAgICBsZXQgcHJldmlvdXNFbnRyeSA9IG51bGw7XG5cbiAgICBlbnRyaWVzLnNvbWUoZnVuY3Rpb24oZW50cnkpIHtcbiAgICAgIGNvbnN0IG5leHRFbnRyeUJlZm9yZSA9IG5leHRFbnRyeS5pc0JlZm9yZShlbnRyeSk7XG4gICAgICBcbiAgICAgIGlmIChuZXh0RW50cnlCZWZvcmUpIHtcbiAgICAgICAgcHJldmlvdXNFbnRyeSA9IGVudHJ5O1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHByZXZpb3VzRW50cnkgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuYXBwZW5kKG5leHRFbnRyeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRFbnRyeS5pbnNlcnRCZWZvcmUocHJldmlvdXNFbnRyeSk7XG4gICAgfVxuICB9XG5cbiAgcmV0cmlldmVGaWxlKGZpbGVOYW1lKSB7IHJldHVybiB0aGlzLnJldHJpZXZlRW50cnlCeVR5cGUoZmlsZU5hbWUsIEVudHJ5LnR5cGVzLkZJTEUpIH1cblxuICByZXRyaWV2ZURpcmVjdG9yeShkaXJlY3RvcnlOYW1lKSB7IHJldHVybiB0aGlzLnJldHJpZXZlRW50cnlCeVR5cGUoZGlyZWN0b3J5TmFtZSwgRW50cnkudHlwZXMuRElSRUNUT1JZKSB9XG5cbiAgcmV0cmlldmVNYXJrZXIoKSB7XG4gICAgbGV0IG1hcmtlciA9IG51bGw7XG4gICAgXG4gICAgY29uc3QgdHlwZSA9IEVudHJ5LnR5cGVzLk1BUktFUjtcblxuICAgIHRoaXMuc29tZUVudHJ5QnlUeXBlKGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgICBtYXJrZXIgPSBlbnRyeTsgIC8vL1xuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LCB0eXBlKTtcblxuICAgIHJldHVybiBtYXJrZXI7XG4gIH1cblxuICBnZXRNYXJrZWREaXJlY3RvcnkoKSB7XG4gICAgbGV0IG1hcmtlZERpcmVjdG9yeSA9IG51bGw7XG5cbiAgICB0aGlzLnNvbWVEaXJlY3RvcnkoZnVuY3Rpb24oZGlyZWN0b3J5KSB7XG4gICAgICBtYXJrZWREaXJlY3RvcnkgPSBkaXJlY3RvcnkuZ2V0TWFya2VkRGlyZWN0b3J5KCk7XG5cbiAgICAgIGlmIChtYXJrZWREaXJlY3RvcnkgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbWFya2VkRGlyZWN0b3J5O1xuICB9XG4gIFxuICBnZXREcmFnZ2FibGVFbnRyeVBhdGgoZHJhZ2dhYmxlRW50cnkpIHtcbiAgICBsZXQgZHJhZ2dhYmxlRW50cnlQYXRoID0gbnVsbDtcbiAgICBcbiAgICB0aGlzLnNvbWVFbnRyeShmdW5jdGlvbihlbnRyeSkge1xuICAgICAgaWYgKGVudHJ5ID09PSBkcmFnZ2FibGVFbnRyeSkgeyAgLy8vXG4gICAgICAgIGNvbnN0IGVudHJ5TmFtZSA9IGVudHJ5LmdldE5hbWUoKTtcbiAgICAgICAgXG4gICAgICAgIGRyYWdnYWJsZUVudHJ5UGF0aCA9IGVudHJ5TmFtZTsgIC8vL1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgaWYgKGRyYWdnYWJsZUVudHJ5UGF0aCA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5zb21lRGlyZWN0b3J5KGZ1bmN0aW9uKGRpcmVjdG9yeSkge1xuICAgICAgICBjb25zdCBkaXJlY3RvcnlEcmFnZ2FibGVFbnRyeVBhdGggPSBkaXJlY3RvcnkuZ2V0RHJhZ2dhYmxlRW50cnlQYXRoKGRyYWdnYWJsZUVudHJ5KTtcbiAgICAgICAgXG4gICAgICAgIGlmIChkaXJlY3RvcnlEcmFnZ2FibGVFbnRyeVBhdGggIT09IG51bGwpIHtcbiAgICAgICAgICBkcmFnZ2FibGVFbnRyeVBhdGggPSBkaXJlY3RvcnlEcmFnZ2FibGVFbnRyeVBhdGg7IC8vL1xuICAgICAgICAgIFxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBkcmFnZ2FibGVFbnRyeVBhdGg7XG4gIH1cblxuICBnZXREaXJlY3RvcnlPdmVybGFwcGluZ0RyYWdnYWJsZUVudHJ5KGRyYWdnYWJsZUVudHJ5KSB7XG4gICAgbGV0IGRpcmVjdG9yeU92ZXJsYXBwaW5nRHJhZ2dhYmxlRW50cnkgPSBudWxsO1xuXG4gICAgdGhpcy5zb21lRGlyZWN0b3J5KGZ1bmN0aW9uKGRpcmVjdG9yeSkge1xuICAgICAgZGlyZWN0b3J5T3ZlcmxhcHBpbmdEcmFnZ2FibGVFbnRyeSA9IGRpcmVjdG9yeS5nZXREaXJlY3RvcnlPdmVybGFwcGluZ0RyYWdnYWJsZUVudHJ5KGRyYWdnYWJsZUVudHJ5KTtcblxuICAgICAgaWYgKGRpcmVjdG9yeU92ZXJsYXBwaW5nRHJhZ2dhYmxlRW50cnkgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZGlyZWN0b3J5T3ZlcmxhcHBpbmdEcmFnZ2FibGVFbnRyeTtcbiAgfVxuXG4gIGZvckVhY2hGaWxlKGNhbGxiYWNrKSB7IHRoaXMuZm9yRWFjaEVudHJ5QnlUeXBlKGNhbGxiYWNrLCBFbnRyeS50eXBlcy5GSUxFKSB9XG5cbiAgZm9yRWFjaERpcmVjdG9yeShjYWxsYmFjaykgeyB0aGlzLmZvckVhY2hFbnRyeUJ5VHlwZShjYWxsYmFjaywgRW50cnkudHlwZXMuRElSRUNUT1JZKSB9XG5cbiAgc29tZUZpbGUoY2FsbGJhY2spIHsgcmV0dXJuIHRoaXMuc29tZUVudHJ5QnlUeXBlKGNhbGxiYWNrLCBFbnRyeS50eXBlcy5GSUxFKSB9XG5cbiAgc29tZURpcmVjdG9yeShjYWxsYmFjaykgeyByZXR1cm4gdGhpcy5zb21lRW50cnlCeVR5cGUoY2FsbGJhY2ssIEVudHJ5LnR5cGVzLkRJUkVDVE9SWSkgfVxuXG4gIGZvckVhY2hFbnRyeShjYWxsYmFjaykge1xuICAgIGNvbnN0IGVudHJpZXMgPSB0aGlzLmdldEVudHJpZXMoKTtcblxuICAgIGVudHJpZXMuZm9yRWFjaChmdW5jdGlvbihlbnRyeSkge1xuICAgICAgY2FsbGJhY2soZW50cnkpO1xuICAgIH0pO1xuICB9XG5cbiAgZm9yRWFjaEVudHJ5QnlUeXBlKGNhbGxiYWNrLCB0eXBlKSB7XG4gICAgY29uc3QgZW50cmllcyA9IHRoaXMuZ2V0RW50cmllcygpO1xuXG4gICAgZW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uKGVudHJ5KSB7XG4gICAgICBjb25zdCBlbnRyeVR5cGUgPSBlbnRyeS5nZXRUeXBlKCk7XG5cbiAgICAgIGlmIChlbnRyeVR5cGUgPT09IHR5cGUpIHtcbiAgICAgICAgY2FsbGJhY2soZW50cnkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc29tZUVudHJ5KGNhbGxiYWNrLCB0eXBlKSB7XG4gICAgY29uc3QgZW50cmllcyA9IHRoaXMuZ2V0RW50cmllcygpO1xuXG4gICAgcmV0dXJuIGVudHJpZXMuc29tZShmdW5jdGlvbihlbnRyeSkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVudHJ5KTtcbiAgICB9KTtcbiAgfVxuXG4gIHNvbWVFbnRyeUJ5VHlwZShjYWxsYmFjaywgdHlwZSkge1xuICAgIGNvbnN0IGVudHJpZXMgPSB0aGlzLmdldEVudHJpZXMoKTtcblxuICAgIHJldHVybiBlbnRyaWVzLnNvbWUoZnVuY3Rpb24oZW50cnkpIHtcbiAgICAgIGNvbnN0IGVudHJ5VHlwZSA9IGVudHJ5LmdldFR5cGUoKTtcblxuICAgICAgaWYgKGVudHJ5VHlwZSA9PT0gdHlwZSkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soZW50cnkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0cmlldmVFbnRyeUJ5VHlwZShuYW1lLCB0eXBlKSB7XG4gICAgbGV0IGZvdW5kRW50cnkgPSBudWxsO1xuXG4gICAgdGhpcy5zb21lRW50cnlCeVR5cGUoZnVuY3Rpb24oZW50cnkpIHtcbiAgICAgIGNvbnN0IGVudHJ5TmFtZSA9IGVudHJ5LmdldE5hbWUoKTtcblxuICAgICAgaWYgKGVudHJ5TmFtZSA9PT0gbmFtZSkge1xuICAgICAgICBmb3VuZEVudHJ5ID0gZW50cnk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSwgdHlwZSk7XG5cbiAgICBjb25zdCBlbnRyeSA9IGZvdW5kRW50cnk7IC8vL1xuXG4gICAgcmV0dXJuIGVudHJ5O1xuICB9XG5cbiAgZ2V0RW50cmllcygpIHtcbiAgICBjb25zdCBjaGlsZExpc3RFbGVtZW50cyA9IHRoaXMuZ2V0Q2hpbGRFbGVtZW50cygnbGknKSxcbiAgICAgICAgICBlbnRyaWVzID0gY2hpbGRMaXN0RWxlbWVudHM7ICAvLy9cblxuICAgIHJldHVybiBlbnRyaWVzO1xuICB9XG5cbiAgc3RhdGljIGZyb21Qcm9wZXJ0aWVzKHByb3BlcnRpZXMpIHtcbiAgICBjb25zdCB7IERpcmVjdG9yeSB9ID0gcHJvcGVydGllcztcbiAgICBcbiAgICByZXR1cm4gRWxlbWVudC5mcm9tUHJvcGVydGllcyhFbnRyaWVzLCBwcm9wZXJ0aWVzLCBEaXJlY3RvcnkpO1xuICB9XG59XG5cbk9iamVjdC5hc3NpZ24oRW50cmllcywge1xuICB0YWdOYW1lOiAndWwnLFxuICBpZ25vcmVkQXR0cmlidXRlczogW1xuICAgICdEaXJlY3RvcnknXG4gIF1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEVudHJpZXM7XG4iXX0=