UNPKG

matrix-react-sdk

Version:
238 lines (198 loc) 29.3 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireDefault(require("react")); var _languageHandler = require("../../../languageHandler"); var sdk = _interopRequireWildcard(require("../../../index")); var _dispatcher = _interopRequireDefault(require("../../../dispatcher/dispatcher")); var _GroupStore = _interopRequireDefault(require("../../../stores/GroupStore")); var _propTypes = _interopRequireDefault(require("prop-types")); var _GroupAddressPicker = require("../../../GroupAddressPicker"); var _AccessibleButton = _interopRequireDefault(require("../elements/AccessibleButton")); var _RightPanelStorePhases = require("../../../stores/RightPanelStorePhases"); var _AutoHideScrollbar = _interopRequireDefault(require("../../structures/AutoHideScrollbar")); var _actions = require("../../../dispatcher/actions"); var _replaceableComponent = require("../../../utils/replaceableComponent"); var _dec, _class, _class2, _temp; const INITIAL_LOAD_NUM_MEMBERS = 30; let GroupMemberList = (_dec = (0, _replaceableComponent.replaceableComponent)("views.groups.GroupMemberList"), _dec(_class = (_temp = _class2 = class GroupMemberList extends _react.default.Component { constructor(...args) { super(...args); (0, _defineProperty2.default)(this, "state", { members: null, membersError: null, invitedMembers: null, invitedMembersError: null, truncateAt: INITIAL_LOAD_NUM_MEMBERS }); (0, _defineProperty2.default)(this, "_createOverflowTile", (overflowCount, totalCount) => { // For now we'll pretend this is any entity. It should probably be a separate tile. const EntityTile = sdk.getComponent("rooms.EntityTile"); const BaseAvatar = sdk.getComponent("avatars.BaseAvatar"); const text = (0, _languageHandler._t)("and %(count)s others...", { count: overflowCount }); return /*#__PURE__*/_react.default.createElement(EntityTile, { className: "mx_EntityTile_ellipsis", avatarJsx: /*#__PURE__*/_react.default.createElement(BaseAvatar, { url: require("../../../../res/img/ellipsis.svg"), name: "...", width: 36, height: 36 }), name: text, presenceState: "online", suppressOnHover: true, onClick: this._showFullMemberList }); }); (0, _defineProperty2.default)(this, "_showFullMemberList", () => { this.setState({ truncateAt: -1 }); }); (0, _defineProperty2.default)(this, "onSearchQueryChanged", ev => { this.setState({ searchQuery: ev.target.value }); }); (0, _defineProperty2.default)(this, "onInviteToGroupButtonClick", () => { (0, _GroupAddressPicker.showGroupInviteDialog)(this.props.groupId).then(() => { _dispatcher.default.dispatch({ action: _actions.Action.SetRightPanelPhase, phase: _RightPanelStorePhases.RightPanelPhases.GroupMemberList, refireParams: { groupId: this.props.groupId } }); }); }); } componentDidMount() { this._unmounted = false; this._initGroupStore(this.props.groupId); } componentWillUnmount() { this._unmounted = true; } _initGroupStore(groupId) { _GroupStore.default.registerListener(groupId, () => { this._fetchMembers(); }); _GroupStore.default.on('error', (err, errorGroupId, stateKey) => { if (this._unmounted || groupId !== errorGroupId) return; if (stateKey === _GroupStore.default.STATE_KEY.GroupMembers) { this.setState({ membersError: err }); } if (stateKey === _GroupStore.default.STATE_KEY.GroupInvitedMembers) { this.setState({ invitedMembersError: err }); } }); } _fetchMembers() { if (this._unmounted) return; this.setState({ members: _GroupStore.default.getGroupMembers(this.props.groupId), invitedMembers: _GroupStore.default.getGroupInvitedMembers(this.props.groupId) }); } makeGroupMemberTiles(query, memberList, memberListError) { if (memberListError) { return /*#__PURE__*/_react.default.createElement("div", { className: "warning" }, (0, _languageHandler._t)("Failed to load group members")); } const GroupMemberTile = sdk.getComponent("groups.GroupMemberTile"); const TruncatedList = sdk.getComponent("elements.TruncatedList"); query = (query || "").toLowerCase(); if (query) { memberList = memberList.filter(m => { const matchesName = (m.displayname || "").toLowerCase().includes(query); const matchesId = m.userId.toLowerCase().includes(query); if (!matchesName && !matchesId) { return false; } return true; }); } const uniqueMembers = {}; memberList.forEach(m => { if (!uniqueMembers[m.userId]) uniqueMembers[m.userId] = m; }); memberList = Object.keys(uniqueMembers).map(userId => uniqueMembers[userId]); // Descending sort on isPrivileged = true = 1 to isPrivileged = false = 0 memberList.sort((a, b) => { if (a.isPrivileged === b.isPrivileged) { const aName = a.displayname || a.userId; const bName = b.displayname || b.userId; if (aName < bName) { return -1; } else if (aName > bName) { return 1; } else { return 0; } } else { return a.isPrivileged ? -1 : 1; } }); const memberTiles = memberList.map(m => { return /*#__PURE__*/_react.default.createElement(GroupMemberTile, { key: m.userId, groupId: this.props.groupId, member: m }); }); return /*#__PURE__*/_react.default.createElement(TruncatedList, { className: "mx_MemberList_wrapper", truncateAt: this.state.truncateAt, createOverflowElement: this._createOverflowTile }, memberTiles); } render() { if (this.state.fetching || this.state.fetchingInvitedMembers) { const Spinner = sdk.getComponent("elements.Spinner"); return /*#__PURE__*/_react.default.createElement("div", { className: "mx_MemberList" }, /*#__PURE__*/_react.default.createElement(Spinner, null)); } const inputBox = /*#__PURE__*/_react.default.createElement("input", { className: "mx_GroupMemberList_query mx_textinput", id: "mx_GroupMemberList_query", type: "text", onChange: this.onSearchQueryChanged, value: this.state.searchQuery, placeholder: (0, _languageHandler._t)('Filter community members'), autoComplete: "off" }); const joined = this.state.members ? /*#__PURE__*/_react.default.createElement("div", { className: "mx_MemberList_joined" }, this.makeGroupMemberTiles(this.state.searchQuery, this.state.members, this.state.membersError)) : /*#__PURE__*/_react.default.createElement("div", null); const invited = this.state.invitedMembers && this.state.invitedMembers.length > 0 ? /*#__PURE__*/_react.default.createElement("div", { className: "mx_MemberList_invited" }, /*#__PURE__*/_react.default.createElement("h2", null, (0, _languageHandler._t)("Invited")), this.makeGroupMemberTiles(this.state.searchQuery, this.state.invitedMembers, this.state.invitedMembersError)) : /*#__PURE__*/_react.default.createElement("div", null); let inviteButton; if (_GroupStore.default.isUserPrivileged(this.props.groupId)) { inviteButton = /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { className: "mx_MemberList_invite mx_MemberList_inviteCommunity", onClick: this.onInviteToGroupButtonClick }, /*#__PURE__*/_react.default.createElement("span", null, (0, _languageHandler._t)('Invite to this community'))); } return /*#__PURE__*/_react.default.createElement("div", { className: "mx_MemberList", role: "tabpanel" }, inviteButton, /*#__PURE__*/_react.default.createElement(_AutoHideScrollbar.default, null, joined, invited), inputBox); } }, (0, _defineProperty2.default)(_class2, "propTypes", { groupId: _propTypes.default.string.isRequired }), _temp)) || _class); exports.default = GroupMemberList; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL2dyb3Vwcy9Hcm91cE1lbWJlckxpc3QuanMiXSwibmFtZXMiOlsiSU5JVElBTF9MT0FEX05VTV9NRU1CRVJTIiwiR3JvdXBNZW1iZXJMaXN0IiwiUmVhY3QiLCJDb21wb25lbnQiLCJtZW1iZXJzIiwibWVtYmVyc0Vycm9yIiwiaW52aXRlZE1lbWJlcnMiLCJpbnZpdGVkTWVtYmVyc0Vycm9yIiwidHJ1bmNhdGVBdCIsIm92ZXJmbG93Q291bnQiLCJ0b3RhbENvdW50IiwiRW50aXR5VGlsZSIsInNkayIsImdldENvbXBvbmVudCIsIkJhc2VBdmF0YXIiLCJ0ZXh0IiwiY291bnQiLCJyZXF1aXJlIiwiX3Nob3dGdWxsTWVtYmVyTGlzdCIsInNldFN0YXRlIiwiZXYiLCJzZWFyY2hRdWVyeSIsInRhcmdldCIsInZhbHVlIiwicHJvcHMiLCJncm91cElkIiwidGhlbiIsImRpcyIsImRpc3BhdGNoIiwiYWN0aW9uIiwiQWN0aW9uIiwiU2V0UmlnaHRQYW5lbFBoYXNlIiwicGhhc2UiLCJSaWdodFBhbmVsUGhhc2VzIiwicmVmaXJlUGFyYW1zIiwiY29tcG9uZW50RGlkTW91bnQiLCJfdW5tb3VudGVkIiwiX2luaXRHcm91cFN0b3JlIiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJHcm91cFN0b3JlIiwicmVnaXN0ZXJMaXN0ZW5lciIsIl9mZXRjaE1lbWJlcnMiLCJvbiIsImVyciIsImVycm9yR3JvdXBJZCIsInN0YXRlS2V5IiwiU1RBVEVfS0VZIiwiR3JvdXBNZW1iZXJzIiwiR3JvdXBJbnZpdGVkTWVtYmVycyIsImdldEdyb3VwTWVtYmVycyIsImdldEdyb3VwSW52aXRlZE1lbWJlcnMiLCJtYWtlR3JvdXBNZW1iZXJUaWxlcyIsInF1ZXJ5IiwibWVtYmVyTGlzdCIsIm1lbWJlckxpc3RFcnJvciIsIkdyb3VwTWVtYmVyVGlsZSIsIlRydW5jYXRlZExpc3QiLCJ0b0xvd2VyQ2FzZSIsImZpbHRlciIsIm0iLCJtYXRjaGVzTmFtZSIsImRpc3BsYXluYW1lIiwiaW5jbHVkZXMiLCJtYXRjaGVzSWQiLCJ1c2VySWQiLCJ1bmlxdWVNZW1iZXJzIiwiZm9yRWFjaCIsIk9iamVjdCIsImtleXMiLCJtYXAiLCJzb3J0IiwiYSIsImIiLCJpc1ByaXZpbGVnZWQiLCJhTmFtZSIsImJOYW1lIiwibWVtYmVyVGlsZXMiLCJzdGF0ZSIsIl9jcmVhdGVPdmVyZmxvd1RpbGUiLCJyZW5kZXIiLCJmZXRjaGluZyIsImZldGNoaW5nSW52aXRlZE1lbWJlcnMiLCJTcGlubmVyIiwiaW5wdXRCb3giLCJvblNlYXJjaFF1ZXJ5Q2hhbmdlZCIsImpvaW5lZCIsImludml0ZWQiLCJsZW5ndGgiLCJpbnZpdGVCdXR0b24iLCJpc1VzZXJQcml2aWxlZ2VkIiwib25JbnZpdGVUb0dyb3VwQnV0dG9uQ2xpY2siLCJQcm9wVHlwZXMiLCJzdHJpbmciLCJpc1JlcXVpcmVkIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBaUJBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBRUEsTUFBTUEsd0JBQXdCLEdBQUcsRUFBakM7SUFHcUJDLGUsV0FEcEIsZ0RBQXFCLDhCQUFyQixDLG1DQUFELE1BQ3FCQSxlQURyQixTQUM2Q0MsZUFBTUMsU0FEbkQsQ0FDNkQ7QUFBQTtBQUFBO0FBQUEsaURBS2pEO0FBQ0pDLE1BQUFBLE9BQU8sRUFBRSxJQURMO0FBRUpDLE1BQUFBLFlBQVksRUFBRSxJQUZWO0FBR0pDLE1BQUFBLGNBQWMsRUFBRSxJQUhaO0FBSUpDLE1BQUFBLG1CQUFtQixFQUFFLElBSmpCO0FBS0pDLE1BQUFBLFVBQVUsRUFBRVI7QUFMUixLQUxpRDtBQUFBLCtEQWlEbkMsQ0FBQ1MsYUFBRCxFQUFnQkMsVUFBaEIsS0FBK0I7QUFDakQ7QUFDQSxZQUFNQyxVQUFVLEdBQUdDLEdBQUcsQ0FBQ0MsWUFBSixDQUFpQixrQkFBakIsQ0FBbkI7QUFDQSxZ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Syx5QkFBRyxTQUFILENBQUwsQ0FESixFQUdRLEtBQUtwQyxvQkFBTCxDQUNJLEtBQUswQixLQUFMLENBQVd4RCxXQURmLEVBRUksS0FBS3dELEtBQUwsQ0FBV3ZFLGNBRmYsRUFHSSxLQUFLdUUsS0FBTCxDQUFXdEUsbUJBSGYsQ0FIUixDQURZLGdCQVVILHlDQVZiO0FBWUEsUUFBSWlGLFlBQUo7O0FBQ0EsUUFBSWpELG9CQUFXa0QsZ0JBQVgsQ0FBNEIsS0FBS2pFLEtBQUwsQ0FBV0MsT0FBdkMsQ0FBSixFQUFxRDtBQUNqRCtELE1BQUFBLFlBQVksZ0JBQ1IsNkJBQUMseUJBQUQ7QUFDSSxRQUFBLFNBQVMsRUFBQyxvREFEZDtBQUVJLFFBQUEsT0FBTyxFQUFFLEtBQUtFO0FBRmxCLHNCQUlJLDJDQUFRLHlCQUFHLDBCQUFILENBQVIsQ0FKSixDQURKO0FBUUg7O0FBRUQsd0JBQ0k7QUFBSyxNQUFBLFNBQVMsRUFBQyxlQUFmO0FBQStCLE1BQUEsSUFBSSxFQUFDO0FBQXBDLE9BQ01GLFlBRE4sZUFFSSw2QkFBQywwQkFBRCxRQUNNSCxNQUROLEVBRU1DLE9BRk4sQ0FGSixFQU1NSCxRQU5OLENBREo7QUFVSDs7QUExTXdELEMsc0RBQ3RDO0FBQ2YxRCxFQUFBQSxPQUFPLEVBQUVrRSxtQkFBVUMsTUFBVixDQUFpQkM7QUFEWCxDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDE3IFZlY3RvciBDcmVhdGlvbnMgTHRkLlxuQ29weXJpZ2h0IDIwMTcgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAxOSBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiovXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgX3QgfSBmcm9tICcuLi8uLi8uLi9sYW5ndWFnZUhhbmRsZXInO1xuaW1wb3J0ICogYXMgc2RrIGZyb20gJy4uLy4uLy4uL2luZGV4JztcbmltcG9ydCBkaXMgZnJvbSAnLi4vLi4vLi4vZGlzcGF0Y2hlci9kaXNwYXRjaGVyJztcbmltcG9ydCBHcm91cFN0b3JlIGZyb20gJy4uLy4uLy4uL3N0b3Jlcy9Hcm91cFN0b3JlJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgeyBzaG93R3JvdXBJbnZpdGVEaWFsb2cgfSBmcm9tICcuLi8uLi8uLi9Hcm91cEFkZHJlc3NQaWNrZXInO1xuaW1wb3J0IEFjY2Vzc2libGVCdXR0b24gZnJvbSAnLi4vZWxlbWVudHMvQWNjZXNzaWJsZUJ1dHRvbic7XG5pbXBvcnQge1JpZ2h0UGFuZWxQaGFzZXN9IGZyb20gXCIuLi8uLi8uLi9zdG9yZXMvUmlnaHRQYW5lbFN0b3JlUGhhc2VzXCI7XG5pbXBvcnQgQXV0b0hpZGVTY3JvbGxiYXIgZnJvbSBcIi4uLy4uL3N0cnVjdHVyZXMvQXV0b0hpZGVTY3JvbGxiYXJcIjtcbmltcG9ydCB7QWN0aW9ufSBmcm9tIFwiLi4vLi4vLi4vZGlzcGF0Y2hlci9hY3Rpb25zXCI7XG5pbXBvcnQge3JlcGxhY2VhYmxlQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvcmVwbGFjZWFibGVDb21wb25lbnRcIjtcblxuY29uc3QgSU5JVElBTF9MT0FEX05VTV9NRU1CRVJTID0gMzA7XG5cbkByZXBsYWNlYWJsZUNvbXBvbmVudChcInZpZXdzLmdyb3Vwcy5Hcm91cE1lbWJlckxpc3RcIilcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdyb3VwTWVtYmVyTGlzdCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICAgICAgZ3JvdXBJZDogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgIH07XG5cbiAgICBzdGF0ZSA9IHtcbiAgICAgICAgbWVtYmVyczogbnVsbCxcbiAgICAgICAgbWVtYmVyc0Vycm9yOiBudWxsLFxuICAgICAgICBpbnZpdGVkTWVtYmVyczogbnVsbCxcbiAgICAgICAgaW52aXRlZE1lbWJlcnNFcnJvcjogbnVsbCxcbiAgICAgICAgdHJ1bmNhdGVBdDogSU5JVElBTF9MT0FEX05VTV9NRU1CRVJTLFxuICAgIH07XG5cbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgICAgdGhpcy5fdW5tb3VudGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2luaXRHcm91cFN0b3JlKHRoaXMucHJvcHMuZ3JvdXBJZCk7XG4gICAgfVxuXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICAgIHRoaXMuX3VubW91bnRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgX2luaXRHcm91cFN0b3JlKGdyb3VwSWQpIHtcbiAgICAgICAgR3JvdXBTdG9yZS5yZWdpc3Rlckxpc3RlbmVyKGdyb3VwSWQsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2ZldGNoTWVtYmVycygpO1xuICAgICAgICB9KTtcbiAgICAgICAgR3JvdXBTdG9yZS5vbignZXJyb3InLCAoZXJyLCBlcnJvckdyb3VwSWQsIHN0YXRlS2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5fdW5tb3VudGVkIHx8IGdyb3VwSWQgIT09IGVycm9yR3JvdXBJZCkgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKHN0YXRlS2V5ID09PSBHcm91cFN0b3JlLlNUQVRFX0tFWS5Hcm91cE1lbWJlcnMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICAgICAgbWVtYmVyc0Vycm9yOiBlcnIsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RhdGVLZXkgPT09IEdyb3VwU3RvcmUuU1RBVEVfS0VZLkdyb3VwSW52aXRlZE1lbWJlcnMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICAgICAgaW52aXRlZE1lbWJlcnNFcnJvcjogZXJyLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfZmV0Y2hNZW1iZXJzKCkge1xuICAgICAgICBpZiAodGhpcy5fdW5tb3VudGVkKSByZXR1cm47XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgbWVtYmVyczogR3JvdXBTdG9yZS5nZXRHcm91cE1lbWJlcnModGhpcy5wcm9wcy5ncm91cElkKSxcbiAgICAgICAgICAgIGludml0ZWRNZW1iZXJzOiBHcm91cFN0b3JlLmdldEdyb3VwSW52aXRlZE1lbWJlcnModGhpcy5wcm9wcy5ncm91cElkKSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX2NyZWF0ZU92ZXJmbG93VGlsZSA9IChvdmVyZmxvd0NvdW50LCB0b3RhbENvdW50KSA9PiB7XG4gICAgICAgIC8vIEZvciBub3cgd2UnbGwgcHJldGVuZCB0aGlzIGlzIGFueSBlbnRpdHkuIEl0IHNob3VsZCBwcm9iYWJseSBiZSBhIHNlcGFyYXRlIHRpbGUuXG4gICAgICAgIGNvbnN0IEVudGl0eVRpbGUgPSBzZGsuZ2V0Q29tcG9uZW50KFwicm9vbXMuRW50aXR5VGlsZVwiKTtcbiAgICAgICAgY29uc3QgQmFzZUF2YXRhciA9IHNkay5nZXRDb21wb25lbnQoXCJhdmF0YXJzLkJhc2VBdmF0YXJcIik7XG4gICAgICAgIGNvbnN0IHRleHQgPSBfdChcImFuZCAlKGNvdW50KXMgb3RoZXJzLi4uXCIsIHsgY291bnQ6IG92ZXJmbG93Q291bnQgfSk7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8RW50aXR5VGlsZSBjbGFzc05hbWU9XCJteF9FbnRpdHlUaWxlX2VsbGlwc2lzXCIgYXZhdGFySnN4PXtcbiAgICAgICAgICAgICAgICA8QmFzZUF2YXRhciB1cmw9e3JlcXVpcmUoXCIuLi8uLi8uLi8uLi9yZXMvaW1nL2VsbGlwc2lzLnN2Z1wiKX0gbmFtZT1cIi4uLlwiIHdpZHRoPXszNn0gaGVpZ2h0PXszNn0gLz5cbiAgICAgICAgICAgIH0gbmFtZT17dGV4dH0gcHJlc2VuY2VTdGF0ZT1cIm9ubGluZVwiIHN1cHByZXNzT25Ib3Zlcj17dHJ1ZX1cbiAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuX3Nob3dGdWxsTWVtYmVyTGlzdH0gLz5cbiAgICAgICAgKTtcbiAgICB9O1xuXG4gICAgX3Nob3dGdWxsTWVtYmVyTGlzdCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICB0cnVuY2F0ZUF0OiAtMSxcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIG9uU2VhcmNoUXVlcnlDaGFuZ2VkID0gZXYgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgc2VhcmNoUXVlcnk6IGV2LnRhcmdldC52YWx1ZSB9KTtcbiAgICB9O1xuXG4gICAgbWFrZUdyb3VwTWVtYmVyVGlsZXMocXVlcnksIG1lbWJlckxpc3QsIG1lbWJlckxpc3RFcnJvcikge1xuICAgICAgICBpZiAobWVtYmVyTGlzdEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJ3YXJuaW5nXCI+eyBfdChcIkZhaWxlZCB0byBsb2FkIGdyb3VwIG1lbWJlcnNcIikgfTwvZGl2PjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IEdyb3VwTWVtYmVyVGlsZSA9IHNkay5nZXRDb21wb25lbnQoXCJncm91cHMuR3JvdXBNZW1iZXJUaWxlXCIpO1xuICAgICAgICBjb25zdCBUcnVuY2F0ZWRMaXN0ID0gc2RrLmdldENvbXBvbmVudChcImVsZW1lbnRzLlRydW5jYXRlZExpc3RcIik7XG4gICAgICAgIHF1ZXJ5ID0gKHF1ZXJ5IHx8IFwiXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChxdWVyeSkge1xuICAgICAgICAgICAgbWVtYmVyTGlzdCA9IG1lbWJlckxpc3QuZmlsdGVyKChtKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hlc05hbWUgPSAobS5kaXNwbGF5bmFtZSB8fCBcIlwiKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KTtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaGVzSWQgPSBtLnVzZXJJZC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KTtcblxuICAgICAgICAgICAgICAgIGlmICghbWF0Y2hlc05hbWUgJiYgIW1hdGNoZXNJZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVuaXF1ZU1lbWJlcnMgPSB7fTtcbiAgICAgICAgbWVtYmVyTGlzdC5mb3JFYWNoKChtKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXVuaXF1ZU1lbWJlcnNbbS51c2VySWRdKSB1bmlxdWVNZW1iZXJzW20udXNlcklkXSA9IG07XG4gICAgICAgIH0pO1xuICAgICAgICBtZW1iZXJMaXN0ID0gT2JqZWN0LmtleXModW5pcXVlTWVtYmVycykubWFwKCh1c2VySWQpID0+IHVuaXF1ZU1lbWJlcnNbdXNlcklkXSk7XG4gICAgICAgIC8vIERlc2NlbmRpbmcgc29ydCBvbiBpc1ByaXZpbGVnZWQgPSB0cnVlID0gMSB0byBpc1ByaXZpbGVnZWQgPSBmYWxzZSA9IDBcbiAgICAgICAgbWVtYmVyTGlzdC5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICBpZiAoYS5pc1ByaXZpbGVnZWQgPT09IGIuaXNQcml2aWxlZ2VkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYU5hbWUgPSBhLmRpc3BsYXluYW1lIHx8IGEudXNlcklkO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJOYW1lID0gYi5kaXNwbGF5bmFtZSB8fCBiLnVzZXJJZDtcbiAgICAgICAgICAgICAgICBpZiAoYU5hbWUgPCBiTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhTmFtZSA+IGJOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEuaXNQcml2aWxlZ2VkID8gLTEgOiAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBtZW1iZXJUaWxlcyA9IG1lbWJlckxpc3QubWFwKChtKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxHcm91cE1lbWJlclRpbGUga2V5PXttLnVzZXJJZH0gZ3JvdXBJZD17dGhpcy5wcm9wcy5ncm91cElkfSBtZW1iZXI9e219IC8+XG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gPFRydW5jYXRlZExpc3QgY2xhc3NOYW1lPVwibXhfTWVtYmVyTGlzdF93cmFwcGVyXCIgdHJ1bmNhdGVBdD17dGhpcy5zdGF0ZS50cnVuY2F0ZUF0fVxuICAgICAgICAgICAgY3JlYXRlT3ZlcmZsb3dFbGVtZW50PXt0aGlzLl9jcmVhdGVPdmVyZmxvd1RpbGV9XG4gICAgICAgID5cbiAgICAgICAgICAgIHsgbWVtYmVyVGlsZXMgfVxuICAgICAgICA8L1RydW5jYXRlZExpc3Q+O1xuICAgIH1cblxuICAgIG9uSW52aXRlVG9Hcm91cEJ1dHRvbkNsaWNrID0gKCkgPT4ge1xuICAgICAgICBzaG93R3JvdXBJbnZpdGVEaWFsb2codGhpcy5wcm9wcy5ncm91cElkKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGRpcy5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiBBY3Rpb24uU2V0UmlnaHRQYW5lbFBoYXNlLFxuICAgICAgICAgICAgICAgIHBoYXNlOiBSaWdodFBhbmVsUGhhc2VzLkdyb3VwTWVtYmVyTGlzdCxcbiAgICAgICAgICAgICAgICByZWZpcmVQYXJhbXM6IHsgZ3JvdXBJZDogdGhpcy5wcm9wcy5ncm91cElkIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuZmV0Y2hpbmcgfHwgdGhpcy5zdGF0ZS5mZXRjaGluZ0ludml0ZWRNZW1iZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBTcGlubmVyID0gc2RrLmdldENvbXBvbmVudChcImVsZW1lbnRzLlNwaW5uZXJcIik7XG4gICAgICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3NOYW1lPVwibXhfTWVtYmVyTGlzdFwiPlxuICAgICAgICAgICAgICAgIDxTcGlubmVyIC8+XG4gICAgICAgICAgICA8L2Rpdj4pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5wdXRCb3ggPSAoXG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteF9Hcm91cE1lbWJlckxpc3RfcXVlcnkgbXhfdGV4dGlucHV0XCJcbiAgICAgICAgICAgICAgICBpZD1cIm14X0dyb3VwTWVtYmVyTGlzdF9xdWVyeVwiXG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLm9uU2VhcmNoUXVlcnlDaGFuZ2VkfVxuICAgICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnN0YXRlLnNlYXJjaFF1ZXJ5fVxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtfdCgnRmlsdGVyIGNvbW11bml0eSBtZW1iZXJzJyl9XG4gICAgICAgICAgICAgICAgYXV0b0NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3Qgam9pbmVkID0gdGhpcy5zdGF0ZS5tZW1iZXJzID8gPGRpdiBjbGFzc05hbWU9XCJteF9NZW1iZXJMaXN0X2pvaW5lZFwiPlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRoaXMubWFrZUdyb3VwTWVtYmVyVGlsZXMoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUuc2VhcmNoUXVlcnksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUubWVtYmVycyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5tZW1iZXJzRXJyb3IsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICA8L2Rpdj4gOiA8ZGl2IC8+O1xuXG4gICAgICAgIGNvbnN0IGludml0ZWQgPSAodGhpcy5zdGF0ZS5pbnZpdGVkTWVtYmVycyAmJiB0aGlzLnN0YXRlLmludml0ZWRNZW1iZXJzLmxlbmd0aCA+IDApID9cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfTWVtYmVyTGlzdF9pbnZpdGVkXCI+XG4gICAgICAgICAgICAgICAgPGgyPntfdChcIkludml0ZWRcIil9PC9oMj5cbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFrZUdyb3VwTWVtYmVyVGlsZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLnNlYXJjaFF1ZXJ5LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5pbnZpdGVkTWVtYmVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUuaW52aXRlZE1lbWJlcnNFcnJvcixcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PiA6IDxkaXYgLz47XG5cbiAgICAgICAgbGV0IGludml0ZUJ1dHRvbjtcbiAgICAgICAgaWYgKEdyb3VwU3RvcmUuaXNVc2VyUHJpdmlsZWdlZCh0aGlzLnByb3BzLmdyb3VwSWQpKSB7XG4gICAgICAgICAgICBpbnZpdGVCdXR0b24gPSAoXG4gICAgICAgICAgICAgICAgPEFjY2Vzc2libGVCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfTWVtYmVyTGlzdF9pbnZpdGUgbXhfTWVtYmVyTGlzdF9pbnZpdGVDb21tdW5pdHlcIlxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLm9uSW52aXRlVG9Hcm91cEJ1dHRvbkNsaWNrfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+eyBfdCgnSW52aXRlIHRvIHRoaXMgY29tbXVuaXR5JykgfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L0FjY2Vzc2libGVCdXR0b24+XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfTWVtYmVyTGlzdFwiIHJvbGU9XCJ0YWJwYW5lbFwiPlxuICAgICAgICAgICAgICAgIHsgaW52aXRlQnV0dG9uIH1cbiAgICAgICAgICAgICAgICA8QXV0b0hpZGVTY3JvbGxiYXI+XG4gICAgICAgICAgICAgICAgICAgIHsgam9pbmVkIH1cbiAgICAgICAgICAgICAgICAgICAgeyBpbnZpdGVkIH1cbiAgICAgICAgICAgICAgICA8L0F1dG9IaWRlU2Nyb2xsYmFyPlxuICAgICAgICAgICAgICAgIHsgaW5wdXRCb3ggfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgfVxufVxuIl19