UNPKG

matrix-react-sdk

Version:
779 lines (672 loc) 96.9 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.textForEvent = textForEvent; var _MatrixClientPeg = require("./MatrixClientPeg"); var _languageHandler = require("./languageHandler"); var Roles = _interopRequireWildcard(require("./Roles")); var _RoomInvite = require("./RoomInvite"); var _SettingsStore = _interopRequireDefault(require("./settings/SettingsStore")); var _BanList = require("./mjolnir/BanList"); var _WidgetLayoutStore = require("./stores/widgets/WidgetLayoutStore"); /* Copyright 2015, 2016 OpenMarket Ltd 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. */ function textForMemberEvent(ev) { // XXX: SYJS-16 "sender is sometimes null for join messages" const senderName = ev.sender ? ev.sender.name : ev.getSender(); const targetName = ev.target ? ev.target.name : ev.getStateKey(); const prevContent = ev.getPrevContent(); const content = ev.getContent(); const reason = content.reason ? (0, _languageHandler._t)('Reason') + ': ' + content.reason : ''; switch (content.membership) { case 'invite': { const threePidContent = content.third_party_invite; if (threePidContent) { if (threePidContent.display_name) { return (0, _languageHandler._t)('%(targetName)s accepted the invitation for %(displayName)s.', { targetName, displayName: threePidContent.display_name }); } else { return (0, _languageHandler._t)('%(targetName)s accepted an invitation.', { targetName }); } } else { return (0, _languageHandler._t)('%(senderName)s invited %(targetName)s.', { senderName, targetName }); } } case 'ban': return (0, _languageHandler._t)('%(senderName)s banned %(targetName)s.', { senderName, targetName }) + ' ' + reason; case 'join': if (prevContent && prevContent.membership === 'join') { if (prevContent.displayname && content.displayname && prevContent.displayname !== content.displayname) { return (0, _languageHandler._t)('%(oldDisplayName)s changed their display name to %(displayName)s.', { oldDisplayName: prevContent.displayname, displayName: content.displayname }); } else if (!prevContent.displayname && content.displayname) { return (0, _languageHandler._t)('%(senderName)s set their display name to %(displayName)s.', { senderName: ev.getSender(), displayName: content.displayname }); } else if (prevContent.displayname && !content.displayname) { return (0, _languageHandler._t)('%(senderName)s removed their display name (%(oldDisplayName)s).', { senderName, oldDisplayName: prevContent.displayname }); } else if (prevContent.avatar_url && !content.avatar_url) { return (0, _languageHandler._t)('%(senderName)s removed their profile picture.', { senderName }); } else if (prevContent.avatar_url && content.avatar_url && prevContent.avatar_url !== content.avatar_url) { return (0, _languageHandler._t)('%(senderName)s changed their profile picture.', { senderName }); } else if (!prevContent.avatar_url && content.avatar_url) { return (0, _languageHandler._t)('%(senderName)s set a profile picture.', { senderName }); } else if (_SettingsStore.default.getValue("showHiddenEventsInTimeline")) { // This is a null rejoin, it will only be visible if the Labs option is enabled return (0, _languageHandler._t)("%(senderName)s made no change.", { senderName }); } else { return ""; } } else { if (!ev.target) console.warn("Join message has no target! -- " + ev.getContent().state_key); return (0, _languageHandler._t)('%(targetName)s joined the room.', { targetName }); } case 'leave': if (ev.getSender() === ev.getStateKey()) { if (prevContent.membership === "invite") { return (0, _languageHandler._t)('%(targetName)s rejected the invitation.', { targetName }); } else { return (0, _languageHandler._t)('%(targetName)s left the room.', { targetName }); } } else if (prevContent.membership === "ban") { return (0, _languageHandler._t)('%(senderName)s unbanned %(targetName)s.', { senderName, targetName }); } else if (prevContent.membership === "invite") { return (0, _languageHandler._t)('%(senderName)s withdrew %(targetName)s\'s invitation.', { senderName, targetName }) + ' ' + reason; } else if (prevContent.membership === "join") { return (0, _languageHandler._t)('%(senderName)s kicked %(targetName)s.', { senderName, targetName }) + ' ' + reason; } else { return ""; } } } function textForTopicEvent(ev) { const senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender(); return (0, _languageHandler._t)('%(senderDisplayName)s changed the topic to "%(topic)s".', { senderDisplayName, topic: ev.getContent().topic }); } function textForRoomNameEvent(ev) { const senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender(); if (!ev.getContent().name || ev.getContent().name.trim().length === 0) { return (0, _languageHandler._t)('%(senderDisplayName)s removed the room name.', { senderDisplayName }); } if (ev.getPrevContent().name) { return (0, _languageHandler._t)('%(senderDisplayName)s changed the room name from %(oldRoomName)s to %(newRoomName)s.', { senderDisplayName, oldRoomName: ev.getPrevContent().name, newRoomName: ev.getContent().name }); } return (0, _languageHandler._t)('%(senderDisplayName)s changed the room name to %(roomName)s.', { senderDisplayName, roomName: ev.getContent().name }); } function textForTombstoneEvent(ev) { const senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender(); return (0, _languageHandler._t)('%(senderDisplayName)s upgraded this room.', { senderDisplayName }); } function textForJoinRulesEvent(ev) { const senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender(); switch (ev.getContent().join_rule) { case "public": return (0, _languageHandler._t)('%(senderDisplayName)s made the room public to whoever knows the link.', { senderDisplayName }); case "invite": return (0, _languageHandler._t)('%(senderDisplayName)s made the room invite only.', { senderDisplayName }); default: // The spec supports "knock" and "private", however nothing implements these. return (0, _languageHandler._t)('%(senderDisplayName)s changed the join rule to %(rule)s', { senderDisplayName, rule: ev.getContent().join_rule }); } } function textForGuestAccessEvent(ev) { const senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender(); switch (ev.getContent().guest_access) { case "can_join": return (0, _languageHandler._t)('%(senderDisplayName)s has allowed guests to join the room.', { senderDisplayName }); case "forbidden": return (0, _languageHandler._t)('%(senderDisplayName)s has prevented guests from joining the room.', { senderDisplayName }); default: // There's no other options we can expect, however just for safety's sake we'll do this. return (0, _languageHandler._t)('%(senderDisplayName)s changed guest access to %(rule)s', { senderDisplayName, rule: ev.getContent().guest_access }); } } function textForRelatedGroupsEvent(ev) { const senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender(); const groups = ev.getContent().groups || []; const prevGroups = ev.getPrevContent().groups || []; const added = groups.filter(g => !prevGroups.includes(g)); const removed = prevGroups.filter(g => !groups.includes(g)); if (added.length && !removed.length) { return (0, _languageHandler._t)('%(senderDisplayName)s enabled flair for %(groups)s in this room.', { senderDisplayName, groups: added.join(', ') }); } else if (!added.length && removed.length) { return (0, _languageHandler._t)('%(senderDisplayName)s disabled flair for %(groups)s in this room.', { senderDisplayName, groups: removed.join(', ') }); } else if (added.length && removed.length) { return (0, _languageHandler._t)('%(senderDisplayName)s enabled flair for %(newGroups)s and disabled flair for ' + '%(oldGroups)s in this room.', { senderDisplayName, newGroups: added.join(', '), oldGroups: removed.join(', ') }); } else { // Don't bother rendering this change (because there were no changes) return ''; } } function textForServerACLEvent(ev) { const senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender(); const prevContent = ev.getPrevContent(); const current = ev.getContent(); const prev = { deny: Array.isArray(prevContent.deny) ? prevContent.deny : [], allow: Array.isArray(prevContent.allow) ? prevContent.allow : [], allow_ip_literals: !(prevContent.allow_ip_literals === false) }; let text = ""; if (prev.deny.length === 0 && prev.allow.length === 0) { text = (0, _languageHandler._t)("%(senderDisplayName)s set the server ACLs for this room.", { senderDisplayName }); } else { text = (0, _languageHandler._t)("%(senderDisplayName)s changed the server ACLs for this room.", { senderDisplayName }); } if (!Array.isArray(current.allow)) { current.allow = []; } // If we know for sure everyone is banned, mark the room as obliterated if (current.allow.length === 0) { return text + " " + (0, _languageHandler._t)("🎉 All servers are banned from participating! This room can no longer be used."); } return text; } function textForMessageEvent(ev) { const senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender(); let message = senderDisplayName + ': ' + ev.getContent().body; if (ev.getContent().msgtype === "m.emote") { message = "* " + senderDisplayName + " " + message; } else if (ev.getContent().msgtype === "m.image") { message = (0, _languageHandler._t)('%(senderDisplayName)s sent an image.', { senderDisplayName }); } return message; } function textForCanonicalAliasEvent(ev) { const senderName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender(); const oldAlias = ev.getPrevContent().alias; const oldAltAliases = ev.getPrevContent().alt_aliases || []; const newAlias = ev.getContent().alias; const newAltAliases = ev.getContent().alt_aliases || []; const removedAltAliases = oldAltAliases.filter(alias => !newAltAliases.includes(alias)); const addedAltAliases = newAltAliases.filter(alias => !oldAltAliases.includes(alias)); if (!removedAltAliases.length && !addedAltAliases.length) { if (newAlias) { return (0, _languageHandler._t)('%(senderName)s set the main address for this room to %(address)s.', { senderName: senderName, address: ev.getContent().alias }); } else if (oldAlias) { return (0, _languageHandler._t)('%(senderName)s removed the main address for this room.', { senderName: senderName }); } } else if (newAlias === oldAlias) { if (addedAltAliases.length && !removedAltAliases.length) { return (0, _languageHandler._t)('%(senderName)s added the alternative addresses %(addresses)s for this room.', { senderName: senderName, addresses: addedAltAliases.join(", "), count: addedAltAliases.length }); } if (removedAltAliases.length && !addedAltAliases.length) { return (0, _languageHandler._t)('%(senderName)s removed the alternative addresses %(addresses)s for this room.', { senderName: senderName, addresses: removedAltAliases.join(", "), count: removedAltAliases.length }); } if (removedAltAliases.length && addedAltAliases.length) { return (0, _languageHandler._t)('%(senderName)s changed the alternative addresses for this room.', { senderName: senderName }); } } else { // both alias and alt_aliases where modified return (0, _languageHandler._t)('%(senderName)s changed the main and alternative addresses for this room.', { senderName: senderName }); } // in case there is no difference between the two events, // say something as we can't simply hide the tile from here return (0, _languageHandler._t)('%(senderName)s changed the addresses for this room.', { senderName: senderName }); } function textForCallAnswerEvent(event) { const senderName = event.sender ? event.sender.name : (0, _languageHandler._t)('Someone'); const supported = _MatrixClientPeg.MatrixClientPeg.get().supportsVoip() ? '' : (0, _languageHandler._t)('(not supported by this browser)'); return (0, _languageHandler._t)('%(senderName)s answered the call.', { senderName }) + ' ' + supported; } function textForCallHangupEvent(event) { const senderName = event.sender ? event.sender.name : (0, _languageHandler._t)('Someone'); const eventContent = event.getContent(); let reason = ""; if (!_MatrixClientPeg.MatrixClientPeg.get().supportsVoip()) { reason = (0, _languageHandler._t)('(not supported by this browser)'); } else if (eventContent.reason) { if (eventContent.reason === "ice_failed") { // We couldn't establish a connection at all reason = (0, _languageHandler._t)('(could not connect media)'); } else if (eventContent.reason === "ice_timeout") { // We established a connection but it died reason = (0, _languageHandler._t)('(connection failed)'); } else if (eventContent.reason === "user_media_failed") { // The other side couldn't open capture devices reason = (0, _languageHandler._t)("(their device couldn't start the camera / microphone)"); } else if (eventContent.reason === "unknown_error") { // An error code the other side doesn't have a way to express // (as opposed to an error code they gave but we don't know about, // in which case we show the error code) reason = (0, _languageHandler._t)("(an error occurred)"); } else if (eventContent.reason === "invite_timeout") { reason = (0, _languageHandler._t)('(no answer)'); } else if (eventContent.reason === "user hangup" || eventContent.reason === "user_hangup") { // workaround for https://github.com/vector-im/element-web/issues/5178 // it seems Android randomly sets a reason of "user hangup" which is // interpreted as an error code :( // https://github.com/vector-im/riot-android/issues/2623 // Also the correct hangup code as of VoIP v1 (with underscore) reason = ''; } else { reason = (0, _languageHandler._t)('(unknown failure: %(reason)s)', { reason: eventContent.reason }); } } return (0, _languageHandler._t)('%(senderName)s ended the call.', { senderName }) + ' ' + reason; } function textForCallRejectEvent(event) { const senderName = event.sender ? event.sender.name : (0, _languageHandler._t)('Someone'); return (0, _languageHandler._t)('%(senderName)s declined the call.', { senderName }); } function textForCallInviteEvent(event) { const senderName = event.sender ? event.sender.name : (0, _languageHandler._t)('Someone'); // FIXME: Find a better way to determine this from the event? let isVoice = true; if (event.getContent().offer && event.getContent().offer.sdp && event.getContent().offer.sdp.indexOf('m=video') !== -1) { isVoice = false; } const isSupported = _MatrixClientPeg.MatrixClientPeg.get().supportsVoip(); // This ladder could be reduced down to a couple string variables, however other languages // can have a hard time translating those strings. In an effort to make translations easier // and more accurate, we break out the string-based variables to a couple booleans. if (isVoice && isSupported) { return (0, _languageHandler._t)("%(senderName)s placed a voice call.", { senderName }); } else if (isVoice && !isSupported) { return (0, _languageHandler._t)("%(senderName)s placed a voice call. (not supported by this browser)", { senderName }); } else if (!isVoice && isSupported) { return (0, _languageHandler._t)("%(senderName)s placed a video call.", { senderName }); } else if (!isVoice && !isSupported) { return (0, _languageHandler._t)("%(senderName)s placed a video call. (not supported by this browser)", { senderName }); } } function textForThreePidInviteEvent(event) { const senderName = event.sender ? event.sender.name : event.getSender(); if (!(0, _RoomInvite.isValid3pidInvite)(event)) { const targetDisplayName = event.getPrevContent().display_name || (0, _languageHandler._t)("Someone"); return (0, _languageHandler._t)('%(senderName)s revoked the invitation for %(targetDisplayName)s to join the room.', { senderName, targetDisplayName }); } return (0, _languageHandler._t)('%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.', { senderName, targetDisplayName: event.getContent().display_name }); } function textForHistoryVisibilityEvent(event) { const senderName = event.sender ? event.sender.name : event.getSender(); switch (event.getContent().history_visibility) { case 'invited': return (0, _languageHandler._t)('%(senderName)s made future room history visible to all room members, ' + 'from the point they are invited.', { senderName }); case 'joined': return (0, _languageHandler._t)('%(senderName)s made future room history visible to all room members, ' + 'from the point they joined.', { senderName }); case 'shared': return (0, _languageHandler._t)('%(senderName)s made future room history visible to all room members.', { senderName }); case 'world_readable': return (0, _languageHandler._t)('%(senderName)s made future room history visible to anyone.', { senderName }); default: return (0, _languageHandler._t)('%(senderName)s made future room history visible to unknown (%(visibility)s).', { senderName, visibility: event.getContent().history_visibility }); } } // Currently will only display a change if a user's power level is changed function textForPowerEvent(event) { const senderName = event.sender ? event.sender.name : event.getSender(); if (!event.getPrevContent() || !event.getPrevContent().users || !event.getContent() || !event.getContent().users) { return ''; } const userDefault = event.getContent().users_default || 0; // Construct set of userIds const users = []; Object.keys(event.getContent().users).forEach(userId => { if (users.indexOf(userId) === -1) users.push(userId); }); Object.keys(event.getPrevContent().users).forEach(userId => { if (users.indexOf(userId) === -1) users.push(userId); }); const diff = []; // XXX: This is also surely broken for i18n users.forEach(userId => { // Previous power level const from = event.getPrevContent().users[userId]; // Current power level const to = event.getContent().users[userId]; if (to !== from) { diff.push((0, _languageHandler._t)('%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s', { userId, fromPowerLevel: Roles.textualPowerLevel(from, userDefault), toPowerLevel: Roles.textualPowerLevel(to, userDefault) })); } }); if (!diff.length) { return ''; } return (0, _languageHandler._t)('%(senderName)s changed the power level of %(powerLevelDiffText)s.', { senderName, powerLevelDiffText: diff.join(", ") }); } function textForPinnedEvent(event) { const senderName = event.sender ? event.sender.name : event.getSender(); return (0, _languageHandler._t)("%(senderName)s changed the pinned messages for the room.", { senderName }); } function textForWidgetEvent(event) { const senderName = event.getSender(); const { name: prevName, type: prevType, url: prevUrl } = event.getPrevContent(); const { name, type, url } = event.getContent() || {}; let widgetName = name || prevName || type || prevType || ''; // Apply sentence case to widget name if (widgetName && widgetName.length > 0) { widgetName = widgetName[0].toUpperCase() + widgetName.slice(1); } // If the widget was removed, its content should be {}, but this is sufficiently // equivalent to that condition. if (url) { if (prevUrl) { return (0, _languageHandler._t)('%(widgetName)s widget modified by %(senderName)s', { widgetName, senderName }); } else { return (0, _languageHandler._t)('%(widgetName)s widget added by %(senderName)s', { widgetName, senderName }); } } else { return (0, _languageHandler._t)('%(widgetName)s widget removed by %(senderName)s', { widgetName, senderName }); } } function textForWidgetLayoutEvent(event) { const senderName = event.sender?.name || event.getSender(); return (0, _languageHandler._t)("%(senderName)s has updated the widget layout", { senderName }); } function textForMjolnirEvent(event) { const senderName = event.getSender(); const { entity: prevEntity } = event.getPrevContent(); const { entity, recommendation, reason } = event.getContent(); // Rule removed if (!entity) { if (_BanList.USER_RULE_TYPES.includes(event.getType())) { return (0, _languageHandler._t)("%(senderName)s removed the rule banning users matching %(glob)s", { senderName, glob: prevEntity }); } else if (_BanList.ROOM_RULE_TYPES.includes(event.getType())) { return (0, _languageHandler._t)("%(senderName)s removed the rule banning rooms matching %(glob)s", { senderName, glob: prevEntity }); } else if (_BanList.SERVER_RULE_TYPES.includes(event.getType())) { return (0, _languageHandler._t)("%(senderName)s removed the rule banning servers matching %(glob)s", { senderName, glob: prevEntity }); } // Unknown type. We'll say something, but we shouldn't end up here. return (0, _languageHandler._t)("%(senderName)s removed a ban rule matching %(glob)s", { senderName, glob: prevEntity }); } // Invalid rule if (!recommendation || !reason) return (0, _languageHandler._t)(`%(senderName)s updated an invalid ban rule`, { senderName }); // Rule updated if (entity === prevEntity) { if (_BanList.USER_RULE_TYPES.includes(event.getType())) { return (0, _languageHandler._t)("%(senderName)s updated the rule banning users matching %(glob)s for %(reason)s", { senderName, glob: entity, reason }); } else if (_BanList.ROOM_RULE_TYPES.includes(event.getType())) { return (0, _languageHandler._t)("%(senderName)s updated the rule banning rooms matching %(glob)s for %(reason)s", { senderName, glob: entity, reason }); } else if (_BanList.SERVER_RULE_TYPES.includes(event.getType())) { return (0, _languageHandler._t)("%(senderName)s updated the rule banning servers matching %(glob)s for %(reason)s", { senderName, glob: entity, reason }); } // Unknown type. We'll say something but we shouldn't end up here. return (0, _languageHandler._t)("%(senderName)s updated a ban rule matching %(glob)s for %(reason)s", { senderName, glob: entity, reason }); } // New rule if (!prevEntity) { if (_BanList.USER_RULE_TYPES.includes(event.getType())) { return (0, _languageHandler._t)("%(senderName)s created a rule banning users matching %(glob)s for %(reason)s", { senderName, glob: entity, reason }); } else if (_BanList.ROOM_RULE_TYPES.includes(event.getType())) { return (0, _languageHandler._t)("%(senderName)s created a rule banning rooms matching %(glob)s for %(reason)s", { senderName, glob: entity, reason }); } else if (_BanList.SERVER_RULE_TYPES.includes(event.getType())) { return (0, _languageHandler._t)("%(senderName)s created a rule banning servers matching %(glob)s for %(reason)s", { senderName, glob: entity, reason }); } // Unknown type. We'll say something but we shouldn't end up here. return (0, _languageHandler._t)("%(senderName)s created a ban rule matching %(glob)s for %(reason)s", { senderName, glob: entity, reason }); } // else the entity !== prevEntity - count as a removal & add if (_BanList.USER_RULE_TYPES.includes(event.getType())) { return (0, _languageHandler._t)("%(senderName)s changed a rule that was banning users matching %(oldGlob)s to matching " + "%(newGlob)s for %(reason)s", { senderName, oldGlob: prevEntity, newGlob: entity, reason }); } else if (_BanList.ROOM_RULE_TYPES.includes(event.getType())) { return (0, _languageHandler._t)("%(senderName)s changed a rule that was banning rooms matching %(oldGlob)s to matching " + "%(newGlob)s for %(reason)s", { senderName, oldGlob: prevEntity, newGlob: entity, reason }); } else if (_BanList.SERVER_RULE_TYPES.includes(event.getType())) { return (0, _languageHandler._t)("%(senderName)s changed a rule that was banning servers matching %(oldGlob)s to matching " + "%(newGlob)s for %(reason)s", { senderName, oldGlob: prevEntity, newGlob: entity, reason }); } // Unknown type. We'll say something but we shouldn't end up here. return (0, _languageHandler._t)("%(senderName)s updated a ban rule that was matching %(oldGlob)s to matching %(newGlob)s " + "for %(reason)s", { senderName, oldGlob: prevEntity, newGlob: entity, reason }); } const handlers = { 'm.room.message': textForMessageEvent, 'm.call.invite': textForCallInviteEvent, 'm.call.answer': textForCallAnswerEvent, 'm.call.hangup': textForCallHangupEvent, 'm.call.reject': textForCallRejectEvent }; const stateHandlers = { 'm.room.canonical_alias': textForCanonicalAliasEvent, 'm.room.name': textForRoomNameEvent, 'm.room.topic': textForTopicEvent, 'm.room.member': textForMemberEvent, 'm.room.third_party_invite': textForThreePidInviteEvent, 'm.room.history_visibility': textForHistoryVisibilityEvent, 'm.room.power_levels': textForPowerEvent, 'm.room.pinned_events': textForPinnedEvent, 'm.room.server_acl': textForServerACLEvent, 'm.room.tombstone': textForTombstoneEvent, 'm.room.join_rules': textForJoinRulesEvent, 'm.room.guest_access': textForGuestAccessEvent, 'm.room.related_groups': textForRelatedGroupsEvent, // TODO: Enable support for m.widget event type (https://github.com/vector-im/element-web/issues/13111) 'im.vector.modular.widgets': textForWidgetEvent, [_WidgetLayoutStore.WIDGET_LAYOUT_EVENT_TYPE]: textForWidgetLayoutEvent }; // Add all the Mjolnir stuff to the renderer for (const evType of _BanList.ALL_RULE_TYPES) { stateHandlers[evType] = textForMjolnirEvent; } function textForEvent(ev) { const handler = (ev.isState() ? stateHandlers : handlers)[ev.getType()]; if (handler) return handler(ev); return ''; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9UZXh0Rm9yRXZlbnQuanMiXSwibmFtZXMiOlsidGV4dEZvck1lbWJlckV2ZW50IiwiZXYiLCJzZW5kZXJOYW1lIiwic2VuZGVyIiwibmFtZSIsImdldFNlbmRlciIsInRhcmdldE5hbWUiLCJ0YXJnZXQiLCJnZXRTdGF0ZUtleSIsInByZXZDb250ZW50IiwiZ2V0UHJldkNvbnRlbnQiLCJjb250ZW50IiwiZ2V0Q29udGVudCIsInJlYXNvbiIsIm1lbWJlcnNoaXAiLCJ0aHJlZVBpZENvbnRlbnQiLCJ0aGlyZF9wYXJ0eV9pbnZpdGUiLCJkaXNwbGF5X25hbWUiLCJkaXNwbGF5TmFtZSIsImRpc3BsYXluYW1lIiwib2xkRGlzcGxheU5hbWUiLCJhdmF0YXJfdXJsIiwiU2V0dGluZ3NTdG9yZSIsImdldFZhbHVlIiwiY29uc29sZSIsIndhcm4iLCJzdGF0ZV9rZXkiLCJ0ZXh0Rm9yVG9waWNFdmVudCIsInNlbmRlckRpc3BsYXlOYW1lIiwidG9waWMiLCJ0ZXh0Rm9yUm9vbU5hbWVFdmVudCIsInRyaW0iLCJsZW5ndGgiLCJvbGRSb29tTmFtZSIsIm5ld1Jvb21OYW1lIiwicm9vbU5hbWUiLCJ0ZXh0Rm9yVG9tYnN0b25lRXZlbnQiLCJ0ZXh0Rm9ySm9pblJ1bGVzRXZlbnQiLCJqb2luX3J1bGUiLCJydWxlIiwidGV4dEZvckd1ZXN0QWNjZXNzRXZlbnQiLCJndWVzdF9hY2Nlc3MiLCJ0ZXh0Rm9yUmVsYXRlZEdyb3Vwc0V2ZW50IiwiZ3JvdXBzIiwicHJldkdyb3VwcyIsImFkZGVkIiwiZmlsdGVyIiwiZyIsImluY2x1ZGVzIiwicmVtb3ZlZCIsImpvaW4iLCJuZXdHcm91cHMiLCJvbGRHcm91cHMiLCJ0ZXh0Rm9yU2VydmVyQUNMRXZlbnQiLCJjdXJyZW50IiwicHJldiIsImRlbnkiLCJBcnJheSIsImlzQXJyYXkiLCJhbGxvdyIsImFsbG93X2lwX2xpdGVyYWxzIiwidGV4dCIsInRleHRGb3JNZXNzYWdlRXZlbnQiLCJtZXNzYWdlIiwiYm9keSIsIm1zZ3R5cGUiLCJ0ZXh0Rm9yQ2Fub25pY2FsQWxpYXNFdmVudCIsIm9sZEFsaWFzIiwiYWxpYXMiLCJvbGRBbHRBbGlhc2VzIiwiYWx0X2FsaWFzZXMiLCJuZXdBbGlhcyIsIm5ld0FsdEFsaWFzZXMiLCJyZW1vdmVkQWx0QWxpYXNlcyIsImFkZGVkQWx0QWxpYXNlcyIsImFkZHJlc3MiLCJhZGRyZXNzZXMiLCJjb3VudCIsInRleHRGb3JDYWxsQW5zd2VyRXZlbnQiLCJldmVudCIsInN1cHBvcnRlZCIsIk1hdHJpeENsaWVudFBlZyIsImdldCIsInN1cHBvcnRzVm9pcCIsInRleHRGb3JDYWxsSGFuZ3VwRXZlbnQiLCJldmVudENvbnRlbnQiLCJ0ZXh0Rm9yQ2FsbFJlamVjdEV2ZW50IiwidGV4dEZvckNhbGxJbnZpdGVFdmVudCIsImlzVm9pY2UiLCJvZmZlciIsInNkcCIsImluZGV4T2YiLCJpc1N1cHBvcnRlZCIsInRleHRGb3JUaHJlZVBpZEludml0ZUV2ZW50IiwidGFyZ2V0RGlzcGxheU5hbWUiLCJ0ZXh0Rm9ySGlzdG9yeVZpc2liaWxpdHlFdmVudCIsImhpc3RvcnlfdmlzaWJpbGl0eSIsInZpc2liaWxpdHkiLCJ0ZXh0Rm9yUG93ZXJFdmVudCIsInVzZXJzIiwidXNlckRlZmF1bHQiLCJ1c2Vyc19kZWZhdWx0IiwiT2JqZWN0Iiwia2V5cyIsImZvckVhY2giLCJ1c2VySWQiLCJwdXNoIiwiZGlmZiIsImZyb20iLCJ0byIsImZyb21Qb3dlckxldmVsIiwiUm9sZXMiLCJ0ZXh0dWFsUG93ZXJMZXZlbCIsInRvUG93ZXJMZXZlbCIsInBvd2VyTGV2ZWxEaWZmVGV4dCIsInRleHRGb3JQaW5uZWRFdmVudCIsInRleHRGb3JXaWRnZXRFdmVudCIsInByZXZOYW1lIiwidHlwZSIsInByZXZUeXBlIiwidXJsIiwicHJldlVybCIsIndpZGdldE5hbWUiLCJ0b1VwcGVyQ2FzZSIsInNsaWNlIiwidGV4dEZvcldpZGdldExheW91dEV2ZW50IiwidGV4dEZvck1qb2xuaXJFdmVudCIsImVudGl0eSIsInByZXZFbnRpdHkiLCJyZWNvbW1lbmRhdGlvbiIsIlVTRVJfUlVMRV9UWVBFUyIsImdldFR5cGUiLCJnbG9iIiwiUk9PTV9SVUxFX1RZUEVTIiwiU0VSVkVSX1JVTEVfVFlQRVMiLCJvbGRHbG9iIiwibmV3R2xvYiIsImhhbmRsZXJzIiwic3RhdGVIYW5kbGVycyIsIldJREdFVF9MQVlPVVRfRVZFTlRfVFlQRSIsImV2VHlwZSIsIkFMTF9SVUxFX1RZUEVTIiwidGV4dEZvckV2ZW50IiwiaGFuZGxlciIsImlzU3RhdGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBZUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVNBLFNBQVNBLGtCQUFULENBQTRCQyxFQUE1QixFQUFnQztBQUM1QjtBQUNBLFFBQU1DLFVBQVUsR0FBR0QsRUFBRSxDQUFDRSxNQUFILEdBQVlGLEVBQUUsQ0FBQ0UsTUFBSCxDQUFVQyxJQUF0QixHQUE2QkgsRUFBRSxDQUFDSSxTQUFILEVBQWhEO0FBQ0EsUUFBTUMsVUFBVSxHQUFHTCxFQUFFLENBQUNNLE1BQUgsR0FBWU4sRUFBRSxDQUFDTSxNQUFILENBQVVILElBQXRCLEdBQTZCSCxFQUFFLENBQUNPLFdBQUgsRUFBaEQ7QUFDQSxRQUFNQyxXQUFXLEdBQUdSLEVBQUUsQ0FBQ1MsY0FBSCxFQUFwQjtBQUNBLFFBQU1DLE9BQU8sR0FBR1YsRUFBRSxDQUFDVyxVQUFILEVBQWhCO0FBRUEsUUFBTUMsTUFBTSxHQUFHRixPQUFPLENBQUNFLE1BQVIsR0FBa0IseUJBQUcsUUFBSCxJQUFlLElBQWYsR0FBc0JGLE9BQU8sQ0FBQ0UsTUFBaEQsR0FBMEQsRUFBekU7O0FBQ0EsVUFBUUYsT0FBTyxDQUFDRyxVQUFoQjtBQUNJLFNBQUssUUFBTDtBQUFlO0FBQ1gsY0FBTUMsZUFBZSxHQUFHSixPQUFPLENBQUNLLGtC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