botframework-webchat-component
Version:
React component of botframework-webchat
290 lines (256 loc) • 37.1 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.connectStackedLayout = exports.default = void 0;
var _botframeworkWebchatApi = require("botframework-webchat-api");
var _classnames = _interopRequireDefault(require("classnames"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _react = _interopRequireDefault(require("react"));
var _Bubble = _interopRequireDefault(require("./Bubble"));
var _connectToWebChat = _interopRequireDefault(require("../connectToWebChat"));
var _isZeroOrPositive = _interopRequireDefault(require("../Utils/isZeroOrPositive"));
var _ScreenReaderText = _interopRequireDefault(require("../ScreenReaderText"));
var _textFormatToContentType = _interopRequireDefault(require("../Utils/textFormatToContentType"));
var _useStyleSet3 = _interopRequireDefault(require("../hooks/useStyleSet"));
var _useStyleToEmotionObject = _interopRequireDefault(require("../hooks/internal/useStyleToEmotionObject"));
var _useUniqueId = _interopRequireDefault(require("../hooks/internal/useUniqueId"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
var useAvatarForBot = _botframeworkWebchatApi.hooks.useAvatarForBot,
useAvatarForUser = _botframeworkWebchatApi.hooks.useAvatarForUser,
useLocalizer = _botframeworkWebchatApi.hooks.useLocalizer,
useStyleOptions = _botframeworkWebchatApi.hooks.useStyleOptions;
var ROOT_STYLE = {
'&.webchat__stacked-layout': {
position: 'relative',
// This is to keep screen reader text in the destinated area.
'& .webchat__stacked-layout__attachment-row, & .webchat__stacked-layout__main, & .webchat__stacked-layout__message-row, & .webchat__stacked-layout__status': {
display: 'flex'
},
'& .webchat__stacked-layout__alignment-pad': {
flexShrink: 0
},
'& .webchat__stacked-layout__attachment': {
width: '100%'
},
'& .webchat__stacked-layout__avatar-gutter': {
display: 'flex',
flexDirection: 'column',
flexShrink: 0
},
'&.webchat__stacked-layout--from-user': {
'& .webchat__stacked-layout__attachment-row, & .webchat__stacked-layout__main, & .webchat__stacked-layout__message-row, & .webchat__stacked-layout__status': {
flexDirection: 'row-reverse'
}
},
'& .webchat__stacked-layout__content': {
flex: 1,
// This is for bottom aligning an avatar with a message bubble shorter than the avatar.
// Related to the test at activityGrouping.avatarMiddleware.atBottom.js.
display: 'flex',
flexDirection: 'column',
// This "overflow: hidden" is to make sure text overflow will get clipped correctly.
// Related to the test at basic.js "long URLs with keep-all".
overflow: 'hidden'
},
'& .webchat__stacked-layout__nub-pad': {
flexShrink: 0
}
}
};
var connectStackedLayout = function connectStackedLayout() {
for (var _len = arguments.length, selectors = new Array(_len), _key = 0; _key < _len; _key++) {
selectors[_key] = arguments[_key];
}
return _connectToWebChat.default.apply(void 0, [function (_ref, _ref2) {
var language = _ref.language,
_ref$styleSet$options = _ref.styleSet.options,
botAvatarInitials = _ref$styleSet$options.botAvatarInitials,
userAvatarInitials = _ref$styleSet$options.userAvatarInitials;
var _ref2$activity = _ref2.activity;
_ref2$activity = _ref2$activity === void 0 ? {} : _ref2$activity;
var _ref2$activity$from = _ref2$activity.from;
_ref2$activity$from = _ref2$activity$from === void 0 ? {} : _ref2$activity$from;
var role = _ref2$activity$from.role;
return {
avatarInitials: role === 'user' ? userAvatarInitials : botAvatarInitials,
language: language,
// TODO: [P4] We want to deprecate botAvatarInitials/userAvatarInitials because they are not as helpful as avatarInitials
botAvatarInitials: botAvatarInitials,
userAvatarInitials: userAvatarInitials
};
}].concat(selectors));
};
exports.connectStackedLayout = connectStackedLayout;
var StackedLayout = function StackedLayout(_ref3) {
var activity = _ref3.activity,
hideTimestamp = _ref3.hideTimestamp,
renderActivityStatus = _ref3.renderActivityStatus,
renderAttachment = _ref3.renderAttachment,
renderAvatar = _ref3.renderAvatar,
showCallout = _ref3.showCallout;
var _useStyleOptions = useStyleOptions(),
_useStyleOptions2 = _slicedToArray(_useStyleOptions, 1),
_useStyleOptions2$ = _useStyleOptions2[0],
bubbleNubOffset = _useStyleOptions2$.bubbleNubOffset,
bubbleNubSize = _useStyleOptions2$.bubbleNubSize,
bubbleFromUserNubOffset = _useStyleOptions2$.bubbleFromUserNubOffset,
bubbleFromUserNubSize = _useStyleOptions2$.bubbleFromUserNubSize;
var _useAvatarForBot = useAvatarForBot(),
_useAvatarForBot2 = _slicedToArray(_useAvatarForBot, 1),
botInitials = _useAvatarForBot2[0].initials;
var _useAvatarForUser = useAvatarForUser(),
_useAvatarForUser2 = _slicedToArray(_useAvatarForUser, 1),
userInitials = _useAvatarForUser2[0].initials;
var _useStyleSet = (0, _useStyleSet3.default)(),
_useStyleSet2 = _slicedToArray(_useStyleSet, 1),
stackedLayoutStyleSet = _useStyleSet2[0].stackedLayout;
var ariaLabelId = (0, _useUniqueId.default)('webchat__stacked-layout__id');
var localize = useLocalizer();
var rootClassName = (0, _useStyleToEmotionObject.default)()(ROOT_STYLE) + '';
var showActivityStatus = typeof renderActivityStatus === 'function';
var _activity$attachments = activity.attachments,
attachments = _activity$attachments === void 0 ? [] : _activity$attachments,
_activity$channelData = activity.channelData;
_activity$channelData = _activity$channelData === void 0 ? {} : _activity$channelData;
var _activity$channelData2 = _activity$channelData.messageBack;
_activity$channelData2 = _activity$channelData2 === void 0 ? {} : _activity$channelData2;
var messageBackDisplayText = _activity$channelData2.displayText,
_activity$from = activity.from;
_activity$from = _activity$from === void 0 ? {} : _activity$from;
var role = _activity$from.role,
text = activity.text,
textFormat = activity.textFormat;
var activityDisplayText = messageBackDisplayText || text;
var fromUser = role === 'user';
var attachedAlt = localize(fromUser ? 'ACTIVITY_YOU_ATTACHED_ALT' : 'ACTIVITY_BOT_ATTACHED_ALT');
var greetingAlt = (fromUser ? localize('ACTIVITY_YOU_SAID_ALT') : localize('ACTIVITY_BOT_SAID_ALT', botInitials || '')).replace(/[\t-\r \xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]{2,}/g, ' ');
var initials = fromUser ? userInitials : botInitials;
var nubOffset = fromUser ? bubbleFromUserNubOffset : bubbleNubOffset;
var nubSize = fromUser ? bubbleFromUserNubSize : bubbleNubSize;
var otherInitials = fromUser ? botInitials : userInitials;
var otherNubSize = fromUser ? bubbleNubSize : bubbleFromUserNubSize;
var hasAvatar = initials || typeof initials === 'string';
var hasOtherAvatar = otherInitials || typeof otherInitials === 'string';
var hasNub = typeof nubSize === 'number';
var hasOtherNub = typeof otherNubSize === 'number';
var topAlignedCallout = (0, _isZeroOrPositive.default)(nubOffset);
var extraTrailing = !hasOtherAvatar && hasOtherNub; // This is for bot message with user nub and no user avatar. And vice versa.
var showAvatar = showCallout && hasAvatar && !!renderAvatar;
var showNub = showCallout && hasNub && (topAlignedCallout || !attachments.length);
return /*#__PURE__*/_react.default.createElement("div", {
"aria-labelledby": activityDisplayText ? ariaLabelId : undefined,
"aria-roledescription": "activity",
className: (0, _classnames.default)('webchat__stacked-layout', rootClassName, stackedLayoutStyleSet + '', {
'webchat__stacked-layout--extra-trailing': extraTrailing,
'webchat__stacked-layout--from-user': fromUser,
'webchat__stacked-layout--hide-avatar': hasAvatar && !showAvatar,
'webchat__stacked-layout--hide-nub': hasNub && !showNub,
'webchat__stacked-layout--no-message': !activityDisplayText,
'webchat__stacked-layout--show-avatar': showAvatar,
'webchat__stacked-layout--show-nub': showNub,
'webchat__stacked-layout--top-callout': topAlignedCallout
}),
role: "group"
}, /*#__PURE__*/_react.default.createElement("div", {
className: "webchat__stacked-layout__main"
}, /*#__PURE__*/_react.default.createElement("div", {
className: "webchat__stacked-layout__avatar-gutter"
}, showAvatar && renderAvatar({
activity: activity
})), /*#__PURE__*/_react.default.createElement("div", {
className: "webchat__stacked-layout__content"
}, !!activityDisplayText && /*#__PURE__*/_react.default.createElement("div", {
"aria-roledescription": "message",
className: "webchat__stacked-layout__message-row" // Disable "Prop `id` is forbidden on DOM Nodes" rule because we are using the ID prop for accessibility.
/* eslint-disable-next-line react/forbid-dom-props */
,
id: ariaLabelId,
role: "group"
}, /*#__PURE__*/_react.default.createElement(_ScreenReaderText.default, {
text: greetingAlt
}), /*#__PURE__*/_react.default.createElement(_Bubble.default, {
className: "webchat__stacked-layout__message",
fromUser: fromUser,
nub: showNub || (hasAvatar || hasNub) && 'hidden'
}, renderAttachment({
activity: activity,
attachment: {
content: activityDisplayText,
contentType: (0, _textFormatToContentType.default)(textFormat)
}
}))), attachments.map(function (attachment, index) {
return /*#__PURE__*/_react.default.createElement("div", {
"aria-roledescription": "attachment",
className: (0, _classnames.default)('webchat__stacked-layout__attachment-row', {
'webchat__stacked-layout__attachment-row--first': !index
})
/* attachments do not have an ID, it is always indexed by number */
/* eslint-disable-next-line react/no-array-index-key */
,
key: index,
role: "group"
}, /*#__PURE__*/_react.default.createElement(_ScreenReaderText.default, {
text: attachedAlt
}), /*#__PURE__*/_react.default.createElement(_Bubble.default, {
className: "webchat__stacked-layout__attachment",
fromUser: fromUser
/* eslint-disable-next-line react/no-array-index-key */
,
key: index,
nub: (hasAvatar || hasNub) && 'hidden'
}, renderAttachment({
activity: activity,
attachment: attachment
})));
})), /*#__PURE__*/_react.default.createElement("div", {
className: "webchat__stacked-layout__alignment-pad"
})), showActivityStatus && /*#__PURE__*/_react.default.createElement("div", {
className: "webchat__stacked-layout__status"
}, /*#__PURE__*/_react.default.createElement("div", {
className: "webchat__stacked-layout__avatar-gutter"
}), /*#__PURE__*/_react.default.createElement("div", {
className: "webchat__stacked-layout__nub-pad"
}), renderActivityStatus({
hideTimestamp: hideTimestamp
}), /*#__PURE__*/_react.default.createElement("div", {
className: "webchat__stacked-layout__alignment-pad"
})));
};
StackedLayout.defaultProps = {
hideTimestamp: false,
renderActivityStatus: false,
renderAvatar: false,
showCallout: true
};
StackedLayout.propTypes = {
activity: _propTypes.default.shape({
attachments: _propTypes.default.array,
channelData: _propTypes.default.shape({
messageBack: _propTypes.default.shape({
displayText: _propTypes.default.string
})
}),
from: _propTypes.default.shape({
role: _propTypes.default.string.isRequired
}).isRequired,
text: _propTypes.default.string,
textFormat: _propTypes.default.string,
timestamp: _propTypes.default.string,
type: _propTypes.default.string.isRequired
}).isRequired,
hideTimestamp: _propTypes.default.bool,
renderActivityStatus: _propTypes.default.oneOfType([_propTypes.default.oneOf([false]), _propTypes.default.func]),
renderAttachment: _propTypes.default.func.isRequired,
renderAvatar: _propTypes.default.oneOfType([_propTypes.default.oneOf([false]), _propTypes.default.func]),
showCallout: _propTypes.default.bool
};
var _default = StackedLayout;
exports.default = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9BY3Rpdml0eS9TdGFja2VkTGF5b3V0LmpzIl0sIm5hbWVzIjpbInVzZUF2YXRhckZvckJvdCIsImhvb2tzIiwidXNlQXZhdGFyRm9yVXNlciIsInVzZUxvY2FsaXplciIsInVzZVN0eWxlT3B0aW9ucyIsIlJPT1RfU1RZTEUiLCJwb3NpdGlvbiIsImRpc3BsYXkiLCJmbGV4U2hyaW5rIiwid2lkdGgiLCJmbGV4RGlyZWN0aW9uIiwiZmxleCIsIm92ZXJmbG93IiwiY29ubmVjdFN0YWNrZWRMYXlvdXQiLCJzZWxlY3RvcnMiLCJjb25uZWN0VG9XZWJDaGF0IiwibGFuZ3VhZ2UiLCJzdHlsZVNldCIsIm9wdGlvbnMiLCJib3RBdmF0YXJJbml0aWFscyIsInVzZXJBdmF0YXJJbml0aWFscyIsImFjdGl2aXR5IiwiZnJvbSIsInJvbGUiLCJhdmF0YXJJbml0aWFscyIsIlN0YWNrZWRMYXlvdXQiLCJoaWRlVGltZXN0YW1wIiwicmVuZGVyQWN0aXZpdHlTdGF0dXMiLCJyZW5kZXJBdHRhY2htZW50IiwicmVuZGVyQXZhdGFyIiwic2hvd0NhbGxvdXQiLCJidWJibGVOdWJPZmZzZXQiLCJidWJibGVOdWJTaXplIiwiYnViYmxlRnJvbVVzZXJOdWJPZmZzZXQiLCJidWJibGVGcm9tVXNlck51YlNpemUiLCJib3RJbml0aWFscyIsImluaXRpYWxzIiwidXNlckluaXRpYWxzIiwic3RhY2tlZExheW91dFN0eWxlU2V0Iiwic3RhY2tlZExheW91dCIsImFyaWFMYWJlbElkIiwibG9jYWxpemUiLCJyb290Q2xhc3NOYW1lIiwic2hvd0FjdGl2aXR5U3RhdHVzIiwiYXR0YWNobWVudHMiLCJjaGFubmVsRGF0YSIsIm1lc3NhZ2VCYWNrIiwibWVzc2FnZUJhY2tEaXNwbGF5VGV4dCIsImRpc3BsYXlUZXh0IiwidGV4dCIsInRleHRGb3JtYXQiLCJhY3Rpdml0eURpc3BsYXlUZXh0IiwiZnJvbVVzZXIiLCJhdHRhY2hlZEFsdCIsImdyZWV0aW5nQWx0IiwicmVwbGFjZSIsIm51Yk9mZnNldCIsIm51YlNpemUiLCJvdGhlckluaXRpYWxzIiwib3RoZXJOdWJTaXplIiwiaGFzQXZhdGFyIiwiaGFzT3RoZXJBdmF0YXIiLCJoYXNOdWIiLCJoYXNPdGhlck51YiIsInRvcEFsaWduZWRDYWxsb3V0IiwiZXh0cmFUcmFpbGluZyIsInNob3dBdmF0YXIiLCJzaG93TnViIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwiYXR0YWNobWVudCIsImNvbnRlbnQiLCJjb250ZW50VHlwZSIsIm1hcCIsImluZGV4IiwiZGVmYXVsdFByb3BzIiwicHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwic2hhcGUiLCJhcnJheSIsInN0cmluZyIsImlzUmVxdWlyZWQiLCJ0aW1lc3RhbXAiLCJ0eXBlIiwiYm9vbCIsIm9uZU9mVHlwZSIsIm9uZU9mIiwiZnVuYyJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7Ozs7O0lBRVFBLGUsR0FBcUVDLDZCLENBQXJFRCxlO0lBQWlCRSxnQixHQUFvREQsNkIsQ0FBcERDLGdCO0lBQWtCQyxZLEdBQWtDRiw2QixDQUFsQ0UsWTtJQUFjQyxlLEdBQW9CSCw2QixDQUFwQkcsZTtBQUV6RCxJQUFNQyxVQUFVLEdBQUc7QUFDakIsK0JBQTZCO0FBQzNCQyxJQUFBQSxRQUFRLEVBQUUsVUFEaUI7QUFDTDtBQUV0QixpS0FBNko7QUFDM0pDLE1BQUFBLE9BQU8sRUFBRTtBQURrSixLQUhsSTtBQU8zQixpREFBNkM7QUFDM0NDLE1BQUFBLFVBQVUsRUFBRTtBQUQrQixLQVBsQjtBQVczQiw4Q0FBMEM7QUFDeENDLE1BQUFBLEtBQUssRUFBRTtBQURpQyxLQVhmO0FBZTNCLGlEQUE2QztBQUMzQ0YsTUFBQUEsT0FBTyxFQUFFLE1BRGtDO0FBRTNDRyxNQUFBQSxhQUFhLEVBQUUsUUFGNEI7QUFHM0NGLE1BQUFBLFVBQVUsRUFBRTtB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LElBQUFBLFNBQVMsRUFBRUwsbUJBQVVHLE1BWkc7QUFheEJHLElBQUFBLElBQUksRUFBRU4sbUJBQVVHLE1BQVYsQ0FBaUJDO0FBYkMsR0FBaEIsRUFjUEEsVUFmcUI7QUFnQnhCdkQsRUFBQUEsYUFBYSxFQUFFbUQsbUJBQVVPLElBaEJEO0FBaUJ4QnpELEVBQUFBLG9CQUFvQixFQUFFa0QsbUJBQVVRLFNBQVYsQ0FBb0IsQ0FBQ1IsbUJBQVVTLEtBQVYsQ0FBZ0IsQ0FBQyxLQUFELENBQWhCLENBQUQsRUFBMkJULG1CQUFVVSxJQUFyQyxDQUFwQixDQWpCRTtBQWtCeEIzRCxFQUFBQSxnQkFBZ0IsRUFBRWlELG1CQUFVVSxJQUFWLENBQWVOLFVBbEJUO0FBbUJ4QnBELEVBQUFBLFlBQVksRUFBRWdELG1CQUFVUSxTQUFWLENBQW9CLENBQUNSLG1CQUFVUyxLQUFWLENBQWdCLENBQUMsS0FBRCxDQUFoQixDQUFELEVBQTJCVCxtQkFBVVUsSUFBckMsQ0FBcEIsQ0FuQlU7QUFvQnhCekQsRUFBQUEsV0FBVyxFQUFFK0MsbUJBQVVPO0FBcEJDLENBQTFCO2VBdUJlM0QsYSIsInNvdXJjZVJvb3QiOiJjb21wb25lbnQ6Ly8vIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50IGNvbXBsZXhpdHk6IFtcImVycm9yXCIsIDMwXSAqL1xuXG5pbXBvcnQgeyBob29rcyB9IGZyb20gJ2JvdGZyYW1ld29yay13ZWJjaGF0LWFwaSc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgQnViYmxlIGZyb20gJy4vQnViYmxlJztcbmltcG9ydCBjb25uZWN0VG9XZWJDaGF0IGZyb20gJy4uL2Nvbm5lY3RUb1dlYkNoYXQnO1xuaW1wb3J0IGlzWmVyb09yUG9zaXRpdmUgZnJvbSAnLi4vVXRpbHMvaXNaZXJvT3JQb3NpdGl2ZSc7XG5pbXBvcnQgU2NyZWVuUmVhZGVyVGV4dCBmcm9tICcuLi9TY3JlZW5SZWFkZXJUZXh0JztcbmltcG9ydCB0ZXh0Rm9ybWF0VG9Db250ZW50VHlwZSBmcm9tICcuLi9VdGlscy90ZXh0Rm9ybWF0VG9Db250ZW50VHlwZSc7XG5pbXBvcnQgdXNlU3R5bGVTZXQgZnJvbSAnLi4vaG9va3MvdXNlU3R5bGVTZXQnO1xuaW1wb3J0IHVzZVN0eWxlVG9FbW90aW9uT2JqZWN0IGZyb20gJy4uL2hvb2tzL2ludGVybmFsL3VzZVN0eWxlVG9FbW90aW9uT2JqZWN0JztcblxuaW1wb3J0IHVzZVVuaXF1ZUlkIGZyb20gJy4uL2hvb2tzL2ludGVybmFsL3VzZVVuaXF1ZUlkJztcblxuY29uc3QgeyB1c2VBdmF0YXJGb3JCb3QsIHVzZUF2YXRhckZvclVzZXIsIHVzZUxvY2FsaXplciwgdXNlU3R5bGVPcHRpb25zIH0gPSBob29rcztcblxuY29uc3QgUk9PVF9TVFlMRSA9IHtcbiAgJyYud2ViY2hhdF9fc3RhY2tlZC1sYXlvdXQnOiB7XG4gICAgcG9zaXRpb246ICdyZWxhdGl2ZScsIC8vIFRoaXMgaXMgdG8ga2VlcCBzY3JlZW4gcmVhZGVyIHRleHQgaW4gdGhlIGRlc3RpbmF0ZWQgYXJlYS5cblxuICAgICcmIC53ZWJjaGF0X19zdGFja2VkLWxheW91dF9fYXR0YWNobWVudC1yb3csICYgLndlYmNoYXRfX3N0YWNrZWQtbGF5b3V0X19tYWluLCAmIC53ZWJjaGF0X19zdGFja2VkLWxheW91dF9fbWVzc2FnZS1yb3csICYgLndlYmNoYXRfX3N0YWNrZWQtbGF5b3V0X19zdGF0dXMnOiB7XG4gICAgICBkaXNwbGF5OiAnZmxleCdcbiAgICB9LFxuXG4gICAgJyYgLndlYmNoYXRfX3N0YWNrZWQtbGF5b3V0X19hbGlnbm1lbnQtcGFkJzoge1xuICAgICAgZmxleFNocmluazogMFxuICAgIH0sXG5cbiAgICAnJiAud2ViY2hhdF9fc3RhY2tlZC1sYXlvdXRfX2F0dGFjaG1lbnQnOiB7XG4gICAgICB3aWR0aDogJzEwMCUnXG4gICAgfSxcblxuICAgICcmIC53ZWJjaGF0X19zdGFja2VkLWxheW91dF9fYXZhdGFyLWd1dHRlcic6IHtcbiAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLFxuICAgICAgZmxleFNocmluazogMFxuICAgIH0sXG5cbiAgICAnJi53ZWJjaGF0X19zdGFja2VkLWxheW91dC0tZnJvbS11c2VyJzoge1xuICAgICAgJyYgLndlYmNoYXRfX3N0YWNrZWQtbGF5b3V0X19hdHRhY2htZW50LXJvdywgJiAud2ViY2hhdF9fc3RhY2tlZC1sYXlvdXRfX21haW4sICYgLndlYmNoYXRfX3N0YWNrZWQtbGF5b3V0X19tZXNzYWdlLXJvdywgJiAud2ViY2hhdF9fc3RhY2tlZC1sYXlvdXRfX3N0YXR1cyc6IHtcbiAgICAgICAgZmxleERpcmVjdGlvbjogJ3Jvdy1yZXZlcnNlJ1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAnJiAud2ViY2hhdF9fc3RhY2tlZC1sYXlvdXRfX2NvbnRlbnQnOiB7XG4gICAgICBmbGV4OiAxLFxuXG4gICAgICAvLyBUaGlzIGlzIGZvciBib3R0b20gYWxpZ25pbmcgYW4gYXZhdGFyIHdpdGggYSBtZXNzYWdlIGJ1YmJsZSBzaG9ydGVyIHRoYW4gdGhlIGF2YXRhci5cbiAgICAgIC8vIFJlbGF0ZWQgdG8gdGhlIHRlc3QgYXQgYWN0aXZpdHlHcm91cGluZy5hdmF0YXJNaWRkbGV3YXJlLmF0Qm90dG9tLmpzLlxuICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsXG5cbiAgICAgIC8vIFRoaXMgXCJvdmVyZmxvdzogaGlkZGVuXCIgaXMgdG8gbWFrZSBzdXJlIHRleHQgb3ZlcmZsb3cgd2lsbCBnZXQgY2xpcHBlZCBjb3JyZWN0bHkuXG4gICAgICAvLyBSZWxhdGVkIHRvIHRoZSB0ZXN0IGF0IGJhc2ljLmpzIFwibG9uZyBVUkxzIHdpdGgga2VlcC1hbGxcIi5cbiAgICAgIG92ZXJmbG93OiAnaGlkZGVuJ1xuICAgIH0sXG5cbiAgICAnJiAud2ViY2hhdF9fc3RhY2tlZC1sYXlvdXRfX251Yi1wYWQnOiB7XG4gICAgICBmbGV4U2hyaW5rOiAwXG4gICAgfVxuICB9XG59O1xuXG5jb25zdCBjb25uZWN0U3RhY2tlZExheW91dCA9ICguLi5zZWxlY3RvcnMpID0+XG4gIGNvbm5lY3RUb1dlYkNoYXQoXG4gICAgKFxuICAgICAge1xuICAgICAgICBsYW5ndWFnZSxcbiAgICAgICAgc3R5bGVTZXQ6IHtcbiAgICAgICAgICBvcHRpb25zOiB7IGJvdEF2YXRhckluaXRpYWxzLCB1c2VyQXZhdGFySW5pdGlhbHMgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgeyBhY3Rpdml0eTogeyBmcm9tOiB7IHJvbGUgfSA9IHt9IH0gPSB7fSB9XG4gICAgKSA9PiAoe1xuICAgICAgYXZhdGFySW5pdGlhbHM6IHJvbGUgPT09ICd1c2VyJyA/IHVzZXJBdmF0YXJJbml0aWFscyA6IGJvdEF2YXRhckluaXRpYWxzLFxuICAgICAgbGFuZ3VhZ2UsXG5cbiAgICAgIC8vIFRPRE86IFtQNF0gV2Ugd2FudCB0byBkZXByZWNhdGUgYm90QXZhdGFySW5pdGlhbHMvdXNlckF2YXRhckluaXRpYWxzIGJlY2F1c2UgdGhleSBhcmUgbm90IGFzIGhlbHBmdWwgYXMgYXZhdGFySW5pdGlhbHNcbiAgICAgIGJvdEF2YXRhckluaXRpYWxzLFxuICAgICAgdXNlckF2YXRhckluaXRpYWxzXG4gICAgfSksXG4gICAgLi4uc2VsZWN0b3JzXG4gICk7XG5cbmNvbnN0IFN0YWNrZWRMYXlvdXQgPSAoe1xuICBhY3Rpdml0eSxcbiAgaGlkZVRpbWVzdGFtcCxcbiAgcmVuZGVyQWN0aXZpdHlTdGF0dXMsXG4gIHJlbmRlckF0dGFjaG1lbnQsXG4gIHJlbmRlckF2YXRhcixcbiAgc2hvd0NhbGxvdXRcbn0pID0+IHtcbiAgY29uc3QgW3sgYnViYmxlTnViT2Zmc2V0LCBidWJibGVOdWJTaXplLCBidWJibGVGcm9tVXNlck51Yk9mZnNldCwgYnViYmxlRnJvbVVzZXJOdWJTaXplIH1dID0gdXNlU3R5bGVPcHRpb25zKCk7XG4gIGNvbnN0IFt7IGluaXRpYWxzOiBib3RJbml0aWFscyB9XSA9IHVzZUF2YXRhckZvckJvdCgpO1xuICBjb25zdCBbeyBpbml0aWFsczogdXNlckluaXRpYWxzIH1dID0gdXNlQXZhdGFyRm9yVXNlcigpO1xuICBjb25zdCBbeyBzdGFja2VkTGF5b3V0OiBzdGFja2VkTGF5b3V0U3R5bGVTZXQgfV0gPSB1c2VTdHlsZVNldCgpO1xuICBjb25zdCBhcmlhTGFiZWxJZCA9IHVzZVVuaXF1ZUlkKCd3ZWJjaGF0X19zdGFja2VkLWxheW91dF9faWQnKTtcbiAgY29uc3QgbG9jYWxpemUgPSB1c2VMb2NhbGl6ZXIoKTtcbiAgY29uc3Qgcm9vdENsYXNzTmFtZSA9IHVzZVN0eWxlVG9FbW90aW9uT2JqZWN0KCkoUk9PVF9TVFlMRSkgKyAnJztcbiAgY29uc3Qgc2hvd0FjdGl2aXR5U3RhdHVzID0gdHlwZW9mIHJlbmRlckFjdGl2aXR5U3RhdHVzID09PSAnZnVuY3Rpb24nO1xuXG4gIGNvbnN0IHtcbiAgICBhdHRhY2htZW50cyA9IFtdLFxuICAgIGNoYW5uZWxEYXRhOiB7IG1lc3NhZ2VCYWNrOiB7IGRpc3BsYXlUZXh0OiBtZXNzYWdlQmFja0Rpc3BsYXlUZXh0IH0gPSB7fSB9ID0ge30sXG4gICAgZnJvbTogeyByb2xlIH0gPSB7fSxcbiAgICB0ZXh0LFxuICAgIHRleHRGb3JtYXRcbiAgfSA9IGFjdGl2aXR5O1xuXG4gIGNvbnN0IGFjdGl2aXR5RGlzcGxheVRleHQgPSBtZXNzYWdlQmFja0Rpc3BsYXlUZXh0IHx8IHRleHQ7XG4gIGNvbnN0IGZyb21Vc2VyID0gcm9sZSA9PT0gJ3VzZXInO1xuXG4gIGNvbnN0IGF0dGFjaGVkQWx0ID0gbG9jYWxpemUoZnJvbVVzZXIgPyAnQUNUSVZJVFlfWU9VX0FUVEFDSEVEX0FMVCcgOiAnQUNUSVZJVFlfQk9UX0FUVEFDSEVEX0FMVCcpO1xuICBjb25zdCBncmVldGluZ0FsdCA9IChmcm9tVXNlclxuICAgID8gbG9jYWxpemUoJ0FDVElWSVRZX1lPVV9TQUlEX0FMVCcpXG4gICAgOiBsb2NhbGl6ZSgnQUNUSVZJVFlfQk9UX1NBSURfQUxUJywgYm90SW5pdGlhbHMgfHwgJycpXG4gICkucmVwbGFjZSgvXFxzezIsfS9ndSwgJyAnKTtcblxuICBjb25zdCBpbml0aWFscyA9IGZyb21Vc2VyID8gdXNlckluaXRpYWxzIDogYm90SW5pdGlhbHM7XG4gIGNvbnN0IG51Yk9mZnNldCA9IGZyb21Vc2VyID8gYnViYmxlRnJvbVVzZXJOdWJPZmZzZXQgOiBidWJibGVOdWJPZmZzZXQ7XG4gIGNvbnN0IG51YlNpemUgPSBmcm9tVXNlciA/IGJ1YmJsZUZyb21Vc2VyTnViU2l6ZSA6IGJ1YmJsZU51YlNpemU7XG4gIGNvbnN0IG90aGVySW5pdGlhbHMgPSBmcm9tVXNlciA/IGJvdEluaXRpYWxzIDogdXNlckluaXRpYWxzO1xuICBjb25zdCBvdGhlck51YlNpemUgPSBmcm9tVXNlciA/IGJ1YmJsZU51YlNpemUgOiBidWJibGVGcm9tVXNlck51YlNpemU7XG5cbiAgY29uc3QgaGFzQXZhdGFyID0gaW5pdGlhbHMgfHwgdHlwZW9mIGluaXRpYWxzID09PSAnc3RyaW5nJztcbiAgY29uc3QgaGFzT3RoZXJBdmF0YXIgPSBvdGhlckluaXRpYWxzIHx8IHR5cGVvZiBvdGhlckluaXRpYWxzID09PSAnc3RyaW5nJztcbiAgY29uc3QgaGFzTnViID0gdHlwZW9mIG51YlNpemUgPT09ICdudW1iZXInO1xuICBjb25zdCBoYXNPdGhlck51YiA9IHR5cGVvZiBvdGhlck51YlNpemUgPT09ICdudW1iZXInO1xuICBjb25zdCB0b3BBbGlnbmVkQ2FsbG91dCA9IGlzWmVyb09yUG9zaXRpdmUobnViT2Zmc2V0KTtcblxuICBjb25zdCBleHRyYVRyYWlsaW5nID0gIWhhc090aGVyQXZhdGFyICYmIGhhc090aGVyTnViOyAvLyBUaGlzIGlzIGZvciBib3QgbWVzc2FnZSB3aXRoIHVzZXIgbnViIGFuZCBubyB1c2VyIGF2YXRhci4gQW5kIHZpY2UgdmVyc2EuXG5cbiAgY29uc3Qgc2hvd0F2YXRhciA9IHNob3dDYWxsb3V0ICYmIGhhc0F2YXRhciAmJiAhIXJlbmRlckF2YXRhcjtcbiAgY29uc3Qgc2hvd051YiA9IHNob3dDYWxsb3V0ICYmIGhhc051YiAmJiAodG9wQWxpZ25lZENhbGxvdXQgfHwgIWF0dGFjaG1lbnRzLmxlbmd0aCk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBhcmlhLWxhYmVsbGVkYnk9e2FjdGl2aXR5RGlzcGxheVRleHQgPyBhcmlhTGFiZWxJZCA6IHVuZGVmaW5lZH1cbiAgICAgIGFyaWEtcm9sZWRlc2NyaXB0aW9uPVwiYWN0aXZpdHlcIlxuICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVzKCd3ZWJjaGF0X19zdGFja2VkLWxheW91dCcsIHJvb3RDbGFzc05hbWUsIHN0YWNrZWRMYXlvdXRTdHlsZVNldCArICcnLCB7XG4gICAgICAgICd3ZWJjaGF0X19zdGFja2VkLWxheW91dC0tZXh0cmEtdHJhaWxpbmcnOiBleHRyYVRyYWlsaW5nLFxuICAgICAgICAnd2ViY2hhdF9fc3RhY2tlZC1sYXlvdXQtLWZyb20tdXNlcic6IGZyb21Vc2VyLFxuICAgICAgICAnd2ViY2hhdF9fc3RhY2tlZC1sYXlvdXQtLWhpZGUtYXZhdGFyJzogaGFzQXZhdGFyICYmICFzaG93QXZhdGFyLFxuICAgICAgICAnd2ViY2hhdF9fc3RhY2tlZC1sYXlvdXQtLWhpZGUtbnViJzogaGFzTnViICYmICFzaG93TnViLFxuICAgICAgICAnd2ViY2hhdF9fc3RhY2tlZC1sYXlvdXQtLW5vLW1lc3NhZ2UnOiAhYWN0aXZpdHlEaXNwbGF5VGV4dCxcbiAgICAgICAgJ3dlYmNoYXRfX3N0YWNrZWQtbGF5b3V0LS1zaG93LWF2YXRhcic6IHNob3dBdmF0YXIsXG4gICAgICAgICd3ZWJjaGF0X19zdGFja2VkLWxheW91dC0tc2hvdy1udWInOiBzaG93TnViLFxuICAgICAgICAnd2ViY2hhdF9fc3RhY2tlZC1sYXlvdXQtLXRvcC1jYWxsb3V0JzogdG9wQWxpZ25lZENhbGxvdXRcbiAgICAgIH0pfVxuICAgICAgcm9sZT1cImdyb3VwXCJcbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIndlYmNoYXRfX3N0YWNrZWQtbGF5b3V0X19tYWluXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwid2ViY2hhdF9fc3RhY2tlZC1sYXlvdXRfX2F2YXRhci1ndXR0ZXJcIj57c2hvd0F2YXRhciAmJiByZW5kZXJBdmF0YXIoeyBhY3Rpdml0eSB9KX08L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3ZWJjaGF0X19zdGFja2VkLWxheW91dF9fY29udGVudFwiPlxuICAgICAgICAgIHshIWFjdGl2aXR5RGlzcGxheVRleHQgJiYgKFxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBhcmlhLXJvbGVkZXNjcmlwdGlvbj1cIm1lc3NhZ2VcIlxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3ZWJjaGF0X19zdGFja2VkLWxheW91dF9fbWVzc2FnZS1yb3dcIlxuICAgICAgICAgICAgICAvLyBEaXNhYmxlIFwiUHJvcCBgaWRgIGlzIGZvcmJpZGRlbiBvbiBET00gTm9kZXNcIiBydWxlIGJlY2F1c2Ugd2UgYXJlIHVzaW5nIHRoZSBJRCBwcm9wIGZvciBhY2Nlc3NpYmlsaXR5LlxuICAgICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QvZm9yYmlkLWRvbS1wcm9wcyAqL1xuICAgICAgICAgICAgICBpZD17YXJpYUxhYmVsSWR9XG4gICAgICAgICAgICAgIHJvbGU9XCJncm91cFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxTY3JlZW5SZWFkZXJUZXh0IHRleHQ9e2dyZWV0aW5nQWx0fSAvPlxuICAgICAgICAgICAgICA8QnViYmxlXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwid2ViY2hhdF9fc3RhY2tlZC1sYXlvdXRfX21lc3NhZ2VcIlxuICAgICAgICAgICAgICAgIGZyb21Vc2VyPXtmcm9tVXNlcn1cbiAgICAgICAgICAgICAgICBudWI9e3Nob3dOdWIgfHwgKChoYXNBdmF0YXIgfHwgaGFzTnViKSAmJiAnaGlkZGVuJyl9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7cmVuZGVyQXR0YWNobWVudCh7XG4gICAgICAgICAgICAgICAgICBhY3Rpdml0eSxcbiAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDogYWN0aXZpdHlEaXNwbGF5VGV4dCxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGU6IHRleHRGb3JtYXRUb0NvbnRlbnRUeXBlKHRleHRGb3JtYXQpXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgIDwvQnViYmxlPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKX1cbiAgICAgICAgICB7YXR0YWNobWVudHMubWFwKChhdHRhY2htZW50LCBpbmRleCkgPT4gKFxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBhcmlhLXJvbGVkZXNjcmlwdGlvbj1cImF0dGFjaG1lbnRcIlxuICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoJ3dlYmNoYXRfX3N0YWNrZWQtbGF5b3V0X19hdHRhY2htZW50LXJvdycsIHtcbiAgICAgICAgICAgICAgICAnd2ViY2hhdF9fc3RhY2tlZC1sYXlvdXRfX2F0dGFjaG1lbnQtcm93LS1maXJzdCc6ICFpbmRleFxuICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgLyogYXR0YWNobWVudHMgZG8gbm90IGhhdmUgYW4gSUQsIGl0IGlzIGFsd2F5cyBpbmRleGVkIGJ5IG51bWJlciAqL1xuICAgICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3Qvbm8tYXJyYXktaW5kZXgta2V5ICovXG4gICAgICAgICAgICAgIGtleT17aW5kZXh9XG4gICAgICAgICAgICAgIHJvbGU9XCJncm91cFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxTY3JlZW5SZWFkZXJUZXh0IHRleHQ9e2F0dGFjaGVkQWx0fSAvPlxuICAgICAgICAgICAgICA8QnViYmxlXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwid2ViY2hhdF9fc3RhY2tlZC1sYXlvdXRfX2F0dGFjaG1lbnRcIlxuICAgICAgICAgICAgICAgIGZyb21Vc2VyPXtmcm9tVXNlcn1cbiAgICAgICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3Qvbm8tYXJyYXktaW5kZXgta2V5ICovXG4gICAgICAgICAgICAgICAga2V5PXtpbmRleH1cbiAgICAgICAgICAgICAgICBudWI9eyhoYXNBdmF0YXIgfHwgaGFzTnViKSAmJiAnaGlkZGVuJ31cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHtyZW5kZXJBdHRhY2htZW50KHsgYWN0aXZpdHksIGF0dGFjaG1lbnQgfSl9XG4gICAgICAgICAgICAgIDwvQnViYmxlPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKSl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIndlYmNoYXRfX3N0YWNrZWQtbGF5b3V0X19hbGlnbm1lbnQtcGFkXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgICAge3Nob3dBY3Rpdml0eVN0YXR1cyAmJiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwid2ViY2hhdF9fc3RhY2tlZC1sYXlvdXRfX3N0YXR1c1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwid2ViY2hhdF9fc3RhY2tlZC1sYXlvdXRfX2F2YXRhci1ndXR0ZXJcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwid2ViY2hhdF9fc3RhY2tlZC1sYXlvdXRfX251Yi1wYWRcIiAvPlxuICAgICAgICAgIHtyZW5kZXJBY3Rpdml0eVN0YXR1cyh7IGhpZGVUaW1lc3RhbXAgfSl9XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3ZWJjaGF0X19zdGFja2VkLWxheW91dF9fYWxpZ25tZW50LXBhZFwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cblN0YWNrZWRMYXlvdXQuZGVmYXVsdFByb3BzID0ge1xuICBoaWRlVGltZXN0YW1wOiBmYWxzZSxcbiAgcmVuZGVyQWN0aXZpdHlTdGF0dXM6IGZhbHNlLFxuICByZW5kZXJBdmF0YXI6IGZhbHNlLFxuICBzaG93Q2FsbG91dDogdHJ1ZVxufTtcblxuU3RhY2tlZExheW91dC5wcm9wVHlwZXMgPSB7XG4gIGFjdGl2aXR5OiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgIGF0dGFjaG1lbnRzOiBQcm9wVHlwZXMuYXJyYXksXG4gICAgY2hhbm5lbERhdGE6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICBtZXNzYWdlQmFjazogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAgICAgZGlzcGxheVRleHQ6IFByb3BUeXBlcy5zdHJpbmdcbiAgICAgIH0pXG4gICAgfSksXG4gICAgZnJvbTogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAgIHJvbGU6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZFxuICAgIH0pLmlzUmVxdWlyZWQsXG4gICAgdGV4dDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICB0ZXh0Rm9ybWF0OiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIHRpbWVzdGFtcDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICB0eXBlOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWRcbiAgfSkuaXNSZXF1aXJlZCxcbiAgaGlkZVRpbWVzdGFtcDogUHJvcFR5cGVzLmJvb2wsXG4gIHJlbmRlckFjdGl2aXR5U3RhdHVzOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMub25lT2YoW2ZhbHNlXSksIFByb3BUeXBlcy5mdW5jXSksXG4gIHJlbmRlckF0dGFjaG1lbnQ6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIHJlbmRlckF2YXRhcjogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm9uZU9mKFtmYWxzZV0pLCBQcm9wVHlwZXMuZnVuY10pLFxuICBzaG93Q2FsbG91dDogUHJvcFR5cGVzLmJvb2xcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFN0YWNrZWRMYXlvdXQ7XG5cbmV4cG9ydCB7IGNvbm5lY3RTdGFja2VkTGF5b3V0IH07XG4iXX0=