UNPKG

matrix-react-sdk

Version:
164 lines (132 loc) 21.2 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 _react = _interopRequireWildcard(require("react")); var _EncryptionInfo = _interopRequireDefault(require("./EncryptionInfo")); var _VerificationPanel = _interopRequireDefault(require("./VerificationPanel")); var _MatrixClientPeg = require("../../../MatrixClientPeg"); var _createRoom = require("../../../createRoom"); var _useEventEmitter = require("../../../hooks/useEventEmitter"); var _Modal = _interopRequireDefault(require("../../../Modal")); var _VerificationRequest = require("matrix-js-sdk/src/crypto/verification/request/VerificationRequest"); var sdk = _interopRequireWildcard(require("../../../index")); var _languageHandler = require("../../../languageHandler"); var _dispatcher = _interopRequireDefault(require("../../../dispatcher/dispatcher")); var _actions = require("../../../dispatcher/actions"); var _RightPanelStorePhases = require("../../../stores/RightPanelStorePhases"); /* Copyright 2019, 2020 The Matrix.org Foundation C.I.C. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ // cancellation codes which constitute a key mismatch const MISMATCHES = ["m.key_mismatch", "m.user_error", "m.mismatched_sas"]; const EncryptionPanel /*: React.FC<IProps>*/ = (props /*: IProps*/ ) => { const { verificationRequest, verificationRequestPromise, member, onClose, layout, isRoomEncrypted } = props; const [request, setRequest] = (0, _react.useState)(verificationRequest); // state to show a spinner immediately after clicking "start verification", // before we have a request const [isRequesting, setRequesting] = (0, _react.useState)(false); const [phase, setPhase] = (0, _react.useState)(request && request.phase); (0, _react.useEffect)(() => { setRequest(verificationRequest); if (verificationRequest) { setRequesting(false); setPhase(verificationRequest.phase); } }, [verificationRequest]); (0, _react.useEffect)(() => { async function awaitPromise() { setRequesting(true); const requestFromPromise = await verificationRequestPromise; setRequesting(false); setRequest(requestFromPromise); setPhase(requestFromPromise.phase); } if (verificationRequestPromise) { awaitPromise(); } }, [verificationRequestPromise]); const changeHandler = (0, _react.useCallback)(() => { // handle transitions -> cancelled for mismatches which fire a modal instead of showing a card if (request && request.cancelled && MISMATCHES.includes(request.cancellationCode)) { const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); _Modal.default.createTrackedDialog("Verification failed", "insecure", ErrorDialog, { headerImage: require("../../../../res/img/e2e/warning.svg"), title: (0, _languageHandler._t)("Your messages are not secure"), description: /*#__PURE__*/_react.default.createElement("div", null, (0, _languageHandler._t)("One of the following may be compromised:"), /*#__PURE__*/_react.default.createElement("ul", null, /*#__PURE__*/_react.default.createElement("li", null, (0, _languageHandler._t)("Your homeserver")), /*#__PURE__*/_react.default.createElement("li", null, (0, _languageHandler._t)("The homeserver the user you’re verifying is connected to")), /*#__PURE__*/_react.default.createElement("li", null, (0, _languageHandler._t)("Yours, or the other users’ internet connection")), /*#__PURE__*/_react.default.createElement("li", null, (0, _languageHandler._t)("Yours, or the other users’ session")))), onFinished: onClose }); return; // don't update phase here as we will be transitioning away from this view shortly } if (request) { setPhase(request.phase); } }, [onClose, request]); (0, _useEventEmitter.useEventEmitter)(request, "change", changeHandler); const onStartVerification = (0, _react.useCallback)(async () => { setRequesting(true); const cli = _MatrixClientPeg.MatrixClientPeg.get(); const roomId = await (0, _createRoom.ensureDMExists)(cli, member.userId); const verificationRequest_ = await cli.requestVerificationDM(member.userId, roomId); setRequest(verificationRequest_); setPhase(verificationRequest_.phase); // Notify the RightPanelStore about this _dispatcher.default.dispatch({ action: _actions.Action.SetRightPanelPhase, phase: _RightPanelStorePhases.RightPanelPhases.EncryptionPanel, refireParams: { member, verificationRequest: verificationRequest_ } }); }, [member]); const requested = !request && isRequesting || request && (phase === _VerificationRequest.PHASE_REQUESTED || phase === _VerificationRequest.PHASE_UNSENT || phase === undefined); const isSelfVerification = request ? request.isSelfVerification : member.userId === _MatrixClientPeg.MatrixClientPeg.get().getUserId(); if (!request || requested) { const initiatedByMe = !request && isRequesting || request && request.initiatedByMe; return /*#__PURE__*/_react.default.createElement(_EncryptionInfo.default, { isRoomEncrypted: isRoomEncrypted, onStartVerification: onStartVerification, member: member, isSelfVerification: isSelfVerification, waitingForOtherParty: requested && initiatedByMe, waitingForNetwork: requested && !initiatedByMe, inDialog: layout === "dialog" }); } else { return /*#__PURE__*/_react.default.createElement(_VerificationPanel.default, { isRoomEncrypted: isRoomEncrypted, layout: layout, onClose: onClose, member: member, request: request, key: request.channel.transactionId, inDialog: layout === "dialog", phase: phase }); } }; var _default = EncryptionPanel; exports.default = _default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL3JpZ2h0X3BhbmVsL0VuY3J5cHRpb25QYW5lbC50c3giXSwibmFtZXMiOlsiTUlTTUFUQ0hFUyIsIkVuY3J5cHRpb25QYW5lbCIsInByb3BzIiwidmVyaWZpY2F0aW9uUmVxdWVzdCIsInZlcmlmaWNhdGlvblJlcXVlc3RQcm9taXNlIiwibWVtYmVyIiwib25DbG9zZSIsImxheW91dCIsImlzUm9vbUVuY3J5cHRlZCIsInJlcXVlc3QiLCJzZXRSZXF1ZXN0IiwiaXNSZXF1ZXN0aW5nIiwic2V0UmVxdWVzdGluZyIsInBoYXNlIiwic2V0UGhhc2UiLCJhd2FpdFByb21pc2UiLCJyZXF1ZXN0RnJvbVByb21pc2UiLCJjaGFuZ2VIYW5kbGVyIiwiY2FuY2VsbGVkIiwiaW5jbHVkZXMiLCJjYW5jZWxsYXRpb25Db2RlIiwiRXJyb3JEaWFsb2ciLCJzZGsiLCJnZXRDb21wb25lbnQiLCJNb2RhbCIsImNyZWF0ZVRyYWNrZWREaWFsb2ciLCJoZWFkZXJJbWFnZSIsInJlcXVpcmUiLCJ0aXRsZSIsImRlc2NyaXB0aW9uIiwib25GaW5pc2hlZCIsIm9uU3RhcnRWZXJpZmljYXRpb24iLCJjbGkiLCJNYXRyaXhDbGllbnRQZWciLCJnZXQiLCJyb29tSWQiLCJ1c2VySWQiLCJ2ZXJpZmljYXRpb25SZXF1ZXN0XyIsInJlcXVlc3RWZXJpZmljYXRpb25ETSIsImRpcyIsImRpc3BhdGNoIiwiYWN0aW9uIiwiQWN0aW9uIiwiU2V0UmlnaHRQYW5lbFBoYXNlIiwiUmlnaHRQYW5lbFBoYXNlcyIsInJlZmlyZVBhcmFtcyIsInJlcXVlc3RlZCIsIlBIQVNFX1JFUVVFU1RFRCIsIlBIQVNFX1VOU0VOVCIsInVuZGVmaW5lZCIsImlzU2VsZlZlcmlmaWNhdGlvbiIsImdldFVzZXJJZCIsImluaXRpYXRlZEJ5TWUiLCJjaGFubmVsIiwidHJhbnNhY3Rpb25JZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFnQkE7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBR0E7O0FBQ0E7O0FBQ0E7O0FBL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQW1CQTtBQUNBLE1BQU1BLFVBQVUsR0FBRyxDQUFDLGdCQUFELEVBQW1CLGNBQW5CLEVBQW1DLGtCQUFuQyxDQUFuQjs7QUFZQSxNQUFNQztBQUFpQztBQUFBLEVBQUcsQ0FBQ0M7QUFBRDtBQUFBLEtBQW1CO0FBQ3pELFFBQU07QUFDRkMsSUFBQUEsbUJBREU7QUFFRkMsSUFBQUEsMEJBRkU7QUFHRkMsSUFBQUEsTUFIRTtBQUlGQyxJQUFBQSxPQUpFO0FBS0ZDLElBQUFBLE1BTEU7QUFNRkMsSUFBQUE7QUFORSxNQU9GTixLQVBKO0FBUUEsUUFBTSxDQUFDTyxPQUFELEVBQVVDLFVBQVYsSUFBd0IscUJBQVNQLG1CQUFULENBQTlCLENBVHlELENBVXpEO0FBQ0E7O0FBQ0EsUUFBTSxDQUFDUSxZQUFELEVBQWVDLGFBQWYsSUFBZ0MscUJBQVMsS0FBVCxDQUF0QztBQUNBLFFBQU0sQ0FBQ0MsS0FBRCxFQUFRQyxRQUFSLElBQW9CLHFCQUFTTCxPQUFPLElBQUlBLE9BQU8sQ0FBQ0ksS0FBNUIsQ0FBMUI7QUFDQSx3QkFBVSxNQUFNO0FBQ1pILElBQUFBLFVBQVUsQ0FBQ1AsbUJBQUQsQ0FBVjs7QUFDQSxRQUFJQSxtQkFBSixFQUF5QjtBQUNyQlMsTUFBQUEsYUFBYSxDQUFDLEtBQUQsQ0FBYjtBQUNBRSxNQUFBQSxRQUFRLENBQUNYLG1CQUFtQixDQUFDVSxLQUFyQixDQUFSO0FBQ0g7QUFDSixHQU5ELEVBTUcsQ0FBQ1YsbUJBQUQsQ0FOSDtBQVFBLHdCQUFVLE1BQU07QUFDWixtQkFBZVksWUFBZixHQUE4QjtBQUMxQkgsTUFBQUEsYUFBYSxDQUFDLElBQUQsQ0FBYjtBQUNBLFlBQU1JLGtCQUFrQixHQUFHLE1BQU1aLDBCQUFqQztBQUNBUSxNQUFBQSxhQUFhLENBQUMsS0FBRCxDQUFiO0FBQ0FGLE1BQUFBLFVBQVUsQ0FBQ00sa0JBQUQsQ0FBVjtBQUNBRixNQUFBQSxRQUFRLENBQUNFLGtCQUFrQixDQUFDSCxLQUFwQixDQUFSO0FBQ0g7O0FBQ0QsUUFBSVQsMEJBQUosRUFBZ0M7QUFDNUJXLE1BQUFBLFlBQVk7QUFDZjtBQUNKLEdBWEQsRUFXRyxDQUFDWCwwQkFBRCxDQVhIO0FBWUEsUUFBTWEsYUFBYSxHQUFHLHdCQUFZLE1BQU07QUFDcEM7QUFDQSxRQUFJUixPQUFPLElBQUlBLE9BQU8sQ0FBQ1MsU0FBbkIsSUFBZ0NsQixVQUFVLENBQUNtQixRQUFYLENBQW9CVixPQUFPLENBQUNXLGdCQUE1QixDQUFwQyxFQUFtRjtBQUMvRSxZQUFNQyxXQUFXLEdBQUdDLEdBQUcsQ0FBQ0MsWUFBSixDQUFpQixxQkFBakIsQ0FBcEI7O0FBQ0FDLHFCQUFNQyxtQkFBTixDQUEwQixxQkFBMUIsRUFBaUQsVUFBakQsRUFBNkRKLFdBQTdELEVBQTBFO0FBQ3RFSyxRQUFBQSxXQUFXLEVBQUVDLE9BQU8sQ0FBQyxxQ0FBRCxDQURrRDtBQUV0RUMsUUFBQUEsS0FBSyxFQUFFLHlCQUFHLDhCQUFILENBRitEO0FBR3RFQyxRQUFBQSxXQUFXLGVBQUUsMENBQ1IseUJBQUcsMENBQUgsQ0FEUSxlQUVULHNEQUNJLHlDQUFLLHlCQUFHLGlCQUFILENBQUwsQ0FESixlQUVJLHlDQUFLLHlCQUFHLDBEQUFILENBQUwsQ0FGSixlQUdJLHlDQUFLLHlCQUFHLGdEQUFILENBQUwsQ0FISixlQUlJLHlDQUFLLHlCQUFHLG9DQUFILENBQUwsQ0FKSixDQUZTLENBSHlEO0FBWXRFQyxRQUFBQSxVQUFVLEVBQUV4QjtBQVowRCxPQUExRTs7QUFjQSxhQWhCK0UsQ0FnQnZFO0FBQ1g7O0FBRUQsUUFBSUcsT0FBSixFQUFhO0FBQ1RLLE1BQUFBLFFBQVEsQ0FBQ0wsT0FBTyxDQUFDSSxLQUFULENBQVI7QUFDSDtBQUNKLEdBeEJxQixFQXdCbkIsQ0FBQ1AsT0FBRCxFQUFVRyxPQUFWLENBeEJtQixDQUF0QjtBQXlCQSx3Q0FBZ0JBLE9BQWhCLEVBQXlCLFFBQXpCLEVBQW1DUSxhQUFuQztBQUVBLFFBQU1jLG1CQUFtQixHQUFHLHdCQUFZLFlBQVk7QUFDaERuQixJQUFBQSxhQUFhLENBQUMsSUFBRCxDQUFiOztBQUNBLFVBQU1vQixHQUFHLEdBQUdDLGlDQUFnQkMsR0FBaEIsRUFBWjs7QUFDQSxVQUFNQyxNQUFNLEdBQUcsTUFBTSxnQ0FBZUgsR0FBZixFQUFvQjNCLE1BQU0sQ0FBQytCLE1BQTNCLENBQXJCO0FBQ0EsVUFBTUMsb0JBQW9CLEdBQUcsTUFBTUwsR0FBRyxDQUFDTSxxQkFBSixDQUEwQmpDLE1BQU0sQ0FBQytCLE1BQWpDLEVBQXlDRCxNQUF6QyxDQUFuQztBQUNBekIsSUFBQUEsVUFBVSxDQUFDMkIsb0JBQUQsQ0FBVjtBQUNBdkIsSUFBQUEsUUFBUSxDQUFDdUIsb0JBQW9CLENBQUN4QixLQUF0QixDQUFSLENBTmdELENBT2hEOztBQUNBMEIsd0JBQUlDLFFBQUosQ0FBYTtBQUNUQyxNQUFBQSxNQUFNLEVBQUVDLGdCQUFPQyxrQkFETjtBQUVUOUIsTUFBQUEsS0FBSyxFQUFFK0Isd0NBQWlCM0MsZUFGZjtBQUdUNEMsTUFBQUEsWUFBWSxFQUFFO0FBQUV4QyxRQUFBQSxNQUFGO0FBQVVGLFFBQUFBLG1CQUFtQixFQUFFa0M7QUFBL0I7QUFITCxLQUFiO0FBS0gsR0FiMkIsRUFhekIsQ0FBQ2hDLE1BQUQsQ0FieUIsQ0FBNUI7QUFlQSxRQUFNeUMsU0FBUyxHQUNWLENBQUNyQyxPQUFELElBQVlFLFlBQWIsSUFDQ0YsT0FBTyxLQUFLSSxLQUFLLEtBQUtrQyxvQ0FBVixJQUE2QmxDLEtBQUssS0FBS21DLGlDQUF2QyxJQUF1RG5DLEtBQUssS0FBS29DLFNBQXRFLENBRlo7QUFHQSxRQUFNQyxrQkFBa0IsR0FBR3pDLE9BQU8sR0FDOUJBLE9BQU8sQ0FBQ3lDLGtCQURzQixHQUU5QjdDLE1BQU0sQ0FBQytCLE1BQVAsS0FBa0JILGlDQUFnQkMsR0FBaEIsR0FBc0JpQixTQUF0QixFQUZ0Qjs7QUFHQSxNQUFJLENBQUMxQyxPQUFELElBQVlxQyxTQUFoQixFQUEyQjtBQUN2QixVQUFNTSxhQUFhLEdBQUksQ0FBQzNDLE9BQUQsSUFBWUUsWUFBYixJQUErQkYsT0FBTyxJQUFJQSxPQUFPLENBQUMyQyxhQUF4RTtBQUNBLHdCQUNJLDZCQUFDLHVCQUFEO0FBQ0ksTUFBQSxlQUFlLEVBQUU1QyxlQURyQjtBQUVJLE1BQUEsbUJBQW1CLEVBQUV1QixtQkFGekI7QUFHSSxNQUFBLE1BQU0sRUFBRTFCLE1BSFo7QUFJSSxNQUFBLGtCQUFrQixFQUFFNkMsa0JBSnhCO0FBS0ksTUFBQSxvQkFBb0IsRUFBRUosU0FBUyxJQUFJTSxhQUx2QztBQU1JLE1BQUEsaUJBQWlCLEVBQUVOLFNBQVMsSUFBSSxDQUFDTSxhQU5yQztBQU9JLE1BQUEsUUFBUSxFQUFFN0MsTUFBTSxLQUFLO0FBUHpCLE1BREo7QUFVSCxHQVpELE1BWU87QUFDSCx3QkFDSSw2QkFBQywwQkFBRDtBQUNJLE1BQUEsZUFBZSxFQUFFQyxlQURyQjtBQUVJLE1BQUEsTUFBTSxFQUFFRCxNQUZaO0FBR0ksTUFBQSxPQUFPLEVBQUVELE9BSGI7QUFJSSxNQUFBLE1BQU0sRUFBRUQsTUFKWjtBQUtJLE1BQUEsT0FBTyxFQUFFSSxPQUxiO0FBTUksTUFBQSxHQUFHLEVBQUVBLE9BQU8sQ0FBQzRDLE9BQVIsQ0FBZ0JDLGFBTnpCO0FBT0ksTUFBQSxRQUFRLEVBQUUvQyxNQUFNLEtBQUssUUFQekI7QUFRSSxNQUFBLEtBQUssRUFBRU07QUFSWCxNQURKO0FBWUg7QUFDSixDQTVHRDs7ZUE4R2VaLGUiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMTksIDIwMjAgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG5pbXBvcnQgUmVhY3QsIHt1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VTdGF0ZX0gZnJvbSBcInJlYWN0XCI7XG5cbmltcG9ydCBFbmNyeXB0aW9uSW5mbyBmcm9tIFwiLi9FbmNyeXB0aW9uSW5mb1wiO1xuaW1wb3J0IFZlcmlmaWNhdGlvblBhbmVsIGZyb20gXCIuL1ZlcmlmaWNhdGlvblBhbmVsXCI7XG5pbXBvcnQge01hdHJpeENsaWVudFBlZ30gZnJvbSBcIi4uLy4uLy4uL01hdHJpeENsaWVudFBlZ1wiO1xuaW1wb3J0IHtlbnN1cmVETUV4aXN0c30gZnJvbSBcIi4uLy4uLy4uL2NyZWF0ZVJvb21cIjtcbmltcG9ydCB7dXNlRXZlbnRFbWl0dGVyfSBmcm9tIFwiLi4vLi4vLi4vaG9va3MvdXNlRXZlbnRFbWl0dGVyXCI7XG5pbXBvcnQgTW9kYWwgZnJvbSBcIi4uLy4uLy4uL01vZGFsXCI7XG5pbXBvcnQge1BIQVNFX1JFUVVFU1RFRCwgUEhBU0VfVU5TRU5UfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvY3J5cHRvL3ZlcmlmaWNhdGlvbi9yZXF1ZXN0L1ZlcmlmaWNhdGlvblJlcXVlc3RcIjtcbmltcG9ydCAqIGFzIHNkayBmcm9tIFwiLi4vLi4vLi4vaW5kZXhcIjtcbmltcG9ydCB7X3R9IGZyb20gXCIuLi8uLi8uLi9sYW5ndWFnZUhhbmRsZXJcIjtcbmltcG9ydCB7VmVyaWZpY2F0aW9uUmVxdWVzdH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL2NyeXB0by92ZXJpZmljYXRpb24vcmVxdWVzdC9WZXJpZmljYXRpb25SZXF1ZXN0XCI7XG5pbXBvcnQge1Jvb21NZW1iZXJ9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tb2RlbHMvcm9vbS1tZW1iZXJcIjtcbmltcG9ydCBkaXMgZnJvbSBcIi4uLy4uLy4uL2Rpc3BhdGNoZXIvZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHtBY3Rpb259IGZyb20gXCIuLi8uLi8uLi9kaXNwYXRjaGVyL2FjdGlvbnNcIjtcbmltcG9ydCB7UmlnaHRQYW5lbFBoYXNlc30gZnJvbSBcIi4uLy4uLy4uL3N0b3Jlcy9SaWdodFBhbmVsU3RvcmVQaGFzZXNcIjtcblxuLy8gY2FuY2VsbGF0aW9uIGNvZGVzIHdoaWNoIGNvbnN0aXR1dGUgYSBrZXkgbWlzbWF0Y2hcbmNvbnN0IE1JU01BVENIRVMgPSBbXCJtLmtleV9taXNtYXRjaFwiLCBcIm0udXNlcl9lcnJvclwiLCBcIm0ubWlzbWF0Y2hlZF9zYXNcIl07XG5cbmludGVyZmFjZSBJUHJvcHMge1xuICAgIG1lbWJlcjogUm9vbU1lbWJlcjtcbiAgICBvbkNsb3NlOiAoKSA9PiB2b2lkO1xuICAgIHZlcmlmaWNhdGlvblJlcXVlc3Q6IFZlcmlmaWNhdGlvblJlcXVlc3Q7XG4gICAgdmVyaWZpY2F0aW9uUmVxdWVzdFByb21pc2U6IFByb21pc2U8VmVyaWZpY2F0aW9uUmVxdWVzdD47XG4gICAgbGF5b3V0OiBzdHJpbmc7XG4gICAgaW5EaWFsb2c6IGJvb2xlYW47XG4gICAgaXNSb29tRW5jcnlwdGVkOiBib29sZWFuO1xufVxuXG5jb25zdCBFbmNyeXB0aW9uUGFuZWw6IFJlYWN0LkZDPElQcm9wcz4gPSAocHJvcHM6IElQcm9wcykgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgICAgdmVyaWZpY2F0aW9uUmVxdWVzdCxcbiAgICAgICAgdmVyaWZpY2F0aW9uUmVxdWVzdFByb21pc2UsXG4gICAgICAgIG1lbWJlcixcbiAgICAgICAgb25DbG9zZSxcbiAgICAgICAgbGF5b3V0LFxuICAgICAgICBpc1Jvb21FbmNyeXB0ZWQsXG4gICAgfSA9IHByb3BzO1xuICAgIGNvbnN0IFtyZXF1ZXN0LCBzZXRSZXF1ZXN0XSA9IHVzZVN0YXRlKHZlcmlmaWNhdGlvblJlcXVlc3QpO1xuICAgIC8vIHN0YXRlIHRvIHNob3cgYSBzcGlubmVyIGltbWVkaWF0ZWx5IGFmdGVyIGNsaWNraW5nIFwic3RhcnQgdmVyaWZpY2F0aW9uXCIsXG4gICAgLy8gYmVmb3JlIHdlIGhhdmUgYSByZXF1ZXN0XG4gICAgY29uc3QgW2lzUmVxdWVzdGluZywgc2V0UmVxdWVzdGluZ10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gICAgY29uc3QgW3BoYXNlLCBzZXRQaGFzZV0gPSB1c2VTdGF0ZShyZXF1ZXN0ICYmIHJlcXVlc3QucGhhc2UpO1xuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIHNldFJlcXVlc3QodmVyaWZpY2F0aW9uUmVxdWVzdCk7XG4gICAgICAgIGlmICh2ZXJpZmljYXRpb25SZXF1ZXN0KSB7XG4gICAgICAgICAgICBzZXRSZXF1ZXN0aW5nKGZhbHNlKTtcbiAgICAgICAgICAgIHNldFBoYXNlKHZlcmlmaWNhdGlvblJlcXVlc3QucGhhc2UpO1xuICAgICAgICB9XG4gICAgfSwgW3ZlcmlmaWNhdGlvblJlcXVlc3RdKTtcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGFzeW5jIGZ1bmN0aW9uIGF3YWl0UHJvbWlzZSgpIHtcbiAgICAgICAgICAgIHNldFJlcXVlc3RpbmcodHJ1ZSk7XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0RnJvbVByb21pc2UgPSBhd2FpdCB2ZXJpZmljYXRpb25SZXF1ZXN0UHJvbWlzZTtcbiAgICAgICAgICAgIHNldFJlcXVlc3RpbmcoZmFsc2UpO1xuICAgICAgICAgICAgc2V0UmVxdWVzdChyZXF1ZXN0RnJvbVByb21pc2UpO1xuICAgICAgICAgICAgc2V0UGhhc2UocmVxdWVzdEZyb21Qcm9taXNlLnBoYXNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmVyaWZpY2F0aW9uUmVxdWVzdFByb21pc2UpIHtcbiAgICAgICAgICAgIGF3YWl0UHJvbWlzZSgpO1xuICAgICAgICB9XG4gICAgfSwgW3ZlcmlmaWNhdGlvblJlcXVlc3RQcm9taXNlXSk7XG4gICAgY29uc3QgY2hhbmdlSGFuZGxlciA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgICAgLy8gaGFuZGxlIHRyYW5zaXRpb25zIC0+IGNhbmNlbGxlZCBmb3IgbWlzbWF0Y2hlcyB3aGljaCBmaXJlIGEgbW9kYWwgaW5zdGVhZCBvZiBzaG93aW5nIGEgY2FyZFxuICAgICAgICBpZiAocmVxdWVzdCAmJiByZXF1ZXN0LmNhbmNlbGxlZCAmJiBNSVNNQVRDSEVTLmluY2x1ZGVzKHJlcXVlc3QuY2FuY2VsbGF0aW9uQ29kZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IEVycm9yRGlhbG9nID0gc2RrLmdldENvbXBvbmVudChcImRpYWxvZ3MuRXJyb3JEaWFsb2dcIik7XG4gICAgICAgICAgICBNb2RhbC5jcmVhdGVUcmFja2VkRGlhbG9nKFwiVmVyaWZpY2F0aW9uIGZhaWxlZFwiLCBcImluc2VjdXJlXCIsIEVycm9yRGlhbG9nLCB7XG4gICAgICAgICAgICAgICAgaGVhZGVySW1hZ2U6IHJlcXVpcmUoXCIuLi8uLi8uLi8uLi9yZXMvaW1nL2UyZS93YXJuaW5nLnN2Z1wiKSxcbiAgICAgICAgICAgICAgICB0aXRsZTogX3QoXCJZb3VyIG1lc3NhZ2VzIGFyZSBub3Qgc2VjdXJlXCIpLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICB7X3QoXCJPbmUgb2YgdGhlIGZvbGxvd2luZyBtYXkgYmUgY29tcHJvbWlzZWQ6XCIpfVxuICAgICAgICAgICAgICAgICAgICA8dWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGk+e190KFwiWW91ciBob21lc2VydmVyXCIpfTwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGk+e190KFwiVGhlIGhvbWVzZXJ2ZXIgdGhlIHVzZXIgeW914oCZcmUgdmVyaWZ5aW5nIGlzIGNvbm5lY3RlZCB0b1wiKX08L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpPntfdChcIllvdXJzLCBvciB0aGUgb3RoZXIgdXNlcnPigJkgaW50ZXJuZXQgY29ubmVjdGlvblwiKX08L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpPntfdChcIllvdXJzLCBvciB0aGUgb3RoZXIgdXNlcnPigJkgc2Vzc2lvblwiKX08L2xpPlxuICAgICAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgIDwvZGl2PixcbiAgICAgICAgICAgICAgICBvbkZpbmlzaGVkOiBvbkNsb3NlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47IC8vIGRvbid0IHVwZGF0ZSBwaGFzZSBoZXJlIGFzIHdlIHdpbGwgYmUgdHJhbnNpdGlvbmluZyBhd2F5IGZyb20gdGhpcyB2aWV3IHNob3J0bHlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXF1ZXN0KSB7XG4gICAgICAgICAgICBzZXRQaGFzZShyZXF1ZXN0LnBoYXNlKTtcbiAgICAgICAgfVxuICAgIH0sIFtvbkNsb3NlLCByZXF1ZXN0XSk7XG4gICAgdXNlRXZlbnRFbWl0dGVyKHJlcXVlc3QsIFwiY2hhbmdlXCIsIGNoYW5nZUhhbmRsZXIpO1xuXG4gICAgY29uc3Qgb25TdGFydFZlcmlmaWNhdGlvbiA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICAgICAgc2V0UmVxdWVzdGluZyh0cnVlKTtcbiAgICAgICAgY29uc3QgY2xpID0gTWF0cml4Q2xpZW50UGVnLmdldCgpO1xuICAgICAgICBjb25zdCByb29tSWQgPSBhd2FpdCBlbnN1cmVETUV4aXN0cyhjbGksIG1lbWJlci51c2VySWQpO1xuICAgICAgICBjb25zdCB2ZXJpZmljYXRpb25SZXF1ZXN0XyA9IGF3YWl0IGNsaS5yZXF1ZXN0VmVyaWZpY2F0aW9uRE0obWVtYmVyLnVzZXJJZCwgcm9vbUlkKTtcbiAgICAgICAgc2V0UmVxdWVzdCh2ZXJpZmljYXRpb25SZXF1ZXN0Xyk7XG4gICAgICAgIHNldFBoYXNlKHZlcmlmaWNhdGlvblJlcXVlc3RfLnBoYXNlKTtcbiAgICAgICAgLy8gTm90aWZ5IHRoZSBSaWdodFBhbmVsU3RvcmUgYWJvdXQgdGhpc1xuICAgICAgICBkaXMuZGlzcGF0Y2goe1xuICAgICAgICAgICAgYWN0aW9uOiBBY3Rpb24uU2V0UmlnaHRQYW5lbFBoYXNlLFxuICAgICAgICAgICAgcGhhc2U6IFJpZ2h0UGFuZWxQaGFzZXMuRW5jcnlwdGlvblBhbmVsLFxuICAgICAgICAgICAgcmVmaXJlUGFyYW1zOiB7IG1lbWJlciwgdmVyaWZpY2F0aW9uUmVxdWVzdDogdmVyaWZpY2F0aW9uUmVxdWVzdF8gfSxcbiAgICAgICAgfSk7XG4gICAgfSwgW21lbWJlcl0pO1xuXG4gICAgY29uc3QgcmVxdWVzdGVkID1cbiAgICAgICAgKCFyZXF1ZXN0ICYmIGlzUmVxdWVzdGluZykgfHxcbiAgICAgICAgKHJlcXVlc3QgJiYgKHBoYXNlID09PSBQSEFTRV9SRVFVRVNURUQgfHwgcGhhc2UgPT09IFBIQVNFX1VOU0VOVCB8fCBwaGFzZSA9PT0gdW5kZWZpbmVkKSk7XG4gICAgY29uc3QgaXNTZWxmVmVyaWZpY2F0aW9uID0gcmVxdWVzdCA/XG4gICAgICAgIHJlcXVlc3QuaXNTZWxmVmVyaWZpY2F0aW9uIDpcbiAgICAgICAgbWVtYmVyLnVzZXJJZCA9PT0gTWF0cml4Q2xpZW50UGVnLmdldCgpLmdldFVzZXJJZCgpO1xuICAgIGlmICghcmVxdWVzdCB8fCByZXF1ZXN0ZWQpIHtcbiAgICAgICAgY29uc3QgaW5pdGlhdGVkQnlNZSA9ICghcmVxdWVzdCAmJiBpc1JlcXVlc3RpbmcpIHx8IChyZXF1ZXN0ICYmIHJlcXVlc3QuaW5pdGlhdGVkQnlNZSk7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8RW5jcnlwdGlvbkluZm9cbiAgICAgICAgICAgICAgICBpc1Jvb21FbmNyeXB0ZWQ9e2lzUm9vbUVuY3J5cHRlZH1cbiAgICAgICAgICAgICAgICBvblN0YXJ0VmVyaWZpY2F0aW9uPXtvblN0YXJ0VmVyaWZpY2F0aW9ufVxuICAgICAgICAgICAgICAgIG1lbWJlcj17bWVtYmVyfVxuICAgICAgICAgICAgICAgIGlzU2VsZlZlcmlmaWNhdGlvbj17aXNTZWxmVmVyaWZpY2F0aW9ufVxuICAgICAgICAgICAgICAgIHdhaXRpbmdGb3JPdGhlclBhcnR5PXtyZXF1ZXN0ZWQgJiYgaW5pdGlhdGVkQnlNZX1cbiAgICAgICAgICAgICAgICB3YWl0aW5nRm9yTmV0d29yaz17cmVxdWVzdGVkICYmICFpbml0aWF0ZWRCeU1lfVxuICAgICAgICAgICAgICAgIGluRGlhbG9nPXtsYXlvdXQgPT09IFwiZGlhbG9nXCJ9IC8+XG4gICAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxWZXJpZmljYXRpb25QYW5lbFxuICAgICAgICAgICAgICAgIGlzUm9vbUVuY3J5cHRlZD17aXNSb29tRW5jcnlwdGVkfVxuICAgICAgICAgICAgICAgIGxheW91dD17bGF5b3V0fVxuICAgICAgICAgICAgICAgIG9uQ2xvc2U9e29uQ2xvc2V9XG4gICAgICAgICAgICAgICAgbWVtYmVyPXttZW1iZXJ9XG4gICAgICAgICAgICAgICAgcmVxdWVzdD17cmVxdWVzdH1cbiAgICAgICAgICAgICAgICBrZXk9e3JlcXVlc3QuY2hhbm5lbC50cmFuc2FjdGlvbklkfVxuICAgICAgICAgICAgICAgIGluRGlhbG9nPXtsYXlvdXQgPT09IFwiZGlhbG9nXCJ9XG4gICAgICAgICAgICAgICAgcGhhc2U9e3BoYXNlfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgKTtcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBFbmNyeXB0aW9uUGFuZWw7XG4iXX0=