UNPKG

matrix-react-sdk

Version:
231 lines (207 loc) 28.1 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireDefault(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _languageHandler = require("../../../languageHandler"); var _EncryptionInfo = require("../right_panel/EncryptionInfo"); var _AccessibleButton = _interopRequireDefault(require("../elements/AccessibleButton")); var _DialogButtons = _interopRequireDefault(require("../elements/DialogButtons")); var _FontManager = require("../../../utils/FontManager"); var _replaceableComponent = require("../../../utils/replaceableComponent"); var _dec, _class, _class2, _temp; function capFirst(s) { return s.charAt(0).toUpperCase() + s.slice(1); } let VerificationShowSas = (_dec = (0, _replaceableComponent.replaceableComponent)("views.verification.VerificationShowSas"), _dec(_class = (_temp = _class2 = class VerificationShowSas extends _react.default.Component { constructor(props) { super(props); (0, _defineProperty2.default)(this, "onMatchClick", () => { this.setState({ pending: true }); this.props.onDone(); }); (0, _defineProperty2.default)(this, "onDontMatchClick", () => { this.setState({ cancelling: true }); this.props.onCancel(); }); this.state = { pending: false }; } componentWillMount() { // As this component is also used before login (during complete security), // also make sure we have a working emoji font to display the SAS emojis here. // This is also done from LoggedInView. (0, _FontManager.fixupColorFonts)(); } render() { let sasDisplay; let sasCaption; if (this.props.sas.emoji) { const emojiBlocks = this.props.sas.emoji.map((emoji, i) => /*#__PURE__*/_react.default.createElement("div", { className: "mx_VerificationShowSas_emojiSas_block", key: i }, /*#__PURE__*/_react.default.createElement("div", { className: "mx_VerificationShowSas_emojiSas_emoji" }, emoji[0]), /*#__PURE__*/_react.default.createElement("div", { className: "mx_VerificationShowSas_emojiSas_label" }, (0, _languageHandler._t)(capFirst(emoji[1]))))); sasDisplay = /*#__PURE__*/_react.default.createElement("div", { className: "mx_VerificationShowSas_emojiSas" }, emojiBlocks.slice(0, 4), /*#__PURE__*/_react.default.createElement("div", { className: "mx_VerificationShowSas_emojiSas_break" }), emojiBlocks.slice(4)); sasCaption = this.props.isSelf ? (0, _languageHandler._t)("Confirm the emoji below are displayed on both sessions, in the same order:") : (0, _languageHandler._t)("Verify this user by confirming the following emoji appear on their screen."); } else if (this.props.sas.decimal) { const numberBlocks = this.props.sas.decimal.map((num, i) => /*#__PURE__*/_react.default.createElement("span", { key: i }, num)); sasDisplay = /*#__PURE__*/_react.default.createElement("div", { className: "mx_VerificationShowSas_decimalSas" }, numberBlocks); sasCaption = this.props.isSelf ? (0, _languageHandler._t)("Verify this session by confirming the following number appears on its screen.") : (0, _languageHandler._t)("Verify this user by confirming the following number appears on their screen."); } else { return /*#__PURE__*/_react.default.createElement("div", null, (0, _languageHandler._t)("Unable to find a supported verification method."), /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { kind: "primary", onClick: this.props.onCancel, className: "mx_UserInfo_wideButton" }, (0, _languageHandler._t)('Cancel'))); } let confirm; if (this.state.pending || this.state.cancelling) { let text; if (this.state.pending) { if (this.props.isSelf) { // device shouldn't be null in this situation but it can be, eg. if the device is // logged out during verification if (this.props.device) { text = (0, _languageHandler._t)("Waiting for your other session, %(deviceName)s (%(deviceId)s), to verify…", { deviceName: this.props.device ? this.props.device.getDisplayName() : '', deviceId: this.props.device ? this.props.device.deviceId : '' }); } else { text = (0, _languageHandler._t)("Waiting for your other session to verify…"); } } else { const { displayName } = this.props; text = (0, _languageHandler._t)("Waiting for %(displayName)s to verify…", { displayName }); } } else { text = (0, _languageHandler._t)("Cancelling…"); } confirm = /*#__PURE__*/_react.default.createElement(_EncryptionInfo.PendingActionSpinner, { text: text }); } else if (this.props.inDialog) { // FIXME: stop using DialogButtons here once this component is only used in the right panel verification confirm = /*#__PURE__*/_react.default.createElement(_DialogButtons.default, { primaryButton: (0, _languageHandler._t)("They match"), onPrimaryButtonClick: this.onMatchClick, primaryButtonClass: "mx_UserInfo_wideButton mx_VerificationShowSas_matchButton", cancelButton: (0, _languageHandler._t)("They don't match"), onCancel: this.onDontMatchClick, cancelButtonClass: "mx_UserInfo_wideButton mx_VerificationShowSas_noMatchButton" }); } else { confirm = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { onClick: this.onDontMatchClick, kind: "danger" }, (0, _languageHandler._t)("They don't match")), /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { onClick: this.onMatchClick, kind: "primary" }, (0, _languageHandler._t)("They match"))); } return /*#__PURE__*/_react.default.createElement("div", { className: "mx_VerificationShowSas" }, /*#__PURE__*/_react.default.createElement("p", null, sasCaption), sasDisplay, /*#__PURE__*/_react.default.createElement("p", null, this.props.isSelf ? "" : (0, _languageHandler._t)("To be secure, do this in person or use a trusted way to communicate.")), confirm); } }, (0, _defineProperty2.default)(_class2, "propTypes", { pending: _propTypes.default.bool, displayName: _propTypes.default.string, // required if pending is true device: _propTypes.default.object, onDone: _propTypes.default.func.isRequired, onCancel: _propTypes.default.func.isRequired, sas: _propTypes.default.object.isRequired, isSelf: _propTypes.default.bool, inDialog: _propTypes.default.bool // whether this component is being shown in a dialog and to use DialogButtons }), _temp)) || _class); exports.default = VerificationShowSas; // List of Emoji strings from the js-sdk, for i18n (0, _languageHandler._td)("Dog"); (0, _languageHandler._td)("Cat"); (0, _languageHandler._td)("Lion"); (0, _languageHandler._td)("Horse"); (0, _languageHandler._td)("Unicorn"); (0, _languageHandler._td)("Pig"); (0, _languageHandler._td)("Elephant"); (0, _languageHandler._td)("Rabbit"); (0, _languageHandler._td)("Panda"); (0, _languageHandler._td)("Rooster"); (0, _languageHandler._td)("Penguin"); (0, _languageHandler._td)("Turtle"); (0, _languageHandler._td)("Fish"); (0, _languageHandler._td)("Octopus"); (0, _languageHandler._td)("Butterfly"); (0, _languageHandler._td)("Flower"); (0, _languageHandler._td)("Tree"); (0, _languageHandler._td)("Cactus"); (0, _languageHandler._td)("Mushroom"); (0, _languageHandler._td)("Globe"); (0, _languageHandler._td)("Moon"); (0, _languageHandler._td)("Cloud"); (0, _languageHandler._td)("Fire"); (0, _languageHandler._td)("Banana"); (0, _languageHandler._td)("Apple"); (0, _languageHandler._td)("Strawberry"); (0, _languageHandler._td)("Corn"); (0, _languageHandler._td)("Pizza"); (0, _languageHandler._td)("Cake"); (0, _languageHandler._td)("Heart"); (0, _languageHandler._td)("Smiley"); (0, _languageHandler._td)("Robot"); (0, _languageHandler._td)("Hat"); (0, _languageHandler._td)("Glasses"); (0, _languageHandler._td)("Spanner"); (0, _languageHandler._td)("Santa"); (0, _languageHandler._td)("Thumbs up"); (0, _languageHandler._td)("Umbrella"); (0, _languageHandler._td)("Hourglass"); (0, _languageHandler._td)("Clock"); (0, _languageHandler._td)("Gift"); (0, _languageHandler._td)("Light bulb"); (0, _languageHandler._td)("Book"); (0, _languageHandler._td)("Pencil"); (0, _languageHandler._td)("Paperclip"); (0, _languageHandler._td)("Scissors"); (0, _languageHandler._td)("Lock"); (0, _languageHandler._td)("Key"); (0, _languageHandler._td)("Hammer"); (0, _languageHandler._td)("Telephone"); (0, _languageHandler._td)("Flag"); (0, _languageHandler._td)("Train"); (0, _languageHandler._td)("Bicycle"); (0, _languageHandler._td)("Aeroplane"); (0, _languageHandler._td)("Rocket"); (0, _languageHandler._td)("Trophy"); (0, _languageHandler._td)("Ball"); (0, _languageHandler._td)("Guitar"); (0, _languageHandler._td)("Trumpet"); (0, _languageHandler._td)("Bell"); (0, _languageHandler._td)("Anchor"); (0, _languageHandler._td)("Headphones"); (0, _languageHandler._td)("Folder"); (0, _languageHandler._td)("Pin"); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL3ZlcmlmaWNhdGlvbi9WZXJpZmljYXRpb25TaG93U2FzLmpzIl0sIm5hbWVzIjpbImNhcEZpcnN0IiwicyIsImNoYXJBdCIsInRvVXBwZXJDYXNlIiwic2xpY2UiLCJWZXJpZmljYXRpb25TaG93U2FzIiwiUmVhY3QiLCJDb21wb25lbnQiLCJjb25zdHJ1Y3RvciIsInByb3BzIiwic2V0U3RhdGUiLCJwZW5kaW5nIiwib25Eb25lIiwiY2FuY2VsbGluZyIsIm9uQ2FuY2VsIiwic3RhdGUiLCJjb21wb25lbnRXaWxsTW91bnQiLCJyZW5kZXIiLCJzYXNEaXNwbGF5Iiwic2FzQ2FwdGlvbiIsInNhcyIsImVtb2ppIiwiZW1vamlCbG9ja3MiLCJtYXAiLCJpIiwiaXNTZWxmIiwiZGVjaW1hbCIsIm51bWJlckJsb2NrcyIsIm51bSIsImNvbmZpcm0iLCJ0ZXh0IiwiZGV2aWNlIiwiZGV2aWNlTmFtZSIsImdldERpc3BsYXlOYW1lIiwiZGV2aWNlSWQiLCJkaXNwbGF5TmFtZSIsImluRGlhbG9nIiwib25NYXRjaENsaWNrIiwib25Eb250TWF0Y2hDbGljayIsIlByb3BUeXBlcyIsImJvb2wiLCJzdHJpbmciLCJvYmplY3QiLCJmdW5jIiwiaXNSZXF1aXJlZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFnQkE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFFQSxTQUFTQSxRQUFULENBQWtCQyxDQUFsQixFQUFxQjtBQUNqQixTQUFPQSxDQUFDLENBQUNDLE1BQUYsQ0FBUyxDQUFULEVBQVlDLFdBQVosS0FBNEJGLENBQUMsQ0FBQ0csS0FBRixDQUFRLENBQVIsQ0FBbkM7QUFDSDs7SUFHb0JDLG1CLFdBRHBCLGdEQUFxQix3Q0FBckIsQyxtQ0FBRCxNQUNxQkEsbUJBRHJCLFNBQ2lEQyxlQUFNQyxTQUR2RCxDQUNpRTtBQVk3REMsRUFBQUEsV0FBVyxDQUFDQyxLQUFELEVBQVE7QUFDZixVQUFNQSxLQUFOO0FBRGUsd0RBZUosTUFBTTtBQUNqQixXQUFLQyxRQUFMLENBQWM7QUFBRUMsUUFBQUEsT0FBTyxFQUFFO0FBQVgsT0FBZDtBQUNBLFdBQUtGLEtBQUwsQ0FBV0csTUFBWDtBQUNILEtBbEJrQjtBQUFBLDREQW9CQSxNQUFNO0FBQ3JCLFdBQUtGLFFBQUwsQ0FBYztBQUFFRyxRQUFBQSxVQUFVLEVBQUU7QUFBZCxPQUFkO0FBQ0EsV0FBS0osS0FBTCxDQUFXSyxRQUFYO0FBQ0gsS0F2QmtCO0FBR2YsU0FBS0MsS0FBTCxHQUFhO0FBQ1RKLE1BQUFBLE9BQU8sRUFBRTtBQURBLEtBQWI7QUFHSDs7QUFFREssRUFBQUEsa0JBQWtCLEdBQUc7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDSDs7QUFZREMsRUFBQUEsTUFBTSxHQUFHO0FBQ0wsUUFBSUMsVUFBSjtBQUNBLFFBQUlDLFVBQUo7O0FBQ0EsUUFBSSxLQUFLVixLQUFMLENBQVdXLEdBQVgsQ0FBZUMsS0FBbkIsRUFBMEI7QUFDdEIsWUFBTUMsV0FBVyxHQUFHLEtBQUtiLEtBQUwsQ0FBV1csR0FBWCxDQUFlQyxLQUFmLENBQXFCRSxHQUFyQixDQUNoQixDQUFDRixLQUFELEVBQVFHLENBQVIsa0JBQWM7QUFBSyxRQUFBLFNBQVMsRUFBQyx1Q0FBZjtBQUF1RCxRQUFBLEdBQUcsRUFBRUE7QUFBNUQsc0JBQ1Y7QUFBSyxRQUFBLFNBQVMsRUFBQztBQUFmLFNBQ01ILEtBQUssQ0FBQyxDQUFELENBRFgsQ0FEVSxlQUlWO0FBQUssUUFBQSxTQUFTLEVBQUM7QUFBZixTQUNLLHlCQUFHckIsUUFBUSxDQUFDcUIsS0FBSyxDQUFDLENBQUQsQ0FBTixDQUFYLENBREwsQ0FKVSxDQURFLENBQXBCO0FBVUFILE1BQUFBLFVBQVUsZ0JBQUc7QUFBSyxRQUFBLFNBQVMsRUFBQztBQUFmLFNBQ1JJLFdBQVcsQ0FBQ2xCLEtBQVosQ0FBa0IsQ0FBbEIsRUFBcUIsQ0FBckIsQ0FEUSxlQUVUO0FBQUssUUFBQSxTQUFTLEVBQUM7QUFBZixRQUZTLEVBR1JrQixXQUFXLENBQUNsQixLQUFaLENBQWtCLENBQWxCLENBSFEsQ0FBYjtBQUtBZSxNQUFBQSxVQUFVLEdBQUcsS0FBS1YsS0FBTCxDQUFXZ0IsTUFBWCxHQUNULHlCQUNJLDRFQURKLENBRFMsR0FJVCx5QkFDSSw0RUFESixDQUpKO0FBT0gsS0F2QkQsTUF1Qk8sSUFBSSxLQUFLaEIsS0FBTCxDQUFXVyxHQUFYLENBQWVNLE9BQW5CLEVBQTRCO0FBQy9CLFlBQU1DLFlBQVksR0FBRyxLQUFLbEIsS0FBTCxDQUFXVyxHQUFYLENBQWVNLE9BQWYsQ0FBdUJILEdBQXZCLENBQTJCLENBQUNLLEdBQUQsRUFBTUosQ0FBTixrQkFBWTtBQUFNLFFBQUEsR0FBRyxFQUFFQTtBQUFYLFNBQ3ZESSxHQUR1RCxDQUF2QyxDQUFyQjtBQUdBVixNQUFBQSxVQUFVLGdCQUFHO0FBQUssUUFBQSxTQUFTLEVBQUM7QUFBZixTQUNSUyxZQURRLENBQWI7QUFHQVIsTUFBQUEsVUFBVSxHQUFHLEtBQUtWLEtBQUwsQ0FBV2dCLE1BQVgsR0FDVCx5QkFDSSwrRUFESixDQURTLEdBSVQseUJBQ0ksOEVBREosQ0FKSjtBQU9ILEtBZE0sTUFjQTtBQUNILDBCQUFPLDBDQUNGLHlCQUFHLGlEQUFILENBREUsZUFFSCw2QkFBQyx5QkFBRDtBQUFrQixRQUFBLElBQUksRUFBQyxTQUF2QjtBQUFpQyxRQUFBLE9BQU8sRUFBRSxLQUFLaEIsS0FBTCxDQUFXSyxRQUFyRDtBQUErRCxRQUFBLFNBQVMsRUFBQztBQUF6RSxTQUNLLHlCQUFHLFFBQUgsQ0FETCxDQUZHLENBQVA7QUFNSDs7QUFFRCxRQUFJZSxPQUFKOztBQUNBLFFBQUksS0FBS2QsS0FBTCxDQUFXSixPQUFYLElBQXNCLEtBQUtJLEtBQUwsQ0FBV0YsVUFBckMsRUFBaUQ7QUFDN0MsVUFBSWlCLElBQUo7O0FBQ0EsVUFBSSxLQUFLZixLQUFMLENBQVdKLE9BQWYsRUFBd0I7QUFDcEIsWUFBSSxLQUFLRixLQUFMLENBQVdnQixNQUFmLEVBQXVCO0FBQ25CO0FBQ0E7QUFDQSxjQUFJLEtBQUtoQixLQUFMLENBQVdzQixNQUFmLEVBQXVCO0FBQ25CRCxZQUFBQSxJQUFJLEdBQUcseUJBQUcsMkVBQUgsRUFBZ0Y7QUFDbkZFLGNBQUFBLFVBQVUsRUFBRSxLQUFLdkIsS0FBTCxDQUFXc0IsTUFBWCxHQUFvQixLQUFLdEIsS0FBTCxDQUFXc0IsTUFBWCxDQUFrQkUsY0FBbEIsRUFBcEIsR0FBeUQsRUFEYztBQUVuRkMsY0FBQUEsUUFBUSxFQUFFLEtBQUt6QixLQUFMLENBQVdzQixNQUFYLEdBQW9CLEtBQUt0QixLQUFMLENBQVdzQixNQUFYLENBQWtCRyxRQUF0QyxHQUFpRDtBQUZ3QixhQUFoRixDQUFQO0FBSUgsV0FMRCxNQUtPO0FBQ0hKLFlBQUFBLElBQUksR0FBRyx5QkFBRywyQ0FBSCxDQUFQO0FBQ0g7QUFDSixTQVhELE1BV087QUFDSCxnQkFBTTtBQUFDSyxZQUFBQTtBQUFELGNBQWdCLEtBQUsxQixLQUEzQjtBQUNBcUIsVUFBQUEsSUFBSSxHQUFHLHlCQUFHLHdDQUFILEVBQTZDO0FBQUNLLFlBQUFBO0FBQUQsV0FBN0MsQ0FBUDtBQUNIO0FBQ0osT0FoQkQsTUFnQk87QUFDSEwsUUFBQUEsSUFBSSxHQUFHLHlCQUFHLGFBQUgsQ0FBUDtBQUNIOztBQUNERCxNQUFBQSxPQUFPLGdCQUFHLDZCQUFDLG9DQUFEO0FBQXNCLFFBQUEsSUFBSSxFQUFFQztBQUE1QixRQUFWO0FBQ0gsS0F0QkQsTUFzQk8sSUFBSSxLQUFLckIsS0FBTCxDQUFXMkIsUUFBZixFQUF5QjtBQUM1QjtBQUNBUCxNQUFBQSxPQUFPLGdCQUFHLDZCQUFDLHNCQUFEO0FBQ04sUUFBQSxhQUFhLEVBQUUseUJBQUcsWUFBSCxDQURUO0FBRU4sUUFBQSxvQkFBb0IsRUFBRSxLQUFLUSxZQUZyQjtBQUdOLFFBQUEsa0JBQWtCLEVBQUMsMkRBSGI7QUFJTixRQUFBLFlBQVksRUFBRSx5QkFBRyxrQkFBSCxDQUpSO0FBS04sUUFBQSxRQUFRLEVBQUUsS0FBS0MsZ0JBTFQ7QUFNTixRQUFBLGlCQUFpQixFQUFDO0FBTlosUUFBVjtBQVFILEtBVk0sTUFVQTtBQUNIVCxNQUFBQSxPQUFPLGdCQUFHLDZCQUFDLGNBQUQsQ0FBTyxRQUFQLHFCQUNOLDZCQUFDLHlCQUFEO0FBQWtCLFFBQUEsT0FBTyxFQUFFLEtBQUtTLGdCQUFoQztBQUFrRCxRQUFBLElBQUksRUFBQztBQUF2RCxTQUNNLHlCQUFHLGtCQUFILENBRE4sQ0FETSxlQUlOLDZCQUFDLHlCQUFEO0FBQWtCLFFBQUEsT0FBTyxFQUFFLEtBQUtELFlBQWhDO0FBQThDLFFBQUEsSUFBSSxFQUFDO0FBQW5ELFNBQ00seUJBQUcsWUFBSCxDQUROLENBSk0sQ0FBVjtBQVFIOztBQUVELHdCQUFPO0FBQUssTUFBQSxTQUFTLEVBQUM7QUFBZixvQkFDSCx3Q0FBSWxCLFVBQUosQ0FERyxFQUVGRCxVQUZFLGVBR0gsd0NBQUksS0FBS1QsS0FBTCxDQUFXZ0IsTUFBWCxHQUNBLEVBREEsR0FFQSx5QkFBRyxzRUFBSCxDQUZKLENBSEcsRUFNRkksT0FORSxDQUFQO0FBUUg7O0FBMUk0RCxDLHNEQUMxQztBQUNmbEIsRUFBQUEsT0FBTyxFQUFFNEIsbUJBQVVDLElBREo7QUFFZkwsRUFBQUEsV0FBVyxFQUFFSSxtQkFBVUUsTUFGUjtBQUVnQjtBQUMvQlYsRUFBQUEsTUFBTSxFQUFFUSxtQkFBVUcsTUFISDtBQUlmOUIsRUFBQUEsTUFBTSxFQUFFMkIsbUJBQVVJLElBQVYsQ0FBZUMsVUFKUjtBQUtmOUIsRUFBQUEsUUFBUSxFQUFFeUIsbUJBQVVJLElBQVYsQ0FBZUMsVUFMVjtBQU1meEIsRUFBQUEsR0FBRyxFQUFFbUIsbUJBQVVHLE1BQVYsQ0FBaUJFLFVBTlA7QUFPZm5CLEVBQUFBLE1BQU0sRUFBRWMsbUJBQVVDLElBUEg7QUFRZkosRUFBQUEsUUFBUSxFQUFFRyxtQkFBVUMsSUFSTCxDQVFXOztBQVJYLEM7O0FBNEl2QjtBQUNBLDBCQUFJLEtBQUo7QUFDQSwwQkFBSSxLQUFKO0FBQ0EsMEJBQUksTUFBSjtBQUNBLDBCQUFJLE9BQUo7QUFDQSwwQkFBSSxTQUFKO0FBQ0EsMEJBQUksS0FBSjtBQUNBLDBCQUFJLFVBQUo7QUFDQSwwQkFBSSxRQUFKO0FBQ0EsMEJBQUksT0FBSjtBQUNBLDBCQUFJLFNBQUo7QUFDQSwwQkFBSSxTQUFKO0FBQ0EsMEJBQUksUUFBSjtBQUNBLDBCQUFJLE1BQUo7QUFDQSwwQkFBSSxTQUFKO0FBQ0EsMEJBQUksV0FBSjtBQUNBLDBCQUFJLFFBQUo7QUFDQSwwQkFBSSxNQUFKO0FBQ0EsMEJBQUksUUFBSjtBQUNBLDBCQUFJLFVBQUo7QUFDQSwwQkFBSSxPQUFKO0FBQ0EsMEJBQUksTUFBSjtBQUNBLDBCQUFJLE9BQUo7QUFDQSwwQkFBSSxNQUFKO0FBQ0EsMEJBQUksUUFBSjtBQUNBLDBCQUFJLE9BQUo7QUFDQSwwQkFBSSxZQUFKO0FBQ0EsMEJBQUksTUFBSjtBQUNBLDBCQUFJLE9BQUo7QUFDQSwwQkFBSSxNQUFKO0FBQ0EsMEJBQUksT0FBSjtBQUNBLDBCQUFJLFFBQUo7QUFDQSwwQkFBSSxPQUFKO0FBQ0EsMEJBQUksS0FBSjtBQUNBLDBCQUFJLFNBQUo7QUFDQSwwQkFBSSxTQUFKO0FBQ0EsMEJBQUksT0FBSjtBQUNBLDBCQUFJLFdBQUo7QUFDQSwwQkFBSSxVQUFKO0FBQ0EsMEJBQUksV0FBSjtBQUNBLDBCQUFJLE9BQUo7QUFDQSwwQkFBSSxNQUFKO0FBQ0EsMEJBQUksWUFBSjtBQUNBLDBCQUFJLE1BQUo7QUFDQSwwQkFBSSxRQUFKO0FBQ0EsMEJBQUksV0FBSjtBQUNBLDBCQUFJLFVBQUo7QUFDQSwwQkFBSSxNQUFKO0FBQ0EsMEJBQUksS0FBSjtBQUNBLDBCQUFJLFFBQUo7QUFDQSwwQkFBSSxXQUFKO0FBQ0EsMEJBQUksTUFBSjtBQUNBLDBCQUFJLE9BQUo7QUFDQSwwQkFBSSxTQUFKO0FBQ0EsMEJBQUksV0FBSjtBQUNBLDBCQUFJLFFBQUo7QUFDQSwwQkFBSSxRQUFKO0FBQ0EsMEJBQUksTUFBSjtBQUNBLDBCQUFJLFFBQUo7QUFDQSwwQkFBSSxTQUFKO0FBQ0EsMEJBQUksTUFBSjtBQUNBLDBCQUFJLFFBQUo7QUFDQSwwQkFBSSxZQUFKO0FBQ0EsMEJBQUksUUFBSjtBQUNBLDBCQUFJLEtBQUoiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMTkgVmVjdG9yIENyZWF0aW9ucyBMdGRcblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7IF90LCBfdGQgfSBmcm9tICcuLi8uLi8uLi9sYW5ndWFnZUhhbmRsZXInO1xuaW1wb3J0IHtQZW5kaW5nQWN0aW9uU3Bpbm5lcn0gZnJvbSBcIi4uL3JpZ2h0X3BhbmVsL0VuY3J5cHRpb25JbmZvXCI7XG5pbXBvcnQgQWNjZXNzaWJsZUJ1dHRvbiBmcm9tIFwiLi4vZWxlbWVudHMvQWNjZXNzaWJsZUJ1dHRvblwiO1xuaW1wb3J0IERpYWxvZ0J1dHRvbnMgZnJvbSBcIi4uL2VsZW1lbnRzL0RpYWxvZ0J1dHRvbnNcIjtcbmltcG9ydCB7IGZpeHVwQ29sb3JGb250cyB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL0ZvbnRNYW5hZ2VyJztcbmltcG9ydCB7cmVwbGFjZWFibGVDb21wb25lbnR9IGZyb20gXCIuLi8uLi8uLi91dGlscy9yZXBsYWNlYWJsZUNvbXBvbmVudFwiO1xuXG5mdW5jdGlvbiBjYXBGaXJzdChzKSB7XG4gICAgcmV0dXJuIHMuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzLnNsaWNlKDEpO1xufVxuXG5AcmVwbGFjZWFibGVDb21wb25lbnQoXCJ2aWV3cy52ZXJpZmljYXRpb24uVmVyaWZpY2F0aW9uU2hvd1Nhc1wiKVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVyaWZpY2F0aW9uU2hvd1NhcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICAgICAgcGVuZGluZzogUHJvcFR5cGVzLmJvb2wsXG4gICAgICAgIGRpc3BsYXlOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLCAvLyByZXF1aXJlZCBpZiBwZW5kaW5nIGlzIHRydWVcbiAgICAgICAgZGV2aWNlOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgICAgICBvbkRvbmU6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgICAgIG9uQ2FuY2VsOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgICAgICBzYXM6IFByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgICAgICAgaXNTZWxmOiBQcm9wVHlwZXMuYm9vbCxcbiAgICAgICAgaW5EaWFsb2c6IFByb3BUeXBlcy5ib29sLCAvLyB3aGV0aGVyIHRoaXMgY29tcG9uZW50IGlzIGJlaW5nIHNob3duIGluIGEgZGlhbG9nIGFuZCB0byB1c2UgRGlhbG9nQnV0dG9uc1xuICAgIH07XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG5cbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIHBlbmRpbmc6IGZhbHNlLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGNvbXBvbmVudFdpbGxNb3VudCgpIHtcbiAgICAgICAgLy8gQXMgdGhpcyBjb21wb25lbnQgaXMgYWxzbyB1c2VkIGJlZm9yZSBsb2dpbiAoZHVyaW5nIGNvbXBsZXRlIHNlY3VyaXR5KSxcbiAgICAgICAgLy8gYWxzbyBtYWtlIHN1cmUgd2UgaGF2ZSBhIHdvcmtpbmcgZW1vamkgZm9udCB0byBkaXNwbGF5IHRoZSBTQVMgZW1vamlzIGhlcmUuXG4gICAgICAgIC8vIFRoaXMgaXMgYWxzbyBkb25lIGZyb20gTG9nZ2VkSW5WaWV3LlxuICAgICAgICBmaXh1cENvbG9yRm9udHMoKTtcbiAgICB9XG5cbiAgICBvbk1hdGNoQ2xpY2sgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBwZW5kaW5nOiB0cnVlIH0pO1xuICAgICAgICB0aGlzLnByb3BzLm9uRG9uZSgpO1xuICAgIH07XG5cbiAgICBvbkRvbnRNYXRjaENsaWNrID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgY2FuY2VsbGluZzogdHJ1ZSB9KTtcbiAgICAgICAgdGhpcy5wcm9wcy5vbkNhbmNlbCgpO1xuICAgIH07XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGxldCBzYXNEaXNwbGF5O1xuICAgICAgICBsZXQgc2FzQ2FwdGlvbjtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuc2FzLmVtb2ppKSB7XG4gICAgICAgICAgICBjb25zdCBlbW9qaUJsb2NrcyA9IHRoaXMucHJvcHMuc2FzLmVtb2ppLm1hcChcbiAgICAgICAgICAgICAgICAoZW1vamksIGkpID0+IDxkaXYgY2xhc3NOYW1lPVwibXhfVmVyaWZpY2F0aW9uU2hvd1Nhc19lbW9qaVNhc19ibG9ja1wiIGtleT17aX0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfVmVyaWZpY2F0aW9uU2hvd1Nhc19lbW9qaVNhc19lbW9qaVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgeyBlbW9qaVswXSB9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X1ZlcmlmaWNhdGlvblNob3dTYXNfZW1vamlTYXNfbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtfdChjYXBGaXJzdChlbW9qaVsxXSkpfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj4sXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgc2FzRGlzcGxheSA9IDxkaXYgY2xhc3NOYW1lPVwibXhfVmVyaWZpY2F0aW9uU2hvd1Nhc19lbW9qaVNhc1wiPlxuICAgICAgICAgICAgICAgIHtlbW9qaUJsb2Nrcy5zbGljZSgwLCA0KX1cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X1ZlcmlmaWNhdGlvblNob3dTYXNfZW1vamlTYXNfYnJlYWtcIiAvPlxuICAgICAgICAgICAgICAgIHtlbW9qaUJsb2Nrcy5zbGljZSg0KX1cbiAgICAgICAgICAgIDwvZGl2PjtcbiAgICAgICAgICAgIHNhc0NhcHRpb24gPSB0aGlzLnByb3BzLmlzU2VsZiA/XG4gICAgICAgICAgICAgICAgX3QoXG4gICAgICAgICAgICAgICAgICAgIFwiQ29uZmlybSB0aGUgZW1vamkgYmVsb3cgYXJlIGRpc3BsYXllZCBvbiBib3RoIHNlc3Npb25zLCBpbiB0aGUgc2FtZSBvcmRlcjpcIixcbiAgICAgICAgICAgICAgICApOlxuICAgICAgICAgICAgICAgIF90KFxuICAgICAgICAgICAgICAgICAgICBcIlZlcmlmeSB0aGlzIHVzZXIgYnkgY29uZmlybWluZyB0aGUgZm9sbG93aW5nIGVtb2ppIGFwcGVhciBvbiB0aGVpciBzY3JlZW4uXCIsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLnNhcy5kZWNpbWFsKSB7XG4gICAgICAgICAgICBjb25zdCBudW1iZXJCbG9ja3MgPSB0aGlzLnByb3BzLnNhcy5kZWNpbWFsLm1hcCgobnVtLCBpKSA9PiA8c3BhbiBrZXk9e2l9PlxuICAgICAgICAgICAgICAgIHtudW19XG4gICAgICAgICAgICA8L3NwYW4+KTtcbiAgICAgICAgICAgIHNhc0Rpc3BsYXkgPSA8ZGl2IGNsYXNzTmFtZT1cIm14X1ZlcmlmaWNhdGlvblNob3dTYXNfZGVjaW1hbFNhc1wiPlxuICAgICAgICAgICAgICAgIHtudW1iZXJCbG9ja3N9XG4gICAgICAgICAgICA8L2Rpdj47XG4gICAgICAgICAgICBzYXNDYXB0aW9uID0gdGhpcy5wcm9wcy5pc1NlbGYgP1xuICAgICAgICAgICAgICAgIF90KFxuICAgICAgICAgICAgICAgICAgICBcIlZlcmlmeSB0aGlzIHNlc3Npb24gYnkgY29uZmlybWluZyB0aGUgZm9sbG93aW5nIG51bWJlciBhcHBlYXJzIG9uIGl0cyBzY3JlZW4uXCIsXG4gICAgICAgICAgICAgICAgKTpcbiAgICAgICAgICAgICAgICBfdChcbiAgICAgICAgICAgICAgICAgICAgXCJWZXJpZnkgdGhpcyB1c2VyIGJ5IGNvbmZpcm1pbmcgdGhlIGZvbGxvd2luZyBudW1iZXIgYXBwZWFycyBvbiB0aGVpciBzY3JlZW4uXCIsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiA8ZGl2PlxuICAgICAgICAgICAgICAgIHtfdChcIlVuYWJsZSB0byBmaW5kIGEgc3VwcG9ydGVkIHZlcmlmaWNhdGlvbiBtZXRob2QuXCIpfVxuICAgICAgICAgICAgICAgIDxBY2Nlc3NpYmxlQnV0dG9uIGtpbmQ9XCJwcmltYXJ5XCIgb25DbGljaz17dGhpcy5wcm9wcy5vbkNhbmNlbH0gY2xhc3NOYW1lPVwibXhfVXNlckluZm9fd2lkZUJ1dHRvblwiPlxuICAgICAgICAgICAgICAgICAgICB7X3QoJ0NhbmNlbCcpfVxuICAgICAgICAgICAgICAgIDwvQWNjZXNzaWJsZUJ1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjb25maXJtO1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5wZW5kaW5nIHx8IHRoaXMuc3RhdGUuY2FuY2VsbGluZykge1xuICAgICAgICAgICAgbGV0IHRleHQ7XG4gICAgICAgICAgICBpZiAodGhpcy5zdGF0ZS5wZW5kaW5nKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucHJvcHMuaXNTZWxmKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGRldmljZSBzaG91bGRuJ3QgYmUgbnVsbCBpbiB0aGlzIHNpdHVhdGlvbiBidXQgaXQgY2FuIGJlLCBlZy4gaWYgdGhlIGRldmljZSBpc1xuICAgICAgICAgICAgICAgICAgICAvLyBsb2dnZWQgb3V0IGR1cmluZyB2ZXJpZmljYXRpb25cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucHJvcHMuZGV2aWNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gX3QoXCJXYWl0aW5nIGZvciB5b3VyIG90aGVyIHNlc3Npb24sICUoZGV2aWNlTmFtZSlzICglKGRldmljZUlkKXMpLCB0byB2ZXJpZnnigKZcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZU5hbWU6IHRoaXMucHJvcHMuZGV2aWNlID8gdGhpcy5wcm9wcy5kZXZpY2UuZ2V0RGlzcGxheU5hbWUoKSA6ICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUlkOiB0aGlzLnByb3BzLmRldmljZSA/IHRoaXMucHJvcHMuZGV2aWNlLmRldmljZUlkIDogJycsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBfdChcIldhaXRpbmcgZm9yIHlvdXIgb3RoZXIgc2Vzc2lvbiB0byB2ZXJpZnnigKZcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7ZGlzcGxheU5hbWV9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IF90KFwiV2FpdGluZyBmb3IgJShkaXNwbGF5TmFtZSlzIHRvIHZlcmlmeeKAplwiLCB7ZGlzcGxheU5hbWV9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRleHQgPSBfdChcIkNhbmNlbGxpbmfigKZcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25maXJtID0gPFBlbmRpbmdBY3Rpb25TcGlubmVyIHRleHQ9e3RleHR9IC8+O1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMuaW5EaWFsb2cpIHtcbiAgICAgICAgICAgIC8vIEZJWE1FOiBzdG9wIHVzaW5nIERpYWxvZ0J1dHRvbnMgaGVyZSBvbmNlIHRoaXMgY29tcG9uZW50IGlzIG9ubHkgdXNlZCBpbiB0aGUgcmlnaHQgcGFuZWwgdmVyaWZpY2F0aW9uXG4gICAgICAgICAgICBjb25maXJtID0gPERpYWxvZ0J1dHRvbnNcbiAgICAgICAgICAgICAgICBwcmltYXJ5QnV0dG9uPXtfdChcIlRoZXkgbWF0Y2hcIil9XG4gICAgICAgICAgICAgICAgb25QcmltYXJ5QnV0dG9uQ2xpY2s9e3RoaXMub25NYXRjaENsaWNrfVxuICAgICAgICAgICAgICAgIHByaW1hcnlCdXR0b25DbGFzcz1cIm14X1VzZXJJbmZvX3dpZGVCdXR0b24gbXhfVmVyaWZpY2F0aW9uU2hvd1Nhc19tYXRjaEJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uPXtfdChcIlRoZXkgZG9uJ3QgbWF0Y2hcIil9XG4gICAgICAgICAgICAgICAgb25DYW5jZWw9e3RoaXMub25Eb250TWF0Y2hDbGlja31cbiAgICAgICAgICAgICAgICBjYW5jZWxCdXR0b25DbGFzcz1cIm14X1VzZXJJbmZvX3dpZGVCdXR0b24gbXhfVmVyaWZpY2F0aW9uU2hvd1Nhc19ub01hdGNoQnV0dG9uXCJcbiAgICAgICAgICAgIC8+O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uZmlybSA9IDxSZWFjdC5GcmFnbWVudD5cbiAgICAgICAgICAgICAgICA8QWNjZXNzaWJsZUJ1dHRvbiBvbkNsaWNrPXt0aGlzLm9uRG9udE1hdGNoQ2xpY2t9IGtpbmQ9XCJkYW5nZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgeyBfdChcIlRoZXkgZG9uJ3QgbWF0Y2hcIikgfVxuICAgICAgICAgICAgICAgIDwvQWNjZXNzaWJsZUJ1dHRvbj5cbiAgICAgICAgICAgICAgICA8QWNjZXNzaWJsZUJ1dHRvbiBvbkNsaWNrPXt0aGlzLm9uTWF0Y2hDbGlja30ga2luZD1cInByaW1hcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgeyBfdChcIlRoZXkgbWF0Y2hcIikgfVxuICAgICAgICAgICAgICAgIDwvQWNjZXNzaWJsZUJ1dHRvbj5cbiAgICAgICAgICAgIDwvUmVhY3QuRnJhZ21lbnQ+O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwibXhfVmVyaWZpY2F0aW9uU2hvd1Nhc1wiPlxuICAgICAgICAgICAgPHA+e3Nhc0NhcHRpb259PC9wPlxuICAgICAgICAgICAge3Nhc0Rpc3BsYXl9XG4gICAgICAgICAgICA8cD57dGhpcy5wcm9wcy5pc1NlbGYgP1xuICAgICAgICAgICAgICAgIFwiXCI6XG4gICAgICAgICAgICAgICAgX3QoXCJUbyBiZSBzZWN1cmUsIGRvIHRoaXMgaW4gcGVyc29uIG9yIHVzZSBhIHRydXN0ZWQgd2F5IHRvIGNvbW11bmljYXRlLlwiKX08L3A+XG4gICAgICAgICAgICB7Y29uZmlybX1cbiAgICAgICAgPC9kaXY+O1xuICAgIH1cbn1cblxuLy8gTGlzdCBvZiBFbW9qaSBzdHJpbmdzIGZyb20gdGhlIGpzLXNkaywgZm9yIGkxOG5cbl90ZChcIkRvZ1wiKTtcbl90ZChcIkNhdFwiKTtcbl90ZChcIkxpb25cIik7XG5fdGQoXCJIb3JzZVwiKTtcbl90ZChcIlVuaWNvcm5cIik7XG5fdGQoXCJQaWdcIik7XG5fdGQoXCJFbGVwaGFudFwiKTtcbl90ZChcIlJhYmJpdFwiKTtcbl90ZChcIlBhbmRhXCIpO1xuX3RkKFwiUm9vc3RlclwiKTtcbl90ZChcIlBlbmd1aW5cIik7XG5fdGQoXCJUdXJ0bGVcIik7XG5fdGQoXCJGaXNoXCIpO1xuX3RkKFwiT2N0b3B1c1wiKTtcbl90ZChcIkJ1dHRlcmZseVwiKTtcbl90ZChcIkZsb3dlclwiKTtcbl90ZChcIlRyZWVcIik7XG5fdGQoXCJDYWN0dXNcIik7XG5fdGQoXCJNdXNocm9vbVwiKTtcbl90ZChcIkdsb2JlXCIpO1xuX3RkKFwiTW9vblwiKTtcbl90ZChcIkNsb3VkXCIpO1xuX3RkKFwiRmlyZVwiKTtcbl90ZChcIkJhbmFuYVwiKTtcbl90ZChcIkFwcGxlXCIpO1xuX3RkKFwiU3RyYXdiZXJyeVwiKTtcbl90ZChcIkNvcm5cIik7XG5fdGQoXCJQaXp6YVwiKTtcbl90ZChcIkNha2VcIik7XG5fdGQoXCJIZWFydFwiKTtcbl90ZChcIlNtaWxleVwiKTtcbl90ZChcIlJvYm90XCIpO1xuX3RkKFwiSGF0XCIpO1xuX3RkKFwiR2xhc3Nlc1wiKTtcbl90ZChcIlNwYW5uZXJcIik7XG5fdGQoXCJTYW50YVwiKTtcbl90ZChcIlRodW1icyB1cFwiKTtcbl90ZChcIlVtYnJlbGxhXCIpO1xuX3RkKFwiSG91cmdsYXNzXCIpO1xuX3RkKFwiQ2xvY2tcIik7XG5fdGQoXCJHaWZ0XCIpO1xuX3RkKFwiTGlnaHQgYnVsYlwiKTtcbl90ZChcIkJvb2tcIik7XG5fdGQoXCJQZW5jaWxcIik7XG5fdGQoXCJQYXBlcmNsaXBcIik7XG5fdGQoXCJTY2lzc29yc1wiKTtcbl90ZChcIkxvY2tcIik7XG5fdGQoXCJLZXlcIik7XG5fdGQoXCJIYW1tZXJcIik7XG5fdGQoXCJUZWxlcGhvbmVcIik7XG5fdGQoXCJGbGFnXCIpO1xuX3RkKFwiVHJhaW5cIik7XG5fdGQoXCJCaWN5Y2xlXCIpO1xuX3RkKFwiQWVyb3BsYW5lXCIpO1xuX3RkKFwiUm9ja2V0XCIpO1xuX3RkKFwiVHJvcGh5XCIpO1xuX3RkKFwiQmFsbFwiKTtcbl90ZChcIkd1aXRhclwiKTtcbl90ZChcIlRydW1wZXRcIik7XG5fdGQoXCJCZWxsXCIpO1xuX3RkKFwiQW5jaG9yXCIpO1xuX3RkKFwiSGVhZHBob25lc1wiKTtcbl90ZChcIkZvbGRlclwiKTtcbl90ZChcIlBpblwiKTtcbiJdfQ==