{"version":3,"file":"322.895970c4e2cd5527.js","mappings":"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","names":["window","document","exportName","undefined","assign","VENDOR_PREFIXES","TEST_ELEMENT","createElement","round","Math","abs","now","Date","fn","timeout","context","setTimeout","bindFn","arg","Array","isArray","each","obj","iterator","i","forEach","length","call","hasOwnProperty","method","name","message","deprecationMessage","e","Error","stack","replace","log","console","warn","apply","this","arguments","Object","target","TypeError","output","index","source","nextKey","extend","deprecate","dest","src","merge","keys","child","base","properties","childP","baseP","prototype","create","constructor","_super","val","args","val1","val2","types","handler","splitStr","type","addEventListener","removeEventListener","node","parent","parentNode","str","find","indexOf","trim","split","findByKey","slice","key","sort","results","values","inArray","push","a","b","property","prefix","prop","camelProp","toUpperCase","_uniqueId","element","doc","ownerDocument","defaultView","parentWindow","SUPPORT_TOUCH","SUPPORT_POINTER_EVENTS","prefixed","SUPPORT_ONLY_TOUCH","test","navigator","userAgent","INPUT_TYPE_TOUCH","INPUT_TYPE_MOUSE","PROPS_XY","PROPS_CLIENT_XY","manager","callback","self","options","inputTarget","domHandler","ev","boolOrFn","enable","init","eventType","input","pointersLen","pointers","changedPointersLen","changedPointers","isFirst","isFinal","INPUT_END","session","pointersLength","firstInput","simpleCloneInputData","m","firstMultiple","offsetCenter","center","getCenter","timeStamp","deltaTime","angle","getAngle","distance","getDistance","offset","offsetDelta","prevDelta","prevInput","x","deltaX","y","deltaY","computeDeltaXY","offsetDirection","getDirection","overallVelocity","getVelocity","overallVelocityX","overallVelocityY","scale","start","end","getScale","rotation","getRotation","maxPointers","velocity","velocityX","velocityY","direction","last","lastInterval","v","computeIntervalInputData","hasParent","srcEvent","computeInputData","emit","recognize","clientX","clientY","p1","p2","props","sqrt","atan2","PI","Input","evEl","addEventListeners","evTarget","evWin","getWindowForElement","destroy","removeEventListeners","MOUSE_INPUT_MAP","mousedown","mousemove","mouseup","MOUSE_ELEMENT_EVENTS","MOUSE_WINDOW_EVENTS","pressed","inherit","MouseInput","button","which","pointerType","POINTER_INPUT_MAP","pointerdown","pointermove","pointerup","pointercancel","pointerout","IE10_POINTER_TYPE_ENUM","POINTER_ELEMENT_EVENTS","POINTER_WINDOW_EVENTS","store","pointerEvents","MSPointerEvent","PointerEvent","PointerEventInput","removePointer","eventTypeNormalized","toLowerCase","isTouch","storeIndex","pointerId","h","splice","SINGLE_TOUCH_INPUT_MAP","touchstart","touchmove","touchend","touchcancel","SINGLE_TOUCH_TARGET_EVENTS","SINGLE_TOUCH_WINDOW_EVENTS","started","all","toArray","touches","changed","changedTouches","uniqueArray","concat","SingleTouchInput","normalizeSingleTouches","TOUCH_INPUT_MAP","TOUCH_TARGET_EVENTS","targetIds","allTouches","INPUT_START","identifier","targetTouches","changedTargetTouches","filter","touch","TouchInput","mouse","primaryTouch","lastTouches","eventData","setLastTouch","lastTouch","lts","t","dx","dy","getTouches","TouchMouseInput","inputEvent","inputData","isMouse","sourceCapabilities","firesTouchEvents","recordTouches","isSyntheticEvent","PREFIXED_TOUCH_ACTION","style","NATIVE_TOUCH_ACTION","TOUCH_ACTION_COMPUTE","TOUCH_ACTION_MANIPULATION","TOUCH_ACTION_NONE","TOUCH_ACTION_PAN_X","TOUCH_ACTION_PAN_Y","TOUCH_ACTION_MAP","touchMap","cssSupports","CSS","supports","getTouchActionProps","value","set","TouchAction","compute","actions","update","touchAction","recognizers","recognizer","getTouchAction","inStr","hasPanX","hasPanY","cleanTouchActions","join","preventDefaults","prevented","hasNone","DIRECTION_LEFT","DIRECTION_UP","preventSrc","preventDefault","STATE_FAILED","defaults","id","uniqueId","ifUndefined","state","simultaneous","requireFail","otherRecognizer","get","Recognizer","AttrRecognizer","pX","pY","_timer","_input","pTime","pCenter","count","Hammer","preset","Manager","handlers","oldCssProps","inputClass","Et","It","F","inputHandler","createInputInstance","toggleCssProps","item","add","recognizeWith","requireFailure","cssProps","o","invokeArrayArg","getRecognizerByNameIfManager","dropRecognizeWith","dropRequireFailure","hasRequireFailures","canRecognizeWith","event","stateStr","additionalEvent","tryEmit","canEmit","inputDataClone","reset","STATE_RECOGNIZED","process","STATE_BEGAN","attrTest","optionPointers","isRecognized","isValid","PanRecognizer","threshold","DIRECTION_HORIZONTAL","directionTest","hasMoved","directionStr","PinchRecognizer","PressRecognizer","time","validPointers","validMovement","validTime","setTimeoutContext","clearTimeout","RotateRecognizer","SwipeRecognizer","TapRecognizer","taps","interval","posThreshold","validTouchTime","failTimeout","validInterval","validMultiTap","tapCount","VERSION","domEvents","userSelect","touchSelect","touchCallout","contentZooming","userDrag","tapHighlightColor","stop","force","stopped","curRecognizer","existing","remove","on","events","off","data","gestureEvent","createEvent","initEvent","gesture","dispatchEvent","triggerDomEvent","INPUT_MOVE","INPUT_CANCEL","STATE_POSSIBLE","STATE_CHANGED","STATE_ENDED","STATE_CANCELLED","DIRECTION_NONE","DIRECTION_RIGHT","DIRECTION_DOWN","DIRECTION_VERTICAL","DIRECTION_ALL","Tap","Pan","Swipe","Pinch","Rotate","Press","define","i0","$event","ctx_r17","ctx_r33","ctx_r35","InlineEditControl","elementRef","EventEmitter","_","cssClass","nativeElement","getAttribute","setAttribute","onClick","externalSelectorClicked","classList","contains","readOnly","editMode","toggleEdit","discard","of","pipe","delay","subscribe","inputElement","focus","isEditing","save","evt","originalValue","propagateChange","propagateTouch","updated","stopPropagation","getDisplayValue","valuePrimitive","items","valueField","textField","writeValue","registerOnChange","registerOnTouched","onChange","onTouch","selectors","TemplateRef","ctx","provide","NG_VALUE_ACCESSOR","useExisting","forwardRef","multi","decls","ctx_r15","ctx_r19","ctx_r21","ctx_r23","ctx_r26","ctx_r27","ctx_r28","ctx_r29","ctx_r30","ctx_r31","ctx_r32","ctx_r34","ctx_r36","ctx_r37","ctx_r38","ctx_r39","ctx_r40","ctx_r41","ctx_r42","ctx_r43","ctx_r44","ctx_r45","ctx_r46","LiveSuperuserComponent","superUser","bytePipe","toaster","liveEvent","BehaviorSubject","obsArray","asObservable","ngOnInit","connection","channel","streamingChannel","trackType","videoHealthData","maxValue","max","bitrate","addElementToObservableArray","audioHealthData","getDashboard","dashboard","status","initialized","checker","getDashboardData","contentString","bytes","array$","take","newArr","next","getDashboardIgnoreCache","showToken","tokenNum","resetChatAndQuestions","result","success","startOpenTokRTMP","startOpenTokRTMPOnly","resetEvent","rebuildCacheForEvent","stopOpenTokRTMP","openForCeus","setOpenForCEUs","startOpenTokArchiveOnly","startSecondaryOpenTokArchive","switchToYouTube","failoverToOpenTok","startOpenTokStreamOnly","setStreamLayouts","startChannel","stopChannel","goLive","confirmDialog","spinnerDialog","spinnerResult","startWebRTCStream","close","streamingStarted","streamingStartedTime","error","toString","messageDialog","scheduleTokens","scheduleCEUChecks","url","allowOnCamera","setAttendeesCamerasAllowed","denyOnCamera","startEvent","broadcastStatus","startStreaming","startNewLiveOutput","stopEvent","stopStreaming","closed","ngOnDestroy","unsubscribe","BytePipe","ctx_r18","ctx_r20","ctx_r22","ctx_r24","initLayoutContainer","require","MultiViewVideoComponent","auth","ref","liveEventService","modalService","renderer","opentokService","InitSignalR","isWebRTC","InitOpenTok","initAzure","timer$","getElapsedTime","azureStreamChecker","isChannelRunning","isIngesting","isBroadcastRunning","streamingUrl","setupAzureLive","livePlayer","livePlaying","currentTime","setSrc","previewing","togglePlay","flowplayer","qsel","labels","previewUrl","autoplay","AUDIO_REQUIRED","ui","NO_FULLSCREEN","token","playbackErrorOccured","bind","dvr","live","seekable","controls","err","info","eventId","startTime","detectChanges","layout","streamingFinished","disconnect","publishing","streamCount","usersUpdated","userCount","totalCount","offAirImage","sponsorOffAirImage","webRTCLayoutContainer","openTokInitialized","initSessionForEvents","then","stream","streamId","subscription","insertMode","nameDisplayMode","videoType","checkMuted","getSubscribersForStream","subscriber","connect","catch","alert","showDeviceSettings","modalRef","open","CameraTestModalComponent","size","backdrop","ariaLabelledBy","selectedDevice","componentInstance","publisher","activateCamera","reason","toggleVideo","publishingVideo","publishVideo","toggleAudio","publishingAudio","publishAudio","querySelectorAll","elem","muted","soundMuted","muteAudio","unMuteAudio","unpublish","OT","getOT","el","initPublisher","resolution","width","insertDefaultUI","archiveStatusDisplayMode","buttonDisplayMode","audioSource","audioDeviceId","videoSource","videoDeviceId","appendChild","isConnected","publish","timer","map","date","totalSeconds","floor","getTime","pre","hours","minutes","seconds","n","ctx_r10","MulitViewerComponent","route","router","queryRouteSubscription","zE","routeReuseStrategy","shouldReuseRoute","loadZendesk","queryParamMap","queryParam","eventIds","query","selectedEvents","Enumerable","select","parseInt","subscriptions","getLiveEvent","getEventsForToday","todaysEvents","forkJoin","evnt","eventChanged","evtIdx","navigateByUrl","HubConnectionBuilder","withUrl","accessTokenFactory","getToken","withAutomaticReconnect","DefaultReconnectPolicy","build","invoke","onreconnected","exitPage","navigate","TechnicalSupportComponent","EventRole","toggleCompatibility","toggleCompatabilityMode","refresh","reloadVideo","supportChat","openSupportChat","requestModerator","submitComplete","Promise","resolve","reject","requestSupport","ctx_r4","LiveTipsComponent","zone","eventService","markAllTouched","userFrm","field","control","markAsTouched","onlySelf","markAsDirty","resetForm","markAsPristine","markAsUntouched","sendTip","valid","resetButton","send","Stripe","card","createToken","number","cardNumber","exp_month","expMo","exp_year","expYr","cvc","cvv","response","model","TipViewModel","cardToken","amount","tipAmount","run","addTipToEvent","errorMessage","ChatEventLinkComponent","settings","getSpecificCourseEvent","eventIdOrSlug","ctx_r11","ctx_r13","StreamBoxComponent","streamBoxService","toasterService","titleService","WowzaState","Enums","StrWowzaStateEnum","paramMap","params","qParams","selectedCameraDevice","JSON","parse","localStorage","getItem","selectedScreenDevice","getData","getRoomsForConferences","rooms","selectedRoom","firstOrDefault","streamBoxId","setTitleAndLogPageView","StreamBoxLayoutViewModel","cameraWidth","cameraHeight","cameraTop","cameraLeft","cameraOnAir","computerOnAir","cameraOnly","publishCamera","panUp","panDown","panLeft","panRight","zoomIn","zoomOut","zoomStop","panStop","mute","unmute","superSource16x9","superSource4x3","updateLayoutFromModel","videoCanvas","camera","querySelector","setProperty","slides","computerWidth","computerHeight","computerTop","computerLeft","stopStream","record","startRecording","stopRecord","stopRecording","updateLayout","resize","initsessionForStreamBox","preferredResolution","height","setInitialized","cameraPublisher","disableAudioProcessing","publishCaptions","mirror","fitMode","movingAvg","audioLevel","LN10","min","soundBar","cameraPublishing","cameraDeviceSettings","setItem","stringify","setVideoSource","setAudioSource","onResize","screenPublisher","resetCameras","removeItem","getChannels","currentChannelStatus","updateRoomForBox","updateChannelForStreambox","ctx_r7","ctx_r9","ctx_r14","LiveEventRoomViewComponent","shareSlides","stopSharing","includes","fullscreen","fullscreenContainer","isFullScreen","exitFullscreen","mozCancelFullScreen","webkitExitFullscreen","msExitFullscreen","requestFullscreen","mozRequestFullScreen","webkitRequestFullscreen","msRequestFullscreen","chatResized","exit","ctx_r8","ctx_r12","ctx_r16","ctx_r25","ctx_r47","ctx_r48","ctx_r49","ctx_r50","ctx_r51","ctx_r52","ctx_r53","ctx_r54","StreamboxMultiView","streamboxService","admin","body","backgroundColor","selectedBoxes","conferenceId","getRoomsForConference","GetStreamboxStateViewModel","ids","getState","streamboxes","findIndex","selectedBox","startRecord","panelLayout","setProgram","startStreamMacro","stopStreamMacro","toggleMute","currentMuteState","setSelected","streamBoxName","screensOrVideos","selected","boxId","roomName","subscribeToAudio","ctx_r6","CaptionBoxComponent","stopCaptionsChannel","stopCaptions","box","startCaptionsChannel","startCaptions","initsessionForStreamBoxCaptions","CaptionServerComponent","getDeviceList","getAllStreamboxes","boxes","getDevices","devices","audioInputs","device","kind","videoInputs","LiveEventsModule","NgbModalModule","ChartsModule","ApplicationPipesModule","RouterModule","path","component","PresenterViewComponent","canActivate","IsAuthenticatedGuard","LiveEventDashboardComponent","title","CaptionsDisplayComponent","LiveQuestionsComponent","LivePollsComponent","EventMaterialsComponent","CeuTokensComponent","LiveEventChatComponent","LivePeopleComponent","LiveVideosComponent","i3"],"sourceRoot":"webpack:///","sources":["./node_modules/hammerjs/hammer.js","./src/app/_controls/inline-edit.ts","./src/app/events/live/super-user/live-superuser.component.html","./src/app/events/live/super-user/live-superuser.component.ts","./src/app/superUser/events/multi-view/multi-vew-video/multi-view-video.component.html","./src/app/superUser/events/multi-view/multi-vew-video/multi-view-video.component.ts","./src/app/superUser/events/multi-view/mulit-viewer.component.html","./src/app/superUser/events/multi-view/mulit-viewer.component.ts","./src/app/events/live/technical-support.component.html","./src/app/events/live/technical-support.component.ts","./src/app/events/live/tips/live-tips.component.html","./src/app/events/live/tips/live-tips.component.ts","./src/app/events/live/chat/chat-event-link.component.html","./src/app/events/live/chat/chat-event-link.component.ts","./src/app/superUser/streambox/stream-box.component.html","./src/app/superUser/streambox/stream-box.component.ts","./src/app/events/live/room-view/live-event-room-view.component.html","./src/app/events/live/room-view/live-event-room-view.component.ts","./src/app/superUser/streamcase/streambox-multiview.component.html","./src/app/superUser/streamcase/streambox-multiview.component.ts","./src/app/superUser/events/caption-box.component.ts","./src/app/superUser/events/caption-server.component.html","./src/app/superUser/events/caption-server.component.ts","./src/app/live-events.module.ts"],"sourcesContent":["/*! Hammer.JS - v2.0.7 - 2016-04-22\n * http://hammerjs.github.io/\n *\n * Copyright (c) 2016 Jorik Tangelder;\n * Licensed under the MIT license */\n(function(window, document, exportName, undefined) {\n 'use strict';\n\nvar VENDOR_PREFIXES = ['', 'webkit', 'Moz', 'MS', 'ms', 'o'];\nvar TEST_ELEMENT = document.createElement('div');\n\nvar TYPE_FUNCTION = 'function';\n\nvar round = Math.round;\nvar abs = Math.abs;\nvar now = Date.now;\n\n/**\n * set a timeout with a given scope\n * @param {Function} fn\n * @param {Number} timeout\n * @param {Object} context\n * @returns {number}\n */\nfunction setTimeoutContext(fn, timeout, context) {\n return setTimeout(bindFn(fn, context), timeout);\n}\n\n/**\n * if the argument is an array, we want to execute the fn on each entry\n * if it aint an array we don't want to do a thing.\n * this is used by all the methods that accept a single and array argument.\n * @param {*|Array} arg\n * @param {String} fn\n * @param {Object} [context]\n * @returns {Boolean}\n */\nfunction invokeArrayArg(arg, fn, context) {\n if (Array.isArray(arg)) {\n each(arg, context[fn], context);\n return true;\n }\n return false;\n}\n\n/**\n * walk objects and arrays\n * @param {Object} obj\n * @param {Function} iterator\n * @param {Object} context\n */\nfunction each(obj, iterator, context) {\n var i;\n\n if (!obj) {\n return;\n }\n\n if (obj.forEach) {\n obj.forEach(iterator, context);\n } else if (obj.length !== undefined) {\n i = 0;\n while (i < obj.length) {\n iterator.call(context, obj[i], i, obj);\n i++;\n }\n } else {\n for (i in obj) {\n obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj);\n }\n }\n}\n\n/**\n * wrap a method with a deprecation warning and stack trace\n * @param {Function} method\n * @param {String} name\n * @param {String} message\n * @returns {Function} A new function wrapping the supplied method.\n */\nfunction deprecate(method, name, message) {\n var deprecationMessage = 'DEPRECATED METHOD: ' + name + '\\n' + message + ' AT \\n';\n return function() {\n var e = new Error('get-stack-trace');\n var stack = e && e.stack ? e.stack.replace(/^[^\\(]+?[\\n$]/gm, '')\n .replace(/^\\s+at\\s+/gm, '')\n .replace(/^Object.\\s*\\(/gm, '{anonymous}()@') : 'Unknown Stack Trace';\n\n var log = window.console && (window.console.warn || window.console.log);\n if (log) {\n log.call(window.console, deprecationMessage, stack);\n }\n return method.apply(this, arguments);\n };\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} target\n * @param {...Object} objects_to_assign\n * @returns {Object} target\n */\nvar assign;\nif (typeof Object.assign !== 'function') {\n assign = function assign(target) {\n if (target === undefined || target === null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n\n var output = Object(target);\n for (var index = 1; index < arguments.length; index++) {\n var source = arguments[index];\n if (source !== undefined && source !== null) {\n for (var nextKey in source) {\n if (source.hasOwnProperty(nextKey)) {\n output[nextKey] = source[nextKey];\n }\n }\n }\n }\n return output;\n };\n} else {\n assign = Object.assign;\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} dest\n * @param {Object} src\n * @param {Boolean} [merge=false]\n * @returns {Object} dest\n */\nvar extend = deprecate(function extend(dest, src, merge) {\n var keys = Object.keys(src);\n var i = 0;\n while (i < keys.length) {\n if (!merge || (merge && dest[keys[i]] === undefined)) {\n dest[keys[i]] = src[keys[i]];\n }\n i++;\n }\n return dest;\n}, 'extend', 'Use `assign`.');\n\n/**\n * merge the values from src in the dest.\n * means that properties that exist in dest will not be overwritten by src\n * @param {Object} dest\n * @param {Object} src\n * @returns {Object} dest\n */\nvar merge = deprecate(function merge(dest, src) {\n return extend(dest, src, true);\n}, 'merge', 'Use `assign`.');\n\n/**\n * simple class inheritance\n * @param {Function} child\n * @param {Function} base\n * @param {Object} [properties]\n */\nfunction inherit(child, base, properties) {\n var baseP = base.prototype,\n childP;\n\n childP = child.prototype = Object.create(baseP);\n childP.constructor = child;\n childP._super = baseP;\n\n if (properties) {\n assign(childP, properties);\n }\n}\n\n/**\n * simple function bind\n * @param {Function} fn\n * @param {Object} context\n * @returns {Function}\n */\nfunction bindFn(fn, context) {\n return function boundFn() {\n return fn.apply(context, arguments);\n };\n}\n\n/**\n * let a boolean value also be a function that must return a boolean\n * this first item in args will be used as the context\n * @param {Boolean|Function} val\n * @param {Array} [args]\n * @returns {Boolean}\n */\nfunction boolOrFn(val, args) {\n if (typeof val == TYPE_FUNCTION) {\n return val.apply(args ? args[0] || undefined : undefined, args);\n }\n return val;\n}\n\n/**\n * use the val2 when val1 is undefined\n * @param {*} val1\n * @param {*} val2\n * @returns {*}\n */\nfunction ifUndefined(val1, val2) {\n return (val1 === undefined) ? val2 : val1;\n}\n\n/**\n * addEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction addEventListeners(target, types, handler) {\n each(splitStr(types), function(type) {\n target.addEventListener(type, handler, false);\n });\n}\n\n/**\n * removeEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction removeEventListeners(target, types, handler) {\n each(splitStr(types), function(type) {\n target.removeEventListener(type, handler, false);\n });\n}\n\n/**\n * find if a node is in the given parent\n * @method hasParent\n * @param {HTMLElement} node\n * @param {HTMLElement} parent\n * @return {Boolean} found\n */\nfunction hasParent(node, parent) {\n while (node) {\n if (node == parent) {\n return true;\n }\n node = node.parentNode;\n }\n return false;\n}\n\n/**\n * small indexOf wrapper\n * @param {String} str\n * @param {String} find\n * @returns {Boolean} found\n */\nfunction inStr(str, find) {\n return str.indexOf(find) > -1;\n}\n\n/**\n * split string on whitespace\n * @param {String} str\n * @returns {Array} words\n */\nfunction splitStr(str) {\n return str.trim().split(/\\s+/g);\n}\n\n/**\n * find if a array contains the object using indexOf or a simple polyFill\n * @param {Array} src\n * @param {String} find\n * @param {String} [findByKey]\n * @return {Boolean|Number} false when not found, or the index\n */\nfunction inArray(src, find, findByKey) {\n if (src.indexOf && !findByKey) {\n return src.indexOf(find);\n } else {\n var i = 0;\n while (i < src.length) {\n if ((findByKey && src[i][findByKey] == find) || (!findByKey && src[i] === find)) {\n return i;\n }\n i++;\n }\n return -1;\n }\n}\n\n/**\n * convert array-like objects to real arrays\n * @param {Object} obj\n * @returns {Array}\n */\nfunction toArray(obj) {\n return Array.prototype.slice.call(obj, 0);\n}\n\n/**\n * unique array with objects based on a key (like 'id') or just by the array's value\n * @param {Array} src [{id:1},{id:2},{id:1}]\n * @param {String} [key]\n * @param {Boolean} [sort=False]\n * @returns {Array} [{id:1},{id:2}]\n */\nfunction uniqueArray(src, key, sort) {\n var results = [];\n var values = [];\n var i = 0;\n\n while (i < src.length) {\n var val = key ? src[i][key] : src[i];\n if (inArray(values, val) < 0) {\n results.push(src[i]);\n }\n values[i] = val;\n i++;\n }\n\n if (sort) {\n if (!key) {\n results = results.sort();\n } else {\n results = results.sort(function sortUniqueArray(a, b) {\n return a[key] > b[key];\n });\n }\n }\n\n return results;\n}\n\n/**\n * get the prefixed property\n * @param {Object} obj\n * @param {String} property\n * @returns {String|Undefined} prefixed\n */\nfunction prefixed(obj, property) {\n var prefix, prop;\n var camelProp = property[0].toUpperCase() + property.slice(1);\n\n var i = 0;\n while (i < VENDOR_PREFIXES.length) {\n prefix = VENDOR_PREFIXES[i];\n prop = (prefix) ? prefix + camelProp : property;\n\n if (prop in obj) {\n return prop;\n }\n i++;\n }\n return undefined;\n}\n\n/**\n * get a unique id\n * @returns {number} uniqueId\n */\nvar _uniqueId = 1;\nfunction uniqueId() {\n return _uniqueId++;\n}\n\n/**\n * get the window object of an element\n * @param {HTMLElement} element\n * @returns {DocumentView|Window}\n */\nfunction getWindowForElement(element) {\n var doc = element.ownerDocument || element;\n return (doc.defaultView || doc.parentWindow || window);\n}\n\nvar MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i;\n\nvar SUPPORT_TOUCH = ('ontouchstart' in window);\nvar SUPPORT_POINTER_EVENTS = prefixed(window, 'PointerEvent') !== undefined;\nvar SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent);\n\nvar INPUT_TYPE_TOUCH = 'touch';\nvar INPUT_TYPE_PEN = 'pen';\nvar INPUT_TYPE_MOUSE = 'mouse';\nvar INPUT_TYPE_KINECT = 'kinect';\n\nvar COMPUTE_INTERVAL = 25;\n\nvar INPUT_START = 1;\nvar INPUT_MOVE = 2;\nvar INPUT_END = 4;\nvar INPUT_CANCEL = 8;\n\nvar DIRECTION_NONE = 1;\nvar DIRECTION_LEFT = 2;\nvar DIRECTION_RIGHT = 4;\nvar DIRECTION_UP = 8;\nvar DIRECTION_DOWN = 16;\n\nvar DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT;\nvar DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN;\nvar DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL;\n\nvar PROPS_XY = ['x', 'y'];\nvar PROPS_CLIENT_XY = ['clientX', 'clientY'];\n\n/**\n * create new input type manager\n * @param {Manager} manager\n * @param {Function} callback\n * @returns {Input}\n * @constructor\n */\nfunction Input(manager, callback) {\n var self = this;\n this.manager = manager;\n this.callback = callback;\n this.element = manager.element;\n this.target = manager.options.inputTarget;\n\n // smaller wrapper around the handler, for the scope and the enabled state of the manager,\n // so when disabled the input events are completely bypassed.\n this.domHandler = function(ev) {\n if (boolOrFn(manager.options.enable, [manager])) {\n self.handler(ev);\n }\n };\n\n this.init();\n\n}\n\nInput.prototype = {\n /**\n * should handle the inputEvent data and trigger the callback\n * @virtual\n */\n handler: function() { },\n\n /**\n * bind the events\n */\n init: function() {\n this.evEl && addEventListeners(this.element, this.evEl, this.domHandler);\n this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler);\n this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n },\n\n /**\n * unbind the events\n */\n destroy: function() {\n this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler);\n this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler);\n this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n }\n};\n\n/**\n * create new input type manager\n * called by the Manager constructor\n * @param {Hammer} manager\n * @returns {Input}\n */\nfunction createInputInstance(manager) {\n var Type;\n var inputClass = manager.options.inputClass;\n\n if (inputClass) {\n Type = inputClass;\n } else if (SUPPORT_POINTER_EVENTS) {\n Type = PointerEventInput;\n } else if (SUPPORT_ONLY_TOUCH) {\n Type = TouchInput;\n } else if (!SUPPORT_TOUCH) {\n Type = MouseInput;\n } else {\n Type = TouchMouseInput;\n }\n return new (Type)(manager, inputHandler);\n}\n\n/**\n * handle input events\n * @param {Manager} manager\n * @param {String} eventType\n * @param {Object} input\n */\nfunction inputHandler(manager, eventType, input) {\n var pointersLen = input.pointers.length;\n var changedPointersLen = input.changedPointers.length;\n var isFirst = (eventType & INPUT_START && (pointersLen - changedPointersLen === 0));\n var isFinal = (eventType & (INPUT_END | INPUT_CANCEL) && (pointersLen - changedPointersLen === 0));\n\n input.isFirst = !!isFirst;\n input.isFinal = !!isFinal;\n\n if (isFirst) {\n manager.session = {};\n }\n\n // source event is the normalized value of the domEvents\n // like 'touchstart, mouseup, pointerdown'\n input.eventType = eventType;\n\n // compute scale, rotation etc\n computeInputData(manager, input);\n\n // emit secret event\n manager.emit('hammer.input', input);\n\n manager.recognize(input);\n manager.session.prevInput = input;\n}\n\n/**\n * extend the data with some usable properties like scale, rotate, velocity etc\n * @param {Object} manager\n * @param {Object} input\n */\nfunction computeInputData(manager, input) {\n var session = manager.session;\n var pointers = input.pointers;\n var pointersLength = pointers.length;\n\n // store the first input to calculate the distance and direction\n if (!session.firstInput) {\n session.firstInput = simpleCloneInputData(input);\n }\n\n // to compute scale and rotation we need to store the multiple touches\n if (pointersLength > 1 && !session.firstMultiple) {\n session.firstMultiple = simpleCloneInputData(input);\n } else if (pointersLength === 1) {\n session.firstMultiple = false;\n }\n\n var firstInput = session.firstInput;\n var firstMultiple = session.firstMultiple;\n var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center;\n\n var center = input.center = getCenter(pointers);\n input.timeStamp = now();\n input.deltaTime = input.timeStamp - firstInput.timeStamp;\n\n input.angle = getAngle(offsetCenter, center);\n input.distance = getDistance(offsetCenter, center);\n\n computeDeltaXY(session, input);\n input.offsetDirection = getDirection(input.deltaX, input.deltaY);\n\n var overallVelocity = getVelocity(input.deltaTime, input.deltaX, input.deltaY);\n input.overallVelocityX = overallVelocity.x;\n input.overallVelocityY = overallVelocity.y;\n input.overallVelocity = (abs(overallVelocity.x) > abs(overallVelocity.y)) ? overallVelocity.x : overallVelocity.y;\n\n input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1;\n input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0;\n\n input.maxPointers = !session.prevInput ? input.pointers.length : ((input.pointers.length >\n session.prevInput.maxPointers) ? input.pointers.length : session.prevInput.maxPointers);\n\n computeIntervalInputData(session, input);\n\n // find the correct target\n var target = manager.element;\n if (hasParent(input.srcEvent.target, target)) {\n target = input.srcEvent.target;\n }\n input.target = target;\n}\n\nfunction computeDeltaXY(session, input) {\n var center = input.center;\n var offset = session.offsetDelta || {};\n var prevDelta = session.prevDelta || {};\n var prevInput = session.prevInput || {};\n\n if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) {\n prevDelta = session.prevDelta = {\n x: prevInput.deltaX || 0,\n y: prevInput.deltaY || 0\n };\n\n offset = session.offsetDelta = {\n x: center.x,\n y: center.y\n };\n }\n\n input.deltaX = prevDelta.x + (center.x - offset.x);\n input.deltaY = prevDelta.y + (center.y - offset.y);\n}\n\n/**\n * velocity is calculated every x ms\n * @param {Object} session\n * @param {Object} input\n */\nfunction computeIntervalInputData(session, input) {\n var last = session.lastInterval || input,\n deltaTime = input.timeStamp - last.timeStamp,\n velocity, velocityX, velocityY, direction;\n\n if (input.eventType != INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined)) {\n var deltaX = input.deltaX - last.deltaX;\n var deltaY = input.deltaY - last.deltaY;\n\n var v = getVelocity(deltaTime, deltaX, deltaY);\n velocityX = v.x;\n velocityY = v.y;\n velocity = (abs(v.x) > abs(v.y)) ? v.x : v.y;\n direction = getDirection(deltaX, deltaY);\n\n session.lastInterval = input;\n } else {\n // use latest velocity info if it doesn't overtake a minimum period\n velocity = last.velocity;\n velocityX = last.velocityX;\n velocityY = last.velocityY;\n direction = last.direction;\n }\n\n input.velocity = velocity;\n input.velocityX = velocityX;\n input.velocityY = velocityY;\n input.direction = direction;\n}\n\n/**\n * create a simple clone from the input used for storage of firstInput and firstMultiple\n * @param {Object} input\n * @returns {Object} clonedInputData\n */\nfunction simpleCloneInputData(input) {\n // make a simple copy of the pointers because we will get a reference if we don't\n // we only need clientXY for the calculations\n var pointers = [];\n var i = 0;\n while (i < input.pointers.length) {\n pointers[i] = {\n clientX: round(input.pointers[i].clientX),\n clientY: round(input.pointers[i].clientY)\n };\n i++;\n }\n\n return {\n timeStamp: now(),\n pointers: pointers,\n center: getCenter(pointers),\n deltaX: input.deltaX,\n deltaY: input.deltaY\n };\n}\n\n/**\n * get the center of all the pointers\n * @param {Array} pointers\n * @return {Object} center contains `x` and `y` properties\n */\nfunction getCenter(pointers) {\n var pointersLength = pointers.length;\n\n // no need to loop when only one touch\n if (pointersLength === 1) {\n return {\n x: round(pointers[0].clientX),\n y: round(pointers[0].clientY)\n };\n }\n\n var x = 0, y = 0, i = 0;\n while (i < pointersLength) {\n x += pointers[i].clientX;\n y += pointers[i].clientY;\n i++;\n }\n\n return {\n x: round(x / pointersLength),\n y: round(y / pointersLength)\n };\n}\n\n/**\n * calculate the velocity between two points. unit is in px per ms.\n * @param {Number} deltaTime\n * @param {Number} x\n * @param {Number} y\n * @return {Object} velocity `x` and `y`\n */\nfunction getVelocity(deltaTime, x, y) {\n return {\n x: x / deltaTime || 0,\n y: y / deltaTime || 0\n };\n}\n\n/**\n * get the direction between two points\n * @param {Number} x\n * @param {Number} y\n * @return {Number} direction\n */\nfunction getDirection(x, y) {\n if (x === y) {\n return DIRECTION_NONE;\n }\n\n if (abs(x) >= abs(y)) {\n return x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;\n }\n return y < 0 ? DIRECTION_UP : DIRECTION_DOWN;\n}\n\n/**\n * calculate the absolute distance between two points\n * @param {Object} p1 {x, y}\n * @param {Object} p2 {x, y}\n * @param {Array} [props] containing x and y keys\n * @return {Number} distance\n */\nfunction getDistance(p1, p2, props) {\n if (!props) {\n props = PROPS_XY;\n }\n var x = p2[props[0]] - p1[props[0]],\n y = p2[props[1]] - p1[props[1]];\n\n return Math.sqrt((x * x) + (y * y));\n}\n\n/**\n * calculate the angle between two coordinates\n * @param {Object} p1\n * @param {Object} p2\n * @param {Array} [props] containing x and y keys\n * @return {Number} angle\n */\nfunction getAngle(p1, p2, props) {\n if (!props) {\n props = PROPS_XY;\n }\n var x = p2[props[0]] - p1[props[0]],\n y = p2[props[1]] - p1[props[1]];\n return Math.atan2(y, x) * 180 / Math.PI;\n}\n\n/**\n * calculate the rotation degrees between two pointersets\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} rotation\n */\nfunction getRotation(start, end) {\n return getAngle(end[1], end[0], PROPS_CLIENT_XY) + getAngle(start[1], start[0], PROPS_CLIENT_XY);\n}\n\n/**\n * calculate the scale factor between two pointersets\n * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} scale\n */\nfunction getScale(start, end) {\n return getDistance(end[0], end[1], PROPS_CLIENT_XY) / getDistance(start[0], start[1], PROPS_CLIENT_XY);\n}\n\nvar MOUSE_INPUT_MAP = {\n mousedown: INPUT_START,\n mousemove: INPUT_MOVE,\n mouseup: INPUT_END\n};\n\nvar MOUSE_ELEMENT_EVENTS = 'mousedown';\nvar MOUSE_WINDOW_EVENTS = 'mousemove mouseup';\n\n/**\n * Mouse events input\n * @constructor\n * @extends Input\n */\nfunction MouseInput() {\n this.evEl = MOUSE_ELEMENT_EVENTS;\n this.evWin = MOUSE_WINDOW_EVENTS;\n\n this.pressed = false; // mousedown state\n\n Input.apply(this, arguments);\n}\n\ninherit(MouseInput, Input, {\n /**\n * handle mouse events\n * @param {Object} ev\n */\n handler: function MEhandler(ev) {\n var eventType = MOUSE_INPUT_MAP[ev.type];\n\n // on start we want to have the left mouse button down\n if (eventType & INPUT_START && ev.button === 0) {\n this.pressed = true;\n }\n\n if (eventType & INPUT_MOVE && ev.which !== 1) {\n eventType = INPUT_END;\n }\n\n // mouse must be down\n if (!this.pressed) {\n return;\n }\n\n if (eventType & INPUT_END) {\n this.pressed = false;\n }\n\n this.callback(this.manager, eventType, {\n pointers: [ev],\n changedPointers: [ev],\n pointerType: INPUT_TYPE_MOUSE,\n srcEvent: ev\n });\n }\n});\n\nvar POINTER_INPUT_MAP = {\n pointerdown: INPUT_START,\n pointermove: INPUT_MOVE,\n pointerup: INPUT_END,\n pointercancel: INPUT_CANCEL,\n pointerout: INPUT_CANCEL\n};\n\n// in IE10 the pointer types is defined as an enum\nvar IE10_POINTER_TYPE_ENUM = {\n 2: INPUT_TYPE_TOUCH,\n 3: INPUT_TYPE_PEN,\n 4: INPUT_TYPE_MOUSE,\n 5: INPUT_TYPE_KINECT // see https://twitter.com/jacobrossi/status/480596438489890816\n};\n\nvar POINTER_ELEMENT_EVENTS = 'pointerdown';\nvar POINTER_WINDOW_EVENTS = 'pointermove pointerup pointercancel';\n\n// IE10 has prefixed support, and case-sensitive\nif (window.MSPointerEvent && !window.PointerEvent) {\n POINTER_ELEMENT_EVENTS = 'MSPointerDown';\n POINTER_WINDOW_EVENTS = 'MSPointerMove MSPointerUp MSPointerCancel';\n}\n\n/**\n * Pointer events input\n * @constructor\n * @extends Input\n */\nfunction PointerEventInput() {\n this.evEl = POINTER_ELEMENT_EVENTS;\n this.evWin = POINTER_WINDOW_EVENTS;\n\n Input.apply(this, arguments);\n\n this.store = (this.manager.session.pointerEvents = []);\n}\n\ninherit(PointerEventInput, Input, {\n /**\n * handle mouse events\n * @param {Object} ev\n */\n handler: function PEhandler(ev) {\n var store = this.store;\n var removePointer = false;\n\n var eventTypeNormalized = ev.type.toLowerCase().replace('ms', '');\n var eventType = POINTER_INPUT_MAP[eventTypeNormalized];\n var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType;\n\n var isTouch = (pointerType == INPUT_TYPE_TOUCH);\n\n // get index of the event in the store\n var storeIndex = inArray(store, ev.pointerId, 'pointerId');\n\n // start and mouse must be down\n if (eventType & INPUT_START && (ev.button === 0 || isTouch)) {\n if (storeIndex < 0) {\n store.push(ev);\n storeIndex = store.length - 1;\n }\n } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n removePointer = true;\n }\n\n // it not found, so the pointer hasn't been down (so it's probably a hover)\n if (storeIndex < 0) {\n return;\n }\n\n // update the event in the store\n store[storeIndex] = ev;\n\n this.callback(this.manager, eventType, {\n pointers: store,\n changedPointers: [ev],\n pointerType: pointerType,\n srcEvent: ev\n });\n\n if (removePointer) {\n // remove from the store\n store.splice(storeIndex, 1);\n }\n }\n});\n\nvar SINGLE_TOUCH_INPUT_MAP = {\n touchstart: INPUT_START,\n touchmove: INPUT_MOVE,\n touchend: INPUT_END,\n touchcancel: INPUT_CANCEL\n};\n\nvar SINGLE_TOUCH_TARGET_EVENTS = 'touchstart';\nvar SINGLE_TOUCH_WINDOW_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Touch events input\n * @constructor\n * @extends Input\n */\nfunction SingleTouchInput() {\n this.evTarget = SINGLE_TOUCH_TARGET_EVENTS;\n this.evWin = SINGLE_TOUCH_WINDOW_EVENTS;\n this.started = false;\n\n Input.apply(this, arguments);\n}\n\ninherit(SingleTouchInput, Input, {\n handler: function TEhandler(ev) {\n var type = SINGLE_TOUCH_INPUT_MAP[ev.type];\n\n // should we handle the touch events?\n if (type === INPUT_START) {\n this.started = true;\n }\n\n if (!this.started) {\n return;\n }\n\n var touches = normalizeSingleTouches.call(this, ev, type);\n\n // when done, reset the started state\n if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) {\n this.started = false;\n }\n\n this.callback(this.manager, type, {\n pointers: touches[0],\n changedPointers: touches[1],\n pointerType: INPUT_TYPE_TOUCH,\n srcEvent: ev\n });\n }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction normalizeSingleTouches(ev, type) {\n var all = toArray(ev.touches);\n var changed = toArray(ev.changedTouches);\n\n if (type & (INPUT_END | INPUT_CANCEL)) {\n all = uniqueArray(all.concat(changed), 'identifier', true);\n }\n\n return [all, changed];\n}\n\nvar TOUCH_INPUT_MAP = {\n touchstart: INPUT_START,\n touchmove: INPUT_MOVE,\n touchend: INPUT_END,\n touchcancel: INPUT_CANCEL\n};\n\nvar TOUCH_TARGET_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Multi-user touch events input\n * @constructor\n * @extends Input\n */\nfunction TouchInput() {\n this.evTarget = TOUCH_TARGET_EVENTS;\n this.targetIds = {};\n\n Input.apply(this, arguments);\n}\n\ninherit(TouchInput, Input, {\n handler: function MTEhandler(ev) {\n var type = TOUCH_INPUT_MAP[ev.type];\n var touches = getTouches.call(this, ev, type);\n if (!touches) {\n return;\n }\n\n this.callback(this.manager, type, {\n pointers: touches[0],\n changedPointers: touches[1],\n pointerType: INPUT_TYPE_TOUCH,\n srcEvent: ev\n });\n }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction getTouches(ev, type) {\n var allTouches = toArray(ev.touches);\n var targetIds = this.targetIds;\n\n // when there is only one touch, the process can be simplified\n if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) {\n targetIds[allTouches[0].identifier] = true;\n return [allTouches, allTouches];\n }\n\n var i,\n targetTouches,\n changedTouches = toArray(ev.changedTouches),\n changedTargetTouches = [],\n target = this.target;\n\n // get target touches from touches\n targetTouches = allTouches.filter(function(touch) {\n return hasParent(touch.target, target);\n });\n\n // collect touches\n if (type === INPUT_START) {\n i = 0;\n while (i < targetTouches.length) {\n targetIds[targetTouches[i].identifier] = true;\n i++;\n }\n }\n\n // filter changed touches to only contain touches that exist in the collected target ids\n i = 0;\n while (i < changedTouches.length) {\n if (targetIds[changedTouches[i].identifier]) {\n changedTargetTouches.push(changedTouches[i]);\n }\n\n // cleanup removed touches\n if (type & (INPUT_END | INPUT_CANCEL)) {\n delete targetIds[changedTouches[i].identifier];\n }\n i++;\n }\n\n if (!changedTargetTouches.length) {\n return;\n }\n\n return [\n // merge targetTouches with changedTargetTouches so it contains ALL touches, including 'end' and 'cancel'\n uniqueArray(targetTouches.concat(changedTargetTouches), 'identifier', true),\n changedTargetTouches\n ];\n}\n\n/**\n * Combined touch and mouse input\n *\n * Touch has a higher priority then mouse, and while touching no mouse events are allowed.\n * This because touch devices also emit mouse events while doing a touch.\n *\n * @constructor\n * @extends Input\n */\n\nvar DEDUP_TIMEOUT = 2500;\nvar DEDUP_DISTANCE = 25;\n\nfunction TouchMouseInput() {\n Input.apply(this, arguments);\n\n var handler = bindFn(this.handler, this);\n this.touch = new TouchInput(this.manager, handler);\n this.mouse = new MouseInput(this.manager, handler);\n\n this.primaryTouch = null;\n this.lastTouches = [];\n}\n\ninherit(TouchMouseInput, Input, {\n /**\n * handle mouse and touch events\n * @param {Hammer} manager\n * @param {String} inputEvent\n * @param {Object} inputData\n */\n handler: function TMEhandler(manager, inputEvent, inputData) {\n var isTouch = (inputData.pointerType == INPUT_TYPE_TOUCH),\n isMouse = (inputData.pointerType == INPUT_TYPE_MOUSE);\n\n if (isMouse && inputData.sourceCapabilities && inputData.sourceCapabilities.firesTouchEvents) {\n return;\n }\n\n // when we're in a touch event, record touches to de-dupe synthetic mouse event\n if (isTouch) {\n recordTouches.call(this, inputEvent, inputData);\n } else if (isMouse && isSyntheticEvent.call(this, inputData)) {\n return;\n }\n\n this.callback(manager, inputEvent, inputData);\n },\n\n /**\n * remove the event listeners\n */\n destroy: function destroy() {\n this.touch.destroy();\n this.mouse.destroy();\n }\n});\n\nfunction recordTouches(eventType, eventData) {\n if (eventType & INPUT_START) {\n this.primaryTouch = eventData.changedPointers[0].identifier;\n setLastTouch.call(this, eventData);\n } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n setLastTouch.call(this, eventData);\n }\n}\n\nfunction setLastTouch(eventData) {\n var touch = eventData.changedPointers[0];\n\n if (touch.identifier === this.primaryTouch) {\n var lastTouch = {x: touch.clientX, y: touch.clientY};\n this.lastTouches.push(lastTouch);\n var lts = this.lastTouches;\n var removeLastTouch = function() {\n var i = lts.indexOf(lastTouch);\n if (i > -1) {\n lts.splice(i, 1);\n }\n };\n setTimeout(removeLastTouch, DEDUP_TIMEOUT);\n }\n}\n\nfunction isSyntheticEvent(eventData) {\n var x = eventData.srcEvent.clientX, y = eventData.srcEvent.clientY;\n for (var i = 0; i < this.lastTouches.length; i++) {\n var t = this.lastTouches[i];\n var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n if (dx <= DEDUP_DISTANCE && dy <= DEDUP_DISTANCE) {\n return true;\n }\n }\n return false;\n}\n\nvar PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, 'touchAction');\nvar NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined;\n\n// magical touchAction value\nvar TOUCH_ACTION_COMPUTE = 'compute';\nvar TOUCH_ACTION_AUTO = 'auto';\nvar TOUCH_ACTION_MANIPULATION = 'manipulation'; // not implemented\nvar TOUCH_ACTION_NONE = 'none';\nvar TOUCH_ACTION_PAN_X = 'pan-x';\nvar TOUCH_ACTION_PAN_Y = 'pan-y';\nvar TOUCH_ACTION_MAP = getTouchActionProps();\n\n/**\n * Touch Action\n * sets the touchAction property or uses the js alternative\n * @param {Manager} manager\n * @param {String} value\n * @constructor\n */\nfunction TouchAction(manager, value) {\n this.manager = manager;\n this.set(value);\n}\n\nTouchAction.prototype = {\n /**\n * set the touchAction value on the element or enable the polyfill\n * @param {String} value\n */\n set: function(value) {\n // find out the touch-action by the event handlers\n if (value == TOUCH_ACTION_COMPUTE) {\n value = this.compute();\n }\n\n if (NATIVE_TOUCH_ACTION && this.manager.element.style && TOUCH_ACTION_MAP[value]) {\n this.manager.element.style[PREFIXED_TOUCH_ACTION] = value;\n }\n this.actions = value.toLowerCase().trim();\n },\n\n /**\n * just re-set the touchAction value\n */\n update: function() {\n this.set(this.manager.options.touchAction);\n },\n\n /**\n * compute the value for the touchAction property based on the recognizer's settings\n * @returns {String} value\n */\n compute: function() {\n var actions = [];\n each(this.manager.recognizers, function(recognizer) {\n if (boolOrFn(recognizer.options.enable, [recognizer])) {\n actions = actions.concat(recognizer.getTouchAction());\n }\n });\n return cleanTouchActions(actions.join(' '));\n },\n\n /**\n * this method is called on each input cycle and provides the preventing of the browser behavior\n * @param {Object} input\n */\n preventDefaults: function(input) {\n var srcEvent = input.srcEvent;\n var direction = input.offsetDirection;\n\n // if the touch action did prevented once this session\n if (this.manager.session.prevented) {\n srcEvent.preventDefault();\n return;\n }\n\n var actions = this.actions;\n var hasNone = inStr(actions, TOUCH_ACTION_NONE) && !TOUCH_ACTION_MAP[TOUCH_ACTION_NONE];\n var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_Y];\n var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_X];\n\n if (hasNone) {\n //do not prevent defaults if this is a tap gesture\n\n var isTapPointer = input.pointers.length === 1;\n var isTapMovement = input.distance < 2;\n var isTapTouchTime = input.deltaTime < 250;\n\n if (isTapPointer && isTapMovement && isTapTouchTime) {\n return;\n }\n }\n\n if (hasPanX && hasPanY) {\n // `pan-x pan-y` means browser handles all scrolling/panning, do not prevent\n return;\n }\n\n if (hasNone ||\n (hasPanY && direction & DIRECTION_HORIZONTAL) ||\n (hasPanX && direction & DIRECTION_VERTICAL)) {\n return this.preventSrc(srcEvent);\n }\n },\n\n /**\n * call preventDefault to prevent the browser's default behavior (scrolling in most cases)\n * @param {Object} srcEvent\n */\n preventSrc: function(srcEvent) {\n this.manager.session.prevented = true;\n srcEvent.preventDefault();\n }\n};\n\n/**\n * when the touchActions are collected they are not a valid value, so we need to clean things up. *\n * @param {String} actions\n * @returns {*}\n */\nfunction cleanTouchActions(actions) {\n // none\n if (inStr(actions, TOUCH_ACTION_NONE)) {\n return TOUCH_ACTION_NONE;\n }\n\n var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X);\n var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y);\n\n // if both pan-x and pan-y are set (different recognizers\n // for different directions, e.g. horizontal pan but vertical swipe?)\n // we need none (as otherwise with pan-x pan-y combined none of these\n // recognizers will work, since the browser would handle all panning\n if (hasPanX && hasPanY) {\n return TOUCH_ACTION_NONE;\n }\n\n // pan-x OR pan-y\n if (hasPanX || hasPanY) {\n return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y;\n }\n\n // manipulation\n if (inStr(actions, TOUCH_ACTION_MANIPULATION)) {\n return TOUCH_ACTION_MANIPULATION;\n }\n\n return TOUCH_ACTION_AUTO;\n}\n\nfunction getTouchActionProps() {\n if (!NATIVE_TOUCH_ACTION) {\n return false;\n }\n var touchMap = {};\n var cssSupports = window.CSS && window.CSS.supports;\n ['auto', 'manipulation', 'pan-y', 'pan-x', 'pan-x pan-y', 'none'].forEach(function(val) {\n\n // If css.supports is not supported but there is native touch-action assume it supports\n // all values. This is the case for IE 10 and 11.\n touchMap[val] = cssSupports ? window.CSS.supports('touch-action', val) : true;\n });\n return touchMap;\n}\n\n/**\n * Recognizer flow explained; *\n * All recognizers have the initial state of POSSIBLE when a input session starts.\n * The definition of a input session is from the first input until the last input, with all it's movement in it. *\n * Example session for mouse-input: mousedown -> mousemove -> mouseup\n *\n * On each recognizing cycle (see Manager.recognize) the .recognize() method is executed\n * which determines with state it should be.\n *\n * If the recognizer has the state FAILED, CANCELLED or RECOGNIZED (equals ENDED), it is reset to\n * POSSIBLE to give it another change on the next cycle.\n *\n * Possible\n * |\n * +-----+---------------+\n * | |\n * +-----+-----+ |\n * | | |\n * Failed Cancelled |\n * +-------+------+\n * | |\n * Recognized Began\n * |\n * Changed\n * |\n * Ended/Recognized\n */\nvar STATE_POSSIBLE = 1;\nvar STATE_BEGAN = 2;\nvar STATE_CHANGED = 4;\nvar STATE_ENDED = 8;\nvar STATE_RECOGNIZED = STATE_ENDED;\nvar STATE_CANCELLED = 16;\nvar STATE_FAILED = 32;\n\n/**\n * Recognizer\n * Every recognizer needs to extend from this class.\n * @constructor\n * @param {Object} options\n */\nfunction Recognizer(options) {\n this.options = assign({}, this.defaults, options || {});\n\n this.id = uniqueId();\n\n this.manager = null;\n\n // default is enable true\n this.options.enable = ifUndefined(this.options.enable, true);\n\n this.state = STATE_POSSIBLE;\n\n this.simultaneous = {};\n this.requireFail = [];\n}\n\nRecognizer.prototype = {\n /**\n * @virtual\n * @type {Object}\n */\n defaults: {},\n\n /**\n * set options\n * @param {Object} options\n * @return {Recognizer}\n */\n set: function(options) {\n assign(this.options, options);\n\n // also update the touchAction, in case something changed about the directions/enabled state\n this.manager && this.manager.touchAction.update();\n return this;\n },\n\n /**\n * recognize simultaneous with an other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n recognizeWith: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'recognizeWith', this)) {\n return this;\n }\n\n var simultaneous = this.simultaneous;\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n if (!simultaneous[otherRecognizer.id]) {\n simultaneous[otherRecognizer.id] = otherRecognizer;\n otherRecognizer.recognizeWith(this);\n }\n return this;\n },\n\n /**\n * drop the simultaneous link. it doesnt remove the link on the other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n dropRecognizeWith: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'dropRecognizeWith', this)) {\n return this;\n }\n\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n delete this.simultaneous[otherRecognizer.id];\n return this;\n },\n\n /**\n * recognizer can only run when an other is failing\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n requireFailure: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'requireFailure', this)) {\n return this;\n }\n\n var requireFail = this.requireFail;\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n if (inArray(requireFail, otherRecognizer) === -1) {\n requireFail.push(otherRecognizer);\n otherRecognizer.requireFailure(this);\n }\n return this;\n },\n\n /**\n * drop the requireFailure link. it does not remove the link on the other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n dropRequireFailure: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'dropRequireFailure', this)) {\n return this;\n }\n\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n var index = inArray(this.requireFail, otherRecognizer);\n if (index > -1) {\n this.requireFail.splice(index, 1);\n }\n return this;\n },\n\n /**\n * has require failures boolean\n * @returns {boolean}\n */\n hasRequireFailures: function() {\n return this.requireFail.length > 0;\n },\n\n /**\n * if the recognizer can recognize simultaneous with an other recognizer\n * @param {Recognizer} otherRecognizer\n * @returns {Boolean}\n */\n canRecognizeWith: function(otherRecognizer) {\n return !!this.simultaneous[otherRecognizer.id];\n },\n\n /**\n * You should use `tryEmit` instead of `emit` directly to check\n * that all the needed recognizers has failed before emitting.\n * @param {Object} input\n */\n emit: function(input) {\n var self = this;\n var state = this.state;\n\n function emit(event) {\n self.manager.emit(event, input);\n }\n\n // 'panstart' and 'panmove'\n if (state < STATE_ENDED) {\n emit(self.options.event + stateStr(state));\n }\n\n emit(self.options.event); // simple 'eventName' events\n\n if (input.additionalEvent) { // additional event(panleft, panright, pinchin, pinchout...)\n emit(input.additionalEvent);\n }\n\n // panend and pancancel\n if (state >= STATE_ENDED) {\n emit(self.options.event + stateStr(state));\n }\n },\n\n /**\n * Check that all the require failure recognizers has failed,\n * if true, it emits a gesture event,\n * otherwise, setup the state to FAILED.\n * @param {Object} input\n */\n tryEmit: function(input) {\n if (this.canEmit()) {\n return this.emit(input);\n }\n // it's failing anyway\n this.state = STATE_FAILED;\n },\n\n /**\n * can we emit?\n * @returns {boolean}\n */\n canEmit: function() {\n var i = 0;\n while (i < this.requireFail.length) {\n if (!(this.requireFail[i].state & (STATE_FAILED | STATE_POSSIBLE))) {\n return false;\n }\n i++;\n }\n return true;\n },\n\n /**\n * update the recognizer\n * @param {Object} inputData\n */\n recognize: function(inputData) {\n // make a new copy of the inputData\n // so we can change the inputData without messing up the other recognizers\n var inputDataClone = assign({}, inputData);\n\n // is is enabled and allow recognizing?\n if (!boolOrFn(this.options.enable, [this, inputDataClone])) {\n this.reset();\n this.state = STATE_FAILED;\n return;\n }\n\n // reset when we've reached the end\n if (this.state & (STATE_RECOGNIZED | STATE_CANCELLED | STATE_FAILED)) {\n this.state = STATE_POSSIBLE;\n }\n\n this.state = this.process(inputDataClone);\n\n // the recognizer has recognized a gesture\n // so trigger an event\n if (this.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED | STATE_CANCELLED)) {\n this.tryEmit(inputDataClone);\n }\n },\n\n /**\n * return the state of the recognizer\n * the actual recognizing happens in this method\n * @virtual\n * @param {Object} inputData\n * @returns {Const} STATE\n */\n process: function(inputData) { }, // jshint ignore:line\n\n /**\n * return the preferred touch-action\n * @virtual\n * @returns {Array}\n */\n getTouchAction: function() { },\n\n /**\n * called when the gesture isn't allowed to recognize\n * like when another is being recognized or it is disabled\n * @virtual\n */\n reset: function() { }\n};\n\n/**\n * get a usable string, used as event postfix\n * @param {Const} state\n * @returns {String} state\n */\nfunction stateStr(state) {\n if (state & STATE_CANCELLED) {\n return 'cancel';\n } else if (state & STATE_ENDED) {\n return 'end';\n } else if (state & STATE_CHANGED) {\n return 'move';\n } else if (state & STATE_BEGAN) {\n return 'start';\n }\n return '';\n}\n\n/**\n * direction cons to string\n * @param {Const} direction\n * @returns {String}\n */\nfunction directionStr(direction) {\n if (direction == DIRECTION_DOWN) {\n return 'down';\n } else if (direction == DIRECTION_UP) {\n return 'up';\n } else if (direction == DIRECTION_LEFT) {\n return 'left';\n } else if (direction == DIRECTION_RIGHT) {\n return 'right';\n }\n return '';\n}\n\n/**\n * get a recognizer by name if it is bound to a manager\n * @param {Recognizer|String} otherRecognizer\n * @param {Recognizer} recognizer\n * @returns {Recognizer}\n */\nfunction getRecognizerByNameIfManager(otherRecognizer, recognizer) {\n var manager = recognizer.manager;\n if (manager) {\n return manager.get(otherRecognizer);\n }\n return otherRecognizer;\n}\n\n/**\n * This recognizer is just used as a base for the simple attribute recognizers.\n * @constructor\n * @extends Recognizer\n */\nfunction AttrRecognizer() {\n Recognizer.apply(this, arguments);\n}\n\ninherit(AttrRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof AttrRecognizer\n */\n defaults: {\n /**\n * @type {Number}\n * @default 1\n */\n pointers: 1\n },\n\n /**\n * Used to check if it the recognizer receives valid input, like input.distance > 10.\n * @memberof AttrRecognizer\n * @param {Object} input\n * @returns {Boolean} recognized\n */\n attrTest: function(input) {\n var optionPointers = this.options.pointers;\n return optionPointers === 0 || input.pointers.length === optionPointers;\n },\n\n /**\n * Process the input and return the state for the recognizer\n * @memberof AttrRecognizer\n * @param {Object} input\n * @returns {*} State\n */\n process: function(input) {\n var state = this.state;\n var eventType = input.eventType;\n\n var isRecognized = state & (STATE_BEGAN | STATE_CHANGED);\n var isValid = this.attrTest(input);\n\n // on cancel input and we've recognized before, return STATE_CANCELLED\n if (isRecognized && (eventType & INPUT_CANCEL || !isValid)) {\n return state | STATE_CANCELLED;\n } else if (isRecognized || isValid) {\n if (eventType & INPUT_END) {\n return state | STATE_ENDED;\n } else if (!(state & STATE_BEGAN)) {\n return STATE_BEGAN;\n }\n return state | STATE_CHANGED;\n }\n return STATE_FAILED;\n }\n});\n\n/**\n * Pan\n * Recognized when the pointer is down and moved in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PanRecognizer() {\n AttrRecognizer.apply(this, arguments);\n\n this.pX = null;\n this.pY = null;\n}\n\ninherit(PanRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof PanRecognizer\n */\n defaults: {\n event: 'pan',\n threshold: 10,\n pointers: 1,\n direction: DIRECTION_ALL\n },\n\n getTouchAction: function() {\n var direction = this.options.direction;\n var actions = [];\n if (direction & DIRECTION_HORIZONTAL) {\n actions.push(TOUCH_ACTION_PAN_Y);\n }\n if (direction & DIRECTION_VERTICAL) {\n actions.push(TOUCH_ACTION_PAN_X);\n }\n return actions;\n },\n\n directionTest: function(input) {\n var options = this.options;\n var hasMoved = true;\n var distance = input.distance;\n var direction = input.direction;\n var x = input.deltaX;\n var y = input.deltaY;\n\n // lock to axis?\n if (!(direction & options.direction)) {\n if (options.direction & DIRECTION_HORIZONTAL) {\n direction = (x === 0) ? DIRECTION_NONE : (x < 0) ? DIRECTION_LEFT : DIRECTION_RIGHT;\n hasMoved = x != this.pX;\n distance = Math.abs(input.deltaX);\n } else {\n direction = (y === 0) ? DIRECTION_NONE : (y < 0) ? DIRECTION_UP : DIRECTION_DOWN;\n hasMoved = y != this.pY;\n distance = Math.abs(input.deltaY);\n }\n }\n input.direction = direction;\n return hasMoved && distance > options.threshold && direction & options.direction;\n },\n\n attrTest: function(input) {\n return AttrRecognizer.prototype.attrTest.call(this, input) &&\n (this.state & STATE_BEGAN || (!(this.state & STATE_BEGAN) && this.directionTest(input)));\n },\n\n emit: function(input) {\n\n this.pX = input.deltaX;\n this.pY = input.deltaY;\n\n var direction = directionStr(input.direction);\n\n if (direction) {\n input.additionalEvent = this.options.event + direction;\n }\n this._super.emit.call(this, input);\n }\n});\n\n/**\n * Pinch\n * Recognized when two or more pointers are moving toward (zoom-in) or away from each other (zoom-out).\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PinchRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(PinchRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof PinchRecognizer\n */\n defaults: {\n event: 'pinch',\n threshold: 0,\n pointers: 2\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_NONE];\n },\n\n attrTest: function(input) {\n return this._super.attrTest.call(this, input) &&\n (Math.abs(input.scale - 1) > this.options.threshold || this.state & STATE_BEGAN);\n },\n\n emit: function(input) {\n if (input.scale !== 1) {\n var inOut = input.scale < 1 ? 'in' : 'out';\n input.additionalEvent = this.options.event + inOut;\n }\n this._super.emit.call(this, input);\n }\n});\n\n/**\n * Press\n * Recognized when the pointer is down for x ms without any movement.\n * @constructor\n * @extends Recognizer\n */\nfunction PressRecognizer() {\n Recognizer.apply(this, arguments);\n\n this._timer = null;\n this._input = null;\n}\n\ninherit(PressRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof PressRecognizer\n */\n defaults: {\n event: 'press',\n pointers: 1,\n time: 251, // minimal time of the pointer to be pressed\n threshold: 9 // a minimal movement is ok, but keep it low\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_AUTO];\n },\n\n process: function(input) {\n var options = this.options;\n var validPointers = input.pointers.length === options.pointers;\n var validMovement = input.distance < options.threshold;\n var validTime = input.deltaTime > options.time;\n\n this._input = input;\n\n // we only allow little movement\n // and we've reached an end event, so a tap is possible\n if (!validMovement || !validPointers || (input.eventType & (INPUT_END | INPUT_CANCEL) && !validTime)) {\n this.reset();\n } else if (input.eventType & INPUT_START) {\n this.reset();\n this._timer = setTimeoutContext(function() {\n this.state = STATE_RECOGNIZED;\n this.tryEmit();\n }, options.time, this);\n } else if (input.eventType & INPUT_END) {\n return STATE_RECOGNIZED;\n }\n return STATE_FAILED;\n },\n\n reset: function() {\n clearTimeout(this._timer);\n },\n\n emit: function(input) {\n if (this.state !== STATE_RECOGNIZED) {\n return;\n }\n\n if (input && (input.eventType & INPUT_END)) {\n this.manager.emit(this.options.event + 'up', input);\n } else {\n this._input.timeStamp = now();\n this.manager.emit(this.options.event, this._input);\n }\n }\n});\n\n/**\n * Rotate\n * Recognized when two or more pointer are moving in a circular motion.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction RotateRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(RotateRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof RotateRecognizer\n */\n defaults: {\n event: 'rotate',\n threshold: 0,\n pointers: 2\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_NONE];\n },\n\n attrTest: function(input) {\n return this._super.attrTest.call(this, input) &&\n (Math.abs(input.rotation) > this.options.threshold || this.state & STATE_BEGAN);\n }\n});\n\n/**\n * Swipe\n * Recognized when the pointer is moving fast (velocity), with enough distance in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction SwipeRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(SwipeRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof SwipeRecognizer\n */\n defaults: {\n event: 'swipe',\n threshold: 10,\n velocity: 0.3,\n direction: DIRECTION_HORIZONTAL | DIRECTION_VERTICAL,\n pointers: 1\n },\n\n getTouchAction: function() {\n return PanRecognizer.prototype.getTouchAction.call(this);\n },\n\n attrTest: function(input) {\n var direction = this.options.direction;\n var velocity;\n\n if (direction & (DIRECTION_HORIZONTAL | DIRECTION_VERTICAL)) {\n velocity = input.overallVelocity;\n } else if (direction & DIRECTION_HORIZONTAL) {\n velocity = input.overallVelocityX;\n } else if (direction & DIRECTION_VERTICAL) {\n velocity = input.overallVelocityY;\n }\n\n return this._super.attrTest.call(this, input) &&\n direction & input.offsetDirection &&\n input.distance > this.options.threshold &&\n input.maxPointers == this.options.pointers &&\n abs(velocity) > this.options.velocity && input.eventType & INPUT_END;\n },\n\n emit: function(input) {\n var direction = directionStr(input.offsetDirection);\n if (direction) {\n this.manager.emit(this.options.event + direction, input);\n }\n\n this.manager.emit(this.options.event, input);\n }\n});\n\n/**\n * A tap is ecognized when the pointer is doing a small tap/click. Multiple taps are recognized if they occur\n * between the given interval and position. The delay option can be used to recognize multi-taps without firing\n * a single tap.\n *\n * The eventData from the emitted event contains the property `tapCount`, which contains the amount of\n * multi-taps being recognized.\n * @constructor\n * @extends Recognizer\n */\nfunction TapRecognizer() {\n Recognizer.apply(this, arguments);\n\n // previous time and center,\n // used for tap counting\n this.pTime = false;\n this.pCenter = false;\n\n this._timer = null;\n this._input = null;\n this.count = 0;\n}\n\ninherit(TapRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof PinchRecognizer\n */\n defaults: {\n event: 'tap',\n pointers: 1,\n taps: 1,\n interval: 300, // max time between the multi-tap taps\n time: 250, // max time of the pointer to be down (like finger on the screen)\n threshold: 9, // a minimal movement is ok, but keep it low\n posThreshold: 10 // a multi-tap can be a bit off the initial position\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_MANIPULATION];\n },\n\n process: function(input) {\n var options = this.options;\n\n var validPointers = input.pointers.length === options.pointers;\n var validMovement = input.distance < options.threshold;\n var validTouchTime = input.deltaTime < options.time;\n\n this.reset();\n\n if ((input.eventType & INPUT_START) && (this.count === 0)) {\n return this.failTimeout();\n }\n\n // we only allow little movement\n // and we've reached an end event, so a tap is possible\n if (validMovement && validTouchTime && validPointers) {\n if (input.eventType != INPUT_END) {\n return this.failTimeout();\n }\n\n var validInterval = this.pTime ? (input.timeStamp - this.pTime < options.interval) : true;\n var validMultiTap = !this.pCenter || getDistance(this.pCenter, input.center) < options.posThreshold;\n\n this.pTime = input.timeStamp;\n this.pCenter = input.center;\n\n if (!validMultiTap || !validInterval) {\n this.count = 1;\n } else {\n this.count += 1;\n }\n\n this._input = input;\n\n // if tap count matches we have recognized it,\n // else it has began recognizing...\n var tapCount = this.count % options.taps;\n if (tapCount === 0) {\n // no failing requirements, immediately trigger the tap event\n // or wait as long as the multitap interval to trigger\n if (!this.hasRequireFailures()) {\n return STATE_RECOGNIZED;\n } else {\n this._timer = setTimeoutContext(function() {\n this.state = STATE_RECOGNIZED;\n this.tryEmit();\n }, options.interval, this);\n return STATE_BEGAN;\n }\n }\n }\n return STATE_FAILED;\n },\n\n failTimeout: function() {\n this._timer = setTimeoutContext(function() {\n this.state = STATE_FAILED;\n }, this.options.interval, this);\n return STATE_FAILED;\n },\n\n reset: function() {\n clearTimeout(this._timer);\n },\n\n emit: function() {\n if (this.state == STATE_RECOGNIZED) {\n this._input.tapCount = this.count;\n this.manager.emit(this.options.event, this._input);\n }\n }\n});\n\n/**\n * Simple way to create a manager with a default set of recognizers.\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Hammer(element, options) {\n options = options || {};\n options.recognizers = ifUndefined(options.recognizers, Hammer.defaults.preset);\n return new Manager(element, options);\n}\n\n/**\n * @const {string}\n */\nHammer.VERSION = '2.0.7';\n\n/**\n * default settings\n * @namespace\n */\nHammer.defaults = {\n /**\n * set if DOM events are being triggered.\n * But this is slower and unused by simple implementations, so disabled by default.\n * @type {Boolean}\n * @default false\n */\n domEvents: false,\n\n /**\n * The value for the touchAction property/fallback.\n * When set to `compute` it will magically set the correct value based on the added recognizers.\n * @type {String}\n * @default compute\n */\n touchAction: TOUCH_ACTION_COMPUTE,\n\n /**\n * @type {Boolean}\n * @default true\n */\n enable: true,\n\n /**\n * EXPERIMENTAL FEATURE -- can be removed/changed\n * Change the parent input target element.\n * If Null, then it is being set the to main element.\n * @type {Null|EventTarget}\n * @default null\n */\n inputTarget: null,\n\n /**\n * force an input class\n * @type {Null|Function}\n * @default null\n */\n inputClass: null,\n\n /**\n * Default recognizer setup when calling `Hammer()`\n * When creating a new Manager these will be skipped.\n * @type {Array}\n */\n preset: [\n // RecognizerClass, options, [recognizeWith, ...], [requireFailure, ...]\n [RotateRecognizer, {enable: false}],\n [PinchRecognizer, {enable: false}, ['rotate']],\n [SwipeRecognizer, {direction: DIRECTION_HORIZONTAL}],\n [PanRecognizer, {direction: DIRECTION_HORIZONTAL}, ['swipe']],\n [TapRecognizer],\n [TapRecognizer, {event: 'doubletap', taps: 2}, ['tap']],\n [PressRecognizer]\n ],\n\n /**\n * Some CSS properties can be used to improve the working of Hammer.\n * Add them to this method and they will be set when creating a new Manager.\n * @namespace\n */\n cssProps: {\n /**\n * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n * @type {String}\n * @default 'none'\n */\n userSelect: 'none',\n\n /**\n * Disable the Windows Phone grippers when pressing an element.\n * @type {String}\n * @default 'none'\n */\n touchSelect: 'none',\n\n /**\n * Disables the default callout shown when you touch and hold a touch target.\n * On iOS, when you touch and hold a touch target such as a link, Safari displays\n * a callout containing information about the link. This property allows you to disable that callout.\n * @type {String}\n * @default 'none'\n */\n touchCallout: 'none',\n\n /**\n * Specifies whether zooming is enabled. Used by IE10>\n * @type {String}\n * @default 'none'\n */\n contentZooming: 'none',\n\n /**\n * Specifies that an entire element should be draggable instead of its contents. Mainly for desktop browsers.\n * @type {String}\n * @default 'none'\n */\n userDrag: 'none',\n\n /**\n * Overrides the highlight color shown when the user taps a link or a JavaScript\n * clickable element in iOS. This property obeys the alpha value, if specified.\n * @type {String}\n * @default 'rgba(0,0,0,0)'\n */\n tapHighlightColor: 'rgba(0,0,0,0)'\n }\n};\n\nvar STOP = 1;\nvar FORCED_STOP = 2;\n\n/**\n * Manager\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Manager(element, options) {\n this.options = assign({}, Hammer.defaults, options || {});\n\n this.options.inputTarget = this.options.inputTarget || element;\n\n this.handlers = {};\n this.session = {};\n this.recognizers = [];\n this.oldCssProps = {};\n\n this.element = element;\n this.input = createInputInstance(this);\n this.touchAction = new TouchAction(this, this.options.touchAction);\n\n toggleCssProps(this, true);\n\n each(this.options.recognizers, function(item) {\n var recognizer = this.add(new (item[0])(item[1]));\n item[2] && recognizer.recognizeWith(item[2]);\n item[3] && recognizer.requireFailure(item[3]);\n }, this);\n}\n\nManager.prototype = {\n /**\n * set options\n * @param {Object} options\n * @returns {Manager}\n */\n set: function(options) {\n assign(this.options, options);\n\n // Options that need a little more setup\n if (options.touchAction) {\n this.touchAction.update();\n }\n if (options.inputTarget) {\n // Clean up existing event listeners and reinitialize\n this.input.destroy();\n this.input.target = options.inputTarget;\n this.input.init();\n }\n return this;\n },\n\n /**\n * stop recognizing for this session.\n * This session will be discarded, when a new [input]start event is fired.\n * When forced, the recognizer cycle is stopped immediately.\n * @param {Boolean} [force]\n */\n stop: function(force) {\n this.session.stopped = force ? FORCED_STOP : STOP;\n },\n\n /**\n * run the recognizers!\n * called by the inputHandler function on every movement of the pointers (touches)\n * it walks through all the recognizers and tries to detect the gesture that is being made\n * @param {Object} inputData\n */\n recognize: function(inputData) {\n var session = this.session;\n if (session.stopped) {\n return;\n }\n\n // run the touch-action polyfill\n this.touchAction.preventDefaults(inputData);\n\n var recognizer;\n var recognizers = this.recognizers;\n\n // this holds the recognizer that is being recognized.\n // so the recognizer's state needs to be BEGAN, CHANGED, ENDED or RECOGNIZED\n // if no recognizer is detecting a thing, it is set to `null`\n var curRecognizer = session.curRecognizer;\n\n // reset when the last recognizer is recognized\n // or when we're in a new session\n if (!curRecognizer || (curRecognizer && curRecognizer.state & STATE_RECOGNIZED)) {\n curRecognizer = session.curRecognizer = null;\n }\n\n var i = 0;\n while (i < recognizers.length) {\n recognizer = recognizers[i];\n\n // find out if we are allowed try to recognize the input for this one.\n // 1. allow if the session is NOT forced stopped (see the .stop() method)\n // 2. allow if we still haven't recognized a gesture in this session, or the this recognizer is the one\n // that is being recognized.\n // 3. allow if the recognizer is allowed to run simultaneous with the current recognized recognizer.\n // this can be setup with the `recognizeWith()` method on the recognizer.\n if (session.stopped !== FORCED_STOP && ( // 1\n !curRecognizer || recognizer == curRecognizer || // 2\n recognizer.canRecognizeWith(curRecognizer))) { // 3\n recognizer.recognize(inputData);\n } else {\n recognizer.reset();\n }\n\n // if the recognizer has been recognizing the input as a valid gesture, we want to store this one as the\n // current active recognizer. but only if we don't already have an active recognizer\n if (!curRecognizer && recognizer.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED)) {\n curRecognizer = session.curRecognizer = recognizer;\n }\n i++;\n }\n },\n\n /**\n * get a recognizer by its event name.\n * @param {Recognizer|String} recognizer\n * @returns {Recognizer|Null}\n */\n get: function(recognizer) {\n if (recognizer instanceof Recognizer) {\n return recognizer;\n }\n\n var recognizers = this.recognizers;\n for (var i = 0; i < recognizers.length; i++) {\n if (recognizers[i].options.event == recognizer) {\n return recognizers[i];\n }\n }\n return null;\n },\n\n /**\n * add a recognizer to the manager\n * existing recognizers with the same event name will be removed\n * @param {Recognizer} recognizer\n * @returns {Recognizer|Manager}\n */\n add: function(recognizer) {\n if (invokeArrayArg(recognizer, 'add', this)) {\n return this;\n }\n\n // remove existing\n var existing = this.get(recognizer.options.event);\n if (existing) {\n this.remove(existing);\n }\n\n this.recognizers.push(recognizer);\n recognizer.manager = this;\n\n this.touchAction.update();\n return recognizer;\n },\n\n /**\n * remove a recognizer by name or instance\n * @param {Recognizer|String} recognizer\n * @returns {Manager}\n */\n remove: function(recognizer) {\n if (invokeArrayArg(recognizer, 'remove', this)) {\n return this;\n }\n\n recognizer = this.get(recognizer);\n\n // let's make sure this recognizer exists\n if (recognizer) {\n var recognizers = this.recognizers;\n var index = inArray(recognizers, recognizer);\n\n if (index !== -1) {\n recognizers.splice(index, 1);\n this.touchAction.update();\n }\n }\n\n return this;\n },\n\n /**\n * bind event\n * @param {String} events\n * @param {Function} handler\n * @returns {EventEmitter} this\n */\n on: function(events, handler) {\n if (events === undefined) {\n return;\n }\n if (handler === undefined) {\n return;\n }\n\n var handlers = this.handlers;\n each(splitStr(events), function(event) {\n handlers[event] = handlers[event] || [];\n handlers[event].push(handler);\n });\n return this;\n },\n\n /**\n * unbind event, leave emit blank to remove all handlers\n * @param {String} events\n * @param {Function} [handler]\n * @returns {EventEmitter} this\n */\n off: function(events, handler) {\n if (events === undefined) {\n return;\n }\n\n var handlers = this.handlers;\n each(splitStr(events), function(event) {\n if (!handler) {\n delete handlers[event];\n } else {\n handlers[event] && handlers[event].splice(inArray(handlers[event], handler), 1);\n }\n });\n return this;\n },\n\n /**\n * emit event to the listeners\n * @param {String} event\n * @param {Object} data\n */\n emit: function(event, data) {\n // we also want to trigger dom events\n if (this.options.domEvents) {\n triggerDomEvent(event, data);\n }\n\n // no handlers, so skip it all\n var handlers = this.handlers[event] && this.handlers[event].slice();\n if (!handlers || !handlers.length) {\n return;\n }\n\n data.type = event;\n data.preventDefault = function() {\n data.srcEvent.preventDefault();\n };\n\n var i = 0;\n while (i < handlers.length) {\n handlers[i](data);\n i++;\n }\n },\n\n /**\n * destroy the manager and unbinds all events\n * it doesn't unbind dom events, that is the user own responsibility\n */\n destroy: function() {\n this.element && toggleCssProps(this, false);\n\n this.handlers = {};\n this.session = {};\n this.input.destroy();\n this.element = null;\n }\n};\n\n/**\n * add/remove the css properties as defined in manager.options.cssProps\n * @param {Manager} manager\n * @param {Boolean} add\n */\nfunction toggleCssProps(manager, add) {\n var element = manager.element;\n if (!element.style) {\n return;\n }\n var prop;\n each(manager.options.cssProps, function(value, name) {\n prop = prefixed(element.style, name);\n if (add) {\n manager.oldCssProps[prop] = element.style[prop];\n element.style[prop] = value;\n } else {\n element.style[prop] = manager.oldCssProps[prop] || '';\n }\n });\n if (!add) {\n manager.oldCssProps = {};\n }\n}\n\n/**\n * trigger dom event\n * @param {String} event\n * @param {Object} data\n */\nfunction triggerDomEvent(event, data) {\n var gestureEvent = document.createEvent('Event');\n gestureEvent.initEvent(event, true, true);\n gestureEvent.gesture = data;\n data.target.dispatchEvent(gestureEvent);\n}\n\nassign(Hammer, {\n INPUT_START: INPUT_START,\n INPUT_MOVE: INPUT_MOVE,\n INPUT_END: INPUT_END,\n INPUT_CANCEL: INPUT_CANCEL,\n\n STATE_POSSIBLE: STATE_POSSIBLE,\n STATE_BEGAN: STATE_BEGAN,\n STATE_CHANGED: STATE_CHANGED,\n STATE_ENDED: STATE_ENDED,\n STATE_RECOGNIZED: STATE_RECOGNIZED,\n STATE_CANCELLED: STATE_CANCELLED,\n STATE_FAILED: STATE_FAILED,\n\n DIRECTION_NONE: DIRECTION_NONE,\n DIRECTION_LEFT: DIRECTION_LEFT,\n DIRECTION_RIGHT: DIRECTION_RIGHT,\n DIRECTION_UP: DIRECTION_UP,\n DIRECTION_DOWN: DIRECTION_DOWN,\n DIRECTION_HORIZONTAL: DIRECTION_HORIZONTAL,\n DIRECTION_VERTICAL: DIRECTION_VERTICAL,\n DIRECTION_ALL: DIRECTION_ALL,\n\n Manager: Manager,\n Input: Input,\n TouchAction: TouchAction,\n\n TouchInput: TouchInput,\n MouseInput: MouseInput,\n PointerEventInput: PointerEventInput,\n TouchMouseInput: TouchMouseInput,\n SingleTouchInput: SingleTouchInput,\n\n Recognizer: Recognizer,\n AttrRecognizer: AttrRecognizer,\n Tap: TapRecognizer,\n Pan: PanRecognizer,\n Swipe: SwipeRecognizer,\n Pinch: PinchRecognizer,\n Rotate: RotateRecognizer,\n Press: PressRecognizer,\n\n on: addEventListeners,\n off: removeEventListeners,\n each: each,\n merge: merge,\n extend: extend,\n assign: assign,\n inherit: inherit,\n bindFn: bindFn,\n prefixed: prefixed\n});\n\n// this prevents errors when Hammer is loaded in the presence of an AMD\n// style loader but by script tag, not by the loader.\nvar freeGlobal = (typeof window !== 'undefined' ? window : (typeof self !== 'undefined' ? self : {})); // jshint ignore:line\nfreeGlobal.Hammer = Hammer;\n\nif (typeof define === 'function' && define.amd) {\n define(function() {\n return Hammer;\n });\n} else if (typeof module != 'undefined' && module.exports) {\n module.exports = Hammer;\n} else {\n window[exportName] = Hammer;\n}\n\n})(window, document, 'Hammer');\n","import { Component, Input, forwardRef, ElementRef, ViewChild, Output, EventEmitter, HostListener, ContentChild, TemplateRef } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { of } from \"rxjs\";\r\nimport { delay } from \"rxjs/operators\";\r\n\r\n@Component({\r\n selector: 'inline-edit',\r\n host: {\r\n '[class.inline-edit]': 'someAttr',\r\n },\r\n template: `\r\n
\r\n \r\n {{ value |currency }}\r\n {{ value }}\r\n {{ noValueText }}\r\n \r\n \r\n \r\n \r\n {{ getDisplayValue() }}\r\n {{ noValueText }}\r\n
\r\n\r\n
\r\n \r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n `,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => InlineEditControl),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class InlineEditControl implements ControlValueAccessor {\r\n @Input() value: string;\r\n @Input() type: 'input' | 'select' = 'input';\r\n @Input() items: any[];\r\n @Input() textField;\r\n @Input() valueField;\r\n @Input() valuePrimitive: boolean = false;\r\n @Input() wrap: boolean = false;\r\n @Input() readOnly: boolean = false;\r\n @Input() showButtons: boolean = true;\r\n @Input() placeholder: string ='';\r\n @Input() fontSize: string;\r\n @Input() fontColor: string;\r\n @Input() inputHeight: string;\r\n @Input() isCurrency: boolean = false;\r\n @Input() noValueText: string = '--No Value--';\r\n @ContentChild(TemplateRef) itemTemplate: TemplateRef;\r\n\r\n cssClass: string = '';\r\n editMode = false;\r\n @ViewChild('inputElement') inputElement: ElementRef;\r\n\r\n @Output()\r\n updated = new EventEmitter();\r\n\r\n @Output()\r\n isEditing = new EventEmitter();\r\n\r\n someAttr: string = 'anyValue';\r\n originalValue: string;\r\n\r\n constructor(private elementRef: ElementRef) {\r\n this.cssClass = elementRef.nativeElement.getAttribute('class');\r\n elementRef.nativeElement.setAttribute('class', '');\r\n }\r\n\r\n @HostListener('document:click', ['$event'])\r\n onClick(event) {\r\n var externalSelectorClicked = (event.target as HTMLElement).classList.contains('p-colorpicker-preview');\r\n\r\n if (this.readOnly) {\r\n return;\r\n }\r\n\r\n if (externalSelectorClicked){\r\n return;\r\n }\r\n\r\n if (!this.editMode) {\r\n this.toggleEdit();\r\n }\r\n\r\n if ((!this.elementRef.nativeElement.contains(event.target) && !externalSelectorClicked) && this.editMode) {\r\n this.discard();\r\n }\r\n }\r\n\r\n toggleEdit() {\r\n this.editMode = !this.editMode;\r\n if (this.editMode) {\r\n of(null).pipe(delay(100)).subscribe(() => {\r\n if (this.inputElement?.nativeElement) {\r\n this.inputElement.nativeElement?.focus();\r\n }\r\n });\r\n }\r\n\r\n this.isEditing.emit(this.editMode);\r\n }\r\n\r\n save(evt) {\r\n\r\n\r\n var changed = this.originalValue != this.value;\r\n this.propagateChange(this.value);\r\n this.originalValue = this.value;\r\n this.propagateTouch();\r\n this.toggleEdit();\r\n\r\n if (changed) this.updated.emit(this.value);\r\n evt.preventDefault();\r\n evt.stopPropagation();\r\n return false;\r\n }\r\n\r\n getDisplayValue() {\r\n\r\n if (this.valuePrimitive) {\r\n return this.value;\r\n }\r\n\r\n var item = this.items.find((x) => x[this.valueField] == this.value);\r\n if (item) {\r\n return item[this.textField];\r\n }\r\n }\r\n\r\n discard() {\r\n this.value = this.originalValue;\r\n this.propagateChange(this.value);\r\n this.propagateTouch();\r\n this.toggleEdit();\r\n }\r\n\r\n propagateChange = (_: any) => {};\r\n propagateTouch = () => {};\r\n\r\n writeValue(value: string): void {\r\n this.value = value;\r\n this.originalValue = value;\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.propagateChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.propagateTouch = fn;\r\n }\r\n\r\n onChange() {\r\n this.propagateChange(this.value);\r\n this.propagateTouch();\r\n }\r\n\r\n onTouch() {\r\n this.propagateTouch();\r\n }\r\n}\r\n","
\r\n \r\n
\r\n
\r\n
\r\n

Super User Tools {{ event.startTime | date: 'shortTime' }} - {{ event.endTime | date: 'shortTime' }}

\r\n

CEUs: {{ event.ceus |ceuDisplay }}

\r\n
\r\n \r\n
\r\n
\r\n \r\n\r\n \r\n\r\n
\r\n
\r\n
\r\n
\r\n
\r\n 0\"> Stream Health: \r\n
\r\n
\r\n 0\"\r\n >Video Bitrate: {{ videoHealthData[videoHealthData.length - 1].incomingBitrate | bytes }}/s\r\n \r\n
\r\n
\r\n 0\"\r\n >Audio Bitrate: {{ audioHealthData[audioHealthData.length - 1].incomingBitrate | bytes }}/s\r\n \r\n
\r\n
\r\n Toggle Graph\r\n
\r\n
\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {{ value | bytes }}\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n\r\n
\r\n
\r\n \r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n Allow\r\n Deny\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
    \r\n
  • \r\n \r\n
  • \r\n
  • \r\n \r\n
  • \r\n
  • \r\n \r\n
  • \r\n
\r\n
\r\n
\r\n \r\n\r\n
\r\n \r\n \r\n
\r\n\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n\r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n \r\n \r\n \r\n
\r\n","import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core';\r\nimport { HubConnection } from '@microsoft/signalr';\r\nimport { BehaviorSubject, interval, Observable, Subscription } from 'rxjs';\r\nimport { take } from 'rxjs/operators';\r\nimport { BytePipe } from 'src/app/_helpers/extensions.module';\r\nimport { EventDashboardViewModel, LiveEventViewModel, StreamHealthViewModel } from 'src/app/_models/generatedModels';\r\nimport { LiveEventService, SuperUserService } from 'src/app/_services/generatedServices';\r\nimport { ToasterService } from 'src/app/_services/toaster.service';\r\n\r\n@Component({\r\n selector: 'bxl-live-superuser',\r\n templateUrl: 'live-superuser.component.html',\r\n providers: [BytePipe],\r\n})\r\nexport class LiveSuperuserComponent implements OnInit, OnDestroy {\r\n initialized = false;\r\n dashboard: EventDashboardViewModel;\r\n @Input() event: LiveEventViewModel;\r\n @Input() connection: HubConnection;\r\n private checker: Subscription;\r\n showGraph = false;\r\n audioHealthData: StreamHealthViewModel[] = [];\r\n videoHealthData: StreamHealthViewModel[] = [];\r\n obsArray: BehaviorSubject = new BehaviorSubject([]);\r\n array$: Observable = this.obsArray.asObservable();\r\n maxValue: number = 3000000;\r\n @Output()\r\n closed = new EventEmitter();\r\n\r\n constructor(private superUser: SuperUserService, private bytePipe: BytePipe, private toaster: ToasterService, private liveEvent: LiveEventService) {}\r\n\r\n ngOnInit(): void {\r\n this.connection.on('azureMediaEvent', (data: StreamHealthViewModel) => {\r\n if (data.channel == this.event.streamingChannel && data.trackType == 'video') {\r\n this.videoHealthData.push(data);\r\n this.maxValue = Math.max(this.maxValue, data.bitrate);\r\n this.addElementToObservableArray(data);\r\n console.log('azure');\r\n console.log(data);\r\n }\r\n\r\n if (data.channel == this.event.streamingChannel && data.trackType == 'audio') {\r\n this.audioHealthData.push(data);\r\n console.log('azure');\r\n console.log(data);\r\n }\r\n });\r\n\r\n this.liveEvent.getDashboard(this.event.id).subscribe((dashboard) => {\r\n console.log(status);\r\n this.dashboard = dashboard;\r\n\r\n this.initialized = true;\r\n\r\n this.checker = interval(3000).subscribe((val) => this.getDashboardData());\r\n });\r\n }\r\n\r\n public contentString(val: any) {\r\n var bytes = val.value;\r\n\r\n if (!bytes) {\r\n return '';\r\n }\r\n\r\n if (bytes === 0) return '0 Bytes';\r\n\r\n return bytes / 1000 / 1000 + ' MB/s';\r\n\r\n // let decimals = 2;\r\n\r\n // if (bytes === 0) return '0 Bytes';\r\n\r\n // const k = 1024;\r\n // const dm = decimals < 0 ? 0 : decimals;\r\n // const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\r\n\r\n // const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n\r\n // return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];\r\n }\r\n\r\n addElementToObservableArray(item) {\r\n this.array$.pipe(take(1)).subscribe((val) => {\r\n console.log(val);\r\n const newArr = [...val, item];\r\n this.obsArray.next(newArr);\r\n });\r\n }\r\n\r\n getDashboardData() {\r\n this.liveEvent.getDashboardIgnoreCache(this.event.id).subscribe((dashboard) => {\r\n this.dashboard = dashboard;\r\n });\r\n }\r\n\r\n showToken(tokenNum: number) {\r\n this.superUser.showToken(this.event.id, tokenNum).subscribe();\r\n }\r\n\r\n resetChatAndQuestions() {\r\n this.superUser.resetChatAndQuestions(this.event.id).subscribe((result) => {\r\n this.toaster.success('Chat Cleared', 'Success');\r\n });\r\n }\r\n\r\n startOpenTokRTMP() {\r\n this.liveEvent.startOpenTokRTMPOnly(this.event.id).subscribe();\r\n }\r\n\r\n resetEvent() {\r\n this.superUser.resetEvent(this.event.id).subscribe((result) => {\r\n this.toaster.success('Event Reset', 'Success');\r\n });\r\n }\r\n\r\n rebuildCacheForEvent() {\r\n this.superUser.rebuildCacheForEvent(this.event.id).subscribe((result) => {\r\n this.toaster.success('Cache Rebuilt', 'Success');\r\n });\r\n }\r\n\r\n stopOpenTokRTMP() {\r\n this.liveEvent.stopOpenTokRTMP(this.event.id).subscribe();\r\n }\r\n\r\n openForCeus() {\r\n this.liveEvent.setOpenForCEUs(this.event.id, true).subscribe(result=>{\r\n this.toaster.success('Open for CEUs', 'Success');\r\n });\r\n }\r\n\r\n startOpenTokArchiveOnly() {\r\n this.liveEvent.startOpenTokArchiveOnly(this.event.id).subscribe();\r\n }\r\n\r\n startSecondaryOpenTokArchive() {\r\n this.liveEvent.startSecondaryOpenTokArchive(this.event.id).subscribe();\r\n }\r\n\r\n switchToYouTube() {\r\n this.liveEvent.switchToYouTube(this.event.id).subscribe();\r\n }\r\n\r\n failoverToOpenTok() {\r\n this.liveEvent.failoverToOpenTok(this.event.id).subscribe();\r\n }\r\n\r\n startOpenTokStreamOnly() {\r\n this.liveEvent.startOpenTokStreamOnly(this.event.id).subscribe();\r\n }\r\n\r\n setStreamLayouts() {\r\n this.liveEvent.setStreamLayouts(this.event.id).subscribe();\r\n }\r\n\r\n startChannel() {\r\n this.liveEvent.startChannel(this.event.id).subscribe();\r\n }\r\n stopChannel() {\r\n this.liveEvent.stopChannel(this.event.id).subscribe();\r\n }\r\n\r\n goLive() {\r\n this.toaster.confirmDialog('This will start broadcasting to everyone and the broadcast will be recorded.', 'Go live with this event?', \"Yes, let's go!\", 'Cancel').subscribe((result) => {\r\n if (result) {\r\n this.toaster.spinnerDialog('This can take a moment...', 'Starting Broadcast').subscribe((spinnerResult) => {\r\n this.liveEvent.startWebRTCStream(this.event.id).subscribe(\r\n (event) => {\r\n spinnerResult.close();\r\n this.event.streamingStarted = event.streamingStarted;\r\n this.event.streamingStartedTime = event.streamingStartedTime;\r\n this.toaster.success('Your stream has started!', \"You're Live!\");\r\n },\r\n (error) => {\r\n console.log(error.error.toString());\r\n this.toaster.messageDialog(error.error, 'Error Starting Event', 'Ok', true).subscribe();\r\n spinnerResult.close();\r\n }\r\n );\r\n });\r\n }\r\n });\r\n this.liveEvent.startWebRTCStream(this.event.id).subscribe();\r\n }\r\n\r\n scheduleTokens() {\r\n this.liveEvent.scheduleCEUChecks(this.event.id).subscribe((url) => {\r\n this.toaster.success('CEU Checks Scheduled', 'Success');\r\n });\r\n }\r\n\r\n allowOnCamera() {\r\n this.liveEvent.setAttendeesCamerasAllowed(this.event.id, true).subscribe((result) => {\r\n this.toaster.success('Cameras Allowed', 'Success');\r\n });\r\n }\r\n\r\n denyOnCamera() {\r\n this.liveEvent.setAttendeesCamerasAllowed(this.event.id, false).subscribe((result) => {\r\n this.toaster.success('Cameras Disabled', 'Success');\r\n });\r\n }\r\n\r\n startEvent() {\r\n this.dashboard.broadcastStatus = 'Starting';\r\n this.liveEvent.startStreaming(this.event.id).subscribe((url) => {});\r\n }\r\n\r\n startNewLiveOutput() {\r\n this.liveEvent.startStreaming(this.event.id).subscribe((url) => {});\r\n }\r\n\r\n stopEvent() {\r\n this.dashboard.broadcastStatus = 'Stopping';\r\n this.liveEvent.stopStreaming(this.event.id).subscribe();\r\n }\r\n\r\n close() {\r\n this.closed.emit();\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this.checker) {\r\n this.checker.unsubscribe();\r\n }\r\n }\r\n}\r\n","
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
    \r\n
  • \r\n 0\"> Stream Health: \r\n
  • \r\n
  • \r\n 0\"\r\n >Video Bitrate: {{ videoHealthData[videoHealthData.length - 1].incomingBitrate | bytes }}/s\r\n \r\n
  • \r\n\r\n
  • \r\n End Time: {{event.endTime | date:'shortTime'}}\r\n
  • \r\n
\r\n
\r\n
\r\n\r\n
\r\n
\r\n
    \r\n
  • \r\n \r\n \r\n
  • \r\n
  • \r\n \r\n
  • \r\n
  • \r\n \r\n
  • \r\n
  • \r\n \r\n
  • \r\n
  • \r\n \r\n
  • \r\n
\r\n
\r\n
\r\n
    \r\n
  • \r\n \r\n
  • \r\n
  • \r\n \r\n
  • \r\n
  • \r\n \r\n
  • \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
    \r\n
  • \r\n INTRO\r\n LIVE\r\n {{ elapsed.hours | LeftPadFilter }}:{{ elapsed.minutes | LeftPadFilter }}:{{ elapsed.seconds | LeftPadFilter }}\r\n
  • \r\n
\r\n
\r\n
\r\n
    \r\n
  • \r\n \r\n
  • \r\n
  • \r\n \r\n
  • \r\n\r\n
  • 0\" class=\"list-inline-item mr-0\">\r\n \r\n {{ userCount }}\r\n \r\n
  • \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n","import { ChangeDetectorRef, Component, ElementRef, Input, OnDestroy, OnInit, Renderer2, ViewChild } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { HubConnection, HubConnectionBuilder } from '@microsoft/signalr';\r\nimport { NgbModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport { BehaviorSubject, interval, Observable, of, Subscription, timer } from 'rxjs';\r\nimport { delay, map, take } from 'rxjs/operators';\r\nimport { CameraTestModalComponent } from 'src/app/events/live/camera-test/camera-test-modal.component';\r\nimport { TimeSpan } from 'src/app/events/live/live-event-dashboard/live-event-dashboard.component';\r\nimport { EventDashboardViewModel, LiveEventViewModel, PagedActiveUserViewModel, StreamHealthViewModel } from 'src/app/_models/generatedModels';\r\nimport { SelectedDevice } from 'src/app/_models/models';\r\nimport { AuthenticationService } from 'src/app/_services/authentication.service';\r\nimport { LiveEventService } from 'src/app/_services/generatedServices';\r\nimport { OpentokService } from 'src/app/_services/opentok.service';\r\nconst initLayoutContainer = require('opentok-layout-js');\r\nimport { Flowplayer, FPEvent } from \"@flowplayer/player\";\r\nimport Player = Flowplayer.Player;\r\ndeclare var flowplayer: any;\r\n\r\n@Component({\r\n selector: 'bxl-multi-view-video',\r\n templateUrl: 'multi-view-video.component.html',\r\n})\r\nexport class MultiViewVideoComponent implements OnInit, OnDestroy {\r\n initialized = false;\r\n session: OT.Session;\r\n soundMuted: boolean = true;\r\n public selectedDevice: SelectedDevice;\r\n publisher: OT.Publisher;\r\n public publishingAudio = true;\r\n public publishingVideo = true;\r\n public showPeople = false;\r\n private azureStreamChecker: Subscription;\r\n public showTools = false;\r\n livePlaying = false;\r\n livePlayer: Player;\r\n @ViewChild('livePLayer') livePLayerRef: ElementRef;\r\n\r\n public showQuestions = false;\r\n userCount: number;\r\n public publishing = false;\r\n timer$: Observable;\r\n audioHealthData: StreamHealthViewModel[] = [];\r\n videoHealthData: StreamHealthViewModel[] = [];\r\n dashboard: EventDashboardViewModel;\r\n @Input() event: LiveEventViewModel;\r\n obsArray: BehaviorSubject = new BehaviorSubject([]);\r\n array$: Observable = this.obsArray.asObservable();\r\n @Input() connection: HubConnection;\r\n openTokInitialized: boolean;\r\n public layout: any;\r\n public streamCount = 0;\r\n @ViewChild('webRTCLayoutContainer') webRTCLayoutContainer: ElementRef;\r\n previewing: boolean;\r\n constructor(private auth: AuthenticationService, private ref: ChangeDetectorRef, private liveEventService: LiveEventService, private modalService: NgbModal, private renderer: Renderer2, private opentokService: OpentokService) {}\r\n\r\n ngOnInit(): void {\r\n this.InitSignalR();\r\n\r\n if (this.event.isWebRTC) {\r\n this.InitOpenTok();\r\n } else {\r\n this.initAzure();\r\n }\r\n\r\n if (this.event.streamingStarted) {\r\n this.timer$ = this.getElapsedTime();\r\n }\r\n this.initialized = true;\r\n }\r\n\r\n initAzure() {\r\n this.liveEventService.getDashboardIgnoreCache(this.event.id).subscribe((result) => {\r\n this.dashboard = result;\r\n this.azureStreamChecker = interval(3000).subscribe((val) => this.getDashboardData());\r\n });\r\n }\r\n\r\n getDashboardData() {\r\n if (this.dashboard.isChannelRunning && this.dashboard.isIngesting && this.dashboard.isBroadcastRunning && this.dashboard.streamingUrl && this.dashboard.streamingUrl.length > 0) {\r\n this.setupAzureLive();\r\n return;\r\n }\r\n\r\n this.liveEventService.getDashboardIgnoreCache(this.event.id).subscribe((dashboard) => {\r\n this.dashboard = dashboard;\r\n this.setupAzureLive();\r\n });\r\n }\r\n\r\n setupAzureLive() {\r\n if (this.livePlayer && this.dashboard.isBroadcastRunning && this.dashboard.streamingUrl && (!this.livePlaying || this.livePlayer.currentTime < 2)) {\r\n this.livePlayer.setSrc(this.dashboard.streamingUrl);\r\n this.previewing = false;\r\n this.livePlayer.togglePlay(true);\r\n this.livePlaying = true;\r\n console.log('Player already exists. playing stream');\r\n }\r\n\r\n if (this.livePlayer) {\r\n console.log('Player already exists. not playing stream');\r\n return;\r\n }\r\n\r\n if (!this.dashboard.isChannelRunning || !this.dashboard.isIngesting) {\r\n return;\r\n }\r\n\r\n\r\n\r\n if (!this.dashboard.isBroadcastRunning && !this.dashboard.streamingUrl) {\r\n console.log('Preview Stream');\r\n this.livePlayer = flowplayer('#livePLayer' + this.event.id, {\r\n qsel: {\r\n labels: [],\r\n },\r\n\r\n src: this.dashboard.previewUrl,\r\n autoplay: flowplayer.autoplay.AUDIO_REQUIRED,\r\n ui: flowplayer.ui.NO_FULLSCREEN,\r\n token: \"eyJraWQiOiIwWE44RnRTYkQxblYiLCJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiJ9.eyJjIjoie1wiYWNsXCI6MzgsXCJpZFwiOlwiMFhOOEZ0U2JEMW5WXCJ9IiwiaXNzIjoiRmxvd3BsYXllciJ9.wHlyQZ86rIHD8ldgnpiWbmFBmR4zt_3FSj78GMk7lfQ1es7K8y0MuHzbqcJfp0lm6LcUbUkQ5PsazIsAybxivg\"\r\n });\r\n console.log(this.livePlayer);\r\n this.livePlayer.on('error', this.playbackErrorOccured.bind(this));\r\n this.previewing = true;\r\n return;\r\n } else if (this.dashboard.isBroadcastRunning && this.dashboard.streamingUrl) {\r\n console.log('Broadcast Stream');\r\n this.livePlayer = flowplayer('#livePLayer' + this.event.id, {\r\n qsel: {\r\n labels: [],\r\n },\r\n dvr: true,\r\n live: true,\r\n seekable: true,\r\n controls: true,\r\n src: this.dashboard.streamingUrl,\r\n autoplay: flowplayer.autoplay.AUDIO_REQUIRED,\r\n ui: flowplayer.ui.NO_FULLSCREEN,\r\n token: \"eyJraWQiOiIwWE44RnRTYkQxblYiLCJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiJ9.eyJjIjoie1wiYWNsXCI6MzgsXCJpZFwiOlwiMFhOOEZ0U2JEMW5WXCJ9IiwiaXNzIjoiRmxvd3BsYXllciJ9.wHlyQZ86rIHD8ldgnpiWbmFBmR4zt_3FSj78GMk7lfQ1es7K8y0MuHzbqcJfp0lm6LcUbUkQ5PsazIsAybxivg\"\r\n });\r\n this.livePlayer.on('error', this.playbackErrorOccured.bind(this));\r\n this.previewing = false;\r\n this.livePlaying = true;\r\n }\r\n }\r\n\r\n playbackErrorOccured(err: FPEvent) {\r\n console.info(\"error occured\");\r\n console.info(err);\r\n this.livePlaying = false;\r\n this.previewing = false;\r\n }\r\n\r\n InitSignalR(): any {\r\n this.connection.on('streamStartedv2', (eventId: number, startTime, dashboard: EventDashboardViewModel) => {\r\n if (eventId === this.event.id) {\r\n console.log('stream started');\r\n this.event.streamingStarted = true;\r\n console.log(startTime);\r\n this.event.streamingStartedTime = startTime;\r\n\r\n this.ref.detectChanges();\r\n of(null)\r\n .pipe(delay(500))\r\n .subscribe((result) => {\r\n console.log('resizing');\r\n this.layout();\r\n });\r\n\r\n this.timer$ = this.getElapsedTime();\r\n }\r\n });\r\n\r\n this.connection.on('azureMediaEvent', (data: StreamHealthViewModel) => {\r\n if (data.channel == this.event.streamingChannel && data.trackType == 'video') {\r\n this.videoHealthData.push(data);\r\n this.addElementToObservableArray(data);\r\n console.log(data);\r\n }\r\n\r\n if (data.channel == this.event.streamingChannel && data.trackType == 'audio') {\r\n this.audioHealthData.push(data);\r\n console.log(data);\r\n }\r\n });\r\n this.connection.on('streamFinished', (eventId: number) => {\r\n if (eventId === this.event.id) {\r\n console.log('stream ended');\r\n this.event.streamingStarted = false;\r\n this.event.streamingFinished = true;\r\n\r\n this.session.disconnect();\r\n this.publishing = false;\r\n this.streamCount = 0;\r\n this.ref.detectChanges();\r\n of(null)\r\n .pipe(delay(500))\r\n .subscribe((result) => {\r\n this.layout();\r\n });\r\n }\r\n });\r\n this.initialized = true;\r\n }\r\n\r\n addElementToObservableArray(item) {\r\n this.array$.pipe(take(1)).subscribe((val) => {\r\n const newArr = [...val, item];\r\n this.obsArray.next(newArr);\r\n });\r\n }\r\n\r\n usersUpdated(event: PagedActiveUserViewModel) {\r\n this.userCount = event.totalCount;\r\n }\r\n\r\n get offAirImage() {\r\n if (this.event.sponsorOffAirImage) {\r\n return 'fetchimage?filename=' + this.event.sponsorOffAirImage;\r\n } else {\r\n return '../../assets/off-air.png';\r\n }\r\n }\r\n\r\n InitOpenTok() {\r\n this.ref.detectChanges();\r\n this.layout = initLayoutContainer(this.webRTCLayoutContainer.nativeElement).layout;\r\n let layout = this.layout;\r\n\r\n if (this.openTokInitialized) {\r\n return;\r\n }\r\n\r\n console.log('initializing opentok');\r\n\r\n this.opentokService\r\n .initSessionForEvents(this.event.id)\r\n .then((session: OT.Session) => {\r\n this.session = session;\r\n\r\n this.session.on('streamPropertyChanged', (event) => {\r\n console.log('changed');\r\n console.log(event.stream.streamId);\r\n });\r\n\r\n this.session.on('streamCreated', (event) => {\r\n console.log(event.stream.name);\r\n console.log(event.stream.connection.data);\r\n this.streamCount++;\r\n\r\n let subscription = this.session.subscribe(event.stream, 'webRTCLayoutContainer' + this.event.id, {\r\n insertMode: 'append',\r\n style: { nameDisplayMode: 'off' },\r\n });\r\n\r\n if (subscription.stream.videoType === 'screen') {\r\n subscription.element.classList.add('OT_big');\r\n }\r\n\r\n if (subscription.stream.name === 'video') {\r\n subscription.element.classList.add('OT_ignore');\r\n }\r\n\r\n subscription.element.addEventListener('dblclick', function () {\r\n if (subscription.element.classList.contains('OT_big')) {\r\n subscription.element.classList.remove('OT_big');\r\n } else {\r\n subscription.element.classList.add('OT_big');\r\n }\r\n layout();\r\n });\r\n\r\n layout();\r\n this.ref.detectChanges();\r\n layout();\r\n of(null)\r\n .pipe(delay(5000))\r\n .subscribe((result) => {\r\n this.checkMuted();\r\n });\r\n this.openTokInitialized = true;\r\n });\r\n this.session.on('streamDestroyed', (event) => {\r\n this.streamCount--;\r\n session.getSubscribersForStream(event.stream).forEach((subscriber) => {\r\n subscriber.element.classList.remove('ot-layout');\r\n\r\n setTimeout(() => {\r\n layout();\r\n }, 200);\r\n });\r\n layout();\r\n this.ref.detectChanges();\r\n layout();\r\n });\r\n })\r\n .then(() => this.opentokService.connect())\r\n .catch((err) => {\r\n console.error(err);\r\n alert('Unable to connect. Make sure you have updated the config.ts file with your OpenTok details.');\r\n });\r\n }\r\n\r\n showDeviceSettings() {\r\n const modalRef = this.modalService.open(CameraTestModalComponent, { size: 'lg', backdrop: 'static', ariaLabelledBy: 'modal-basic-title' });\r\n if (this.selectedDevice) {\r\n console.log(this.selectedDevice);\r\n modalRef.componentInstance.selectedDevice = this.selectedDevice;\r\n }\r\n modalRef.result.then(\r\n (result) => {\r\n this.selectedDevice = result;\r\n\r\n if (this.publisher) {\r\n this.publisher.destroy();\r\n if (this.publishing) {\r\n this.activateCamera();\r\n }\r\n }\r\n },\r\n (reason) => {}\r\n );\r\n return;\r\n }\r\n\r\n toggleVideo() {\r\n this.publishingVideo = !this.publishingVideo;\r\n this.publisher.publishVideo(this.publishingVideo);\r\n }\r\n\r\n toggleAudio() {\r\n this.publishingAudio = !this.publishingAudio;\r\n this.publisher.publishAudio(this.publishingAudio);\r\n }\r\n\r\n checkMuted() {\r\n console.log('check muted');\r\n let selectors = '#webRTCLayoutContainer' + this.event.id + ' div.OT_subscriber video';\r\n console.log(selectors);\r\n document.querySelectorAll(selectors).forEach((elem: HTMLVideoElement) => {\r\n elem.muted = this.soundMuted;\r\n });\r\n }\r\n\r\n muteAudio() {\r\n this.soundMuted = true;\r\n this.checkMuted();\r\n }\r\n\r\n unMuteAudio() {\r\n this.soundMuted = false;\r\n this.checkMuted();\r\n }\r\n\r\n unpublish() {\r\n this.session.unpublish(this.publisher);\r\n this.publishing = false;\r\n this.layout();\r\n }\r\n\r\n activateCamera() {\r\n this.ref.detectChanges();\r\n\r\n const OT = this.opentokService.getOT();\r\n const el = this.renderer.createElement('div');\r\n\r\n this.publishingVideo = false;\r\n\r\n if (this.selectedDevice) {\r\n this.publisher = OT.initPublisher(el, { publishAudio: this.publishingAudio, publishVideo: this.publishingVideo, resolution: '1280x720', name: 'billbob', width: '100%', insertDefaultUI: true, style: { nameDisplayMode: 'off', archiveStatusDisplayMode: 'off', buttonDisplayMode: 'off' }, audioSource: this.selectedDevice.audioDeviceId, videoSource: this.selectedDevice.videoDeviceId });\r\n } else {\r\n this.publisher = OT.initPublisher(el, { publishAudio: this.publishingAudio, publishVideo: this.publishingVideo, resolution: '1280x720', name: 'billbob', width: '100%', insertDefaultUI: true, style: { nameDisplayMode: 'off', archiveStatusDisplayMode: 'off', buttonDisplayMode: 'off' } });\r\n }\r\n\r\n let layout = this.layout;\r\n\r\n el.addEventListener('dblclick', function () {\r\n if (el.classList.contains('OT_big')) {\r\n el.classList.remove('OT_big');\r\n } else {\r\n el.classList.add('OT_big');\r\n }\r\n layout();\r\n });\r\n\r\n this.renderer.appendChild(this.webRTCLayoutContainer.nativeElement, el);\r\n layout();\r\n\r\n if (this.session) {\r\n if (this.session['isConnected']()) {\r\n this.publish();\r\n }\r\n this.session.on('sessionConnected', () => this.publish());\r\n }\r\n }\r\n\r\n publish() {\r\n this.session.publish(this.publisher, (err) => {\r\n if (err) {\r\n alert(err.message);\r\n } else {\r\n this.publishing = true;\r\n }\r\n });\r\n }\r\n\r\n private getElapsedTime(): Observable {\r\n return timer(0, 1000).pipe(\r\n map(() => {\r\n let date = new Date(this.event.streamingStartedTime);\r\n let totalSeconds = Math.floor((new Date().getTime() - date.getTime()) / 1000);\r\n\r\n let pre = false;\r\n if (totalSeconds < 0) {\r\n pre = true;\r\n }\r\n\r\n totalSeconds = Math.abs(totalSeconds);\r\n\r\n let hours = 0;\r\n let minutes = 0;\r\n let seconds = 0;\r\n\r\n if (totalSeconds >= 3600) {\r\n hours = Math.floor(totalSeconds / 3600);\r\n totalSeconds -= 3600 * hours;\r\n }\r\n\r\n if (totalSeconds >= 60) {\r\n minutes = Math.floor(totalSeconds / 60);\r\n totalSeconds -= 60 * minutes;\r\n }\r\n\r\n seconds = totalSeconds;\r\n\r\n //console.log(hours + ':' + minutes + ':' + seconds);\r\n return {\r\n hours: hours,\r\n minutes: minutes,\r\n seconds: seconds,\r\n pre: pre,\r\n };\r\n })\r\n );\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.publisher) {\r\n this.publisher.destroy();\r\n }\r\n\r\n if (this.azureStreamChecker) {\r\n this.azureStreamChecker.unsubscribe();\r\n }\r\n\r\n if (this.livePlayer) {\r\n console.log('disposed media player');\r\n this.livePlayer.destroy();\r\n }\r\n\r\n if (this.session) {\r\n this.session.off('streamCreated');\r\n this.session.off('streamDestroyed');\r\n this.session.disconnect();\r\n }\r\n }\r\n}\r\n","\r\n\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n\r\n \r\n\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n","import { Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { HubConnection, HubConnectionBuilder } from '@microsoft/signalr';\r\nimport Enumerable from 'linq';\r\nimport { forkJoin, Observable, Subscription } from 'rxjs';\r\nimport { DefaultReconnectPolicy } from 'src/app/_helpers/signalR-retry-policy';\r\nimport { EventSummaryViewModel, LiveEventViewModel, TodaysEventViewmodel } from 'src/app/_models/generatedModels';\r\nimport { AuthenticationService } from 'src/app/_services/authentication.service';\r\nimport { EventService, SuperUserService } from 'src/app/_services/generatedServices';\r\ndeclare var zE: any;\r\n\r\n@Component({\r\n selector: 'bxl-mulit-viewer',\r\n templateUrl: 'mulit-viewer.component.html',\r\n})\r\nexport class MulitViewerComponent implements OnInit, OnDestroy {\r\n initialized = false;\r\n events: LiveEventViewModel[] = [];\r\n queryRouteSubscription: Subscription;\r\n public connection: HubConnection;\r\n todaysEvents: TodaysEventViewmodel[];\r\n selectedEvents: number[];\r\n constructor(private route: ActivatedRoute, private router: Router, private eventData: EventService, private superUser: SuperUserService, private auth: AuthenticationService) {}\r\n ngOnDestroy(): void {\r\n this.queryRouteSubscription.unsubscribe();\r\n zE('webWidget', 'show');\r\n }\r\n\r\n ngOnInit(): void {\r\n this.router.routeReuseStrategy.shouldReuseRoute = () => false;\r\n this.loadZendesk();\r\n\r\n this.queryRouteSubscription = this.route.queryParamMap.subscribe((queryParam) => {\r\n let query = queryParam.get('eventIds');\r\n var eventIds = query.split(',');\r\n this.selectedEvents = Enumerable.from(eventIds)\r\n .select((x) => parseInt(x))\r\n .toArray();\r\n\r\n var subscriptions: Observable[] = [];\r\n\r\n eventIds.forEach((eventId) => {\r\n subscriptions.push(this.eventData.getLiveEvent(eventId));\r\n });\r\n\r\n this.superUser.getEventsForToday().subscribe((result) => {\r\n this.todaysEvents = result;\r\n });\r\n\r\n forkJoin(subscriptions).subscribe((results) => {\r\n results.forEach((evnt) => {\r\n this.events.push(evnt);\r\n });\r\n\r\n console.log(this.events);\r\n this.InitSignalR();\r\n });\r\n });\r\n }\r\n\r\n eventChanged(evtIdx, evt) {\r\n console.log(this.selectedEvents);\r\n this.router.navigateByUrl('/live-events/multi-viewer?eventIds=' + this.selectedEvents.join());\r\n\r\n }\r\n\r\n InitSignalR(): any {\r\n this.connection = new HubConnectionBuilder()\r\n .withUrl('/liveEventHub', { accessTokenFactory: () => this.auth.getToken() })\r\n .withAutomaticReconnect(new DefaultReconnectPolicy())\r\n .build();\r\n\r\n this.connection.start().then(() => {\r\n this.events.forEach((evt) => {\r\n this.connection.invoke('connectToEvent', evt.id);\r\n });\r\n });\r\n\r\n this.connection.onreconnected(() => {\r\n this.events.forEach((evt) => {\r\n this.connection.invoke('connectToEvent', evt.id);\r\n });\r\n });\r\n this.initialized = true;\r\n }\r\n\r\n exitPage() {\r\n this.router.navigate(['/super-user/events']);\r\n return;\r\n }\r\n\r\n loadZendesk() {\r\n zE('webWidget', 'hide');\r\n zE('webWidget:on', 'close', () => {\r\n zE('webWidget', 'hide');\r\n });\r\n\r\n zE('webWidget:on', 'chat:unreadMessages', () => {\r\n zE('webWidget', 'show');\r\n zE('webWidget', 'open');\r\n });\r\n }\r\n}\r\n","
\r\n \r\n
\r\n
\r\n

Technical Support

\r\n \r\n
\r\n
\r\n \r\n\r\n \r\n
\r\n\r\n
\r\n
Please look over these common solutions and if you don't see your answer, then please chat our team.
\r\n\r\n
\r\n
\r\n\r\n
    \r\n
  • \r\n
    Stream is not playing
    \r\n Most of the time a simple refresh of your browser will fix this. Sometimes you need to click the play icon on the video player. You can also try compatibily mode if that doesn't work!\r\n
  • \r\n
  • \r\n
    How do I get CEUs
    \r\n Click 3 out of the 4 attendance checks that show randomly throughout. Once the event is over, you can add a review and get your certificate in\r\n CEU History\r\n CEU History\r\n
  • \r\n
  • \r\n
    I missed a CEU check
    \r\n No worries! You need 3 out of 4 checks to pass, but If you are here, you will get CEUs. You can resolve problems AFTER the event in\r\n CEU History\r\n CEU History\r\n
  • \r\n
  • \r\n
    Add BACB #
    \r\n If you haven't yet, you can add your BACB number in\r\n My Account\r\n
  • \r\n
\r\n
\r\n
\r\n
\r\n\r\n\r\n \r\n \r\n\r\n
\r\n \r\n
\r\n","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\r\nimport { LiveEventDashboardComponent } from './live-event-dashboard/live-event-dashboard.component';\r\nimport { LiveEventViewModel } from 'src/app/_models/generatedModels';\r\nimport { LiveEventService } from \"../../_services/generatedServices\";\r\nimport { ToasterService } from \"../../_services/toaster.service\";\r\nimport { EventRole } from 'src/app/_models/models';\r\n\r\n\r\n@Component({\r\n selector: 'bxl-technical-support',\r\n templateUrl: 'technical-support.component.html',\r\n})\r\nexport class TechnicalSupportComponent implements OnInit {\r\n initialized = false;\r\n @Input() parent: LiveEventDashboardComponent;\r\n @Input() role: EventRole;\r\n public EventRole = EventRole;\r\n @Input() event: LiveEventViewModel;\r\n @Output()\r\n closed = new EventEmitter();\r\n submitComplete: Promise;\r\n\r\n constructor(private liveEventService: LiveEventService, private toaster: ToasterService) { }\r\n\r\n ngOnInit(): void {\r\n this.initialized = true;\r\n }\r\n\r\n toggleCompatibility() {\r\n this.parent.toggleCompatabilityMode();\r\n }\r\n\r\n refresh() {\r\n this.parent.reloadVideo();\r\n }\r\n\r\n supportChat() {\r\n this.parent.openSupportChat();\r\n this.close();\r\n }\r\n\r\n close() {\r\n //this.preTest = false;\r\n //this.techSupport = false;\r\n this.closed.emit();\r\n }\r\n\r\n public requestModerator() {\r\n this.submitComplete = new Promise((resolve: any, reject) => {\r\n this.liveEventService.requestSupport(this.event.id).subscribe(() => {\r\n resolve();\r\n this.toaster.messageDialog(\"Your request has been sent to the moderator. A member of the BehaviorLive team will meet you in here shortly.\", \"Request Sent\").subscribe();\r\n });\r\n });\r\n }\r\n}\r\n","
\r\n \r\n
\r\n
\r\n

Leave a Donation

\r\n\r\n \r\n
\r\n
\r\n \r\n\r\n \r\n\r\n
\r\n
\r\n
\r\n
\r\n
\r\n {{ errorMessage }}\r\n
\r\n
\r\n
\r\n
    \r\n
  • \r\n $1\r\n
  • \r\n
  • \r\n $5\r\n
  • \r\n
  • \r\n $10\r\n
  • \r\n
  • \r\n $20\r\n
  • \r\n
  • \r\n $25\r\n
  • \r\n
  • \r\n $50\r\n
  • \r\n
  • \r\n $100\r\n
  • \r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
Card Number is required
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
Month is required
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
Year is required
\r\n
\r\n
\r\n
\r\n \r\n \r\n
\r\n
CVV is required
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n","import { Component, EventEmitter, Input, NgZone, OnInit, Output, ViewChild } from '@angular/core';\r\nimport { NgForm } from '@angular/forms';\r\nimport { CardTokenViewModel, LiveEventViewModel, TipViewModel } from 'src/app/_models/generatedModels';\r\nimport { EventService } from 'src/app/_services/generatedServices';\r\nimport { ToasterService } from 'src/app/_services/toaster.service';\r\n\r\n@Component({\r\n selector: 'live-tips',\r\n templateUrl: 'live-tips.component.html',\r\n})\r\nexport class LiveTipsComponent implements OnInit {\r\n initialized = false;\r\n public cardNumber: string;\r\n public expMo: string;\r\n public expYr: string;\r\n public cvv: string;\r\n public errorMessage: string;\r\n submitComplete: Promise<{}> | undefined;\r\n\r\n @Input() event: LiveEventViewModel;\r\n @Output()\r\n closed = new EventEmitter();\r\n\r\n tipAmount = 5;\r\n @ViewChild('theForm') public userFrm: NgForm;\r\n\r\n constructor(private zone: NgZone, private eventService: EventService, private toaster: ToasterService) {}\r\n\r\n ngOnInit(): void {\r\n this.initialized = true;\r\n }\r\n\r\n markAllTouched() {\r\n Object.keys(this.userFrm.controls).forEach((field) => {\r\n // {1}\r\n const control = this.userFrm.control.get(field);\r\n console.log(control); // {2}\r\n control.markAsTouched({ onlySelf: true });\r\n control.markAsDirty({ onlySelf: true }); // {3}\r\n });\r\n }\r\n\r\n resetForm() {\r\n Object.keys(this.userFrm.controls).forEach((field) => {\r\n // {1}\r\n const control = this.userFrm.control.get(field);\r\n console.log(control); // {2}\r\n control.markAsPristine({ onlySelf: true });\r\n control.markAsUntouched({ onlySelf: true }); // {3}\r\n });\r\n }\r\n\r\n sendTip() {\r\n if (!this.userFrm.valid) {\r\n this.markAllTouched();\r\n return;\r\n }\r\n\r\n this.submitComplete = new Promise((resetButton:any, reject) => {\r\n this.send(resetButton);\r\n });\r\n }\r\n\r\n send(resetButton) {\r\n let card = { number: this.cardNumber, exp_month: this.expMo, exp_year: this.expYr, cvc: this.cvv };\r\n (window).Stripe.card.createToken(card, (status: number, response: any) => {\r\n if (status === 200) {\r\n let model = new TipViewModel();\r\n model.cardToken = response.id;\r\n model.amount = this.tipAmount;\r\n\r\n this.zone.run(() => {\r\n this.eventService.addTipToEvent(this.event.id, model).subscribe(\r\n (result) => {\r\n if (!result) {\r\n resetButton();\r\n this.errorMessage = 'Unable to process transaction';\r\n return;\r\n }\r\n\r\n resetButton();\r\n\r\n console.log('here');\r\n this.toaster.messageDialog('Your Donation has been received and is greatly appreciated! A receipt has been emailed to you.', 'Thank You!').subscribe();\r\n this.tipAmount = 5;\r\n this.cardNumber = '';\r\n this.expMo = '';\r\n this.expYr = '';\r\n this.cvv = '';\r\n this.resetForm();\r\n this.close();\r\n },\r\n (error) => {\r\n resetButton();\r\n this.errorMessage = error.error[0];\r\n }\r\n );\r\n });\r\n } else {\r\n resetButton();\r\n this.errorMessage = response.error.message;\r\n }\r\n });\r\n }\r\n\r\n close() {\r\n this.closed.emit();\r\n }\r\n}\r\n","\r\n\r\n","import { Component, Input, OnInit } from '@angular/core';\r\nimport { CourseEventViewModel, EventViewModel } from 'src/app/_models/generatedModels';\r\nimport { EventService } from 'src/app/_services/generatedServices';\r\nimport { SettingsProvider } from \"../../../_services/settingsProvider.service\";\r\n\r\n@Component({\r\n selector: 'bxl-chat-event-link',\r\n templateUrl: 'chat-event-link.component.html',\r\n})\r\nexport class ChatEventLinkComponent implements OnInit {\r\n initialized = false;\r\n\r\n @Input() eventIdOrSlug: string;\r\n evt: CourseEventViewModel;\r\n\r\n constructor(private eventService: EventService, public settings:SettingsProvider) {}\r\n\r\n ngOnInit(): void {\r\n this.eventService.getSpecificCourseEvent(this.eventIdOrSlug).subscribe((evt) => {\r\n this.evt = evt;\r\n this.initialized = true;\r\n });\r\n }\r\n}\r\n","\r\n
\r\n
\r\n
\r\n\r\n \r\n \r\n \r\n
\r\n\r\n
\r\n
\r\n \r\n
\r\n
Channel Status:\r\n \r\n \r\n \r\n \r\n {{ currentChannelStatus.state }}\r\n \r\n
\r\n\r\n\r\n\r\n
\r\n
\r\n
\r\n
\r\n\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n","import { ChangeDetectorRef, Component, ElementRef, HostListener, OnDestroy, OnInit, Renderer2, ViewChild } from '@angular/core';\r\nimport { ActivatedRoute } from '@angular/router';\r\nimport { HubConnection, HubConnectionBuilder } from '@microsoft/signalr';\r\nimport { NgbModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport { Console } from 'console';\r\nimport { interval, of, Subscription } from 'rxjs';\r\nimport { delay } from 'rxjs/operators';\r\nimport { CameraTestModalComponent } from 'src/app/events/live/camera-test/camera-test-modal.component';\r\nimport { DefaultReconnectPolicy } from 'src/app/_helpers/signalR-retry-policy';\r\nimport { ConferenceRoomViewModel, StreamBoxLayoutViewModel, WowzaChannelViewModel, WowzaState } from 'src/app/_models/generatedModels';\r\nimport { SelectedDevice } from 'src/app/_models/models';\r\nimport { AnalyticsService } from 'src/app/_services/analytics.service';\r\nimport { AuthenticationService } from 'src/app/_services/authentication.service';\r\nimport { StreamBoxService, SuperUserService } from 'src/app/_services/generatedServices';\r\nimport { OpentokService } from 'src/app/_services/opentok.service';\r\nimport { ToasterService } from 'src/app/_services/toaster.service';\r\nimport { Enums, StrWowzaStateEnum } from \"../../_models/generatedEnums\";\r\nimport Enumerable from \"linq\";\r\n\r\ndeclare var zE: any;\r\nconst initLayoutContainer = require('opentok-layout-js');\r\n\r\n\r\n@Component({\r\n selector: 'bxl-stream-box',\r\n templateUrl: 'stream-box.component.html',\r\n})\r\nexport class StreamBoxComponent implements OnInit, OnDestroy {\r\n initialized = false;\r\n public selectedCameraDevice: SelectedDevice;\r\n public selectedScreenDevice: SelectedDevice;\r\n public connection: HubConnection;\r\n screenPublisher: OT.Publisher;\r\n cameraPublisher: OT.Publisher;\r\n public isFullScreen: boolean;\r\n @ViewChild('videoCanvas') videoCanvas: ElementRef;\r\n @ViewChild('background') background: ElementRef;\r\n @ViewChild('fullscreenContainer') fullscreenContainer: ElementRef;\r\n session: OT.Session;\r\n @ViewChild('soundBar', {static: false}) soundBar: ElementRef;\r\n streamCount: any;\r\n screenPublishing: boolean;\r\n cameraPublishing: boolean;\r\n model: StreamBoxLayoutViewModel;\r\n streamBoxId: number;\r\n layout: any;\r\n openTokInitialized: boolean;\r\n private checker: Subscription;\r\n rooms: ConferenceRoomViewModel[];\r\n selectedRoom: number;\r\n\r\n constructor(private streamBoxService: StreamBoxService, private toasterService: ToasterService, private superUser: SuperUserService, private titleService: AnalyticsService, private auth: AuthenticationService, private route: ActivatedRoute, private modalService: NgbModal, private renderer: Renderer2, private opentokService: OpentokService, private ref: ChangeDetectorRef) {}\r\n\r\n ngOnInit(): void {\r\n this.route.paramMap.subscribe((params) => {\r\n this.route.queryParamMap.subscribe((qParams) => {\r\n this.selectedCameraDevice = JSON.parse(localStorage.getItem('cameraDevice'));\r\n this.selectedScreenDevice = JSON.parse(localStorage.getItem('screenDevice'));\r\n this.getData();\r\n this.checker = interval(10000).subscribe((val) => this.getData());\r\n this.streamBoxService.getRoomsForConferences().subscribe((result) => {\r\n this.rooms = result;\r\n this.selectedRoom = Enumerable.from(this.rooms).firstOrDefault(x => x.channel == \"Channel\" + this.streamBoxId)?.id;\r\n });\r\n\r\n\r\n this.streamBoxId = +params.get('id');\r\n\r\n this.titleService.setTitleAndLogPageView('StreamBox' + this.streamBoxId);\r\n\r\n this.model = new StreamBoxLayoutViewModel();\r\n //this.superSource16x9();\r\n this.model.cameraWidth = 640;\r\n this.model.cameraHeight = 480;\r\n this.model.cameraTop = 0;\r\n this.model.cameraLeft = 0;\r\n this.model.cameraOnAir = true;\r\n this.model.computerOnAir = false;\r\n\r\n of(null)\r\n .pipe(delay(5000))\r\n .subscribe((result) => {\r\n this.InitOpenTok();\r\n });\r\n\r\n this.cameraOnly();\r\n\r\n if (qParams.get('auto')) {\r\n of(null)\r\n .pipe(delay(10000))\r\n .subscribe((result) => {\r\n // this.shareBG();\r\n this.publishCamera();\r\n\r\n });\r\n }\r\n\r\n zE('webWidget', 'hide');\r\n this.InitSignalR();\r\n });\r\n });\r\n }\r\n\r\n InitSignalR(): any {\r\n this.connection = new HubConnectionBuilder()\r\n .withUrl('/streamBoxHub', {accessTokenFactory: () => this.auth.getToken()})\r\n .withAutomaticReconnect(new DefaultReconnectPolicy())\r\n .build();\r\n\r\n this.connection.start().then(() => {});\r\n\r\n this.connection.on('PanUp', (id) => {\r\n console.log('Pan up' + id);\r\n });\r\n\r\n this.initialized = true;\r\n }\r\n\r\n panUp() {\r\n this.connection.invoke('PanUp', this.streamBoxId);\r\n }\r\n\r\n panDown() {\r\n this.connection.invoke('PanDown', this.streamBoxId);\r\n }\r\n\r\n panLeft() {\r\n this.connection.invoke('PanLeft', this.streamBoxId);\r\n }\r\n\r\n panRight() {\r\n this.connection.invoke('PanRight', this.streamBoxId);\r\n }\r\n\r\n zoomIn() {\r\n this.connection.invoke('ZoomIn', this.streamBoxId);\r\n }\r\n\r\n zoomOut() {\r\n this.connection.invoke('ZoomOut', this.streamBoxId);\r\n }\r\n\r\n zoomStop() {\r\n this.connection.invoke('ZoomStop', this.streamBoxId);\r\n }\r\n\r\n panStop() {\r\n this.connection.invoke('PanStop', this.streamBoxId);\r\n }\r\n\r\n mute() {\r\n this.connection.invoke('mute', this.streamBoxId);\r\n }\r\n\r\n unmute() {\r\n this.connection.invoke('unmute', this.streamBoxId);\r\n }\r\n\r\n superSource16x9() {\r\n this.connection.invoke('Slides16x9', this.streamBoxId);\r\n }\r\n\r\n superSource4x3() {\r\n this.connection.invoke('Slides4x3', this.streamBoxId);\r\n }\r\n\r\n updateLayoutFromModel() {\r\n if (this.videoCanvas && this.videoCanvas.nativeElement) {\r\n var camera: HTMLElement = this.videoCanvas.nativeElement.querySelector('.OT_Camera');\r\n camera.style.setProperty('width', this.model.cameraWidth + 'px', 'important');\r\n camera.style.setProperty('height', this.model.cameraHeight + 'px', 'important');\r\n camera.style.setProperty('top', this.model.cameraTop + 'px', 'important');\r\n camera.style.setProperty('left', this.model.cameraLeft + 'px', 'important');\r\n camera.style.setProperty('display', this.model.cameraOnAir ? 'block' : 'none', 'important');\r\n\r\n var slides: HTMLElement = this.videoCanvas.nativeElement.querySelector('.OT_Screen');\r\n\r\n slides.style.setProperty('width', this.model.computerWidth + 'px', 'important');\r\n slides.style.setProperty('height', this.model.computerHeight + 'px', 'important');\r\n slides.style.setProperty('top', this.model.computerTop + 'px', 'important');\r\n slides.style.setProperty('left', this.model.computerLeft + 'px', 'important');\r\n slides.style.setProperty('display', this.model.computerOnAir ? 'block' : 'none', 'important');\r\n }\r\n }\r\n\r\n\r\n cameraOnly() {\r\n this.model.cameraWidth = 640;\r\n this.model.cameraHeight = 480;\r\n this.model.cameraTop = 0;\r\n this.model.cameraLeft = 0;\r\n this.model.cameraOnAir = true;\r\n this.model.computerOnAir = false;\r\n this.updateLayoutFromModel();\r\n //this.updateLayout();\r\n }\r\n\r\n // shareBG() {\r\n // const canvas = document.createElement('canvas');\r\n // const canvasContext = canvas.getContext('2d');\r\n // var img = this.background.nativeElement;\r\n\r\n // let self = this;\r\n // let draw = function () {\r\n // canvasContext.drawImage(img, 0, 0, 1280, 720);\r\n // setTimeout(draw, 1000);\r\n // };\r\n\r\n // draw();\r\n\r\n // canvas.width = 1280;\r\n // canvas.height = 720;\r\n\r\n // const canvasStream = canvas.captureStream(5);\r\n // const videoTracks = canvasStream.getVideoTracks();\r\n\r\n // const el = this.renderer.createElement('div');\r\n\r\n // var bgPublishd = OT.initPublisher(el, {\r\n // name: 'BACKGROUND',\r\n // videoSource: videoTracks[0],\r\n // publishAudio: false,\r\n // resolution: '1280x720',\r\n // fitMode: 'contain',\r\n // videoContentHint: 'text',\r\n // frameRate: 1,\r\n // width: 1280,\r\n // height: 720,\r\n // });\r\n\r\n // this.renderer.appendChild(this.videoCanvas.nativeElement, el);\r\n\r\n // this.session.publish(bgPublishd, (err) => {\r\n // if (err) {\r\n // alert(err.message);\r\n // } else {\r\n // //this.screenPublishing = true;\r\n // this.ref.detectChanges();\r\n // }\r\n // });\r\n // }\r\n currentChannelStatus: WowzaChannelViewModel;\r\n\r\n stream() {\r\n this.streamBoxService.startStreaming(this.streamBoxId, this.model).subscribe((result) => {});\r\n }\r\n\r\n stopStream() {\r\n this.toasterService.confirmDialog('Are you sure you want to stop the stream?', 'Are you sure?').subscribe((result) => {\r\n if (result) {\r\n this.streamBoxService.stopStreaming(this.streamBoxId).subscribe((result) => {});\r\n }\r\n });\r\n }\r\n\r\n record() {\r\n this.streamBoxService.startRecording(this.streamBoxId).subscribe((result) => {});\r\n }\r\n\r\n stopRecord() {\r\n this.toasterService.confirmDialog('Are you sure you want to stop recording?', 'Are you sure?').subscribe((result) => {\r\n if (result) {\r\n this.streamBoxService.stopRecording(this.streamBoxId).subscribe((result) => {});\r\n }\r\n });\r\n }\r\n\r\n updateLayout() {\r\n this.streamBoxService.updateLayout(this.streamBoxId, this.model).subscribe((result) => {});\r\n }\r\n\r\n @HostListener('window:resize', ['$event'])\r\n resize(evt) {\r\n this.layout();\r\n }\r\n\r\n InitOpenTok() {\r\n this.ref.detectChanges();\r\n this.layout = initLayoutContainer(this.videoCanvas.nativeElement).layout;\r\n let layout = this.layout;\r\n let self = this;\r\n\r\n this.opentokService\r\n .initsessionForStreamBox(this.streamBoxId)\r\n .then((session: OT.Session) => {\r\n this.session = session;\r\n this.session.on('streamCreated', (event) => {\r\n console.log(event.stream.name);\r\n console.log(event.stream.connection.data);\r\n this.streamCount++;\r\n\r\n let subscription = this.session.subscribe(event.stream, 'videoCanvas', {\r\n insertMode: 'append',\r\n preferredResolution: {\r\n width: 1280,\r\n height: 720\r\n },\r\n style: {nameDisplayMode: 'off'},\r\n });\r\n\r\n if (event.stream.name == 'COMPUTER') {\r\n console.log('adding slides');\r\n subscription.element.classList.add('OT_BG');\r\n }\r\n\r\n if (event.stream.name == 'CAMERA') {\r\n console.log('adding camera');\r\n subscription.element.classList.add('OT_BG');\r\n }\r\n\r\n if (event.stream.name == 'BACKGROUND') {\r\n console.log('adding bg');\r\n subscription.element.classList.add('OT_BG');\r\n }\r\n\r\n subscription.element.addEventListener('dblclick', function () {\r\n if (subscription.element.classList.contains('OT_big')) {\r\n subscription.element.classList.remove('OT_big');\r\n } else {\r\n subscription.element.classList.add('OT_big');\r\n }\r\n });\r\n\r\n layout();\r\n this.ref.detectChanges();\r\n\r\n layout();\r\n\r\n });\r\n this.session.on('streamDestroyed', (event) => {\r\n this.streamCount--;\r\n session.getSubscribersForStream(event.stream).forEach((subscriber) => {\r\n subscriber.element.classList.remove('ot-layout');\r\n });\r\n });\r\n\r\n })\r\n .then(() => {\r\n this.opentokService.connect();\r\n\r\n self.setInitialized();\r\n })\r\n .catch((err) => {\r\n console.error(err);\r\n alert('Unable to connect. Make sure you have updated the config.ts file with your OpenTok details.');\r\n });\r\n }\r\n\r\n setInitialized() {\r\n console.log('connected');\r\n this.openTokInitialized = true;\r\n }\r\n\r\n publishCamera() {\r\n this.ref.detectChanges();\r\n\r\n const OT = this.opentokService.getOT();\r\n const el = this.renderer.createElement('div');\r\n\r\n if (this.selectedCameraDevice) {\r\n this.cameraPublisher = OT.initPublisher(el, {\r\n disableAudioProcessing: true,\r\n publishCaptions: true,\r\n mirror: false,\r\n fitMode: 'contain',\r\n publishAudio: true,\r\n publishVideo: true,\r\n resolution: '1920x1080',\r\n name: 'Streambox' + this.streamBoxId,\r\n width: '100%',\r\n insertDefaultUI: true,\r\n style: {\r\n nameDisplayMode: 'off',\r\n archiveStatusDisplayMode: 'auto',\r\n buttonDisplayMode: 'off'\r\n },\r\n audioSource: this.selectedCameraDevice.audioDeviceId,\r\n videoSource: this.selectedCameraDevice.videoDeviceId\r\n });\r\n } else {\r\n this.cameraPublisher = OT.initPublisher(el, {\r\n disableAudioProcessing: true,\r\n mirror: false,\r\n publishAudio: true,\r\n fitMode: 'contain',\r\n publishVideo: true,\r\n resolution: '1920x1080',\r\n name: 'Streambox' + this.streamBoxId,\r\n width: '100%',\r\n insertDefaultUI: true,\r\n style: {\r\n nameDisplayMode: 'off',\r\n archiveStatusDisplayMode: 'auto',\r\n buttonDisplayMode: 'off'\r\n }\r\n });\r\n }\r\n let layout = this.layout;\r\n\r\n //el.classList.add('OT_Camera');\r\n\r\n this.renderer.appendChild(this.videoCanvas.nativeElement, el);\r\n layout();\r\n this.cameraPublisher.on(\r\n 'audioLevelUpdated',\r\n function (event) {\r\n if (this.movingAvg == null || this.movingAvg <= event.audioLevel) {\r\n this.movingAvg = event.audioLevel;\r\n } else {\r\n this.movingAvg = 0.7 * this.movingAvg + 0.3 * event.audioLevel;\r\n }\r\n\r\n // 1.5 scaling to map the -30 - 0 dBm range to [0,1]\r\n this.audioLevel = Math.log(this.movingAvg) / Math.LN10 / 1.5 + 1;\r\n this.audioLevel = Math.min(Math.max(this.audioLevel, 0), 1);\r\n this.soundBar.nativeElement.style.height = `${this.audioLevel * 100}%`;\r\n },\r\n this\r\n );\r\n\r\n this.session.publish(this.cameraPublisher, (err) => {\r\n if (err) {\r\n alert(err.message);\r\n } else {\r\n this.cameraPublishing = true;\r\n this.cameraOnly();\r\n this.layout();\r\n this.ref.detectChanges();\r\n this.layout();\r\n this.ref.detectChanges();\r\n }\r\n });\r\n }\r\n\r\n cameraDeviceSettings() {\r\n const modalRef = this.modalService.open(CameraTestModalComponent, {\r\n size: 'lg',\r\n backdrop: 'static',\r\n ariaLabelledBy: 'modal-basic-title'\r\n });\r\n if (this.selectedCameraDevice) {\r\n console.log(this.selectedCameraDevice);\r\n modalRef.componentInstance.selectedDevice = this.selectedCameraDevice;\r\n }\r\n modalRef.result.then(\r\n (result) => {\r\n this.selectedCameraDevice = result;\r\n localStorage.setItem('cameraDevice', JSON.stringify(this.selectedCameraDevice));\r\n\r\n if (this.cameraPublisher) {\r\n this.cameraPublisher.setVideoSource(this.selectedCameraDevice.videoDeviceId);\r\n this.cameraPublisher.setAudioSource(this.selectedCameraDevice.audioDeviceId);\r\n }\r\n },\r\n (reason) => {}\r\n );\r\n return;\r\n }\r\n\r\n @HostListener('window:resize', ['$event'])\r\n onResize(event) {\r\n this.layout();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.connection) {\r\n this.connection.stop();\r\n }\r\n\r\n if (this.cameraPublisher) {\r\n this.cameraPublisher.destroy();\r\n }\r\n\r\n if (this.screenPublisher) {\r\n this.screenPublisher.destroy();\r\n }\r\n\r\n if (this.session) {\r\n this.session.disconnect();\r\n }\r\n\r\n this.checker.unsubscribe();\r\n\r\n }\r\n\r\n public resetCameras() {\r\n localStorage.removeItem('cameraDevice');\r\n localStorage.removeItem('screenDevice');\r\n }\r\n\r\n\r\n public startChannel() {\r\n this.superUser.startChannel('Channel' + this.streamBoxId).subscribe(result => {this.getData()});\r\n\r\n }\r\n\r\n private getData() {\r\n this.superUser.getChannels().subscribe(data => {\r\n this.currentChannelStatus = data.find(x => x.name == 'Channel' + this.streamBoxId);\r\n });\r\n }\r\n\r\n WowzaState = WowzaState;\r\n WowzaStateEnum = Enums.WowzaStateEnum;\r\n StrWowzaStateEnum = StrWowzaStateEnum;\r\n\r\n public updateRoomForBox() {\r\n console.log('updating room' + this.selectedRoom);\r\n this.streamBoxService.updateChannelForStreambox(this.streamBoxId, this.selectedRoom).subscribe(result => {\r\n this.toasterService.success('Room updated');\r\n });\r\n }\r\n}\r\n","\r\n\r\n\r\n \r\n\r\n","import { ChangeDetectorRef, Component, ElementRef, HostListener, OnInit, Renderer2, ViewChild } from '@angular/core';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { NgbModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport { of } from 'rxjs';\r\nimport { delay, map } from 'rxjs/operators';\r\nimport { LiveEventViewModel } from 'src/app/_models/generatedModels';\r\nimport { SelectedDevice } from 'src/app/_models/models';\r\nimport { EventService, LiveEventService } from 'src/app/_services/generatedServices';\r\nimport { OpentokService } from 'src/app/_services/opentok.service';\r\nimport { ToasterService } from 'src/app/_services/toaster.service';\r\nimport { CameraTestModalComponent } from '../camera-test/camera-test-modal.component';\r\ndeclare var zE: any;\r\nconst initLayoutContainer = require('opentok-layout-js');\r\n\r\n@Component({\r\n selector: 'bxl-live-event-room-view',\r\n templateUrl: 'live-event-room-view.component.html',\r\n})\r\nexport class LiveEventRoomViewComponent implements OnInit {\r\n initialized = false;\r\n session: OT.Session;\r\n public eventIdOrSlug: any;\r\n event: LiveEventViewModel;\r\n public isFullScreen: boolean;\r\n public selectedScreenDevice: SelectedDevice;\r\n @ViewChild('fullscreenContainer') fullscreenContainer: ElementRef;\r\n @ViewChild('webRTCLayoutContainer') webRTCLayoutContainer: ElementRef;\r\n layout: any;\r\n openTokInitialized: boolean;\r\n streamCount: number;\r\n screenPublisher: OT.Publisher;\r\n\r\n constructor(private route: ActivatedRoute, private router: Router, private modalService: NgbModal, private eventData: EventService, private renderer: Renderer2, private ref: ChangeDetectorRef, private opentokService: OpentokService, private liveEventService: LiveEventService, private toaster: ToasterService) {}\r\n\r\n ngOnInit(): void {\r\n this.route.paramMap.subscribe((params) => {\r\n this.eventIdOrSlug = params.get('id');\r\n\r\n this.eventData.getLiveEvent(this.eventIdOrSlug).subscribe((event) => {\r\n this.event = event;\r\n\r\n this.initialized = true;\r\n this.InitOpenTok();\r\n this.loadZendesk();\r\n });\r\n });\r\n }\r\n\r\n shareSlides() {\r\n const OT = this.opentokService.getOT();\r\n const el = this.renderer.createElement('div');\r\n\r\n if (this.selectedScreenDevice) {\r\n this.screenPublisher = OT.initPublisher(el, { mirror: false, publishAudio: false, fitMode: 'contain', publishVideo: true, resolution: '1280x720', name: 'COMPUTER', width: '100%', insertDefaultUI: true, style: { nameDisplayMode: 'off', archiveStatusDisplayMode: 'auto', buttonDisplayMode: 'off' }, audioSource: this.selectedScreenDevice.audioDeviceId, videoSource: this.selectedScreenDevice.videoDeviceId });\r\n } else {\r\n this.screenPublisher = OT.initPublisher(el, { mirror: false, publishAudio: false, fitMode: 'contain', publishVideo: true, resolution: '1280x720', name: 'COMPUTER', width: '100%', insertDefaultUI: true, style: { nameDisplayMode: 'off', archiveStatusDisplayMode: 'auto', buttonDisplayMode: 'off' } });\r\n }\r\n el.classList.add('OT_big');\r\n this.renderer.appendChild(this.webRTCLayoutContainer.nativeElement, el);\r\n\r\n this.layout();\r\n }\r\n\r\n stopSharing(){\r\n this.screenPublisher.destroy();\r\n this.screenPublisher = null;\r\n this.layout();\r\n }\r\n\r\n showDeviceSettings() {\r\n const modalRef = this.modalService.open(CameraTestModalComponent, { size: 'lg', backdrop: 'static', ariaLabelledBy: 'modal-basic-title' });\r\n if (this.selectedScreenDevice) {\r\n console.log(this.selectedScreenDevice);\r\n modalRef.componentInstance.selectedDevice = this.selectedScreenDevice;\r\n }\r\n modalRef.result.then(\r\n (result) => {\r\n this.selectedScreenDevice = result;\r\n\r\n if (this.screenPublisher) {\r\n this.screenPublisher.setAudioSource(this.selectedScreenDevice.audioDeviceId);\r\n this.screenPublisher.setVideoSource(this.selectedScreenDevice.videoDeviceId);\r\n }\r\n },\r\n (reason) => {}\r\n );\r\n return;\r\n }\r\n\r\n loadZendesk() {\r\n zE('webWidget', 'hide');\r\n zE('webWidget:on', 'close', () => {\r\n zE('webWidget', 'hide');\r\n });\r\n\r\n zE('webWidget:on', 'chat:unreadMessages', () => {\r\n zE('webWidget', 'show');\r\n zE('webWidget', 'open');\r\n });\r\n }\r\n\r\n InitOpenTok() {\r\n this.ref.detectChanges();\r\n this.layout = initLayoutContainer(this.webRTCLayoutContainer.nativeElement).layout;\r\n let layout = this.layout;\r\n\r\n if (this.openTokInitialized) {\r\n return;\r\n }\r\n\r\n console.log('initializing opentok');\r\n this.opentokService\r\n .initSessionForEvents(this.event.id)\r\n .then((session: OT.Session) => {\r\n this.session = session;\r\n\r\n this.session.on('streamPropertyChanged', (event) => {\r\n console.log('changed');\r\n console.log(event.stream.streamId);\r\n });\r\n\r\n this.session.on('streamCreated', (event) => {\r\n if (event.stream.name === 'ATEM') {\r\n return;\r\n }\r\n\r\n console.log(event.stream.name);\r\n console.log(event.stream.connection.data);\r\n this.streamCount++;\r\n\r\n var style: any = { nameDisplayMode: 'off' };\r\n\r\n if (event.stream.name.includes('ATTENDEE:')) {\r\n style = { nameDisplayMode: 'on' };\r\n event.stream.name = event.stream.name.replace('ATTENDEE:', '');\r\n }\r\n\r\n let subscription = this.session.subscribe(event.stream, 'webRTCLayoutContainer', {\r\n insertMode: 'append',\r\n style: style,\r\n });\r\n\r\n if (subscription.stream.videoType === 'screen') {\r\n subscription.element.classList.add('OT_screen');\r\n subscription.element.classList.add('OT_big');\r\n }\r\n\r\n if (subscription.stream.name === 'video-sm') {\r\n subscription.element.classList.add('OT_big');\r\n subscription.element.classList.add('OT_video');\r\n }\r\n\r\n if (subscription.stream.name === 'video') {\r\n subscription.element.classList.add('OT_ignore');\r\n }\r\n\r\n subscription.element.addEventListener('dblclick', function () {\r\n if (subscription.element.classList.contains('OT_big')) {\r\n subscription.element.classList.remove('OT_big');\r\n } else {\r\n subscription.element.classList.add('OT_big');\r\n }\r\n layout();\r\n });\r\n layout();\r\n this.ref.detectChanges();\r\n\r\n layout();\r\n });\r\n\r\n this.session.on('streamDestroyed', (event) => {\r\n this.streamCount--;\r\n session.getSubscribersForStream(event.stream).forEach((subscriber) => {\r\n subscriber.element.classList.remove('ot-layout');\r\n\r\n setTimeout(() => {\r\n layout();\r\n }, 200);\r\n });\r\n layout();\r\n this.ref.detectChanges();\r\n\r\n layout();\r\n });\r\n })\r\n .then(() => {\r\n this.opentokService.connect();\r\n this.openTokInitialized = true;\r\n })\r\n .catch((err) => {\r\n console.error(err);\r\n alert('Unable to connect.');\r\n });\r\n }\r\n\r\n exitPage() {\r\n this.router.navigate(['/super-user/events']);\r\n return;\r\n }\r\n\r\n fullscreen() {\r\n let elem = this.fullscreenContainer.nativeElement;\r\n let doc = document;\r\n if (!this.isFullScreen) {\r\n if (elem.requestFullscreen) {\r\n elem.requestFullscreen();\r\n } else if (elem.mozRequestFullScreen) {\r\n /* Firefox */\r\n elem.mozRequestFullScreen();\r\n } else if (elem.webkitRequestFullscreen) {\r\n /* Chrome, Safari and Opera */\r\n elem.webkitRequestFullscreen();\r\n } else if (elem.msRequestFullscreen) {\r\n /* IE/Edge */\r\n elem.msRequestFullscreen();\r\n }\r\n\r\n elem.classList.add('fullscreen');\r\n of(null)\r\n .pipe(delay(500))\r\n .subscribe((result) => {\r\n this.isFullScreen = true;\r\n if (this.layout) {\r\n this.layout();\r\n }\r\n });\r\n } else {\r\n if (document.exitFullscreen) {\r\n doc.exitFullscreen();\r\n } else if (doc.mozCancelFullScreen) {\r\n /* Firefox */\r\n doc.mozCancelFullScreen();\r\n } else if (doc.webkitExitFullscreen) {\r\n /* Chrome, Safari and Opera */\r\n doc.webkitExitFullscreen();\r\n } else if (doc.msExitFullscreen) {\r\n /* IE/Edge */\r\n doc.msExitFullscreen();\r\n }\r\n console.log('exit fullscreen');\r\n elem.classList.remove('fullscreen');\r\n of(null)\r\n .pipe(delay(500))\r\n .subscribe((result) => {\r\n this.isFullScreen = false;\r\n if (this.layout) {\r\n this.layout();\r\n }\r\n });\r\n }\r\n }\r\n\r\n @HostListener('window:resize', ['$event'])\r\n chatResized(event) {\r\n if (this.layout) {\r\n this.layout();\r\n }\r\n }\r\n\r\n @HostListener('document:fullscreenchange', ['$event'])\r\n @HostListener('document:webkitfullscreenchange', ['$event'])\r\n @HostListener('document:mozfullscreenchange', ['$event'])\r\n @HostListener('document:MSFullscreenChange', ['$event'])\r\n exit(ev) {\r\n if (this.isFullScreen) {\r\n of(null)\r\n .pipe(delay(1000))\r\n .subscribe((result) => {\r\n let elem = this.fullscreenContainer.nativeElement;\r\n this.isFullScreen = false;\r\n console.log('exiting');\r\n elem.classList.remove('fullscreen');\r\n if (this.layout) {\r\n this.layout();\r\n }\r\n });\r\n }\r\n }\r\n}\r\n","\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
 
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n","import { ChangeDetectorRef, Component, ElementRef, HostListener, OnInit, Renderer2, ViewChild } from '@angular/core';\r\nimport { ActivatedRoute } from '@angular/router';\r\nimport { HubConnectionBuilder } from '@microsoft/signalr';\r\nimport { NgbModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport Enumerable from 'linq';\r\nimport { of } from 'rxjs';\r\nimport { delay, map } from 'rxjs/operators';\r\n\r\nimport { CameraTestModalComponent } from 'src/app/events/live/camera-test/camera-test-modal.component';\r\nimport { DefaultReconnectPolicy } from 'src/app/_helpers/signalR-retry-policy';\r\nimport { ConferenceRoomViewModel, GetStreamboxStateViewModel, StreamBoxStateViewModel } from 'src/app/_models/generatedModels';\r\nimport { EventRole, SelectedDevice } from 'src/app/_models/models';\r\nimport { AuthenticationService } from 'src/app/_services/authentication.service';\r\nimport { AdminConferenceSettingsService, OrganizationService, StreamBoxService } from 'src/app/_services/generatedServices';\r\nimport { OpentokService } from 'src/app/_services/opentok.service';\r\n\r\ndeclare var zE: any;\r\nconst initLayoutContainer = require('opentok-layout-js');\r\n\r\n@Component({\r\n selector: 'bxl-streambox-multiview.component',\r\n templateUrl: 'streambox-multiview.component.html',\r\n})\r\nexport class StreamboxMultiView implements OnInit {\r\n initialized = false;\r\n public selectedDevice: SelectedDevice;\r\n publisher: OT.Publisher;\r\n layout: any;\r\n @ViewChild('webRTCLayoutContainer') webRTCLayoutContainer: ElementRef;\r\n openTokInitialized: boolean;\r\n publishing: boolean;\r\n selectedBoxes: number[];\r\n rooms: ConferenceRoomViewModel[];\r\n streamBoxId: number;\r\n connection: any;\r\n streamboxes: StreamBoxStateViewModel[];\r\n selectedBox: StreamBoxStateViewModel;\r\n\r\n constructor(private modalService: NgbModal, private streamboxService: StreamBoxService, private route: ActivatedRoute, private auth: AuthenticationService, private admin: OrganizationService, private renderer: Renderer2, private ref: ChangeDetectorRef, private opentokService: OpentokService) {}\r\n\r\n ngOnInit(): void {\r\n document.body.style.backgroundColor = '#333';\r\n zE('webWidget', 'hide');\r\n\r\n this.route.paramMap.subscribe((params) => {\r\n this.route.queryParamMap.subscribe((queryParam) => {\r\n let query = queryParam.get('ids');\r\n var eventIds = query.split(',');\r\n console.log('EventIds: ' + eventIds);\r\n this.selectedBoxes = Enumerable.from(eventIds)\r\n .select((x) => parseInt(x))\r\n .toArray();\r\n\r\n var conferenceId = +params.get('conferenceId');\r\n this.admin.getRoomsForConference(conferenceId.toString()).subscribe((result) => {\r\n this.rooms = result;\r\n });\r\n\r\n var model = new GetStreamboxStateViewModel();\r\n model.ids = this.selectedBoxes;\r\n this.streamboxService.getState(model).subscribe((result) => {\r\n this.streamboxes = result;\r\n });\r\n\r\n of(null)\r\n .pipe(delay(2000))\r\n .subscribe((result) => {\r\n this.InitOpenTok();\r\n });\r\n\r\n this.InitSignalR();\r\n this.initialized = true;\r\n });\r\n });\r\n }\r\n\r\n InitSignalR(): any {\r\n this.connection = new HubConnectionBuilder()\r\n .withUrl('/streamBoxHub', {accessTokenFactory: () => this.auth.getToken()})\r\n .withAutomaticReconnect(new DefaultReconnectPolicy())\r\n .build();\r\n\r\n this.connection.start().then(() => {});\r\n\r\n this.connection.on('PanUp', (id) => {\r\n console.log('Pan up' + id);\r\n });\r\n\r\n this.connection.on('StateUpdated', (id: number, state: StreamBoxStateViewModel) => {\r\n console.log('State updated');\r\n console.log(state);\r\n var index = this.streamboxes.findIndex((x) => x.id == id);\r\n this.streamboxes[index] = state;\r\n\r\n if (this.selectedBox.id == id){\r\n this.selectedBox = this.streamboxes[index];\r\n }\r\n\r\n });\r\n\r\n this.initialized = true;\r\n }\r\n\r\n panUp() {\r\n console.log(this.streamBoxId);\r\n this.connection.invoke('PanUp', this.streamBoxId);\r\n }\r\n\r\n panDown() {\r\n this.connection.invoke('PanDown', this.streamBoxId);\r\n }\r\n\r\n panLeft() {\r\n this.connection.invoke('PanLeft', this.streamBoxId);\r\n }\r\n\r\n panRight() {\r\n this.connection.invoke('PanRight', this.streamBoxId);\r\n }\r\n\r\n zoomIn() {\r\n this.connection.invoke('ZoomIn', this.streamBoxId);\r\n }\r\n\r\n zoomOut() {\r\n this.connection.invoke('ZoomOut', this.streamBoxId);\r\n }\r\n\r\n zoomStop() {\r\n this.connection.invoke('ZoomStop', this.streamBoxId);\r\n }\r\n\r\n panStop() {\r\n this.connection.invoke('PanStop', this.streamBoxId);\r\n }\r\n\r\n mute() {\r\n this.connection.invoke('mute', this.streamBoxId);\r\n }\r\n\r\n unmute() {\r\n this.connection.invoke('unmute', this.streamBoxId);\r\n }\r\n\r\n startRecord() {\r\n this.connection.invoke('startRecord', this.streamBoxId);\r\n }\r\n\r\n stopRecord() {\r\n this.connection.invoke('stopRecord', this.streamBoxId);\r\n }\r\n\r\n public stopStreaming() {\r\n this.connection.invoke('stopStreaming', this.streamBoxId);\r\n }\r\n\r\n public startStreaming() {\r\n this.connection.invoke('startStreaming', this.streamBoxId);\r\n\r\n }\r\n\r\n superSource16x9() {\r\n this.connection.invoke(\"Macro\", this.streamBoxId, 1);\r\n }\r\n\r\n superSource4x3() {\r\n this.connection.invoke('Macro', this.streamBoxId, 0);\r\n }\r\n\r\n panelLayout() {\r\n this.connection.invoke('Macro', this.streamBoxId, 2);\r\n }\r\n\r\n setProgram(input: number) {\r\n this.connection.invoke('setProgram', this.streamBoxId, input);\r\n }\r\n\r\n public startStreamMacro() {\r\n this.connection.invoke('setProgram', this.streamBoxId, 6000);\r\n this.connection.invoke('UnmuteInput', this.streamBoxId, 1301);\r\n this.connection.invoke('UnmuteInput', this.streamBoxId, 1302);\r\n this.connection.invoke('MuteInput', this.streamBoxId, 8);\r\n }\r\n\r\n public stopStreamMacro() {\r\n this.connection.invoke('setProgram', this.streamBoxId, 3020);\r\n this.connection.invoke('MuteInput', this.streamBoxId, 1301);\r\n this.connection.invoke('MuteInput', this.streamBoxId, 1302);\r\n this.connection.invoke('UnmuteInput', this.streamBoxId, 8);\r\n }\r\n\r\n public toggleMute(number: number, currentMuteState: boolean) {\r\n if (!currentMuteState) {\r\n console.log('Unmute');\r\n this.connection.invoke('UnmuteInput', this.streamBoxId, number);\r\n }else{\r\n console.log('Mute');\r\n this.connection.invoke('MuteInput', this.streamBoxId, number);\r\n\r\n }\r\n }\r\n\r\n setSelected(streamBoxName: string) {\r\n console.log(streamBoxName);\r\n var screensOrVideos = this.webRTCLayoutContainer.nativeElement.querySelectorAll('.OT_subscriber');\r\n var selected = this.webRTCLayoutContainer.nativeElement.querySelectorAll('.' + streamBoxName);\r\n\r\n console.log(screensOrVideos);\r\n screensOrVideos.forEach((element) => {\r\n element.classList.remove('OT_selected');\r\n });\r\n\r\n selected.forEach((element) => {\r\n element.classList.add('OT_selected');\r\n });\r\n\r\n this.streamBoxId = +streamBoxName.replace('Streambox', '');\r\n console.log(this.streamBoxId);\r\n this.selectedBox = Enumerable.from(this.streamboxes).firstOrDefault((x) => x.id == this.streamBoxId);\r\n }\r\n\r\n InitOpenTok() {\r\n this.ref.detectChanges();\r\n this.layout = initLayoutContainer(this.webRTCLayoutContainer.nativeElement).layout;\r\n let layout = this.layout;\r\n let base = this;\r\n\r\n // var ids = [9, 10, 13, 14];\r\n\r\n this.selectedBoxes.forEach((boxId) => {\r\n this.opentokService\r\n .initsessionForStreamBox(boxId)\r\n .then((session: OT.Session) => {\r\n session.on('streamCreated', (event) => {\r\n console.log(event.stream.name);\r\n console.log(event.stream.connection.data);\r\n\r\n var streamBoxName = event.stream.name;\r\n\r\n var roomName = Enumerable.from(this.rooms).firstOrDefault((x) => x.channel?.replace('Channel', '') == event.stream.name?.replace('Streambox', ''));\r\n event.stream.name = event.stream.name + ' - ' + roomName?.roomName;\r\n\r\n let subscription = session.subscribe(event.stream, 'webRTCLayoutContainer', {\r\n insertMode: 'append',\r\n fitMode: 'contain',\r\n subscribeToAudio: false,\r\n preferredResolution: {\r\n width: 1280,\r\n height: 720\r\n },\r\n style: {nameDisplayMode: 'on'},\r\n });\r\n\r\n subscription.element.addEventListener('dblclick', function () {\r\n if (subscription.element.classList.contains('OT_big')) {\r\n subscription.element.classList.remove('OT_big');\r\n } else {\r\n subscription.element.classList.add('OT_big');\r\n }\r\n layout();\r\n });\r\n\r\n subscription.element.classList.add(streamBoxName);\r\n\r\n subscription.element.addEventListener('click', function () {\r\n base.setSelected(streamBoxName);\r\n });\r\n\r\n layout();\r\n this.ref.detectChanges();\r\n\r\n layout();\r\n });\r\n })\r\n .then(() => {\r\n this.opentokService.connect().then(() => {\r\n this.openTokInitialized = true;\r\n console.log('conected');\r\n });\r\n })\r\n .catch((err) => {\r\n console.error(err);\r\n alert('Unable to connect.');\r\n });\r\n });\r\n }\r\n\r\n disconnect() {\r\n if (this.publisher) {\r\n //this.session.unpublish(this.publisher);\r\n }\r\n\r\n this.publishing = false;\r\n this.layout();\r\n }\r\n\r\n @HostListener('window:resize', ['$event'])\r\n onResize(event) {\r\n this.layout();\r\n }\r\n\r\n // connect() {\r\n // const OT = this.opentokService.getOT();\r\n // const el = this.renderer.createElement('div');\r\n\r\n // if (this.selectedDevice) {\r\n // this.publisher = OT.initPublisher(el, { publishAudio: true, publishVideo: true, mirror: false, resolution: '1280x720', name: 'Streamcase1', fitMode: 'contain', width: '100%', insertDefaultUI: true, style: { nameDisplayMode: 'on', archiveStatusDisplayMode: 'off', buttonDisplayMode: 'off' }, audioSource: this.selectedDevice.audioDeviceId, videoSource: this.selectedDevice.videoDeviceId });\r\n // } else {\r\n // this.publisher = OT.initPublisher(el, { publishAudio: true, publishVideo: true, mirror: false, resolution: '1280x720', name: 'Streamcase1', fitMode: 'contain', width: '100%', insertDefaultUI: true, style: { nameDisplayMode: 'on', archiveStatusDisplayMode: 'off', buttonDisplayMode: 'off' } });\r\n // }\r\n\r\n // let layout = this.layout;\r\n // el.addEventListener('dblclick', function () {\r\n // if (el.classList.contains('OT_big')) {\r\n // el.classList.remove('OT_big');\r\n // } else {\r\n // el.classList.add('OT_big');\r\n // }\r\n // layout();\r\n // });\r\n\r\n // this.renderer.appendChild(this.webRTCLayoutContainer.nativeElement, el);\r\n // layout();\r\n\r\n // this.session.publish(this.publisher, (err) => {\r\n // if (err) {\r\n // alert(err.message);\r\n // this.layout();\r\n // } else {\r\n // this.publishing = true;\r\n // this.layout();\r\n // this.ref.detectChanges();\r\n // this.layout();\r\n // }\r\n // });\r\n //}\r\n\r\n exitPage() {}\r\n\r\n showDeviceSettings() {\r\n const modalRef = this.modalService.open(CameraTestModalComponent, {\r\n size: 'lg',\r\n backdrop: 'static',\r\n ariaLabelledBy: 'modal-basic-title'\r\n });\r\n if (this.selectedDevice) {\r\n console.log(this.selectedDevice);\r\n modalRef.componentInstance.selectedDevice = this.selectedDevice;\r\n }\r\n modalRef.result.then(\r\n (result) => {\r\n this.selectedDevice = result;\r\n\r\n if (this.publisher) {\r\n this.publisher.setAudioSource(this.selectedDevice.audioDeviceId);\r\n this.publisher.setVideoSource(this.selectedDevice.videoDeviceId);\r\n }\r\n },\r\n (reason) => {}\r\n );\r\n return;\r\n }\r\n\r\n protected readonly EventRole = EventRole;\r\n\r\n\r\n\r\n}\r\n","import { Component, OnInit, Input, Renderer2 } from '@angular/core';\r\nimport { StreamboxViewModel } from \"../../_models/generatedModels\";\r\nimport { OpentokService } from \"../../_services/opentok.service\";\r\nimport { StreamBoxService } from \"../../_services/generatedServices\";\r\n\r\n@Component({\r\n selector: 'bxl-caption-box',\r\n template: `\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n `,\r\n})\r\nexport class CaptionBoxComponent implements OnInit {\r\n initialized = false;\r\n\r\n @Input() audioInputs: OT.Device[];\r\n @Input() box: StreamboxViewModel;\r\n private session: OT.Session;\r\n publishing: boolean;\r\n private publisher: OT.Publisher;\r\n\r\n constructor(private opentokService: OpentokService, private streamBoxService: StreamBoxService, private renderer: Renderer2) { }\r\n\r\n stopCaptionsChannel() {\r\n if (this.publisher) {\r\n this.session.unpublish(this.publisher);\r\n }\r\n this.publishing = false;\r\n this.streamBoxService.stopCaptions(this.box.id).subscribe();\r\n }\r\n\r\n startCaptionsChannel() {\r\n const OT = this.opentokService.getOT();\r\n const el = this.renderer.createElement('div');\r\n this.publisher = OT.initPublisher(el, {\r\n publishAudio: true,\r\n audioSource: this.box.selectedDevice,\r\n publishVideo: false,\r\n publishCaptions: true\r\n });\r\n\r\n this.session.publish(this.publisher, (err) => {\r\n if (err) {\r\n alert(err.message);\r\n } else {\r\n this.publishing = true;\r\n this.streamBoxService.startCaptions(this.box.id).subscribe();\r\n console.log('Publisher started');\r\n }\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n this.InitOpenTok();\r\n this.initialized = true;\r\n }\r\n\r\n private InitOpenTok() {\r\n this.opentokService\r\n .initsessionForStreamBoxCaptions(this.box.id)\r\n .then((session: OT.Session) => {\r\n this.session = session;\r\n // this.session.on('streamCreated', (event) => {\r\n // console.log(event.stream.name);\r\n // console.log(event.stream.connection.data);\r\n //\r\n // let subscription = this.session.subscribe(event.stream, 'videoCanvas', {\r\n // insertMode: 'append',\r\n // subscribeToAudio: false,\r\n // subscribeToVideo: false,\r\n // preferredResolution: {\r\n // width: 1280,\r\n // height: 720\r\n // },\r\n // style: {nameDisplayMode: 'off'},\r\n // });\r\n // //subscription.element.hidden = true;\r\n //\r\n // // subscription.subscribeToCaptions(true);\r\n // // subscription.on('captionReceived', function (event) {\r\n // // console.log(`Caption received for stream ${event.streamId}`);\r\n // // console.log(`Caption text: ${event.caption}`);\r\n // // console.log(`Final text: ${event.isFinal}`);\r\n // // })\r\n // });\r\n\r\n }).then(() => this.opentokService.connect())\r\n .catch((err) => {\r\n console.error(err);\r\n alert('Unable to connect. Make sure you have updated the config.ts file with your OpenTok details.');\r\n });\r\n }\r\n}\r\n","\r\n\r\n

Closed Captions Servers

\r\n
\r\n \r\n \r\n \r\n\r\n
\r\n","import { Component, OnInit, Renderer2 } from '@angular/core';\r\nimport { OpentokService } from \"../../_services/opentok.service\";\r\nimport { OrganizationService, StreamBoxService } from \"../../_services/generatedServices\";\r\nimport { StreamboxViewModel } from \"../../_models/generatedModels\";\r\n\r\n@Component({\r\n selector: 'bxl-caption-server',\r\n templateUrl: 'caption-server.component.html',\r\n})\r\nexport class CaptionServerComponent implements OnInit {\r\n initialized = false;\r\n audioInputs: OT.Device[];\r\n videoInputs: OT.Device[];\r\n session: OT.Session;\r\n\r\n public channel1Device: string;\r\n public channel2Device: string;\r\n public channel3Device: string;\r\n public channel4Device: string;\r\n public channel5Device: string;\r\n public channel6Device: string;\r\n public channel7Device: string;\r\n public channel8Device: string;\r\n public channel9Device: string;\r\n public channel10Device: string;\r\n public channel11Device: string;\r\n public channel12Device: string;\r\n public channel13Device: string;\r\n public channel14Device: string;\r\n public channel15Device: string;\r\n public channel16Device: string;\r\n public channel17Device: string;\r\n streamboxes: StreamboxViewModel[];\r\n\r\n constructor(private opentokService: OpentokService, private streamboxService: StreamBoxService, private renderer: Renderer2) { }\r\n\r\n ngOnInit(): void {\r\n this.getDeviceList();\r\n\r\n\r\n this.streamboxService.getAllStreamboxes().subscribe(boxes => {\r\n // this.streamboxService.startCaptions(2).subscribe((result) => {\r\n this.streamboxes = boxes;\r\n this.initialized = true;\r\n // });\r\n });\r\n }\r\n\r\n\r\n getDeviceList() {\r\n console.log('device list');\r\n let currentIndex = 0;\r\n OT.getDevices((err, devices) => {\r\n this.audioInputs = devices.filter((device) => device.kind === 'audioInput');\r\n this.videoInputs = devices.filter((device) => device.kind === 'videoInput');\r\n });\r\n }\r\n\r\n\r\n\r\n\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { RouterModule } from '@angular/router';\r\nimport { NgbModalModule } from '@ng-bootstrap/ng-bootstrap';\r\nimport { MulitViewerComponent } from './superUser/events/multi-view/mulit-viewer.component';\r\nimport { MultiViewVideoComponent } from './superUser/events/multi-view/multi-vew-video/multi-view-video.component';\r\nimport { IsAuthenticatedGuard } from './_guards/isAuthenticated.gaurd';\r\nimport { ApplicationPipesModule } from './_shared/modules/application-pipes.module';\r\nimport { CeuTokensComponent } from './events/live/ceu-tokens/ceu-tokens.component';\r\nimport { LiveEventChatComponent } from './events/live/chat/live-event-chat.component';\r\nimport { LiveEventDashboardComponent } from './events/live/live-event-dashboard/live-event-dashboard.component';\r\nimport { SuggestMobileAppModalCsComponent } from './events/live/live-event-dashboard/suggest-mobile-app-modal-cs.component';\r\nimport { EventMaterialsComponent } from './events/live/materials/event-materials.component';\r\nimport { LivePeopleComponent } from './events/live/people/live-people.component';\r\nimport { EditPollComponent } from './events/live/polls/edit-poll.component';\r\nimport { LivePollsComponent } from './events/live/polls/live-polls.component';\r\nimport { PresenterViewComponent } from './events/live/presenter-view/presenter-view.component';\r\nimport { TechnicalSupportComponent } from './events/live/technical-support.component';\r\nimport { LiveQuestionsComponent } from './events/live/questions/live-questions.component';\r\nimport { LiveSuperuserComponent } from './events/live/super-user/live-superuser.component';\r\nimport { LiveTipsComponent } from './events/live/tips/live-tips.component';\r\nimport { LiveVideosComponent } from './events/live/videos/live-videos.component';\r\nimport { ChatEventLinkComponent } from './events/live/chat/chat-event-link.component';\r\nimport { StreamBoxComponent } from './superUser/streambox/stream-box.component';\r\nimport { ChartsModule } from '@progress/kendo-angular-charts';\r\nimport 'hammerjs';\r\nimport { LiveEventRoomViewComponent } from './events/live/room-view/live-event-room-view.component';\r\nimport { StreamboxMultiView } from './superUser/streamcase/streambox-multiview.component';\r\nimport { CaptionServerComponent } from \"./superUser/events/caption-server.component\";\r\nimport { CaptionBoxComponent } from \"./superUser/events/caption-box.component\";\r\nimport { CaptionsDisplayComponent } from \"./events/captions-display.component\";\r\n\r\n@NgModule({\r\n declarations:[\r\n PresenterViewComponent,\r\n LiveEventDashboardComponent,\r\n MulitViewerComponent,\r\n LiveQuestionsComponent,\r\n TechnicalSupportComponent,\r\n LiveTipsComponent,\r\n LivePollsComponent,\r\n EventMaterialsComponent,\r\n EditPollComponent,\r\n CeuTokensComponent,\r\n LiveEventChatComponent,\r\n LivePeopleComponent,\r\n LiveVideosComponent,\r\n LiveSuperuserComponent,\r\n ChatEventLinkComponent,\r\n CaptionServerComponent,\r\n LiveEventRoomViewComponent,\r\n MultiViewVideoComponent,\r\n StreamboxMultiView,\r\n SuggestMobileAppModalCsComponent,\r\n StreamBoxComponent,\r\n CaptionBoxComponent,\r\n CaptionsDisplayComponent\r\n ],\r\n entryComponents:[\r\n SuggestMobileAppModalCsComponent,\r\n ],\r\n imports: [\r\n NgbModalModule,\r\n ChartsModule,\r\n ApplicationPipesModule.forRoot(),\r\n RouterModule.forChild([\r\n { path: ':id/presenterview', component: PresenterViewComponent, canActivate: [IsAuthenticatedGuard] },\r\n { path: ':id/live', component: LiveEventDashboardComponent, canActivate: [IsAuthenticatedGuard] },\r\n { path: ':id/presenter-dashboard', component: LiveEventDashboardComponent, canActivate: [IsAuthenticatedGuard] },\r\n { path: ':id/room-view', component: LiveEventRoomViewComponent, canActivate: [IsAuthenticatedGuard] },\r\n { path: 'multi-viewer', component: MulitViewerComponent, canActivate: [IsAuthenticatedGuard], data:{title:'Event Multi-viewer'} },\r\n { path: 'streambox/:id', component: StreamBoxComponent, data:{title:'StreamBox'} },\r\n { path: 'streamcase/:conferenceId', component: StreamboxMultiView, canActivate: [IsAuthenticatedGuard], data:{title:'Multiviewer'} },\r\n { path: 'caption-server', component: CaptionServerComponent, canActivate: [IsAuthenticatedGuard], data:{title:'StreamCase'} },\r\n { path: ':conferenceSlug/caption-display', component: CaptionsDisplayComponent, canActivate: [IsAuthenticatedGuard], data:{title:'Caption Display'} },\r\n\r\n ])\r\n\r\n ],\r\n})\r\nexport class LiveEventsModule{}\r\n"]}