Socket
Socket
Sign inDemoInstall

web-speech-cognitive-services

Package Overview
Dependencies
Maintainers
1
Versions
153
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

web-speech-cognitive-services - npm Package Compare versions

Comparing version 0.0.1-master.f80884e to 1.0.0

lib/CognitiveServicesSpeechGrammarList.js

2

CHANGELOG.md

@@ -8,3 +8,5 @@ # Changelog

## [Unreleased]
## [1.0.0] - 2018-06-29
### Added
- Initial release

36

lib/CognitiveServicesSpeechRecognition.js

@@ -33,15 +33,2 @@ 'use strict';

var UNINIT = 0;
var IDLE = 1;
var START = 2;
var AUDIO_START = 3;
var SOUND_START = 4;
var SPEECH_START = 5;
var SPEECH_END = 6;
var SOUND_END = 7;
var AUDIO_END = 8;
var END = 9;
var EVENT_TYPES = [null, null, 'start', 'audiostart', 'soundstart', 'speechstart', 'speechend', 'soundend', 'audioend', 'end'];
function buildSpeechResult(transcript, confidence, isFinal) {

@@ -80,12 +67,11 @@ var result = [{ confidence: confidence, transcript: transcript }];

var mode = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : CognitiveSpeech.RecognitionMode.Interactive;
var osPlatform = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : window.navigator.userAgent;
var osName = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : window.navigator.appName;
var osVersion = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : window.navigator.appVersion;
var deviceManufacturer = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : 'microsoft-speech-browser-sdk';
var deviceModel = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : 'web-speech-cognitive-services';
var deviceVersion = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : "1.0.0";
var platform = window.navigator.userAgent;
var name = 'Browser';
var osVersion = "0.0.1-master.f80884e";
var manufacturer = 'web-speech-cognitive-services';
var model = 'web-speech-cognitive-services';
var deviceVersion = "0.0.1-master.f80884e";
var config = new CognitiveSpeech.RecognizerConfig(new CognitiveSpeech.SpeechConfig(new CognitiveSpeech.Context(new CognitiveSpeech.OS(osPlatform, osName, osVersion), new CognitiveSpeech.Device(deviceManufacturer, deviceModel, deviceVersion))), mode, lang, CognitiveSpeech.SpeechResultFormat.Detailed);
var config = new CognitiveSpeech.RecognizerConfig(new CognitiveSpeech.SpeechConfig(new CognitiveSpeech.Context(new CognitiveSpeech.OS(platform, name, osVersion), new CognitiveSpeech.Device(manufacturer, model, deviceVersion))), mode, lang, CognitiveSpeech.SpeechResultFormat.Detailed);
var auth = void 0;

@@ -114,3 +100,3 @@

return function (_x3) {
return function (_x9) {
return _ref.apply(this, arguments);

@@ -138,3 +124,3 @@ };

return function (_x4) {
return function (_x10) {
return _ref2.apply(this, arguments);

@@ -185,3 +171,3 @@ };

case 0:
recognizer = this.recognizer = this.createRecognizer(window.localStorage.getItem('SPEECH_KEY'), this.lang);
recognizer = this.recognizer = this.createRecognizer(this.subscriptionKey || this.tokenFetch, this.lang, this.osPlatform || window.navigator.userAgent, this.osName || window.navigator.appName, this.osVersion || window.navigator.appVersion, this.deviceManufacturer || 'web-speech-cognitive-services', this.deviceModel || 'web-speech-cognitive-services', this.deviceVersion || "1.0.0");
_toPromise = toPromise(), eventListener = _toPromise.eventListener, promises = _objectWithoutProperties(_toPromise, ['eventListener']);

@@ -449,2 +435,2 @@

exports.default = CognitiveServicesSpeechRecognition;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9Db2duaXRpdmVTZXJ2aWNlc1NwZWVjaFJlY29nbml0aW9uLmpzIl0sIm5hbWVzIjpbIkNvZ25pdGl2ZVNwZWVjaCIsIlVOSU5JVCIsIklETEUiLCJTVEFSVCIsIkFVRElPX1NUQVJUIiwiU09VTkRfU1RBUlQiLCJTUEVFQ0hfU1RBUlQiLCJTUEVFQ0hfRU5EIiwiU09VTkRfRU5EIiwiQVVESU9fRU5EIiwiRU5EIiwiRVZFTlRfVFlQRVMiLCJidWlsZFNwZWVjaFJlc3VsdCIsInRyYW5zY3JpcHQiLCJjb25maWRlbmNlIiwiaXNGaW5hbCIsInJlc3VsdCIsInJlc3VsdHMiLCJ0eXBlIiwiQ29nbml0aXZlU2VydmljZXNTcGVlY2hSZWNvZ25pdGlvbiIsIl9sYW5nIiwicmVhZHlTdGF0ZSIsIm9uYXVkaW9zdGFydCIsIm9uYXVkaW9lbmQiLCJvbmVuZCIsIm9uZXJyb3IiLCJvbm5vbWF0Y2giLCJvbnJlc3VsdCIsIm9uc291bmRzdGFydCIsIm9uc291bmRlbmQiLCJvbnNwZWVjaHN0YXJ0Iiwib25zcGVlY2hlbmQiLCJvbnN0YXJ0IiwiY3JlYXRlUmVjb2duaXplciIsInN1YnNjcmlwdGlvbktleU9yVG9rZW5GZXRjaCIsImxhbmciLCJuYXZpZ2F0b3IiLCJsYW5ndWFnZSIsIm1vZGUiLCJSZWNvZ25pdGlvbk1vZGUiLCJJbnRlcmFjdGl2ZSIsInBsYXRmb3JtIiwid2luZG93IiwidXNlckFnZW50IiwibmFtZSIsIm9zVmVyc2lvbiIsIm1hbnVmYWN0dXJlciIsIm1vZGVsIiwiZGV2aWNlVmVyc2lvbiIsImNvbmZpZyIsIlJlY29nbml6ZXJDb25maWciLCJTcGVlY2hDb25maWciLCJDb250ZXh0IiwiT1MiLCJEZXZpY2UiLCJTcGVlY2hSZXN1bHRGb3JtYXQiLCJEZXRhaWxlZCIsImF1dGgiLCJDb2duaXRpdmVUb2tlbkF1dGhlbnRpY2F0aW9uIiwiYXV0aEZldGNoRXZlbnRJRCIsIkNvZ25pdGl2ZVN1YnNjcmlwdGlvbktleUF1dGhlbnRpY2F0aW9uIiwiQ3JlYXRlUmVjb2duaXplciIsInJlY29nbml6ZXIiLCJBdWRpb1NvdXJjZSIsIlR1cm5PZmYiLCJfYWJvcnRlZCIsImV2ZW50IiwibGlzdGVuZXIiLCJjYWxsIiwiRXJyb3IiLCJsb2NhbFN0b3JhZ2UiLCJnZXRJdGVtIiwidG9Qcm9taXNlIiwiZXZlbnRMaXN0ZW5lciIsInByb21pc2VzIiwiUmVjb2duaXplIiwicmVjb2duaXRpb25UcmlnZ2VyZWQiLCJlcnJvciIsIlByb21pc2UiLCJyYWNlIiwibGlzdGVuaW5nU3RhcnRlZCIsInJlY29nbml0aW9uRW5kZWQiLCJOYW1lIiwiU3RhdHVzIiwiUmVjb2duaXRpb25Db21wbGV0aW9uU3RhdHVzIiwiQXVkaW9Tb3VyY2VFcnJvciIsImVtaXQiLCJjb25uZWN0aW5nVG9TZXJ2aWNlIiwicmVjb2duaXRpb25TdGFydGVkIiwiQ29ubmVjdEVycm9yIiwiZ290Rmlyc3RIeXBvdGhlc2lzIiwiZ2V0U3BlZWNoSHlwb3RoZXNpc1Byb21pc2UiLCJzcGVlY2hFbmREZXRlY3RlZCIsInNwZWVjaEh5cG90aGVzaXMiLCJSZXN1bHQiLCJUZXh0Iiwic3BlZWNoRGV0YWlsZWRQaHJhc2UiLCJyZWNvZ25pdGlvblJlc3VsdCIsIlJlY29nbml0aW9uU3RhdHVzIiwiU3VjY2VzcyIsIk5CZXN0IiwiRGlzcGxheSIsIkNvbmZpZGVuY2UiLCJOb01hdGNoIiwiSW5pdGlhbFNpbGVuY2VUaW1lb3V0IiwibmV4dEdyYW1tYXJzIiwibmV4dExhbmciLCJuZXh0Q29udGludW91cyIsIm5leHRJbnRlcmltUmVzdWx0cyIsIm5leHRNYXhBbHRlcm5hdGl2ZXMiLCJuZXh0U2VydmljZVVSSSIsImV2ZW50cyIsIkNvbm5lY3RpbmdUb1NlcnZpY2VFdmVudCIsIkV2ZW50QXNQcm9taXNlIiwiTGlzdGVuaW5nU3RhcnRlZEV2ZW50IiwiUmVjb2duaXRpb25FbmRlZEV2ZW50IiwiUmVjb2duaXRpb25TdGFydGVkRXZlbnQiLCJSZWNvZ25pdGlvblRyaWdnZXJlZEV2ZW50IiwiU3BlZWNoRGV0YWlsZWRQaHJhc2VFdmVudCIsIlNwZWVjaEVuZERldGVjdGVkRXZlbnQiLCJTcGVlY2hIeXBvdGhlc2lzRXZlbnQiLCJTcGVlY2hTaW1wbGVQaHJhc2VFdmVudCIsIlNwZWVjaFN0YXJ0RGV0ZWN0ZWRFdmVudCIsInVwY29taW5nIiwic3BlZWNoU2ltcGxlUGhyYXNlIiwic3BlZWNoU3RhcnREZXRlY3RlZCIsImV2ZW50QXNQcm9taXNlIiwiY29uc29sZSIsIndhcm4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQTs7SUFBWUEsZTs7QUFDWjs7OztBQUNBOzs7Ozs7Ozs7Ozs7OztBQUVBLElBQU1DLFNBQVMsQ0FBZjtBQUNBLElBQU1DLE9BQU8sQ0FBYjtBQUNBLElBQU1DLFFBQVEsQ0FBZDtBQUNBLElBQU1DLGNBQWMsQ0FBcEI7QUFDQSxJQUFNQyxjQUFjLENBQXBCO0FBQ0EsSUFBTUMsZUFBZSxDQUFyQjtBQUNBLElBQU1DLGFBQWEsQ0FBbkI7QUFDQSxJQUFNQyxZQUFZLENBQWxCO0FBQ0EsSUFBTUMsWUFBWSxDQUFsQjtBQUNBLElBQU1DLE1BQU0sQ0FBWjs7QUFFQSxJQUFNQyxjQUFjLENBQ2xCLElBRGtCLEVBRWxCLElBRmtCLEVBR2xCLE9BSGtCLEVBSWxCLFlBSmtCLEVBS2xCLFlBTGtCLEVBTWxCLGFBTmtCLEVBT2xCLFdBUGtCLEVBUWxCLFVBUmtCLEVBU2xCLFVBVGtCLEVBVWxCLEtBVmtCLENBQXBCOztBQWFBLFNBQVNDLGlCQUFULENBQTJCQyxVQUEzQixFQUF1Q0MsVUFBdkMsRUFBbURDLE9BQW5ELEVBQTREO0FBQzFELE1BQU1DLFNBQVMsQ0FBQyxFQUFFRixzQkFBRixFQUFjRCxzQkFBZCxFQUFELENBQWY7O0FBRUFHLFNBQU9ELE9BQVAsR0FBaUJBLE9BQWpCOztBQUVBLFNBQU8sRUFBRUUsU0FBUyxDQUFDRCxNQUFELENBQVgsRUFBcUJFLE1BQU0sUUFBM0IsRUFBUDtBQUNEOztJQUVLQyxrQztBQUNKLGdEQUFjO0FBQUE7O0FBQUE7O0FBQ1osU0FBS0Ms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LENBQStCRSxRQUEvQixFQVRmO0FBVUxFLHlCQUFxQmQsT0FBT1csd0JBQVAsQ0FBZ0NDLFFBQWhDLEVBVmhCO0FBV0xsRCxtQkFBZSw4QkFBUztBQUFBLFVBQ1I3QixJQURRLEdBQ0NzQixLQURELENBQ2RnQixJQURjOztBQUV0QixVQUFNNEMsaUJBQWlCZixPQUFPbkUsSUFBUCxDQUF2Qjs7QUFFQSxVQUFJa0YsY0FBSixFQUFvQjtBQUNsQkEsdUJBQWVyRCxhQUFmLENBQTZCTCxJQUE3QixDQUFrQyxJQUFsQyxFQUF3Q0YsS0FBeEM7QUFDRCxPQUZELE1BRU87QUFDTDZELGdCQUFRQyxJQUFSLHdCQUFvQ3BGLElBQXBDO0FBQ0Q7QUFDRjtBQXBCSSxHQUFQO0FBc0JEOztrQkFFY3pCLGtDIiwiZmlsZSI6IkNvZ25pdGl2ZVNlcnZpY2VzU3BlZWNoUmVjb2duaXRpb24uanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBDb2duaXRpdmVTcGVlY2ggZnJvbSAnbWljcm9zb2Z0LXNwZWVjaC1icm93c2VyLXNkayc7XG5pbXBvcnQgRXZlbnRBc1Byb21pc2UgZnJvbSAnZXZlbnQtYXMtcHJvbWlzZSc7XG5pbXBvcnQgbWVtb2l6ZSBmcm9tICdtZW1vaXplLW9uZSc7XG5cbmNvbnN0IFVOSU5JVCA9IDA7XG5jb25zdCBJRExFID0gMTtcbmNvbnN0IFNUQVJUID0gMjtcbmNvbnN0IEFVRElPX1NUQVJUID0gMztcbmNvbnN0IFNPVU5EX1NUQVJUID0gNDtcbmNvbnN0IFNQRUVDSF9TVEFSVCA9IDU7XG5jb25zdCBTUEVFQ0hfRU5EID0gNjtcbmNvbnN0IFNPVU5EX0VORCA9IDc7XG5jb25zdCBBVURJT19FTkQgPSA4O1xuY29uc3QgRU5EID0gOTtcblxuY29uc3QgRVZFTlRfVFlQRVMgPSBbXG4gIG51bGwsXG4gIG51bGwsXG4gICdzdGFydCcsXG4gICdhdWRpb3N0YXJ0JyxcbiAgJ3NvdW5kc3RhcnQnLFxuICAnc3BlZWNoc3RhcnQnLFxuICAnc3BlZWNoZW5kJyxcbiAgJ3NvdW5kZW5kJyxcbiAgJ2F1ZGlvZW5kJyxcbiAgJ2VuZCdcbl07XG5cbmZ1bmN0aW9uIGJ1aWxkU3BlZWNoUmVzdWx0KHRyYW5zY3JpcHQsIGNvbmZpZGVuY2UsIGlzRmluYWwpIHtcbiAgY29uc3QgcmVzdWx0ID0gW3sgY29uZmlkZW5jZSwgdHJhbnNjcmlwdCB9XTtcblxuICByZXN1bHQuaXNGaW5hbCA9IGlzRmluYWw7XG5cbiAgcmV0dXJuIHsgcmVzdWx0czogW3Jlc3VsdF0sIHR5cGU6ICdyZXN1bHQnIH07XG59XG5cbmNsYXNzIENvZ25pdGl2ZVNlcnZpY2VzU3BlZWNoUmVjb2duaXRpb24ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9sYW5nID0gJyc7XG5cbiAgICB0aGlzLnJlYWR5U3RhdGUgPSAwO1xuXG4gICAgdGhpcy5vbmF1ZGlvc3RhcnQgPSBudWxsO1xuICAgIHRoaXMub25hdWRpb2VuZCA9IG51bGw7XG4gICAgdGhpcy5vbmVuZCA9IG51bGw7XG4gICAgdGhpcy5vbmVycm9yID0gbnVsbDtcbiAgICB0aGlzLm9ubm9tYXRjaCA9IG51bGw7XG4gICAgdGhpcy5vbnJlc3VsdCA9IG51bGw7XG4gICAgdGhpcy5vbnNvdW5kc3RhcnQgPSBudWxsO1xuICAgIHRoaXMub25zb3VuZGVuZCA9IG51bGw7XG4gICAgdGhpcy5vbnNwZWVjaHN0YXJ0ID0gbnVsbDtcbiAgICB0aGlzLm9uc3BlZWNoZW5kID0gbnVsbDtcbiAgICB0aGlzLm9uc3RhcnQgPSBudWxsO1xuXG4gICAgdGhpcy5jcmVhdGVSZWNvZ25pemVyID0gbWVtb2l6ZSgoXG4gICAgICBzdWJzY3JpcHRpb25LZXlPclRva2VuRmV0Y2gsXG4gICAgICBsYW5nID0gbmF2aWdhdG9yLmxhbmd1YWdlLFxuICAgICAgbW9kZSA9IENvZ25pdGl2ZVNwZWVjaC5SZWNvZ25pdGlvbk1vZGUuSW50ZXJhY3RpdmVcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IHBsYXRmb3JtID0gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQ7XG4gICAgICBjb25zdCBuYW1lID0gJ0Jyb3dzZXInO1xuICAgICAgY29uc3Qgb3NWZXJzaW9uID0gVkVSU0lPTjtcbiAgICAgIGNvbnN0IG1hbnVmYWN0dXJlciA9ICd3ZWItc3BlZWNoLWNvZ25pdGl2ZS1zZXJ2aWNlcyc7XG4gICAgICBjb25zdCBtb2RlbCA9ICd3ZWItc3BlZWNoLWNvZ25pdGl2ZS1zZXJ2aWNlcyc7XG4gICAgICBjb25zdCBkZXZpY2VWZXJzaW9uID0gVkVSU0lPTjtcblxuICAgICAgY29uc3QgY29uZmlnID0gbmV3IENvZ25pdGl2ZVNwZWVjaC5SZWNvZ25pemVyQ29uZmlnKFxuICAgICAgICBuZXcgQ29nbml0aXZlU3BlZWNoLlNwZWVjaENvbmZpZyhcbiAgICAgICAgICBuZXcgQ29nbml0aXZlU3BlZWNoLkNvbnRleHQoXG4gICAgICAgICAgICBuZXcgQ29nbml0aXZlU3BlZWNoLk9TKHBsYXRmb3JtLCBuYW1lLCBvc1ZlcnNpb24pLFxuICAgICAgICAgICAgbmV3IENvZ25pdGl2ZVNwZWVjaC5EZXZpY2UobWFudWZhY3R1cmVyLCBtb2RlbCwgZGV2aWNlVmVyc2lvbilcbiAgICAgICAgICApXG4gICAgICAgICksXG4gICAgICAgIG1vZGUsXG4gICAgICAgIGxhbmcsXG4gICAgICAgIENvZ25pdGl2ZVNwZWVjaC5TcGVlY2hSZXN1bHRGb3JtYXQuRGV0YWlsZWRcbiAgICAgICk7XG5cbiAgICAgIGxldCBhdXRoO1xuXG4gICAgICBpZiAodHlwZW9mIHN1YnNjcmlwdGlvbktleU9yVG9rZW5GZXRjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBhdXRoID0gbmV3IENvZ25pdGl2ZVNwZWVjaC5Db2duaXRpdmVUb2tlbkF1dGhlbnRpY2F0aW9uKFxuICAgICAgICAgIGFzeW5jIGF1dGhGZXRjaEV2ZW50SUQgPT4gYXdhaXQgc3Vic2NyaXB0aW9uS2V5T3JUb2tlbkZldGNoKGF1dGhGZXRjaEV2ZW50SUQsIGZhbHNlKSxcbiAgICAgICAgICBhc3luYyBhdXRoRmV0Y2hFdmVudElEID0+IGF3YWl0IHN1YnNjcmlwdGlvbktleU9yVG9rZW5GZXRjaChhdXRoRmV0Y2hFdmVudElELCB0cnVlKVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXV0aCA9IG5ldyBDb2duaXRpdmVTcGVlY2guQ29nbml0aXZlU3Vic2NyaXB0aW9uS2V5QXV0aGVudGljYXRpb24oc3Vic2NyaXB0aW9uS2V5T3JUb2tlbkZldGNoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvZ25pdGl2ZVNwZWVjaC5DcmVhdGVSZWNvZ25pemVyKGNvbmZpZywgYXV0aCk7XG4gICAgfSk7XG4gIH1cblxuICBnZXQgZ3JhbW1hcnMoKSB7IHJldHVybjsgfVxuICBzZXQgZ3JhbW1hcnMobmV4dEdyYW1tYXJzKSB7XG4gICAgLy8gdGhyb3cgbmV3IEVycm9yKCdub3Qgc3VwcG9ydGVkJyk7XG4gIH1cblxuICBnZXQgbGFuZygpIHsgcmV0dXJuIHRoaXMuX2xhbmc7IH1cbiAgc2V0IGxhbmcobmV4dExhbmcpIHsgdGhpcy5fbGFuZyA9IG5leHRMYW5nOyB9XG5cbiAgZ2V0IGNvbnRpbnVvdXMoKSB7IHJldHVybiBmYWxzZTsgfVxuICBzZXQgY29udGludW91cyhuZXh0Q29udGludW91cykgeyB0aHJvdyBuZXcgRXJyb3IoJ25vdCBzdXBwb3J0ZWQnKTsgfVxuXG4gIGdldCBpbnRlcmltUmVzdWx0cygpIHsgcmV0dXJuIHRydWU7IH1cbiAgc2V0IGludGVyaW1SZXN1bHRzKG5leHRJbnRlcmltUmVzdWx0cykge1xuICAgIGlmICghbmV4dEludGVyaW1SZXN1bHRzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBzdXBwb3J0ZWQnKTtcbiAgICB9XG4gIH1cblxuICBnZXQgbWF4QWx0ZXJuYXRpdmVzKCkgeyByZXR1cm4gMTsgfVxuICBzZXQgbWF4QWx0ZXJuYXRpdmVzKG5leHRNYXhBbHRlcm5hdGl2ZXMpIHsgdGhyb3cgbmV3IEVycm9yKCdub3Qgc3VwcG9ydGVkJyk7IH1cblxuICBnZXQgc2VydmljZVVSSSgpIHsgcmV0dXJuIG51bGw7IH1cbiAgc2V0IHNlcnZpY2VVUkkobmV4dFNlcnZpY2VVUkkpIHsgdGhyb3cgbmV3IEVycm9yKCdub3Qgc3VwcG9ydGVkJyk7IH1cblxuICBhYm9ydCgpIHtcbiAgICAvLyBUT0RPOiBTaG91bGQgcmVkZXNpZ24gaG93IHRvIHN0b3AgYSByZWNvZ25pdGlvbiBzZXNzaW9uXG4gICAgLy8gICAgICAgQWZ0ZXIgYWJvcnQgaXMgY2FsbGVkLCB3ZSBzaG91bGQgbm90IHNhdyBpdCBpcyBhIFwic3VjY2Vzc1wiLCBcInNpbGVudFwiLCBvciBcIm5vIG1hdGNoXCJcbiAgICBjb25zdCB7IEF1ZGlvU291cmNlIH0gPSB0aGlzLnJlY29nbml6ZXIgfHwge307XG5cbiAgICBBdWRpb1NvdXJjZSAmJiBBdWRpb1NvdXJjZS5UdXJuT2ZmKCk7XG5cbiAgICB0aGlzLl9hYm9ydGVkID0gdHJ1ZTtcbiAgfVxuXG4gIGVtaXQobmFtZSwgZXZlbnQpIHtcbiAgICBjb25zdCBsaXN0ZW5lciA9IHRoaXNbYG9uJHsgbmFtZSB9YF07XG5cbiAgICBsaXN0ZW5lciAmJiBsaXN0ZW5lci5jYWxsKHRoaXMsIHsgLi4uZXZlbnQsIHR5cGU6IG5hbWUgfSk7XG4gIH1cblxuICBzdG9wKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbm90IHN1cHBvcnRlZCcpO1xuICB9XG5cbiAgYXN5bmMgc3RhcnQoKSB7XG4gICAgY29uc3QgcmVjb2duaXplciA9IHRoaXMucmVjb2duaXplciA9IHRoaXMuY3JlYXRlUmVjb2duaXplcihcbiAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnU1BFRUNIX0tFWScpLFxuICAgICAgdGhpcy5sYW5nXG4gICAgKTtcblxuICAgIGNvbnN0IHsgZXZlbnRMaXN0ZW5lciwgLi4ucHJvbWlzZXMgfSA9IHRvUHJvbWlzZSgpO1xuXG4gICAgcmVjb2duaXplci5SZWNvZ25pemUoZXZlbnRMaXN0ZW5lcik7XG4gICAgdGhpcy5fYWJvcnRlZCA9IGZhbHNlO1xuXG4gICAgYXdhaXQgcHJvbWlzZXMucmVjb2duaXRpb25UcmlnZ2VyZWQ7XG5cbiAgICBsZXQgZXJyb3I7XG5cbiAgICBjb25zdCBsaXN0ZW5pbmdTdGFydGVkID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtcbiAgICAgIHByb21pc2VzLmxpc3RlbmluZ1N0YXJ0ZWQsXG4gICAgICBwcm9taXNlcy5yZWNvZ25pdGlvbkVuZGVkXG4gICAgXSk7XG5cbiAgICBpZiAobGlzdGVuaW5nU3RhcnRlZC5OYW1lID09PSAnUmVjb2duaXRpb25FbmRlZEV2ZW50Jykge1xuICAgICAgLy8gUG9zc2libHkgbm90IGF1dGhvcml6ZWQgdG8gdXNlIG1pY3JvcGhvbmVcbiAgICAgIGlmIChsaXN0ZW5pbmdTdGFydGVkLlN0YXR1cyA9PT0gQ29nbml0aXZlU3BlZWNoLlJlY29nbml0aW9uQ29tcGxldGlvblN0YXR1cy5BdWRpb1NvdXJjZUVycm9yKSB7XG4gICAgICAgIGVycm9yID0gJ25vdC1hbGxvd2VkJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yID0gQ29nbml0aXZlU3BlZWNoLlJlY29nbml0aW9uQ29tcGxldGlvblN0YXR1c1tsaXN0ZW5pbmdTdGFydGVkLlN0YXR1c107XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW1pdCgnc3RhcnQnKTtcblxuICAgICAgYXdhaXQgcHJvbWlzZXMuY29ubmVjdGluZ1RvU2VydmljZTtcblxuICAgICAgY29uc3QgcmVjb2duaXRpb25TdGFydGVkID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtcbiAgICAgICAgcHJvbWlzZXMucmVjb2duaXRpb25TdGFydGVkLFxuICAgICAgICBwcm9taXNlcy5yZWNvZ25pdGlvbkVuZGVkXG4gICAgICBdKTtcblxuICAgICAgdGhpcy5lbWl0KCdhdWRpb3N0YXJ0Jyk7XG5cbiAgICAgIGlmIChyZWNvZ25pdGlvblN0YXJ0ZWQuTmFtZSA9PT0gJ1JlY29nbml0aW9uRW5kZWRFdmVudCcpIHtcbiAgICAgICAgLy8gUG9zc2libHkgbmV0d29yayBlcnJvclxuICAgICAgICBpZiAocmVjb2duaXRpb25TdGFydGVkLlN0YXR1cyA9PT0gQ29nbml0aXZlU3BlZWNoLlJlY29nbml0aW9uQ29tcGxldGlvblN0YXR1cy5Db25uZWN0RXJyb3IpIHtcbiAgICAgICAgICBlcnJvciA9ICduZXR3b3JrJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlcnJvciA9IENvZ25pdGl2ZVNwZWVjaC5SZWNvZ25pdGlvbkNvbXBsZXRpb25TdGF0dXNbcmVjb2duaXRpb25TdGFydGVkLlN0YXR1c107XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBnb3RGaXJzdEh5cG90aGVzaXM7XG5cbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgIGNvbnN0IHNwZWVjaEh5cG90aGVzaXMgPSBhd2FpdCBQcm9taXNlLnJhY2UoW1xuICAgICAgICAgICAgcHJvbWlzZXMuZ2V0U3BlZWNoSHlwb3RoZXNpc1Byb21pc2UoKSxcbiAgICAgICAgICAgIHByb21pc2VzLnNwZWVjaEVuZERldGVjdGVkXG4gICAgICAgICAgXSk7XG5cbiAgICAgICAgICBpZiAoc3BlZWNoSHlwb3RoZXNpcy5OYW1lID09PSAnU3BlZWNoRW5kRGV0ZWN0ZWRFdmVudCcpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghZ290Rmlyc3RIeXBvdGhlc2lzKSB7XG4gICAgICAgICAgICBnb3RGaXJzdEh5cG90aGVzaXMgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdzb3VuZHN0YXJ0Jyk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3NwZWVjaHN0YXJ0Jyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5lbWl0KCdyZXN1bHQnLCBidWlsZFNwZWVjaFJlc3VsdChzcGVlY2hIeXBvdGhlc2lzLlJlc3VsdC5UZXh0LCAuNSwgZmFsc2UpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChnb3RGaXJzdEh5cG90aGVzaXMpIHtcbiAgICAgICAgICB0aGlzLmVtaXQoJ3NwZWVjaGVuZCcpO1xuICAgICAgICAgIHRoaXMuZW1pdCgnc291bmRlbmQnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLmVtaXQoJ2F1ZGlvZW5kJyk7XG5cbiAgICAgIGlmICh0aGlzLl9hYm9ydGVkKSB7XG4gICAgICAgIGVycm9yID0gJ2Fib3J0ZWQnO1xuXG4gICAgICAgIGF3YWl0IHByb21pc2VzLnJlY29nbml0aW9uRW5kZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzcGVlY2hEZXRhaWxlZFBocmFzZSA9IGF3YWl0IFByb21pc2UucmFjZShbXG4gICAgICAgICAgcHJvbWlzZXMuc3BlZWNoRGV0YWlsZWRQaHJhc2UsXG4gICAgICAgICAgcHJvbWlzZXMucmVjb2duaXRpb25FbmRlZFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAoc3BlZWNoRGV0YWlsZWRQaHJhc2UuTmFtZSAhPT0gJ1JlY29nbml0aW9uRW5kZWRFdmVudCcpIHtcbiAgICAgICAgICBjb25zdCByZWNvZ25pdGlvblJlc3VsdCA9IENvZ25pdGl2ZVNwZWVjaC5SZWNvZ25pdGlvblN0YXR1c1tzcGVlY2hEZXRhaWxlZFBocmFzZS5SZXN1bHQuUmVjb2duaXRpb25TdGF0dXNdO1xuXG4gICAgICAgICAgaWYgKHJlY29nbml0aW9uUmVzdWx0ID09PSBDb2duaXRpdmVTcGVlY2guUmVjb2duaXRpb25TdGF0dXMuU3VjY2Vzcykge1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdyZXN1bHQnLCBidWlsZFNwZWVjaFJlc3VsdChzcGVlY2hEZXRhaWxlZFBocmFzZS5SZXN1bHQuTkJlc3RbMF0uRGlzcGxheSwgc3BlZWNoRGV0YWlsZWRQaHJhc2UuUmVzdWx0Lk5CZXN0WzBdLkNvbmZpZGVuY2UsIHRydWUpKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHJlY29nbml0aW9uUmVzdWx0ICE9PSBDb2duaXRpdmVTcGVlY2guUmVjb2duaXRpb25TdGF0dXMuTm9NYXRjaCkge1xuICAgICAgICAgICAgLy8gUG9zc2libHkgc2lsZW50IG9yIG11dGVkXG4gICAgICAgICAgICBpZiAocmVjb2duaXRpb25SZXN1bHQgPT09IENvZ25pdGl2ZVNwZWVjaC5SZWNvZ25pdGlvblN0YXR1cy5Jbml0aWFsU2lsZW5jZVRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgZXJyb3IgPSAnbm8tc3BlZWNoJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGVycm9yID0gc3BlZWNoRGV0YWlsZWRQaHJhc2UuUmVzdWx0LlJlY29nbml0aW9uU3RhdHVzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGF3YWl0IHByb21pc2VzLnJlY29nbml0aW9uRW5kZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBlcnJvciAmJiB0aGlzLmVtaXQoJ2Vycm9yJywgeyBlcnJvciB9KTtcbiAgICB0aGlzLmVtaXQoJ2VuZCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvUHJvbWlzZSgpIHtcbiAgY29uc3QgZXZlbnRzID0ge1xuICAgIENvbm5lY3RpbmdUb1NlcnZpY2VFdmVudDogbmV3IEV2ZW50QXNQcm9taXNlKCksXG4gICAgTGlzdGVuaW5nU3RhcnRlZEV2ZW50OiBuZXcgRXZlbnRBc1Byb21pc2UoKSxcbiAgICBSZWNvZ25pdGlvbkVuZGVkRXZlbnQ6IG5ldyBFdmVudEFzUHJvbWlzZSgpLFxuICAgIFJlY29nbml0aW9uU3RhcnRlZEV2ZW50OiBuZXcgRXZlbnRBc1Byb21pc2UoKSxcbiAgICBSZWNvZ25pdGlvblRyaWdnZXJlZEV2ZW50OiBuZXcgRXZlbnRBc1Byb21pc2UoKSxcbiAgICBTcGVlY2hEZXRhaWxlZFBocmFzZUV2ZW50OiBuZXcgRXZlbnRBc1Byb21pc2UoKSxcbiAgICBTcGVlY2hFbmREZXRlY3RlZEV2ZW50OiBuZXcgRXZlbnRBc1Byb21pc2UoKSxcbiAgICBTcGVlY2hIeXBvdGhlc2lzRXZlbnQ6IG5ldyBFdmVudEFzUHJvbWlzZSgpLFxuICAgIFNwZWVjaFNpbXBsZVBocmFzZUV2ZW50OiBuZXcgRXZlbnRBc1Byb21pc2UoKSxcbiAgICBTcGVlY2hTdGFydERldGVjdGVkRXZlbnQ6IG5ldyBFdmVudEFzUHJvbWlzZSgpXG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBjb25uZWN0aW5nVG9TZXJ2aWNlOiBldmVudHMuQ29ubmVjdGluZ1RvU2VydmljZUV2ZW50LnVwY29taW5nKCksXG4gICAgbGlzdGVuaW5nU3RhcnRlZDogZXZlbnRzLkxpc3RlbmluZ1N0YXJ0ZWRFdmVudC51cGNvbWluZygpLFxuICAgIHJlY29nbml0aW9uRW5kZWQ6IGV2ZW50cy5SZWNvZ25pdGlvbkVuZGVkRXZlbnQudXBjb21pbmcoKSxcbiAgICByZWNvZ25pdGlvblN0YXJ0ZWQ6IGV2ZW50cy5SZWNvZ25pdGlvblN0YXJ0ZWRFdmVudC51cGNvbWluZygpLFxuICAgIHJlY29nbml0aW9uVHJpZ2dlcmVkOiBldmVudHMuUmVjb2duaXRpb25UcmlnZ2VyZWRFdmVudC51cGNvbWluZygpLFxuICAgIHNwZWVjaERldGFpbGVkUGhyYXNlOiBldmVudHMuU3BlZWNoRGV0YWlsZWRQaHJhc2VFdmVudC51cGNvbWluZygpLFxuICAgIHNwZWVjaEVuZERldGVjdGVkOiBldmVudHMuU3BlZWNoRW5kRGV0ZWN0ZWRFdmVudC51cGNvbWluZygpLFxuICAgIGdldFNwZWVjaEh5cG90aGVzaXNQcm9taXNlOiAoKSA9PiBldmVudHMuU3BlZWNoSHlwb3RoZXNpc0V2ZW50LnVwY29taW5nKCksXG4gICAgc3BlZWNoU2ltcGxlUGhyYXNlOiBldmVudHMuU3BlZWNoU2ltcGxlUGhyYXNlRXZlbnQudXBjb21pbmcoKSxcbiAgICBzcGVlY2hTdGFydERldGVjdGVkOiBldmVudHMuU3BlZWNoU3RhcnREZXRlY3RlZEV2ZW50LnVwY29taW5nKCksXG4gICAgZXZlbnRMaXN0ZW5lcjogZXZlbnQgPT4ge1xuICAgICAgY29uc3QgeyBOYW1lOiBuYW1lIH0gPSBldmVudDtcbiAgICAgIGNvbnN0IGV2ZW50QXNQcm9taXNlID0gZXZlbnRzW25hbWVdO1xuXG4gICAgICBpZiAoZXZlbnRBc1Byb21pc2UpIHtcbiAgICAgICAgZXZlbnRBc1Byb21pc2UuZXZlbnRMaXN0ZW5lci5jYWxsKG51bGwsIGV2ZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgVW5leHBlY3RlZCBldmVudCBcXFwiJHsgbmFtZSB9XFxcIiBmcm9tIENvZ25pdGl2ZSBTZXJ2aWNlcywgcGxlYXNlIGZpbGUgYSBidWcgdG8gaHR0cHM6Ly9naXRodWIuY29tL2NvbXB1bGltL3dlYi1zcGVlY2gtY29nbml0aXZlLXNlcnZpY2VzYCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBDb2duaXRpdmVTZXJ2aWNlc1NwZWVjaFJlY29nbml0aW9uXG4iXX0=
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9Db2duaXRpdmVTZXJ2aWNlc1NwZWVjaFJlY29nbml0aW9uLmpzIl0sIm5hbWVzIjpbIkNvZ25pdGl2ZVNwZWVjaCIsImJ1aWxkU3BlZWNoUmVzdWx0IiwidHJhbnNjcmlwdCIsImNvbmZpZGVuY2UiLCJpc0ZpbmFsIiwicmVzdWx0IiwicmVzdWx0cyIsInR5cGUiLCJDb2duaXRpdmVTZXJ2aWNlc1NwZWVjaFJlY29nbml0aW9uIiwiX2xhbmciLCJyZWFkeVN0YXRlIiwib25hdWRpb3N0YXJ0Iiwib25hdWRpb2VuZCIsIm9uZW5kIiwib25lcnJvciIsIm9ubm9tYXRjaCIsIm9ucmVzdWx0Iiwib25zb3VuZHN0YXJ0Iiwib25zb3VuZGVuZCIsIm9uc3BlZWNoc3RhcnQiLCJvbnNwZWVjaGVuZCIsIm9uc3RhcnQiLCJjcmVhdGVSZWNvZ25pemVyIiwic3Vic2NyaXB0aW9uS2V5T3JUb2tlbkZldGNoIiwibGFuZyIsIm5hdmlnYXRvciIsImxhbmd1YWdlIiwibW9kZSIsIlJlY29nbml0aW9uTW9kZSIsIkludGVyYWN0aXZlIiwib3NQbGF0Zm9ybSIsIndpbmRvdyIsInVzZXJBZ2VudCIsIm9zTmFtZSIsImFwcE5hbWUiLCJvc1ZlcnNpb24iLCJhcHBWZXJzaW9uIiwiZGV2aWNlTWFudWZhY3R1cmVyIiwiZGV2aWNlTW9kZWwiLCJkZXZpY2VWZXJzaW9uIiwiY29uZmlnIiwiUmVjb2duaXplckNvbmZpZyIsIlNwZWVjaENvbmZpZyIsIkNvbnRleHQiLCJPUyIsIkRldmljZSIsIlNwZWVjaFJlc3VsdEZvcm1hdCIsIkRldGFpbGVkIiwiYXV0aCIsIkNvZ25pdGl2ZVRva2VuQXV0aGVudGljYXRpb24iLCJhdXRoRmV0Y2hFdmVudElEIiwiQ29nbml0aXZlU3Vic2NyaXB0aW9uS2V5QXV0aGVudGljYXRpb24iLCJDcmVhdGVSZWNvZ25pemVyIiwicmVjb2duaXplciIsIkF1ZGlvU291cmNlIiwiVHVybk9mZiIsIl9hYm9ydGVkIiwibmFtZSIsImV2ZW50IiwibGlzdGVuZXIiLCJjYWxsIiwiRXJyb3IiLCJzdWJzY3JpcHRpb25LZXkiLCJ0b2tlbkZldGNoIiwidG9Qcm9taXNlIiwiZXZlbnRMaXN0ZW5lciIsInByb21pc2VzIiwiUmVjb2duaXplIiwicmVjb2duaXRpb25UcmlnZ2VyZWQiLCJlcnJvciIsIlByb21pc2UiLCJyYWNlIiwibGlzdGVuaW5nU3RhcnRlZCIsInJlY29nbml0aW9uRW5kZWQiLCJOYW1lIiwiU3RhdHVzIiwiUmVjb2duaXRpb25Db21wbGV0aW9uU3RhdHVzIiwiQXVkaW9Tb3VyY2VFcnJvciIsImVtaXQiLCJjb25uZWN0aW5nVG9TZXJ2aWNlIiwicmVjb2duaXRpb25TdGFydGVkIiwiQ29ubmVjdEVycm9yIiwiZ290Rmlyc3RIeXBvdGhlc2lzIiwiZ2V0U3BlZWNoSHlwb3RoZXNpc1Byb21pc2UiLCJzcGVlY2hFbmREZXRlY3RlZCIsInNwZWVjaEh5cG90aGVzaXMiLCJSZXN1bHQiLCJUZXh0Iiwic3BlZWNoRGV0YWlsZWRQaHJhc2UiLCJyZWNvZ25pdGlvblJlc3VsdCIsIlJlY29nbml0aW9uU3RhdHVzIiwiU3VjY2VzcyIsIk5CZXN0IiwiRGlzcGxheSIsIkNvbmZpZGVuY2UiLCJOb01hdGNoIiwiSW5pdGlhbFNpbGVuY2VUaW1lb3V0IiwibmV4dEdyYW1tYXJzIiwibmV4dExhbmciLCJuZXh0Q29udGludW91cyIsIm5leHRJbnRlcmltUmVzdWx0cyIsIm5leHRNYXhBbHRlcm5hdGl2ZXMiLCJuZXh0U2VydmljZVVSSSIsImV2ZW50cyIsIkNvbm5lY3RpbmdUb1NlcnZpY2VFdmVudCIsIkV2ZW50QXNQcm9taXNlIiwiTGlzdGVuaW5nU3RhcnRlZEV2ZW50IiwiUmVjb2duaXRpb25FbmRlZEV2ZW50IiwiUmVjb2duaXRpb25TdGFydGVkRXZlbnQiLCJSZWNvZ25pdGlvblRyaWdnZXJlZEV2ZW50IiwiU3BlZWNoRGV0YWlsZWRQaHJhc2VFdmVudCIsIlNwZWVjaEVuZERldGVjdGVkRXZlbnQiLCJTcGVlY2hIeXBvdGhlc2lzRXZlbnQiLCJTcGVlY2hTaW1wbGVQaHJhc2VFdmVudCIsIlNwZWVjaFN0YXJ0RGV0ZWN0ZWRFdmVudCIsInVwY29taW5nIiwic3BlZWNoU2ltcGxlUGhyYXNlIiwic3BlZWNoU3RhcnREZXRlY3RlZCIsImV2ZW50QXNQcm9taXNlIiwiY29uc29sZSIsIndhcm4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQTs7SUFBWUEsZTs7QUFDWjs7OztBQUNBOzs7Ozs7Ozs7Ozs7OztBQUVBLFNBQVNDLGlCQUFULENBQTJCQyxVQUEzQixFQUF1Q0MsVUFBdkMsRUFBbURDLE9BQW5ELEVBQTREO0FBQzFELE1BQU1DLFNBQVMsQ0FBQyxFQUFFRixzQkFBRixFQUFjRCxzQkFBZCxFQUFELENBQWY7O0FBRUFHLFNBQU9ELE9BQVAsR0FBaUJBLE9BQWpCOztBQUVBLFNBQU8sRUFBRUUsU0FBUyxDQUFDRCxNQUFELENBQVgsRUFBcUJFLE1BQU0sUUFBM0IsRUFBUDtBQUNEOztJQUVLQyxrQztBQUNKLGdEQUFjO0FBQUE7O0FBQUE7O0FBQ1osU0FBS0MsS0FBTCxHQUFhLEVBQWI7O0FBRUEsU0FBS0MsVUFBTCxHQUFrQixDQUFsQjs7QUFFQSxTQUFLQyxZQUFMLEdBQW9CLElBQXBCO0FBQ0EsU0FBS0MsVUFBTCxHQUFrQixJQUFsQjtBQUNBLFNBQUtDLEtBQUwsR0FBYSxJQUFiO0FBQ0EsU0FBS0MsT0FBTCxHQUFlLElBQWY7QUFDQSxTQUFLQyxTQUFMLEdBQWlCLElBQWpCO0FBQ0EsU0FBS0MsUUFBTCxHQUFnQixJQUFoQjtBQUNBLFNBQUtDLFlBQUwsR0FBb0IsSUFBcEI7QUFDQSxTQUFLQyxVQUFMLEdBQWtCLElBQWxCO0FBQ0EsU0FBS0MsYUFBTCxHQUFxQixJQUFyQjtBQUNBLFNBQUtDLFdBQUwsR0FBbUIsSUFBbkI7QUFDQSxTQUFLQyxPQUFMLEdBQWUsSUFBZjs7QUFFQSxTQUFLQyxnQkFBTCxHQUF3QiwwQkFBUSxVQUM5QkMsMkJBRDhCLEVBVTNCO0FBQUEsVUFSSEMsSUFRRyx1RUFSSUMsVUFBVUMsUUFRZDtB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O0FBRUEsVUFBSTZELGNBQUosRUFBb0I7QUFDbEJBLHVCQUFlckQsYUFBZixDQUE2QkwsSUFBN0IsQ0FBa0MsSUFBbEMsRUFBd0NGLEtBQXhDO0FBQ0QsT0FGRCxNQUVPO0FBQ0w2RCxnQkFBUUMsSUFBUix3QkFBb0MvRCxJQUFwQztBQUNEO0FBQ0Y7QUFwQkksR0FBUDtBQXNCRDs7a0JBRWNqRCxrQyIsImZpbGUiOiJDb2duaXRpdmVTZXJ2aWNlc1NwZWVjaFJlY29nbml0aW9uLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgQ29nbml0aXZlU3BlZWNoIGZyb20gJ21pY3Jvc29mdC1zcGVlY2gtYnJvd3Nlci1zZGsnO1xuaW1wb3J0IEV2ZW50QXNQcm9taXNlIGZyb20gJ2V2ZW50LWFzLXByb21pc2UnO1xuaW1wb3J0IG1lbW9pemUgZnJvbSAnbWVtb2l6ZS1vbmUnO1xuXG5mdW5jdGlvbiBidWlsZFNwZWVjaFJlc3VsdCh0cmFuc2NyaXB0LCBjb25maWRlbmNlLCBpc0ZpbmFsKSB7XG4gIGNvbnN0IHJlc3VsdCA9IFt7IGNvbmZpZGVuY2UsIHRyYW5zY3JpcHQgfV07XG5cbiAgcmVzdWx0LmlzRmluYWwgPSBpc0ZpbmFsO1xuXG4gIHJldHVybiB7IHJlc3VsdHM6IFtyZXN1bHRdLCB0eXBlOiAncmVzdWx0JyB9O1xufVxuXG5jbGFzcyBDb2duaXRpdmVTZXJ2aWNlc1NwZWVjaFJlY29nbml0aW9uIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fbGFuZyA9ICcnO1xuXG4gICAgdGhpcy5yZWFkeVN0YXRlID0gMDtcblxuICAgIHRoaXMub25hdWRpb3N0YXJ0ID0gbnVsbDtcbiAgICB0aGlzLm9uYXVkaW9lbmQgPSBudWxsO1xuICAgIHRoaXMub25lbmQgPSBudWxsO1xuICAgIHRoaXMub25lcnJvciA9IG51bGw7XG4gICAgdGhpcy5vbm5vbWF0Y2ggPSBudWxsO1xuICAgIHRoaXMub25yZXN1bHQgPSBudWxsO1xuICAgIHRoaXMub25zb3VuZHN0YXJ0ID0gbnVsbDtcbiAgICB0aGlzLm9uc291bmRlbmQgPSBudWxsO1xuICAgIHRoaXMub25zcGVlY2hzdGFydCA9IG51bGw7XG4gICAgdGhpcy5vbnNwZWVjaGVuZCA9IG51bGw7XG4gICAgdGhpcy5vbnN0YXJ0ID0gbnVsbDtcblxuICAgIHRoaXMuY3JlYXRlUmVjb2duaXplciA9IG1lbW9pemUoKFxuICAgICAgc3Vic2NyaXB0aW9uS2V5T3JUb2tlbkZldGNoLFxuICAgICAgbGFuZyA9IG5hdmlnYXRvci5sYW5ndWFnZSxcbiAgICAgIG1vZGUgPSBDb2duaXRpdmVTcGVlY2guUmVjb2duaXRpb25Nb2RlLkludGVyYWN0aXZlLFxuICAgICAgb3NQbGF0Zm9ybSA9IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LFxuICAgICAgb3NOYW1lID0gd2luZG93Lm5hdmlnYXRvci5hcHBOYW1lLFxuICAgICAgb3NWZXJzaW9uID0gd2luZG93Lm5hdmlnYXRvci5hcHBWZXJzaW9uLFxuICAgICAgZGV2aWNlTWFudWZhY3R1cmVyID0gJ21pY3Jvc29mdC1zcGVlY2gtYnJvd3Nlci1zZGsnLFxuICAgICAgZGV2aWNlTW9kZWwgPSAnd2ViLXNwZWVjaC1jb2duaXRpdmUtc2VydmljZXMnLFxuICAgICAgZGV2aWNlVmVyc2lvbiA9IFZFUlNJT05cbiAgICApID0+IHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IG5ldyBDb2duaXRpdmVTcGVlY2guUmVjb2duaXplckNvbmZpZyhcbiAgICAgICAgbmV3IENvZ25pdGl2ZVNwZWVjaC5TcGVlY2hDb25maWcoXG4gICAgICAgICAgbmV3IENvZ25pdGl2ZVNwZWVjaC5Db250ZXh0KFxuICAgICAgICAgICAgbmV3IENvZ25pdGl2ZVNwZWVjaC5PUyhcbiAgICAgICAgICAgICAgb3NQbGF0Zm9ybSxcbiAgICAgICAgICAgICAgb3NOYW1lLFxuICAgICAgICAgICAgICBvc1ZlcnNpb25cbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBuZXcgQ29nbml0aXZlU3BlZWNoLkRldmljZShcbiAgICAgICAgICAgICAgZGV2aWNlTWFudWZhY3R1cmVyLFxuICAgICAgICAgICAgICBkZXZpY2VNb2RlbCxcbiAgICAgICAgICAgICAgZGV2aWNlVmVyc2lvblxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgKSxcbiAgICAgICAgbW9kZSxcbiAgICAgICAgbGFuZyxcbiAgICAgICAgQ29nbml0aXZlU3BlZWNoLlNwZWVjaFJlc3VsdEZvcm1hdC5EZXRhaWxlZFxuICAgICAgKTtcblxuICAgICAgbGV0IGF1dGg7XG5cbiAgICAgIGlmICh0eXBlb2Ygc3Vic2NyaXB0aW9uS2V5T3JUb2tlbkZldGNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGF1dGggPSBuZXcgQ29nbml0aXZlU3BlZWNoLkNvZ25pdGl2ZVRva2VuQXV0aGVudGljYXRpb24oXG4gICAgICAgICAgYXN5bmMgYXV0aEZldGNoRXZlbnRJRCA9PiBhd2FpdCBzdWJzY3JpcHRpb25LZXlPclRva2VuRmV0Y2goYXV0aEZldGNoRXZlbnRJRCwgZmFsc2UpLFxuICAgICAgICAgIGFzeW5jIGF1dGhGZXRjaEV2ZW50SUQgPT4gYXdhaXQgc3Vic2NyaXB0aW9uS2V5T3JUb2tlbkZldGNoKGF1dGhGZXRjaEV2ZW50SUQsIHRydWUpXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhdXRoID0gbmV3IENvZ25pdGl2ZVNwZWVjaC5Db2duaXRpdmVTdWJzY3JpcHRpb25LZXlBdXRoZW50aWNhdGlvbihzdWJzY3JpcHRpb25LZXlPclRva2VuRmV0Y2gpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29nbml0aXZlU3BlZWNoLkNyZWF0ZVJlY29nbml6ZXIoY29uZmlnLCBhdXRoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBncmFtbWFycygpIHsgcmV0dXJuOyB9XG4gIHNldCBncmFtbWFycyhuZXh0R3JhbW1hcnMpIHtcbiAgICAvLyB0aHJvdyBuZXcgRXJyb3IoJ25vdCBzdXBwb3J0ZWQnKTtcbiAgfVxuXG4gIGdldCBsYW5nKCkgeyByZXR1cm4gdGhpcy5fbGFuZzsgfVxuICBzZXQgbGFuZyhuZXh0TGFuZykgeyB0aGlzLl9sYW5nID0gbmV4dExhbmc7IH1cblxuICBnZXQgY29udGludW91cygpIHsgcmV0dXJuIGZhbHNlOyB9XG4gIHNldCBjb250aW51b3VzKG5leHRDb250aW51b3VzKSB7IHRocm93IG5ldyBFcnJvcignbm90IHN1cHBvcnRlZCcpOyB9XG5cbiAgZ2V0IGludGVyaW1SZXN1bHRzKCkgeyByZXR1cm4gdHJ1ZTsgfVxuICBzZXQgaW50ZXJpbVJlc3VsdHMobmV4dEludGVyaW1SZXN1bHRzKSB7XG4gICAgaWYgKCFuZXh0SW50ZXJpbVJlc3VsdHMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbm90IHN1cHBvcnRlZCcpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBtYXhBbHRlcm5hdGl2ZXMoKSB7IHJldHVybiAxOyB9XG4gIHNldCBtYXhBbHRlcm5hdGl2ZXMobmV4dE1heEFsdGVybmF0aXZlcykgeyB0aHJvdyBuZXcgRXJyb3IoJ25vdCBzdXBwb3J0ZWQnKTsgfVxuXG4gIGdldCBzZXJ2aWNlVVJJKCkgeyByZXR1cm4gbnVsbDsgfVxuICBzZXQgc2VydmljZVVSSShuZXh0U2VydmljZVVSSSkgeyB0aHJvdyBuZXcgRXJyb3IoJ25vdCBzdXBwb3J0ZWQnKTsgfVxuXG4gIGFib3J0KCkge1xuICAgIC8vIFRPRE86IFNob3VsZCByZWRlc2lnbiBob3cgdG8gc3RvcCBhIHJlY29nbml0aW9uIHNlc3Npb25cbiAgICAvLyAgICAgICBBZnRlciBhYm9ydCBpcyBjYWxsZWQsIHdlIHNob3VsZCBub3Qgc2F3IGl0IGlzIGEgXCJzdWNjZXNzXCIsIFwic2lsZW50XCIsIG9yIFwibm8gbWF0Y2hcIlxuICAgIGNvbnN0IHsgQXVkaW9Tb3VyY2UgfSA9IHRoaXMucmVjb2duaXplciB8fCB7fTtcblxuICAgIEF1ZGlvU291cmNlICYmIEF1ZGlvU291cmNlLlR1cm5PZmYoKTtcblxuICAgIHRoaXMuX2Fib3J0ZWQgPSB0cnVlO1xuICB9XG5cbiAgZW1pdChuYW1lLCBldmVudCkge1xuICAgIGNvbnN0IGxpc3RlbmVyID0gdGhpc1tgb24keyBuYW1lIH1gXTtcblxuICAgIGxpc3RlbmVyICYmIGxpc3RlbmVyLmNhbGwodGhpcywgeyAuLi5ldmVudCwgdHlwZTogbmFtZSB9KTtcbiAgfVxuXG4gIHN0b3AoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdub3Qgc3VwcG9ydGVkJyk7XG4gIH1cblxuICBhc3luYyBzdGFydCgpIHtcbiAgICBjb25zdCByZWNvZ25pemVyID0gdGhpcy5yZWNvZ25pemVyID0gdGhpcy5jcmVhdGVSZWNvZ25pemVyKFxuICAgICAgdGhpcy5zdWJzY3JpcHRpb25LZXkgfHwgdGhpcy50b2tlbkZldGNoLFxuICAgICAgdGhpcy5sYW5nLFxuICAgICAgdGhpcy5vc1BsYXRmb3JtIHx8IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LFxuICAgICAgdGhpcy5vc05hbWUgfHwgd2luZG93Lm5hdmlnYXRvci5hcHBOYW1lLFxuICAgICAgdGhpcy5vc1ZlcnNpb24gfHwgd2luZG93Lm5hdmlnYXRvci5hcHBWZXJzaW9uLFxuICAgICAgdGhpcy5kZXZpY2VNYW51ZmFjdHVyZXIgfHwgJ3dlYi1zcGVlY2gtY29nbml0aXZlLXNlcnZpY2VzJyxcbiAgICAgIHRoaXMuZGV2aWNlTW9kZWwgfHwgJ3dlYi1zcGVlY2gtY29nbml0aXZlLXNlcnZpY2VzJyxcbiAgICAgIHRoaXMuZGV2aWNlVmVyc2lvbiB8fCBWRVJTSU9OXG4gICAgKTtcblxuICAgIGNvbnN0IHsgZXZlbnRMaXN0ZW5lciwgLi4ucHJvbWlzZXMgfSA9IHRvUHJvbWlzZSgpO1xuXG4gICAgcmVjb2duaXplci5SZWNvZ25pemUoZXZlbnRMaXN0ZW5lcik7XG4gICAgdGhpcy5fYWJvcnRlZCA9IGZhbHNlO1xuXG4gICAgYXdhaXQgcHJvbWlzZXMucmVjb2duaXRpb25UcmlnZ2VyZWQ7XG5cbiAgICBsZXQgZXJyb3I7XG5cbiAgICBjb25zdCBsaXN0ZW5pbmdTdGFydGVkID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtcbiAgICAgIHByb21pc2VzLmxpc3RlbmluZ1N0YXJ0ZWQsXG4gICAgICBwcm9taXNlcy5yZWNvZ25pdGlvbkVuZGVkXG4gICAgXSk7XG5cbiAgICBpZiAobGlzdGVuaW5nU3RhcnRlZC5OYW1lID09PSAnUmVjb2duaXRpb25FbmRlZEV2ZW50Jykge1xuICAgICAgLy8gUG9zc2libHkgbm90IGF1dGhvcml6ZWQgdG8gdXNlIG1pY3JvcGhvbmVcbiAgICAgIGlmIChsaXN0ZW5pbmdTdGFydGVkLlN0YXR1cyA9PT0gQ29nbml0aXZlU3BlZWNoLlJlY29nbml0aW9uQ29tcGxldGlvblN0YXR1cy5BdWRpb1NvdXJjZUVycm9yKSB7XG4gICAgICAgIGVycm9yID0gJ25vdC1hbGxvd2VkJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yID0gQ29nbml0aXZlU3BlZWNoLlJlY29nbml0aW9uQ29tcGxldGlvblN0YXR1c1tsaXN0ZW5pbmdTdGFydGVkLlN0YXR1c107XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW1pdCgnc3RhcnQnKTtcblxuICAgICAgYXdhaXQgcHJvbWlzZXMuY29ubmVjdGluZ1RvU2VydmljZTtcblxuICAgICAgY29uc3QgcmVjb2duaXRpb25TdGFydGVkID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtcbiAgICAgICAgcHJvbWlzZXMucmVjb2duaXRpb25TdGFydGVkLFxuICAgICAgICBwcm9taXNlcy5yZWNvZ25pdGlvbkVuZGVkXG4gICAgICBdKTtcblxuICAgICAgdGhpcy5lbWl0KCdhdWRpb3N0YXJ0Jyk7XG5cbiAgICAgIGlmIChyZWNvZ25pdGlvblN0YXJ0ZWQuTmFtZSA9PT0gJ1JlY29nbml0aW9uRW5kZWRFdmVudCcpIHtcbiAgICAgICAgLy8gUG9zc2libHkgbmV0d29yayBlcnJvclxuICAgICAgICBpZiAocmVjb2duaXRpb25TdGFydGVkLlN0YXR1cyA9PT0gQ29nbml0aXZlU3BlZWNoLlJlY29nbml0aW9uQ29tcGxldGlvblN0YXR1cy5Db25uZWN0RXJyb3IpIHtcbiAgICAgICAgICBlcnJvciA9ICduZXR3b3JrJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlcnJvciA9IENvZ25pdGl2ZVNwZWVjaC5SZWNvZ25pdGlvbkNvbXBsZXRpb25TdGF0dXNbcmVjb2duaXRpb25TdGFydGVkLlN0YXR1c107XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBnb3RGaXJzdEh5cG90aGVzaXM7XG5cbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgIGNvbnN0IHNwZWVjaEh5cG90aGVzaXMgPSBhd2FpdCBQcm9taXNlLnJhY2UoW1xuICAgICAgICAgICAgcHJvbWlzZXMuZ2V0U3BlZWNoSHlwb3RoZXNpc1Byb21pc2UoKSxcbiAgICAgICAgICAgIHByb21pc2VzLnNwZWVjaEVuZERldGVjdGVkXG4gICAgICAgICAgXSk7XG5cbiAgICAgICAgICBpZiAoc3BlZWNoSHlwb3RoZXNpcy5OYW1lID09PSAnU3BlZWNoRW5kRGV0ZWN0ZWRFdmVudCcpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghZ290Rmlyc3RIeXBvdGhlc2lzKSB7XG4gICAgICAgICAgICBnb3RGaXJzdEh5cG90aGVzaXMgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdzb3VuZHN0YXJ0Jyk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3NwZWVjaHN0YXJ0Jyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5lbWl0KCdyZXN1bHQnLCBidWlsZFNwZWVjaFJlc3VsdChzcGVlY2hIeXBvdGhlc2lzLlJlc3VsdC5UZXh0LCAuNSwgZmFsc2UpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChnb3RGaXJzdEh5cG90aGVzaXMpIHtcbiAgICAgICAgICB0aGlzLmVtaXQoJ3NwZWVjaGVuZCcpO1xuICAgICAgICAgIHRoaXMuZW1pdCgnc291bmRlbmQnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLmVtaXQoJ2F1ZGlvZW5kJyk7XG5cbiAgICAgIGlmICh0aGlzLl9hYm9ydGVkKSB7XG4gICAgICAgIGVycm9yID0gJ2Fib3J0ZWQnO1xuXG4gICAgICAgIGF3YWl0IHByb21pc2VzLnJlY29nbml0aW9uRW5kZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzcGVlY2hEZXRhaWxlZFBocmFzZSA9IGF3YWl0IFByb21pc2UucmFjZShbXG4gICAgICAgICAgcHJvbWlzZXMuc3BlZWNoRGV0YWlsZWRQaHJhc2UsXG4gICAgICAgICAgcHJvbWlzZXMucmVjb2duaXRpb25FbmRlZFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAoc3BlZWNoRGV0YWlsZWRQaHJhc2UuTmFtZSAhPT0gJ1JlY29nbml0aW9uRW5kZWRFdmVudCcpIHtcbiAgICAgICAgICBjb25zdCByZWNvZ25pdGlvblJlc3VsdCA9IENvZ25pdGl2ZVNwZWVjaC5SZWNvZ25pdGlvblN0YXR1c1tzcGVlY2hEZXRhaWxlZFBocmFzZS5SZXN1bHQuUmVjb2duaXRpb25TdGF0dXNdO1xuXG4gICAgICAgICAgaWYgKHJlY29nbml0aW9uUmVzdWx0ID09PSBDb2duaXRpdmVTcGVlY2guUmVjb2duaXRpb25TdGF0dXMuU3VjY2Vzcykge1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdyZXN1bHQnLCBidWlsZFNwZWVjaFJlc3VsdChzcGVlY2hEZXRhaWxlZFBocmFzZS5SZXN1bHQuTkJlc3RbMF0uRGlzcGxheSwgc3BlZWNoRGV0YWlsZWRQaHJhc2UuUmVzdWx0Lk5CZXN0WzBdLkNvbmZpZGVuY2UsIHRydWUpKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHJlY29nbml0aW9uUmVzdWx0ICE9PSBDb2duaXRpdmVTcGVlY2guUmVjb2duaXRpb25TdGF0dXMuTm9NYXRjaCkge1xuICAgICAgICAgICAgLy8gUG9zc2libHkgc2lsZW50IG9yIG11dGVkXG4gICAgICAgICAgICBpZiAocmVjb2duaXRpb25SZXN1bHQgPT09IENvZ25pdGl2ZVNwZWVjaC5SZWNvZ25pdGlvblN0YXR1cy5Jbml0aWFsU2lsZW5jZVRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgZXJyb3IgPSAnbm8tc3BlZWNoJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGVycm9yID0gc3BlZWNoRGV0YWlsZWRQaHJhc2UuUmVzdWx0LlJlY29nbml0aW9uU3RhdHVzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGF3YWl0IHByb21pc2VzLnJlY29nbml0aW9uRW5kZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBlcnJvciAmJiB0aGlzLmVtaXQoJ2Vycm9yJywgeyBlcnJvciB9KTtcbiAgICB0aGlzLmVtaXQoJ2VuZCcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvUHJvbWlzZSgpIHtcbiAgY29uc3QgZXZlbnRzID0ge1xuICAgIENvbm5lY3RpbmdUb1NlcnZpY2VFdmVudDogbmV3IEV2ZW50QXNQcm9taXNlKCksXG4gICAgTGlzdGVuaW5nU3RhcnRlZEV2ZW50OiBuZXcgRXZlbnRBc1Byb21pc2UoKSxcbiAgICBSZWNvZ25pdGlvbkVuZGVkRXZlbnQ6IG5ldyBFdmVudEFzUHJvbWlzZSgpLFxuICAgIFJlY29nbml0aW9uU3RhcnRlZEV2ZW50OiBuZXcgRXZlbnRBc1Byb21pc2UoKSxcbiAgICBSZWNvZ25pdGlvblRyaWdnZXJlZEV2ZW50OiBuZXcgRXZlbnRBc1Byb21pc2UoKSxcbiAgICBTcGVlY2hEZXRhaWxlZFBocmFzZUV2ZW50OiBuZXcgRXZlbnRBc1Byb21pc2UoKSxcbiAgICBTcGVlY2hFbmREZXRlY3RlZEV2ZW50OiBuZXcgRXZlbnRBc1Byb21pc2UoKSxcbiAgICBTcGVlY2hIeXBvdGhlc2lzRXZlbnQ6IG5ldyBFdmVudEFzUHJvbWlzZSgpLFxuICAgIFNwZWVjaFNpbXBsZVBocmFzZUV2ZW50OiBuZXcgRXZlbnRBc1Byb21pc2UoKSxcbiAgICBTcGVlY2hTdGFydERldGVjdGVkRXZlbnQ6IG5ldyBFdmVudEFzUHJvbWlzZSgpXG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBjb25uZWN0aW5nVG9TZXJ2aWNlOiBldmVudHMuQ29ubmVjdGluZ1RvU2VydmljZUV2ZW50LnVwY29taW5nKCksXG4gICAgbGlzdGVuaW5nU3RhcnRlZDogZXZlbnRzLkxpc3RlbmluZ1N0YXJ0ZWRFdmVudC51cGNvbWluZygpLFxuICAgIHJlY29nbml0aW9uRW5kZWQ6IGV2ZW50cy5SZWNvZ25pdGlvbkVuZGVkRXZlbnQudXBjb21pbmcoKSxcbiAgICByZWNvZ25pdGlvblN0YXJ0ZWQ6IGV2ZW50cy5SZWNvZ25pdGlvblN0YXJ0ZWRFdmVudC51cGNvbWluZygpLFxuICAgIHJlY29nbml0aW9uVHJpZ2dlcmVkOiBldmVudHMuUmVjb2duaXRpb25UcmlnZ2VyZWRFdmVudC51cGNvbWluZygpLFxuICAgIHNwZWVjaERldGFpbGVkUGhyYXNlOiBldmVudHMuU3BlZWNoRGV0YWlsZWRQaHJhc2VFdmVudC51cGNvbWluZygpLFxuICAgIHNwZWVjaEVuZERldGVjdGVkOiBldmVudHMuU3BlZWNoRW5kRGV0ZWN0ZWRFdmVudC51cGNvbWluZygpLFxuICAgIGdldFNwZWVjaEh5cG90aGVzaXNQcm9taXNlOiAoKSA9PiBldmVudHMuU3BlZWNoSHlwb3RoZXNpc0V2ZW50LnVwY29taW5nKCksXG4gICAgc3BlZWNoU2ltcGxlUGhyYXNlOiBldmVudHMuU3BlZWNoU2ltcGxlUGhyYXNlRXZlbnQudXBjb21pbmcoKSxcbiAgICBzcGVlY2hTdGFydERldGVjdGVkOiBldmVudHMuU3BlZWNoU3RhcnREZXRlY3RlZEV2ZW50LnVwY29taW5nKCksXG4gICAgZXZlbnRMaXN0ZW5lcjogZXZlbnQgPT4ge1xuICAgICAgY29uc3QgeyBOYW1lOiBuYW1lIH0gPSBldmVudDtcbiAgICAgIGNvbnN0IGV2ZW50QXNQcm9taXNlID0gZXZlbnRzW25hbWVdO1xuXG4gICAgICBpZiAoZXZlbnRBc1Byb21pc2UpIHtcbiAgICAgICAgZXZlbnRBc1Byb21pc2UuZXZlbnRMaXN0ZW5lci5jYWxsKG51bGwsIGV2ZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgVW5leHBlY3RlZCBldmVudCBcXFwiJHsgbmFtZSB9XFxcIiBmcm9tIENvZ25pdGl2ZSBTZXJ2aWNlcywgcGxlYXNlIGZpbGUgYSBidWcgdG8gaHR0cHM6Ly9naXRodWIuY29tL2NvbXB1bGltL3dlYi1zcGVlY2gtY29nbml0aXZlLXNlcnZpY2VzYCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBDb2duaXRpdmVTZXJ2aWNlc1NwZWVjaFJlY29nbml0aW9uXG4iXX0=

@@ -6,3 +6,10 @@ 'use strict';

});
exports.CognitiveServicesSpeechGrammarList = undefined;
require('babel-polyfill');
var _CognitiveServicesSpeechGrammarList = require('./CognitiveServicesSpeechGrammarList');
var _CognitiveServicesSpeechGrammarList2 = _interopRequireDefault(_CognitiveServicesSpeechGrammarList);
var _CognitiveServicesSpeechRecognition = require('./CognitiveServicesSpeechRecognition');

@@ -15,2 +22,3 @@

exports.default = _CognitiveServicesSpeechRecognition2.default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJDb2duaXRpdmVTZXJ2aWNlc1NwZWVjaFJlY29nbml0aW9uIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7Ozs7O2tCQUVlQSw0QyIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBDb2duaXRpdmVTZXJ2aWNlc1NwZWVjaFJlY29nbml0aW9uIGZyb20gJy4vQ29nbml0aXZlU2VydmljZXNTcGVlY2hSZWNvZ25pdGlvbic7XG5cbmV4cG9ydCBkZWZhdWx0IENvZ25pdGl2ZVNlcnZpY2VzU3BlZWNoUmVjb2duaXRpb25cbiJdfQ==
exports.CognitiveServicesSpeechGrammarList = _CognitiveServicesSpeechGrammarList2.default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJDb2duaXRpdmVTZXJ2aWNlc1NwZWVjaFJlY29nbml0aW9uIiwiQ29nbml0aXZlU2VydmljZXNTcGVlY2hHcmFtbWFyTGlzdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOztBQUVBOzs7O0FBQ0E7Ozs7OztrQkFFZUEsNEM7UUFHYkMsa0MsR0FBQUEsNEMiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJ2JhYmVsLXBvbHlmaWxsJztcblxuaW1wb3J0IENvZ25pdGl2ZVNlcnZpY2VzU3BlZWNoR3JhbW1hckxpc3QgZnJvbSAnLi9Db2duaXRpdmVTZXJ2aWNlc1NwZWVjaEdyYW1tYXJMaXN0JztcbmltcG9ydCBDb2duaXRpdmVTZXJ2aWNlc1NwZWVjaFJlY29nbml0aW9uIGZyb20gJy4vQ29nbml0aXZlU2VydmljZXNTcGVlY2hSZWNvZ25pdGlvbic7XG5cbmV4cG9ydCBkZWZhdWx0IENvZ25pdGl2ZVNlcnZpY2VzU3BlZWNoUmVjb2duaXRpb25cblxuZXhwb3J0IHtcbiAgQ29nbml0aXZlU2VydmljZXNTcGVlY2hHcmFtbWFyTGlzdFxufVxuIl19
{
"name": "web-speech-cognitive-services",
"version": "0.0.1-master.f80884e",
"description": "",
"keywords": [],
"version": "1.0.0",
"description": "Polyfill Web Speech API with Cognitive Services Speech-to-Text service",
"keywords": [
"cognitive services",
"dictation",
"microphone",
"polyfill",
"react",
"speak",
"speech recognition",
"speech to text",
"voice recognition",
"web speech",
"webrtc",
"webspeech"
],
"main": "lib/index.js",

@@ -34,3 +47,2 @@ "files": [

"classnames": "^2.2.6",
"event-as-promise": "^1.0.3",
"glamor": "^2.20.40",

@@ -41,3 +53,3 @@ "jest": "^22.4.4",

"react": "^16.4.1",
"react-dictate-button": "^1.0.0",
"react-dictate-button": "^1.1.2",
"react-dom": "^16.4.1",

@@ -48,5 +60,7 @@ "react-scripts": "1.1.4",

"dependencies": {
"memoize-one": "^3.1.1"
"event-as-promise": "^1.0.3",
"memoize-one": "^4.0.0"
},
"peerDependencies": {
"babel-polyfill": "^6.26.0",
"microsoft-speech-browser-sdk": "^0.0.12",

@@ -53,0 +67,0 @@ "react": "^16.4.1"

@@ -5,3 +5,3 @@ # web-speech-cognitive-services

Polyfill Web Speech API with Cognitive Services.
Polyfill Web Speech API with Cognitive Services Speech-to-Text service.

@@ -24,16 +24,69 @@ This scaffold is provided by [`react-component-template`](https://github.com/compulim/react-component-template/).

# How to use
First, run `npm install web-speech-cognitive-services` for latest production build. Or `npm install web-speech-cognitive-services@master` for latest development build.
```jsx
import CognitiveServicesSpeechRecognition from 'web-speech-cognitive-services';
const recognition = new CognitiveServicesSpeechRecognition();
// There are two ways to provide your credential:
// 1. Provide a subscription key (good for prototype, not for production)
// 2. Provide a mechanism to obtain/refresh access token
// If you are using subscription key
recognition.subscriptionKey = 'your subscription key';
// If you are using access token, refreshToken === true, if we are renewing the token, otherwise, false
recognition.tokenFetch = async (authFetchEventID, refreshToken) => {
};
recognition.lang = 'en-US';
recognition.onresult = ({ results }) => {
console.log(results);
};
recognition.start();
```
## Integrating with React
You can use [`react-dictate-button`](https://github.com/compulim/react-dictate-button/) to integrate speech recognition functionality to your React app.
```jsx
import CognitiveServicesSpeechRecognitionm, { CognitiveServicesSpeechGrammarList } from 'web-speech-recognition-services';
import DictateButton from 'react-dictate-button';
export default props =>
<DictateButton
extra={{ subscriptionKey: 'your subscription key' }}
onDictate={ ({ result }) => alert(result.transcript) }
speechGrammarList={ CognitiveServicesSpeechGrammarList }
speechRecognition={ CognitiveServicesSpeechRecognition }
>
Start dictation
</DictateButton>
```
You can also look at our [playground page](packages/playground/src/DictationPane.js) to see how it works.
# Test matrix
Browsers are all latest as of 2018-06-28, except:
* macOS was 10.13.1 (2017-10-31), instead of 10.13.5
* Tthere should be no change on the matrix since Safari does not support Web Speech API
* Xbox was tested on Insider build (1806)
* Since Safari does not support Web Speech API, the test matrix remains the same
* Xbox was tested on Insider build (1806) with Kinect sensor connected
* The latest Insider build does not support both WebRTC and Web Speech API, so we suspect the production build also does not support both
Overall in point form:
Quick grab:
* With Web Speech API only, web dev can enable speech recognition on most popular platforms, except iOS
* iOS: No browsers on iOS support Web Speech API
* Some platforms requires non-default browser
* With Cognitive Services Speech-to-Text, all popular platforms with their default browsers are supported
* iOS: Chrome and Edge does not support Cognitive Services because WebRTC is disabled
* Web Speech API
* Works on most popular platforms, except iOS. Some requires non-default browser.
* iOS: None of the popular browsers support Web Speech API
* Windows: requires Chrome
* Cognitive Services Speech-to-Text
* Works on default browsers on all popular platforms
* iOS: Chrome and Edge does not support Cognitive Services (WebRTC)

@@ -61,3 +114,3 @@ | Platform | OS | Browser | Cognitive Services (WebRTC) | Web Speech API |

We test multiple scenarios to make sure the package polyfill Web Speech API correctly. Following are events and its firing order.
We test multiple scenarios to make sure we polyfill Web Speech API correctly. Following are events and its firing order, in Cognitive Services and Web Speech API respectively.

@@ -101,3 +154,3 @@ * [Happy path](#happy-path)

* Cognitive Services
* Essentially muted the speech, that could still result in success, silent, or no match
* Essentially muted the microphone and receive `SpeechEndDetectedEvent` immediately, very similar to [happy path](#happy-path), could still result in success, silent, or no match
* Web Speech API

@@ -110,14 +163,14 @@ 1. `start`

#### Abort after some speech is recognized
#### Abort after some text has recognized
* Cognitive Services
* Essentially muted the speech, that could still result in success, silent, or no match
* Essentially muted the microphone and receive `SpeechEndDetectedEvent` immediately, very similar to [happy path](#happy-path), could still result in success, silent, or no match
* Web Speech API
1. `start`
2. `audiostart`
3. `soundstart` (optional)
4. `speechstart` (optional)
5. `result` (optional)
6. `speechend` (optional)
7. `soundend` (optional)
3. `soundstart`
4. `speechstart`
5. `result` (one or more)
6. `speechend`
7. `soundend`
8. `audioend`

@@ -202,4 +255,11 @@ 9. `error(error = 'aborted')`

* Cognitive Services support grammar list but not in JSGF format, more work to be done in this area
* Although Google Chrome support setting the grammar list, it seems the grammar list is not used at all
* Although Google Chrome support grammar list, it seems the grammar list is not used at all
* Continuous mode does not work
# Roadmap
* [ ] Add grammar list
* [ ] Add tests for lifecycle events
* [ ] Investigate continuous mode
# Contributions

@@ -206,0 +266,0 @@

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc