botframework-webchat-component
Version:
React component of botframework-webchat
233 lines (230 loc) • 43.9 kB
JavaScript
"use strict";
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _botframeworkWebchatApi = require("botframework-webchat-api");
var _classnames = _interopRequireDefault(require("classnames"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _react = _interopRequireWildcard(require("react"));
var _decorator = require("botframework-webchat-api/decorator");
var _Bubble = _interopRequireDefault(require("./Bubble"));
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 _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
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) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_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; } /* eslint complexity: ["error", 50] */
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 StackedLayout = function StackedLayout(_ref) {
var _activity$channelData, _activity$channelData2;
var activity = _ref.activity,
hideTimestamp = _ref.hideTimestamp,
renderActivityStatus = _ref.renderActivityStatus,
renderAttachment = _ref.renderAttachment,
renderAvatar = _ref.renderAvatar,
showCallout = _ref.showCallout;
var _useStyleOptions = useStyleOptions(),
_useStyleOptions2 = _slicedToArray(_useStyleOptions, 1),
styleOptions = _useStyleOptions2[0];
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 bubbleNubOffset = styleOptions.bubbleNubOffset,
bubbleNubSize = styleOptions.bubbleNubSize,
bubbleFromUserNubOffset = styleOptions.bubbleFromUserNubOffset,
bubbleFromUserNubSize = styleOptions.bubbleFromUserNubSize;
var isMessage = activity.type === 'message';
var attachments = isMessage && activity.attachments || [];
var fromUser = activity.from.role === 'user';
var messageBackDisplayText = isMessage && ((_activity$channelData = activity.channelData) === null || _activity$channelData === void 0 ? void 0 : (_activity$channelData2 = _activity$channelData.messageBack) === null || _activity$channelData2 === void 0 ? void 0 : _activity$channelData2.displayText) || '';
var activityDisplayText = isMessage ? messageBackDisplayText || activity.text : '';
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 !== null && attachments !== void 0 && attachments.length));
return /*#__PURE__*/_react.default.createElement("div", {
"aria-labelledby": activityDisplayText ? ariaLabelId : undefined,
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
})
}, /*#__PURE__*/_react.default.createElement("div", {
className: "webchat__stacked-layout__main"
}, /*#__PURE__*/_react.default.createElement("div", {
className: "webchat__stacked-layout__avatar-gutter"
}, showAvatar && renderAvatar()), /*#__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' : false)
}, /*#__PURE__*/_react.default.createElement(_decorator.ActivityDecorator, {
activity: activity
}, renderAttachment({
activity: activity,
attachment: isMessage ? {
content: activityDisplayText,
contentType: (0, _textFormatToContentType.default)(activity.textFormat)
} : undefined
})))), 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' : false
}, renderAttachment({
activity: activity,
attachment: attachment
})));
})), /*#__PURE__*/_react.default.createElement("div", {
className: "webchat__stacked-layout__alignment-pad"
})), typeof renderActivityStatus === 'function' && /*#__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: function renderActivityStatus() {
return false;
},
renderAvatar: undefined,
showCallout: true
};
StackedLayout.propTypes = {
// PropTypes cannot fully capture TypeScript types.
// @ts-ignore
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.oneOf(['markdown', 'plain', 'xml']),
timestamp: _propTypes.default.string,
type: _propTypes.default.string.isRequired
}).isRequired,
hideTimestamp: _propTypes.default.bool,
// PropTypes cannot validate precisely with its TypeScript counterpart.
// @ts-ignore
renderActivityStatus: _propTypes.default.oneOfType([_propTypes.default.oneOf([false]), _propTypes.default.func]),
renderAttachment: _propTypes.default.func.isRequired,
// PropTypes cannot validate precisely with its TypeScript counterpart.
// @ts-ignore
renderAvatar: _propTypes.default.oneOfType([_propTypes.default.oneOf([false]), _propTypes.default.func]),
showCallout: _propTypes.default.bool
};
var _default = /*#__PURE__*/(0, _react.memo)(StackedLayout);
exports.default = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYm90ZnJhbWV3b3JrV2ViY2hhdEFwaSIsInJlcXVpcmUiLCJfY2xhc3NuYW1lcyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfcHJvcFR5cGVzIiwiX3JlYWN0IiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfZGVjb3JhdG9yIiwiX0J1YmJsZSIsIl9pc1plcm9PclBvc2l0aXZlIiwiX1NjcmVlblJlYWRlclRleHQiLCJfdGV4dEZvcm1hdFRvQ29udGVudFR5cGUiLCJfdXNlU3R5bGVTZXQzIiwiX3VzZVN0eWxlVG9FbW90aW9uT2JqZWN0IiwiX3VzZVVuaXF1ZUlkIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwibm9kZUludGVyb3AiLCJXZWFrTWFwIiwiY2FjaGVCYWJlbEludGVyb3AiLCJjYWNoZU5vZGVJbnRlcm9wIiwib2JqIiwiX19lc01vZHVsZSIsIl90eXBlb2YiLCJkZWZhdWx0IiwiY2FjaGUiLCJoYXMiLCJnZXQiLCJuZXdPYmoiLCJoYXNQcm9wZXJ0eURlc2NyaXB0b3IiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImRlc2MiLCJzZXQiLCJfc2xpY2VkVG9BcnJheSIsImFyciIsImkiLCJfYXJyYXlXaXRoSG9sZXMiLCJfaXRlcmFibGVUb0FycmF5TGltaXQiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJfbm9uSXRlcmFibGVSZXN0IiwiVHlwZUVycm9yIiwibyIsIm1pbkxlbiIsIl9hcnJheUxpa2VUb0FycmF5IiwibiIsInRvU3RyaW5nIiwic2xpY2UiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJBcnJheSIsImZyb20iLCJ0ZXN0IiwibGVuIiwibGVuZ3RoIiwiYXJyMiIsIl9pIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJfYXJyIiwiX24iLCJfZCIsIl9zIiwiX2UiLCJuZXh0IiwiZG9uZSIsInB1c2giLCJ2YWx1ZSIsImVyciIsImlzQXJyYXkiLCJ1c2VBdmF0YXJGb3JCb3QiLCJob29rcyIsInVzZUF2YXRhckZvclVzZXIiLCJ1c2VMb2NhbGl6ZXIiLCJ1c2VTdHlsZU9wdGlvbnMiLCJST09UX1NUWUxFIiwicG9zaXRpb24iLCJkaXNwbGF5IiwiZmxleFNocmluayIsIndpZHRoIiwiZmxleERpcmVjdGlvbiIsImZsZXgiLCJvdmVyZmxvdyIsIlN0YWNrZWRMYXlvdXQiLCJfcmVmIiwiX2FjdGl2aXR5JGNoYW5uZWxEYXRhIiwiX2FjdGl2aXR5JGNoYW5uZWxEYXRhMiIsImFjdGl2aXR5IiwiaGlkZVRpbWVzdGFtcCIsInJlbmRlckFjdGl2aXR5U3RhdHVzIiwicmVuZGVyQXR0YWNobWVudCIsInJlbmRlckF2YXRhciIsInNob3dDYWxsb3V0IiwiX3VzZVN0eWxlT3B0aW9ucyIsIl91c2VTdHlsZU9wdGlvbnMyIiwic3R5bGVPcHRpb25zIiwiX3VzZUF2YXRhckZvckJvdCIsIl91c2VBdmF0YXJGb3JCb3QyIiwiYm90SW5pdGlhbHMiLCJpbml0aWFscyIsIl91c2VBdmF0YXJGb3JVc2VyIiwiX3VzZUF2YXRhckZvclVzZXIyIiwidXNlckluaXRpYWxzIiwiX3VzZVN0eWxlU2V0IiwidXNlU3R5bGVTZXQiLCJfdXNlU3R5bGVTZXQyIiwic3RhY2tlZExheW91dFN0eWxlU2V0Iiwic3RhY2tlZExheW91dCIsImFyaWFMYWJlbElkIiwidXNlVW5pcXVlSWQiLCJsb2NhbGl6ZSIsInJvb3RDbGFzc05hbWUiLCJ1c2VTdHlsZVRvRW1vdGlvbk9iamVjdCIsImJ1YmJsZU51Yk9mZnNldCIsImJ1YmJsZU51YlNpemUiLCJidWJibGVGcm9tVXNlck51Yk9mZnNldCIsImJ1YmJsZUZyb21Vc2VyTnViU2l6ZSIsImlzTWVzc2FnZSIsInR5cGUiLCJhdHRhY2htZW50cyIsImZyb21Vc2VyIiwicm9sZSIsIm1lc3NhZ2VCYWNrRGlzcGxheVRleHQiLCJjaGFubmVsRGF0YSIsIm1lc3NhZ2VCYWNrIiwiZGlzcGxheVRleHQiLCJhY3Rpdml0eURpc3BsYXlUZXh0IiwidGV4dCIsImF0dGFjaGVkQWx0IiwiZ3JlZXRpbmdBbHQiLCJyZXBsYWNlIiwibnViT2Zmc2V0IiwibnViU2l6ZSIsIm90aGVySW5pdGlhbHMiLCJvdGhlck51YlNpemUiLCJoYXNBdmF0YXIiLCJoYXNPdGhlckF2YXRhciIsImhhc051YiIsImhhc090aGVyTnViIiwidG9wQWxpZ25lZENhbGxvdXQiLCJpc1plcm9PclBvc2l0aXZlIiwiZXh0cmFUcmFpbGluZyIsInNob3dBdmF0YXIiLCJzaG93TnViIiwiY3JlYXRlRWxlbWVudCIsInVuZGVmaW5lZCIsImNsYXNzTmFtZSIsImNsYXNzTmFtZXMiLCJpZCIsIm51YiIsIkFjdGl2aXR5RGVjb3JhdG9yIiwiYXR0YWNobWVudCIsImNvbnRlbnQiLCJjb250ZW50VHlwZSIsInRleHRGb3JtYXRUb0NvbnRlbnRUeXBlIiwidGV4dEZvcm1hdCIsIm1hcCIsImluZGV4IiwiZGVmYXVsdFByb3BzIiwicHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwic2hhcGUiLCJhcnJheSIsInN0cmluZyIsImlzUmVxdWlyZWQiLCJvbmVPZiIsInRpbWVzdGFtcCIsImJvb2wiLCJvbmVPZlR5cGUiLCJmdW5jIiwiX2RlZmF1bHQiLCJtZW1vIiwiZXhwb3J0cyJdLCJzb3VyY2VSb290IjoiY29tcG9uZW50Oi8vLyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL0FjdGl2aXR5L1N0YWNrZWRMYXlvdXQudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludCBjb21wbGV4aXR5OiBbXCJlcnJvclwiLCA1MF0gKi9cblxuaW1wb3J0IHsgaG9va3MgfSBmcm9tICdib3RmcmFtZXdvcmstd2ViY2hhdC1hcGknO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IFJlYWN0LCB7IG1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBBY3Rpdml0eURlY29yYXRvciB9IGZyb20gJ2JvdGZyYW1ld29yay13ZWJjaGF0LWFwaS9kZWNvcmF0b3InO1xuXG5pbXBvcnQgQnViYmxlIGZyb20gJy4vQnViYmxlJztcbmltcG9ydCBpc1plcm9PclBvc2l0aXZlIGZyb20gJy4uL1V0aWxzL2lzWmVyb09yUG9zaXRpdmUnO1xuaW1wb3J0IFNjcmVlblJlYWRlclRleHQgZnJvbSAnLi4vU2NyZWVuUmVhZGVyVGV4dCc7XG5pbXBvcnQgdGV4dEZvcm1hdFRvQ29udGVudFR5cGUgZnJvbSAnLi4vVXRpbHMvdGV4dEZvcm1hdFRvQ29udGVudFR5cGUnO1xuaW1wb3J0IHVzZVN0eWxlU2V0IGZyb20gJy4uL2hvb2tzL3VzZVN0eWxlU2V0JztcbmltcG9ydCB1c2VTdHlsZVRvRW1vdGlvbk9iamVjdCBmcm9tICcuLi9ob29rcy9pbnRlcm5hbC91c2VTdHlsZVRvRW1vdGlvbk9iamVjdCc7XG5pbXBvcnQgdXNlVW5pcXVlSWQgZnJvbSAnLi4vaG9va3MvaW50ZXJuYWwvdXNlVW5pcXVlSWQnO1xuXG5pbXBvcnQgdHlwZSB7IEZDLCBSZWFjdE5vZGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7IFJlbmRlckF0dGFjaG1lbnQgfSBmcm9tICdib3RmcmFtZXdvcmstd2ViY2hhdC1hcGknO1xuaW1wb3J0IHR5cGUgeyBXZWJDaGF0QWN0aXZpdHkgfSBmcm9tICdib3RmcmFtZXdvcmstd2ViY2hhdC1jb3JlJztcblxuY29uc3QgeyB1c2VBdmF0YXJGb3JCb3QsIHVzZUF2YXRhckZvclVzZXIsIHVzZUxvY2FsaXplciwgdXNlU3R5bGVPcHRpb25zIH0gPSBob29rcztcblxuY29uc3QgUk9PVF9TVFlMRSA9IHtcbiAgJyYud2ViY2hhdF9fc3RhY2tlZC1sYXlvdXQnOiB7XG4gICAgcG9zaXRpb246ICdyZWxhdGl2ZScsIC8vIFRoaXMgaXMgdG8ga2VlcCBzY3JlZW4gcmVhZGVyIHRleHQgaW4gdGhlIGRlc3RpbmF0ZWQgYXJlYS5cblxuICAgICcmIC53ZWJjaGF0X19zdGFja2VkLWxheW91dF9fYXR0YWNobWVudC1yb3csICYgLndlYmNoYXRfX3N0YWNrZWQtbGF5b3V0X19tYWluLCAmIC53ZWJjaGF0X19zdGFja2VkLWxheW91dF9fbWVzc2FnZS1yb3csICYgLndlYmNoYXRfX3N0YWNrZWQtbGF5b3V0X19zdGF0dXMnOlxuICAgICAge1xuICAgICAgICBkaXNwbGF5OiAnZmxleCdcbiAgICAgIH0sXG5cbiAgICAnJiAud2ViY2hhdF9fc3RhY2tlZC1sYXlvdXRfX2FsaWdubWVudC1wYWQnOiB7XG4gICAgICBmbGV4U2hyaW5rOiAwXG4gICAgfSxcblxuICAgICcmIC53ZWJjaGF0X19zdGFja2VkLWxheW91dF9fYXR0YWNobWVudCc6IHtcbiAgICAgIHdpZHRoOiAnMTAwJSdcbiAgICB9LFxuXG4gICAgJyYgLndlYmNoYXRfX3N0YWNrZWQtbGF5b3V0X19hdmF0YXItZ3V0dGVyJzoge1xuICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsXG4gICAgICBmbGV4U2hyaW5rOiAwXG4gICAgfSxcblxuICAgICcmLndlYmNoYXRfX3N0YWNrZWQtbGF5b3V0LS1mcm9tLXVzZXInOiB7XG4gICAgICAnJiAud2ViY2hhdF9fc3RhY2tlZC1sYXlvdXRfX2F0dGFjaG1lbnQtcm93LCAmIC53ZWJjaGF0X19zdGFja2VkLWxheW91dF9fbWFpbiwgJiAud2ViY2hhdF9fc3RhY2tlZC1sYXlvdXRfX21lc3NhZ2Utcm93LCAmIC53ZWJjaGF0X19zdGFja2VkLWxheW91dF9fc3RhdHVzJzpcbiAgICAgICAge1xuICAgICAgICAgIGZsZXhEaXJlY3Rpb246ICdyb3ctcmV2ZXJzZSdcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAnJiAud2ViY2hhdF9fc3RhY2tlZC1sYXlvdXRfX2NvbnRlbnQnOiB7XG4gICAgICBmbGV4OiAxLFxuXG4gICAgICAvLyBUaGlzIGlzIGZvciBib3R0b20gYWxpZ25pbmcgYW4gYXZhdGFyIHdpdGggYSBtZXNzYWdlIGJ1YmJsZSBzaG9ydGVyIHRoYW4gdGhlIGF2YXRhci5cbiAgICAgIC8vIFJlbGF0ZWQgdG8gdGhlIHRlc3QgYXQgYWN0aXZpdHlHcm91cGluZy5hdmF0YXJNaWRkbGV3YXJlLmF0Qm90dG9tLmpzLlxuICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsXG5cbiAgICAgIC8vIFRoaXMgXCJvdmVyZmxvdzogaGlkZGVuXCIgaXMgdG8gbWFrZSBzdXJlIHRleHQgb3ZlcmZsb3cgd2lsbCBnZXQgY2xpcHBlZCBjb3JyZWN0bHkuXG4gICAgICAvLyBSZWxhdGVkIHRvIHRoZSB0ZXN0IGF0IGJhc2ljLmpzIFwibG9uZyBVUkxzIHdpdGgga2VlcC1hbGxcIi5cbiAgICAgIG92ZXJmbG93OiAnaGlkZGVuJ1xuICAgIH0sXG5cbiAgICAnJiAud2ViY2hhdF9fc3RhY2tlZC1sYXlvdXRfX251Yi1wYWQnOiB7XG4gICAgICBmbGV4U2hyaW5rOiAwXG4gICAgfVxuICB9XG59O1xuXG50eXBlIFN0YWNrZWRMYXlvdXRQcm9wcyA9IHtcbiAgYWN0aXZpdHk6IFdlYkNoYXRBY3Rpdml0eTtcbiAgaGlkZVRpbWVzdGFtcD86IGJvb2xlYW47XG4gIHJlbmRlckFjdGl2aXR5U3RhdHVzPzogKG9wdGlvbnM6IHsgaGlkZVRpbWVzdGFtcDogYm9vbGVhbiB9KSA9PiBSZWFjdE5vZGU7XG4gIHJlbmRlckF0dGFjaG1lbnQ/OiBSZW5kZXJBdHRhY2htZW50O1xuICByZW5kZXJBdmF0YXI/OiBmYWxzZSB8ICgoKSA9PiBFeGNsdWRlPFJlYWN0Tm9kZSwgYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQ+KTtcbiAgc2hvd0NhbGxvdXQ/OiBib29sZWFuO1xufTtcblxuY29uc3QgU3RhY2tlZExheW91dDogRkM8U3RhY2tlZExheW91dFByb3BzPiA9ICh7XG4gIGFjdGl2aXR5LFxuICBoaWRlVGltZXN0YW1wLFxuICByZW5kZXJBY3Rpdml0eVN0YXR1cyxcbiAgcmVuZGVyQXR0YWNobWVudCxcbiAgcmVuZGVyQXZhdGFyLFxuICBzaG93Q2FsbG91dFxufSkgPT4ge1xuICBjb25zdCBbc3R5bGVPcHRpb25zXSA9IHVzZVN0eWxlT3B0aW9ucygpO1xuICBjb25zdCBbeyBpbml0aWFsczogYm90SW5pdGlhbHMgfV0gPSB1c2VBdmF0YXJGb3JCb3QoKTtcbiAgY29uc3QgW3sgaW5pdGlhbHM6IHVzZXJJbml0aWFscyB9XSA9IHVzZUF2YXRhckZvclVzZXIoKTtcbiAgY29uc3QgW3sgc3RhY2tlZExheW91dDogc3RhY2tlZExheW91dFN0eWxlU2V0IH1dID0gdXNlU3R5bGVTZXQoKTtcbiAgY29uc3QgYXJpYUxhYmVsSWQgPSB1c2VVbmlxdWVJZCgnd2ViY2hhdF9fc3RhY2tlZC1sYXlvdXRfX2lkJyk7XG4gIGNvbnN0IGxvY2FsaXplID0gdXNlTG9jYWxpemVyKCk7XG4gIGNvbnN0IHJvb3RDbGFzc05hbWUgPSB1c2VTdHlsZVRvRW1vdGlvbk9iamVjdCgpKFJPT1RfU1RZTEUpICsgJyc7XG5cbiAgY29uc3QgeyBidWJibGVOdWJPZmZzZXQsIGJ1YmJsZU51YlNpemUsIGJ1YmJsZUZyb21Vc2VyTnViT2Zmc2V0LCBidWJibGVGcm9tVXNlck51YlNpemUgfSA9IHN0eWxlT3B0aW9ucztcblxuICBjb25zdCBpc01lc3NhZ2UgPSBhY3Rpdml0eS50eXBlID09PSAnbWVzc2FnZSc7XG5cbiAgY29uc3QgYXR0YWNobWVudHMgPSAoaXNNZXNzYWdlICYmIGFjdGl2aXR5LmF0dGFjaG1lbnRzKSB8fCBbXTtcbiAgY29uc3QgZnJvbVVzZXIgPSBhY3Rpdml0eS5mcm9tLnJvbGUgPT09ICd1c2VyJztcbiAgY29uc3QgbWVzc2FnZUJhY2tEaXNwbGF5VGV4dDogc3RyaW5nID0gKGlzTWVzc2FnZSAmJiBhY3Rpdml0eS5jaGFubmVsRGF0YT8ubWVzc2FnZUJhY2s/LmRpc3BsYXlUZXh0KSB8fCAnJztcblxuICBjb25zdCBhY3Rpdml0eURpc3BsYXlUZXh0ID0gaXNNZXNzYWdlID8gbWVzc2FnZUJhY2tEaXNwbGF5VGV4dCB8fCBhY3Rpdml0eS50ZXh0IDogJyc7XG4gIGNvbnN0IGF0dGFjaGVkQWx0ID0gbG9jYWxpemUoZnJvbVVzZXIgPyAnQUNUSVZJVFlfWU9VX0FUVEFDSEVEX0FMVCcgOiAnQUNUSVZJVFlfQk9UX0FUVEFDSEVEX0FMVCcpO1xuICBjb25zdCBncmVldGluZ0FsdCA9IChcbiAgICBmcm9tVXNlciA/IGxvY2FsaXplKCdBQ1RJVklUWV9ZT1VfU0FJRF9BTFQnKSA6IGxvY2FsaXplKCdBQ1RJVklUWV9CT1RfU0FJRF9BTFQnLCBib3RJbml0aWFscyB8fCAnJylcbiAgKS5yZXBsYWNlKC9cXHN7Mix9L2d1LCAnICcpO1xuXG4gIGNvbnN0IGluaXRpYWxzID0gZnJvbVVzZXIgPyB1c2VySW5pdGlhbHMgOiBib3RJbml0aWFscztcbiAgY29uc3QgbnViT2Zmc2V0ID0gZnJvbVVzZXIgPyBidWJibGVGcm9tVXNlck51Yk9mZnNldCA6IGJ1YmJsZU51Yk9mZnNldDtcbiAgY29uc3QgbnViU2l6ZSA9IGZyb21Vc2VyID8gYnViYmxlRnJvbVVzZXJOdWJTaXplIDogYnViYmxlTnViU2l6ZTtcbiAgY29uc3Qgb3RoZXJJbml0aWFscyA9IGZyb21Vc2VyID8gYm90SW5pdGlhbHMgOiB1c2VySW5pdGlhbHM7XG4gIGNvbnN0IG90aGVyTnViU2l6ZSA9IGZyb21Vc2VyID8gYnViYmxlTnViU2l6ZSA6IGJ1YmJsZUZyb21Vc2VyTnViU2l6ZTtcblxuICBjb25zdCBoYXNBdmF0YXIgPSBpbml0aWFscyB8fCB0eXBlb2YgaW5pdGlhbHMgPT09ICdzdHJpbmcnO1xuICBjb25zdCBoYXNPdGhlckF2YXRhciA9IG90aGVySW5pdGlhbHMgfHwgdHlwZW9mIG90aGVySW5pdGlhbHMgPT09ICdzdHJpbmcnO1xuICBjb25zdCBoYXNOdWIgPSB0eXBlb2YgbnViU2l6ZSA9PT0gJ251bWJlcic7XG4gIGNvbnN0IGhhc090aGVyTnViID0gdHlwZW9mIG90aGVyTnViU2l6ZSA9PT0gJ251bWJlcic7XG4gIGNvbnN0IHRvcEFsaWduZWRDYWxsb3V0ID0gaXNaZXJvT3JQb3NpdGl2ZShudWJPZmZzZXQpO1xuXG4gIGNvbnN0IGV4dHJhVHJhaWxpbmcgPSAhaGFzT3RoZXJBdmF0YXIgJiYgaGFzT3RoZXJOdWI7IC8vIFRoaXMgaXMgZm9yIGJvdCBtZXNzYWdlIHdpdGggdXNlciBudWIgYW5kIG5vIHVzZXIgYXZhdGFyLiBBbmQgdmljZSB2ZXJzYS5cblxuICBjb25zdCBzaG93QXZhdGFyID0gc2hvd0NhbGxvdXQgJiYgaGFzQXZhdGFyICYmICEhcmVuZGVyQXZhdGFyO1xuICBjb25zdCBzaG93TnViID0gc2hvd0NhbGxvdXQgJiYgaGFzTnViICYmICh0b3BBbGlnbmVkQ2FsbG91dCB8fCAhYXR0YWNobWVudHM/Lmxlbmd0aCk7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBhcmlhLWxhYmVsbGVkYnk9e2FjdGl2aXR5RGlzcGxheVRleHQgPyBhcmlhTGFiZWxJZCA6IHVuZGVmaW5lZH1cbiAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lcygnd2ViY2hhdF9fc3RhY2tlZC1sYXlvdXQnLCByb290Q2xhc3NOYW1lLCBzdGFja2VkTGF5b3V0U3R5bGVTZXQgKyAnJywge1xuICAgICAgICAnd2ViY2hhdF9fc3RhY2tlZC1sYXlvdXQtLWV4dHJhLXRyYWlsaW5nJzogZXh0cmFUcmFpbGluZyxcbiAgICAgICAgJ3dlYmNoYXRfX3N0YWNrZWQtbGF5b3V0LS1mcm9tLXVzZXInOiBmcm9tVXNlcixcbiAgICAgICAgJ3dlYmNoYXRfX3N0YWNrZWQtbGF5b3V0LS1oaWRlLWF2YXRhcic6IGhhc0F2YXRhciAmJiAhc2hvd0F2YXRhcixcbiAgICAgICAgJ3dlYmNoYXRfX3N0YWNrZWQtbGF5b3V0LS1oaWRlLW51Yic6IGhhc051YiAmJiAhc2hvd051YixcbiAgICAgICAgJ3dlYmNoYXRfX3N0YWNrZWQtbGF5b3V0LS1uby1tZXNzYWdlJzogIWFjdGl2aXR5RGlzcGxheVRleHQsXG4gICAgICAgICd3ZWJjaGF0X19zdGFja2VkLWxheW91dC0tc2hvdy1hdmF0YXInOiBzaG93QXZhdGFyLFxuICAgICAgICAnd2ViY2hhdF9fc3RhY2tlZC1sYXlvdXQtLXNob3ctbnViJzogc2hvd051YixcbiAgICAgICAgJ3dlYmNoYXRfX3N0YWNrZWQtbGF5b3V0LS10b3AtY2FsbG91dCc6IHRvcEFsaWduZWRDYWxsb3V0XG4gICAgICB9KX1cbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIndlYmNoYXRfX3N0YWNrZWQtbGF5b3V0X19tYWluXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwid2ViY2hhdF9fc3RhY2tlZC1sYXlvdXRfX2F2YXRhci1ndXR0ZXJcIj57c2hvd0F2YXRhciAmJiByZW5kZXJBdmF0YXIoKX08L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3ZWJjaGF0X19zdGFja2VkLWxheW91dF9fY29udGVudFwiPlxuICAgICAgICAgIHshIWFjdGl2aXR5RGlzcGxheVRleHQgJiYgKFxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBhcmlhLXJvbGVkZXNjcmlwdGlvbj1cIm1lc3NhZ2VcIlxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3ZWJjaGF0X19zdGFja2VkLWxheW91dF9fbWVzc2FnZS1yb3dcIlxuICAgICAgICAgICAgICAvLyBEaXNhYmxlIFwiUHJvcCBgaWRgIGlzIGZvcmJpZGRlbiBvbiBET00gTm9kZXNcIiBydWxlIGJlY2F1c2Ugd2UgYXJlIHVzaW5nIHRoZSBJRCBwcm9wIGZvciBhY2Nlc3NpYmlsaXR5LlxuICAgICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QvZm9yYmlkLWRvbS1wcm9wcyAqL1xuICAgICAgICAgICAgICBpZD17YXJpYUxhYmVsSWR9XG4gICAgICAgICAgICAgIHJvbGU9XCJncm91cFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxTY3JlZW5SZWFkZXJUZXh0IHRleHQ9e2dyZWV0aW5nQWx0fSAvPlxuICAgICAgICAgICAgICA8QnViYmxlXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwid2ViY2hhdF9fc3RhY2tlZC1sYXlvdXRfX21lc3NhZ2VcIlxuICAgICAgICAgICAgICAgIGZyb21Vc2VyPXtmcm9tVXNlcn1cbiAgICAgICAgICAgICAgICBudWI9e3Nob3dOdWIgfHwgKGhhc0F2YXRhciB8fCBoYXNOdWIgPyAnaGlkZGVuJyA6IGZhbHNlKX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxBY3Rpdml0eURlY29yYXRvciBhY3Rpdml0eT17YWN0aXZpdHl9PlxuICAgICAgICAgICAgICAgICAge3JlbmRlckF0dGFjaG1lbnQoe1xuICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eSxcbiAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudDogaXNNZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IGFjdGl2aXR5RGlzcGxheVRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlOiB0ZXh0Rm9ybWF0VG9Db250ZW50VHlwZShhY3Rpdml0eS50ZXh0Rm9ybWF0KVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICA8L0FjdGl2aXR5RGVjb3JhdG9yPlxuICAgICAgICAgICAgICA8L0J1YmJsZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG4gICAgICAgICAge2F0dGFjaG1lbnRzLm1hcCgoYXR0YWNobWVudCwgaW5kZXgpID0+IChcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgYXJpYS1yb2xlZGVzY3JpcHRpb249XCJhdHRhY2htZW50XCJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVzKCd3ZWJjaGF0X19zdGFja2VkLWxheW91dF9fYXR0YWNobWVudC1yb3cnLCB7XG4gICAgICAgICAgICAgICAgJ3dlYmNoYXRfX3N0YWNrZWQtbGF5b3V0X19hdHRhY2htZW50LXJvdy0tZmlyc3QnOiAhaW5kZXhcbiAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgIC8qIGF0dGFjaG1lbnRzIGRvIG5vdCBoYXZlIGFuIElELCBpdCBpcyBhbHdheXMgaW5kZXhlZCBieSBudW1iZXIgKi9cbiAgICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L25vLWFycmF5LWluZGV4LWtleSAqL1xuICAgICAgICAgICAgICBrZXk9e2luZGV4fVxuICAgICAgICAgICAgICByb2xlPVwiZ3JvdXBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8U2NyZWVuUmVhZGVyVGV4dCB0ZXh0PXthdHRhY2hlZEFsdH0gLz5cbiAgICAgICAgICAgICAgPEJ1YmJsZVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIndlYmNoYXRfX3N0YWNrZWQtbGF5b3V0X19hdHRhY2htZW50XCJcbiAgICAgICAgICAgICAgICBmcm9tVXNlcj17ZnJvbVVzZXJ9XG4gICAgICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0L25vLWFycmF5LWluZGV4LWtleSAqL1xuICAgICAgICAgICAgICAgIGtleT17aW5kZXh9XG4gICAgICAgICAgICAgICAgbnViPXtoYXNBdmF0YXIgfHwgaGFzTnViID8gJ2hpZGRlbicgOiBmYWxzZX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHtyZW5kZXJBdHRhY2htZW50KHsgYWN0aXZpdHksIGF0dGFjaG1lbnQgfSl9XG4gICAgICAgICAgICAgIDwvQnViYmxlPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKSl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIndlYmNoYXRfX3N0YWNrZWQtbGF5b3V0X19hbGlnbm1lbnQtcGFkXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgICAge3R5cGVvZiByZW5kZXJBY3Rpdml0eVN0YXR1cyA9PT0gJ2Z1bmN0aW9uJyAmJiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwid2ViY2hhdF9fc3RhY2tlZC1sYXlvdXRfX3N0YXR1c1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwid2ViY2hhdF9fc3RhY2tlZC1sYXlvdXRfX2F2YXRhci1ndXR0ZXJcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwid2ViY2hhdF9fc3RhY2tlZC1sYXlvdXRfX251Yi1wYWRcIiAvPlxuICAgICAgICAgIHtyZW5kZXJBY3Rpdml0eVN0YXR1cyh7IGhpZGVUaW1lc3RhbXAgfSl9XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3ZWJjaGF0X19zdGFja2VkLWxheW91dF9fYWxpZ25tZW50LXBhZFwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cblN0YWNrZWRMYXlvdXQuZGVmYXVsdFByb3BzID0ge1xuICBoaWRlVGltZXN0YW1wOiBmYWxzZSxcbiAgcmVuZGVyQWN0aXZpdHlTdGF0dXM6ICgpID0+IGZhbHNlLFxuICByZW5kZXJBdmF0YXI6IHVuZGVmaW5lZCxcbiAgc2hvd0NhbGxvdXQ6IHRydWVcbn07XG5cblN0YWNrZWRMYXlvdXQucHJvcFR5cGVzID0ge1xuICAvLyBQcm9wVHlwZXMgY2Fubm90IGZ1bGx5IGNhcHR1cmUgVHlwZVNjcmlwdCB0eXBlcy5cbiAgLy8gQHRzLWlnbm9yZVxuICBhY3Rpdml0eTogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICBhdHRhY2htZW50czogUHJvcFR5cGVzLmFycmF5LFxuICAgIGNoYW5uZWxEYXRhOiBQcm9wVHlwZXMuc2hhcGUoe1xuICAgICAgbWVzc2FnZUJhY2s6IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICAgIGRpc3BsYXlUZXh0OiBQcm9wVHlwZXMuc3RyaW5nXG4gICAgICB9KVxuICAgIH0pLFxuICAgIGZyb206IFByb3BUeXBlcy5zaGFwZSh7XG4gICAgICByb2xlOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWRcbiAgICB9KS5pc1JlcXVpcmVkLFxuICAgIHRleHQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgdGV4dEZvcm1hdDogUHJvcFR5cGVzLm9uZU9mKFsnbWFya2Rvd24nLCAncGxhaW4nLCAneG1sJ10pLFxuICAgIHRpbWVzdGFtcDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICB0eXBlOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWRcbiAgfSkuaXNSZXF1aXJlZCxcbiAgaGlkZVRpbWVzdGFtcDogUHJvcFR5cGVzLmJvb2wsXG5cbiAgLy8gUHJvcFR5cGVzIGNhbm5vdCB2YWxpZGF0ZSBwcmVjaXNlbHkgd2l0aCBpdHMgVHlwZVNjcmlwdCBjb3VudGVycGFydC5cbiAgLy8gQHRzLWlnbm9yZVxuICByZW5kZXJBY3Rpdml0eVN0YXR1czogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLm9uZU9mKFtmYWxzZV0pLCBQcm9wVHlwZXMuZnVuY10pLFxuICByZW5kZXJBdHRhY2htZW50OiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuXG4gIC8vIFByb3BUeXBlcyBjYW5ub3QgdmFsaWRhdGUgcHJlY2lzZWx5IHdpdGggaXRzIFR5cGVTY3JpcHQgY291bnRlcnBhcnQuXG4gIC8vIEB0cy1pZ25vcmVcbiAgcmVuZGVyQXZhdGFyOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMub25lT2YoW2ZhbHNlXSksIFByb3BUeXBlcy5mdW5jXSksXG4gIHNob3dDYWxsb3V0OiBQcm9wVHlwZXMuYm9vbFxufTtcblxuZXhwb3J0IGRlZmF1bHQgbWVtbyhTdGFja2VkTGF5b3V0KTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUVBLElBQUFBLHVCQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxXQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7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