matrix-react-sdk
Version:
SDK for matrix.org using React
172 lines (166 loc) • 24.8 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getPersistKey = exports.default = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireDefault(require("react"));
var _reactDom = _interopRequireDefault(require("react-dom"));
var _utils = require("matrix-js-sdk/src/utils");
var _compoundWeb = require("@vector-im/compound-web");
var _dispatcher = _interopRequireDefault(require("../../../dispatcher/dispatcher"));
var _MatrixClientContext = _interopRequireDefault(require("../../../contexts/MatrixClientContext"));
var _MatrixClientPeg = require("../../../MatrixClientPeg");
/*
Copyright 2018-2024 New Vector Ltd.
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
const getPersistKey = appId => "widget_" + appId;
// Shamelessly ripped off Modal.js. There's probably a better way
// of doing reusable widgets like dialog boxes & menus where we go and
// pass in a custom control as the actual body.
// We contain all persisted elements within a master container to allow them all to be within the same
// CSS stacking context, and thus be able to control their z-indexes relative to each other.
exports.getPersistKey = getPersistKey;
function getOrCreateMasterContainer() {
let container = getContainer("mx_PersistedElement_container");
if (!container) {
container = document.createElement("div");
container.id = "mx_PersistedElement_container";
document.body.appendChild(container);
}
return container;
}
function getContainer(containerId) {
return document.getElementById(containerId);
}
function getOrCreateContainer(containerId) {
let container = getContainer(containerId);
if (!container) {
container = document.createElement("div");
container.id = containerId;
getOrCreateMasterContainer().appendChild(container);
}
return container;
}
/**
* Class of component that renders its children in a separate ReactDOM virtual tree
* in a container element appended to document.body.
*
* This prevents the children from being unmounted when the parent of PersistedElement
* unmounts, allowing them to persist.
*
* When PE is unmounted, it hides the children using CSS. When mounted or updated, the
* children are made visible and are positioned into a div that is given the same
* bounding rect as the parent of PE.
*/
class PersistedElement extends _react.default.Component {
constructor(props) {
super(props);
(0, _defineProperty2.default)(this, "resizeObserver", void 0);
(0, _defineProperty2.default)(this, "dispatcherRef", void 0);
(0, _defineProperty2.default)(this, "childContainer", void 0);
(0, _defineProperty2.default)(this, "child", void 0);
(0, _defineProperty2.default)(this, "collectChildContainer", ref => {
if (this.childContainer) {
this.resizeObserver.unobserve(this.childContainer);
}
this.childContainer = ref;
if (ref) {
this.resizeObserver.observe(ref);
}
});
(0, _defineProperty2.default)(this, "collectChild", ref => {
this.child = ref;
this.updateChild();
});
(0, _defineProperty2.default)(this, "onAction", payload => {
if (payload.action === "timeline_resize") {
this.repositionChild();
} else if (payload.action === "logout") {
PersistedElement.destroyElement(this.props.persistKey);
}
});
(0, _defineProperty2.default)(this, "repositionChild", () => {
this.updateChildPosition(this.child, this.childContainer);
});
this.resizeObserver = new ResizeObserver(this.repositionChild);
// Annoyingly, a resize observer is insufficient, since we also care
// about when the element moves on the screen without changing its
// dimensions. Doesn't look like there's a ResizeObserver equivalent
// for this, so we bodge it by listening for document resize and
// the timeline_resize action.
window.addEventListener("resize", this.repositionChild);
this.dispatcherRef = _dispatcher.default.register(this.onAction);
if (this.props.moveRef) this.props.moveRef.current = this.repositionChild;
}
/**
* Removes the DOM elements created when a PersistedElement with the given
* persistKey was mounted. The DOM elements will be re-added if another
* PersistedElement is mounted in the future.
*
* @param {string} persistKey Key used to uniquely identify this PersistedElement
*/
static destroyElement(persistKey) {
const container = getContainer("mx_persistedElement_" + persistKey);
if (container) {
container.remove();
}
}
static isMounted(persistKey) {
return Boolean(getContainer("mx_persistedElement_" + persistKey));
}
componentDidMount() {
this.updateChild();
this.renderApp();
}
componentDidUpdate() {
this.updateChild();
this.renderApp();
}
componentWillUnmount() {
this.updateChildVisibility(this.child, false);
this.resizeObserver.disconnect();
window.removeEventListener("resize", this.repositionChild);
_dispatcher.default.unregister(this.dispatcherRef);
}
updateChild() {
this.updateChildPosition(this.child, this.childContainer);
this.updateChildVisibility(this.child, true);
}
renderApp() {
const content = /*#__PURE__*/_react.default.createElement(_MatrixClientContext.default.Provider, {
value: _MatrixClientPeg.MatrixClientPeg.safeGet()
}, /*#__PURE__*/_react.default.createElement(_compoundWeb.TooltipProvider, null, /*#__PURE__*/_react.default.createElement("div", {
ref: this.collectChild,
style: this.props.style
}, this.props.children)));
_reactDom.default.render(content, getOrCreateContainer("mx_persistedElement_" + this.props.persistKey));
}
updateChildVisibility(child, visible = false) {
if (!child) return;
child.style.display = visible ? "block" : "none";
}
updateChildPosition(child, parent) {
if (!child || !parent) return;
const parentRect = parent.getBoundingClientRect();
Object.assign(child.style, {
zIndex: (0, _utils.isNullOrUndefined)(this.props.zIndex) ? 9 : this.props.zIndex,
position: "absolute",
top: "0",
left: "0",
transform: `translateX(${parentRect.left}px) translateY(${parentRect.top}px)`,
width: parentRect.width + "px",
height: parentRect.height + "px"
});
}
render() {
return /*#__PURE__*/_react.default.createElement("div", {
ref: this.collectChildContainer
});
}
}
exports.default = PersistedElement;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9yZWFjdERvbSIsIl91dGlscyIsIl9jb21wb3VuZFdlYiIsIl9kaXNwYXRjaGVyIiwiX01hdHJpeENsaWVudENvbnRleHQiLCJfTWF0cml4Q2xpZW50UGVnIiwiZ2V0UGVyc2lzdEtleSIsImFwcElkIiwiZXhwb3J0cyIsImdldE9yQ3JlYXRlTWFzdGVyQ29udGFpbmVyIiwiY29udGFpbmVyIiwiZ2V0Q29udGFpbmVyIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiaWQiLCJib2R5IiwiYXBwZW5kQ2hpbGQiLCJjb250YWluZXJJZCIsImdldEVsZW1lbnRCeUlkIiwiZ2V0T3JDcmVhdGVDb250YWluZXIiLCJQZXJzaXN0ZWRFbGVtZW50IiwiUmVhY3QiLCJDb21wb25lbnQiLCJjb25zdHJ1Y3RvciIsInByb3BzIiwiX2RlZmluZVByb3BlcnR5MiIsImRlZmF1bHQiLCJyZWYiLCJjaGlsZENvbnRhaW5lciIsInJlc2l6ZU9ic2VydmVyIiwidW5vYnNlcnZlIiwib2JzZXJ2ZSIsImNoaWxkIiwidXBkYXRlQ2hpbGQiLCJwYXlsb2FkIiwiYWN0aW9uIiwicmVwb3NpdGlvbkNoaWxkIiwiZGVzdHJveUVsZW1lbnQiLCJwZXJzaXN0S2V5IiwidXBkYXRlQ2hpbGRQb3NpdGlvbiIsIlJlc2l6ZU9ic2VydmVyIiwid2luZG93IiwiYWRkRXZlbnRMaXN0ZW5lciIsImRpc3BhdGNoZXJSZWYiLCJkaXMiLCJyZWdpc3RlciIsIm9uQWN0aW9uIiwibW92ZVJlZiIsImN1cnJlbnQiLCJyZW1vdmUiLCJpc01vdW50ZWQiLCJCb29sZWFuIiwiY29tcG9uZW50RGlkTW91bnQiLCJyZW5kZXJBcHAiLCJjb21wb25lbnREaWRVcGRhdGUiLCJjb21wb25lbnRXaWxsVW5tb3VudCIsInVwZGF0ZUNoaWxkVmlzaWJpbGl0eSIsImRpc2Nvbm5lY3QiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwidW5yZWdpc3RlciIsImNvbnRlbnQiLCJQcm92aWRlciIsInZhbHVlIiwiTWF0cml4Q2xpZW50UGVnIiwic2FmZUdldCIsIlRvb2x0aXBQcm92aWRlciIsImNvbGxlY3RDaGlsZCIsInN0eWxlIiwiY2hpbGRyZW4iLCJSZWFjdERPTSIsInJlbmRlciIsInZpc2libGUiLCJkaXNwbGF5IiwicGFyZW50IiwicGFyZW50UmVjdCIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsIk9iamVjdCIsImFzc2lnbiIsInpJbmRleCIsImlzTnVsbE9yVW5kZWZpbmVkIiwicG9zaXRpb24iLCJ0b3AiLCJsZWZ0IiwidHJhbnNmb3JtIiwid2lkdGgiLCJoZWlnaHQiLCJjb2xsZWN0Q2hpbGRDb250YWluZXIiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy92aWV3cy9lbGVtZW50cy9QZXJzaXN0ZWRFbGVtZW50LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMTgtMjAyNCBOZXcgVmVjdG9yIEx0ZC5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IFJlYWN0LCB7IE11dGFibGVSZWZPYmplY3QsIFJlYWN0Tm9kZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFJlYWN0RE9NIGZyb20gXCJyZWFjdC1kb21cIjtcbmltcG9ydCB7IGlzTnVsbE9yVW5kZWZpbmVkIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL3V0aWxzXCI7XG5pbXBvcnQgeyBUb29sdGlwUHJvdmlkZXIgfSBmcm9tIFwiQHZlY3Rvci1pbS9jb21wb3VuZC13ZWJcIjtcblxuaW1wb3J0IGRpcyBmcm9tIFwiLi4vLi4vLi4vZGlzcGF0Y2hlci9kaXNwYXRjaGVyXCI7XG5pbXBvcnQgTWF0cml4Q2xpZW50Q29udGV4dCBmcm9tIFwiLi4vLi4vLi4vY29udGV4dHMvTWF0cml4Q2xpZW50Q29udGV4dFwiO1xuaW1wb3J0IHsgTWF0cml4Q2xpZW50UGVnIH0gZnJvbSBcIi4uLy4uLy4uL01hdHJpeENsaWVudFBlZ1wiO1xuaW1wb3J0IHsgQWN0aW9uUGF5bG9hZCB9IGZyb20gXCIuLi8uLi8uLi9kaXNwYXRjaGVyL3BheWxvYWRzXCI7XG5cbmV4cG9ydCBjb25zdCBnZXRQZXJzaXN0S2V5ID0gKGFwcElkOiBzdHJpbmcpOiBzdHJpbmcgPT4gXCJ3aWRnZXRfXCIgKyBhcHBJZDtcblxuLy8gU2hhbWVsZXNzbHkgcmlwcGVkIG9mZiBNb2RhbC5qcy4gIFRoZXJlJ3MgcHJvYmFibHkgYSBiZXR0ZXIgd2F5XG4vLyBvZiBkb2luZyByZXVzYWJsZSB3aWRnZXRzIGxpa2UgZGlhbG9nIGJveGVzICYgbWVudXMgd2hlcmUgd2UgZ28gYW5kXG4vLyBwYXNzIGluIGEgY3VzdG9tIGNvbnRyb2wgYXMgdGhlIGFjdHVhbCBib2R5LlxuXG4vLyBXZSBjb250YWluIGFsbCBwZXJzaXN0ZWQgZWxlbWVudHMgd2l0aGluIGEgbWFzdGVyIGNvbnRhaW5lciB0byBhbGxvdyB0aGVtIGFsbCB0byBiZSB3aXRoaW4gdGhlIHNhbWVcbi8vIENTUyBzdGFja2luZyBjb250ZXh0LCBhbmQgdGh1cyBiZSBhYmxlIHRvIGNvbnRyb2wgdGhlaXIgei1pbmRleGVzIHJlbGF0aXZlIHRvIGVhY2ggb3RoZXIuXG5mdW5jdGlvbiBnZXRPckNyZWF0ZU1hc3RlckNvbnRhaW5lcigpOiBIVE1MRGl2RWxlbWVudCB7XG4gICAgbGV0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lcihcIm14X1BlcnNpc3RlZEVsZW1lbnRfY29udGFpbmVyXCIpO1xuICAgIGlmICghY29udGFpbmVyKSB7XG4gICAgICAgIGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGNvbnRhaW5lci5pZCA9IFwibXhfUGVyc2lzdGVkRWxlbWVudF9jb250YWluZXJcIjtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjb250YWluZXIpO1xuICAgIH1cblxuICAgIHJldHVybiBjb250YWluZXI7XG59XG5cbmZ1bmN0aW9uIGdldENvbnRhaW5lcihjb250YWluZXJJZDogc3RyaW5nKTogSFRNTERpdkVsZW1lbnQge1xuICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjb250YWluZXJJZCkgYXMgSFRNTERpdkVsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIGdldE9yQ3JlYXRlQ29udGFpbmVyKGNvbnRhaW5lcklkOiBzdHJpbmcpOiBIVE1MRGl2RWxlbWVudCB7XG4gICAgbGV0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lcihjb250YWluZXJJZCk7XG5cbiAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgICBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBjb250YWluZXIuaWQgPSBjb250YWluZXJJZDtcbiAgICAgICAgZ2V0T3JDcmVhdGVNYXN0ZXJDb250YWluZXIoKS5hcHBlbmRDaGlsZChjb250YWluZXIpO1xuICAgIH1cblxuICAgIHJldHVybiBjb250YWluZXI7XG59XG5cbmludGVyZmFjZSBJUHJvcHMge1xuICAgIC8vIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIFBlcnNpc3RlZEVsZW1lbnQgaW5zdGFuY2VcbiAgICAvLyBBbnkgUGVyc2lzdGVkRWxlbWVudHMgd2l0aCB0aGUgc2FtZSBwZXJzaXN0S2V5IHdpbGwgdXNlXG4gICAgLy8gdGhlIHNhbWUgRE9NIGNvbnRhaW5lci5cbiAgICBwZXJzaXN0S2V5OiBzdHJpbmc7XG5cbiAgICAvLyB6LWluZGV4IGZvciB0aGUgZWxlbWVudC4gRGVmYXVsdHMgdG8gOS5cbiAgICB6SW5kZXg/OiBudW1iZXI7XG5cbiAgICBzdHlsZT86IFJlYWN0LlN0eWxlSFRNTEF0dHJpYnV0ZXM8SFRNTERpdkVsZW1lbnQ+O1xuXG4gICAgLy8gSGFuZGxlIHRvIG1hbnVhbGx5IG5vdGlmeSB0aGlzIFBlcnNpc3RlZEVsZW1lbnQgdGhhdCBpdCBuZWVkcyB0byBtb3ZlXG4gICAgbW92ZVJlZj86IE11dGFibGVSZWZPYmplY3Q8KCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkPjtcbiAgICBjaGlsZHJlbjogUmVhY3ROb2RlO1xufVxuXG4vKipcbiAqIENsYXNzIG9mIGNvbXBvbmVudCB0aGF0IHJlbmRlcnMgaXRzIGNoaWxkcmVuIGluIGEgc2VwYXJhdGUgUmVhY3RET00gdmlydHVhbCB0cmVlXG4gKiBpbiBhIGNvbnRhaW5lciBlbGVtZW50IGFwcGVuZGVkIHRvIGRvY3VtZW50LmJvZHkuXG4gKlxuICogVGhpcyBwcmV2ZW50cyB0aGUgY2hpbGRyZW4gZnJvbSBiZWluZyB1bm1vdW50ZWQgd2hlbiB0aGUgcGFyZW50IG9mIFBlcnNpc3RlZEVsZW1lbnRcbiAqIHVubW91bnRzLCBhbGxvd2luZyB0aGVtIHRvIHBlcnNpc3QuXG4gKlxuICogV2hlbiBQRSBpcyB1bm1vdW50ZWQsIGl0IGhpZGVzIHRoZSBjaGlsZHJlbiB1c2luZyBDU1MuIFdoZW4gbW91bnRlZCBvciB1cGRhdGVkLCB0aGVcbiAqIGNoaWxkcmVuIGFyZSBtYWRlIHZpc2libGUgYW5kIGFyZSBwb3NpdGlvbmVkIGludG8gYSBkaXYgdGhhdCBpcyBnaXZlbiB0aGUgc2FtZVxuICogYm91bmRpbmcgcmVjdCBhcyB0aGUgcGFyZW50IG9mIFBFLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQZXJzaXN0ZWRFbGVtZW50IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50PElQcm9wcz4ge1xuICAgIHByaXZhdGUgcmVzaXplT2JzZXJ2ZXI6IFJlc2l6ZU9ic2VydmVyO1xuICAgIHByaXZhdGUgZGlzcGF0Y2hlclJlZjogc3RyaW5nO1xuICAgIHByaXZhdGUgY2hpbGRDb250YWluZXI/OiBIVE1MRGl2RWxlbWVudDtcbiAgICBwcml2YXRlIGNoaWxkPzogSFRNTERpdkVsZW1lbnQ7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvcHM6IElQcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG5cbiAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcih0aGlzLnJlcG9zaXRpb25DaGlsZCk7XG4gICAgICAgIC8vIEFubm95aW5nbHksIGEgcmVzaXplIG9ic2VydmVyIGlzIGluc3VmZmljaWVudCwgc2luY2Ugd2UgYWxzbyBjYXJlXG4gICAgICAgIC8vIGFib3V0IHdoZW4gdGhlIGVsZW1lbnQgbW92ZXMgb24gdGhlIHNjcmVlbiB3aXRob3V0IGNoYW5naW5nIGl0c1xuICAgICAgICAvLyBkaW1lbnNpb25zLiBEb2Vzbid0IGxvb2sgbGlrZSB0aGVyZSdzIGEgUmVzaXplT2JzZXJ2ZXIgZXF1aXZhbGVudFxuICAgICAgICAvLyBmb3IgdGhpcywgc28gd2UgYm9kZ2UgaXQgYnkgbGlzdGVuaW5nIGZvciBkb2N1bWVudCByZXNpemUgYW5kXG4gICAgICAgIC8vIHRoZSB0aW1lbGluZV9yZXNpemUgYWN0aW9uLlxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB0aGlzLnJlcG9zaXRpb25DaGlsZCk7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlclJlZiA9IGRpcy5yZWdpc3Rlcih0aGlzLm9uQWN0aW9uKTtcblxuICAgICAgICBpZiAodGhpcy5wcm9wcy5tb3ZlUmVmKSB0aGlzLnByb3BzLm1vdmVSZWYuY3VycmVudCA9IHRoaXMucmVwb3NpdGlvbkNoaWxkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIERPTSBlbGVtZW50cyBjcmVhdGVkIHdoZW4gYSBQZXJzaXN0ZWRFbGVtZW50IHdpdGggdGhlIGdpdmVuXG4gICAgICogcGVyc2lzdEtleSB3YXMgbW91bnRlZC4gVGhlIERPTSBlbGVtZW50cyB3aWxsIGJlIHJlLWFkZGVkIGlmIGFub3RoZXJcbiAgICAgKiBQZXJzaXN0ZWRFbGVtZW50IGlzIG1vdW50ZWQgaW4gdGhlIGZ1dHVyZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwZXJzaXN0S2V5IEtleSB1c2VkIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMgUGVyc2lzdGVkRWxlbWVudFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZGVzdHJveUVsZW1lbnQocGVyc2lzdEtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lcihcIm14X3BlcnNpc3RlZEVsZW1lbnRfXCIgKyBwZXJzaXN0S2V5KTtcbiAgICAgICAgaWYgKGNvbnRhaW5lcikge1xuICAgICAgICAgICAgY29udGFpbmVyLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc01vdW50ZWQocGVyc2lzdEtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKGdldENvbnRhaW5lcihcIm14X3BlcnNpc3RlZEVsZW1lbnRfXCIgKyBwZXJzaXN0S2V5KSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb2xsZWN0Q2hpbGRDb250YWluZXIgPSAocmVmOiBIVE1MRGl2RWxlbWVudCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAodGhpcy5jaGlsZENvbnRhaW5lcikge1xuICAgICAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlci51bm9ic2VydmUodGhpcy5jaGlsZENvbnRhaW5lcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jaGlsZENvbnRhaW5lciA9IHJlZjtcbiAgICAgICAgaWYgKHJlZikge1xuICAgICAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlci5vYnNlcnZlKHJlZik7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBjb2xsZWN0Q2hpbGQgPSAocmVmOiBIVE1MRGl2RWxlbWVudCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmNoaWxkID0gcmVmO1xuICAgICAgICB0aGlzLnVwZGF0ZUNoaWxkKCk7XG4gICAgfTtcblxuICAgIHB1YmxpYyBjb21wb25lbnREaWRNb3VudCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy51cGRhdGVDaGlsZCgpO1xuICAgICAgICB0aGlzLnJlbmRlckFwcCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb21wb25lbnREaWRVcGRhdGUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudXBkYXRlQ2hpbGQoKTtcbiAgICAgICAgdGhpcy5yZW5kZXJBcHAoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29tcG9uZW50V2lsbFVubW91bnQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudXBkYXRlQ2hpbGRWaXNpYmlsaXR5KHRoaXMuY2hpbGQsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHRoaXMucmVwb3NpdGlvbkNoaWxkKTtcbiAgICAgICAgZGlzLnVucmVnaXN0ZXIodGhpcy5kaXNwYXRjaGVyUmVmKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uQWN0aW9uID0gKHBheWxvYWQ6IEFjdGlvblBheWxvYWQpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHBheWxvYWQuYWN0aW9uID09PSBcInRpbWVsaW5lX3Jlc2l6ZVwiKSB7XG4gICAgICAgICAgICB0aGlzLnJlcG9zaXRpb25DaGlsZCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHBheWxvYWQuYWN0aW9uID09PSBcImxvZ291dFwiKSB7XG4gICAgICAgICAgICBQZXJzaXN0ZWRFbGVtZW50LmRlc3Ryb3lFbGVtZW50KHRoaXMucHJvcHMucGVyc2lzdEtleSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJpdmF0ZSByZXBvc2l0aW9uQ2hpbGQgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMudXBkYXRlQ2hpbGRQb3NpdGlvbih0aGlzLmNoaWxkLCB0aGlzLmNoaWxkQ29udGFpbmVyKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSB1cGRhdGVDaGlsZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy51cGRhdGVDaGlsZFBvc2l0aW9uKHRoaXMuY2hpbGQsIHRoaXMuY2hpbGRDb250YWluZXIpO1xuICAgICAgICB0aGlzLnVwZGF0ZUNoaWxkVmlzaWJpbGl0eSh0aGlzLmNoaWxkLCB0cnVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbmRlckFwcCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IChcbiAgICAgICAgICAgIDxNYXRyaXhDbGllbnRDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXtNYXRyaXhDbGllbnRQZWcuc2FmZUdldCgpfT5cbiAgICAgICAgICAgICAgICA8VG9vbHRpcFByb3ZpZGVyPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IHJlZj17dGhpcy5jb2xsZWN0Q2hpbGR9IHN0eWxlPXt0aGlzLnByb3BzLnN0eWxlfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt0aGlzLnByb3BzLmNoaWxkcmVufVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L1Rvb2x0aXBQcm92aWRlcj5cbiAgICAgICAgICAgIDwvTWF0cml4Q2xpZW50Q29udGV4dC5Qcm92aWRlcj5cbiAgICAgICAgKTtcblxuICAgICAgICBSZWFjdERPTS5yZW5kZXIoY29udGVudCwgZ2V0T3JDcmVhdGVDb250YWluZXIoXCJteF9wZXJzaXN0ZWRFbGVtZW50X1wiICsgdGhpcy5wcm9wcy5wZXJzaXN0S2V5KSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVDaGlsZFZpc2liaWxpdHkoY2hpbGQ/OiBIVE1MRGl2RWxlbWVudCwgdmlzaWJsZSA9IGZhbHNlKTogdm9pZCB7XG4gICAgICAgIGlmICghY2hpbGQpIHJldHVybjtcbiAgICAgICAgY2hpbGQuc3R5bGUuZGlzcGxheSA9IHZpc2libGUgPyBcImJsb2NrXCIgOiBcIm5vbmVcIjtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUNoaWxkUG9zaXRpb24oY2hpbGQ/OiBIVE1MRGl2RWxlbWVudCwgcGFyZW50PzogSFRNTERpdkVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFjaGlsZCB8fCAhcGFyZW50KSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgcGFyZW50UmVjdCA9IHBhcmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihjaGlsZC5zdHlsZSwge1xuICAgICAgICAgICAgekluZGV4OiBpc051bGxPclVuZGVmaW5lZCh0aGlzLnByb3BzLnpJbmRleCkgPyA5IDogdGhpcy5wcm9wcy56SW5kZXgsXG4gICAgICAgICAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICAgICAgICAgICAgdG9wOiBcIjBcIixcbiAgICAgICAgICAgIGxlZnQ6IFwiMFwiLFxuICAgICAgICAgICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlWCgke3BhcmVudFJlY3QubGVmdH1weCkgdHJhbnNsYXRlWSgke3BhcmVudFJlY3QudG9wfXB4KWAsXG4gICAgICAgICAgICB3aWR0aDogcGFyZW50UmVjdC53aWR0aCArIFwicHhcIixcbiAgICAgICAgICAgIGhlaWdodDogcGFyZW50UmVjdC5oZWlnaHQgKyBcInB4XCIsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW5kZXIoKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgICAgICAgcmV0dXJuIDxkaXYgcmVmPXt0aGlzLmNvbGxlY3RDaGlsZENvbnRhaW5lcn0gLz47XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQU9BLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFNBQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFFLE1BQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLFlBQUEsR0FBQUgsT0FBQTtBQUVBLElBQUFJLFdB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