@untemps/vocal 1.3.0 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +2 -0
- package/README.md +66 -3
- package/dist/index.es.js +100 -2
- package/dist/index.js +2 -2
- package/dist/index.umd.js +2 -2
- package/package.json +98 -95
- package/.github/workflows/index.yml +0 -23
- package/.prettierignore +0 -2
- package/.prettierrc +0 -29
- package/CONTRIBUTING.md +0 -15
- package/babel.config.js +0 -10
- package/jest/jest.setup.js +0 -59
- package/rollup.config.js +0 -38
- package/src/Vocal.js +0 -169
- package/src/__tests__/Vocal.test.js +0 -34
- package/src/index.js +0 -1
package/CHANGELOG.md
CHANGED
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Class wrapped around the SpeechRecognition Web API
|
|
4
4
|
|
|
5
5
|

|
|
6
|
-

|
|
7
7
|

|
|
8
8
|
|
|
9
9
|
## Installation
|
|
@@ -12,10 +12,73 @@ Class wrapped around the SpeechRecognition Web API
|
|
|
12
12
|
yarn add @untemps/vocal
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
-
## Usage
|
|
15
|
+
## Basic Usage
|
|
16
16
|
|
|
17
|
-
Import `Vocal
|
|
17
|
+
Import `Vocal` to a file.
|
|
18
18
|
|
|
19
19
|
```javascript
|
|
20
20
|
import { Vocal } from '@untemps/vocal'
|
|
21
|
+
|
|
22
|
+
// Check whether SpeechRecognition, Permissions and MediaDevices interfaces are supported
|
|
23
|
+
if (!Vocal.isSupported()) {
|
|
24
|
+
throw "Vocal is not supported"
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Create a Vocal instance (see below for all available option properties)
|
|
29
|
+
const options = {
|
|
30
|
+
lang: 'fr-FR',
|
|
31
|
+
}
|
|
32
|
+
const vocal = new Vocal(options)
|
|
33
|
+
|
|
34
|
+
// Subscribe to Vocal instance events (see below for all available events)
|
|
35
|
+
vocal.addEventListener('speechstart', (event) => console.log('Vocal starts recording'))
|
|
36
|
+
vocal.addEventListener('speechend', (event) => console.log('Vocal stops recording'))
|
|
37
|
+
vocal.addEventListener('result', (event, result) => console.log('Vocal catches a result'))
|
|
38
|
+
vocal.addEventListener('error', (error) => throw error)
|
|
39
|
+
|
|
40
|
+
// Start recording
|
|
41
|
+
vocal.start()
|
|
42
|
+
|
|
43
|
+
// Stop/Pause recording
|
|
44
|
+
vocal.stop()
|
|
45
|
+
|
|
46
|
+
// Abort recording entirely
|
|
47
|
+
vocal.abort()
|
|
48
|
+
|
|
49
|
+
// Remove all attached listeners and delete the Vocal instance
|
|
50
|
+
vocal.cleanup()
|
|
21
51
|
```
|
|
52
|
+
|
|
53
|
+
## Options
|
|
54
|
+
|
|
55
|
+
Options described below are those from the `SpeechRecognition` Web API.
|
|
56
|
+
Please this [this section](https://developer.mozilla.org/en-US/docs/Web/API/SpeechRecognition#properties) for more information.
|
|
57
|
+
|
|
58
|
+
| Option | Type | Default | Description |
|
|
59
|
+
| ---------------- | ----------------- | ---------- | ----------------------------------------------------------------------------------------------------------------- |
|
|
60
|
+
| grammars | SpeechGrammarList | null | Grammars understood by the recognition [JSpeech Grammar Format](https://www.w3.org/TR/jsgf/) |
|
|
61
|
+
| lang | string | 'en-US' | Language understood by the recognition [BCP 47 language tag](https://tools.ietf.org/html/bcp47) |
|
|
62
|
+
| continuous | boolean | false | Whether continuous results are returned for each recognition, or only a single result |
|
|
63
|
+
| interimResults | boolean | false | Whether interim results should be returned or not. Interim results are results that are not yet final |
|
|
64
|
+
| maxAlternatives | number | 1 | Maximum number of SpeechRecognitionAlternatives provided per result |
|
|
65
|
+
| serviceURI | string | null | Location of the speech recognition service used by the current SpeechRecognition to handle the actual recognition |
|
|
66
|
+
|
|
67
|
+
## Events
|
|
68
|
+
|
|
69
|
+
Events described below are those from the `SpeechRecognition` Web API.
|
|
70
|
+
Please this [this section](https://developer.mozilla.org/en-US/docs/Web/API/SpeechRecognition#events) for more information.
|
|
71
|
+
|
|
72
|
+
| Event | Description |
|
|
73
|
+
| ----------- | ----------------------------------------------------------------------------------------- |
|
|
74
|
+
| audioend | Fired when the user agent has finished capturing audio for recognition |
|
|
75
|
+
| audiostart | Fired when the user agent has started to capture audio for recognition |
|
|
76
|
+
| end | Fired when the recognition service has disconnected |
|
|
77
|
+
| error | Fired when a recognition error occurs |
|
|
78
|
+
| nomatch | Fired when the recognition service returns a final result with no significant recognition |
|
|
79
|
+
| result | Fired when the recognition service returns a result |
|
|
80
|
+
| soundend | Fired when any sound — recognisable or not — has stopped being detected |
|
|
81
|
+
| soundstart | Fired when any sound — recognisable or not — has been detected |
|
|
82
|
+
| speechend | Fired when speech recognized by the recognition service has stopped being detected |
|
|
83
|
+
| speechstart | Fired when sound recognized by the recognition service as speech has been detected |
|
|
84
|
+
| start | fired when the recognition service has begun listening to incoming audio |
|
package/dist/index.es.js
CHANGED
|
@@ -1,2 +1,100 @@
|
|
|
1
|
-
var t=function(t,e,r){return t(r={path:e,exports:{},require:function(t,e){return function(){throw new Error("Dynamic requires are not currently supported by @rollup/plugin-commonjs")}(null==e&&r.path)}},r.exports),r.exports}((function(t){var e=function(t){var e=Object.prototype,r=e.hasOwnProperty,n="function"==typeof Symbol?Symbol:{},o=n.iterator||"@@iterator",i=n.asyncIterator||"@@asyncIterator",a=n.toStringTag||"@@toStringTag";function c(t,e,r){return Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{c({},"")}catch(t){c=function(t,e,r){return t[e]=r}}function u(t,e,r,n){var o=e&&e.prototype instanceof f?e:f,i=Object.create(o.prototype),a=new _(n||[]);return i._invoke=function(t,e,r){var n="suspendedStart";return function(o,i){if("executing"===n)throw new Error("Generator is already running");if("completed"===n){if("throw"===o)throw i;return S()}for(r.method=o,r.arg=i;;){var a=r.delegate;if(a){var c=b(a,r);if(c){if(c===l)continue;return c}}if("next"===r.method)r.sent=r._sent=r.arg;else if("throw"===r.method){if("suspendedStart"===n)throw n="completed",r.arg;r.dispatchException(r.arg)}else"return"===r.method&&r.abrupt("return",r.arg);n="executing";var u=s(t,e,r);if("normal"===u.type){if(n=r.done?"completed":"suspendedYield",u.arg===l)continue;return{value:u.arg,done:r.done}}"throw"===u.type&&(n="completed",r.method="throw",r.arg=u.arg)}}}(t,r,a),i}function s(t,e,r){try{return{type:"normal",arg:t.call(e,r)}}catch(t){return{type:"throw",arg:t}}}t.wrap=u;var l={};function f(){}function h(){}function p(){}var v={};v[o]=function(){return this};var y=Object.getPrototypeOf,d=y&&y(y(x([])));d&&d!==e&&r.call(d,o)&&(v=d);var m=p.prototype=f.prototype=Object.create(v);function g(t){["next","throw","return"].forEach((function(e){c(t,e,(function(t){return this._invoke(e,t)}))}))}function w(t,e){var n;this._invoke=function(o,i){function a(){return new e((function(n,a){!function n(o,i,a,c){var u=s(t[o],t,i);if("throw"!==u.type){var l=u.arg,f=l.value;return f&&"object"==typeof f&&r.call(f,"__await")?e.resolve(f.__await).then((function(t){n("next",t,a,c)}),(function(t){n("throw",t,a,c)})):e.resolve(f).then((function(t){l.value=t,a(l)}),(function(t){return n("throw",t,a,c)}))}c(u.arg)}(o,i,n,a)}))}return n=n?n.then(a,a):a()}}function b(t,e){var r=t.iterator[e.method];if(void 0===r){if(e.delegate=null,"throw"===e.method){if(t.iterator.return&&(e.method="return",e.arg=void 0,b(t,e),"throw"===e.method))return l;e.method="throw",e.arg=new TypeError("The iterator does not provide a 'throw' method")}return l}var n=s(r,t.iterator,e.arg);if("throw"===n.type)return e.method="throw",e.arg=n.arg,e.delegate=null,l;var o=n.arg;return o?o.done?(e[t.resultName]=o.value,e.next=t.nextLoc,"return"!==e.method&&(e.method="next",e.arg=void 0),e.delegate=null,l):o:(e.method="throw",e.arg=new TypeError("iterator result is not an object"),e.delegate=null,l)}function E(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function O(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function _(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(E,this),this.reset(!0)}function x(t){if(t){var e=t[o];if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var n=-1,i=function e(){for(;++n<t.length;)if(r.call(t,n))return e.value=t[n],e.done=!1,e;return e.value=void 0,e.done=!0,e};return i.next=i}}return{next:S}}function S(){return{value:void 0,done:!0}}return h.prototype=m.constructor=p,p.constructor=h,h.displayName=c(p,a,"GeneratorFunction"),t.isGeneratorFunction=function(t){var e="function"==typeof t&&t.constructor;return!!e&&(e===h||"GeneratorFunction"===(e.displayName||e.name))},t.mark=function(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,p):(t.__proto__=p,c(t,a,"GeneratorFunction")),t.prototype=Object.create(m),t},t.awrap=function(t){return{__await:t}},g(w.prototype),w.prototype[i]=function(){return this},t.AsyncIterator=w,t.async=function(e,r,n,o,i){void 0===i&&(i=Promise);var a=new w(u(e,r,n,o),i);return t.isGeneratorFunction(r)?a:a.next().then((function(t){return t.done?t.value:a.next()}))},g(m),c(m,a,"Generator"),m[o]=function(){return this},m.toString=function(){return"[object Generator]"},t.keys=function(t){var e=[];for(var r in t)e.push(r);return e.reverse(),function r(){for(;e.length;){var n=e.pop();if(n in t)return r.value=n,r.done=!1,r}return r.done=!0,r}},t.values=x,_.prototype={constructor:_,reset:function(t){if(this.prev=0,this.next=0,this.sent=this._sent=void 0,this.done=!1,this.delegate=null,this.method="next",this.arg=void 0,this.tryEntries.forEach(O),!t)for(var e in this)"t"===e.charAt(0)&&r.call(this,e)&&!isNaN(+e.slice(1))&&(this[e]=void 0)},stop:function(){this.done=!0;var t=this.tryEntries[0].completion;if("throw"===t.type)throw t.arg;return this.rval},dispatchException:function(t){if(this.done)throw t;var e=this;function n(r,n){return a.type="throw",a.arg=t,e.next=r,n&&(e.method="next",e.arg=void 0),!!n}for(var o=this.tryEntries.length-1;o>=0;--o){var i=this.tryEntries[o],a=i.completion;if("root"===i.tryLoc)return n("end");if(i.tryLoc<=this.prev){var c=r.call(i,"catchLoc"),u=r.call(i,"finallyLoc");if(c&&u){if(this.prev<i.catchLoc)return n(i.catchLoc,!0);if(this.prev<i.finallyLoc)return n(i.finallyLoc)}else if(c){if(this.prev<i.catchLoc)return n(i.catchLoc,!0)}else{if(!u)throw new Error("try statement without catch or finally");if(this.prev<i.finallyLoc)return n(i.finallyLoc)}}}},abrupt:function(t,e){for(var n=this.tryEntries.length-1;n>=0;--n){var o=this.tryEntries[n];if(o.tryLoc<=this.prev&&r.call(o,"finallyLoc")&&this.prev<o.finallyLoc){var i=o;break}}i&&("break"===t||"continue"===t)&&i.tryLoc<=e&&e<=i.finallyLoc&&(i=null);var a=i?i.completion:{};return a.type=t,a.arg=e,i?(this.method="next",this.next=i.finallyLoc,l):this.complete(a)},complete:function(t,e){if("throw"===t.type)throw t.arg;return"break"===t.type||"continue"===t.type?this.next=t.arg:"return"===t.type?(this.rval=this.arg=t.arg,this.method="return",this.next="end"):"normal"===t.type&&e&&(this.next=e),l},finish:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),O(r),l}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var n=r.completion;if("throw"===n.type){var o=n.arg;O(r)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(t,e,r){return this.delegate={iterator:x(t),resultName:e,nextLoc:r},"next"===this.method&&(this.arg=void 0),l}},t}(t.exports);try{regeneratorRuntime=e}catch(t){Function("r","regeneratorRuntime = r")(e)}}));function e(t,e,r,n,o,i,a){try{var c=t[i](a),u=c.value}catch(t){return void r(t)}c.done?e(u):Promise.resolve(u).then(n,o)}var r=function(t){return function(){var r=this,n=arguments;return new Promise((function(o,i){var a=t.apply(r,n);function c(t){e(a,o,i,c,u,"next",t)}function u(t){e(a,o,i,c,u,"throw",t)}c(void 0)}))}};var n=function(t){if(Array.isArray(t))return t};var o=function(t,e){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(t)){var r=[],n=!0,o=!1,i=void 0;try{for(var a,c=t[Symbol.iterator]();!(n=(a=c.next()).done)&&(r.push(a.value),!e||r.length!==e);n=!0);}catch(t){o=!0,i=t}finally{try{n||null==c.return||c.return()}finally{if(o)throw i}}return r}};var i=function(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r<e;r++)n[r]=t[r];return n};var a=function(t,e){if(t){if("string"==typeof t)return i(t,e);var r=Object.prototype.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?i(t,e):void 0}};var c=function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")};var u=function(t,e){return n(t)||o(t,e)||a(t,e)||c()};var s=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")};function l(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}var f=function(t,e,r){return e&&l(t.prototype,e),r&&l(t,r),t};var h=function(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t},p=function(){return!!navigator.permissions},v=function(){return!!navigator.mediaDevices};function y(t,e,r,n,o,i,a){try{var c=t[i](a),u=c.value}catch(t){return void r(t)}c.done?e(u):Promise.resolve(u).then(n,o)}function d(t){return function(){var e=this,r=arguments;return new Promise((function(n,o){var i=t.apply(e,r);function a(t){y(i,n,o,a,c,"next",t)}function c(t){y(i,n,o,a,c,"throw",t)}a(void 0)}))}}function m(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(t)){var r=[],n=!0,o=!1,i=void 0;try{for(var a,c=t[Symbol.iterator]();!(n=(a=c.next()).done)&&(r.push(a.value),!e||r.length!==e);n=!0);}catch(t){o=!0,i=t}finally{try{n||null==c.return||c.return()}finally{if(o)throw i}}return r}}(t,e)||function(t,e){if(t){if("string"==typeof t)return g(t,e);var r=Object.prototype.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?g(t,e):void 0}}(t,e)||function(){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 g(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r<e;r++)n[r]=t[r];return n}var w=function(){var t=d(regeneratorRuntime.mark((function t(e){return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",new Promise(function(){var t=d(regeneratorRuntime.mark((function t(r,n){var o,i;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return p()||n(new DOMException("Navigator API: permissions not supported","NOT_SUPPORTED_ERR")),t.prev=1,t.next=4,navigator.permissions.query({name:e});case 4:o=t.sent,i=function t(e){o.removeEventListener("change",t),b(e.target.state,r,n)},o.addEventListener("change",i),b(o.state,r,n),t.next=13;break;case 10:t.prev=10,t.t0=t.catch(1),n(t.t0);case 13:case"end":return t.stop()}}),t,null,[[1,10]])})));return function(e,r){return t.apply(this,arguments)}}()));case 1:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}(),b=function(t,e,r){switch(t){case"denied":r(new DOMException("Permission denied","NOT_ALLOWED_ERR"));break;default:e(t)}},E=function(){var t=d(regeneratorRuntime.mark((function t(e,r){return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",new Promise(function(){var t=d(regeneratorRuntime.mark((function t(n,o){var i,a,c;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return p()&&v()||o(new DOMException("Navigator API: permissions or Navigator API: mediaDevices not supported","NOT_SUPPORTED_ERR")),t.prev=1,t.t0=Promise,t.next=5,w(e);case 5:return t.t1=t.sent,t.next=8,navigator.mediaDevices.getUserMedia(r);case 8:return t.t2=t.sent,t.t3=[t.t1,t.t2],t.next=12,t.t0.all.call(t.t0,t.t3);case 12:i=t.sent,a=m(i,2),c=a[1],n(c),t.next=21;break;case 18:t.prev=18,t.t4=t.catch(1),o(t.t4);case 21:case"end":return t.stop()}}),t,null,[[1,18]])})));return function(e,r){return t.apply(this,arguments)}}()));case 1:case"end":return t.stop()}}),t)})));return function(e,r){return t.apply(this,arguments)}}();function O(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,n)}return r}function _(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{};e%2?O(Object(r),!0).forEach((function(e){h(t,e,r[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):O(Object(r)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}))}return t}var x=function(){function e(t){var r=this;s(this,e),h(this,"_instance",null),h(this,"_listeners",null);var n=e._resolveSpeechRecognition();if(!n)throw new DOMException("SpeechRecognition not supported","NOT_SUPPORTED_ERR");this._instance=new n,this._listeners={},Object.entries(_(_({},e.defaultOptions),t||{})).forEach((function(t){var n=u(t,2),o=n[0],i=n[1];if("grammars"===o&&!i){var a=e._resolveSpeechGrammarList();a&&(i=new a)}r._instance[o]=i}))}var n;return f(e,null,[{key:"isSupported",get:function(){return!!e._resolveSpeechRecognition()&&!!p()&&!!v()},set:function(t){throw new Error("You cannot set isSupported directly.")}}]),f(e,[{key:"start",value:(n=r(t.mark((function e(){var r;return t.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(!this._instance){t.next=14;break}return t.prev=1,t.next=4,E("microphone",{audio:!0});case 4:if(t.sent){t.next=7;break}throw new Error("Unable to retrieve the stream from media device");case 7:this._instance.start(),t.next=14;break;case 10:t.prev=10,t.t0=t.catch(1),(r=this._listeners.error)&&r(t.t0);case 14:return t.abrupt("return",this);case 15:case"end":return t.stop()}}),e,this,[[1,10]])}))),function(){return n.apply(this,arguments)})},{key:"stop",value:function(){return this._instance&&this._instance.stop(),this}},{key:"abort",value:function(){return this._instance&&this._instance.abort(),this}},{key:"addEventListener",value:function(t,r){var n=this;if(this._instance&&this._includesEventType(t)){this._listeners[t]&&this.removeEventListener(t);var o=function(o){var i=[];t===e.eventTypes.RESULT&&o.results&&o.results.length>0&&i.push(o.results[0][0].transcript),r&&r.apply(n,[o].concat(i))};this._instance.addEventListener(t,o),this._listeners[t]=o}return this}},{key:"removeEventListener",value:function(t){var e=this._listeners[t];return this._instance.removeEventListener(t,e),delete this._listeners[t],this}},{key:"cleanup",value:function(){var t=this;return this.stop(),Object.keys(this._listeners).forEach((function(e){return t.removeEventListener(e)})),this._instance=null,this}},{key:"_includesEventType",value:function(t){return!!Object.values(e.eventTypes).find((function(e){return e===t}))}},{key:"instance",get:function(){return this._instance},set:function(t){throw new Error("You cannot set instance directly.")}}],[{key:"_resolveSpeechRecognition",value:function(){return window.SpeechRecognition||window.webkitSpeechRecognition||window.mozSpeechRecognition||window.msSpeechRecognition}},{key:"_resolveSpeechGrammarList",value:function(){return window.SpeechGrammarList||window.webkitSpeechGrammarList||window.mozSpeechGrammarList||window.msSpeechGrammarList}}]),e}();h(x,"defaultOptions",{grammars:null,lang:"en-US",continuous:!1,interimResults:!1,maxAlternatives:1,serviceURI:null}),h(x,"eventTypes",{AUDIO_END:"audioend",AUDIO_START:"audiostart",END:"end",ERROR:"error",NO_MATCH:"nomatch",RESULT:"result",SOUND_END:"soundend",SOUND_START:"soundstart",SPEECH_END:"speechend",SPEECH_START:"speechstart",START:"start"});export{x as Vocal};
|
|
2
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZXMuanMiLCJzb3VyY2VzIjpbIi4uL25vZGVfbW9kdWxlcy9yZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXJyYXlXaXRoSG9sZXMuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pdGVyYWJsZVRvQXJyYXlMaW1pdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2FycmF5TGlrZVRvQXJyYXkuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL25vbkl0ZXJhYmxlUmVzdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXkuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjay5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHkuanMiLCIuLi9ub2RlX21vZHVsZXMvQHVudGVtcHMvdXNlci1wZXJtaXNzaW9ucy11dGlscy9kaXN0L2luZGV4LmVzLmpzIiwiLi4vc3JjL1ZvY2FsLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxudmFyIHJ1bnRpbWUgPSAoZnVuY3Rpb24gKGV4cG9ydHMpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgdmFyIE9wID0gT2JqZWN0LnByb3RvdHlwZTtcbiAgdmFyIGhhc093biA9IE9wLmhhc093blByb3BlcnR5O1xuICB2YXIgdW5kZWZpbmVkOyAvLyBNb3JlIGNvbXByZXNzaWJsZSB0aGFuIHZvaWQgMC5cbiAgdmFyICRTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgPyBTeW1ib2wgOiB7fTtcbiAgdmFyIGl0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5pdGVyYXRvciB8fCBcIkBAaXRlcmF0b3JcIjtcbiAgdmFyIGFzeW5jSXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLmFzeW5jSXRlcmF0b3IgfHwgXCJAQGFzeW5jSXRlcmF0b3JcIjtcbiAgdmFyIHRvU3RyaW5nVGFnU3ltYm9sID0gJFN5bWJvbC50b1N0cmluZ1RhZyB8fCBcIkBAdG9TdHJpbmdUYWdcIjtcblxuICBmdW5jdGlvbiBkZWZpbmUob2JqLCBrZXksIHZhbHVlKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gb2JqW2tleV07XG4gIH1cbiAgdHJ5IHtcbiAgICAvLyBJRSA4IGhhcyBhIGJyb2tlbiBPYmplY3QuZGVmaW5lUHJvcGVydHkgdGhhdCBvbmx5IHdvcmtzIG9uIERPTSBvYmplY3RzLlxuICAgIGRlZmluZSh7fSwgXCJcIik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGRlZmluZSA9IGZ1bmN0aW9uKG9iaiwga2V5LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIG9ialtrZXldID0gdmFsdWU7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBJZiBvdXRlckZuIHByb3ZpZGVkIGFuZCBvdXRlckZuLnByb3RvdHlwZSBpcyBhIEdlbmVyYXRvciwgdGhlbiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvci5cbiAgICB2YXIgcHJvdG9HZW5lcmF0b3IgPSBvdXRlckZuICYmIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yID8gb3V0ZXJGbiA6IEdlbmVyYXRvcjtcbiAgICB2YXIgZ2VuZXJhdG9yID0gT2JqZWN0LmNyZWF0ZShwcm90b0dlbmVyYXRvci5wcm90b3R5cGUpO1xuICAgIHZhciBjb250ZXh0ID0gbmV3IENvbnRleHQodHJ5TG9jc0xpc3QgfHwgW10pO1xuXG4gICAgLy8gVGhlIC5faW52b2tlIG1ldGhvZCB1bmlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcy5cbiAgICBnZW5lcmF0b3IuX2ludm9rZSA9IG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gZ2VuZXJhdG9yO1xuICB9XG4gIGV4cG9ydHMud3JhcCA9IHdyYXA7XG5cbiAgLy8gVHJ5L2NhdGNoIGhlbHBlciB0byBtaW5pbWl6ZSBkZW9wdGltaXphdGlvbnMuIFJldHVybnMgYSBjb21wbGV0aW9uXG4gIC8vIHJlY29yZCBsaWtlIGNvbnRleHQudHJ5RW50cmllc1tpXS5jb21wbGV0aW9uLiBUaGlzIGludGVyZmFjZSBjb3VsZFxuICAvLyBoYXZlIGJlZW4gKGFuZCB3YXMgcHJldmlvdXNseSkgZGVzaWduZWQgdG8gdGFrZSBhIGNsb3N1cmUgdG8gYmVcbiAgLy8gaW52b2tlZCB3aXRob3V0IGFyZ3VtZW50cywgYnV0IGluIGFsbCB0aGUgY2FzZXMgd2UgY2FyZSBhYm91dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYW4gZXhpc3RpbmcgbWV0aG9kIHdlIHdhbnQgdG8gY2FsbCwgc28gdGhlcmUncyBubyBuZWVkXG4gIC8vIHRvIGNyZWF0ZSBhIG5ldyBmdW5jdGlvbiBvYmplY3QuIFdlIGNhbiBldmVuIGdldCBhd2F5IHdpdGggYXNzdW1pbmdcbiAgLy8gdGhlIG1ldGhvZCB0YWtlcyBleGFjdGx5IG9uZSBhcmd1bWVudCwgc2luY2UgdGhhdCBoYXBwZW5zIHRvIGJlIHRydWVcbiAgLy8gaW4gZXZlcnkgY2FzZSwgc28gd2UgZG9uJ3QgaGF2ZSB0byB0b3VjaCB0aGUgYXJndW1lbnRzIG9iamVjdC4gVGhlXG4gIC8vIG9ubHkgYWRkaXRpb25hbCBhbGxvY2F0aW9uIHJlcXVpcmVkIGlzIHRoZSBjb21wbGV0aW9uIHJlY29yZCwgd2hpY2hcbiAgLy8gaGFzIGEgc3RhYmxlIHNoYXBlIGFuZCBzbyBob3BlZnVsbHkgc2hvdWxkIGJlIGNoZWFwIHRvIGFsbG9jYXRlLlxuICBmdW5jdGlvbiB0cnlDYXRjaChmbiwgb2JqLCBhcmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJub3JtYWxcIiwgYXJnOiBmbi5jYWxsKG9iaiwgYXJnKSB9O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJ0aHJvd1wiLCBhcmc6IGVyciB9O1xuICAgIH1cbiAgfVxuXG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0ID0gXCJzdXNwZW5kZWRTdGFydFwiO1xuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRZaWVsZCA9IFwic3VzcGVuZGVkWWllbGRcIjtcbiAgdmFyIEdlblN0YXRlRXhlY3V0aW5nID0gXCJleGVjdXRpbmdcIjtcbiAgdmFyIEdlblN0YXRlQ29tcGxldGVkID0gXCJjb21wbGV0ZWRcIjtcblxuICAvLyBSZXR1cm5pbmcgdGhpcyBvYmplY3QgZnJvbSB0aGUgaW5uZXJGbiBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzXG4gIC8vIGJyZWFraW5nIG91dCBvZiB0aGUgZGlzcGF0Y2ggc3dpdGNoIHN0YXRlbWVudC5cbiAgdmFyIENvbnRpbnVlU2VudGluZWwgPSB7fTtcblxuICAvLyBEdW1teSBjb25zdHJ1Y3RvciBmdW5jdGlvbnMgdGhhdCB3ZSB1c2UgYXMgdGhlIC5jb25zdHJ1Y3RvciBhbmRcbiAgLy8gLmNvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzIGZvciBmdW5jdGlvbnMgdGhhdCByZXR1cm4gR2VuZXJhdG9yXG4gIC8vIG9iamVjdHMuIEZvciBmdWxsIHNwZWMgY29tcGxpYW5jZSwgeW91IG1heSB3aXNoIHRvIGNvbmZpZ3VyZSB5b3VyXG4gIC8vIG1pbmlmaWVyIG5vdCB0byBtYW5nbGUgdGhlIG5hbWVzIG9mIHRoZXNlIHR3byBmdW5jdGlvbnMuXG4gIGZ1bmN0aW9uIEdlbmVyYXRvcigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUoKSB7fVxuXG4gIC8vIFRoaXMgaXMgYSBwb2x5ZmlsbCBmb3IgJUl0ZXJhdG9yUHJvdG90eXBlJSBmb3IgZW52aXJvbm1lbnRzIHRoYXRcbiAgLy8gZG9uJ3QgbmF0aXZlbHkgc3VwcG9ydCBpdC5cbiAgdmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG4gIEl0ZXJhdG9yUHJvdG90eXBlW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICB2YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG4gIHZhciBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvICYmIGdldFByb3RvKGdldFByb3RvKHZhbHVlcyhbXSkpKTtcbiAgaWYgKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICYmXG4gICAgICBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAhPT0gT3AgJiZcbiAgICAgIGhhc093bi5jYWxsKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlLCBpdGVyYXRvclN5bWJvbCkpIHtcbiAgICAvLyBUaGlzIGVudmlyb25tZW50IGhhcyBhIG5hdGl2ZSAlSXRlcmF0b3JQcm90b3R5cGUlOyB1c2UgaXQgaW5zdGVhZFxuICAgIC8vIG9mIHRoZSBwb2x5ZmlsbC5cbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlO1xuICB9XG5cbiAgdmFyIEdwID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUucHJvdG90eXBlID1cbiAgICBHZW5lcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSk7XG4gIEdlbmVyYXRvckZ1bmN0aW9uLnByb3RvdHlwZSA9IEdwLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb247XG4gIEdlbmVyYXRvckZ1bmN0aW9uLmRpc3BsYXlOYW1lID0gZGVmaW5lKFxuICAgIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLFxuICAgIHRvU3RyaW5nVGFnU3ltYm9sLFxuICAgIFwiR2VuZXJhdG9yRnVuY3Rpb25cIlxuICApO1xuXG4gIC8vIEhlbHBlciBmb3IgZGVmaW5pbmcgdGhlIC5uZXh0LCAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMgb2YgdGhlXG4gIC8vIEl0ZXJhdG9yIGludGVyZmFjZSBpbiB0ZXJtcyBvZiBhIHNpbmdsZSAuX2ludm9rZSBtZXRob2QuXG4gIGZ1bmN0aW9uIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhwcm90b3R5cGUpIHtcbiAgICBbXCJuZXh0XCIsIFwidGhyb3dcIiwgXCJyZXR1cm5cIl0uZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgICAgIGRlZmluZShwcm90b3R5cGUsIG1ldGhvZCwgZnVuY3Rpb24oYXJnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnZva2UobWV0aG9kLCBhcmcpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICB2YXIgY3RvciA9IHR5cGVvZiBnZW5GdW4gPT09IFwiZnVuY3Rpb25cIiAmJiBnZW5GdW4uY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIGN0b3JcbiAgICAgID8gY3RvciA9PT0gR2VuZXJhdG9yRnVuY3Rpb24gfHxcbiAgICAgICAgLy8gRm9yIHRoZSBuYXRpdmUgR2VuZXJhdG9yRnVuY3Rpb24gY29uc3RydWN0b3IsIHRoZSBiZXN0IHdlIGNhblxuICAgICAgICAvLyBkbyBpcyB0byBjaGVjayBpdHMgLm5hbWUgcHJvcGVydHkuXG4gICAgICAgIChjdG9yLmRpc3BsYXlOYW1lIHx8IGN0b3IubmFtZSkgPT09IFwiR2VuZXJhdG9yRnVuY3Rpb25cIlxuICAgICAgOiBmYWxzZTtcbiAgfTtcblxuICBleHBvcnRzLm1hcmsgPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICBpZiAoT2JqZWN0LnNldFByb3RvdHlwZU9mKSB7XG4gICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoZ2VuRnVuLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdlbkZ1bi5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgICAgIGRlZmluZShnZW5GdW4sIHRvU3RyaW5nVGFnU3ltYm9sLCBcIkdlbmVyYXRvckZ1bmN0aW9uXCIpO1xuICAgIH1cbiAgICBnZW5GdW4ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShHcCk7XG4gICAgcmV0dXJuIGdlbkZ1bjtcbiAgfTtcblxuICAvLyBXaXRoaW4gdGhlIGJvZHkgb2YgYW55IGFzeW5jIGZ1bmN0aW9uLCBgYXdhaXQgeGAgaXMgdHJhbnNmb3JtZWQgdG9cbiAgLy8gYHlpZWxkIHJlZ2VuZXJhdG9yUnVudGltZS5hd3JhcCh4KWAsIHNvIHRoYXQgdGhlIHJ1bnRpbWUgY2FuIHRlc3RcbiAgLy8gYGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIilgIHRvIGRldGVybWluZSBpZiB0aGUgeWllbGRlZCB2YWx1ZSBpc1xuICAvLyBtZWFudCB0byBiZSBhd2FpdGVkLlxuICBleHBvcnRzLmF3cmFwID0gZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIHsgX19hd2FpdDogYXJnIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihnZW5lcmF0b3IsIFByb21pc2VJbXBsKSB7XG4gICAgZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChnZW5lcmF0b3JbbWV0aG9kXSwgZ2VuZXJhdG9yLCBhcmcpO1xuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgcmVqZWN0KHJlY29yZC5hcmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHJlY29yZC5hcmc7XG4gICAgICAgIHZhciB2YWx1ZSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlICYmXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgIGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIikpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZUltcGwucmVzb2x2ZSh2YWx1ZS5fX2F3YWl0KS50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJuZXh0XCIsIHZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgaW52b2tlKFwidGhyb3dcIiwgZXJyLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2VJbXBsLnJlc29sdmUodmFsdWUpLnRoZW4oZnVuY3Rpb24odW53cmFwcGVkKSB7XG4gICAgICAgICAgLy8gV2hlbiBhIHlpZWxkZWQgUHJvbWlzZSBpcyByZXNvbHZlZCwgaXRzIGZpbmFsIHZhbHVlIGJlY29tZXNcbiAgICAgICAgICAvLyB0aGUgLnZhbHVlIG9mIHRoZSBQcm9taXNlPHt2YWx1ZSxkb25lfT4gcmVzdWx0IGZvciB0aGVcbiAgICAgICAgICAvLyBjdXJyZW50IGl0ZXJhdGlvbi5cbiAgICAgICAgICByZXN1bHQudmFsdWUgPSB1bndyYXBwZWQ7XG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9LCBmdW5jdGlvbihlcnJvcikge1xuICAgICAgICAgIC8vIElmIGEgcmVqZWN0ZWQgUHJvbWlzZSB3YXMgeWllbGRlZCwgdGhyb3cgdGhlIHJlamVjdGlvbiBiYWNrXG4gICAgICAgICAgLy8gaW50byB0aGUgYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9uIHNvIGl0IGNhbiBiZSBoYW5kbGVkIHRoZXJlLlxuICAgICAgICAgIHJldHVybiBpbnZva2UoXCJ0aHJvd1wiLCBlcnJvciwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHByZXZpb3VzUHJvbWlzZTtcblxuICAgIGZ1bmN0aW9uIGVucXVldWUobWV0aG9kLCBhcmcpIHtcbiAgICAgIGZ1bmN0aW9uIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2VJbXBsKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcmV2aW91c1Byb21pc2UgPVxuICAgICAgICAvLyBJZiBlbnF1ZXVlIGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gd2Ugd2FudCB0byB3YWl0IHVudGlsXG4gICAgICAgIC8vIGFsbCBwcmV2aW91cyBQcm9taXNlcyBoYXZlIGJlZW4gcmVzb2x2ZWQgYmVmb3JlIGNhbGxpbmcgaW52b2tlLFxuICAgICAgICAvLyBzbyB0aGF0IHJlc3VsdHMgYXJlIGFsd2F5cyBkZWxpdmVyZWQgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuIElmXG4gICAgICAgIC8vIGVucXVldWUgaGFzIG5vdCBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gaXQgaXMgaW1wb3J0YW50IHRvXG4gICAgICAgIC8vIGNhbGwgaW52b2tlIGltbWVkaWF0ZWx5LCB3aXRob3V0IHdhaXRpbmcgb24gYSBjYWxsYmFjayB0byBmaXJlLFxuICAgICAgICAvLyBzbyB0aGF0IHRoZSBhc3luYyBnZW5lcmF0b3IgZnVuY3Rpb24gaGFzIHRoZSBvcHBvcnR1bml0eSB0byBkb1xuICAgICAgICAvLyBhbnkgbmVjZXNzYXJ5IHNldHVwIGluIGEgcHJlZGljdGFibGUgd2F5LiBUaGlzIHByZWRpY3RhYmlsaXR5XG4gICAgICAgIC8vIGlzIHdoeSB0aGUgUHJvbWlzZSBjb25zdHJ1Y3RvciBzeW5jaHJvbm91c2x5IGludm9rZXMgaXRzXG4gICAgICAgIC8vIGV4ZWN1dG9yIGNhbGxiYWNrLCBhbmQgd2h5IGFzeW5jIGZ1bmN0aW9ucyBzeW5jaHJvbm91c2x5XG4gICAgICAgIC8vIGV4ZWN1dGUgY29kZSBiZWZvcmUgdGhlIGZpcnN0IGF3YWl0LiBTaW5jZSB3ZSBpbXBsZW1lbnQgc2ltcGxlXG4gICAgICAgIC8vIGFzeW5jIGZ1bmN0aW9ucyBpbiB0ZXJtcyBvZiBhc3luYyBnZW5lcmF0b3JzLCBpdCBpcyBlc3BlY2lhbGx5XG4gICAgICAgIC8vIGltcG9ydGFudCB0byBnZXQgdGhpcyByaWdodCwgZXZlbiB0aG91Z2ggaXQgcmVxdWlyZXMgY2FyZS5cbiAgICAgICAgcHJldmlvdXNQcm9taXNlID8gcHJldmlvdXNQcm9taXNlLnRoZW4oXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcsXG4gICAgICAgICAgLy8gQXZvaWQgcHJvcGFnYXRpbmcgZmFpbHVyZXMgdG8gUHJvbWlzZXMgcmV0dXJuZWQgYnkgbGF0ZXJcbiAgICAgICAgICAvLyBpbnZvY2F0aW9ucyBvZiB0aGUgaXRlcmF0b3IuXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmdcbiAgICAgICAgKSA6IGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCk7XG4gICAgfVxuXG4gICAgLy8gRGVmaW5lIHRoZSB1bmlmaWVkIGhlbHBlciBtZXRob2QgdGhhdCBpcyB1c2VkIHRvIGltcGxlbWVudCAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIChzZWUgZGVmaW5lSXRlcmF0b3JNZXRob2RzKS5cbiAgICB0aGlzLl9pbnZva2UgPSBlbnF1ZXVlO1xuICB9XG5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlKTtcbiAgQXN5bmNJdGVyYXRvci5wcm90b3R5cGVbYXN5bmNJdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIGV4cG9ydHMuQXN5bmNJdGVyYXRvciA9IEFzeW5jSXRlcmF0b3I7XG5cbiAgLy8gTm90ZSB0aGF0IHNpbXBsZSBhc3luYyBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIG9uIHRvcCBvZlxuICAvLyBBc3luY0l0ZXJhdG9yIG9iamVjdHM7IHRoZXkganVzdCByZXR1cm4gYSBQcm9taXNlIGZvciB0aGUgdmFsdWUgb2ZcbiAgLy8gdGhlIGZpbmFsIHJlc3VsdCBwcm9kdWNlZCBieSB0aGUgaXRlcmF0b3IuXG4gIGV4cG9ydHMuYXN5bmMgPSBmdW5jdGlvbihpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCwgUHJvbWlzZUltcGwpIHtcbiAgICBpZiAoUHJvbWlzZUltcGwgPT09IHZvaWQgMCkgUHJvbWlzZUltcGwgPSBQcm9taXNlO1xuXG4gICAgdmFyIGl0ZXIgPSBuZXcgQXN5bmNJdGVyYXRvcihcbiAgICAgIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpLFxuICAgICAgUHJvbWlzZUltcGxcbiAgICApO1xuXG4gICAgcmV0dXJuIGV4cG9ydHMuaXNHZW5lcmF0b3JGdW5jdGlvbihvdXRlckZuKVxuICAgICAgPyBpdGVyIC8vIElmIG91dGVyRm4gaXMgYSBnZW5lcmF0b3IsIHJldHVybiB0aGUgZnVsbCBpdGVyYXRvci5cbiAgICAgIDogaXRlci5uZXh0KCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0LmRvbmUgPyByZXN1bHQudmFsdWUgOiBpdGVyLm5leHQoKTtcbiAgICAgICAgfSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KSB7XG4gICAgdmFyIHN0YXRlID0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydDtcblxuICAgIHJldHVybiBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcpIHtcbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVFeGVjdXRpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZ1wiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUNvbXBsZXRlZCkge1xuICAgICAgICBpZiAobWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICB0aHJvdyBhcmc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCZSBmb3JnaXZpbmcsIHBlciAyNS4zLjMuMy4zIG9mIHRoZSBzcGVjOlxuICAgICAgICAvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtZ2VuZXJhdG9ycmVzdW1lXG4gICAgICAgIHJldHVybiBkb25lUmVzdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQubWV0aG9kID0gbWV0aG9kO1xuICAgICAgY29udGV4dC5hcmcgPSBhcmc7XG5cbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHZhciBkZWxlZ2F0ZSA9IGNvbnRleHQuZGVsZWdhdGU7XG4gICAgICAgIGlmIChkZWxlZ2F0ZSkge1xuICAgICAgICAgIHZhciBkZWxlZ2F0ZVJlc3VsdCA9IG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0ID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTtcbiAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZVJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgICAgLy8gU2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgICAgICBjb250ZXh0LnNlbnQgPSBjb250ZXh0Ll9zZW50ID0gY29udGV4dC5hcmc7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0KSB7XG4gICAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgICAgdGhyb3cgY29udGV4dC5hcmc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZyk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICAgIGNvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIGNvbnRleHQuYXJnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlID0gR2VuU3RhdGVFeGVjdXRpbmc7XG5cbiAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIpIHtcbiAgICAgICAgICAvLyBJZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGZyb20gaW5uZXJGbiwgd2UgbGVhdmUgc3RhdGUgPT09XG4gICAgICAgICAgLy8gR2VuU3RhdGVFeGVjdXRpbmcgYW5kIGxvb3AgYmFjayBmb3IgYW5vdGhlciBpbnZvY2F0aW9uLlxuICAgICAgICAgIHN0YXRlID0gY29udGV4dC5kb25lXG4gICAgICAgICAgICA/IEdlblN0YXRlQ29tcGxldGVkXG4gICAgICAgICAgICA6IEdlblN0YXRlU3VzcGVuZGVkWWllbGQ7XG5cbiAgICAgICAgICBpZiAocmVjb3JkLmFyZyA9PT0gQ29udGludWVTZW50aW5lbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiByZWNvcmQuYXJnLFxuICAgICAgICAgICAgZG9uZTogY29udGV4dC5kb25lXG4gICAgICAgICAgfTtcblxuICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgIC8vIERpc3BhdGNoIHRoZSBleGNlcHRpb24gYnkgbG9vcGluZyBiYWNrIGFyb3VuZCB0byB0aGVcbiAgICAgICAgICAvLyBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKSBjYWxsIGFib3ZlLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBDYWxsIGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXShjb250ZXh0LmFyZykgYW5kIGhhbmRsZSB0aGVcbiAgLy8gcmVzdWx0LCBlaXRoZXIgYnkgcmV0dXJuaW5nIGEgeyB2YWx1ZSwgZG9uZSB9IHJlc3VsdCBmcm9tIHRoZVxuICAvLyBkZWxlZ2F0ZSBpdGVyYXRvciwgb3IgYnkgbW9kaWZ5aW5nIGNvbnRleHQubWV0aG9kIGFuZCBjb250ZXh0LmFyZyxcbiAgLy8gc2V0dGluZyBjb250ZXh0LmRlbGVnYXRlIHRvIG51bGwsIGFuZCByZXR1cm5pbmcgdGhlIENvbnRpbnVlU2VudGluZWwuXG4gIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpIHtcbiAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdO1xuICAgIGlmIChtZXRob2QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQSAudGhyb3cgb3IgLnJldHVybiB3aGVuIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgbm8gLnRocm93XG4gICAgICAvLyBtZXRob2QgYWx3YXlzIHRlcm1pbmF0ZXMgdGhlIHlpZWxkKiBsb29wLlxuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIC8vIE5vdGU6IFtcInJldHVyblwiXSBtdXN0IGJlIHVzZWQgZm9yIEVTMyBwYXJzaW5nIGNvbXBhdGliaWxpdHkuXG4gICAgICAgIGlmIChkZWxlZ2F0ZS5pdGVyYXRvcltcInJldHVyblwiXSkge1xuICAgICAgICAgIC8vIElmIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgYSByZXR1cm4gbWV0aG9kLCBnaXZlIGl0IGFcbiAgICAgICAgICAvLyBjaGFuY2UgdG8gY2xlYW4gdXAuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInJldHVyblwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICAgIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuXG4gICAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgIC8vIElmIG1heWJlSW52b2tlRGVsZWdhdGUoY29udGV4dCkgY2hhbmdlZCBjb250ZXh0Lm1ldGhvZCBmcm9tXG4gICAgICAgICAgICAvLyBcInJldHVyblwiIHRvIFwidGhyb3dcIiwgbGV0IHRoYXQgb3ZlcnJpZGUgdGhlIFR5cGVFcnJvciBiZWxvdy5cbiAgICAgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgXCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICd0aHJvdycgbWV0aG9kXCIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2gobWV0aG9kLCBkZWxlZ2F0ZS5pdGVyYXRvciwgY29udGV4dC5hcmcpO1xuXG4gICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICB2YXIgaW5mbyA9IHJlY29yZC5hcmc7XG5cbiAgICBpZiAoISBpbmZvKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcihcIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0XCIpO1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICBpZiAoaW5mby5kb25lKSB7XG4gICAgICAvLyBBc3NpZ24gdGhlIHJlc3VsdCBvZiB0aGUgZmluaXNoZWQgZGVsZWdhdGUgdG8gdGhlIHRlbXBvcmFyeVxuICAgICAgLy8gdmFyaWFibGUgc3BlY2lmaWVkIGJ5IGRlbGVnYXRlLnJlc3VsdE5hbWUgKHNlZSBkZWxlZ2F0ZVlpZWxkKS5cbiAgICAgIGNvbnRleHRbZGVsZWdhdGUucmVzdWx0TmFtZV0gPSBpbmZvLnZhbHVlO1xuXG4gICAgICAvLyBSZXN1bWUgZXhlY3V0aW9uIGF0IHRoZSBkZXNpcmVkIGxvY2F0aW9uIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0Lm5leHQgPSBkZWxlZ2F0ZS5uZXh0TG9jO1xuXG4gICAgICAvLyBJZiBjb250ZXh0Lm1ldGhvZCB3YXMgXCJ0aHJvd1wiIGJ1dCB0aGUgZGVsZWdhdGUgaGFuZGxlZCB0aGVcbiAgICAgIC8vIGV4Y2VwdGlvbiwgbGV0IHRoZSBvdXRlciBnZW5lcmF0b3IgcHJvY2VlZCBub3JtYWxseS4gSWZcbiAgICAgIC8vIGNvbnRleHQubWV0aG9kIHdhcyBcIm5leHRcIiwgZm9yZ2V0IGNvbnRleHQuYXJnIHNpbmNlIGl0IGhhcyBiZWVuXG4gICAgICAvLyBcImNvbnN1bWVkXCIgYnkgdGhlIGRlbGVnYXRlIGl0ZXJhdG9yLiBJZiBjb250ZXh0Lm1ldGhvZCB3YXNcbiAgICAgIC8vIFwicmV0dXJuXCIsIGFsbG93IHRoZSBvcmlnaW5hbCAucmV0dXJuIGNhbGwgdG8gY29udGludWUgaW4gdGhlXG4gICAgICAvLyBvdXRlciBnZW5lcmF0b3IuXG4gICAgICBpZiAoY29udGV4dC5tZXRob2QgIT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgY29udGV4dC5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmUteWllbGQgdGhlIHJlc3VsdCByZXR1cm5lZCBieSB0aGUgZGVsZWdhdGUgbWV0aG9kLlxuICAgICAgcmV0dXJuIGluZm87XG4gICAgfVxuXG4gICAgLy8gVGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGlzIGZpbmlzaGVkLCBzbyBmb3JnZXQgaXQgYW5kIGNvbnRpbnVlIHdpdGhcbiAgICAvLyB0aGUgb3V0ZXIgZ2VuZXJhdG9yLlxuICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICB9XG5cbiAgLy8gRGVmaW5lIEdlbmVyYXRvci5wcm90b3R5cGUue25leHQsdGhyb3cscmV0dXJufSBpbiB0ZXJtcyBvZiB0aGVcbiAgLy8gdW5pZmllZCAuX2ludm9rZSBoZWxwZXIgbWV0aG9kLlxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoR3ApO1xuXG4gIGRlZmluZShHcCwgdG9TdHJpbmdUYWdTeW1ib2wsIFwiR2VuZXJhdG9yXCIpO1xuXG4gIC8vIEEgR2VuZXJhdG9yIHNob3VsZCBhbHdheXMgcmV0dXJuIGl0c2VsZiBhcyB0aGUgaXRlcmF0b3Igb2JqZWN0IHdoZW4gdGhlXG4gIC8vIEBAaXRlcmF0b3IgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGl0LiBTb21lIGJyb3dzZXJzJyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlXG4gIC8vIGl0ZXJhdG9yIHByb3RvdHlwZSBjaGFpbiBpbmNvcnJlY3RseSBpbXBsZW1lbnQgdGhpcywgY2F1c2luZyB0aGUgR2VuZXJhdG9yXG4gIC8vIG9iamVjdCB0byBub3QgYmUgcmV0dXJuZWQgZnJvbSB0aGlzIGNhbGwuIFRoaXMgZW5zdXJlcyB0aGF0IGRvZXNuJ3QgaGFwcGVuLlxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlZ2VuZXJhdG9yL2lzc3Vlcy8yNzQgZm9yIG1vcmUgZGV0YWlscy5cbiAgR3BbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgR3AudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXCJbb2JqZWN0IEdlbmVyYXRvcl1cIjtcbiAgfTtcblxuICBmdW5jdGlvbiBwdXNoVHJ5RW50cnkobG9jcykge1xuICAgIHZhciBlbnRyeSA9IHsgdHJ5TG9jOiBsb2NzWzBdIH07XG5cbiAgICBpZiAoMSBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5jYXRjaExvYyA9IGxvY3NbMV07XG4gICAgfVxuXG4gICAgaWYgKDIgaW4gbG9jcykge1xuICAgICAgZW50cnkuZmluYWxseUxvYyA9IGxvY3NbMl07XG4gICAgICBlbnRyeS5hZnRlckxvYyA9IGxvY3NbM107XG4gICAgfVxuXG4gICAgdGhpcy50cnlFbnRyaWVzLnB1c2goZW50cnkpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzZXRUcnlFbnRyeShlbnRyeSkge1xuICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uIHx8IHt9O1xuICAgIHJlY29yZC50eXBlID0gXCJub3JtYWxcIjtcbiAgICBkZWxldGUgcmVjb3JkLmFyZztcbiAgICBlbnRyeS5jb21wbGV0aW9uID0gcmVjb3JkO1xuICB9XG5cbiAgZnVuY3Rpb24gQ29udGV4dCh0cnlMb2NzTGlzdCkge1xuICAgIC8vIFRoZSByb290IGVudHJ5IG9iamVjdCAoZWZmZWN0aXZlbHkgYSB0cnkgc3RhdGVtZW50IHdpdGhvdXQgYSBjYXRjaFxuICAgIC8vIG9yIGEgZmluYWxseSBibG9jaykgZ2l2ZXMgdXMgYSBwbGFjZSB0byBzdG9yZSB2YWx1ZXMgdGhyb3duIGZyb21cbiAgICAvLyBsb2NhdGlvbnMgd2hlcmUgdGhlcmUgaXMgbm8gZW5jbG9zaW5nIHRyeSBzdGF0ZW1lbnQuXG4gICAgdGhpcy50cnlFbnRyaWVzID0gW3sgdHJ5TG9jOiBcInJvb3RcIiB9XTtcbiAgICB0cnlMb2NzTGlzdC5mb3JFYWNoKHB1c2hUcnlFbnRyeSwgdGhpcyk7XG4gICAgdGhpcy5yZXNldCh0cnVlKTtcbiAgfVxuXG4gIGV4cG9ydHMua2V5cyA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHZhciBrZXlzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICAgIGtleXMucmV2ZXJzZSgpO1xuXG4gICAgLy8gUmF0aGVyIHRoYW4gcmV0dXJuaW5nIGFuIG9iamVjdCB3aXRoIGEgbmV4dCBtZXRob2QsIHdlIGtlZXBcbiAgICAvLyB0aGluZ3Mgc2ltcGxlIGFuZCByZXR1cm4gdGhlIG5leHQgZnVuY3Rpb24gaXRzZWxmLlxuICAgIHJldHVybiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgd2hpbGUgKGtleXMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSBrZXlzLnBvcCgpO1xuICAgICAgICBpZiAoa2V5IGluIG9iamVjdCkge1xuICAgICAgICAgIG5leHQudmFsdWUgPSBrZXk7XG4gICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVG8gYXZvaWQgY3JlYXRpbmcgYW4gYWRkaXRpb25hbCBvYmplY3QsIHdlIGp1c3QgaGFuZyB0aGUgLnZhbHVlXG4gICAgICAvLyBhbmQgLmRvbmUgcHJvcGVydGllcyBvZmYgdGhlIG5leHQgZnVuY3Rpb24gb2JqZWN0IGl0c2VsZi4gVGhpc1xuICAgICAgLy8gYWxzbyBlbnN1cmVzIHRoYXQgdGhlIG1pbmlmaWVyIHdpbGwgbm90IGFub255bWl6ZSB0aGUgZnVuY3Rpb24uXG4gICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfTtcbiAgfTtcblxuICBmdW5jdGlvbiB2YWx1ZXMoaXRlcmFibGUpIHtcbiAgICBpZiAoaXRlcmFibGUpIHtcbiAgICAgIHZhciBpdGVyYXRvck1ldGhvZCA9IGl0ZXJhYmxlW2l0ZXJhdG9yU3ltYm9sXTtcbiAgICAgIGlmIChpdGVyYXRvck1ldGhvZCkge1xuICAgICAgICByZXR1cm4gaXRlcmF0b3JNZXRob2QuY2FsbChpdGVyYWJsZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaXRlcmFibGUubmV4dCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBpdGVyYWJsZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc05hTihpdGVyYWJsZS5sZW5ndGgpKSB7XG4gICAgICAgIHZhciBpID0gLTEsIG5leHQgPSBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgIHdoaWxlICgrK2kgPCBpdGVyYWJsZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd24uY2FsbChpdGVyYWJsZSwgaSkpIHtcbiAgICAgICAgICAgICAgbmV4dC52YWx1ZSA9IGl0ZXJhYmxlW2ldO1xuICAgICAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbmV4dC52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuXG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIG5leHQubmV4dCA9IG5leHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGFuIGl0ZXJhdG9yIHdpdGggbm8gdmFsdWVzLlxuICAgIHJldHVybiB7IG5leHQ6IGRvbmVSZXN1bHQgfTtcbiAgfVxuICBleHBvcnRzLnZhbHVlcyA9IHZhbHVlcztcblxuICBmdW5jdGlvbiBkb25lUmVzdWx0KCkge1xuICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgfVxuXG4gIENvbnRleHQucHJvdG90eXBlID0ge1xuICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LFxuXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKHNraXBUZW1wUmVzZXQpIHtcbiAgICAgIHRoaXMucHJldiA9IDA7XG4gICAgICB0aGlzLm5leHQgPSAwO1xuICAgICAgLy8gUmVzZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3NcbiAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uXG4gICAgICB0aGlzLnNlbnQgPSB0aGlzLl9zZW50ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgICB0aGlzLmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkO1xuXG4gICAgICB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KTtcblxuICAgICAgaWYgKCFza2lwVGVtcFJlc2V0KSB7XG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gdGhpcykge1xuICAgICAgICAgIC8vIE5vdCBzdXJlIGFib3V0IHRoZSBvcHRpbWFsIG9yZGVyIG9mIHRoZXNlIGNvbmRpdGlvbnM6XG4gICAgICAgICAgaWYgKG5hbWUuY2hhckF0KDApID09PSBcInRcIiAmJlxuICAgICAgICAgICAgICBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJlxuICAgICAgICAgICAgICAhaXNOYU4oK25hbWUuc2xpY2UoMSkpKSB7XG4gICAgICAgICAgICB0aGlzW25hbWVdID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG5cbiAgICAgIHZhciByb290RW50cnkgPSB0aGlzLnRyeUVudHJpZXNbMF07XG4gICAgICB2YXIgcm9vdFJlY29yZCA9IHJvb3RFbnRyeS5jb21wbGV0aW9uO1xuICAgICAgaWYgKHJvb3RSZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJvb3RSZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5ydmFsO1xuICAgIH0sXG5cbiAgICBkaXNwYXRjaEV4Y2VwdGlvbjogZnVuY3Rpb24oZXhjZXB0aW9uKSB7XG4gICAgICBpZiAodGhpcy5kb25lKSB7XG4gICAgICAgIHRocm93IGV4Y2VwdGlvbjtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbnRleHQgPSB0aGlzO1xuICAgICAgZnVuY3Rpb24gaGFuZGxlKGxvYywgY2F1Z2h0KSB7XG4gICAgICAgIHJlY29yZC50eXBlID0gXCJ0aHJvd1wiO1xuICAgICAgICByZWNvcmQuYXJnID0gZXhjZXB0aW9uO1xuICAgICAgICBjb250ZXh0Lm5leHQgPSBsb2M7XG5cbiAgICAgICAgaWYgKGNhdWdodCkge1xuICAgICAgICAgIC8vIElmIHRoZSBkaXNwYXRjaGVkIGV4Y2VwdGlvbiB3YXMgY2F1Z2h0IGJ5IGEgY2F0Y2ggYmxvY2ssXG4gICAgICAgICAgLy8gdGhlbiBsZXQgdGhhdCBjYXRjaCBibG9jayBoYW5kbGUgdGhlIGV4Y2VwdGlvbiBub3JtYWxseS5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICEhIGNhdWdodDtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IFwicm9vdFwiKSB7XG4gICAgICAgICAgLy8gRXhjZXB0aW9uIHRocm93biBvdXRzaWRlIG9mIGFueSB0cnkgYmxvY2sgdGhhdCBjb3VsZCBoYW5kbGVcbiAgICAgICAgICAvLyBpdCwgc28gc2V0IHRoZSBjb21wbGV0aW9uIHZhbHVlIG9mIHRoZSBlbnRpcmUgZnVuY3Rpb24gdG9cbiAgICAgICAgICAvLyB0aHJvdyB0aGUgZXhjZXB0aW9uLlxuICAgICAgICAgIHJldHVybiBoYW5kbGUoXCJlbmRcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldikge1xuICAgICAgICAgIHZhciBoYXNDYXRjaCA9IGhhc093bi5jYWxsKGVudHJ5LCBcImNhdGNoTG9jXCIpO1xuICAgICAgICAgIHZhciBoYXNGaW5hbGx5ID0gaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKTtcblxuICAgICAgICAgIGlmIChoYXNDYXRjaCAmJiBoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzQ2F0Y2gpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYWJydXB0OiBmdW5jdGlvbih0eXBlLCBhcmcpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKSAmJlxuICAgICAgICAgICAgdGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgIHZhciBmaW5hbGx5RW50cnkgPSBlbnRyeTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZmluYWxseUVudHJ5ICYmXG4gICAgICAgICAgKHR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgICB0eXBlID09PSBcImNvbnRpbnVlXCIpICYmXG4gICAgICAgICAgZmluYWxseUVudHJ5LnRyeUxvYyA8PSBhcmcgJiZcbiAgICAgICAgICBhcmcgPD0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgLy8gSWdub3JlIHRoZSBmaW5hbGx5IGVudHJ5IGlmIGNvbnRyb2wgaXMgbm90IGp1bXBpbmcgdG8gYVxuICAgICAgICAvLyBsb2NhdGlvbiBvdXRzaWRlIHRoZSB0cnkvY2F0Y2ggYmxvY2suXG4gICAgICAgIGZpbmFsbHlFbnRyeSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9O1xuICAgICAgcmVjb3JkLnR5cGUgPSB0eXBlO1xuICAgICAgcmVjb3JkLmFyZyA9IGFyZztcblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSkge1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICB0aGlzLm5leHQgPSBmaW5hbGx5RW50cnkuZmluYWxseUxvYztcbiAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmNvbXBsZXRlKHJlY29yZCk7XG4gICAgfSxcblxuICAgIGNvbXBsZXRlOiBmdW5jdGlvbihyZWNvcmQsIGFmdGVyTG9jKSB7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgIHJlY29yZC50eXBlID09PSBcImNvbnRpbnVlXCIpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gcmVjb3JkLmFyZztcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgdGhpcy5ydmFsID0gdGhpcy5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwicmV0dXJuXCI7XG4gICAgICAgIHRoaXMubmV4dCA9IFwiZW5kXCI7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiICYmIGFmdGVyTG9jKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IGFmdGVyTG9jO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9LFxuXG4gICAgZmluaXNoOiBmdW5jdGlvbihmaW5hbGx5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LmZpbmFsbHlMb2MgPT09IGZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB0aGlzLmNvbXBsZXRlKGVudHJ5LmNvbXBsZXRpb24sIGVudHJ5LmFmdGVyTG9jKTtcbiAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBcImNhdGNoXCI6IGZ1bmN0aW9uKHRyeUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IHRyeUxvYykge1xuICAgICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuICAgICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICB2YXIgdGhyb3duID0gcmVjb3JkLmFyZztcbiAgICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhyb3duO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBjb250ZXh0LmNhdGNoIG1ldGhvZCBtdXN0IG9ubHkgYmUgY2FsbGVkIHdpdGggYSBsb2NhdGlvblxuICAgICAgLy8gYXJndW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byBhIGtub3duIGNhdGNoIGJsb2NrLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCBjYXRjaCBhdHRlbXB0XCIpO1xuICAgIH0sXG5cbiAgICBkZWxlZ2F0ZVlpZWxkOiBmdW5jdGlvbihpdGVyYWJsZSwgcmVzdWx0TmFtZSwgbmV4dExvYykge1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IHtcbiAgICAgICAgaXRlcmF0b3I6IHZhbHVlcyhpdGVyYWJsZSksXG4gICAgICAgIHJlc3VsdE5hbWU6IHJlc3VsdE5hbWUsXG4gICAgICAgIG5leHRMb2M6IG5leHRMb2NcbiAgICAgIH07XG5cbiAgICAgIGlmICh0aGlzLm1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IGZvcmdldCB0aGUgbGFzdCBzZW50IHZhbHVlIHNvIHRoYXQgd2UgZG9uJ3RcbiAgICAgICAgLy8gYWNjaWRlbnRhbGx5IHBhc3MgaXQgb24gdG8gdGhlIGRlbGVnYXRlLlxuICAgICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuICB9O1xuXG4gIC8vIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGlzIHNjcmlwdCBpcyBleGVjdXRpbmcgYXMgYSBDb21tb25KUyBtb2R1bGVcbiAgLy8gb3Igbm90LCByZXR1cm4gdGhlIHJ1bnRpbWUgb2JqZWN0IHNvIHRoYXQgd2UgY2FuIGRlY2xhcmUgdGhlIHZhcmlhYmxlXG4gIC8vIHJlZ2VuZXJhdG9yUnVudGltZSBpbiB0aGUgb3V0ZXIgc2NvcGUsIHdoaWNoIGFsbG93cyB0aGlzIG1vZHVsZSB0byBiZVxuICAvLyBpbmplY3RlZCBlYXNpbHkgYnkgYGJpbi9yZWdlbmVyYXRvciAtLWluY2x1ZGUtcnVudGltZSBzY3JpcHQuanNgLlxuICByZXR1cm4gZXhwb3J0cztcblxufShcbiAgLy8gSWYgdGhpcyBzY3JpcHQgaXMgZXhlY3V0aW5nIGFzIGEgQ29tbW9uSlMgbW9kdWxlLCB1c2UgbW9kdWxlLmV4cG9ydHNcbiAgLy8gYXMgdGhlIHJlZ2VuZXJhdG9yUnVudGltZSBuYW1lc3BhY2UuIE90aGVyd2lzZSBjcmVhdGUgYSBuZXcgZW1wdHlcbiAgLy8gb2JqZWN0LiBFaXRoZXIgd2F5LCB0aGUgcmVzdWx0aW5nIG9iamVjdCB3aWxsIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZVxuICAvLyB0aGUgcmVnZW5lcmF0b3JSdW50aW1lIHZhcmlhYmxlIGF0IHRoZSB0b3Agb2YgdGhpcyBmaWxlLlxuICB0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiID8gbW9kdWxlLmV4cG9ydHMgOiB7fVxuKSk7XG5cbnRyeSB7XG4gIHJlZ2VuZXJhdG9yUnVudGltZSA9IHJ1bnRpbWU7XG59IGNhdGNoIChhY2NpZGVudGFsU3RyaWN0TW9kZSkge1xuICAvLyBUaGlzIG1vZHVsZSBzaG91bGQgbm90IGJlIHJ1bm5pbmcgaW4gc3RyaWN0IG1vZGUsIHNvIHRoZSBhYm92ZVxuICAvLyBhc3NpZ25tZW50IHNob3VsZCBhbHdheXMgd29yayB1bmxlc3Mgc29tZXRoaW5nIGlzIG1pc2NvbmZpZ3VyZWQuIEp1c3RcbiAgLy8gaW4gY2FzZSBydW50aW1lLmpzIGFjY2lkZW50YWxseSBydW5zIGluIHN0cmljdCBtb2RlLCB3ZSBjYW4gZXNjYXBlXG4gIC8vIHN0cmljdCBtb2RlIHVzaW5nIGEgZ2xvYmFsIEZ1bmN0aW9uIGNhbGwuIFRoaXMgY291bGQgY29uY2VpdmFibHkgZmFpbFxuICAvLyBpZiBhIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5IGZvcmJpZHMgdXNpbmcgRnVuY3Rpb24sIGJ1dCBpbiB0aGF0IGNhc2VcbiAgLy8gdGhlIHByb3BlciBzb2x1dGlvbiBpcyB0byBmaXggdGhlIGFjY2lkZW50YWwgc3RyaWN0IG1vZGUgcHJvYmxlbS4gSWZcbiAgLy8geW91J3ZlIG1pc2NvbmZpZ3VyZWQgeW91ciBidW5kbGVyIHRvIGZvcmNlIHN0cmljdCBtb2RlIGFuZCBhcHBsaWVkIGFcbiAgLy8gQ1NQIHRvIGZvcmJpZCBGdW5jdGlvbiwgYW5kIHlvdSdyZSBub3Qgd2lsbGluZyB0byBmaXggZWl0aGVyIG9mIHRob3NlXG4gIC8vIHByb2JsZW1zLCBwbGVhc2UgZGV0YWlsIHlvdXIgdW5pcXVlIHByZWRpY2FtZW50IGluIGEgR2l0SHViIGlzc3VlLlxuICBGdW5jdGlvbihcInJcIiwgXCJyZWdlbmVyYXRvclJ1bnRpbWUgPSByXCIpKHJ1bnRpbWUpO1xufVxuIiwiZnVuY3Rpb24gYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBrZXksIGFyZykge1xuICB0cnkge1xuICAgIHZhciBpbmZvID0gZ2VuW2tleV0oYXJnKTtcbiAgICB2YXIgdmFsdWUgPSBpbmZvLnZhbHVlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJlamVjdChlcnJvcik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGluZm8uZG9uZSkge1xuICAgIHJlc29sdmUodmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihfbmV4dCwgX3Rocm93KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcihmbikge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcyxcbiAgICAgICAgYXJncyA9IGFyZ3VtZW50cztcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIGdlbiA9IGZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuXG4gICAgICBmdW5jdGlvbiBfbmV4dCh2YWx1ZSkge1xuICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIFwibmV4dFwiLCB2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIF90aHJvdyhlcnIpIHtcbiAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBcInRocm93XCIsIGVycik7XG4gICAgICB9XG5cbiAgICAgIF9uZXh0KHVuZGVmaW5lZCk7XG4gICAgfSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2FzeW5jVG9HZW5lcmF0b3I7IiwiZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9hcnJheVdpdGhIb2xlczsiLCJmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB7XG4gIGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8ICEoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChhcnIpKSkgcmV0dXJuO1xuICB2YXIgX2FyciA9IFtdO1xuICB2YXIgX24gPSB0cnVlO1xuICB2YXIgX2QgPSBmYWxzZTtcbiAgdmFyIF9lID0gdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgZm9yICh2YXIgX2kgPSBhcnJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkge1xuICAgICAgX2Fyci5wdXNoKF9zLnZhbHVlKTtcblxuICAgICAgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgX2QgPSB0cnVlO1xuICAgIF9lID0gZXJyO1xuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdICE9IG51bGwpIF9pW1wicmV0dXJuXCJdKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChfZCkgdGhyb3cgX2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIF9hcnI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2l0ZXJhYmxlVG9BcnJheUxpbWl0OyIsImZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7XG4gIGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykge1xuICAgIGFycjJbaV0gPSBhcnJbaV07XG4gIH1cblxuICByZXR1cm4gYXJyMjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfYXJyYXlMaWtlVG9BcnJheTsiLCJ2YXIgYXJyYXlMaWtlVG9BcnJheSA9IHJlcXVpcmUoXCIuL2FycmF5TGlrZVRvQXJyYXlcIik7XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHtcbiAgaWYgKCFvKSByZXR1cm47XG4gIGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbiAgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpO1xuICBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lO1xuICBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTtcbiAgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBhcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5OyIsImZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX25vbkl0ZXJhYmxlUmVzdDsiLCJ2YXIgYXJyYXlXaXRoSG9sZXMgPSByZXF1aXJlKFwiLi9hcnJheVdpdGhIb2xlc1wiKTtcblxudmFyIGl0ZXJhYmxlVG9BcnJheUxpbWl0ID0gcmVxdWlyZShcIi4vaXRlcmFibGVUb0FycmF5TGltaXRcIik7XG5cbnZhciB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSA9IHJlcXVpcmUoXCIuL3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5XCIpO1xuXG52YXIgbm9uSXRlcmFibGVSZXN0ID0gcmVxdWlyZShcIi4vbm9uSXRlcmFibGVSZXN0XCIpO1xuXG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHtcbiAgcmV0dXJuIGFycmF5V2l0aEhvbGVzKGFycikgfHwgaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IG5vbkl0ZXJhYmxlUmVzdCgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9zbGljZWRUb0FycmF5OyIsImZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2NsYXNzQ2FsbENoZWNrOyIsImZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfY3JlYXRlQ2xhc3M7IiwiZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5IGluIG9iaikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2RlZmluZVByb3BlcnR5OyIsInZhciBlPWZ1bmN0aW9uKCl7cmV0dXJuISFuYXZpZ2F0b3IucGVybWlzc2lvbnN9LHI9ZnVuY3Rpb24oKXtyZXR1cm4hIW5hdmlnYXRvci5tZWRpYURldmljZXN9O2Z1bmN0aW9uIHQoZSxyLHQsbixhLGksbyl7dHJ5e3ZhciB1PWVbaV0obyksYz11LnZhbHVlfWNhdGNoKGUpe3JldHVybiB2b2lkIHQoZSl9dS5kb25lP3IoYyk6UHJvbWlzZS5yZXNvbHZlKGMpLnRoZW4obixhKX1mdW5jdGlvbiBuKGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciByPXRoaXMsbj1hcmd1bWVudHM7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihhLGkpe3ZhciBvPWUuYXBwbHkocixuKTtmdW5jdGlvbiB1KGUpe3QobyxhLGksdSxjLFwibmV4dFwiLGUpfWZ1bmN0aW9uIGMoZSl7dChvLGEsaSx1LGMsXCJ0aHJvd1wiLGUpfXUodm9pZCAwKX0pKX19ZnVuY3Rpb24gYShlLHIpe3JldHVybiBmdW5jdGlvbihlKXtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBlfShlKXx8ZnVuY3Rpb24oZSxyKXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgU3ltYm9sfHwhKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoZSkpKXJldHVybjt2YXIgdD1bXSxuPSEwLGE9ITEsaT12b2lkIDA7dHJ5e2Zvcih2YXIgbyx1PWVbU3ltYm9sLml0ZXJhdG9yXSgpOyEobj0obz11Lm5leHQoKSkuZG9uZSkmJih0LnB1c2goby52YWx1ZSksIXJ8fHQubGVuZ3RoIT09cik7bj0hMCk7fWNhdGNoKGUpe2E9ITAsaT1lfWZpbmFsbHl7dHJ5e258fG51bGw9PXUucmV0dXJufHx1LnJldHVybigpfWZpbmFsbHl7aWYoYSl0aHJvdyBpfX1yZXR1cm4gdH0oZSxyKXx8ZnVuY3Rpb24oZSxyKXtpZighZSlyZXR1cm47aWYoXCJzdHJpbmdcIj09dHlwZW9mIGUpcmV0dXJuIGkoZSxyKTt2YXIgdD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkuc2xpY2UoOCwtMSk7XCJPYmplY3RcIj09PXQmJmUuY29uc3RydWN0b3ImJih0PWUuY29uc3RydWN0b3IubmFtZSk7aWYoXCJNYXBcIj09PXR8fFwiU2V0XCI9PT10KXJldHVybiBBcnJheS5mcm9tKGUpO2lmKFwiQXJndW1lbnRzXCI9PT10fHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdCh0KSlyZXR1cm4gaShlLHIpfShlLHIpfHxmdW5jdGlvbigpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIil9KCl9ZnVuY3Rpb24gaShlLHIpeyhudWxsPT1yfHxyPmUubGVuZ3RoKSYmKHI9ZS5sZW5ndGgpO2Zvcih2YXIgdD0wLG49bmV3IEFycmF5KHIpO3Q8cjt0Kyspblt0XT1lW3RdO3JldHVybiBufXZhciBvPWZ1bmN0aW9uKCl7dmFyIHI9bihyZWdlbmVyYXRvclJ1bnRpbWUubWFyaygoZnVuY3Rpb24gcih0KXtyZXR1cm4gcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoKGZ1bmN0aW9uKHIpe2Zvcig7Oylzd2l0Y2goci5wcmV2PXIubmV4dCl7Y2FzZSAwOnJldHVybiByLmFicnVwdChcInJldHVyblwiLG5ldyBQcm9taXNlKGZ1bmN0aW9uKCl7dmFyIHI9bihyZWdlbmVyYXRvclJ1bnRpbWUubWFyaygoZnVuY3Rpb24gcihuLGEpe3ZhciBpLG87cmV0dXJuIHJlZ2VuZXJhdG9yUnVudGltZS53cmFwKChmdW5jdGlvbihyKXtmb3IoOzspc3dpdGNoKHIucHJldj1yLm5leHQpe2Nhc2UgMDpyZXR1cm4gZSgpfHxhKG5ldyBET01FeGNlcHRpb24oXCJOYXZpZ2F0b3IgQVBJOiBwZXJtaXNzaW9ucyBub3Qgc3VwcG9ydGVkXCIsXCJOT1RfU1VQUE9SVEVEX0VSUlwiKSksci5wcmV2PTEsci5uZXh0PTQsbmF2aWdhdG9yLnBlcm1pc3Npb25zLnF1ZXJ5KHtuYW1lOnR9KTtjYXNlIDQ6aT1yLnNlbnQsbz1mdW5jdGlvbiBlKHIpe2kucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLGUpLHUoci50YXJnZXQuc3RhdGUsbixhKX0saS5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsbyksdShpLnN0YXRlLG4sYSksci5uZXh0PTEzO2JyZWFrO2Nhc2UgMTA6ci5wcmV2PTEwLHIudDA9ci5jYXRjaCgxKSxhKHIudDApO2Nhc2UgMTM6Y2FzZVwiZW5kXCI6cmV0dXJuIHIuc3RvcCgpfX0pLHIsbnVsbCxbWzEsMTBdXSl9KSkpO3JldHVybiBmdW5jdGlvbihlLHQpe3JldHVybiByLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KCkpKTtjYXNlIDE6Y2FzZVwiZW5kXCI6cmV0dXJuIHIuc3RvcCgpfX0pLHIpfSkpKTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHIuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0oKSx1PWZ1bmN0aW9uKGUscix0KXtzd2l0Y2goZSl7Y2FzZVwiZGVuaWVkXCI6dChuZXcgRE9NRXhjZXB0aW9uKFwiUGVybWlzc2lvbiBkZW5pZWRcIixcIk5PVF9BTExPV0VEX0VSUlwiKSk7YnJlYWs7ZGVmYXVsdDpyKGUpfX0sYz1mdW5jdGlvbigpe3ZhciB0PW4ocmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoKGZ1bmN0aW9uIHQoaSx1KXtyZXR1cm4gcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiB0LmFicnVwdChcInJldHVyblwiLG5ldyBQcm9taXNlKGZ1bmN0aW9uKCl7dmFyIHQ9bihyZWdlbmVyYXRvclJ1bnRpbWUubWFyaygoZnVuY3Rpb24gdChuLGMpe3ZhciBzLGYscDtyZXR1cm4gcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOnJldHVybiBlKCkmJnIoKXx8YyhuZXcgRE9NRXhjZXB0aW9uKFwiTmF2aWdhdG9yIEFQSTogcGVybWlzc2lvbnMgb3IgTmF2aWdhdG9yIEFQSTogbWVkaWFEZXZpY2VzIG5vdCBzdXBwb3J0ZWRcIixcIk5PVF9TVVBQT1JURURfRVJSXCIpKSx0LnByZXY9MSx0LnQwPVByb21pc2UsdC5uZXh0PTUsbyhpKTtjYXNlIDU6cmV0dXJuIHQudDE9dC5zZW50LHQubmV4dD04LG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKHUpO2Nhc2UgODpyZXR1cm4gdC50Mj10LnNlbnQsdC50Mz1bdC50MSx0LnQyXSx0Lm5leHQ9MTIsdC50MC5hbGwuY2FsbCh0LnQwLHQudDMpO2Nhc2UgMTI6cz10LnNlbnQsZj1hKHMsMikscD1mWzFdLG4ocCksdC5uZXh0PTIxO2JyZWFrO2Nhc2UgMTg6dC5wcmV2PTE4LHQudDQ9dC5jYXRjaCgxKSxjKHQudDQpO2Nhc2UgMjE6Y2FzZVwiZW5kXCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQsbnVsbCxbWzEsMThdXSl9KSkpO3JldHVybiBmdW5jdGlvbihlLHIpe3JldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KCkpKTtjYXNlIDE6Y2FzZVwiZW5kXCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQpfSkpKTtyZXR1cm4gZnVuY3Rpb24oZSxyKXtyZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSgpO2V4cG9ydHtvIGFzIGdldFBlcm1pc3Npb24sYyBhcyBnZXRVc2VyTWVkaWFTdHJlYW0sciBhcyBpc05hdmlnYXRvck1lZGlhRGV2aWNlc1N1cHBvcnRlZCxlIGFzIGlzTmF2aWdhdG9yUGVybWlzc2lvbnNTdXBwb3J0ZWR9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0ptYVd4bElqb2lhVzVrWlhndVpYTXVhbk1pTENKemIzVnlZMlZ6SWpwYklpNHVMM055WXk5cGMwNWhkbWxuWVhSdmNsQmxjbTFwYzNOcGIyNXpVM1Z3Y0c5eWRHVmtMbXB6SWl3aUxpNHZjM0pqTDJselRtRjJhV2RoZEc5eVRXVmthV0ZFWlhacFkyVnpVM1Z3Y0c5eWRHVmtMbXB6SWl3aUxpNHZjM0pqTDJkbGRGQmxjbTFwYzNOcGIyNHVhbk1pTENJdUxpOXpjbU12WjJWMFZYTmxjazFsWkdsaFUzUnlaV0Z0TG1weklsMHNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJaThxS2x4dUlDb2dRMmhsWTJzZ2QyaGxkR2hsY2lCT1lYWnBaMkYwYjNJZ1FWQkpPaUJ3WlhKdGFYTnphVzl1Y3lCcGN5QnpkWEJ3YjNKMFpXUWdZbmtnZEdobElHTjFjbkpsYm5RZ1luSnZkM05sY2x4dUlDb2dRSEpsZEhWeWJuTWdlMkp2YjJ4bFlXNTlYRzRnS2k5Y2JtVjRjRzl5ZENCa1pXWmhkV3gwSUNncElEMCtJQ0VoYm1GMmFXZGhkRzl5TG5CbGNtMXBjM05wYjI1elhHNGlMQ0l2S2lwY2JpQXFJRU5vWldOcklIZG9aWFJvWlhJZ1RtRjJhV2RoZEc5eUlFRlFTVG9nYldWa2FXRkVaWFpwWTJWeklHbHpJSE4xY0hCdmNuUmxaQ0JpZVNCMGFHVWdZM1Z5Y21WdWRDQmljbTkzYzJWeVhHNGdLaUJBY21WMGRYSnVjeUI3WW05dmJHVmhibjFjYmlBcUwxeHVaWGh3YjNKMElHUmxabUYxYkhRZ0tDa2dQVDRnSVNGdVlYWnBaMkYwYjNJdWJXVmthV0ZFWlhacFkyVnpYRzRpTENKcGJYQnZjblFnYVhOT1lYWnBaMkYwYjNKUVpYSnRhWE56YVc5dWMxTjFjSEJ2Y25SbFpDQm1jbTl0SUNjdUwybHpUbUYyYVdkaGRHOXlVR1Z5YldsemMybHZibk5UZFhCd2IzSjBaV1FuWEc1Y2JpOHFLbHh1SUNvZ1VtVjBkWEp1Y3lCaElIQnliMjFwYzJVZ2NtVnpiMngyWldRZ2QyaGxiaUIwYUdVZ2NHVnliV2x6YzJsdmJpQnBjeUJuY21GdWRHVmtJR0o1SUhSb1pTQjFjMlZ5WEc0Z0tpQkFjR0Z5WVcwZ2NHVnliV2x6YzJsdmJrNWhiV1VnSUNBZ0lDQWdJQ0FnSUNCT1lXMWxJRzltSUhSb1pTQndaWEp0YVhOemFXOXVMaUJBYzJWbElHaDBkSEJ6T2k4dmR6TmpMbWRwZEdoMVlpNXBieTl3WlhKdGFYTnphVzl1Y3k4alpXNTFiV1JsWmkxd1pYSnRhWE56YVc5dWJtRnRaVnh1SUNvZ1FISmxkSFZ5Ym5NZ2UxQnliMjFwYzJWOVhHNGdLaTljYm1WNGNHOXlkQ0JrWldaaGRXeDBJR0Z6ZVc1aklDaHdaWEp0YVhOemFXOXVUbUZ0WlNrZ1BUNGdlMXh1WEhSeVpYUjFjbTRnYm1WM0lGQnliMjFwYzJVb1lYTjVibU1nS0hKbGMyOXNkbVVzSUhKbGFtVmpkQ2tnUFQ0Z2UxeHVYSFJjZEdsbUlDZ2hhWE5PWVhacFoyRjBiM0pRWlhKdGFYTnphVzl1YzFOMWNIQnZjblJsWkNncEtTQjdYRzVjZEZ4MFhIUnlaV3BsWTNRb2JtVjNJRVJQVFVWNFkyVndkR2x2YmlnblRtRjJhV2RoZEc5eUlFRlFTVG9nY0dWeWJXbHpjMmx2Ym5NZ2JtOTBJSE4xY0hCdmNuUmxaQ2NzSUNkT1QxUmZVMVZRVUU5U1ZFVkVYMFZTVWljcEtWeHVYSFJjZEgxY2JseHVYSFJjZEhSeWVTQjdYRzVjZEZ4MFhIUmpiMjV6ZENCd1pYSnRhWE56YVc5dVUzUmhkSFZ6SUQwZ1lYZGhhWFFnYm1GMmFXZGhkRzl5TG5CbGNtMXBjM05wYjI1ekxuRjFaWEo1S0hzZ2JtRnRaVG9nY0dWeWJXbHpjMmx2Yms1aGJXVWdmU2xjYmx4MFhIUmNkR052Ym5OMElHOXVRMmhoYm1kbElEMGdLR1YyWlc1MEtTQTlQaUI3WEc1Y2RGeDBYSFJjZEhCbGNtMXBjM05wYjI1VGRHRjBkWE11Y21WdGIzWmxSWFpsYm5STWFYTjBaVzVsY2lnblkyaGhibWRsSnl3Z2IyNURhR0Z1WjJVcFhHNWNkRngwWEhSY2RISmxjMjlzZG1WUGNsSmxhbVZqZEVKaGMyVmtUMjVUZEdGMFpTaGxkbVZ1ZEM1MFlYSm5aWFF1YzNSaGRHVXNJSEpsYzI5c2RtVXNJSEpsYW1WamRDbGNibHgwWEhSY2RIMWNibHgwWEhSY2RIQmxjbTFwYzNOcGIyNVRkR0YwZFhNdVlXUmtSWFpsYm5STWFYTjBaVzVsY2lnblkyaGhibWRsSnl3Z2IyNURhR0Z1WjJVcFhHNWNkRngwWEhSeVpYTnZiSFpsVDNKU1pXcGxZM1JDWVhObFpFOXVVM1JoZEdVb2NHVnliV2x6YzJsdmJsTjBZWFIxY3k1emRHRjBaU3dnY21WemIyeDJaU3dnY21WcVpXTjBLVnh1WEhSY2RIMGdZMkYwWTJnZ0tHVnljbTl5S1NCN1hHNWNkRngwWEhSeVpXcGxZM1FvWlhKeWIzSXBYRzVjZEZ4MGZWeHVYSFI5S1Z4dWZWeHVYRzVqYjI1emRDQnlaWE52YkhabFQzSlNaV3BsWTNSQ1lYTmxaRTl1VTNSaGRHVWdQU0FvYzNSaGRHVXNJSEpsYzI5c2RtVXNJSEpsYW1WamRDa2dQVDRnZTF4dVhIUnpkMmwwWTJnZ0tITjBZWFJsS1NCN1hHNWNkRngwWTJGelpTQW5aR1Z1YVdWa0p6cGNibHgwWEhSY2RISmxhbVZqZENodVpYY2dSRTlOUlhoalpYQjBhVzl1S0NkUVpYSnRhWE56YVc5dUlHUmxibWxsWkNjc0lDZE9UMVJmUVV4TVQxZEZSRjlGVWxJbktTbGNibHgwWEhSY2RHSnlaV0ZyWEc1Y2RGeDBaR1ZtWVhWc2REcGNibHgwWEhSY2RISmxjMjlzZG1Vb2MzUmhkR1VwWEc1Y2RIMWNibjFjYmlJc0ltbHRjRzl5ZENCcGMwNWhkbWxuWVhSdmNsQmxjbTFwYzNOcGIyNXpVM1Z3Y0c5eWRHVmtJR1p5YjIwZ0p5NHZhWE5PWVhacFoyRjBiM0pRWlhKdGFYTnphVzl1YzFOMWNIQnZjblJsWkNkY2JtbHRjRzl5ZENCcGMwNWhkbWxuWVhSdmNrMWxaR2xoUkdWMmFXTmxjMU4xY0hCdmNuUmxaQ0JtY205dElDY3VMMmx6VG1GMmFXZGhkRzl5VFdWa2FXRkVaWFpwWTJWelUzVndjRzl5ZEdWa0oxeHVhVzF3YjNKMElHZGxkRkJsY20xcGMzTnBiMjRnWm5KdmJTQW5MaTluWlhSUVpYSnRhWE56YVc5dUoxeHVYRzR2S2lwY2JpQXFJRkpsZEhWeWJuTWdZU0J3Y205dGFYTmxJSEpsYzI5c2RtVmtJSGRvWlc0Z2RHaGxJSEJsY20xcGMzTnBiMjRnYVhNZ1ozSmhiblJsWkNCaWVTQjBhR1VnZFhObGNpQmhibVFnZEdobElITjBjbVZoYlNCcGN5QnlaWFJ5YVdWMlpXUmNiaUFxSUVCd1lYSmhiU0J3WlhKdGFYTnphVzl1VG1GdFpTQWdJQ0FnSUNBZ0lDQWdJRTVoYldVZ2IyWWdkR2hsSUhCbGNtMXBjM05wYjI0dUlFQnpaV1VnYUhSMGNITTZMeTkzTTJNdVoybDBhSFZpTG1sdkwzQmxjbTFwYzNOcGIyNXpMeU5sYm5WdFpHVm1MWEJsY20xcGMzTnBiMjV1WVcxbFhHNGdLaUJBY0dGeVlXMGdiV1ZrYVdGVGRISmxZVzFEYjI1emRISmhhVzUwY3lBZ0lDQkRiMjV6ZEhKaGFXNTBjeUJ2WW1wbFkzUXVJRUJ6WldVZ2FIUjBjSE02THk5a1pYWmxiRzl3WlhJdWJXOTZhV3hzWVM1dmNtY3ZaVzR0VlZNdlpHOWpjeTlYWldJdlFWQkpMMDFsWkdsaFUzUnlaV0Z0UTI5dWMzUnlZV2x1ZEhOY2JpQXFJRUJ5WlhSMWNtNXpJSHRRY205dGFYTmxmVnh1SUNvdlhHNWxlSEJ2Y25RZ1pHVm1ZWFZzZENCaGMzbHVZeUFvY0dWeWJXbHpjMmx2Yms1aGJXVXNJRzFsWkdsaFUzUnlaV0Z0UTI5dWMzUnlZV2x1ZEhNcElEMCtJSHRjYmx4MGNtVjBkWEp1SUc1bGR5QlFjbTl0YVhObEtHRnplVzVqSUNoeVpYTnZiSFpsTENCeVpXcGxZM1FwSUQwK0lIdGNibHgwWEhScFppQW9JV2x6VG1GMmFXZGhkRzl5VUdWeWJXbHpjMmx2Ym5OVGRYQndiM0owWldRb0tTQjhmQ0FoYVhOT1lYWnBaMkYwYjNKTlpXUnBZVVJsZG1salpYTlRkWEJ3YjNKMFpXUW9LU2tnZTF4dVhIUmNkRngwY21WcVpXTjBLRzVsZHlCRVQwMUZlR05sY0hScGIyNG9KMDVoZG1sbllYUnZjaUJCVUVrNklIQmxjbTFwYzNOcGIyNXpJRzl5SUU1aGRtbG5ZWFJ2Y2lCQlVFazZJRzFsWkdsaFJHVjJhV05sY3lCdWIzUWdjM1Z3Y0c5eWRHVmtKeXdnSjA1UFZGOVRWVkJRVDFKVVJVUmZSVkpTSnlrcFhHNWNkRngwZlZ4dVhHNWNkRngwZEhKNUlIdGNibHgwWEhSY2RHTnZibk4wSUZzc0lITjBjbVZoYlYwZ1BTQmhkMkZwZENCUWNtOXRhWE5sTG1Gc2JDaGJYRzVjZEZ4MFhIUmNkR0YzWVdsMElHZGxkRkJsY20xcGMzTnBiMjRvY0dWeWJXbHpjMmx2Yms1aGJXVXBMRnh1WEhSY2RGeDBYSFJoZDJGcGRDQnVZWFpwWjJGMGIzSXViV1ZrYVdGRVpYWnBZMlZ6TG1kbGRGVnpaWEpOWldScFlTaHRaV1JwWVZOMGNtVmhiVU52Ym5OMGNtRnBiblJ6S1N4Y2JseDBYSFJjZEYwcFhHNWNkRngwWEhSeVpYTnZiSFpsS0hOMGNtVmhiU2xjYmx4MFhIUjlJR05oZEdOb0lDaGxjbkp2Y2lrZ2UxeHVYSFJjZEZ4MGNtVnFaV04wS0dWeWNtOXlLVnh1WEhSY2RIMWNibHgwZlNsY2JuMWNiaUpkTENKdVlXMWxjeUk2V3lKdVlYWnBaMkYwYjNJaUxDSndaWEp0YVhOemFXOXVjeUlzSW0xbFpHbGhSR1YyYVdObGN5SXNJbkJsY20xcGMzTnBiMjVPWVcxbElpd2lVSEp2YldselpTSXNJbkpsYzI5c2RtVWlMQ0p5WldwbFkzUWlMQ0pwYzA1aGRtbG5ZWFJ2Y2xCbGNtMXBjM05wYjI1elUzVndjRzl5ZEdWa0lpd2lSRTlOUlhoalpYQjBhVzl1SWl3aWNYVmxjbmtpTENKdVlXMWxJaXdpY0dWeWJXbHpjMmx2YmxOMFlYUjFjeUlzSW05dVEyaGhibWRsSWl3aVpYWmxiblFpTENKeVpXMXZkbVZGZG1WdWRFeHBjM1JsYm1WeUlpd2ljbVZ6YjJ4MlpVOXlVbVZxWldOMFFtRnpaV1JQYmxOMFlYUmxJaXdpZEdGeVoyVjBJaXdpYzNSaGRHVWlMQ0poWkdSRmRtVnVkRXhwYzNSbGJtVnlJaXdpYldWa2FXRlRkSEpsWVcxRGIyNXpkSEpoYVc1MGN5SXNJbWx6VG1GMmFXZGhkRzl5VFdWa2FXRkVaWFpwWTJWelUzVndjRzl5ZEdWa0lpd2laMlYwVUdWeWJXbHpjMmx2YmlJc0ltZGxkRlZ6WlhKTlpXUnBZU0lzSW1Gc2JDSXNJbk4wY21WaGJTSmRMQ0p0WVhCd2FXNW5jeUk2SWtGQlNVRXNlVUpCUVhWQ1FTeFZRVUZWUXl4clEwTkJWa1FzVlVGQlZVVXNhWGhEUTBkcVF5eHJSRUZCWlN4WFFVRlBReXcwUjBGRFpDeEpRVUZKUXl4dlJFRkJVU3hYUVVGUFF5eEZRVUZUUXl4clIwRkROMEpETEV0QlEwcEVMRVZCUVU4c1NVRkJTVVVzWVVGQllTd3lRMEZCTkVNc2QwTkJTWEpEVWl4VlFVRlZReXhaUVVGWlVTeE5RVUZOTEVOQlFVVkRMRXRCUVUxUUxGZEJRVGRFVVN4VFFVTkJReXhGUVVGWExGTkJRVmhCTEVWQlFWbERMRWRCUTJwQ1JpeEZRVUZwUWtjc2IwSkJRVzlDTEZOQlFWVkdMRWRCUXk5RFJ5eEZRVUUwUWtZc1JVRkJUVWNzVDBGQlQwTXNUVUZCVDFvc1JVRkJVME1zU1VGRk1VUkxMRVZCUVdsQ1R5eHBRa0ZCYVVJc1UwRkJWVTRzUjBGRE5VTkhMRVZCUVRSQ1NpeEZRVUZwUWswc1RVRkJUMW9zUlVGQlUwTXNjVVJCUlRkRVFTdzJUa0ZMUjFNc1JVRkJPRUlzVTBGQlEwVXNSVUZCVDFvc1JVRkJVME1zVlVGRE5VTlhMRTlCUTBZc1UwRkRTbGdzUlVGQlR5eEpRVUZKUlN4aFFVRmhMRzlDUVVGeFFpeHJRMEZITjBOSUxFVkJRVkZaTEcxRVEzWkNTU3hYUVVGUFpDeEZRVUZuUW1kQ0xEUkhRVU01UWl4SlFVRkpaaXh2UkVGQlVTeFhRVUZQUXl4RlFVRlRReXh2UjBGRE4wSkRMRXRCUVhORFlTeExRVU14UTJRc1JVRkJUeXhKUVVGSlJTeGhRVUZoTERCRlFVRXlSU3h2UTBGSk1VVktMR2xDUVVOc1FtbENMRVZCUVdOc1FpeHpRMEZEWkVnc1ZVRkJWVVVzWVVGQllXOUNMR0ZCUVdGSUxEWkVRVVpXU1N3NFEwRkJlRUpETEU5QlNWUnVRaXhGUVVGUmJVSXNjVVJCUlZKc1FpSjlcbiIsImltcG9ydCB7IGlzTmF2aWdhdG9yUGVybWlzc2lvbnNTdXBwb3J0ZWQsIGlzTmF2aWdhdG9yTWVkaWFEZXZpY2VzU3VwcG9ydGVkLCBnZXRVc2VyTWVkaWFTdHJlYW0gfSBmcm9tICdAdW50ZW1wcy91c2VyLXBlcm1pc3Npb25zLXV0aWxzJ1xuXG5jbGFzcyBWb2NhbCB7XG5cdHN0YXRpYyBkZWZhdWx0T3B0aW9ucyA9IHtcblx0XHRncmFtbWFyczogbnVsbCxcblx0XHRsYW5nOiAnZW4tVVMnLFxuXHRcdGNvbnRpbnVvdXM6IGZhbHNlLFxuXHRcdGludGVyaW1SZXN1bHRzOiBmYWxzZSxcblx0XHRtYXhBbHRlcm5hdGl2ZXM6IDEsXG5cdFx0c2VydmljZVVSSTogbnVsbCxcblx0fVxuXG5cdHN0YXRpYyBldmVudFR5cGVzID0ge1xuXHRcdEFVRElPX0VORDogJ2F1ZGlvZW5kJyxcblx0XHRBVURJT19TVEFSVDogJ2F1ZGlvc3RhcnQnLFxuXHRcdEVORDogJ2VuZCcsXG5cdFx0RVJST1I6ICdlcnJvcicsXG5cdFx0Tk9fTUFUQ0g6ICdub21hdGNoJyxcblx0XHRSRVNVTFQ6ICdyZXN1bHQnLFxuXHRcdFNPVU5EX0VORDogJ3NvdW5kZW5kJyxcblx0XHRTT1VORF9TVEFSVDogJ3NvdW5kc3RhcnQnLFxuXHRcdFNQRUVDSF9FTkQ6ICdzcGVlY2hlbmQnLFxuXHRcdFNQRUVDSF9TVEFSVDogJ3NwZWVjaHN0YXJ0Jyxcblx0XHRTVEFSVDogJ3N0YXJ0Jyxcblx0fVxuXG5cdHN0YXRpYyBnZXQgaXNTdXBwb3J0ZWQoKSB7XG5cdFx0cmV0dXJuICEhVm9jYWwuX3Jlc29sdmVTcGVlY2hSZWNvZ25pdGlvbigpICYmICEhaXNOYXZpZ2F0b3JQZXJtaXNzaW9uc1N1cHBvcnRlZCgpICYmICEhaXNOYXZpZ2F0b3JNZWRpYURldmljZXNTdXBwb3J0ZWQoKVxuXHR9XG5cblx0c3RhdGljIHNldCBpc1N1cHBvcnRlZChfKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdZb3UgY2Fubm90IHNldCBpc1N1cHBvcnRlZCBkaXJlY3RseS4nKVxuXHR9XG5cblx0X2luc3RhbmNlID0gbnVsbFxuXHRfbGlzdGVuZXJzID0gbnVsbFxuXG5cdGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcblx0XHRjb25zdCBTcGVlY2hSZWNvZ25pdGlvbiA9IFZvY2FsLl9yZXNvbHZlU3BlZWNoUmVjb2duaXRpb24oKVxuXHRcdGlmICghU3BlZWNoUmVjb2duaXRpb24pIHtcblx0XHRcdHRocm93IG5ldyBET01FeGNlcHRpb24oJ1NwZWVjaFJlY29nbml0aW9uIG5vdCBzdXBwb3J0ZWQnLCAnTk9UX1NVUFBPUlRFRF9FUlInKVxuXHRcdH1cblxuXHRcdHRoaXMuX2luc3RhbmNlID0gbmV3IFNwZWVjaFJlY29nbml0aW9uKClcblx0XHR0aGlzLl9saXN0ZW5lcnMgPSB7fVxuXG5cdFx0T2JqZWN0LmVudHJpZXMoe1xuXHRcdFx0Li4uVm9jYWwuZGVmYXVsdE9wdGlvbnMsXG5cdFx0XHQuLi4ob3B0aW9ucyB8fCB7fSksXG5cdFx0fSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG5cdFx0XHRpZiAoa2V5ID09PSAnZ3JhbW1hcnMnICYmICF2YWx1ZSkge1xuXHRcdFx0XHRjb25zdCBTcGVlY2hHcmFtbWFyTGlzdCA9IFZvY2FsLl9yZXNvbHZlU3BlZWNoR3JhbW1hckxpc3QoKVxuXHRcdFx0XHRpZiAoISFTcGVlY2hHcmFtbWFyTGlzdCkge1xuXHRcdFx0XHRcdHZhbHVlID0gbmV3IFNwZWVjaEdyYW1tYXJMaXN0KClcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0dGhpcy5faW5zdGFuY2Vba2V5XSA9IHZhbHVlXG5cdFx0fSlcblx0fVxuXG5cdGdldCBpbnN0YW5jZSgpIHtcblx0XHRyZXR1cm4gdGhpcy5faW5zdGFuY2Vcblx0fVxuXG5cdHNldCBpbnN0YW5jZShfKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdZb3UgY2Fubm90IHNldCBpbnN0YW5jZSBkaXJlY3RseS4nKVxuXHR9XG5cblx0YXN5bmMgc3RhcnQoKSB7XG5cdFx0aWYgKCEhdGhpcy5faW5zdGFuY2UpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IHN0cmVhbSA9IGF3YWl0IGdldFVzZXJNZWRpYVN0cmVhbSgnbWljcm9waG9uZScsIHsgYXVkaW86IHRydWUgfSlcblx0XHRcdFx0aWYgKCFzdHJlYW0pIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byByZXRyaWV2ZSB0aGUgc3RyZWFtIGZyb20gbWVkaWEgZGV2aWNlJylcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLl9pbnN0YW5jZS5zdGFydCgpXG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRjb25zdCBlcnJvckhhbmRsZXIgPSB0aGlzLl9saXN0ZW5lcnMuZXJyb3Jcblx0XHRcdFx0aWYgKCEhZXJyb3JIYW5kbGVyKSB7XG5cdFx0XHRcdFx0ZXJyb3JIYW5kbGVyKGVycm9yKVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXNcblx0fVxuXG5cdHN0b3AoKSB7XG5cdFx0aWYgKCEhdGhpcy5faW5zdGFuY2UpIHtcblx0XHRcdHRoaXMuX2luc3RhbmNlLnN0b3AoKVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzXG5cdH1cblxuXHRhYm9ydCgpIHtcblx0XHRpZiAoISF0aGlzLl9pbnN0YW5jZSkge1xuXHRcdFx0dGhpcy5faW5zdGFuY2UuYWJvcnQoKVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzXG5cdH1cblxuXHRhZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgY2FsbGJhY2spIHtcblx0XHRpZiAoISF0aGlzLl9pbnN0YW5jZSAmJiB0aGlzLl9pbmNsdWRlc0V2ZW50VHlwZShldmVudFR5cGUpKSB7XG5cdFx0XHRpZiAoISF0aGlzLl9saXN0ZW5lcnNbZXZlbnRUeXBlXSkge1xuXHRcdFx0XHR0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlKVxuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBoYW5kbGVyID0gKGV2ZW50KSA9PiB7XG5cdFx0XHRcdGxldCBhZGRpdGlvbmFsQXJncyA9IFtdXG5cdFx0XHRcdGlmIChldmVudFR5cGUgPT09IFZvY2FsLmV2ZW50VHlwZXMuUkVTVUxUKSB7XG5cdFx0XHRcdFx0aWYgKCEhZXZlbnQucmVzdWx0cyAmJiBldmVudC5yZXN1bHRzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdGFkZGl0aW9uYWxBcmdzLnB1c2goZXZlbnQucmVzdWx0c1swXVswXS50cmFuc2NyaXB0KVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdCEhY2FsbGJhY2sgJiYgY2FsbGJhY2suYXBwbHkodGhpcywgW2V2ZW50LCAuLi5hZGRpdGlvbmFsQXJnc10pXG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9pbnN0YW5jZS5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgaGFuZGxlcilcblxuXHRcdFx0dGhpcy5fbGlzdGVuZXJzW2V2ZW50VHlwZV0gPSBoYW5kbGVyXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXNcblx0fVxuXG5cdHJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlKSB7XG5cdFx0Y29uc3QgaGFuZGxlciA9IHRoaXMuX2xpc3RlbmVyc1tldmVudFR5cGVdXG5cdFx0dGhpcy5faW5zdGFuY2UucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGhhbmRsZXIpXG5cblx0XHRkZWxldGUgdGhpcy5fbGlzdGVuZXJzW2V2ZW50VHlwZV1cblxuXHRcdHJldHVybiB0aGlzXG5cdH1cblxuXHRjbGVhbnVwKCkge1xuXHRcdHRoaXMuc3RvcCgpXG5cblx0XHRPYmplY3Qua2V5cyh0aGlzLl9saXN0ZW5lcnMpLmZvckVhY2goKGtleSkgPT4gdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGtleSkpXG5cdFx0dGhpcy5faW5zdGFuY2UgPSBudWxsXG5cblx0XHRyZXR1cm4gdGhpc1xuXHR9XG5cblx0X2luY2x1ZGVzRXZlbnRUeXBlKGV2ZW50VHlwZSkge1xuXHRcdHJldHVybiAhIU9iamVjdC52YWx1ZXMoVm9jYWwuZXZlbnRUeXBlcykuZmluZCgodHlwZSkgPT4gdHlwZSA9PT0gZXZlbnRUeXBlKVxuXHR9XG5cblx0c3RhdGljIF9yZXNvbHZlU3BlZWNoUmVjb2duaXRpb24oKSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdHdpbmRvdy5TcGVlY2hSZWNvZ25pdGlvbiB8fFxuXHRcdFx0d2luZG93LndlYmtpdFNwZWVjaFJlY29nbml0aW9uIHx8XG5cdFx0XHR3aW5kb3cubW96U3BlZWNoUmVjb2duaXRpb24gfHxcblx0XHRcdHdpbmRvdy5tc1NwZWVjaFJlY29nbml0aW9uXG5cdFx0KVxuXHR9XG5cblx0c3RhdGljIF9yZXNvbHZlU3BlZWNoR3JhbW1hckxpc3QoKSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdHdpbmRvdy5TcGVlY2hHcmFtbWFyTGlzdCB8fFxuXHRcdFx0d2luZG93LndlYmtpdFNwZWVjaEdyYW1tYXJMaXN0IHx8XG5cdFx0XHR3aW5kb3cubW96U3BlZWNoR3JhbW1hckxpc3QgfHxcblx0XHRcdHdpbmRvdy5tc1NwZWVjaEdyYW1tYXJMaXN0XG5cdFx0KVxuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFZvY2FsXG4iXSwibmFtZXMiOlsicnVudGltZSIsImV4cG9ydHMiLCJPcCIsIk9iamVjdCIsInByb3RvdHlwZSIsImhhc093biIsImhhc093blByb3BlcnR5IiwiJFN5bWJvbCIsIlN5bWJvbCIsIml0ZXJhdG9yU3ltYm9sIiwiaXRlcmF0b3IiLCJhc3luY0l0ZXJhdG9yU3ltYm9sIiwiYXN5bmNJdGVyYXRvciIsInRvU3RyaW5nVGFnU3ltYm9sIiwidG9TdHJpbmdUYWciLCJkZWZpbmUiLCJvYmoiLCJrZXkiLCJ2YWx1ZSIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiZXJyIiwid3JhcCIsImlubmVyRm4iLCJvdXRlckZuIiwic2VsZiIsInRyeUxvY3NMaXN0IiwicHJvdG9HZW5lcmF0b3IiLCJHZW5lcmF0b3IiLCJnZW5lcmF0b3IiLCJjcmVhdGUiLCJjb250ZXh0IiwiQ29udGV4dCIsIl9pbnZva2UiLCJzdGF0ZSIsIm1ldGhvZCIsImFyZyIsIkVycm9yIiwiZG9uZVJlc3VsdCIsImRlbGVnYXRlIiwiZGVsZWdhdGVSZXN1bHQiLCJtYXliZUludm9rZURlbGVnYXRlIiwiQ29udGludWVTZW50aW5lbCIsInNlbnQiLCJfc2VudCIsImRpc3BhdGNoRXhjZXB0aW9uIiwiYWJydXB0IiwicmVjb3JkIiwidHJ5Q2F0Y2giLCJ0eXBlIiwiZG9uZSIsIm1ha2VJbnZva2VNZXRob2QiLCJmbiIsImNhbGwiLCJHZW5lcmF0b3JGdW5jdGlvbiIsIkdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlIiwiSXRlcmF0b3JQcm90b3R5cGUiLCJ0aGlzIiwiZ2V0UHJvdG8iLCJnZXRQcm90b3R5cGVPZiIsIk5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlIiwidmFsdWVzIiwiR3AiLCJkZWZpbmVJdGVyYXRvck1ldGhvZHMiLCJmb3JFYWNoIiwiQXN5bmNJdGVyYXRvciIsIlByb21pc2VJbXBsIiwicHJldmlvdXNQcm9taXNlIiwiY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmciLCJyZXNvbHZlIiwicmVqZWN0IiwiaW52b2tlIiwicmVzdWx0IiwiX19hd2FpdCIsInRoZW4iLCJ1bndyYXBwZWQiLCJlcnJvciIsInVuZGVmaW5lZCIsIlR5cGVFcnJvciIsImluZm8iLCJyZXN1bHROYW1lIiwibmV4dCIsIm5leHRMb2MiLCJwdXNoVHJ5RW50cnkiLCJsb2NzIiwiZW50cnkiLCJ0cnlMb2MiLCJjYXRjaExvYyIsImZpbmFsbHlMb2MiLCJhZnRlckxvYyIsInRyeUVudHJpZXMiLCJwdXNoIiwicmVzZXRUcnlFbnRyeSIsImNvbXBsZXRpb24iLCJyZXNldCIsIml0ZXJhYmxlIiwiaXRlcmF0b3JNZXRob2QiLCJpc05hTiIsImxlbmd0aCIsImkiLCJjb25zdHJ1Y3RvciIsImRpc3BsYXlOYW1lIiwiaXNHZW5lcmF0b3JGdW5jdGlvbiIsImdlbkZ1biIsImN0b3IiLCJuYW1lIiwibWFyayIsInNldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwiYXdyYXAiLCJhc3luYyIsIlByb21pc2UiLCJpdGVyIiwidG9TdHJpbmciLCJrZXlzIiwib2JqZWN0IiwicmV2ZXJzZSIsInBvcCIsInNraXBUZW1wUmVzZXQiLCJwcmV2IiwiY2hhckF0Iiwic2xpY2UiLCJzdG9wIiwicm9vdFJlY29yZCIsInJ2YWwiLCJleGNlcHRpb24iLCJoYW5kbGUiLCJsb2MiLCJjYXVnaHQiLCJoYXNDYXRjaCIsImhhc0ZpbmFsbHkiLCJmaW5hbGx5RW50cnkiLCJjb21wbGV0ZSIsImZpbmlzaCIsImNhdGNoIiwidGhyb3duIiwiZGVsZWdhdGVZaWVsZCIsIm1vZHVsZSIsInJlZ2VuZXJhdG9yUnVudGltZSIsImFjY2lkZW50YWxTdHJpY3RNb2RlIiwiRnVuY3Rpb24iLCJhc3luY0dlbmVyYXRvclN0ZXAiLCJnZW4iLCJfbmV4dCIsIl90aHJvdyIsImFyZ3MiLCJhcmd1bWVudHMiLCJhcHBseSIsImFyciIsIkFycmF5IiwiaXNBcnJheSIsIl9hcnIiLCJfbiIsIl9kIiwiX2UiLCJfcyIsIl9pIiwibGVuIiwiYXJyMiIsIm8iLCJtaW5MZW4iLCJhcnJheUxpa2VUb0FycmF5IiwibiIsImZyb20iLCJ0ZXN0IiwiYXJyYXlXaXRoSG9sZXMiLCJpdGVyYWJsZVRvQXJyYXlMaW1pdCIsInVuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5Iiwibm9uSXRlcmFibGVSZXN0IiwiaW5zdGFuY2UiLCJDb25zdHJ1Y3RvciIsIl9kZWZpbmVQcm9wZXJ0aWVzIiwidGFyZ2V0IiwicHJvcHMiLCJkZXNjcmlwdG9yIiwicHJvdG9Qcm9wcyIsInN0YXRpY1Byb3BzIiwiZSIsIm5hdmlnYXRvciIsInBlcm1pc3Npb25zIiwiciIsIm1lZGlhRGV2aWNlcyIsInQiLCJhIiwidSIsImMiLCJyZXR1cm4iLCJET01FeGNlcHRpb24iLCJxdWVyeSIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJhZGRFdmVudExpc3RlbmVyIiwidDAiLCJzIiwiZiIsInAiLCJ0MSIsImdldFVzZXJNZWRpYSIsInQyIiwidDMiLCJhbGwiLCJ0NCIsIlZvY2FsIiwib3B0aW9ucyIsIlNwZWVjaFJlY29nbml0aW9uIiwiX3Jlc29sdmVTcGVlY2hSZWNvZ25pdGlvbiIsIl9pbnN0YW5jZSIsIl9saXN0ZW5lcnMiLCJlbnRyaWVzIiwiZGVmYXVsdE9wdGlvbnMiLCJTcGVlY2hHcmFtbWFyTGlzdCIsIl9yZXNvbHZlU3BlZWNoR3JhbW1hckxpc3QiLCJfdGhpcyIsImlzTmF2aWdhdG9yUGVybWlzc2lvbnNTdXBwb3J0ZWQiLCJpc05hdmlnYXRvck1lZGlhRGV2aWNlc1N1cHBvcnRlZCIsIl8iLCJnZXRVc2VyTWVkaWFTdHJlYW0iLCJhdWRpbyIsInN0YXJ0IiwiZXJyb3JIYW5kbGVyIiwiYWJvcnQiLCJldmVudFR5cGUiLCJjYWxsYmFjayIsIl9pbmNsdWRlc0V2ZW50VHlwZSIsImhhbmRsZXIiLCJldmVudCIsImFkZGl0aW9uYWxBcmdzIiwiZXZlbnRUeXBlcyIsIlJFU1VMVCIsInJlc3VsdHMiLCJ0cmFuc2NyaXB0IiwiX3RoaXMyIiwiX3RoaXMzIiwiZmluZCIsIndpbmRvdyIsIndlYmtpdFNwZWVjaFJlY29nbml0aW9uIiwibW96U3BlZWNoUmVjb2duaXRpb24iLCJtc1NwZWVjaFJlY29nbml0aW9uIiwid2Via2l0U3BlZWNoR3JhbW1hckxpc3QiLCJtb3pTcGVlY2hHcmFtbWFyTGlzdCIsIm1zU3BlZWNoR3JhbW1hckxpc3QiLCJncmFtbWFycyIsImxhbmciLCJjb250aW51b3VzIiwiaW50ZXJpbVJlc3VsdHMiLCJtYXhBbHRlcm5hdGl2ZXMiLCJzZXJ2aWNlVVJJIiwiQVVESU9fRU5EIiwiQVVESU9fU1RBUlQiLCJFTkQiLCJFUlJPUiIsIk5PX01BVENIIiwiU09VTkRfRU5EIiwiU09VTkRfU1RBUlQiLCJTUEVFQ0hfRU5EIiwiU1BFRUNIX1NUQVJUIiwiU1RBUlQiXSwibWFwcGluZ3MiOiI4T0FPQSxJQUFJQSxFQUFXLFNBQVVDLEdBR3ZCLElBQUlDLEVBQUtDLE9BQU9DLFVBQ1pDLEVBQVNILEVBQUdJLGVBRVpDLEVBQTRCLG1CQUFYQyxPQUF3QkEsT0FBUyxHQUNsREMs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
|
|
1
|
+
import { getUserMediaStream as e, isNavigatorMediaDevicesSupported as t, isNavigatorPermissionsSupported as n } from "@untemps/user-permissions-utils";
|
|
2
|
+
//#region src/Vocal.js
|
|
3
|
+
var r = class r {
|
|
4
|
+
static defaultOptions = {
|
|
5
|
+
grammars: null,
|
|
6
|
+
lang: "en-US",
|
|
7
|
+
continuous: !1,
|
|
8
|
+
interimResults: !1,
|
|
9
|
+
maxAlternatives: 1,
|
|
10
|
+
serviceURI: null
|
|
11
|
+
};
|
|
12
|
+
static eventTypes = {
|
|
13
|
+
AUDIO_END: "audioend",
|
|
14
|
+
AUDIO_START: "audiostart",
|
|
15
|
+
END: "end",
|
|
16
|
+
ERROR: "error",
|
|
17
|
+
NO_MATCH: "nomatch",
|
|
18
|
+
RESULT: "result",
|
|
19
|
+
SOUND_END: "soundend",
|
|
20
|
+
SOUND_START: "soundstart",
|
|
21
|
+
SPEECH_END: "speechend",
|
|
22
|
+
SPEECH_START: "speechstart",
|
|
23
|
+
START: "start"
|
|
24
|
+
};
|
|
25
|
+
static get isSupported() {
|
|
26
|
+
return !!r._resolveSpeechRecognition() && !!n() && !!t();
|
|
27
|
+
}
|
|
28
|
+
static set isSupported(e) {
|
|
29
|
+
throw Error("You cannot set isSupported directly.");
|
|
30
|
+
}
|
|
31
|
+
_instance = null;
|
|
32
|
+
_listeners = null;
|
|
33
|
+
constructor(e) {
|
|
34
|
+
let t = r._resolveSpeechRecognition();
|
|
35
|
+
if (!t) throw new DOMException("SpeechRecognition not supported", "NOT_SUPPORTED_ERR");
|
|
36
|
+
this._instance = new t(), this._listeners = {}, Object.entries({
|
|
37
|
+
...r.defaultOptions,
|
|
38
|
+
...e || {}
|
|
39
|
+
}).forEach(([e, t]) => {
|
|
40
|
+
if (e === "grammars" && !t) {
|
|
41
|
+
let e = r._resolveSpeechGrammarList();
|
|
42
|
+
e && (t = new e());
|
|
43
|
+
}
|
|
44
|
+
this._instance[e] = t;
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
get instance() {
|
|
48
|
+
return this._instance;
|
|
49
|
+
}
|
|
50
|
+
set instance(e) {
|
|
51
|
+
throw Error("You cannot set instance directly.");
|
|
52
|
+
}
|
|
53
|
+
async start() {
|
|
54
|
+
if (this._instance) try {
|
|
55
|
+
if (!await e("microphone", { audio: !0 })) throw Error("Unable to retrieve the stream from media device");
|
|
56
|
+
this._instance.start();
|
|
57
|
+
} catch (e) {
|
|
58
|
+
let t = this._listeners.error;
|
|
59
|
+
t && t(e);
|
|
60
|
+
}
|
|
61
|
+
return this;
|
|
62
|
+
}
|
|
63
|
+
stop() {
|
|
64
|
+
return this._instance && this._instance.stop(), this;
|
|
65
|
+
}
|
|
66
|
+
abort() {
|
|
67
|
+
return this._instance && this._instance.abort(), this;
|
|
68
|
+
}
|
|
69
|
+
addEventListener(e, t) {
|
|
70
|
+
if (this._instance && this._includesEventType(e)) {
|
|
71
|
+
this._listeners[e] && this.removeEventListener(e);
|
|
72
|
+
let n = (n) => {
|
|
73
|
+
let i = [];
|
|
74
|
+
e === r.eventTypes.RESULT && n.results && n.results.length > 0 && i.push(n.results[0][0].transcript), t && t.apply(this, [n, ...i]);
|
|
75
|
+
};
|
|
76
|
+
this._instance.addEventListener(e, n), this._listeners[e] = n;
|
|
77
|
+
}
|
|
78
|
+
return this;
|
|
79
|
+
}
|
|
80
|
+
removeEventListener(e) {
|
|
81
|
+
let t = this._listeners[e];
|
|
82
|
+
return this._instance.removeEventListener(e, t), delete this._listeners[e], this;
|
|
83
|
+
}
|
|
84
|
+
cleanup() {
|
|
85
|
+
return this.stop(), Object.keys(this._listeners).forEach((e) => this.removeEventListener(e)), this._instance = null, this;
|
|
86
|
+
}
|
|
87
|
+
_includesEventType(e) {
|
|
88
|
+
return !!Object.values(r.eventTypes).find((t) => t === e);
|
|
89
|
+
}
|
|
90
|
+
static _resolveSpeechRecognition() {
|
|
91
|
+
return window.SpeechRecognition || window.webkitSpeechRecognition || window.mozSpeechRecognition || window.msSpeechRecognition;
|
|
92
|
+
}
|
|
93
|
+
static _resolveSpeechGrammarList() {
|
|
94
|
+
return window.SpeechGrammarList || window.webkitSpeechGrammarList || window.mozSpeechGrammarList || window.msSpeechGrammarList;
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
//#endregion
|
|
98
|
+
export { r as Vocal };
|
|
99
|
+
|
|
100
|
+
//# sourceMappingURL=index.es.js.map
|