@epicgames-ps/lib-pixelstreamingfrontend-ue5.5 0.1.3 → 0.2.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.
Files changed (94) hide show
  1. package/.eslintrc.js +1 -1
  2. package/.prettierrc.json +1 -0
  3. package/dist/lib-pixelstreamingfrontend.esm.js +1 -1
  4. package/dist/lib-pixelstreamingfrontend.js +1 -1
  5. package/package.json +6 -5
  6. package/src/AFK/AFKController.ts +10 -32
  7. package/src/Config/Config.ts +179 -201
  8. package/src/Config/SettingBase.ts +61 -2
  9. package/src/Config/SettingFlag.ts +10 -48
  10. package/src/Config/SettingNumber.ts +10 -28
  11. package/src/Config/SettingOption.ts +13 -46
  12. package/src/Config/SettingText.ts +9 -37
  13. package/src/DataChannel/DataChannelController.ts +6 -26
  14. package/src/DataChannel/DataChannelLatencyTestController.ts +38 -33
  15. package/src/DataChannel/DataChannelLatencyTestResults.ts +8 -10
  16. package/src/DataChannel/DataChannelSender.ts +5 -15
  17. package/src/DataChannel/LatencyTestResults.ts +5 -15
  18. package/src/FreezeFrame/FreezeFrame.ts +7 -19
  19. package/src/FreezeFrame/FreezeFrameController.ts +3 -14
  20. package/src/Inputs/GamepadController.ts +123 -221
  21. package/src/Inputs/GamepadTypes.ts +23 -0
  22. package/src/Inputs/IInputController.ts +17 -0
  23. package/src/Inputs/InputClassesFactory.ts +38 -45
  24. package/src/Inputs/KeyCodes.ts +114 -0
  25. package/src/Inputs/KeyboardController.ts +49 -232
  26. package/src/Inputs/MouseController.ts +71 -297
  27. package/src/Inputs/MouseControllerHovering.ts +118 -0
  28. package/src/Inputs/MouseControllerLocked.ts +194 -0
  29. package/src/Inputs/TouchController.ts +49 -105
  30. package/src/Inputs/TouchControllerFake.ts +132 -0
  31. package/src/Inputs/XRGamepadController.ts +35 -44
  32. package/src/PeerConnectionController/AggregatedStats.ts +26 -54
  33. package/src/PeerConnectionController/CandidatePairStats.ts +1 -1
  34. package/src/PeerConnectionController/CandidateStat.ts +1 -1
  35. package/src/PeerConnectionController/PeerConnectionController.ts +217 -164
  36. package/src/PixelStreaming/PixelStreaming.ts +174 -226
  37. package/src/UI/OnScreenKeyboard.ts +14 -9
  38. package/src/UeInstanceMessage/ResponseController.ts +6 -15
  39. package/src/UeInstanceMessage/SendMessageController.ts +16 -18
  40. package/src/UeInstanceMessage/StreamMessageController.ts +3 -12
  41. package/src/UeInstanceMessage/ToStreamerMessagesController.ts +3 -9
  42. package/src/Util/EventEmitter.ts +17 -22
  43. package/src/Util/FileUtil.ts +11 -34
  44. package/src/Util/IURLSearchParams.ts +25 -0
  45. package/src/Util/InputCoordTranslator.ts +73 -0
  46. package/src/Util/RTCUtils.ts +23 -15
  47. package/src/VideoPlayer/StreamController.ts +6 -23
  48. package/src/VideoPlayer/VideoPlayer.ts +9 -30
  49. package/src/WebRtcPlayer/WebRtcPlayerController.ts +328 -690
  50. package/src/WebXR/WebXRController.ts +82 -94
  51. package/src/pixelstreamingfrontend.ts +6 -10
  52. package/types/AFK/AFKController.d.ts +0 -1
  53. package/types/Config/Config.d.ts +6 -5
  54. package/types/Config/SettingBase.d.ts +13 -0
  55. package/types/Config/SettingFlag.d.ts +1 -10
  56. package/types/Config/SettingNumber.d.ts +1 -5
  57. package/types/Config/SettingOption.d.ts +1 -10
  58. package/types/Config/SettingText.d.ts +1 -9
  59. package/types/DataChannel/DataChannelLatencyTestController.d.ts +1 -1
  60. package/types/Inputs/GamepadController.d.ts +22 -46
  61. package/types/Inputs/GamepadTypes.d.ts +7 -0
  62. package/types/Inputs/IInputController.d.ts +16 -0
  63. package/types/Inputs/InputClassesFactory.d.ts +7 -8
  64. package/types/Inputs/KeyCodes.d.ts +5 -0
  65. package/types/Inputs/KeyboardController.d.ts +17 -45
  66. package/types/Inputs/MouseController.d.ts +33 -68
  67. package/types/Inputs/MouseControllerHovering.d.ts +26 -0
  68. package/types/Inputs/MouseControllerLocked.d.ts +31 -0
  69. package/types/Inputs/TouchController.d.ts +19 -44
  70. package/types/Inputs/TouchControllerFake.d.ts +29 -0
  71. package/types/Inputs/XRGamepadController.d.ts +0 -7
  72. package/types/PeerConnectionController/PeerConnectionController.d.ts +10 -1
  73. package/types/PixelStreaming/PixelStreaming.d.ts +14 -2
  74. package/types/UI/OnScreenKeyboard.d.ts +2 -2
  75. package/types/Util/EventEmitter.d.ts +1 -1
  76. package/types/Util/IURLSearchParams.d.ts +9 -0
  77. package/types/Util/InputCoordTranslator.d.ts +29 -0
  78. package/types/VideoPlayer/StreamController.d.ts +0 -2
  79. package/types/WebRtcPlayer/WebRtcPlayerController.d.ts +19 -17
  80. package/types/pixelstreamingfrontend.d.ts +1 -1
  81. package/src/Inputs/FakeTouchController.ts +0 -199
  82. package/src/Inputs/HoveringMouseEvents.ts +0 -192
  83. package/src/Inputs/IMouseEvents.ts +0 -64
  84. package/src/Inputs/ITouchController.ts +0 -29
  85. package/src/Inputs/LockedMouseEvents.ts +0 -287
  86. package/src/Util/CoordinateConverter.ts +0 -290
  87. package/src/Util/EventListenerTracker.ts +0 -29
  88. package/types/Inputs/FakeTouchController.d.ts +0 -61
  89. package/types/Inputs/HoveringMouseEvents.d.ts +0 -56
  90. package/types/Inputs/IMouseEvents.d.ts +0 -53
  91. package/types/Inputs/ITouchController.d.ts +0 -24
  92. package/types/Inputs/LockedMouseEvents.d.ts +0 -80
  93. package/types/Util/CoordinateConverter.d.ts +0 -100
  94. package/types/Util/EventListenerTracker.d.ts +0 -14
@@ -1 +1 @@
1
- import*as e from"sdp";var t={499:e=>{e.exports=function(){throw new Error("ws does not work in the browser. Browser clients must use the native WebSocket object")}},187:e=>{var t,n="object"==typeof Reflect?Reflect:null,r=n&&"function"==typeof n.apply?n.apply:function(e,t,n){return Function.prototype.apply.call(e,t,n)};t=n&&"function"==typeof n.ownKeys?n.ownKeys:Object.getOwnPropertySymbols?function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:function(e){return Object.getOwnPropertyNames(e)};var s=Number.isNaN||function(e){return e!=e};function i(){i.init.call(this)}e.exports=i,e.exports.once=function(e,t){return new Promise((function(n,r){function s(n){e.removeListener(t,i),r(n)}function i(){"function"==typeof e.removeListener&&e.removeListener("error",s),n([].slice.call(arguments))}p(e,t,i,{once:!0}),"error"!==t&&function(e,t,n){"function"==typeof e.on&&p(e,"error",t,{once:!0})}(e,s)}))},i.EventEmitter=i,i.prototype._events=void 0,i.prototype._eventsCount=0,i.prototype._maxListeners=void 0;var a=10;function o(e){if("function"!=typeof e)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof e)}function l(e){return void 0===e._maxListeners?i.defaultMaxListeners:e._maxListeners}function c(e,t,n,r){var s,i,a,c;if(o(n),void 0===(i=e._events)?(i=e._events=Object.create(null),e._eventsCount=0):(void 0!==i.newListener&&(e.emit("newListener",t,n.listener?n.listener:n),i=e._events),a=i[t]),void 0===a)a=i[t]=n,++e._eventsCount;else if("function"==typeof a?a=i[t]=r?[n,a]:[a,n]:r?a.unshift(n):a.push(n),(s=l(e))>0&&a.length>s&&!a.warned){a.warned=!0;var d=new Error("Possible EventEmitter memory leak detected. "+a.length+" "+String(t)+" listeners added. Use emitter.setMaxListeners() to increase limit");d.name="MaxListenersExceededWarning",d.emitter=e,d.type=t,d.count=a.length,c=d,console&&console.warn&&console.warn(c)}return e}function d(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function h(e,t,n){var r={fired:!1,wrapFn:void 0,target:e,type:t,listener:n},s=d.bind(r);return s.listener=n,r.wrapFn=s,s}function u(e,t,n){var r=e._events;if(void 0===r)return[];var s=r[t];return void 0===s?[]:"function"==typeof s?n?[s.listener||s]:[s]:n?function(e){for(var t=new Array(e.length),n=0;n<t.length;++n)t[n]=e[n].listener||e[n];return t}(s):m(s,s.length)}function g(e){var t=this._events;if(void 0!==t){var n=t[e];if("function"==typeof n)return 1;if(void 0!==n)return n.length}return 0}function m(e,t){for(var n=new Array(t),r=0;r<t;++r)n[r]=e[r];return n}function p(e,t,n,r){if("function"==typeof e.on)r.once?e.once(t,n):e.on(t,n);else{if("function"!=typeof e.addEventListener)throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type '+typeof e);e.addEventListener(t,(function s(i){r.once&&e.removeEventListener(t,s),n(i)}))}}Object.defineProperty(i,"defaultMaxListeners",{enumerable:!0,get:function(){return a},set:function(e){if("number"!=typeof e||e<0||s(e))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+e+".");a=e}}),i.init=function(){void 0!==this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},i.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||s(e))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+e+".");return this._maxListeners=e,this},i.prototype.getMaxListeners=function(){return l(this)},i.prototype.emit=function(e){for(var t=[],n=1;n<arguments.length;n++)t.push(arguments[n]);var s="error"===e,i=this._events;if(void 0!==i)s=s&&void 0===i.error;else if(!s)return!1;if(s){var a;if(t.length>0&&(a=t[0]),a instanceof Error)throw a;var o=new Error("Unhandled error."+(a?" ("+a.message+")":""));throw o.context=a,o}var l=i[e];if(void 0===l)return!1;if("function"==typeof l)r(l,this,t);else{var c=l.length,d=m(l,c);for(n=0;n<c;++n)r(d[n],this,t)}return!0},i.prototype.addListener=function(e,t){return c(this,e,t,!1)},i.prototype.on=i.prototype.addListener,i.prototype.prependListener=function(e,t){return c(this,e,t,!0)},i.prototype.once=function(e,t){return o(t),this.on(e,h(this,e,t)),this},i.prototype.prependOnceListener=function(e,t){return o(t),this.prependListener(e,h(this,e,t)),this},i.prototype.removeListener=function(e,t){var n,r,s,i,a;if(o(t),void 0===(r=this._events))return this;if(void 0===(n=r[e]))return this;if(n===t||n.listener===t)0==--this._eventsCount?this._events=Object.create(null):(delete r[e],r.removeListener&&this.emit("removeListener",e,n.listener||t));else if("function"!=typeof n){for(s=-1,i=n.length-1;i>=0;i--)if(n[i]===t||n[i].listener===t){a=n[i].listener,s=i;break}if(s<0)return this;0===s?n.shift():function(e,t){for(;t+1<e.length;t++)e[t]=e[t+1];e.pop()}(n,s),1===n.length&&(r[e]=n[0]),void 0!==r.removeListener&&this.emit("removeListener",e,a||t)}return this},i.prototype.off=i.prototype.removeListener,i.prototype.removeAllListeners=function(e){var t,n,r;if(void 0===(n=this._events))return this;if(void 0===n.removeListener)return 0===arguments.length?(this._events=Object.create(null),this._eventsCount=0):void 0!==n[e]&&(0==--this._eventsCount?this._events=Object.create(null):delete n[e]),this;if(0===arguments.length){var s,i=Object.keys(n);for(r=0;r<i.length;++r)"removeListener"!==(s=i[r])&&this.removeAllListeners(s);return this.removeAllListeners("removeListener"),this._events=Object.create(null),this._eventsCount=0,this}if("function"==typeof(t=n[e]))this.removeListener(e,t);else if(void 0!==t)for(r=t.length-1;r>=0;r--)this.removeListener(e,t[r]);return this},i.prototype.listeners=function(e){return u(this,e,!0)},i.prototype.rawListeners=function(e){return u(this,e,!1)},i.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):g.call(e,t)},i.prototype.listenerCount=g,i.prototype.eventNames=function(){return this._eventsCount>0?t(this._events):[]}}},n={};function r(e){var s=n[e];if(void 0!==s)return s.exports;var i=n[e]={exports:{}};return t[e](i,i.exports,r),i.exports}r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var s={};(()=>{r.d(s,{Dz:()=>Wt,g$:()=>Xe,Lt:()=>Ke,Q9:()=>qe,qf:()=>Qe,hV:()=>Xt,z$:()=>$n,J0:()=>jt,De:()=>Vt,$C:()=>Gt,al:()=>it,_W:()=>at,Gv:()=>bt,m:()=>Tt,tz:()=>st,Nu:()=>Ht,zg:()=>ln,vp:()=>It,vU:()=>Ot,wF:()=>ft,rv:()=>_t,Nh:()=>$t,ss:()=>an,qW:()=>Ct,QL:()=>wt,cf:()=>dn,eM:()=>pt,Yd:()=>i,Tk:()=>nn,iw:()=>n,pr:()=>Ae,Vm:()=>t,sK:()=>Ft,Ok:()=>Nt,q5:()=>Kt,g:()=>_n,xl:()=>ut,I:()=>gt,bx:()=>mt,dD:()=>Pt,Ib:()=>ze,Az:()=>_e,Iw:()=>$e,qY:()=>je,db:()=>He,mR:()=>Et,Tn:()=>Be,rV:()=>vt,gh:()=>lt,Mi:()=>ct,j:()=>dt,YB:()=>ht,Yt:()=>St,i5:()=>yt,x_:()=>At,Am:()=>An,eR:()=>Je,r8:()=>ot,u3:()=>cn,vd:()=>Ze,iV:()=>tt,jZ:()=>et,SW:()=>rt,ZH:()=>nt,Ni:()=>Nn,lh:()=>Ye,ZP:()=>Lt,qo:()=>c,Q8:()=>Kn,$f:()=>Vn,eu:()=>Rt,Ax:()=>Mt,Mc:()=>kt});var t={};r.r(t),r.d(t,{answer:()=>Se,base_message:()=>ie,config:()=>oe,dataChannelRequest:()=>Re,disconnectPlayer:()=>Te,endpointId:()=>ce,endpointIdConfirm:()=>de,iceCandidate:()=>be,iceCandidateData:()=>we,identify:()=>le,layerPreference:()=>Me,listStreamers:()=>ue,offer:()=>ye,peerConnectionOptions:()=>ae,peerDataChannels:()=>Pe,peerDataChannelsReady:()=>Le,ping:()=>Ce,playerConnected:()=>fe,playerCount:()=>Fe,playerDisconnected:()=>ve,pong:()=>Ee,startStreaming:()=>Oe,stats:()=>De,stopStreaming:()=>xe,streamerDataChannels:()=>Ie,streamerDisconnected:()=>ke,streamerIdChanged:()=>he,streamerList:()=>ge,subscribe:()=>me,unsubscribe:()=>pe});var n={};r.r(n),r.d(n,{createMessage:()=>Ue,validateMessage:()=>Ne});class i{static GetStackTrace(){const e=new Error;let t="No Stack Available for this browser";return e.stack&&(t=e.stack.toString().replace(/Error/g,"")),t}static SetLoggerVerbosity(e){null!=this.verboseLogLevel&&(this.verboseLogLevel=e)}static Log(e,t,n){void 0!==n&&n>this.verboseLogLevel||this.CommonLog("Log",null,t)}static Info(e,t,n){void 0!==n&&n>this.verboseLogLevel||this.CommonLog("Info",null,t)}static Error(e,t){this.CommonLog("Error",e,t)}static Warning(e,t){this.CommonLog("Warning",null,t)}static CommonLog(e,t,n){t?console.log(`[${e}] - ${n}\nCaller: ${t}`):console.log(`[${e}] - ${n}`)}}i.verboseLogLevel=5;var a,o,l=r(187);class c extends l.EventEmitter{constructor(){super(),this.WS_OPEN_STATE=1}sendMessage(e){this.webSocket&&this.webSocket.send(JSON.stringify(e))}connect(e){i.Log(i.GetStackTrace(),e,6);try{return this.webSocket=new WebSocket(e),this.webSocket.onopen=e=>this.handleOnOpen(),this.webSocket.onerror=e=>this.handleOnError(),this.webSocket.onclose=e=>this.handleOnClose(e),this.webSocket.onmessage=e=>this.handleOnMessage(e),this.webSocket.onmessagebinary=e=>this.handleOnMessageBinary(e),!0}catch(e){return i.Error(i.GetStackTrace(),e),!1}}disconnect(e,t){this.webSocket&&this.webSocket.close(e,t)}isConnected(){return!!this.webSocket&&this.webSocket.readyState!=WebSocket.CLOSED}handleOnMessageBinary(e){e&&e.data&&e.data.text().then((e=>{const t=new MessageEvent("messageFromBinary",{data:e});this.handleOnMessage(t)})).catch((e=>{i.Error(i.GetStackTrace(),`Failed to parse binary blob from websocket, reason: ${e.message}`)}))}handleOnMessage(e){if(e.data&&e.data instanceof Blob)return void this.handleOnMessageBinary(e);let t;i.Log(i.GetStackTrace(),"received => \n"+JSON.stringify(JSON.parse(e.data),void 0,4),6);try{t=JSON.parse(e.data)}catch(t){return void(t instanceof Error?i.Error(i.GetStackTrace(),`Error parsing message string ${e.data}.\n${t.message}`):i.Error(i.GetStackTrace(),"Unknown error while parsing message data in handleOnMessage"))}this.onMessage&&this.onMessage(t)}handleOnOpen(){i.Log(i.GetStackTrace(),"Connected to the signalling server via WebSocket",6),this.emit("open")}handleOnError(){this.emit("error")}handleOnClose(e){i.Log(i.GetStackTrace(),"Disconnected to the signalling server via WebSocket: "+JSON.stringify(e.code)+" - "+e.reason),this.emit("close",e)}close(){var e;null===(e=this.webSocket)||void 0===e||e.close()}}function d(e,t,n){let r,s,i=n;for(let n of e.fields){let e=n.localName;if(n.oneof){const a=i[n.oneof];if(null==(null==a?void 0:a.oneofKind))continue;if(r=a[e],s=t[n.oneof],s.oneofKind=a.oneofKind,null==r){delete s[e];continue}}else if(r=i[e],s=t,null==r)continue;switch(n.repeat&&(s[e].length=r.length),n.kind){case"scalar":case"enum":if(n.repeat)for(let t=0;t<r.length;t++)s[e][t]=r[t];else s[e]=r;break;case"message":let t=n.T();if(n.repeat)for(let n=0;n<r.length;n++)s[e][n]=t.create(r[n]);else void 0===s[e]?s[e]=t.create(r):t.mergePartial(s[e],r);break;case"map":switch(n.V.kind){case"scalar":case"enum":Object.assign(s[e],r);break;case"message":let t=n.V.T();for(let n of Object.keys(r))s[e][n]=t.create(r[n])}}}}!function(e){e.symbol=Symbol.for("protobuf-ts/unknown"),e.onRead=(n,r,s,i,a)=>{(t(r)?r[e.symbol]:r[e.symbol]=[]).push({no:s,wireType:i,data:a})},e.onWrite=(t,n,r)=>{for(let{no:t,wireType:s,data:i}of e.list(n))r.tag(t,s).raw(i)},e.list=(n,r)=>{if(t(n)){let t=n[e.symbol];return r?t.filter((e=>e.no==r)):t}return[]},e.last=(t,n)=>e.list(t,n).slice(-1)[0];const t=t=>t&&Array.isArray(t[e.symbol])}(a||(a={})),function(e){e[e.Varint=0]="Varint",e[e.Bit64=1]="Bit64",e[e.LengthDelimited=2]="LengthDelimited",e[e.StartGroup=3]="StartGroup",e[e.EndGroup=4]="EndGroup",e[e.Bit32=5]="Bit32"}(o||(o={}));const h=Symbol.for("protobuf-ts/message-type");function u(e){let t=!1;const n=[];for(let r=0;r<e.length;r++){let s=e.charAt(r);"_"==s?t=!0:/\d/.test(s)?(n.push(s),t=!0):t?(n.push(s.toUpperCase()),t=!1):0==r?n.push(s.toLowerCase()):n.push(s)}return n.join("")}var g,m,p;function f(e){var t,n,r,s;return e.localName=null!==(t=e.localName)&&void 0!==t?t:u(e.name),e.jsonName=null!==(n=e.jsonName)&&void 0!==n?n:u(e.name),e.repeat=null!==(r=e.repeat)&&void 0!==r?r:p.NO,e.opt=null!==(s=e.opt)&&void 0!==s?s:!e.repeat&&!e.oneof&&"message"==e.kind,e}function v(e){if("object"!=typeof e||null===e||!e.hasOwnProperty("oneofKind"))return!1;switch(typeof e.oneofKind){case"string":return void 0!==e[e.oneofKind]&&2==Object.keys(e).length;case"undefined":return 1==Object.keys(e).length;default:return!1}}!function(e){e[e.DOUBLE=1]="DOUBLE",e[e.FLOAT=2]="FLOAT",e[e.INT64=3]="INT64",e[e.UINT64=4]="UINT64",e[e.INT32=5]="INT32",e[e.FIXED64=6]="FIXED64",e[e.FIXED32=7]="FIXED32",e[e.BOOL=8]="BOOL",e[e.STRING=9]="STRING",e[e.BYTES=12]="BYTES",e[e.UINT32=13]="UINT32",e[e.SFIXED32=15]="SFIXED32",e[e.SFIXED64=16]="SFIXED64",e[e.SINT32=17]="SINT32",e[e.SINT64=18]="SINT64"}(g||(g={})),function(e){e[e.BIGINT=0]="BIGINT",e[e.STRING=1]="STRING",e[e.NUMBER=2]="NUMBER"}(m||(m={})),function(e){e[e.NO=0]="NO",e[e.PACKED=1]="PACKED",e[e.UNPACKED=2]="UNPACKED"}(p||(p={}));class y{constructor(e){var t;this.fields=null!==(t=e.fields)&&void 0!==t?t:[]}prepare(){if(this.data)return;const e=[],t=[],n=[];for(let r of this.fields)if(r.oneof)n.includes(r.oneof)||(n.push(r.oneof),e.push(r.oneof),t.push(r.oneof));else switch(t.push(r.localName),r.kind){case"scalar":case"enum":r.opt&&!r.repeat||e.push(r.localName);break;case"message":r.repeat&&e.push(r.localName);break;case"map":e.push(r.localName)}this.data={req:e,known:t,oneofs:Object.values(n)}}is(e,t,n=!1){if(t<0)return!0;if(null==e||"object"!=typeof e)return!1;this.prepare();let r=Object.keys(e),s=this.data;if(r.length<s.req.length||s.req.some((e=>!r.includes(e))))return!1;if(!n&&r.some((e=>!s.known.includes(e))))return!1;if(t<1)return!0;for(const r of s.oneofs){const s=e[r];if(!v(s))return!1;if(void 0===s.oneofKind)continue;const i=this.fields.find((e=>e.localName===s.oneofKind));if(!i)return!1;if(!this.field(s[s.oneofKind],i,n,t))return!1}for(const r of this.fields)if(void 0===r.oneof&&!this.field(e[r.localName],r,n,t))return!1;return!0}field(e,t,n,r){let s=t.repeat;switch(t.kind){case"scalar":return void 0===e?t.opt:s?this.scalars(e,t.T,r,t.L):this.scalar(e,t.T,t.L);case"enum":return void 0===e?t.opt:s?this.scalars(e,g.INT32,r):this.scalar(e,g.INT32);case"message":return void 0===e||(s?this.messages(e,t.T(),n,r):this.message(e,t.T(),n,r));case"map":if("object"!=typeof e||null===e)return!1;if(r<2)return!0;if(!this.mapKeys(e,t.K,r))return!1;switch(t.V.kind){case"scalar":return this.scalars(Object.values(e),t.V.T,r,t.V.L);case"enum":return this.scalars(Object.values(e),g.INT32,r);case"message":return this.messages(Object.values(e),t.V.T(),n,r)}}return!0}message(e,t,n,r){return n?t.isAssignable(e,r):t.is(e,r)}messages(e,t,n,r){if(!Array.isArray(e))return!1;if(r<2)return!0;if(n){for(let n=0;n<e.length&&n<r;n++)if(!t.isAssignable(e[n],r-1))return!1}else for(let n=0;n<e.length&&n<r;n++)if(!t.is(e[n],r-1))return!1;return!0}scalar(e,t,n){let r=typeof e;switch(t){case g.UINT64:case g.FIXED64:case g.INT64:case g.SFIXED64:case g.SINT64:switch(n){case m.BIGINT:return"bigint"==r;case m.NUMBER:return"number"==r&&!isNaN(e);default:return"string"==r}case g.BOOL:return"boolean"==r;case g.STRING:return"string"==r;case g.BYTES:return e instanceof Uint8Array;case g.DOUBLE:case g.FLOAT:return"number"==r&&!isNaN(e);default:return"number"==r&&Number.isInteger(e)}}scalars(e,t,n,r){if(!Array.isArray(e))return!1;if(n<2)return!0;if(Array.isArray(e))for(let s=0;s<e.length&&s<n;s++)if(!this.scalar(e[s],t,r))return!1;return!0}mapKeys(e,t,n){let r=Object.keys(e);switch(t){case g.INT32:case g.FIXED32:case g.SFIXED32:case g.SINT32:case g.UINT32:return this.scalars(r.slice(0,n).map((e=>parseInt(e))),t,n);case g.BOOL:return this.scalars(r.slice(0,n).map((e=>"true"==e||"false"!=e&&e)),t,n);default:return this.scalars(r,t,n,m.STRING)}}}function S(e){let t=typeof e;if("object"==t){if(Array.isArray(e))return"array";if(null===e)return"null"}return t}let w="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""),b=[];for(let e=0;e<w.length;e++)b[w[e].charCodeAt(0)]=e;function T(){let e=0,t=0;for(let n=0;n<28;n+=7){let r=this.buf[this.pos++];if(e|=(127&r)<<n,0==(128&r))return this.assertBounds(),[e,t]}let n=this.buf[this.pos++];if(e|=(15&n)<<28,t=(112&n)>>4,0==(128&n))return this.assertBounds(),[e,t];for(let n=3;n<=31;n+=7){let r=this.buf[this.pos++];if(t|=(127&r)<<n,0==(128&r))return this.assertBounds(),[e,t]}throw new Error("invalid varint")}function C(e,t,n){for(let r=0;r<28;r+=7){const s=e>>>r,i=!(s>>>7==0&&0==t),a=255&(i?128|s:s);if(n.push(a),!i)return}const r=e>>>28&15|(7&t)<<4,s=!(t>>3==0);if(n.push(255&(s?128|r:r)),s){for(let e=3;e<31;e+=7){const r=t>>>e,s=!(r>>>7==0),i=255&(s?128|r:r);if(n.push(i),!s)return}n.push(t>>>31&1)}}b["-".charCodeAt(0)]=w.indexOf("+"),b["_".charCodeAt(0)]=w.indexOf("/");const E=4294967296;function k(e){let t="-"==e[0];t&&(e=e.slice(1));const n=1e6;let r=0,s=0;function i(t,i){const a=Number(e.slice(t,i));s*=n,r=r*n+a,r>=E&&(s+=r/E|0,r%=E)}return i(-24,-18),i(-18,-12),i(-12,-6),i(-6),[t,r,s]}function M(e,t){if(t>>>0<=2097151)return""+(E*t+(e>>>0));let n=(e>>>24|t<<8)>>>0&16777215,r=t>>16&65535,s=(16777215&e)+6777216*n+6710656*r,i=n+8147497*r,a=2*r,o=1e7;function l(e,t){let n=e?String(e):"";return t?"0000000".slice(n.length)+n:n}return s>=o&&(i+=Math.floor(s/o),s%=o),i>=o&&(a+=Math.floor(i/o),i%=o),l(a,0)+l(i,a)+l(s,1)}function R(e,t){if(e>=0){for(;e>127;)t.push(127&e|128),e>>>=7;t.push(e)}else{for(let n=0;n<9;n++)t.push(127&e|128),e>>=7;t.push(1)}}function P(){let e=this.buf[this.pos++],t=127&e;if(0==(128&e))return this.assertBounds(),t;if(e=this.buf[this.pos++],t|=(127&e)<<7,0==(128&e))return this.assertBounds(),t;if(e=this.buf[this.pos++],t|=(127&e)<<14,0==(128&e))return this.assertBounds(),t;if(e=this.buf[this.pos++],t|=(127&e)<<21,0==(128&e))return this.assertBounds(),t;e=this.buf[this.pos++],t|=(15&e)<<28;for(let t=5;0!=(128&e)&&t<10;t++)e=this.buf[this.pos++];if(0!=(128&e))throw new Error("invalid varint");return this.assertBounds(),t>>>0}let L;function I(e){if(!e)throw new Error("BigInt unavailable, see https://github.com/timostamm/protobuf-ts/blob/v1.0.8/MANUAL.md#bigint-support")}!function(){const e=new DataView(new ArrayBuffer(8)),t=void 0!==globalThis.BigInt&&"function"==typeof e.getBigInt64&&"function"==typeof e.getBigUint64&&"function"==typeof e.setBigInt64&&"function"==typeof e.setBigUint64;L=t?{MIN:BigInt("-9223372036854775808"),MAX:BigInt("9223372036854775807"),UMIN:BigInt("0"),UMAX:BigInt("18446744073709551615"),C:BigInt,V:e}:void 0}();const O=/^-?[0-9]+$/,x=4294967296,F=2147483648;class D{constructor(e,t){this.lo=0|e,this.hi=0|t}isZero(){return 0==this.lo&&0==this.hi}toNumber(){let e=this.hi*x+(this.lo>>>0);if(!Number.isSafeInteger(e))throw new Error("cannot convert to safe number");return e}}class A extends D{static from(e){if(L)switch(typeof e){case"string":if("0"==e)return this.ZERO;if(""==e)throw new Error("string is no integer");e=L.C(e);case"number":if(0===e)return this.ZERO;e=L.C(e);case"bigint":if(!e)return this.ZERO;if(e<L.UMIN)throw new Error("signed value for ulong");if(e>L.UMAX)throw new Error("ulong too large");return L.V.setBigUint64(0,e,!0),new A(L.V.getInt32(0,!0),L.V.getInt32(4,!0))}else switch(typeof e){case"string":if("0"==e)return this.ZERO;if(e=e.trim(),!O.test(e))throw new Error("string is no integer");let[t,n,r]=k(e);if(t)throw new Error("signed value for ulong");return new A(n,r);case"number":if(0==e)return this.ZERO;if(!Number.isSafeInteger(e))throw new Error("number is no integer");if(e<0)throw new Error("signed value for ulong");return new A(e,e/x)}throw new Error("unknown value "+typeof e)}toString(){return L?this.toBigInt().toString():M(this.lo,this.hi)}toBigInt(){return I(L),L.V.setInt32(0,this.lo,!0),L.V.setInt32(4,this.hi,!0),L.V.getBigUint64(0,!0)}}A.ZERO=new A(0,0);class U extends D{static from(e){if(L)switch(typeof e){case"string":if("0"==e)return this.ZERO;if(""==e)throw new Error("string is no integer");e=L.C(e);case"number":if(0===e)return this.ZERO;e=L.C(e);case"bigint":if(!e)return this.ZERO;if(e<L.MIN)throw new Error("signed long too small");if(e>L.MAX)throw new Error("signed long too large");return L.V.setBigInt64(0,e,!0),new U(L.V.getInt32(0,!0),L.V.getInt32(4,!0))}else switch(typeof e){case"string":if("0"==e)return this.ZERO;if(e=e.trim(),!O.test(e))throw new Error("string is no integer");let[t,n,r]=k(e);if(t){if(r>F||r==F&&0!=n)throw new Error("signed long too small")}else if(r>=F)throw new Error("signed long too large");let s=new U(n,r);return t?s.negate():s;case"number":if(0==e)return this.ZERO;if(!Number.isSafeInteger(e))throw new Error("number is no integer");return e>0?new U(e,e/x):new U(-e,-e/x).negate()}throw new Error("unknown value "+typeof e)}isNegative(){return 0!=(this.hi&F)}negate(){let e=~this.hi,t=this.lo;return t?t=1+~t:e+=1,new U(t,e)}toString(){if(L)return this.toBigInt().toString();if(this.isNegative()){let e=this.negate();return"-"+M(e.lo,e.hi)}return M(this.lo,this.hi)}toBigInt(){return I(L),L.V.setInt32(0,this.lo,!0),L.V.setInt32(4,this.hi,!0),L.V.getBigInt64(0,!0)}}function N(e,t){if(!e)throw new Error(t)}function B(e){if("number"!=typeof e)throw new Error("invalid int 32: "+typeof e);if(!Number.isInteger(e)||e>2147483647||e<-2147483648)throw new Error("invalid int 32: "+e)}function V(e){if("number"!=typeof e)throw new Error("invalid uint 32: "+typeof e);if(!Number.isInteger(e)||e>4294967295||e<0)throw new Error("invalid uint 32: "+e)}function G(e){if("number"!=typeof e)throw new Error("invalid float 32: "+typeof e);if(Number.isFinite(e)&&(e>34028234663852886e22||e<-34028234663852886e22))throw new Error("invalid float 32: "+e)}function W(e,t){switch(t){case m.BIGINT:return e.toBigInt();case m.NUMBER:return e.toNumber();default:return e.toString()}}U.ZERO=new U(0,0);class z{constructor(e){this.info=e}prepare(){var e;if(void 0===this.fMap){this.fMap={};const t=null!==(e=this.info.fields)&&void 0!==e?e:[];for(const e of t)this.fMap[e.name]=e,this.fMap[e.jsonName]=e,this.fMap[e.localName]=e}}assert(e,t,n){if(!e){let e=S(n);throw"number"!=e&&"boolean"!=e||(e=n.toString()),new Error(`Cannot parse JSON ${e} for ${this.info.typeName}#${t}`)}}read(e,t,n){this.prepare();const r=[];for(const[i,a]of Object.entries(e)){const e=this.fMap[i];if(!e){if(!n.ignoreUnknownFields)throw new Error(`Found unknown field while reading ${this.info.typeName} from JSON format. JSON key: ${i}`);continue}const o=e.localName;let l;if(e.oneof){if(null===a&&("enum"!==e.kind||"google.protobuf.NullValue"!==e.T()[0]))continue;if(r.includes(e.oneof))throw new Error(`Multiple members of the oneof group "${e.oneof}" of ${this.info.typeName} are present in JSON.`);r.push(e.oneof),l=t[e.oneof]={oneofKind:o}}else l=t;if("map"==e.kind){if(null===a)continue;this.assert(null!==(s=a)&&"object"==typeof s&&!Array.isArray(s),e.name,a);const t=l[o];for(const[r,s]of Object.entries(a)){let i;switch(this.assert(null!==s,e.name+" map value",null),e.V.kind){case"message":i=e.V.T().internalJsonRead(s,n);break;case"enum":if(i=this.enum(e.V.T(),s,e.name,n.ignoreUnknownFields),!1===i)continue;break;case"scalar":i=this.scalar(s,e.V.T,e.V.L,e.name)}this.assert(void 0!==i,e.name+" map value",s);let a=r;e.K==g.BOOL&&(a="true"==a||"false"!=a&&a),a=this.scalar(a,e.K,m.STRING,e.name).toString(),t[a]=i}}else if(e.repeat){if(null===a)continue;this.assert(Array.isArray(a),e.name,a);const t=l[o];for(const r of a){let s;switch(this.assert(null!==r,e.name,null),e.kind){case"message":s=e.T().internalJsonRead(r,n);break;case"enum":if(s=this.enum(e.T(),r,e.name,n.ignoreUnknownFields),!1===s)continue;break;case"scalar":s=this.scalar(r,e.T,e.L,e.name)}this.assert(void 0!==s,e.name,a),t.push(s)}}else switch(e.kind){case"message":if(null===a&&"google.protobuf.Value"!=e.T().typeName){this.assert(void 0===e.oneof,e.name+" (oneof member)",null);continue}l[o]=e.T().internalJsonRead(a,n,l[o]);break;case"enum":let t=this.enum(e.T(),a,e.name,n.ignoreUnknownFields);if(!1===t)continue;l[o]=t;break;case"scalar":l[o]=this.scalar(a,e.T,e.L,e.name)}}var s}enum(e,t,n,r){if("google.protobuf.NullValue"==e[0]&&N(null===t||"NULL_VALUE"===t,`Unable to parse field ${this.info.typeName}#${n}, enum ${e[0]} only accepts null.`),null===t)return 0;switch(typeof t){case"number":return N(Number.isInteger(t),`Unable to parse field ${this.info.typeName}#${n}, enum can only be integral number, got ${t}.`),t;case"string":let s=t;e[2]&&t.substring(0,e[2].length)===e[2]&&(s=t.substring(e[2].length));let i=e[1][s];return(void 0!==i||!r)&&(N("number"==typeof i,`Unable to parse field ${this.info.typeName}#${n}, enum ${e[0]} has no value for "${t}".`),i)}N(!1,`Unable to parse field ${this.info.typeName}#${n}, cannot parse enum value from ${typeof t}".`)}scalar(e,t,n,r){let s;try{switch(t){case g.DOUBLE:case g.FLOAT:if(null===e)return 0;if("NaN"===e)return Number.NaN;if("Infinity"===e)return Number.POSITIVE_INFINITY;if("-Infinity"===e)return Number.NEGATIVE_INFINITY;if(""===e){s="empty string";break}if("string"==typeof e&&e.trim().length!==e.length){s="extra whitespace";break}if("string"!=typeof e&&"number"!=typeof e)break;let r=Number(e);if(Number.isNaN(r)){s="not a number";break}if(!Number.isFinite(r)){s="too large or small";break}return t==g.FLOAT&&G(r),r;case g.INT32:case g.FIXED32:case g.SFIXED32:case g.SINT32:case g.UINT32:if(null===e)return 0;let i;if("number"==typeof e?i=e:""===e?s="empty string":"string"==typeof e&&(e.trim().length!==e.length?s="extra whitespace":i=Number(e)),void 0===i)break;return t==g.UINT32?V(i):B(i),i;case g.INT64:case g.SFIXED64:case g.SINT64:if(null===e)return W(U.ZERO,n);if("number"!=typeof e&&"string"!=typeof e)break;return W(U.from(e),n);case g.FIXED64:case g.UINT64:if(null===e)return W(A.ZERO,n);if("number"!=typeof e&&"string"!=typeof e)break;return W(A.from(e),n);case g.BOOL:if(null===e)return!1;if("boolean"!=typeof e)break;return e;case g.STRING:if(null===e)return"";if("string"!=typeof e){s="extra whitespace";break}try{encodeURIComponent(e)}catch(s){s="invalid UTF8";break}return e;case g.BYTES:if(null===e||""===e)return new Uint8Array(0);if("string"!=typeof e)break;return function(e){let t=3*e.length/4;"="==e[e.length-2]?t-=2:"="==e[e.length-1]&&(t-=1);let n,r=new Uint8Array(t),s=0,i=0,a=0;for(let t=0;t<e.length;t++){if(n=b[e.charCodeAt(t)],void 0===n)switch(e[t]){case"=":i=0;case"\n":case"\r":case"\t":case" ":continue;default:throw Error("invalid base64 string.")}switch(i){case 0:a=n,i=1;break;case 1:r[s++]=a<<2|(48&n)>>4,a=n,i=2;break;case 2:r[s++]=(15&a)<<4|(60&n)>>2,a=n,i=3;break;case 3:r[s++]=(3&a)<<6|n,i=0}}if(1==i)throw Error("invalid base64 string.");return r.subarray(0,s)}(e)}}catch(e){s=e.message}this.assert(!1,r+(s?" - "+s:""),e)}}class _{constructor(e){var t;this.fields=null!==(t=e.fields)&&void 0!==t?t:[]}write(e,t){const n={},r=e;for(const e of this.fields){if(!e.oneof){let s=this.field(e,r[e.localName],t);void 0!==s&&(n[t.useProtoFieldName?e.name:e.jsonName]=s);continue}const s=r[e.oneof];if(s.oneofKind!==e.localName)continue;const i="scalar"==e.kind||"enum"==e.kind?Object.assign(Object.assign({},t),{emitDefaultValues:!0}):t;let a=this.field(e,s[e.localName],i);N(void 0!==a),n[t.useProtoFieldName?e.name:e.jsonName]=a}return n}field(e,t,n){let r;if("map"==e.kind){N("object"==typeof t&&null!==t);const s={};switch(e.V.kind){case"scalar":for(const[n,r]of Object.entries(t)){const t=this.scalar(e.V.T,r,e.name,!1,!0);N(void 0!==t),s[n.toString()]=t}break;case"message":const r=e.V.T();for(const[i,a]of Object.entries(t)){const t=this.message(r,a,e.name,n);N(void 0!==t),s[i.toString()]=t}break;case"enum":const i=e.V.T();for(const[r,a]of Object.entries(t)){N(void 0===a||"number"==typeof a);const t=this.enum(i,a,e.name,!1,!0,n.enumAsInteger);N(void 0!==t),s[r.toString()]=t}}(n.emitDefaultValues||Object.keys(s).length>0)&&(r=s)}else if(e.repeat){N(Array.isArray(t));const s=[];switch(e.kind){case"scalar":for(let n=0;n<t.length;n++){const r=this.scalar(e.T,t[n],e.name,e.opt,!0);N(void 0!==r),s.push(r)}break;case"enum":const r=e.T();for(let i=0;i<t.length;i++){N(void 0===t[i]||"number"==typeof t[i]);const a=this.enum(r,t[i],e.name,e.opt,!0,n.enumAsInteger);N(void 0!==a),s.push(a)}break;case"message":const i=e.T();for(let r=0;r<t.length;r++){const a=this.message(i,t[r],e.name,n);N(void 0!==a),s.push(a)}}(n.emitDefaultValues||s.length>0||n.emitDefaultValues)&&(r=s)}else switch(e.kind){case"scalar":r=this.scalar(e.T,t,e.name,e.opt,n.emitDefaultValues);break;case"enum":r=this.enum(e.T(),t,e.name,e.opt,n.emitDefaultValues,n.enumAsInteger);break;case"message":r=this.message(e.T(),t,e.name,n)}return r}enum(e,t,n,r,s,i){if("google.protobuf.NullValue"==e[0])return s||r?null:void 0;if(void 0!==t){if(0!==t||s||r)return N("number"==typeof t),N(Number.isInteger(t)),i||!e[1].hasOwnProperty(t)?t:e[2]?e[2]+e[1][t]:e[1][t]}else N(r)}message(e,t,n,r){return void 0===t?r.emitDefaultValues?null:void 0:e.internalJsonWrite(t,r)}scalar(e,t,n,r,s){if(void 0===t)return void N(r);const i=s||r;switch(e){case g.INT32:case g.SFIXED32:case g.SINT32:return 0===t?i?0:void 0:(B(t),t);case g.FIXED32:case g.UINT32:return 0===t?i?0:void 0:(V(t),t);case g.FLOAT:G(t);case g.DOUBLE:return 0===t?i?0:void 0:(N("number"==typeof t),Number.isNaN(t)?"NaN":t===Number.POSITIVE_INFINITY?"Infinity":t===Number.NEGATIVE_INFINITY?"-Infinity":t);case g.STRING:return""===t?i?"":void 0:(N("string"==typeof t),t);case g.BOOL:return!1===t?!i&&void 0:(N("boolean"==typeof t),t);case g.UINT64:case g.FIXED64:N("number"==typeof t||"string"==typeof t||"bigint"==typeof t);let e=A.from(t);if(e.isZero()&&!i)return;return e.toString();case g.INT64:case g.SFIXED64:case g.SINT64:N("number"==typeof t||"string"==typeof t||"bigint"==typeof t);let n=U.from(t);if(n.isZero()&&!i)return;return n.toString();case g.BYTES:return N(t instanceof Uint8Array),t.byteLength?function(e){let t,n="",r=0,s=0;for(let i=0;i<e.length;i++)switch(t=e[i],r){case 0:n+=w[t>>2],s=(3&t)<<4,r=1;break;case 1:n+=w[s|t>>4],s=(15&t)<<2,r=2;break;case 2:n+=w[s|t>>6],n+=w[63&t],r=0}return r&&(n+=w[s],n+="=",1==r&&(n+="=")),n}(t):i?"":void 0}}}function $(e,t=m.STRING){switch(e){case g.BOOL:return!1;case g.UINT64:case g.FIXED64:return W(A.ZERO,t);case g.INT64:case g.SFIXED64:case g.SINT64:return W(U.ZERO,t);case g.DOUBLE:case g.FLOAT:return 0;case g.BYTES:return new Uint8Array(0);case g.STRING:return"";default:return 0}}class H{constructor(e){this.info=e}prepare(){var e;if(!this.fieldNoToField){const t=null!==(e=this.info.fields)&&void 0!==e?e:[];this.fieldNoToField=new Map(t.map((e=>[e.no,e])))}}read(e,t,n,r){this.prepare();const s=void 0===r?e.len:e.pos+r;for(;e.pos<s;){const[r,s]=e.tag(),i=this.fieldNoToField.get(r);if(!i){let i=n.readUnknownField;if("throw"==i)throw new Error(`Unknown field ${r} (wire type ${s}) for ${this.info.typeName}`);let o=e.skip(s);!1!==i&&(!0===i?a.onRead:i)(this.info.typeName,t,r,s,o);continue}let l=t,c=i.repeat,d=i.localName;switch(i.oneof&&(l=l[i.oneof],l.oneofKind!==d&&(l=t[i.oneof]={oneofKind:d})),i.kind){case"scalar":case"enum":let t="enum"==i.kind?g.INT32:i.T,r="scalar"==i.kind?i.L:void 0;if(c){let n=l[d];if(s==o.LengthDelimited&&t!=g.STRING&&t!=g.BYTES){let s=e.uint32()+e.pos;for(;e.pos<s;)n.push(this.scalar(e,t,r))}else n.push(this.scalar(e,t,r))}else l[d]=this.scalar(e,t,r);break;case"message":if(c){let t=l[d],r=i.T().internalBinaryRead(e,e.uint32(),n);t.push(r)}else l[d]=i.T().internalBinaryRead(e,e.uint32(),n,l[d]);break;case"map":let[a,h]=this.mapEntry(i,e,n);l[d][a]=h}}}mapEntry(e,t,n){let r,s,i=t.uint32(),a=t.pos+i;for(;t.pos<a;){let[i,a]=t.tag();switch(i){case 1:r=e.K==g.BOOL?t.bool().toString():this.scalar(t,e.K,m.STRING);break;case 2:switch(e.V.kind){case"scalar":s=this.scalar(t,e.V.T,e.V.L);break;case"enum":s=t.int32();break;case"message":s=e.V.T().internalBinaryRead(t,t.uint32(),n)}break;default:throw new Error(`Unknown field ${i} (wire type ${a}) in map entry for ${this.info.typeName}#${e.name}`)}}if(void 0===r){let t=$(e.K);r=e.K==g.BOOL?t.toString():t}if(void 0===s)switch(e.V.kind){case"scalar":s=$(e.V.T,e.V.L);break;case"enum":s=0;break;case"message":s=e.V.T().create()}return[r,s]}scalar(e,t,n){switch(t){case g.INT32:return e.int32();case g.STRING:return e.string();case g.BOOL:return e.bool();case g.DOUBLE:return e.double();case g.FLOAT:return e.float();case g.INT64:return W(e.int64(),n);case g.UINT64:return W(e.uint64(),n);case g.FIXED64:return W(e.fixed64(),n);case g.FIXED32:return e.fixed32();case g.BYTES:return e.bytes();case g.UINT32:return e.uint32();case g.SFIXED32:return e.sfixed32();case g.SFIXED64:return W(e.sfixed64(),n);case g.SINT32:return e.sint32();case g.SINT64:return W(e.sint64(),n)}}}class j{constructor(e){this.info=e}prepare(){if(!this.fields){const e=this.info.fields?this.info.fields.concat():[];this.fields=e.sort(((e,t)=>e.no-t.no))}}write(e,t,n){this.prepare();for(const r of this.fields){let s,i,a=r.repeat,o=r.localName;if(r.oneof){const t=e[r.oneof];if(t.oneofKind!==o)continue;s=t[o],i=!0}else s=e[o],i=!1;switch(r.kind){case"scalar":case"enum":let e="enum"==r.kind?g.INT32:r.T;if(a)if(N(Array.isArray(s)),a==p.PACKED)this.packed(t,e,r.no,s);else for(const n of s)this.scalar(t,e,r.no,n,!0);else void 0===s?N(r.opt):this.scalar(t,e,r.no,s,i||r.opt);break;case"message":if(a){N(Array.isArray(s));for(const e of s)this.message(t,n,r.T(),r.no,e)}else this.message(t,n,r.T(),r.no,s);break;case"map":N("object"==typeof s&&null!==s);for(const[e,i]of Object.entries(s))this.mapEntry(t,n,r,e,i)}}let r=n.writeUnknownFields;!1!==r&&(!0===r?a.onWrite:r)(this.info.typeName,e,t)}mapEntry(e,t,n,r,s){e.tag(n.no,o.LengthDelimited),e.fork();let i=r;switch(n.K){case g.INT32:case g.FIXED32:case g.UINT32:case g.SFIXED32:case g.SINT32:i=Number.parseInt(r);break;case g.BOOL:N("true"==r||"false"==r),i="true"==r}switch(this.scalar(e,n.K,1,i,!0),n.V.kind){case"scalar":this.scalar(e,n.V.T,2,s,!0);break;case"enum":this.scalar(e,g.INT32,2,s,!0);break;case"message":this.message(e,t,n.V.T(),2,s)}e.join()}message(e,t,n,r,s){void 0!==s&&(n.internalBinaryWrite(s,e.tag(r,o.LengthDelimited).fork(),t),e.join())}scalar(e,t,n,r,s){let[i,a,o]=this.scalarInfo(t,r);o&&!s||(e.tag(n,i),e[a](r))}packed(e,t,n,r){if(!r.length)return;N(t!==g.BYTES&&t!==g.STRING),e.tag(n,o.LengthDelimited),e.fork();let[,s]=this.scalarInfo(t);for(let t=0;t<r.length;t++)e[s](r[t]);e.join()}scalarInfo(e,t){let n,r=o.Varint,s=void 0===t,i=0===t;switch(e){case g.INT32:n="int32";break;case g.STRING:i=s||!t.length,r=o.LengthDelimited,n="string";break;case g.BOOL:i=!1===t,n="bool";break;case g.UINT32:n="uint32";break;case g.DOUBLE:r=o.Bit64,n="double";break;case g.FLOAT:r=o.Bit32,n="float";break;case g.INT64:i=s||U.from(t).isZero(),n="int64";break;case g.UINT64:i=s||A.from(t).isZero(),n="uint64";break;case g.FIXED64:i=s||A.from(t).isZero(),r=o.Bit64,n="fixed64";break;case g.BYTES:i=s||!t.byteLength,r=o.LengthDelimited,n="bytes";break;case g.FIXED32:r=o.Bit32,n="fixed32";break;case g.SFIXED32:r=o.Bit32,n="sfixed32";break;case g.SFIXED64:i=s||U.from(t).isZero(),r=o.Bit64,n="sfixed64";break;case g.SINT32:n="sint32";break;case g.SINT64:i=s||U.from(t).isZero(),n="sint64"}return[r,n,s||i]}}const K={emitDefaultValues:!1,enumAsInteger:!1,useProtoFieldName:!1,prettySpaces:0},Q={ignoreUnknownFields:!1},q=Object.values;function X(e,t,n){if(t===n)return!0;if(e!==g.BYTES)return!1;let r=t,s=n;if(r.length!==s.length)return!1;for(let e=0;e<r.length;e++)if(r[e]!=s[e])return!1;return!0}function J(e,t,n){if(t.length!==n.length)return!1;for(let r=0;r<t.length;r++)if(!X(e,t[r],n[r]))return!1;return!0}function Y(e,t,n){if(t.length!==n.length)return!1;for(let r=0;r<t.length;r++)if(!e.equals(t[r],n[r]))return!1;return!0}const Z={writeUnknownFields:!0,writerFactory:()=>new ee};class ee{constructor(e){this.stack=[],this.textEncoder=null!=e?e:new TextEncoder,this.chunks=[],this.buf=[]}finish(){this.chunks.push(new Uint8Array(this.buf));let e=0;for(let t=0;t<this.chunks.length;t++)e+=this.chunks[t].length;let t=new Uint8Array(e),n=0;for(let e=0;e<this.chunks.length;e++)t.set(this.chunks[e],n),n+=this.chunks[e].length;return this.chunks=[],t}fork(){return this.stack.push({chunks:this.chunks,buf:this.buf}),this.chunks=[],this.buf=[],this}join(){let e=this.finish(),t=this.stack.pop();if(!t)throw new Error("invalid state, fork stack empty");return this.chunks=t.chunks,this.buf=t.buf,this.uint32(e.byteLength),this.raw(e)}tag(e,t){return this.uint32((e<<3|t)>>>0)}raw(e){return this.buf.length&&(this.chunks.push(new Uint8Array(this.buf)),this.buf=[]),this.chunks.push(e),this}uint32(e){for(V(e);e>127;)this.buf.push(127&e|128),e>>>=7;return this.buf.push(e),this}int32(e){return B(e),R(e,this.buf),this}bool(e){return this.buf.push(e?1:0),this}bytes(e){return this.uint32(e.byteLength),this.raw(e)}string(e){let t=this.textEncoder.encode(e);return this.uint32(t.byteLength),this.raw(t)}float(e){G(e);let t=new Uint8Array(4);return new DataView(t.buffer).setFloat32(0,e,!0),this.raw(t)}double(e){let t=new Uint8Array(8);return new DataView(t.buffer).setFloat64(0,e,!0),this.raw(t)}fixed32(e){V(e);let t=new Uint8Array(4);return new DataView(t.buffer).setUint32(0,e,!0),this.raw(t)}sfixed32(e){B(e);let t=new Uint8Array(4);return new DataView(t.buffer).setInt32(0,e,!0),this.raw(t)}sint32(e){return B(e),R(e=(e<<1^e>>31)>>>0,this.buf),this}sfixed64(e){let t=new Uint8Array(8),n=new DataView(t.buffer),r=U.from(e);return n.setInt32(0,r.lo,!0),n.setInt32(4,r.hi,!0),this.raw(t)}fixed64(e){let t=new Uint8Array(8),n=new DataView(t.buffer),r=A.from(e);return n.setInt32(0,r.lo,!0),n.setInt32(4,r.hi,!0),this.raw(t)}int64(e){let t=U.from(e);return C(t.lo,t.hi,this.buf),this}sint64(e){let t=U.from(e),n=t.hi>>31;return C(t.lo<<1^n,(t.hi<<1|t.lo>>>31)^n,this.buf),this}uint64(e){let t=A.from(e);return C(t.lo,t.hi,this.buf),this}}const te={readUnknownField:!0,readerFactory:e=>new ne(e)};class ne{constructor(e,t){this.varint64=T,this.uint32=P,this.buf=e,this.len=e.length,this.pos=0,this.view=new DataView(e.buffer,e.byteOffset,e.byteLength),this.textDecoder=null!=t?t:new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0})}tag(){let e=this.uint32(),t=e>>>3,n=7&e;if(t<=0||n<0||n>5)throw new Error("illegal tag: field no "+t+" wire type "+n);return[t,n]}skip(e){let t=this.pos;switch(e){case o.Varint:for(;128&this.buf[this.pos++];);break;case o.Bit64:this.pos+=4;case o.Bit32:this.pos+=4;break;case o.LengthDelimited:let t=this.uint32();this.pos+=t;break;case o.StartGroup:let n;for(;(n=this.tag()[1])!==o.EndGroup;)this.skip(n);break;default:throw new Error("cant skip wire type "+e)}return this.assertBounds(),this.buf.subarray(t,this.pos)}assertBounds(){if(this.pos>this.len)throw new RangeError("premature EOF")}int32(){return 0|this.uint32()}sint32(){let e=this.uint32();return e>>>1^-(1&e)}int64(){return new U(...this.varint64())}uint64(){return new A(...this.varint64())}sint64(){let[e,t]=this.varint64(),n=-(1&e);return e=(e>>>1|(1&t)<<31)^n,t=t>>>1^n,new U(e,t)}bool(){let[e,t]=this.varint64();return 0!==e||0!==t}fixed32(){return this.view.getUint32((this.pos+=4)-4,!0)}sfixed32(){return this.view.getInt32((this.pos+=4)-4,!0)}fixed64(){return new A(this.sfixed32(),this.sfixed32())}sfixed64(){return new U(this.sfixed32(),this.sfixed32())}float(){return this.view.getFloat32((this.pos+=4)-4,!0)}double(){return this.view.getFloat64((this.pos+=8)-8,!0)}bytes(){let e=this.uint32(),t=this.pos;return this.pos+=e,this.assertBounds(),this.buf.subarray(t,t+e)}string(){return this.textDecoder.decode(this.bytes())}}const re=Object.getOwnPropertyDescriptors(Object.getPrototypeOf({}));class se{constructor(e,t,n){this.defaultCheckDepth=16,this.typeName=e,this.fields=t.map(f),this.options=null!=n?n:{},this.messagePrototype=Object.create(null,Object.assign(Object.assign({},re),{[h]:{value:this}})),this.refTypeCheck=new y(this),this.refJsonReader=new z(this),this.refJsonWriter=new _(this),this.refBinReader=new H(this),this.refBinWriter=new j(this)}create(e){let t=function(e){const t=e.messagePrototype?Object.create(e.messagePrototype):Object.defineProperty({},h,{value:e});for(let n of e.fields){let e=n.localName;if(!n.opt)if(n.oneof)t[n.oneof]={oneofKind:void 0};else if(n.repeat)t[e]=[];else switch(n.kind){case"scalar":t[e]=$(n.T,n.L);break;case"enum":t[e]=0;break;case"map":t[e]={}}}return t}(this);return void 0!==e&&d(this,t,e),t}clone(e){let t=this.create();return d(this,t,e),t}equals(e,t){return function(e,t,n){if(t===n)return!0;if(!t||!n)return!1;for(let r of e.fields){let e=r.localName,s=r.oneof?t[r.oneof][e]:t[e],i=r.oneof?n[r.oneof][e]:n[e];switch(r.kind){case"enum":case"scalar":let e="enum"==r.kind?g.INT32:r.T;if(!(r.repeat?J(e,s,i):X(e,s,i)))return!1;break;case"map":if(!("message"==r.V.kind?Y(r.V.T(),q(s),q(i)):J("enum"==r.V.kind?g.INT32:r.V.T,q(s),q(i))))return!1;break;case"message":let t=r.T();if(!(r.repeat?Y(t,s,i):t.equals(s,i)))return!1}}return!0}(this,e,t)}is(e,t=this.defaultCheckDepth){return this.refTypeCheck.is(e,t,!1)}isAssignable(e,t=this.defaultCheckDepth){return this.refTypeCheck.is(e,t,!0)}mergePartial(e,t){d(this,e,t)}fromBinary(e,t){let n=function(e){return e?Object.assign(Object.assign({},te),e):te}(t);return this.internalBinaryRead(n.readerFactory(e),e.byteLength,n)}fromJson(e,t){return this.internalJsonRead(e,function(e){return e?Object.assign(Object.assign({},Q),e):Q}(t))}fromJsonString(e,t){let n=JSON.parse(e);return this.fromJson(n,t)}toJson(e,t){return this.internalJsonWrite(e,function(e){return e?Object.assign(Object.assign({},K),e):K}(t))}toJsonString(e,t){var n;let r=this.toJson(e,t);return JSON.stringify(r,null,null!==(n=null==t?void 0:t.prettySpaces)&&void 0!==n?n:0)}toBinary(e,t){let n=function(e){return e?Object.assign(Object.assign({},Z),e):Z}(t);return this.internalBinaryWrite(e,n.writerFactory(),n).finish()}internalJsonRead(e,t,n){if(null!==e&&"object"==typeof e&&!Array.isArray(e)){let r=null!=n?n:this.create();return this.refJsonReader.read(e,r,t),r}throw new Error(`Unable to parse message ${this.typeName} from JSON ${S(e)}.`)}internalJsonWrite(e,t){return this.refJsonWriter.write(e,t)}internalBinaryWrite(e,t,n){return this.refBinWriter.write(e,t,n),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create();return this.refBinReader.read(e,s,n,t),s}}const ie=new class extends se{constructor(){super("base_message",[{no:1,name:"type",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();if(1===t)s.type=e.string();else{let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},ae=new class extends se{constructor(){super("peerConnectionOptions",[])}create(e){const t=globalThis.Object.create(this.messagePrototype);return void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){return null!=r?r:this.create()}internalBinaryWrite(e,t,n){let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},oe=new class extends se{constructor(){super("config",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"peerConnectionOptions",kind:"message",T:()=>ae},{no:3,name:"protocolVersion",kind:"scalar",opt:!0,T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.peerConnectionOptions=ae.internalBinaryRead(e,e.uint32(),n,s.peerConnectionOptions);break;case 3:s.protocolVersion=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),e.peerConnectionOptions&&ae.internalBinaryWrite(e.peerConnectionOptions,t.tag(2,o.LengthDelimited).fork(),n).join(),void 0!==e.protocolVersion&&t.tag(3,o.LengthDelimited).string(e.protocolVersion);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},le=new class extends se{constructor(){super("identify",[{no:1,name:"type",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();if(1===t)s.type=e.string();else{let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},ce=new class extends se{constructor(){super("endpointId",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"id",kind:"scalar",T:9},{no:3,name:"protocolVersion",kind:"scalar",opt:!0,T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.id="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.id=e.string();break;case 3:s.protocolVersion=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),""!==e.id&&t.tag(2,o.LengthDelimited).string(e.id),void 0!==e.protocolVersion&&t.tag(3,o.LengthDelimited).string(e.protocolVersion);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},de=new class extends se{constructor(){super("endpointIdConfirm",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"committedId",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.committedId="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.committedId=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),""!==e.committedId&&t.tag(2,o.LengthDelimited).string(e.committedId);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},he=new class extends se{constructor(){super("streamerIdChanged",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"newID",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.newID="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.newID=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),""!==e.newID&&t.tag(2,o.LengthDelimited).string(e.newID);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},ue=new class extends se{constructor(){super("listStreamers",[{no:1,name:"type",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();if(1===t)s.type=e.string();else{let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},ge=new class extends se{constructor(){super("streamerList",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"ids",kind:"scalar",repeat:2,T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.ids=[],void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.ids.push(e.string());break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type);for(let n=0;n<e.ids.length;n++)t.tag(2,o.LengthDelimited).string(e.ids[n]);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},me=new class extends se{constructor(){super("subscribe",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"streamerId",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.streamerId="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.streamerId=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),""!==e.streamerId&&t.tag(2,o.LengthDelimited).string(e.streamerId);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},pe=new class extends se{constructor(){super("unsubscribe",[{no:1,name:"type",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();if(1===t)s.type=e.string();else{let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},fe=new class extends se{constructor(){super("playerConnected",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"dataChannel",kind:"scalar",T:8},{no:3,name:"sfu",kind:"scalar",T:8},{no:4,name:"sendOffer",kind:"scalar",T:8},{no:5,name:"playerId",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.dataChannel=!1,t.sfu=!1,t.sendOffer=!1,t.playerId="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.dataChannel=e.bool();break;case 3:s.sfu=e.bool();break;case 4:s.sendOffer=e.bool();break;case 5:s.playerId=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),!1!==e.dataChannel&&t.tag(2,o.Varint).bool(e.dataChannel),!1!==e.sfu&&t.tag(3,o.Varint).bool(e.sfu),!1!==e.sendOffer&&t.tag(4,o.Varint).bool(e.sendOffer),""!==e.playerId&&t.tag(5,o.LengthDelimited).string(e.playerId);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},ve=new class extends se{constructor(){super("playerDisconnected",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"playerId",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.playerId="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.playerId=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),""!==e.playerId&&t.tag(2,o.LengthDelimited).string(e.playerId);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},ye=new class extends se{constructor(){super("offer",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"sdp",kind:"scalar",T:9},{no:3,name:"playerId",kind:"scalar",opt:!0,T:9},{no:4,name:"sfu",kind:"scalar",opt:!0,T:8}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.sdp="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.sdp=e.string();break;case 3:s.playerId=e.string();break;case 4:s.sfu=e.bool();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),""!==e.sdp&&t.tag(2,o.LengthDelimited).string(e.sdp),void 0!==e.playerId&&t.tag(3,o.LengthDelimited).string(e.playerId),void 0!==e.sfu&&t.tag(4,o.Varint).bool(e.sfu);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},Se=new class extends se{constructor(){super("answer",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"sdp",kind:"scalar",T:9},{no:3,name:"playerId",kind:"scalar",opt:!0,T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.sdp="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.sdp=e.string();break;case 3:s.playerId=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),""!==e.sdp&&t.tag(2,o.LengthDelimited).string(e.sdp),void 0!==e.playerId&&t.tag(3,o.LengthDelimited).string(e.playerId);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},we=new class extends se{constructor(){super("iceCandidateData",[{no:1,name:"candidate",kind:"scalar",T:9},{no:2,name:"sdpMid",kind:"scalar",T:9},{no:3,name:"sdpMLineIndex",kind:"scalar",T:5},{no:4,name:"usernameFragment",kind:"scalar",opt:!0,T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.candidate="",t.sdpMid="",t.sdpMLineIndex=0,void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.candidate=e.string();break;case 2:s.sdpMid=e.string();break;case 3:s.sdpMLineIndex=e.int32();break;case 4:s.usernameFragment=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.candidate&&t.tag(1,o.LengthDelimited).string(e.candidate),""!==e.sdpMid&&t.tag(2,o.LengthDelimited).string(e.sdpMid),0!==e.sdpMLineIndex&&t.tag(3,o.Varint).int32(e.sdpMLineIndex),void 0!==e.usernameFragment&&t.tag(4,o.LengthDelimited).string(e.usernameFragment);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},be=new class extends se{constructor(){super("iceCandidate",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"candidate",kind:"message",T:()=>we},{no:3,name:"playerId",kind:"scalar",opt:!0,T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.candidate=we.internalBinaryRead(e,e.uint32(),n,s.candidate);break;case 3:s.playerId=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),e.candidate&&we.internalBinaryWrite(e.candidate,t.tag(2,o.LengthDelimited).fork(),n).join(),void 0!==e.playerId&&t.tag(3,o.LengthDelimited).string(e.playerId);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},Te=new class extends se{constructor(){super("disconnectPlayer",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"playerId",kind:"scalar",T:9},{no:3,name:"reason",kind:"scalar",opt:!0,T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.playerId="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.playerId=e.string();break;case 3:s.reason=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),""!==e.playerId&&t.tag(2,o.LengthDelimited).string(e.playerId),void 0!==e.reason&&t.tag(3,o.LengthDelimited).string(e.reason);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},Ce=new class extends se{constructor(){super("ping",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"time",kind:"scalar",T:5}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.time=0,void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.time=e.int32();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),0!==e.time&&t.tag(2,o.Varint).int32(e.time);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},Ee=new class extends se{constructor(){super("pong",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"time",kind:"scalar",T:5}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.time=0,void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.time=e.int32();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),0!==e.time&&t.tag(2,o.Varint).int32(e.time);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},ke=new class extends se{constructor(){super("streamerDisconnected",[{no:1,name:"type",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();if(1===t)s.type=e.string();else{let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},Me=new class extends se{constructor(){super("layerPreference",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"spatialLayer",kind:"scalar",T:5},{no:3,name:"temporalLayer",kind:"scalar",T:5},{no:4,name:"playerId",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.spatialLayer=0,t.temporalLayer=0,t.playerId="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.spatialLayer=e.int32();break;case 3:s.temporalLayer=e.int32();break;case 4:s.playerId=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),0!==e.spatialLayer&&t.tag(2,o.Varint).int32(e.spatialLayer),0!==e.temporalLayer&&t.tag(3,o.Varint).int32(e.temporalLayer),""!==e.playerId&&t.tag(4,o.LengthDelimited).string(e.playerId);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},Re=new class extends se{constructor(){super("dataChannelRequest",[{no:1,name:"type",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();if(1===t)s.type=e.string();else{let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},Pe=new class extends se{constructor(){super("peerDataChannels",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"playerId",kind:"scalar",T:9},{no:3,name:"sendStreamId",kind:"scalar",T:5},{no:4,name:"recvStreamId",kind:"scalar",T:5}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.playerId="",t.sendStreamId=0,t.recvStreamId=0,void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.playerId=e.string();break;case 3:s.sendStreamId=e.int32();break;case 4:s.recvStreamId=e.int32();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),""!==e.playerId&&t.tag(2,o.LengthDelimited).string(e.playerId),0!==e.sendStreamId&&t.tag(3,o.Varint).int32(e.sendStreamId),0!==e.recvStreamId&&t.tag(4,o.Varint).int32(e.recvStreamId);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},Le=new class extends se{constructor(){super("peerDataChannelsReady",[{no:1,name:"type",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();if(1===t)s.type=e.string();else{let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},Ie=new class extends se{constructor(){super("streamerDataChannels",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"sfuId",kind:"scalar",T:9},{no:3,name:"sendStreamId",kind:"scalar",T:5},{no:4,name:"recvStreamId",kind:"scalar",T:5}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.sfuId="",t.sendStreamId=0,t.recvStreamId=0,void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.sfuId=e.string();break;case 3:s.sendStreamId=e.int32();break;case 4:s.recvStreamId=e.int32();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),""!==e.sfuId&&t.tag(2,o.LengthDelimited).string(e.sfuId),0!==e.sendStreamId&&t.tag(3,o.Varint).int32(e.sendStreamId),0!==e.recvStreamId&&t.tag(4,o.Varint).int32(e.recvStreamId);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},Oe=new class extends se{constructor(){super("startStreaming",[{no:1,name:"type",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();if(1===t)s.type=e.string();else{let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},xe=new class extends se{constructor(){super("stopStreaming",[{no:1,name:"type",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();if(1===t)s.type=e.string();else{let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},Fe=new class extends se{constructor(){super("playerCount",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"count",kind:"scalar",T:5}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.count=0,void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.count=e.int32();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),0!==e.count&&t.tag(2,o.Varint).int32(e.count);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},De=new class extends se{constructor(){super("stats",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"data",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.data="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.data=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),""!==e.data&&t.tag(2,o.LengthDelimited).string(e.data);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},Ae={answer:Se,config:oe,disconnectPlayer:Te,endpointId:ce,endpointIdConfirm:de,iceCandidate:be,identify:le,listStreamers:ue,offer:ye,ping:Ce,playerConnected:fe,playerCount:Fe,playerDisconnected:ve,pong:Ee,stats:De,streamerDisconnected:ke,streamerList:ge,subscribe:me,unsubscribe:pe,layerPreference:Me,dataChannelRequest:Re,peerDataChannels:Pe,peerDataChannelsReady:Le,streamerDataChannels:Ie,startStreaming:Oe,stopStreaming:xe};function Ue(e,t){const n=e.create();return n.type=e.typeName,t&&e.mergePartial(n,t),n}function Ne(e){let t=!0;if(!e.type)return i.Error(i.GetStackTrace(),`Parsed message has no type. Rejected. ${JSON.stringify(e)}`),null;const n=Ae[e.type];if(!n)return i.Error(i.GetStackTrace(),`Message is of an unknown type: "${e.type}". Rejected.`),null;if(n.fields)for(const r of n.fields)r.opt||Object.prototype.hasOwnProperty.call(e,r.name)||(i.Error(i.GetStackTrace(),`Message "${e.type}"" is missing required field "${r.name}". Rejected.`),t=!1);for(const r in e)n.fields.find((e=>e.name===r))||(i.Error(i.GetStackTrace(),`Message "${e.type}" contains unknown field "${r}". Rejected.`),t=!1);return t?n:null}class Be extends l.EventEmitter{static get SIGNALLING_VERSION(){return"1.1.1"}constructor(e){super(),this.transport=e,e.onMessage=t=>{if(t.type==Ce.typeName){const t=Ue(Ee,{time:(new Date).getTime()});e.sendMessage(t)}e.emit("message",t),this.emit(t.type,t)}}connect(e){return this.transport.connect(e)}disconnect(e,t){this.transport.disconnect(e,t)}isConnected(){return this.transport.isConnected()}sendMessage(e){this.transport.sendMessage(e),this.transport.emit("out",e)}}class Ve{constructor(e){this.videoElementProvider=e,this.audioElement=document.createElement("Audio"),this.videoElementProvider.setAudioElement(this.audioElement)}handleOnTrack(e){if(i.Log(i.GetStackTrace(),"handleOnTrack "+JSON.stringify(e.streams),6),e.streams.length<1||"probator"==e.streams[0].id)return;const t=this.videoElementProvider.getVideoElement();if(e.track&&i.Log(i.GetStackTrace(),"Got track - "+e.track.kind+" id="+e.track.id+" readyState="+e.track.readyState,6),"audio"!=e.track.kind)return"video"==e.track.kind&&t.srcObject!==e.streams[0]?(t.srcObject=e.streams[0],void i.Log(i.GetStackTrace(),"Set video source from video track ontrack.")):void 0;this.CreateAudioTrack(e.streams[0])}CreateAudioTrack(e){const t=this.videoElementProvider.getVideoElement();t.srcObject!=e&&t.srcObject&&t.srcObject!==e&&(this.audioElement.srcObject=e,i.Log(i.GetStackTrace(),"Created new audio element to play separate audio stream."))}}class Ge{constructor(e){this.freezeFrameHeight=0,this.freezeFrameWidth=0,this.rootDiv=e,this.rootElement=document.createElement("div"),this.rootElement.id="freezeFrame",this.rootElement.style.display="none",this.rootElement.style.pointerEvents="none",this.rootElement.style.position="absolute",this.rootElement.style.zIndex="20",this.imageElement=document.createElement("img"),this.imageElement.style.position="absolute",this.rootElement.appendChild(this.imageElement),this.rootDiv.appendChild(this.rootElement)}setElementForShow(){this.rootElement.style.display="block"}setElementForHide(){this.rootElement.style.display="none"}updateImageElementSource(e){const t=btoa(e.reduce(((e,t)=>e+String.fromCharCode(t)),""));this.imageElement.src="data:image/jpeg;base64,"+t}setDimensionsFromElementAndResize(){this.freezeFrameHeight=this.imageElement.naturalHeight,this.freezeFrameWidth=this.imageElement.naturalWidth,this.resize()}resize(){if(0!==this.freezeFrameWidth&&0!==this.freezeFrameHeight){let e=0,t=0,n=0,r=0;const s=this.rootDiv.clientWidth/this.rootDiv.clientHeight,i=this.freezeFrameWidth/this.freezeFrameHeight;s<i?(e=this.rootDiv.clientWidth,t=Math.floor(this.rootDiv.clientWidth/i),n=Math.floor(.5*(this.rootDiv.clientHeight-t)),r=0):(e=Math.floor(this.rootDiv.clientHeight*i),t=this.rootDiv.clientHeight,n=0,r=Math.floor(.5*(this.rootDiv.clientWidth-e))),this.rootElement.style.width=this.rootDiv.offsetWidth+"px",this.rootElement.style.height=this.rootDiv.offsetHeight+"px",this.rootElement.style.left="0px",this.rootElement.style.top="0px",this.imageElement.style.width=e+"px",this.imageElement.style.height=t+"px",this.imageElement.style.left=r+"px",this.imageElement.style.top=n+"px"}}}class We{constructor(e){this.receiving=!1,this.size=0,this.jpeg=void 0,this.valid=!1,this.freezeFrameDelay=50,this.freezeFrame=new Ge(e)}showFreezeFrame(){this.valid&&this.freezeFrame.setElementForShow()}hideFreezeFrame(){this.valid=!1,this.freezeFrame.setElementForHide()}updateFreezeFrameAndShow(e,t){this.freezeFrame.updateImageElementSource(e),this.freezeFrame.imageElement.onload=()=>{this.freezeFrame.setDimensionsFromElementAndResize(),t()}}processFreezeFrameMessage(e,t){this.receiving||(this.receiving=!0,this.valid=!1,this.size=0,this.jpeg=void 0),this.size=new DataView(e.slice(1,5).buffer).getInt32(0,!0);const n=e.slice(5);if(this.jpeg){const e=new Uint8Array(this.jpeg.length+n.length);e.set(this.jpeg,0),e.set(n,this.jpeg.length),this.jpeg=e}else this.jpeg=n,this.receiving=!0,i.Log(i.GetStackTrace(),`received first chunk of freeze frame: ${this.jpeg.length}/${this.size}`,6);this.jpeg.length===this.size?(this.receiving=!1,this.valid=!0,i.Log(i.GetStackTrace(),`received complete freeze frame ${this.size}`,6),this.updateFreezeFrameAndShow(this.jpeg,t)):this.jpeg.length>this.size&&(i.Error(i.GetStackTrace(),`received bigger freeze frame than advertised: ${this.jpeg.length}/${this.size}`),this.jpeg=void 0,this.receiving=!1)}}class ze{constructor(e,t,n,r,s=(()=>{})){this.onChange=s,this.onChangeEmit=()=>{},this.id=e,this.description=n,this.label=t,this.value=r}set label(e){this._label=e,this.onChangeEmit(this._value)}get label(){return this._label}get value(){return this._value}set value(e){this._value=e,this.onChange(this._value,this),this.onChangeEmit(this._value)}}class _e extends ze{constructor(e,t,n,r,s,i=(()=>{})){super(e,t,n,r,i);const a=new URLSearchParams(window.location.search);if(s&&a.has(this.id)){const e=this.getUrlParamFlag();this.flag=e}else this.flag=r;this.useUrlParams=s}getUrlParamFlag(){const e=new URLSearchParams(window.location.search);return!!e.has(this.id)&&"false"!==e.get(this.id)&&"False"!==e.get(this.id)}updateURLParams(){if(this.useUrlParams){const e=new URLSearchParams(window.location.search);!0===this.flag?e.set(this.id,"true"):e.set(this.id,"false"),window.history.replaceState({},"",""!==e.toString()?`${location.pathname}?${e}`:`${location.pathname}`)}}enable(){this.flag=!0}get flag(){return!!this.value}set flag(e){this.value=e}}class $e extends ze{constructor(e,t,n,r,s,i,a,o=(()=>{})){super(e,t,n,i,o),this._min=r,this._max=s;const l=new URLSearchParams(window.location.search);if(a&&l.has(this.id)){const e=Number.parseFloat(l.get(this.id));this.number=Number.isNaN(e)?i:e}else this.number=i;this.useUrlParams=a}updateURLParams(){if(this.useUrlParams){const e=new URLSearchParams(window.location.search);e.set(this.id,this.number.toString()),window.history.replaceState({},"",""!==e.toString()?`${location.pathname}?${e}`:`${location.pathname}`)}}set number(e){this.value=this.clamp(e)}get number(){return this.value}clamp(e){return Math.max(Math.min(this._max,e),this._min)}get min(){return this._min}get max(){return this._max}addOnChangedListener(e){this.onChange=e}}class He extends ze{constructor(e,t,n,r,s,i=(()=>{})){super(e,t,n,r,i);const a=new URLSearchParams(window.location.search);if(s&&a.has(this.id)){const e=this.getUrlParamText();this.text=e}else this.text=r;this.useUrlParams=s}getUrlParamText(){var e;const t=new URLSearchParams(window.location.search);return t.has(this.id)&&null!==(e=t.get(this.id))&&void 0!==e?e:""}updateURLParams(){if(this.useUrlParams){const e=new URLSearchParams(window.location.search);e.set(this.id,this.text),window.history.replaceState({},"",""!==e.toString()?`${location.pathname}?${e}`:`${location.pathname}`)}}get text(){return this.value}set text(e){this.value=e}}class je extends ze{constructor(e,t,n,r,s,i,a=(()=>{})){super(e,t,n,r,a),this.options=s;const o=new URLSearchParams(window.location.search),l=i&&o.has(this.id)?this.getUrlParamText():r;this.selected=l,this.useUrlParams=i}getUrlParamText(){var e;const t=new URLSearchParams(window.location.search);return t.has(this.id)&&null!==(e=t.get(this.id))&&void 0!==e?e:""}updateURLParams(){if(this.useUrlParams){const e=new URLSearchParams(window.location.search);e.set(this.id,this.selected),window.history.replaceState({},"",""!==e.toString()?`${location.pathname}?${e}`:`${location.pathname}`)}}addOnChangedListener(e){this.onChange=e}get options(){return this._options}set options(e){this._options=e,this.onChangeEmit(this.selected)}get selected(){return this.value}set selected(e){let t=this.options.filter((t=>-1!==t.indexOf(e)));t.length?this.value=t[0]:(t=this.options.filter((t=>-1!==t.indexOf(e.split(" ")[0]))),t.length&&(this.value=t[0]))}}class Ke extends Event{constructor(e){super("afkWarningActivate"),this.data=e}}class Qe extends Event{constructor(e){super("afkWarningUpdate"),this.data=e}}class qe extends Event{constructor(){super("afkWarningDeactivate")}}class Xe extends Event{constructor(){super("afkTimedOut")}}class Je extends Event{constructor(e){super("videoEncoderAvgQP"),this.data=e}}class Ye extends Event{constructor(){super("webRtcSdp")}}class Ze extends Event{constructor(){super("webRtcAutoConnect")}}class et extends Event{constructor(){super("webRtcConnecting")}}class tt extends Event{constructor(){super("webRtcConnected")}}class nt extends Event{constructor(){super("webRtcFailed")}}class rt extends Event{constructor(e){super("webRtcDisconnected"),this.data=e}}class st extends Event{constructor(e){super("dataChannelOpen"),this.data=e}}class it extends Event{constructor(e){super("dataChannelClose"),this.data=e}}class at extends Event{constructor(e){super("dataChannelError"),this.data=e}}class ot extends Event{constructor(){super("videoInitialized")}}class lt extends Event{constructor(){super("streamLoading")}}class ct extends Event{constructor(){super("streamConnect")}}class dt extends Event{constructor(){super("streamDisconnect")}}class ht extends Event{constructor(){super("streamReconnect")}}class ut extends Event{constructor(e){super("playStreamError"),this.data=e}}class gt extends Event{constructor(){super("playStream")}}class mt extends Event{constructor(e){super("playStreamRejected"),this.data=e}}class pt extends Event{constructor(e){super("loadFreezeFrame"),this.data=e}}class ft extends Event{constructor(){super("hideFreezeFrame")}}class vt extends Event{constructor(e){super("statsReceived"),this.data=e}}class yt extends Event{constructor(e){super("streamerListMessage"),this.data=e}}class St extends Event{constructor(e){super("StreamerIDChangedMessage"),this.data=e}}class wt extends Event{constructor(e){super("latencyTestResult"),this.data=e}}class bt extends Event{constructor(e){super("dataChannelLatencyTestResponse"),this.data=e}}class Tt extends Event{constructor(e){super("dataChannelLatencyTestResult"),this.data=e}}class Ct extends Event{constructor(e){super("initialSettings"),this.data=e}}class Et extends Event{constructor(e){super("settingsChanged"),this.data=e}}class kt extends Event{constructor(){super("xrSessionStarted")}}class Mt extends Event{constructor(){super("xrSessionEnded")}}class Rt extends Event{constructor(e){super("xrFrame"),this.data=e}}class Pt extends Event{constructor(e){super("playerCount"),this.data=e}}class Lt extends Event{constructor(){super("webRtcTCPRelayDetected")}}class It extends EventTarget{dispatchEvent(e){return super.dispatchEvent(e)}addEventListener(e,t){super.addEventListener(e,t)}removeEventListener(e,t){super.removeEventListener(e,t)}}class Ot{}Ot.AutoConnect="AutoConnect",Ot.AutoPlayVideo="AutoPlayVideo",Ot.AFKDetection="TimeoutIfIdle",Ot.BrowserSendOffer="OfferToReceive",Ot.HoveringMouseMode="HoveringMouse",Ot.ForceMonoAudio="ForceMonoAudio",Ot.ForceTURN="ForceTURN",Ot.FakeMouseWithTouches="FakeMouseWithTouches",Ot.IsQualityController="ControlsQuality",Ot.MatchViewportResolution="MatchViewportRes",Ot.StartVideoMuted="StartVideoMuted",Ot.SuppressBrowserKeys="SuppressBrowserKeys",Ot.UseMic="UseMic",Ot.KeyboardInput="KeyboardInput",Ot.MouseInput="MouseInput",Ot.TouchInput="TouchInput",Ot.GamepadInput="GamepadInput",Ot.XRControllerInput="XRControllerInput",Ot.WaitForStreamer="WaitForStreamer",Ot.HideUI="HideUI";const xt=e=>Object.getOwnPropertyNames(Ot).some((t=>Ot[t]===e));class Ft{}Ft.AFKTimeoutSecs="AFKTimeout",Ft.MinQP="MinQP",Ft.MaxQP="MaxQP",Ft.WebRTCFPS="WebRTCFPS",Ft.WebRTCMinBitrate="WebRTCMinBitrate",Ft.WebRTCMaxBitrate="WebRTCMaxBitrate",Ft.MaxReconnectAttempts="MaxReconnectAttempts",Ft.StreamerAutoJoinInterval="StreamerAutoJoinInterval";const Dt=e=>Object.getOwnPropertyNames(Ft).some((t=>Ft[t]===e));class At{}At.SignallingServerUrl="ss";const Ut=e=>Object.getOwnPropertyNames(At).some((t=>At[t]===e));class Nt{}Nt.PreferredCodec="PreferredCodec",Nt.StreamerId="StreamerId";const Bt=e=>Object.getOwnPropertyNames(Nt).some((t=>Nt[t]===e));class Vt{constructor(e={}){this.flags=new Map,this.numericParameters=new Map,this.textParameters=new Map,this.optionParameters=new Map;const{initialSettings:t,useUrlParams:n}=e;this._useUrlParams=!!n,this.populateDefaultSettings(this._useUrlParams,t)}get useUrlParams(){return this._useUrlParams}populateDefaultSettings(e,t){this.textParameters.set(At.SignallingServerUrl,new He(At.SignallingServerUrl,"Signalling url","Url of the signalling server",t&&Object.prototype.hasOwnProperty.call(t,At.SignallingServerUrl)?t[At.SignallingServerUrl]:("https:"===location.protocol?"wss://":"ws://")+window.location.hostname+("80"===window.location.port||""===window.location.port?"":`:${window.location.port}`),e)),this.optionParameters.set(Nt.StreamerId,new je(Nt.StreamerId,"Streamer ID","The ID of the streamer to stream.",t&&Object.prototype.hasOwnProperty.call(t,Nt.StreamerId)?t[Nt.StreamerId]:"",[],e)),this.optionParameters.set(Nt.PreferredCodec,new je(Nt.PreferredCodec,"Preferred Codec","The preferred codec to be used during codec negotiation","H264 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f",t&&Object.prototype.hasOwnProperty.call(t,Nt.PreferredCodec)?[t[Nt.PreferredCodec]]:function(){const e=[];if(!RTCRtpReceiver.getCapabilities)return e.push("Only available on Chrome"),e;const t=/(VP\d|H26\d|AV1).*/;return RTCRtpReceiver.getCapabilities("video").codecs.forEach((n=>{const r=n.mimeType.split("/")[1]+" "+(n.sdpFmtpLine||"");null!==t.exec(r)&&e.push(r)})),e}(),e)),this.flags.set(Ot.AutoConnect,new _e(Ot.AutoConnect,"Auto connect to stream","Whether we should attempt to auto connect to the signalling server or show a click to start prompt.",!(!t||!Object.prototype.hasOwnProperty.call(t,Ot.AutoConnect))&&t[Ot.AutoConnect],e)),this.flags.set(Ot.AutoPlayVideo,new _e(Ot.AutoPlayVideo,"Auto play video","When video is ready automatically start playing it as opposed to showing a play button.",!t||!Object.prototype.hasOwnProperty.call(t,Ot.AutoPlayVideo)||t[Ot.AutoPlayVideo],e)),this.flags.set(Ot.BrowserSendOffer,new _e(Ot.BrowserSendOffer,"Browser send offer","Browser will initiate the WebRTC handshake by sending the offer to the streamer",!(!t||!Object.prototype.hasOwnProperty.call(t,Ot.BrowserSendOffer))&&t[Ot.BrowserSendOffer],e)),this.flags.set(Ot.UseMic,new _e(Ot.UseMic,"Use microphone","Make browser request microphone access and open an input audio track.",!(!t||!Object.prototype.hasOwnProperty.call(t,Ot.UseMic))&&t[Ot.UseMic],e)),this.flags.set(Ot.StartVideoMuted,new _e(Ot.StartVideoMuted,"Start video muted","Video will start muted if true.",!(!t||!Object.prototype.hasOwnProperty.call(t,Ot.StartVideoMuted))&&t[Ot.StartVideoMuted],e)),this.flags.set(Ot.SuppressBrowserKeys,new _e(Ot.SuppressBrowserKeys,"Suppress browser keys","Suppress certain browser keys that we use in UE, for example F5 to show shader complexity instead of refresh the page.",!t||!Object.prototype.hasOwnProperty.call(t,Ot.SuppressBrowserKeys)||t[Ot.SuppressBrowserKeys],e)),this.flags.set(Ot.IsQualityController,new _e(Ot.IsQualityController,"Is quality controller?","True if this peer controls stream quality",!t||!Object.prototype.hasOwnProperty.call(t,Ot.IsQualityController)||t[Ot.IsQualityController],e)),this.flags.set(Ot.ForceMonoAudio,new _e(Ot.ForceMonoAudio,"Force mono audio","Force browser to request mono audio in the SDP",!(!t||!Object.prototype.hasOwnProperty.call(t,Ot.ForceMonoAudio))&&t[Ot.ForceMonoAudio],e)),this.flags.set(Ot.ForceTURN,new _e(Ot.ForceTURN,"Force TURN","Only generate TURN/Relayed ICE candidates.",!(!t||!Object.prototype.hasOwnProperty.call(t,Ot.ForceTURN))&&t[Ot.ForceTURN],e)),this.flags.set(Ot.AFKDetection,new _e(Ot.AFKDetection,"AFK if idle","Timeout the experience if user is AFK for a period.",!(!t||!Object.prototype.hasOwnProperty.call(t,Ot.AFKDetection))&&t[Ot.AFKDetection],e)),this.flags.set(Ot.MatchViewportResolution,new _e(Ot.MatchViewportResolution,"Match viewport resolution","Pixel Streaming will be instructed to dynamically resize the video stream to match the size of the video element.",!(!t||!Object.prototype.hasOwnProperty.call(t,Ot.MatchViewportResolution))&&t[Ot.MatchViewportResolution],e)),this.flags.set(Ot.HoveringMouseMode,new _e(Ot.HoveringMouseMode,"Control Scheme: Locked Mouse","Either locked mouse, where the pointer is consumed by the video and locked to it, or hovering mouse, where the mouse is not consumed.",!(!t||!Object.prototype.hasOwnProperty.call(t,Ot.HoveringMouseMode))&&t[Ot.HoveringMouseMode],e,((e,t)=>{t.label=`Control Scheme: ${e?"Hovering":"Locked"} Mouse`}))),this.flags.set(Ot.FakeMouseWithTouches,new _e(Ot.FakeMouseWithTouches,"Fake mouse with touches","A single finger touch is converted into a mouse event. This allows a non-touch application to be controlled partially via a touch device.",!t||!Object.prototype.hasOwnProperty.call(t,Ot.FakeMouseWithTouches)||t[Ot.FakeMouseWithTouches],e)),this.flags.set(Ot.KeyboardInput,new _e(Ot.KeyboardInput,"Keyboard input","If enabled, send keyboard events to streamer",!t||!Object.prototype.hasOwnProperty.call(t,Ot.KeyboardInput)||t[Ot.KeyboardInput],e)),this.flags.set(Ot.MouseInput,new _e(Ot.MouseInput,"Mouse input","If enabled, send mouse events to streamer",!t||!Object.prototype.hasOwnProperty.call(t,Ot.MouseInput)||t[Ot.MouseInput],e)),this.flags.set(Ot.TouchInput,new _e(Ot.TouchInput,"Touch input","If enabled, send touch events to streamer",!t||!Object.prototype.hasOwnProperty.call(t,Ot.TouchInput)||t[Ot.TouchInput],e)),this.flags.set(Ot.GamepadInput,new _e(Ot.GamepadInput,"Gamepad input","If enabled, send gamepad events to streamer",!t||!Object.prototype.hasOwnProperty.call(t,Ot.GamepadInput)||t[Ot.GamepadInput],e)),this.flags.set(Ot.XRControllerInput,new _e(Ot.XRControllerInput,"XR controller input","If enabled, send XR controller events to streamer",!t||!Object.prototype.hasOwnProperty.call(t,Ot.XRControllerInput)||t[Ot.XRControllerInput],e)),this.flags.set(Ot.WaitForStreamer,new _e(Ot.WaitForStreamer,"Wait for streamer","Will continue trying to connect to the first streamer available.",!t||!Object.prototype.hasOwnProperty.call(t,Ot.WaitForStreamer)||t[Ot.WaitForStreamer],e)),this.flags.set(Ot.HideUI,new _e(Ot.HideUI,"Hide the UI overlay","Will hide all UI overlay details",!(!t||!Object.prototype.hasOwnProperty.call(t,Ot.HideUI))&&t[Ot.HideUI],e)),this.numericParameters.set(Ft.AFKTimeoutSecs,new $e(Ft.AFKTimeoutSecs,"AFK timeout","The time (in seconds) it takes for the application to time out if AFK timeout is enabled.",0,600,t&&Object.prototype.hasOwnProperty.call(t,Ft.AFKTimeoutSecs)?t[Ft.AFKTimeoutSecs]:120,e)),this.numericParameters.set(Ft.MaxReconnectAttempts,new $e(Ft.MaxReconnectAttempts,"Max Reconnects","Maximum number of reconnects the application will attempt when a streamer disconnects.",0,999,t&&Object.prototype.hasOwnProperty.call(t,Ft.MaxReconnectAttempts)?t[Ft.MaxReconnectAttempts]:3,e)),this.numericParameters.set(Ft.MinQP,new $e(Ft.MinQP,"Min QP","The lower bound for the quantization parameter (QP) of the encoder. 0 = Best quality, 51 = worst quality.",0,51,t&&Object.prototype.hasOwnProperty.call(t,Ft.MinQP)?t[Ft.MinQP]:0,e)),this.numericParameters.set(Ft.MaxQP,new $e(Ft.MaxQP,"Max QP","The upper bound for the quantization parameter (QP) of the encoder. 0 = Best quality, 51 = worst quality.",0,51,t&&Object.prototype.hasOwnProperty.call(t,Ft.MaxQP)?t[Ft.MaxQP]:51,e)),this.numericParameters.set(Ft.WebRTCFPS,new $e(Ft.WebRTCFPS,"Max FPS","The maximum FPS that WebRTC will try to transmit frames at.",1,999,t&&Object.prototype.hasOwnProperty.call(t,Ft.WebRTCFPS)?t[Ft.WebRTCFPS]:60,e)),this.numericParameters.set(Ft.WebRTCMinBitrate,new $e(Ft.WebRTCMinBitrate,"Min Bitrate (kbps)","The minimum bitrate that WebRTC should use.",0,5e5,t&&Object.prototype.hasOwnProperty.call(t,Ft.WebRTCMinBitrate)?t[Ft.WebRTCMinBitrate]:0,e)),this.numericParameters.set(Ft.WebRTCMaxBitrate,new $e(Ft.WebRTCMaxBitrate,"Max Bitrate (kbps)","The maximum bitrate that WebRTC should use.",0,5e5,t&&Object.prototype.hasOwnProperty.call(t,Ft.WebRTCMaxBitrate)?t[Ft.WebRTCMaxBitrate]:0,e)),this.numericParameters.set(Ft.StreamerAutoJoinInterval,new $e(Ft.StreamerAutoJoinInterval,"Streamer Auto Join Interval (ms)","Delay between retries when waiting for an available streamer.",500,9e5,t&&Object.prototype.hasOwnProperty.call(t,Ft.StreamerAutoJoinInterval)?t[Ft.StreamerAutoJoinInterval]:3e3,e))}_addOnNumericSettingChangedListener(e,t){this.numericParameters.has(e)&&this.numericParameters.get(e).addOnChangedListener(t)}_addOnOptionSettingChangedListener(e,t){this.optionParameters.has(e)&&this.optionParameters.get(e).addOnChangedListener(t)}getNumericSettingValue(e){if(this.numericParameters.has(e))return this.numericParameters.get(e).number;throw new Error(`There is no numeric setting with the id of ${e}`)}getTextSettingValue(e){if(this.textParameters.has(e))return this.textParameters.get(e).value;throw new Error(`There is no numeric setting with the id of ${e}`)}setNumericSetting(e,t){if(!this.numericParameters.has(e))throw new Error(`There is no numeric setting with the id of ${e}`);this.numericParameters.get(e).number=t}_addOnSettingChangedListener(e,t){this.flags.has(e)&&(this.flags.get(e).onChange=t)}_addOnTextSettingChangedListener(e,t){this.textParameters.has(e)&&(this.textParameters.get(e).onChange=t)}getSettingOption(e){return this.optionParameters.get(e)}isFlagEnabled(e){return this.flags.get(e).flag}setFlagEnabled(e,t){this.flags.has(e)?this.flags.get(e).flag=t:i.Warning(i.GetStackTrace(),`Cannot toggle flag called ${e} - it does not exist in the Config.flags map.`)}setTextSetting(e,t){this.textParameters.has(e)?this.textParameters.get(e).text=t:i.Warning(i.GetStackTrace(),`Cannot set text setting called ${e} - it does not exist in the Config.textParameters map.`)}setOptionSettingOptions(e,t){this.optionParameters.has(e)?this.optionParameters.get(e).options=t:i.Warning(i.GetStackTrace(),`Cannot set text setting called ${e} - it does not exist in the Config.optionParameters map.`)}setOptionSettingValue(e,t){if(this.optionParameters.has(e)){const n=this.optionParameters.get(e),r=n.options;r.includes(t)||(r.push(t),n.options=r),n.selected=t}else i.Warning(i.GetStackTrace(),`Cannot set text setting called ${e} - it does not exist in the Config.enumParameters map.`)}setFlagLabel(e,t){this.flags.has(e)?this.flags.get(e).label=t:i.Warning(i.GetStackTrace(),`Cannot set label for flag called ${e} - it does not exist in the Config.flags map.`)}setSettings(e){for(const t of Object.keys(e))xt(t)?this.setFlagEnabled(t,e[t]):Dt(t)?this.setNumericSetting(t,e[t]):Ut(t)?this.setTextSetting(t,e[t]):Bt(t)&&this.setOptionSettingValue(t,e[t])}getSettings(){const e={};for(const[t,n]of this.flags.entries())e[t]=n.flag;for(const[t,n]of this.numericParameters.entries())e[t]=n.number;for(const[t,n]of this.textParameters.entries())e[t]=n.text;for(const[t,n]of this.optionParameters.entries())e[t]=n.selected;return e}getFlags(){return Array.from(this.flags.values())}getTextSettings(){return Array.from(this.textParameters.values())}getNumericSettings(){return Array.from(this.numericParameters.values())}getOptionSettings(){return Array.from(this.optionParameters.values())}_registerOnChangeEvents(e){for(const t of this.flags.keys()){const n=this.flags.get(t);n&&(n.onChangeEmit=t=>e.dispatchEvent(new Et({id:n.id,type:"flag",value:t,target:n})))}for(const t of this.numericParameters.keys()){const n=this.numericParameters.get(t);n&&(n.onChangeEmit=t=>e.dispatchEvent(new Et({id:n.id,type:"number",value:t,target:n})))}for(const t of this.textParameters.keys()){const n=this.textParameters.get(t);n&&(n.onChangeEmit=t=>e.dispatchEvent(new Et({id:n.id,type:"text",value:t,target:n})))}for(const t of this.optionParameters.keys()){const n=this.optionParameters.get(t);n&&(n.onChangeEmit=t=>e.dispatchEvent(new Et({id:n.id,type:"option",value:t,target:n})))}}}var Gt;!function(e){e[e.LockedMouse=0]="LockedMouse",e[e.HoveringMouse=1]="HoveringMouse"}(Gt||(Gt={}));class Wt{constructor(e,t,n){this.closeTimeout=10,this.active=!1,this.countdownActive=!1,this.warnTimer=void 0,this.countDown=0,this.countDownTimer=void 0,this.config=e,this.pixelStreaming=t,this.onDismissAfk=n,this.onAFKTimedOutCallback=()=>{console.log("AFK timed out, did you want to override this callback?")}}onAfkClick(){clearInterval(this.countDownTimer),(this.active||this.countdownActive)&&(this.startAfkWarningTimer(),this.pixelStreaming.dispatchEvent(new qe))}startAfkWarningTimer(){this.config.getNumericSettingValue(Ft.AFKTimeoutSecs)>0&&this.config.isFlagEnabled(Ot.AFKDetection)?this.active=!0:this.active=!1,this.resetAfkWarningTimer()}stopAfkWarningTimer(){this.active=!1,this.countdownActive=!1,clearTimeout(this.warnTimer),clearInterval(this.countDownTimer)}pauseAfkWarningTimer(){this.active=!1}resetAfkWarningTimer(){this.active&&this.config.isFlagEnabled(Ot.AFKDetection)&&(clearTimeout(this.warnTimer),this.warnTimer=setTimeout((()=>this.activateAfkEvent()),1e3*this.config.getNumericSettingValue(Ft.AFKTimeoutSecs)))}activateAfkEvent(){this.pauseAfkWarningTimer(),this.pixelStreaming.dispatchEvent(new Ke({countDown:this.countDown,dismissAfk:this.onDismissAfk})),this.countDown=this.closeTimeout,this.countdownActive=!0,this.pixelStreaming.dispatchEvent(new Qe({countDown:this.countDown})),this.config.isFlagEnabled(Ot.HoveringMouseMode)||document.exitPointerLock&&document.exitPointerLock(),this.countDownTimer=setInterval((()=>{this.countDown--,0==this.countDown?(this.pixelStreaming.dispatchEvent(new Xe),this.onAFKTimedOutCallback(),i.Log(i.GetStackTrace(),"You have been disconnected due to inactivity"),this.stopAfkWarningTimer()):this.pixelStreaming.dispatchEvent(new Qe({countDown:this.countDown}))}),1e3)}}class zt{constructor(){this.isReceivingFreezeFrame=!1}getDataChannelInstance(){return this}createDataChannel(e,t,n){this.peerConnection=e,this.label=t,this.datachannelOptions=n,null==n&&(this.datachannelOptions={},this.datachannelOptions.ordered=!0),this.dataChannel=this.peerConnection.createDataChannel(this.label,this.datachannelOptions),this.setupDataChannel()}setupDataChannel(){this.dataChannel.binaryType="arraybuffer",this.dataChannel.onopen=e=>this.handleOnOpen(e),this.dataChannel.onclose=e=>this.handleOnClose(e),this.dataChannel.onmessage=e=>this.handleOnMessage(e),this.dataChannel.onerror=e=>this.handleOnError(e)}handleOnOpen(e){var t;i.Log(i.GetStackTrace(),`Data Channel (${this.label}) opened.`,7),this.onOpen(null===(t=this.dataChannel)||void 0===t?void 0:t.label,e)}handleOnClose(e){var t;i.Log(i.GetStackTrace(),`Data Channel (${this.label}) closed.`,7),this.onClose(null===(t=this.dataChannel)||void 0===t?void 0:t.label,e)}handleOnMessage(e){i.Log(i.GetStackTrace(),`Data Channel (${this.label}) message: ${e}`,8)}handleOnError(e){var t;i.Log(i.GetStackTrace(),`Data Channel (${this.label}) error: ${e}`,7),this.onError(null===(t=this.dataChannel)||void 0===t?void 0:t.label,e)}onOpen(e,t){}onClose(e,t){}onError(e,t){}}class _t{}class $t{}class Ht{}class jt{}class Kt{}class Qt{}class qt{}class Xt{constructor(){this.inboundVideoStats=new $t,this.inboundAudioStats=new _t,this.DataChannelStats=new Ht,this.outBoundVideoStats=new Kt,this.sessionStats=new Qt,this.streamStats=new qt,this.codecs=new Map}processStats(e){this.localCandidates=new Array,this.remoteCandidates=new Array,this.candidatePairs=new Array,e.forEach((e=>{switch(e.type){case"candidate-pair":this.handleCandidatePair(e);break;case"certificate":case"media-source":case"media-playout":case"outbound-rtp":case"peer-connection":case"remote-inbound-rtp":break;case"codec":this.handleCodec(e);break;case"data-channel":this.handleDataChannel(e);break;case"inbound-rtp":this.handleInBoundRTP(e);break;case"local-candidate":this.handleLocalCandidate(e);break;case"remote-candidate":this.handleRemoteCandidate(e);break;case"remote-outbound-rtp":this.handleRemoteOutBound(e);break;case"track":this.handleTrack(e);break;case"transport":this.handleTransport(e);break;case"stream":this.handleStream(e);break;default:i.Error(i.GetStackTrace(),"unhandled Stat Type"),i.Log(i.GetStackTrace(),e)}}))}handleStream(e){this.streamStats=e}handleCandidatePair(e){this.candidatePairs.push(e)}handleDataChannel(e){this.DataChannelStats.bytesReceived=e.bytesReceived,this.DataChannelStats.bytesSent=e.bytesSent,this.DataChannelStats.dataChannelIdentifier=e.dataChannelIdentifier,this.DataChannelStats.id=e.id,this.DataChannelStats.label=e.label,this.DataChannelStats.messagesReceived=e.messagesReceived,this.DataChannelStats.messagesSent=e.messagesSent,this.DataChannelStats.protocol=e.protocol,this.DataChannelStats.state=e.state,this.DataChannelStats.timestamp=e.timestamp}handleLocalCandidate(e){const t=new jt;t.label="local-candidate",t.address=e.address,t.port=e.port,t.protocol=e.protocol,t.candidateType=e.candidateType,t.id=e.id,t.relayProtocol=e.relayProtocol,t.transportId=e.transportId,this.localCandidates.push(t)}handleRemoteCandidate(e){const t=new jt;t.label="remote-candidate",t.address=e.address,t.port=e.port,t.protocol=e.protocol,t.id=e.id,t.candidateType=e.candidateType,t.relayProtocol=e.relayProtocol,t.transportId=e.transportId,this.remoteCandidates.push(t)}handleInBoundRTP(e){switch(e.kind){case"video":this.inboundVideoStats=e,null!=this.lastVideoStats&&(this.inboundVideoStats.bitrate=8*(this.inboundVideoStats.bytesReceived-this.lastVideoStats.bytesReceived)/(this.inboundVideoStats.timestamp-this.lastVideoStats.timestamp),this.inboundVideoStats.bitrate=Math.floor(this.inboundVideoStats.bitrate)),this.lastVideoStats=Object.assign({},this.inboundVideoStats);break;case"audio":this.inboundAudioStats=e,null!=this.lastAudioStats&&(this.inboundAudioStats.bitrate=8*(this.inboundAudioStats.bytesReceived-this.lastAudioStats.bytesReceived)/(this.inboundAudioStats.timestamp-this.lastAudioStats.timestamp),this.inboundAudioStats.bitrate=Math.floor(this.inboundAudioStats.bitrate)),this.lastAudioStats=Object.assign({},this.inboundAudioStats);break;default:i.Log(i.GetStackTrace(),"Kind is not handled")}}handleRemoteOutBound(e){"video"===e.kind&&(this.outBoundVideoStats.bytesSent=e.bytesSent,this.outBoundVideoStats.id=e.id,this.outBoundVideoStats.localId=e.localId,this.outBoundVideoStats.packetsSent=e.packetsSent,this.outBoundVideoStats.remoteTimestamp=e.remoteTimestamp,this.outBoundVideoStats.timestamp=e.timestamp)}handleTrack(e){"track"!==e.type||"video_label"!==e.trackIdentifier&&"video"!==e.kind||(this.inboundVideoStats.framesDropped=e.framesDropped,this.inboundVideoStats.framesReceived=e.framesReceived,this.inboundVideoStats.frameHeight=e.frameHeight,this.inboundVideoStats.frameWidth=e.frameWidth)}handleTransport(e){this.transportStats=e}handleCodec(e){const t=e.id,n=`${e.mimeType.replace("video/","").replace("audio/","")}${e.sdpFmtpLine?` ${e.sdpFmtpLine}`:""}`;this.codecs.set(t,n)}handleSessionStatistics(e,t,n){const r=Date.now()-e;this.sessionStats.runTime=new Date(r).toISOString().substr(11,8).toString();const s=null===t?"Not sent yet":t?"true":"false";this.sessionStats.controlsStreamInput=s,this.sessionStats.videoEncoderAvgQP=n}isNumber(e){return"number"==typeof e&&isFinite(e)}getActiveCandidatePair(){return this.transportStats?this.candidatePairs.find((e=>e.id===this.transportStats.selectedCandidatePairId),null):this.candidatePairs.find((e=>e.selected),null)}}const Jt=(Yt={parseRtpParameters:()=>e.parseRtpParameters,splitSections:()=>e.splitSections},Zt={},r.d(Zt,Yt),Zt);var Yt,Zt;class en{static isVideoTransceiver(e){return this.canTransceiverReceiveVideo(e)||this.canTransceiverSendVideo(e)}static canTransceiverReceiveVideo(e){return!!e&&("sendrecv"===e.direction||"recvonly"===e.direction)&&e.receiver&&e.receiver.track&&"video"===e.receiver.track.kind}static canTransceiverSendVideo(e){return!!e&&("sendrecv"===e.direction||"sendonly"===e.direction)&&e.sender&&e.sender.track&&"video"===e.sender.track.kind}static isAudioTransceiver(e){return this.canTransceiverReceiveAudio(e)||this.canTransceiverSendAudio(e)}static canTransceiverReceiveAudio(e){return!!e&&("sendrecv"===e.direction||"recvonly"===e.direction)&&e.receiver&&e.receiver.track&&"audio"===e.receiver.track.kind}static canTransceiverSendAudio(e){return!!e&&("sendrecv"===e.direction||"sendonly"===e.direction)&&e.sender&&e.sender.track&&"audio"===e.sender.track.kind}}var tn,nn,rn=function(e,t,n,r){return new(n||(n=Promise))((function(s,i){function a(e){try{l(r.next(e))}catch(e){i(e)}}function o(e){try{l(r.throw(e))}catch(e){i(e)}}function l(e){var t;e.done?s(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,o)}l((r=r.apply(e,t||[])).next())}))};class sn{constructor(e,t,n){this.config=t,this.createPeerConnection(e,n)}createPeerConnection(e,t){this.config.isFlagEnabled(Ot.ForceTURN)&&(e.iceTransportPolicy="relay",i.Log(i.GetStackTrace(),"Forcing TURN usage by setting ICE Transport Policy in peer connection config.")),this.peerConnection=new RTCPeerConnection(e),this.peerConnection.onsignalingstatechange=e=>this.handleSignalStateChange(e),this.peerConnection.oniceconnectionstatechange=e=>this.handleIceConnectionStateChange(e),this.peerConnection.onicegatheringstatechange=e=>this.handleIceGatheringStateChange(e),this.peerConnection.ontrack=e=>this.handleOnTrack(e),this.peerConnection.onicecandidate=e=>this.handleIceCandidate(e),this.peerConnection.ondatachannel=e=>this.handleDataChannel(e),this.aggregatedStats=new Xt,this.preferredCodec=t,this.updateCodecSelection=!0}createOffer(e,t){return rn(this,void 0,void 0,(function*(){i.Log(i.GetStackTrace(),"Create Offer",6);const n="localhost"===location.hostname||"127.0.0.1"===location.hostname,r="https:"===location.protocol;let s=t.isFlagEnabled(Ot.UseMic);!s||n||r||(s=!1,i.Error(i.GetStackTrace(),"Microphone access in the browser will not work if you are not on HTTPS or localhost. Disabling mic access."),i.Error(i.GetStackTrace(),"For testing you can enable HTTP microphone access Chrome by visiting chrome://flags/ and enabling 'unsafely-treat-insecure-origin-as-secure'")),this.setupTransceiversAsync(s).finally((()=>{var t;null===(t=this.peerConnection)||void 0===t||t.createOffer(e).then((e=>{var t;this.showTextOverlayConnecting(),e.sdp=this.mungeSDP(e.sdp,s),null===(t=this.peerConnection)||void 0===t||t.setLocalDescription(e),this.onSendWebRTCOffer(e)})).catch((()=>{this.showTextOverlaySetupFailure()}))}))}))}receiveOffer(e,t){var n;return rn(this,void 0,void 0,(function*(){i.Log(i.GetStackTrace(),"Receive Offer",6),null===(n=this.peerConnection)||void 0===n||n.setRemoteDescription(e).then((()=>{const e="localhost"===location.hostname||"127.0.0.1"===location.hostname,n="https:"===location.protocol;let r=t.isFlagEnabled(Ot.UseMic);!r||e||n||(r=!1,i.Error(i.GetStackTrace(),"Microphone access in the browser will not work if you are not on HTTPS or localhost. Disabling mic access."),i.Error(i.GetStackTrace(),"For testing you can enable HTTP microphone access Chrome by visiting chrome://flags/ and enabling 'unsafely-treat-insecure-origin-as-secure'")),this.setupTransceiversAsync(r).finally((()=>{var e;null===(e=this.peerConnection)||void 0===e||e.createAnswer().then((e=>{var t;return e.sdp=this.mungeSDP(e.sdp,r),null===(t=this.peerConnection)||void 0===t?void 0:t.setLocalDescription(e)})).then((()=>{var e;this.onSendWebRTCAnswer(null===(e=this.peerConnection)||void 0===e?void 0:e.currentLocalDescription)})).catch((()=>{i.Error(i.GetStackTrace(),"createAnswer() failed")}))}))})),this.config.setOptionSettingOptions(Nt.PreferredCodec,this.parseAvailableCodecs(e).filter((e=>this.config.getSettingOption(Nt.PreferredCodec).options.includes(e))))}))}receiveAnswer(e){var t;null===(t=this.peerConnection)||void 0===t||t.setRemoteDescription(e),this.config.setOptionSettingOptions(Nt.PreferredCodec,this.parseAvailableCodecs(e).filter((e=>this.config.getSettingOption(Nt.PreferredCodec).options.includes(e))))}generateStats(){var e,t;const n=e=>{this.aggregatedStats.processStats(e)},r=null===(e=this.peerConnection)||void 0===e?void 0:e.getStats(this.audioTrack).then(n),s=null===(t=this.peerConnection)||void 0===t?void 0:t.getStats(this.videoTrack).then(n);Promise.allSettled([r,s]).then((()=>{this.onVideoStats(this.aggregatedStats),this.updateCodecSelection&&this.aggregatedStats.inboundVideoStats.codecId&&this.config.setOptionSettingValue(Nt.PreferredCodec,this.aggregatedStats.codecs.get(this.aggregatedStats.inboundVideoStats.codecId))}))}close(){this.peerConnection&&(this.peerConnection.close(),this.peerConnection=null)}mungeSDP(e,t){let n=e.replace(/(a=fmtp:\d+ .*level-asymmetry-allowed=.*)\r\n/gm,"$1;x-google-start-bitrate=10000;x-google-max-bitrate=100000\r\n"),r="maxaveragebitrate=510000;";return t&&(r+="sprop-maxcapturerate=48000;"),r+=this.config.isFlagEnabled(Ot.ForceMonoAudio)?"stereo=0;":"stereo=1;",r+="useinbandfec=1",n=n.replace("useinbandfec=1",r),n}handleOnIce(e){var t;i.Log(i.GetStackTrace(),"peerconnection handleOnIce",6),this.config.isFlagEnabled(Ot.ForceTURN)&&e.candidate.indexOf("relay")<0?i.Info(i.GetStackTrace(),`Dropping candidate because it was not TURN relay. | Type= ${e.type} | Protocol= ${e.protocol} | Address=${e.address} | Port=${e.port} |`,6):null===(t=this.peerConnection)||void 0===t||t.addIceCandidate(e)}handleSignalStateChange(e){i.Log(i.GetStackTrace(),"signaling state change: "+e,6)}handleIceConnectionStateChange(e){i.Log(i.GetStackTrace(),"ice connection state change: "+e,6),this.onIceConnectionStateChange(e)}handleIceGatheringStateChange(e){i.Log(i.GetStackTrace(),"ice gathering state change: "+JSON.stringify(e),6)}handleOnTrack(e){e.streams.length<1||"probator"==e.streams[0].id||("video"==e.track.kind&&(this.videoTrack=e.track),"audio"==e.track.kind&&(this.audioTrack=e.track),this.onTrack(e))}handleIceCandidate(e){this.onPeerIceCandidate(e)}handleDataChannel(e){this.onDataChannel(e)}onTrack(e){}onIceConnectionStateChange(e){}onPeerIceCandidate(e){}onDataChannel(e){}setupTransceiversAsync(e){var t,n,r,s,i,a,o,l,c;return rn(this,void 0,void 0,(function*(){const d=(null===(t=this.peerConnection)||void 0===t?void 0:t.getTransceivers().length)>0;if(null===(n=this.peerConnection)||void 0===n||n.addTransceiver("video",{direction:"recvonly"}),RTCRtpReceiver.getCapabilities&&""!=this.preferredCodec)for(const e of null!==(s=null===(r=this.peerConnection)||void 0===r?void 0:r.getTransceivers())&&void 0!==s?s:[])if(e&&e.receiver&&e.receiver.track&&"video"===e.receiver.track.kind&&e.setCodecPreferences){const t=this.preferredCodec.split(" "),n=[{mimeType:"video/"+t[0],clockRate:9e4,sdpFmtpLine:t[1]?t[1]:""}];this.config.getSettingOption(Nt.PreferredCodec).options.filter((e=>e!=this.preferredCodec)).forEach((e=>{const t=e.split(" ");n.push({mimeType:"video/"+t[0],clockRate:9e4,sdpFmtpLine:t[1]?t[1]:""})}));for(const e of n)""===e.sdpFmtpLine&&delete e.sdpFmtpLine;e.setCodecPreferences(n)}if(e){const e={video:!1,audio:{autoGainControl:!1,channelCount:1,echoCancellation:!1,latency:0,noiseSuppression:!1,sampleRate:48e3,sampleSize:16,volume:1}},t=yield navigator.mediaDevices.getUserMedia(e);if(t)if(d){for(const e of null!==(o=null===(a=this.peerConnection)||void 0===a?void 0:a.getTransceivers())&&void 0!==o?o:[])if(en.canTransceiverReceiveAudio(e))for(const n of t.getTracks())n.kind&&"audio"==n.kind&&(e.sender.replaceTrack(n),e.direction="sendrecv")}else for(const e of t.getTracks())e.kind&&"audio"==e.kind&&(null===(l=this.peerConnection)||void 0===l||l.addTransceiver(e,{direction:"sendrecv"}));else null===(c=this.peerConnection)||void 0===c||c.addTransceiver("audio",{direction:"recvonly"})}else null===(i=this.peerConnection)||void 0===i||i.addTransceiver("audio",{direction:"recvonly"})}))}onVideoStats(e){}onSendWebRTCOffer(e){}onSendWebRTCAnswer(e){}showTextOverlayConnecting(){}showTextOverlaySetupFailure(){}parseAvailableCodecs(e){if(!RTCRtpReceiver.getCapabilities)return["Only available on Chrome"];const t=[],n=(0,Jt.splitSections)(e.sdp);return n.shift(),n.forEach((e=>{const{codecs:n}=(0,Jt.parseRtpParameters)(e),r=/(VP\d|H26\d|AV1).*/;n.forEach((e=>{const n=e.name+" "+Object.keys(e.parameters||{}).map((t=>t+"="+e.parameters[t])).join(";");if(null!==r.exec(n)){"VP9"==e.name&&(e.parameters={"profile-id":"0"});const n=e.name+" "+Object.keys(e.parameters||{}).map((t=>t+"="+e.parameters[t])).join(";");t.push(n)}}))})),t}}class an{constructor(){this.PixelStreamingSettings=new on,this.EncoderSettings=new ln,this.WebRTCSettings=new cn}ueCompatible(){null!=this.WebRTCSettings.MaxFPS&&(this.WebRTCSettings.FPS=this.WebRTCSettings.MaxFPS)}}class on{}class ln{}class cn{}class dn{constructor(){this.ReceiptTimeMs=null,this.TransmissionTimeMs=null,this.PreCaptureTimeMs=null,this.PostCaptureTimeMs=null,this.PreEncodeTimeMs=null,this.PostEncodeTimeMs=null,this.EncodeMs=null,this.CaptureToSendMs=null,this.testStartTimeMs=0,this.browserReceiptTimeMs=0,this.latencyExcludingDecode=0,this.testDuration=0,this.networkLatency=0,this.browserSendLatency=0,this.frameDisplayDeltaTimeMs=0,this.endToEndLatency=0,this.encodeLatency=0}setFrameDisplayDeltaTime(e){0==this.frameDisplayDeltaTimeMs&&(this.frameDisplayDeltaTimeMs=Math.round(e))}processFields(){null!=this.EncodeMs||null==this.PreEncodeTimeMs&&null==this.PostEncodeTimeMs||(i.Log(i.GetStackTrace(),`Setting Encode Ms \n ${this.PostEncodeTimeMs} \n ${this.PreEncodeTimeMs}`,6),this.EncodeMs=this.PostEncodeTimeMs-this.PreEncodeTimeMs),null!=this.CaptureToSendMs||null==this.PreCaptureTimeMs&&null==this.PostCaptureTimeMs||(i.Log(i.GetStackTrace(),`Setting CaptureToSendMs Ms \n ${this.PostCaptureTimeMs} \n ${this.PreCaptureTimeMs}`,6),this.CaptureToSendMs=this.PostCaptureTimeMs-this.PreCaptureTimeMs)}}class hn{static setExtensionFromBytes(e,t){t.receiving||(t.mimetype="",t.extension="",t.receiving=!0,t.valid=!1,t.size=0,t.data=[],t.timestampStart=(new Date).getTime(),i.Log(i.GetStackTrace(),"Received first chunk of file",6));const n=new TextDecoder("utf-16").decode(e.slice(1));i.Log(i.GetStackTrace(),n,6),t.extension=n}static setMimeTypeFromBytes(e,t){t.receiving||(t.mimetype="",t.extension="",t.receiving=!0,t.valid=!1,t.size=0,t.data=[],t.timestampStart=(new Date).getTime(),i.Log(i.GetStackTrace(),"Received first chunk of file",6));const n=new TextDecoder("utf-16").decode(e.slice(1));i.Log(i.GetStackTrace(),n,6),t.mimetype=n}static setContentsFromBytes(e,t){if(!t.receiving)return;t.size=Math.ceil(new DataView(e.slice(1,5).buffer).getInt32(0,!0)/16379);const n=e.slice(5);if(t.data.push(n),i.Log(i.GetStackTrace(),`Received file chunk: ${t.data.length}/${t.size}`,6),t.data.length===t.size){t.receiving=!1,t.valid=!0,i.Log(i.GetStackTrace(),"Received complete file",6);const e=(new Date).getTime()-t.timestampStart,n=Math.round(16*t.size*1024/e);i.Log(i.GetStackTrace(),`Average transfer bitrate: ${n}kb/s over ${e/1e3} seconds`,6);const r=new Blob(t.data,{type:t.mimetype}),s=document.createElement("a");s.setAttribute("href",URL.createObjectURL(r)),s.setAttribute("download",`transfer.${t.extension}`),document.body.append(s),s.remove()}else t.data.length>t.size&&(t.receiving=!1,i.Error(i.GetStackTrace(),`Received bigger file than advertised: ${t.data.length}/${t.size}`))}}class un{constructor(){this.mimetype="",this.extension="",this.receiving=!1,this.size=0,this.data=[],this.valid=!1}}class gn{}gn.mainButton=0,gn.auxiliaryButton=1,gn.secondaryButton=2,gn.fourthButton=3,gn.fifthButton=4;class mn{}mn.primaryButton=1,mn.secondaryButton=2,mn.auxiliaryButton=4,mn.fourthButton=8,mn.fifthButton=16;class pn{constructor(){this.unregisterCallbacks=[]}addUnregisterCallback(e){this.unregisterCallbacks.push(e)}unregisterAll(){for(const e of this.unregisterCallbacks)e();this.unregisterCallbacks=[]}}class fn{constructor(e,t,n){this.touchEventListenerTracker=new pn,this.toStreamerMessagesProvider=e,this.videoElementProvider=t,this.coordinateConverter=n;const r=e=>this.onTouchStart(e),s=e=>this.onTouchEnd(e),i=e=>this.onTouchMove(e);document.addEventListener("touchstart",r,{passive:!1}),document.addEventListener("touchend",s,{passive:!1}),document.addEventListener("touchmove",i,{passive:!1}),this.touchEventListenerTracker.addUnregisterCallback((()=>document.removeEventListener("touchstart",r))),this.touchEventListenerTracker.addUnregisterCallback((()=>document.removeEventListener("touchend",s))),this.touchEventListenerTracker.addUnregisterCallback((()=>document.removeEventListener("touchmove",i)))}unregisterTouchEvents(){this.touchEventListenerTracker.unregisterAll()}setVideoElementParentClientRect(e){this.videoElementParentClientRect=e}onTouchStart(e){if(this.videoElementProvider.isVideoReady()&&e.target===this.videoElementProvider.getVideoElement()){if(null==this.fakeTouchFinger){const t=e.changedTouches[0];this.fakeTouchFinger=new vn(t.identifier,t.clientX-this.videoElementParentClientRect.left,t.clientY-this.videoElementParentClientRect.top);const n=this.videoElementProvider.getVideoParentElement(),r=new MouseEvent("mouseenter",t);n.dispatchEvent(r);const s=this.coordinateConverter.normalizeAndQuantizeUnsigned(this.fakeTouchFinger.x,this.fakeTouchFinger.y);this.toStreamerMessagesProvider.toStreamerHandlers.get("MouseDown")([gn.mainButton,s.x,s.y])}e.preventDefault()}}onTouchEnd(e){if(!this.videoElementProvider.isVideoReady()||null==this.fakeTouchFinger)return;const t=this.videoElementProvider.getVideoParentElement(),n=this.toStreamerMessagesProvider.toStreamerHandlers;for(let r=0;r<e.changedTouches.length;r++){const s=e.changedTouches[r];if(s.identifier===this.fakeTouchFinger.id){const e=s.clientX-this.videoElementParentClientRect.left,r=s.clientY-this.videoElementParentClientRect.top,i=this.coordinateConverter.normalizeAndQuantizeUnsigned(e,r);n.get("MouseUp")([gn.mainButton,i.x,i.y]);const a=new MouseEvent("mouseleave",s);t.dispatchEvent(a),this.fakeTouchFinger=null;break}}e.preventDefault()}onTouchMove(e){if(!this.videoElementProvider.isVideoReady()||null==this.fakeTouchFinger)return;const t=this.toStreamerMessagesProvider.toStreamerHandlers;for(let n=0;n<e.touches.length;n++){const r=e.touches[n];if(r.identifier===this.fakeTouchFinger.id){const e=r.clientX-this.videoElementParentClientRect.left,n=r.clientY-this.videoElementParentClientRect.top,s=this.coordinateConverter.normalizeAndQuantizeUnsigned(e,n),i=this.coordinateConverter.normalizeAndQuantizeSigned(e-this.fakeTouchFinger.x,n-this.fakeTouchFinger.y);t.get("MouseMove")([s.x,s.y,i.x,i.y]),this.fakeTouchFinger.x=e,this.fakeTouchFinger.y=n;break}}e.preventDefault()}}class vn{constructor(e,t,n){this.id=e,this.x=t,this.y=n}}class yn{}yn.backSpace=8,yn.shift=16,yn.control=17,yn.alt=18,yn.rightShift=253,yn.rightControl=254,yn.rightAlt=255;class Sn{constructor(e,t,n){this.keyboardEventListenerTracker=new pn,this.CodeToKeyCode={Escape:27,Digit0:48,Digit1:49,Digit2:50,Digit3:51,Digit4:52,Digit5:53,Digit6:54,Digit7:55,Digit8:56,Digit9:57,Minus:173,Equal:187,Backspace:8,Tab:9,KeyQ:81,KeyW:87,KeyE:69,KeyR:82,KeyT:84,KeyY:89,KeyU:85,KeyI:73,KeyO:79,KeyP:80,BracketLeft:219,BracketRight:221,Enter:13,ControlLeft:17,KeyA:65,KeyS:83,KeyD:68,KeyF:70,KeyG:71,KeyH:72,KeyJ:74,KeyK:75,KeyL:76,Semicolon:186,Quote:222,Backquote:192,ShiftLeft:16,Backslash:220,KeyZ:90,KeyX:88,KeyC:67,KeyV:86,KeyB:66,KeyN:78,KeyM:77,Comma:188,Period:190,Slash:191,ShiftRight:253,AltLeft:18,Space:32,CapsLock:20,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,Pause:19,ScrollLock:145,NumpadDivide:111,NumpadMultiply:106,NumpadSubtract:109,NumpadAdd:107,NumpadDecimal:110,Numpad9:105,Numpad8:104,Numpad7:103,Numpad6:102,Numpad5:101,Numpad4:100,Numpad3:99,Numpad2:98,Numpad1:97,Numpad0:96,NumLock:144,ControlRight:254,AltRight:255,Home:36,End:35,ArrowUp:38,ArrowLeft:37,ArrowRight:39,ArrowDown:40,PageUp:33,PageDown:34,Insert:45,Delete:46,ContextMenu:93},this.toStreamerMessagesProvider=e,this.config=t,this.activeKeysProvider=n}registerKeyBoardEvents(){const e=e=>this.handleOnCompositionEnd(e),t=e=>this.handleOnKeyDown(e),n=e=>this.handleOnKeyUp(e),r=e=>this.handleOnKeyPress(e);document.addEventListener("compositionend",e),document.addEventListener("keydown",t),document.addEventListener("keyup",n),document.addEventListener("keypress",r),this.keyboardEventListenerTracker.addUnregisterCallback((()=>document.removeEventListener("compositionend",e))),this.keyboardEventListenerTracker.addUnregisterCallback((()=>document.removeEventListener("keydown",t))),this.keyboardEventListenerTracker.addUnregisterCallback((()=>document.removeEventListener("keyup",n))),this.keyboardEventListenerTracker.addUnregisterCallback((()=>document.removeEventListener("keypress",r)))}unregisterKeyBoardEvents(){this.keyboardEventListenerTracker.unregisterAll()}handleOnKeyDown(e){const t=this.getKeycode(e);t&&229!==t&&(i.Log(i.GetStackTrace(),`key down ${t}, repeat = ${e.repeat}`,6),this.toStreamerMessagesProvider.toStreamerHandlers.get("KeyDown")([this.getKeycode(e),e.repeat?1:0]),this.activeKeysProvider.getActiveKeys().push(t),t===yn.backSpace&&document.dispatchEvent(new KeyboardEvent("keypress",{charCode:yn.backSpace})),this.config.isFlagEnabled(Ot.SuppressBrowserKeys)&&this.isKeyCodeBrowserKey(t)&&e.preventDefault())}handleOnKeyUp(e){const t=this.getKeycode(e);t&&(i.Log(i.GetStackTrace(),`key up ${t}`,6),this.toStreamerMessagesProvider.toStreamerHandlers.get("KeyUp")([t]),this.config.isFlagEnabled(Ot.SuppressBrowserKeys)&&this.isKeyCodeBrowserKey(t)&&e.preventDefault())}handleOnKeyPress(e){if(!("charCode"in e))return void i.Warning(i.GetStackTrace(),"KeyboardEvent.charCode is deprecated in this browser, cannot send key press.");const t=e.charCode;i.Log(i.GetStackTrace(),`key press ${t}`,6),this.toStreamerMessagesProvider.toStreamerHandlers.get("KeyPress")([t])}handleOnCompositionEnd(e){e.data&&e.data.length&&e.data.split("").forEach((e=>{this.handleOnKeyDown(new KeyboardEvent("keydown",{keyCode:e.toUpperCase().charCodeAt(0),charCode:e.charCodeAt(0)})),this.handleOnKeyPress(new KeyboardEvent("keypress",{keyCode:e.toUpperCase().charCodeAt(0),charCode:e.charCodeAt(0)})),this.handleOnKeyUp(new KeyboardEvent("keyup",{keyCode:e.toUpperCase().charCodeAt(0),charCode:e.charCodeAt(0)}))}))}getKeycode(e){if(!("keyCode"in e)){const t=e;return t.code in this.CodeToKeyCode?this.CodeToKeyCode[t.code]:(i.Warning(i.GetStackTrace(),`Keyboard code of ${t.code} is not supported in our mapping, ignoring this key.`),null)}return e.keyCode===yn.shift&&"ShiftRight"===e.code?yn.rightShift:e.keyCode===yn.control&&"ControlRight"===e.code?yn.rightControl:e.keyCode===yn.alt&&"AltRight"===e.code?yn.rightAlt:e.keyCode}isKeyCodeBrowserKey(e){return e>=112&&e<=123||9===e}}class wn{constructor(e,t,n){this.x=0,this.y=0,this.updateMouseMovePositionEvent=e=>{this.updateMouseMovePosition(e)},this.mouseEventListenerTracker=new pn,this.videoElementProvider=e,this.mouseController=t,this.activeKeysProvider=n;const r=this.videoElementProvider.getVideoParentElement();this.x=r.getBoundingClientRect().width/2,this.y=r.getBoundingClientRect().height/2,this.coord=this.mouseController.coordinateConverter.normalizeAndQuantizeUnsigned(this.x,this.y)}unregisterMouseEvents(){this.mouseEventListenerTracker.unregisterAll()}lockStateChange(){const e=this.videoElementProvider.getVideoParentElement(),t=this.mouseController.toStreamerMessagesProvider.toStreamerHandlers;if(document.pointerLockElement===e||document.mozPointerLockElement===e)i.Log(i.GetStackTrace(),"Pointer locked",6),document.addEventListener("mousemove",this.updateMouseMovePositionEvent,!1),this.mouseEventListenerTracker.addUnregisterCallback((()=>document.removeEventListener("mousemove",this.updateMouseMovePositionEvent,!1)));else{i.Log(i.GetStackTrace(),"The pointer lock status is now unlocked",6),document.removeEventListener("mousemove",this.updateMouseMovePositionEvent,!1);let e=this.activeKeysProvider.getActiveKeys();const n=new Set(e),r=[];n.forEach((e=>{r[e]})),r.forEach((e=>{t.get("KeyUp")([e])})),e=[]}}updateMouseMovePosition(e){if(!this.videoElementProvider.isVideoReady())return;const t=this.mouseController.toStreamerMessagesProvider.toStreamerHandlers,n=this.videoElementProvider.getVideoParentElement().clientWidth,r=this.videoElementProvider.getVideoParentElement().clientHeight;this.x+=e.movementX,this.y+=e.movementY,this.x>n&&(this.x-=n),this.y>r&&(this.y-=r),this.x<0&&(this.x=n+this.x),this.y<0&&(this.y=r-this.y),this.coord=this.mouseController.coordinateConverter.normalizeAndQuantizeUnsigned(this.x,this.y);const s=this.mouseController.coordinateConverter.normalizeAndQuantizeSigned(e.movementX,e.movementY);t.get("MouseMove")([this.coord.x,this.coord.y,s.x,s.y])}handleMouseDown(e){this.videoElementProvider.isVideoReady()&&this.mouseController.toStreamerMessagesProvider.toStreamerHandlers.get("MouseDown")([e.button,this.coord.x,this.coord.y])}handleMouseUp(e){this.videoElementProvider.isVideoReady()&&this.mouseController.toStreamerMessagesProvider.toStreamerHandlers.get("MouseUp")([e.button,this.coord.x,this.coord.y])}handleMouseWheel(e){this.videoElementProvider.isVideoReady()&&this.mouseController.toStreamerMessagesProvider.toStreamerHandlers.get("MouseWheel")([e.wheelDelta,this.coord.x,this.coord.y])}handleMouseDouble(e){this.videoElementProvider.isVideoReady()&&this.mouseController.toStreamerMessagesProvider.toStreamerHandlers.get("MouseDouble")([e.button,this.coord.x,this.coord.y])}handlePressMouseButtons(e){this.videoElementProvider.isVideoReady()&&this.mouseController.pressMouseButtons(e.buttons,this.x,this.y)}handleReleaseMouseButtons(e){this.videoElementProvider.isVideoReady()&&this.mouseController.releaseMouseButtons(e.buttons,this.x,this.y)}}class bn{constructor(e){this.mouseController=e}unregisterMouseEvents(){}updateMouseMovePosition(e){if(!this.mouseController.videoElementProvider.isVideoReady())return;i.Log(i.GetStackTrace(),"MouseMove",6);const t=this.mouseController.coordinateConverter.normalizeAndQuantizeUnsigned(e.offsetX,e.offsetY),n=this.mouseController.coordinateConverter.normalizeAndQuantizeSigned(e.movementX,e.movementY);this.mouseController.toStreamerMessagesProvider.toStreamerHandlers.get("MouseMove")([t.x,t.y,n.x,n.y]),e.preventDefault()}handleMouseDown(e){if(!this.mouseController.videoElementProvider.isVideoReady())return;i.Log(i.GetStackTrace(),"onMouse Down",6);const t=this.mouseController.coordinateConverter.normalizeAndQuantizeUnsigned(e.offsetX,e.offsetY);this.mouseController.toStreamerMessagesProvider.toStreamerHandlers.get("MouseDown")([e.button,t.x,t.y]),e.preventDefault()}handleMouseUp(e){if(!this.mouseController.videoElementProvider.isVideoReady())return;i.Log(i.GetStackTrace(),"onMouse Up",6);const t=this.mouseController.coordinateConverter.normalizeAndQuantizeUnsigned(e.offsetX,e.offsetY);this.mouseController.toStreamerMessagesProvider.toStreamerHandlers.get("MouseUp")([e.button,t.x,t.y]),e.preventDefault()}handleContextMenu(e){this.mouseController.videoElementProvider.isVideoReady()&&e.preventDefault()}handleMouseWheel(e){if(!this.mouseController.videoElementProvider.isVideoReady())return;const t=this.mouseController.coordinateConverter.normalizeAndQuantizeUnsigned(e.offsetX,e.offsetY);this.mouseController.toStreamerMessagesProvider.toStreamerHandlers.get("MouseWheel")([e.wheelDelta,t.x,t.y]),e.preventDefault()}handleMouseDouble(e){if(!this.mouseController.videoElementProvider.isVideoReady())return;const t=this.mouseController.coordinateConverter.normalizeAndQuantizeUnsigned(e.offsetX,e.offsetY);this.mouseController.toStreamerMessagesProvider.toStreamerHandlers.get("MouseDouble")([e.button,t.x,t.y])}handlePressMouseButtons(e){this.mouseController.videoElementProvider.isVideoReady()&&(i.Log(i.GetStackTrace(),"onMouse press",6),this.mouseController.pressMouseButtons(e.buttons,e.offsetX,e.offsetY))}handleReleaseMouseButtons(e){this.mouseController.videoElementProvider.isVideoReady()&&(i.Log(i.GetStackTrace(),"onMouse release",6),this.mouseController.releaseMouseButtons(e.buttons,e.offsetX,e.offsetY))}}class Tn{constructor(e,t,n,r){this.mouseEventListenerTracker=new pn,this.toStreamerMessagesProvider=e,this.coordinateConverter=n,this.videoElementProvider=t,this.activeKeysProvider=r,this.registerMouseEnterAndLeaveEvents()}unregisterMouseEvents(){this.mouseEventListenerTracker.unregisterAll()}registerLockedMouseEvents(e){const t=this.videoElementProvider.getVideoParentElement(),n=new wn(this.videoElementProvider,e,this.activeKeysProvider);if(t.requestPointerLock=t.requestPointerLock||t.mozRequestPointerLock,document.exitPointerLock=document.exitPointerLock||document.mozExitPointerLock,t.requestPointerLock){const e=()=>{t.requestPointerLock()};t.addEventListener("click",e),this.mouseEventListenerTracker.addUnregisterCallback((()=>t.removeEventListener("click",e)))}const r=()=>n.lockStateChange();document.addEventListener("pointerlockchange",r,!1),document.addEventListener("mozpointerlockchange",r,!1),this.mouseEventListenerTracker.addUnregisterCallback((()=>document.removeEventListener("pointerlockchange",r,!1))),this.mouseEventListenerTracker.addUnregisterCallback((()=>document.removeEventListener("mozpointerlockchange",r,!1)));const s=e=>n.handleMouseDown(e),i=e=>n.handleMouseUp(e),a=e=>n.handleMouseWheel(e),o=e=>n.handleMouseDouble(e);t.addEventListener("mousedown",s),t.addEventListener("mouseup",i),t.addEventListener("wheel",a),t.addEventListener("dblclick",o),this.mouseEventListenerTracker.addUnregisterCallback((()=>t.removeEventListener("mousedown",s))),this.mouseEventListenerTracker.addUnregisterCallback((()=>t.removeEventListener("mouseup",i))),this.mouseEventListenerTracker.addUnregisterCallback((()=>t.removeEventListener("wheel",a))),this.mouseEventListenerTracker.addUnregisterCallback((()=>t.removeEventListener("dblclick",o))),this.mouseEventListenerTracker.addUnregisterCallback((()=>n.unregisterMouseEvents())),this.mouseEventListenerTracker.addUnregisterCallback((()=>{!document.exitPointerLock||document.pointerLockElement!==t&&document.mozPointerLockElement!==t||document.exitPointerLock()}))}registerHoveringMouseEvents(e){const t=this.videoElementProvider.getVideoParentElement(),n=new bn(e),r=e=>n.updateMouseMovePosition(e),s=e=>n.handleMouseDown(e),i=e=>n.handleMouseUp(e),a=e=>n.handleContextMenu(e),o=e=>n.handleMouseWheel(e),l=e=>n.handleMouseDouble(e);t.addEventListener("mousemove",r),t.addEventListener("mousedown",s),t.addEventListener("mouseup",i),t.addEventListener("contextmenu",a),t.addEventListener("wheel",o),t.addEventListener("dblclick",l),this.mouseEventListenerTracker.addUnregisterCallback((()=>t.removeEventListener("mousemove",r))),this.mouseEventListenerTracker.addUnregisterCallback((()=>t.removeEventListener("mousedown",s))),this.mouseEventListenerTracker.addUnregisterCallback((()=>t.removeEventListener("mouseup",i))),this.mouseEventListenerTracker.addUnregisterCallback((()=>t.removeEventListener("contextmenu",a))),this.mouseEventListenerTracker.addUnregisterCallback((()=>t.removeEventListener("wheel",o))),this.mouseEventListenerTracker.addUnregisterCallback((()=>t.removeEventListener("dblclick",l))),this.mouseEventListenerTracker.addUnregisterCallback((()=>n.unregisterMouseEvents()))}registerMouseEnterAndLeaveEvents(){const e=this.videoElementProvider.getVideoParentElement(),t=e=>{this.videoElementProvider.isVideoReady()&&(i.Log(i.GetStackTrace(),"Mouse Entered",6),this.sendMouseEnter(),this.pressMouseButtons(e.buttons,e.x,e.y))},n=e=>{this.videoElementProvider.isVideoReady()&&(i.Log(i.GetStackTrace(),"Mouse Left",6),this.sendMouseLeave(),this.releaseMouseButtons(e.buttons,e.x,e.y))};e.addEventListener("mouseenter",t),e.addEventListener("mouseleave",n),this.mouseEventListenerTracker.addUnregisterCallback((()=>e.removeEventListener("mouseenter",t))),this.mouseEventListenerTracker.addUnregisterCallback((()=>e.removeEventListener("mouseleave",n)))}releaseMouseButtons(e,t,n){const r=this.coordinateConverter.normalizeAndQuantizeUnsigned(t,n);e&mn.primaryButton&&this.sendMouseUp(gn.mainButton,r.x,r.y),e&mn.secondaryButton&&this.sendMouseUp(gn.secondaryButton,r.x,r.y),e&mn.auxiliaryButton&&this.sendMouseUp(gn.auxiliaryButton,r.x,r.y),e&mn.fourthButton&&this.sendMouseUp(gn.fourthButton,r.x,r.y),e&mn.fifthButton&&this.sendMouseUp(gn.fifthButton,r.x,r.y)}pressMouseButtons(e,t,n){if(!this.videoElementProvider.isVideoReady())return;const r=this.coordinateConverter.normalizeAndQuantizeUnsigned(t,n);e&mn.primaryButton&&this.sendMouseDown(gn.mainButton,r.x,r.y),e&mn.secondaryButton&&this.sendMouseDown(gn.secondaryButton,r.x,r.y),e&mn.auxiliaryButton&&this.sendMouseDown(gn.auxiliaryButton,r.x,r.y),e&mn.fourthButton&&this.sendMouseDown(gn.fourthButton,r.x,r.y),e&mn.fifthButton&&this.sendMouseDown(gn.fifthButton,r.x,r.y)}sendMouseEnter(){this.videoElementProvider.isVideoReady()&&this.toStreamerMessagesProvider.toStreamerHandlers.get("MouseEnter")()}sendMouseLeave(){this.videoElementProvider.isVideoReady()&&this.toStreamerMessagesProvider.toStreamerHandlers.get("MouseLeave")()}sendMouseDown(e,t,n){this.videoElementProvider.isVideoReady()&&(i.Log(i.GetStackTrace(),`mouse button ${e} down at (${t}, ${n})`,6),this.toStreamerMessagesProvider.toStreamerHandlers.get("MouseDown")([e,t,n]))}sendMouseUp(e,t,n){if(!this.videoElementProvider.isVideoReady())return;i.Log(i.GetStackTrace(),`mouse button ${e} up at (${t}, ${n})`,6);const r=this.coordinateConverter.normalizeAndQuantizeUnsigned(t,n);this.toStreamerMessagesProvider.toStreamerHandlers.get("MouseUp")([e,r.x,r.y])}}class Cn{constructor(e,t,n){this.fingers=[9,8,7,6,5,4,3,2,1,0],this.fingerIds=new Map,this.maxByteValue=255,this.touchEventListenerTracker=new pn,this.toStreamerMessagesProvider=e,this.videoElementProvider=t,this.coordinateConverter=n,this.videoElementParent=t.getVideoElement();const r=e=>this.onTouchStart(e),s=e=>this.onTouchEnd(e),a=e=>this.onTouchMove(e);this.videoElementParent.addEventListener("touchstart",r),this.videoElementParent.addEventListener("touchend",s),this.videoElementParent.addEventListener("touchmove",a),this.touchEventListenerTracker.addUnregisterCallback((()=>this.videoElementParent.removeEventListener("touchstart",r))),this.touchEventListenerTracker.addUnregisterCallback((()=>this.videoElementParent.removeEventListener("touchend",s))),this.touchEventListenerTracker.addUnregisterCallback((()=>this.videoElementParent.removeEventListener("touchmove",a))),i.Log(i.GetStackTrace(),"Touch Events Registered",6);const o=e=>{e.preventDefault()};document.addEventListener("touchmove",o),this.touchEventListenerTracker.addUnregisterCallback((()=>document.removeEventListener("touchmove",o)))}unregisterTouchEvents(){this.touchEventListenerTracker.unregisterAll()}rememberTouch(e){const t=this.fingers.pop();void 0===t&&i.Log(i.GetStackTrace(),"exhausted touch identifiers",6),this.fingerIds.set(e.identifier,t)}forgetTouch(e){this.fingers.push(this.fingerIds.get(e.identifier)),this.fingers.sort((function(e,t){return t-e})),this.fingerIds.delete(e.identifier)}onTouchStart(e){if(this.videoElementProvider.isVideoReady()){for(let t=0;t<e.changedTouches.length;t++)this.rememberTouch(e.changedTouches[t]);i.Log(i.GetStackTrace(),"touch start",6),this.emitTouchData("TouchStart",e.changedTouches),e.preventDefault()}}onTouchEnd(e){if(this.videoElementProvider.isVideoReady()){i.Log(i.GetStackTrace(),"touch end",6),this.emitTouchData("TouchEnd",e.changedTouches);for(let t=0;t<e.changedTouches.length;t++)this.forgetTouch(e.changedTouches[t]);e.preventDefault()}}onTouchMove(e){this.videoElementProvider.isVideoReady()&&(i.Log(i.GetStackTrace(),"touch move",6),this.emitTouchData("TouchMove",e.touches),e.preventDefault())}emitTouchData(e,t){if(!this.videoElementProvider.isVideoReady())return;const n=this.videoElementProvider.getVideoParentElement().getBoundingClientRect(),r=this.toStreamerMessagesProvider.toStreamerHandlers;for(let s=0;s<t.length;s++){const a=1,o=t[s],l=o.clientX-n.left,c=o.clientY-n.top;i.Log(i.GetStackTrace(),`F${this.fingerIds.get(o.identifier)}=(${l}, ${c})`,6);const d=this.coordinateConverter.normalizeAndQuantizeUnsigned(l,c);switch(e){case"TouchStart":r.get("TouchStart")([a,d.x,d.y,this.fingerIds.get(o.identifier),this.maxByteValue*(o.force>0?o.force:1),d.inRange?1:0]);break;case"TouchEnd":r.get("TouchEnd")([a,d.x,d.y,this.fingerIds.get(o.identifier),this.maxByteValue*o.force,d.inRange?1:0]);break;case"TouchMove":r.get("TouchMove")([a,d.x,d.y,this.fingerIds.get(o.identifier),this.maxByteValue*(o.force>0?o.force:1),d.inRange?1:0])}}}}class En{constructor(e){this.gamePadEventListenerTracker=new pn,this.toStreamerMessagesProvider=e,this.requestAnimationFrame=(window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.requestAnimationFrame).bind(window);const t=window;if(window.addEventListener("beforeunload",(e=>this.onBeforeUnload(e))),"GamepadEvent"in t){const e=e=>this.gamePadConnectHandler(e),t=e=>this.gamePadDisconnectHandler(e);window.addEventListener("gamepadconnected",e),window.addEventListener("gamepaddisconnected",t),this.gamePadEventListenerTracker.addUnregisterCallback((()=>window.removeEventListener("gamepadconnected",e))),this.gamePadEventListenerTracker.addUnregisterCallback((()=>window.removeEventListener("gamepaddisconnected",t)))}else if("WebKitGamepadEvent"in t){const e=e=>this.gamePadConnectHandler(e),t=e=>this.gamePadDisconnectHandler(e);window.addEventListener("webkitgamepadconnected",e),window.addEventListener("webkitgamepaddisconnected",t),this.gamePadEventListenerTracker.addUnregisterCallback((()=>window.removeEventListener("webkitgamepadconnected",e))),this.gamePadEventListenerTracker.addUnregisterCallback((()=>window.removeEventListener("webkitgamepaddisconnected",t)))}if(this.controllers=[],navigator.getGamepads)for(const e of navigator.getGamepads())e&&this.gamePadConnectHandler(new GamepadEvent("gamepadconnected",{gamepad:e}))}unregisterGamePadEvents(){this.gamePadEventListenerTracker.unregisterAll();for(const e of this.controllers)void 0!==e.id&&this.onGamepadDisconnected(e.id);this.controllers=[],this.onGamepadConnected=()=>{},this.onGamepadDisconnected=()=>{}}gamePadConnectHandler(e){i.Log(i.GetStackTrace(),"Gamepad connect handler",6);const t=e.gamepad,n={currentState:t,prevState:t,id:void 0};this.controllers.push(n),this.controllers[t.index].currentState=t,this.controllers[t.index].prevState=t,i.Log(i.GetStackTrace(),"gamepad: "+t.id+" connected",6),window.requestAnimationFrame((()=>this.updateStatus())),this.onGamepadConnected()}gamePadDisconnectHandler(e){i.Log(i.GetStackTrace(),"Gamepad disconnect handler",6),i.Log(i.GetStackTrace(),"gamepad: "+e.gamepad.id+" disconnected",6);const t=this.controllers[e.gamepad.index];delete this.controllers[e.gamepad.index],this.controllers=this.controllers.filter((e=>void 0!==e)),this.onGamepadDisconnected(t.id)}scanGamePads(){const e=navigator.getGamepads?navigator.getGamepads():navigator.webkitGetGamepads?navigator.webkitGetGamepads():[];for(let t=0;t<e.length;t++)e[t]&&e[t].index in this.controllers&&(this.controllers[e[t].index].currentState=e[t])}updateStatus(){this.scanGamePads();const e=this.toStreamerMessagesProvider.toStreamerHandlers;for(const t of this.controllers){const n=void 0===t.id?this.controllers.indexOf(t):t.id,r=t.currentState;for(let r=0;r<t.currentState.buttons.length;r++){const s=t.currentState.buttons[r],i=t.prevState.buttons[r];s.pressed?r==tn.LeftTrigger?e.get("GamepadAnalog")([n,5,s.value]):r==tn.RightTrigger?e.get("GamepadAnalog")([n,6,s.value]):e.get("GamepadButtonPressed")([n,r,i.pressed?1:0]):!s.pressed&&i.pressed&&(r==tn.LeftTrigger?e.get("GamepadAnalog")([n,5,0]):r==tn.RightTrigger?e.get("GamepadAnalog")([n,6,0]):e.get("GamepadButtonReleased")([n,r,0]))}for(let t=0;t<r.axes.length;t+=2){const s=parseFloat(r.axes[t].toFixed(4)),i=-parseFloat(r.axes[t+1].toFixed(4));e.get("GamepadAnalog")([n,t+1,s]),e.get("GamepadAnalog")([n,t+2,i])}this.controllers[n].prevState=r}this.controllers.length>0&&this.requestAnimationFrame((()=>this.updateStatus()))}onGamepadResponseReceived(e){for(const t of this.controllers)if(void 0===t.id){t.id=e;break}}onGamepadConnected(){}onGamepadDisconnected(e){}onBeforeUnload(e){for(const e of this.controllers)this.onGamepadDisconnected(e.id)}}!function(e){e[e.RightClusterBottomButton=0]="RightClusterBottomButton",e[e.RightClusterRightButton=1]="RightClusterRightButton",e[e.RightClusterLeftButton=2]="RightClusterLeftButton",e[e.RightClusterTopButton=3]="RightClusterTopButton",e[e.LeftShoulder=4]="LeftShoulder",e[e.RightShoulder=5]="RightShoulder",e[e.LeftTrigger=6]="LeftTrigger",e[e.RightTrigger=7]="RightTrigger",e[e.SelectOrBack=8]="SelectOrBack",e[e.StartOrForward=9]="StartOrForward",e[e.LeftAnalogPress=10]="LeftAnalogPress",e[e.RightAnalogPress=11]="RightAnalogPress",e[e.LeftClusterTopButton=12]="LeftClusterTopButton",e[e.LeftClusterBottomButton=13]="LeftClusterBottomButton",e[e.LeftClusterLeftButton=14]="LeftClusterLeftButton",e[e.LeftClusterRightButton=15]="LeftClusterRightButton",e[e.CentreButton=16]="CentreButton",e[e.LeftStickHorizontal=0]="LeftStickHorizontal",e[e.LeftStickVertical=1]="LeftStickVertical",e[e.RightStickHorizontal=2]="RightStickHorizontal",e[e.RightStickVertical=3]="RightStickVertical"}(tn||(tn={}));class kn{constructor(e,t,n){this.activeKeys=new Mn,this.toStreamerMessagesProvider=e,this.videoElementProvider=t,this.coordinateConverter=n}registerKeyBoard(e){i.Log(i.GetStackTrace(),"Register Keyboard Events",7);const t=new Sn(this.toStreamerMessagesProvider,e,this.activeKeys);return t.registerKeyBoardEvents(),t}registerMouse(e){i.Log(i.GetStackTrace(),"Register Mouse Events",7);const t=new Tn(this.toStreamerMessagesProvider,this.videoElementProvider,this.coordinateConverter,this.activeKeys);switch(e){case Gt.LockedMouse:t.registerLockedMouseEvents(t);break;case Gt.HoveringMouse:t.registerHoveringMouseEvents(t);break;default:i.Info(i.GetStackTrace(),"unknown Control Scheme Type Defaulting to Locked Mouse Events"),t.registerLockedMouseEvents(t)}return t}registerTouch(e,t){if(i.Log(i.GetStackTrace(),"Registering Touch",6),e){const e=new fn(this.toStreamerMessagesProvider,this.videoElementProvider,this.coordinateConverter);return e.setVideoElementParentClientRect(t),e}return new Cn(this.toStreamerMessagesProvider,this.videoElementProvider,this.coordinateConverter)}registerGamePad(){return i.Log(i.GetStackTrace(),"Register Game Pad",7),new En(this.toStreamerMessagesProvider)}}class Mn{constructor(){this.activeKeys=[],this.activeKeys=[]}getActiveKeys(){return this.activeKeys}}class Rn{constructor(e,t){this.lastTimeResized=(new Date).getTime(),this.videoElement=document.createElement("video"),this.config=t,this.videoElement.id="streamingVideo",this.videoElement.disablePictureInPicture=!0,this.videoElement.playsInline=!0,this.videoElement.style.width="100%",this.videoElement.style.height="100%",this.videoElement.style.position="absolute",this.videoElement.style.pointerEvents="all",e.appendChild(this.videoElement),this.onResizePlayerCallback=()=>{console.log("Resolution changed, restyling player, did you forget to override this function?")},this.onMatchViewportResolutionCallback=()=>{console.log("Resolution changed and match viewport resolution is turned on, did you forget to override this function?")},this.videoElement.onclick=()=>{null!=this.audioElement&&this.audioElement.paused&&this.audioElement.play(),this.videoElement.paused&&this.videoElement.play()},this.videoElement.onloadedmetadata=()=>{this.onVideoInitialized()},window.addEventListener("resize",(()=>this.resizePlayerStyle()),!0),window.addEventListener("orientationchange",(()=>this.onOrientationChange()))}setAudioElement(e){this.audioElement=e}play(){return this.videoElement.muted=this.config.isFlagEnabled(Ot.StartVideoMuted),this.videoElement.autoplay=this.config.isFlagEnabled(Ot.AutoPlayVideo),this.videoElement.play()}isPaused(){return this.videoElement.paused}isVideoReady(){return void 0!==this.videoElement.readyState&&this.videoElement.readyState>0}hasVideoSource(){return void 0!==this.videoElement.srcObject&&null!==this.videoElement.srcObject}getVideoElement(){return this.videoElement}getVideoParentElement(){return this.videoElement.parentElement}setVideoEnabled(e){this.videoElement.srcObject.getTracks().forEach((t=>t.enabled=e))}onVideoInitialized(){}onOrientationChange(){clearTimeout(this.orientationChangeTimeout),this.orientationChangeTimeout=window.setTimeout((()=>{this.resizePlayerStyle()}),500)}resizePlayerStyle(){const e=this.getVideoParentElement();e&&(this.updateVideoStreamSize(),e.classList.contains("fixed-size")||this.resizePlayerStyleToFillParentElement(),this.onResizePlayerCallback())}resizePlayerStyleToFillParentElement(){this.getVideoParentElement().setAttribute("style","top: 0px; left: 0px; width: 100%; height: 100%; cursor: default;")}updateVideoStreamSize(){if(this.config.isFlagEnabled(Ot.MatchViewportResolution))if((new Date).getTime()-this.lastTimeResized>300){const e=this.getVideoParentElement();if(!e)return;this.onMatchViewportResolutionCallback(e.clientWidth,e.clientHeight),this.lastTimeResized=(new Date).getTime()}else i.Log(i.GetStackTrace(),"Resizing too often - skipping",6),clearTimeout(this.resizeTimeoutHandle),this.resizeTimeoutHandle=window.setTimeout((()=>this.updateVideoStreamSize()),100)}}class Pn{constructor(){this.toStreamerHandlers=new Map,this.fromStreamerHandlers=new Map,this.toStreamerMessages=new Map,this.fromStreamerMessages=new Map}populateDefaultProtocol(){this.toStreamerMessages.set("IFrameRequest",{id:0,structure:[]}),this.toStreamerMessages.set("RequestQualityControl",{id:1,structure:[]}),this.toStreamerMessages.set("FpsRequest",{id:2,structure:[]}),this.toStreamerMessages.set("AverageBitrateRequest",{id:3,structure:[]}),this.toStreamerMessages.set("StartStreaming",{id:4,structure:[]}),this.toStreamerMessages.set("StopStreaming",{id:5,structure:[]}),this.toStreamerMessages.set("LatencyTest",{id:6,structure:["string"]}),this.toStreamerMessages.set("RequestInitialSettings",{id:7,structure:[]}),this.toStreamerMessages.set("TestEcho",{id:8,structure:[]}),this.toStreamerMessages.set("DataChannelLatencyTest",{id:9,structure:[]}),this.toStreamerMessages.set("UIInteraction",{id:50,structure:["string"]}),this.toStreamerMessages.set("Command",{id:51,structure:["string"]}),this.toStreamerMessages.set("KeyDown",{id:60,structure:["uint8","uint8"]}),this.toStreamerMessages.set("KeyUp",{id:61,structure:["uint8"]}),this.toStreamerMessages.set("KeyPress",{id:62,structure:["uint16"]}),this.toStreamerMessages.set("MouseEnter",{id:70,structure:[]}),this.toStreamerMessages.set("MouseLeave",{id:71,structure:[]}),this.toStreamerMessages.set("MouseDown",{id:72,structure:["uint8","uint16","uint16"]}),this.toStreamerMessages.set("MouseUp",{id:73,structure:["uint8","uint16","uint16"]}),this.toStreamerMessages.set("MouseMove",{id:74,structure:["uint16","uint16","int16","int16"]}),this.toStreamerMessages.set("MouseWheel",{id:75,structure:["int16","uint16","uint16"]}),this.toStreamerMessages.set("MouseDouble",{id:76,structure:["uint8","uint16","uint16"]}),this.toStreamerMessages.set("TouchStart",{id:80,structure:["uint8","uint16","uint16","uint8","uint8","uint8"]}),this.toStreamerMessages.set("TouchEnd",{id:81,structure:["uint8","uint16","uint16","uint8","uint8","uint8"]}),this.toStreamerMessages.set("TouchMove",{id:82,structure:["uint8","uint16","uint16","uint8","uint8","uint8"]}),this.toStreamerMessages.set("GamepadConnected",{id:93,structure:[]}),this.toStreamerMessages.set("GamepadButtonPressed",{id:90,structure:["uint8","uint8","uint8"]}),this.toStreamerMessages.set("GamepadButtonReleased",{id:91,structure:["uint8","uint8","uint8"]}),this.toStreamerMessages.set("GamepadAnalog",{id:92,structure:["uint8","uint8","double"]}),this.toStreamerMessages.set("GamepadDisconnected",{id:94,structure:["uint8"]}),this.fromStreamerMessages.set(0,"QualityControlOwnership"),this.fromStreamerMessages.set(1,"Response"),this.fromStreamerMessages.set(2,"Command"),this.fromStreamerMessages.set(3,"FreezeFrame"),this.fromStreamerMessages.set(4,"UnfreezeFrame"),this.fromStreamerMessages.set(5,"VideoEncoderAvgQP"),this.fromStreamerMessages.set(6,"LatencyTest"),this.fromStreamerMessages.set(7,"InitialSettings"),this.fromStreamerMessages.set(8,"FileExtension"),this.fromStreamerMessages.set(9,"FileMimeType"),this.fromStreamerMessages.set(10,"FileContents"),this.fromStreamerMessages.set(11,"TestEcho"),this.fromStreamerMessages.set(12,"InputControlOwnership"),this.fromStreamerMessages.set(13,"GamepadResponse"),this.fromStreamerMessages.set(14,"DataChannelLatencyTest"),this.fromStreamerMessages.set(255,"Protocol")}registerMessageHandler(e,t,n){switch(e){case nn.ToStreamer:this.toStreamerHandlers.set(t,n);break;case nn.FromStreamer:this.fromStreamerHandlers.set(t,n);break;default:i.Log(i.GetStackTrace(),`Unknown message direction ${e}`)}}}!function(e){e[e.ToStreamer=0]="ToStreamer",e[e.FromStreamer=1]="FromStreamer"}(nn||(nn={}));class Ln{constructor(){this.responseEventListeners=new Map}addResponseEventListener(e,t){this.responseEventListeners.set(e,t)}removeResponseEventListener(e){this.responseEventListeners.delete(e)}onResponse(e){i.Log(i.GetStackTrace(),"DataChannelReceiveMessageType.Response",6);const t=new TextDecoder("utf-16").decode(e.slice(1));i.Log(i.GetStackTrace(),t,6),this.responseEventListeners.forEach((e=>{e(t)}))}}class In{constructor(e,t){this.dataChannelSender=e,this.toStreamerMessagesMapProvider=t}sendMessageToStreamer(e,t){void 0===t&&(t=[]);const n=this.toStreamerMessagesMapProvider.toStreamerMessages.get(e);if(void 0===n)return void i.Error(i.GetStackTrace(),`Attempted to send a message to the streamer with message type: ${e}, but the frontend hasn't been configured to send such a message. Check you've added the message type in your cpp`);if(n.structure&&t&&n.structure.length!==t.length)return void i.Error(i.GetStackTrace(),`Provided message data doesn't match expected layout. Expected [ ${n.structure.map((e=>{switch(e){case"uint8":case"uint16":case"int16":case"float":case"double":return"number";case"string":return"string"}})).toString()} ] but received [ ${t.map((e=>typeof e)).toString()} ]`);let r=0;const s=new TextEncoder;t.forEach(((e,t)=>{switch(n.structure[t]){case"uint8":r+=1;break;case"uint16":case"int16":r+=2;break;case"float":r+=4;break;case"double":r+=8;break;case"string":r+=2,r+=2*s.encode(e).length}}));const a=new DataView(new ArrayBuffer(r+1));a.setUint8(0,n.id);let o=1;t.forEach(((e,t)=>{switch(n.structure[t]){case"uint8":a.setUint8(o,e),o+=1;break;case"uint16":a.setUint16(o,e,!0),o+=2;break;case"int16":a.setInt16(o,e,!0),o+=2;break;case"float":a.setFloat32(o,e,!0),o+=4;break;case"double":a.setFloat64(o,e,!0),o+=8;break;case"string":a.setUint16(o,e.length,!0),o+=2;for(let t=0;t<e.length;t++)a.setUint16(o,e.charCodeAt(t),!0),o+=2}})),this.dataChannelSender.canSend()?this.dataChannelSender.sendData(a.buffer):i.Info(i.GetStackTrace(),`Data channel cannot send yet, skipping sending message: ${e} - ${new Uint8Array(a.buffer)}`)}}class On{constructor(e){this.sendMessageController=e}SendRequestQualityControl(){this.sendMessageController.sendMessageToStreamer("RequestQualityControl")}SendMaxFpsRequest(){this.sendMessageController.sendMessageToStreamer("FpsRequest")}SendAverageBitrateRequest(){this.sendMessageController.sendMessageToStreamer("AverageBitrateRequest")}SendStartStreaming(){this.sendMessageController.sendMessageToStreamer("StartStreaming")}SendStopStreaming(){this.sendMessageController.sendMessageToStreamer("StopStreaming")}SendRequestInitialSettings(){this.sendMessageController.sendMessageToStreamer("RequestInitialSettings")}}class xn{constructor(e){this.dataChannelProvider=e}canSend(){return void 0!==this.dataChannelProvider.getDataChannelInstance().dataChannel&&"open"==this.dataChannelProvider.getDataChannelInstance().dataChannel.readyState}sendData(e){const t=this.dataChannelProvider.getDataChannelInstance();"open"==t.dataChannel.readyState?(t.dataChannel.send(e),i.Log(i.GetStackTrace(),`Message Sent: ${new Uint8Array(e)}`,6),this.resetAfkWarningTimerOnDataSend()):i.Error(i.GetStackTrace(),`Message Failed: ${new Uint8Array(e)}`)}resetAfkWarningTimerOnDataSend(){}}class Fn{constructor(e){this.videoElementProvider=e,this.normalizeAndQuantizeUnsignedFunc=()=>{throw new Error("Normalize and quantize unsigned, method not implemented.")},this.normalizeAndQuantizeSignedFunc=()=>{throw new Error("Normalize and unquantize signed, method not implemented.")},this.denormalizeAndUnquantizeUnsignedFunc=()=>{throw new Error("Denormalize and unquantize unsigned, method not implemented.")}}normalizeAndQuantizeUnsigned(e,t){return this.normalizeAndQuantizeUnsignedFunc(e,t)}unquantizeAndDenormalizeUnsigned(e,t){return this.denormalizeAndUnquantizeUnsignedFunc(e,t)}normalizeAndQuantizeSigned(e,t){return this.normalizeAndQuantizeSignedFunc(e,t)}setupNormalizeAndQuantize(){if(this.videoElementParent=this.videoElementProvider.getVideoParentElement(),this.videoElement=this.videoElementProvider.getVideoElement(),this.videoElementParent&&this.videoElement){const e=this.videoElementParent.clientWidth||1,t=this.videoElementParent.clientHeight||1,n=this.videoElement.videoWidth||1,r=t/e,s=(this.videoElement.videoHeight||1)/n;r>s?(i.Log(i.GetStackTrace(),"Setup Normalize and Quantize for playerAspectRatio > videoAspectRatio",6),this.ratio=r/s,this.normalizeAndQuantizeUnsignedFunc=(e,t)=>this.normalizeAndQuantizeUnsignedPlayerBigger(e,t),this.normalizeAndQuantizeSignedFunc=(e,t)=>this.normalizeAndQuantizeSignedPlayerBigger(e,t),this.denormalizeAndUnquantizeUnsignedFunc=(e,t)=>this.denormalizeAndUnquantizeUnsignedPlayerBigger(e,t)):(i.Log(i.GetStackTrace(),"Setup Normalize and Quantize for playerAspectRatio <= videoAspectRatio",6),this.ratio=s/r,this.normalizeAndQuantizeUnsignedFunc=(e,t)=>this.normalizeAndQuantizeUnsignedPlayerSmaller(e,t),this.normalizeAndQuantizeSignedFunc=(e,t)=>this.normalizeAndQuantizeSignedPlayerSmaller(e,t),this.denormalizeAndUnquantizeUnsignedFunc=(e,t)=>this.denormalizeAndUnquantizeUnsignedPlayerSmaller(e,t))}}normalizeAndQuantizeUnsignedPlayerBigger(e,t){const n=e/this.videoElementParent.clientWidth,r=this.ratio*(t/this.videoElementParent.clientHeight-.5)+.5;return n<0||n>1||r<0||r>1?new Dn(!1,65535,65535):new Dn(!0,65536*n,65536*r)}denormalizeAndUnquantizeUnsignedPlayerBigger(e,t){const n=e/65536,r=(t/65536-.5)/this.ratio+.5;return new An(n*this.videoElementParent.clientWidth,r*this.videoElementParent.clientHeight)}normalizeAndQuantizeSignedPlayerBigger(e,t){const n=e/(.5*this.videoElementParent.clientWidth),r=this.ratio*t/(.5*this.videoElementParent.clientHeight);return new Un(32767*n,32767*r)}normalizeAndQuantizeUnsignedPlayerSmaller(e,t){const n=this.ratio*(e/this.videoElementParent.clientWidth-.5)+.5,r=t/this.videoElementParent.clientHeight;return n<0||n>1||r<0||r>1?new Dn(!1,65535,65535):new Dn(!0,65536*n,65536*r)}denormalizeAndUnquantizeUnsignedPlayerSmaller(e,t){const n=(e/65536-.5)/this.ratio+.5,r=t/65536;return new An(n*this.videoElementParent.clientWidth,r*this.videoElementParent.clientHeight)}normalizeAndQuantizeSignedPlayerSmaller(e,t){const n=this.ratio*e/(.5*this.videoElementParent.clientWidth),r=t/(.5*this.videoElementParent.clientHeight);return new Un(32767*n,32767*r)}}class Dn{constructor(e,t,n){this.inRange=e,this.x=t,this.y=n}}class An{constructor(e,t){this.x=e,this.y=t}}class Un{constructor(e,t){this.x=e,this.y=t}}class Nn{constructor(e,t){this.shouldShowPlayOverlay=!0,this.autoJoinTimer=void 0,this.config=e,this.pixelStreaming=t,this.responseController=new Ln,this.file=new un,this.sdpConstraints={offerToReceiveAudio:!0,offerToReceiveVideo:!0},this.afkController=new Wt(this.config,this.pixelStreaming,this.onAfkTriggered.bind(this)),this.afkController.onAFKTimedOutCallback=()=>{this.closeSignalingServer("You have been disconnected due to inactivity")},this.freezeFrameController=new We(this.pixelStreaming.videoElementParent),this.videoPlayer=new Rn(this.pixelStreaming.videoElementParent,this.config),this.videoPlayer.onVideoInitialized=()=>this.handleVideoInitialized(),this.videoPlayer.onMatchViewportResolutionCallback=(e,t)=>{const n={"Resolution.Width":e,"Resolution.Height":t};this.streamMessageController.toStreamerHandlers.get("Command")([JSON.stringify(n)])},this.videoPlayer.onResizePlayerCallback=()=>{this.setUpMouseAndFreezeFrame()},this.streamController=new Ve(this.videoPlayer),this.coordinateConverter=new Fn(this.videoPlayer),this.sendrecvDataChannelController=new zt,this.recvDataChannelController=new zt,this.registerDataChannelEventEmitters(this.sendrecvDataChannelController),this.registerDataChannelEventEmitters(this.recvDataChannelController),this.dataChannelSender=new xn(this.sendrecvDataChannelController),this.dataChannelSender.resetAfkWarningTimerOnDataSend=()=>this.afkController.resetAfkWarningTimer(),this.streamMessageController=new Pn,this.transport=new c,this.protocol=new Be(this.transport),this.protocol.addListener(oe.typeName,(e=>this.handleOnConfigMessage(e))),this.protocol.addListener(ge.typeName,(e=>this.handleStreamerListMessage(e))),this.protocol.addListener(he.typeName,(e=>this.handleStreamerIDChangedMessage(e))),this.protocol.addListener(Fe.typeName,(e=>{const t=e;this.pixelStreaming._onPlayerCount(t.count)})),this.protocol.addListener(Se.typeName,(e=>this.handleWebRtcAnswer(e))),this.protocol.addListener(ye.typeName,(e=>this.handleWebRtcOffer(e))),this.protocol.addListener(Pe.typeName,(e=>this.handleWebRtcSFUPeerDatachannels(e))),this.protocol.addListener(be.typeName,(e=>{const t=e;this.handleIceCandidate(t.candidate)})),this.protocol.transport.addListener("open",(()=>{if(!this.config.isFlagEnabled(Ot.BrowserSendOffer)){const e=Ue(ue);this.protocol.sendMessage(e)}this.reconnectAttempt=0})),this.protocol.transport.addListener("error",(()=>{i.Error(i.GetStackTrace(),"Got a transport error.")})),this.protocol.transport.addListener("close",(e=>{const t=this.shouldReconnect&&1001!=e.code&&this.config.getNumericSettingValue(Ft.MaxReconnectAttempts)>0,n=this.disconnectMessage?this.disconnectMessage:e.reason;this.pixelStreaming._onDisconnect(n,!t&&!this.isReconnecting),this.afkController.stopAfkWarningTimer(),this.statsTimerHandle&&void 0!==this.statsTimerHandle&&window.clearInterval(this.statsTimerHandle),this.setVideoEncoderAvgQP(0),this.setTouchInputEnabled(!1),this.setMouseInputEnabled(!1),this.setKeyboardInputEnabled(!1),this.setGamePadInputEnabled(!1),t&&setTimeout((()=>{this.isReconnecting=!0,this.reconnectAttempt++,this.tryReconnect(e.reason)}),2e3)})),this.sendMessageController=new In(this.dataChannelSender,this.streamMessageController),this.toStreamerMessagesController=new On(this.sendMessageController),this.registerMessageHandlers(),this.streamMessageController.populateDefaultProtocol(),this.inputClassesFactory=new kn(this.streamMessageController,this.videoPlayer,this.coordinateConverter),this.isUsingSFU=!1,this.isQualityController=!1,this.preferredCodec="",this.shouldReconnect=!0,this.isReconnecting=!1,this.reconnectAttempt=0,this.config._addOnOptionSettingChangedListener(Nt.StreamerId,(e=>{if(""===e)return;this.peerConnectionController.peerConnection.close(),this.peerConnectionController.createPeerConnection(this.peerConfig,this.preferredCodec),this.subscribedStream=e;const t=Ue(me,{streamerId:e});this.protocol.sendMessage(t)})),this.setVideoEncoderAvgQP(-1),this.signallingUrlBuilder=()=>{let e=this.config.getTextSettingValue(At.SignallingServerUrl);return this.config.isFlagEnabled(Ot.BrowserSendOffer)&&(e+="?"+Ot.BrowserSendOffer+"=true"),e}}requestUnquantizedAndDenormalizeUnsigned(e,t){return this.coordinateConverter.unquantizeAndDenormalizeUnsigned(e,t)}handleOnMessage(e){const t=new Uint8Array(e.data);i.Log(i.GetStackTrace(),"Message incoming:"+t,6);const n=this.streamMessageController.fromStreamerMessages.get(t[0]);this.streamMessageController.fromStreamerHandlers.get(n)(e.data)}registerMessageHandlers(){this.streamMessageController.registerMessageHandler(nn.FromStreamer,"QualityControlOwnership",(e=>this.onQualityControlOwnership(e))),this.streamMessageController.registerMessageHandler(nn.FromStreamer,"Response",(e=>this.responseController.onResponse(e))),this.streamMessageController.registerMessageHandler(nn.FromStreamer,"Command",(e=>{this.onCommand(e)})),this.streamMessageController.registerMessageHandler(nn.FromStreamer,"FreezeFrame",(e=>this.onFreezeFrameMessage(e))),this.streamMessageController.registerMessageHandler(nn.FromStreamer,"UnfreezeFrame",(()=>this.invalidateFreezeFrameAndEnableVideo())),this.streamMessageController.registerMessageHandler(nn.FromStreamer,"VideoEncoderAvgQP",(e=>this.handleVideoEncoderAvgQP(e))),this.streamMessageController.registerMessageHandler(nn.FromStreamer,"LatencyTest",(e=>this.handleLatencyTestResult(e))),this.streamMessageController.registerMessageHandler(nn.FromStreamer,"DataChannelLatencyTest",(e=>this.handleDataChannelLatencyTestResponse(e))),this.streamMessageController.registerMessageHandler(nn.FromStreamer,"InitialSettings",(e=>this.handleInitialSettings(e))),this.streamMessageController.registerMessageHandler(nn.FromStreamer,"FileExtension",(e=>this.onFileExtension(e))),this.streamMessageController.registerMessageHandler(nn.FromStreamer,"FileMimeType",(e=>this.onFileMimeType(e))),this.streamMessageController.registerMessageHandler(nn.FromStreamer,"FileContents",(e=>this.onFileContents(e))),this.streamMessageController.registerMessageHandler(nn.FromStreamer,"TestEcho",(()=>{})),this.streamMessageController.registerMessageHandler(nn.FromStreamer,"InputControlOwnership",(e=>this.onInputControlOwnership(e))),this.streamMessageController.registerMessageHandler(nn.FromStreamer,"GamepadResponse",(e=>this.onGamepadResponse(e))),this.streamMessageController.registerMessageHandler(nn.FromStreamer,"Protocol",(e=>this.onProtocolMessage(e))),this.streamMessageController.registerMessageHandler(nn.ToStreamer,"IFrameRequest",(()=>this.sendMessageController.sendMessageToStreamer("IFrameRequest"))),this.streamMessageController.registerMessageHandler(nn.ToStreamer,"RequestQualityControl",(()=>this.sendMessageController.sendMessageToStreamer("RequestQualityControl"))),this.streamMessageController.registerMessageHandler(nn.ToStreamer,"FpsRequest",(()=>this.sendMessageController.sendMessageToStreamer("FpsRequest"))),this.streamMessageController.registerMessageHandler(nn.ToStreamer,"AverageBitrateRequest",(()=>this.sendMessageController.sendMessageToStreamer("AverageBitrateRequest"))),this.streamMessageController.registerMessageHandler(nn.ToStreamer,"StartStreaming",(()=>this.sendMessageController.sendMessageToStreamer("StartStreaming"))),this.streamMessageController.registerMessageHandler(nn.ToStreamer,"StopStreaming",(()=>this.sendMessageController.sendMessageToStreamer("StopStreaming"))),this.streamMessageController.registerMessageHandler(nn.ToStreamer,"LatencyTest",(e=>this.sendMessageController.sendMessageToStreamer("LatencyTest",e))),this.streamMessageController.registerMessageHandler(nn.ToStreamer,"RequestInitialSettings",(()=>this.sendMessageController.sendMessageToStreamer("RequestInitialSettings"))),this.streamMessageController.registerMessageHandler(nn.ToStreamer,"TestEcho",(()=>{})),this.streamMessageController.registerMessageHandler(nn.ToStreamer,"UIInteraction",(e=>this.sendMessageController.sendMessageToStreamer("UIInteraction",e))),this.streamMessageController.registerMessageHandler(nn.ToStreamer,"Command",(e=>this.sendMessageController.sendMessageToStreamer("Command",e))),this.streamMessageController.registerMessageHandler(nn.ToStreamer,"TextboxEntry",(e=>this.sendMessageController.sendMessageToStreamer("TextboxEntry",e))),this.streamMessageController.registerMessageHandler(nn.ToStreamer,"KeyDown",(e=>this.sendMessageController.sendMessageToStreamer("KeyDown",e))),this.streamMessageController.registerMessageHandler(nn.ToStreamer,"KeyUp",(e=>this.sendMessageController.sendMessageToStreamer("KeyUp",e))),this.streamMessageController.registerMessageHandler(nn.ToStreamer,"KeyPress",(e=>this.sendMessageController.sendMessageToStreamer("KeyPress",e))),this.streamMessageController.registerMessageHandler(nn.ToStreamer,"MouseEnter",(e=>this.sendMessageController.sendMessageToStreamer("MouseEnter",e))),this.streamMessageController.registerMessageHandler(nn.ToStreamer,"MouseLeave",(e=>this.sendMessageController.sendMessageToStreamer("MouseLeave",e))),this.streamMessageController.registerMessageHandler(nn.ToStreamer,"MouseDown",(e=>this.sendMessageController.sendMessageToStreamer("MouseDown",e))),this.streamMessageController.registerMessageHandler(nn.ToStreamer,"MouseUp",(e=>this.sendMessageController.sendMessageToStreamer("MouseUp",e))),this.streamMessageController.registerMessageHandler(nn.ToStreamer,"MouseMove",(e=>this.sendMessageController.sendMessageToStreamer("MouseMove",e))),this.streamMessageController.registerMessageHandler(nn.ToStreamer,"MouseWheel",(e=>this.sendMessageController.sendMessageToStreamer("MouseWheel",e))),this.streamMessageController.registerMessageHandler(nn.ToStreamer,"MouseDouble",(e=>this.sendMessageController.sendMessageToStreamer("MouseDouble",e))),this.streamMessageController.registerMessageHandler(nn.ToStreamer,"TouchStart",(e=>this.sendMessageController.sendMessageToStreamer("TouchStart",e))),this.streamMessageController.registerMessageHandler(nn.ToStreamer,"TouchEnd",(e=>this.sendMessageController.sendMessageToStreamer("TouchEnd",e))),this.streamMessageController.registerMessageHandler(nn.ToStreamer,"TouchMove",(e=>this.sendMessageController.sendMessageToStreamer("TouchMove",e))),this.streamMessageController.registerMessageHandler(nn.ToStreamer,"GamepadConnected",(()=>this.sendMessageController.sendMessageToStreamer("GamepadConnected"))),this.streamMessageController.registerMessageHandler(nn.ToStreamer,"GamepadButtonPressed",(e=>this.sendMessageController.sendMessageToStreamer("GamepadButtonPressed",e))),this.streamMessageController.registerMessageHandler(nn.ToStreamer,"GamepadButtonReleased",(e=>this.sendMessageController.sendMessageToStreamer("GamepadButtonReleased",e))),this.streamMessageController.registerMessageHandler(nn.ToStreamer,"GamepadAnalog",(e=>this.sendMessageController.sendMessageToStreamer("GamepadAnalog",e))),this.streamMessageController.registerMessageHandler(nn.ToStreamer,"GamepadDisconnected",(e=>this.sendMessageController.sendMessageToStreamer("GamepadDisconnected",e))),this.streamMessageController.registerMessageHandler(nn.ToStreamer,"XREyeViews",(e=>this.sendMessageController.sendMessageToStreamer("XREyeViews",e))),this.streamMessageController.registerMessageHandler(nn.ToStreamer,"XRHMDTransform",(e=>this.sendMessageController.sendMessageToStreamer("XRHMDTransform",e))),this.streamMessageController.registerMessageHandler(nn.ToStreamer,"XRControllerTransform",(e=>this.sendMessageController.sendMessageToStreamer("XRControllerTransform",e))),this.streamMessageController.registerMessageHandler(nn.ToStreamer,"XRSystem",(e=>this.sendMessageController.sendMessageToStreamer("XRSystem",e))),this.streamMessageController.registerMessageHandler(nn.ToStreamer,"XRButtonTouched",(e=>this.sendMessageController.sendMessageToStreamer("XRButtonTouched",e))),this.streamMessageController.registerMessageHandler(nn.ToStreamer,"XRButtonTouchReleased",(e=>this.sendMessageController.sendMessageToStreamer("XRButtonTouchReleased",e))),this.streamMessageController.registerMessageHandler(nn.ToStreamer,"XRButtonPressed",(e=>this.sendMessageController.sendMessageToStreamer("XRButtonPressed",e))),this.streamMessageController.registerMessageHandler(nn.ToStreamer,"XRButtonReleased",(e=>this.sendMessageController.sendMessageToStreamer("XRButtonReleased",e))),this.streamMessageController.registerMessageHandler(nn.ToStreamer,"XRAnalog",(e=>this.sendMessageController.sendMessageToStreamer("XRAnalog",e)))}onCommand(e){i.Log(i.GetStackTrace(),"DataChannelReceiveMessageType.Command",6);const t=new TextDecoder("utf-16").decode(e.slice(1));i.Log(i.GetStackTrace(),"Data Channel Command: "+t,6);const n=JSON.parse(t);"onScreenKeyboard"===n.command&&this.pixelStreaming._activateOnScreenKeyboard(n)}onProtocolMessage(e){try{const t=new TextDecoder("utf-16").decode(e.slice(1)),n=JSON.parse(t);Object.prototype.hasOwnProperty.call(n,"Direction")||i.Error(i.GetStackTrace(),"Malformed protocol received. Ensure the protocol message contains a direction");const r=n.Direction;delete n.Direction,i.Log(i.GetStackTrace(),`Received new ${r==nn.FromStreamer?"FromStreamer":"ToStreamer"} protocol. Updating existing protocol...`),Object.keys(n).forEach((e=>{const t=n[e];switch(r){case nn.ToStreamer:if(!Object.prototype.hasOwnProperty.call(t,"id"))return void i.Error(i.GetStackTrace(),`ToStreamer->${e} protocol definition was malformed as it didn't contain at least an id\n\n Definition was: ${JSON.stringify(t,null,2)}`);if("UIInteraction"===e||"Command"===e||"LatencyTest"===e)return;this.streamMessageController.toStreamerHandlers.get(e)?this.streamMessageController.toStreamerMessages.set(e,t):i.Error(i.GetStackTrace(),`There was no registered handler for "${e}" - try adding one using registerMessageHandler(MessageDirection.ToStreamer, "${e}", myHandler)`);break;case nn.FromStreamer:if(!Object.prototype.hasOwnProperty.call(t,"id"))return void i.Error(i.GetStackTrace(),`FromStreamer->${e} protocol definition was malformed as it didn't contain at least an id\n\n Definition was: ${JSON.stringify(t,null,2)}`);this.streamMessageController.fromStreamerHandlers.get(e)?this.streamMessageController.fromStreamerMessages.set(t.id,e):i.Error(i.GetStackTrace(),`There was no registered handler for "${t}" - try adding one using registerMessageHandler(MessageDirection.FromStreamer, "${e}", myHandler)`);break;default:i.Error(i.GetStackTrace(),`Unknown direction: ${r}`)}})),this.toStreamerMessagesController.SendRequestInitialSettings(),this.toStreamerMessagesController.SendRequestQualityControl()}catch(e){i.Log(i.GetStackTrace(),e)}}onInputControlOwnership(e){const t=new Uint8Array(e);i.Log(i.GetStackTrace(),"DataChannelReceiveMessageType.InputControlOwnership",6);const n=new Boolean(t[1]).valueOf();i.Log(i.GetStackTrace(),`Received input controller message - will your input control the stream: ${n}`),this.pixelStreaming._onInputControlOwnership(n)}onGamepadResponse(e){const t=new TextDecoder("utf-16").decode(e.slice(1)),n=JSON.parse(t);this.gamePadController.onGamepadResponseReceived(n.controllerId)}onAfkTriggered(){this.afkController.onAfkClick(),this.videoPlayer.isPaused()&&this.videoPlayer.hasVideoSource()&&this.playStream()}setAfkEnabled(e){e?this.onAfkTriggered():this.afkController.stopAfkWarningTimer()}tryReconnect(e){this.protocol?(this.isReconnecting=!0,this.protocol.isConnected()?(this.closeSignalingServer(`${e} Restarting stream...`),setTimeout((()=>{this.tryReconnect(e)}),3e3)):(this.pixelStreaming._onWebRtcAutoConnect(),this.connectToSignallingServer())):i.Log(i.GetStackTrace(),"This player has no protocol connection.")}loadFreezeFrameOrShowPlayOverlay(){this.pixelStreaming.dispatchEvent(new pt({shouldShowPlayOverlay:this.shouldShowPlayOverlay,isValid:this.freezeFrameController.valid,jpegData:this.freezeFrameController.jpeg})),!0===this.shouldShowPlayOverlay?(i.Log(i.GetStackTrace(),"showing play overlay"),this.resizePlayerStyle()):(i.Log(i.GetStackTrace(),"showing freeze frame"),this.freezeFrameController.showFreezeFrame()),setTimeout((()=>{this.videoPlayer.setVideoEnabled(!1)}),this.freezeFrameController.freezeFrameDelay)}onFreezeFrameMessage(e){i.Log(i.GetStackTrace(),"DataChannelReceiveMessageType.FreezeFrame",6);const t=new Uint8Array(e);this.freezeFrameController.processFreezeFrameMessage(t,(()=>this.loadFreezeFrameOrShowPlayOverlay()))}invalidateFreezeFrameAndEnableVideo(){i.Log(i.GetStackTrace(),"DataChannelReceiveMessageType.FreezeFrame",6),setTimeout((()=>{this.pixelStreaming.dispatchEvent(new ft),this.freezeFrameController.hideFreezeFrame()}),this.freezeFrameController.freezeFrameDelay),this.videoPlayer.getVideoElement()&&this.videoPlayer.setVideoEnabled(!0)}onFileExtension(e){const t=new Uint8Array(e);hn.setExtensionFromBytes(t,this.file)}onFileMimeType(e){const t=new Uint8Array(e);hn.setMimeTypeFromBytes(t,this.file)}onFileContents(e){const t=new Uint8Array(e);hn.setContentsFromBytes(t,this.file)}playStream(){if(!this.videoPlayer.getVideoElement()){const e="Could not play video stream because the video player was not initialized correctly.";return this.pixelStreaming.dispatchEvent(new ut({message:e})),i.Error(i.GetStackTrace(),e),void this.closeSignalingServer("Stream not initialized correctly")}if(this.videoPlayer.hasVideoSource()){if(this.setTouchInputEnabled(this.config.isFlagEnabled(Ot.TouchInput)),this.pixelStreaming.dispatchEvent(new gt),this.streamController.audioElement.srcObject){const e=this.config.isFlagEnabled(Ot.StartVideoMuted);this.streamController.audioElement.muted=e,e?this.playVideo():this.streamController.audioElement.play().then((()=>{this.playVideo()})).catch((e=>{i.Log(i.GetStackTrace(),e),i.Log(i.GetStackTrace(),"Browser does not support autoplaying video without interaction - to resolve this we are going to show the play button overlay."),this.pixelStreaming.dispatchEvent(new mt({reason:e}))}))}else this.playVideo();this.shouldShowPlayOverlay=!1,this.freezeFrameController.showFreezeFrame()}else i.Warning(i.GetStackTrace(),"Cannot play stream, the video element has no srcObject to play.")}playVideo(){this.videoPlayer.play().catch((e=>{this.streamController.audioElement.srcObject&&this.streamController.audioElement.pause(),i.Log(i.GetStackTrace(),e),i.Log(i.GetStackTrace(),"Browser does not support autoplaying video without interaction - to resolve this we are going to show the play button overlay."),this.pixelStreaming.dispatchEvent(new mt({reason:e}))}))}autoPlayVideoOrSetUpPlayOverlay(){this.config.isFlagEnabled(Ot.AutoPlayVideo)&&this.playStream(),this.resizePlayerStyle()}connectToSignallingServer(){this.locallyClosed=!1,this.shouldReconnect=!0,this.disconnectMessage=null;const e=this.signallingUrlBuilder();this.protocol.connect(e)}startSession(e){if(this.peerConfig=e,this.config.isFlagEnabled(Ot.ForceTURN)&&!this.checkTurnServerAvailability(e))return i.Info(i.GetStackTrace(),"No turn server was found in the Peer Connection Options. TURN cannot be forced, closing connection. Please use STUN instead"),void this.closeSignalingServer("TURN cannot be forced, closing connection. Please use STUN instead.");this.peerConnectionController=new sn(this.peerConfig,this.config,this.preferredCodec),this.peerConnectionController.onVideoStats=e=>this.handleVideoStats(e),this.peerConnectionController.onSendWebRTCOffer=e=>this.handleSendWebRTCOffer(e),this.peerConnectionController.onSendWebRTCAnswer=e=>this.handleSendWebRTCAnswer(e),this.peerConnectionController.onPeerIceCandidate=e=>this.handleSendIceCandidate(e),this.peerConnectionController.onDataChannel=e=>this.handleDataChannel(e),this.peerConnectionController.showTextOverlayConnecting=()=>this.pixelStreaming._onWebRtcConnecting(),this.peerConnectionController.showTextOverlaySetupFailure=()=>this.pixelStreaming._onWebRtcFailed();let t=!1;this.peerConnectionController.onIceConnectionStateChange=()=>{!t&&["connected","completed"].includes(this.peerConnectionController.peerConnection.iceConnectionState)&&(this.pixelStreaming._onWebRtcConnected(),t=!0)},this.peerConnectionController.onTrack=e=>this.streamController.handleOnTrack(e),this.config.isFlagEnabled(Ot.BrowserSendOffer)&&(this.sendrecvDataChannelController.createDataChannel(this.peerConnectionController.peerConnection,"cirrus",this.datachannelOptions),this.sendrecvDataChannelController.handleOnMessage=e=>this.handleOnMessage(e),this.peerConnectionController.createOffer(this.sdpConstraints,this.config))}checkTurnServerAvailability(e){if(!e.iceServers)return i.Info(i.GetStackTrace(),"A turn sever was not found"),!1;for(const t of e.iceServers)for(const e of t.urls)if(e.includes("turn"))return i.Log(i.GetStackTrace(),`A turn sever was found at ${e}`),!0;return i.Info(i.GetStackTrace(),"A turn sever was not found"),!1}handleOnConfigMessage(e){this.resizePlayerStyle(),this.startSession(e.peerConnectionOptions)}handleStreamerListMessage(e){i.Log(i.GetStackTrace(),`Got streamer list ${e.ids}`,6);let t="";const n=this.config.getSettingOption(Nt.StreamerId);n.selected.toString().trim()&&(t=n.selected);const r=[...e.ids];r.unshift(""),this.config.setOptionSettingOptions(Nt.StreamerId,r);let s="";const a=this.config.isFlagEnabled(Ot.WaitForStreamer),o=this.config.getNumericSettingValue(Ft.MaxReconnectAttempts),l=this.config.getNumericSettingValue(Ft.StreamerAutoJoinInterval),c=this.config.useUrlParams,d=new URLSearchParams(window.location.search);c&&d.has(Nt.StreamerId)?t=d.get(Nt.StreamerId):this.subscribedStream&&(t=this.subscribedStream),t&&e.ids.includes(t)?s=t:t&&a||1!=e.ids.length||(s=e.ids[0]),s?(this.isReconnecting=!1,this.reconnectAttempt=0,this.config.setOptionSettingValue(Nt.StreamerId,s)):a&&(this.reconnectAttempt<o?(this.isReconnecting=!0,this.reconnectAttempt++,setTimeout((()=>{this.protocol.sendMessage(Ue(ue))}),l)):(this.reconnectAttempt=0,this.isReconnecting=!1,this.shouldReconnect=!1)),this.pixelStreaming.dispatchEvent(new yt({messageStreamerList:e,autoSelectedStreamerId:s,wantedStreamerId:t}))}handleStreamerIDChangedMessage(e){const t=e.newID,n=this.config.getSettingOption(Nt.StreamerId),r=n.onChange;n.onChange=()=>{};const s=n.options;for(let e=0;e<s.length;++e)if(s[e]==this.subscribedStream){s[e]=t;break}n.options=s,n.selected=t,n.onChange=r,this.subscribedStream=e.newID,this.pixelStreaming.dispatchEvent(new St({newID:t}))}handleWebRtcAnswer(e){i.Log(i.GetStackTrace(),`Got answer sdp ${e.sdp}`,6);const t={sdp:e.sdp,type:"answer"};this.peerConnectionController.receiveAnswer(t),this.handlePostWebrtcNegotiation()}handleWebRtcOffer(e){i.Log(i.GetStackTrace(),`Got offer sdp ${e.sdp}`,6),this.isUsingSFU=!!e.sfu&&e.sfu,this.isUsingSFU&&(this.peerConnectionController.preferredCodec="");const t={sdp:e.sdp,type:"offer"};this.peerConnectionController.receiveOffer(t,this.config),this.handlePostWebrtcNegotiation()}handleWebRtcSFUPeerDatachannels(e){const t={ordered:!0,negotiated:!0,id:e.sendStreamId},n=e.sendStreamId!=e.recvStreamId;if(this.sendrecvDataChannelController.createDataChannel(this.peerConnectionController.peerConnection,n?"send-datachannel":"datachannel",t),n){const t={ordered:!0,negotiated:!0,id:e.recvStreamId};this.recvDataChannelController.createDataChannel(this.peerConnectionController.peerConnection,"recv-datachannel",t),this.recvDataChannelController.handleOnOpen=()=>this.protocol.sendMessage(Ue(Le)),this.recvDataChannelController.handleOnMessage=e=>this.handleOnMessage(e)}else this.sendrecvDataChannelController.handleOnMessage=e=>this.handleOnMessage(e)}handlePostWebrtcNegotiation(){this.afkController.startAfkWarningTimer(),this.pixelStreaming._onWebRtcSdp(),this.statsTimerHandle&&void 0!==this.statsTimerHandle&&window.clearInterval(this.statsTimerHandle),this.statsTimerHandle=window.setInterval((()=>this.getStats()),1e3),this.setMouseInputEnabled(this.config.isFlagEnabled(Ot.MouseInput)),this.setKeyboardInputEnabled(this.config.isFlagEnabled(Ot.KeyboardInput)),this.setGamePadInputEnabled(this.config.isFlagEnabled(Ot.GamepadInput))}handleIceCandidate(e){i.Log(i.GetStackTrace(),"Web RTC Controller: onWebRtcIce",6);const t=new RTCIceCandidate(e);this.peerConnectionController.handleOnIce(t)}handleSendIceCandidate(e){i.Log(i.GetStackTrace(),"OnIceCandidate",6),e.candidate&&e.candidate.candidate&&this.protocol.sendMessage(Ue(be,{candidate:e.candidate}))}handleDataChannel(e){i.Log(i.GetStackTrace(),"Data channel created for us by browser as we are a receiving peer.",6),this.sendrecvDataChannelController.dataChannel=e.channel,this.sendrecvDataChannelController.setupDataChannel(),this.sendrecvDataChannelController.handleOnMessage=e=>this.handleOnMessage(e)}handleSendWebRTCOffer(e){i.Log(i.GetStackTrace(),"Sending the offer to the Server",6);const t={sdp:e.sdp,minBitrateBps:1e3*this.config.getNumericSettingValue(Ft.WebRTCMinBitrate),maxBitrateBps:1e3*this.config.getNumericSettingValue(Ft.WebRTCMaxBitrate)};this.protocol.sendMessage(Ue(ye,t))}handleSendWebRTCAnswer(e){i.Log(i.GetStackTrace(),"Sending the answer to the Server",6);const t={sdp:e.sdp,minBitrateBps:1e3*this.config.getNumericSettingValue(Ft.WebRTCMinBitrate),maxBitrateBps:1e3*this.config.getNumericSettingValue(Ft.WebRTCMaxBitrate)};this.protocol.sendMessage(Ue(Se,t)),this.isUsingSFU&&this.protocol.sendMessage(Ue(Re))}setUpMouseAndFreezeFrame(){this.videoElementParentClientRect=this.videoPlayer.getVideoParentElement().getBoundingClientRect(),this.coordinateConverter.setupNormalizeAndQuantize(),this.freezeFrameController.freezeFrame.resize()}closeSignalingServer(e){var t;this.locallyClosed=!0,this.shouldReconnect=!1,this.disconnectMessage=e,null===(t=this.protocol)||void 0===t||t.disconnect()}closePeerConnection(){var e;null===(e=this.peerConnectionController)||void 0===e||e.close()}close(){this.closeSignalingServer(""),this.closePeerConnection()}getStats(){this.peerConnectionController.generateStats()}sendLatencyTest(){this.latencyStartTime=Date.now(),this.streamMessageController.toStreamerHandlers.get("LatencyTest")([JSON.stringify({StartTime:this.latencyStartTime})])}sendDataChannelLatencyTest(e){this.streamMessageController.toStreamerHandlers.get("DataChannelLatencyTest")([JSON.stringify(e)])}sendEncoderMinQP(e){i.Log(i.GetStackTrace(),`MinQP=${e}\n`,6),null!=e&&this.streamMessageController.toStreamerHandlers.get("Command")([JSON.stringify({"Encoder.MinQP":e})])}sendEncoderMaxQP(e){i.Log(i.GetStackTrace(),`MaxQP=${e}\n`,6),null!=e&&this.streamMessageController.toStreamerHandlers.get("Command")([JSON.stringify({"Encoder.MaxQP":e})])}sendWebRTCMinBitrate(e){i.Log(i.GetStackTrace(),`WebRTC Min Bitrate=${e}`,6),null!=e&&this.streamMessageController.toStreamerHandlers.get("Command")([JSON.stringify({"WebRTC.MinBitrate":e})])}sendWebRTCMaxBitrate(e){i.Log(i.GetStackTrace(),`WebRTC Max Bitrate=${e}`,6),null!=e&&this.streamMessageController.toStreamerHandlers.get("Command")([JSON.stringify({"WebRTC.MaxBitrate":e})])}sendWebRTCFps(e){i.Log(i.GetStackTrace(),`WebRTC FPS=${e}`,6),null!=e&&(this.streamMessageController.toStreamerHandlers.get("Command")([JSON.stringify({"WebRTC.Fps":e})]),this.streamMessageController.toStreamerHandlers.get("Command")([JSON.stringify({"WebRTC.MaxFps":e})]))}sendShowFps(){i.Log(i.GetStackTrace(),"---- Sending show stat to UE ----",6),this.streamMessageController.toStreamerHandlers.get("Command")([JSON.stringify({"stat.fps":""})])}sendIframeRequest(){i.Log(i.GetStackTrace(),"---- Sending Request for an IFrame ----",6),this.streamMessageController.toStreamerHandlers.get("IFrameRequest")()}emitUIInteraction(e){i.Log(i.GetStackTrace(),"---- Sending custom UIInteraction message ----",6),this.streamMessageController.toStreamerHandlers.get("UIInteraction")([JSON.stringify(e)])}emitCommand(e){i.Log(i.GetStackTrace(),"---- Sending custom Command message ----",6),this.streamMessageController.toStreamerHandlers.get("Command")([JSON.stringify(e)])}emitConsoleCommand(e){i.Log(i.GetStackTrace(),"---- Sending custom Command:ConsoleCommand message ----",6),this.streamMessageController.toStreamerHandlers.get("Command")([JSON.stringify({ConsoleCommand:e})])}sendRequestQualityControlOwnership(){i.Log(i.GetStackTrace(),"---- Sending Request to Control Quality ----",6),this.toStreamerMessagesController.SendRequestQualityControl()}handleLatencyTestResult(e){i.Log(i.GetStackTrace(),"DataChannelReceiveMessageType.latencyTest",6);const t=new TextDecoder("utf-16").decode(e.slice(1)),n=new dn;Object.assign(n,JSON.parse(t)),n.processFields(),n.testStartTimeMs=this.latencyStartTime,n.browserReceiptTimeMs=Date.now(),n.latencyExcludingDecode=~~(n.browserReceiptTimeMs-n.testStartTimeMs),n.testDuration=~~(n.TransmissionTimeMs-n.ReceiptTimeMs),n.networkLatency=~~(n.latencyExcludingDecode-n.testDuration),n.frameDisplayDeltaTimeMs&&n.browserReceiptTimeMs&&(n.endToEndLatency=(n.frameDisplayDeltaTimeMs,n.networkLatency,~~+n.CaptureToSendMs)),this.pixelStreaming._onLatencyTestResult(n)}handleDataChannelLatencyTestResponse(e){i.Log(i.GetStackTrace(),"DataChannelReceiveMessageType.dataChannelLatencyResponse",6);const t=new TextDecoder("utf-16").decode(e.slice(1)),n=JSON.parse(t);this.pixelStreaming._onDataChannelLatencyTestResponse(n)}handleInitialSettings(e){i.Log(i.GetStackTrace(),"DataChannelReceiveMessageType.InitialSettings",6);const t=new TextDecoder("utf-16").decode(e.slice(1)),n=JSON.parse(t),r=new an;n.Encoder&&(r.EncoderSettings=n.Encoder),n.WebRTC&&(r.WebRTCSettings=n.WebRTC),n.PixelStreaming&&(r.PixelStreamingSettings=n.PixelStreaming),n.ConfigOptions&&void 0!==n.ConfigOptions.DefaultToHover&&this.config.setFlagEnabled(Ot.HoveringMouseMode,!!n.ConfigOptions.DefaultToHover),r.ueCompatible(),i.Log(i.GetStackTrace(),t,6),this.pixelStreaming._onInitialSettings(r)}handleVideoEncoderAvgQP(e){i.Log(i.GetStackTrace(),"DataChannelReceiveMessageType.VideoEncoderAvgQP",6);const t=Number(new TextDecoder("utf-16").decode(e.slice(1)));this.setVideoEncoderAvgQP(t)}handleVideoInitialized(){this.pixelStreaming._onVideoInitialized(),this.autoPlayVideoOrSetUpPlayOverlay(),this.resizePlayerStyle(),this.videoPlayer.updateVideoStreamSize()}onQualityControlOwnership(e){const t=new Uint8Array(e);i.Log(i.GetStackTrace(),"DataChannelReceiveMessageType.QualityControlOwnership",6),this.isQualityController=new Boolean(t[1]).valueOf(),i.Log(i.GetStackTrace(),`Received quality controller message, will control quality: ${this.isQualityController}`),this.pixelStreaming._onQualityControlOwnership(this.isQualityController)}handleVideoStats(e){this.pixelStreaming._onVideoStats(e)}resizePlayerStyle(){this.videoPlayer.resizePlayerStyle()}setPreferredCodec(e){this.preferredCodec=e,this.peerConnectionController&&(this.peerConnectionController.preferredCodec=e,this.peerConnectionController.updateCodecSelection=!1)}setVideoEncoderAvgQP(e){this.videoAvgQp=e,this.pixelStreaming._onVideoEncoderAvgQP(this.videoAvgQp)}setKeyboardInputEnabled(e){var t;null===(t=this.keyboardController)||void 0===t||t.unregisterKeyBoardEvents(),e&&(this.keyboardController=this.inputClassesFactory.registerKeyBoard(this.config))}setMouseInputEnabled(e){var t;if(null===(t=this.mouseController)||void 0===t||t.unregisterMouseEvents(),e){const e=this.config.isFlagEnabled(Ot.HoveringMouseMode)?Gt.HoveringMouse:Gt.LockedMouse;this.mouseController=this.inputClassesFactory.registerMouse(e)}}setTouchInputEnabled(e){var t;null===(t=this.touchController)||void 0===t||t.unregisterTouchEvents(),e&&(this.touchController=this.inputClassesFactory.registerTouch(this.config.isFlagEnabled(Ot.FakeMouseWithTouches),this.videoElementParentClientRect))}setGamePadInputEnabled(e){var t;null===(t=this.gamePadController)||void 0===t||t.unregisterGamePadEvents(),e&&(this.gamePadController=this.inputClassesFactory.registerGamePad(),this.gamePadController.onGamepadConnected=()=>{this.streamMessageController.toStreamerHandlers.get("GamepadConnected")()},this.gamePadController.onGamepadDisconnected=e=>{this.streamMessageController.toStreamerHandlers.get("GamepadDisconnected")([e])})}registerDataChannelEventEmitters(e){e.onOpen=(e,t)=>this.pixelStreaming.dispatchEvent(new st({label:e,event:t})),e.onClose=(e,t)=>this.pixelStreaming.dispatchEvent(new it({label:e,event:t})),e.onError=(e,t)=>this.pixelStreaming.dispatchEvent(new at({label:e,event:t}))}registerMessageHandler(e,t,n){t===nn.FromStreamer&&void 0===n&&i.Warning(i.GetStackTrace(),`Unable to register handler for ${e} as no handler was passed`),this.streamMessageController.registerMessageHandler(t,e,(r=>void 0===n&&t===nn.ToStreamer?this.sendMessageController.sendMessageToStreamer(e,r):n(r)))}}class Bn{constructor(e){this.toStreamerMessagesProvider=e,this.controllers=[]}static deepCopyGamepad(e){return JSON.parse(JSON.stringify({buttons:e.buttons.map((e=>JSON.parse(JSON.stringify({pressed:e.pressed,touched:e.touched,value:e.value})))),axes:e.axes}))}updateStatus(e,t,n){if(e.gamepad){const r=t.getPose(e.gripSpace,n);if(!r)return;let s=0;e.profiles.includes("htc-vive")?s=1:e.profiles.includes("oculus-touch")&&(s=2),this.toStreamerMessagesProvider.toStreamerHandlers.get("XRSystem")([s]);let i=2;switch(e.handedness){case"left":i=0;break;case"right":i=1}const a=r.transform.matrix,o=[];for(let e=0;e<16;e++)o[e]=new Float32Array([a[e]])[0];this.toStreamerMessagesProvider.toStreamerHandlers.get("XRControllerTransform")([o[0],o[4],o[8],o[12],o[1],o[5],o[9],o[13],o[2],o[6],o[10],o[14],o[3],o[7],o[11],o[15],i]),void 0===this.controllers[i]&&(this.controllers[i]={prevState:void 0,currentState:void 0,id:void 0},this.controllers[i].prevState=Bn.deepCopyGamepad(e.gamepad)),this.controllers[i].currentState=Bn.deepCopyGamepad(e.gamepad);const l=this.controllers[i],c=l.currentState,d=l.prevState;for(let e=0;e<c.buttons.length;e++){const t=c.buttons[e],n=d.buttons[e];if(t.pressed){const r=n.pressed?1:0;this.toStreamerMessagesProvider.toStreamerHandlers.get("XRButtonPressed")([i,e,r,t.value])}else n.pressed&&this.toStreamerMessagesProvider.toStreamerHandlers.get("XRButtonReleased")([i,e,0]);if(t.touched){const t=n.touched?1:0;this.toStreamerMessagesProvider.toStreamerHandlers.get("XRButtonTouched")([i,e,t])}else n.touched&&this.toStreamerMessagesProvider.toStreamerHandlers.get("XRButtonTouchReleased")([i,e,0])}for(let e=0;e<c.axes.length;e++){const t=c.axes[e];t!=d.axes[e]&&this.toStreamerMessagesProvider.toStreamerHandlers.get("XRAnalog")([i,e,t])}this.controllers[i].prevState=c}}}class Vn{constructor(e){this.xrViewerPose=null,this.EPSILON=1e-7,this.videoTexture=null,this.prevVideoWidth=0,this.prevVideoHeight=0,this.leftView=null,this.rightView=null,this.lastSentLeftEyeProj=null,this.lastSentRightEyeProj=null,this.lastSentRelativeLeftEyePos=null,this.lastSentRelativeRightEyePos=null,this.xrSession=null,this.webRtcController=e,this.xrGamepadController=new Bn(this.webRtcController.streamMessageController),this.onSessionEnded=new EventTarget,this.onSessionStarted=new EventTarget,this.onFrame=new EventTarget}xrClicked(){if(this.xrSession)this.xrSession.end();else{if(!navigator.xr)return void i.Error(i.GetStackTrace(),"This browser does not support XR.");navigator.xr.requestSession("immersive-vr",{optionalFeatures:[]}).then((e=>{this.onXrSessionStarted(e)}))}}onXrSessionEnded(){i.Log(i.GetStackTrace(),"XR Session ended"),this.xrSession=null,this.onSessionEnded.dispatchEvent(new Event("xrSessionEnded"))}initGL(){if(this.gl)return;const e=document.createElement("canvas");this.gl=e.getContext("webgl2",{xrCompatible:!0}),this.gl.clearColor(0,0,0,1)}initShaders(){const e=this.gl.createShader(this.gl.VERTEX_SHADER);this.gl.shaderSource(e,"\n attribute vec2 a_position;\n attribute vec2 a_texCoord;\n\n // varyings\n varying vec2 v_texCoord;\n\n void main() {\n gl_Position = vec4(a_position.x, a_position.y, 0, 1);\n // pass the texCoord to the fragment shader\n // The GPU will interpolate this value between points.\n v_texCoord = a_texCoord;\n }\n "),this.gl.compileShader(e);const t=this.gl.createShader(this.gl.FRAGMENT_SHADER);this.gl.shaderSource(t,"\n precision mediump float;\n\n // our texture\n uniform sampler2D u_image;\n\n // the texCoords passed in from the vertex shader.\n varying vec2 v_texCoord;\n\n void main() {\n gl_FragColor = texture2D(u_image, v_texCoord);\n }\n "),this.gl.compileShader(t);const n=this.gl.createProgram();this.gl.attachShader(n,e),this.gl.attachShader(n,t),this.gl.linkProgram(n),this.gl.useProgram(n),this.positionLocation=this.gl.getAttribLocation(n,"a_position"),this.texcoordLocation=this.gl.getAttribLocation(n,"a_texCoord")}updateVideoTexture(){this.videoTexture||(this.videoTexture=this.gl.createTexture(),this.gl.bindTexture(this.gl.TEXTURE_2D,this.videoTexture),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_S,this.gl.CLAMP_TO_EDGE),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_T,this.gl.CLAMP_TO_EDGE),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MIN_FILTER,this.gl.LINEAR),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MAG_FILTER,this.gl.LINEAR));const e=this.webRtcController.videoPlayer.getVideoElement().videoHeight,t=this.webRtcController.videoPlayer.getVideoElement().videoWidth;this.prevVideoHeight!=e||this.prevVideoWidth!=t?this.gl.texImage2D(this.gl.TEXTURE_2D,0,this.gl.RGBA,t,e,0,this.gl.RGBA,this.gl.UNSIGNED_BYTE,this.webRtcController.videoPlayer.getVideoElement()):this.gl.texSubImage2D(this.gl.TEXTURE_2D,0,0,0,t,e,this.gl.RGBA,this.gl.UNSIGNED_BYTE,this.webRtcController.videoPlayer.getVideoElement()),this.prevVideoHeight=e,this.prevVideoWidth=t}initBuffers(){this.positionBuffer=this.gl.createBuffer(),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.positionBuffer),this.gl.enableVertexAttribArray(this.positionLocation),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array([-1,1,1,1,-1,-1,-1,-1,1,1,1,-1]),this.gl.STATIC_DRAW),this.gl.vertexAttribPointer(this.positionLocation,2,this.gl.FLOAT,!1,0,0),this.texcoordBuffer=this.gl.createBuffer(),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.texcoordBuffer),this.gl.enableVertexAttribArray(this.texcoordLocation),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array([0,0,1,0,0,1,0,1,1,0,1,1]),this.gl.STATIC_DRAW),this.gl.vertexAttribPointer(this.texcoordLocation,2,this.gl.FLOAT,!1,0,0)}onXrSessionStarted(e){i.Log(i.GetStackTrace(),"XR Session started"),this.xrSession=e,this.xrSession.addEventListener("end",(()=>{this.onXrSessionEnded()})),this.initGL(),this.initShaders(),this.initBuffers(),e.requestReferenceSpace("local").then((t=>{if(this.xrRefSpace=t,this.xrSession.updateRenderState({baseLayer:new XRWebGLLayer(this.xrSession,this.gl)}),this.xrSession.supportedFrameRates)for(const t of this.xrSession.supportedFrameRates)90==t&&e.updateTargetFrameRate(90);this.xrSession.requestAnimationFrame(this.onXrFrame.bind(this))})),this.onSessionStarted.dispatchEvent(new Event("xrSessionStarted"))}areArraysEqual(e,t){return e.length===t.length&&e.every(((e,n)=>Math.abs(e-t[n])<=this.EPSILON))}arePointsEqual(e,t){return Math.abs(e.x-t.x)>=this.EPSILON&&Math.abs(e.y-t.y)>=this.EPSILON&&Math.abs(e.z-t.z)>=this.EPSILON}sendXRDataToUE(){if(null==this.leftView||null==this.rightView)return;let e=null==this.lastSentLeftEyeProj||null==this.lastSentRightEyeProj||null==this.lastSentRelativeLeftEyePos||null==this.lastSentRelativeRightEyePos;const t=this.leftView.transform.matrix,n=this.leftView.projectionMatrix,r=this.rightView.transform.matrix,s=this.rightView.projectionMatrix,i=this.xrViewerPose.transform.matrix;if(!e&&null!=this.lastSentLeftEyeProj&&null!=this.lastSentRightEyeProj){const t=this.areArraysEqual(n,this.lastSentLeftEyeProj),r=this.areArraysEqual(s,this.lastSentRightEyeProj);e=0==t||0==r}const a=new DOMPointReadOnly(this.leftView.transform.position.x-this.xrViewerPose.transform.position.x,this.leftView.transform.position.y-this.xrViewerPose.transform.position.y,this.leftView.transform.position.z-this.xrViewerPose.transform.position.z,1),o=new DOMPointReadOnly(this.leftView.transform.position.x-this.xrViewerPose.transform.position.x,this.leftView.transform.position.y-this.xrViewerPose.transform.position.y,this.leftView.transform.position.z-this.xrViewerPose.transform.position.z,1);if(!e&&null!=this.lastSentRelativeLeftEyePos&&null!=this.lastSentRelativeRightEyePos){const t=this.arePointsEqual(a,this.lastSentRelativeLeftEyePos),n=this.arePointsEqual(o,this.lastSentRelativeRightEyePos);e=0==t||0==n}e?(this.webRtcController.streamMessageController.toStreamerHandlers.get("XREyeViews")([t[0],t[4],t[8],t[12],t[1],t[5],t[9],t[13],t[2],t[6],t[10],t[14],t[3],t[7],t[11],t[15],n[0],n[4],n[8],n[12],n[1],n[5],n[9],n[13],n[2],n[6],n[10],n[14],n[3],n[7],n[11],n[15],r[0],r[4],r[8],r[12],r[1],r[5],r[9],r[13],r[2],r[6],r[10],r[14],r[3],r[7],r[11],r[15],s[0],s[4],s[8],s[12],s[1],s[5],s[9],s[13],s[2],s[6],s[10],s[14],s[3],s[7],s[11],s[15],i[0],i[4],i[8],i[12],i[1],i[5],i[9],i[13],i[2],i[6],i[10],i[14],i[3],i[7],i[11],i[15]]),this.lastSentLeftEyeProj=n,this.lastSentRightEyeProj=s,this.lastSentRelativeLeftEyePos=a,this.lastSentRelativeRightEyePos=o):this.webRtcController.streamMessageController.toStreamerHandlers.get("XRHMDTransform")([i[0],i[4],i[8],i[12],i[1],i[5],i[9],i[13],i[2],i[6],i[10],i[14],i[3],i[7],i[11],i[15]])}onXrFrame(e,t){if(this.xrViewerPose=t.getViewerPose(this.xrRefSpace),this.xrViewerPose){if(this.updateViews(),null==this.leftView||null==this.rightView)return;this.sendXRDataToUE(),this.updateVideoTexture(),this.render()}this.webRtcController.config.isFlagEnabled(Ot.XRControllerInput)&&this.xrSession.inputSources.forEach(((e,n,r)=>{this.xrGamepadController.updateStatus(e,t,this.xrRefSpace)}),this),this.xrSession.requestAnimationFrame(((e,t)=>this.onXrFrame(e,t))),this.onFrame.dispatchEvent(new Rt({time:e,frame:t}))}updateViews(){if(this.xrViewerPose)for(const e of this.xrViewerPose.views)"left"===e.eye?this.leftView=e:"right"===e.eye&&(this.rightView=e)}render(){if(!this.gl)return;const e=this.xrSession.renderState.baseLayer;this.gl.bindFramebuffer(this.gl.FRAMEBUFFER,e.framebuffer),this.gl.viewport(0,0,e.framebufferWidth,e.framebufferHeight),this.gl.drawArrays(this.gl.TRIANGLES,0,6)}static isSessionSupported(e){return"https:"!==location.protocol&&i.Info(null,"WebXR requires https, if you want WebXR use https."),navigator.xr?navigator.xr.isSessionSupported(e):new Promise((()=>!1))}}class Gn{constructor(e){this.editTextButton=null,this.hiddenInput=null,"ontouchstart"in document.documentElement&&this.createOnScreenKeyboardHelpers(e)}unquantizeAndDenormalizeUnsigned(e,t){return null}createOnScreenKeyboardHelpers(e){this.hiddenInput||(this.hiddenInput=document.createElement("input"),this.hiddenInput.id="hiddenInput",this.hiddenInput.maxLength=0,e.appendChild(this.hiddenInput)),this.editTextButton||(this.editTextButton=document.createElement("button"),this.editTextButton.id="editTextButton",this.editTextButton.innerHTML="edit text",e.appendChild(this.editTextButton),this.editTextButton.classList.add("hiddenState"),this.editTextButton.addEventListener("touchend",(e=>{this.hiddenInput.focus(),e.preventDefault()})))}showOnScreenKeyboard(e){if(e.showOnScreenKeyboard){this.editTextButton.classList.remove("hiddenState");const t=this.unquantizeAndDenormalizeUnsigned(e.x,e.y);this.editTextButton.style.top=t.y.toString()+"px",this.editTextButton.style.left=(t.x-40).toString()+"px"}else this.editTextButton.classList.add("hiddenState"),this.hiddenInput.blur()}}class Wn{constructor(e){this.seq=e.Seq,this.playerSentTimestamp=Date.now(),this.requestFillerSize=e.Filler?e.Filler.length:0}update(e){this.playerReceivedTimestamp=Date.now(),this.streamerReceivedTimestamp=e.ReceivedTimestamp,this.streamerSentTimestamp=e.SentTimestamp,this.responseFillerSize=e.Filler?e.Filler.length:0}}class zn{constructor(e,t){this.sink=e,this.callback=t,this.records=new Map,this.seq=0}start(e){return!this.isRunning()&&(this.startTime=Date.now(),this.records.clear(),this.interval=setInterval((()=>{Date.now()-this.startTime>=e.duration?this.stop():this.sendRequest(e.requestSize,e.responseSize)}).bind(this),Math.floor(1e3/e.rps)),!0)}stop(){this.interval&&(clearInterval(this.interval),this.interval=void 0,this.callback(this.produceResult()))}produceResult(){const e=new Map(this.records);return{records:e,dataChannelRtt:Math.ceil(Array.from(this.records.values()).reduce(((e,t)=>e+(t.playerReceivedTimestamp-t.playerSentTimestamp)),0)/this.records.size),playerToStreamerTime:Math.ceil(Array.from(this.records.values()).reduce(((e,t)=>e+(t.streamerReceivedTimestamp-t.playerSentTimestamp)),0)/this.records.size),streamerToPlayerTime:Math.ceil(Array.from(this.records.values()).reduce(((e,t)=>e+(t.playerReceivedTimestamp-t.streamerSentTimestamp)),0)/this.records.size),exportLatencyAsCSV:()=>{let t="Timestamp;RTT;PlayerToStreamer;StreamerToPlayer;\n";return e.forEach((e=>{t+=e.playerSentTimestamp+";",t+=e.playerReceivedTimestamp-e.playerSentTimestamp+";",t+=e.streamerReceivedTimestamp-e.playerSentTimestamp+";",t+=e.playerReceivedTimestamp-e.streamerSentTimestamp+";",t+="\n"})),t}}}isRunning(){return!!this.interval}receive(e){if(!this.isRunning())return;if(!e)return void i.Error(i.GetStackTrace(),"Undefined response from server");const t=this.records.get(e.Seq);t&&t.update(e)}sendRequest(e,t){const n=this.createRequest(e,t),r=new Wn(n);this.records.set(r.seq,r),this.sink(n)}createRequest(e,t){return{Seq:this.seq++,FillResponseSize:t,Filler:e?"A".repeat(e):""}}}class _n{constructor(e,t){this.allowConsoleCommands=!1,this.config=e,(null==t?void 0:t.videoElementParent)&&(this._videoElementParent=t.videoElementParent),this._eventEmitter=new It,this.configureSettings(),this.setWebRtcPlayerController(new Nn(this.config,this)),this.onScreenKeyboardHelper=new Gn(this.videoElementParent),this.onScreenKeyboardHelper.unquantizeAndDenormalizeUnsigned=(e,t)=>this._webRtcController.requestUnquantizedAndDenormalizeUnsigned(e,t),this._activateOnScreenKeyboard=e=>this.onScreenKeyboardHelper.showOnScreenKeyboard(e),this._webXrController=new Vn(this._webRtcController),this._setupWebRtcTCPRelayDetection=this._setupWebRtcTCPRelayDetection.bind(this),this._eventEmitter.addEventListener("webRtcConnected",(e=>{this._eventEmitter.addEventListener("statsReceived",this._setupWebRtcTCPRelayDetection)}))}get videoElementParent(){return this._videoElementParent||(this._videoElementParent=document.createElement("div"),this._videoElementParent.id="videoElementParent"),this._videoElementParent}configureSettings(){this.config._addOnSettingChangedListener(Ot.IsQualityController,(e=>{!0!==e||this._webRtcController.isQualityController||this._webRtcController.sendRequestQualityControlOwnership()})),this.config._addOnSettingChangedListener(Ot.AFKDetection,(e=>{this._webRtcController.setAfkEnabled(e)})),this.config._addOnSettingChangedListener(Ot.MatchViewportResolution,(()=>{this._webRtcController.videoPlayer.updateVideoStreamSize()})),this.config._addOnSettingChangedListener(Ot.HoveringMouseMode,(e=>{this.config.setFlagLabel(Ot.HoveringMouseMode,`Control Scheme: ${e?"Hovering":"Locked"} Mouse`),this._webRtcController.setMouseInputEnabled(this.config.isFlagEnabled(Ot.MouseInput))})),this.config._addOnSettingChangedListener(Ot.KeyboardInput,(e=>{this._webRtcController.setKeyboardInputEnabled(e)})),this.config._addOnSettingChangedListener(Ot.MouseInput,(e=>{this._webRtcController.setMouseInputEnabled(e)})),this.config._addOnSettingChangedListener(Ot.TouchInput,(e=>{this._webRtcController.setTouchInputEnabled(e)})),this.config._addOnSettingChangedListener(Ot.GamepadInput,(e=>{this._webRtcController.setGamePadInputEnabled(e)})),this.config._addOnNumericSettingChangedListener(Ft.MinQP,(e=>{i.Log(i.GetStackTrace(),"-------- Sending MinQP --------",7),this._webRtcController.sendEncoderMinQP(e),i.Log(i.GetStackTrace(),"-------------------------------------------",7)})),this.config._addOnNumericSettingChangedListener(Ft.MaxQP,(e=>{i.Log(i.GetStackTrace(),"-------- Sending encoder settings --------",7),this._webRtcController.sendEncoderMaxQP(e),i.Log(i.GetStackTrace(),"-------------------------------------------",7)})),this.config._addOnNumericSettingChangedListener(Ft.WebRTCMinBitrate,(e=>{i.Log(i.GetStackTrace(),"-------- Sending web rtc settings --------",7),this._webRtcController.sendWebRTCMinBitrate(1e3*e),i.Log(i.GetStackTrace(),"-------------------------------------------",7)})),this.config._addOnNumericSettingChangedListener(Ft.WebRTCMaxBitrate,(e=>{i.Log(i.GetStackTrace(),"-------- Sending web rtc settings --------",7),this._webRtcController.sendWebRTCMaxBitrate(1e3*e),i.Log(i.GetStackTrace(),"-------------------------------------------",7)})),this.config._addOnNumericSettingChangedListener(Ft.WebRTCFPS,(e=>{i.Log(i.GetStackTrace(),"-------- Sending web rtc settings --------",7),this._webRtcController.sendWebRTCFps(e),i.Log(i.GetStackTrace(),"-------------------------------------------",7)})),this.config._addOnOptionSettingChangedListener(Nt.PreferredCodec,(e=>{this._webRtcController&&this._webRtcController.setPreferredCodec(e)})),this.config._registerOnChangeEvents(this._eventEmitter)}_activateOnScreenKeyboard(e){throw new Error("Method not implemented.")}_onInputControlOwnership(e){this._inputController=e}setWebRtcPlayerController(e){this._webRtcController=e,this._webRtcController.setPreferredCodec(this.config.getSettingOption(Nt.PreferredCodec).selected),this._webRtcController.resizePlayerStyle(),this.checkForAutoConnect()}connect(){this._eventEmitter.dispatchEvent(new ct),this._webRtcController.connectToSignallingServer()}reconnect(){this._eventEmitter.dispatchEvent(new ht),this._webRtcController.tryReconnect("Reconnecting...")}disconnect(){this._eventEmitter.dispatchEvent(new dt),this._webRtcController.close()}play(){this._onStreamLoading(),this._webRtcController.playStream()}checkForAutoConnect(){this.config.isFlagEnabled(Ot.AutoConnect)&&(this._onWebRtcAutoConnect(),this._webRtcController.connectToSignallingServer())}unmuteMicrophone(e=!1){if(!this.config.isFlagEnabled("UseMic"))return e?(this.config.setFlagEnabled("UseMic",!0),void this.reconnect()):void i.Warning(i.GetStackTrace(),"Trying to unmute mic, but PixelStreaming was initialized with no microphone track. Call with forceEnable == true to re-connect with a mic track.");this.setMicrophoneMuted(!1)}muteMicrophone(){this.config.isFlagEnabled("UseMic")?this.setMicrophoneMuted(!0):i.Info(i.GetStackTrace(),"Trying to mute mic, but PixelStreaming has no microphone track, so sending sound is already disabled.")}setMicrophoneMuted(e){var t,n,r,s;for(const i of null!==(s=null===(r=null===(n=null===(t=this._webRtcController)||void 0===t?void 0:t.peerConnectionController)||void 0===n?void 0:n.peerConnection)||void 0===r?void 0:r.getTransceivers())&&void 0!==s?s:[])en.canTransceiverSendAudio(i)&&(i.sender.track.enabled=!e)}_onWebRtcAutoConnect(){this._eventEmitter.dispatchEvent(new Ze)}_onWebRtcSdp(){this._eventEmitter.dispatchEvent(new Ye)}_onStreamLoading(){this._eventEmitter.dispatchEvent(new lt)}_onDisconnect(e,t){this._eventEmitter.dispatchEvent(new rt({eventString:e,allowClickToReconnect:t}))}_onWebRtcConnecting(){this._eventEmitter.dispatchEvent(new et)}_onWebRtcConnected(){this._eventEmitter.dispatchEvent(new tt)}_onWebRtcFailed(){this._eventEmitter.dispatchEvent(new nt)}_onVideoInitialized(){this._eventEmitter.dispatchEvent(new ot),this._videoStartTime=Date.now()}_onLatencyTestResult(e){this._eventEmitter.dispatchEvent(new wt({latencyTimings:e}))}_onDataChannelLatencyTestResponse(e){this._eventEmitter.dispatchEvent(new bt({response:e}))}_onVideoStats(e){this._videoStartTime&&void 0!==this._videoStartTime||(this._videoStartTime=Date.now()),e.handleSessionStatistics(this._videoStartTime,this._inputController,this._webRtcController.videoAvgQp),this._eventEmitter.dispatchEvent(new vt({aggregatedStats:e}))}_onVideoEncoderAvgQP(e){this._eventEmitter.dispatchEvent(new Je({avgQP:e}))}_onInitialSettings(e){var t;this._eventEmitter.dispatchEvent(new Ct({settings:e})),e.PixelStreamingSettings&&(this.allowConsoleCommands=null!==(t=e.PixelStreamingSettings.AllowPixelStreamingCommands)&&void 0!==t&&t,!1===this.allowConsoleCommands&&i.Info(i.GetStackTrace(),"-AllowPixelStreamingCommands=false, sending arbitrary console commands from browser to UE is disabled."));const n=this.config.useUrlParams,r=new URLSearchParams(window.location.search);i.Info(i.GetStackTrace(),`using URL parameters ${n}`),e.EncoderSettings&&(this.config.setNumericSetting(Ft.MinQP,n&&r.has(Ft.MinQP)?Number.parseFloat(r.get(Ft.MinQP)):e.EncoderSettings.MinQP),this.config.setNumericSetting(Ft.MaxQP,n&&r.has(Ft.MaxQP)?Number.parseFloat(r.get(Ft.MaxQP)):e.EncoderSettings.MaxQP)),e.WebRTCSettings&&(this.config.setNumericSetting(Ft.WebRTCMinBitrate,n&&r.has(Ft.WebRTCMinBitrate)?Number.parseFloat(r.get(Ft.WebRTCMinBitrate)):e.WebRTCSettings.MinBitrate/1e3),this.config.setNumericSetting(Ft.WebRTCMaxBitrate,n&&r.has(Ft.WebRTCMaxBitrate)?Number.parseFloat(r.get(Ft.WebRTCMaxBitrate)):e.WebRTCSettings.MaxBitrate/1e3),this.config.setNumericSetting(Ft.WebRTCFPS,n&&r.has(Ft.WebRTCFPS)?Number.parseFloat(r.get(Ft.WebRTCFPS)):e.WebRTCSettings.FPS))}_onQualityControlOwnership(e){this.config.setFlagEnabled(Ot.IsQualityController,e)}_onPlayerCount(e){this._eventEmitter.dispatchEvent(new Pt({count:e}))}_setupWebRtcTCPRelayDetection(e){const t=e.data.aggregatedStats.getActiveCandidatePair();if(null!=t){const n=e.data.aggregatedStats.localCandidates.find((e=>e.id==t.localCandidateId),null);null!=n&&"relay"==n.candidateType&&"tcp"==n.relayProtocol&&this._eventEmitter.dispatchEvent(new Lt),this._eventEmitter.removeEventListener("statsReceived",this._setupWebRtcTCPRelayDetection)}}requestLatencyTest(){return!!this._webRtcController.videoPlayer.isVideoReady()&&(this._webRtcController.sendLatencyTest(),!0)}requestDataChannelLatencyTest(e){return!!this._webRtcController.videoPlayer.isVideoReady()&&(this._dataChannelLatencyTestController||(this._dataChannelLatencyTestController=new zn(this._webRtcController.sendDataChannelLatencyTest.bind(this._webRtcController),(e=>{this._eventEmitter.dispatchEvent(new Tt({result:e}))})),this.addEventListener("dataChannelLatencyTestResponse",(({data:{response:e}})=>{this._dataChannelLatencyTestController.receive(e)}))),this._dataChannelLatencyTestController.start(e))}requestShowFps(){return!!this._webRtcController.videoPlayer.isVideoReady()&&(this._webRtcController.sendShowFps(),!0)}requestIframe(){return!!this._webRtcController.videoPlayer.isVideoReady()&&(this._webRtcController.sendIframeRequest(),!0)}emitUIInteraction(e){return!!this._webRtcController.videoPlayer.isVideoReady()&&(this._webRtcController.emitUIInteraction(e),!0)}emitCommand(e){return!(!this._webRtcController.videoPlayer.isVideoReady()||!this.allowConsoleCommands&&"ConsoleCommand"in e||(this._webRtcController.emitCommand(e),0))}emitConsoleCommand(e){return!(!this.allowConsoleCommands||!this._webRtcController.videoPlayer.isVideoReady()||(this._webRtcController.emitConsoleCommand(e),0))}addResponseEventListener(e,t){this._webRtcController.responseController.addResponseEventListener(e,t)}removeResponseEventListener(e){this._webRtcController.responseController.removeResponseEventListener(e)}dispatchEvent(e){return this._eventEmitter.dispatchEvent(e)}addEventListener(e,t){this._eventEmitter.addEventListener(e,t)}removeEventListener(e,t){this._eventEmitter.removeEventListener(e,t)}toggleXR(){this.webXrController.xrClicked()}setSignallingUrlBuilder(e){this._webRtcController.signallingUrlBuilder=e}get signallingProtocol(){return this._webRtcController.protocol}get webXrController(){return this._webXrController}registerMessageHandler(e,t,n){t!==nn.FromStreamer||void 0!==n?t===nn.ToStreamer&&void 0===n?this._webRtcController.streamMessageController.registerMessageHandler(t,e,(t=>this._webRtcController.sendMessageController.sendMessageToStreamer(e,t))):this._webRtcController.streamMessageController.registerMessageHandler(t,e,(e=>n(e))):i.Warning(i.GetStackTrace(),`Unable to register an undefined handler for ${e}`)}get toStreamerHandlers(){return this._webRtcController.streamMessageController.toStreamerHandlers}isReconnecting(){return this._webRtcController.isReconnecting}}class $n{}var Hn=r(499),jn=r.n(Hn);class Kn extends l.EventEmitter{constructor(e){super(),this.WS_OPEN_STATE=1,e&&(this.webSocket=e,this.setupSocketHandlers(),this.emit("open"))}sendMessage(e){this.webSocket&&this.webSocket.send(JSON.stringify(e))}connect(e){return this.webSocket=new(jn())(e),this.setupSocketHandlers(),!0}disconnect(e,t){this.webSocket&&this.webSocket.close(e,t)}isConnected(){return!!this.webSocket&&this.webSocket.readyState!=jn().CLOSED}handleOnMessage(e){let t;try{t=JSON.parse(e.data)}catch(e){return}this.onMessage&&this.onMessage(t)}handleOnOpen(e){this.emit("open",e)}handleOnError(e){this.emit("error",e)}handleOnClose(e){this.emit("close",e)}close(){var e;null===(e=this.webSocket)||void 0===e||e.close()}setupSocketHandlers(){this.webSocket&&(this.webSocket.addEventListener("open",this.handleOnOpen.bind(this)),this.webSocket.addEventListener("error",this.handleOnError.bind(this)),this.webSocket.addEventListener("close",this.handleOnClose.bind(this)),this.webSocket.addEventListener("message",this.handleOnMessage.bind(this)))}}})();var i=s.Dz,a=s.g$,o=s.Lt,l=s.Q9,c=s.qf,d=s.hV,h=s.z$,u=s.J0,g=s.De,m=s.$C,p=s.al,f=s._W,v=s.Gv,y=s.m,S=s.tz,w=s.Nu,b=s.zg,T=s.vp,C=s.vU,E=s.wF,k=s.rv,M=s.Nh,R=s.ss,P=s.qW,L=s.QL,I=s.cf,O=s.eM,x=s.Yd,F=s.Tk,D=s.iw,A=s.pr,U=s.Vm,N=s.sK,B=s.Ok,V=s.q5,G=s.g,W=s.xl,z=s.I,_=s.bx,$=s.dD,H=s.Ib,j=s.Az,K=s.Iw,Q=s.qY,q=s.db,X=s.mR,J=s.Tn,Y=s.rV,Z=s.gh,ee=s.Mi,te=s.j,ne=s.YB,re=s.Yt,se=s.i5,ie=s.x_,ae=s.Am,oe=s.eR,le=s.r8,ce=s.u3,de=s.vd,he=s.iV,ue=s.jZ,ge=s.SW,me=s.ZH,pe=s.Ni,fe=s.lh,ve=s.ZP,ye=s.qo,Se=s.Q8,we=s.$f,be=s.eu,Te=s.Ax,Ce=s.Mc;export{i as AfkLogic,a as AfkTimedOutEvent,o as AfkWarningActivateEvent,l as AfkWarningDeactivateEvent,c as AfkWarningUpdateEvent,d as AggregatedStats,h as CandidatePairStats,u as CandidateStat,g as Config,m as ControlSchemeType,p as DataChannelCloseEvent,f as DataChannelErrorEvent,v as DataChannelLatencyTestResponseEvent,y as DataChannelLatencyTestResultEvent,S as DataChannelOpenEvent,w as DataChannelStats,b as EncoderSettings,T as EventEmitter,C as Flags,E as HideFreezeFrameEvent,k as InboundAudioStats,M as InboundVideoStats,R as InitialSettings,P as InitialSettingsEvent,L as LatencyTestResultEvent,I as LatencyTestResults,O as LoadFreezeFrameEvent,x as Logger,F as MessageDirection,D as MessageHelpers,A as MessageRegistry,U as Messages,N as NumericParameters,B as OptionParameters,V as OutBoundVideoStats,G as PixelStreaming,W as PlayStreamErrorEvent,z as PlayStreamEvent,_ as PlayStreamRejectedEvent,$ as PlayerCountEvent,H as SettingBase,j as SettingFlag,K as SettingNumber,Q as SettingOption,q as SettingText,X as SettingsChangedEvent,J as SignallingProtocol,Y as StatsReceivedEvent,Z as StreamLoadingEvent,ee as StreamPreConnectEvent,te as StreamPreDisconnectEvent,ne as StreamReconnectEvent,re as StreamerIDChangedMessageEvent,se as StreamerListMessageEvent,ie as TextParameters,ae as UnquantizedAndDenormalizeUnsigned,oe as VideoEncoderAvgQPEvent,le as VideoInitializedEvent,ce as WebRTCSettings,de as WebRtcAutoConnectEvent,he as WebRtcConnectedEvent,ue as WebRtcConnectingEvent,ge as WebRtcDisconnectedEvent,me as WebRtcFailedEvent,pe as WebRtcPlayerController,fe as WebRtcSdpEvent,ve as WebRtcTCPRelayDetectedEvent,ye as WebSocketTransport,Se as WebSocketTransportNJS,we as WebXRController,be as XrFrameEvent,Te as XrSessionEndedEvent,Ce as XrSessionStartedEvent};
1
+ import*as e from"sdp";var t={290:e=>{e.exports=function(){throw new Error("ws does not work in the browser. Browser clients must use the native WebSocket object")}},7:e=>{var t,n="object"==typeof Reflect?Reflect:null,s=n&&"function"==typeof n.apply?n.apply:function(e,t,n){return Function.prototype.apply.call(e,t,n)};t=n&&"function"==typeof n.ownKeys?n.ownKeys:Object.getOwnPropertySymbols?function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:function(e){return Object.getOwnPropertyNames(e)};var r=Number.isNaN||function(e){return e!=e};function i(){i.init.call(this)}e.exports=i,e.exports.once=function(e,t){return new Promise((function(n,s){function r(n){e.removeListener(t,i),s(n)}function i(){"function"==typeof e.removeListener&&e.removeListener("error",r),n([].slice.call(arguments))}p(e,t,i,{once:!0}),"error"!==t&&function(e,t){"function"==typeof e.on&&p(e,"error",t,{once:!0})}(e,r)}))},i.EventEmitter=i,i.prototype._events=void 0,i.prototype._eventsCount=0,i.prototype._maxListeners=void 0;var o=10;function a(e){if("function"!=typeof e)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof e)}function l(e){return void 0===e._maxListeners?i.defaultMaxListeners:e._maxListeners}function d(e,t,n,s){var r,i,o,d;if(a(n),void 0===(i=e._events)?(i=e._events=Object.create(null),e._eventsCount=0):(void 0!==i.newListener&&(e.emit("newListener",t,n.listener?n.listener:n),i=e._events),o=i[t]),void 0===o)o=i[t]=n,++e._eventsCount;else if("function"==typeof o?o=i[t]=s?[n,o]:[o,n]:s?o.unshift(n):o.push(n),(r=l(e))>0&&o.length>r&&!o.warned){o.warned=!0;var h=new Error("Possible EventEmitter memory leak detected. "+o.length+" "+String(t)+" listeners added. Use emitter.setMaxListeners() to increase limit");h.name="MaxListenersExceededWarning",h.emitter=e,h.type=t,h.count=o.length,d=h,console&&console.warn&&console.warn(d)}return e}function h(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function c(e,t,n){var s={fired:!1,wrapFn:void 0,target:e,type:t,listener:n},r=h.bind(s);return r.listener=n,s.wrapFn=r,r}function u(e,t,n){var s=e._events;if(void 0===s)return[];var r=s[t];return void 0===r?[]:"function"==typeof r?n?[r.listener||r]:[r]:n?function(e){for(var t=new Array(e.length),n=0;n<t.length;++n)t[n]=e[n].listener||e[n];return t}(r):m(r,r.length)}function g(e){var t=this._events;if(void 0!==t){var n=t[e];if("function"==typeof n)return 1;if(void 0!==n)return n.length}return 0}function m(e,t){for(var n=new Array(t),s=0;s<t;++s)n[s]=e[s];return n}function p(e,t,n,s){if("function"==typeof e.on)s.once?e.once(t,n):e.on(t,n);else{if("function"!=typeof e.addEventListener)throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type '+typeof e);e.addEventListener(t,(function r(i){s.once&&e.removeEventListener(t,r),n(i)}))}}Object.defineProperty(i,"defaultMaxListeners",{enumerable:!0,get:function(){return o},set:function(e){if("number"!=typeof e||e<0||r(e))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+e+".");o=e}}),i.init=function(){void 0!==this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},i.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||r(e))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+e+".");return this._maxListeners=e,this},i.prototype.getMaxListeners=function(){return l(this)},i.prototype.emit=function(e){for(var t=[],n=1;n<arguments.length;n++)t.push(arguments[n]);var r="error"===e,i=this._events;if(void 0!==i)r=r&&void 0===i.error;else if(!r)return!1;if(r){var o;if(t.length>0&&(o=t[0]),o instanceof Error)throw o;var a=new Error("Unhandled error."+(o?" ("+o.message+")":""));throw a.context=o,a}var l=i[e];if(void 0===l)return!1;if("function"==typeof l)s(l,this,t);else{var d=l.length,h=m(l,d);for(n=0;n<d;++n)s(h[n],this,t)}return!0},i.prototype.addListener=function(e,t){return d(this,e,t,!1)},i.prototype.on=i.prototype.addListener,i.prototype.prependListener=function(e,t){return d(this,e,t,!0)},i.prototype.once=function(e,t){return a(t),this.on(e,c(this,e,t)),this},i.prototype.prependOnceListener=function(e,t){return a(t),this.prependListener(e,c(this,e,t)),this},i.prototype.removeListener=function(e,t){var n,s,r,i,o;if(a(t),void 0===(s=this._events))return this;if(void 0===(n=s[e]))return this;if(n===t||n.listener===t)0==--this._eventsCount?this._events=Object.create(null):(delete s[e],s.removeListener&&this.emit("removeListener",e,n.listener||t));else if("function"!=typeof n){for(r=-1,i=n.length-1;i>=0;i--)if(n[i]===t||n[i].listener===t){o=n[i].listener,r=i;break}if(r<0)return this;0===r?n.shift():function(e,t){for(;t+1<e.length;t++)e[t]=e[t+1];e.pop()}(n,r),1===n.length&&(s[e]=n[0]),void 0!==s.removeListener&&this.emit("removeListener",e,o||t)}return this},i.prototype.off=i.prototype.removeListener,i.prototype.removeAllListeners=function(e){var t,n,s;if(void 0===(n=this._events))return this;if(void 0===n.removeListener)return 0===arguments.length?(this._events=Object.create(null),this._eventsCount=0):void 0!==n[e]&&(0==--this._eventsCount?this._events=Object.create(null):delete n[e]),this;if(0===arguments.length){var r,i=Object.keys(n);for(s=0;s<i.length;++s)"removeListener"!==(r=i[s])&&this.removeAllListeners(r);return this.removeAllListeners("removeListener"),this._events=Object.create(null),this._eventsCount=0,this}if("function"==typeof(t=n[e]))this.removeListener(e,t);else if(void 0!==t)for(s=t.length-1;s>=0;s--)this.removeListener(e,t[s]);return this},i.prototype.listeners=function(e){return u(this,e,!0)},i.prototype.rawListeners=function(e){return u(this,e,!1)},i.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):g.call(e,t)},i.prototype.listenerCount=g,i.prototype.eventNames=function(){return this._eventsCount>0?t(this._events):[]}}},n={};function s(e){var r=n[e];if(void 0!==r)return r.exports;var i=n[e]={exports:{}};return t[e](i,i.exports,s),i.exports}s.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return s.d(t,{a:t}),t},s.d=(e,t)=>{for(var n in t)s.o(t,n)&&!s.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},s.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),s.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var r={};s.d(r,{D6:()=>zt,Kr:()=>et,mC:()=>Je,jr:()=>Ze,S_:()=>Ye,Ff:()=>en,Hp:()=>Kn,yC:()=>Qt,TS:()=>$t,Bs:()=>jt,CE:()=>dt,EQ:()=>ht,Fh:()=>Mt,L7:()=>kt,ys:()=>lt,Lm:()=>qt,Cx:()=>hn,bk:()=>Dt,iI:()=>Nt,RW:()=>St,$o:()=>Gt,IR:()=>Xt,C9:()=>ln,EG:()=>Rt,gU:()=>Bn,Cc:()=>Et,ZS:()=>un,vx:()=>wt,$b:()=>o,Vy:()=>d,Tt:()=>Rn,Jo:()=>a,z:()=>Ve,B2:()=>i,k$:()=>Bt,mY:()=>_t,D4:()=>Jt,z3:()=>zn,vL:()=>ft,Lz:()=>yt,FJ:()=>vt,d2:()=>Ft,Eo:()=>Ke,kR:()=>Ge,UW:()=>Xe,GZ:()=>Qe,cZ:()=>qe,Si:()=>Pt,ty:()=>He,d_:()=>bt,Bg:()=>ut,y6:()=>gt,iu:()=>mt,oK:()=>pt,ie:()=>Tt,jG:()=>Ct,gw:()=>Vt,x1:()=>tt,Qy:()=>ct,bJ:()=>cn,nV:()=>st,d4:()=>it,Ys:()=>rt,Nu:()=>at,tv:()=>ot,n7:()=>Vn,xV:()=>nt,KB:()=>Ot,TJ:()=>g,a7:()=>qn,R3:()=>_n,qM:()=>xt,HH:()=>Lt,ev:()=>It});var i={};s.r(i),s.d(i,{answer:()=>Te,base_message:()=>de,config:()=>ce,dataChannelRequest:()=>xe,disconnectPlayer:()=>ke,endpointId:()=>ge,endpointIdConfirm:()=>me,iceCandidate:()=>Me,iceCandidateData:()=>Ee,identify:()=>ue,layerPreference:()=>Le,listStreamers:()=>fe,offer:()=>Ce,peerConnectionOptions:()=>he,peerDataChannels:()=>Fe,peerDataChannelsReady:()=>Oe,ping:()=>Re,playerConnected:()=>Se,playerCount:()=>Be,playerDisconnected:()=>be,pong:()=>Pe,startStreaming:()=>Ne,stats:()=>Ue,stopStreaming:()=>Ae,streamerDataChannels:()=>De,streamerDisconnected:()=>Ie,streamerIdChanged:()=>pe,streamerList:()=>ye,subscribe:()=>ve,unsubscribe:()=>we});var o,a={};s.r(a),s.d(a,{createMessage:()=>We,validateMessage:()=>_e}),function(e){e[e.Disabled=0]="Disabled",e[e.Error=1]="Error",e[e.Warning=2]="Warning",e[e.Info=3]="Info",e[e.Debug=4]="Debug"}(o||(o={}));class l{constructor(){this.logLevel=o.Debug,this.includeStack=!0}}const d=new class{InitLogging(e,t){this.ValidateContext(),this.context.logLevel=e,this.context.includeStack=t}Debug(e){this.ValidateContext(),this.context.logLevel>=o.Debug&&this.CommonLog("Debug",e)}Info(e){this.ValidateContext(),this.context.logLevel>=o.Info&&this.CommonLog("Info",e)}Warning(e){this.ValidateContext(),this.context.logLevel>=o.Warning&&this.CommonLog("Warning",e)}Error(e){this.ValidateContext(),this.context.logLevel>=o.Error&&this.CommonLog("Error",e)}CommonLog(e,t){let n=`[${e}] - ${t}`;this.context.includeStack&&(n+=`\nStack: ${this.GetStackTrace()}`),console.log(n)}GetStackTrace(){const e=new Error;let t="No Stack Available for this browser";return e.stack&&(t=e.stack.toString().replace(/Error/g,"")),t}ValidateContext(){this.context||(window?window.loggerContext?this.context=window.loggerContext:(this.context=new l,window.loggerContext=this.context):this.context=new l)}};var h,c,u=s(7);class g extends u.EventEmitter{constructor(){super(),this.WS_OPEN_STATE=1}sendMessage(e){this.webSocket&&this.webSocket.send(JSON.stringify(e))}connect(e){d.Info(e);try{return this.webSocket=new WebSocket(e),this.webSocket.onopen=e=>this.handleOnOpen(),this.webSocket.onerror=e=>this.handleOnError(),this.webSocket.onclose=e=>this.handleOnClose(e),this.webSocket.onmessage=e=>this.handleOnMessage(e),this.webSocket.onmessagebinary=e=>this.handleOnMessageBinary(e),!0}catch(e){return d.Error(e),!1}}disconnect(e,t){this.webSocket&&this.webSocket.close(e,t)}isConnected(){return!!this.webSocket&&this.webSocket.readyState!=WebSocket.CLOSED}handleOnMessageBinary(e){e&&e.data&&e.data.text().then((e=>{const t=new MessageEvent("messageFromBinary",{data:e});this.handleOnMessage(t)})).catch((e=>{d.Error(`Failed to parse binary blob from websocket, reason: ${e.message}`)}))}handleOnMessage(e){if(e.data&&e.data instanceof Blob)return void this.handleOnMessageBinary(e);let t;d.Info("received => \n"+JSON.stringify(JSON.parse(e.data),void 0,4));try{t=JSON.parse(e.data)}catch(t){return void(t instanceof Error?d.Error(`Error parsing message string ${e.data}.\n${t.message}`):d.Error("Unknown error while parsing message data in handleOnMessage"))}this.onMessage&&this.onMessage(t)}handleOnOpen(){d.Info("Connected to the signalling server via WebSocket"),this.emit("open")}handleOnError(){this.emit("error")}handleOnClose(e){d.Info("Disconnected to the signalling server via WebSocket: "+JSON.stringify(e.code)+" - "+e.reason),this.emit("close",e)}}function m(e,t,n){let s,r,i=n;for(let n of e.fields){let e=n.localName;if(n.oneof){const o=i[n.oneof];if(null==(null==o?void 0:o.oneofKind))continue;if(s=o[e],r=t[n.oneof],r.oneofKind=o.oneofKind,null==s){delete r[e];continue}}else if(s=i[e],r=t,null==s)continue;switch(n.repeat&&(r[e].length=s.length),n.kind){case"scalar":case"enum":if(n.repeat)for(let t=0;t<s.length;t++)r[e][t]=s[t];else r[e]=s;break;case"message":let t=n.T();if(n.repeat)for(let n=0;n<s.length;n++)r[e][n]=t.create(s[n]);else void 0===r[e]?r[e]=t.create(s):t.mergePartial(r[e],s);break;case"map":switch(n.V.kind){case"scalar":case"enum":Object.assign(r[e],s);break;case"message":let t=n.V.T();for(let n of Object.keys(s))r[e][n]=t.create(s[n])}}}}!function(e){e.symbol=Symbol.for("protobuf-ts/unknown"),e.onRead=(n,s,r,i,o)=>{(t(s)?s[e.symbol]:s[e.symbol]=[]).push({no:r,wireType:i,data:o})},e.onWrite=(t,n,s)=>{for(let{no:t,wireType:r,data:i}of e.list(n))s.tag(t,r).raw(i)},e.list=(n,s)=>{if(t(n)){let t=n[e.symbol];return s?t.filter((e=>e.no==s)):t}return[]},e.last=(t,n)=>e.list(t,n).slice(-1)[0];const t=t=>t&&Array.isArray(t[e.symbol])}(h||(h={})),function(e){e[e.Varint=0]="Varint",e[e.Bit64=1]="Bit64",e[e.LengthDelimited=2]="LengthDelimited",e[e.StartGroup=3]="StartGroup",e[e.EndGroup=4]="EndGroup",e[e.Bit32=5]="Bit32"}(c||(c={}));const p=Symbol.for("protobuf-ts/message-type");function f(e){let t=!1;const n=[];for(let s=0;s<e.length;s++){let r=e.charAt(s);"_"==r?t=!0:/\d/.test(r)?(n.push(r),t=!0):t?(n.push(r.toUpperCase()),t=!1):0==s?n.push(r.toLowerCase()):n.push(r)}return n.join("")}var y,v,w;function S(e){var t,n,s,r;return e.localName=null!==(t=e.localName)&&void 0!==t?t:f(e.name),e.jsonName=null!==(n=e.jsonName)&&void 0!==n?n:f(e.name),e.repeat=null!==(s=e.repeat)&&void 0!==s?s:w.NO,e.opt=null!==(r=e.opt)&&void 0!==r?r:!e.repeat&&!e.oneof&&"message"==e.kind,e}function b(e){if("object"!=typeof e||null===e||!e.hasOwnProperty("oneofKind"))return!1;switch(typeof e.oneofKind){case"string":return void 0!==e[e.oneofKind]&&2==Object.keys(e).length;case"undefined":return 1==Object.keys(e).length;default:return!1}}!function(e){e[e.DOUBLE=1]="DOUBLE",e[e.FLOAT=2]="FLOAT",e[e.INT64=3]="INT64",e[e.UINT64=4]="UINT64",e[e.INT32=5]="INT32",e[e.FIXED64=6]="FIXED64",e[e.FIXED32=7]="FIXED32",e[e.BOOL=8]="BOOL",e[e.STRING=9]="STRING",e[e.BYTES=12]="BYTES",e[e.UINT32=13]="UINT32",e[e.SFIXED32=15]="SFIXED32",e[e.SFIXED64=16]="SFIXED64",e[e.SINT32=17]="SINT32",e[e.SINT64=18]="SINT64"}(y||(y={})),function(e){e[e.BIGINT=0]="BIGINT",e[e.STRING=1]="STRING",e[e.NUMBER=2]="NUMBER"}(v||(v={})),function(e){e[e.NO=0]="NO",e[e.PACKED=1]="PACKED",e[e.UNPACKED=2]="UNPACKED"}(w||(w={}));class C{constructor(e){var t;this.fields=null!==(t=e.fields)&&void 0!==t?t:[]}prepare(){if(this.data)return;const e=[],t=[],n=[];for(let s of this.fields)if(s.oneof)n.includes(s.oneof)||(n.push(s.oneof),e.push(s.oneof),t.push(s.oneof));else switch(t.push(s.localName),s.kind){case"scalar":case"enum":s.opt&&!s.repeat||e.push(s.localName);break;case"message":s.repeat&&e.push(s.localName);break;case"map":e.push(s.localName)}this.data={req:e,known:t,oneofs:Object.values(n)}}is(e,t,n=!1){if(t<0)return!0;if(null==e||"object"!=typeof e)return!1;this.prepare();let s=Object.keys(e),r=this.data;if(s.length<r.req.length||r.req.some((e=>!s.includes(e))))return!1;if(!n&&s.some((e=>!r.known.includes(e))))return!1;if(t<1)return!0;for(const s of r.oneofs){const r=e[s];if(!b(r))return!1;if(void 0===r.oneofKind)continue;const i=this.fields.find((e=>e.localName===r.oneofKind));if(!i)return!1;if(!this.field(r[r.oneofKind],i,n,t))return!1}for(const s of this.fields)if(void 0===s.oneof&&!this.field(e[s.localName],s,n,t))return!1;return!0}field(e,t,n,s){let r=t.repeat;switch(t.kind){case"scalar":return void 0===e?t.opt:r?this.scalars(e,t.T,s,t.L):this.scalar(e,t.T,t.L);case"enum":return void 0===e?t.opt:r?this.scalars(e,y.INT32,s):this.scalar(e,y.INT32);case"message":return void 0===e||(r?this.messages(e,t.T(),n,s):this.message(e,t.T(),n,s));case"map":if("object"!=typeof e||null===e)return!1;if(s<2)return!0;if(!this.mapKeys(e,t.K,s))return!1;switch(t.V.kind){case"scalar":return this.scalars(Object.values(e),t.V.T,s,t.V.L);case"enum":return this.scalars(Object.values(e),y.INT32,s);case"message":return this.messages(Object.values(e),t.V.T(),n,s)}}return!0}message(e,t,n,s){return n?t.isAssignable(e,s):t.is(e,s)}messages(e,t,n,s){if(!Array.isArray(e))return!1;if(s<2)return!0;if(n){for(let n=0;n<e.length&&n<s;n++)if(!t.isAssignable(e[n],s-1))return!1}else for(let n=0;n<e.length&&n<s;n++)if(!t.is(e[n],s-1))return!1;return!0}scalar(e,t,n){let s=typeof e;switch(t){case y.UINT64:case y.FIXED64:case y.INT64:case y.SFIXED64:case y.SINT64:switch(n){case v.BIGINT:return"bigint"==s;case v.NUMBER:return"number"==s&&!isNaN(e);default:return"string"==s}case y.BOOL:return"boolean"==s;case y.STRING:return"string"==s;case y.BYTES:return e instanceof Uint8Array;case y.DOUBLE:case y.FLOAT:return"number"==s&&!isNaN(e);default:return"number"==s&&Number.isInteger(e)}}scalars(e,t,n,s){if(!Array.isArray(e))return!1;if(n<2)return!0;if(Array.isArray(e))for(let r=0;r<e.length&&r<n;r++)if(!this.scalar(e[r],t,s))return!1;return!0}mapKeys(e,t,n){let s=Object.keys(e);switch(t){case y.INT32:case y.FIXED32:case y.SFIXED32:case y.SINT32:case y.UINT32:return this.scalars(s.slice(0,n).map((e=>parseInt(e))),t,n);case y.BOOL:return this.scalars(s.slice(0,n).map((e=>"true"==e||"false"!=e&&e)),t,n);default:return this.scalars(s,t,n,v.STRING)}}}function T(e){let t=typeof e;if("object"==t){if(Array.isArray(e))return"array";if(null===e)return"null"}return t}let E="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""),M=[];for(let e=0;e<E.length;e++)M[E[e].charCodeAt(0)]=e;function k(){let e=0,t=0;for(let n=0;n<28;n+=7){let s=this.buf[this.pos++];if(e|=(127&s)<<n,!(128&s))return this.assertBounds(),[e,t]}let n=this.buf[this.pos++];if(e|=(15&n)<<28,t=(112&n)>>4,!(128&n))return this.assertBounds(),[e,t];for(let n=3;n<=31;n+=7){let s=this.buf[this.pos++];if(t|=(127&s)<<n,!(128&s))return this.assertBounds(),[e,t]}throw new Error("invalid varint")}function R(e,t,n){for(let s=0;s<28;s+=7){const r=e>>>s,i=!(r>>>7==0&&0==t),o=255&(i?128|r:r);if(n.push(o),!i)return}const s=e>>>28&15|(7&t)<<4,r=!!(t>>3);if(n.push(255&(r?128|s:s)),r){for(let e=3;e<31;e+=7){const s=t>>>e,r=!(s>>>7==0),i=255&(r?128|s:s);if(n.push(i),!r)return}n.push(t>>>31&1)}}M["-".charCodeAt(0)]=E.indexOf("+"),M["_".charCodeAt(0)]=E.indexOf("/");const P=4294967296;function I(e){let t="-"==e[0];t&&(e=e.slice(1));const n=1e6;let s=0,r=0;function i(t,i){const o=Number(e.slice(t,i));r*=n,s=s*n+o,s>=P&&(r+=s/P|0,s%=P)}return i(-24,-18),i(-18,-12),i(-12,-6),i(-6),[t,s,r]}function L(e,t){if(t>>>0<=2097151)return""+(P*t+(e>>>0));let n=(e>>>24|t<<8)>>>0&16777215,s=t>>16&65535,r=(16777215&e)+6777216*n+6710656*s,i=n+8147497*s,o=2*s,a=1e7;function l(e,t){let n=e?String(e):"";return t?"0000000".slice(n.length)+n:n}return r>=a&&(i+=Math.floor(r/a),r%=a),i>=a&&(o+=Math.floor(i/a),i%=a),l(o,0)+l(i,o)+l(r,1)}function x(e,t){if(e>=0){for(;e>127;)t.push(127&e|128),e>>>=7;t.push(e)}else{for(let n=0;n<9;n++)t.push(127&e|128),e>>=7;t.push(1)}}function F(){let e=this.buf[this.pos++],t=127&e;if(!(128&e))return this.assertBounds(),t;if(e=this.buf[this.pos++],t|=(127&e)<<7,!(128&e))return this.assertBounds(),t;if(e=this.buf[this.pos++],t|=(127&e)<<14,!(128&e))return this.assertBounds(),t;if(e=this.buf[this.pos++],t|=(127&e)<<21,!(128&e))return this.assertBounds(),t;e=this.buf[this.pos++],t|=(15&e)<<28;for(let t=5;128&e&&t<10;t++)e=this.buf[this.pos++];if(128&e)throw new Error("invalid varint");return this.assertBounds(),t>>>0}let O;function D(e){if(!e)throw new Error("BigInt unavailable, see https://github.com/timostamm/protobuf-ts/blob/v1.0.8/MANUAL.md#bigint-support")}!function(){const e=new DataView(new ArrayBuffer(8)),t=void 0!==globalThis.BigInt&&"function"==typeof e.getBigInt64&&"function"==typeof e.getBigUint64&&"function"==typeof e.setBigInt64&&"function"==typeof e.setBigUint64;O=t?{MIN:BigInt("-9223372036854775808"),MAX:BigInt("9223372036854775807"),UMIN:BigInt("0"),UMAX:BigInt("18446744073709551615"),C:BigInt,V:e}:void 0}();const N=/^-?[0-9]+$/,A=4294967296,B=2147483648;class U{constructor(e,t){this.lo=0|e,this.hi=0|t}isZero(){return 0==this.lo&&0==this.hi}toNumber(){let e=this.hi*A+(this.lo>>>0);if(!Number.isSafeInteger(e))throw new Error("cannot convert to safe number");return e}}class V extends U{static from(e){if(O)switch(typeof e){case"string":if("0"==e)return this.ZERO;if(""==e)throw new Error("string is no integer");e=O.C(e);case"number":if(0===e)return this.ZERO;e=O.C(e);case"bigint":if(!e)return this.ZERO;if(e<O.UMIN)throw new Error("signed value for ulong");if(e>O.UMAX)throw new Error("ulong too large");return O.V.setBigUint64(0,e,!0),new V(O.V.getInt32(0,!0),O.V.getInt32(4,!0))}else switch(typeof e){case"string":if("0"==e)return this.ZERO;if(e=e.trim(),!N.test(e))throw new Error("string is no integer");let[t,n,s]=I(e);if(t)throw new Error("signed value for ulong");return new V(n,s);case"number":if(0==e)return this.ZERO;if(!Number.isSafeInteger(e))throw new Error("number is no integer");if(e<0)throw new Error("signed value for ulong");return new V(e,e/A)}throw new Error("unknown value "+typeof e)}toString(){return O?this.toBigInt().toString():L(this.lo,this.hi)}toBigInt(){return D(O),O.V.setInt32(0,this.lo,!0),O.V.setInt32(4,this.hi,!0),O.V.getBigUint64(0,!0)}}V.ZERO=new V(0,0);class W extends U{static from(e){if(O)switch(typeof e){case"string":if("0"==e)return this.ZERO;if(""==e)throw new Error("string is no integer");e=O.C(e);case"number":if(0===e)return this.ZERO;e=O.C(e);case"bigint":if(!e)return this.ZERO;if(e<O.MIN)throw new Error("signed long too small");if(e>O.MAX)throw new Error("signed long too large");return O.V.setBigInt64(0,e,!0),new W(O.V.getInt32(0,!0),O.V.getInt32(4,!0))}else switch(typeof e){case"string":if("0"==e)return this.ZERO;if(e=e.trim(),!N.test(e))throw new Error("string is no integer");let[t,n,s]=I(e);if(t){if(s>B||s==B&&0!=n)throw new Error("signed long too small")}else if(s>=B)throw new Error("signed long too large");let r=new W(n,s);return t?r.negate():r;case"number":if(0==e)return this.ZERO;if(!Number.isSafeInteger(e))throw new Error("number is no integer");return e>0?new W(e,e/A):new W(-e,-e/A).negate()}throw new Error("unknown value "+typeof e)}isNegative(){return!!(this.hi&B)}negate(){let e=~this.hi,t=this.lo;return t?t=1+~t:e+=1,new W(t,e)}toString(){if(O)return this.toBigInt().toString();if(this.isNegative()){let e=this.negate();return"-"+L(e.lo,e.hi)}return L(this.lo,this.hi)}toBigInt(){return D(O),O.V.setInt32(0,this.lo,!0),O.V.setInt32(4,this.hi,!0),O.V.getBigInt64(0,!0)}}function _(e,t){if(!e)throw new Error(t)}function H(e){if("number"!=typeof e)throw new Error("invalid int 32: "+typeof e);if(!Number.isInteger(e)||e>2147483647||e<-2147483648)throw new Error("invalid int 32: "+e)}function $(e){if("number"!=typeof e)throw new Error("invalid uint 32: "+typeof e);if(!Number.isInteger(e)||e>4294967295||e<0)throw new Error("invalid uint 32: "+e)}function j(e){if("number"!=typeof e)throw new Error("invalid float 32: "+typeof e);if(Number.isFinite(e)&&(e>34028234663852886e22||e<-34028234663852886e22))throw new Error("invalid float 32: "+e)}function z(e,t){switch(t){case v.BIGINT:return e.toBigInt();case v.NUMBER:return e.toNumber();default:return e.toString()}}W.ZERO=new W(0,0);class K{constructor(e){this.info=e}prepare(){var e;if(void 0===this.fMap){this.fMap={};const t=null!==(e=this.info.fields)&&void 0!==e?e:[];for(const e of t)this.fMap[e.name]=e,this.fMap[e.jsonName]=e,this.fMap[e.localName]=e}}assert(e,t,n){if(!e){let e=T(n);throw"number"!=e&&"boolean"!=e||(e=n.toString()),new Error(`Cannot parse JSON ${e} for ${this.info.typeName}#${t}`)}}read(e,t,n){this.prepare();const s=[];for(const[i,o]of Object.entries(e)){const e=this.fMap[i];if(!e){if(!n.ignoreUnknownFields)throw new Error(`Found unknown field while reading ${this.info.typeName} from JSON format. JSON key: ${i}`);continue}const a=e.localName;let l;if(e.oneof){if(null===o&&("enum"!==e.kind||"google.protobuf.NullValue"!==e.T()[0]))continue;if(s.includes(e.oneof))throw new Error(`Multiple members of the oneof group "${e.oneof}" of ${this.info.typeName} are present in JSON.`);s.push(e.oneof),l=t[e.oneof]={oneofKind:a}}else l=t;if("map"==e.kind){if(null===o)continue;this.assert(null!==(r=o)&&"object"==typeof r&&!Array.isArray(r),e.name,o);const t=l[a];for(const[s,r]of Object.entries(o)){let i;switch(this.assert(null!==r,e.name+" map value",null),e.V.kind){case"message":i=e.V.T().internalJsonRead(r,n);break;case"enum":if(i=this.enum(e.V.T(),r,e.name,n.ignoreUnknownFields),!1===i)continue;break;case"scalar":i=this.scalar(r,e.V.T,e.V.L,e.name)}this.assert(void 0!==i,e.name+" map value",r);let o=s;e.K==y.BOOL&&(o="true"==o||"false"!=o&&o),o=this.scalar(o,e.K,v.STRING,e.name).toString(),t[o]=i}}else if(e.repeat){if(null===o)continue;this.assert(Array.isArray(o),e.name,o);const t=l[a];for(const s of o){let r;switch(this.assert(null!==s,e.name,null),e.kind){case"message":r=e.T().internalJsonRead(s,n);break;case"enum":if(r=this.enum(e.T(),s,e.name,n.ignoreUnknownFields),!1===r)continue;break;case"scalar":r=this.scalar(s,e.T,e.L,e.name)}this.assert(void 0!==r,e.name,o),t.push(r)}}else switch(e.kind){case"message":if(null===o&&"google.protobuf.Value"!=e.T().typeName){this.assert(void 0===e.oneof,e.name+" (oneof member)",null);continue}l[a]=e.T().internalJsonRead(o,n,l[a]);break;case"enum":let t=this.enum(e.T(),o,e.name,n.ignoreUnknownFields);if(!1===t)continue;l[a]=t;break;case"scalar":l[a]=this.scalar(o,e.T,e.L,e.name)}}var r}enum(e,t,n,s){if("google.protobuf.NullValue"==e[0]&&_(null===t||"NULL_VALUE"===t,`Unable to parse field ${this.info.typeName}#${n}, enum ${e[0]} only accepts null.`),null===t)return 0;switch(typeof t){case"number":return _(Number.isInteger(t),`Unable to parse field ${this.info.typeName}#${n}, enum can only be integral number, got ${t}.`),t;case"string":let r=t;e[2]&&t.substring(0,e[2].length)===e[2]&&(r=t.substring(e[2].length));let i=e[1][r];return(void 0!==i||!s)&&(_("number"==typeof i,`Unable to parse field ${this.info.typeName}#${n}, enum ${e[0]} has no value for "${t}".`),i)}_(!1,`Unable to parse field ${this.info.typeName}#${n}, cannot parse enum value from ${typeof t}".`)}scalar(e,t,n,s){let r;try{switch(t){case y.DOUBLE:case y.FLOAT:if(null===e)return 0;if("NaN"===e)return Number.NaN;if("Infinity"===e)return Number.POSITIVE_INFINITY;if("-Infinity"===e)return Number.NEGATIVE_INFINITY;if(""===e){r="empty string";break}if("string"==typeof e&&e.trim().length!==e.length){r="extra whitespace";break}if("string"!=typeof e&&"number"!=typeof e)break;let s=Number(e);if(Number.isNaN(s)){r="not a number";break}if(!Number.isFinite(s)){r="too large or small";break}return t==y.FLOAT&&j(s),s;case y.INT32:case y.FIXED32:case y.SFIXED32:case y.SINT32:case y.UINT32:if(null===e)return 0;let i;if("number"==typeof e?i=e:""===e?r="empty string":"string"==typeof e&&(e.trim().length!==e.length?r="extra whitespace":i=Number(e)),void 0===i)break;return t==y.UINT32?$(i):H(i),i;case y.INT64:case y.SFIXED64:case y.SINT64:if(null===e)return z(W.ZERO,n);if("number"!=typeof e&&"string"!=typeof e)break;return z(W.from(e),n);case y.FIXED64:case y.UINT64:if(null===e)return z(V.ZERO,n);if("number"!=typeof e&&"string"!=typeof e)break;return z(V.from(e),n);case y.BOOL:if(null===e)return!1;if("boolean"!=typeof e)break;return e;case y.STRING:if(null===e)return"";if("string"!=typeof e){r="extra whitespace";break}try{encodeURIComponent(e)}catch(r){r="invalid UTF8";break}return e;case y.BYTES:if(null===e||""===e)return new Uint8Array(0);if("string"!=typeof e)break;return function(e){let t=3*e.length/4;"="==e[e.length-2]?t-=2:"="==e[e.length-1]&&(t-=1);let n,s=new Uint8Array(t),r=0,i=0,o=0;for(let t=0;t<e.length;t++){if(n=M[e.charCodeAt(t)],void 0===n)switch(e[t]){case"=":i=0;case"\n":case"\r":case"\t":case" ":continue;default:throw Error("invalid base64 string.")}switch(i){case 0:o=n,i=1;break;case 1:s[r++]=o<<2|(48&n)>>4,o=n,i=2;break;case 2:s[r++]=(15&o)<<4|(60&n)>>2,o=n,i=3;break;case 3:s[r++]=(3&o)<<6|n,i=0}}if(1==i)throw Error("invalid base64 string.");return s.subarray(0,r)}(e)}}catch(e){r=e.message}this.assert(!1,s+(r?" - "+r:""),e)}}class G{constructor(e){var t;this.fields=null!==(t=e.fields)&&void 0!==t?t:[]}write(e,t){const n={},s=e;for(const e of this.fields){if(!e.oneof){let r=this.field(e,s[e.localName],t);void 0!==r&&(n[t.useProtoFieldName?e.name:e.jsonName]=r);continue}const r=s[e.oneof];if(r.oneofKind!==e.localName)continue;const i="scalar"==e.kind||"enum"==e.kind?Object.assign(Object.assign({},t),{emitDefaultValues:!0}):t;let o=this.field(e,r[e.localName],i);_(void 0!==o),n[t.useProtoFieldName?e.name:e.jsonName]=o}return n}field(e,t,n){let s;if("map"==e.kind){_("object"==typeof t&&null!==t);const r={};switch(e.V.kind){case"scalar":for(const[n,s]of Object.entries(t)){const t=this.scalar(e.V.T,s,e.name,!1,!0);_(void 0!==t),r[n.toString()]=t}break;case"message":const s=e.V.T();for(const[i,o]of Object.entries(t)){const t=this.message(s,o,e.name,n);_(void 0!==t),r[i.toString()]=t}break;case"enum":const i=e.V.T();for(const[s,o]of Object.entries(t)){_(void 0===o||"number"==typeof o);const t=this.enum(i,o,e.name,!1,!0,n.enumAsInteger);_(void 0!==t),r[s.toString()]=t}}(n.emitDefaultValues||Object.keys(r).length>0)&&(s=r)}else if(e.repeat){_(Array.isArray(t));const r=[];switch(e.kind){case"scalar":for(let n=0;n<t.length;n++){const s=this.scalar(e.T,t[n],e.name,e.opt,!0);_(void 0!==s),r.push(s)}break;case"enum":const s=e.T();for(let i=0;i<t.length;i++){_(void 0===t[i]||"number"==typeof t[i]);const o=this.enum(s,t[i],e.name,e.opt,!0,n.enumAsInteger);_(void 0!==o),r.push(o)}break;case"message":const i=e.T();for(let s=0;s<t.length;s++){const o=this.message(i,t[s],e.name,n);_(void 0!==o),r.push(o)}}(n.emitDefaultValues||r.length>0||n.emitDefaultValues)&&(s=r)}else switch(e.kind){case"scalar":s=this.scalar(e.T,t,e.name,e.opt,n.emitDefaultValues);break;case"enum":s=this.enum(e.T(),t,e.name,e.opt,n.emitDefaultValues,n.enumAsInteger);break;case"message":s=this.message(e.T(),t,e.name,n)}return s}enum(e,t,n,s,r,i){if("google.protobuf.NullValue"==e[0])return r||s?null:void 0;if(void 0!==t){if(0!==t||r||s)return _("number"==typeof t),_(Number.isInteger(t)),i||!e[1].hasOwnProperty(t)?t:e[2]?e[2]+e[1][t]:e[1][t]}else _(s)}message(e,t,n,s){return void 0===t?s.emitDefaultValues?null:void 0:e.internalJsonWrite(t,s)}scalar(e,t,n,s,r){if(void 0===t)return void _(s);const i=r||s;switch(e){case y.INT32:case y.SFIXED32:case y.SINT32:return 0===t?i?0:void 0:(H(t),t);case y.FIXED32:case y.UINT32:return 0===t?i?0:void 0:($(t),t);case y.FLOAT:j(t);case y.DOUBLE:return 0===t?i?0:void 0:(_("number"==typeof t),Number.isNaN(t)?"NaN":t===Number.POSITIVE_INFINITY?"Infinity":t===Number.NEGATIVE_INFINITY?"-Infinity":t);case y.STRING:return""===t?i?"":void 0:(_("string"==typeof t),t);case y.BOOL:return!1===t?!i&&void 0:(_("boolean"==typeof t),t);case y.UINT64:case y.FIXED64:_("number"==typeof t||"string"==typeof t||"bigint"==typeof t);let e=V.from(t);if(e.isZero()&&!i)return;return e.toString();case y.INT64:case y.SFIXED64:case y.SINT64:_("number"==typeof t||"string"==typeof t||"bigint"==typeof t);let n=W.from(t);if(n.isZero()&&!i)return;return n.toString();case y.BYTES:return _(t instanceof Uint8Array),t.byteLength?function(e){let t,n="",s=0,r=0;for(let i=0;i<e.length;i++)switch(t=e[i],s){case 0:n+=E[t>>2],r=(3&t)<<4,s=1;break;case 1:n+=E[r|t>>4],r=(15&t)<<2,s=2;break;case 2:n+=E[r|t>>6],n+=E[63&t],s=0}return s&&(n+=E[r],n+="=",1==s&&(n+="=")),n}(t):i?"":void 0}}}function X(e,t=v.STRING){switch(e){case y.BOOL:return!1;case y.UINT64:case y.FIXED64:return z(V.ZERO,t);case y.INT64:case y.SFIXED64:case y.SINT64:return z(W.ZERO,t);case y.DOUBLE:case y.FLOAT:return 0;case y.BYTES:return new Uint8Array(0);case y.STRING:return"";default:return 0}}class q{constructor(e){this.info=e}prepare(){var e;if(!this.fieldNoToField){const t=null!==(e=this.info.fields)&&void 0!==e?e:[];this.fieldNoToField=new Map(t.map((e=>[e.no,e])))}}read(e,t,n,s){this.prepare();const r=void 0===s?e.len:e.pos+s;for(;e.pos<r;){const[s,r]=e.tag(),i=this.fieldNoToField.get(s);if(!i){let i=n.readUnknownField;if("throw"==i)throw new Error(`Unknown field ${s} (wire type ${r}) for ${this.info.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?h.onRead:i)(this.info.typeName,t,s,r,o);continue}let o=t,a=i.repeat,l=i.localName;switch(i.oneof&&(o=o[i.oneof],o.oneofKind!==l&&(o=t[i.oneof]={oneofKind:l})),i.kind){case"scalar":case"enum":let t="enum"==i.kind?y.INT32:i.T,s="scalar"==i.kind?i.L:void 0;if(a){let n=o[l];if(r==c.LengthDelimited&&t!=y.STRING&&t!=y.BYTES){let r=e.uint32()+e.pos;for(;e.pos<r;)n.push(this.scalar(e,t,s))}else n.push(this.scalar(e,t,s))}else o[l]=this.scalar(e,t,s);break;case"message":if(a){let t=o[l],s=i.T().internalBinaryRead(e,e.uint32(),n);t.push(s)}else o[l]=i.T().internalBinaryRead(e,e.uint32(),n,o[l]);break;case"map":let[d,h]=this.mapEntry(i,e,n);o[l][d]=h}}}mapEntry(e,t,n){let s,r,i=t.uint32(),o=t.pos+i;for(;t.pos<o;){let[i,o]=t.tag();switch(i){case 1:s=e.K==y.BOOL?t.bool().toString():this.scalar(t,e.K,v.STRING);break;case 2:switch(e.V.kind){case"scalar":r=this.scalar(t,e.V.T,e.V.L);break;case"enum":r=t.int32();break;case"message":r=e.V.T().internalBinaryRead(t,t.uint32(),n)}break;default:throw new Error(`Unknown field ${i} (wire type ${o}) in map entry for ${this.info.typeName}#${e.name}`)}}if(void 0===s){let t=X(e.K);s=e.K==y.BOOL?t.toString():t}if(void 0===r)switch(e.V.kind){case"scalar":r=X(e.V.T,e.V.L);break;case"enum":r=0;break;case"message":r=e.V.T().create()}return[s,r]}scalar(e,t,n){switch(t){case y.INT32:return e.int32();case y.STRING:return e.string();case y.BOOL:return e.bool();case y.DOUBLE:return e.double();case y.FLOAT:return e.float();case y.INT64:return z(e.int64(),n);case y.UINT64:return z(e.uint64(),n);case y.FIXED64:return z(e.fixed64(),n);case y.FIXED32:return e.fixed32();case y.BYTES:return e.bytes();case y.UINT32:return e.uint32();case y.SFIXED32:return e.sfixed32();case y.SFIXED64:return z(e.sfixed64(),n);case y.SINT32:return e.sint32();case y.SINT64:return z(e.sint64(),n)}}}class Q{constructor(e){this.info=e}prepare(){if(!this.fields){const e=this.info.fields?this.info.fields.concat():[];this.fields=e.sort(((e,t)=>e.no-t.no))}}write(e,t,n){this.prepare();for(const s of this.fields){let r,i,o=s.repeat,a=s.localName;if(s.oneof){const t=e[s.oneof];if(t.oneofKind!==a)continue;r=t[a],i=!0}else r=e[a],i=!1;switch(s.kind){case"scalar":case"enum":let e="enum"==s.kind?y.INT32:s.T;if(o)if(_(Array.isArray(r)),o==w.PACKED)this.packed(t,e,s.no,r);else for(const n of r)this.scalar(t,e,s.no,n,!0);else void 0===r?_(s.opt):this.scalar(t,e,s.no,r,i||s.opt);break;case"message":if(o){_(Array.isArray(r));for(const e of r)this.message(t,n,s.T(),s.no,e)}else this.message(t,n,s.T(),s.no,r);break;case"map":_("object"==typeof r&&null!==r);for(const[e,i]of Object.entries(r))this.mapEntry(t,n,s,e,i)}}let s=n.writeUnknownFields;!1!==s&&(!0===s?h.onWrite:s)(this.info.typeName,e,t)}mapEntry(e,t,n,s,r){e.tag(n.no,c.LengthDelimited),e.fork();let i=s;switch(n.K){case y.INT32:case y.FIXED32:case y.UINT32:case y.SFIXED32:case y.SINT32:i=Number.parseInt(s);break;case y.BOOL:_("true"==s||"false"==s),i="true"==s}switch(this.scalar(e,n.K,1,i,!0),n.V.kind){case"scalar":this.scalar(e,n.V.T,2,r,!0);break;case"enum":this.scalar(e,y.INT32,2,r,!0);break;case"message":this.message(e,t,n.V.T(),2,r)}e.join()}message(e,t,n,s,r){void 0!==r&&(n.internalBinaryWrite(r,e.tag(s,c.LengthDelimited).fork(),t),e.join())}scalar(e,t,n,s,r){let[i,o,a]=this.scalarInfo(t,s);a&&!r||(e.tag(n,i),e[o](s))}packed(e,t,n,s){if(!s.length)return;_(t!==y.BYTES&&t!==y.STRING),e.tag(n,c.LengthDelimited),e.fork();let[,r]=this.scalarInfo(t);for(let t=0;t<s.length;t++)e[r](s[t]);e.join()}scalarInfo(e,t){let n,s=c.Varint,r=void 0===t,i=0===t;switch(e){case y.INT32:n="int32";break;case y.STRING:i=r||!t.length,s=c.LengthDelimited,n="string";break;case y.BOOL:i=!1===t,n="bool";break;case y.UINT32:n="uint32";break;case y.DOUBLE:s=c.Bit64,n="double";break;case y.FLOAT:s=c.Bit32,n="float";break;case y.INT64:i=r||W.from(t).isZero(),n="int64";break;case y.UINT64:i=r||V.from(t).isZero(),n="uint64";break;case y.FIXED64:i=r||V.from(t).isZero(),s=c.Bit64,n="fixed64";break;case y.BYTES:i=r||!t.byteLength,s=c.LengthDelimited,n="bytes";break;case y.FIXED32:s=c.Bit32,n="fixed32";break;case y.SFIXED32:s=c.Bit32,n="sfixed32";break;case y.SFIXED64:i=r||W.from(t).isZero(),s=c.Bit64,n="sfixed64";break;case y.SINT32:n="sint32";break;case y.SINT64:i=r||W.from(t).isZero(),n="sint64"}return[s,n,r||i]}}const J={emitDefaultValues:!1,enumAsInteger:!1,useProtoFieldName:!1,prettySpaces:0},Y={ignoreUnknownFields:!1},Z=Object.values;function ee(e,t,n){if(t===n)return!0;if(e!==y.BYTES)return!1;let s=t,r=n;if(s.length!==r.length)return!1;for(let e=0;e<s.length;e++)if(s[e]!=r[e])return!1;return!0}function te(e,t,n){if(t.length!==n.length)return!1;for(let s=0;s<t.length;s++)if(!ee(e,t[s],n[s]))return!1;return!0}function ne(e,t,n){if(t.length!==n.length)return!1;for(let s=0;s<t.length;s++)if(!e.equals(t[s],n[s]))return!1;return!0}const se={writeUnknownFields:!0,writerFactory:()=>new re};class re{constructor(e){this.stack=[],this.textEncoder=null!=e?e:new TextEncoder,this.chunks=[],this.buf=[]}finish(){this.chunks.push(new Uint8Array(this.buf));let e=0;for(let t=0;t<this.chunks.length;t++)e+=this.chunks[t].length;let t=new Uint8Array(e),n=0;for(let e=0;e<this.chunks.length;e++)t.set(this.chunks[e],n),n+=this.chunks[e].length;return this.chunks=[],t}fork(){return this.stack.push({chunks:this.chunks,buf:this.buf}),this.chunks=[],this.buf=[],this}join(){let e=this.finish(),t=this.stack.pop();if(!t)throw new Error("invalid state, fork stack empty");return this.chunks=t.chunks,this.buf=t.buf,this.uint32(e.byteLength),this.raw(e)}tag(e,t){return this.uint32((e<<3|t)>>>0)}raw(e){return this.buf.length&&(this.chunks.push(new Uint8Array(this.buf)),this.buf=[]),this.chunks.push(e),this}uint32(e){for($(e);e>127;)this.buf.push(127&e|128),e>>>=7;return this.buf.push(e),this}int32(e){return H(e),x(e,this.buf),this}bool(e){return this.buf.push(e?1:0),this}bytes(e){return this.uint32(e.byteLength),this.raw(e)}string(e){let t=this.textEncoder.encode(e);return this.uint32(t.byteLength),this.raw(t)}float(e){j(e);let t=new Uint8Array(4);return new DataView(t.buffer).setFloat32(0,e,!0),this.raw(t)}double(e){let t=new Uint8Array(8);return new DataView(t.buffer).setFloat64(0,e,!0),this.raw(t)}fixed32(e){$(e);let t=new Uint8Array(4);return new DataView(t.buffer).setUint32(0,e,!0),this.raw(t)}sfixed32(e){H(e);let t=new Uint8Array(4);return new DataView(t.buffer).setInt32(0,e,!0),this.raw(t)}sint32(e){return H(e),x(e=(e<<1^e>>31)>>>0,this.buf),this}sfixed64(e){let t=new Uint8Array(8),n=new DataView(t.buffer),s=W.from(e);return n.setInt32(0,s.lo,!0),n.setInt32(4,s.hi,!0),this.raw(t)}fixed64(e){let t=new Uint8Array(8),n=new DataView(t.buffer),s=V.from(e);return n.setInt32(0,s.lo,!0),n.setInt32(4,s.hi,!0),this.raw(t)}int64(e){let t=W.from(e);return R(t.lo,t.hi,this.buf),this}sint64(e){let t=W.from(e),n=t.hi>>31;return R(t.lo<<1^n,(t.hi<<1|t.lo>>>31)^n,this.buf),this}uint64(e){let t=V.from(e);return R(t.lo,t.hi,this.buf),this}}const ie={readUnknownField:!0,readerFactory:e=>new oe(e)};class oe{constructor(e,t){this.varint64=k,this.uint32=F,this.buf=e,this.len=e.length,this.pos=0,this.view=new DataView(e.buffer,e.byteOffset,e.byteLength),this.textDecoder=null!=t?t:new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0})}tag(){let e=this.uint32(),t=e>>>3,n=7&e;if(t<=0||n<0||n>5)throw new Error("illegal tag: field no "+t+" wire type "+n);return[t,n]}skip(e){let t=this.pos;switch(e){case c.Varint:for(;128&this.buf[this.pos++];);break;case c.Bit64:this.pos+=4;case c.Bit32:this.pos+=4;break;case c.LengthDelimited:let t=this.uint32();this.pos+=t;break;case c.StartGroup:let n;for(;(n=this.tag()[1])!==c.EndGroup;)this.skip(n);break;default:throw new Error("cant skip wire type "+e)}return this.assertBounds(),this.buf.subarray(t,this.pos)}assertBounds(){if(this.pos>this.len)throw new RangeError("premature EOF")}int32(){return 0|this.uint32()}sint32(){let e=this.uint32();return e>>>1^-(1&e)}int64(){return new W(...this.varint64())}uint64(){return new V(...this.varint64())}sint64(){let[e,t]=this.varint64(),n=-(1&e);return e=(e>>>1|(1&t)<<31)^n,t=t>>>1^n,new W(e,t)}bool(){let[e,t]=this.varint64();return 0!==e||0!==t}fixed32(){return this.view.getUint32((this.pos+=4)-4,!0)}sfixed32(){return this.view.getInt32((this.pos+=4)-4,!0)}fixed64(){return new V(this.sfixed32(),this.sfixed32())}sfixed64(){return new W(this.sfixed32(),this.sfixed32())}float(){return this.view.getFloat32((this.pos+=4)-4,!0)}double(){return this.view.getFloat64((this.pos+=8)-8,!0)}bytes(){let e=this.uint32(),t=this.pos;return this.pos+=e,this.assertBounds(),this.buf.subarray(t,t+e)}string(){return this.textDecoder.decode(this.bytes())}}const ae=Object.getOwnPropertyDescriptors(Object.getPrototypeOf({}));class le{constructor(e,t,n){this.defaultCheckDepth=16,this.typeName=e,this.fields=t.map(S),this.options=null!=n?n:{},this.messagePrototype=Object.create(null,Object.assign(Object.assign({},ae),{[p]:{value:this}})),this.refTypeCheck=new C(this),this.refJsonReader=new K(this),this.refJsonWriter=new G(this),this.refBinReader=new q(this),this.refBinWriter=new Q(this)}create(e){let t=function(e){const t=e.messagePrototype?Object.create(e.messagePrototype):Object.defineProperty({},p,{value:e});for(let n of e.fields){let e=n.localName;if(!n.opt)if(n.oneof)t[n.oneof]={oneofKind:void 0};else if(n.repeat)t[e]=[];else switch(n.kind){case"scalar":t[e]=X(n.T,n.L);break;case"enum":t[e]=0;break;case"map":t[e]={}}}return t}(this);return void 0!==e&&m(this,t,e),t}clone(e){let t=this.create();return m(this,t,e),t}equals(e,t){return function(e,t,n){if(t===n)return!0;if(!t||!n)return!1;for(let s of e.fields){let e=s.localName,r=s.oneof?t[s.oneof][e]:t[e],i=s.oneof?n[s.oneof][e]:n[e];switch(s.kind){case"enum":case"scalar":let e="enum"==s.kind?y.INT32:s.T;if(!(s.repeat?te(e,r,i):ee(e,r,i)))return!1;break;case"map":if(!("message"==s.V.kind?ne(s.V.T(),Z(r),Z(i)):te("enum"==s.V.kind?y.INT32:s.V.T,Z(r),Z(i))))return!1;break;case"message":let t=s.T();if(!(s.repeat?ne(t,r,i):t.equals(r,i)))return!1}}return!0}(this,e,t)}is(e,t=this.defaultCheckDepth){return this.refTypeCheck.is(e,t,!1)}isAssignable(e,t=this.defaultCheckDepth){return this.refTypeCheck.is(e,t,!0)}mergePartial(e,t){m(this,e,t)}fromBinary(e,t){let n=function(e){return e?Object.assign(Object.assign({},ie),e):ie}(t);return this.internalBinaryRead(n.readerFactory(e),e.byteLength,n)}fromJson(e,t){return this.internalJsonRead(e,function(e){return e?Object.assign(Object.assign({},Y),e):Y}(t))}fromJsonString(e,t){let n=JSON.parse(e);return this.fromJson(n,t)}toJson(e,t){return this.internalJsonWrite(e,function(e){return e?Object.assign(Object.assign({},J),e):J}(t))}toJsonString(e,t){var n;let s=this.toJson(e,t);return JSON.stringify(s,null,null!==(n=null==t?void 0:t.prettySpaces)&&void 0!==n?n:0)}toBinary(e,t){let n=function(e){return e?Object.assign(Object.assign({},se),e):se}(t);return this.internalBinaryWrite(e,n.writerFactory(),n).finish()}internalJsonRead(e,t,n){if(null!==e&&"object"==typeof e&&!Array.isArray(e)){let s=null!=n?n:this.create();return this.refJsonReader.read(e,s,t),s}throw new Error(`Unable to parse message ${this.typeName} from JSON ${T(e)}.`)}internalJsonWrite(e,t){return this.refJsonWriter.write(e,t)}internalBinaryWrite(e,t,n){return this.refBinWriter.write(e,t,n),t}internalBinaryRead(e,t,n,s){let r=null!=s?s:this.create();return this.refBinReader.read(e,r,n,t),r}}const de=new class extends le{constructor(){super("base_message",[{no:1,name:"type",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",void 0!==e&&m(this,t,e),t}internalBinaryRead(e,t,n,s){let r=null!=s?s:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,s]=e.tag();if(1===t)r.type=e.string();else{let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${s}) for ${this.typeName}`);let o=e.skip(s);!1!==i&&(!0===i?h.onRead:i)(this.typeName,r,t,s,o)}}return r}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,c.LengthDelimited).string(e.type);let s=n.writeUnknownFields;return!1!==s&&(1==s?h.onWrite:s)(this.typeName,e,t),t}},he=new class extends le{constructor(){super("peerConnectionOptions",[])}create(e){const t=globalThis.Object.create(this.messagePrototype);return void 0!==e&&m(this,t,e),t}internalBinaryRead(e,t,n,s){return null!=s?s:this.create()}internalBinaryWrite(e,t,n){let s=n.writeUnknownFields;return!1!==s&&(1==s?h.onWrite:s)(this.typeName,e,t),t}},ce=new class extends le{constructor(){super("config",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"peerConnectionOptions",kind:"message",T:()=>he},{no:3,name:"protocolVersion",kind:"scalar",opt:!0,T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",void 0!==e&&m(this,t,e),t}internalBinaryRead(e,t,n,s){let r=null!=s?s:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,s]=e.tag();switch(t){case 1:r.type=e.string();break;case 2:r.peerConnectionOptions=he.internalBinaryRead(e,e.uint32(),n,r.peerConnectionOptions);break;case 3:r.protocolVersion=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${s}) for ${this.typeName}`);let o=e.skip(s);!1!==i&&(!0===i?h.onRead:i)(this.typeName,r,t,s,o)}}return r}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,c.LengthDelimited).string(e.type),e.peerConnectionOptions&&he.internalBinaryWrite(e.peerConnectionOptions,t.tag(2,c.LengthDelimited).fork(),n).join(),void 0!==e.protocolVersion&&t.tag(3,c.LengthDelimited).string(e.protocolVersion);let s=n.writeUnknownFields;return!1!==s&&(1==s?h.onWrite:s)(this.typeName,e,t),t}},ue=new class extends le{constructor(){super("identify",[{no:1,name:"type",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",void 0!==e&&m(this,t,e),t}internalBinaryRead(e,t,n,s){let r=null!=s?s:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,s]=e.tag();if(1===t)r.type=e.string();else{let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${s}) for ${this.typeName}`);let o=e.skip(s);!1!==i&&(!0===i?h.onRead:i)(this.typeName,r,t,s,o)}}return r}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,c.LengthDelimited).string(e.type);let s=n.writeUnknownFields;return!1!==s&&(1==s?h.onWrite:s)(this.typeName,e,t),t}},ge=new class extends le{constructor(){super("endpointId",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"id",kind:"scalar",T:9},{no:3,name:"protocolVersion",kind:"scalar",opt:!0,T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.id="",void 0!==e&&m(this,t,e),t}internalBinaryRead(e,t,n,s){let r=null!=s?s:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,s]=e.tag();switch(t){case 1:r.type=e.string();break;case 2:r.id=e.string();break;case 3:r.protocolVersion=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${s}) for ${this.typeName}`);let o=e.skip(s);!1!==i&&(!0===i?h.onRead:i)(this.typeName,r,t,s,o)}}return r}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,c.LengthDelimited).string(e.type),""!==e.id&&t.tag(2,c.LengthDelimited).string(e.id),void 0!==e.protocolVersion&&t.tag(3,c.LengthDelimited).string(e.protocolVersion);let s=n.writeUnknownFields;return!1!==s&&(1==s?h.onWrite:s)(this.typeName,e,t),t}},me=new class extends le{constructor(){super("endpointIdConfirm",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"committedId",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.committedId="",void 0!==e&&m(this,t,e),t}internalBinaryRead(e,t,n,s){let r=null!=s?s:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,s]=e.tag();switch(t){case 1:r.type=e.string();break;case 2:r.committedId=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${s}) for ${this.typeName}`);let o=e.skip(s);!1!==i&&(!0===i?h.onRead:i)(this.typeName,r,t,s,o)}}return r}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,c.LengthDelimited).string(e.type),""!==e.committedId&&t.tag(2,c.LengthDelimited).string(e.committedId);let s=n.writeUnknownFields;return!1!==s&&(1==s?h.onWrite:s)(this.typeName,e,t),t}},pe=new class extends le{constructor(){super("streamerIdChanged",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"newID",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.newID="",void 0!==e&&m(this,t,e),t}internalBinaryRead(e,t,n,s){let r=null!=s?s:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,s]=e.tag();switch(t){case 1:r.type=e.string();break;case 2:r.newID=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${s}) for ${this.typeName}`);let o=e.skip(s);!1!==i&&(!0===i?h.onRead:i)(this.typeName,r,t,s,o)}}return r}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,c.LengthDelimited).string(e.type),""!==e.newID&&t.tag(2,c.LengthDelimited).string(e.newID);let s=n.writeUnknownFields;return!1!==s&&(1==s?h.onWrite:s)(this.typeName,e,t),t}},fe=new class extends le{constructor(){super("listStreamers",[{no:1,name:"type",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",void 0!==e&&m(this,t,e),t}internalBinaryRead(e,t,n,s){let r=null!=s?s:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,s]=e.tag();if(1===t)r.type=e.string();else{let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${s}) for ${this.typeName}`);let o=e.skip(s);!1!==i&&(!0===i?h.onRead:i)(this.typeName,r,t,s,o)}}return r}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,c.LengthDelimited).string(e.type);let s=n.writeUnknownFields;return!1!==s&&(1==s?h.onWrite:s)(this.typeName,e,t),t}},ye=new class extends le{constructor(){super("streamerList",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"ids",kind:"scalar",repeat:2,T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.ids=[],void 0!==e&&m(this,t,e),t}internalBinaryRead(e,t,n,s){let r=null!=s?s:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,s]=e.tag();switch(t){case 1:r.type=e.string();break;case 2:r.ids.push(e.string());break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${s}) for ${this.typeName}`);let o=e.skip(s);!1!==i&&(!0===i?h.onRead:i)(this.typeName,r,t,s,o)}}return r}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,c.LengthDelimited).string(e.type);for(let n=0;n<e.ids.length;n++)t.tag(2,c.LengthDelimited).string(e.ids[n]);let s=n.writeUnknownFields;return!1!==s&&(1==s?h.onWrite:s)(this.typeName,e,t),t}},ve=new class extends le{constructor(){super("subscribe",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"streamerId",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.streamerId="",void 0!==e&&m(this,t,e),t}internalBinaryRead(e,t,n,s){let r=null!=s?s:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,s]=e.tag();switch(t){case 1:r.type=e.string();break;case 2:r.streamerId=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${s}) for ${this.typeName}`);let o=e.skip(s);!1!==i&&(!0===i?h.onRead:i)(this.typeName,r,t,s,o)}}return r}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,c.LengthDelimited).string(e.type),""!==e.streamerId&&t.tag(2,c.LengthDelimited).string(e.streamerId);let s=n.writeUnknownFields;return!1!==s&&(1==s?h.onWrite:s)(this.typeName,e,t),t}},we=new class extends le{constructor(){super("unsubscribe",[{no:1,name:"type",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",void 0!==e&&m(this,t,e),t}internalBinaryRead(e,t,n,s){let r=null!=s?s:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,s]=e.tag();if(1===t)r.type=e.string();else{let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${s}) for ${this.typeName}`);let o=e.skip(s);!1!==i&&(!0===i?h.onRead:i)(this.typeName,r,t,s,o)}}return r}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,c.LengthDelimited).string(e.type);let s=n.writeUnknownFields;return!1!==s&&(1==s?h.onWrite:s)(this.typeName,e,t),t}},Se=new class extends le{constructor(){super("playerConnected",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"dataChannel",kind:"scalar",T:8},{no:3,name:"sfu",kind:"scalar",T:8},{no:5,name:"playerId",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.dataChannel=!1,t.sfu=!1,t.playerId="",void 0!==e&&m(this,t,e),t}internalBinaryRead(e,t,n,s){let r=null!=s?s:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,s]=e.tag();switch(t){case 1:r.type=e.string();break;case 2:r.dataChannel=e.bool();break;case 3:r.sfu=e.bool();break;case 5:r.playerId=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${s}) for ${this.typeName}`);let o=e.skip(s);!1!==i&&(!0===i?h.onRead:i)(this.typeName,r,t,s,o)}}return r}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,c.LengthDelimited).string(e.type),!1!==e.dataChannel&&t.tag(2,c.Varint).bool(e.dataChannel),!1!==e.sfu&&t.tag(3,c.Varint).bool(e.sfu),""!==e.playerId&&t.tag(5,c.LengthDelimited).string(e.playerId);let s=n.writeUnknownFields;return!1!==s&&(1==s?h.onWrite:s)(this.typeName,e,t),t}},be=new class extends le{constructor(){super("playerDisconnected",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"playerId",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.playerId="",void 0!==e&&m(this,t,e),t}internalBinaryRead(e,t,n,s){let r=null!=s?s:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,s]=e.tag();switch(t){case 1:r.type=e.string();break;case 2:r.playerId=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${s}) for ${this.typeName}`);let o=e.skip(s);!1!==i&&(!0===i?h.onRead:i)(this.typeName,r,t,s,o)}}return r}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,c.LengthDelimited).string(e.type),""!==e.playerId&&t.tag(2,c.LengthDelimited).string(e.playerId);let s=n.writeUnknownFields;return!1!==s&&(1==s?h.onWrite:s)(this.typeName,e,t),t}},Ce=new class extends le{constructor(){super("offer",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"sdp",kind:"scalar",T:9},{no:3,name:"playerId",kind:"scalar",opt:!0,T:9},{no:4,name:"sfu",kind:"scalar",opt:!0,T:8},{no:5,name:"multiplex",kind:"scalar",opt:!0,T:8}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.sdp="",void 0!==e&&m(this,t,e),t}internalBinaryRead(e,t,n,s){let r=null!=s?s:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,s]=e.tag();switch(t){case 1:r.type=e.string();break;case 2:r.sdp=e.string();break;case 3:r.playerId=e.string();break;case 4:r.sfu=e.bool();break;case 5:r.multiplex=e.bool();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${s}) for ${this.typeName}`);let o=e.skip(s);!1!==i&&(!0===i?h.onRead:i)(this.typeName,r,t,s,o)}}return r}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,c.LengthDelimited).string(e.type),""!==e.sdp&&t.tag(2,c.LengthDelimited).string(e.sdp),void 0!==e.playerId&&t.tag(3,c.LengthDelimited).string(e.playerId),void 0!==e.sfu&&t.tag(4,c.Varint).bool(e.sfu),void 0!==e.multiplex&&t.tag(5,c.Varint).bool(e.multiplex);let s=n.writeUnknownFields;return!1!==s&&(1==s?h.onWrite:s)(this.typeName,e,t),t}},Te=new class extends le{constructor(){super("answer",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"sdp",kind:"scalar",T:9},{no:3,name:"playerId",kind:"scalar",opt:!0,T:9},{no:4,name:"minBitrateBps",kind:"scalar",opt:!0,T:5},{no:5,name:"maxBitrateBps",kind:"scalar",opt:!0,T:5}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.sdp="",void 0!==e&&m(this,t,e),t}internalBinaryRead(e,t,n,s){let r=null!=s?s:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,s]=e.tag();switch(t){case 1:r.type=e.string();break;case 2:r.sdp=e.string();break;case 3:r.playerId=e.string();break;case 4:r.minBitrateBps=e.int32();break;case 5:r.maxBitrateBps=e.int32();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${s}) for ${this.typeName}`);let o=e.skip(s);!1!==i&&(!0===i?h.onRead:i)(this.typeName,r,t,s,o)}}return r}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,c.LengthDelimited).string(e.type),""!==e.sdp&&t.tag(2,c.LengthDelimited).string(e.sdp),void 0!==e.playerId&&t.tag(3,c.LengthDelimited).string(e.playerId),void 0!==e.minBitrateBps&&t.tag(4,c.Varint).int32(e.minBitrateBps),void 0!==e.maxBitrateBps&&t.tag(5,c.Varint).int32(e.maxBitrateBps);let s=n.writeUnknownFields;return!1!==s&&(1==s?h.onWrite:s)(this.typeName,e,t),t}},Ee=new class extends le{constructor(){super("iceCandidateData",[{no:1,name:"candidate",kind:"scalar",T:9},{no:2,name:"sdpMid",kind:"scalar",T:9},{no:3,name:"sdpMLineIndex",kind:"scalar",T:5},{no:4,name:"usernameFragment",kind:"scalar",opt:!0,T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.candidate="",t.sdpMid="",t.sdpMLineIndex=0,void 0!==e&&m(this,t,e),t}internalBinaryRead(e,t,n,s){let r=null!=s?s:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,s]=e.tag();switch(t){case 1:r.candidate=e.string();break;case 2:r.sdpMid=e.string();break;case 3:r.sdpMLineIndex=e.int32();break;case 4:r.usernameFragment=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${s}) for ${this.typeName}`);let o=e.skip(s);!1!==i&&(!0===i?h.onRead:i)(this.typeName,r,t,s,o)}}return r}internalBinaryWrite(e,t,n){""!==e.candidate&&t.tag(1,c.LengthDelimited).string(e.candidate),""!==e.sdpMid&&t.tag(2,c.LengthDelimited).string(e.sdpMid),0!==e.sdpMLineIndex&&t.tag(3,c.Varint).int32(e.sdpMLineIndex),void 0!==e.usernameFragment&&t.tag(4,c.LengthDelimited).string(e.usernameFragment);let s=n.writeUnknownFields;return!1!==s&&(1==s?h.onWrite:s)(this.typeName,e,t),t}},Me=new class extends le{constructor(){super("iceCandidate",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"candidate",kind:"message",T:()=>Ee},{no:3,name:"playerId",kind:"scalar",opt:!0,T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",void 0!==e&&m(this,t,e),t}internalBinaryRead(e,t,n,s){let r=null!=s?s:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,s]=e.tag();switch(t){case 1:r.type=e.string();break;case 2:r.candidate=Ee.internalBinaryRead(e,e.uint32(),n,r.candidate);break;case 3:r.playerId=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${s}) for ${this.typeName}`);let o=e.skip(s);!1!==i&&(!0===i?h.onRead:i)(this.typeName,r,t,s,o)}}return r}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,c.LengthDelimited).string(e.type),e.candidate&&Ee.internalBinaryWrite(e.candidate,t.tag(2,c.LengthDelimited).fork(),n).join(),void 0!==e.playerId&&t.tag(3,c.LengthDelimited).string(e.playerId);let s=n.writeUnknownFields;return!1!==s&&(1==s?h.onWrite:s)(this.typeName,e,t),t}},ke=new class extends le{constructor(){super("disconnectPlayer",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"playerId",kind:"scalar",T:9},{no:3,name:"reason",kind:"scalar",opt:!0,T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.playerId="",void 0!==e&&m(this,t,e),t}internalBinaryRead(e,t,n,s){let r=null!=s?s:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,s]=e.tag();switch(t){case 1:r.type=e.string();break;case 2:r.playerId=e.string();break;case 3:r.reason=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${s}) for ${this.typeName}`);let o=e.skip(s);!1!==i&&(!0===i?h.onRead:i)(this.typeName,r,t,s,o)}}return r}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,c.LengthDelimited).string(e.type),""!==e.playerId&&t.tag(2,c.LengthDelimited).string(e.playerId),void 0!==e.reason&&t.tag(3,c.LengthDelimited).string(e.reason);let s=n.writeUnknownFields;return!1!==s&&(1==s?h.onWrite:s)(this.typeName,e,t),t}},Re=new class extends le{constructor(){super("ping",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"time",kind:"scalar",T:5}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.time=0,void 0!==e&&m(this,t,e),t}internalBinaryRead(e,t,n,s){let r=null!=s?s:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,s]=e.tag();switch(t){case 1:r.type=e.string();break;case 2:r.time=e.int32();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${s}) for ${this.typeName}`);let o=e.skip(s);!1!==i&&(!0===i?h.onRead:i)(this.typeName,r,t,s,o)}}return r}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,c.LengthDelimited).string(e.type),0!==e.time&&t.tag(2,c.Varint).int32(e.time);let s=n.writeUnknownFields;return!1!==s&&(1==s?h.onWrite:s)(this.typeName,e,t),t}},Pe=new class extends le{constructor(){super("pong",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"time",kind:"scalar",T:5}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.time=0,void 0!==e&&m(this,t,e),t}internalBinaryRead(e,t,n,s){let r=null!=s?s:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,s]=e.tag();switch(t){case 1:r.type=e.string();break;case 2:r.time=e.int32();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${s}) for ${this.typeName}`);let o=e.skip(s);!1!==i&&(!0===i?h.onRead:i)(this.typeName,r,t,s,o)}}return r}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,c.LengthDelimited).string(e.type),0!==e.time&&t.tag(2,c.Varint).int32(e.time);let s=n.writeUnknownFields;return!1!==s&&(1==s?h.onWrite:s)(this.typeName,e,t),t}},Ie=new class extends le{constructor(){super("streamerDisconnected",[{no:1,name:"type",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",void 0!==e&&m(this,t,e),t}internalBinaryRead(e,t,n,s){let r=null!=s?s:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,s]=e.tag();if(1===t)r.type=e.string();else{let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${s}) for ${this.typeName}`);let o=e.skip(s);!1!==i&&(!0===i?h.onRead:i)(this.typeName,r,t,s,o)}}return r}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,c.LengthDelimited).string(e.type);let s=n.writeUnknownFields;return!1!==s&&(1==s?h.onWrite:s)(this.typeName,e,t),t}},Le=new class extends le{constructor(){super("layerPreference",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"spatialLayer",kind:"scalar",T:5},{no:3,name:"temporalLayer",kind:"scalar",T:5},{no:4,name:"playerId",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.spatialLayer=0,t.temporalLayer=0,t.playerId="",void 0!==e&&m(this,t,e),t}internalBinaryRead(e,t,n,s){let r=null!=s?s:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,s]=e.tag();switch(t){case 1:r.type=e.string();break;case 2:r.spatialLayer=e.int32();break;case 3:r.temporalLayer=e.int32();break;case 4:r.playerId=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${s}) for ${this.typeName}`);let o=e.skip(s);!1!==i&&(!0===i?h.onRead:i)(this.typeName,r,t,s,o)}}return r}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,c.LengthDelimited).string(e.type),0!==e.spatialLayer&&t.tag(2,c.Varint).int32(e.spatialLayer),0!==e.temporalLayer&&t.tag(3,c.Varint).int32(e.temporalLayer),""!==e.playerId&&t.tag(4,c.LengthDelimited).string(e.playerId);let s=n.writeUnknownFields;return!1!==s&&(1==s?h.onWrite:s)(this.typeName,e,t),t}},xe=new class extends le{constructor(){super("dataChannelRequest",[{no:1,name:"type",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",void 0!==e&&m(this,t,e),t}internalBinaryRead(e,t,n,s){let r=null!=s?s:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,s]=e.tag();if(1===t)r.type=e.string();else{let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${s}) for ${this.typeName}`);let o=e.skip(s);!1!==i&&(!0===i?h.onRead:i)(this.typeName,r,t,s,o)}}return r}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,c.LengthDelimited).string(e.type);let s=n.writeUnknownFields;return!1!==s&&(1==s?h.onWrite:s)(this.typeName,e,t),t}},Fe=new class extends le{constructor(){super("peerDataChannels",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"playerId",kind:"scalar",T:9},{no:3,name:"sendStreamId",kind:"scalar",T:5},{no:4,name:"recvStreamId",kind:"scalar",T:5}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.playerId="",t.sendStreamId=0,t.recvStreamId=0,void 0!==e&&m(this,t,e),t}internalBinaryRead(e,t,n,s){let r=null!=s?s:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,s]=e.tag();switch(t){case 1:r.type=e.string();break;case 2:r.playerId=e.string();break;case 3:r.sendStreamId=e.int32();break;case 4:r.recvStreamId=e.int32();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${s}) for ${this.typeName}`);let o=e.skip(s);!1!==i&&(!0===i?h.onRead:i)(this.typeName,r,t,s,o)}}return r}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,c.LengthDelimited).string(e.type),""!==e.playerId&&t.tag(2,c.LengthDelimited).string(e.playerId),0!==e.sendStreamId&&t.tag(3,c.Varint).int32(e.sendStreamId),0!==e.recvStreamId&&t.tag(4,c.Varint).int32(e.recvStreamId);let s=n.writeUnknownFields;return!1!==s&&(1==s?h.onWrite:s)(this.typeName,e,t),t}},Oe=new class extends le{constructor(){super("peerDataChannelsReady",[{no:1,name:"type",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",void 0!==e&&m(this,t,e),t}internalBinaryRead(e,t,n,s){let r=null!=s?s:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,s]=e.tag();if(1===t)r.type=e.string();else{let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${s}) for ${this.typeName}`);let o=e.skip(s);!1!==i&&(!0===i?h.onRead:i)(this.typeName,r,t,s,o)}}return r}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,c.LengthDelimited).string(e.type);let s=n.writeUnknownFields;return!1!==s&&(1==s?h.onWrite:s)(this.typeName,e,t),t}},De=new class extends le{constructor(){super("streamerDataChannels",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"sfuId",kind:"scalar",T:9},{no:3,name:"sendStreamId",kind:"scalar",T:5},{no:4,name:"recvStreamId",kind:"scalar",T:5}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.sfuId="",t.sendStreamId=0,t.recvStreamId=0,void 0!==e&&m(this,t,e),t}internalBinaryRead(e,t,n,s){let r=null!=s?s:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,s]=e.tag();switch(t){case 1:r.type=e.string();break;case 2:r.sfuId=e.string();break;case 3:r.sendStreamId=e.int32();break;case 4:r.recvStreamId=e.int32();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${s}) for ${this.typeName}`);let o=e.skip(s);!1!==i&&(!0===i?h.onRead:i)(this.typeName,r,t,s,o)}}return r}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,c.LengthDelimited).string(e.type),""!==e.sfuId&&t.tag(2,c.LengthDelimited).string(e.sfuId),0!==e.sendStreamId&&t.tag(3,c.Varint).int32(e.sendStreamId),0!==e.recvStreamId&&t.tag(4,c.Varint).int32(e.recvStreamId);let s=n.writeUnknownFields;return!1!==s&&(1==s?h.onWrite:s)(this.typeName,e,t),t}},Ne=new class extends le{constructor(){super("startStreaming",[{no:1,name:"type",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",void 0!==e&&m(this,t,e),t}internalBinaryRead(e,t,n,s){let r=null!=s?s:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,s]=e.tag();if(1===t)r.type=e.string();else{let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${s}) for ${this.typeName}`);let o=e.skip(s);!1!==i&&(!0===i?h.onRead:i)(this.typeName,r,t,s,o)}}return r}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,c.LengthDelimited).string(e.type);let s=n.writeUnknownFields;return!1!==s&&(1==s?h.onWrite:s)(this.typeName,e,t),t}},Ae=new class extends le{constructor(){super("stopStreaming",[{no:1,name:"type",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",void 0!==e&&m(this,t,e),t}internalBinaryRead(e,t,n,s){let r=null!=s?s:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,s]=e.tag();if(1===t)r.type=e.string();else{let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${s}) for ${this.typeName}`);let o=e.skip(s);!1!==i&&(!0===i?h.onRead:i)(this.typeName,r,t,s,o)}}return r}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,c.LengthDelimited).string(e.type);let s=n.writeUnknownFields;return!1!==s&&(1==s?h.onWrite:s)(this.typeName,e,t),t}},Be=new class extends le{constructor(){super("playerCount",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"count",kind:"scalar",T:5}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.count=0,void 0!==e&&m(this,t,e),t}internalBinaryRead(e,t,n,s){let r=null!=s?s:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,s]=e.tag();switch(t){case 1:r.type=e.string();break;case 2:r.count=e.int32();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${s}) for ${this.typeName}`);let o=e.skip(s);!1!==i&&(!0===i?h.onRead:i)(this.typeName,r,t,s,o)}}return r}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,c.LengthDelimited).string(e.type),0!==e.count&&t.tag(2,c.Varint).int32(e.count);let s=n.writeUnknownFields;return!1!==s&&(1==s?h.onWrite:s)(this.typeName,e,t),t}},Ue=new class extends le{constructor(){super("stats",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"data",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.data="",void 0!==e&&m(this,t,e),t}internalBinaryRead(e,t,n,s){let r=null!=s?s:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,s]=e.tag();switch(t){case 1:r.type=e.string();break;case 2:r.data=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${s}) for ${this.typeName}`);let o=e.skip(s);!1!==i&&(!0===i?h.onRead:i)(this.typeName,r,t,s,o)}}return r}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,c.LengthDelimited).string(e.type),""!==e.data&&t.tag(2,c.LengthDelimited).string(e.data);let s=n.writeUnknownFields;return!1!==s&&(1==s?h.onWrite:s)(this.typeName,e,t),t}},Ve={answer:Te,config:ce,disconnectPlayer:ke,endpointId:ge,endpointIdConfirm:me,iceCandidate:Me,identify:ue,listStreamers:fe,offer:Ce,ping:Re,playerConnected:Se,playerCount:Be,playerDisconnected:be,pong:Pe,stats:Ue,streamerDisconnected:Ie,streamerList:ye,subscribe:ve,unsubscribe:we,layerPreference:Le,dataChannelRequest:xe,peerDataChannels:Fe,peerDataChannelsReady:Oe,streamerDataChannels:De,startStreaming:Ne,stopStreaming:Ae};function We(e,t){const n=e.create();return n.type=e.typeName,t&&e.mergePartial(n,t),n}function _e(e){let t=!0;if(!e.type)return d.Error(`Parsed message has no type. Rejected. ${JSON.stringify(e)}`),null;const n=Ve[e.type];if(!n)return d.Error(`Message is of an unknown type: "${e.type}". Rejected.`),null;if(n.fields)for(const s of n.fields)s.opt||Object.prototype.hasOwnProperty.call(e,s.name)||(d.Error(`Message "${e.type}"" is missing required field "${s.name}". Rejected.`),t=!1);for(const s in e)n.fields.find((e=>e.name===s))||(d.Error(`Message "${e.type}" contains unknown field "${s}". Rejected.`),t=!1);return t?n:null}class He extends u.EventEmitter{static get SIGNALLING_VERSION(){return"1.2.1"}constructor(e){super(),this.transport=e,e.onMessage=t=>{if(t.type==Re.typeName){const t=We(Pe,{time:(new Date).getTime()});e.sendMessage(t)}e.emit("message",t),this.emit(t.type,t)}}connect(e){return this.transport.connect(e)}disconnect(e,t){this.transport.disconnect(e,t)}isConnected(){return this.transport.isConnected()}sendMessage(e){this.transport.sendMessage(e),this.transport.emit("out",e)}}class $e{constructor(e){this.videoElementProvider=e,this.audioElement=document.createElement("Audio"),this.videoElementProvider.setAudioElement(this.audioElement)}handleOnTrack(e){if(d.Info("handleOnTrack "+JSON.stringify(e.streams)),e.streams.length<1||"probator"==e.streams[0].id)return;const t=this.videoElementProvider.getVideoElement();if(e.track&&d.Info("Got track - "+e.track.kind+" id="+e.track.id+" readyState="+e.track.readyState),"audio"!=e.track.kind)return"video"==e.track.kind&&t.srcObject!==e.streams[0]?(t.srcObject=e.streams[0],void d.Info("Set video source from video track ontrack.")):void 0;this.CreateAudioTrack(e.streams[0])}CreateAudioTrack(e){const t=this.videoElementProvider.getVideoElement();t.srcObject!=e&&t.srcObject&&t.srcObject!==e&&(this.audioElement.srcObject=e,d.Info("Created new audio element to play separate audio stream."))}}class je{constructor(e){this.freezeFrameHeight=0,this.freezeFrameWidth=0,this.rootDiv=e,this.rootElement=document.createElement("div"),this.rootElement.id="freezeFrame",this.rootElement.style.display="none",this.rootElement.style.pointerEvents="none",this.rootElement.style.position="absolute",this.rootElement.style.zIndex="20",this.imageElement=document.createElement("img"),this.imageElement.style.position="absolute",this.rootElement.appendChild(this.imageElement),this.rootDiv.appendChild(this.rootElement)}setElementForShow(){this.rootElement.style.display="block"}setElementForHide(){this.rootElement.style.display="none"}updateImageElementSource(e){const t=btoa(e.reduce(((e,t)=>e+String.fromCharCode(t)),""));this.imageElement.src="data:image/jpeg;base64,"+t}setDimensionsFromElementAndResize(){this.freezeFrameHeight=this.imageElement.naturalHeight,this.freezeFrameWidth=this.imageElement.naturalWidth,this.resize()}resize(){if(0!==this.freezeFrameWidth&&0!==this.freezeFrameHeight){let e=0,t=0,n=0,s=0;const r=this.rootDiv.clientWidth/this.rootDiv.clientHeight,i=this.freezeFrameWidth/this.freezeFrameHeight;r<i?(e=this.rootDiv.clientWidth,t=Math.floor(this.rootDiv.clientWidth/i),n=Math.floor(.5*(this.rootDiv.clientHeight-t)),s=0):(e=Math.floor(this.rootDiv.clientHeight*i),t=this.rootDiv.clientHeight,n=0,s=Math.floor(.5*(this.rootDiv.clientWidth-e))),this.rootElement.style.width=this.rootDiv.offsetWidth+"px",this.rootElement.style.height=this.rootDiv.offsetHeight+"px",this.rootElement.style.left="0px",this.rootElement.style.top="0px",this.imageElement.style.width=e+"px",this.imageElement.style.height=t+"px",this.imageElement.style.left=s+"px",this.imageElement.style.top=n+"px"}}}class ze{constructor(e){this.receiving=!1,this.size=0,this.jpeg=void 0,this.valid=!1,this.freezeFrameDelay=50,this.freezeFrame=new je(e)}showFreezeFrame(){this.valid&&this.freezeFrame.setElementForShow()}hideFreezeFrame(){this.valid=!1,this.freezeFrame.setElementForHide()}updateFreezeFrameAndShow(e,t){this.freezeFrame.updateImageElementSource(e),this.freezeFrame.imageElement.onload=()=>{this.freezeFrame.setDimensionsFromElementAndResize(),t()}}processFreezeFrameMessage(e,t){this.receiving||(this.receiving=!0,this.valid=!1,this.size=0,this.jpeg=void 0),this.size=new DataView(e.slice(1,5).buffer).getInt32(0,!0);const n=e.slice(5);if(this.jpeg){const e=new Uint8Array(this.jpeg.length+n.length);e.set(this.jpeg,0),e.set(n,this.jpeg.length),this.jpeg=e}else this.jpeg=n,this.receiving=!0,d.Info(`received first chunk of freeze frame: ${this.jpeg.length}/${this.size}`);this.jpeg.length===this.size?(this.receiving=!1,this.valid=!0,d.Info(`received complete freeze frame ${this.size}`),this.updateFreezeFrameAndShow(this.jpeg,t)):this.jpeg.length>this.size&&(d.Error(`received bigger freeze frame than advertised: ${this.jpeg.length}/${this.size}`),this.jpeg=void 0,this.receiving=!1)}}class Ke{constructor(e,t,n,s,r=()=>{}){this.parseURLParams(),this.onChange=r,this.onChangeEmit=()=>{},this.id=e,this.description=n,this.label=t,this.value=s}set label(e){this._label=e,this.onChangeEmit(this._value)}get label(){return this._label}get value(){return this._value}set value(e){this._value=e,this.onChange(this._value,this),this.onChangeEmit(this._value)}updateURLParams(){if(this.useUrlParams){const e=new URLSearchParams(window.location.search),t=this.getValueAsString();let n=!1;for(const[s,r]of e)if(s.toLowerCase()==this.id.toLowerCase()){e.set(s,t),n=!0;break}n||e.set(this.id,t),window.history.replaceState({},"",""!==e.toString()?`${location.pathname}?${e}`:`${location.pathname}`)}}getValueAsString(){return""}parseURLParams(){this._urlParams={};const e=new URLSearchParams(window.location.search);for(const[t,n]of e)this._urlParams[t.toLowerCase()]=n}hasURLParam(e){return e.toLowerCase()in this._urlParams}getURLParam(e){return this.hasURLParam(e)?this._urlParams[e.toLowerCase()]:""}}class Ge extends Ke{constructor(e,t,n,s,r,i=()=>{}){if(super(e,t,n,s,i),r&&this.hasURLParam(this.id)){const e=this.getURLParam(this.id);this.flag="false"!=e.toLowerCase()}else this.flag=s;this.useUrlParams=r}getValueAsString(){return this.flag?"true":"false"}enable(){this.flag=!0}get flag(){return!!this.value}set flag(e){this.value=e}}class Xe extends Ke{constructor(e,t,n,s,r,i,o,a=()=>{}){if(super(e,t,n,i,a),this._min=s,this._max=r,o&&this.hasURLParam(this.id)){const e=Number.parseFloat(this.getURLParam(this.id));this.number=Number.isNaN(e)?i:e}else this.number=i;this.useUrlParams=o}getValueAsString(){return this.number.toString()}set number(e){this.value=this.clamp(e)}get number(){return this.value}clamp(e){return Math.max(Math.min(this._max,e),this._min)}get min(){return this._min}get max(){return this._max}addOnChangedListener(e){this.onChange=e}}class qe extends Ke{constructor(e,t,n,s,r,i=()=>{}){super(e,t,n,s,i),r&&this.hasURLParam(this.id)?this.text=this.getURLParam(this.id):this.text=s,this.useUrlParams=r}getValueAsString(){return this.text}get text(){return this.value}set text(e){this.value=e}}class Qe extends Ke{constructor(e,t,n,s,r,i,o=()=>{}){super(e,t,n,s,o),this.options=r;const a=this.hasURLParam(this.id)?this.getURLParam(this.id):s;this.selected=a,this.useUrlParams=i}getValueAsString(){return this.selected}addOnChangedListener(e){this.onChange=e}get options(){return this._options}set options(e){this._options=e,this.onChangeEmit(this.selected)}get selected(){return this.value}set selected(e){let t=this.options.filter((t=>-1!==t.indexOf(e)));t.length?this.value=t[0]:(t=this.options.filter((t=>-1!==t.indexOf(e.split(" ")[0]))),t.length&&(this.value=t[0]))}}class Je extends Event{constructor(e){super("afkWarningActivate"),this.data=e}}class Ye extends Event{constructor(e){super("afkWarningUpdate"),this.data=e}}class Ze extends Event{constructor(){super("afkWarningDeactivate")}}class et extends Event{constructor(){super("afkTimedOut")}}class tt extends Event{constructor(e){super("videoEncoderAvgQP"),this.data=e}}class nt extends Event{constructor(){super("webRtcSdp")}}class st extends Event{constructor(){super("webRtcAutoConnect")}}class rt extends Event{constructor(){super("webRtcConnecting")}}class it extends Event{constructor(){super("webRtcConnected")}}class ot extends Event{constructor(){super("webRtcFailed")}}class at extends Event{constructor(e){super("webRtcDisconnected"),this.data=e}}class lt extends Event{constructor(e){super("dataChannelOpen"),this.data=e}}class dt extends Event{constructor(e){super("dataChannelClose"),this.data=e}}class ht extends Event{constructor(e){super("dataChannelError"),this.data=e}}class ct extends Event{constructor(){super("videoInitialized")}}class ut extends Event{constructor(){super("streamLoading")}}class gt extends Event{constructor(){super("streamConnect")}}class mt extends Event{constructor(){super("streamDisconnect")}}class pt extends Event{constructor(){super("streamReconnect")}}class ft extends Event{constructor(e){super("playStreamError"),this.data=e}}class yt extends Event{constructor(){super("playStream")}}class vt extends Event{constructor(e){super("playStreamRejected"),this.data=e}}class wt extends Event{constructor(e){super("loadFreezeFrame"),this.data=e}}class St extends Event{constructor(){super("hideFreezeFrame")}}class bt extends Event{constructor(e){super("statsReceived"),this.data=e}}class Ct extends Event{constructor(e){super("streamerListMessage"),this.data=e}}class Tt extends Event{constructor(e){super("StreamerIDChangedMessage"),this.data=e}}class Et extends Event{constructor(e){super("latencyTestResult"),this.data=e}}class Mt extends Event{constructor(e){super("dataChannelLatencyTestResponse"),this.data=e}}class kt extends Event{constructor(e){super("dataChannelLatencyTestResult"),this.data=e}}class Rt extends Event{constructor(e){super("initialSettings"),this.data=e}}class Pt extends Event{constructor(e){super("settingsChanged"),this.data=e}}class It extends Event{constructor(){super("xrSessionStarted")}}class Lt extends Event{constructor(){super("xrSessionEnded")}}class xt extends Event{constructor(e){super("xrFrame"),this.data=e}}class Ft extends Event{constructor(e){super("playerCount"),this.data=e}}class Ot extends Event{constructor(){super("webRtcTCPRelayDetected")}}class Dt extends EventTarget{dispatchEvent(e){return super.dispatchEvent(e)}addEventListener(e,t){super.addEventListener(e,t)}removeEventListener(e,t){super.removeEventListener(e,t)}}class Nt{}Nt.AutoConnect="AutoConnect",Nt.AutoPlayVideo="AutoPlayVideo",Nt.AFKDetection="TimeoutIfIdle",Nt.HoveringMouseMode="HoveringMouse",Nt.ForceMonoAudio="ForceMonoAudio",Nt.ForceTURN="ForceTURN",Nt.FakeMouseWithTouches="FakeMouseWithTouches",Nt.IsQualityController="ControlsQuality",Nt.MatchViewportResolution="MatchViewportRes",Nt.StartVideoMuted="StartVideoMuted",Nt.SuppressBrowserKeys="SuppressBrowserKeys",Nt.UseMic="UseMic",Nt.UseCamera="UseCamera",Nt.KeyboardInput="KeyboardInput",Nt.MouseInput="MouseInput",Nt.TouchInput="TouchInput",Nt.GamepadInput="GamepadInput",Nt.XRControllerInput="XRControllerInput",Nt.WaitForStreamer="WaitForStreamer",Nt.HideUI="HideUI";const At=e=>Object.getOwnPropertyNames(Nt).some((t=>Nt[t]===e));class Bt{}Bt.AFKTimeoutSecs="AFKTimeout",Bt.AFKCountdownSecs="AFKCountdown",Bt.MinQP="MinQP",Bt.MaxQP="MaxQP",Bt.WebRTCFPS="WebRTCFPS",Bt.WebRTCMinBitrate="WebRTCMinBitrate",Bt.WebRTCMaxBitrate="WebRTCMaxBitrate",Bt.MaxReconnectAttempts="MaxReconnectAttempts",Bt.StreamerAutoJoinInterval="StreamerAutoJoinInterval";const Ut=e=>Object.getOwnPropertyNames(Bt).some((t=>Bt[t]===e));class Vt{}Vt.SignallingServerUrl="ss";const Wt=e=>Object.getOwnPropertyNames(Vt).some((t=>Vt[t]===e));class _t{}_t.PreferredCodec="PreferredCodec",_t.StreamerId="StreamerId";const Ht=e=>Object.getOwnPropertyNames(_t).some((t=>_t[t]===e));class $t{constructor(e={}){this.flags=new Map,this.numericParameters=new Map,this.textParameters=new Map,this.optionParameters=new Map;const{initialSettings:t,useUrlParams:n}=e;this._useUrlParams=!!n,this.populateDefaultSettings(this._useUrlParams,t)}get useUrlParams(){return this._useUrlParams}populateDefaultSettings(e,t){this.textParameters.set(Vt.SignallingServerUrl,new qe(Vt.SignallingServerUrl,"Signalling url","Url of the signalling server",t&&Object.prototype.hasOwnProperty.call(t,Vt.SignallingServerUrl)?t[Vt.SignallingServerUrl]:("https:"===location.protocol?"wss://":"ws://")+window.location.hostname+("80"===window.location.port||""===window.location.port?"":`:${window.location.port}`),e)),this.optionParameters.set(_t.StreamerId,new Qe(_t.StreamerId,"Streamer ID","The ID of the streamer to stream.",t&&Object.prototype.hasOwnProperty.call(t,_t.StreamerId)?t[_t.StreamerId]:"",[],e)),this.optionParameters.set(_t.PreferredCodec,new Qe(_t.PreferredCodec,"Preferred Codec","The preferred codec to be used during codec negotiation","H264 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f",t&&Object.prototype.hasOwnProperty.call(t,_t.PreferredCodec)?[t[_t.PreferredCodec]]:function(){const e=[];if(!RTCRtpReceiver.getCapabilities)return e.push("Only available on Chrome"),e;const t=/(VP\d|H26\d|AV1).*/;return RTCRtpReceiver.getCapabilities("video").codecs.forEach((n=>{const s=n.mimeType.split("/")[1]+" "+(n.sdpFmtpLine||"");null!==t.exec(s)&&e.push(s)})),e}(),e)),this.flags.set(Nt.AutoConnect,new Ge(Nt.AutoConnect,"Auto connect to stream","Whether we should attempt to auto connect to the signalling server or show a click to start prompt.",!(!t||!Object.prototype.hasOwnProperty.call(t,Nt.AutoConnect))&&t[Nt.AutoConnect],e)),this.flags.set(Nt.AutoPlayVideo,new Ge(Nt.AutoPlayVideo,"Auto play video","When video is ready automatically start playing it as opposed to showing a play button.",!t||!Object.prototype.hasOwnProperty.call(t,Nt.AutoPlayVideo)||t[Nt.AutoPlayVideo],e)),this.flags.set(Nt.UseMic,new Ge(Nt.UseMic,"Use microphone","Make browser request microphone access and open an input audio track.",!(!t||!Object.prototype.hasOwnProperty.call(t,Nt.UseMic))&&t[Nt.UseMic],e)),this.flags.set(Nt.UseCamera,new Ge(Nt.UseCamera,"Use webcam","Make browser request webcam access and open a input video track.",!(!t||!Object.prototype.hasOwnProperty.call(t,Nt.UseCamera))&&t[Nt.UseCamera],e)),this.flags.set(Nt.StartVideoMuted,new Ge(Nt.StartVideoMuted,"Start video muted","Video will start muted if true.",!(!t||!Object.prototype.hasOwnProperty.call(t,Nt.StartVideoMuted))&&t[Nt.StartVideoMuted],e)),this.flags.set(Nt.SuppressBrowserKeys,new Ge(Nt.SuppressBrowserKeys,"Suppress browser keys","Suppress certain browser keys that we use in UE, for example F5 to show shader complexity instead of refresh the page.",!t||!Object.prototype.hasOwnProperty.call(t,Nt.SuppressBrowserKeys)||t[Nt.SuppressBrowserKeys],e)),this.flags.set(Nt.IsQualityController,new Ge(Nt.IsQualityController,"Is quality controller?","True if this peer controls stream quality",!t||!Object.prototype.hasOwnProperty.call(t,Nt.IsQualityController)||t[Nt.IsQualityController],e)),this.flags.set(Nt.ForceMonoAudio,new Ge(Nt.ForceMonoAudio,"Force mono audio","Force browser to request mono audio in the SDP",!(!t||!Object.prototype.hasOwnProperty.call(t,Nt.ForceMonoAudio))&&t[Nt.ForceMonoAudio],e)),this.flags.set(Nt.ForceTURN,new Ge(Nt.ForceTURN,"Force TURN","Only generate TURN/Relayed ICE candidates.",!(!t||!Object.prototype.hasOwnProperty.call(t,Nt.ForceTURN))&&t[Nt.ForceTURN],e)),this.flags.set(Nt.AFKDetection,new Ge(Nt.AFKDetection,"AFK if idle","Timeout the experience if user is AFK for a period.",!(!t||!Object.prototype.hasOwnProperty.call(t,Nt.AFKDetection))&&t[Nt.AFKDetection],e)),this.flags.set(Nt.MatchViewportResolution,new Ge(Nt.MatchViewportResolution,"Match viewport resolution","Pixel Streaming will be instructed to dynamically resize the video stream to match the size of the video element.",!(!t||!Object.prototype.hasOwnProperty.call(t,Nt.MatchViewportResolution))&&t[Nt.MatchViewportResolution],e)),this.flags.set(Nt.HoveringMouseMode,new Ge(Nt.HoveringMouseMode,"Control Scheme: Locked Mouse","Either locked mouse, where the pointer is consumed by the video and locked to it, or hovering mouse, where the mouse is not consumed.",!(!t||!Object.prototype.hasOwnProperty.call(t,Nt.HoveringMouseMode))&&t[Nt.HoveringMouseMode],e,((e,t)=>{t.label=`Control Scheme: ${e?"Hovering":"Locked"} Mouse`}))),this.flags.set(Nt.FakeMouseWithTouches,new Ge(Nt.FakeMouseWithTouches,"Fake mouse with touches","A single finger touch is converted into a mouse event. This allows a non-touch application to be controlled partially via a touch device.",!(!t||!Object.prototype.hasOwnProperty.call(t,Nt.FakeMouseWithTouches))&&t[Nt.FakeMouseWithTouches],e)),this.flags.set(Nt.KeyboardInput,new Ge(Nt.KeyboardInput,"Keyboard input","If enabled, send keyboard events to streamer",!t||!Object.prototype.hasOwnProperty.call(t,Nt.KeyboardInput)||t[Nt.KeyboardInput],e)),this.flags.set(Nt.MouseInput,new Ge(Nt.MouseInput,"Mouse input","If enabled, send mouse events to streamer",!t||!Object.prototype.hasOwnProperty.call(t,Nt.MouseInput)||t[Nt.MouseInput],e)),this.flags.set(Nt.TouchInput,new Ge(Nt.TouchInput,"Touch input","If enabled, send touch events to streamer",!t||!Object.prototype.hasOwnProperty.call(t,Nt.TouchInput)||t[Nt.TouchInput],e)),this.flags.set(Nt.GamepadInput,new Ge(Nt.GamepadInput,"Gamepad input","If enabled, send gamepad events to streamer",!t||!Object.prototype.hasOwnProperty.call(t,Nt.GamepadInput)||t[Nt.GamepadInput],e)),this.flags.set(Nt.XRControllerInput,new Ge(Nt.XRControllerInput,"XR controller input","If enabled, send XR controller events to streamer",!t||!Object.prototype.hasOwnProperty.call(t,Nt.XRControllerInput)||t[Nt.XRControllerInput],e)),this.flags.set(Nt.WaitForStreamer,new Ge(Nt.WaitForStreamer,"Wait for streamer","Will continue trying to connect to the first streamer available.",!t||!Object.prototype.hasOwnProperty.call(t,Nt.WaitForStreamer)||t[Nt.WaitForStreamer],e)),this.flags.set(Nt.HideUI,new Ge(Nt.HideUI,"Hide the UI overlay","Will hide all UI overlay details",!(!t||!Object.prototype.hasOwnProperty.call(t,Nt.HideUI))&&t[Nt.HideUI],e)),this.numericParameters.set(Bt.AFKTimeoutSecs,new Xe(Bt.AFKTimeoutSecs,"AFK timeout","The time (in seconds) it takes for the application to time out if AFK timeout is enabled.",0,600,t&&Object.prototype.hasOwnProperty.call(t,Bt.AFKTimeoutSecs)?t[Bt.AFKTimeoutSecs]:120,e)),this.numericParameters.set(Bt.AFKCountdownSecs,new Xe(Bt.AFKCountdownSecs,"AFK countdown","The time (in seconds) for a user to respond before the stream is ended after an AFK timeout.",10,180,10,e)),this.numericParameters.set(Bt.MaxReconnectAttempts,new Xe(Bt.MaxReconnectAttempts,"Max Reconnects","Maximum number of reconnects the application will attempt when a streamer disconnects.",0,999,t&&Object.prototype.hasOwnProperty.call(t,Bt.MaxReconnectAttempts)?t[Bt.MaxReconnectAttempts]:3,e)),this.numericParameters.set(Bt.MinQP,new Xe(Bt.MinQP,"Min QP","The lower bound for the quantization parameter (QP) of the encoder. 0 = Best quality, 51 = worst quality.",0,51,t&&Object.prototype.hasOwnProperty.call(t,Bt.MinQP)?t[Bt.MinQP]:0,e)),this.numericParameters.set(Bt.MaxQP,new Xe(Bt.MaxQP,"Max QP","The upper bound for the quantization parameter (QP) of the encoder. 0 = Best quality, 51 = worst quality.",0,51,t&&Object.prototype.hasOwnProperty.call(t,Bt.MaxQP)?t[Bt.MaxQP]:51,e)),this.numericParameters.set(Bt.WebRTCFPS,new Xe(Bt.WebRTCFPS,"Max FPS","The maximum FPS that WebRTC will try to transmit frames at.",1,999,t&&Object.prototype.hasOwnProperty.call(t,Bt.WebRTCFPS)?t[Bt.WebRTCFPS]:60,e)),this.numericParameters.set(Bt.WebRTCMinBitrate,new Xe(Bt.WebRTCMinBitrate,"Min Bitrate (kbps)","The minimum bitrate that WebRTC should use.",0,5e5,t&&Object.prototype.hasOwnProperty.call(t,Bt.WebRTCMinBitrate)?t[Bt.WebRTCMinBitrate]:0,e)),this.numericParameters.set(Bt.WebRTCMaxBitrate,new Xe(Bt.WebRTCMaxBitrate,"Max Bitrate (kbps)","The maximum bitrate that WebRTC should use.",0,5e5,t&&Object.prototype.hasOwnProperty.call(t,Bt.WebRTCMaxBitrate)?t[Bt.WebRTCMaxBitrate]:0,e)),this.numericParameters.set(Bt.StreamerAutoJoinInterval,new Xe(Bt.StreamerAutoJoinInterval,"Streamer Auto Join Interval (ms)","Delay between retries when waiting for an available streamer.",500,9e5,t&&Object.prototype.hasOwnProperty.call(t,Bt.StreamerAutoJoinInterval)?t[Bt.StreamerAutoJoinInterval]:3e3,e))}_addOnNumericSettingChangedListener(e,t){this.numericParameters.has(e)&&this.numericParameters.get(e).addOnChangedListener(t)}_addOnOptionSettingChangedListener(e,t){this.optionParameters.has(e)&&this.optionParameters.get(e).addOnChangedListener(t)}getNumericSettingValue(e){if(this.numericParameters.has(e))return this.numericParameters.get(e).number;throw new Error(`There is no numeric setting with the id of ${e}`)}getTextSettingValue(e){if(this.textParameters.has(e))return this.textParameters.get(e).value;throw new Error(`There is no numeric setting with the id of ${e}`)}setNumericSetting(e,t){if(!this.numericParameters.has(e))throw new Error(`There is no numeric setting with the id of ${e}`);this.numericParameters.get(e).number=t}_addOnSettingChangedListener(e,t){this.flags.has(e)&&(this.flags.get(e).onChange=t)}_addOnTextSettingChangedListener(e,t){this.textParameters.has(e)&&(this.textParameters.get(e).onChange=t)}getSettingOption(e){return this.optionParameters.get(e)}isFlagEnabled(e){return this.flags.get(e).flag}setFlagEnabled(e,t){this.flags.has(e)?this.flags.get(e).flag=t:d.Warning(`Cannot toggle flag called ${e} - it does not exist in the Config.flags map.`)}setTextSetting(e,t){this.textParameters.has(e)?this.textParameters.get(e).text=t:d.Warning(`Cannot set text setting called ${e} - it does not exist in the Config.textParameters map.`)}setOptionSettingOptions(e,t){this.optionParameters.has(e)?this.optionParameters.get(e).options=t:d.Warning(`Cannot set text setting called ${e} - it does not exist in the Config.optionParameters map.`)}setOptionSettingValue(e,t){if(this.optionParameters.has(e)){const n=this.optionParameters.get(e),s=n.options;s.includes(t)||(s.push(t),n.options=s),n.selected=t}else d.Warning(`Cannot set text setting called ${e} - it does not exist in the Config.enumParameters map.`)}setFlagLabel(e,t){this.flags.has(e)?this.flags.get(e).label=t:d.Warning(`Cannot set label for flag called ${e} - it does not exist in the Config.flags map.`)}setSettings(e){for(const t of Object.keys(e))At(t)?this.setFlagEnabled(t,e[t]):Ut(t)?this.setNumericSetting(t,e[t]):Wt(t)?this.setTextSetting(t,e[t]):Ht(t)&&this.setOptionSettingValue(t,e[t])}getSettings(){const e={};for(const[t,n]of this.flags.entries())e[t]=n.flag;for(const[t,n]of this.numericParameters.entries())e[t]=n.number;for(const[t,n]of this.textParameters.entries())e[t]=n.text;for(const[t,n]of this.optionParameters.entries())e[t]=n.selected;return e}getFlags(){return Array.from(this.flags.values())}getTextSettings(){return Array.from(this.textParameters.values())}getNumericSettings(){return Array.from(this.numericParameters.values())}getOptionSettings(){return Array.from(this.optionParameters.values())}_registerOnChangeEvents(e){for(const t of this.flags.keys()){const n=this.flags.get(t);n&&(n.onChangeEmit=t=>e.dispatchEvent(new Pt({id:n.id,type:"flag",value:t,target:n})))}for(const t of this.numericParameters.keys()){const n=this.numericParameters.get(t);n&&(n.onChangeEmit=t=>e.dispatchEvent(new Pt({id:n.id,type:"number",value:t,target:n})))}for(const t of this.textParameters.keys()){const n=this.textParameters.get(t);n&&(n.onChangeEmit=t=>e.dispatchEvent(new Pt({id:n.id,type:"text",value:t,target:n})))}for(const t of this.optionParameters.keys()){const n=this.optionParameters.get(t);n&&(n.onChangeEmit=t=>e.dispatchEvent(new Pt({id:n.id,type:"option",value:t,target:n})))}}}var jt;!function(e){e[e.LockedMouse=0]="LockedMouse",e[e.HoveringMouse=1]="HoveringMouse"}(jt||(jt={}));class zt{constructor(e,t,n){this.active=!1,this.countdownActive=!1,this.warnTimer=void 0,this.countDown=0,this.countDownTimer=void 0,this.config=e,this.pixelStreaming=t,this.onDismissAfk=n,this.onAFKTimedOutCallback=()=>{console.log("AFK timed out, did you want to override this callback?")}}onAfkClick(){clearInterval(this.countDownTimer),(this.active||this.countdownActive)&&(this.startAfkWarningTimer(),this.pixelStreaming.dispatchEvent(new Ze))}startAfkWarningTimer(){this.config.getNumericSettingValue(Bt.AFKTimeoutSecs)>0&&this.config.isFlagEnabled(Nt.AFKDetection)?this.active=!0:this.active=!1,this.resetAfkWarningTimer()}stopAfkWarningTimer(){this.active=!1,this.countdownActive=!1,clearTimeout(this.warnTimer),clearInterval(this.countDownTimer)}pauseAfkWarningTimer(){this.active=!1}resetAfkWarningTimer(){this.active&&this.config.isFlagEnabled(Nt.AFKDetection)&&(clearTimeout(this.warnTimer),this.warnTimer=setTimeout((()=>this.activateAfkEvent()),1e3*this.config.getNumericSettingValue(Bt.AFKTimeoutSecs)))}activateAfkEvent(){this.pauseAfkWarningTimer(),this.pixelStreaming.dispatchEvent(new Je({countDown:this.countDown,dismissAfk:this.onDismissAfk})),this.countDown=this.config.getNumericSettingValue(Bt.AFKCountdownSecs),this.countdownActive=!0,this.pixelStreaming.dispatchEvent(new Ye({countDown:this.countDown})),this.config.isFlagEnabled(Nt.HoveringMouseMode)||document.exitPointerLock&&document.exitPointerLock(),this.countDownTimer=setInterval((()=>{this.countDown--,0==this.countDown?(this.pixelStreaming.dispatchEvent(new et),this.onAFKTimedOutCallback(),d.Info("You have been disconnected due to inactivity"),this.stopAfkWarningTimer()):this.pixelStreaming.dispatchEvent(new Ye({countDown:this.countDown}))}),1e3)}}class Kt{constructor(){this.isReceivingFreezeFrame=!1}getDataChannelInstance(){return this}createDataChannel(e,t,n){this.peerConnection=e,this.label=t,this.datachannelOptions=n,null==n&&(this.datachannelOptions={},this.datachannelOptions.ordered=!0),this.dataChannel=this.peerConnection.createDataChannel(this.label,this.datachannelOptions),this.setupDataChannel()}setupDataChannel(){this.dataChannel.binaryType="arraybuffer",this.dataChannel.onopen=e=>this.handleOnOpen(e),this.dataChannel.onclose=e=>this.handleOnClose(e),this.dataChannel.onmessage=e=>this.handleOnMessage(e),this.dataChannel.onerror=e=>this.handleOnError(e)}handleOnOpen(e){var t;d.Info(`Data Channel (${this.label}) opened.`),this.onOpen(null===(t=this.dataChannel)||void 0===t?void 0:t.label,e)}handleOnClose(e){var t;d.Info(`Data Channel (${this.label}) closed.`),this.onClose(null===(t=this.dataChannel)||void 0===t?void 0:t.label,e)}handleOnMessage(e){d.Info(`Data Channel (${this.label}) message: ${e}`)}handleOnError(e){var t;d.Info(`Data Channel (${this.label}) error: ${e}`),this.onError(null===(t=this.dataChannel)||void 0===t?void 0:t.label,e)}onOpen(e,t){}onClose(e,t){}onError(e,t){}}class Gt{}class Xt{}class qt{}class Qt{}class Jt{}class Yt{}class Zt{}class en{constructor(){this.inboundVideoStats=new Xt,this.inboundAudioStats=new Gt,this.DataChannelStats=new qt,this.outBoundVideoStats=new Jt,this.sessionStats=new Yt,this.streamStats=new Zt,this.codecs=new Map}processStats(e){this.localCandidates=new Array,this.remoteCandidates=new Array,this.candidatePairs=new Array,e.forEach((e=>{switch(e.type){case"candidate-pair":this.handleCandidatePair(e);break;case"certificate":case"media-source":case"media-playout":case"outbound-rtp":case"peer-connection":case"remote-inbound-rtp":break;case"codec":this.handleCodec(e);break;case"data-channel":this.handleDataChannel(e);break;case"inbound-rtp":this.handleInBoundRTP(e);break;case"local-candidate":this.handleLocalCandidate(e);break;case"remote-candidate":this.handleRemoteCandidate(e);break;case"remote-outbound-rtp":this.handleRemoteOutBound(e);break;case"track":this.handleTrack(e);break;case"transport":this.handleTransport(e);break;case"stream":this.handleStream(e);break;default:d.Error("unhandled Stat Type"),d.Info(e)}}))}handleStream(e){this.streamStats=e}handleCandidatePair(e){this.candidatePairs.push(e)}handleDataChannel(e){this.DataChannelStats.bytesReceived=e.bytesReceived,this.DataChannelStats.bytesSent=e.bytesSent,this.DataChannelStats.dataChannelIdentifier=e.dataChannelIdentifier,this.DataChannelStats.id=e.id,this.DataChannelStats.label=e.label,this.DataChannelStats.messagesReceived=e.messagesReceived,this.DataChannelStats.messagesSent=e.messagesSent,this.DataChannelStats.protocol=e.protocol,this.DataChannelStats.state=e.state,this.DataChannelStats.timestamp=e.timestamp}handleLocalCandidate(e){const t=new Qt;t.label="local-candidate",t.address=e.address,t.port=e.port,t.protocol=e.protocol,t.candidateType=e.candidateType,t.id=e.id,t.relayProtocol=e.relayProtocol,t.transportId=e.transportId,this.localCandidates.push(t)}handleRemoteCandidate(e){const t=new Qt;t.label="remote-candidate",t.address=e.address,t.port=e.port,t.protocol=e.protocol,t.id=e.id,t.candidateType=e.candidateType,t.relayProtocol=e.relayProtocol,t.transportId=e.transportId,this.remoteCandidates.push(t)}handleInBoundRTP(e){switch(e.kind){case"video":this.inboundVideoStats=e,null!=this.lastVideoStats&&(this.inboundVideoStats.bitrate=8*(this.inboundVideoStats.bytesReceived-this.lastVideoStats.bytesReceived)/(this.inboundVideoStats.timestamp-this.lastVideoStats.timestamp),this.inboundVideoStats.bitrate=Math.floor(this.inboundVideoStats.bitrate)),this.lastVideoStats=Object.assign({},this.inboundVideoStats);break;case"audio":this.inboundAudioStats=e,null!=this.lastAudioStats&&(this.inboundAudioStats.bitrate=8*(this.inboundAudioStats.bytesReceived-this.lastAudioStats.bytesReceived)/(this.inboundAudioStats.timestamp-this.lastAudioStats.timestamp),this.inboundAudioStats.bitrate=Math.floor(this.inboundAudioStats.bitrate)),this.lastAudioStats=Object.assign({},this.inboundAudioStats);break;default:d.Info("Kind is not handled")}}handleRemoteOutBound(e){"video"===e.kind&&(this.outBoundVideoStats.bytesSent=e.bytesSent,this.outBoundVideoStats.id=e.id,this.outBoundVideoStats.localId=e.localId,this.outBoundVideoStats.packetsSent=e.packetsSent,this.outBoundVideoStats.remoteTimestamp=e.remoteTimestamp,this.outBoundVideoStats.timestamp=e.timestamp)}handleTrack(e){"track"!==e.type||"video_label"!==e.trackIdentifier&&"video"!==e.kind||(this.inboundVideoStats.framesDropped=e.framesDropped,this.inboundVideoStats.framesReceived=e.framesReceived,this.inboundVideoStats.frameHeight=e.frameHeight,this.inboundVideoStats.frameWidth=e.frameWidth)}handleTransport(e){this.transportStats=e}handleCodec(e){const t=e.id,n=`${e.mimeType.replace("video/","").replace("audio/","")}${e.sdpFmtpLine?` ${e.sdpFmtpLine}`:""}`;this.codecs.set(t,n)}handleSessionStatistics(e,t,n){const s=Date.now()-e;this.sessionStats.runTime=new Date(s).toISOString().substr(11,8).toString();const r=null===t?"Not sent yet":t?"true":"false";this.sessionStats.controlsStreamInput=r,this.sessionStats.videoEncoderAvgQP=n}isNumber(e){return"number"==typeof e&&isFinite(e)}getActiveCandidatePair(){return this.transportStats?this.candidatePairs.find((e=>e.id===this.transportStats.selectedCandidatePairId),null):this.candidatePairs.find((e=>e.selected),null)}}const tn=(nn={parseRtpParameters:()=>e.parseRtpParameters,splitSections:()=>e.splitSections},sn={},s.d(sn,nn),sn);var nn,sn;class rn{static isVideoTransceiver(e){return this.canTransceiverReceiveVideo(e)||this.canTransceiverSendVideo(e)}static canTransceiverReceiveVideo(e){return!!e&&("sendrecv"===e.direction||"recvonly"===e.direction)&&e.receiver&&e.receiver.track&&"video"===e.receiver.track.kind}static canTransceiverSendVideo(e){return!!e&&("sendrecv"===e.direction||"sendonly"===e.direction)&&e.sender&&e.sender.track&&"video"===e.sender.track.kind}static isAudioTransceiver(e){return this.canTransceiverReceiveAudio(e)||this.canTransceiverSendAudio(e)}static canTransceiverReceiveAudio(e){return!!e&&("sendrecv"===e.direction||"recvonly"===e.direction)&&e.receiver&&e.receiver.track&&"audio"===e.receiver.track.kind}static canTransceiverSendAudio(e){return!!e&&("sendrecv"===e.direction||"sendonly"===e.direction)&&e.sender&&e.sender.track&&"audio"===e.sender.track.kind}}var on=function(e,t,n,s){return new(n||(n=Promise))((function(r,i){function o(e){try{l(s.next(e))}catch(e){i(e)}}function a(e){try{l(s.throw(e))}catch(e){i(e)}}function l(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(o,a)}l((s=s.apply(e,t||[])).next())}))};class an{constructor(e,t,n){this.config=t,this.createPeerConnection(e,n)}createPeerConnection(e,t){this.config.isFlagEnabled(Nt.ForceTURN)&&(e.iceTransportPolicy="relay",d.Info("Forcing TURN usage by setting ICE Transport Policy in peer connection config.")),this.peerConnection=new RTCPeerConnection(e),this.peerConnection.onsignalingstatechange=e=>this.handleSignalStateChange(e),this.peerConnection.oniceconnectionstatechange=e=>this.handleIceConnectionStateChange(e),this.peerConnection.onicegatheringstatechange=e=>this.handleIceGatheringStateChange(e),this.peerConnection.ontrack=e=>this.handleOnTrack(e),this.peerConnection.onicecandidate=e=>this.handleIceCandidate(e),this.peerConnection.ondatachannel=e=>this.handleDataChannel(e),this.aggregatedStats=new en,this.preferredCodec=t,this.updateCodecSelection=!0}createOffer(e,t){return on(this,void 0,void 0,(function*(){d.Info("Create Offer");const n="localhost"===location.hostname||"127.0.0.1"===location.hostname,s="https:"===location.protocol;let r=t.isFlagEnabled(Nt.UseMic),i=t.isFlagEnabled(Nt.UseCamera);!r&&!i||n||s||(r=!1,i=!1,d.Error("Microphone and Webcam access in the browser will not work if you are not on HTTPS or localhost. Disabling mic and webcam access."),d.Error("For testing you can enable HTTP microphone access Chrome by visiting chrome://flags/ and enabling 'unsafely-treat-insecure-origin-as-secure'")),this.setupTransceiversAsync(r,i).finally((()=>{var t;null===(t=this.peerConnection)||void 0===t||t.createOffer(e).then((e=>{var t;this.showTextOverlayConnecting(),e.sdp=this.mungeSDP(e.sdp,r),null===(t=this.peerConnection)||void 0===t||t.setLocalDescription(e),this.onSendWebRTCOffer(e)})).catch((()=>{this.showTextOverlaySetupFailure()}))}))}))}receiveOffer(e,t){var n;return on(this,void 0,void 0,(function*(){d.Info("Receive Offer"),null===(n=this.peerConnection)||void 0===n||n.setRemoteDescription(e).then((()=>{const n="localhost"===location.hostname||"127.0.0.1"===location.hostname,s="https:"===location.protocol;let r=t.isFlagEnabled(Nt.UseMic),i=t.isFlagEnabled(Nt.UseCamera);!r&&!i||n||s||(r=!1,i=!1,d.Error("Microphone and Webcam access in the browser will not work if you are not on HTTPS or localhost. Disabling mic and webcam access."),d.Error("For testing you can enable HTTP microphone access Chrome by visiting chrome://flags/ and enabling 'unsafely-treat-insecure-origin-as-secure'")),this.config.setOptionSettingOptions(_t.PreferredCodec,this.fuzzyIntersectUEAndBrowserCodecs(e)),this.setupTransceiversAsync(r,i).finally((()=>{var e;null===(e=this.peerConnection)||void 0===e||e.createAnswer().then((e=>{var t;return e.sdp=this.mungeSDP(e.sdp,r),null===(t=this.peerConnection)||void 0===t?void 0:t.setLocalDescription(e)})).then((()=>{var e;this.onSendWebRTCAnswer(null===(e=this.peerConnection)||void 0===e?void 0:e.currentLocalDescription)})).catch((()=>{d.Error("createAnswer() failed")}))}))}))}))}receiveAnswer(e){var t;null===(t=this.peerConnection)||void 0===t||t.setRemoteDescription(e),this.config.setOptionSettingOptions(_t.PreferredCodec,this.fuzzyIntersectUEAndBrowserCodecs(e))}generateStats(){var e,t;const n=e=>{this.aggregatedStats.processStats(e)},s=null===(e=this.peerConnection)||void 0===e?void 0:e.getStats(this.audioTrack).then(n),r=null===(t=this.peerConnection)||void 0===t?void 0:t.getStats(this.videoTrack).then(n);Promise.allSettled([s,r]).then((()=>{this.onVideoStats(this.aggregatedStats),this.updateCodecSelection&&this.aggregatedStats.inboundVideoStats.codecId&&this.config.setOptionSettingValue(_t.PreferredCodec,this.aggregatedStats.codecs.get(this.aggregatedStats.inboundVideoStats.codecId))}))}close(){this.peerConnection&&(this.peerConnection.close(),this.peerConnection=null)}mungeSDP(e,t){let n=e.replace(/(a=fmtp:\d+ .*level-asymmetry-allowed=.*)\r\n/gm,"$1;x-google-start-bitrate=10000;x-google-max-bitrate=100000\r\n"),s="maxaveragebitrate=510000;";return t&&(s+="sprop-maxcapturerate=48000;"),s+=this.config.isFlagEnabled(Nt.ForceMonoAudio)?"stereo=0;":"stereo=1;",s+="useinbandfec=1",n=n.replace("useinbandfec=1",s),n}handleOnIce(e){var t;d.Info("peerconnection handleOnIce"),this.config.isFlagEnabled(Nt.ForceTURN)&&e.candidate.indexOf("relay")<0?d.Info(`Dropping candidate because it was not TURN relay. | Type= ${e.type} | Protocol= ${e.protocol} | Address=${e.address} | Port=${e.port} |`):null===(t=this.peerConnection)||void 0===t||t.addIceCandidate(e)}handleSignalStateChange(e){d.Info("signaling state change: "+e)}handleIceConnectionStateChange(e){d.Info("ice connection state change: "+e),this.onIceConnectionStateChange(e)}handleIceGatheringStateChange(e){d.Info("ice gathering state change: "+JSON.stringify(e))}handleOnTrack(e){e.streams.length<1||"probator"==e.streams[0].id||("video"==e.track.kind&&(this.videoTrack=e.track),"audio"==e.track.kind&&(this.audioTrack=e.track),this.onTrack(e))}handleIceCandidate(e){this.onPeerIceCandidate(e)}handleDataChannel(e){this.onDataChannel(e)}onTrack(e){}onIceConnectionStateChange(e){}onPeerIceCandidate(e){}onDataChannel(e){}fuzzyIntersectUEAndBrowserCodecs(e){const t=new Array,n=this.parseAvailableCodecs(e),s=this.config.getSettingOption(_t.PreferredCodec).options;for(const e of n)if(s.includes(e))t.push(e);else{const n=e.split(" ")[0];for(const e of s)if(e.includes(n)){t.push(e);break}}return t}setupTransceiversAsync(e,t){var n,s,r,i,o,a,l,d;return on(this,void 0,void 0,(function*(){let h=!1;for(const e of null!==(s=null===(n=this.peerConnection)||void 0===n?void 0:n.getTransceivers())&&void 0!==s?s:[])if(e&&e.receiver&&e.receiver.track&&"video"===e.receiver.track.kind){h=!0;break}if(t?yield this.setupVideoSender(h):h||null===(r=this.peerConnection)||void 0===r||r.addTransceiver("video",{direction:"recvonly"}),RTCRtpReceiver.getCapabilities&&""!=this.preferredCodec)for(const e of null!==(o=null===(i=this.peerConnection)||void 0===i?void 0:i.getTransceivers())&&void 0!==o?o:[])if(e&&e.receiver&&e.receiver.track&&"video"===e.receiver.track.kind&&e.setCodecPreferences){const t=this.preferredCodec.split(" "),n={mimeType:"video/"+t[0],clockRate:9e4,sdpFmtpLine:t[1]?t[1]:""},s=[n];RTCRtpReceiver.getCapabilities("video").codecs.forEach((e=>{(e.mimeType!=n.mimeType||(null==e?void 0:e.sdpFmtpLine)!=(null==n?void 0:n.sdpFmtpLine))&&s.push(e)}));for(const e of s)void 0!==(null==e?void 0:e.sdpFmtpLine)&&""!==e.sdpFmtpLine||delete e.sdpFmtpLine;e.setCodecPreferences(s)}let c=!1;for(const e of null!==(l=null===(a=this.peerConnection)||void 0===a?void 0:a.getTransceivers())&&void 0!==l?l:[])if(e&&e.receiver&&e.receiver.track&&"audio"===e.receiver.track.kind){c=!0;break}e?yield this.setupAudioSender(c):c||null===(d=this.peerConnection)||void 0===d||d.addTransceiver("audio",{direction:"recvonly"})}))}setupVideoSender(e){var t,n,s,r;return on(this,void 0,void 0,(function*(){const i=yield navigator.mediaDevices.getUserMedia({video:!0});if(i)if(e){for(const e of null!==(n=null===(t=this.peerConnection)||void 0===t?void 0:t.getTransceivers())&&void 0!==n?n:[])if(rn.canTransceiverReceiveVideo(e))for(const t of i.getTracks())t.kind&&"video"==t.kind&&(e.sender.replaceTrack(t),e.direction="sendrecv")}else for(const e of i.getTracks())e.kind&&"video"==e.kind&&(null===(s=this.peerConnection)||void 0===s||s.addTransceiver(e,{direction:"sendrecv"}));else e||null===(r=this.peerConnection)||void 0===r||r.addTransceiver("video",{direction:"recvonly"})}))}setupAudioSender(e){var t,n,s,r;return on(this,void 0,void 0,(function*(){const i=yield navigator.mediaDevices.getUserMedia({video:!1,audio:{autoGainControl:!1,channelCount:1,echoCancellation:!1,latency:0,noiseSuppression:!1,sampleRate:48e3,sampleSize:16,volume:1}});if(i)if(e){for(const e of null!==(n=null===(t=this.peerConnection)||void 0===t?void 0:t.getTransceivers())&&void 0!==n?n:[])if(rn.canTransceiverReceiveAudio(e))for(const t of i.getTracks())t.kind&&"audio"==t.kind&&(e.sender.replaceTrack(t),e.direction="sendrecv")}else for(const e of i.getTracks())e.kind&&"audio"==e.kind&&(null===(s=this.peerConnection)||void 0===s||s.addTransceiver(e,{direction:"sendrecv"}));else e||null===(r=this.peerConnection)||void 0===r||r.addTransceiver("audio",{direction:"recvonly"})}))}onVideoStats(e){}onSendWebRTCOffer(e){}onSendWebRTCAnswer(e){}showTextOverlayConnecting(){}showTextOverlaySetupFailure(){}parseAvailableCodecs(e){if(!RTCRtpReceiver.getCapabilities)return["Only available on Chrome"];const t=[],n=(0,tn.splitSections)(e.sdp);return n.shift(),n.forEach((e=>{const{codecs:n}=(0,tn.parseRtpParameters)(e),s=/(VP\d|H26\d|AV1).*/;n.forEach((e=>{const n=e.name+" "+Object.keys(e.parameters||{}).map((t=>t+"="+e.parameters[t])).join(";");if(null!==s.exec(n)){"VP9"==e.name&&(e.parameters={"profile-id":"0"});const n=e.name+" "+Object.keys(e.parameters||{}).map((t=>t+"="+e.parameters[t])).join(";");t.push(n)}}))})),t}}class ln{constructor(){this.PixelStreamingSettings=new dn,this.EncoderSettings=new hn,this.WebRTCSettings=new cn}ueCompatible(){null!=this.WebRTCSettings.MaxFPS&&(this.WebRTCSettings.FPS=this.WebRTCSettings.MaxFPS)}}class dn{}class hn{}class cn{}class un{constructor(){this.ReceiptTimeMs=null,this.TransmissionTimeMs=null,this.PreCaptureTimeMs=null,this.PostCaptureTimeMs=null,this.PreEncodeTimeMs=null,this.PostEncodeTimeMs=null,this.EncodeMs=null,this.CaptureToSendMs=null,this.testStartTimeMs=0,this.browserReceiptTimeMs=0,this.latencyExcludingDecode=0,this.testDuration=0,this.networkLatency=0,this.browserSendLatency=0,this.frameDisplayDeltaTimeMs=0,this.endToEndLatency=0,this.encodeLatency=0}setFrameDisplayDeltaTime(e){0==this.frameDisplayDeltaTimeMs&&(this.frameDisplayDeltaTimeMs=Math.round(e))}processFields(){null!=this.EncodeMs||null==this.PreEncodeTimeMs&&null==this.PostEncodeTimeMs||(d.Info(`Setting Encode Ms \n ${this.PostEncodeTimeMs} \n ${this.PreEncodeTimeMs}`),this.EncodeMs=this.PostEncodeTimeMs-this.PreEncodeTimeMs),null!=this.CaptureToSendMs||null==this.PreCaptureTimeMs&&null==this.PostCaptureTimeMs||(d.Info(`Setting CaptureToSendMs Ms \n ${this.PostCaptureTimeMs} \n ${this.PreCaptureTimeMs}`),this.CaptureToSendMs=this.PostCaptureTimeMs-this.PreCaptureTimeMs)}}class gn{static setExtensionFromBytes(e,t){t.receiving||(t.mimetype="",t.extension="",t.receiving=!0,t.valid=!1,t.size=0,t.data=[],t.timestampStart=(new Date).getTime(),d.Info("Received first chunk of file"));const n=new TextDecoder("utf-16").decode(e.slice(1));d.Info(n),t.extension=n}static setMimeTypeFromBytes(e,t){t.receiving||(t.mimetype="",t.extension="",t.receiving=!0,t.valid=!1,t.size=0,t.data=[],t.timestampStart=(new Date).getTime(),d.Info("Received first chunk of file"));const n=new TextDecoder("utf-16").decode(e.slice(1));d.Info(n),t.mimetype=n}static setContentsFromBytes(e,t){if(!t.receiving)return;t.size=Math.ceil(new DataView(e.slice(1,5).buffer).getInt32(0,!0)/16379);const n=e.slice(5);if(t.data.push(n),d.Info(`Received file chunk: ${t.data.length}/${t.size}`),t.data.length===t.size){t.receiving=!1,t.valid=!0,d.Info("Received complete file");const e=(new Date).getTime()-t.timestampStart,n=Math.round(16*t.size*1024/e);d.Info(`Average transfer bitrate: ${n}kb/s over ${e/1e3} seconds`);const s=new Blob(t.data,{type:t.mimetype}),r=document.createElement("a");r.setAttribute("href",URL.createObjectURL(s)),r.setAttribute("download",`transfer.${t.extension}`),document.body.append(r),r.remove()}else t.data.length>t.size&&(t.receiving=!1,d.Error(`Received bigger file than advertised: ${t.data.length}/${t.size}`))}}class mn{constructor(){this.mimetype="",this.extension="",this.receiving=!1,this.size=0,this.data=[],this.valid=!1}}class pn{}pn.backSpace=8,pn.shift=16,pn.control=17,pn.alt=18,pn.rightShift=253,pn.rightControl=254,pn.rightAlt=255;const fn=Object.freeze({Escape:27,Digit0:48,Digit1:49,Digit2:50,Digit3:51,Digit4:52,Digit5:53,Digit6:54,Digit7:55,Digit8:56,Digit9:57,Minus:173,Equal:187,Backspace:8,Tab:9,KeyQ:81,KeyW:87,KeyE:69,KeyR:82,KeyT:84,KeyY:89,KeyU:85,KeyI:73,KeyO:79,KeyP:80,BracketLeft:219,BracketRight:221,Enter:13,ControlLeft:17,KeyA:65,KeyS:83,KeyD:68,KeyF:70,KeyG:71,KeyH:72,KeyJ:74,KeyK:75,KeyL:76,Semicolon:186,Quote:222,Backquote:192,ShiftLeft:16,Backslash:220,KeyZ:90,KeyX:88,KeyC:67,KeyV:86,KeyB:66,KeyN:78,KeyM:77,Comma:188,Period:190,Slash:191,ShiftRight:253,AltLeft:18,Space:32,CapsLock:20,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,Pause:19,ScrollLock:145,NumpadDivide:111,NumpadMultiply:106,NumpadSubtract:109,NumpadAdd:107,NumpadDecimal:110,Numpad9:105,Numpad8:104,Numpad7:103,Numpad6:102,Numpad5:101,Numpad4:100,Numpad3:99,Numpad2:98,Numpad1:97,Numpad0:96,NumLock:144,ControlRight:254,AltRight:255,Home:36,End:35,ArrowUp:38,ArrowLeft:37,ArrowRight:39,ArrowDown:40,PageUp:33,PageDown:34,Insert:45,Delete:46,ContextMenu:93});class yn{constructor(e,t,n){this.streamMessageController=e,this.config=t,this.activeKeys=n,this.onKeyDownListener=this.handleOnKeyDown.bind(this),this.onKeyUpListener=this.handleOnKeyUp.bind(this),this.onKeyPressListener=this.handleOnKeyPress.bind(this),this.onCompositionEndListener=this.handleOnCompositionEnd.bind(this)}register(){document.addEventListener("compositionend",this.onCompositionEndListener),document.addEventListener("keydown",this.onKeyDownListener),document.addEventListener("keyup",this.onKeyUpListener),document.addEventListener("keypress",this.onKeyPressListener)}unregister(){document.removeEventListener("compositionend",this.onCompositionEndListener),document.removeEventListener("keydown",this.onKeyDownListener),document.removeEventListener("keyup",this.onKeyUpListener),document.removeEventListener("keypress",this.onKeyPressListener)}handleOnKeyDown(e){const t=this.getKeycode(e);t&&229!==t&&(this.streamMessageController.toStreamerHandlers.get("KeyDown")([this.getKeycode(e),e.repeat?1:0]),this.activeKeys.getActiveKeys().push(t),t===pn.backSpace&&document.dispatchEvent(new KeyboardEvent("keypress",{charCode:pn.backSpace})),this.config.isFlagEnabled(Nt.SuppressBrowserKeys)&&this.isKeyCodeBrowserKey(t)&&e.preventDefault())}handleOnKeyUp(e){const t=this.getKeycode(e);t&&(this.streamMessageController.toStreamerHandlers.get("KeyUp")([t]),this.config.isFlagEnabled(Nt.SuppressBrowserKeys)&&this.isKeyCodeBrowserKey(t)&&e.preventDefault())}handleOnKeyPress(e){const t=this.getKeycode(e);t&&this.streamMessageController.toStreamerHandlers.get("KeyPress")([t])}handleOnCompositionEnd(e){e.data&&e.data.length&&e.data.split("").forEach((e=>{this.handleOnKeyDown(new KeyboardEvent("keydown",{keyCode:e.toUpperCase().charCodeAt(0),charCode:e.charCodeAt(0)})),this.handleOnKeyPress(new KeyboardEvent("keypress",{keyCode:e.toUpperCase().charCodeAt(0),charCode:e.charCodeAt(0)})),this.handleOnKeyUp(new KeyboardEvent("keyup",{keyCode:e.toUpperCase().charCodeAt(0),charCode:e.charCodeAt(0)}))}))}getKeycode(e){if(!("keyCode"in e)){const t=e;return t.code in fn?fn[t.code]:(d.Warning(`Keyboard code of ${t.code} is not supported in our mapping, ignoring this key.`),null)}return e.keyCode===pn.shift&&"ShiftRight"===e.code?pn.rightShift:e.keyCode===pn.control&&"ControlRight"===e.code?pn.rightControl:e.keyCode===pn.alt&&"AltRight"===e.code?pn.rightAlt:e.keyCode}isKeyCodeBrowserKey(e){return e>=112&&e<=123||9===e}}class vn{}vn.mainButton=0,vn.auxiliaryButton=1,vn.secondaryButton=2,vn.fourthButton=3,vn.fifthButton=4;class wn{}wn.primaryButton=1,wn.secondaryButton=2,wn.auxiliaryButton=4,wn.fourthButton=8,wn.fifthButton=16;class Sn{constructor(e,t,n,s){this.streamMessageController=e,this.coordinateConverter=n,this.videoPlayer=t,this.activeKeys=s,this.onEnterListener=this.onMouseEnter.bind(this),this.onLeaveListener=this.onMouseLeave.bind(this)}register(){this.registerMouseEnterAndLeaveEvents()}unregister(){this.unregisterMouseEnterAndLeaveEvents()}registerMouseEnterAndLeaveEvents(){const e=this.videoPlayer.getVideoParentElement();e.addEventListener("mouseenter",this.onEnterListener),e.addEventListener("mouseleave",this.onLeaveListener)}unregisterMouseEnterAndLeaveEvents(){const e=this.videoPlayer.getVideoParentElement();e.removeEventListener("mouseenter",this.onEnterListener),e.removeEventListener("mouseleave",this.onLeaveListener)}onMouseEnter(e){this.videoPlayer.isVideoReady()&&(this.streamMessageController.toStreamerHandlers.get("MouseEnter")(),this.pressMouseButtons(e.buttons,e.x,e.y))}onMouseLeave(e){this.videoPlayer.isVideoReady()&&(this.streamMessageController.toStreamerHandlers.get("MouseLeave")(),this.releaseMouseButtons(e.buttons,e.x,e.y))}releaseMouseButtons(e,t,n){const s=this.coordinateConverter.translateUnsigned(t,n);e&wn.primaryButton&&this.sendMouseUp(vn.mainButton,s.x,s.y),e&wn.secondaryButton&&this.sendMouseUp(vn.secondaryButton,s.x,s.y),e&wn.auxiliaryButton&&this.sendMouseUp(vn.auxiliaryButton,s.x,s.y),e&wn.fourthButton&&this.sendMouseUp(vn.fourthButton,s.x,s.y),e&wn.fifthButton&&this.sendMouseUp(vn.fifthButton,s.x,s.y)}pressMouseButtons(e,t,n){if(!this.videoPlayer.isVideoReady())return;const s=this.coordinateConverter.translateUnsigned(t,n);e&wn.primaryButton&&this.sendMouseDown(vn.mainButton,s.x,s.y),e&wn.secondaryButton&&this.sendMouseDown(vn.secondaryButton,s.x,s.y),e&wn.auxiliaryButton&&this.sendMouseDown(vn.auxiliaryButton,s.x,s.y),e&wn.fourthButton&&this.sendMouseDown(vn.fourthButton,s.x,s.y),e&wn.fifthButton&&this.sendMouseDown(vn.fifthButton,s.x,s.y)}sendMouseDown(e,t,n){var s;null===(s=this.streamMessageController.toStreamerHandlers.get("MouseDown"))||void 0===s||s([e,t,n])}sendMouseUp(e,t,n){var s;const r=this.coordinateConverter.translateUnsigned(t,n);null===(s=this.streamMessageController.toStreamerHandlers.get("MouseUp"))||void 0===s||s([e,r.x,r.y])}}class bn extends Sn{constructor(e,t,n,s){super(e,t,n,s),this.videoElementParent=t.getVideoParentElement(),this.x=this.videoElementParent.getBoundingClientRect().width/2,this.y=this.videoElementParent.getBoundingClientRect().height/2,this.normalizedCoord=this.coordinateConverter.translateUnsigned(this.x,this.y),this.onRequestLockListener=this.onRequestLock.bind(this),this.onLockStateChangeListener=this.onLockStateChange.bind(this),this.onMouseUpListener=this.onMouseUp.bind(this),this.onMouseDownListener=this.onMouseDown.bind(this),this.onMouseDblClickListener=this.onMouseDblClick.bind(this),this.onMouseWheelListener=this.onMouseWheel.bind(this),this.onMouseMoveListener=this.onMouseMove.bind(this)}register(){super.register(),this.videoElementParent.requestPointerLock=this.videoElementParent.requestPointerLock||this.videoElementParent.mozRequestPointerLock,document.exitPointerLock=document.exitPointerLock||document.mozExitPointerLock,this.videoElementParent.requestPointerLock&&this.videoElementParent.addEventListener("click",this.onRequestLockListener),document.addEventListener("pointerlockchange",this.onLockStateChangeListener),document.addEventListener("mozpointerlockchange",this.onLockStateChangeListener),this.videoElementParent.addEventListener("mousedown",this.onMouseDownListener),this.videoElementParent.addEventListener("mouseup",this.onMouseUpListener),this.videoElementParent.addEventListener("wheel",this.onMouseWheelListener),this.videoElementParent.addEventListener("dblclick",this.onMouseDblClickListener)}unregister(){const e=document.pointerLockElement||document.mozPointerLockElement;document.exitPointerLock&&e===this.videoElementParent&&document.exitPointerLock(),this.videoElementParent.removeEventListener("click",this.onRequestLockListener),document.removeEventListener("pointerlockchange",this.onLockStateChangeListener),document.removeEventListener("mozpointerlockchange",this.onLockStateChangeListener),document.removeEventListener("mousemove",this.onMouseMoveListener),this.videoElementParent.removeEventListener("mousedown",this.onMouseDownListener),this.videoElementParent.removeEventListener("mouseup",this.onMouseUpListener),this.videoElementParent.removeEventListener("wheel",this.onMouseWheelListener),this.videoElementParent.removeEventListener("dblclick",this.onMouseDblClickListener),super.unregister()}onRequestLock(){this.videoElementParent.requestPointerLock()}onLockStateChange(){(document.pointerLockElement||document.mozPointerLockElement)===this.videoElementParent?(d.Info("Pointer locked"),document.addEventListener("mousemove",this.onMouseMoveListener)):(d.Info("The pointer lock status is now unlocked"),document.removeEventListener("mousemove",this.onMouseMoveListener),this.activeKeys.getActiveKeys().forEach((e=>{this.streamMessageController.toStreamerHandlers.get("KeyUp")([e])})))}onMouseDown(e){this.videoPlayer.isVideoReady()&&this.streamMessageController.toStreamerHandlers.get("MouseDown")([e.button,this.normalizedCoord.x,this.normalizedCoord.y])}onMouseUp(e){this.videoPlayer.isVideoReady()&&this.streamMessageController.toStreamerHandlers.get("MouseUp")([e.button,this.normalizedCoord.x,this.normalizedCoord.y])}onMouseMove(e){if(!this.videoPlayer.isVideoReady())return;const t=this.videoPlayer.getVideoParentElement().clientWidth,n=this.videoPlayer.getVideoParentElement().clientHeight;for(this.x+=e.movementX,this.y+=e.movementY;this.x>t;)this.x-=t;for(;this.y>n;)this.y-=n;for(;this.x<0;)this.x+=t;for(;this.y<0;)this.y+=n;this.normalizedCoord=this.coordinateConverter.translateUnsigned(this.x,this.y);const s=this.coordinateConverter.translateSigned(e.movementX,e.movementY);this.streamMessageController.toStreamerHandlers.get("MouseMove")([this.normalizedCoord.x,this.normalizedCoord.y,s.x,s.y])}onMouseWheel(e){this.videoPlayer.isVideoReady()&&this.streamMessageController.toStreamerHandlers.get("MouseWheel")([e.wheelDelta,this.normalizedCoord.x,this.normalizedCoord.y])}onMouseDblClick(e){this.videoPlayer.isVideoReady()&&this.streamMessageController.toStreamerHandlers.get("MouseDouble")([e.button,this.normalizedCoord.x,this.normalizedCoord.y])}}class Cn extends Sn{constructor(e,t,n,s){super(e,t,n,s),this.videoElementParent=t.getVideoParentElement(),this.onMouseUpListener=this.onMouseUp.bind(this),this.onMouseDownListener=this.onMouseDown.bind(this),this.onMouseDblClickListener=this.onMouseDblClick.bind(this),this.onMouseWheelListener=this.onMouseWheel.bind(this),this.onMouseMoveListener=this.onMouseMove.bind(this),this.onContextMenuListener=this.onContextMenu.bind(this)}register(){super.register(),this.videoElementParent.addEventListener("mousemove",this.onMouseMoveListener),this.videoElementParent.addEventListener("mousedown",this.onMouseDownListener),this.videoElementParent.addEventListener("mouseup",this.onMouseUpListener),this.videoElementParent.addEventListener("contextmenu",this.onContextMenuListener),this.videoElementParent.addEventListener("wheel",this.onMouseWheelListener),this.videoElementParent.addEventListener("dblclick",this.onMouseDblClickListener)}unregister(){this.videoElementParent.removeEventListener("mousemove",this.onMouseMoveListener),this.videoElementParent.removeEventListener("mousedown",this.onMouseDownListener),this.videoElementParent.removeEventListener("mouseup",this.onMouseUpListener),this.videoElementParent.removeEventListener("contextmenu",this.onContextMenuListener),this.videoElementParent.removeEventListener("wheel",this.onMouseWheelListener),this.videoElementParent.removeEventListener("dblclick",this.onMouseDblClickListener),super.unregister()}onMouseDown(e){if(!this.videoPlayer.isVideoReady())return;const t=this.coordinateConverter.translateUnsigned(e.offsetX,e.offsetY);this.streamMessageController.toStreamerHandlers.get("MouseDown")([e.button,t.x,t.y]),e.preventDefault()}onMouseUp(e){if(!this.videoPlayer.isVideoReady())return;const t=this.coordinateConverter.translateUnsigned(e.offsetX,e.offsetY);this.streamMessageController.toStreamerHandlers.get("MouseUp")([e.button,t.x,t.y]),e.preventDefault()}onContextMenu(e){this.videoPlayer.isVideoReady()&&e.preventDefault()}onMouseMove(e){if(!this.videoPlayer.isVideoReady())return;const t=this.coordinateConverter.translateUnsigned(e.offsetX,e.offsetY),n=this.coordinateConverter.translateSigned(e.movementX,e.movementY);this.streamMessageController.toStreamerHandlers.get("MouseMove")([t.x,t.y,n.x,n.y]),e.preventDefault()}onMouseWheel(e){if(!this.videoPlayer.isVideoReady())return;const t=this.coordinateConverter.translateUnsigned(e.offsetX,e.offsetY);this.streamMessageController.toStreamerHandlers.get("MouseWheel")([e.wheelDelta,t.x,t.y]),e.preventDefault()}onMouseDblClick(e){if(!this.videoPlayer.isVideoReady())return;const t=this.coordinateConverter.translateUnsigned(e.offsetX,e.offsetY);this.streamMessageController.toStreamerHandlers.get("MouseDouble")([e.button,t.x,t.y])}}class Tn{constructor(e,t,n){this.fingers=[9,8,7,6,5,4,3,2,1,0],this.fingerIds=new Map,this.maxByteValue=255,this.streamMessageController=e,this.videoPlayer=t,this.coordinateConverter=n,this.videoElementParent=t.getVideoElement(),this.onTouchStartListener=this.onTouchStart.bind(this),this.onTouchEndListener=this.onTouchEnd.bind(this),this.onTouchMoveListener=this.onTouchMove.bind(this)}register(){this.videoElementParent.addEventListener("touchstart",this.onTouchStartListener),this.videoElementParent.addEventListener("touchend",this.onTouchEndListener),this.videoElementParent.addEventListener("touchmove",this.onTouchMoveListener)}unregister(){this.videoElementParent.addEventListener("touchstart",this.onTouchStartListener),this.videoElementParent.addEventListener("touchend",this.onTouchEndListener),this.videoElementParent.addEventListener("touchmove",this.onTouchMoveListener)}rememberTouch(e){const t=this.fingers.pop();void 0===t&&d.Info("exhausted touch identifiers"),this.fingerIds.set(e.identifier,t)}forgetTouch(e){this.fingers.push(this.fingerIds.get(e.identifier)),this.fingers.sort((function(e,t){return t-e})),this.fingerIds.delete(e.identifier)}onTouchStart(e){if(this.videoPlayer.isVideoReady()){for(let t=0;t<e.changedTouches.length;t++)this.rememberTouch(e.changedTouches[t]);this.emitTouchData("TouchStart",e.changedTouches),e.preventDefault()}}onTouchEnd(e){if(this.videoPlayer.isVideoReady()){this.emitTouchData("TouchEnd",e.changedTouches);for(let t=0;t<e.changedTouches.length;t++)this.forgetTouch(e.changedTouches[t]);e.preventDefault()}}onTouchMove(e){this.videoPlayer.isVideoReady()&&(this.emitTouchData("TouchMove",e.touches),e.preventDefault())}emitTouchData(e,t){if(!this.videoPlayer.isVideoReady())return;const n=this.videoPlayer.getVideoParentElement().getBoundingClientRect(),s=this.streamMessageController.toStreamerHandlers;for(let r=0;r<t.length;r++){const i=1,o=t[r],a=o.clientX-n.left,l=o.clientY-n.top;d.Info(`F${this.fingerIds.get(o.identifier)}=(${a}, ${l})`);const h=this.coordinateConverter.translateUnsigned(a,l);switch(e){case"TouchStart":s.get("TouchStart")([i,h.x,h.y,this.fingerIds.get(o.identifier),this.maxByteValue*(o.force>0?o.force:1),h.inRange?1:0]);break;case"TouchEnd":s.get("TouchEnd")([i,h.x,h.y,this.fingerIds.get(o.identifier),this.maxByteValue*o.force,h.inRange?1:0]);break;case"TouchMove":s.get("TouchMove")([i,h.x,h.y,this.fingerIds.get(o.identifier),this.maxByteValue*(o.force>0?o.force:1),h.inRange?1:0])}}}}class En{constructor(e,t,n){this.streamMessageController=e,this.videoPlayer=t,this.coordinateConverter=n,this.onTouchStartListener=this.onTouchStart.bind(this),this.onTouchEndListener=this.onTouchEnd.bind(this),this.onTouchMoveListener=this.onTouchMove.bind(this),this.videoElementParentClientRect=this.videoPlayer.getVideoParentElement().getBoundingClientRect()}register(){document.addEventListener("touchstart",this.onTouchStartListener),document.addEventListener("touchend",this.onTouchEndListener),document.addEventListener("touchmove",this.onTouchMoveListener)}unregister(){document.removeEventListener("touchstart",this.onTouchStartListener),document.removeEventListener("touchend",this.onTouchEndListener),document.removeEventListener("touchmove",this.onTouchMoveListener)}onTouchStart(e){if(this.videoPlayer.isVideoReady()&&e.target===this.videoPlayer.getVideoElement()){if(null==this.fakeTouchFinger){const t=e.changedTouches[0];this.fakeTouchFinger={id:t.identifier,x:t.clientX-this.videoElementParentClientRect.left,y:t.clientY-this.videoElementParentClientRect.top};const n=this.videoPlayer.getVideoParentElement(),s=new MouseEvent("mouseenter",t);n.dispatchEvent(s);const r=this.coordinateConverter.translateUnsigned(this.fakeTouchFinger.x,this.fakeTouchFinger.y);this.streamMessageController.toStreamerHandlers.get("MouseDown")([vn.mainButton,r.x,r.y])}e.preventDefault()}}onTouchEnd(e){if(!this.videoPlayer.isVideoReady()||null==this.fakeTouchFinger)return;const t=this.videoPlayer.getVideoParentElement(),n=this.streamMessageController.toStreamerHandlers;for(let s=0;s<e.changedTouches.length;s++){const r=e.changedTouches[s];if(r.identifier===this.fakeTouchFinger.id){const e=r.clientX-this.videoElementParentClientRect.left,s=r.clientY-this.videoElementParentClientRect.top,i=this.coordinateConverter.translateUnsigned(e,s);n.get("MouseUp")([vn.mainButton,i.x,i.y]);const o=new MouseEvent("mouseleave",r);t.dispatchEvent(o),this.fakeTouchFinger=null;break}}e.preventDefault()}onTouchMove(e){if(!this.videoPlayer.isVideoReady()||null==this.fakeTouchFinger)return;const t=this.streamMessageController.toStreamerHandlers;for(let n=0;n<e.touches.length;n++){const s=e.touches[n];if(s.identifier===this.fakeTouchFinger.id){const e=s.clientX-this.videoElementParentClientRect.left,n=s.clientY-this.videoElementParentClientRect.top,r=this.coordinateConverter.translateUnsigned(e,n),i=this.coordinateConverter.translateSigned(e-this.fakeTouchFinger.x,n-this.fakeTouchFinger.y);t.get("MouseMove")([r.x,r.y,i.x,i.y]),this.fakeTouchFinger.x=e,this.fakeTouchFinger.y=n;break}}e.preventDefault()}}function Mn(e){return JSON.parse(JSON.stringify({buttons:e.buttons.map((e=>JSON.parse(JSON.stringify({pressed:e.pressed,touched:e.touched,value:e.value})))),axes:e.axes}))}var kn,Rn;!function(e){e[e.RightClusterBottomButton=0]="RightClusterBottomButton",e[e.RightClusterRightButton=1]="RightClusterRightButton",e[e.RightClusterLeftButton=2]="RightClusterLeftButton",e[e.RightClusterTopButton=3]="RightClusterTopButton",e[e.LeftShoulder=4]="LeftShoulder",e[e.RightShoulder=5]="RightShoulder",e[e.LeftTrigger=6]="LeftTrigger",e[e.RightTrigger=7]="RightTrigger",e[e.SelectOrBack=8]="SelectOrBack",e[e.StartOrForward=9]="StartOrForward",e[e.LeftAnalogPress=10]="LeftAnalogPress",e[e.RightAnalogPress=11]="RightAnalogPress",e[e.LeftClusterTopButton=12]="LeftClusterTopButton",e[e.LeftClusterBottomButton=13]="LeftClusterBottomButton",e[e.LeftClusterLeftButton=14]="LeftClusterLeftButton",e[e.LeftClusterRightButton=15]="LeftClusterRightButton",e[e.CentreButton=16]="CentreButton",e[e.LeftStickHorizontal=0]="LeftStickHorizontal",e[e.LeftStickVertical=1]="LeftStickVertical",e[e.RightStickHorizontal=2]="RightStickHorizontal",e[e.RightStickVertical=3]="RightStickVertical"}(kn||(kn={}));class Pn{constructor(e){this.streamMessageController=e,this.onGamepadConnectedListener=this.onGamepadConnected.bind(this),this.onGamepadDisconnectedListener=this.onGamepadDisconnected.bind(this),this.beforeUnloadListener=this.onBeforeUnload.bind(this),this.requestAnimationFrame=(window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.requestAnimationFrame).bind(window)}register(){window.addEventListener("beforeunload",this.beforeUnloadListener);const e=window;if("GamepadEvent"in e?(window.addEventListener("gamepadconnected",this.onGamepadConnectedListener),window.addEventListener("gamepaddisconnected",this.onGamepadDisconnectedListener)):"WebKitGamepadEvent"in e&&(window.addEventListener("webkitgamepadconnected",this.onGamepadConnectedListener),window.addEventListener("webkitgamepaddisconnected",this.onGamepadDisconnectedListener)),this.controllers=[],navigator.getGamepads)for(const e of navigator.getGamepads())e&&this.onGamepadConnected(new GamepadEvent("gamepadconnected",{gamepad:e}))}unregister(){window.removeEventListener("gamepadconnected",this.onGamepadConnectedListener),window.removeEventListener("gamepaddisconnected",this.onGamepadDisconnectedListener),window.removeEventListener("webkitgamepadconnected",this.onGamepadConnectedListener),window.removeEventListener("webkitgamepaddisconnected",this.onGamepadDisconnectedListener);for(const e of this.controllers)void 0!==e.id&&this.streamMessageController.toStreamerHandlers.get("GamepadDisconnected")([e.id]);this.controllers=[]}onGamepadResponseReceived(e){for(const t of this.controllers)if(void 0===t.id){t.id=e;break}}onGamepadConnected(e){const t=e.gamepad,n={currentState:Mn(t),prevState:Mn(t),id:void 0};this.controllers[t.index]=n,window.requestAnimationFrame((()=>this.updateStatus())),this.streamMessageController.toStreamerHandlers.get("GamepadConnected")()}onGamepadDisconnected(e){const t=e.gamepad,n=this.controllers[t.index];delete this.controllers[t.index],this.controllers=this.controllers.filter((e=>void 0!==e)),this.streamMessageController.toStreamerHandlers.get("GamepadDisconnected")([n.id])}scanGamepads(){const e=navigator.getGamepads?navigator.getGamepads():navigator.webkitGetGamepads?navigator.webkitGetGamepads():[];for(let t=0;t<e.length;t++)e[t]&&e[t].index in this.controllers&&(this.controllers[e[t].index].currentState=e[t])}updateStatus(){this.scanGamepads();const e=this.streamMessageController.toStreamerHandlers;for(const t of this.controllers){const n=void 0===t.id?this.controllers.indexOf(t):t.id,s=t.currentState;for(let s=0;s<t.currentState.buttons.length;s++){const r=t.currentState.buttons[s],i=t.prevState.buttons[s];r.pressed?s==kn.LeftTrigger?e.get("GamepadAnalog")([n,5,r.value]):s==kn.RightTrigger?e.get("GamepadAnalog")([n,6,r.value]):e.get("GamepadButtonPressed")([n,s,i.pressed?1:0]):!r.pressed&&i.pressed&&(s==kn.LeftTrigger?e.get("GamepadAnalog")([n,5,0]):s==kn.RightTrigger?e.get("GamepadAnalog")([n,6,0]):e.get("GamepadButtonReleased")([n,s,0]))}for(let t=0;t<s.axes.length;t+=2){const r=parseFloat(s.axes[t].toFixed(4)),i=-parseFloat(s.axes[t+1].toFixed(4));e.get("GamepadAnalog")([n,t+1,r]),e.get("GamepadAnalog")([n,t+2,i])}this.controllers[n].prevState=Mn(s)}this.controllers.length>0&&this.requestAnimationFrame((()=>this.updateStatus()))}onBeforeUnload(e){for(const e of this.controllers)this.streamMessageController.toStreamerHandlers.get("GamepadDisconnected")([e.id])}}class In{constructor(e,t,n){this.activeKeys=new Ln,this.toStreamerMessagesProvider=e,this.videoElementProvider=t,this.coordinateConverter=n}registerKeyBoard(e){d.Info("Register Keyboard Events");const t=new yn(this.toStreamerMessagesProvider,e,this.activeKeys);return t.register(),t}registerMouse(e){let t;return d.Info("Register Mouse Events"),t=e==jt.HoveringMouse?new Cn(this.toStreamerMessagesProvider,this.videoElementProvider,this.coordinateConverter,this.activeKeys):new bn(this.toStreamerMessagesProvider,this.videoElementProvider,this.coordinateConverter,this.activeKeys),t.register(),t}registerTouch(e){let t;return d.Info("Registering Touch"),t=e?new En(this.toStreamerMessagesProvider,this.videoElementProvider,this.coordinateConverter):new Tn(this.toStreamerMessagesProvider,this.videoElementProvider,this.coordinateConverter),t.register(),t}registerGamePad(){d.Info("Register Game Pad");const e=new Pn(this.toStreamerMessagesProvider);return e.register(),e}}class Ln{constructor(){this.activeKeys=[],this.activeKeys=[]}getActiveKeys(){return this.activeKeys}}class xn{constructor(e,t){this.lastTimeResized=(new Date).getTime(),this.videoElement=document.createElement("video"),this.config=t,this.videoElement.id="streamingVideo",this.videoElement.disablePictureInPicture=!0,this.videoElement.playsInline=!0,this.videoElement.style.width="100%",this.videoElement.style.height="100%",this.videoElement.style.position="absolute",this.videoElement.style.pointerEvents="all",e.appendChild(this.videoElement),this.onResizePlayerCallback=()=>{console.log("Resolution changed, restyling player, did you forget to override this function?")},this.onMatchViewportResolutionCallback=()=>{console.log("Resolution changed and match viewport resolution is turned on, did you forget to override this function?")},this.videoElement.onclick=()=>{null!=this.audioElement&&this.audioElement.paused&&this.audioElement.play(),this.videoElement.paused&&this.videoElement.play()},this.videoElement.onloadedmetadata=()=>{this.onVideoInitialized()},window.addEventListener("resize",(()=>this.resizePlayerStyle()),!0),window.addEventListener("orientationchange",(()=>this.onOrientationChange()))}setAudioElement(e){this.audioElement=e}play(){return this.videoElement.muted=this.config.isFlagEnabled(Nt.StartVideoMuted),this.videoElement.autoplay=this.config.isFlagEnabled(Nt.AutoPlayVideo),this.videoElement.play()}isPaused(){return this.videoElement.paused}isVideoReady(){return void 0!==this.videoElement.readyState&&this.videoElement.readyState>0}hasVideoSource(){return void 0!==this.videoElement.srcObject&&null!==this.videoElement.srcObject}getVideoElement(){return this.videoElement}getVideoParentElement(){return this.videoElement.parentElement}setVideoEnabled(e){this.videoElement.srcObject.getTracks().forEach((t=>t.enabled=e))}onVideoInitialized(){}onOrientationChange(){clearTimeout(this.orientationChangeTimeout),this.orientationChangeTimeout=window.setTimeout((()=>{this.resizePlayerStyle()}),500)}resizePlayerStyle(){const e=this.getVideoParentElement();e&&(this.updateVideoStreamSize(),e.classList.contains("fixed-size")||this.resizePlayerStyleToFillParentElement(),this.onResizePlayerCallback())}resizePlayerStyleToFillParentElement(){this.getVideoParentElement().setAttribute("style","top: 0px; left: 0px; width: 100%; height: 100%; cursor: default;")}updateVideoStreamSize(){if(this.config.isFlagEnabled(Nt.MatchViewportResolution))if((new Date).getTime()-this.lastTimeResized>300){const e=this.getVideoParentElement();if(!e)return;this.onMatchViewportResolutionCallback(e.clientWidth,e.clientHeight),this.lastTimeResized=(new Date).getTime()}else d.Info("Resizing too often - skipping"),clearTimeout(this.resizeTimeoutHandle),this.resizeTimeoutHandle=window.setTimeout((()=>this.updateVideoStreamSize()),100)}}class Fn{constructor(){this.toStreamerHandlers=new Map,this.fromStreamerHandlers=new Map,this.toStreamerMessages=new Map,this.fromStreamerMessages=new Map}populateDefaultProtocol(){this.toStreamerMessages.set("IFrameRequest",{id:0,structure:[]}),this.toStreamerMessages.set("RequestQualityControl",{id:1,structure:[]}),this.toStreamerMessages.set("FpsRequest",{id:2,structure:[]}),this.toStreamerMessages.set("AverageBitrateRequest",{id:3,structure:[]}),this.toStreamerMessages.set("StartStreaming",{id:4,structure:[]}),this.toStreamerMessages.set("StopStreaming",{id:5,structure:[]}),this.toStreamerMessages.set("LatencyTest",{id:6,structure:["string"]}),this.toStreamerMessages.set("RequestInitialSettings",{id:7,structure:[]}),this.toStreamerMessages.set("TestEcho",{id:8,structure:[]}),this.toStreamerMessages.set("DataChannelLatencyTest",{id:9,structure:[]}),this.toStreamerMessages.set("UIInteraction",{id:50,structure:["string"]}),this.toStreamerMessages.set("Command",{id:51,structure:["string"]}),this.toStreamerMessages.set("KeyDown",{id:60,structure:["uint8","uint8"]}),this.toStreamerMessages.set("KeyUp",{id:61,structure:["uint8"]}),this.toStreamerMessages.set("KeyPress",{id:62,structure:["uint16"]}),this.toStreamerMessages.set("MouseEnter",{id:70,structure:[]}),this.toStreamerMessages.set("MouseLeave",{id:71,structure:[]}),this.toStreamerMessages.set("MouseDown",{id:72,structure:["uint8","uint16","uint16"]}),this.toStreamerMessages.set("MouseUp",{id:73,structure:["uint8","uint16","uint16"]}),this.toStreamerMessages.set("MouseMove",{id:74,structure:["uint16","uint16","int16","int16"]}),this.toStreamerMessages.set("MouseWheel",{id:75,structure:["int16","uint16","uint16"]}),this.toStreamerMessages.set("MouseDouble",{id:76,structure:["uint8","uint16","uint16"]}),this.toStreamerMessages.set("TouchStart",{id:80,structure:["uint8","uint16","uint16","uint8","uint8","uint8"]}),this.toStreamerMessages.set("TouchEnd",{id:81,structure:["uint8","uint16","uint16","uint8","uint8","uint8"]}),this.toStreamerMessages.set("TouchMove",{id:82,structure:["uint8","uint16","uint16","uint8","uint8","uint8"]}),this.toStreamerMessages.set("GamepadConnected",{id:93,structure:[]}),this.toStreamerMessages.set("GamepadButtonPressed",{id:90,structure:["uint8","uint8","uint8"]}),this.toStreamerMessages.set("GamepadButtonReleased",{id:91,structure:["uint8","uint8","uint8"]}),this.toStreamerMessages.set("GamepadAnalog",{id:92,structure:["uint8","uint8","double"]}),this.toStreamerMessages.set("GamepadDisconnected",{id:94,structure:["uint8"]}),this.fromStreamerMessages.set(0,"QualityControlOwnership"),this.fromStreamerMessages.set(1,"Response"),this.fromStreamerMessages.set(2,"Command"),this.fromStreamerMessages.set(3,"FreezeFrame"),this.fromStreamerMessages.set(4,"UnfreezeFrame"),this.fromStreamerMessages.set(5,"VideoEncoderAvgQP"),this.fromStreamerMessages.set(6,"LatencyTest"),this.fromStreamerMessages.set(7,"InitialSettings"),this.fromStreamerMessages.set(8,"FileExtension"),this.fromStreamerMessages.set(9,"FileMimeType"),this.fromStreamerMessages.set(10,"FileContents"),this.fromStreamerMessages.set(11,"TestEcho"),this.fromStreamerMessages.set(12,"InputControlOwnership"),this.fromStreamerMessages.set(13,"GamepadResponse"),this.fromStreamerMessages.set(14,"DataChannelLatencyTest"),this.fromStreamerMessages.set(255,"Protocol")}registerMessageHandler(e,t,n){switch(e){case Rn.ToStreamer:this.toStreamerHandlers.set(t,n);break;case Rn.FromStreamer:this.fromStreamerHandlers.set(t,n);break;default:d.Info(`Unknown message direction ${e}`)}}}!function(e){e[e.ToStreamer=0]="ToStreamer",e[e.FromStreamer=1]="FromStreamer"}(Rn||(Rn={}));class On{constructor(){this.responseEventListeners=new Map}addResponseEventListener(e,t){this.responseEventListeners.set(e,t)}removeResponseEventListener(e){this.responseEventListeners.delete(e)}onResponse(e){d.Info("DataChannelReceiveMessageType.Response");const t=new TextDecoder("utf-16").decode(e.slice(1));d.Info(t),this.responseEventListeners.forEach((e=>{e(t)}))}}class Dn{constructor(e,t){this.dataChannelSender=e,this.toStreamerMessagesMapProvider=t}sendMessageToStreamer(e,t){void 0===t&&(t=[]);const n=this.toStreamerMessagesMapProvider.toStreamerMessages.get(e);if(void 0===n)return void d.Error(`Attempted to send a message to the streamer with message type: ${e}, but the frontend hasn't been configured to send such a message. Check you've added the message type in your cpp`);if(n.structure&&t&&n.structure.length!==t.length)return void d.Error(`Provided message data doesn't match expected layout. Expected [ ${n.structure.map((e=>{switch(e){case"uint8":case"uint16":case"int16":case"float":case"double":return"number";case"string":return"string"}})).toString()} ] but received [ ${t.map((e=>typeof e)).toString()} ]`);let s=0;const r=new TextEncoder;t.forEach(((e,t)=>{switch(n.structure[t]){case"uint8":s+=1;break;case"uint16":case"int16":s+=2;break;case"float":s+=4;break;case"double":s+=8;break;case"string":s+=2,s+=2*r.encode(e).length}}));const i=new DataView(new ArrayBuffer(s+1));i.setUint8(0,n.id);let o=1;t.forEach(((e,t)=>{switch(n.structure[t]){case"uint8":i.setUint8(o,e),o+=1;break;case"uint16":i.setUint16(o,e,!0),o+=2;break;case"int16":i.setInt16(o,e,!0),o+=2;break;case"float":i.setFloat32(o,e,!0),o+=4;break;case"double":i.setFloat64(o,e,!0),o+=8;break;case"string":i.setUint16(o,e.length,!0),o+=2;for(let t=0;t<e.length;t++)i.setUint16(o,e.charCodeAt(t),!0),o+=2}})),this.dataChannelSender.canSend()?this.dataChannelSender.sendData(i.buffer):d.Info(`Data channel cannot send yet, skipping sending message: ${e} - ${new Uint8Array(i.buffer)}`)}}class Nn{constructor(e){this.sendMessageController=e}SendRequestQualityControl(){this.sendMessageController.sendMessageToStreamer("RequestQualityControl")}SendMaxFpsRequest(){this.sendMessageController.sendMessageToStreamer("FpsRequest")}SendAverageBitrateRequest(){this.sendMessageController.sendMessageToStreamer("AverageBitrateRequest")}SendStartStreaming(){this.sendMessageController.sendMessageToStreamer("StartStreaming")}SendStopStreaming(){this.sendMessageController.sendMessageToStreamer("StopStreaming")}SendRequestInitialSettings(){this.sendMessageController.sendMessageToStreamer("RequestInitialSettings")}}class An{constructor(e){this.dataChannelProvider=e}canSend(){return void 0!==this.dataChannelProvider.getDataChannelInstance().dataChannel&&"open"==this.dataChannelProvider.getDataChannelInstance().dataChannel.readyState}sendData(e){const t=this.dataChannelProvider.getDataChannelInstance();"open"==t.dataChannel.readyState?(t.dataChannel.send(e),d.Info(`Message Sent: ${new Uint8Array(e)}`),this.resetAfkWarningTimerOnDataSend()):d.Error(`Message Failed: ${new Uint8Array(e)}`)}resetAfkWarningTimerOnDataSend(){}}class Bn{reconfigure(e,t){const n=e.height/e.width,s=t.height/t.width;this.playerIsLarger=n>s,this.playerSize=e,this.ratio=this.playerIsLarger?n/s:s/n}translateUnsigned(e,t){const n=this.playerIsLarger?e/this.playerSize.width:this.ratio*(e/this.playerSize.width-.5)+.5,s=this.playerIsLarger?this.ratio*(t/this.playerSize.height-.5)+.5:t/this.playerSize.height;return n<0||n>1||s<0||s>1?{inRange:!1,x:65535,y:65535}:{inRange:!0,x:65536*n,y:65536*s}}translateSigned(e,t){return{x:32767*(this.playerIsLarger?e/(.5*this.playerSize.width):this.ratio*e/(.5*this.playerSize.width)),y:32767*(this.playerIsLarger?this.ratio*t/(.5*this.playerSize.height):t/(.5*this.playerSize.height))}}untranslateUnsigned(e,t){const n=this.playerIsLarger?e/65536:(e/65536-.5)/this.ratio+.5,s=this.playerIsLarger?(t/65536-.5)/this.ratio+.5:t/65536;return{x:n*this.playerSize.width,y:s*this.playerSize.height}}}class Un{constructor(e){this._urlParams={};const t=new URLSearchParams(e);for(const[e,n]of t)this._urlParams[e.toLowerCase()]=n}has(e){return e.toLowerCase()in this._urlParams}get(e){return this.has(e)?this._urlParams[e.toLowerCase()]:null}}class Vn{constructor(e,t){this.shouldShowPlayOverlay=!0,this.autoJoinTimer=void 0,this.config=e,this.pixelStreaming=t,this.responseController=new On,this.file=new mn,this.sdpConstraints={offerToReceiveAudio:!0,offerToReceiveVideo:!0},this.afkController=new zt(this.config,this.pixelStreaming,this.onAfkTriggered.bind(this)),this.afkController.onAFKTimedOutCallback=()=>{this.closeSignalingServer("You have been disconnected due to inactivity.",!1)},this.freezeFrameController=new ze(this.pixelStreaming.videoElementParent),this.videoPlayer=new xn(this.pixelStreaming.videoElementParent,this.config),this.videoPlayer.onVideoInitialized=()=>this.handleVideoInitialized(),this.videoPlayer.onMatchViewportResolutionCallback=(e,t)=>{const n={"Resolution.Width":e,"Resolution.Height":t};this.streamMessageController.toStreamerHandlers.get("Command")([JSON.stringify(n)])},this.videoPlayer.onResizePlayerCallback=()=>{this.setUpMouseAndFreezeFrame()},this.streamController=new $e(this.videoPlayer),this.coordinateConverter=new Bn,this.sendrecvDataChannelController=new Kt,this.recvDataChannelController=new Kt,this.registerDataChannelEventEmitters(this.sendrecvDataChannelController),this.registerDataChannelEventEmitters(this.recvDataChannelController),this.dataChannelSender=new An(this.sendrecvDataChannelController),this.dataChannelSender.resetAfkWarningTimerOnDataSend=()=>this.afkController.resetAfkWarningTimer(),this.streamMessageController=new Fn,this.transport=new g,this.protocol=new He(this.transport),this.protocol.addListener(ce.typeName,(e=>this.handleOnConfigMessage(e))),this.protocol.addListener(ye.typeName,(e=>this.handleStreamerListMessage(e))),this.protocol.addListener(pe.typeName,(e=>this.handleStreamerIDChangedMessage(e))),this.protocol.addListener(Be.typeName,(e=>{const t=e;this.pixelStreaming._onPlayerCount(t.count)})),this.protocol.addListener(Te.typeName,(e=>this.handleWebRtcAnswer(e))),this.protocol.addListener(Ce.typeName,(e=>this.handleWebRtcOffer(e))),this.protocol.addListener(Fe.typeName,(e=>this.handleWebRtcSFUPeerDatachannels(e))),this.protocol.addListener(Me.typeName,(e=>{const t=e;this.handleIceCandidate(t.candidate)})),this.protocol.transport.addListener("open",(()=>{const e=We(fe);this.protocol.sendMessage(e),this.reconnectAttempt=0,this.isReconnecting=!1})),this.protocol.transport.addListener("error",(()=>{d.Error("Got a transport error.")})),this.protocol.transport.addListener("close",(e=>{const t=this.config.getNumericSettingValue(Bt.MaxReconnectAttempts),n=this.reconnectAttempt<t,s=(this.forceReconnect||this.enableAutoReconnect&&t>0&&n)&&1001!=e.code,r=!s,i=this.disconnectMessage?this.disconnectMessage:e.reason;this.forceReconnect=!1,this.pixelStreaming._onDisconnect(i,r),this.afkController.stopAfkWarningTimer(),this.statsTimerHandle&&void 0!==this.statsTimerHandle&&window.clearInterval(this.statsTimerHandle),this.setVideoEncoderAvgQP(0),this.setTouchInputEnabled(!1),this.setMouseInputEnabled(!1),this.setKeyboardInputEnabled(!1),this.setGamePadInputEnabled(!1),s&&setTimeout((()=>{this.reconnectAttempt++,this.doReconnect(e.reason)}),2e3)})),this.sendMessageController=new Dn(this.dataChannelSender,this.streamMessageController),this.toStreamerMessagesController=new Nn(this.sendMessageController),this.registerMessageHandlers(),this.streamMessageController.populateDefaultProtocol(),this.inputClassesFactory=new In(this.streamMessageController,this.videoPlayer,this.coordinateConverter),this.isUsingSFU=!1,this.isQualityController=!1,this.preferredCodec="",this.enableAutoReconnect=!0,this.forceReconnect=!1,this.reconnectAttempt=0,this.isReconnecting=!1,this.config._addOnOptionSettingChangedListener(_t.StreamerId,(e=>{if(""===e)return;this.peerConnectionController.peerConnection.close(),this.peerConnectionController.createPeerConnection(this.peerConfig,this.preferredCodec),this.subscribedStream=e;const t=We(ve,{streamerId:e});this.protocol.sendMessage(t)})),this.setVideoEncoderAvgQP(-1),this.signallingUrlBuilder=()=>this.config.getTextSettingValue(Vt.SignallingServerUrl)}requestUnquantizedAndDenormalizeUnsigned(e,t){return this.coordinateConverter.untranslateUnsigned(e,t)}handleOnMessage(e){const t=new Uint8Array(e.data);d.Info("Message incoming:"+t);const n=this.streamMessageController.fromStreamerMessages.get(t[0]);this.streamMessageController.fromStreamerHandlers.get(n)(e.data)}registerMessageHandlers(){this.streamMessageController.registerMessageHandler(Rn.FromStreamer,"QualityControlOwnership",(e=>this.onQualityControlOwnership(e))),this.streamMessageController.registerMessageHandler(Rn.FromStreamer,"Response",(e=>this.responseController.onResponse(e))),this.streamMessageController.registerMessageHandler(Rn.FromStreamer,"Command",(e=>{this.onCommand(e)})),this.streamMessageController.registerMessageHandler(Rn.FromStreamer,"FreezeFrame",(e=>this.onFreezeFrameMessage(e))),this.streamMessageController.registerMessageHandler(Rn.FromStreamer,"UnfreezeFrame",(()=>this.invalidateFreezeFrameAndEnableVideo())),this.streamMessageController.registerMessageHandler(Rn.FromStreamer,"VideoEncoderAvgQP",(e=>this.handleVideoEncoderAvgQP(e))),this.streamMessageController.registerMessageHandler(Rn.FromStreamer,"LatencyTest",(e=>this.handleLatencyTestResult(e))),this.streamMessageController.registerMessageHandler(Rn.FromStreamer,"DataChannelLatencyTest",(e=>this.handleDataChannelLatencyTestResponse(e))),this.streamMessageController.registerMessageHandler(Rn.FromStreamer,"InitialSettings",(e=>this.handleInitialSettings(e))),this.streamMessageController.registerMessageHandler(Rn.FromStreamer,"FileExtension",(e=>this.onFileExtension(e))),this.streamMessageController.registerMessageHandler(Rn.FromStreamer,"FileMimeType",(e=>this.onFileMimeType(e))),this.streamMessageController.registerMessageHandler(Rn.FromStreamer,"FileContents",(e=>this.onFileContents(e))),this.streamMessageController.registerMessageHandler(Rn.FromStreamer,"TestEcho",(()=>{})),this.streamMessageController.registerMessageHandler(Rn.FromStreamer,"InputControlOwnership",(e=>this.onInputControlOwnership(e))),this.streamMessageController.registerMessageHandler(Rn.FromStreamer,"GamepadResponse",(e=>this.onGamepadResponse(e))),this.streamMessageController.registerMessageHandler(Rn.FromStreamer,"Protocol",(e=>this.onProtocolMessage(e))),this.streamMessageController.registerMessageHandler(Rn.ToStreamer,"IFrameRequest",(()=>this.sendMessageController.sendMessageToStreamer("IFrameRequest"))),this.streamMessageController.registerMessageHandler(Rn.ToStreamer,"RequestQualityControl",(()=>this.sendMessageController.sendMessageToStreamer("RequestQualityControl"))),this.streamMessageController.registerMessageHandler(Rn.ToStreamer,"FpsRequest",(()=>this.sendMessageController.sendMessageToStreamer("FpsRequest"))),this.streamMessageController.registerMessageHandler(Rn.ToStreamer,"AverageBitrateRequest",(()=>this.sendMessageController.sendMessageToStreamer("AverageBitrateRequest"))),this.streamMessageController.registerMessageHandler(Rn.ToStreamer,"StartStreaming",(()=>this.sendMessageController.sendMessageToStreamer("StartStreaming"))),this.streamMessageController.registerMessageHandler(Rn.ToStreamer,"StopStreaming",(()=>this.sendMessageController.sendMessageToStreamer("StopStreaming"))),this.streamMessageController.registerMessageHandler(Rn.ToStreamer,"LatencyTest",(e=>this.sendMessageController.sendMessageToStreamer("LatencyTest",e))),this.streamMessageController.registerMessageHandler(Rn.ToStreamer,"RequestInitialSettings",(()=>this.sendMessageController.sendMessageToStreamer("RequestInitialSettings"))),this.streamMessageController.registerMessageHandler(Rn.ToStreamer,"TestEcho",(()=>{})),this.streamMessageController.registerMessageHandler(Rn.ToStreamer,"UIInteraction",(e=>this.sendMessageController.sendMessageToStreamer("UIInteraction",e))),this.streamMessageController.registerMessageHandler(Rn.ToStreamer,"Command",(e=>this.sendMessageController.sendMessageToStreamer("Command",e))),this.streamMessageController.registerMessageHandler(Rn.ToStreamer,"TextboxEntry",(e=>this.sendMessageController.sendMessageToStreamer("TextboxEntry",e))),this.streamMessageController.registerMessageHandler(Rn.ToStreamer,"KeyDown",(e=>this.sendMessageController.sendMessageToStreamer("KeyDown",e))),this.streamMessageController.registerMessageHandler(Rn.ToStreamer,"KeyUp",(e=>this.sendMessageController.sendMessageToStreamer("KeyUp",e))),this.streamMessageController.registerMessageHandler(Rn.ToStreamer,"KeyPress",(e=>this.sendMessageController.sendMessageToStreamer("KeyPress",e))),this.streamMessageController.registerMessageHandler(Rn.ToStreamer,"MouseEnter",(e=>this.sendMessageController.sendMessageToStreamer("MouseEnter",e))),this.streamMessageController.registerMessageHandler(Rn.ToStreamer,"MouseLeave",(e=>this.sendMessageController.sendMessageToStreamer("MouseLeave",e))),this.streamMessageController.registerMessageHandler(Rn.ToStreamer,"MouseDown",(e=>this.sendMessageController.sendMessageToStreamer("MouseDown",e))),this.streamMessageController.registerMessageHandler(Rn.ToStreamer,"MouseUp",(e=>this.sendMessageController.sendMessageToStreamer("MouseUp",e))),this.streamMessageController.registerMessageHandler(Rn.ToStreamer,"MouseMove",(e=>this.sendMessageController.sendMessageToStreamer("MouseMove",e))),this.streamMessageController.registerMessageHandler(Rn.ToStreamer,"MouseWheel",(e=>this.sendMessageController.sendMessageToStreamer("MouseWheel",e))),this.streamMessageController.registerMessageHandler(Rn.ToStreamer,"MouseDouble",(e=>this.sendMessageController.sendMessageToStreamer("MouseDouble",e))),this.streamMessageController.registerMessageHandler(Rn.ToStreamer,"TouchStart",(e=>this.sendMessageController.sendMessageToStreamer("TouchStart",e))),this.streamMessageController.registerMessageHandler(Rn.ToStreamer,"TouchEnd",(e=>this.sendMessageController.sendMessageToStreamer("TouchEnd",e))),this.streamMessageController.registerMessageHandler(Rn.ToStreamer,"TouchMove",(e=>this.sendMessageController.sendMessageToStreamer("TouchMove",e))),this.streamMessageController.registerMessageHandler(Rn.ToStreamer,"GamepadConnected",(()=>this.sendMessageController.sendMessageToStreamer("GamepadConnected"))),this.streamMessageController.registerMessageHandler(Rn.ToStreamer,"GamepadButtonPressed",(e=>this.sendMessageController.sendMessageToStreamer("GamepadButtonPressed",e))),this.streamMessageController.registerMessageHandler(Rn.ToStreamer,"GamepadButtonReleased",(e=>this.sendMessageController.sendMessageToStreamer("GamepadButtonReleased",e))),this.streamMessageController.registerMessageHandler(Rn.ToStreamer,"GamepadAnalog",(e=>this.sendMessageController.sendMessageToStreamer("GamepadAnalog",e))),this.streamMessageController.registerMessageHandler(Rn.ToStreamer,"GamepadDisconnected",(e=>this.sendMessageController.sendMessageToStreamer("GamepadDisconnected",e))),this.streamMessageController.registerMessageHandler(Rn.ToStreamer,"XREyeViews",(e=>this.sendMessageController.sendMessageToStreamer("XREyeViews",e))),this.streamMessageController.registerMessageHandler(Rn.ToStreamer,"XRHMDTransform",(e=>this.sendMessageController.sendMessageToStreamer("XRHMDTransform",e))),this.streamMessageController.registerMessageHandler(Rn.ToStreamer,"XRControllerTransform",(e=>this.sendMessageController.sendMessageToStreamer("XRControllerTransform",e))),this.streamMessageController.registerMessageHandler(Rn.ToStreamer,"XRSystem",(e=>this.sendMessageController.sendMessageToStreamer("XRSystem",e))),this.streamMessageController.registerMessageHandler(Rn.ToStreamer,"XRButtonTouched",(e=>this.sendMessageController.sendMessageToStreamer("XRButtonTouched",e))),this.streamMessageController.registerMessageHandler(Rn.ToStreamer,"XRButtonTouchReleased",(e=>this.sendMessageController.sendMessageToStreamer("XRButtonTouchReleased",e))),this.streamMessageController.registerMessageHandler(Rn.ToStreamer,"XRButtonPressed",(e=>this.sendMessageController.sendMessageToStreamer("XRButtonPressed",e))),this.streamMessageController.registerMessageHandler(Rn.ToStreamer,"XRButtonReleased",(e=>this.sendMessageController.sendMessageToStreamer("XRButtonReleased",e))),this.streamMessageController.registerMessageHandler(Rn.ToStreamer,"XRAnalog",(e=>this.sendMessageController.sendMessageToStreamer("XRAnalog",e)))}onCommand(e){d.Info("DataChannelReceiveMessageType.Command");const t=new TextDecoder("utf-16").decode(e.slice(1));d.Info("Data Channel Command: "+t);const n=JSON.parse(t);"onScreenKeyboard"===n.command&&this.pixelStreaming._activateOnScreenKeyboard(n)}onProtocolMessage(e){try{const t=new TextDecoder("utf-16").decode(e.slice(1)),n=JSON.parse(t);Object.prototype.hasOwnProperty.call(n,"Direction")||d.Error("Malformed protocol received. Ensure the protocol message contains a direction");const s=n.Direction;delete n.Direction,d.Info(`Received new ${s==Rn.FromStreamer?"FromStreamer":"ToStreamer"} protocol. Updating existing protocol...`),Object.keys(n).forEach((e=>{const t=n[e];switch(s){case Rn.ToStreamer:if(!Object.prototype.hasOwnProperty.call(t,"id"))return void d.Error(`ToStreamer->${e} protocol definition was malformed as it didn't contain at least an id\n\n Definition was: ${JSON.stringify(t,null,2)}`);if("UIInteraction"===e||"Command"===e||"LatencyTest"===e)return;this.streamMessageController.toStreamerHandlers.get(e)?this.streamMessageController.toStreamerMessages.set(e,t):d.Error(`There was no registered handler for "${e}" - try adding one using registerMessageHandler(MessageDirection.ToStreamer, "${e}", myHandler)`);break;case Rn.FromStreamer:if(!Object.prototype.hasOwnProperty.call(t,"id"))return void d.Error(`FromStreamer->${e} protocol definition was malformed as it didn't contain at least an id\n\n Definition was: ${JSON.stringify(t,null,2)}`);this.streamMessageController.fromStreamerHandlers.get(e)?this.streamMessageController.fromStreamerMessages.set(t.id,e):d.Error(`There was no registered handler for "${t}" - try adding one using registerMessageHandler(MessageDirection.FromStreamer, "${e}", myHandler)`);break;default:d.Error(`Unknown direction: ${s}`)}})),this.toStreamerMessagesController.SendRequestInitialSettings(),this.toStreamerMessagesController.SendRequestQualityControl()}catch(e){d.Info(e)}}onInputControlOwnership(e){const t=new Uint8Array(e);d.Info("DataChannelReceiveMessageType.InputControlOwnership");const n=new Boolean(t[1]).valueOf();d.Info(`Received input controller message - will your input control the stream: ${n}`),this.pixelStreaming._onInputControlOwnership(n)}onGamepadResponse(e){const t=new TextDecoder("utf-16").decode(e.slice(1)),n=JSON.parse(t);this.gamePadController.onGamepadResponseReceived(n.controllerId)}onAfkTriggered(){this.afkController.onAfkClick(),this.videoPlayer.isPaused()&&this.videoPlayer.hasVideoSource()&&this.playStream()}setAfkEnabled(e){e?this.onAfkTriggered():this.afkController.stopAfkWarningTimer()}tryReconnect(e){this.forceReconnect=!0,this.doReconnect(e)}doReconnect(e){this.protocol?(this.isReconnecting=!0,this.protocol.isConnected()?(this.forceReconnect||(e=`${e} Reconnecting.`),this.closeSignalingServer(e,!0)):(this.pixelStreaming._onWebRtcAutoConnect(),this.connectToSignallingServer())):d.Info("This player has no protocol connection.")}loadFreezeFrameOrShowPlayOverlay(){this.pixelStreaming.dispatchEvent(new wt({shouldShowPlayOverlay:this.shouldShowPlayOverlay,isValid:this.freezeFrameController.valid,jpegData:this.freezeFrameController.jpeg})),!0===this.shouldShowPlayOverlay?(d.Info("showing play overlay"),this.resizePlayerStyle()):(d.Info("showing freeze frame"),this.freezeFrameController.showFreezeFrame()),setTimeout((()=>{this.videoPlayer.setVideoEnabled(!1)}),this.freezeFrameController.freezeFrameDelay)}onFreezeFrameMessage(e){d.Info("DataChannelReceiveMessageType.FreezeFrame");const t=new Uint8Array(e);this.freezeFrameController.processFreezeFrameMessage(t,(()=>this.loadFreezeFrameOrShowPlayOverlay()))}invalidateFreezeFrameAndEnableVideo(){d.Info("DataChannelReceiveMessageType.FreezeFrame"),setTimeout((()=>{this.pixelStreaming.dispatchEvent(new St),this.freezeFrameController.hideFreezeFrame()}),this.freezeFrameController.freezeFrameDelay),this.videoPlayer.getVideoElement()&&this.videoPlayer.setVideoEnabled(!0)}onFileExtension(e){const t=new Uint8Array(e);gn.setExtensionFromBytes(t,this.file)}onFileMimeType(e){const t=new Uint8Array(e);gn.setMimeTypeFromBytes(t,this.file)}onFileContents(e){const t=new Uint8Array(e);gn.setContentsFromBytes(t,this.file)}playStream(){if(!this.videoPlayer.getVideoElement()){const e="Could not play video stream because the video player was not initialized correctly.";return this.pixelStreaming.dispatchEvent(new ft({message:e})),d.Error(e),void this.closeSignalingServer("Stream not initialized correctly",!1)}if(this.videoPlayer.hasVideoSource()){if(this.setTouchInputEnabled(this.config.isFlagEnabled(Nt.TouchInput)),this.pixelStreaming.dispatchEvent(new yt),this.streamController.audioElement.srcObject){const e=this.config.isFlagEnabled(Nt.StartVideoMuted);this.streamController.audioElement.muted=e,e?this.playVideo():this.streamController.audioElement.play().then((()=>{this.playVideo()})).catch((e=>{d.Info(e),d.Info("Browser does not support autoplaying video without interaction - to resolve this we are going to show the play button overlay."),this.pixelStreaming.dispatchEvent(new vt({reason:e}))}))}else this.playVideo();this.shouldShowPlayOverlay=!1,this.freezeFrameController.showFreezeFrame()}else d.Warning("Cannot play stream, the video element has no srcObject to play.")}playVideo(){this.videoPlayer.play().catch((e=>{this.streamController.audioElement.srcObject&&this.streamController.audioElement.pause(),d.Info(e),d.Info("Browser does not support autoplaying video without interaction - to resolve this we are going to show the play button overlay."),this.pixelStreaming.dispatchEvent(new vt({reason:e}))}))}autoPlayVideoOrSetUpPlayOverlay(){this.config.isFlagEnabled(Nt.AutoPlayVideo)&&this.playStream(),this.resizePlayerStyle()}connectToSignallingServer(){this.locallyClosed=!1,this.enableAutoReconnect=!0,this.disconnectMessage=null;const e=this.signallingUrlBuilder();this.protocol.connect(e)}startSession(e){if(this.peerConfig=e,this.config.isFlagEnabled(Nt.ForceTURN)&&!this.checkTurnServerAvailability(e))return d.Info("No turn server was found in the Peer Connection Options. TURN cannot be forced, closing connection. Please use STUN instead"),void this.closeSignalingServer("TURN cannot be forced, closing connection. Please use STUN instead.",!1);this.peerConnectionController=new an(this.peerConfig,this.config,this.preferredCodec),this.peerConnectionController.onVideoStats=e=>this.handleVideoStats(e),this.peerConnectionController.onSendWebRTCOffer=e=>this.handleSendWebRTCOffer(e),this.peerConnectionController.onSendWebRTCAnswer=e=>this.handleSendWebRTCAnswer(e),this.peerConnectionController.onPeerIceCandidate=e=>this.handleSendIceCandidate(e),this.peerConnectionController.onDataChannel=e=>this.handleDataChannel(e),this.peerConnectionController.showTextOverlayConnecting=()=>this.pixelStreaming._onWebRtcConnecting(),this.peerConnectionController.showTextOverlaySetupFailure=()=>this.pixelStreaming._onWebRtcFailed();let t=!1;this.peerConnectionController.onIceConnectionStateChange=()=>{!t&&["connected","completed"].includes(this.peerConnectionController.peerConnection.iceConnectionState)&&(this.pixelStreaming._onWebRtcConnected(),t=!0)},this.peerConnectionController.onTrack=e=>this.streamController.handleOnTrack(e)}checkTurnServerAvailability(e){if(!e.iceServers)return d.Info("A turn sever was not found"),!1;for(const t of e.iceServers)for(const e of t.urls)if(e.includes("turn"))return d.Info(`A turn sever was found at ${e}`),!0;return d.Info("A turn sever was not found"),!1}handleOnConfigMessage(e){this.resizePlayerStyle(),this.startSession(e.peerConnectionOptions)}handleStreamerListMessage(e){d.Info(`Got streamer list ${e.ids}`);let t="";const n=this.config.getSettingOption(_t.StreamerId);n.selected.toString().trim()&&(t=n.selected);const s=[...e.ids];s.unshift(""),this.config.setOptionSettingOptions(_t.StreamerId,s);let r="";const i=this.config.isFlagEnabled(Nt.WaitForStreamer),o=this.config.getNumericSettingValue(Bt.MaxReconnectAttempts),a=this.config.getNumericSettingValue(Bt.StreamerAutoJoinInterval),l=this.config.useUrlParams,h=new Un(window.location.search);l&&h.has(_t.StreamerId)?t=h.get(_t.StreamerId):this.subscribedStream&&(t=this.subscribedStream),t&&e.ids.includes(t)?r=t:t&&i||1!=e.ids.length||(r=e.ids[0]),r?(this.reconnectAttempt=0,this.isReconnecting=!1,this.config.setOptionSettingValue(_t.StreamerId,r)):i&&(this.reconnectAttempt<o?(this.reconnectAttempt++,this.isReconnecting=!0,setTimeout((()=>{this.protocol.sendMessage(We(fe))}),a)):(this.reconnectAttempt=0,this.isReconnecting=!1,this.enableAutoReconnect=!1)),this.pixelStreaming.dispatchEvent(new Ct({messageStreamerList:e,autoSelectedStreamerId:r,wantedStreamerId:t}))}handleStreamerIDChangedMessage(e){const t=e.newID,n=this.config.getSettingOption(_t.StreamerId),s=n.onChange;n.onChange=()=>{};const r=n.options;for(let e=0;e<r.length;++e)if(r[e]==this.subscribedStream){r[e]=t;break}n.options=r,n.selected=t,n.onChange=s,this.subscribedStream=e.newID,this.pixelStreaming.dispatchEvent(new Tt({newID:t}))}handleWebRtcAnswer(e){d.Info(`Got answer sdp ${e.sdp}`);const t={sdp:e.sdp,type:"answer"};this.peerConnectionController.receiveAnswer(t),this.handlePostWebrtcNegotiation()}handleWebRtcOffer(e){d.Info(`Got offer sdp ${e.sdp}`),this.isUsingSFU=!!e.sfu&&e.sfu,this.isUsingSFU&&(this.peerConnectionController.preferredCodec="");const t={sdp:e.sdp,type:"offer"};this.peerConnectionController.receiveOffer(t,this.config),this.handlePostWebrtcNegotiation()}handleWebRtcSFUPeerDatachannels(e){const t={ordered:!0,negotiated:!0,id:e.sendStreamId},n=e.sendStreamId!=e.recvStreamId;if(this.sendrecvDataChannelController.createDataChannel(this.peerConnectionController.peerConnection,n?"send-datachannel":"datachannel",t),n){const t={ordered:!0,negotiated:!0,id:e.recvStreamId};this.recvDataChannelController.createDataChannel(this.peerConnectionController.peerConnection,"recv-datachannel",t),this.recvDataChannelController.handleOnOpen=()=>this.protocol.sendMessage(We(Oe)),this.recvDataChannelController.handleOnMessage=e=>this.handleOnMessage(e)}else this.sendrecvDataChannelController.handleOnMessage=e=>this.handleOnMessage(e)}handlePostWebrtcNegotiation(){this.afkController.startAfkWarningTimer(),this.pixelStreaming._onWebRtcSdp(),this.statsTimerHandle&&void 0!==this.statsTimerHandle&&window.clearInterval(this.statsTimerHandle),this.statsTimerHandle=window.setInterval((()=>this.getStats()),1e3),this.setMouseInputEnabled(this.config.isFlagEnabled(Nt.MouseInput)),this.setKeyboardInputEnabled(this.config.isFlagEnabled(Nt.KeyboardInput)),this.setGamePadInputEnabled(this.config.isFlagEnabled(Nt.GamepadInput))}handleIceCandidate(e){d.Info("Web RTC Controller: onWebRtcIce");const t=new RTCIceCandidate(e);this.peerConnectionController.handleOnIce(t)}handleSendIceCandidate(e){d.Info("OnIceCandidate"),e.candidate&&e.candidate.candidate&&this.protocol.sendMessage(We(Me,{candidate:e.candidate}))}handleDataChannel(e){d.Info("Data channel created for us by browser as we are a receiving peer."),this.sendrecvDataChannelController.dataChannel=e.channel,this.sendrecvDataChannelController.setupDataChannel(),this.sendrecvDataChannelController.handleOnMessage=e=>this.handleOnMessage(e)}handleSendWebRTCOffer(e){d.Info("Sending the offer to the Server");const t={sdp:e.sdp,minBitrateBps:1e3*this.config.getNumericSettingValue(Bt.WebRTCMinBitrate),maxBitrateBps:1e3*this.config.getNumericSettingValue(Bt.WebRTCMaxBitrate)};this.protocol.sendMessage(We(Ce,t))}handleSendWebRTCAnswer(e){d.Info("Sending the answer to the Server");const t={sdp:e.sdp,minBitrateBps:1e3*this.config.getNumericSettingValue(Bt.WebRTCMinBitrate),maxBitrateBps:1e3*this.config.getNumericSettingValue(Bt.WebRTCMaxBitrate)};this.protocol.sendMessage(We(Te,t)),this.isUsingSFU&&this.protocol.sendMessage(We(xe))}setUpMouseAndFreezeFrame(){const e=this.videoPlayer.getVideoParentElement(),t=this.videoPlayer.getVideoElement();this.coordinateConverter.reconfigure({width:e.clientWidth,height:e.clientHeight},{width:t.videoWidth,height:t.videoHeight}),this.freezeFrameController.freezeFrame.resize()}closeSignalingServer(e,t){var n;this.locallyClosed=!0,this.enableAutoReconnect=t,this.disconnectMessage=e,null===(n=this.protocol)||void 0===n||n.disconnect(1e3,e)}closePeerConnection(){var e;null===(e=this.peerConnectionController)||void 0===e||e.close()}close(){this.closeSignalingServer("",!1),this.closePeerConnection()}getStats(){this.peerConnectionController.generateStats()}sendLatencyTest(){this.latencyStartTime=Date.now(),this.streamMessageController.toStreamerHandlers.get("LatencyTest")([JSON.stringify({StartTime:this.latencyStartTime})])}sendDataChannelLatencyTest(e){this.streamMessageController.toStreamerHandlers.get("DataChannelLatencyTest")([JSON.stringify(e)])}sendEncoderMinQP(e){d.Info(`MinQP=${e}\n`),null!=e&&this.streamMessageController.toStreamerHandlers.get("Command")([JSON.stringify({"Encoder.MinQP":e})])}sendEncoderMaxQP(e){d.Info(`MaxQP=${e}\n`),null!=e&&this.streamMessageController.toStreamerHandlers.get("Command")([JSON.stringify({"Encoder.MaxQP":e})])}sendWebRTCMinBitrate(e){d.Info(`WebRTC Min Bitrate=${e}`),null!=e&&this.streamMessageController.toStreamerHandlers.get("Command")([JSON.stringify({"WebRTC.MinBitrate":e})])}sendWebRTCMaxBitrate(e){d.Info(`WebRTC Max Bitrate=${e}`),null!=e&&this.streamMessageController.toStreamerHandlers.get("Command")([JSON.stringify({"WebRTC.MaxBitrate":e})])}sendWebRTCFps(e){d.Info(`WebRTC FPS=${e}`),null!=e&&(this.streamMessageController.toStreamerHandlers.get("Command")([JSON.stringify({"WebRTC.Fps":e})]),this.streamMessageController.toStreamerHandlers.get("Command")([JSON.stringify({"WebRTC.MaxFps":e})]))}sendShowFps(){d.Info("---- Sending show stat to UE ----"),this.streamMessageController.toStreamerHandlers.get("Command")([JSON.stringify({"stat.fps":""})])}sendIframeRequest(){d.Info("---- Sending Request for an IFrame ----"),this.streamMessageController.toStreamerHandlers.get("IFrameRequest")()}emitUIInteraction(e){d.Info("---- Sending custom UIInteraction message ----"),this.streamMessageController.toStreamerHandlers.get("UIInteraction")([JSON.stringify(e)])}emitCommand(e){d.Info("---- Sending custom Command message ----"),this.streamMessageController.toStreamerHandlers.get("Command")([JSON.stringify(e)])}emitConsoleCommand(e){d.Info("---- Sending custom Command:ConsoleCommand message ----"),this.streamMessageController.toStreamerHandlers.get("Command")([JSON.stringify({ConsoleCommand:e})])}sendRequestQualityControlOwnership(){d.Info("---- Sending Request to Control Quality ----"),this.toStreamerMessagesController.SendRequestQualityControl()}handleLatencyTestResult(e){d.Info("DataChannelReceiveMessageType.latencyTest");const t=new TextDecoder("utf-16").decode(e.slice(1)),n=new un;Object.assign(n,JSON.parse(t)),n.processFields(),n.testStartTimeMs=this.latencyStartTime,n.browserReceiptTimeMs=Date.now(),n.latencyExcludingDecode=~~(n.browserReceiptTimeMs-n.testStartTimeMs),n.testDuration=~~(n.TransmissionTimeMs-n.ReceiptTimeMs),n.networkLatency=~~(n.latencyExcludingDecode-n.testDuration),n.frameDisplayDeltaTimeMs&&n.browserReceiptTimeMs&&(n.endToEndLatency=(n.frameDisplayDeltaTimeMs,n.networkLatency,~~+n.CaptureToSendMs)),this.pixelStreaming._onLatencyTestResult(n)}handleDataChannelLatencyTestResponse(e){d.Info("DataChannelReceiveMessageType.dataChannelLatencyResponse");const t=new TextDecoder("utf-16").decode(e.slice(1)),n=JSON.parse(t);this.pixelStreaming._onDataChannelLatencyTestResponse(n)}handleInitialSettings(e){d.Info("DataChannelReceiveMessageType.InitialSettings");const t=new TextDecoder("utf-16").decode(e.slice(1)),n=JSON.parse(t),s=new ln;n.Encoder&&(s.EncoderSettings=n.Encoder),n.WebRTC&&(s.WebRTCSettings=n.WebRTC),n.PixelStreaming&&(s.PixelStreamingSettings=n.PixelStreaming),n.ConfigOptions&&void 0!==n.ConfigOptions.DefaultToHover&&this.config.setFlagEnabled(Nt.HoveringMouseMode,!!n.ConfigOptions.DefaultToHover),s.ueCompatible(),d.Info(t),this.pixelStreaming._onInitialSettings(s)}handleVideoEncoderAvgQP(e){d.Info("DataChannelReceiveMessageType.VideoEncoderAvgQP");const t=Number(new TextDecoder("utf-16").decode(e.slice(1)));this.setVideoEncoderAvgQP(t)}handleVideoInitialized(){this.pixelStreaming._onVideoInitialized(),this.autoPlayVideoOrSetUpPlayOverlay(),this.resizePlayerStyle(),this.videoPlayer.updateVideoStreamSize()}onQualityControlOwnership(e){const t=new Uint8Array(e);d.Info("DataChannelReceiveMessageType.QualityControlOwnership"),this.isQualityController=new Boolean(t[1]).valueOf(),d.Info(`Received quality controller message, will control quality: ${this.isQualityController}`),this.pixelStreaming._onQualityControlOwnership(this.isQualityController)}handleVideoStats(e){this.pixelStreaming._onVideoStats(e)}resizePlayerStyle(){this.videoPlayer.resizePlayerStyle()}setPreferredCodec(e){this.preferredCodec=e,this.peerConnectionController&&(this.peerConnectionController.preferredCodec=e,this.peerConnectionController.updateCodecSelection=!1)}setVideoEncoderAvgQP(e){this.videoAvgQp=e,this.pixelStreaming._onVideoEncoderAvgQP(this.videoAvgQp)}setKeyboardInputEnabled(e){var t;null===(t=this.keyboardController)||void 0===t||t.unregister(),e&&(this.keyboardController=this.inputClassesFactory.registerKeyBoard(this.config))}setMouseInputEnabled(e){var t;if(null===(t=this.mouseController)||void 0===t||t.unregister(),e){const e=this.config.isFlagEnabled(Nt.HoveringMouseMode)?jt.HoveringMouse:jt.LockedMouse;this.mouseController=this.inputClassesFactory.registerMouse(e)}}setTouchInputEnabled(e){var t;null===(t=this.touchController)||void 0===t||t.unregister(),e&&(this.touchController=this.inputClassesFactory.registerTouch(this.config.isFlagEnabled(Nt.FakeMouseWithTouches)))}setGamePadInputEnabled(e){var t;null===(t=this.gamePadController)||void 0===t||t.unregister(),e&&(this.gamePadController=this.inputClassesFactory.registerGamePad())}registerDataChannelEventEmitters(e){e.onOpen=(e,t)=>this.pixelStreaming.dispatchEvent(new lt({label:e,event:t})),e.onClose=(e,t)=>this.pixelStreaming.dispatchEvent(new dt({label:e,event:t})),e.onError=(e,t)=>this.pixelStreaming.dispatchEvent(new ht({label:e,event:t}))}registerMessageHandler(e,t,n){t===Rn.FromStreamer&&void 0===n&&d.Warning(`Unable to register handler for ${e} as no handler was passed`),this.streamMessageController.registerMessageHandler(t,e,(s=>void 0===n&&t===Rn.ToStreamer?this.sendMessageController.sendMessageToStreamer(e,s):n(s)))}}class Wn{constructor(e){this.toStreamerMessagesProvider=e,this.controllers=[]}updateStatus(e,t,n){if(e.gamepad){const s=t.getPose(e.gripSpace,n);if(!s)return;let r=0;e.profiles.includes("htc-vive")?r=1:e.profiles.includes("oculus-touch")&&(r=2),this.toStreamerMessagesProvider.toStreamerHandlers.get("XRSystem")([r]);let i=2;switch(e.handedness){case"left":i=0;break;case"right":i=1}const o=s.transform.matrix,a=[];for(let e=0;e<16;e++)a[e]=new Float32Array([o[e]])[0];this.toStreamerMessagesProvider.toStreamerHandlers.get("XRControllerTransform")([a[0],a[4],a[8],a[12],a[1],a[5],a[9],a[13],a[2],a[6],a[10],a[14],a[3],a[7],a[11],a[15],i]),void 0===this.controllers[i]&&(this.controllers[i]={prevState:void 0,currentState:void 0,id:void 0},this.controllers[i].prevState=Mn(e.gamepad)),this.controllers[i].currentState=Mn(e.gamepad);const l=this.controllers[i],d=l.currentState,h=l.prevState;for(let e=0;e<d.buttons.length;e++){const t=d.buttons[e],n=h.buttons[e];if(t.pressed){const s=n.pressed?1:0;this.toStreamerMessagesProvider.toStreamerHandlers.get("XRButtonPressed")([i,e,s,t.value])}else n.pressed&&this.toStreamerMessagesProvider.toStreamerHandlers.get("XRButtonReleased")([i,e,0]);if(t.touched){const t=n.touched?1:0;this.toStreamerMessagesProvider.toStreamerHandlers.get("XRButtonTouched")([i,e,t])}else n.touched&&this.toStreamerMessagesProvider.toStreamerHandlers.get("XRButtonTouchReleased")([i,e,0])}for(let e=0;e<d.axes.length;e++){const t=d.axes[e];t!=h.axes[e]&&this.toStreamerMessagesProvider.toStreamerHandlers.get("XRAnalog")([i,e,t])}this.controllers[i].prevState=d}}}class _n{constructor(e){this.xrViewerPose=null,this.EPSILON=1e-7,this.videoTexture=null,this.prevVideoWidth=0,this.prevVideoHeight=0,this.leftView=null,this.rightView=null,this.lastSentLeftEyeProj=null,this.lastSentRightEyeProj=null,this.lastSentRelativeLeftEyePos=null,this.lastSentRelativeRightEyePos=null,this.xrSession=null,this.webRtcController=e,this.xrGamepadController=new Wn(this.webRtcController.streamMessageController),this.onSessionEnded=new EventTarget,this.onSessionStarted=new EventTarget,this.onFrame=new EventTarget}xrClicked(){if(this.xrSession)this.xrSession.end();else{if(!navigator.xr)return void d.Error("This browser does not support XR.");navigator.xr.requestSession("immersive-vr",{optionalFeatures:[]}).then((e=>{this.onXrSessionStarted(e)}))}}onXrSessionEnded(){d.Info("XR Session ended"),this.xrSession=null,this.onSessionEnded.dispatchEvent(new Event("xrSessionEnded"))}initGL(){if(this.gl)return;const e=document.createElement("canvas");this.gl=e.getContext("webgl2",{xrCompatible:!0}),this.gl.clearColor(0,0,0,1)}initShaders(){const e=this.gl.createShader(this.gl.VERTEX_SHADER);this.gl.shaderSource(e,"\n attribute vec2 a_position;\n attribute vec2 a_texCoord;\n\n // varyings\n varying vec2 v_texCoord;\n\n void main() {\n gl_Position = vec4(a_position.x, a_position.y, 0, 1);\n // pass the texCoord to the fragment shader\n // The GPU will interpolate this value between points.\n v_texCoord = a_texCoord;\n }\n "),this.gl.compileShader(e);const t=this.gl.createShader(this.gl.FRAGMENT_SHADER);this.gl.shaderSource(t,"\n precision mediump float;\n\n // our texture\n uniform sampler2D u_image;\n\n // the texCoords passed in from the vertex shader.\n varying vec2 v_texCoord;\n\n void main() {\n gl_FragColor = texture2D(u_image, v_texCoord);\n }\n "),this.gl.compileShader(t);const n=this.gl.createProgram();this.gl.attachShader(n,e),this.gl.attachShader(n,t),this.gl.linkProgram(n),this.gl.useProgram(n),this.positionLocation=this.gl.getAttribLocation(n,"a_position"),this.texcoordLocation=this.gl.getAttribLocation(n,"a_texCoord")}updateVideoTexture(){this.videoTexture||(this.videoTexture=this.gl.createTexture(),this.gl.bindTexture(this.gl.TEXTURE_2D,this.videoTexture),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_S,this.gl.CLAMP_TO_EDGE),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_T,this.gl.CLAMP_TO_EDGE),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MIN_FILTER,this.gl.LINEAR),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MAG_FILTER,this.gl.LINEAR));const e=this.webRtcController.videoPlayer.getVideoElement().videoHeight,t=this.webRtcController.videoPlayer.getVideoElement().videoWidth;this.prevVideoHeight!=e||this.prevVideoWidth!=t?this.gl.texImage2D(this.gl.TEXTURE_2D,0,this.gl.RGBA,t,e,0,this.gl.RGBA,this.gl.UNSIGNED_BYTE,this.webRtcController.videoPlayer.getVideoElement()):this.gl.texSubImage2D(this.gl.TEXTURE_2D,0,0,0,t,e,this.gl.RGBA,this.gl.UNSIGNED_BYTE,this.webRtcController.videoPlayer.getVideoElement()),this.prevVideoHeight=e,this.prevVideoWidth=t}initBuffers(){this.positionBuffer=this.gl.createBuffer(),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.positionBuffer),this.gl.enableVertexAttribArray(this.positionLocation),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array([-1,1,1,1,-1,-1,-1,-1,1,1,1,-1]),this.gl.STATIC_DRAW),this.gl.vertexAttribPointer(this.positionLocation,2,this.gl.FLOAT,!1,0,0),this.texcoordBuffer=this.gl.createBuffer(),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.texcoordBuffer),this.gl.enableVertexAttribArray(this.texcoordLocation),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array([0,0,1,0,0,1,0,1,1,0,1,1]),this.gl.STATIC_DRAW),this.gl.vertexAttribPointer(this.texcoordLocation,2,this.gl.FLOAT,!1,0,0)}onXrSessionStarted(e){d.Info("XR Session started"),this.xrSession=e,this.xrSession.addEventListener("end",(()=>{this.onXrSessionEnded()})),this.initGL(),this.initShaders(),this.initBuffers(),e.requestReferenceSpace("local").then((t=>{if(this.xrRefSpace=t,this.xrSession.updateRenderState({baseLayer:new XRWebGLLayer(this.xrSession,this.gl)}),this.xrSession.supportedFrameRates)for(const t of this.xrSession.supportedFrameRates)90==t&&e.updateTargetFrameRate(90);this.xrSession.requestAnimationFrame(this.onXrFrame.bind(this))})),this.onSessionStarted.dispatchEvent(new Event("xrSessionStarted"))}areArraysEqual(e,t){return e.length===t.length&&e.every(((e,n)=>Math.abs(e-t[n])<=this.EPSILON))}arePointsEqual(e,t){return Math.abs(e.x-t.x)>=this.EPSILON&&Math.abs(e.y-t.y)>=this.EPSILON&&Math.abs(e.z-t.z)>=this.EPSILON}sendXRDataToUE(){if(null==this.leftView||null==this.rightView)return;let e=null==this.lastSentLeftEyeProj||null==this.lastSentRightEyeProj||null==this.lastSentRelativeLeftEyePos||null==this.lastSentRelativeRightEyePos;const t=this.leftView.transform.matrix,n=this.leftView.projectionMatrix,s=this.rightView.transform.matrix,r=this.rightView.projectionMatrix,i=this.xrViewerPose.transform.matrix;if(!e&&null!=this.lastSentLeftEyeProj&&null!=this.lastSentRightEyeProj){const t=this.areArraysEqual(n,this.lastSentLeftEyeProj),s=this.areArraysEqual(r,this.lastSentRightEyeProj);e=0==t||0==s}const o=new DOMPointReadOnly(this.leftView.transform.position.x-this.xrViewerPose.transform.position.x,this.leftView.transform.position.y-this.xrViewerPose.transform.position.y,this.leftView.transform.position.z-this.xrViewerPose.transform.position.z,1),a=new DOMPointReadOnly(this.leftView.transform.position.x-this.xrViewerPose.transform.position.x,this.leftView.transform.position.y-this.xrViewerPose.transform.position.y,this.leftView.transform.position.z-this.xrViewerPose.transform.position.z,1);if(!e&&null!=this.lastSentRelativeLeftEyePos&&null!=this.lastSentRelativeRightEyePos){const t=this.arePointsEqual(o,this.lastSentRelativeLeftEyePos),n=this.arePointsEqual(a,this.lastSentRelativeRightEyePos);e=0==t||0==n}e?(this.webRtcController.streamMessageController.toStreamerHandlers.get("XREyeViews")([t[0],t[4],t[8],t[12],t[1],t[5],t[9],t[13],t[2],t[6],t[10],t[14],t[3],t[7],t[11],t[15],n[0],n[4],n[8],n[12],n[1],n[5],n[9],n[13],n[2],n[6],n[10],n[14],n[3],n[7],n[11],n[15],s[0],s[4],s[8],s[12],s[1],s[5],s[9],s[13],s[2],s[6],s[10],s[14],s[3],s[7],s[11],s[15],r[0],r[4],r[8],r[12],r[1],r[5],r[9],r[13],r[2],r[6],r[10],r[14],r[3],r[7],r[11],r[15],i[0],i[4],i[8],i[12],i[1],i[5],i[9],i[13],i[2],i[6],i[10],i[14],i[3],i[7],i[11],i[15]]),this.lastSentLeftEyeProj=n,this.lastSentRightEyeProj=r,this.lastSentRelativeLeftEyePos=o,this.lastSentRelativeRightEyePos=a):this.webRtcController.streamMessageController.toStreamerHandlers.get("XRHMDTransform")([i[0],i[4],i[8],i[12],i[1],i[5],i[9],i[13],i[2],i[6],i[10],i[14],i[3],i[7],i[11],i[15]])}onXrFrame(e,t){if(this.xrViewerPose=t.getViewerPose(this.xrRefSpace),this.xrViewerPose){if(this.updateViews(),null==this.leftView||null==this.rightView)return;this.sendXRDataToUE(),this.updateVideoTexture(),this.render()}this.webRtcController.config.isFlagEnabled(Nt.XRControllerInput)&&this.xrSession.inputSources.forEach(((e,n,s)=>{this.xrGamepadController.updateStatus(e,t,this.xrRefSpace)}),this),this.xrSession.requestAnimationFrame(((e,t)=>this.onXrFrame(e,t))),this.onFrame.dispatchEvent(new xt({time:e,frame:t}))}updateViews(){if(this.xrViewerPose)for(const e of this.xrViewerPose.views)"left"===e.eye?this.leftView=e:"right"===e.eye&&(this.rightView=e)}render(){if(!this.gl)return;const e=this.xrSession.renderState.baseLayer;this.gl.bindFramebuffer(this.gl.FRAMEBUFFER,e.framebuffer),this.gl.viewport(0,0,e.framebufferWidth,e.framebufferHeight),this.gl.drawArrays(this.gl.TRIANGLES,0,6)}static isSessionSupported(e){return"https:"!==location.protocol&&d.Info("WebXR requires https, if you want WebXR use https."),navigator.xr?navigator.xr.isSessionSupported(e):new Promise((()=>!1))}}class Hn{constructor(e){this.editTextButton=null,this.hiddenInput=null,"ontouchstart"in document.documentElement&&this.createOnScreenKeyboardHelpers(e)}unquantizeAndDenormalizeUnsigned(e,t){return null}createOnScreenKeyboardHelpers(e){this.hiddenInput||(this.hiddenInput=document.createElement("input"),this.hiddenInput.id="hiddenInput",this.hiddenInput.maxLength=0,this.hiddenInput.style.position="absolute",this.hiddenInput.style.left="-10%",this.hiddenInput.style.width="0px",this.hiddenInput.style.opacity="0",e.appendChild(this.hiddenInput)),this.editTextButton||(this.editTextButton=document.createElement("button"),this.editTextButton.id="editTextButton",this.editTextButton.innerHTML="edit text",e.appendChild(this.editTextButton),this.editTextButton.style.display="none",this.editTextButton.addEventListener("touchend",(e=>{this.hiddenInput.focus(),e.preventDefault()})))}showOnScreenKeyboard(e){if(e.showOnScreenKeyboard){this.editTextButton.style.display="default";const t=this.unquantizeAndDenormalizeUnsigned(e.x,e.y);this.editTextButton.style.top=t.y.toString()+"px",this.editTextButton.style.left=(t.x-40).toString()+"px"}else this.editTextButton.style.display="none",this.hiddenInput.blur()}}class $n{constructor(e){this.seq=e.Seq,this.playerSentTimestamp=Date.now(),this.requestFillerSize=e.Filler?e.Filler.length:0}update(e){this.playerReceivedTimestamp=Date.now(),this.streamerReceivedTimestamp=e.ReceivedTimestamp,this.streamerSentTimestamp=e.SentTimestamp,this.responseFillerSize=e.Filler?e.Filler.length:0}}class jn{constructor(e,t){this.sink=e,this.callback=t,this.records=new Map,this.seq=0}start(e){return!this.isRunning()&&(this.startTime=Date.now(),this.records.clear(),this.interval=setInterval((()=>{Date.now()-this.startTime>=e.duration?this.stop():this.sendRequest(e.requestSize,e.responseSize)}).bind(this),Math.floor(1e3/e.rps)),!0)}stop(){this.interval&&(clearInterval(this.interval),this.interval=void 0,this.callback(this.produceResult()))}produceResult(){const e=new Map(this.records);return{records:e,dataChannelRtt:Math.ceil(Array.from(this.records.values()).reduce(((e,t)=>e+(t.playerReceivedTimestamp-t.playerSentTimestamp)),0)/this.records.size),playerToStreamerTime:Math.ceil(Array.from(this.records.values()).reduce(((e,t)=>e+(t.streamerReceivedTimestamp-t.playerSentTimestamp)),0)/this.records.size),streamerToPlayerTime:Math.ceil(Array.from(this.records.values()).reduce(((e,t)=>e+(t.playerReceivedTimestamp-t.streamerSentTimestamp)),0)/this.records.size),exportLatencyAsCSV:()=>{let t="Timestamp;RTT;PlayerToStreamer;StreamerToPlayer;\n";return e.forEach((e=>{t+=e.playerSentTimestamp+";",t+=e.playerReceivedTimestamp-e.playerSentTimestamp+";",t+=e.streamerReceivedTimestamp-e.playerSentTimestamp+";",t+=e.playerReceivedTimestamp-e.streamerSentTimestamp+";",t+="\n"})),t}}}isRunning(){return!!this.interval}receive(e){if(!this.isRunning())return;if(!e)return void d.Error("Undefined response from server");const t=this.records.get(e.Seq);t&&t.update(e)}sendRequest(e,t){const n=this.createRequest(e,t),s=new $n(n);this.records.set(s.seq,s),this.sink(n)}createRequest(e,t){return{Seq:this.seq++,FillResponseSize:t,Filler:e?"A".repeat(e):""}}}class zn{constructor(e,t){this.allowConsoleCommands=!1,this.config=e,(null==t?void 0:t.videoElementParent)&&(this._videoElementParent=t.videoElementParent),this._eventEmitter=new Dt,this.configureSettings(),this.setWebRtcPlayerController(new Vn(this.config,this)),this.onScreenKeyboardHelper=new Hn(this.videoElementParent),this.onScreenKeyboardHelper.unquantizeAndDenormalizeUnsigned=(e,t)=>this._webRtcController.requestUnquantizedAndDenormalizeUnsigned(e,t),this._activateOnScreenKeyboard=e=>this.onScreenKeyboardHelper.showOnScreenKeyboard(e),this._webXrController=new _n(this._webRtcController),this._setupWebRtcTCPRelayDetection=this._setupWebRtcTCPRelayDetection.bind(this),this._eventEmitter.addEventListener("webRtcConnected",(e=>{this._eventEmitter.addEventListener("statsReceived",this._setupWebRtcTCPRelayDetection)}))}get videoElementParent(){return this._videoElementParent||(this._videoElementParent=document.createElement("div"),this._videoElementParent.id="videoElementParent"),this._videoElementParent}configureSettings(){this.config._addOnSettingChangedListener(Nt.IsQualityController,(e=>{!0!==e||this._webRtcController.isQualityController||this._webRtcController.sendRequestQualityControlOwnership()})),this.config._addOnSettingChangedListener(Nt.AFKDetection,(e=>{this._webRtcController.setAfkEnabled(e)})),this.config._addOnSettingChangedListener(Nt.MatchViewportResolution,(()=>{this._webRtcController.videoPlayer.updateVideoStreamSize()})),this.config._addOnSettingChangedListener(Nt.HoveringMouseMode,(e=>{this.config.setFlagLabel(Nt.HoveringMouseMode,`Control Scheme: ${e?"Hovering":"Locked"} Mouse`),this._webRtcController.setMouseInputEnabled(this.config.isFlagEnabled(Nt.MouseInput))})),this.config._addOnSettingChangedListener(Nt.KeyboardInput,(e=>{this._webRtcController.setKeyboardInputEnabled(e)})),this.config._addOnSettingChangedListener(Nt.MouseInput,(e=>{this._webRtcController.setMouseInputEnabled(e)})),this.config._addOnSettingChangedListener(Nt.FakeMouseWithTouches,(e=>{this._webRtcController.setTouchInputEnabled(this.config.isFlagEnabled(Nt.TouchInput))})),this.config._addOnSettingChangedListener(Nt.TouchInput,(e=>{this._webRtcController.setTouchInputEnabled(e)})),this.config._addOnSettingChangedListener(Nt.GamepadInput,(e=>{this._webRtcController.setGamePadInputEnabled(e)})),this.config._addOnNumericSettingChangedListener(Bt.MinQP,(e=>{d.Info("-------- Sending MinQP --------"),this._webRtcController.sendEncoderMinQP(e),d.Info("-------------------------------------------")})),this.config._addOnNumericSettingChangedListener(Bt.MaxQP,(e=>{d.Info("-------- Sending encoder settings --------"),this._webRtcController.sendEncoderMaxQP(e),d.Info("-------------------------------------------")})),this.config._addOnNumericSettingChangedListener(Bt.WebRTCMinBitrate,(e=>{d.Info("-------- Sending web rtc settings --------"),this._webRtcController.sendWebRTCMinBitrate(1e3*e),d.Info("-------------------------------------------")})),this.config._addOnNumericSettingChangedListener(Bt.WebRTCMaxBitrate,(e=>{d.Info("-------- Sending web rtc settings --------"),this._webRtcController.sendWebRTCMaxBitrate(1e3*e),d.Info("-------------------------------------------")})),this.config._addOnNumericSettingChangedListener(Bt.WebRTCFPS,(e=>{d.Info("-------- Sending web rtc settings --------"),this._webRtcController.sendWebRTCFps(e),d.Info("-------------------------------------------")})),this.config._addOnOptionSettingChangedListener(_t.PreferredCodec,(e=>{this._webRtcController&&this._webRtcController.setPreferredCodec(e)})),this.config._registerOnChangeEvents(this._eventEmitter)}_activateOnScreenKeyboard(e){throw new Error("Method not implemented.")}_onInputControlOwnership(e){this._inputController=e}setWebRtcPlayerController(e){this._webRtcController=e,this._webRtcController.setPreferredCodec(this.config.getSettingOption(_t.PreferredCodec).selected),this._webRtcController.resizePlayerStyle(),this.checkForAutoConnect()}connect(){this._eventEmitter.dispatchEvent(new gt),this._webRtcController.connectToSignallingServer()}reconnect(){this._eventEmitter.dispatchEvent(new pt),this._webRtcController.tryReconnect("Reconnecting...")}disconnect(){this._eventEmitter.dispatchEvent(new mt),this._webRtcController.close()}play(){this._onStreamLoading(),this._webRtcController.playStream()}checkForAutoConnect(){this.config.isFlagEnabled(Nt.AutoConnect)&&(this._onWebRtcAutoConnect(),this._webRtcController.connectToSignallingServer())}unmuteMicrophone(e=!1){if(!this.config.isFlagEnabled("UseMic"))return e?(this.config.setFlagEnabled("UseMic",!0),void this.reconnect()):void d.Warning("Trying to unmute mic, but PixelStreaming was initialized with no microphone track. Call with forceEnable == true to re-connect with a mic track.");this.setMicrophoneMuted(!1)}muteMicrophone(){this.config.isFlagEnabled("UseMic")?this.setMicrophoneMuted(!0):d.Info("Trying to mute mic, but PixelStreaming has no microphone track, so sending sound is already disabled.")}setMicrophoneMuted(e){var t,n,s,r;for(const i of null!==(r=null===(s=null===(n=null===(t=this._webRtcController)||void 0===t?void 0:t.peerConnectionController)||void 0===n?void 0:n.peerConnection)||void 0===s?void 0:s.getTransceivers())&&void 0!==r?r:[])rn.canTransceiverSendAudio(i)&&(i.sender.track.enabled=!e)}unmuteCamera(e=!1){if(!this.config.isFlagEnabled("UseCamera"))return e?(this.config.setFlagEnabled("UseCamera",!0),void this.reconnect()):void d.Warning("Trying to unmute video, but PixelStreaming was initialized with no video track. Call with forceEnable == true to re-connect with a video track.");this.setCameraMuted(!1)}muteCamera(){this.config.isFlagEnabled("UseCamera")?this.setCameraMuted(!0):d.Info("Trying to mute camera, but PixelStreaming has no video track, so sending video is already disabled.")}setCameraMuted(e){var t,n,s,r;for(const i of null!==(r=null===(s=null===(n=null===(t=this._webRtcController)||void 0===t?void 0:t.peerConnectionController)||void 0===n?void 0:n.peerConnection)||void 0===s?void 0:s.getTransceivers())&&void 0!==r?r:[])rn.canTransceiverSendVideo(i)&&(i.sender.track.enabled=!e)}_onWebRtcAutoConnect(){this._eventEmitter.dispatchEvent(new st)}_onWebRtcSdp(){this._eventEmitter.dispatchEvent(new nt)}_onStreamLoading(){this._eventEmitter.dispatchEvent(new ut)}_onDisconnect(e,t){this._eventEmitter.dispatchEvent(new at({eventString:e,allowClickToReconnect:t}))}_onWebRtcConnecting(){this._eventEmitter.dispatchEvent(new rt)}_onWebRtcConnected(){this._eventEmitter.dispatchEvent(new it)}_onWebRtcFailed(){this._eventEmitter.dispatchEvent(new ot)}_onVideoInitialized(){this._eventEmitter.dispatchEvent(new ct),this._videoStartTime=Date.now()}_onLatencyTestResult(e){this._eventEmitter.dispatchEvent(new Et({latencyTimings:e}))}_onDataChannelLatencyTestResponse(e){this._eventEmitter.dispatchEvent(new Mt({response:e}))}_onVideoStats(e){this._videoStartTime&&void 0!==this._videoStartTime||(this._videoStartTime=Date.now()),e.handleSessionStatistics(this._videoStartTime,this._inputController,this._webRtcController.videoAvgQp),this._eventEmitter.dispatchEvent(new bt({aggregatedStats:e}))}_onVideoEncoderAvgQP(e){this._eventEmitter.dispatchEvent(new tt({avgQP:e}))}_onInitialSettings(e){var t;this._eventEmitter.dispatchEvent(new Rt({settings:e})),e.PixelStreamingSettings&&(this.allowConsoleCommands=null!==(t=e.PixelStreamingSettings.AllowPixelStreamingCommands)&&void 0!==t&&t,!1===this.allowConsoleCommands&&d.Info("-AllowPixelStreamingCommands=false, sending arbitrary console commands from browser to UE is disabled."));const n=this.config.useUrlParams,s=new Un(window.location.search);d.Info(`using URL parameters ${n}`),e.EncoderSettings&&(this.config.setNumericSetting(Bt.MinQP,n&&s.has(Bt.MinQP)?Number.parseFloat(s.get(Bt.MinQP)):e.EncoderSettings.MinQP),this.config.setNumericSetting(Bt.MaxQP,n&&s.has(Bt.MaxQP)?Number.parseFloat(s.get(Bt.MaxQP)):e.EncoderSettings.MaxQP)),e.WebRTCSettings&&(this.config.setNumericSetting(Bt.WebRTCMinBitrate,n&&s.has(Bt.WebRTCMinBitrate)?Number.parseFloat(s.get(Bt.WebRTCMinBitrate)):e.WebRTCSettings.MinBitrate/1e3),this.config.setNumericSetting(Bt.WebRTCMaxBitrate,n&&s.has(Bt.WebRTCMaxBitrate)?Number.parseFloat(s.get(Bt.WebRTCMaxBitrate)):e.WebRTCSettings.MaxBitrate/1e3),this.config.setNumericSetting(Bt.WebRTCFPS,n&&s.has(Bt.WebRTCFPS)?Number.parseFloat(s.get(Bt.WebRTCFPS)):e.WebRTCSettings.FPS))}_onQualityControlOwnership(e){this.config.setFlagEnabled(Nt.IsQualityController,e)}_onPlayerCount(e){this._eventEmitter.dispatchEvent(new Ft({count:e}))}_setupWebRtcTCPRelayDetection(e){const t=e.data.aggregatedStats.getActiveCandidatePair();if(null!=t){const n=e.data.aggregatedStats.localCandidates.find((e=>e.id==t.localCandidateId),null);null!=n&&"relay"==n.candidateType&&"tcp"==n.relayProtocol&&this._eventEmitter.dispatchEvent(new Ot),this._eventEmitter.removeEventListener("statsReceived",this._setupWebRtcTCPRelayDetection)}}requestLatencyTest(){return!!this._webRtcController.videoPlayer.isVideoReady()&&(this._webRtcController.sendLatencyTest(),!0)}requestDataChannelLatencyTest(e){return!!this._webRtcController.videoPlayer.isVideoReady()&&(this._dataChannelLatencyTestController||(this._dataChannelLatencyTestController=new jn(this._webRtcController.sendDataChannelLatencyTest.bind(this._webRtcController),(e=>{this._eventEmitter.dispatchEvent(new kt({result:e}))})),this.addEventListener("dataChannelLatencyTestResponse",(({data:{response:e}})=>{this._dataChannelLatencyTestController.receive(e)}))),this._dataChannelLatencyTestController.start(e))}requestShowFps(){return!!this._webRtcController.videoPlayer.isVideoReady()&&(this._webRtcController.sendShowFps(),!0)}requestIframe(){return!!this._webRtcController.videoPlayer.isVideoReady()&&(this._webRtcController.sendIframeRequest(),!0)}emitUIInteraction(e){return!!this._webRtcController.videoPlayer.isVideoReady()&&(this._webRtcController.emitUIInteraction(e),!0)}emitCommand(e){return!(!this._webRtcController.videoPlayer.isVideoReady()||!this.allowConsoleCommands&&"ConsoleCommand"in e||(this._webRtcController.emitCommand(e),0))}emitConsoleCommand(e){return!(!this.allowConsoleCommands||!this._webRtcController.videoPlayer.isVideoReady()||(this._webRtcController.emitConsoleCommand(e),0))}addResponseEventListener(e,t){this._webRtcController.responseController.addResponseEventListener(e,t)}removeResponseEventListener(e){this._webRtcController.responseController.removeResponseEventListener(e)}dispatchEvent(e){return this._eventEmitter.dispatchEvent(e)}addEventListener(e,t){this._eventEmitter.addEventListener(e,t)}removeEventListener(e,t){this._eventEmitter.removeEventListener(e,t)}toggleXR(){this.webXrController.xrClicked()}setSignallingUrlBuilder(e){this._webRtcController.signallingUrlBuilder=e}get webRtcController(){return this._webRtcController}get signallingProtocol(){return this._webRtcController.protocol}get webXrController(){return this._webXrController}registerMessageHandler(e,t,n){t!==Rn.FromStreamer||void 0!==n?t===Rn.ToStreamer&&void 0===n?this._webRtcController.streamMessageController.registerMessageHandler(t,e,(t=>this._webRtcController.sendMessageController.sendMessageToStreamer(e,t))):this._webRtcController.streamMessageController.registerMessageHandler(t,e,(e=>n(e))):d.Warning(`Unable to register an undefined handler for ${e}`)}get toStreamerHandlers(){return this._webRtcController.streamMessageController.toStreamerHandlers}isReconnecting(){return this._webRtcController.isReconnecting}}class Kn{}var Gn=s(290),Xn=s.n(Gn);class qn extends u.EventEmitter{constructor(e){super(),this.WS_OPEN_STATE=1,e&&(this.webSocket=e,this.setupSocketHandlers(),this.emit("open"))}sendMessage(e){this.webSocket&&this.webSocket.send(JSON.stringify(e))}connect(e){return this.webSocket=new(Xn())(e),this.setupSocketHandlers(),!0}disconnect(e,t){this.webSocket&&this.webSocket.close(e,t)}isConnected(){return!!this.webSocket&&this.webSocket.readyState!=Xn().CLOSED}handleOnMessage(e){let t;try{t=JSON.parse(e.data)}catch(e){return}this.onMessage&&this.onMessage(t)}handleOnOpen(e){this.emit("open",e)}handleOnError(e){this.emit("error",e)}handleOnClose(e){this.emit("close",e)}close(){var e;null===(e=this.webSocket)||void 0===e||e.close()}setupSocketHandlers(){this.webSocket&&(this.webSocket.addEventListener("open",this.handleOnOpen.bind(this)),this.webSocket.addEventListener("error",this.handleOnError.bind(this)),this.webSocket.addEventListener("close",this.handleOnClose.bind(this)),this.webSocket.addEventListener("message",this.handleOnMessage.bind(this)))}}var Qn=r.D6,Jn=r.Kr,Yn=r.mC,Zn=r.jr,es=r.S_,ts=r.Ff,ns=r.Hp,ss=r.yC,rs=r.TS,is=r.Bs,os=r.CE,as=r.EQ,ls=r.Fh,ds=r.L7,hs=r.ys,cs=r.Lm,us=r.Cx,gs=r.bk,ms=r.iI,ps=r.RW,fs=r.$o,ys=r.IR,vs=r.C9,ws=r.EG,Ss=r.gU,bs=r.Cc,Cs=r.ZS,Ts=r.vx,Es=r.$b,Ms=r.Vy,ks=r.Tt,Rs=r.Jo,Ps=r.z,Is=r.B2,Ls=r.k$,xs=r.mY,Fs=r.D4,Os=r.z3,Ds=r.vL,Ns=r.Lz,As=r.FJ,Bs=r.d2,Us=r.Eo,Vs=r.kR,Ws=r.UW,_s=r.GZ,Hs=r.cZ,$s=r.Si,js=r.ty,zs=r.d_,Ks=r.Bg,Gs=r.y6,Xs=r.iu,qs=r.oK,Qs=r.ie,Js=r.jG,Ys=r.gw,Zs=r.x1,er=r.Qy,tr=r.bJ,nr=r.nV,sr=r.d4,rr=r.Ys,ir=r.Nu,or=r.tv,ar=r.n7,lr=r.xV,dr=r.KB,hr=r.TJ,cr=r.a7,ur=r.R3,gr=r.qM,mr=r.HH,pr=r.ev;export{Qn as AfkLogic,Jn as AfkTimedOutEvent,Yn as AfkWarningActivateEvent,Zn as AfkWarningDeactivateEvent,es as AfkWarningUpdateEvent,ts as AggregatedStats,ns as CandidatePairStats,ss as CandidateStat,rs as Config,is as ControlSchemeType,os as DataChannelCloseEvent,as as DataChannelErrorEvent,ls as DataChannelLatencyTestResponseEvent,ds as DataChannelLatencyTestResultEvent,hs as DataChannelOpenEvent,cs as DataChannelStats,us as EncoderSettings,gs as EventEmitter,ms as Flags,ps as HideFreezeFrameEvent,fs as InboundAudioStats,ys as InboundVideoStats,vs as InitialSettings,ws as InitialSettingsEvent,Ss as InputCoordTranslator,bs as LatencyTestResultEvent,Cs as LatencyTestResults,Ts as LoadFreezeFrameEvent,Es as LogLevel,Ms as Logger,ks as MessageDirection,Rs as MessageHelpers,Ps as MessageRegistry,Is as Messages,Ls as NumericParameters,xs as OptionParameters,Fs as OutBoundVideoStats,Os as PixelStreaming,Ds as PlayStreamErrorEvent,Ns as PlayStreamEvent,As as PlayStreamRejectedEvent,Bs as PlayerCountEvent,Us as SettingBase,Vs as SettingFlag,Ws as SettingNumber,_s as SettingOption,Hs as SettingText,$s as SettingsChangedEvent,js as SignallingProtocol,zs as StatsReceivedEvent,Ks as StreamLoadingEvent,Gs as StreamPreConnectEvent,Xs as StreamPreDisconnectEvent,qs as StreamReconnectEvent,Qs as StreamerIDChangedMessageEvent,Js as StreamerListMessageEvent,Ys as TextParameters,Zs as VideoEncoderAvgQPEvent,er as VideoInitializedEvent,tr as WebRTCSettings,nr as WebRtcAutoConnectEvent,sr as WebRtcConnectedEvent,rr as WebRtcConnectingEvent,ir as WebRtcDisconnectedEvent,or as WebRtcFailedEvent,ar as WebRtcPlayerController,lr as WebRtcSdpEvent,dr as WebRtcTCPRelayDetectedEvent,hr as WebSocketTransport,cr as WebSocketTransportNJS,ur as WebXRController,gr as XrFrameEvent,mr as XrSessionEndedEvent,pr as XrSessionStartedEvent};