UNPKG

matrix-react-sdk

Version:
128 lines (124 loc) 18.4 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.KeyBindingsManager = void 0; exports.getKeyBindingsManager = getKeyBindingsManager; exports.isKeyComboMatch = isKeyComboMatch; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _KeyBindingsDefaults = require("./KeyBindingsDefaults"); var _Keyboard = require("./Keyboard"); /* Copyright 2024 New Vector Ltd. Copyright 2022 Šimon Brandner <simon.bra.ag@gmail.com> Copyright 2021 Clemens Zeidler SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ /** * Represent a key combination. * * The combo is evaluated strictly, i.e. the KeyboardEvent must match exactly what is specified in the KeyCombo. */ /** * Helper method to check if a KeyboardEvent matches a KeyCombo * * Note, this method is only exported for testing. */ function isKeyComboMatch(ev, combo, onMac) { if (combo.key !== undefined) { // When shift is pressed, letters are returned as upper case chars. In this case do a lower case comparison. // This works for letter combos such as shift + U as well for none letter combos such as shift + Escape. // If shift is not pressed, the toLowerCase conversion can be avoided. if (ev.shiftKey) { if (ev.key.toLowerCase() !== combo.key.toLowerCase()) { return false; } } else if (ev.key !== combo.key) { return false; } } const comboCtrl = combo.ctrlKey ?? false; const comboAlt = combo.altKey ?? false; const comboShift = combo.shiftKey ?? false; const comboMeta = combo.metaKey ?? false; // Tests mock events may keep the modifiers undefined; convert them to booleans const evCtrl = ev.ctrlKey ?? false; const evAlt = ev.altKey ?? false; const evShift = ev.shiftKey ?? false; const evMeta = ev.metaKey ?? false; // When ctrlOrCmd is set, the keys need do evaluated differently on PC and Mac if (combo.ctrlOrCmdKey) { if (onMac) { if (!evMeta || evCtrl !== comboCtrl || evAlt !== comboAlt || evShift !== comboShift) { return false; } } else { if (!evCtrl || evMeta !== comboMeta || evAlt !== comboAlt || evShift !== comboShift) { return false; } } return true; } if (evMeta !== comboMeta || evCtrl !== comboCtrl || evAlt !== comboAlt || evShift !== comboShift) { return false; } return true; } class KeyBindingsManager { constructor() { /** * List of key bindings providers. * * Key bindings from the first provider(s) in the list will have precedence over key bindings from later providers. * * To overwrite the default key bindings add a new providers before the default provider, e.g. a provider for * customized key bindings. */ (0, _defineProperty2.default)(this, "bindingsProviders", [_KeyBindingsDefaults.defaultBindingsProvider]); } /** * Finds a matching KeyAction for a given KeyboardEvent */ getAction(getters, ev) { for (const getter of getters) { const bindings = getter(); const binding = bindings.find(it => isKeyComboMatch(ev, it.keyCombo, _Keyboard.IS_MAC)); if (binding) { return binding.action; } } return undefined; } getMessageComposerAction(ev) { return this.getAction(this.bindingsProviders.map(it => it.getMessageComposerBindings), ev); } getAutocompleteAction(ev) { return this.getAction(this.bindingsProviders.map(it => it.getAutocompleteBindings), ev); } getRoomListAction(ev) { return this.getAction(this.bindingsProviders.map(it => it.getRoomListBindings), ev); } getRoomAction(ev) { return this.getAction(this.bindingsProviders.map(it => it.getRoomBindings), ev); } getNavigationAction(ev) { return this.getAction(this.bindingsProviders.map(it => it.getNavigationBindings), ev); } getAccessibilityAction(ev) { return this.getAction(this.bindingsProviders.map(it => it.getAccessibilityBindings), ev); } getCallAction(ev) { return this.getAction(this.bindingsProviders.map(it => it.getCallBindings), ev); } getLabsAction(ev) { return this.getAction(this.bindingsProviders.map(it => it.getLabsBindings), ev); } } exports.KeyBindingsManager = KeyBindingsManager; const manager = new KeyBindingsManager(); function getKeyBindingsManager() { return manager; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfS2V5QmluZGluZ3NEZWZhdWx0cyIsInJlcXVpcmUiLCJfS2V5Ym9hcmQiLCJpc0tleUNvbWJvTWF0Y2giLCJldiIsImNvbWJvIiwib25NYWMiLCJrZXkiLCJ1bmRlZmluZWQiLCJzaGlmdEtleSIsInRvTG93ZXJDYXNlIiwiY29tYm9DdHJsIiwiY3RybEtleSIsImNvbWJvQWx0IiwiYWx0S2V5IiwiY29tYm9TaGlmdCIsImNvbWJvTWV0YSIsIm1ldGFLZXkiLCJldkN0cmwiLCJldkFsdCIsImV2U2hpZnQiLCJldk1ldGEiLCJjdHJsT3JDbWRLZXkiLCJLZXlCaW5kaW5nc01hbmFnZXIiLCJjb25zdHJ1Y3RvciIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJkZWZhdWx0IiwiZGVmYXVsdEJpbmRpbmdzUHJvdmlkZXIiLCJnZXRBY3Rpb24iLCJnZXR0ZXJzIiwiZ2V0dGVyIiwiYmluZGluZ3MiLCJiaW5kaW5nIiwiZmluZCIsIml0Iiwia2V5Q29tYm8iLCJJU19NQUMiLCJhY3Rpb24iLCJnZXRNZXNzYWdlQ29tcG9zZXJBY3Rpb24iLCJiaW5kaW5nc1Byb3ZpZGVycyIsIm1hcCIsImdldE1lc3NhZ2VDb21wb3NlckJpbmRpbmdzIiwiZ2V0QXV0b2NvbXBsZXRlQWN0aW9uIiwiZ2V0QXV0b2NvbXBsZXRlQmluZGluZ3MiLCJnZXRSb29tTGlzdEFjdGlvbiIsImdldFJvb21MaXN0QmluZGluZ3MiLCJnZXRSb29tQWN0aW9uIiwiZ2V0Um9vbUJpbmRpbmdzIiwiZ2V0TmF2aWdhdGlvbkFjdGlvbiIsImdldE5hdmlnYXRpb25CaW5kaW5ncyIsImdldEFjY2Vzc2liaWxpdHlBY3Rpb24iLCJnZXRBY2Nlc3NpYmlsaXR5QmluZGluZ3MiLCJnZXRDYWxsQWN0aW9uIiwiZ2V0Q2FsbEJpbmRpbmdzIiwiZ2V0TGFic0FjdGlvbiIsImdldExhYnNCaW5kaW5ncyIsImV4cG9ydHMiLCJtYW5hZ2VyIiwiZ2V0S2V5QmluZGluZ3NNYW5hZ2VyIl0sInNvdXJjZXMiOlsiLi4vc3JjL0tleUJpbmRpbmdzTWFuYWdlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAyMiDFoGltb24gQnJhbmRuZXIgPHNpbW9uLmJyYS5hZ0BnbWFpbC5jb20+XG5Db3B5cmlnaHQgMjAyMSBDbGVtZW5zIFplaWRsZXJcblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IHsgS2V5QmluZGluZ0FjdGlvbiB9IGZyb20gXCIuL2FjY2Vzc2liaWxpdHkvS2V5Ym9hcmRTaG9ydGN1dHNcIjtcbmltcG9ydCB7IGRlZmF1bHRCaW5kaW5nc1Byb3ZpZGVyIH0gZnJvbSBcIi4vS2V5QmluZGluZ3NEZWZhdWx0c1wiO1xuaW1wb3J0IHsgSVNfTUFDIH0gZnJvbSBcIi4vS2V5Ym9hcmRcIjtcblxuLyoqXG4gKiBSZXByZXNlbnQgYSBrZXkgY29tYmluYXRpb24uXG4gKlxuICogVGhlIGNvbWJvIGlzIGV2YWx1YXRlZCBzdHJpY3RseSwgaS5lLiB0aGUgS2V5Ym9hcmRFdmVudCBtdXN0IG1hdGNoIGV4YWN0bHkgd2hhdCBpcyBzcGVjaWZpZWQgaW4gdGhlIEtleUNvbWJvLlxuICovXG5leHBvcnQgdHlwZSBLZXlDb21ibyA9IHtcbiAgICBrZXk6IHN0cmluZztcblxuICAgIC8qKiBPbiBQQzogY3RybCBpcyBwcmVzc2VkOyBvbiBNYWM6IG1ldGEgaXMgcHJlc3NlZCAqL1xuICAgIGN0cmxPckNtZEtleT86IGJvb2xlYW47XG5cbiAgICBhbHRLZXk/OiBib29sZWFuO1xuICAgIGN0cmxLZXk/OiBib29sZWFuO1xuICAgIG1ldGFLZXk/OiBib29sZWFuO1xuICAgIHNoaWZ0S2V5PzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIEtleUJpbmRpbmcgPSB7XG4gICAgYWN0aW9uOiBLZXlCaW5kaW5nQWN0aW9uO1xuICAgIGtleUNvbWJvOiBLZXlDb21ibztcbn07XG5cbi8qKlxuICogSGVscGVyIG1ldGhvZCB0byBjaGVjayBpZiBhIEtleWJvYXJkRXZlbnQgbWF0Y2hlcyBhIEtleUNvbWJvXG4gKlxuICogTm90ZSwgdGhpcyBtZXRob2QgaXMgb25seSBleHBvcnRlZCBmb3IgdGVzdGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzS2V5Q29tYm9NYXRjaChldjogS2V5Ym9hcmRFdmVudCB8IFJlYWN0LktleWJvYXJkRXZlbnQsIGNvbWJvOiBLZXlDb21ibywgb25NYWM6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICBpZiAoY29tYm8ua2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gV2hlbiBzaGlmdCBpcyBwcmVzc2VkLCBsZXR0ZXJzIGFyZSByZXR1cm5lZCBhcyB1cHBlciBjYXNlIGNoYXJzLiBJbiB0aGlzIGNhc2UgZG8gYSBsb3dlciBjYXNlIGNvbXBhcmlzb24uXG4gICAgICAgIC8vIFRoaXMgd29ya3MgZm9yIGxldHRlciBjb21ib3Mgc3VjaCBhcyBzaGlmdCArIFUgYXMgd2VsbCBmb3Igbm9uZSBsZXR0ZXIgY29tYm9zIHN1Y2ggYXMgc2hpZnQgKyBFc2NhcGUuXG4gICAgICAgIC8vIElmIHNoaWZ0IGlzIG5vdCBwcmVzc2VkLCB0aGUgdG9Mb3dlckNhc2UgY29udmVyc2lvbiBjYW4gYmUgYXZvaWRlZC5cbiAgICAgICAgaWYgKGV2LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICBpZiAoZXYua2V5LnRvTG93ZXJDYXNlKCkgIT09IGNvbWJvLmtleS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGV2LmtleSAhPT0gY29tYm8ua2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb21ib0N0cmwgPSBjb21iby5jdHJsS2V5ID8/IGZhbHNlO1xuICAgIGNvbnN0IGNvbWJvQWx0ID0gY29tYm8uYWx0S2V5ID8/IGZhbHNlO1xuICAgIGNvbnN0IGNvbWJvU2hpZnQgPSBjb21iby5zaGlmdEtleSA/PyBmYWxzZTtcbiAgICBjb25zdCBjb21ib01ldGEgPSBjb21iby5tZXRhS2V5ID8/IGZhbHNlO1xuICAgIC8vIFRlc3RzIG1vY2sgZXZlbnRzIG1heSBrZWVwIHRoZSBtb2RpZmllcnMgdW5kZWZpbmVkOyBjb252ZXJ0IHRoZW0gdG8gYm9vbGVhbnNcbiAgICBjb25zdCBldkN0cmwgPSBldi5jdHJsS2V5ID8/IGZhbHNlO1xuICAgIGNvbnN0IGV2QWx0ID0gZXYuYWx0S2V5ID8/IGZhbHNlO1xuICAgIGNvbnN0IGV2U2hpZnQgPSBldi5zaGlmdEtleSA/PyBmYWxzZTtcbiAgICBjb25zdCBldk1ldGEgPSBldi5tZXRhS2V5ID8/IGZhbHNlO1xuICAgIC8vIFdoZW4gY3RybE9yQ21kIGlzIHNldCwgdGhlIGtleXMgbmVlZCBkbyBldmFsdWF0ZWQgZGlmZmVyZW50bHkgb24gUEMgYW5kIE1hY1xuICAgIGlmIChjb21iby5jdHJsT3JDbWRLZXkpIHtcbiAgICAgICAgaWYgKG9uTWFjKSB7XG4gICAgICAgICAgICBpZiAoIWV2TWV0YSB8fCBldkN0cmwgIT09IGNvbWJvQ3RybCB8fCBldkFsdCAhPT0gY29tYm9BbHQgfHwgZXZTaGlmdCAhPT0gY29tYm9TaGlmdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghZXZDdHJsIHx8IGV2TWV0YSAhPT0gY29tYm9NZXRhIHx8IGV2QWx0ICE9PSBjb21ib0FsdCB8fCBldlNoaWZ0ICE9PSBjb21ib1NoaWZ0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChldk1ldGEgIT09IGNvbWJvTWV0YSB8fCBldkN0cmwgIT09IGNvbWJvQ3RybCB8fCBldkFsdCAhPT0gY29tYm9BbHQgfHwgZXZTaGlmdCAhPT0gY29tYm9TaGlmdCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCB0eXBlIEtleUJpbmRpbmdHZXR0ZXIgPSAoKSA9PiBLZXlCaW5kaW5nW107XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUtleUJpbmRpbmdzUHJvdmlkZXIge1xuICAgIFtrZXk6IHN0cmluZ106IEtleUJpbmRpbmdHZXR0ZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBLZXlCaW5kaW5nc01hbmFnZXIge1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2Yga2V5IGJpbmRpbmdzIHByb3ZpZGVycy5cbiAgICAgKlxuICAgICAqIEtleSBiaW5kaW5ncyBmcm9tIHRoZSBmaXJzdCBwcm92aWRlcihzKSBpbiB0aGUgbGlzdCB3aWxsIGhhdmUgcHJlY2VkZW5jZSBvdmVyIGtleSBiaW5kaW5ncyBmcm9tIGxhdGVyIHByb3ZpZGVycy5cbiAgICAgKlxuICAgICAqIFRvIG92ZXJ3cml0ZSB0aGUgZGVmYXVsdCBrZXkgYmluZGluZ3MgYWRkIGEgbmV3IHByb3ZpZGVycyBiZWZvcmUgdGhlIGRlZmF1bHQgcHJvdmlkZXIsIGUuZy4gYSBwcm92aWRlciBmb3JcbiAgICAgKiBjdXN0b21pemVkIGtleSBiaW5kaW5ncy5cbiAgICAgKi9cbiAgICBwdWJsaWMgYmluZGluZ3NQcm92aWRlcnM6IElLZXlCaW5kaW5nc1Byb3ZpZGVyW10gPSBbZGVmYXVsdEJpbmRpbmdzUHJvdmlkZXJdO1xuXG4gICAgLyoqXG4gICAgICogRmluZHMgYSBtYXRjaGluZyBLZXlBY3Rpb24gZm9yIGEgZ2l2ZW4gS2V5Ym9hcmRFdmVudFxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0QWN0aW9uKFxuICAgICAgICBnZXR0ZXJzOiBLZXlCaW5kaW5nR2V0dGVyW10sXG4gICAgICAgIGV2OiBLZXlib2FyZEV2ZW50IHwgUmVhY3QuS2V5Ym9hcmRFdmVudCxcbiAgICApOiBLZXlCaW5kaW5nQWN0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgZm9yIChjb25zdCBnZXR0ZXIgb2YgZ2V0dGVycykge1xuICAgICAgICAgICAgY29uc3QgYmluZGluZ3MgPSBnZXR0ZXIoKTtcbiAgICAgICAgICAgIGNvbnN0IGJpbmRpbmcgPSBiaW5kaW5ncy5maW5kKChpdCkgPT4gaXNLZXlDb21ib01hdGNoKGV2LCBpdC5rZXlDb21ibywgSVNfTUFDKSk7XG4gICAgICAgICAgICBpZiAoYmluZGluZykge1xuICAgICAgICAgICAgICAgIHJldHVybiBiaW5kaW5nLmFjdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRNZXNzYWdlQ29tcG9zZXJBY3Rpb24oZXY6IEtleWJvYXJkRXZlbnQgfCBSZWFjdC5LZXlib2FyZEV2ZW50KTogS2V5QmluZGluZ0FjdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEFjdGlvbihcbiAgICAgICAgICAgIHRoaXMuYmluZGluZ3NQcm92aWRlcnMubWFwKChpdCkgPT4gaXQuZ2V0TWVzc2FnZUNvbXBvc2VyQmluZGluZ3MpLFxuICAgICAgICAgICAgZXYsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEF1dG9jb21wbGV0ZUFjdGlvbihldjogS2V5Ym9hcmRFdmVudCB8IFJlYWN0LktleWJvYXJkRXZlbnQpOiBLZXlCaW5kaW5nQWN0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWN0aW9uKFxuICAgICAgICAgICAgdGhpcy5iaW5kaW5nc1Byb3ZpZGVycy5tYXAoKGl0KSA9PiBpdC5nZXRBdXRvY29tcGxldGVCaW5kaW5ncyksXG4gICAgICAgICAgICBldixcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Um9vbUxpc3RBY3Rpb24oZXY6IEtleWJvYXJkRXZlbnQgfCBSZWFjdC5LZXlib2FyZEV2ZW50KTogS2V5QmluZGluZ0FjdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEFjdGlvbihcbiAgICAgICAgICAgIHRoaXMuYmluZGluZ3NQcm92aWRlcnMubWFwKChpdCkgPT4gaXQuZ2V0Um9vbUxpc3RCaW5kaW5ncyksXG4gICAgICAgICAgICBldixcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Um9vbUFjdGlvbihldjogS2V5Ym9hcmRFdmVudCB8IFJlYWN0LktleWJvYXJkRXZlbnQpOiBLZXlCaW5kaW5nQWN0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWN0aW9uKFxuICAgICAgICAgICAgdGhpcy5iaW5kaW5nc1Byb3ZpZGVycy5tYXAoKGl0KSA9PiBpdC5nZXRSb29tQmluZGluZ3MpLFxuICAgICAgICAgICAgZXYsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE5hdmlnYXRpb25BY3Rpb24oZXY6IEtleWJvYXJkRXZlbnQgfCBSZWFjdC5LZXlib2FyZEV2ZW50KTogS2V5QmluZGluZ0FjdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEFjdGlvbihcbiAgICAgICAgICAgIHRoaXMuYmluZGluZ3NQcm92aWRlcnMubWFwKChpdCkgPT4gaXQuZ2V0TmF2aWdhdGlvbkJpbmRpbmdzKSxcbiAgICAgICAgICAgIGV2LFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRBY2Nlc3NpYmlsaXR5QWN0aW9uKGV2OiBLZXlib2FyZEV2ZW50IHwgUmVhY3QuS2V5Ym9hcmRFdmVudCk6IEtleUJpbmRpbmdBY3Rpb24gfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRBY3Rpb24oXG4gICAgICAgICAgICB0aGlzLmJpbmRpbmdzUHJvdmlkZXJzLm1hcCgoaXQpID0+IGl0LmdldEFjY2Vzc2liaWxpdHlCaW5kaW5ncyksXG4gICAgICAgICAgICBldixcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q2FsbEFjdGlvbihldjogS2V5Ym9hcmRFdmVudCB8IFJlYWN0LktleWJvYXJkRXZlbnQpOiBLZXlCaW5kaW5nQWN0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWN0aW9uKFxuICAgICAgICAgICAgdGhpcy5iaW5kaW5nc1Byb3ZpZGVycy5tYXAoKGl0KSA9PiBpdC5nZXRDYWxsQmluZGluZ3MpLFxuICAgICAgICAgICAgZXYsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldExhYnNBY3Rpb24oZXY6IEtleWJvYXJkRXZlbnQgfCBSZWFjdC5LZXlib2FyZEV2ZW50KTogS2V5QmluZGluZ0FjdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEFjdGlvbihcbiAgICAgICAgICAgIHRoaXMuYmluZGluZ3NQcm92aWRlcnMubWFwKChpdCkgPT4gaXQuZ2V0TGFic0JpbmRpbmdzKSxcbiAgICAgICAgICAgIGV2LFxuICAgICAgICApO1xuICAgIH1cbn1cblxuY29uc3QgbWFuYWdlciA9IG5ldyBLZXlCaW5kaW5nc01hbmFnZXIoKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEtleUJpbmRpbmdzTWFuYWdlcigpOiBLZXlCaW5kaW5nc01hbmFnZXIge1xuICAgIHJldHVybiBtYW5hZ2VyO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBVUEsSUFBQUEsb0JBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLFNBQUEsR0FBQUQsT0FBQTtBQVhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFrQkE7QUFDQTtBQUNB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