botframework-webchat-component
Version:
React component of botframework-webchat
160 lines (157 loc) • 30.2 kB
JavaScript
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;
exports.useMicrophoneButtonClick = useMicrophoneButtonClick;
exports.useMicrophoneButtonDisabled = useMicrophoneButtonDisabled;
var _botframeworkWebchatApi = require("botframework-webchat-api");
var _botframeworkWebchatCore = require("botframework-webchat-core");
var _classnames = _interopRequireDefault(require("classnames"));
var _memoizeOne = _interopRequireDefault(require("memoize-one"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _react = _interopRequireWildcard(require("react"));
var _useStyleToEmotionObject = _interopRequireDefault(require("../hooks/internal/useStyleToEmotionObject"));
var _useDictateAbortable3 = _interopRequireDefault(require("../hooks/useDictateAbortable"));
var _useStyleSet3 = _interopRequireDefault(require("../hooks/useStyleSet"));
var _useWebSpeechPonyfill3 = _interopRequireDefault(require("../hooks/useWebSpeechPonyfill"));
var _MicrophoneIcon = _interopRequireDefault(require("./Assets/MicrophoneIcon"));
var _IconButton = _interopRequireDefault(require("./IconButton"));
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; } // This is required for aria-controls.
/* eslint react/forbid-dom-props: "off" */
var DictateState = _botframeworkWebchatCore.Constants.DictateState;
var useDictateInterims = _botframeworkWebchatApi.hooks.useDictateInterims,
useDictateState = _botframeworkWebchatApi.hooks.useDictateState,
useDisabled = _botframeworkWebchatApi.hooks.useDisabled,
useLocalizer = _botframeworkWebchatApi.hooks.useLocalizer,
useSendBoxValue = _botframeworkWebchatApi.hooks.useSendBoxValue,
useShouldSpeakIncomingActivity = _botframeworkWebchatApi.hooks.useShouldSpeakIncomingActivity,
useStartDictate = _botframeworkWebchatApi.hooks.useStartDictate,
useStopDictate = _botframeworkWebchatApi.hooks.useStopDictate;
var ROOT_STYLE = {
display: 'flex',
// .sr-only - This component is intended to be invisible to the visual Web Chat user, but read by the AT when using a screen reader
'& > .sr-only': {
color: 'transparent',
height: 1,
left: -10000,
overflow: 'hidden',
position: 'absolute',
top: 0,
whiteSpace: 'nowrap',
width: 1
}
};
function useMicrophoneButtonClick() {
var _useSendBoxValue = useSendBoxValue(),
_useSendBoxValue2 = _slicedToArray(_useSendBoxValue, 2),
setSendBox = _useSendBoxValue2[1];
var _useShouldSpeakIncomi = useShouldSpeakIncomingActivity(),
_useShouldSpeakIncomi2 = _slicedToArray(_useShouldSpeakIncomi, 2),
setShouldSpeakIncomingActivity = _useShouldSpeakIncomi2[1];
var _useDictateInterims = useDictateInterims(),
_useDictateInterims2 = _slicedToArray(_useDictateInterims, 1),
dictateInterims = _useDictateInterims2[0];
var _useDictateState = useDictateState(),
_useDictateState2 = _slicedToArray(_useDictateState, 1),
dictateState = _useDictateState2[0];
var _useWebSpeechPonyfill = (0, _useWebSpeechPonyfill3.default)(),
_useWebSpeechPonyfill2 = _slicedToArray(_useWebSpeechPonyfill, 1),
webSpeechPonyfill = _useWebSpeechPonyfill2[0];
var startDictate = useStartDictate();
var stopDictate = useStopDictate();
var _ref = webSpeechPonyfill || {},
speechSynthesis = _ref.speechSynthesis,
SpeechSynthesisUtterance = _ref.SpeechSynthesisUtterance;
var _useState = (0, _react.useState)(function () {
return (0, _memoizeOne.default)(function (speechSynthesis, SpeechSynthesisUtterance) {
if (speechSynthesis && SpeechSynthesisUtterance) {
var utterance = new SpeechSynthesisUtterance('');
var _speechSynthesis$getV = speechSynthesis.getVoices();
var _speechSynthesis$getV2 = _slicedToArray(_speechSynthesis$getV, 1);
utterance.voice = _speechSynthesis$getV2[0];
speechSynthesis.speak(utterance);
}
});
}),
_useState2 = _slicedToArray(_useState, 1),
primeSpeechSynthesis = _useState2[0];
// TODO: [P2] We should revisit this function later
// The click() logic seems local to the component, but may not be generalized across all implementations.
return (0, _react.useCallback)(function () {
if (dictateState === DictateState.WILL_START) {
setShouldSpeakIncomingActivity(false);
} else if (dictateState === DictateState.DICTATING) {
stopDictate();
setSendBox(dictateInterims.join(' '));
} else {
setShouldSpeakIncomingActivity(false);
startDictate();
}
primeSpeechSynthesis(speechSynthesis, SpeechSynthesisUtterance);
}, [dictateInterims, dictateState, primeSpeechSynthesis, setSendBox, setShouldSpeakIncomingActivity, speechSynthesis, SpeechSynthesisUtterance, startDictate, stopDictate]);
}
function useMicrophoneButtonDisabled() {
var _useDictateAbortable = (0, _useDictateAbortable3.default)(),
_useDictateAbortable2 = _slicedToArray(_useDictateAbortable, 1),
abortable = _useDictateAbortable2[0];
var _useDictateState3 = useDictateState(),
_useDictateState4 = _slicedToArray(_useDictateState3, 1),
dictateState = _useDictateState4[0];
var _useDisabled = useDisabled(),
_useDisabled2 = _slicedToArray(_useDisabled, 1),
disabled = _useDisabled2[0];
return [disabled || dictateState === DictateState.STARTING || dictateState === DictateState.STOPPING || dictateState === DictateState.DICTATING && !abortable];
}
var MicrophoneButton = function MicrophoneButton(_ref2) {
var className = _ref2.className;
var _useStyleSet = (0, _useStyleSet3.default)(),
_useStyleSet2 = _slicedToArray(_useStyleSet, 1),
microphoneButtonStyleSet = _useStyleSet2[0].microphoneButton;
var _useDictateState5 = useDictateState(),
_useDictateState6 = _slicedToArray(_useDictateState5, 1),
dictateState = _useDictateState6[0];
var _useMicrophoneButtonD = useMicrophoneButtonDisabled(),
_useMicrophoneButtonD2 = _slicedToArray(_useMicrophoneButtonD, 1),
disabled = _useMicrophoneButtonD2[0];
var click = useMicrophoneButtonClick();
var localize = useLocalizer();
var rootClassName = (0, _useStyleToEmotionObject.default)()(ROOT_STYLE) + '';
var dictating = dictateState === DictateState.DICTATING;
return /*#__PURE__*/_react.default.createElement("div", {
"aria-controls": "webchatSendBoxMicrophoneButton",
className: (0, _classnames.default)('webchat__microphone-button', {
'webchat__microphone-button--dictating': dictating
}, microphoneButtonStyleSet + '', rootClassName, (className || '') + '')
}, /*#__PURE__*/_react.default.createElement(_IconButton.default, {
alt: localize('TEXT_INPUT_SPEAK_BUTTON_ALT'),
className: "webchat__microphone-button__button",
disabled: disabled,
onClick: click
}, /*#__PURE__*/_react.default.createElement(_MicrophoneIcon.default, {
className: "webchat__microphone-button__icon"
})), /*#__PURE__*/_react.default.createElement("div", {
"aria-live": "polite",
className: "sr-only",
id: "webchatSendBoxMicrophoneButton",
role: "status"
}, localize(dictating ? 'SPEECH_INPUT_MICROPHONE_BUTTON_OPEN_ALT' : 'SPEECH_INPUT_MICROPHONE_BUTTON_CLOSE_ALT')));
};
MicrophoneButton.defaultProps = {
className: ''
};
MicrophoneButton.propTypes = {
className: _propTypes.default.string
};
var _default = MicrophoneButton;
exports.default = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYm90ZnJhbWV3b3JrV2ViY2hhdEFwaSIsInJlcXVpcmUiLCJfYm90ZnJhbWV3b3JrV2ViY2hhdENvcmUiLCJfY2xhc3NuYW1lcyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfbWVtb2l6ZU9uZSIsIl9wcm9wVHlwZXMiLCJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl91c2VTdHlsZVRvRW1vdGlvbk9iamVjdCIsIl91c2VEaWN0YXRlQWJvcnRhYmxlMyIsIl91c2VTdHlsZVNldDMiLCJfdXNlV2ViU3BlZWNoUG9ueWZpbGwzIiwiX01pY3JvcGhvbmVJY29uIiwiX0ljb25CdXR0b24iLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJub2RlSW50ZXJvcCIsIldlYWtNYXAiLCJjYWNoZUJhYmVsSW50ZXJvcCIsImNhY2hlTm9kZUludGVyb3AiLCJvYmoiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImRlZmF1bHQiLCJjYWNoZSIsImhhcyIsImdldCIsIm5ld09iaiIsImhhc1Byb3BlcnR5RGVzY3JpcHRvciIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwia2V5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiZGVzYyIsInNldCIsIl9zbGljZWRUb0FycmF5IiwiYXJyIiwiaSIsIl9hcnJheVdpdGhIb2xlcyIsIl9pdGVyYWJsZVRvQXJyYXlMaW1pdCIsIl91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsIl9ub25JdGVyYWJsZVJlc3QiLCJUeXBlRXJyb3IiLCJvIiwibWluTGVuIiwiX2FycmF5TGlrZVRvQXJyYXkiLCJuIiwidG9TdHJpbmciLCJzbGljZSIsImNvbnN0cnVjdG9yIiwibmFtZSIsIkFycmF5IiwiZnJvbSIsInRlc3QiLCJsZW4iLCJsZW5ndGgiLCJhcnIyIiwiX2kiLCJTeW1ib2wiLCJpdGVyYXRvciIsIl9hcnIiLCJfbiIsIl9kIiwiX3MiLCJfZSIsIm5leHQiLCJkb25lIiwicHVzaCIsInZhbHVlIiwiZXJyIiwiaXNBcnJheSIsIkRpY3RhdGVTdGF0ZSIsIkNvbnN0YW50cyIsInVzZURpY3RhdGVJbnRlcmltcyIsImhvb2tzIiwidXNlRGljdGF0ZVN0YXRlIiwidXNlRGlzYWJsZWQiLCJ1c2VMb2NhbGl6ZXIiLCJ1c2VTZW5kQm94VmFsdWUiLCJ1c2VTaG91bGRTcGVha0luY29taW5nQWN0aXZpdHkiLCJ1c2VTdGFydERpY3RhdGUiLCJ1c2VTdG9wRGljdGF0ZSIsIlJPT1RfU1RZTEUiLCJkaXNwbGF5IiwiY29sb3IiLCJoZWlnaHQiLCJsZWZ0Iiwib3ZlcmZsb3ciLCJwb3NpdGlvbiIsInRvcCIsIndoaXRlU3BhY2UiLCJ3aWR0aCIsInVzZU1pY3JvcGhvbmVCdXR0b25DbGljayIsIl91c2VTZW5kQm94VmFsdWUiLCJfdXNlU2VuZEJveFZhbHVlMiIsInNldFNlbmRCb3giLCJfdXNlU2hvdWxkU3BlYWtJbmNvbWkiLCJfdXNlU2hvdWxkU3BlYWtJbmNvbWkyIiwic2V0U2hvdWxkU3BlYWtJbmNvbWluZ0FjdGl2aXR5IiwiX3VzZURpY3RhdGVJbnRlcmltcyIsIl91c2VEaWN0YXRlSW50ZXJpbXMyIiwiZGljdGF0ZUludGVyaW1zIiwiX3VzZURpY3RhdGVTdGF0ZSIsIl91c2VEaWN0YXRlU3RhdGUyIiwiZGljdGF0ZVN0YXRlIiwiX3VzZVdlYlNwZWVjaFBvbnlmaWxsIiwidXNlV2ViU3BlZWNoUG9ueWZpbGwiLCJfdXNlV2ViU3BlZWNoUG9ueWZpbGwyIiwid2ViU3BlZWNoUG9ueWZpbGwiLCJzdGFydERpY3RhdGUiLCJzdG9wRGljdGF0ZSIsIl9yZWYiLCJzcGVlY2hTeW50aGVzaXMiLCJTcGVlY2hTeW50aGVzaXNVdHRlcmFuY2UiLCJfdXNlU3RhdGUiLCJ1c2VTdGF0ZSIsIm1lbW9pemUiLCJ1dHRlcmFuY2UiLCJfc3BlZWNoU3ludGhlc2lzJGdldFYiLCJnZXRWb2ljZXMiLCJfc3BlZWNoU3ludGhlc2lzJGdldFYyIiwidm9pY2UiLCJzcGVhayIsIl91c2VTdGF0ZTIiLCJwcmltZVNwZWVjaFN5bnRoZXNpcyIsInVzZUNhbGxiYWNrIiwiV0lMTF9TVEFSVCIsIkRJQ1RBVElORyIsImpvaW4iLCJ1c2VNaWNyb3Bob25lQnV0dG9uRGlzYWJsZWQiLCJfdXNlRGljdGF0ZUFib3J0YWJsZSIsInVzZURpY3RhdGVBYm9ydGFibGUiLCJfdXNlRGljdGF0ZUFib3J0YWJsZTIiLCJhYm9ydGFibGUiLCJfdXNlRGljdGF0ZVN0YXRlMyIsIl91c2VEaWN0YXRlU3RhdGU0IiwiX3VzZURpc2FibGVkIiwiX3VzZURpc2FibGVkMiIsImRpc2FibGVkIiwiU1RBUlRJTkciLCJTVE9QUElORyIsIk1pY3JvcGhvbmVCdXR0b24iLCJfcmVmMiIsImNsYXNzTmFtZSIsIl91c2VTdHlsZVNldCIsInVzZVN0eWxlU2V0IiwiX3VzZVN0eWxlU2V0MiIsIm1pY3JvcGhvbmVCdXR0b25TdHlsZVNldCIsIm1pY3JvcGhvbmVCdXR0b24iLCJfdXNlRGljdGF0ZVN0YXRlNSIsIl91c2VEaWN0YXRlU3RhdGU2IiwiX3VzZU1pY3JvcGhvbmVCdXR0b25EIiwiX3VzZU1pY3JvcGhvbmVCdXR0b25EMiIsImNsaWNrIiwibG9jYWxpemUiLCJyb290Q2xhc3NOYW1lIiwidXNlU3R5bGVUb0Vtb3Rpb25PYmplY3QiLCJkaWN0YXRpbmciLCJjcmVhdGVFbGVtZW50IiwiY2xhc3NOYW1lcyIsImFsdCIsIm9uQ2xpY2siLCJpZCIsInJvbGUiLCJkZWZhdWx0UHJvcHMiLCJwcm9wVHlwZXMiLCJQcm9wVHlwZXMiLCJzdHJpbmciLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlUm9vdCI6ImNvbXBvbmVudDovLy8iLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9TZW5kQm94L01pY3JvcGhvbmVCdXR0b24udHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8vIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGFyaWEtY29udHJvbHMuXG4vKiBlc2xpbnQgcmVhY3QvZm9yYmlkLWRvbS1wcm9wczogXCJvZmZcIiAqL1xuXG5pbXBvcnQgeyBob29rcyB9IGZyb20gJ2JvdGZyYW1ld29yay13ZWJjaGF0LWFwaSc7XG5pbXBvcnQgeyBDb25zdGFudHMgfSBmcm9tICdib3RmcmFtZXdvcmstd2ViY2hhdC1jb3JlJztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IG1lbW9pemUgZnJvbSAnbWVtb2l6ZS1vbmUnO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCBSZWFjdCwgeyBGQywgdXNlQ2FsbGJhY2ssIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgdXNlU3R5bGVUb0Vtb3Rpb25PYmplY3QgZnJvbSAnLi4vaG9va3MvaW50ZXJuYWwvdXNlU3R5bGVUb0Vtb3Rpb25PYmplY3QnO1xuaW1wb3J0IHVzZURpY3RhdGVBYm9ydGFibGUgZnJvbSAnLi4vaG9va3MvdXNlRGljdGF0ZUFib3J0YWJsZSc7XG5pbXBvcnQgdXNlU3R5bGVTZXQgZnJvbSAnLi4vaG9va3MvdXNlU3R5bGVTZXQnO1xuaW1wb3J0IHVzZVdlYlNwZWVjaFBvbnlmaWxsIGZyb20gJy4uL2hvb2tzL3VzZVdlYlNwZWVjaFBvbnlmaWxsJztcbmltcG9ydCBNaWNyb3Bob25lSWNvbiBmcm9tICcuL0Fzc2V0cy9NaWNyb3Bob25lSWNvbic7XG5pbXBvcnQgSWNvbkJ1dHRvbiBmcm9tICcuL0ljb25CdXR0b24nO1xuXG5jb25zdCB7IERpY3RhdGVTdGF0ZSB9ID0gQ29uc3RhbnRzO1xuXG5jb25zdCB7XG4gIHVzZURpY3RhdGVJbnRlcmltcyxcbiAgdXNlRGljdGF0ZVN0YXRlLFxuICB1c2VEaXNhYmxlZCxcbiAgdXNlTG9jYWxpemVyLFxuICB1c2VTZW5kQm94VmFsdWUsXG4gIHVzZVNob3VsZFNwZWFrSW5jb21pbmdBY3Rpdml0eSxcbiAgdXNlU3RhcnREaWN0YXRlLFxuICB1c2VTdG9wRGljdGF0ZVxufSA9IGhvb2tzO1xuXG5jb25zdCBST09UX1NUWUxFID0ge1xuICBkaXNwbGF5OiAnZmxleCcsXG5cbiAgLy8gLnNyLW9ubHkgLSBUaGlzIGNvbXBvbmVudCBpcyBpbnRlbmRlZCB0byBiZSBpbnZpc2libGUgdG8gdGhlIHZpc3VhbCBXZWIgQ2hhdCB1c2VyLCBidXQgcmVhZCBieSB0aGUgQVQgd2hlbiB1c2luZyBhIHNjcmVlbiByZWFkZXJcblxuICAnJiA+IC5zci1vbmx5Jzoge1xuICAgIGNvbG9yOiAndHJhbnNwYXJlbnQnLFxuICAgIGhlaWdodDogMSxcbiAgICBsZWZ0OiAtMTAwMDAsXG4gICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgIHRvcDogMCxcbiAgICB3aGl0ZVNwYWNlOiAnbm93cmFwJyxcbiAgICB3aWR0aDogMVxuICB9XG59O1xuXG5mdW5jdGlvbiB1c2VNaWNyb3Bob25lQnV0dG9uQ2xpY2soKTogKCkgPT4gdm9pZCB7XG4gIGNvbnN0IFssIHNldFNlbmRCb3hdID0gdXNlU2VuZEJveFZhbHVlKCk7XG4gIGNvbnN0IFssIHNldFNob3VsZFNwZWFrSW5jb21pbmdBY3Rpdml0eV0gPSB1c2VTaG91bGRTcGVha0luY29taW5nQWN0aXZpdHkoKTtcbiAgY29uc3QgW2RpY3RhdGVJbnRlcmltc10gPSB1c2VEaWN0YXRlSW50ZXJpbXMoKTtcbiAgY29uc3QgW2RpY3RhdGVTdGF0ZV0gPSB1c2VEaWN0YXRlU3RhdGUoKTtcbiAgY29uc3QgW3dlYlNwZWVjaFBvbnlmaWxsXSA9IHVzZVdlYlNwZWVjaFBvbnlmaWxsKCk7XG4gIGNvbnN0IHN0YXJ0RGljdGF0ZSA9IHVzZVN0YXJ0RGljdGF0ZSgpO1xuICBjb25zdCBzdG9wRGljdGF0ZSA9IHVzZVN0b3BEaWN0YXRlKCk7XG5cbiAgY29uc3QgeyBzcGVlY2hTeW50aGVzaXMsIFNwZWVjaFN5bnRoZXNpc1V0dGVyYW5jZSB9ID0gd2ViU3BlZWNoUG9ueWZpbGwgfHwge307XG5cbiAgY29uc3QgW3ByaW1lU3BlZWNoU3ludGhlc2lzXSA9IHVzZVN0YXRlKCgpID0+XG4gICAgbWVtb2l6ZSgoc3BlZWNoU3ludGhlc2lzLCBTcGVlY2hTeW50aGVzaXNVdHRlcmFuY2UpID0+IHtcbiAgICAgIGlmIChzcGVlY2hTeW50aGVzaXMgJiYgU3BlZWNoU3ludGhlc2lzVXR0ZXJhbmNlKSB7XG4gICAgICAgIGNvbnN0IHV0dGVyYW5jZSA9IG5ldyBTcGVlY2hTeW50aGVzaXNVdHRlcmFuY2UoJycpO1xuXG4gICAgICAgIFt1dHRlcmFuY2Uudm9pY2VdID0gc3BlZWNoU3ludGhlc2lzLmdldFZvaWNlcygpO1xuICAgICAgICBzcGVlY2hTeW50aGVzaXMuc3BlYWsodXR0ZXJhbmNlKTtcbiAgICAgIH1cbiAgICB9KVxuICApO1xuXG4gIC8vIFRPRE86IFtQMl0gV2Ugc2hvdWxkIHJldmlzaXQgdGhpcyBmdW5jdGlvbiBsYXRlclxuICAvLyAgICAgICBUaGUgY2xpY2soKSBsb2dpYyBzZWVtcyBsb2NhbCB0byB0aGUgY29tcG9uZW50LCBidXQgbWF5IG5vdCBiZSBnZW5lcmFsaXplZCBhY3Jvc3MgYWxsIGltcGxlbWVudGF0aW9ucy5cbiAgcmV0dXJuIHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBpZiAoZGljdGF0ZVN0YXRlID09PSBEaWN0YXRlU3RhdGUuV0lMTF9TVEFSVCkge1xuICAgICAgc2V0U2hvdWxkU3BlYWtJbmNvbWluZ0FjdGl2aXR5KGZhbHNlKTtcbiAgICB9IGVsc2UgaWYgKGRpY3RhdGVTdGF0ZSA9PT0gRGljdGF0ZVN0YXRlLkRJQ1RBVElORykge1xuICAgICAgc3RvcERpY3RhdGUoKTtcbiAgICAgIHNldFNlbmRCb3goZGljdGF0ZUludGVyaW1zLmpvaW4oJyAnKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldFNob3VsZFNwZWFrSW5jb21pbmdBY3Rpdml0eShmYWxzZSk7XG4gICAgICBzdGFydERpY3RhdGUoKTtcbiAgICB9XG5cbiAgICBwcmltZVNwZWVjaFN5bnRoZXNpcyhzcGVlY2hTeW50aGVzaXMsIFNwZWVjaFN5bnRoZXNpc1V0dGVyYW5jZSk7XG4gIH0sIFtcbiAgICBkaWN0YXRlSW50ZXJpbXMsXG4gICAgZGljdGF0ZVN0YXRlLFxuICAgIHByaW1lU3BlZWNoU3ludGhlc2lzLFxuICAgIHNldFNlbmRCb3gsXG4gICAgc2V0U2hvdWxkU3BlYWtJbmNvbWluZ0FjdGl2aXR5LFxuICAgIHNwZWVjaFN5bnRoZXNpcyxcbiAgICBTcGVlY2hTeW50aGVzaXNVdHRlcmFuY2UsXG4gICAgc3RhcnREaWN0YXRlLFxuICAgIHN0b3BEaWN0YXRlXG4gIF0pO1xufVxuXG5mdW5jdGlvbiB1c2VNaWNyb3Bob25lQnV0dG9uRGlzYWJsZWQoKTogW2Jvb2xlYW5dIHtcbiAgY29uc3QgW2Fib3J0YWJsZV0gPSB1c2VEaWN0YXRlQWJvcnRhYmxlKCk7XG4gIGNvbnN0IFtkaWN0YXRlU3RhdGVdID0gdXNlRGljdGF0ZVN0YXRlKCk7XG4gIGNvbnN0IFtkaXNhYmxlZF0gPSB1c2VEaXNhYmxlZCgpO1xuXG4gIHJldHVybiBbXG4gICAgZGlzYWJsZWQgfHxcbiAgICAgIGRpY3RhdGVTdGF0ZSA9PT0gRGljdGF0ZVN0YXRlLlNUQVJUSU5HIHx8XG4gICAgICBkaWN0YXRlU3RhdGUgPT09IERpY3RhdGVTdGF0ZS5TVE9QUElORyB8fFxuICAgICAgKGRpY3RhdGVTdGF0ZSA9PT0gRGljdGF0ZVN0YXRlLkRJQ1RBVElORyAmJiAhYWJvcnRhYmxlKVxuICBdO1xufVxuXG50eXBlIE1pY3JvcGhvbmVCdXR0b25Qcm9wcyA9IHtcbiAgY2xhc3NOYW1lPzogc3RyaW5nO1xufTtcblxuY29uc3QgTWljcm9waG9uZUJ1dHRvbjogRkM8TWljcm9waG9uZUJ1dHRvblByb3BzPiA9ICh7IGNsYXNzTmFtZSB9KSA9PiB7XG4gIGNvbnN0IFt7IG1pY3JvcGhvbmVCdXR0b246IG1pY3JvcGhvbmVCdXR0b25TdHlsZVNldCB9XSA9IHVzZVN0eWxlU2V0KCk7XG4gIGNvbnN0IFtkaWN0YXRlU3RhdGVdID0gdXNlRGljdGF0ZVN0YXRlKCk7XG4gIGNvbnN0IFtkaXNhYmxlZF0gPSB1c2VNaWNyb3Bob25lQnV0dG9uRGlzYWJsZWQoKTtcbiAgY29uc3QgY2xpY2sgPSB1c2VNaWNyb3Bob25lQnV0dG9uQ2xpY2soKTtcbiAgY29uc3QgbG9jYWxpemUgPSB1c2VMb2NhbGl6ZXIoKTtcbiAgY29uc3Qgcm9vdENsYXNzTmFtZSA9IHVzZVN0eWxlVG9FbW90aW9uT2JqZWN0KCkoUk9PVF9TVFlMRSkgKyAnJztcblxuICBjb25zdCBkaWN0YXRpbmcgPSBkaWN0YXRlU3RhdGUgPT09IERpY3RhdGVTdGF0ZS5ESUNUQVRJTkc7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBhcmlhLWNvbnRyb2xzPVwid2ViY2hhdFNlbmRCb3hNaWNyb3Bob25lQnV0dG9uXCJcbiAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lcyhcbiAgICAgICAgJ3dlYmNoYXRfX21pY3JvcGhvbmUtYnV0dG9uJyxcbiAgICAgICAgeyAnd2ViY2hhdF9fbWljcm9waG9uZS1idXR0b24tLWRpY3RhdGluZyc6IGRpY3RhdGluZyB9LFxuICAgICAgICBtaWNyb3Bob25lQnV0dG9uU3R5bGVTZXQgKyAnJyxcbiAgICAgICAgcm9vdENsYXNzTmFtZSxcbiAgICAgICAgKGNsYXNzTmFtZSB8fCAnJykgKyAnJ1xuICAgICAgKX1cbiAgICA+XG4gICAgICA8SWNvbkJ1dHRvblxuICAgICAgICBhbHQ9e2xvY2FsaXplKCdURVhUX0lOUFVUX1NQRUFLX0JVVFRPTl9BTFQnKX1cbiAgICAgICAgY2xhc3NOYW1lPVwid2ViY2hhdF9fbWljcm9waG9uZS1idXR0b25fX2J1dHRvblwiXG4gICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgb25DbGljaz17Y2xpY2t9XG4gICAgICA+XG4gICAgICAgIDxNaWNyb3Bob25lSWNvbiBjbGFzc05hbWU9XCJ3ZWJjaGF0X19taWNyb3Bob25lLWJ1dHRvbl9faWNvblwiIC8+XG4gICAgICA8L0ljb25CdXR0b24+XG4gICAgICA8ZGl2IGFyaWEtbGl2ZT1cInBvbGl0ZVwiIGNsYXNzTmFtZT1cInNyLW9ubHlcIiBpZD1cIndlYmNoYXRTZW5kQm94TWljcm9waG9uZUJ1dHRvblwiIHJvbGU9XCJzdGF0dXNcIj5cbiAgICAgICAge2xvY2FsaXplKGRpY3RhdGluZyA/ICdTUEVFQ0hfSU5QVVRfTUlDUk9QSE9ORV9CVVRUT05fT1BFTl9BTFQnIDogJ1NQRUVDSF9JTlBVVF9NSUNST1BIT05FX0JVVFRPTl9DTE9TRV9BTFQnKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApO1xufTtcblxuTWljcm9waG9uZUJ1dHRvbi5kZWZhdWx0UHJvcHMgPSB7XG4gIGNsYXNzTmFtZTogJydcbn07XG5cbk1pY3JvcGhvbmVCdXR0b24ucHJvcFR5cGVzID0ge1xuICBjbGFzc05hbWU6IFByb3BUeXBlcy5zdHJpbmdcbn07XG5cbmV4cG9ydCBkZWZhdWx0IE1pY3JvcGhvbmVCdXR0b247XG5cbmV4cG9ydCB7IHVzZU1pY3JvcGhvbmVCdXR0b25DbGljaywgdXNlTWljcm9waG9uZUJ1dHRvbkRpc2FibGVkIH07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUdBLElBQUFBLHVCQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyx3QkFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsV0FBQSxHQUFBQyxzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQUksV0FBQSxHQUFBRCxzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQUssVUFBQSxHQUFBRixzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQU0sTUFBQSxHQUFBQyx1QkFBQSxDQUFBUCxPQUFBO0FBRUEsSUFBQVEsd0JBQUEsR0FBQUwsc0JBQUEsQ0FBQUgsT0FBQTtBQUNBLElBQUFTLHFCQUFBLEdBQUFOLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBVSxhQUFBLEdBQUFQLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBVyxzQkFBQSxHQUFBUixzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQVksZUFBQSxHQUFBVCxzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFB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
;