@untemps/vocal 1.2.1 → 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 +9 -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/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});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};function p(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 v(t){return function(){var e=this,r=arguments;return new Promise((function(n,o){var i=t.apply(e,r);function a(t){p(i,n,o,a,c,"next",t)}function c(t){p(i,n,o,a,c,"throw",t)}a(void 0)}))}}function y(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 d(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)?d(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 d(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 m=function(){var t=v(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=v(regeneratorRuntime.mark((function t(r,n){var o,i;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(navigator.permissions){t.next=4;break}n(new DOMException("Permissions not supported","NOT_SUPPORTED_ERR")),t.next=16;break;case 4:return t.prev=4,t.next=7,navigator.permissions.query({name:e});case 7:o=t.sent,i=function t(e){o.removeEventListener("change",t),g(e.target.state,r,n)},o.addEventListener("change",i),g(o.state,r,n),t.next=16;break;case 13:t.prev=13,t.t0=t.catch(4),n(t.t0);case 16:case"end":return t.stop()}}),t,null,[[4,13]])})));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)}}(),g=function(t,e,r){switch(t){case"denied":r(new DOMException("Permission denied","NOT_ALLOWED_ERR"));break;default:e(t)}},w=function(){var t=v(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=v(regeneratorRuntime.mark((function t(n,o){var i,a,c;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(navigator.mediaDevices){t.next=4;break}o(new DOMException("MediaDevices not supported","NOT_FOUND_ERR")),t.next=24;break;case 4:return t.prev=4,t.t0=Promise,t.next=8,m(e);case 8:return t.t1=t.sent,t.next=11,navigator.mediaDevices.getUserMedia(r);case 11:return t.t2=t.sent,t.t3=[t.t1,t.t2],t.next=15,t.t0.all.call(t.t0,t.t3);case 15:i=t.sent,a=y(i,2),c=a[1],n(c),t.next=24;break;case 21:t.prev=21,t.t4=t.catch(4),o(t.t4);case 24:case"end":return t.stop()}}),t,null,[[4,21]])})));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 b(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 E(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{};e%2?b(Object(r),!0).forEach((function(e){h(t,e,r[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):b(Object(r)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}))}return t}var O=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(E({},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()},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,w("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(O,"defaultOptions",{grammars:null,lang:"en-US",continuous:!1,interimResults:!1,maxAlternatives:1,serviceURI:null}),h(O,"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"}),exports.Vocal=O;
|
|
2
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL25vZGVfbW9kdWxlcy9yZWdlbmVyYXRvci1ydW50aW1lL3J1bnRpbWUuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXJyYXlXaXRoSG9sZXMuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pdGVyYWJsZVRvQXJyYXlMaW1pdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2FycmF5TGlrZVRvQXJyYXkuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheS5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL25vbkl0ZXJhYmxlUmVzdC5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3NsaWNlZFRvQXJyYXkuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjay5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHkuanMiLCIuLi9ub2RlX21vZHVsZXMvQHVudGVtcHMvdXNlci1wZXJtaXNzaW9ucy11dGlscy9kaXN0L2luZGV4LmVzLmpzIiwiLi4vc3JjL1ZvY2FsLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxudmFyIHJ1bnRpbWUgPSAoZnVuY3Rpb24gKGV4cG9ydHMpIHtcbiAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgdmFyIE9wID0gT2JqZWN0LnByb3RvdHlwZTtcbiAgdmFyIGhhc093biA9IE9wLmhhc093blByb3BlcnR5O1xuICB2YXIgdW5kZWZpbmVkOyAvLyBNb3JlIGNvbXByZXNzaWJsZSB0aGFuIHZvaWQgMC5cbiAgdmFyICRTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgPyBTeW1ib2wgOiB7fTtcbiAgdmFyIGl0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5pdGVyYXRvciB8fCBcIkBAaXRlcmF0b3JcIjtcbiAgdmFyIGFzeW5jSXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLmFzeW5jSXRlcmF0b3IgfHwgXCJAQGFzeW5jSXRlcmF0b3JcIjtcbiAgdmFyIHRvU3RyaW5nVGFnU3ltYm9sID0gJFN5bWJvbC50b1N0cmluZ1RhZyB8fCBcIkBAdG9TdHJpbmdUYWdcIjtcblxuICBmdW5jdGlvbiBkZWZpbmUob2JqLCBrZXksIHZhbHVlKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgICByZXR1cm4gb2JqW2tleV07XG4gIH1cbiAgdHJ5IHtcbiAgICAvLyBJRSA4IGhhcyBhIGJyb2tlbiBPYmplY3QuZGVmaW5lUHJvcGVydHkgdGhhdCBvbmx5IHdvcmtzIG9uIERPTSBvYmplY3RzLlxuICAgIGRlZmluZSh7fSwgXCJcIik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGRlZmluZSA9IGZ1bmN0aW9uKG9iaiwga2V5LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIG9ialtrZXldID0gdmFsdWU7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBJZiBvdXRlckZuIHByb3ZpZGVkIGFuZCBvdXRlckZuLnByb3RvdHlwZSBpcyBhIEdlbmVyYXRvciwgdGhlbiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvci5cbiAgICB2YXIgcHJvdG9HZW5lcmF0b3IgPSBvdXRlckZuICYmIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yID8gb3V0ZXJGbiA6IEdlbmVyYXRvcjtcbiAgICB2YXIgZ2VuZXJhdG9yID0gT2JqZWN0LmNyZWF0ZShwcm90b0dlbmVyYXRvci5wcm90b3R5cGUpO1xuICAgIHZhciBjb250ZXh0ID0gbmV3IENvbnRleHQodHJ5TG9jc0xpc3QgfHwgW10pO1xuXG4gICAgLy8gVGhlIC5faW52b2tlIG1ldGhvZCB1bmlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIC5uZXh0LFxuICAgIC8vIC50aHJvdywgYW5kIC5yZXR1cm4gbWV0aG9kcy5cbiAgICBnZW5lcmF0b3IuX2ludm9rZSA9IG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gZ2VuZXJhdG9yO1xuICB9XG4gIGV4cG9ydHMud3JhcCA9IHdyYXA7XG5cbiAgLy8gVHJ5L2NhdGNoIGhlbHBlciB0byBtaW5pbWl6ZSBkZW9wdGltaXphdGlvbnMuIFJldHVybnMgYSBjb21wbGV0aW9uXG4gIC8vIHJlY29yZCBsaWtlIGNvbnRleHQudHJ5RW50cmllc1tpXS5jb21wbGV0aW9uLiBUaGlzIGludGVyZmFjZSBjb3VsZFxuICAvLyBoYXZlIGJlZW4gKGFuZCB3YXMgcHJldmlvdXNseSkgZGVzaWduZWQgdG8gdGFrZSBhIGNsb3N1cmUgdG8gYmVcbiAgLy8gaW52b2tlZCB3aXRob3V0IGFyZ3VtZW50cywgYnV0IGluIGFsbCB0aGUgY2FzZXMgd2UgY2FyZSBhYm91dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYW4gZXhpc3RpbmcgbWV0aG9kIHdlIHdhbnQgdG8gY2FsbCwgc28gdGhlcmUncyBubyBuZWVkXG4gIC8vIHRvIGNyZWF0ZSBhIG5ldyBmdW5jdGlvbiBvYmplY3QuIFdlIGNhbiBldmVuIGdldCBhd2F5IHdpdGggYXNzdW1pbmdcbiAgLy8gdGhlIG1ldGhvZCB0YWtlcyBleGFjdGx5IG9uZSBhcmd1bWVudCwgc2luY2UgdGhhdCBoYXBwZW5zIHRvIGJlIHRydWVcbiAgLy8gaW4gZXZlcnkgY2FzZSwgc28gd2UgZG9uJ3QgaGF2ZSB0byB0b3VjaCB0aGUgYXJndW1lbnRzIG9iamVjdC4gVGhlXG4gIC8vIG9ubHkgYWRkaXRpb25hbCBhbGxvY2F0aW9uIHJlcXVpcmVkIGlzIHRoZSBjb21wbGV0aW9uIHJlY29yZCwgd2hpY2hcbiAgLy8gaGFzIGEgc3RhYmxlIHNoYXBlIGFuZCBzbyBob3BlZnVsbHkgc2hvdWxkIGJlIGNoZWFwIHRvIGFsbG9jYXRlLlxuICBmdW5jdGlvbiB0cnlDYXRjaChmbiwgb2JqLCBhcmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJub3JtYWxcIiwgYXJnOiBmbi5jYWxsKG9iaiwgYXJnKSB9O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIHsgdHlwZTogXCJ0aHJvd1wiLCBhcmc6IGVyciB9O1xuICAgIH1cbiAgfVxuXG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0ID0gXCJzdXNwZW5kZWRTdGFydFwiO1xuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRZaWVsZCA9IFwic3VzcGVuZGVkWWllbGRcIjtcbiAgdmFyIEdlblN0YXRlRXhlY3V0aW5nID0gXCJleGVjdXRpbmdcIjtcbiAgdmFyIEdlblN0YXRlQ29tcGxldGVkID0gXCJjb21wbGV0ZWRcIjtcblxuICAvLyBSZXR1cm5pbmcgdGhpcyBvYmplY3QgZnJvbSB0aGUgaW5uZXJGbiBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzXG4gIC8vIGJyZWFraW5nIG91dCBvZiB0aGUgZGlzcGF0Y2ggc3dpdGNoIHN0YXRlbWVudC5cbiAgdmFyIENvbnRpbnVlU2VudGluZWwgPSB7fTtcblxuICAvLyBEdW1teSBjb25zdHJ1Y3RvciBmdW5jdGlvbnMgdGhhdCB3ZSB1c2UgYXMgdGhlIC5jb25zdHJ1Y3RvciBhbmRcbiAgLy8gLmNvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzIGZvciBmdW5jdGlvbnMgdGhhdCByZXR1cm4gR2VuZXJhdG9yXG4gIC8vIG9iamVjdHMuIEZvciBmdWxsIHNwZWMgY29tcGxpYW5jZSwgeW91IG1heSB3aXNoIHRvIGNvbmZpZ3VyZSB5b3VyXG4gIC8vIG1pbmlmaWVyIG5vdCB0byBtYW5nbGUgdGhlIG5hbWVzIG9mIHRoZXNlIHR3byBmdW5jdGlvbnMuXG4gIGZ1bmN0aW9uIEdlbmVyYXRvcigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUoKSB7fVxuXG4gIC8vIFRoaXMgaXMgYSBwb2x5ZmlsbCBmb3IgJUl0ZXJhdG9yUHJvdG90eXBlJSBmb3IgZW52aXJvbm1lbnRzIHRoYXRcbiAgLy8gZG9uJ3QgbmF0aXZlbHkgc3VwcG9ydCBpdC5cbiAgdmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG4gIEl0ZXJhdG9yUHJvdG90eXBlW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICB2YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG4gIHZhciBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvICYmIGdldFByb3RvKGdldFByb3RvKHZhbHVlcyhbXSkpKTtcbiAgaWYgKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICYmXG4gICAgICBOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAhPT0gT3AgJiZcbiAgICAgIGhhc093bi5jYWxsKE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlLCBpdGVyYXRvclN5bWJvbCkpIHtcbiAgICAvLyBUaGlzIGVudmlyb25tZW50IGhhcyBhIG5hdGl2ZSAlSXRlcmF0b3JQcm90b3R5cGUlOyB1c2UgaXQgaW5zdGVhZFxuICAgIC8vIG9mIHRoZSBwb2x5ZmlsbC5cbiAgICBJdGVyYXRvclByb3RvdHlwZSA9IE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlO1xuICB9XG5cbiAgdmFyIEdwID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUucHJvdG90eXBlID1cbiAgICBHZW5lcmF0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSk7XG4gIEdlbmVyYXRvckZ1bmN0aW9uLnByb3RvdHlwZSA9IEdwLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gR2VuZXJhdG9yRnVuY3Rpb247XG4gIEdlbmVyYXRvckZ1bmN0aW9uLmRpc3BsYXlOYW1lID0gZGVmaW5lKFxuICAgIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLFxuICAgIHRvU3RyaW5nVGFnU3ltYm9sLFxuICAgIFwiR2VuZXJhdG9yRnVuY3Rpb25cIlxuICApO1xuXG4gIC8vIEhlbHBlciBmb3IgZGVmaW5pbmcgdGhlIC5uZXh0LCAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMgb2YgdGhlXG4gIC8vIEl0ZXJhdG9yIGludGVyZmFjZSBpbiB0ZXJtcyBvZiBhIHNpbmdsZSAuX2ludm9rZSBtZXRob2QuXG4gIGZ1bmN0aW9uIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhwcm90b3R5cGUpIHtcbiAgICBbXCJuZXh0XCIsIFwidGhyb3dcIiwgXCJyZXR1cm5cIl0uZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgICAgIGRlZmluZShwcm90b3R5cGUsIG1ldGhvZCwgZnVuY3Rpb24oYXJnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnZva2UobWV0aG9kLCBhcmcpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICB2YXIgY3RvciA9IHR5cGVvZiBnZW5GdW4gPT09IFwiZnVuY3Rpb25cIiAmJiBnZW5GdW4uY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIGN0b3JcbiAgICAgID8gY3RvciA9PT0gR2VuZXJhdG9yRnVuY3Rpb24gfHxcbiAgICAgICAgLy8gRm9yIHRoZSBuYXRpdmUgR2VuZXJhdG9yRnVuY3Rpb24gY29uc3RydWN0b3IsIHRoZSBiZXN0IHdlIGNhblxuICAgICAgICAvLyBkbyBpcyB0byBjaGVjayBpdHMgLm5hbWUgcHJvcGVydHkuXG4gICAgICAgIChjdG9yLmRpc3BsYXlOYW1lIHx8IGN0b3IubmFtZSkgPT09IFwiR2VuZXJhdG9yRnVuY3Rpb25cIlxuICAgICAgOiBmYWxzZTtcbiAgfTtcblxuICBleHBvcnRzLm1hcmsgPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICBpZiAoT2JqZWN0LnNldFByb3RvdHlwZU9mKSB7XG4gICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoZ2VuRnVuLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdlbkZ1bi5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgICAgIGRlZmluZShnZW5GdW4sIHRvU3RyaW5nVGFnU3ltYm9sLCBcIkdlbmVyYXRvckZ1bmN0aW9uXCIpO1xuICAgIH1cbiAgICBnZW5GdW4ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShHcCk7XG4gICAgcmV0dXJuIGdlbkZ1bjtcbiAgfTtcblxuICAvLyBXaXRoaW4gdGhlIGJvZHkgb2YgYW55IGFzeW5jIGZ1bmN0aW9uLCBgYXdhaXQgeGAgaXMgdHJhbnNmb3JtZWQgdG9cbiAgLy8gYHlpZWxkIHJlZ2VuZXJhdG9yUnVudGltZS5hd3JhcCh4KWAsIHNvIHRoYXQgdGhlIHJ1bnRpbWUgY2FuIHRlc3RcbiAgLy8gYGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIilgIHRvIGRldGVybWluZSBpZiB0aGUgeWllbGRlZCB2YWx1ZSBpc1xuICAvLyBtZWFudCB0byBiZSBhd2FpdGVkLlxuICBleHBvcnRzLmF3cmFwID0gZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIHsgX19hd2FpdDogYXJnIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihnZW5lcmF0b3IsIFByb21pc2VJbXBsKSB7XG4gICAgZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChnZW5lcmF0b3JbbWV0aG9kXSwgZ2VuZXJhdG9yLCBhcmcpO1xuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgcmVqZWN0KHJlY29yZC5hcmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHJlY29yZC5hcmc7XG4gICAgICAgIHZhciB2YWx1ZSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlICYmXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgIGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIikpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZUltcGwucmVzb2x2ZSh2YWx1ZS5fX2F3YWl0KS50aGVuKGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJuZXh0XCIsIHZhbHVlLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0sIGZ1bmN0aW9uKGVycikge1xuICAgICAgICAgICAgaW52b2tlKFwidGhyb3dcIiwgZXJyLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2VJbXBsLnJlc29sdmUodmFsdWUpLnRoZW4oZnVuY3Rpb24odW53cmFwcGVkKSB7XG4gICAgICAgICAgLy8gV2hlbiBhIHlpZWxkZWQgUHJvbWlzZSBpcyByZXNvbHZlZCwgaXRzIGZpbmFsIHZhbHVlIGJlY29tZXNcbiAgICAgICAgICAvLyB0aGUgLnZhbHVlIG9mIHRoZSBQcm9taXNlPHt2YWx1ZSxkb25lfT4gcmVzdWx0IGZvciB0aGVcbiAgICAgICAgICAvLyBjdXJyZW50IGl0ZXJhdGlvbi5cbiAgICAgICAgICByZXN1bHQudmFsdWUgPSB1bndyYXBwZWQ7XG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9LCBmdW5jdGlvbihlcnJvcikge1xuICAgICAgICAgIC8vIElmIGEgcmVqZWN0ZWQgUHJvbWlzZSB3YXMgeWllbGRlZCwgdGhyb3cgdGhlIHJlamVjdGlvbiBiYWNrXG4gICAgICAgICAgLy8gaW50byB0aGUgYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9uIHNvIGl0IGNhbiBiZSBoYW5kbGVkIHRoZXJlLlxuICAgICAgICAgIHJldHVybiBpbnZva2UoXCJ0aHJvd1wiLCBlcnJvciwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHByZXZpb3VzUHJvbWlzZTtcblxuICAgIGZ1bmN0aW9uIGVucXVldWUobWV0aG9kLCBhcmcpIHtcbiAgICAgIGZ1bmN0aW9uIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2VJbXBsKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcmV2aW91c1Byb21pc2UgPVxuICAgICAgICAvLyBJZiBlbnF1ZXVlIGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gd2Ugd2FudCB0byB3YWl0IHVudGlsXG4gICAgICAgIC8vIGFsbCBwcmV2aW91cyBQcm9taXNlcyBoYXZlIGJlZW4gcmVzb2x2ZWQgYmVmb3JlIGNhbGxpbmcgaW52b2tlLFxuICAgICAgICAvLyBzbyB0aGF0IHJlc3VsdHMgYXJlIGFsd2F5cyBkZWxpdmVyZWQgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuIElmXG4gICAgICAgIC8vIGVucXVldWUgaGFzIG5vdCBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gaXQgaXMgaW1wb3J0YW50IHRvXG4gICAgICAgIC8vIGNhbGwgaW52b2tlIGltbWVkaWF0ZWx5LCB3aXRob3V0IHdhaXRpbmcgb24gYSBjYWxsYmFjayB0byBmaXJlLFxuICAgICAgICAvLyBzbyB0aGF0IHRoZSBhc3luYyBnZW5lcmF0b3IgZnVuY3Rpb24gaGFzIHRoZSBvcHBvcnR1bml0eSB0byBkb1xuICAgICAgICAvLyBhbnkgbmVjZXNzYXJ5IHNldHVwIGluIGEgcHJlZGljdGFibGUgd2F5LiBUaGlzIHByZWRpY3RhYmlsaXR5XG4gICAgICAgIC8vIGlzIHdoeSB0aGUgUHJvbWlzZSBjb25zdHJ1Y3RvciBzeW5jaHJvbm91c2x5IGludm9rZXMgaXRzXG4gICAgICAgIC8vIGV4ZWN1dG9yIGNhbGxiYWNrLCBhbmQgd2h5IGFzeW5jIGZ1bmN0aW9ucyBzeW5jaHJvbm91c2x5XG4gICAgICAgIC8vIGV4ZWN1dGUgY29kZSBiZWZvcmUgdGhlIGZpcnN0IGF3YWl0LiBTaW5jZSB3ZSBpbXBsZW1lbnQgc2ltcGxlXG4gICAgICAgIC8vIGFzeW5jIGZ1bmN0aW9ucyBpbiB0ZXJtcyBvZiBhc3luYyBnZW5lcmF0b3JzLCBpdCBpcyBlc3BlY2lhbGx5XG4gICAgICAgIC8vIGltcG9ydGFudCB0byBnZXQgdGhpcyByaWdodCwgZXZlbiB0aG91Z2ggaXQgcmVxdWlyZXMgY2FyZS5cbiAgICAgICAgcHJldmlvdXNQcm9taXNlID8gcHJldmlvdXNQcm9taXNlLnRoZW4oXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcsXG4gICAgICAgICAgLy8gQXZvaWQgcHJvcGFnYXRpbmcgZmFpbHVyZXMgdG8gUHJvbWlzZXMgcmV0dXJuZWQgYnkgbGF0ZXJcbiAgICAgICAgICAvLyBpbnZvY2F0aW9ucyBvZiB0aGUgaXRlcmF0b3IuXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmdcbiAgICAgICAgKSA6IGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCk7XG4gICAgfVxuXG4gICAgLy8gRGVmaW5lIHRoZSB1bmlmaWVkIGhlbHBlciBtZXRob2QgdGhhdCBpcyB1c2VkIHRvIGltcGxlbWVudCAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIChzZWUgZGVmaW5lSXRlcmF0b3JNZXRob2RzKS5cbiAgICB0aGlzLl9pbnZva2UgPSBlbnF1ZXVlO1xuICB9XG5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlKTtcbiAgQXN5bmNJdGVyYXRvci5wcm90b3R5cGVbYXN5bmNJdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIGV4cG9ydHMuQXN5bmNJdGVyYXRvciA9IEFzeW5jSXRlcmF0b3I7XG5cbiAgLy8gTm90ZSB0aGF0IHNpbXBsZSBhc3luYyBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIG9uIHRvcCBvZlxuICAvLyBBc3luY0l0ZXJhdG9yIG9iamVjdHM7IHRoZXkganVzdCByZXR1cm4gYSBQcm9taXNlIGZvciB0aGUgdmFsdWUgb2ZcbiAgLy8gdGhlIGZpbmFsIHJlc3VsdCBwcm9kdWNlZCBieSB0aGUgaXRlcmF0b3IuXG4gIGV4cG9ydHMuYXN5bmMgPSBmdW5jdGlvbihpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCwgUHJvbWlzZUltcGwpIHtcbiAgICBpZiAoUHJvbWlzZUltcGwgPT09IHZvaWQgMCkgUHJvbWlzZUltcGwgPSBQcm9taXNlO1xuXG4gICAgdmFyIGl0ZXIgPSBuZXcgQXN5bmNJdGVyYXRvcihcbiAgICAgIHdyYXAoaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpLFxuICAgICAgUHJvbWlzZUltcGxcbiAgICApO1xuXG4gICAgcmV0dXJuIGV4cG9ydHMuaXNHZW5lcmF0b3JGdW5jdGlvbihvdXRlckZuKVxuICAgICAgPyBpdGVyIC8vIElmIG91dGVyRm4gaXMgYSBnZW5lcmF0b3IsIHJldHVybiB0aGUgZnVsbCBpdGVyYXRvci5cbiAgICAgIDogaXRlci5uZXh0KCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0LmRvbmUgPyByZXN1bHQudmFsdWUgOiBpdGVyLm5leHQoKTtcbiAgICAgICAgfSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KSB7XG4gICAgdmFyIHN0YXRlID0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydDtcblxuICAgIHJldHVybiBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcpIHtcbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVFeGVjdXRpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZ1wiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUNvbXBsZXRlZCkge1xuICAgICAgICBpZiAobWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICB0aHJvdyBhcmc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCZSBmb3JnaXZpbmcsIHBlciAyNS4zLjMuMy4zIG9mIHRoZSBzcGVjOlxuICAgICAgICAvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtZ2VuZXJhdG9ycmVzdW1lXG4gICAgICAgIHJldHVybiBkb25lUmVzdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQubWV0aG9kID0gbWV0aG9kO1xuICAgICAgY29udGV4dC5hcmcgPSBhcmc7XG5cbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHZhciBkZWxlZ2F0ZSA9IGNvbnRleHQuZGVsZWdhdGU7XG4gICAgICAgIGlmIChkZWxlZ2F0ZSkge1xuICAgICAgICAgIHZhciBkZWxlZ2F0ZVJlc3VsdCA9IG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0ID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTtcbiAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZVJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgICAgLy8gU2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgICAgICBjb250ZXh0LnNlbnQgPSBjb250ZXh0Ll9zZW50ID0gY29udGV4dC5hcmc7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0KSB7XG4gICAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgICAgdGhyb3cgY29udGV4dC5hcmc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZyk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICAgIGNvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIGNvbnRleHQuYXJnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlID0gR2VuU3RhdGVFeGVjdXRpbmc7XG5cbiAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIpIHtcbiAgICAgICAgICAvLyBJZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGZyb20gaW5uZXJGbiwgd2UgbGVhdmUgc3RhdGUgPT09XG4gICAgICAgICAgLy8gR2VuU3RhdGVFeGVjdXRpbmcgYW5kIGxvb3AgYmFjayBmb3IgYW5vdGhlciBpbnZvY2F0aW9uLlxuICAgICAgICAgIHN0YXRlID0gY29udGV4dC5kb25lXG4gICAgICAgICAgICA/IEdlblN0YXRlQ29tcGxldGVkXG4gICAgICAgICAgICA6IEdlblN0YXRlU3VzcGVuZGVkWWllbGQ7XG5cbiAgICAgICAgICBpZiAocmVjb3JkLmFyZyA9PT0gQ29udGludWVTZW50aW5lbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiByZWNvcmQuYXJnLFxuICAgICAgICAgICAgZG9uZTogY29udGV4dC5kb25lXG4gICAgICAgICAgfTtcblxuICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgIC8vIERpc3BhdGNoIHRoZSBleGNlcHRpb24gYnkgbG9vcGluZyBiYWNrIGFyb3VuZCB0byB0aGVcbiAgICAgICAgICAvLyBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKSBjYWxsIGFib3ZlLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBDYWxsIGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXShjb250ZXh0LmFyZykgYW5kIGhhbmRsZSB0aGVcbiAgLy8gcmVzdWx0LCBlaXRoZXIgYnkgcmV0dXJuaW5nIGEgeyB2YWx1ZSwgZG9uZSB9IHJlc3VsdCBmcm9tIHRoZVxuICAvLyBkZWxlZ2F0ZSBpdGVyYXRvciwgb3IgYnkgbW9kaWZ5aW5nIGNvbnRleHQubWV0aG9kIGFuZCBjb250ZXh0LmFyZyxcbiAgLy8gc2V0dGluZyBjb250ZXh0LmRlbGVnYXRlIHRvIG51bGwsIGFuZCByZXR1cm5pbmcgdGhlIENvbnRpbnVlU2VudGluZWwuXG4gIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpIHtcbiAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdO1xuICAgIGlmIChtZXRob2QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQSAudGhyb3cgb3IgLnJldHVybiB3aGVuIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgbm8gLnRocm93XG4gICAgICAvLyBtZXRob2QgYWx3YXlzIHRlcm1pbmF0ZXMgdGhlIHlpZWxkKiBsb29wLlxuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIC8vIE5vdGU6IFtcInJldHVyblwiXSBtdXN0IGJlIHVzZWQgZm9yIEVTMyBwYXJzaW5nIGNvbXBhdGliaWxpdHkuXG4gICAgICAgIGlmIChkZWxlZ2F0ZS5pdGVyYXRvcltcInJldHVyblwiXSkge1xuICAgICAgICAgIC8vIElmIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgYSByZXR1cm4gbWV0aG9kLCBnaXZlIGl0IGFcbiAgICAgICAgICAvLyBjaGFuY2UgdG8gY2xlYW4gdXAuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInJldHVyblwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICAgIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuXG4gICAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgIC8vIElmIG1heWJlSW52b2tlRGVsZWdhdGUoY29udGV4dCkgY2hhbmdlZCBjb250ZXh0Lm1ldGhvZCBmcm9tXG4gICAgICAgICAgICAvLyBcInJldHVyblwiIHRvIFwidGhyb3dcIiwgbGV0IHRoYXQgb3ZlcnJpZGUgdGhlIFR5cGVFcnJvciBiZWxvdy5cbiAgICAgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgXCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICd0aHJvdycgbWV0aG9kXCIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2gobWV0aG9kLCBkZWxlZ2F0ZS5pdGVyYXRvciwgY29udGV4dC5hcmcpO1xuXG4gICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICB2YXIgaW5mbyA9IHJlY29yZC5hcmc7XG5cbiAgICBpZiAoISBpbmZvKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcihcIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0XCIpO1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICBpZiAoaW5mby5kb25lKSB7XG4gICAgICAvLyBBc3NpZ24gdGhlIHJlc3VsdCBvZiB0aGUgZmluaXNoZWQgZGVsZWdhdGUgdG8gdGhlIHRlbXBvcmFyeVxuICAgICAgLy8gdmFyaWFibGUgc3BlY2lmaWVkIGJ5IGRlbGVnYXRlLnJlc3VsdE5hbWUgKHNlZSBkZWxlZ2F0ZVlpZWxkKS5cbiAgICAgIGNvbnRleHRbZGVsZWdhdGUucmVzdWx0TmFtZV0gPSBpbmZvLnZhbHVlO1xuXG4gICAgICAvLyBSZXN1bWUgZXhlY3V0aW9uIGF0IHRoZSBkZXNpcmVkIGxvY2F0aW9uIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0Lm5leHQgPSBkZWxlZ2F0ZS5uZXh0TG9jO1xuXG4gICAgICAvLyBJZiBjb250ZXh0Lm1ldGhvZCB3YXMgXCJ0aHJvd1wiIGJ1dCB0aGUgZGVsZWdhdGUgaGFuZGxlZCB0aGVcbiAgICAgIC8vIGV4Y2VwdGlvbiwgbGV0IHRoZSBvdXRlciBnZW5lcmF0b3IgcHJvY2VlZCBub3JtYWxseS4gSWZcbiAgICAgIC8vIGNvbnRleHQubWV0aG9kIHdhcyBcIm5leHRcIiwgZm9yZ2V0IGNvbnRleHQuYXJnIHNpbmNlIGl0IGhhcyBiZWVuXG4gICAgICAvLyBcImNvbnN1bWVkXCIgYnkgdGhlIGRlbGVnYXRlIGl0ZXJhdG9yLiBJZiBjb250ZXh0Lm1ldGhvZCB3YXNcbiAgICAgIC8vIFwicmV0dXJuXCIsIGFsbG93IHRoZSBvcmlnaW5hbCAucmV0dXJuIGNhbGwgdG8gY29udGludWUgaW4gdGhlXG4gICAgICAvLyBvdXRlciBnZW5lcmF0b3IuXG4gICAgICBpZiAoY29udGV4dC5tZXRob2QgIT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgY29udGV4dC5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmUteWllbGQgdGhlIHJlc3VsdCByZXR1cm5lZCBieSB0aGUgZGVsZWdhdGUgbWV0aG9kLlxuICAgICAgcmV0dXJuIGluZm87XG4gICAgfVxuXG4gICAgLy8gVGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGlzIGZpbmlzaGVkLCBzbyBmb3JnZXQgaXQgYW5kIGNvbnRpbnVlIHdpdGhcbiAgICAvLyB0aGUgb3V0ZXIgZ2VuZXJhdG9yLlxuICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICB9XG5cbiAgLy8gRGVmaW5lIEdlbmVyYXRvci5wcm90b3R5cGUue25leHQsdGhyb3cscmV0dXJufSBpbiB0ZXJtcyBvZiB0aGVcbiAgLy8gdW5pZmllZCAuX2ludm9rZSBoZWxwZXIgbWV0aG9kLlxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoR3ApO1xuXG4gIGRlZmluZShHcCwgdG9TdHJpbmdUYWdTeW1ib2wsIFwiR2VuZXJhdG9yXCIpO1xuXG4gIC8vIEEgR2VuZXJhdG9yIHNob3VsZCBhbHdheXMgcmV0dXJuIGl0c2VsZiBhcyB0aGUgaXRlcmF0b3Igb2JqZWN0IHdoZW4gdGhlXG4gIC8vIEBAaXRlcmF0b3IgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGl0LiBTb21lIGJyb3dzZXJzJyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlXG4gIC8vIGl0ZXJhdG9yIHByb3RvdHlwZSBjaGFpbiBpbmNvcnJlY3RseSBpbXBsZW1lbnQgdGhpcywgY2F1c2luZyB0aGUgR2VuZXJhdG9yXG4gIC8vIG9iamVjdCB0byBub3QgYmUgcmV0dXJuZWQgZnJvbSB0aGlzIGNhbGwuIFRoaXMgZW5zdXJlcyB0aGF0IGRvZXNuJ3QgaGFwcGVuLlxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlZ2VuZXJhdG9yL2lzc3Vlcy8yNzQgZm9yIG1vcmUgZGV0YWlscy5cbiAgR3BbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgR3AudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXCJbb2JqZWN0IEdlbmVyYXRvcl1cIjtcbiAgfTtcblxuICBmdW5jdGlvbiBwdXNoVHJ5RW50cnkobG9jcykge1xuICAgIHZhciBlbnRyeSA9IHsgdHJ5TG9jOiBsb2NzWzBdIH07XG5cbiAgICBpZiAoMSBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5jYXRjaExvYyA9IGxvY3NbMV07XG4gICAgfVxuXG4gICAgaWYgKDIgaW4gbG9jcykge1xuICAgICAgZW50cnkuZmluYWxseUxvYyA9IGxvY3NbMl07XG4gICAgICBlbnRyeS5hZnRlckxvYyA9IGxvY3NbM107XG4gICAgfVxuXG4gICAgdGhpcy50cnlFbnRyaWVzLnB1c2goZW50cnkpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzZXRUcnlFbnRyeShlbnRyeSkge1xuICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uIHx8IHt9O1xuICAgIHJlY29yZC50eXBlID0gXCJub3JtYWxcIjtcbiAgICBkZWxldGUgcmVjb3JkLmFyZztcbiAgICBlbnRyeS5jb21wbGV0aW9uID0gcmVjb3JkO1xuICB9XG5cbiAgZnVuY3Rpb24gQ29udGV4dCh0cnlMb2NzTGlzdCkge1xuICAgIC8vIFRoZSByb290IGVudHJ5IG9iamVjdCAoZWZmZWN0aXZlbHkgYSB0cnkgc3RhdGVtZW50IHdpdGhvdXQgYSBjYXRjaFxuICAgIC8vIG9yIGEgZmluYWxseSBibG9jaykgZ2l2ZXMgdXMgYSBwbGFjZSB0byBzdG9yZSB2YWx1ZXMgdGhyb3duIGZyb21cbiAgICAvLyBsb2NhdGlvbnMgd2hlcmUgdGhlcmUgaXMgbm8gZW5jbG9zaW5nIHRyeSBzdGF0ZW1lbnQuXG4gICAgdGhpcy50cnlFbnRyaWVzID0gW3sgdHJ5TG9jOiBcInJvb3RcIiB9XTtcbiAgICB0cnlMb2NzTGlzdC5mb3JFYWNoKHB1c2hUcnlFbnRyeSwgdGhpcyk7XG4gICAgdGhpcy5yZXNldCh0cnVlKTtcbiAgfVxuXG4gIGV4cG9ydHMua2V5cyA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHZhciBrZXlzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICAgIGtleXMucmV2ZXJzZSgpO1xuXG4gICAgLy8gUmF0aGVyIHRoYW4gcmV0dXJuaW5nIGFuIG9iamVjdCB3aXRoIGEgbmV4dCBtZXRob2QsIHdlIGtlZXBcbiAgICAvLyB0aGluZ3Mgc2ltcGxlIGFuZCByZXR1cm4gdGhlIG5leHQgZnVuY3Rpb24gaXRzZWxmLlxuICAgIHJldHVybiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgd2hpbGUgKGtleXMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSBrZXlzLnBvcCgpO1xuICAgICAgICBpZiAoa2V5IGluIG9iamVjdCkge1xuICAgICAgICAgIG5leHQudmFsdWUgPSBrZXk7XG4gICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVG8gYXZvaWQgY3JlYXRpbmcgYW4gYWRkaXRpb25hbCBvYmplY3QsIHdlIGp1c3QgaGFuZyB0aGUgLnZhbHVlXG4gICAgICAvLyBhbmQgLmRvbmUgcHJvcGVydGllcyBvZmYgdGhlIG5leHQgZnVuY3Rpb24gb2JqZWN0IGl0c2VsZi4gVGhpc1xuICAgICAgLy8gYWxzbyBlbnN1cmVzIHRoYXQgdGhlIG1pbmlmaWVyIHdpbGwgbm90IGFub255bWl6ZSB0aGUgZnVuY3Rpb24uXG4gICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfTtcbiAgfTtcblxuICBmdW5jdGlvbiB2YWx1ZXMoaXRlcmFibGUpIHtcbiAgICBpZiAoaXRlcmFibGUpIHtcbiAgICAgIHZhciBpdGVyYXRvck1ldGhvZCA9IGl0ZXJhYmxlW2l0ZXJhdG9yU3ltYm9sXTtcbiAgICAgIGlmIChpdGVyYXRvck1ldGhvZCkge1xuICAgICAgICByZXR1cm4gaXRlcmF0b3JNZXRob2QuY2FsbChpdGVyYWJsZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaXRlcmFibGUubmV4dCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBpdGVyYWJsZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc05hTihpdGVyYWJsZS5sZW5ndGgpKSB7XG4gICAgICAgIHZhciBpID0gLTEsIG5leHQgPSBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgIHdoaWxlICgrK2kgPCBpdGVyYWJsZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd24uY2FsbChpdGVyYWJsZSwgaSkpIHtcbiAgICAgICAgICAgICAgbmV4dC52YWx1ZSA9IGl0ZXJhYmxlW2ldO1xuICAgICAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbmV4dC52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuXG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIG5leHQubmV4dCA9IG5leHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGFuIGl0ZXJhdG9yIHdpdGggbm8gdmFsdWVzLlxuICAgIHJldHVybiB7IG5leHQ6IGRvbmVSZXN1bHQgfTtcbiAgfVxuICBleHBvcnRzLnZhbHVlcyA9IHZhbHVlcztcblxuICBmdW5jdGlvbiBkb25lUmVzdWx0KCkge1xuICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgfVxuXG4gIENvbnRleHQucHJvdG90eXBlID0ge1xuICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LFxuXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKHNraXBUZW1wUmVzZXQpIHtcbiAgICAgIHRoaXMucHJldiA9IDA7XG4gICAgICB0aGlzLm5leHQgPSAwO1xuICAgICAgLy8gUmVzZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3NcbiAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uXG4gICAgICB0aGlzLnNlbnQgPSB0aGlzLl9zZW50ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgICB0aGlzLmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkO1xuXG4gICAgICB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KTtcblxuICAgICAgaWYgKCFza2lwVGVtcFJlc2V0KSB7XG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gdGhpcykge1xuICAgICAgICAgIC8vIE5vdCBzdXJlIGFib3V0IHRoZSBvcHRpbWFsIG9yZGVyIG9mIHRoZXNlIGNvbmRpdGlvbnM6XG4gICAgICAgICAgaWYgKG5hbWUuY2hhckF0KDApID09PSBcInRcIiAmJlxuICAgICAgICAgICAgICBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJlxuICAgICAgICAgICAgICAhaXNOYU4oK25hbWUuc2xpY2UoMSkpKSB7XG4gICAgICAgICAgICB0aGlzW25hbWVdID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG5cbiAgICAgIHZhciByb290RW50cnkgPSB0aGlzLnRyeUVudHJpZXNbMF07XG4gICAgICB2YXIgcm9vdFJlY29yZCA9IHJvb3RFbnRyeS5jb21wbGV0aW9uO1xuICAgICAgaWYgKHJvb3RSZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJvb3RSZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5ydmFsO1xuICAgIH0sXG5cbiAgICBkaXNwYXRjaEV4Y2VwdGlvbjogZnVuY3Rpb24oZXhjZXB0aW9uKSB7XG4gICAgICBpZiAodGhpcy5kb25lKSB7XG4gICAgICAgIHRocm93IGV4Y2VwdGlvbjtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbnRleHQgPSB0aGlzO1xuICAgICAgZnVuY3Rpb24gaGFuZGxlKGxvYywgY2F1Z2h0KSB7XG4gICAgICAgIHJlY29yZC50eXBlID0gXCJ0aHJvd1wiO1xuICAgICAgICByZWNvcmQuYXJnID0gZXhjZXB0aW9uO1xuICAgICAgICBjb250ZXh0Lm5leHQgPSBsb2M7XG5cbiAgICAgICAgaWYgKGNhdWdodCkge1xuICAgICAgICAgIC8vIElmIHRoZSBkaXNwYXRjaGVkIGV4Y2VwdGlvbiB3YXMgY2F1Z2h0IGJ5IGEgY2F0Y2ggYmxvY2ssXG4gICAgICAgICAgLy8gdGhlbiBsZXQgdGhhdCBjYXRjaCBibG9jayBoYW5kbGUgdGhlIGV4Y2VwdGlvbiBub3JtYWxseS5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICEhIGNhdWdodDtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IFwicm9vdFwiKSB7XG4gICAgICAgICAgLy8gRXhjZXB0aW9uIHRocm93biBvdXRzaWRlIG9mIGFueSB0cnkgYmxvY2sgdGhhdCBjb3VsZCBoYW5kbGVcbiAgICAgICAgICAvLyBpdCwgc28gc2V0IHRoZSBjb21wbGV0aW9uIHZhbHVlIG9mIHRoZSBlbnRpcmUgZnVuY3Rpb24gdG9cbiAgICAgICAgICAvLyB0aHJvdyB0aGUgZXhjZXB0aW9uLlxuICAgICAgICAgIHJldHVybiBoYW5kbGUoXCJlbmRcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldikge1xuICAgICAgICAgIHZhciBoYXNDYXRjaCA9IGhhc093bi5jYWxsKGVudHJ5LCBcImNhdGNoTG9jXCIpO1xuICAgICAgICAgIHZhciBoYXNGaW5hbGx5ID0gaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKTtcblxuICAgICAgICAgIGlmIChoYXNDYXRjaCAmJiBoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzQ2F0Y2gpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYWJydXB0OiBmdW5jdGlvbih0eXBlLCBhcmcpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKSAmJlxuICAgICAgICAgICAgdGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgIHZhciBmaW5hbGx5RW50cnkgPSBlbnRyeTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZmluYWxseUVudHJ5ICYmXG4gICAgICAgICAgKHR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgICB0eXBlID09PSBcImNvbnRpbnVlXCIpICYmXG4gICAgICAgICAgZmluYWxseUVudHJ5LnRyeUxvYyA8PSBhcmcgJiZcbiAgICAgICAgICBhcmcgPD0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgLy8gSWdub3JlIHRoZSBmaW5hbGx5IGVudHJ5IGlmIGNvbnRyb2wgaXMgbm90IGp1bXBpbmcgdG8gYVxuICAgICAgICAvLyBsb2NhdGlvbiBvdXRzaWRlIHRoZSB0cnkvY2F0Y2ggYmxvY2suXG4gICAgICAgIGZpbmFsbHlFbnRyeSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9O1xuICAgICAgcmVjb3JkLnR5cGUgPSB0eXBlO1xuICAgICAgcmVjb3JkLmFyZyA9IGFyZztcblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSkge1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICB0aGlzLm5leHQgPSBmaW5hbGx5RW50cnkuZmluYWxseUxvYztcbiAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmNvbXBsZXRlKHJlY29yZCk7XG4gICAgfSxcblxuICAgIGNvbXBsZXRlOiBmdW5jdGlvbihyZWNvcmQsIGFmdGVyTG9jKSB7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgIHJlY29yZC50eXBlID09PSBcImNvbnRpbnVlXCIpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gcmVjb3JkLmFyZztcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgdGhpcy5ydmFsID0gdGhpcy5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwicmV0dXJuXCI7XG4gICAgICAgIHRoaXMubmV4dCA9IFwiZW5kXCI7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiICYmIGFmdGVyTG9jKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IGFmdGVyTG9jO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9LFxuXG4gICAgZmluaXNoOiBmdW5jdGlvbihmaW5hbGx5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LmZpbmFsbHlMb2MgPT09IGZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB0aGlzLmNvbXBsZXRlKGVudHJ5LmNvbXBsZXRpb24sIGVudHJ5LmFmdGVyTG9jKTtcbiAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBcImNhdGNoXCI6IGZ1bmN0aW9uKHRyeUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IHRyeUxvYykge1xuICAgICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuICAgICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICB2YXIgdGhyb3duID0gcmVjb3JkLmFyZztcbiAgICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhyb3duO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBjb250ZXh0LmNhdGNoIG1ldGhvZCBtdXN0IG9ubHkgYmUgY2FsbGVkIHdpdGggYSBsb2NhdGlvblxuICAgICAgLy8gYXJndW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byBhIGtub3duIGNhdGNoIGJsb2NrLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCBjYXRjaCBhdHRlbXB0XCIpO1xuICAgIH0sXG5cbiAgICBkZWxlZ2F0ZVlpZWxkOiBmdW5jdGlvbihpdGVyYWJsZSwgcmVzdWx0TmFtZSwgbmV4dExvYykge1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IHtcbiAgICAgICAgaXRlcmF0b3I6IHZhbHVlcyhpdGVyYWJsZSksXG4gICAgICAgIHJlc3VsdE5hbWU6IHJlc3VsdE5hbWUsXG4gICAgICAgIG5leHRMb2M6IG5leHRMb2NcbiAgICAgIH07XG5cbiAgICAgIGlmICh0aGlzLm1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IGZvcmdldCB0aGUgbGFzdCBzZW50IHZhbHVlIHNvIHRoYXQgd2UgZG9uJ3RcbiAgICAgICAgLy8gYWNjaWRlbnRhbGx5IHBhc3MgaXQgb24gdG8gdGhlIGRlbGVnYXRlLlxuICAgICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuICB9O1xuXG4gIC8vIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGlzIHNjcmlwdCBpcyBleGVjdXRpbmcgYXMgYSBDb21tb25KUyBtb2R1bGVcbiAgLy8gb3Igbm90LCByZXR1cm4gdGhlIHJ1bnRpbWUgb2JqZWN0IHNvIHRoYXQgd2UgY2FuIGRlY2xhcmUgdGhlIHZhcmlhYmxlXG4gIC8vIHJlZ2VuZXJhdG9yUnVudGltZSBpbiB0aGUgb3V0ZXIgc2NvcGUsIHdoaWNoIGFsbG93cyB0aGlzIG1vZHVsZSB0byBiZVxuICAvLyBpbmplY3RlZCBlYXNpbHkgYnkgYGJpbi9yZWdlbmVyYXRvciAtLWluY2x1ZGUtcnVudGltZSBzY3JpcHQuanNgLlxuICByZXR1cm4gZXhwb3J0cztcblxufShcbiAgLy8gSWYgdGhpcyBzY3JpcHQgaXMgZXhlY3V0aW5nIGFzIGEgQ29tbW9uSlMgbW9kdWxlLCB1c2UgbW9kdWxlLmV4cG9ydHNcbiAgLy8gYXMgdGhlIHJlZ2VuZXJhdG9yUnVudGltZSBuYW1lc3BhY2UuIE90aGVyd2lzZSBjcmVhdGUgYSBuZXcgZW1wdHlcbiAgLy8gb2JqZWN0LiBFaXRoZXIgd2F5LCB0aGUgcmVzdWx0aW5nIG9iamVjdCB3aWxsIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZVxuICAvLyB0aGUgcmVnZW5lcmF0b3JSdW50aW1lIHZhcmlhYmxlIGF0IHRoZSB0b3Agb2YgdGhpcyBmaWxlLlxuICB0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiID8gbW9kdWxlLmV4cG9ydHMgOiB7fVxuKSk7XG5cbnRyeSB7XG4gIHJlZ2VuZXJhdG9yUnVudGltZSA9IHJ1bnRpbWU7XG59IGNhdGNoIChhY2NpZGVudGFsU3RyaWN0TW9kZSkge1xuICAvLyBUaGlzIG1vZHVsZSBzaG91bGQgbm90IGJlIHJ1bm5pbmcgaW4gc3RyaWN0IG1vZGUsIHNvIHRoZSBhYm92ZVxuICAvLyBhc3NpZ25tZW50IHNob3VsZCBhbHdheXMgd29yayB1bmxlc3Mgc29tZXRoaW5nIGlzIG1pc2NvbmZpZ3VyZWQuIEp1c3RcbiAgLy8gaW4gY2FzZSBydW50aW1lLmpzIGFjY2lkZW50YWxseSBydW5zIGluIHN0cmljdCBtb2RlLCB3ZSBjYW4gZXNjYXBlXG4gIC8vIHN0cmljdCBtb2RlIHVzaW5nIGEgZ2xvYmFsIEZ1bmN0aW9uIGNhbGwuIFRoaXMgY291bGQgY29uY2VpdmFibHkgZmFpbFxuICAvLyBpZiBhIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5IGZvcmJpZHMgdXNpbmcgRnVuY3Rpb24sIGJ1dCBpbiB0aGF0IGNhc2VcbiAgLy8gdGhlIHByb3BlciBzb2x1dGlvbiBpcyB0byBmaXggdGhlIGFjY2lkZW50YWwgc3RyaWN0IG1vZGUgcHJvYmxlbS4gSWZcbiAgLy8geW91J3ZlIG1pc2NvbmZpZ3VyZWQgeW91ciBidW5kbGVyIHRvIGZvcmNlIHN0cmljdCBtb2RlIGFuZCBhcHBsaWVkIGFcbiAgLy8gQ1NQIHRvIGZvcmJpZCBGdW5jdGlvbiwgYW5kIHlvdSdyZSBub3Qgd2lsbGluZyB0byBmaXggZWl0aGVyIG9mIHRob3NlXG4gIC8vIHByb2JsZW1zLCBwbGVhc2UgZGV0YWlsIHlvdXIgdW5pcXVlIHByZWRpY2FtZW50IGluIGEgR2l0SHViIGlzc3VlLlxuICBGdW5jdGlvbihcInJcIiwgXCJyZWdlbmVyYXRvclJ1bnRpbWUgPSByXCIpKHJ1bnRpbWUpO1xufVxuIiwiZnVuY3Rpb24gYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBrZXksIGFyZykge1xuICB0cnkge1xuICAgIHZhciBpbmZvID0gZ2VuW2tleV0oYXJnKTtcbiAgICB2YXIgdmFsdWUgPSBpbmZvLnZhbHVlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJlamVjdChlcnJvcik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGluZm8uZG9uZSkge1xuICAgIHJlc29sdmUodmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihfbmV4dCwgX3Rocm93KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcihmbikge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcyxcbiAgICAgICAgYXJncyA9IGFyZ3VtZW50cztcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIGdlbiA9IGZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuXG4gICAgICBmdW5jdGlvbiBfbmV4dCh2YWx1ZSkge1xuICAgICAgICBhc3luY0dlbmVyYXRvclN0ZXAoZ2VuLCByZXNvbHZlLCByZWplY3QsIF9uZXh0LCBfdGhyb3csIFwibmV4dFwiLCB2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIF90aHJvdyhlcnIpIHtcbiAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBcInRocm93XCIsIGVycik7XG4gICAgICB9XG5cbiAgICAgIF9uZXh0KHVuZGVmaW5lZCk7XG4gICAgfSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2FzeW5jVG9HZW5lcmF0b3I7IiwiZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9hcnJheVdpdGhIb2xlczsiLCJmdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB7XG4gIGlmICh0eXBlb2YgU3ltYm9sID09PSBcInVuZGVmaW5lZFwiIHx8ICEoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChhcnIpKSkgcmV0dXJuO1xuICB2YXIgX2FyciA9IFtdO1xuICB2YXIgX24gPSB0cnVlO1xuICB2YXIgX2QgPSBmYWxzZTtcbiAgdmFyIF9lID0gdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgZm9yICh2YXIgX2kgPSBhcnJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfczsgIShfbiA9IChfcyA9IF9pLm5leHQoKSkuZG9uZSk7IF9uID0gdHJ1ZSkge1xuICAgICAgX2Fyci5wdXNoKF9zLnZhbHVlKTtcblxuICAgICAgaWYgKGkgJiYgX2Fyci5sZW5ndGggPT09IGkpIGJyZWFrO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgX2QgPSB0cnVlO1xuICAgIF9lID0gZXJyO1xuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIV9uICYmIF9pW1wicmV0dXJuXCJdICE9IG51bGwpIF9pW1wicmV0dXJuXCJdKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChfZCkgdGhyb3cgX2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIF9hcnI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2l0ZXJhYmxlVG9BcnJheUxpbWl0OyIsImZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7XG4gIGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykge1xuICAgIGFycjJbaV0gPSBhcnJbaV07XG4gIH1cblxuICByZXR1cm4gYXJyMjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfYXJyYXlMaWtlVG9BcnJheTsiLCJ2YXIgYXJyYXlMaWtlVG9BcnJheSA9IHJlcXVpcmUoXCIuL2FycmF5TGlrZVRvQXJyYXlcIik7XG5cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHtcbiAgaWYgKCFvKSByZXR1cm47XG4gIGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbiAgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpO1xuICBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lO1xuICBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTtcbiAgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBhcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5OyIsImZ1bmN0aW9uIF9ub25JdGVyYWJsZVJlc3QoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX25vbkl0ZXJhYmxlUmVzdDsiLCJ2YXIgYXJyYXlXaXRoSG9sZXMgPSByZXF1aXJlKFwiLi9hcnJheVdpdGhIb2xlc1wiKTtcblxudmFyIGl0ZXJhYmxlVG9BcnJheUxpbWl0ID0gcmVxdWlyZShcIi4vaXRlcmFibGVUb0FycmF5TGltaXRcIik7XG5cbnZhciB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSA9IHJlcXVpcmUoXCIuL3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5XCIpO1xuXG52YXIgbm9uSXRlcmFibGVSZXN0ID0gcmVxdWlyZShcIi4vbm9uSXRlcmFibGVSZXN0XCIpO1xuXG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheShhcnIsIGkpIHtcbiAgcmV0dXJuIGFycmF5V2l0aEhvbGVzKGFycikgfHwgaXRlcmFibGVUb0FycmF5TGltaXQoYXJyLCBpKSB8fCB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIsIGkpIHx8IG5vbkl0ZXJhYmxlUmVzdCgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9zbGljZWRUb0FycmF5OyIsImZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2NsYXNzQ2FsbENoZWNrOyIsImZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfY3JlYXRlQ2xhc3M7IiwiZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5IGluIG9iaikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2RlZmluZVByb3BlcnR5OyIsImZ1bmN0aW9uIGUoZSxyLHQsbixhLGksbyl7dHJ5e3ZhciB1PWVbaV0obyksYz11LnZhbHVlfWNhdGNoKGUpe3JldHVybiB2b2lkIHQoZSl9dS5kb25lP3IoYyk6UHJvbWlzZS5yZXNvbHZlKGMpLnRoZW4obixhKX1mdW5jdGlvbiByKHIpe3JldHVybiBmdW5jdGlvbigpe3ZhciB0PXRoaXMsbj1hcmd1bWVudHM7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihhLGkpe3ZhciBvPXIuYXBwbHkodCxuKTtmdW5jdGlvbiB1KHIpe2UobyxhLGksdSxjLFwibmV4dFwiLHIpfWZ1bmN0aW9uIGMocil7ZShvLGEsaSx1LGMsXCJ0aHJvd1wiLHIpfXUodm9pZCAwKX0pKX19ZnVuY3Rpb24gdChlLHIpe3JldHVybiBmdW5jdGlvbihlKXtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBlfShlKXx8ZnVuY3Rpb24oZSxyKXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgU3ltYm9sfHwhKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoZSkpKXJldHVybjt2YXIgdD1bXSxuPSEwLGE9ITEsaT12b2lkIDA7dHJ5e2Zvcih2YXIgbyx1PWVbU3ltYm9sLml0ZXJhdG9yXSgpOyEobj0obz11Lm5leHQoKSkuZG9uZSkmJih0LnB1c2goby52YWx1ZSksIXJ8fHQubGVuZ3RoIT09cik7bj0hMCk7fWNhdGNoKGUpe2E9ITAsaT1lfWZpbmFsbHl7dHJ5e258fG51bGw9PXUucmV0dXJufHx1LnJldHVybigpfWZpbmFsbHl7aWYoYSl0aHJvdyBpfX1yZXR1cm4gdH0oZSxyKXx8ZnVuY3Rpb24oZSxyKXtpZighZSlyZXR1cm47aWYoXCJzdHJpbmdcIj09dHlwZW9mIGUpcmV0dXJuIG4oZSxyKTt2YXIgdD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkuc2xpY2UoOCwtMSk7XCJPYmplY3RcIj09PXQmJmUuY29uc3RydWN0b3ImJih0PWUuY29uc3RydWN0b3IubmFtZSk7aWYoXCJNYXBcIj09PXR8fFwiU2V0XCI9PT10KXJldHVybiBBcnJheS5mcm9tKGUpO2lmKFwiQXJndW1lbnRzXCI9PT10fHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdCh0KSlyZXR1cm4gbihlLHIpfShlLHIpfHxmdW5jdGlvbigpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIil9KCl9ZnVuY3Rpb24gbihlLHIpeyhudWxsPT1yfHxyPmUubGVuZ3RoKSYmKHI9ZS5sZW5ndGgpO2Zvcih2YXIgdD0wLG49bmV3IEFycmF5KHIpO3Q8cjt0Kyspblt0XT1lW3RdO3JldHVybiBufXZhciBhPWZ1bmN0aW9uKCl7dmFyIGU9cihyZWdlbmVyYXRvclJ1bnRpbWUubWFyaygoZnVuY3Rpb24gZSh0KXtyZXR1cm4gcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOnJldHVybiBlLmFicnVwdChcInJldHVyblwiLG5ldyBQcm9taXNlKGZ1bmN0aW9uKCl7dmFyIGU9cihyZWdlbmVyYXRvclJ1bnRpbWUubWFyaygoZnVuY3Rpb24gZShyLG4pe3ZhciBhLG87cmV0dXJuIHJlZ2VuZXJhdG9yUnVudGltZS53cmFwKChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDppZihuYXZpZ2F0b3IucGVybWlzc2lvbnMpe2UubmV4dD00O2JyZWFrfW4obmV3IERPTUV4Y2VwdGlvbihcIlBlcm1pc3Npb25zIG5vdCBzdXBwb3J0ZWRcIixcIk5PVF9TVVBQT1JURURfRVJSXCIpKSxlLm5leHQ9MTY7YnJlYWs7Y2FzZSA0OnJldHVybiBlLnByZXY9NCxlLm5leHQ9NyxuYXZpZ2F0b3IucGVybWlzc2lvbnMucXVlcnkoe25hbWU6dH0pO2Nhc2UgNzphPWUuc2VudCxvPWZ1bmN0aW9uIGUodCl7YS5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsZSksaSh0LnRhcmdldC5zdGF0ZSxyLG4pfSxhLmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIixvKSxpKGEuc3RhdGUscixuKSxlLm5leHQ9MTY7YnJlYWs7Y2FzZSAxMzplLnByZXY9MTMsZS50MD1lLmNhdGNoKDQpLG4oZS50MCk7Y2FzZSAxNjpjYXNlXCJlbmRcIjpyZXR1cm4gZS5zdG9wKCl9fSksZSxudWxsLFtbNCwxM11dKX0pKSk7cmV0dXJuIGZ1bmN0aW9uKHIsdCl7cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0oKSkpO2Nhc2UgMTpjYXNlXCJlbmRcIjpyZXR1cm4gZS5zdG9wKCl9fSksZSl9KSkpO3JldHVybiBmdW5jdGlvbihyKXtyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSgpLGk9ZnVuY3Rpb24oZSxyLHQpe3N3aXRjaChlKXtjYXNlXCJkZW5pZWRcIjp0KG5ldyBET01FeGNlcHRpb24oXCJQZXJtaXNzaW9uIGRlbmllZFwiLFwiTk9UX0FMTE9XRURfRVJSXCIpKTticmVhaztkZWZhdWx0OnIoZSl9fSxvPWZ1bmN0aW9uKCl7dmFyIGU9cihyZWdlbmVyYXRvclJ1bnRpbWUubWFyaygoZnVuY3Rpb24gZShuLGkpe3JldHVybiByZWdlbmVyYXRvclJ1bnRpbWUud3JhcCgoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6cmV0dXJuIGUuYWJydXB0KFwicmV0dXJuXCIsbmV3IFByb21pc2UoZnVuY3Rpb24oKXt2YXIgZT1yKHJlZ2VuZXJhdG9yUnVudGltZS5tYXJrKChmdW5jdGlvbiBlKHIsbyl7dmFyIHUsYyxzO3JldHVybiByZWdlbmVyYXRvclJ1bnRpbWUud3JhcCgoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6aWYobmF2aWdhdG9yLm1lZGlhRGV2aWNlcyl7ZS5uZXh0PTQ7YnJlYWt9byhuZXcgRE9NRXhjZXB0aW9uKFwiTWVkaWFEZXZpY2VzIG5vdCBzdXBwb3J0ZWRcIixcIk5PVF9GT1VORF9FUlJcIikpLGUubmV4dD0yNDticmVhaztjYXNlIDQ6cmV0dXJuIGUucHJldj00LGUudDA9UHJvbWlzZSxlLm5leHQ9OCxhKG4pO2Nhc2UgODpyZXR1cm4gZS50MT1lLnNlbnQsZS5uZXh0PTExLG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKGkpO2Nhc2UgMTE6cmV0dXJuIGUudDI9ZS5zZW50LGUudDM9W2UudDEsZS50Ml0sZS5uZXh0PTE1LGUudDAuYWxsLmNhbGwoZS50MCxlLnQzKTtjYXNlIDE1OnU9ZS5zZW50LGM9dCh1LDIpLHM9Y1sxXSxyKHMpLGUubmV4dD0yNDticmVhaztjYXNlIDIxOmUucHJldj0yMSxlLnQ0PWUuY2F0Y2goNCksbyhlLnQ0KTtjYXNlIDI0OmNhc2VcImVuZFwiOnJldHVybiBlLnN0b3AoKX19KSxlLG51bGwsW1s0LDIxXV0pfSkpKTtyZXR1cm4gZnVuY3Rpb24ocix0KXtyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSgpKSk7Y2FzZSAxOmNhc2VcImVuZFwiOnJldHVybiBlLnN0b3AoKX19KSxlKX0pKSk7cmV0dXJuIGZ1bmN0aW9uKHIsdCl7cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0oKTtleHBvcnR7YSBhcyBnZXRQZXJtaXNzaW9uLG8gYXMgZ2V0VXNlck1lZGlhU3RyZWFtfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKbWFXeGxJam9pYVc1a1pYZ3VaWE11YW5NaUxDSnpiM1Z5WTJWeklqcGJJaTR1TDNOeVl5OW5aWFJRWlhKdGFYTnphVzl1TG1weklpd2lMaTR2YzNKakwyZGxkRlZ6WlhKTlpXUnBZVk4wY21WaGJTNXFjeUpkTENKemIzVnlZMlZ6UTI5dWRHVnVkQ0k2V3lJdktpcGNiaUFxSUZKbGRIVnlibk1nWVNCd2NtOXRhWE5sSUhKbGMyOXNkbVZrSUhkb1pXNGdkR2hsSUhCbGNtMXBjM05wYjI0Z2FYTWdaM0poYm5SbFpDQmllU0IwYUdVZ2RYTmxjbHh1SUNvZ1FIQmhjbUZ0SUhCbGNtMXBjM05wYjI1T1lXMWxJQ0FnSUNBZ0lDQWdJQ0FnVG1GdFpTQnZaaUIwYUdVZ2NHVnliV2x6YzJsdmJpNGdRSE5sWlNCb2RIUndjem92TDNjell5NW5hWFJvZFdJdWFXOHZjR1Z5YldsemMybHZibk12STJWdWRXMWtaV1l0Y0dWeWJXbHpjMmx2Ym01aGJXVmNiaUFxSUVCeVpYUjFjbTV6SUh0UWNtOXRhWE5sZlZ4dUlDb3ZYRzVsZUhCdmNuUWdaR1ZtWVhWc2RDQmhjM2x1WXlBb2NHVnliV2x6YzJsdmJrNWhiV1VwSUQwK0lIdGNibHgwY21WMGRYSnVJRzVsZHlCUWNtOXRhWE5sS0dGemVXNWpJQ2h5WlhOdmJIWmxMQ0J5WldwbFkzUXBJRDArSUh0Y2JseDBYSFJwWmlBb0lXNWhkbWxuWVhSdmNpNXdaWEp0YVhOemFXOXVjeWtnZTF4dVhIUmNkRngwY21WcVpXTjBLRzVsZHlCRVQwMUZlR05sY0hScGIyNG9KMUJsY20xcGMzTnBiMjV6SUc1dmRDQnpkWEJ3YjNKMFpXUW5MQ0FuVGs5VVgxTlZVRkJQVWxSRlJGOUZVbEluS1NsY2JseDBYSFI5SUdWc2MyVWdlMXh1WEhSY2RGeDBkSEo1SUh0Y2JseDBYSFJjZEZ4MFkyOXVjM1FnY0dWeWJXbHpjMmx2YmxOMFlYUjFjeUE5SUdGM1lXbDBJRzVoZG1sbllYUnZjaTV3WlhKdGFYTnphVzl1Y3k1eGRXVnllU2g3SUc1aGJXVTZJSEJsY20xcGMzTnBiMjVPWVcxbElIMHBYRzVjZEZ4MFhIUmNkR052Ym5OMElHOXVRMmhoYm1kbElEMGdLR1YyWlc1MEtTQTlQaUI3WEc1Y2RGeDBYSFJjZEZ4MGNHVnliV2x6YzJsdmJsTjBZWFIxY3k1eVpXMXZkbVZGZG1WdWRFeHBjM1JsYm1WeUtDZGphR0Z1WjJVbkxDQnZia05vWVc1blpTbGNibHgwWEhSY2RGeDBYSFJ5WlhOdmJIWmxUM0pTWldwbFkzUkNZWE5sWkU5dVUzUmhkR1VvWlhabGJuUXVkR0Z5WjJWMExuTjBZWFJsTENCeVpYTnZiSFpsTENCeVpXcGxZM1FwWEc1Y2RGeDBYSFJjZEgxY2JseDBYSFJjZEZ4MGNHVnliV2x6YzJsdmJsTjBZWFIxY3k1aFpHUkZkbVZ1ZEV4cGMzUmxibVZ5S0NkamFHRnVaMlVuTENCdmJrTm9ZVzVuWlNsY2JseDBYSFJjZEZ4MGNtVnpiMngyWlU5eVVtVnFaV04wUW1GelpXUlBibE4wWVhSbEtIQmxjbTFwYzNOcGIyNVRkR0YwZFhNdWMzUmhkR1VzSUhKbGMyOXNkbVVzSUhKbGFtVmpkQ2xjYmx4MFhIUmNkSDBnWTJGMFkyZ2dLR1Z5Y205eUtTQjdYRzVjZEZ4MFhIUmNkSEpsYW1WamRDaGxjbkp2Y2lsY2JseDBYSFJjZEgxY2JseDBYSFI5WEc1Y2RIMHBYRzU5WEc1Y2JtTnZibk4wSUhKbGMyOXNkbVZQY2xKbGFtVmpkRUpoYzJWa1QyNVRkR0YwWlNBOUlDaHpkR0YwWlN3Z2NtVnpiMngyWlN3Z2NtVnFaV04wS1NBOVBpQjdYRzVjZEhOM2FYUmphQ0FvYzNSaGRHVXBJSHRjYmx4MFhIUmpZWE5sSUNka1pXNXBaV1FuT2x4dVhIUmNkRngwY21WcVpXTjBLRzVsZHlCRVQwMUZlR05sY0hScGIyNG9KMUJsY20xcGMzTnBiMjRnWkdWdWFXVmtKeXdnSjA1UFZGOUJURXhQVjBWRVgwVlNVaWNwS1Z4dVhIUmNkRngwWW5KbFlXdGNibHgwWEhSa1pXWmhkV3gwT2x4dVhIUmNkRngwY21WemIyeDJaU2h6ZEdGMFpTbGNibHgwZlZ4dWZWeHVJaXdpYVcxd2IzSjBJR2RsZEZCbGNtMXBjM05wYjI0Z1puSnZiU0FuTGk5blpYUlFaWEp0YVhOemFXOXVKMXh1WEc0dktpcGNiaUFxSUZKbGRIVnlibk1nWVNCd2NtOXRhWE5sSUhKbGMyOXNkbVZrSUhkb1pXNGdkR2hsSUhCbGNtMXBjM05wYjI0Z2FYTWdaM0poYm5SbFpDQmllU0IwYUdVZ2RYTmxjaUJoYm1RZ2RHaGxJSE4wY21WaGJTQnBjeUJ5WlhSeWFXVjJaV1JjYmlBcUlFQndZWEpoYlNCd1pYSnRhWE56YVc5dVRtRnRaU0FnSUNBZ0lDQWdJQ0FnSUU1aGJXVWdiMllnZEdobElIQmxjbTFwYzNOcGIyNHVJRUJ6WldVZ2FIUjBjSE02THk5M00yTXVaMmwwYUhWaUxtbHZMM0JsY20xcGMzTnBiMjV6THlObGJuVnRaR1ZtTFhCbGNtMXBjM05wYjI1dVlXMWxYRzRnS2lCQWNHRnlZVzBnYldWa2FXRlRkSEpsWVcxRGIyNXpkSEpoYVc1MGN5QWdJQ0JEYjI1emRISmhhVzUwY3lCdlltcGxZM1F1SUVCelpXVWdhSFIwY0hNNkx5OWtaWFpsYkc5d1pYSXViVzk2YVd4c1lTNXZjbWN2Wlc0dFZWTXZaRzlqY3k5WFpXSXZRVkJKTDAxbFpHbGhVM1J5WldGdFEyOXVjM1J5WVdsdWRITmNiaUFxSUVCeVpYUjFjbTV6SUh0UWNtOXRhWE5sZlZ4dUlDb3ZYRzVsZUhCdmNuUWdaR1ZtWVhWc2RDQmhjM2x1WXlBb2NHVnliV2x6YzJsdmJrNWhiV1VzSUcxbFpHbGhVM1J5WldGdFEyOXVjM1J5WVdsdWRITXBJRDArSUh0Y2JseDBjbVYwZFhKdUlHNWxkeUJRY205dGFYTmxLR0Z6ZVc1aklDaHlaWE52YkhabExDQnlaV3BsWTNRcElEMCtJSHRjYmx4MFhIUnBaaUFvSVc1aGRtbG5ZWFJ2Y2k1dFpXUnBZVVJsZG1salpYTXBJSHRjYmx4MFhIUmNkSEpsYW1WamRDaHVaWGNnUkU5TlJYaGpaWEIwYVc5dUtDZE5aV1JwWVVSbGRtbGpaWE1nYm05MElITjFjSEJ2Y25SbFpDY3NJQ2RPVDFSZlJrOVZUa1JmUlZKU0p5a3BYRzVjZEZ4MGZTQmxiSE5sSUh0Y2JseDBYSFJjZEhSeWVTQjdYRzVjZEZ4MFhIUmNkR052Ym5OMElGc3NJSE4wY21WaGJWMGdQU0JoZDJGcGRDQlFjbTl0YVhObExtRnNiQ2hiWEc1Y2RGeDBYSFJjZEZ4MFlYZGhhWFFnWjJWMFVHVnliV2x6YzJsdmJpaHdaWEp0YVhOemFXOXVUbUZ0WlNrc1hHNWNkRngwWEhSY2RGeDBZWGRoYVhRZ2JtRjJhV2RoZEc5eUxtMWxaR2xoUkdWMmFXTmxjeTVuWlhSVmMyVnlUV1ZrYVdFb2JXVmthV0ZUZEhKbFlXMURiMjV6ZEhKaGFXNTBjeWtzWEc1Y2RGeDBYSFJjZEYwcFhHNWNkRngwWEhSY2RISmxjMjlzZG1Vb2MzUnlaV0Z0S1Z4dVhIUmNkRngwZlNCallYUmphQ0FvWlhKeWIzSXBJSHRjYmx4MFhIUmNkRngwY21WcVpXTjBLR1Z5Y205eUtWeHVYSFJjZEZ4MGZWeHVYSFJjZEgxY2JseDBmU2xjYm4xY2JpSmRMQ0p1WVcxbGN5STZXeUp3WlhKdGFYTnphVzl1VG1GdFpTSXNJbEJ5YjIxcGMyVWlMQ0p5WlhOdmJIWmxJaXdpY21WcVpXTjBJaXdpYm1GMmFXZGhkRzl5SWl3aWNHVnliV2x6YzJsdmJuTWlMQ0pFVDAxRmVHTmxjSFJwYjI0aUxDSnhkV1Z5ZVNJc0ltNWhiV1VpTENKd1pYSnRhWE56YVc5dVUzUmhkSFZ6SWl3aWIyNURhR0Z1WjJVaUxDSmxkbVZ1ZENJc0luSmxiVzkyWlVWMlpXNTBUR2x6ZEdWdVpYSWlMQ0p5WlhOdmJIWmxUM0pTWldwbFkzUkNZWE5sWkU5dVUzUmhkR1VpTENKMFlYSm5aWFFpTENKemRHRjBaU0lzSW1Ga1pFVjJaVzUwVEdsemRHVnVaWElpTENKdFpXUnBZVk4wY21WaGJVTnZibk4wY21GcGJuUnpJaXdpYldWa2FXRkVaWFpwWTJWeklpd2laMlYwVUdWeWJXbHpjMmx2YmlJc0ltZGxkRlZ6WlhKTlpXUnBZU0lzSW1Gc2JDSXNJbk4wY21WaGJTSmRMQ0p0WVhCd2FXNW5jeUk2SW0xM1EwRkxRU3hyUkVGQlpTeFhRVUZQUVN3MFIwRkRaQ3hKUVVGSlF5eHZSRUZCVVN4WFFVRlBReXhGUVVGVFF5dzRSa0ZETjBKRExGVkJRVlZETERSQ1FVTmtSaXhGUVVGUExFbEJRVWxITEdGQlFXRXNORUpCUVRaQ0xITkZRVWR5UWtZc1ZVRkJWVU1zV1VGQldVVXNUVUZCVFN4RFFVRkZReXhMUVVGTlVpeFhRVUUzUkZNc1UwRkRRVU1zUlVGQlZ5eFRRVUZZUVN4RlFVRlpReXhIUVVOcVFrWXNSVUZCYVVKSExHOUNRVUZ2UWl4VFFVRlZSaXhIUVVNdlEwY3NSVUZCTkVKR0xFVkJRVTFITEU5QlFVOURMRTFCUVU5aUxFVkJRVk5ETEVsQlJURkVUU3hGUVVGcFFrOHNhVUpCUVdsQ0xGTkJRVlZPTEVkQlF6VkRSeXhGUVVFMFFrb3NSVUZCYVVKTkxFMUJRVTlpTEVWQlFWTkRMSEZFUVVVM1JFRXNOazVCVFVWVkxFVkJRVGhDTEZOQlFVTkZMRVZCUVU5aUxFVkJRVk5ETEZWQlF6VkRXU3hQUVVOR0xGTkJRMHBhTEVWQlFVOHNTVUZCU1Vjc1lVRkJZU3h2UWtGQmNVSXNhME5CUnpkRFNpeEZRVUZSWVN4dFJFTjJRa2tzVjBGQlQyWXNSVUZCWjBKcFFpdzBSMEZET1VJc1NVRkJTV2hDTEc5RVFVRlJMRmRCUVU5RExFVkJRVk5ETEdkSFFVTTNRa01zVlVGQlZXTXNOa0pCUTJSbUxFVkJRVThzU1VGQlNVY3NZVUZCWVN3MlFrRkJPRUlzT0VSQlJ6VkNUQ3hwUWtGRGJFSnJRaXhGUVVGamJrSXNkVU5CUTJSSkxGVkJRVlZqTEdGQlFXRkZMR0ZCUVdGSUxEaEVRVVpXU1N3NFEwRkJlRUpETEU5QlNWUndRaXhGUVVGUmIwSXNjVVJCUlZKdVFpSjlcbiIsImltcG9ydCB7IGdldFVzZXJNZWRpYVN0cmVhbSB9IGZyb20gJ0B1bnRlbXBzL3VzZXItcGVybWlzc2lvbnMtdXRpbHMnXG5cbmNsYXNzIFZvY2FsIHtcblx0c3RhdGljIGRlZmF1bHRPcHRpb25zID0ge1xuXHRcdGdyYW1tYXJzOiBudWxsLFxuXHRcdGxhbmc6ICdlbi1VUycsXG5cdFx0Y29udGludW91czogZmFsc2UsXG5cdFx0aW50ZXJpbVJlc3VsdHM6IGZhbHNlLFxuXHRcdG1heEFsdGVybmF0aXZlczogMSxcblx0XHRzZXJ2aWNlVVJJOiBudWxsLFxuXHR9XG5cblx0c3RhdGljIGV2ZW50VHlwZXMgPSB7XG5cdFx0QVVESU9fRU5EOiAnYXVkaW9lbmQnLFxuXHRcdEFVRElPX1NUQVJUOiAnYXVkaW9zdGFydCcsXG5cdFx0RU5EOiAnZW5kJyxcblx0XHRFUlJPUjogJ2Vycm9yJyxcblx0XHROT19NQVRDSDogJ25vbWF0Y2gnLFxuXHRcdFJFU1VMVDogJ3Jlc3VsdCcsXG5cdFx0U09VTkRfRU5EOiAnc291bmRlbmQnLFxuXHRcdFNPVU5EX1NUQVJUOiAnc291bmRzdGFydCcsXG5cdFx0U1BFRUNIX0VORDogJ3NwZWVjaGVuZCcsXG5cdFx0U1BFRUNIX1NUQVJUOiAnc3BlZWNoc3RhcnQnLFxuXHRcdFNUQVJUOiAnc3RhcnQnLFxuXHR9XG5cblx0c3RhdGljIGdldCBpc1N1cHBvcnRlZCgpIHtcblx0XHRyZXR1cm4gISFWb2NhbC5fcmVzb2x2ZVNwZWVjaFJlY29nbml0aW9uKClcblx0fVxuXG5cdHN0YXRpYyBzZXQgaXNTdXBwb3J0ZWQoXykge1xuXHRcdHRocm93IG5ldyBFcnJvcignWW91IGNhbm5vdCBzZXQgaXNTdXBwb3J0ZWQgZGlyZWN0bHkuJylcblx0fVxuXG5cdF9pbnN0YW5jZSA9IG51bGxcblx0X2xpc3RlbmVycyA9IG51bGxcblxuXHRjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG5cdFx0Y29uc3QgU3BlZWNoUmVjb2duaXRpb24gPSBWb2NhbC5fcmVzb2x2ZVNwZWVjaFJlY29nbml0aW9uKClcblx0XHRpZiAoIVNwZWVjaFJlY29nbml0aW9uKSB7XG5cdFx0XHR0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCdTcGVlY2hSZWNvZ25pdGlvbiBub3Qgc3VwcG9ydGVkJywgJ05PVF9TVVBQT1JURURfRVJSJylcblx0XHR9XG5cblx0XHR0aGlzLl9pbnN0YW5jZSA9IG5ldyBTcGVlY2hSZWNvZ25pdGlvbigpXG5cdFx0dGhpcy5fbGlzdGVuZXJzID0ge31cblxuXHRcdE9iamVjdC5lbnRyaWVzKHtcblx0XHRcdC4uLlZvY2FsLmRlZmF1bHRPcHRpb25zLFxuXHRcdFx0Li4uKG9wdGlvbnMgfHwge30pLFxuXHRcdH0pLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuXHRcdFx0aWYgKGtleSA9PT0gJ2dyYW1tYXJzJyAmJiAhdmFsdWUpIHtcblx0XHRcdFx0Y29uc3QgU3BlZWNoR3JhbW1hckxpc3QgPSBWb2NhbC5fcmVzb2x2ZVNwZWVjaEdyYW1tYXJMaXN0KClcblx0XHRcdFx0aWYgKCEhU3BlZWNoR3JhbW1hckxpc3QpIHtcblx0XHRcdFx0XHR2YWx1ZSA9IG5ldyBTcGVlY2hHcmFtbWFyTGlzdCgpXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHRoaXMuX2luc3RhbmNlW2tleV0gPSB2YWx1ZVxuXHRcdH0pXG5cdH1cblxuXHRnZXQgaW5zdGFuY2UoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX2luc3RhbmNlXG5cdH1cblxuXHRzZXQgaW5zdGFuY2UoXykge1xuXHRcdHRocm93IG5ldyBFcnJvcignWW91IGNhbm5vdCBzZXQgaW5zdGFuY2UgZGlyZWN0bHkuJylcblx0fVxuXG5cdGFzeW5jIHN0YXJ0KCkge1xuXHRcdGlmICghIXRoaXMuX2luc3RhbmNlKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCBzdHJlYW0gPSBhd2FpdCBnZXRVc2VyTWVkaWFTdHJlYW0oJ21pY3JvcGhvbmUnLCB7IGF1ZGlvOiB0cnVlIH0pXG5cdFx0XHRcdGlmICghc3RyZWFtKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gcmV0cmlldmUgdGhlIHN0cmVhbSBmcm9tIG1lZGlhIGRldmljZScpXG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5faW5zdGFuY2Uuc3RhcnQoKVxuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0Y29uc3QgZXJyb3JIYW5kbGVyID0gdGhpcy5fbGlzdGVuZXJzLmVycm9yXG5cdFx0XHRcdGlmICghIWVycm9ySGFuZGxlcikge1xuXHRcdFx0XHRcdGVycm9ySGFuZGxlcihlcnJvcilcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzXG5cdH1cblxuXHRzdG9wKCkge1xuXHRcdGlmICghIXRoaXMuX2luc3RhbmNlKSB7XG5cdFx0XHR0aGlzLl9pbnN0YW5jZS5zdG9wKClcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpc1xuXHR9XG5cblx0YWJvcnQoKSB7XG5cdFx0aWYgKCEhdGhpcy5faW5zdGFuY2UpIHtcblx0XHRcdHRoaXMuX2luc3RhbmNlLmFib3J0KClcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpc1xuXHR9XG5cblx0YWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGNhbGxiYWNrKSB7XG5cdFx0aWYgKCEhdGhpcy5faW5zdGFuY2UgJiYgdGhpcy5faW5jbHVkZXNFdmVudFR5cGUoZXZlbnRUeXBlKSkge1xuXHRcdFx0aWYgKCEhdGhpcy5fbGlzdGVuZXJzW2V2ZW50VHlwZV0pIHtcblx0XHRcdFx0dGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSlcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgaGFuZGxlciA9IChldmVudCkgPT4ge1xuXHRcdFx0XHRsZXQgYWRkaXRpb25hbEFyZ3MgPSBbXVxuXHRcdFx0XHRpZiAoZXZlbnRUeXBlID09PSBWb2NhbC5ldmVudFR5cGVzLlJFU1VMVCkge1xuXHRcdFx0XHRcdGlmICghIWV2ZW50LnJlc3VsdHMgJiYgZXZlbnQucmVzdWx0cy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRhZGRpdGlvbmFsQXJncy5wdXNoKGV2ZW50LnJlc3VsdHNbMF1bMF0udHJhbnNjcmlwdClcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQhIWNhbGxiYWNrICYmIGNhbGxiYWNrLmFwcGx5KHRoaXMsIFtldmVudCwgLi4uYWRkaXRpb25hbEFyZ3NdKVxuXHRcdFx0fVxuXHRcdFx0dGhpcy5faW5zdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGhhbmRsZXIpXG5cblx0XHRcdHRoaXMuX2xpc3RlbmVyc1tldmVudFR5cGVdID0gaGFuZGxlclxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzXG5cdH1cblxuXHRyZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSkge1xuXHRcdGNvbnN0IGhhbmRsZXIgPSB0aGlzLl9saXN0ZW5lcnNbZXZlbnRUeXBlXVxuXHRcdHRoaXMuX2luc3RhbmNlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBoYW5kbGVyKVxuXG5cdFx0ZGVsZXRlIHRoaXMuX2xpc3RlbmVyc1tldmVudFR5cGVdXG5cblx0XHRyZXR1cm4gdGhpc1xuXHR9XG5cblx0Y2xlYW51cCgpIHtcblx0XHR0aGlzLnN0b3AoKVxuXG5cdFx0T2JqZWN0LmtleXModGhpcy5fbGlzdGVuZXJzKS5mb3JFYWNoKChrZXkpID0+IHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihrZXkpKVxuXHRcdHRoaXMuX2luc3RhbmNlID0gbnVsbFxuXG5cdFx0cmV0dXJuIHRoaXNcblx0fVxuXG5cdF9pbmNsdWRlc0V2ZW50VHlwZShldmVudFR5cGUpIHtcblx0XHRyZXR1cm4gISFPYmplY3QudmFsdWVzKFZvY2FsLmV2ZW50VHlwZXMpLmZpbmQoKHR5cGUpID0+IHR5cGUgPT09IGV2ZW50VHlwZSlcblx0fVxuXG5cdHN0YXRpYyBfcmVzb2x2ZVNwZWVjaFJlY29nbml0aW9uKCkge1xuXHRcdHJldHVybiAoXG5cdFx0XHR3aW5kb3cuU3BlZWNoUmVjb2duaXRpb24gfHxcblx0XHRcdHdpbmRvdy53ZWJraXRTcGVlY2hSZWNvZ25pdGlvbiB8fFxuXHRcdFx0d2luZG93Lm1velNwZWVjaFJlY29nbml0aW9uIHx8XG5cdFx0XHR3aW5kb3cubXNTcGVlY2hSZWNvZ25pdGlvblxuXHRcdClcblx0fVxuXG5cdHN0YXRpYyBfcmVzb2x2ZVNwZWVjaEdyYW1tYXJMaXN0KCkge1xuXHRcdHJldHVybiAoXG5cdFx0XHR3aW5kb3cuU3BlZWNoR3JhbW1hckxpc3QgfHxcblx0XHRcdHdpbmRvdy53ZWJraXRTcGVlY2hHcmFtbWFyTGlzdCB8fFxuXHRcdFx0d2luZG93Lm1velNwZWVjaEdyYW1tYXJMaXN0IHx8XG5cdFx0XHR3aW5kb3cubXNTcGVlY2hHcmFtbWFyTGlzdFxuXHRcdClcblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBWb2NhbFxuIl0sIm5hbWVzIjpbInJ1bnRpbWUiLCJleHBvcnRzIiwiT3AiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJoYXNPd24iLCJoYXNPd25Qcm9wZXJ0eSIsIiRTeW1ib2wiLCJTeW1ib2wiLCJpdGVyYXRvclN5bWJvbCIsIml0ZXJhdG9yIiwiYXN5bmNJdGVyYXRvclN5bWJvbCIsImFzeW5jSXRlcmF0b3IiLCJ0b1N0cmluZ1RhZ1N5bWJvbCIsInRvU3RyaW5nVGFnIiwiZGVmaW5lIiwib2JqIiwia2V5IiwidmFsdWUiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsImVyciIsIndyYXAiLCJpbm5lckZuIiwib3V0ZXJGbiIsInNlbGYiLCJ0cnlMb2NzTGlzdCIsInByb3RvR2VuZXJhdG9yIiwiR2VuZXJhdG9yIiwiZ2VuZXJhdG9yIiwiY3JlYXRlIiwiY29udGV4dCIsIkNvbnRleHQiLCJfaW52b2tlIiwic3RhdGUiLCJtZXRob2QiLCJhcmciLCJFcnJvciIsImRvbmVSZXN1bHQiLCJkZWxlZ2F0ZSIsImRlbGVnYXRlUmVzdWx0IiwibWF5YmVJbnZva2VEZWxlZ2F0ZSIsIkNvbnRpbnVlU2VudGluZWwiLCJzZW50IiwiX3NlbnQiLCJkaXNwYXRjaEV4Y2VwdGlvbiIsImFicnVwdCIsInJlY29yZCIsInRyeUNhdGNoIiwidHlwZSIsImRvbmUiLCJtYWtlSW52b2tlTWV0aG9kIiwiZm4iLCJjYWxsIiwiR2VuZXJhdG9yRnVuY3Rpb24iLCJHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSIsIkl0ZXJhdG9yUHJvdG90eXBlIiwidGhpcyIsImdldFByb3RvIiwiZ2V0UHJvdG90eXBlT2YiLCJOYXRpdmVJdGVyYXRvclByb3RvdHlwZSIsInZhbHVlcyIsIkdwIiwiZGVmaW5lSXRlcmF0b3JNZXRob2RzIiwiZm9yRWFjaCIsIkFzeW5jSXRlcmF0b3IiLCJQcm9taXNlSW1wbCIsInByZXZpb3VzUHJvbWlzZSIsImNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnIiwicmVzb2x2ZSIsInJlamVjdCIsImludm9rZSIsInJlc3VsdCIsIl9fYXdhaXQiLCJ0aGVuIiwidW53cmFwcGVkIiwiZXJyb3IiLCJ1bmRlZmluZWQiLCJUeXBlRXJyb3IiLCJpbmZvIiwicmVzdWx0TmFtZSIsIm5leHQiLCJuZXh0TG9jIiwicHVzaFRyeUVudHJ5IiwibG9jcyIsImVudHJ5IiwidHJ5TG9jIiwiY2F0Y2hMb2MiLCJmaW5hbGx5TG9jIiwiYWZ0ZXJMb2MiLCJ0cnlFbnRyaWVzIiwicHVzaCIsInJlc2V0VHJ5RW50cnkiLCJjb21wbGV0aW9uIiwicmVzZXQiLCJpdGVyYWJsZSIsIml0ZXJhdG9yTWV0aG9kIiwiaXNOYU4iLCJsZW5ndGgiLCJpIiwiY29uc3RydWN0b3IiLCJkaXNwbGF5TmFtZSIsImlzR2VuZXJhdG9yRnVuY3Rpb24iLCJnZW5GdW4iLCJjdG9yIiwibmFtZSIsIm1hcmsiLCJzZXRQcm90b3R5cGVPZiIsIl9fcHJvdG9fXyIsImF3cmFwIiwiYXN5bmMiLCJQcm9taXNlIiwiaXRlciIsInRvU3RyaW5nIiwia2V5cyIsIm9iamVjdCIsInJldmVyc2UiLCJwb3AiLCJza2lwVGVtcFJlc2V0IiwicHJldiIsImNoYXJBdCIsInNsaWNlIiwic3RvcCIsInJvb3RSZWNvcmQiLCJydmFsIiwiZXhjZXB0aW9uIiwiaGFuZGxlIiwibG9jIiwiY2F1Z2h0IiwiaGFzQ2F0Y2giLCJoYXNGaW5hbGx5IiwiZmluYWxseUVudHJ5IiwiY29tcGxldGUiLCJmaW5pc2giLCJjYXRjaCIsInRocm93biIsImRlbGVnYXRlWWllbGQiLCJtb2R1bGUiLCJyZWdlbmVyYXRvclJ1bnRpbWUiLCJhY2NpZGVudGFsU3RyaWN0TW9kZSIsIkZ1bmN0aW9uIiwiYXN5bmNHZW5lcmF0b3JTdGVwIiwiZ2VuIiwiX25leHQiLCJfdGhyb3ciLCJhcmdzIiwiYXJndW1lbnRzIiwiYXBwbHkiLCJhcnIiLCJBcnJheSIsImlzQXJyYXkiLCJfYXJyIiwiX24iLCJfZCIsIl9lIiwiX3MiLCJfaSIsImxlbiIsImFycjIiLCJvIiwibWluTGVuIiwiYXJyYXlMaWtlVG9BcnJheSIsIm4iLCJmcm9tIiwidGVzdCIsImFycmF5V2l0aEhvbGVzIiwiaXRlcmFibGVUb0FycmF5TGltaXQiLCJ1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsIm5vbkl0ZXJhYmxlUmVzdCIsImluc3RhbmNlIiwiQ29uc3RydWN0b3IiLCJfZGVmaW5lUHJvcGVydGllcyIsInRhcmdldCIsInByb3BzIiwiZGVzY3JpcHRvciIsInByb3RvUHJvcHMiLCJzdGF0aWNQcm9wcyIsImUiLCJyIiwidCIsImEiLCJ1IiwiYyIsInJldHVybiIsIm5hdmlnYXRvciIsInBlcm1pc3Npb25zIiwiRE9NRXhjZXB0aW9uIiwicXVlcnkiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiYWRkRXZlbnRMaXN0ZW5lciIsInQwIiwicyIsIm1lZGlhRGV2aWNlcyIsInQxIiwiZ2V0VXNlck1lZGlhIiwidDIiLCJ0MyIsImFsbCIsInQ0IiwiVm9jYWwiLCJvcHRpb25zIiwiU3BlZWNoUmVjb2duaXRpb24iLCJfcmVzb2x2ZVNwZWVjaFJlY29nbml0aW9uIiwiX2luc3RhbmNlIiwiX2xpc3RlbmVycyIsImVudHJpZXMiLCJkZWZhdWx0T3B0aW9ucyIsIlNwZWVjaEdyYW1tYXJMaXN0IiwiX3Jlc29sdmVTcGVlY2hHcmFtbWFyTGlzdCIsIl90aGlzIiwiXyIsImdldFVzZXJNZWRpYVN0cmVhbSIsImF1ZGlvIiwic3RhcnQiLCJlcnJvckhhbmRsZXIiLCJhYm9ydCIsImV2ZW50VHlwZSIsImNhbGxiYWNrIiwiX2luY2x1ZGVzRXZlbnRUeXBlIiwiaGFuZGxlciIsImV2ZW50IiwiYWRkaXRpb25hbEFyZ3MiLCJldmVudFR5cGVzIiwiUkVTVUxUIiwicmVzdWx0cyIsInRyYW5zY3JpcHQiLCJfdGhpczIiLCJfdGhpczMiLCJmaW5kIiwid2luZG93Iiwid2Via2l0U3BlZWNoUmVjb2duaXRpb24iLCJtb3pTcGVlY2hSZWNvZ25pdGlvbiIsIm1zU3BlZWNoUmVjb2duaXRpb24iLCJ3ZWJraXRTcGVlY2hHcmFtbWFyTGlzdCIsIm1velNwZWVjaEdyYW1tYXJMaXN0IiwibXNTcGVlY2hHcmFtbWFyTGlzdCIsImdyYW1tYXJzIiwibGFuZyIsImNvbnRpbnVvdXMiLCJpbnRlcmltUmVzdWx0cyIsIm1heEFsdGVybmF0aXZlcyIsInNlcnZpY2VVUkkiLCJBVURJT19FTkQiLCJBVURJT19TVEFSVCIsIkVORCIsIkVSUk9SIiwiTk9fTUFUQ0giLCJTT1VORF9FTkQiLCJTT1VORF9TVEFSVCIsIlNQRUVDSF9FTkQiLCJTUEVFQ0hfU1RBUlQiLCJTVEFSVCJdLCJtYXBwaW5ncyI6ImtUQU9BLElBQUlBLEVBQVcsU0FBVUMsR0FHdkIsSUFBSUMsRUFBS0MsT0FBT0MsVUFDWkMsRUFBU0gsRUFBR0ksZUFFWkMsRUFBNEIsbUJBQVhDLE9BQXdCQSxPQUFTLEdBQ2xEQyxFQUFpQkYsRUFBUUcsVUFBWSxhQUNyQ0MsRUFBc0JKLEVBQVFLLGVBQWlCLGtCQUMvQ0MsRUFBb0JOLEVBQVFPLGFBQWUsZ0JBRS9DLFNBQVNDLEVBQU9DLEVBQUtDLEVBQUtDLEdBT3hCLE9BTkFmLE9BQU9nQixlQUFlSCxFQUFLQyxFQUFLLENBQzlCQyxNQUFPQSxFQUNQRSxZQUFZLEVBQ1pDLGNBQWMsRUFDZEMsVUFBVSxJQUVMTixFQUFJQyxHQUViLElBRUVGLEVBQU8sR0FBSSxJQUNYLE1BQU9RLEdBQ1BSLEVBQVMsU0FBU0MsRUFBS0MsRUFBS0MsR0FDMUIsT0FBT0YsRUFBSUMsR0FBT0MsR0FJdEIsU0FBU00sRUFBS0MsRUFBU0MsRUFBU0MsRUFBTUMsR0FFcEMsSUFBSUMsRUFBaUJILEdBQVdBLEVBQVF0QixxQkFBcUIwQixFQUFZSixFQUFVSSxFQUMvRUMsRUFBWTVCLE9BQU82QixPQUFPSCxFQUFlekIsV0FDekM2QixFQUFVLElBQUlDLEVBQVFOLEdBQWUsSUFNekMsT0FGQUcsRUFBVUksUUFzTVosU0FBMEJWLEVBQVNFLEVBQU1NLEdBQ3ZDLElBQUlHLEVBL0t1QixpQkFpTDNCLE9BQU8sU0FBZ0JDLEVBQVFDLEdBQzdCLEdBaExvQixjQWdM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
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require(`@untemps/user-permissions-utils`);var t=class t{static defaultOptions={grammars:null,lang:`en-US`,continuous:!1,interimResults:!1,maxAlternatives:1,serviceURI:null};static 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`};static get isSupported(){return!!t._resolveSpeechRecognition()&&!!(0,e.isNavigatorPermissionsSupported)()&&!!(0,e.isNavigatorMediaDevicesSupported)()}static set isSupported(e){throw Error(`You cannot set isSupported directly.`)}_instance=null;_listeners=null;constructor(e){let n=t._resolveSpeechRecognition();if(!n)throw new DOMException(`SpeechRecognition not supported`,`NOT_SUPPORTED_ERR`);this._instance=new n,this._listeners={},Object.entries({...t.defaultOptions,...e||{}}).forEach(([e,n])=>{if(e===`grammars`&&!n){let e=t._resolveSpeechGrammarList();e&&(n=new e)}this._instance[e]=n})}get instance(){return this._instance}set instance(e){throw Error(`You cannot set instance directly.`)}async start(){if(this._instance)try{if(!await(0,e.getUserMediaStream)(`microphone`,{audio:!0}))throw Error(`Unable to retrieve the stream from media device`);this._instance.start()}catch(e){let t=this._listeners.error;t&&t(e)}return this}stop(){return this._instance&&this._instance.stop(),this}abort(){return this._instance&&this._instance.abort(),this}addEventListener(e,n){if(this._instance&&this._includesEventType(e)){this._listeners[e]&&this.removeEventListener(e);let r=r=>{let i=[];e===t.eventTypes.RESULT&&r.results&&r.results.length>0&&i.push(r.results[0][0].transcript),n&&n.apply(this,[r,...i])};this._instance.addEventListener(e,r),this._listeners[e]=r}return this}removeEventListener(e){let t=this._listeners[e];return this._instance.removeEventListener(e,t),delete this._listeners[e],this}cleanup(){return this.stop(),Object.keys(this._listeners).forEach(e=>this.removeEventListener(e)),this._instance=null,this}_includesEventType(e){return!!Object.values(t.eventTypes).find(t=>t===e)}static _resolveSpeechRecognition(){return window.SpeechRecognition||window.webkitSpeechRecognition||window.mozSpeechRecognition||window.msSpeechRecognition}static _resolveSpeechGrammarList(){return window.SpeechGrammarList||window.webkitSpeechGrammarList||window.mozSpeechGrammarList||window.msSpeechGrammarList}};exports.Vocal=t;
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
package/dist/index.umd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).vocal={})}(this,(function(t){"use strict";var e=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 O(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(_([])));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 x(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function O(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(E,this),this.reset(!0)}function _(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=_,O.prototype={constructor:O,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(x),!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),x(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;x(r)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(t,e,r){return this.delegate={iterator:_(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 r(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 n=function(t){return function(){var e=this,n=arguments;return new Promise((function(o,i){var a=t.apply(e,n);function c(t){r(a,o,i,c,u,"next",t)}function u(t){r(a,o,i,c,u,"throw",t)}c(void 0)}))}};var o=function(t){if(Array.isArray(t))return t};var i=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 a=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 c=function(t,e){if(t){if("string"==typeof t)return a(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)?a(t,e):void 0}};var u=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 s=function(t,e){return o(t)||i(t,e)||c(t,e)||u()};var l=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")};function f(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 h=function(t,e,r){return e&&f(t.prototype,e),r&&f(t,r),t};var p=function(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t};function v(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 y(t){return function(){var e=this,r=arguments;return new Promise((function(n,o){var i=t.apply(e,r);function a(t){v(i,n,o,a,c,"next",t)}function c(t){v(i,n,o,a,c,"throw",t)}a(void 0)}))}}function d(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 m(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)?m(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 m(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 g=function(){var t=y(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=y(regeneratorRuntime.mark((function t(r,n){var o,i;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(navigator.permissions){t.next=4;break}n(new DOMException("Permissions not supported","NOT_SUPPORTED_ERR")),t.next=16;break;case 4:return t.prev=4,t.next=7,navigator.permissions.query({name:e});case 7:o=t.sent,i=function t(e){o.removeEventListener("change",t),w(e.target.state,r,n)},o.addEventListener("change",i),w(o.state,r,n),t.next=16;break;case 13:t.prev=13,t.t0=t.catch(4),n(t.t0);case 16:case"end":return t.stop()}}),t,null,[[4,13]])})));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)}}(),w=function(t,e,r){switch(t){case"denied":r(new DOMException("Permission denied","NOT_ALLOWED_ERR"));break;default:e(t)}},b=function(){var t=y(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=y(regeneratorRuntime.mark((function t(n,o){var i,a,c;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(navigator.mediaDevices){t.next=4;break}o(new DOMException("MediaDevices not supported","NOT_FOUND_ERR")),t.next=24;break;case 4:return t.prev=4,t.t0=Promise,t.next=8,g(e);case 8:return t.t1=t.sent,t.next=11,navigator.mediaDevices.getUserMedia(r);case 11:return t.t2=t.sent,t.t3=[t.t1,t.t2],t.next=15,t.t0.all.call(t.t0,t.t3);case 15:i=t.sent,a=d(i,2),c=a[1],n(c),t.next=24;break;case 21:t.prev=21,t.t4=t.catch(4),o(t.t4);case 24:case"end":return t.stop()}}),t,null,[[4,21]])})));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 E(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 x(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{};e%2?E(Object(r),!0).forEach((function(e){p(t,e,r[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):E(Object(r)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}))}return t}var O=function(){function t(e){var r=this;l(this,t),p(this,"_instance",null),p(this,"_listeners",null);var n=t._resolveSpeechRecognition();if(!n)throw new DOMException("SpeechRecognition not supported","NOT_SUPPORTED_ERR");this._instance=new n,this._listeners={},Object.entries(x(x({},t.defaultOptions),e||{})).forEach((function(e){var n=s(e,2),o=n[0],i=n[1];if("grammars"===o&&!i){var a=t._resolveSpeechGrammarList();a&&(i=new a)}r._instance[o]=i}))}var r;return h(t,null,[{key:"isSupported",get:function(){return!!t._resolveSpeechRecognition()},set:function(t){throw new Error("You cannot set isSupported directly.")}}]),h(t,[{key:"start",value:(r=n(e.mark((function t(){var r;return e.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,b("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()}}),t,this,[[1,10]])}))),function(){return r.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(e,r){var n=this;if(this._instance&&this._includesEventType(e)){this._listeners[e]&&this.removeEventListener(e);var o=function(o){var i=[];e===t.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(e,o),this._listeners[e]=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(e){return!!Object.values(t.eventTypes).find((function(t){return t===e}))}},{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}}]),t}();p(O,"defaultOptions",{grammars:null,lang:"en-US",continuous:!1,interimResults:!1,maxAlternatives:1,serviceURI:null}),p(O,"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"}),t.Vocal=O,Object.defineProperty(t,"__esModule",{value:!0})}));
|
|
2
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgudW1kLmpzIiwic291cmNlcyI6WyIuLi9ub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvci5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2FycmF5V2l0aEhvbGVzLmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvaXRlcmFibGVUb0FycmF5TGltaXQuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hcnJheUxpa2VUb0FycmF5LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9ub25JdGVyYWJsZVJlc3QuanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9zbGljZWRUb0FycmF5LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2suanMiLCIuLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzcy5qcyIsIi4uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5LmpzIiwiLi4vbm9kZV9tb2R1bGVzL0B1bnRlbXBzL3VzZXItcGVybWlzc2lvbnMtdXRpbHMvZGlzdC9pbmRleC5lcy5qcyIsIi4uL3NyYy9Wb2NhbC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbnZhciBydW50aW1lID0gKGZ1bmN0aW9uIChleHBvcnRzKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuXG4gIHZhciBPcCA9IE9iamVjdC5wcm90b3R5cGU7XG4gIHZhciBoYXNPd24gPSBPcC5oYXNPd25Qcm9wZXJ0eTtcbiAgdmFyIHVuZGVmaW5lZDsgLy8gTW9yZSBjb21wcmVzc2libGUgdGhhbiB2b2lkIDAuXG4gIHZhciAkU3ltYm9sID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiID8gU3ltYm9sIDoge307XG4gIHZhciBpdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuaXRlcmF0b3IgfHwgXCJAQGl0ZXJhdG9yXCI7XG4gIHZhciBhc3luY0l0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5hc3luY0l0ZXJhdG9yIHx8IFwiQEBhc3luY0l0ZXJhdG9yXCI7XG4gIHZhciB0b1N0cmluZ1RhZ1N5bWJvbCA9ICRTeW1ib2wudG9TdHJpbmdUYWcgfHwgXCJAQHRvU3RyaW5nVGFnXCI7XG5cbiAgZnVuY3Rpb24gZGVmaW5lKG9iaiwga2V5LCB2YWx1ZSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgcmV0dXJuIG9ialtrZXldO1xuICB9XG4gIHRyeSB7XG4gICAgLy8gSUUgOCBoYXMgYSBicm9rZW4gT2JqZWN0LmRlZmluZVByb3BlcnR5IHRoYXQgb25seSB3b3JrcyBvbiBET00gb2JqZWN0cy5cbiAgICBkZWZpbmUoe30sIFwiXCIpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBkZWZpbmUgPSBmdW5jdGlvbihvYmosIGtleSwgdmFsdWUpIHtcbiAgICAgIHJldHVybiBvYmpba2V5XSA9IHZhbHVlO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7XG4gICAgLy8gSWYgb3V0ZXJGbiBwcm92aWRlZCBhbmQgb3V0ZXJGbi5wcm90b3R5cGUgaXMgYSBHZW5lcmF0b3IsIHRoZW4gb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IuXG4gICAgdmFyIHByb3RvR2VuZXJhdG9yID0gb3V0ZXJGbiAmJiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvciA/IG91dGVyRm4gOiBHZW5lcmF0b3I7XG4gICAgdmFyIGdlbmVyYXRvciA9IE9iamVjdC5jcmVhdGUocHJvdG9HZW5lcmF0b3IucHJvdG90eXBlKTtcbiAgICB2YXIgY29udGV4dCA9IG5ldyBDb250ZXh0KHRyeUxvY3NMaXN0IHx8IFtdKTtcblxuICAgIC8vIFRoZSAuX2ludm9rZSBtZXRob2QgdW5pZmllcyB0aGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZSAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMuXG4gICAgZ2VuZXJhdG9yLl9pbnZva2UgPSBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIGdlbmVyYXRvcjtcbiAgfVxuICBleHBvcnRzLndyYXAgPSB3cmFwO1xuXG4gIC8vIFRyeS9jYXRjaCBoZWxwZXIgdG8gbWluaW1pemUgZGVvcHRpbWl6YXRpb25zLiBSZXR1cm5zIGEgY29tcGxldGlvblxuICAvLyByZWNvcmQgbGlrZSBjb250ZXh0LnRyeUVudHJpZXNbaV0uY29tcGxldGlvbi4gVGhpcyBpbnRlcmZhY2UgY291bGRcbiAgLy8gaGF2ZSBiZWVuIChhbmQgd2FzIHByZXZpb3VzbHkpIGRlc2lnbmVkIHRvIHRha2UgYSBjbG9zdXJlIHRvIGJlXG4gIC8vIGludm9rZWQgd2l0aG91dCBhcmd1bWVudHMsIGJ1dCBpbiBhbGwgdGhlIGNhc2VzIHdlIGNhcmUgYWJvdXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGFuIGV4aXN0aW5nIG1ldGhvZCB3ZSB3YW50IHRvIGNhbGwsIHNvIHRoZXJlJ3Mgbm8gbmVlZFxuICAvLyB0byBjcmVhdGUgYSBuZXcgZnVuY3Rpb24gb2JqZWN0LiBXZSBjYW4gZXZlbiBnZXQgYXdheSB3aXRoIGFzc3VtaW5nXG4gIC8vIHRoZSBtZXRob2QgdGFrZXMgZXhhY3RseSBvbmUgYXJndW1lbnQsIHNpbmNlIHRoYXQgaGFwcGVucyB0byBiZSB0cnVlXG4gIC8vIGluIGV2ZXJ5IGNhc2UsIHNvIHdlIGRvbid0IGhhdmUgdG8gdG91Y2ggdGhlIGFyZ3VtZW50cyBvYmplY3QuIFRoZVxuICAvLyBvbmx5IGFkZGl0aW9uYWwgYWxsb2NhdGlvbiByZXF1aXJlZCBpcyB0aGUgY29tcGxldGlvbiByZWNvcmQsIHdoaWNoXG4gIC8vIGhhcyBhIHN0YWJsZSBzaGFwZSBhbmQgc28gaG9wZWZ1bGx5IHNob3VsZCBiZSBjaGVhcCB0byBhbGxvY2F0ZS5cbiAgZnVuY3Rpb24gdHJ5Q2F0Y2goZm4sIG9iaiwgYXJnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwibm9ybWFsXCIsIGFyZzogZm4uY2FsbChvYmosIGFyZykgfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwidGhyb3dcIiwgYXJnOiBlcnIgfTtcbiAgICB9XG4gIH1cblxuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRTdGFydCA9IFwic3VzcGVuZGVkU3RhcnRcIjtcbiAgdmFyIEdlblN0YXRlU3VzcGVuZGVkWWllbGQgPSBcInN1c3BlbmRlZFlpZWxkXCI7XG4gIHZhciBHZW5TdGF0ZUV4ZWN1dGluZyA9IFwiZXhlY3V0aW5nXCI7XG4gIHZhciBHZW5TdGF0ZUNvbXBsZXRlZCA9IFwiY29tcGxldGVkXCI7XG5cbiAgLy8gUmV0dXJuaW5nIHRoaXMgb2JqZWN0IGZyb20gdGhlIGlubmVyRm4gaGFzIHRoZSBzYW1lIGVmZmVjdCBhc1xuICAvLyBicmVha2luZyBvdXQgb2YgdGhlIGRpc3BhdGNoIHN3aXRjaCBzdGF0ZW1lbnQuXG4gIHZhciBDb250aW51ZVNlbnRpbmVsID0ge307XG5cbiAgLy8gRHVtbXkgY29uc3RydWN0b3IgZnVuY3Rpb25zIHRoYXQgd2UgdXNlIGFzIHRoZSAuY29uc3RydWN0b3IgYW5kXG4gIC8vIC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcyBmb3IgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIEdlbmVyYXRvclxuICAvLyBvYmplY3RzLiBGb3IgZnVsbCBzcGVjIGNvbXBsaWFuY2UsIHlvdSBtYXkgd2lzaCB0byBjb25maWd1cmUgeW91clxuICAvLyBtaW5pZmllciBub3QgdG8gbWFuZ2xlIHRoZSBuYW1lcyBvZiB0aGVzZSB0d28gZnVuY3Rpb25zLlxuICBmdW5jdGlvbiBHZW5lcmF0b3IoKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvbigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCkge31cblxuICAvLyBUaGlzIGlzIGEgcG9seWZpbGwgZm9yICVJdGVyYXRvclByb3RvdHlwZSUgZm9yIGVudmlyb25tZW50cyB0aGF0XG4gIC8vIGRvbid0IG5hdGl2ZWx5IHN1cHBvcnQgaXQuXG4gIHZhciBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuICBJdGVyYXRvclByb3RvdHlwZVtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgdmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xuICB2YXIgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90byAmJiBnZXRQcm90byhnZXRQcm90byh2YWx1ZXMoW10pKSk7XG4gIGlmIChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAmJlxuICAgICAgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgIT09IE9wICYmXG4gICAgICBoYXNPd24uY2FsbChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wpKSB7XG4gICAgLy8gVGhpcyBlbnZpcm9ubWVudCBoYXMgYSBuYXRpdmUgJUl0ZXJhdG9yUHJvdG90eXBlJTsgdXNlIGl0IGluc3RlYWRcbiAgICAvLyBvZiB0aGUgcG9seWZpbGwuXG4gICAgSXRlcmF0b3JQcm90b3R5cGUgPSBOYXRpdmVJdGVyYXRvclByb3RvdHlwZTtcbiAgfVxuXG4gIHZhciBHcCA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLnByb3RvdHlwZSA9XG4gICAgR2VuZXJhdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUpO1xuICBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgPSBHcC5jb25zdHJ1Y3RvciA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlO1xuICBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEdlbmVyYXRvckZ1bmN0aW9uO1xuICBHZW5lcmF0b3JGdW5jdGlvbi5kaXNwbGF5TmFtZSA9IGRlZmluZShcbiAgICBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSxcbiAgICB0b1N0cmluZ1RhZ1N5bWJvbCxcbiAgICBcIkdlbmVyYXRvckZ1bmN0aW9uXCJcbiAgKTtcblxuICAvLyBIZWxwZXIgZm9yIGRlZmluaW5nIHRoZSAubmV4dCwgLnRocm93LCBhbmQgLnJldHVybiBtZXRob2RzIG9mIHRoZVxuICAvLyBJdGVyYXRvciBpbnRlcmZhY2UgaW4gdGVybXMgb2YgYSBzaW5nbGUgLl9pbnZva2UgbWV0aG9kLlxuICBmdW5jdGlvbiBkZWZpbmVJdGVyYXRvck1ldGhvZHMocHJvdG90eXBlKSB7XG4gICAgW1wibmV4dFwiLCBcInRocm93XCIsIFwicmV0dXJuXCJdLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgICBkZWZpbmUocHJvdG90eXBlLCBtZXRob2QsIGZ1bmN0aW9uKGFyZykge1xuICAgICAgICByZXR1cm4gdGhpcy5faW52b2tlKG1ldGhvZCwgYXJnKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZXhwb3J0cy5pc0dlbmVyYXRvckZ1bmN0aW9uID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgdmFyIGN0b3IgPSB0eXBlb2YgZ2VuRnVuID09PSBcImZ1bmN0aW9uXCIgJiYgZ2VuRnVuLmNvbnN0cnVjdG9yO1xuICAgIHJldHVybiBjdG9yXG4gICAgICA/IGN0b3IgPT09IEdlbmVyYXRvckZ1bmN0aW9uIHx8XG4gICAgICAgIC8vIEZvciB0aGUgbmF0aXZlIEdlbmVyYXRvckZ1bmN0aW9uIGNvbnN0cnVjdG9yLCB0aGUgYmVzdCB3ZSBjYW5cbiAgICAgICAgLy8gZG8gaXMgdG8gY2hlY2sgaXRzIC5uYW1lIHByb3BlcnR5LlxuICAgICAgICAoY3Rvci5kaXNwbGF5TmFtZSB8fCBjdG9yLm5hbWUpID09PSBcIkdlbmVyYXRvckZ1bmN0aW9uXCJcbiAgICAgIDogZmFsc2U7XG4gIH07XG5cbiAgZXhwb3J0cy5tYXJrID0gZnVuY3Rpb24oZ2VuRnVuKSB7XG4gICAgaWYgKE9iamVjdC5zZXRQcm90b3R5cGVPZikge1xuICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGdlbkZ1biwgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnZW5GdW4uX19wcm90b19fID0gR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGU7XG4gICAgICBkZWZpbmUoZ2VuRnVuLCB0b1N0cmluZ1RhZ1N5bWJvbCwgXCJHZW5lcmF0b3JGdW5jdGlvblwiKTtcbiAgICB9XG4gICAgZ2VuRnVuLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoR3ApO1xuICAgIHJldHVybiBnZW5GdW47XG4gIH07XG5cbiAgLy8gV2l0aGluIHRoZSBib2R5IG9mIGFueSBhc3luYyBmdW5jdGlvbiwgYGF3YWl0IHhgIGlzIHRyYW5zZm9ybWVkIHRvXG4gIC8vIGB5aWVsZCByZWdlbmVyYXRvclJ1bnRpbWUuYXdyYXAoeClgLCBzbyB0aGF0IHRoZSBydW50aW1lIGNhbiB0ZXN0XG4gIC8vIGBoYXNPd24uY2FsbCh2YWx1ZSwgXCJfX2F3YWl0XCIpYCB0byBkZXRlcm1pbmUgaWYgdGhlIHlpZWxkZWQgdmFsdWUgaXNcbiAgLy8gbWVhbnQgdG8gYmUgYXdhaXRlZC5cbiAgZXhwb3J0cy5hd3JhcCA9IGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiB7IF9fYXdhaXQ6IGFyZyB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIEFzeW5jSXRlcmF0b3IoZ2VuZXJhdG9yLCBQcm9taXNlSW1wbCkge1xuICAgIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goZ2VuZXJhdG9yW21ldGhvZF0sIGdlbmVyYXRvciwgYXJnKTtcbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHJlamVjdChyZWNvcmQuYXJnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciByZXN1bHQgPSByZWNvcmQuYXJnO1xuICAgICAgICB2YXIgdmFsdWUgPSByZXN1bHQudmFsdWU7XG4gICAgICAgIGlmICh2YWx1ZSAmJlxuICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICAgICBoYXNPd24uY2FsbCh2YWx1ZSwgXCJfX2F3YWl0XCIpKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2VJbXBsLnJlc29sdmUodmFsdWUuX19hd2FpdCkudGhlbihmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgaW52b2tlKFwibmV4dFwiLCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgIGludm9rZShcInRocm93XCIsIGVyciwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlSW1wbC5yZXNvbHZlKHZhbHVlKS50aGVuKGZ1bmN0aW9uKHVud3JhcHBlZCkge1xuICAgICAgICAgIC8vIFdoZW4gYSB5aWVsZGVkIFByb21pc2UgaXMgcmVzb2x2ZWQsIGl0cyBmaW5hbCB2YWx1ZSBiZWNvbWVzXG4gICAgICAgICAgLy8gdGhlIC52YWx1ZSBvZiB0aGUgUHJvbWlzZTx7dmFsdWUsZG9uZX0+IHJlc3VsdCBmb3IgdGhlXG4gICAgICAgICAgLy8gY3VycmVudCBpdGVyYXRpb24uXG4gICAgICAgICAgcmVzdWx0LnZhbHVlID0gdW53cmFwcGVkO1xuICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSwgZnVuY3Rpb24oZXJyb3IpIHtcbiAgICAgICAgICAvLyBJZiBhIHJlamVjdGVkIFByb21pc2Ugd2FzIHlpZWxkZWQsIHRocm93IHRoZSByZWplY3Rpb24gYmFja1xuICAgICAgICAgIC8vIGludG8gdGhlIGFzeW5jIGdlbmVyYXRvciBmdW5jdGlvbiBzbyBpdCBjYW4gYmUgaGFuZGxlZCB0aGVyZS5cbiAgICAgICAgICByZXR1cm4gaW52b2tlKFwidGhyb3dcIiwgZXJyb3IsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBwcmV2aW91c1Byb21pc2U7XG5cbiAgICBmdW5jdGlvbiBlbnF1ZXVlKG1ldGhvZCwgYXJnKSB7XG4gICAgICBmdW5jdGlvbiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlSW1wbChmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJldmlvdXNQcm9taXNlID1cbiAgICAgICAgLy8gSWYgZW5xdWV1ZSBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIHdlIHdhbnQgdG8gd2FpdCB1bnRpbFxuICAgICAgICAvLyBhbGwgcHJldmlvdXMgUHJvbWlzZXMgaGF2ZSBiZWVuIHJlc29sdmVkIGJlZm9yZSBjYWxsaW5nIGludm9rZSxcbiAgICAgICAgLy8gc28gdGhhdCByZXN1bHRzIGFyZSBhbHdheXMgZGVsaXZlcmVkIGluIHRoZSBjb3JyZWN0IG9yZGVyLiBJZlxuICAgICAgICAvLyBlbnF1ZXVlIGhhcyBub3QgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIGl0IGlzIGltcG9ydGFudCB0b1xuICAgICAgICAvLyBjYWxsIGludm9rZSBpbW1lZGlhdGVseSwgd2l0aG91dCB3YWl0aW5nIG9uIGEgY2FsbGJhY2sgdG8gZmlyZSxcbiAgICAgICAgLy8gc28gdGhhdCB0aGUgYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9uIGhhcyB0aGUgb3Bwb3J0dW5pdHkgdG8gZG9cbiAgICAgICAgLy8gYW55IG5lY2Vzc2FyeSBzZXR1cCBpbiBhIHByZWRpY3RhYmxlIHdheS4gVGhpcyBwcmVkaWN0YWJpbGl0eVxuICAgICAgICAvLyBpcyB3aHkgdGhlIFByb21pc2UgY29uc3RydWN0b3Igc3luY2hyb25vdXNseSBpbnZva2VzIGl0c1xuICAgICAgICAvLyBleGVjdXRvciBjYWxsYmFjaywgYW5kIHdoeSBhc3luYyBmdW5jdGlvbnMgc3luY2hyb25vdXNseVxuICAgICAgICAvLyBleGVjdXRlIGNvZGUgYmVmb3JlIHRoZSBmaXJzdCBhd2FpdC4gU2luY2Ugd2UgaW1wbGVtZW50IHNpbXBsZVxuICAgICAgICAvLyBhc3luYyBmdW5jdGlvbnMgaW4gdGVybXMgb2YgYXN5bmMgZ2VuZXJhdG9ycywgaXQgaXMgZXNwZWNpYWxseVxuICAgICAgICAvLyBpbXBvcnRhbnQgdG8gZ2V0IHRoaXMgcmlnaHQsIGV2ZW4gdGhvdWdoIGl0IHJlcXVpcmVzIGNhcmUuXG4gICAgICAgIHByZXZpb3VzUHJvbWlzZSA/IHByZXZpb3VzUHJvbWlzZS50aGVuKFxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLFxuICAgICAgICAgIC8vIEF2b2lkIHByb3BhZ2F0aW5nIGZhaWx1cmVzIHRvIFByb21pc2VzIHJldHVybmVkIGJ5IGxhdGVyXG4gICAgICAgICAgLy8gaW52b2NhdGlvbnMgb2YgdGhlIGl0ZXJhdG9yLlxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnXG4gICAgICAgICkgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpO1xuICAgIH1cblxuICAgIC8vIERlZmluZSB0aGUgdW5pZmllZCBoZWxwZXIgbWV0aG9kIHRoYXQgaXMgdXNlZCB0byBpbXBsZW1lbnQgLm5leHQsXG4gICAgLy8gLnRocm93LCBhbmQgLnJldHVybiAoc2VlIGRlZmluZUl0ZXJhdG9yTWV0aG9kcykuXG4gICAgdGhpcy5faW52b2tlID0gZW5xdWV1ZTtcbiAgfVxuXG4gIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhBc3luY0l0ZXJhdG9yLnByb3RvdHlwZSk7XG4gIEFzeW5jSXRlcmF0b3IucHJvdG90eXBlW2FzeW5jSXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICBleHBvcnRzLkFzeW5jSXRlcmF0b3IgPSBBc3luY0l0ZXJhdG9yO1xuXG4gIC8vIE5vdGUgdGhhdCBzaW1wbGUgYXN5bmMgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBvbiB0b3Agb2ZcbiAgLy8gQXN5bmNJdGVyYXRvciBvYmplY3RzOyB0aGV5IGp1c3QgcmV0dXJuIGEgUHJvbWlzZSBmb3IgdGhlIHZhbHVlIG9mXG4gIC8vIHRoZSBmaW5hbCByZXN1bHQgcHJvZHVjZWQgYnkgdGhlIGl0ZXJhdG9yLlxuICBleHBvcnRzLmFzeW5jID0gZnVuY3Rpb24oaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QsIFByb21pc2VJbXBsKSB7XG4gICAgaWYgKFByb21pc2VJbXBsID09PSB2b2lkIDApIFByb21pc2VJbXBsID0gUHJvbWlzZTtcblxuICAgIHZhciBpdGVyID0gbmV3IEFzeW5jSXRlcmF0b3IoXG4gICAgICB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSxcbiAgICAgIFByb21pc2VJbXBsXG4gICAgKTtcblxuICAgIHJldHVybiBleHBvcnRzLmlzR2VuZXJhdG9yRnVuY3Rpb24ob3V0ZXJGbilcbiAgICAgID8gaXRlciAvLyBJZiBvdXRlckZuIGlzIGEgZ2VuZXJhdG9yLCByZXR1cm4gdGhlIGZ1bGwgaXRlcmF0b3IuXG4gICAgICA6IGl0ZXIubmV4dCgpLnRoZW4oZnVuY3Rpb24ocmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdC5kb25lID8gcmVzdWx0LnZhbHVlIDogaXRlci5uZXh0KCk7XG4gICAgICAgIH0pO1xuICB9O1xuXG4gIGZ1bmN0aW9uIG1ha2VJbnZva2VNZXRob2QoaW5uZXJGbiwgc2VsZiwgY29udGV4dCkge1xuICAgIHZhciBzdGF0ZSA9IEdlblN0YXRlU3VzcGVuZGVkU3RhcnQ7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnKSB7XG4gICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlRXhlY3V0aW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmdcIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVDb21wbGV0ZWQpIHtcbiAgICAgICAgaWYgKG1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgdGhyb3cgYXJnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmUgZm9yZ2l2aW5nLCBwZXIgMjUuMy4zLjMuMyBvZiB0aGUgc3BlYzpcbiAgICAgICAgLy8gaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLWdlbmVyYXRvcnJlc3VtZVxuICAgICAgICByZXR1cm4gZG9uZVJlc3VsdCgpO1xuICAgICAgfVxuXG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IG1ldGhvZDtcbiAgICAgIGNvbnRleHQuYXJnID0gYXJnO1xuXG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICB2YXIgZGVsZWdhdGUgPSBjb250ZXh0LmRlbGVnYXRlO1xuICAgICAgICBpZiAoZGVsZWdhdGUpIHtcbiAgICAgICAgICB2YXIgZGVsZWdhdGVSZXN1bHQgPSBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcbiAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQpIHtcbiAgICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCA9PT0gQ29udGludWVTZW50aW5lbCkgY29udGludWU7XG4gICAgICAgICAgICByZXR1cm4gZGVsZWdhdGVSZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcIm5leHRcIikge1xuICAgICAgICAgIC8vIFNldHRpbmcgY29udGV4dC5fc2VudCBmb3IgbGVnYWN5IHN1cHBvcnQgb2YgQmFiZWwnc1xuICAgICAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uXG4gICAgICAgICAgY29udGV4dC5zZW50ID0gY29udGV4dC5fc2VudCA9IGNvbnRleHQuYXJnO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydCkge1xuICAgICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDtcbiAgICAgICAgICAgIHRocm93IGNvbnRleHQuYXJnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oY29udGV4dC5hcmcpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY29udGV4dC5tZXRob2QgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgICBjb250ZXh0LmFicnVwdChcInJldHVyblwiLCBjb250ZXh0LmFyZyk7XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZSA9IEdlblN0YXRlRXhlY3V0aW5nO1xuXG4gICAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiKSB7XG4gICAgICAgICAgLy8gSWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBmcm9tIGlubmVyRm4sIHdlIGxlYXZlIHN0YXRlID09PVxuICAgICAgICAgIC8vIEdlblN0YXRlRXhlY3V0aW5nIGFuZCBsb29wIGJhY2sgZm9yIGFub3RoZXIgaW52b2NhdGlvbi5cbiAgICAgICAgICBzdGF0ZSA9IGNvbnRleHQuZG9uZVxuICAgICAgICAgICAgPyBHZW5TdGF0ZUNvbXBsZXRlZFxuICAgICAgICAgICAgOiBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkO1xuXG4gICAgICAgICAgaWYgKHJlY29yZC5hcmcgPT09IENvbnRpbnVlU2VudGluZWwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogcmVjb3JkLmFyZyxcbiAgICAgICAgICAgIGRvbmU6IGNvbnRleHQuZG9uZVxuICAgICAgICAgIH07XG5cbiAgICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUNvbXBsZXRlZDtcbiAgICAgICAgICAvLyBEaXNwYXRjaCB0aGUgZXhjZXB0aW9uIGJ5IGxvb3BpbmcgYmFjayBhcm91bmQgdG8gdGhlXG4gICAgICAgICAgLy8gY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZykgY2FsbCBhYm92ZS5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gQ2FsbCBkZWxlZ2F0ZS5pdGVyYXRvcltjb250ZXh0Lm1ldGhvZF0oY29udGV4dC5hcmcpIGFuZCBoYW5kbGUgdGhlXG4gIC8vIHJlc3VsdCwgZWl0aGVyIGJ5IHJldHVybmluZyBhIHsgdmFsdWUsIGRvbmUgfSByZXN1bHQgZnJvbSB0aGVcbiAgLy8gZGVsZWdhdGUgaXRlcmF0b3IsIG9yIGJ5IG1vZGlmeWluZyBjb250ZXh0Lm1ldGhvZCBhbmQgY29udGV4dC5hcmcsXG4gIC8vIHNldHRpbmcgY29udGV4dC5kZWxlZ2F0ZSB0byBudWxsLCBhbmQgcmV0dXJuaW5nIHRoZSBDb250aW51ZVNlbnRpbmVsLlxuICBmdW5jdGlvbiBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KSB7XG4gICAgdmFyIG1ldGhvZCA9IGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXTtcbiAgICBpZiAobWV0aG9kID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEEgLnRocm93IG9yIC5yZXR1cm4gd2hlbiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIG5vIC50aHJvd1xuICAgICAgLy8gbWV0aG9kIGFsd2F5cyB0ZXJtaW5hdGVzIHRoZSB5aWVsZCogbG9vcC5cbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuXG4gICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAvLyBOb3RlOiBbXCJyZXR1cm5cIl0gbXVzdCBiZSB1c2VkIGZvciBFUzMgcGFyc2luZyBjb21wYXRpYmlsaXR5LlxuICAgICAgICBpZiAoZGVsZWdhdGUuaXRlcmF0b3JbXCJyZXR1cm5cIl0pIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIGEgcmV0dXJuIG1ldGhvZCwgZ2l2ZSBpdCBhXG4gICAgICAgICAgLy8gY2hhbmNlIHRvIGNsZWFuIHVwLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJyZXR1cm5cIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcblxuICAgICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICAvLyBJZiBtYXliZUludm9rZURlbGVnYXRlKGNvbnRleHQpIGNoYW5nZWQgY29udGV4dC5tZXRob2QgZnJvbVxuICAgICAgICAgICAgLy8gXCJyZXR1cm5cIiB0byBcInRocm93XCIsIGxldCB0aGF0IG92ZXJyaWRlIHRoZSBUeXBlRXJyb3IgYmVsb3cuXG4gICAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIFwiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAndGhyb3cnIG1ldGhvZFwiKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKG1ldGhvZCwgZGVsZWdhdGUuaXRlcmF0b3IsIGNvbnRleHQuYXJnKTtcblxuICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIGluZm8gPSByZWNvcmQuYXJnO1xuXG4gICAgaWYgKCEgaW5mbykge1xuICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdFwiKTtcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgaWYgKGluZm8uZG9uZSkge1xuICAgICAgLy8gQXNzaWduIHRoZSByZXN1bHQgb2YgdGhlIGZpbmlzaGVkIGRlbGVnYXRlIHRvIHRoZSB0ZW1wb3JhcnlcbiAgICAgIC8vIHZhcmlhYmxlIHNwZWNpZmllZCBieSBkZWxlZ2F0ZS5yZXN1bHROYW1lIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0W2RlbGVnYXRlLnJlc3VsdE5hbWVdID0gaW5mby52YWx1ZTtcblxuICAgICAgLy8gUmVzdW1lIGV4ZWN1dGlvbiBhdCB0aGUgZGVzaXJlZCBsb2NhdGlvbiAoc2VlIGRlbGVnYXRlWWllbGQpLlxuICAgICAgY29udGV4dC5uZXh0ID0gZGVsZWdhdGUubmV4dExvYztcblxuICAgICAgLy8gSWYgY29udGV4dC5tZXRob2Qgd2FzIFwidGhyb3dcIiBidXQgdGhlIGRlbGVnYXRlIGhhbmRsZWQgdGhlXG4gICAgICAvLyBleGNlcHRpb24sIGxldCB0aGUgb3V0ZXIgZ2VuZXJhdG9yIHByb2NlZWQgbm9ybWFsbHkuIElmXG4gICAgICAvLyBjb250ZXh0Lm1ldGhvZCB3YXMgXCJuZXh0XCIsIGZvcmdldCBjb250ZXh0LmFyZyBzaW5jZSBpdCBoYXMgYmVlblxuICAgICAgLy8gXCJjb25zdW1lZFwiIGJ5IHRoZSBkZWxlZ2F0ZSBpdGVyYXRvci4gSWYgY29udGV4dC5tZXRob2Qgd2FzXG4gICAgICAvLyBcInJldHVyblwiLCBhbGxvdyB0aGUgb3JpZ2luYWwgLnJldHVybiBjYWxsIHRvIGNvbnRpbnVlIGluIHRoZVxuICAgICAgLy8gb3V0ZXIgZ2VuZXJhdG9yLlxuICAgICAgaWYgKGNvbnRleHQubWV0aG9kICE9PSBcInJldHVyblwiKSB7XG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlLXlpZWxkIHRoZSByZXN1bHQgcmV0dXJuZWQgYnkgdGhlIGRlbGVnYXRlIG1ldGhvZC5cbiAgICAgIHJldHVybiBpbmZvO1xuICAgIH1cblxuICAgIC8vIFRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBpcyBmaW5pc2hlZCwgc28gZm9yZ2V0IGl0IGFuZCBjb250aW51ZSB3aXRoXG4gICAgLy8gdGhlIG91dGVyIGdlbmVyYXRvci5cbiAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgfVxuXG4gIC8vIERlZmluZSBHZW5lcmF0b3IucHJvdG90eXBlLntuZXh0LHRocm93LHJldHVybn0gaW4gdGVybXMgb2YgdGhlXG4gIC8vIHVuaWZpZWQgLl9pbnZva2UgaGVscGVyIG1ldGhvZC5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEdwKTtcblxuICBkZWZpbmUoR3AsIHRvU3RyaW5nVGFnU3ltYm9sLCBcIkdlbmVyYXRvclwiKTtcblxuICAvLyBBIEdlbmVyYXRvciBzaG91bGQgYWx3YXlzIHJldHVybiBpdHNlbGYgYXMgdGhlIGl0ZXJhdG9yIG9iamVjdCB3aGVuIHRoZVxuICAvLyBAQGl0ZXJhdG9yIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbiBpdC4gU29tZSBicm93c2VycycgaW1wbGVtZW50YXRpb25zIG9mIHRoZVxuICAvLyBpdGVyYXRvciBwcm90b3R5cGUgY2hhaW4gaW5jb3JyZWN0bHkgaW1wbGVtZW50IHRoaXMsIGNhdXNpbmcgdGhlIEdlbmVyYXRvclxuICAvLyBvYmplY3QgdG8gbm90IGJlIHJldHVybmVkIGZyb20gdGhpcyBjYWxsLiBUaGlzIGVuc3VyZXMgdGhhdCBkb2Vzbid0IGhhcHBlbi5cbiAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWdlbmVyYXRvci9pc3N1ZXMvMjc0IGZvciBtb3JlIGRldGFpbHMuXG4gIEdwW2l0ZXJhdG9yU3ltYm9sXSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIEdwLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIFwiW29iamVjdCBHZW5lcmF0b3JdXCI7XG4gIH07XG5cbiAgZnVuY3Rpb24gcHVzaFRyeUVudHJ5KGxvY3MpIHtcbiAgICB2YXIgZW50cnkgPSB7IHRyeUxvYzogbG9jc1swXSB9O1xuXG4gICAgaWYgKDEgaW4gbG9jcykge1xuICAgICAgZW50cnkuY2F0Y2hMb2MgPSBsb2NzWzFdO1xuICAgIH1cblxuICAgIGlmICgyIGluIGxvY3MpIHtcbiAgICAgIGVudHJ5LmZpbmFsbHlMb2MgPSBsb2NzWzJdO1xuICAgICAgZW50cnkuYWZ0ZXJMb2MgPSBsb2NzWzNdO1xuICAgIH1cblxuICAgIHRoaXMudHJ5RW50cmllcy5wdXNoKGVudHJ5KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc2V0VHJ5RW50cnkoZW50cnkpIHtcbiAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbiB8fCB7fTtcbiAgICByZWNvcmQudHlwZSA9IFwibm9ybWFsXCI7XG4gICAgZGVsZXRlIHJlY29yZC5hcmc7XG4gICAgZW50cnkuY29tcGxldGlvbiA9IHJlY29yZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIENvbnRleHQodHJ5TG9jc0xpc3QpIHtcbiAgICAvLyBUaGUgcm9vdCBlbnRyeSBvYmplY3QgKGVmZmVjdGl2ZWx5IGEgdHJ5IHN0YXRlbWVudCB3aXRob3V0IGEgY2F0Y2hcbiAgICAvLyBvciBhIGZpbmFsbHkgYmxvY2spIGdpdmVzIHVzIGEgcGxhY2UgdG8gc3RvcmUgdmFsdWVzIHRocm93biBmcm9tXG4gICAgLy8gbG9jYXRpb25zIHdoZXJlIHRoZXJlIGlzIG5vIGVuY2xvc2luZyB0cnkgc3RhdGVtZW50LlxuICAgIHRoaXMudHJ5RW50cmllcyA9IFt7IHRyeUxvYzogXCJyb290XCIgfV07XG4gICAgdHJ5TG9jc0xpc3QuZm9yRWFjaChwdXNoVHJ5RW50cnksIHRoaXMpO1xuICAgIHRoaXMucmVzZXQodHJ1ZSk7XG4gIH1cblxuICBleHBvcnRzLmtleXMgPSBmdW5jdGlvbihvYmplY3QpIHtcbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICAgIGtleXMucHVzaChrZXkpO1xuICAgIH1cbiAgICBrZXlzLnJldmVyc2UoKTtcblxuICAgIC8vIFJhdGhlciB0aGFuIHJldHVybmluZyBhbiBvYmplY3Qgd2l0aCBhIG5leHQgbWV0aG9kLCB3ZSBrZWVwXG4gICAgLy8gdGhpbmdzIHNpbXBsZSBhbmQgcmV0dXJuIHRoZSBuZXh0IGZ1bmN0aW9uIGl0c2VsZi5cbiAgICByZXR1cm4gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgIHdoaWxlIChrZXlzLmxlbmd0aCkge1xuICAgICAgICB2YXIga2V5ID0ga2V5cy5wb3AoKTtcbiAgICAgICAgaWYgKGtleSBpbiBvYmplY3QpIHtcbiAgICAgICAgICBuZXh0LnZhbHVlID0ga2V5O1xuICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRvIGF2b2lkIGNyZWF0aW5nIGFuIGFkZGl0aW9uYWwgb2JqZWN0LCB3ZSBqdXN0IGhhbmcgdGhlIC52YWx1ZVxuICAgICAgLy8gYW5kIC5kb25lIHByb3BlcnRpZXMgb2ZmIHRoZSBuZXh0IGZ1bmN0aW9uIG9iamVjdCBpdHNlbGYuIFRoaXNcbiAgICAgIC8vIGFsc28gZW5zdXJlcyB0aGF0IHRoZSBtaW5pZmllciB3aWxsIG5vdCBhbm9ueW1pemUgdGhlIGZ1bmN0aW9uLlxuICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gdmFsdWVzKGl0ZXJhYmxlKSB7XG4gICAgaWYgKGl0ZXJhYmxlKSB7XG4gICAgICB2YXIgaXRlcmF0b3JNZXRob2QgPSBpdGVyYWJsZVtpdGVyYXRvclN5bWJvbF07XG4gICAgICBpZiAoaXRlcmF0b3JNZXRob2QpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yTWV0aG9kLmNhbGwoaXRlcmFibGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGl0ZXJhYmxlLm5leHQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gaXRlcmFibGU7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNOYU4oaXRlcmFibGUubGVuZ3RoKSkge1xuICAgICAgICB2YXIgaSA9IC0xLCBuZXh0ID0gZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgICB3aGlsZSAoKytpIDwgaXRlcmFibGUubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duLmNhbGwoaXRlcmFibGUsIGkpKSB7XG4gICAgICAgICAgICAgIG5leHQudmFsdWUgPSBpdGVyYWJsZVtpXTtcbiAgICAgICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIG5leHQudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgbmV4dC5kb25lID0gdHJ1ZTtcblxuICAgICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBuZXh0Lm5leHQgPSBuZXh0O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiBhbiBpdGVyYXRvciB3aXRoIG5vIHZhbHVlcy5cbiAgICByZXR1cm4geyBuZXh0OiBkb25lUmVzdWx0IH07XG4gIH1cbiAgZXhwb3J0cy52YWx1ZXMgPSB2YWx1ZXM7XG5cbiAgZnVuY3Rpb24gZG9uZVJlc3VsdCgpIHtcbiAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gIH1cblxuICBDb250ZXh0LnByb3RvdHlwZSA9IHtcbiAgICBjb25zdHJ1Y3RvcjogQ29udGV4dCxcblxuICAgIHJlc2V0OiBmdW5jdGlvbihza2lwVGVtcFJlc2V0KSB7XG4gICAgICB0aGlzLnByZXYgPSAwO1xuICAgICAgdGhpcy5uZXh0ID0gMDtcbiAgICAgIC8vIFJlc2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAvLyBmdW5jdGlvbi5zZW50IGltcGxlbWVudGF0aW9uLlxuICAgICAgdGhpcy5zZW50ID0gdGhpcy5fc2VudCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuZG9uZSA9IGZhbHNlO1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIHRoaXMubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcblxuICAgICAgdGhpcy50cnlFbnRyaWVzLmZvckVhY2gocmVzZXRUcnlFbnRyeSk7XG5cbiAgICAgIGlmICghc2tpcFRlbXBSZXNldCkge1xuICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMpIHtcbiAgICAgICAgICAvLyBOb3Qgc3VyZSBhYm91dCB0aGUgb3B0aW1hbCBvcmRlciBvZiB0aGVzZSBjb25kaXRpb25zOlxuICAgICAgICAgIGlmIChuYW1lLmNoYXJBdCgwKSA9PT0gXCJ0XCIgJiZcbiAgICAgICAgICAgICAgaGFzT3duLmNhbGwodGhpcywgbmFtZSkgJiZcbiAgICAgICAgICAgICAgIWlzTmFOKCtuYW1lLnNsaWNlKDEpKSkge1xuICAgICAgICAgICAgdGhpc1tuYW1lXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgc3RvcDogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLmRvbmUgPSB0cnVlO1xuXG4gICAgICB2YXIgcm9vdEVudHJ5ID0gdGhpcy50cnlFbnRyaWVzWzBdO1xuICAgICAgdmFyIHJvb3RSZWNvcmQgPSByb290RW50cnkuY29tcGxldGlvbjtcbiAgICAgIGlmIChyb290UmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByb290UmVjb3JkLmFyZztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMucnZhbDtcbiAgICB9LFxuXG4gICAgZGlzcGF0Y2hFeGNlcHRpb246IGZ1bmN0aW9uKGV4Y2VwdGlvbikge1xuICAgICAgaWYgKHRoaXMuZG9uZSkge1xuICAgICAgICB0aHJvdyBleGNlcHRpb247XG4gICAgICB9XG5cbiAgICAgIHZhciBjb250ZXh0ID0gdGhpcztcbiAgICAgIGZ1bmN0aW9uIGhhbmRsZShsb2MsIGNhdWdodCkge1xuICAgICAgICByZWNvcmQudHlwZSA9IFwidGhyb3dcIjtcbiAgICAgICAgcmVjb3JkLmFyZyA9IGV4Y2VwdGlvbjtcbiAgICAgICAgY29udGV4dC5uZXh0ID0gbG9jO1xuXG4gICAgICAgIGlmIChjYXVnaHQpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGlzcGF0Y2hlZCBleGNlcHRpb24gd2FzIGNhdWdodCBieSBhIGNhdGNoIGJsb2NrLFxuICAgICAgICAgIC8vIHRoZW4gbGV0IHRoYXQgY2F0Y2ggYmxvY2sgaGFuZGxlIHRoZSBleGNlcHRpb24gbm9ybWFsbHkuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhISBjYXVnaHQ7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSBcInJvb3RcIikge1xuICAgICAgICAgIC8vIEV4Y2VwdGlvbiB0aHJvd24gb3V0c2lkZSBvZiBhbnkgdHJ5IGJsb2NrIHRoYXQgY291bGQgaGFuZGxlXG4gICAgICAgICAgLy8gaXQsIHNvIHNldCB0aGUgY29tcGxldGlvbiB2YWx1ZSBvZiB0aGUgZW50aXJlIGZ1bmN0aW9uIHRvXG4gICAgICAgICAgLy8gdGhyb3cgdGhlIGV4Y2VwdGlvbi5cbiAgICAgICAgICByZXR1cm4gaGFuZGxlKFwiZW5kXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYpIHtcbiAgICAgICAgICB2YXIgaGFzQ2F0Y2ggPSBoYXNPd24uY2FsbChlbnRyeSwgXCJjYXRjaExvY1wiKTtcbiAgICAgICAgICB2YXIgaGFzRmluYWxseSA9IGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIik7XG5cbiAgICAgICAgICBpZiAoaGFzQ2F0Y2ggJiYgaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0NhdGNoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2UgaWYgKGhhc0ZpbmFsbHkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuZmluYWxseUxvYyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidHJ5IHN0YXRlbWVudCB3aXRob3V0IGNhdGNoIG9yIGZpbmFsbHlcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFicnVwdDogZnVuY3Rpb24odHlwZSwgYXJnKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA8PSB0aGlzLnByZXYgJiZcbiAgICAgICAgICAgIGhhc093bi5jYWxsKGVudHJ5LCBcImZpbmFsbHlMb2NcIikgJiZcbiAgICAgICAgICAgIHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB2YXIgZmluYWxseUVudHJ5ID0gZW50cnk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSAmJlxuICAgICAgICAgICh0eXBlID09PSBcImJyZWFrXCIgfHxcbiAgICAgICAgICAgdHlwZSA9PT0gXCJjb250aW51ZVwiKSAmJlxuICAgICAgICAgIGZpbmFsbHlFbnRyeS50cnlMb2MgPD0gYXJnICYmXG4gICAgICAgICAgYXJnIDw9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgIC8vIElnbm9yZSB0aGUgZmluYWxseSBlbnRyeSBpZiBjb250cm9sIGlzIG5vdCBqdW1waW5nIHRvIGFcbiAgICAgICAgLy8gbG9jYXRpb24gb3V0c2lkZSB0aGUgdHJ5L2NhdGNoIGJsb2NrLlxuICAgICAgICBmaW5hbGx5RW50cnkgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVjb3JkID0gZmluYWxseUVudHJ5ID8gZmluYWxseUVudHJ5LmNvbXBsZXRpb24gOiB7fTtcbiAgICAgIHJlY29yZC50eXBlID0gdHlwZTtcbiAgICAgIHJlY29yZC5hcmcgPSBhcmc7XG5cbiAgICAgIGlmIChmaW5hbGx5RW50cnkpIHtcbiAgICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgdGhpcy5uZXh0ID0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2M7XG4gICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5jb21wbGV0ZShyZWNvcmQpO1xuICAgIH0sXG5cbiAgICBjb21wbGV0ZTogZnVuY3Rpb24ocmVjb3JkLCBhZnRlckxvYykge1xuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgcmVjb3JkLmFyZztcbiAgICAgIH1cblxuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcImJyZWFrXCIgfHxcbiAgICAgICAgICByZWNvcmQudHlwZSA9PT0gXCJjb250aW51ZVwiKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IHJlY29yZC5hcmc7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInJldHVyblwiKSB7XG4gICAgICAgIHRoaXMucnZhbCA9IHRoaXMuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgdGhpcy5tZXRob2QgPSBcInJldHVyblwiO1xuICAgICAgICB0aGlzLm5leHQgPSBcImVuZFwiO1xuICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJub3JtYWxcIiAmJiBhZnRlckxvYykge1xuICAgICAgICB0aGlzLm5leHQgPSBhZnRlckxvYztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfSxcblxuICAgIGZpbmlzaDogZnVuY3Rpb24oZmluYWxseUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS5maW5hbGx5TG9jID09PSBmaW5hbGx5TG9jKSB7XG4gICAgICAgICAgdGhpcy5jb21wbGV0ZShlbnRyeS5jb21wbGV0aW9uLCBlbnRyeS5hZnRlckxvYyk7XG4gICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7XG4gICAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgXCJjYXRjaFwiOiBmdW5jdGlvbih0cnlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jID09PSB0cnlMb2MpIHtcbiAgICAgICAgICB2YXIgcmVjb3JkID0gZW50cnkuY29tcGxldGlvbjtcbiAgICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgICAgdmFyIHRocm93biA9IHJlY29yZC5hcmc7XG4gICAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRocm93bjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGUgY29udGV4dC5jYXRjaCBtZXRob2QgbXVzdCBvbmx5IGJlIGNhbGxlZCB3aXRoIGEgbG9jYXRpb25cbiAgICAgIC8vIGFyZ3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gYSBrbm93biBjYXRjaCBibG9jay5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdFwiKTtcbiAgICB9LFxuXG4gICAgZGVsZWdhdGVZaWVsZDogZnVuY3Rpb24oaXRlcmFibGUsIHJlc3VsdE5hbWUsIG5leHRMb2MpIHtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSB7XG4gICAgICAgIGl0ZXJhdG9yOiB2YWx1ZXMoaXRlcmFibGUpLFxuICAgICAgICByZXN1bHROYW1lOiByZXN1bHROYW1lLFxuICAgICAgICBuZXh0TG9jOiBuZXh0TG9jXG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgIC8vIERlbGliZXJhdGVseSBmb3JnZXQgdGhlIGxhc3Qgc2VudCB2YWx1ZSBzbyB0aGF0IHdlIGRvbid0XG4gICAgICAgIC8vIGFjY2lkZW50YWxseSBwYXNzIGl0IG9uIHRvIHRoZSBkZWxlZ2F0ZS5cbiAgICAgICAgdGhpcy5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH1cbiAgfTtcblxuICAvLyBSZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhpcyBzY3JpcHQgaXMgZXhlY3V0aW5nIGFzIGEgQ29tbW9uSlMgbW9kdWxlXG4gIC8vIG9yIG5vdCwgcmV0dXJuIHRoZSBydW50aW1lIG9iamVjdCBzbyB0aGF0IHdlIGNhbiBkZWNsYXJlIHRoZSB2YXJpYWJsZVxuICAvLyByZWdlbmVyYXRvclJ1bnRpbWUgaW4gdGhlIG91dGVyIHNjb3BlLCB3aGljaCBhbGxvd3MgdGhpcyBtb2R1bGUgdG8gYmVcbiAgLy8gaW5qZWN0ZWQgZWFzaWx5IGJ5IGBiaW4vcmVnZW5lcmF0b3IgLS1pbmNsdWRlLXJ1bnRpbWUgc2NyaXB0LmpzYC5cbiAgcmV0dXJuIGV4cG9ydHM7XG5cbn0oXG4gIC8vIElmIHRoaXMgc2NyaXB0IGlzIGV4ZWN1dGluZyBhcyBhIENvbW1vbkpTIG1vZHVsZSwgdXNlIG1vZHVsZS5leHBvcnRzXG4gIC8vIGFzIHRoZSByZWdlbmVyYXRvclJ1bnRpbWUgbmFtZXNwYWNlLiBPdGhlcndpc2UgY3JlYXRlIGEgbmV3IGVtcHR5XG4gIC8vIG9iamVjdC4gRWl0aGVyIHdheSwgdGhlIHJlc3VsdGluZyBvYmplY3Qgd2lsbCBiZSB1c2VkIHRvIGluaXRpYWxpemVcbiAgLy8gdGhlIHJlZ2VuZXJhdG9yUnVudGltZSB2YXJpYWJsZSBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZS5cbiAgdHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIiA/IG1vZHVsZS5leHBvcnRzIDoge31cbikpO1xuXG50cnkge1xuICByZWdlbmVyYXRvclJ1bnRpbWUgPSBydW50aW1lO1xufSBjYXRjaCAoYWNjaWRlbnRhbFN0cmljdE1vZGUpIHtcbiAgLy8gVGhpcyBtb2R1bGUgc2hvdWxkIG5vdCBiZSBydW5uaW5nIGluIHN0cmljdCBtb2RlLCBzbyB0aGUgYWJvdmVcbiAgLy8gYXNzaWdubWVudCBzaG91bGQgYWx3YXlzIHdvcmsgdW5sZXNzIHNvbWV0aGluZyBpcyBtaXNjb25maWd1cmVkLiBKdXN0XG4gIC8vIGluIGNhc2UgcnVudGltZS5qcyBhY2NpZGVudGFsbHkgcnVucyBpbiBzdHJpY3QgbW9kZSwgd2UgY2FuIGVzY2FwZVxuICAvLyBzdHJpY3QgbW9kZSB1c2luZyBhIGdsb2JhbCBGdW5jdGlvbiBjYWxsLiBUaGlzIGNvdWxkIGNvbmNlaXZhYmx5IGZhaWxcbiAgLy8gaWYgYSBDb250ZW50IFNlY3VyaXR5IFBvbGljeSBmb3JiaWRzIHVzaW5nIEZ1bmN0aW9uLCBidXQgaW4gdGhhdCBjYXNlXG4gIC8vIHRoZSBwcm9wZXIgc29sdXRpb24gaXMgdG8gZml4IHRoZSBhY2NpZGVudGFsIHN0cmljdCBtb2RlIHByb2JsZW0uIElmXG4gIC8vIHlvdSd2ZSBtaXNjb25maWd1cmVkIHlvdXIgYnVuZGxlciB0byBmb3JjZSBzdHJpY3QgbW9kZSBhbmQgYXBwbGllZCBhXG4gIC8vIENTUCB0byBmb3JiaWQgRnVuY3Rpb24sIGFuZCB5b3UncmUgbm90IHdpbGxpbmcgdG8gZml4IGVpdGhlciBvZiB0aG9zZVxuICAvLyBwcm9ibGVtcywgcGxlYXNlIGRldGFpbCB5b3VyIHVuaXF1ZSBwcmVkaWNhbWVudCBpbiBhIEdpdEh1YiBpc3N1ZS5cbiAgRnVuY3Rpb24oXCJyXCIsIFwicmVnZW5lcmF0b3JSdW50aW1lID0gclwiKShydW50aW1lKTtcbn1cbiIsImZ1bmN0aW9uIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywga2V5LCBhcmcpIHtcbiAgdHJ5IHtcbiAgICB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7XG4gICAgdmFyIHZhbHVlID0gaW5mby52YWx1ZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZWplY3QoZXJyb3IpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChpbmZvLmRvbmUpIHtcbiAgICByZXNvbHZlKHZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oX25leHQsIF90aHJvdyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2FzeW5jVG9HZW5lcmF0b3IoZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgICAgIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciBnZW4gPSBmbi5hcHBseShzZWxmLCBhcmdzKTtcblxuICAgICAgZnVuY3Rpb24gX25leHQodmFsdWUpIHtcbiAgICAgICAgYXN5bmNHZW5lcmF0b3JTdGVwKGdlbiwgcmVzb2x2ZSwgcmVqZWN0LCBfbmV4dCwgX3Rocm93LCBcIm5leHRcIiwgdmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBfdGhyb3coZXJyKSB7XG4gICAgICAgIGFzeW5jR2VuZXJhdG9yU3RlcChnZW4sIHJlc29sdmUsIHJlamVjdCwgX25leHQsIF90aHJvdywgXCJ0aHJvd1wiLCBlcnIpO1xuICAgICAgfVxuXG4gICAgICBfbmV4dCh1bmRlZmluZWQpO1xuICAgIH0pO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9hc3luY1RvR2VuZXJhdG9yOyIsImZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfYXJyYXlXaXRoSG9sZXM7IiwiZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkge1xuICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoYXJyKSkpIHJldHVybjtcbiAgdmFyIF9hcnIgPSBbXTtcbiAgdmFyIF9uID0gdHJ1ZTtcbiAgdmFyIF9kID0gZmFsc2U7XG4gIHZhciBfZSA9IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIGZvciAodmFyIF9pID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHtcbiAgICAgIF9hcnIucHVzaChfcy52YWx1ZSk7XG5cbiAgICAgIGlmIChpICYmIF9hcnIubGVuZ3RoID09PSBpKSBicmVhaztcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9kID0gdHJ1ZTtcbiAgICBfZSA9IGVycjtcbiAgfSBmaW5hbGx5IHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFfbiAmJiBfaVtcInJldHVyblwiXSAhPSBudWxsKSBfaVtcInJldHVyblwiXSgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoX2QpIHRocm93IF9lO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBfYXJyO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9pdGVyYWJsZVRvQXJyYXlMaW1pdDsiLCJmdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShhcnIsIGxlbikge1xuICBpZiAobGVuID09IG51bGwgfHwgbGVuID4gYXJyLmxlbmd0aCkgbGVuID0gYXJyLmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIHtcbiAgICBhcnIyW2ldID0gYXJyW2ldO1xuICB9XG5cbiAgcmV0dXJuIGFycjI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2FycmF5TGlrZVRvQXJyYXk7IiwidmFyIGFycmF5TGlrZVRvQXJyYXkgPSByZXF1aXJlKFwiLi9hcnJheUxpa2VUb0FycmF5XCIpO1xuXG5mdW5jdGlvbiBfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkobywgbWluTGVuKSB7XG4gIGlmICghbykgcmV0dXJuO1xuICBpZiAodHlwZW9mIG8gPT09IFwic3RyaW5nXCIpIHJldHVybiBhcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG4gIHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTtcbiAgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTtcbiAgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7XG4gIGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheTsiLCJmdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9ub25JdGVyYWJsZVJlc3Q7IiwidmFyIGFycmF5V2l0aEhvbGVzID0gcmVxdWlyZShcIi4vYXJyYXlXaXRoSG9sZXNcIik7XG5cbnZhciBpdGVyYWJsZVRvQXJyYXlMaW1pdCA9IHJlcXVpcmUoXCIuL2l0ZXJhYmxlVG9BcnJheUxpbWl0XCIpO1xuXG52YXIgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkgPSByZXF1aXJlKFwiLi91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheVwiKTtcblxudmFyIG5vbkl0ZXJhYmxlUmVzdCA9IHJlcXVpcmUoXCIuL25vbkl0ZXJhYmxlUmVzdFwiKTtcblxuZnVuY3Rpb24gX3NsaWNlZFRvQXJyYXkoYXJyLCBpKSB7XG4gIHJldHVybiBhcnJheVdpdGhIb2xlcyhhcnIpIHx8IGl0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgfHwgdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkoYXJyLCBpKSB8fCBub25JdGVyYWJsZVJlc3QoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBfc2xpY2VkVG9BcnJheTsiLCJmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9jbGFzc0NhbGxDaGVjazsiLCJmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTtcbiAgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICByZXR1cm4gQ29uc3RydWN0b3I7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2NyZWF0ZUNsYXNzOyIsImZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9kZWZpbmVQcm9wZXJ0eTsiLCJmdW5jdGlvbiBlKGUscix0LG4sYSxpLG8pe3RyeXt2YXIgdT1lW2ldKG8pLGM9dS52YWx1ZX1jYXRjaChlKXtyZXR1cm4gdm9pZCB0KGUpfXUuZG9uZT9yKGMpOlByb21pc2UucmVzb2x2ZShjKS50aGVuKG4sYSl9ZnVuY3Rpb24gcihyKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdD10aGlzLG49YXJndW1lbnRzO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24oYSxpKXt2YXIgbz1yLmFwcGx5KHQsbik7ZnVuY3Rpb24gdShyKXtlKG8sYSxpLHUsYyxcIm5leHRcIixyKX1mdW5jdGlvbiBjKHIpe2UobyxhLGksdSxjLFwidGhyb3dcIixyKX11KHZvaWQgMCl9KSl9fWZ1bmN0aW9uIHQoZSxyKXtyZXR1cm4gZnVuY3Rpb24oZSl7aWYoQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gZX0oZSl8fGZ1bmN0aW9uKGUscil7aWYoXCJ1bmRlZmluZWRcIj09dHlwZW9mIFN5bWJvbHx8IShTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGUpKSlyZXR1cm47dmFyIHQ9W10sbj0hMCxhPSExLGk9dm9pZCAwO3RyeXtmb3IodmFyIG8sdT1lW1N5bWJvbC5pdGVyYXRvcl0oKTshKG49KG89dS5uZXh0KCkpLmRvbmUpJiYodC5wdXNoKG8udmFsdWUpLCFyfHx0Lmxlbmd0aCE9PXIpO249ITApO31jYXRjaChlKXthPSEwLGk9ZX1maW5hbGx5e3RyeXtufHxudWxsPT11LnJldHVybnx8dS5yZXR1cm4oKX1maW5hbGx5e2lmKGEpdGhyb3cgaX19cmV0dXJuIHR9KGUscil8fGZ1bmN0aW9uKGUscil7aWYoIWUpcmV0dXJuO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBlKXJldHVybiBuKGUscik7dmFyIHQ9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLnNsaWNlKDgsLTEpO1wiT2JqZWN0XCI9PT10JiZlLmNvbnN0cnVjdG9yJiYodD1lLmNvbnN0cnVjdG9yLm5hbWUpO2lmKFwiTWFwXCI9PT10fHxcIlNldFwiPT09dClyZXR1cm4gQXJyYXkuZnJvbShlKTtpZihcIkFyZ3VtZW50c1wiPT09dHx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QodCkpcmV0dXJuIG4oZSxyKX0oZSxyKXx8ZnVuY3Rpb24oKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpfSgpfWZ1bmN0aW9uIG4oZSxyKXsobnVsbD09cnx8cj5lLmxlbmd0aCkmJihyPWUubGVuZ3RoKTtmb3IodmFyIHQ9MCxuPW5ldyBBcnJheShyKTt0PHI7dCsrKW5bdF09ZVt0XTtyZXR1cm4gbn12YXIgYT1mdW5jdGlvbigpe3ZhciBlPXIocmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoKGZ1bmN0aW9uIGUodCl7cmV0dXJuIHJlZ2VuZXJhdG9yUnVudGltZS53cmFwKChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDpyZXR1cm4gZS5hYnJ1cHQoXCJyZXR1cm5cIixuZXcgUHJvbWlzZShmdW5jdGlvbigpe3ZhciBlPXIocmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoKGZ1bmN0aW9uIGUocixuKXt2YXIgYSxvO3JldHVybiByZWdlbmVyYXRvclJ1bnRpbWUud3JhcCgoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6aWYobmF2aWdhdG9yLnBlcm1pc3Npb25zKXtlLm5leHQ9NDticmVha31uKG5ldyBET01FeGNlcHRpb24oXCJQZXJtaXNzaW9ucyBub3Qgc3VwcG9ydGVkXCIsXCJOT1RfU1VQUE9SVEVEX0VSUlwiKSksZS5uZXh0PTE2O2JyZWFrO2Nhc2UgNDpyZXR1cm4gZS5wcmV2PTQsZS5uZXh0PTcsbmF2aWdhdG9yLnBlcm1pc3Npb25zLnF1ZXJ5KHtuYW1lOnR9KTtjYXNlIDc6YT1lLnNlbnQsbz1mdW5jdGlvbiBlKHQpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLGUpLGkodC50YXJnZXQuc3RhdGUscixuKX0sYS5hZGRFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsbyksaShhLnN0YXRlLHIsbiksZS5uZXh0PTE2O2JyZWFrO2Nhc2UgMTM6ZS5wcmV2PTEzLGUudDA9ZS5jYXRjaCg0KSxuKGUudDApO2Nhc2UgMTY6Y2FzZVwiZW5kXCI6cmV0dXJuIGUuc3RvcCgpfX0pLGUsbnVsbCxbWzQsMTNdXSl9KSkpO3JldHVybiBmdW5jdGlvbihyLHQpe3JldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KCkpKTtjYXNlIDE6Y2FzZVwiZW5kXCI6cmV0dXJuIGUuc3RvcCgpfX0pLGUpfSkpKTtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0oKSxpPWZ1bmN0aW9uKGUscix0KXtzd2l0Y2goZSl7Y2FzZVwiZGVuaWVkXCI6dChuZXcgRE9NRXhjZXB0aW9uKFwiUGVybWlzc2lvbiBkZW5pZWRcIixcIk5PVF9BTExPV0VEX0VSUlwiKSk7YnJlYWs7ZGVmYXVsdDpyKGUpfX0sbz1mdW5jdGlvbigpe3ZhciBlPXIocmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoKGZ1bmN0aW9uIGUobixpKXtyZXR1cm4gcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOnJldHVybiBlLmFicnVwdChcInJldHVyblwiLG5ldyBQcm9taXNlKGZ1bmN0aW9uKCl7dmFyIGU9cihyZWdlbmVyYXRvclJ1bnRpbWUubWFyaygoZnVuY3Rpb24gZShyLG8pe3ZhciB1LGMscztyZXR1cm4gcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOmlmKG5hdmlnYXRvci5tZWRpYURldmljZXMpe2UubmV4dD00O2JyZWFrfW8obmV3IERPTUV4Y2VwdGlvbihcIk1lZGlhRGV2aWNlcyBub3Qgc3VwcG9ydGVkXCIsXCJOT1RfRk9VTkRfRVJSXCIpKSxlLm5leHQ9MjQ7YnJlYWs7Y2FzZSA0OnJldHVybiBlLnByZXY9NCxlLnQwPVByb21pc2UsZS5uZXh0PTgsYShuKTtjYXNlIDg6cmV0dXJuIGUudDE9ZS5zZW50LGUubmV4dD0xMSxuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYShpKTtjYXNlIDExOnJldHVybiBlLnQyPWUuc2VudCxlLnQzPVtlLnQxLGUudDJdLGUubmV4dD0xNSxlLnQwLmFsbC5jYWxsKGUudDAsZS50Myk7Y2FzZSAxNTp1PWUuc2VudCxjPXQodSwyKSxzPWNbMV0scihzKSxlLm5leHQ9MjQ7YnJlYWs7Y2FzZSAyMTplLnByZXY9MjEsZS50ND1lLmNhdGNoKDQpLG8oZS50NCk7Y2FzZSAyNDpjYXNlXCJlbmRcIjpyZXR1cm4gZS5zdG9wKCl9fSksZSxudWxsLFtbNCwyMV1dKX0pKSk7cmV0dXJuIGZ1bmN0aW9uKHIsdCl7cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0oKSkpO2Nhc2UgMTpjYXNlXCJlbmRcIjpyZXR1cm4gZS5zdG9wKCl9fSksZSl9KSkpO3JldHVybiBmdW5jdGlvbihyLHQpe3JldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KCk7ZXhwb3J0e2EgYXMgZ2V0UGVybWlzc2lvbixvIGFzIGdldFVzZXJNZWRpYVN0cmVhbX07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSm1hV3hsSWpvaWFXNWtaWGd1WlhNdWFuTWlMQ0p6YjNWeVkyVnpJanBiSWk0dUwzTnlZeTluWlhSUVpYSnRhWE56YVc5dUxtcHpJaXdpTGk0dmMzSmpMMmRsZEZWelpYSk5aV1JwWVZOMGNtVmhiUzVxY3lKZExDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SXZLaXBjYmlBcUlGSmxkSFZ5Ym5NZ1lTQndjbTl0YVhObElISmxjMjlzZG1Wa0lIZG9aVzRnZEdobElIQmxjbTFwYzNOcGIyNGdhWE1nWjNKaGJuUmxaQ0JpZVNCMGFHVWdkWE5sY2x4dUlDb2dRSEJoY21GdElIQmxjbTFwYzNOcGIyNU9ZVzFsSUNBZ0lDQWdJQ0FnSUNBZ1RtRnRaU0J2WmlCMGFHVWdjR1Z5YldsemMybHZiaTRnUUhObFpTQm9kSFJ3Y3pvdkwzY3pZeTVuYVhSb2RXSXVhVzh2Y0dWeWJXbHpjMmx2Ym5NdkkyVnVkVzFrWldZdGNHVnliV2x6YzJsdmJtNWhiV1ZjYmlBcUlFQnlaWFIxY201eklIdFFjbTl0YVhObGZWeHVJQ292WEc1bGVIQnZjblFnWkdWbVlYVnNkQ0JoYzNsdVl5QW9jR1Z5YldsemMybHZiazVoYldVcElEMCtJSHRjYmx4MGNtVjBkWEp1SUc1bGR5QlFjbTl0YVhObEtHRnplVzVqSUNoeVpYTnZiSFpsTENCeVpXcGxZM1FwSUQwK0lIdGNibHgwWEhScFppQW9JVzVoZG1sbllYUnZjaTV3WlhKdGFYTnphVzl1Y3lrZ2UxeHVYSFJjZEZ4MGNtVnFaV04wS0c1bGR5QkVUMDFGZUdObGNIUnBiMjRvSjFCbGNtMXBjM05wYjI1eklHNXZkQ0J6ZFhCd2IzSjBaV1FuTENBblRrOVVYMU5WVUZCUFVsUkZSRjlGVWxJbktTbGNibHgwWEhSOUlHVnNjMlVnZTF4dVhIUmNkRngwZEhKNUlIdGNibHgwWEhSY2RGeDBZMjl1YzNRZ2NHVnliV2x6YzJsdmJsTjBZWFIxY3lBOUlHRjNZV2wwSUc1aGRtbG5ZWFJ2Y2k1d1pYSnRhWE56YVc5dWN5NXhkV1Z5ZVNoN0lHNWhiV1U2SUhCbGNtMXBjM05wYjI1T1lXMWxJSDBwWEc1Y2RGeDBYSFJjZEdOdmJuTjBJRzl1UTJoaGJtZGxJRDBnS0dWMlpXNTBLU0E5UGlCN1hHNWNkRngwWEhSY2RGeDBjR1Z5YldsemMybHZibE4wWVhSMWN5NXlaVzF2ZG1WRmRtVnVkRXhwYzNSbGJtVnlLQ2RqYUdGdVoyVW5MQ0J2YmtOb1lXNW5aU2xjYmx4MFhIUmNkRngwWEhSeVpYTnZiSFpsVDNKU1pXcGxZM1JDWVhObFpFOXVVM1JoZEdVb1pYWmxiblF1ZEdGeVoyVjBMbk4wWVhSbExDQnlaWE52YkhabExDQnlaV3BsWTNRcFhHNWNkRngwWEhSY2RIMWNibHgwWEhSY2RGeDBjR1Z5YldsemMybHZibE4wWVhSMWN5NWhaR1JGZG1WdWRFeHBjM1JsYm1WeUtDZGphR0Z1WjJVbkxDQnZia05vWVc1blpTbGNibHgwWEhSY2RGeDBjbVZ6YjJ4MlpVOXlVbVZxWldOMFFtRnpaV1JQYmxOMFlYUmxLSEJsY20xcGMzTnBiMjVUZEdGMGRYTXVjM1JoZEdVc0lISmxjMjlzZG1Vc0lISmxhbVZqZENsY2JseDBYSFJjZEgwZ1kyRjBZMmdnS0dWeWNtOXlLU0I3WEc1Y2RGeDBYSFJjZEhKbGFtVmpkQ2hsY25KdmNpbGNibHgwWEhSY2RIMWNibHgwWEhSOVhHNWNkSDBwWEc1OVhHNWNibU52Ym5OMElISmxjMjlzZG1WUGNsSmxhbVZqZEVKaGMyVmtUMjVUZEdGMFpTQTlJQ2h6ZEdGMFpTd2djbVZ6YjJ4MlpTd2djbVZxWldOMEtTQTlQaUI3WEc1Y2RITjNhWFJqYUNBb2MzUmhkR1VwSUh0Y2JseDBYSFJqWVhObElDZGtaVzVwWldRbk9seHVYSFJjZEZ4MGNtVnFaV04wS0c1bGR5QkVUMDFGZUdObGNIUnBiMjRvSjFCbGNtMXBjM05wYjI0Z1pHVnVhV1ZrSnl3Z0owNVBWRjlCVEV4UFYwVkVYMFZTVWljcEtWeHVYSFJjZEZ4MFluSmxZV3RjYmx4MFhIUmtaV1poZFd4ME9seHVYSFJjZEZ4MGNtVnpiMngyWlNoemRHRjBaU2xjYmx4MGZWeHVmVnh1SWl3aWFXMXdiM0owSUdkbGRGQmxjbTFwYzNOcGIyNGdabkp2YlNBbkxpOW5aWFJRWlhKdGFYTnphVzl1SjF4dVhHNHZLaXBjYmlBcUlGSmxkSFZ5Ym5NZ1lTQndjbTl0YVhObElISmxjMjlzZG1Wa0lIZG9aVzRnZEdobElIQmxjbTFwYzNOcGIyNGdhWE1nWjNKaGJuUmxaQ0JpZVNCMGFHVWdkWE5sY2lCaGJtUWdkR2hsSUhOMGNtVmhiU0JwY3lCeVpYUnlhV1YyWldSY2JpQXFJRUJ3WVhKaGJTQndaWEp0YVhOemFXOXVUbUZ0WlNBZ0lDQWdJQ0FnSUNBZ0lFNWhiV1VnYjJZZ2RHaGxJSEJsY20xcGMzTnBiMjR1SUVCelpXVWdhSFIwY0hNNkx5OTNNMk11WjJsMGFIVmlMbWx2TDNCbGNtMXBjM05wYjI1ekx5TmxiblZ0WkdWbUxYQmxjbTFwYzNOcGIyNXVZVzFsWEc0Z0tpQkFjR0Z5WVcwZ2JXVmthV0ZUZEhKbFlXMURiMjV6ZEhKaGFXNTBjeUFnSUNCRGIyNXpkSEpoYVc1MGN5QnZZbXBsWTNRdUlFQnpaV1VnYUhSMGNITTZMeTlrWlhabGJHOXdaWEl1Ylc5NmFXeHNZUzV2Y21jdlpXNHRWVk12Wkc5amN5OVhaV0l2UVZCSkwwMWxaR2xoVTNSeVpXRnRRMjl1YzNSeVlXbHVkSE5jYmlBcUlFQnlaWFIxY201eklIdFFjbTl0YVhObGZWeHVJQ292WEc1bGVIQnZjblFnWkdWbVlYVnNkQ0JoYzNsdVl5QW9jR1Z5YldsemMybHZiazVoYldVc0lHMWxaR2xoVTNSeVpXRnRRMjl1YzNSeVlXbHVkSE1wSUQwK0lIdGNibHgwY21WMGRYSnVJRzVsZHlCUWNtOXRhWE5sS0dGemVXNWpJQ2h5WlhOdmJIWmxMQ0J5WldwbFkzUXBJRDArSUh0Y2JseDBYSFJwWmlBb0lXNWhkbWxuWVhSdmNpNXRaV1JwWVVSbGRtbGpaWE1wSUh0Y2JseDBYSFJjZEhKbGFtVmpkQ2h1WlhjZ1JFOU5SWGhqWlhCMGFXOXVLQ2ROWldScFlVUmxkbWxqWlhNZ2JtOTBJSE4xY0hCdmNuUmxaQ2NzSUNkT1QxUmZSazlWVGtSZlJWSlNKeWtwWEc1Y2RGeDBmU0JsYkhObElIdGNibHgwWEhSY2RIUnllU0I3WEc1Y2RGeDBYSFJjZEdOdmJuTjBJRnNzSUhOMGNtVmhiVjBnUFNCaGQyRnBkQ0JRY205dGFYTmxMbUZzYkNoYlhHNWNkRngwWEhSY2RGeDBZWGRoYVhRZ1oyVjBVR1Z5YldsemMybHZiaWh3WlhKdGFYTnphVzl1VG1GdFpTa3NYRzVjZEZ4MFhIUmNkRngwWVhkaGFYUWdibUYyYVdkaGRHOXlMbTFsWkdsaFJHVjJhV05sY3k1blpYUlZjMlZ5VFdWa2FXRW9iV1ZrYVdGVGRISmxZVzFEYjI1emRISmhhVzUwY3lrc1hHNWNkRngwWEhSY2RGMHBYRzVjZEZ4MFhIUmNkSEpsYzI5c2RtVW9jM1J5WldGdEtWeHVYSFJjZEZ4MGZTQmpZWFJqYUNBb1pYSnliM0lwSUh0Y2JseDBYSFJjZEZ4MGNtVnFaV04wS0dWeWNtOXlLVnh1WEhSY2RGeDBmVnh1WEhSY2RIMWNibHgwZlNsY2JuMWNiaUpkTENKdVlXMWxjeUk2V3lKd1pYSnRhWE56YVc5dVRtRnRaU0lzSWxCeWIyMXBjMlVpTENKeVpYTnZiSFpsSWl3aWNtVnFaV04wSWl3aWJtRjJhV2RoZEc5eUlpd2ljR1Z5YldsemMybHZibk1pTENKRVQwMUZlR05sY0hScGIyNGlMQ0p4ZFdWeWVTSXNJbTVoYldVaUxDSndaWEp0YVhOemFXOXVVM1JoZEhWeklpd2liMjVEYUdGdVoyVWlMQ0psZG1WdWRDSXNJbkpsYlc5MlpVVjJaVzUwVEdsemRHVnVaWElpTENKeVpYTnZiSFpsVDNKU1pXcGxZM1JDWVhObFpFOXVVM1JoZEdVaUxDSjBZWEpuWlhRaUxDSnpkR0YwWlNJc0ltRmtaRVYyWlc1MFRHbHpkR1Z1WlhJaUxDSnRaV1JwWVZOMGNtVmhiVU52Ym5OMGNtRnBiblJ6SWl3aWJXVmthV0ZFWlhacFkyVnpJaXdpWjJWMFVHVnliV2x6YzJsdmJpSXNJbWRsZEZWelpYSk5aV1JwWVNJc0ltRnNiQ0lzSW5OMGNtVmhiU0pkTENKdFlYQndhVzVuY3lJNkltMTNRMEZMUVN4clJFRkJaU3hYUVVGUFFTdzBSMEZEWkN4SlFVRkpReXh2UkVGQlVTeFhRVUZQUXl4RlFVRlRReXc0UmtGRE4wSkRMRlZCUVZWRExEUkNRVU5rUml4RlFVRlBMRWxCUVVsSExHRkJRV0VzTkVKQlFUWkNMSE5GUVVkeVFrWXNWVUZCVlVNc1dVRkJXVVVzVFVGQlRTeERRVUZGUXl4TFFVRk5VaXhYUVVFM1JGTXNVMEZEUVVNc1JVRkJWeXhUUVVGWVFTeEZRVUZaUXl4SFFVTnFRa1lzUlVGQmFVSkhMRzlDUVVGdlFpeFRRVUZWUml4SFFVTXZRMGNzUlVGQk5FSkdMRVZCUVUxSExFOUJRVTlETEUxQlFVOWlMRVZCUVZORExFbEJSVEZFVFN4RlFVRnBRazhzYVVKQlFXbENMRk5CUVZWT0xFZEJRelZEUnl4RlFVRTBRa29zUlVGQmFVSk5MRTFCUVU5aUxFVkJRVk5ETEhGRVFVVTNSRUVzTms1QlRVVlZMRVZCUVRoQ0xGTkJRVU5GTEVWQlFVOWlMRVZCUVZORExGVkJRelZEV1N4UFFVTkdMRk5CUTBwYUxFVkJRVThzU1VGQlNVY3NZVUZCWVN4dlFrRkJjVUlzYTBOQlJ6ZERTaXhGUVVGUllTeHRSRU4yUWtrc1YwRkJUMllzUlVGQlowSnBRaXcwUjBGRE9VSXNTVUZCU1doQ0xHOUVRVUZSTEZkQlFVOURMRVZCUVZORExHZEhRVU0zUWtNc1ZVRkJWV01zTmtKQlEyUm1MRVZCUVU4c1NVRkJTVWNzWVVGQllTdzJRa0ZCT0VJc09FUkJSelZDVEN4cFFrRkRiRUpyUWl4RlFVRmpia0lzZFVOQlEyUkpMRlZCUVZWakxHRkJRV0ZGTEdGQlFXRklMRGhFUVVaV1NTdzRRMEZCZUVKRExFOUJTVlJ3UWl4RlFVRlJiMElzY1VSQlJWSnVRaUo5XG4iLCJpbXBvcnQgeyBnZXRVc2VyTWVkaWFTdHJlYW0gfSBmcm9tICdAdW50ZW1wcy91c2VyLXBlcm1pc3Npb25zLXV0aWxzJ1xuXG5jbGFzcyBWb2NhbCB7XG5cdHN0YXRpYyBkZWZhdWx0T3B0aW9ucyA9IHtcblx0XHRncmFtbWFyczogbnVsbCxcblx0XHRsYW5nOiAnZW4tVVMnLFxuXHRcdGNvbnRpbnVvdXM6IGZhbHNlLFxuXHRcdGludGVyaW1SZXN1bHRzOiBmYWxzZSxcblx0XHRtYXhBbHRlcm5hdGl2ZXM6IDEsXG5cdFx0c2VydmljZVVSSTogbnVsbCxcblx0fVxuXG5cdHN0YXRpYyBldmVudFR5cGVzID0ge1xuXHRcdEFVRElPX0VORDogJ2F1ZGlvZW5kJyxcblx0XHRBVURJT19TVEFSVDogJ2F1ZGlvc3RhcnQnLFxuXHRcdEVORDogJ2VuZCcsXG5cdFx0RVJST1I6ICdlcnJvcicsXG5cdFx0Tk9fTUFUQ0g6ICdub21hdGNoJyxcblx0XHRSRVNVTFQ6ICdyZXN1bHQnLFxuXHRcdFNPVU5EX0VORDogJ3NvdW5kZW5kJyxcblx0XHRTT1VORF9TVEFSVDogJ3NvdW5kc3RhcnQnLFxuXHRcdFNQRUVDSF9FTkQ6ICdzcGVlY2hlbmQnLFxuXHRcdFNQRUVDSF9TVEFSVDogJ3NwZWVjaHN0YXJ0Jyxcblx0XHRTVEFSVDogJ3N0YXJ0Jyxcblx0fVxuXG5cdHN0YXRpYyBnZXQgaXNTdXBwb3J0ZWQoKSB7XG5cdFx0cmV0dXJuICEhVm9jYWwuX3Jlc29sdmVTcGVlY2hSZWNvZ25pdGlvbigpXG5cdH1cblxuXHRzdGF0aWMgc2V0IGlzU3VwcG9ydGVkKF8pIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ1lvdSBjYW5ub3Qgc2V0IGlzU3VwcG9ydGVkIGRpcmVjdGx5LicpXG5cdH1cblxuXHRfaW5zdGFuY2UgPSBudWxsXG5cdF9saXN0ZW5lcnMgPSBudWxsXG5cblx0Y29uc3RydWN0b3Iob3B0aW9ucykge1xuXHRcdGNvbnN0IFNwZWVjaFJlY29nbml0aW9uID0gVm9jYWwuX3Jlc29sdmVTcGVlY2hSZWNvZ25pdGlvbigpXG5cdFx0aWYgKCFTcGVlY2hSZWNvZ25pdGlvbikge1xuXHRcdFx0dGhyb3cgbmV3IERPTUV4Y2VwdGlvbignU3BlZWNoUmVjb2duaXRpb24gbm90IHN1cHBvcnRlZCcsICdOT1RfU1VQUE9SVEVEX0VSUicpXG5cdFx0fVxuXG5cdFx0dGhpcy5faW5zdGFuY2UgPSBuZXcgU3BlZWNoUmVjb2duaXRpb24oKVxuXHRcdHRoaXMuX2xpc3RlbmVycyA9IHt9XG5cblx0XHRPYmplY3QuZW50cmllcyh7XG5cdFx0XHQuLi5Wb2NhbC5kZWZhdWx0T3B0aW9ucyxcblx0XHRcdC4uLihvcHRpb25zIHx8IHt9KSxcblx0XHR9KS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcblx0XHRcdGlmIChrZXkgPT09ICdncmFtbWFycycgJiYgIXZhbHVlKSB7XG5cdFx0XHRcdGNvbnN0IFNwZWVjaEdyYW1tYXJMaXN0ID0gVm9jYWwuX3Jlc29sdmVTcGVlY2hHcmFtbWFyTGlzdCgpXG5cdFx0XHRcdGlmICghIVNwZWVjaEdyYW1tYXJMaXN0KSB7XG5cdFx0XHRcdFx0dmFsdWUgPSBuZXcgU3BlZWNoR3JhbW1hckxpc3QoKVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9pbnN0YW5jZVtrZXldID0gdmFsdWVcblx0XHR9KVxuXHR9XG5cblx0Z2V0IGluc3RhbmNlKCkge1xuXHRcdHJldHVybiB0aGlzLl9pbnN0YW5jZVxuXHR9XG5cblx0c2V0IGluc3RhbmNlKF8pIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ1lvdSBjYW5ub3Qgc2V0IGluc3RhbmNlIGRpcmVjdGx5LicpXG5cdH1cblxuXHRhc3luYyBzdGFydCgpIHtcblx0XHRpZiAoISF0aGlzLl9pbnN0YW5jZSkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29uc3Qgc3RyZWFtID0gYXdhaXQgZ2V0VXNlck1lZGlhU3RyZWFtKCdtaWNyb3Bob25lJywgeyBhdWRpbzogdHJ1ZSB9KVxuXHRcdFx0XHRpZiAoIXN0cmVhbSkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIHJldHJpZXZlIHRoZSBzdHJlYW0gZnJvbSBtZWRpYSBkZXZpY2UnKVxuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuX2luc3RhbmNlLnN0YXJ0KClcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdGNvbnN0IGVycm9ySGFuZGxlciA9IHRoaXMuX2xpc3RlbmVycy5lcnJvclxuXHRcdFx0XHRpZiAoISFlcnJvckhhbmRsZXIpIHtcblx0XHRcdFx0XHRlcnJvckhhbmRsZXIoZXJyb3IpXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpc1xuXHR9XG5cblx0c3RvcCgpIHtcblx0XHRpZiAoISF0aGlzLl9pbnN0YW5jZSkge1xuXHRcdFx0dGhpcy5faW5zdGFuY2Uuc3RvcCgpXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXNcblx0fVxuXG5cdGFib3J0KCkge1xuXHRcdGlmICghIXRoaXMuX2luc3RhbmNlKSB7XG5cdFx0XHR0aGlzLl9pbnN0YW5jZS5hYm9ydCgpXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXNcblx0fVxuXG5cdGFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBjYWxsYmFjaykge1xuXHRcdGlmICghIXRoaXMuX2luc3RhbmNlICYmIHRoaXMuX2luY2x1ZGVzRXZlbnRUeXBlKGV2ZW50VHlwZSkpIHtcblx0XHRcdGlmICghIXRoaXMuX2xpc3RlbmVyc1tldmVudFR5cGVdKSB7XG5cdFx0XHRcdHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudFR5cGUpXG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGhhbmRsZXIgPSAoZXZlbnQpID0+IHtcblx0XHRcdFx0bGV0IGFkZGl0aW9uYWxBcmdzID0gW11cblx0XHRcdFx0aWYgKGV2ZW50VHlwZSA9PT0gVm9jYWwuZXZlbnRUeXBlcy5SRVNVTFQpIHtcblx0XHRcdFx0XHRpZiAoISFldmVudC5yZXN1bHRzICYmIGV2ZW50LnJlc3VsdHMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0YWRkaXRpb25hbEFyZ3MucHVzaChldmVudC5yZXN1bHRzWzBdWzBdLnRyYW5zY3JpcHQpXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0ISFjYWxsYmFjayAmJiBjYWxsYmFjay5hcHBseSh0aGlzLCBbZXZlbnQsIC4uLmFkZGl0aW9uYWxBcmdzXSlcblx0XHRcdH1cblx0XHRcdHRoaXMuX2luc3RhbmNlLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBoYW5kbGVyKVxuXG5cdFx0XHR0aGlzLl9saXN0ZW5lcnNbZXZlbnRUeXBlXSA9IGhhbmRsZXJcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpc1xuXHR9XG5cblx0cmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudFR5cGUpIHtcblx0XHRjb25zdCBoYW5kbGVyID0gdGhpcy5fbGlzdGVuZXJzW2V2ZW50VHlwZV1cblx0XHR0aGlzLl9pbnN0YW5jZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgaGFuZGxlcilcblxuXHRcdGRlbGV0ZSB0aGlzLl9saXN0ZW5lcnNbZXZlbnRUeXBlXVxuXG5cdFx0cmV0dXJuIHRoaXNcblx0fVxuXG5cdGNsZWFudXAoKSB7XG5cdFx0dGhpcy5zdG9wKClcblxuXHRcdE9iamVjdC5rZXlzKHRoaXMuX2xpc3RlbmVycykuZm9yRWFjaCgoa2V5KSA9PiB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoa2V5KSlcblx0XHR0aGlzLl9pbnN0YW5jZSA9IG51bGxcblxuXHRcdHJldHVybiB0aGlzXG5cdH1cblxuXHRfaW5jbHVkZXNFdmVudFR5cGUoZXZlbnRUeXBlKSB7XG5cdFx0cmV0dXJuICEhT2JqZWN0LnZhbHVlcyhWb2NhbC5ldmVudFR5cGVzKS5maW5kKCh0eXBlKSA9PiB0eXBlID09PSBldmVudFR5cGUpXG5cdH1cblxuXHRzdGF0aWMgX3Jlc29sdmVTcGVlY2hSZWNvZ25pdGlvbigpIHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0d2luZG93LlNwZWVjaFJlY29nbml0aW9uIHx8XG5cdFx0XHR3aW5kb3cud2Via2l0U3BlZWNoUmVjb2duaXRpb24gfHxcblx0XHRcdHdpbmRvdy5tb3pTcGVlY2hSZWNvZ25pdGlvbiB8fFxuXHRcdFx0d2luZG93Lm1zU3BlZWNoUmVjb2duaXRpb25cblx0XHQpXG5cdH1cblxuXHRzdGF0aWMgX3Jlc29sdmVTcGVlY2hHcmFtbWFyTGlzdCgpIHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0d2luZG93LlNwZWVjaEdyYW1tYXJMaXN0IHx8XG5cdFx0XHR3aW5kb3cud2Via2l0U3BlZWNoR3JhbW1hckxpc3QgfHxcblx0XHRcdHdpbmRvdy5tb3pTcGVlY2hHcmFtbWFyTGlzdCB8fFxuXHRcdFx0d2luZG93Lm1zU3BlZWNoR3JhbW1hckxpc3Rcblx0XHQpXG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVm9jYWxcbiJdLCJuYW1lcyI6WyJydW50aW1lIiwiZXhwb3J0cyIsIk9wIiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duIiwiaGFzT3duUHJvcGVydHkiLCIkU3ltYm9sIiwiU3ltYm9sIiwiaXRlcmF0b3JTeW1ib2wiLCJpdGVyYXRvciIsImFzeW5jSXRlcmF0b3JTeW1ib2wiLCJhc3luY0l0ZXJhdG9yIiwidG9TdHJpbmdUYWdTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsImRlZmluZSIsIm9iaiIsImtleSIsInZhbHVlIiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwid3JpdGFibGUiLCJlcnIiLCJ3cmFwIiwiaW5uZXJGbiIsIm91dGVyRm4iLCJzZWxmIiwidHJ5TG9jc0xpc3QiLCJwcm90b0dlbmVyYXRvciIsIkdlbmVyYXRvciIsImdlbmVyYXRvciIsImNyZWF0ZSIsImNvbnRleHQiLCJDb250ZXh0IiwiX2ludm9rZSIsInN0YXRlIiwibWV0aG9kIiwiYXJnIiwiRXJyb3IiLCJkb25lUmVzdWx0IiwiZGVsZWdhdGUiLCJkZWxlZ2F0ZVJlc3VsdCIsIm1heWJlSW52b2tlRGVsZWdhdGUiLCJDb250aW51ZVNlbnRpbmVsIiwic2VudCIsIl9zZW50IiwiZGlzcGF0Y2hFeGNlcHRpb24iLCJhYnJ1cHQiLCJyZWNvcmQiLCJ0cnlDYXRjaCIsInR5cGUiLCJkb25lIiwibWFrZUludm9rZU1ldGhvZCIsImZuIiwiY2FsbCIsIkdlbmVyYXRvckZ1bmN0aW9uIiwiR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUiLCJJdGVyYXRvclByb3RvdHlwZSIsInRoaXMiLCJnZXRQcm90byIsImdldFByb3RvdHlwZU9mIiwiTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUiLCJ2YWx1ZXMiLCJHcCIsImRlZmluZUl0ZXJhdG9yTWV0aG9kcyIsImZvckVhY2giLCJBc3luY0l0ZXJhdG9yIiwiUHJvbWlzZUltcGwiLCJwcmV2aW91c1Byb21pc2UiLCJjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZyIsInJlc29sdmUiLCJyZWplY3QiLCJpbnZva2UiLCJyZXN1bHQiLCJfX2F3YWl0IiwidGhlbiIsInVud3JhcHBlZCIsImVycm9yIiwidW5kZWZpbmVkIiwiVHlwZUVycm9yIiwiaW5mbyIsInJlc3VsdE5hbWUiLCJuZXh0IiwibmV4dExvYyIsInB1c2hUcnlFbnRyeSIsImxvY3MiLCJlbnRyeSIsInRyeUxvYyIsImNhdGNoTG9jIiwiZmluYWxseUxvYyIsImFmdGVyTG9jIiwidHJ5RW50cmllcyIsInB1c2giLCJyZXNldFRyeUVudHJ5IiwiY29tcGxldGlvbiIsInJlc2V0IiwiaXRlcmFibGUiLCJpdGVyYXRvck1ldGhvZCIsImlzTmFOIiwibGVuZ3RoIiwiaSIsImNvbnN0cnVjdG9yIiwiZGlzcGxheU5hbWUiLCJpc0dlbmVyYXRvckZ1bmN0aW9uIiwiZ2VuRnVuIiwiY3RvciIsIm5hbWUiLCJtYXJrIiwic2V0UHJvdG90eXBlT2YiLCJfX3Byb3RvX18iLCJhd3JhcCIsImFzeW5jIiwiUHJvbWlzZSIsIml0ZXIiLCJ0b1N0cmluZyIsImtleXMiLCJvYmplY3QiLCJyZXZlcnNlIiwicG9wIiwic2tpcFRlbXBSZXNldCIsInByZXYiLCJjaGFyQXQiLCJzbGljZSIsInN0b3AiLCJyb290UmVjb3JkIiwicnZhbCIsImV4Y2VwdGlvbiIsImhhbmRsZSIsImxvYyIsImNhdWdodCIsImhhc0NhdGNoIiwiaGFzRmluYWxseSIsImZpbmFsbHlFbnRyeSIsImNvbXBsZXRlIiwiZmluaXNoIiwiY2F0Y2giLCJ0aHJvd24iLCJkZWxlZ2F0ZVlpZWxkIiwibW9kdWxlIiwicmVnZW5lcmF0b3JSdW50aW1lIiwiYWNjaWRlbnRhbFN0cmljdE1vZGUiLCJGdW5jdGlvbiIsImFzeW5jR2VuZXJhdG9yU3RlcCIsImdlbiIsIl9uZXh0IiwiX3Rocm93IiwiYXJncyIsImFyZ3VtZW50cyIsImFwcGx5IiwiYXJyIiwiQXJyYXkiLCJpc0FycmF5IiwiX2FyciIsIl9uIiwiX2QiLCJfZSIsIl9zIiwiX2kiLCJsZW4iLCJhcnIyIiwibyIsIm1pbkxlbiIsImFycmF5TGlrZVRvQXJyYXkiLCJuIiwiZnJvbSIsInRlc3QiLCJhcnJheVdpdGhIb2xlcyIsIml0ZXJhYmxlVG9BcnJheUxpbWl0IiwidW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJub25JdGVyYWJsZVJlc3QiLCJpbnN0YW5jZSIsIkNvbnN0cnVjdG9yIiwiX2RlZmluZVByb3BlcnRpZXMiLCJ0YXJnZXQiLCJwcm9wcyIsImRlc2NyaXB0b3IiLCJwcm90b1Byb3BzIiwic3RhdGljUHJvcHMiLCJlIiwiciIsInQiLCJhIiwidSIsImMiLCJyZXR1cm4iLCJuYXZpZ2F0b3IiLCJwZXJtaXNzaW9ucyIsIkRPTUV4Y2VwdGlvbiIsInF1ZXJ5IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImFkZEV2ZW50TGlzdGVuZXIiLCJ0MCIsInMiLCJtZWRpYURldmljZXMiLCJ0MSIsImdldFVzZXJNZWRpYSIsInQyIiwidDMiLCJhbGwiLCJ0NCIsIlZvY2FsIiwib3B0aW9ucyIsIlNwZWVjaFJlY29nbml0aW9uIiwiX3Jlc29sdmVTcGVlY2hSZWNvZ25pdGlvbiIsIl9pbnN0YW5jZSIsIl9saXN0ZW5lcnMiLCJlbnRyaWVzIiwiZGVmYXVsdE9wdGlvbnMiLCJTcGVlY2hHcmFtbWFyTGlzdCIsIl9yZXNvbHZlU3BlZWNoR3JhbW1hckxpc3QiLCJfdGhpcyIsIl8iLCJnZXRVc2VyTWVkaWFTdHJlYW0iLCJhdWRpbyIsInN0YXJ0IiwiZXJyb3JIYW5kbGVyIiwiYWJvcnQiLCJldmVudFR5cGUiLCJjYWxsYmFjayIsIl9pbmNsdWRlc0V2ZW50VHlwZSIsImhhbmRsZXIiLCJldmVudCIsImFkZGl0aW9uYWxBcmdzIiwiZXZlbnRUeXBlcyIsIlJFU1VMVCIsInJlc3VsdHMiLCJ0cmFuc2NyaXB0IiwiX3RoaXMyIiwiX3RoaXMzIiwiZmluZCIsIndpbmRvdyIsIndlYmtpdFNwZWVjaFJlY29nbml0aW9uIiwibW96U3BlZWNoUmVjb2duaXRpb24iLCJtc1NwZWVjaFJlY29nbml0aW9uIiwid2Via2l0U3BlZWNoR3JhbW1hckxpc3QiLCJtb3pTcGVlY2hHcmFtbWFyTGlzdCIsIm1zU3BlZWNoR3JhbW1hckxpc3QiLCJncmFtbWFycyIsImxhbmciLCJjb250aW51b3VzIiwiaW50ZXJpbVJlc3VsdHMiLCJtYXhBbHRlcm5hdGl2ZXMiLCJzZXJ2aWNlVVJJIiwiQVVESU9fRU5EIiwiQVVESU9fU1RBUlQiLCJFTkQiLCJFUlJPUiIsIk5PX01BVENIIiwiU09VTkRfRU5EIiwiU09VTkRfU1RBUlQiLCJTUEVFQ0hfRU5EIiwiU1BFRUNIX1NUQVJUIiwiU1RBUlQiXSwibWFwcGluZ3MiOiIyZEFPQSxJQUFJQSxFQUFXLFNBQVVDLEdBR3ZCLElBQUlDLEVBQUtDLE9BQU9DLFVBQ1pDLEVBQVNILEVBQUdJLGVBRVpDLEVBQTRCLG1CQUFYQyxPQUF3QkEsT0FBUyxHQUNsREMsRUFBaUJGLEVBQVFHLFVBQVksYUFDckNDLEVBQXNCSixFQUFRSyxlQUFpQixrQkFDL0NDLEVBQW9CTixFQUFRTyxhQUFlLGdCQUUvQyxTQUFTQyxFQUFPQyxFQUFLQyxFQUFLQyxHQU94QixPQU5BZixPQUFPZ0IsZUFBZUgsRUFBS0MsRUFBSyxDQUM5QkMsTUFBT0EsRUFDUEUsWUFBWSxFQUNaQyxjQUFjLEVBQ2RDLFVBQVUsSUFFTE4sRUFBSUMsR0FFYixJQUVFRixFQUFPLEdBQUksSUFDWCxNQUFPUSxHQUNQUixFQUFTLFNBQVNDLEVBQUtDLEVBQUtDLEdBQzFCLE9BQU9GLEVBQUlDLEdBQU9DLEdBSXRCLFNBQVNNLEVBQUtDLEVBQVNDLEVBQVNDLEVBQU1DLEdBRXBDLElBQUlDLEVBQWlCSCxHQUFXQSxFQUFRdEIscUJBQXFCMEIsRUFBWUosRUFBVUksRUFDL0VDLEVBQVk1QixPQUFPNkIsT0FBT0gsRUFBZXpCLFdBQ3pDNkIsRUFBVSxJQUFJQyxFQUFRTixHQUFlLElBTXpDLE9BRkFHLEVBQVVJLFFBc01aLFNBQTBCVixFQUFTRSxFQUFNTSxHQUN2QyxJQUFJRyxFQS9LdUIsaUJBaUwzQixPQUFPLFNBQWdCQyxFQUFRQyxHQUM3QixHQWhMb0IsY0FnTGhCRixFQUNGLE1BQU0sSUFBSUcsTUFBTSxnQ0FHbEIsR0FuTG9CLGNBbUxoQkgsRUFBNkIsQ0FDL0IsR0FBZSxVQUFYQyxFQUNGLE1BQU1DLEVBS1IsT0FBT0UsSUFNVCxJQUhBUCxFQUFRSSxPQUFTQSxFQUNqQkosRUFBUUssSUFBTUEsSUFFRCxDQUNYLElBQUlHLEVBQVdSLEVBQVFRLFNBQ3ZCLEdBQUlBLEVBQVUsQ0FDWixJQUFJQyxFQUFpQkMsRUFBb0JGLEVBQVVSLEdBQ25ELEdBQUlTLEVBQWdCLENBQ2xCLEdBQUlBLElBQW1CRSxFQUFrQixTQUN6QyxPQUFPRixHQUlYLEdBQXVCLFNBQW5CVCxFQUFRSSxPQUdWSixFQUFRWSxLQUFPWixFQUFRYSxNQUFRYixFQUFRSyxTQUVsQyxHQUF1QixVQUFuQkwsRUFBUUksT0FBb0IsQ0FDckMsR0FuTnFCLG1CQW1OakJELEVBRUYsTUFEQUEsRUFqTmMsWUFrTlJILEVBQVFLLElBR2hCTCxFQUFRYyxrQkFBa0JkLEVBQVFLLFNBRU4sV0FBbkJMLEVBQVFJLFFBQ2pCSixFQUFRZSxPQUFPLFNBQVVmLEVBQVFLLEtBR25DRixFQTVOa0IsWUE4TmxCLElBQUlhLEVBQVNDLEVBQVN6QixFQUFTRSxFQUFNTSxHQUNyQyxHQUFvQixXQUFoQmdCLEVBQU9FLEtBQW1CLENBTzVCLEdBSkFmLEVBQVFILEVBQVFtQixLQWpPQSxZQUZLLGlCQXVPakJILEVBQU9YLE1BQVFNLEVBQ2pCLFNBR0YsTUFBTyxDQUNMMUIsTUFBTytCLEVBQU9YLElBQ2RjLEtBQU1uQixFQUFRbUIsTUFHUyxVQUFoQkgsRUFBT0UsT0FDaEJmLEVBL09nQixZQWtQaEJILEVBQVFJLE9BQVMsUUFDakJKLEVBQVFLLElBQU1XLEVBQU9YLE9BOVFQZSxDQUFpQjVCLEVBQVNFLEVBQU1NLEdBRTdDRixFQWNULFNBQVNtQixFQUFTSSxFQUFJdEMsRUFBS3NCLEdBQ3pCLElBQ0UsTUFBTyxDQUFFYSxLQUFNLFNBQVViLElBQUtnQixFQUFHQyxLQUFLdkMsRUFBS3NCLElBQzNDLE1BQU9mLEdBQ1AsTUFBTyxDQUFFNEIsS0FBTSxRQUFTYixJQUFLZixJQWhCakN0QixFQUFRdUIsS0FBT0EsRUFvQmYsSUFPSW9CLEVBQW1CLEdBTXZCLFNBQVNkLEtBQ1QsU0FBUzBCLEtBQ1QsU0FBU0MsS0FJVCxJQUFJQyxFQUFvQixHQUN4QkEsRUFBa0JqRCxHQUFrQixXQUNsQyxPQUFPa0QsTUFHVCxJQUFJQyxFQUFXekQsT0FBTzBELGVBQ2xCQyxFQUEwQkYsR0FBWUEsRUFBU0EsRUFBU0csRUFBTyxNQUMvREQsR0FDQUEsSUFBNEI1RCxHQUM1QkcsRUFBT2tELEtBQUtPLEVBQXlCckQsS0FHdkNpRCxFQUFvQkksR0FHdEIsSUFBSUUsRUFBS1AsRUFBMkJyRCxVQUNsQzBCLEVBQVUxQixVQUFZRCxPQUFPNkIsT0FBTzBCLEdBV3RDLFNBQVNPLEVBQXNCN0QsR0FDN0IsQ0FBQyxPQUFRLFFBQVMsVUFBVThELFNBQVEsU0FBUzdCLEdBQzNDdEIsRUFBT1gsRUFBV2lDLEdBQVEsU0FBU0MsR0FDakMsT0FBT3FCLEtBQUt4QixRQUFRRSxFQUFRQyxTQWtDbEMsU0FBUzZCLEVBQWNwQyxFQUFXcUMsR0FnQ2hDLElBQUlDLEVBZ0NKVixLQUFLeEIsUUE5QkwsU0FBaUJFLEVBQVFDLEdBQ3ZCLFNBQVNnQyxJQUNQLE9BQU8sSUFBSUYsR0FBWSxTQUFTRyxFQUFTQyxJQW5DN0MsU0FBU0MsRUFBT3BDLEVBQVFDLEVBQUtpQyxFQUFTQyxHQUNwQyxJQUFJdkIsRUFBU0MsRUFBU25CLEVBQVVNLEdBQVNOLEVBQVdPLEdBQ3BELEdBQW9CLFVBQWhCVyxFQUFPRSxLQUVKLENBQ0wsSUFBSXVCLEVBQVN6QixFQUFPWCxJQUNoQnBCLEVBQVF3RCxFQUFPeEQsTUFDbkIsT0FBSUEsR0FDaUIsaUJBQVZBLEdBQ1BiLEVBQU9rRCxLQUFLckMsRUFBTyxXQUNka0QsRUFBWUcsUUFBUXJELEVBQU15RCxTQUFTQyxNQUFLLFNBQVMxRCxHQUN0RHVELEVBQU8sT0FBUXZELEVBQU9xRCxFQUFTQyxNQUM5QixTQUFTakQsR0FDVmtELEVBQU8sUUFBU2xELEVBQUtnRCxFQUFTQyxNQUkzQkosRUFBWUcsUUFBUXJELEdBQU8wRCxNQUFLLFNBQVNDLEdBSTlDSCxFQUFPeEQsTUFBUTJELEVBQ2ZOLEVBQVFHLE1BQ1AsU0FBU0ksR0FHVixPQUFPTCxFQUFPLFFBQVNLLEVBQU9QLEVBQVNDLE1BdkJ6Q0EsRUFBT3ZCLEVBQU9YLEtBaUNabUMsQ0FBT3BDLEVBQVFDLEVBQUtpQyxFQUFTQyxNQUlqQyxPQUFPSCxFQWFMQSxFQUFrQkEsRUFBZ0JPLEtBQ2hDTixFQUdBQSxHQUNFQSxLQWtIVixTQUFTM0IsRUFBb0JGLEVBQVVSLEdBQ3JDLElBQUlJLEVBQVNJLEVBQVMvQixTQUFTdUIsRUFBUUksUUFDdkMsUUExVEUwQyxJQTBURTFDLEVBQXNCLENBS3hCLEdBRkFKLEVBQVFRLFNBQVcsS0FFSSxVQUFuQlIsRUFBUUksT0FBb0IsQ0FFOUIsR0FBSUksRUFBUy9CLFNBQWlCLFNBRzVCdUIsRUFBUUksT0FBUyxTQUNqQkosRUFBUUssU0FyVVp5QyxFQXNVSXBDLEVBQW9CRixFQUFVUixHQUVQLFVBQW5CQSxFQUFRSSxRQUdWLE9BQU9PLEVBSVhYLEVBQVFJLE9BQVMsUUFDakJKLEVBQVFLLElBQU0sSUFBSTBDLFVBQ2hCLGtEQUdKLE9BQU9wQyxFQUdULElBQUlLLEVBQVNDLEVBQVNiLEVBQVFJLEVBQVMvQixTQUFVdUIsRUFBUUssS0FFekQsR0FBb0IsVUFBaEJXLEVBQU9FLEtBSVQsT0FIQWxCLEVBQVFJLE9BQVMsUUFDakJKLEVBQVFLLElBQU1XLEVBQU9YLElBQ3JCTCxFQUFRUSxTQUFXLEtBQ1pHLEVBR1QsSUFBSXFDLEVBQU9oQyxFQUFPWCxJQUVsQixPQUFNMkMsRUFPRkEsRUFBSzdCLE1BR1BuQixFQUFRUSxFQUFTeUMsWUFBY0QsRUFBSy9ELE1BR3BDZSxFQUFRa0QsS0FBTzFDLEVBQVMyQyxRQVFELFdBQW5CbkQsRUFBUUksU0FDVkosRUFBUUksT0FBUyxPQUNqQkosRUFBUUssU0F6WFZ5QyxHQW1ZRjlDLEVBQVFRLFNBQVcsS0FDWkcsR0FORXFDLEdBM0JQaEQsRUFBUUksT0FBUyxRQUNqQkosRUFBUUssSUFBTSxJQUFJMEMsVUFBVSxvQ0FDNUIvQyxFQUFRUSxTQUFXLEtBQ1pHLEdBb0RYLFNBQVN5QyxFQUFhQyxHQUNwQixJQUFJQyxFQUFRLENBQUVDLE9BQVFGLEVBQUssSUFFdkIsS0FBS0EsSUFDUEMsRUFBTUUsU0FBV0gsRUFBSyxJQUdwQixLQUFLQSxJQUNQQyxFQUFNRyxXQUFhSixFQUFLLEdBQ3hCQyxFQUFNSSxTQUFXTCxFQUFLLElBR3hCM0IsS0FBS2lDLFdBQVdDLEtBQUtOLEdBR3ZCLFNBQVNPLEVBQWNQLEdBQ3JCLElBQUl0QyxFQUFTc0MsRUFBTVEsWUFBYyxHQUNqQzlDLEVBQU9FLEtBQU8sZ0JBQ1BGLEVBQU9YLElBQ2RpRCxFQUFNUSxXQUFhOUMsRUFHckIsU0FBU2YsRUFBUU4sR0FJZitCLEtBQUtpQyxXQUFhLENBQUMsQ0FBRUosT0FBUSxTQUM3QjVELEVBQVlzQyxRQUFRbUIsRUFBYzFCLE1BQ2xDQSxLQUFLcUMsT0FBTSxHQThCYixTQUFTakMsRUFBT2tDLEdBQ2QsR0FBSUEsRUFBVSxDQUNaLElBQUlDLEVBQWlCRCxFQUFTeEYsR0FDOUIsR0FBSXlGLEVBQ0YsT0FBT0EsRUFBZTNDLEtBQUswQyxHQUc3QixHQUE2QixtQkFBbEJBLEVBQVNkLEtBQ2xCLE9BQU9jLEVBR1QsSUFBS0UsTUFBTUYsRUFBU0csUUFBUyxDQUMzQixJQUFJQyxHQUFLLEVBQUdsQixFQUFPLFNBQVNBLElBQzFCLE9BQVNrQixFQUFJSixFQUFTRyxRQUNwQixHQUFJL0YsRUFBT2tELEtBQUswQyxFQUFVSSxHQUd4QixPQUZBbEIsRUFBS2pFLE1BQVErRSxFQUFTSSxHQUN0QmxCLEVBQUsvQixNQUFPLEVBQ0wrQixFQU9YLE9BSEFBLEVBQUtqRSxXQXplVDZELEVBMGVJSSxFQUFLL0IsTUFBTyxFQUVMK0IsR0FHVCxPQUFPQSxFQUFLQSxLQUFPQSxHQUt2QixNQUFPLENBQUVBLEtBQU0zQyxHQUlqQixTQUFTQSxJQUNQLE1BQU8sQ0FBRXRCLFdBemZQNkQsRUF5ZnlCM0IsTUFBTSxHQStNbkMsT0E1bUJBSSxFQUFrQnBELFVBQVk0RCxFQUFHc0MsWUFBYzdDLEVBQy9DQSxFQUEyQjZDLFlBQWM5QyxFQUN6Q0EsRUFBa0IrQyxZQUFjeEYsRUFDOUIwQyxFQUNBNUMsRUFDQSxxQkFhRlosRUFBUXVHLG9CQUFzQixTQUFTQyxHQUNyQyxJQUFJQyxFQUF5QixtQkFBWEQsR0FBeUJBLEVBQU9ILFlBQ2xELFFBQU9JLElBQ0hBLElBQVNsRCxHQUcyQix1QkFBbkNrRCxFQUFLSCxhQUFlRyxFQUFLQyxRQUloQzFHLEVBQVEyRyxLQUFPLFNBQVNILEdBUXRCLE9BUEl0RyxPQUFPMEcsZUFDVDFHLE9BQU8wRyxlQUFlSixFQUFRaEQsSUFFOUJnRCxFQUFPSyxVQUFZckQsRUFDbkIxQyxFQUFPMEYsRUFBUTVGLEVBQW1CLHNCQUVwQzRGLEVBQU9yRyxVQUFZRCxPQUFPNkIsT0FBT2dDLEdBQzFCeUMsR0FPVHhHLEVBQVE4RyxNQUFRLFNBQVN6RSxHQUN2QixNQUFPLENBQUVxQyxRQUFTckMsSUFzRXBCMkIsRUFBc0JFLEVBQWMvRCxXQUNwQytELEVBQWMvRCxVQUFVTyxHQUF1QixXQUM3QyxPQUFPZ0QsTUFFVDFELEVBQVFrRSxjQUFnQkEsRUFLeEJsRSxFQUFRK0csTUFBUSxTQUFTdkYsRUFBU0MsRUFBU0MsRUFBTUMsRUFBYXdDLFFBQ3hDLElBQWhCQSxJQUF3QkEsRUFBYzZDLFNBRTFDLElBQUlDLEVBQU8sSUFBSS9DLEVBQ2IzQyxFQUFLQyxFQUFTQyxFQUFTQyxFQUFNQyxHQUM3QndDLEdBR0YsT0FBT25FLEVBQVF1RyxvQkFBb0I5RSxHQUMvQndGLEVBQ0FBLEVBQUsvQixPQUFPUCxNQUFLLFNBQVNGLEdBQ3hCLE9BQU9BLEVBQU90QixLQUFPc0IsRUFBT3hELE1BQVFnRyxFQUFLL0IsV0F1S2pEbEIsRUFBc0JELEdBRXRCakQsRUFBT2lELEVBQUluRCxFQUFtQixhQU85Qm1ELEVBQUd2RCxHQUFrQixXQUNuQixPQUFPa0QsTUFHVEssRUFBR21ELFNBQVcsV0FDWixNQUFPLHNCQWtDVGxILEVBQVFtSCxLQUFPLFNBQVNDLEdBQ3RCLElBQUlELEVBQU8sR0FDWCxJQUFLLElBQUluRyxLQUFPb0csRUFDZEQsRUFBS3ZCLEtBQUs1RSxHQU1aLE9BSkFtRyxFQUFLRSxVQUlFLFNBQVNuQyxJQUNkLEtBQU9pQyxFQUFLaEIsUUFBUSxDQUNsQixJQUFJbkYsRUFBTW1HLEVBQUtHLE1BQ2YsR0FBSXRHLEtBQU9vRyxFQUdULE9BRkFsQyxFQUFLakUsTUFBUUQsRUFDYmtFLEVBQUsvQixNQUFPLEVBQ0wrQixFQVFYLE9BREFBLEVBQUsvQixNQUFPLEVBQ0wrQixJQXNDWGxGLEVBQVE4RCxPQUFTQSxFQU1qQjdCLEVBQVE5QixVQUFZLENBQ2xCa0csWUFBYXBFLEVBRWI4RCxNQUFPLFNBQVN3QixHQWNkLEdBYkE3RCxLQUFLOEQsS0FBTyxFQUNaOUQsS0FBS3dCLEtBQU8sRUFHWnhCLEtBQUtkLEtBQU9jLEtBQUtiLFdBcGdCakJpQyxFQXFnQkFwQixLQUFLUCxNQUFPLEVBQ1pPLEtBQUtsQixTQUFXLEtBRWhCa0IsS0FBS3RCLE9BQVMsT0FDZHNCLEtBQUtyQixTQXpnQkx5QyxFQTJnQkFwQixLQUFLaUMsV0FBVzFCLFFBQVE0QixJQUVuQjBCLEVBQ0gsSUFBSyxJQUFJYixLQUFRaEQsS0FFUSxNQUFuQmdELEVBQUtlLE9BQU8sSUFDWnJILEVBQU9rRCxLQUFLSSxLQUFNZ0QsS0FDakJSLE9BQU9RLEVBQUtnQixNQUFNLE1BQ3JCaEUsS0FBS2dELFFBbmhCWDVCLElBeWhCRjZDLEtBQU0sV0FDSmpFLEtBQUtQLE1BQU8sRUFFWixJQUNJeUUsRUFEWWxFLEtBQUtpQyxXQUFXLEdBQ0xHLFdBQzNCLEdBQXdCLFVBQXBCOEIsRUFBVzFFLEtBQ2IsTUFBTTBFLEVBQVd2RixJQUduQixPQUFPcUIsS0FBS21FLE1BR2QvRSxrQkFBbUIsU0FBU2dGLEdBQzFCLEdBQUlwRSxLQUFLUCxLQUNQLE1BQU0yRSxFQUdSLElBQUk5RixFQUFVMEIsS0FDZCxTQUFTcUUsRUFBT0MsRUFBS0MsR0FZbkIsT0FYQWpGLEVBQU9FLEtBQU8sUUFDZEYsRUFBT1gsSUFBTXlGLEVBQ2I5RixFQUFRa0QsS0FBTzhDLEVBRVhDLElBR0ZqRyxFQUFRSSxPQUFTLE9BQ2pCSixFQUFRSyxTQXBqQlp5QyxLQXVqQlltRCxFQUdaLElBQUssSUFBSTdCLEVBQUkxQyxLQUFLaUMsV0FBV1EsT0FBUyxFQUFHQyxHQUFLLElBQUtBLEVBQUcsQ0FDcEQsSUFBSWQsRUFBUTVCLEtBQUtpQyxXQUFXUyxHQUN4QnBELEVBQVNzQyxFQUFNUSxXQUVuQixHQUFxQixTQUFqQlIsRUFBTUMsT0FJUixPQUFPd0MsRUFBTyxPQUdoQixHQUFJekMsRUFBTUMsUUFBVTdCLEtBQUs4RCxLQUFNLENBQzdCLElBQUlVLEVBQVc5SCxFQUFPa0QsS0FBS2dDLEVBQU8sWUFDOUI2QyxFQUFhL0gsRUFBT2tELEtBQUtnQyxFQUFPLGNBRXBDLEdBQUk0QyxHQUFZQyxFQUFZLENBQzFCLEdBQUl6RSxLQUFLOEQsS0FBT2xDLEVBQU1FLFNBQ3BCLE9BQU91QyxFQUFPekMsRUFBTUUsVUFBVSxHQUN6QixHQUFJOUIsS0FBSzhELEtBQU9sQyxFQUFNRyxXQUMzQixPQUFPc0MsRUFBT3pDLEVBQU1HLGlCQUdqQixHQUFJeUMsR0FDVCxHQUFJeEUsS0FBSzhELEtBQU9sQyxFQUFNRSxTQUNwQixPQUFPdUMsRUFBT3pDLEVBQU1FLFVBQVUsT0FHM0IsQ0FBQSxJQUFJMkMsRUFNVCxNQUFNLElBQUk3RixNQUFNLDBDQUxoQixHQUFJb0IsS0FBSzhELEtBQU9sQyxFQUFNRyxXQUNwQixPQUFPc0MsRUFBT3pDLEVBQU1HLGdCQVU5QjFDLE9BQVEsU0FBU0csRUFBTWIsR0FDckIsSUFBSyxJQUFJK0QsRUFBSTFDLEtBQUtpQyxXQUFXUSxPQUFTLEVBQUdDLEdBQUssSUFBS0EsRUFBRyxDQUNwRCxJQUFJZCxFQUFRNUIsS0FBS2lDLFdBQVdTLEdBQzVCLEdBQUlkLEVBQU1DLFFBQVU3QixLQUFLOEQsTUFDckJwSCxFQUFPa0QsS0FBS2dDLEVBQU8sZUFDbkI1QixLQUFLOEQsS0FBT2xDLEVBQU1HLFdBQVksQ0FDaEMsSUFBSTJDLEVBQWU5QyxFQUNuQixPQUlBOEMsSUFDVSxVQUFUbEYsR0FDUyxhQUFUQSxJQUNEa0YsRUFBYTdDLFFBQVVsRCxHQUN2QkEsR0FBTytGLEVBQWEzQyxhQUd0QjJDLEVBQWUsTUFHakIsSUFBSXBGLEVBQVNvRixFQUFlQSxFQUFhdEMsV0FBYSxHQUl0RCxPQUhBOUMsRUFBT0UsS0FBT0EsRUFDZEYsRUFBT1gsSUFBTUEsRUFFVCtGLEdBQ0YxRSxLQUFLdEIsT0FBUyxPQUNkc0IsS0FBS3dCLEtBQU9rRCxFQUFhM0MsV0FDbEI5QyxHQUdGZSxLQUFLMkUsU0FBU3JGLElBR3ZCcUYsU0FBVSxTQUFTckYsRUFBUTBDLEdBQ3pCLEdBQW9CLFVBQWhCMUMsRUFBT0UsS0FDVCxNQUFNRixFQUFPWCxJQWNmLE1BWG9CLFVBQWhCVyxFQUFPRSxNQUNTLGFBQWhCRixFQUFPRSxLQUNUUSxLQUFLd0IsS0FBT2xDLEVBQU9YLElBQ00sV0FBaEJXLEVBQU9FLE1BQ2hCUSxLQUFLbUUsS0FBT25FLEtBQUtyQixJQUFNVyxFQUFPWCxJQUM5QnFCLEtBQUt0QixPQUFTLFNBQ2RzQixLQUFLd0IsS0FBTyxPQUNhLFdBQWhCbEMsRUFBT0UsTUFBcUJ3QyxJQUNyQ2hDLEtBQUt3QixLQUFPUSxHQUdQL0MsR0FHVDJGLE9BQVEsU0FBUzdDLEdBQ2YsSUFBSyxJQUFJVyxFQUFJMUMsS0FBS2lDLFdBQVdRLE9BQVMsRUFBR0MsR0FBSyxJQUFLQSxFQUFHLENBQ3BELElBQUlkLEVBQVE1QixLQUFLaUMsV0FBV1MsR0FDNUIsR0FBSWQsRUFBTUcsYUFBZUEsRUFHdkIsT0FGQS9CLEtBQUsyRSxTQUFTL0MsRUFBTVEsV0FBWVIsRUFBTUksVUFDdENHLEVBQWNQLEdBQ1AzQyxJQUtiNEYsTUFBUyxTQUFTaEQsR0FDaEIsSUFBSyxJQUFJYSxFQUFJMUMsS0FBS2lDLFdBQVdRLE9BQVMsRUFBR0MsR0FBSyxJQUFLQSxFQUFHLENBQ3BELElBQUlkLEVBQVE1QixLQUFLaUMsV0FBV1MsR0FDNUIsR0FBSWQsRUFBTUMsU0FBV0EsRUFBUSxDQUMzQixJQUFJdkMsRUFBU3NDLEVBQU1RLFdBQ25CLEdBQW9CLFVBQWhCOUMsRUFBT0UsS0FBa0IsQ0FDM0IsSUFBSXNGLEVBQVN4RixFQUFPWCxJQUNwQndELEVBQWNQLEdBRWhCLE9BQU9rRCxHQU1YLE1BQU0sSUFBSWxHLE1BQU0sMEJBR2xCbUcsY0FBZSxTQUFTekMsRUFBVWYsRUFBWUUsR0FhNUMsT0FaQXpCLEtBQUtsQixTQUFXLENBQ2QvQixTQUFVcUQsRUFBT2tDLEdBQ2pCZixXQUFZQSxFQUNaRSxRQUFTQSxHQUdTLFNBQWhCekIsS0FBS3RCLFNBR1BzQixLQUFLckIsU0E3ckJQeUMsR0Fnc0JPbkMsSUFRSjNDLEdBT3NCMEksRUFBTzFJLFNBR3RDLElBQ0UySSxtQkFBcUI1SSxFQUNyQixNQUFPNkksR0FVUEMsU0FBUyxJQUFLLHlCQUFkQSxDQUF3QzlJLE9DMXVCMUMsU0FBUytJLEVBQW1CQyxFQUFLekUsRUFBU0MsRUFBUXlFLEVBQU9DLEVBQVFqSSxFQUFLcUIsR0FDcEUsSUFDRSxJQUFJMkMsRUFBTytELEVBQUkvSCxHQUFLcUIsR0FDaEJwQixFQUFRK0QsRUFBSy9ELE1BQ2pCLE1BQU80RCxHQUVQLFlBREFOLEVBQU9NLEdBSUxHLEVBQUs3QixLQUNQbUIsRUFBUXJELEdBRVIrRixRQUFRMUMsUUFBUXJELEdBQU8wRCxLQUFLcUUsRUFBT0MsR0F3QnZDLE1BcEJBLFNBQTJCNUYsR0FDekIsT0FBTyxXQUNMLElBQUkzQixFQUFPZ0MsS0FDUHdGLEVBQU9DLFVBQ1gsT0FBTyxJQUFJbkMsU0FBUSxTQUFVMUMsRUFBU0MsR0FDcEMsSUFBSXdFLEVBQU0xRixFQUFHK0YsTUFBTTFILEVBQU13SCxHQUV6QixTQUFTRixFQUFNL0gsR0FDYjZILEVBQW1CQyxFQUFLekUsRUFBU0MsRUFBUXlFLEVBQU9DLEVBQVEsT0FBUWhJLEdBR2xFLFNBQVNnSSxFQUFPM0gsR0FDZHdILEVBQW1CQyxFQUFLekUsRUFBU0MsRUFBUXlFLEVBQU9DLEVBQVEsUUFBUzNILEdBR25FMEgsT0FBTWxFLFFDM0JaLE1BSkEsU0FBeUJ1RSxHQUN2QixHQUFJQyxNQUFNQyxRQUFRRixHQUFNLE9BQU9BLEdDMEJqQyxNQTNCQSxTQUErQkEsRUFBS2pELEdBQ2xDLEdBQXNCLG9CQUFYN0YsUUFBNEJBLE9BQU9FLFlBQVlQLE9BQU9tSixHQUFqRSxDQUNBLElBQUlHLEVBQU8sR0FDUEMsR0FBSyxFQUNMQyxHQUFLLEVBQ0xDLE9BQUs3RSxFQUVULElBQ0UsSUFBSyxJQUFpQzhFLEVBQTdCQyxFQUFLUixFQUFJOUksT0FBT0UsY0FBbUJnSixHQUFNRyxFQUFLQyxFQUFHM0UsUUFBUS9CLFFBQ2hFcUcsRUFBSzVELEtBQUtnRSxFQUFHM0ksUUFFVG1GLEdBQUtvRCxFQUFLckQsU0FBV0MsR0FIOENxRCxHQUFLLElBSzlFLE1BQU9uSSxHQUNQb0ksR0FBSyxFQUNMQyxFQUFLckksVUFFTCxJQUNPbUksR0FBc0IsTUFBaEJJLEVBQVcsUUFBV0EsRUFBVyxpQkFFNUMsR0FBSUgsRUFBSSxNQUFNQyxHQUlsQixPQUFPSCxJQ2RULE1BVkEsU0FBMkJILEVBQUtTLElBQ25CLE1BQVBBLEdBQWVBLEVBQU1ULEVBQUlsRCxVQUFRMkQsRUFBTVQsRUFBSWxELFFBRS9DLElBQUssSUFBSUMsRUFBSSxFQUFHMkQsRUFBTyxJQUFJVCxNQUFNUSxHQUFNMUQsRUFBSTBELEVBQUsxRCxJQUM5QzJELEVBQUszRCxHQUFLaUQsRUFBSWpELEdBR2hCLE9BQU8yRCxHQ0lULE1BVEEsU0FBcUNDLEVBQUdDLEdBQ3RDLEdBQUtELEVBQUwsQ0FDQSxHQUFpQixpQkFBTkEsRUFBZ0IsT0FBT0UsRUFBaUJGLEVBQUdDLEdBQ3RELElBQUlFLEVBQUlqSyxPQUFPQyxVQUFVK0csU0FBUzVELEtBQUswRyxHQUFHdEMsTUFBTSxHQUFJLEdBRXBELE1BRFUsV0FBTnlDLEdBQWtCSCxFQUFFM0QsY0FBYThELEVBQUlILEVBQUUzRCxZQUFZSyxNQUM3QyxRQUFOeUQsR0FBcUIsUUFBTkEsRUFBb0JiLE1BQU1jLEtBQUtKLEdBQ3hDLGNBQU5HLEdBQXFCLDJDQUEyQ0UsS0FBS0YsR0FBV0QsRUFBaUJGLEVBQUdDLFFBQXhHLElDSkYsTUFKQSxXQUNFLE1BQU0sSUFBSWxGLFVBQVUsOElDV3RCLE1BSkEsU0FBd0JzRSxFQUFLakQsR0FDM0IsT0FBT2tFLEVBQWVqQixJQUFRa0IsRUFBcUJsQixFQUFLakQsSUFBTW9FLEVBQTJCbkIsRUFBS2pELElBQU1xRSxLQ0h0RyxNQU5BLFNBQXlCQyxFQUFVQyxHQUNqQyxLQUFNRCxhQUFvQkMsR0FDeEIsTUFBTSxJQUFJNUYsVUFBVSxzQ0NGeEIsU0FBUzZGLEVBQWtCQyxFQUFRQyxHQUNqQyxJQUFLLElBQUkxRSxFQUFJLEVBQUdBLEVBQUkwRSxFQUFNM0UsT0FBUUMsSUFBSyxDQUNyQyxJQUFJMkUsRUFBYUQsRUFBTTFFLEdBQ3ZCMkUsRUFBVzVKLFdBQWE0SixFQUFXNUosYUFBYyxFQUNqRDRKLEVBQVczSixjQUFlLEVBQ3RCLFVBQVcySixJQUFZQSxFQUFXMUosVUFBVyxHQUNqRG5CLE9BQU9nQixlQUFlMkosRUFBUUUsRUFBVy9KLElBQUsrSixJQVVsRCxNQU5BLFNBQXNCSixFQUFhSyxFQUFZQyxHQUc3QyxPQUZJRCxHQUFZSixFQUFrQkQsRUFBWXhLLFVBQVc2SyxHQUNyREMsR0FBYUwsRUFBa0JELEVBQWFNLEdBQ3pDTixHQ0VULE1BZkEsU0FBeUI1SixFQUFLQyxFQUFLQyxHQVlqQyxPQVhJRCxLQUFPRCxFQUNUYixPQUFPZ0IsZUFBZUgsRUFBS0MsRUFBSyxDQUM5QkMsTUFBT0EsRUFDUEUsWUFBWSxFQUNaQyxjQUFjLEVBQ2RDLFVBQVUsSUFHWk4sRUFBSUMsR0FBT0MsRUFHTkYsR0NaVCxTQUFTbUssRUFBRUEsRUFBRUMsRUFBRUMsRUFBRWpCLEVBQUVrQixFQUFFakYsRUFBRTRELEdBQUcsSUFBSSxJQUFJc0IsRUFBRUosRUFBRTlFLEdBQUc0RCxHQUFHdUIsRUFBRUQsRUFBRXJLLE1BQU0sTUFBTWlLLEdBQUcsWUFBWUUsRUFBRUYsR0FBR0ksRUFBRW5JLEtBQUtnSSxFQUFFSSxHQUFHdkUsUUFBUTFDLFFBQVFpSCxHQUFHNUcsS0FBS3dGLEVBQUVrQixHQUFHLFNBQVNGLEVBQUVBLEdBQUcsT0FBTyxXQUFXLElBQUlDLEVBQUUxSCxLQUFLeUcsRUFBRWhCLFVBQVUsT0FBTyxJQUFJbkMsa0JBQWtCcUUsRUFBRWpGLEdBQUcsSUFBSTRELEVBQUVtQixFQUFFL0IsTUFBTWdDLEVBQUVqQixHQUFHLFNBQVNtQixFQUFFSCxHQUFHRCxFQUFFbEIsRUFBRXFCLEVBQUVqRixFQUFFa0YsRUFBRUMsRUFBRSxPQUFPSixHQUFHLFNBQVNJLEVBQUVKLEdBQUdELEVBQUVsQixFQUFFcUIsRUFBRWpGLEVBQUVrRixFQUFFQyxFQUFFLFFBQVFKLEdBQUdHLE9BQUUsT0FBWSxTQUFTRixFQUFFRixFQUFFQyxHQUFHLE9BQU8sU0FBU0QsR0FBRyxHQUFHNUIsTUFBTUMsUUFBUTJCLEdBQUcsT0FBT0EsRUFBdkMsQ0FBMENBLElBQUksU0FBU0EsRUFBRUMsR0FBRyxHQUFHLG9CQUFvQjVLLFFBQVVBLE9BQU9FLFlBQVlQLE9BQU9nTCxHQUEzRCxDQUFzRSxJQUFJRSxFQUFFLEdBQUdqQixHQUFFLEVBQUdrQixHQUFFLEVBQUdqRixPQUFFLEVBQU8sSUFBSSxJQUFJLElBQUk0RCxFQUFFc0IsRUFBRUosRUFBRTNLLE9BQU9FLGNBQWMwSixHQUFHSCxFQUFFc0IsRUFBRXBHLFFBQVEvQixRQUFRaUksRUFBRXhGLEtBQUtvRSxFQUFFL0ksUUFBUWtLLEdBQUdDLEVBQUVqRixTQUFTZ0YsR0FBR2hCLEdBQUUsSUFBSyxNQUFNZSxHQUFHRyxHQUFFLEVBQUdqRixFQUFFOEUsRUFBRSxRQUFRLElBQUlmLEdBQUcsTUFBTW1CLEVBQUVFLFFBQVFGLEVBQUVFLFNBQVMsUUFBUSxHQUFHSCxFQUFFLE1BQU1qRixHQUFHLE9BQU9nRixHQUFoVCxDQUFtVEYsRUFBRUMsSUFBSSxTQUFTRCxFQUFFQyxHQUFHLEdBQUlELEVBQUosQ0FBYSxHQUFHLGlCQUFpQkEsRUFBRSxPQUFPZixFQUFFZSxFQUFFQyxHQUFHLElBQUlDLEVBQUVsTCxPQUFPQyxVQUFVK0csU0FBUzVELEtBQUs0SCxHQUFHeEQsTUFBTSxHQUFHLEdBQXVELE1BQXBELFdBQVcwRCxHQUFHRixFQUFFN0UsY0FBYytFLEVBQUVGLEVBQUU3RSxZQUFZSyxNQUFTLFFBQVEwRSxHQUFHLFFBQVFBLEVBQVM5QixNQUFNYyxLQUFLYyxHQUFNLGNBQWNFLEdBQUcsMkNBQTJDZixLQUFLZSxHQUFVakIsRUFBRWUsRUFBRUMsUUFBbEYsR0FBcE4sQ0FBMFNELEVBQUVDLElBQUksV0FBVyxNQUFNLElBQUlwRyxVQUFVLDZJQUEvQixHQUErSyxTQUFTb0YsRUFBRWUsRUFBRUMsSUFBSSxNQUFNQSxHQUFHQSxFQUFFRCxFQUFFL0UsVUFBVWdGLEVBQUVELEVBQUUvRSxRQUFRLElBQUksSUFBSWlGLEVBQUUsRUFBRWpCLEVBQUUsSUFBSWIsTUFBTTZCLEdBQUdDLEVBQUVELEVBQUVDLElBQUlqQixFQUFFaUIsR0FBR0YsRUFBRUUsR0FBRyxPQUFPakIsRUFBRSxJQUFJa0IsRUFBRSxXQUFXLElBQUlILEVBQUVDLEVBQUV4QyxtQkFBbUJoQyxlQUFldUUsRUFBRUUsR0FBRyxPQUFPekMsbUJBQW1CcEgsZUFBZTJKLEdBQUcsT0FBTyxPQUFPQSxFQUFFMUQsS0FBSzBELEVBQUVoRyxNQUFNLEtBQUssRUFBRSxPQUFPZ0csRUFBRW5JLE9BQU8sU0FBUyxJQUFJaUUsUUFBUSxXQUFXLElBQUlrRSxFQUFFQyxFQUFFeEMsbUJBQW1CaEMsZUFBZXVFLEVBQUVDLEVBQUVoQixHQUFHLElBQUlrQixFQUFFckIsRUFBRSxPQUFPckIsbUJBQW1CcEgsZUFBZTJKLEdBQUcsT0FBTyxPQUFPQSxFQUFFMUQsS0FBSzBELEVBQUVoRyxNQUFNLEtBQUssRUFBRSxHQUFHdUcsVUFBVUMsWUFBWSxDQUFDUixFQUFFaEcsS0FBSyxFQUFFLE1BQU1pRixFQUFFLElBQUl3QixhQUFhLDRCQUE0QixzQkFBc0JULEVBQUVoRyxLQUFLLEdBQUcsTUFBTSxLQUFLLEVBQUUsT0FBT2dHLEVBQUUxRCxLQUFLLEVBQUUwRCxFQUFFaEcsS0FBSyxFQUFFdUcsVUFBVUMsWUFBWUUsTUFBTSxDQUFDbEYsS0FBSzBFLElBQUksS0FBSyxFQUFFQyxFQUFFSCxFQUFFdEksS0FBS29ILEVBQUUsU0FBU2tCLEVBQUVFLEdBQUdDLEVBQUVRLG9CQUFvQixTQUFTWCxHQUFHOUUsRUFBRWdGLEVBQUVQLE9BQU8xSSxNQUFNZ0osRUFBRWhCLElBQUlrQixFQUFFUyxpQkFBaUIsU0FBUzlCLEdBQUc1RCxFQUFFaUYsRUFBRWxKLE1BQU1nSixFQUFFaEIsR0FBR2UsRUFBRWhHLEtBQUssR0FBRyxNQUFNLEtBQUssR0FBR2dHLEVBQUUxRCxLQUFLLEdBQUcwRCxFQUFFYSxHQUFHYixFQUFFM0MsTUFBTSxHQUFHNEIsRUFBRWUsRUFBRWEsSUFBSSxLQUFLLEdBQUcsSUFBSSxNQUFNLE9BQU9iLEVBQUV2RCxVQUFVdUQsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLFVBQVUsT0FBTyxTQUFTQyxFQUFFQyxHQUFHLE9BQU9GLEVBQUU5QixNQUFNMUYsS0FBS3lGLFlBQTVuQixLQUE2b0IsS0FBSyxFQUFFLElBQUksTUFBTSxPQUFPK0IsRUFBRXZELFVBQVV1RCxPQUFPLE9BQU8sU0FBU0MsR0FBRyxPQUFPRCxFQUFFOUIsTUFBTTFGLEtBQUt5RixZQUE5NEIsR0FBNjVCL0MsRUFBRSxTQUFTOEUsRUFBRUMsRUFBRUMsR0FBRyxPQUFPRixHQUFHLElBQUksU0FBU0UsRUFBRSxJQUFJTyxhQUFhLG9CQUFvQixvQkFBb0IsTUFBTSxRQUFRUixFQUFFRCxLQUFLbEIsRUFBRSxXQUFXLElBQUlrQixFQUFFQyxFQUFFeEMsbUJBQW1CaEMsZUFBZXVFLEVBQUVmLEVBQUUvRCxHQUFHLE9BQU91QyxtQkFBbUJwSCxlQUFlMkosR0FBRyxPQUFPLE9BQU9BLEVBQUUxRCxLQUFLMEQsRUFBRWhHLE1BQU0sS0FBSyxFQUFFLE9BQU9nRyxFQUFFbkksT0FBTyxTQUFTLElBQUlpRSxRQUFRLFdBQVcsSUFBSWtFLEVBQUVDLEVBQUV4QyxtQkFBbUJoQyxlQUFldUUsRUFBRUMsRUFBRW5CLEdBQUcsSUFBSXNCLEVBQUVDLEVBQUVTLEVBQUUsT0FBT3JELG1CQUFtQnBILGVBQWUySixHQUFHLE9BQU8sT0FBT0EsRUFBRTFELEtBQUswRCxFQUFFaEcsTUFBTSxLQUFLLEVBQUUsR0FBR3VHLFVBQVVRLGFBQWEsQ0FBQ2YsRUFBRWhHLEtBQUssRUFBRSxNQUFNOEUsRUFBRSxJQUFJMkIsYUFBYSw2QkFBNkIsa0JBQWtCVCxFQUFFaEcsS0FBSyxHQUFHLE1BQU0sS0FBSyxFQUFFLE9BQU9nRyxFQUFFMUQsS0FBSyxFQUFFMEQsRUFBRWEsR0FBRy9FLFFBQVFrRSxFQUFFaEcsS0FBSyxFQUFFbUcsRUFBRWxCLEdBQUcsS0FBSyxFQUFFLE9BQU9lLEVBQUVnQixHQUFHaEIsRUFBRXRJLEtBQUtzSSxFQUFFaEcsS0FBSyxHQUFHdUcsVUFBVVEsYUFBYUUsYUFBYS9GLEdBQUcsS0FBSyxHQUFHLE9BQU84RSxFQUFFa0IsR0FBR2xCLEVBQUV0SSxLQUFLc0ksRUFBRW1CLEdBQUcsQ0FBQ25CLEVBQUVnQixHQUFHaEIsRUFBRWtCLElBQUlsQixFQUFFaEcsS0FBSyxHQUFHZ0csRUFBRWEsR0FBR08sSUFBSWhKLEtBQUs0SCxFQUFFYSxHQUFHYixFQUFFbUIsSUFBSSxLQUFLLEdBQUdmLEVBQUVKLEVBQUV0SSxLQUFLMkksRUFBRUgsRUFBRUUsRUFBRSxHQUFHVSxFQUFFVCxFQUFFLEdBQUdKLEVBQUVhLEdBQUdkLEVBQUVoRyxLQUFLLEdBQUcsTUFBTSxLQUFLLEdBQUdnRyxFQUFFMUQsS0FBSyxHQUFHMEQsRUFBRXFCLEdBQUdyQixFQUFFM0MsTUFBTSxHQUFHeUIsRUFBRWtCLEVBQUVxQixJQUFJLEtBQUssR0FBRyxJQUFJLE1BQU0sT0FBT3JCLEVBQUV2RCxVQUFVdUQsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLFVBQVUsT0FBTyxTQUFTQyxFQUFFQyxHQUFHLE9BQU9GLEVBQUU5QixNQUFNMUYsS0FBS3lGLFlBQWpxQixLQUFrckIsS0FBSyxFQUFFLElBQUksTUFBTSxPQUFPK0IsRUFBRXZELFVBQVV1RCxPQUFPLE9BQU8sU0FBU0MsRUFBRUMsR0FBRyxPQUFPRixFQUFFOUIsTUFBTTFGLEtBQUt5RixZQUF2N0Isc2tCQ0UzeEVxRCx3QkFtQ09DLDJDQUhBLDBCQUNDLFVBR05DLEVBQW9CRixFQUFNRyxnQ0FDM0JELFFBQ0UsSUFBSWYsYUFBYSxrQ0FBbUMsMEJBR3REaUIsVUFBWSxJQUFJRixPQUNoQkcsV0FBYSxHQUVsQjNNLE9BQU80TSxlQUNITixFQUFNTyxnQkFDTE4sR0FBVyxLQUNieEksU0FBUSx5QkFBRWpELE9BQUtDLFVBQ0wsYUFBUkQsSUFBdUJDLEVBQU8sS0FDM0IrTCxFQUFvQlIsRUFBTVMsNEJBQzFCRCxJQUNML0wsRUFBUSxJQUFJK0wsR0FHZEUsRUFBS04sVUFBVTVMLEdBQU9DLHNFQTdCZHVMLEVBQU1HLDBDQUdPUSxTQUNoQixJQUFJN0ssTUFBTSx1S0FzQ1ZvQixLQUFLa0osb0RBRVlRLEVBQW1CLGFBQWMsQ0FBRUMsT0FBTywyQ0FFeEQsSUFBSS9LLE1BQU0sK0RBRVpzSyxVQUFVVSwyREFFVEMsRUFBZTdKLEtBQUttSixXQUFXaEksUUFFcEMwSSx5Q0FLSTdKLGlKQUlEQSxLQUFLa0osZ0JBQ0xBLFVBQVVqRixPQUdUakUsNENBSURBLEtBQUtrSixnQkFDTEEsVUFBVVksUUFHVDlKLDhDQUdTK0osRUFBV0MsaUJBQ3JCaEssS0FBS2tKLFdBQWFsSixLQUFLaUssbUJBQW1CRixHQUFZLENBQ3JEL0osS0FBS21KLFdBQVdZLFNBQ2hCNUIsb0JBQW9CNEIsT0FHcEJHLEVBQVUsU0FBQ0MsT0FDWkMsRUFBaUIsR0FDakJMLElBQWNqQixFQUFNdUIsV0FBV0MsUUFDNUJILEVBQU1JLFNBQVdKLEVBQU1JLFFBQVE5SCxPQUFTLEdBQzdDMkgsRUFBZWxJLEtBQUtpSSxFQUFNSSxRQUFRLEdBQUcsR0FBR0MsWUFJeENSLEdBQVlBLEVBQVN0RSxNQUFNK0UsR0FBT04sVUFBVUMsVUFFMUNsQixVQUFVZCxpQkFBaUIyQixFQUFXRyxRQUV0Q2YsV0FBV1ksR0FBYUcsU0FHdkJsSyxpREFHWStKLE9BQ2JHLEVBQVVsSyxLQUFLbUosV0FBV1ksZUFDM0JiLFVBQVVmLG9CQUFvQjRCLEVBQVdHLFVBRXZDbEssS0FBS21KLFdBQVdZLEdBRWhCL0osOERBSUZpRSxPQUVMekgsT0FBT2lILEtBQUt6RCxLQUFLbUosWUFBWTVJLFNBQVEsU0FBQ2pELFVBQVFvTixFQUFLdkMsb0JBQW9CN0ssV0FDbEU0TCxVQUFZLEtBRVZsSixnREFHVytKLFdBQ1R2TixPQUFPNEQsT0FBTzBJLEVBQU11QixZQUFZTSxNQUFLLFNBQUNuTCxVQUFTQSxJQUFTdUssNkNBckYxRC9KLEtBQUtrSix3QkFHQU8sU0FDTixJQUFJN0ssTUFBTSxrR0FzRmZnTSxPQUFPNUIsbUJBQ1A0QixPQUFPQyx5QkFDUEQsT0FBT0Usc0JBQ1BGLE9BQU9HLCtFQU1QSCxPQUFPdEIsbUJBQ1BzQixPQUFPSSx5QkFDUEosT0FBT0ssc0JBQ1BMLE9BQU9NLCtCQWpLSnBDLG1CQUNtQixDQUN2QnFDLFNBQVUsS0FDVkMsS0FBTSxRQUNOQyxZQUFZLEVBQ1pDLGdCQUFnQixFQUNoQkMsZ0JBQWlCLEVBQ2pCQyxXQUFZLFNBUFIxQyxlQVVlLENBQ25CMkMsVUFBVyxXQUNYQyxZQUFhLGFBQ2JDLElBQUssTUFDTEMsTUFBTyxRQUNQQyxTQUFVLFVBQ1Z2QixPQUFRLFNBQ1J3QixVQUFXLFdBQ1hDLFlBQWEsYUFDYkMsV0FBWSxZQUNaQyxhQUFjLGNBQ2RDLE1BQU8ifQ==
|
|
1
|
+
(function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require(`@untemps/user-permissions-utils`)):typeof define==`function`&&define.amd?define([`exports`,`@untemps/user-permissions-utils`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.Vocal={},e.UserPermissionsUtils))})(this,function(e,t){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`}),e.Vocal=class e{static defaultOptions={grammars:null,lang:`en-US`,continuous:!1,interimResults:!1,maxAlternatives:1,serviceURI:null};static 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`};static get isSupported(){return!!e._resolveSpeechRecognition()&&!!(0,t.isNavigatorPermissionsSupported)()&&!!(0,t.isNavigatorMediaDevicesSupported)()}static set isSupported(e){throw Error(`You cannot set isSupported directly.`)}_instance=null;_listeners=null;constructor(t){let 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(([t,n])=>{if(t===`grammars`&&!n){let t=e._resolveSpeechGrammarList();t&&(n=new t)}this._instance[t]=n})}get instance(){return this._instance}set instance(e){throw Error(`You cannot set instance directly.`)}async start(){if(this._instance)try{if(!await(0,t.getUserMediaStream)(`microphone`,{audio:!0}))throw Error(`Unable to retrieve the stream from media device`);this._instance.start()}catch(e){let t=this._listeners.error;t&&t(e)}return this}stop(){return this._instance&&this._instance.stop(),this}abort(){return this._instance&&this._instance.abort(),this}addEventListener(t,n){if(this._instance&&this._includesEventType(t)){this._listeners[t]&&this.removeEventListener(t);let r=r=>{let i=[];t===e.eventTypes.RESULT&&r.results&&r.results.length>0&&i.push(r.results[0][0].transcript),n&&n.apply(this,[r,...i])};this._instance.addEventListener(t,r),this._listeners[t]=r}return this}removeEventListener(e){let t=this._listeners[e];return this._instance.removeEventListener(e,t),delete this._listeners[e],this}cleanup(){return this.stop(),Object.keys(this._listeners).forEach(e=>this.removeEventListener(e)),this._instance=null,this}_includesEventType(t){return!!Object.values(e.eventTypes).find(e=>e===t)}static _resolveSpeechRecognition(){return window.SpeechRecognition||window.webkitSpeechRecognition||window.mozSpeechRecognition||window.msSpeechRecognition}static _resolveSpeechGrammarList(){return window.SpeechGrammarList||window.webkitSpeechGrammarList||window.mozSpeechGrammarList||window.msSpeechGrammarList}}});
|
|
2
|
+
//# sourceMappingURL=index.umd.js.map
|