@webex/plugin-meetings 3.9.0-next.6 → 3.9.0-next.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/breakouts/breakout.js +1 -1
- package/dist/breakouts/index.js +1 -1
- package/dist/interpretation/index.js +1 -1
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/locus-info/index.js +15 -6
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/parser.js +4 -1
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/types/locus-info/index.d.ts +2 -0
- package/dist/webinar/index.js +1 -1
- package/package.json +1 -1
- package/src/locus-info/index.ts +13 -5
- package/src/locus-info/parser.ts +5 -1
- package/test/unit/spec/locus-info/index.js +7 -7
- package/test/unit/spec/locus-info/parser.js +3 -2
package/dist/breakouts/index.js
CHANGED
@@ -1110,7 +1110,7 @@ var Breakouts = _webexCore.WebexPlugin.extend({
|
|
1110
1110
|
this.trigger(_constants.BREAKOUTS.EVENTS.ASK_RETURN_TO_MAIN);
|
1111
1111
|
}
|
1112
1112
|
},
|
1113
|
-
version: "3.9.0-next.
|
1113
|
+
version: "3.9.0-next.7"
|
1114
1114
|
});
|
1115
1115
|
var _default = exports.default = Breakouts;
|
1116
1116
|
//# sourceMappingURL=index.js.map
|
@@ -373,7 +373,7 @@ var SimultaneousInterpretation = _webexCore.WebexPlugin.extend({
|
|
373
373
|
throw error;
|
374
374
|
});
|
375
375
|
},
|
376
|
-
version: "3.9.0-next.
|
376
|
+
version: "3.9.0-next.7"
|
377
377
|
});
|
378
378
|
var _default = exports.default = SimultaneousInterpretation;
|
379
379
|
//# sourceMappingURL=index.js.map
|
package/dist/locus-info/index.js
CHANGED
@@ -105,21 +105,29 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
|
|
105
105
|
* Does a Locus sync. It tries to get the latest delta DTO or if it can't, it falls back to getting the full Locus DTO.
|
106
106
|
*
|
107
107
|
* @param {Meeting} meeting
|
108
|
+
* @param {boolean} isLocusUrlChanged
|
109
|
+
* @param {Locus} locus
|
108
110
|
* @returns {undefined}
|
109
111
|
*/
|
110
112
|
(0, _createClass2.default)(LocusInfo, [{
|
111
113
|
key: "doLocusSync",
|
112
|
-
value: function doLocusSync(meeting) {
|
113
|
-
var
|
114
|
-
|
114
|
+
value: function doLocusSync(meeting, isLocusUrlChanged, locus) {
|
115
|
+
var _this$locusParser$wor,
|
116
|
+
_this2 = this;
|
115
117
|
var url;
|
118
|
+
var isDelta = false;
|
116
119
|
var meetingDestroyed = false;
|
117
|
-
if (
|
120
|
+
if (isLocusUrlChanged) {
|
121
|
+
// for the locus url changed case from breakout to main session, we should always do a full sync, in this case, the url from locus is always on main session,
|
122
|
+
// so use the main session locus url to get the full locus(full participants list in the response).
|
123
|
+
// for the locus url changed case from main session to breakout, we don't need to care about it here,
|
124
|
+
// because it is a USE_INCOMING case, it will not be executed here.
|
125
|
+
url = locus.url;
|
126
|
+
} else if ((_this$locusParser$wor = this.locusParser.workingCopy) !== null && _this$locusParser$wor !== void 0 && _this$locusParser$wor.syncUrl) {
|
118
127
|
url = this.locusParser.workingCopy.syncUrl;
|
119
128
|
isDelta = true;
|
120
129
|
} else {
|
121
130
|
url = meeting.locusUrl;
|
122
|
-
isDelta = false;
|
123
131
|
}
|
124
132
|
_loggerProxy.default.logger.info("Locus-info:index#doLocusSync --> doing Locus sync (getting ".concat(isDelta ? 'delta' : 'full', " DTO)"));
|
125
133
|
|
@@ -210,6 +218,7 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
|
|
210
218
|
USE_INCOMING = _LocusDeltaParser$loc.USE_INCOMING,
|
211
219
|
WAIT = _LocusDeltaParser$loc.WAIT,
|
212
220
|
LOCUS_URL_CHANGED = _LocusDeltaParser$loc.LOCUS_URL_CHANGED;
|
221
|
+
var isLocusUrlChanged = action === LOCUS_URL_CHANGED;
|
213
222
|
switch (action) {
|
214
223
|
case USE_INCOMING:
|
215
224
|
meeting.locusInfo.onDeltaLocus(locus);
|
@@ -220,7 +229,7 @@ var LocusInfo = exports.default = /*#__PURE__*/function (_EventsScope) {
|
|
220
229
|
break;
|
221
230
|
case DESYNC:
|
222
231
|
case LOCUS_URL_CHANGED:
|
223
|
-
this.doLocusSync(meeting);
|
232
|
+
this.doLocusSync(meeting, isLocusUrlChanged, locus);
|
224
233
|
break;
|
225
234
|
default:
|
226
235
|
_loggerProxy.default.logger.info("Locus-info:index#applyLocusDeltaData --> Unknown locus delta action: ".concat(action));
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"names":["_lodash","require","_loggerProxy","_interopRequireDefault","_eventsScope","_constants","_infoUtils","_fullState","_selfUtils","_hostUtils","_controlsUtils","_embeddedAppsUtils","_mediaSharesUtils","_parser","_metrics","_constants2","_createForOfIteratorHelper","o","allowArrayLike","it","_Symbol","_Symbol$iterator","_Array$isArray2","_unsupportedIterableToArray","length","i","F","s","n","done","value","e","_e","f","TypeError","normalCompletion","didErr","err","call","step","next","_e2","return","minLen","_arrayLikeToArray","Object","prototype","toString","slice","constructor","name","_Array$from","test","arr","len","arr2","Array","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf2","default","result","NewTarget","_Reflect$construct","arguments","apply","_possibleConstructorReturn2","Reflect","sham","Proxy","Boolean","valueOf","LocusInfo","exports","_EventsScope","_inherits2","_super","updateMeeting","webex","meetingId","_this","_classCallCheck2","_defineProperty2","_assertThisInitialized2","parsedLocus","states","emitChange","compareAndUpdateFlags","locusParser","LocusDeltaParser","_createClass2","key","doLocusSync","meeting","_this2","isDelta","url","meetingDestroyed","workingCopy","syncUrl","locusUrl","LoggerProxy","logger","info","concat","meetingRequest","getLocusDTO","catch","Metrics","sendBehavioralMetric","BEHAVIORAL_METRICS","LOCUS_DELTA_SYNC_FAILED","correlationId","reason","message","errorName","stack","code","statusCode","meetings","destroy","MEETING_REMOVED_REASON","LOCUS_DTO_SYNC_FAILED","then","res","isEmpty","body","baseSequence","locusInfo","handleLocusDelta","onFullLocus","LOCUS_SYNC_HANDLING_FAILED","finally","resume","applyLocusDeltaData","action","locus","_LocusDeltaParser$loc","loci","DESYNC","USE_CURRENT","USE_INCOMING","WAIT","LOCUS_URL_CHANGED","onDeltaLocus","_this3","onDeltaAction","parsedLoci","onDeltaEvent","init","_locus$links","_locus$links2","undefined","created","scheduledMeeting","participantsUrl","replaces","aclUrl","sequence","membership","identities","participants","updateLocusCache","updateParticipants","updateConversationUrl","conversationUrl","updateControls","controls","self","updateLocusUrl","updateFullState","fullState","updateMeetingInfo","updateEmbeddedApps","embeddedApps","updateSelf","updateHostInfo","host","updateMediaShares","mediaShares","updateServices","links","services","updateResources","resources","initialSetup","parse","data","eventType","getTheLocusToUpdate","LOCUSEVENT","PARTICIPANT_JOIN","PARTICIPANT_LEFT","CONTROLS_UPDATED","PARTICIPANT_AUDIO_MUTED","PARTICIPANT_AUDIO_UNMUTED","PARTICIPANT_VIDEO_MUTED","PARTICIPANT_VIDEO_UNMUTED","SELF_CHANGED","PARTICIPANT_UPDATED","PARTICIPANT_CONTROLS_UPDATED","PARTICIPANT_ROLES_UPDATED","PARTICIPANT_DECLINED","FLOOR_GRANTED","FLOOR_RELEASED","DIFFERENCE","emitScoped","scope","eventName","args","emit","error","isNewFullLocus","isReplaceMembers","ControlsUtils","isNeedReplaceMembers","updateLocusInfo","isMeetingActive","handleOneOnOneEvent","type","_CALL_","_SIP_BRIDGE_","file","function","EVENTS","REMOTE_RESPONSE","remoteDeclined","remoteAnswered","mergeParticipants","_locus$self","_locus$self2","_locus$links3","_locus$links4","state","updateCreated","updateParticipantsUrl","updateReplace","replace","updateAclUrl","updateBasequence","updateSequence","updateMemberShip","updateIdentifiers","compareAndUpdate","getLocusPartner","find","participant","identity","_USER_","removed","partner","_SPACE_SHARE_","LOCUS","STATE","INACTIVE","warn","internal","newMetrics","submitClientEvent","options","DESTROY_MEETING","CALL_REMOVED_REASON","CALL_INACTIVE","shouldLeave","MEETING_STATE","STATES","LEFT","DECLINED","NOTIFIED","JOINED","PARTNER_LEFT","joinedWith","_LEFT_","IDLE","SELF_LEFT","_MEETING_","TERMINATING","MEETING_INACTIVE_TERMINATING","FULLSTATE_REMOVED","SELF_REMOVED","compareSelfAndHost","compareHostAndSelf","_this$parsedLocus$hos","selfIdentity","hostId","moderator","LOCUS_INFO_CAN_ASSIGN_HOST","canAssignHost","isReplace","_this$parsedLocus$con","LOCUS_INFO_UPDATE_PARTICIPANTS","recordingId","record","modifiedBy","selfId","_isArray","_iterator","_step","_participant$person","LOCUSINFO","PARTICIPANT_REASON_CHANGED","displayName","person","primaryDisplayString","isEqual","_ControlsUtils$getCon","getControls","_ControlsUtils$getCon2","updates","hasRecordingChanged","hasRecordingPausedChanged","hasMeetingContainerChanged","hasTranscribeChanged","hasTranscribeSpokenLanguageChanged","hasManualCaptionChanged","hasEntryExitToneChanged","hasBreakoutChanged","hasVideoEnabledChanged","hasMuteOnEntryChanged","hasShareControlChanged","hasDisallowUnmuteChanged","hasReactionsChanged","hasReactionDisplayNamesChanged","hasViewTheParticipantListChanged","hasRaiseHandChanged","hasVideoChanged","hasInterpretationChanged","hasWebcastChanged","hasMeetingFullChanged","hasPracticeSessionEnabledChanged","hasStageViewChanged","hasAnnotationControlChanged","hasRemoteDesktopControlChanged","hasPollingQAControlChanged","current","CONTROLS_MUTE_ON_ENTRY_CHANGED","muteOnEntry","CONTROLS_SHARE_CONTROL_CHANGED","shareControl","CONTROLS_DISALLOW_UNMUTE_CHANGED","disallowUnmute","CONTROLS_REACTIONS_CHANGED","reactions","CONTROLS_VIEW_THE_PARTICIPANTS_LIST_CHANGED","viewTheParticipantList","CONTROLS_RAISE_HAND_CHANGED","raiseHand","CONTROLS_VIDEO_CHANGED","video","paused","RECORDING_STATE","PAUSED","recording","RESUMED","RECORDING","CONTROLS_RECORDING_UPDATED","lastModified","meetingContainerUrl","meetingContainer","CONTROLS_MEETING_CONTAINER_UPDATED","_current$transcribe","transcribe","transcribing","caption","CONTROLS_MEETING_TRANSCRIBE_UPDATED","spokenLanguage","CONTROLS_MEETING_TRANSCRIPTION_SPOKEN_LANGUAGE_UPDATED","enabled","manualCaptionControl","CONTROLS_MEETING_MANUAL_CAPTION_UPDATED","breakout","breakoutMoveId","SelfUtils","getReplacedBreakoutMoveId","device","CONTROLS_MEETING_BREAKOUT_UPDATED","interpretation","CONTROLS_MEETING_INTERPRETATION_UPDATED","entryExitTone","CONTROLS_ENTRY_EXIT_TONE_UPDATED","videoEnabled","unmuteVideoAllowed","SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED","unmuteAllowed","CONTROLS_WEBCAST_CHANGED","webcastControl","CONTROLS_MEETING_FULL_CHANGED","meetingFull","CONTROLS_PRACTICE_SESSION_STATUS_UPDATED","practiceSession","CONTROLS_STAGE_VIEW_UPDATED","videoLayout","CONTROLS_ANNOTATION_CHANGED","annotationControl","CONTROLS_REMOTE_DESKTOP_CONTROL_CHANGED","rdcControl","CONTROLS_POLLING_QA_CHANGED","pollingQAControl","LINKS_SERVICES","LINKS_RESOURCES","FullState","getFullState","meetingStateChangedTo","FULL_STATE_MEETING_STATE_CHANGE","previousState","previous","meetingState","currentState","meetingTypeChangedTo","FULL_STATE_TYPE_UPDATE","parsedHosts","HostUtils","getHosts","isNewHost","LOCUS_INFO_UPDATE_HOST","newHost","oldHost","_this$parsedLocus$sel","roles","getRoles","isJoined","parsedInfo","InfoUtils","getInfos","isLocked","MEETING_LOCKED","isUnlocked","MEETING_UNLOCKED","MEETING_INFO_UPDATED","isInitializing","EmbeddedAppsUtils","areSimilar","parsedEmbeddedApps","EMBEDDED_APPS_UPDATED","forceUpdate","parsedMediaShares","MediaSharesUtils","getMediaShares","LOCUS_INFO_UPDATE_MEDIA_SHARES","parsedSelves","getSelves","element","push","getSipUrl","sipUri","moderatorChanged","layoutChanged","CONTROLS_MEETING_LAYOUT_UPDATED","layout","breakoutsChanged","SELF_MEETING_BREAKOUTS_CHANGED","breakoutSessions","brbChanged","SELF_MEETING_BRB_CHANGED","brb","interpretationChanged","SELF_MEETING_INTERPRETATION_CHANGED","selfParticipantId","isMediaInactiveOrReleased","DISCONNECT_DUE_TO_INACTIVITY","SELF_MODERATOR_CHANGED","isRolesChanged","_parsedSelves$previou","_parsedSelves$current","SELF_ROLES_CHANGED","oldRoles","newRoles","isVideoMutedByOthersChanged","muted","remoteVideoMuted","localAudioUnmuteRequiredByServer","LOCAL_UNMUTE_REQUIRED","remoteMuted","isMutedByOthersChanged","SELF_REMOTE_MUTE_STATUS_UPDATED","localAudioUnmuteRequestedByServer","LOCAL_UNMUTE_REQUESTED","hasUserEnteredLobby","SELF_UNADMITTED_GUEST","hasUserBeenAdmitted","SELF_ADMITTED_GUEST","isMediaInactive","MEDIA_INACTIVITY","getMediaStatus","mediaSessions","audioStateChange","videoStateChange","shareStateChange","_parsedSelves$current2","_parsedSelves$current3","_parsedSelves$current4","MEDIA_STATUS_CHANGE","audioStatus","currentMediaStatus","audio","videoStatus","shareStatus","share","isUserObserving","SELF_OBSERVING","canNotViewTheParticipantListChanged","SELF_CANNOT_VIEW_PARTICIPANT_LIST_CHANGE","canNotViewTheParticipantList","isSharingBlockedChanged","SELF_IS_SHARING_BLOCKED_CHANGE","isSharingBlocked","LOCUS_INFO_UPDATE_SELF","oldSelf","newSelf","LOCUS_INFO_UPDATE_URL","isMainSessionDTO","updateMainSessionLocusCache","newLocus","switchStatus","getSessionSwitchStatus","isReturnToMain","mainSessionLocusCache","cloneDeep","_this$fullState","_this$mainSessionLocu","_this$mainSessionLocu2","isActive","ACTIVE","INITIALIZING","includes","clearMainSessionLocusCache","sourceParticipants","forEach","existIndex","findIndex","p","id","splice","mainLocus","_this4","locusClone","assignWith","objValue","srcValue","EventsScope"],"sources":["index.ts"],"sourcesContent":["import {isEqual, assignWith, cloneDeep, isEmpty, forEach} from 'lodash';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport EventsScope from '../common/events/events-scope';\nimport {\n EVENTS,\n LOCUSEVENT,\n _USER_,\n _CALL_,\n _SIP_BRIDGE_,\n MEETING_STATE,\n _MEETING_,\n _SPACE_SHARE_,\n LOCUSINFO,\n LOCUS,\n _LEFT_,\n MEETING_REMOVED_REASON,\n CALL_REMOVED_REASON,\n RECORDING_STATE,\n BREAKOUTS,\n} from '../constants';\n\nimport InfoUtils from './infoUtils';\nimport FullState from './fullState';\nimport SelfUtils from './selfUtils';\nimport HostUtils from './hostUtils';\nimport ControlsUtils from './controlsUtils';\nimport EmbeddedAppsUtils from './embeddedAppsUtils';\nimport MediaSharesUtils from './mediaSharesUtils';\nimport LocusDeltaParser from './parser';\nimport Metrics from '../metrics';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\n\n/**\n * @description LocusInfo extends ChildEmitter to convert locusInfo info a private emitter to parent object\n * @export\n * @private\n * @class LocusInfo\n */\nexport default class LocusInfo extends EventsScope {\n compareAndUpdateFlags: any;\n emitChange: any;\n locusParser: any;\n meetingId: any;\n parsedLocus: any;\n updateMeeting: any;\n webex: any;\n aclUrl: any;\n baseSequence: any;\n created: any;\n identities: any;\n membership: any;\n participants: any;\n participantsUrl: any;\n replaces: any;\n scheduledMeeting: any;\n sequence: any;\n controls: any;\n conversationUrl: any;\n embeddedApps: any;\n fullState: any;\n host: any;\n info: any;\n roles: any;\n mediaShares: any;\n replace: any;\n url: any;\n services: any;\n resources: any;\n mainSessionLocusCache: any;\n self: any;\n /**\n * Constructor\n * @param {function} updateMeeting callback to update the meeting object from an object\n * @param {object} webex\n * @param {string} meetingId\n * @returns {undefined}\n */\n constructor(updateMeeting, webex, meetingId) {\n super();\n this.parsedLocus = {\n states: [],\n };\n this.webex = webex;\n this.emitChange = false;\n this.compareAndUpdateFlags = {};\n this.meetingId = meetingId;\n this.updateMeeting = updateMeeting;\n this.locusParser = new LocusDeltaParser();\n }\n\n /**\n * Does a Locus sync. It tries to get the latest delta DTO or if it can't, it falls back to getting the full Locus DTO.\n *\n * @param {Meeting} meeting\n * @returns {undefined}\n */\n private doLocusSync(meeting: any) {\n let isDelta;\n let url;\n let meetingDestroyed = false;\n\n if (this.locusParser.workingCopy.syncUrl) {\n url = this.locusParser.workingCopy.syncUrl;\n isDelta = true;\n } else {\n url = meeting.locusUrl;\n isDelta = false;\n }\n\n LoggerProxy.logger.info(\n `Locus-info:index#doLocusSync --> doing Locus sync (getting ${\n isDelta ? 'delta' : 'full'\n } DTO)`\n );\n\n // return value ignored on purpose\n meeting.meetingRequest\n .getLocusDTO({url})\n .catch((e) => {\n if (isDelta) {\n LoggerProxy.logger.info(\n 'Locus-info:index#doLocusSync --> delta sync failed, falling back to full sync'\n );\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.LOCUS_DELTA_SYNC_FAILED, {\n correlationId: meeting.correlationId,\n url,\n reason: e.message,\n errorName: e.name,\n stack: e.stack,\n code: e.code,\n });\n\n isDelta = false;\n\n // Locus sometimes returns 403, for example if meeting has ended, no point trying the fallback to full sync in that case\n if (e.statusCode !== 403) {\n return meeting.meetingRequest.getLocusDTO({url: meeting.locusUrl}).catch((err) => {\n LoggerProxy.logger.info(\n 'Locus-info:index#doLocusSync --> fallback full sync failed, destroying the meeting'\n );\n this.webex.meetings.destroy(meeting, MEETING_REMOVED_REASON.LOCUS_DTO_SYNC_FAILED);\n meetingDestroyed = true;\n throw err;\n });\n }\n LoggerProxy.logger.info(\n 'Locus-info:index#doLocusSync --> got 403 from Locus, skipping fallback to full sync, destroying the meeting'\n );\n } else {\n LoggerProxy.logger.info(\n 'Locus-info:index#doLocusSync --> fallback full sync failed, destroying the meeting'\n );\n }\n this.webex.meetings.destroy(meeting, MEETING_REMOVED_REASON.LOCUS_DTO_SYNC_FAILED);\n meetingDestroyed = true;\n throw e;\n })\n .then((res) => {\n if (isEmpty(res.body)) {\n if (isDelta) {\n LoggerProxy.logger.info(\n 'Locus-info:index#doLocusSync --> received empty body from syncUrl, so we already have latest Locus DTO'\n );\n } else {\n LoggerProxy.logger.info(\n 'Locus-info:index#doLocusSync --> received empty body from full DTO sync request'\n );\n }\n\n return;\n }\n\n if (isDelta) {\n if (res.body.baseSequence) {\n meeting.locusInfo.handleLocusDelta(res.body, meeting);\n\n return;\n }\n // in some cases Locus might return us full DTO even when we asked for a delta\n LoggerProxy.logger.info(\n 'Locus-info:index#doLocusSync --> got full DTO when we asked for delta'\n );\n }\n meeting.locusInfo.onFullLocus(res.body);\n })\n .catch((e) => {\n LoggerProxy.logger.info(\n `Locus-info:index#doLocusSync --> getLocusDTO succeeded but failed to handle result, locus parser will resume but not all data may be synced (${e.toString()})`\n );\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.LOCUS_SYNC_HANDLING_FAILED, {\n correlationId: meeting.correlationId,\n url,\n reason: e.message,\n errorName: e.name,\n stack: e.stack,\n code: e.code,\n });\n })\n .finally(() => {\n if (!meetingDestroyed) {\n // Notify parser to resume processing delta events.\n // Any deltas in the queue that have now been superseded by this sync will simply be ignored\n this.locusParser.resume();\n }\n });\n }\n\n /**\n * Apply locus delta data to meeting\n * @param {string} action Locus delta action\n * @param {Locus} locus\n * @param {Meeting} meeting\n * @returns {undefined}\n */\n applyLocusDeltaData(action: string, locus: any, meeting: any) {\n const {DESYNC, USE_CURRENT, USE_INCOMING, WAIT, LOCUS_URL_CHANGED} = LocusDeltaParser.loci;\n\n switch (action) {\n case USE_INCOMING:\n meeting.locusInfo.onDeltaLocus(locus);\n break;\n case USE_CURRENT:\n case WAIT:\n // do nothing\n break;\n case DESYNC:\n case LOCUS_URL_CHANGED:\n this.doLocusSync(meeting);\n break;\n default:\n LoggerProxy.logger.info(\n `Locus-info:index#applyLocusDeltaData --> Unknown locus delta action: ${action}`\n );\n }\n }\n\n /**\n * Adds locus delta to parser's queue\n * and registers a function handler\n * to recieve parsed actions from queue.\n * @param {Locus} locus\n * @param {Meeting} meeting\n * @returns {undefined}\n */\n handleLocusDelta(locus: any, meeting: any) {\n // register a function to process delta actions\n if (!this.locusParser.onDeltaAction) {\n // delta action, along with associated loci\n // is passed into the function.\n this.locusParser.onDeltaAction = (action, parsedLoci) => {\n this.applyLocusDeltaData(action, parsedLoci, meeting);\n };\n }\n // queue delta event with parser\n this.locusParser.onDeltaEvent(locus);\n }\n\n /**\n * @param {Locus} locus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n init(locus: any = {}) {\n this.created = locus.created || null;\n this.scheduledMeeting = locus.meeting || null;\n this.participantsUrl = locus.participantsUrl || null;\n this.replaces = locus.replaces || null;\n this.aclUrl = locus.aclUrl || null;\n this.baseSequence = locus.baseSequence || null;\n this.sequence = locus.sequence || null;\n this.membership = locus.membership || null;\n this.identities = locus.identities || null;\n this.participants = locus.participants || null;\n\n /**\n * Stores the delta values for a changed participant.\n *\n * @typedef {Object} DeltaParticipant\n * @property {Record<string, boolean>} delta - Contains changed streams.\n * @property {Object} person - Contains person data.\n */\n\n this.updateLocusCache(locus);\n // above section only updates the locusInfo object\n // The below section makes sure it updates the locusInfo as well as updates the meeting object\n this.updateParticipants(locus.participants);\n // For 1:1 space meeting the conversation Url does not exist in locus.conversation\n this.updateConversationUrl(locus.conversationUrl, locus.info);\n this.updateControls(locus.controls, locus.self);\n this.updateLocusUrl(locus.url);\n this.updateFullState(locus.fullState);\n this.updateMeetingInfo(locus.info);\n this.updateEmbeddedApps(locus.embeddedApps);\n // self and participants generate sipUrl for 1:1 meeting\n this.updateSelf(locus.self);\n this.updateHostInfo(locus.host);\n this.updateMediaShares(locus.mediaShares);\n this.updateServices(locus.links?.services);\n this.updateResources(locus.links?.resources);\n }\n\n /**\n * @param {Object} locus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n initialSetup(locus: object) {\n this.updateLocusCache(locus);\n this.onFullLocus(locus);\n\n // Change it to true after it receives it first locus object\n this.emitChange = true;\n }\n\n /**\n * @param {Meeting} meeting\n * @param {Object} data\n * @returns {undefined}\n * @memberof LocusInfo\n */\n parse(meeting: any, data: any) {\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const {eventType} = data;\n const locus = this.getTheLocusToUpdate(data.locus);\n LoggerProxy.logger.info(`Locus-info:index#parse --> received locus data: ${eventType}`);\n\n switch (eventType) {\n case LOCUSEVENT.PARTICIPANT_JOIN:\n case LOCUSEVENT.PARTICIPANT_LEFT:\n case LOCUSEVENT.CONTROLS_UPDATED:\n case LOCUSEVENT.PARTICIPANT_AUDIO_MUTED:\n case LOCUSEVENT.PARTICIPANT_AUDIO_UNMUTED:\n case LOCUSEVENT.PARTICIPANT_VIDEO_MUTED:\n case LOCUSEVENT.PARTICIPANT_VIDEO_UNMUTED:\n case LOCUSEVENT.SELF_CHANGED:\n case LOCUSEVENT.PARTICIPANT_UPDATED:\n case LOCUSEVENT.PARTICIPANT_CONTROLS_UPDATED:\n case LOCUSEVENT.PARTICIPANT_ROLES_UPDATED:\n case LOCUSEVENT.PARTICIPANT_DECLINED:\n case LOCUSEVENT.FLOOR_GRANTED:\n case LOCUSEVENT.FLOOR_RELEASED:\n this.onFullLocus(locus, eventType);\n break;\n case LOCUSEVENT.DIFFERENCE:\n this.handleLocusDelta(locus, meeting);\n break;\n\n default:\n // Why will there be a event with no eventType ????\n // we may not need this, we can get full locus\n this.handleLocusDelta(locus, meeting);\n }\n }\n\n /**\n * @param {String} scope\n * @param {String} eventName\n * @param {Array} args\n * @returns {undefined}\n * @memberof LocusInfo\n */\n emitScoped(scope?: any, eventName?: string, args?: any) {\n return this.emit(scope, eventName, args);\n }\n\n /**\n * updates the locus with full locus object\n * @param {object} locus locus object\n * @param {string} eventType particulat locus event\n * @returns {object} null\n * @memberof LocusInfo\n */\n onFullLocus(locus: any, eventType?: string) {\n if (!locus) {\n LoggerProxy.logger.error(\n 'Locus-info:index#onFullLocus --> object passed as argument was invalid, continuing.'\n );\n }\n\n if (!this.locusParser.isNewFullLocus(locus)) {\n LoggerProxy.logger.info(\n `Locus-info:index#onFullLocus --> ignoring old full locus DTO, eventType=${eventType}`\n );\n\n return;\n }\n\n this.scheduledMeeting = locus.meeting || null;\n this.participants = locus.participants;\n const isReplaceMembers = ControlsUtils.isNeedReplaceMembers(this.controls, locus.controls);\n this.updateLocusInfo(locus);\n this.updateParticipants(locus.participants, isReplaceMembers);\n this.isMeetingActive();\n this.handleOneOnOneEvent(eventType);\n this.updateEmbeddedApps(locus.embeddedApps);\n // set current (working copy) for parser\n this.locusParser.workingCopy = locus;\n }\n\n // used for ringing stops on one on one\n /**\n * @param {String} eventType\n * @returns {undefined}\n * @memberof LocusInfo\n */\n // eslint-disable-next-line @typescript-eslint/no-shadow\n handleOneOnOneEvent(eventType: string) {\n if (\n this.parsedLocus.fullState.type === _CALL_ ||\n this.parsedLocus.fullState.type === _SIP_BRIDGE_\n ) {\n // for 1:1 bob calls alice and alice declines, notify the meeting state\n if (eventType === LOCUSEVENT.PARTICIPANT_DECLINED) {\n // trigger the event for stop ringing\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'handleOneonOneEvent',\n },\n EVENTS.REMOTE_RESPONSE,\n {\n remoteDeclined: true,\n remoteAnswered: false,\n }\n );\n }\n // for 1:1 bob calls alice and alice answers, notify the meeting state\n if (eventType === LOCUSEVENT.PARTICIPANT_JOIN) {\n // trigger the event for stop ringing\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'handleOneonOneEvent',\n },\n EVENTS.REMOTE_RESPONSE,\n {\n remoteDeclined: false,\n remoteAnswered: true,\n }\n );\n }\n }\n }\n\n /**\n * @param {Object} locus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n onDeltaLocus(locus: any) {\n const isReplaceMembers = ControlsUtils.isNeedReplaceMembers(this.controls, locus.controls);\n this.mergeParticipants(this.participants, locus.participants);\n this.updateLocusInfo(locus);\n this.updateParticipants(locus.participants, isReplaceMembers);\n this.isMeetingActive();\n }\n\n /**\n * @param {Object} locus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateLocusInfo(locus) {\n if (locus.self?.reason === 'MOVED' && locus.self?.state === 'LEFT') {\n // When moved to a breakout session locus sends a message for the previous locus\n // indicating that we have been moved. It isn't helpful to continue parsing this\n // as it gets interpreted as if we have left the call\n return;\n }\n\n this.updateControls(locus.controls, locus.self);\n this.updateConversationUrl(locus.conversationUrl, locus.info);\n this.updateCreated(locus.created);\n this.updateFullState(locus.fullState);\n this.updateHostInfo(locus.host);\n this.updateLocusUrl(locus.url);\n this.updateMeetingInfo(locus.info, locus.self);\n this.updateMediaShares(locus.mediaShares);\n this.updateParticipantsUrl(locus.participantsUrl);\n this.updateReplace(locus.replace);\n this.updateSelf(locus.self);\n this.updateAclUrl(locus.aclUrl);\n this.updateBasequence(locus.baseSequence);\n this.updateSequence(locus.sequence);\n this.updateMemberShip(locus.membership);\n this.updateIdentifiers(locus.identities);\n this.updateEmbeddedApps(locus.embeddedApps);\n this.updateServices(locus.links?.services);\n this.updateResources(locus.links?.resources);\n this.compareAndUpdate();\n // update which required to compare different objects from locus\n }\n\n /**\n * @param {Array} participants\n * @param {Object} self\n * @returns {Array}\n * @memberof LocusInfo\n */\n getLocusPartner(participants: Array<any>, self: any) {\n if (!participants || participants.length === 0) {\n return null;\n }\n\n return (\n participants.find(\n (participant) =>\n self &&\n participant.identity !== self.identity &&\n (participants.length <= 2 || (participant.type === _USER_ && !participant.removed))\n // @ts-ignore\n ) || this.partner\n );\n }\n\n // TODO: all the leave states need to be checked\n /**\n * @returns {undefined}\n * @memberof LocusInfo\n */\n isMeetingActive() {\n if (\n this.parsedLocus.fullState.type === _CALL_ ||\n this.parsedLocus.fullState.type === _SIP_BRIDGE_ ||\n this.parsedLocus.fullState.type === _SPACE_SHARE_\n ) {\n // @ts-ignore\n const partner = this.getLocusPartner(this.participants, this.self);\n\n this.updateMeeting({partner});\n\n // Check if guest user needs to be checked here\n\n // 1) when bob declines call from bob, (bob='DECLINED')\n // 2) When alice rejects call to bob , (bob='NOTIFIED')\n\n // When we dont add MEDIA for condition 2. The state of bob='IDLE'\n\n if (this.fullState && this.fullState.state === LOCUS.STATE.INACTIVE) {\n // TODO: update the meeting state\n LoggerProxy.logger.warn(\n 'Locus-info:index#isMeetingActive --> Call Ended, locus state is inactive.'\n );\n\n // @ts-ignore\n this.webex.internal.newMetrics.submitClientEvent({\n name: 'client.call.remote-ended',\n options: {\n meetingId: this.meetingId,\n },\n });\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive',\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: CALL_REMOVED_REASON.CALL_INACTIVE,\n shouldLeave: false,\n }\n );\n } else if (\n partner.state === MEETING_STATE.STATES.LEFT &&\n this.parsedLocus.self &&\n (this.parsedLocus.self.state === MEETING_STATE.STATES.DECLINED ||\n this.parsedLocus.self.state === MEETING_STATE.STATES.NOTIFIED ||\n this.parsedLocus.self.state === MEETING_STATE.STATES.JOINED)\n ) {\n // @ts-ignore\n this.webex.internal.newMetrics.submitClientEvent({\n name: 'client.call.remote-ended',\n options: {\n meetingId: this.meetingId,\n },\n });\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive',\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: CALL_REMOVED_REASON.PARTNER_LEFT,\n shouldLeave:\n this.parsedLocus.self.joinedWith && this.parsedLocus.self.joinedWith.state !== _LEFT_,\n }\n );\n } else if (\n this.parsedLocus.self &&\n this.parsedLocus.self.state === MEETING_STATE.STATES.LEFT &&\n (partner.state === MEETING_STATE.STATES.LEFT ||\n partner.state === MEETING_STATE.STATES.DECLINED ||\n partner.state === MEETING_STATE.STATES.NOTIFIED ||\n partner.state === MEETING_STATE.STATES.IDLE) // Happens when user just joins and adds no Media\n ) {\n // @ts-ignore\n this.webex.internal.newMetrics.submitClientEvent({\n name: 'client.call.remote-ended',\n options: {\n meetingId: this.meetingId,\n },\n });\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive',\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: CALL_REMOVED_REASON.SELF_LEFT,\n shouldLeave: false,\n }\n );\n }\n } else if (this.parsedLocus.fullState.type === _MEETING_) {\n if (\n this.fullState &&\n (this.fullState.state === LOCUS.STATE.INACTIVE ||\n // @ts-ignore\n this.fullState.state === LOCUS.STATE.TERMINATING)\n ) {\n LoggerProxy.logger.warn(\n 'Locus-info:index#isMeetingActive --> Meeting is ending due to inactive or terminating'\n );\n\n // @ts-ignore\n this.webex.internal.newMetrics.submitClientEvent({\n name: 'client.call.remote-ended',\n options: {\n meetingId: this.meetingId,\n },\n });\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive',\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: MEETING_REMOVED_REASON.MEETING_INACTIVE_TERMINATING,\n shouldLeave: false,\n }\n );\n } else if (this.fullState && this.fullState.removed) {\n // user has been dropped from a meeting\n\n // @ts-ignore\n this.webex.internal.newMetrics.submitClientEvent({\n name: 'client.call.remote-ended',\n options: {\n meetingId: this.meetingId,\n },\n });\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive',\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: MEETING_REMOVED_REASON.FULLSTATE_REMOVED,\n shouldLeave: false,\n }\n );\n }\n // If you are guest and you are removed from the meeting\n // You wont get any further events\n else if (this.parsedLocus.self && this.parsedLocus.self.removed) {\n // Check if we need to send an event\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive',\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: MEETING_REMOVED_REASON.SELF_REMOVED,\n shouldLeave: false,\n }\n );\n }\n } else {\n LoggerProxy.logger.warn('Locus-info:index#isMeetingActive --> Meeting Type is unknown.');\n }\n }\n\n /**\n * checks if the host permissions have changed while in the meeting\n * This would be the case if your role as host or moderator has been updated\n * @returns {undefined}\n * @memberof LocusInfo\n */\n compareAndUpdate() {\n // TODO: check with locus team on host and moderator doc\n // use host as a validator if needed\n if (\n this.compareAndUpdateFlags.compareSelfAndHost ||\n this.compareAndUpdateFlags.compareHostAndSelf\n ) {\n this.compareSelfAndHost();\n }\n }\n\n /**\n * compared the self object to check if the user has host permissions\n * @returns {undefined}\n * @memberof LocusInfo\n */\n compareSelfAndHost() {\n // In some cases the host info is not present but the moderator values changes from null to false so it triggers an update\n if (\n this.parsedLocus.self.selfIdentity === this.parsedLocus.host?.hostId &&\n this.parsedLocus.self.moderator\n ) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'compareSelfAndHost',\n },\n EVENTS.LOCUS_INFO_CAN_ASSIGN_HOST,\n {\n canAssignHost: true,\n }\n );\n } else {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'compareSelfAndHost',\n },\n EVENTS.LOCUS_INFO_CAN_ASSIGN_HOST,\n {\n canAssignHost: false,\n }\n );\n }\n }\n\n /**\n * update meeting's members\n * @param {Object} participants new participants object\n * @param {Boolean} isReplace is replace the whole members\n * @returns {Array} updatedParticipants\n * @memberof LocusInfo\n */\n updateParticipants(participants: object, isReplace?: boolean) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateParticipants',\n },\n EVENTS.LOCUS_INFO_UPDATE_PARTICIPANTS,\n {\n participants,\n recordingId: this.parsedLocus.controls && this.parsedLocus.controls.record?.modifiedBy,\n selfIdentity: this.parsedLocus.self && this.parsedLocus.self.selfIdentity,\n selfId: this.parsedLocus.self && this.parsedLocus.self.selfId,\n hostId: this.parsedLocus.host && this.parsedLocus.host.hostId,\n isReplace,\n }\n );\n\n if (participants && Array.isArray(participants) && participants.length > 0) {\n for (const participant of participants) {\n if (participant && participant?.reason === 'FAILURE') {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateParticipants',\n },\n LOCUSINFO.EVENTS.PARTICIPANT_REASON_CHANGED,\n {\n displayName: participant?.person?.primaryDisplayString,\n }\n );\n }\n }\n }\n }\n\n /**\n * @param {Object} controls\n * @param {Object} self\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateControls(controls: object, self: object) {\n if (controls && !isEqual(this.controls, controls)) {\n this.parsedLocus.controls = ControlsUtils.parse(controls);\n const {\n updates: {\n hasRecordingChanged,\n hasRecordingPausedChanged,\n hasMeetingContainerChanged,\n hasTranscribeChanged,\n hasTranscribeSpokenLanguageChanged,\n hasManualCaptionChanged,\n hasEntryExitToneChanged,\n hasBreakoutChanged,\n hasVideoEnabledChanged,\n hasMuteOnEntryChanged,\n hasShareControlChanged,\n hasDisallowUnmuteChanged,\n hasReactionsChanged,\n hasReactionDisplayNamesChanged,\n hasViewTheParticipantListChanged,\n hasRaiseHandChanged,\n hasVideoChanged,\n hasInterpretationChanged,\n hasWebcastChanged,\n hasMeetingFullChanged,\n hasPracticeSessionEnabledChanged,\n hasStageViewChanged,\n hasAnnotationControlChanged,\n hasRemoteDesktopControlChanged,\n hasPollingQAControlChanged,\n },\n current,\n } = ControlsUtils.getControls(this.controls, controls);\n\n if (hasMuteOnEntryChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_MUTE_ON_ENTRY_CHANGED,\n {state: current.muteOnEntry}\n );\n }\n\n if (hasShareControlChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_SHARE_CONTROL_CHANGED,\n {state: current.shareControl}\n );\n }\n\n if (hasDisallowUnmuteChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_DISALLOW_UNMUTE_CHANGED,\n {state: current.disallowUnmute}\n );\n }\n\n if (hasReactionsChanged || hasReactionDisplayNamesChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_REACTIONS_CHANGED,\n {state: current.reactions}\n );\n }\n\n if (hasViewTheParticipantListChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_VIEW_THE_PARTICIPANTS_LIST_CHANGED,\n {state: current.viewTheParticipantList}\n );\n }\n\n if (hasRaiseHandChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_RAISE_HAND_CHANGED,\n {state: current.raiseHand}\n );\n }\n\n if (hasVideoChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_VIDEO_CHANGED,\n {state: current.video}\n );\n }\n\n if (hasRecordingChanged || hasRecordingPausedChanged) {\n let state = null;\n\n if (hasRecordingPausedChanged) {\n if (current.record.paused) {\n state = RECORDING_STATE.PAUSED;\n } else {\n // state will be `IDLE` if the recording is not active, even when there is a `pause` status change.\n state = current.record.recording ? RECORDING_STATE.RESUMED : RECORDING_STATE.IDLE;\n }\n } else if (hasRecordingChanged) {\n state = current.record.recording ? RECORDING_STATE.RECORDING : RECORDING_STATE.IDLE;\n }\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.CONTROLS_RECORDING_UPDATED,\n {\n state,\n modifiedBy: current.record.modifiedBy,\n lastModified: current.record.lastModified,\n }\n );\n }\n\n if (hasMeetingContainerChanged) {\n const {meetingContainerUrl} = current.meetingContainer;\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.CONTROLS_MEETING_CONTAINER_UPDATED,\n {\n meetingContainerUrl,\n }\n );\n }\n\n if (hasTranscribeChanged) {\n const {transcribing, caption} = current.transcribe;\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.CONTROLS_MEETING_TRANSCRIBE_UPDATED,\n {\n transcribing,\n caption,\n }\n );\n }\n\n if (hasTranscribeSpokenLanguageChanged) {\n const {spokenLanguage} = current.transcribe;\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.CONTROLS_MEETING_TRANSCRIPTION_SPOKEN_LANGUAGE_UPDATED,\n {\n spokenLanguage,\n }\n );\n }\n\n if (hasManualCaptionChanged) {\n const {enabled} = current.manualCaptionControl;\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.CONTROLS_MEETING_MANUAL_CAPTION_UPDATED,\n {\n enabled,\n }\n );\n }\n\n if (hasBreakoutChanged) {\n const {breakout} = current;\n breakout.breakoutMoveId = SelfUtils.getReplacedBreakoutMoveId(\n self,\n this.webex.internal.device.url\n );\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.CONTROLS_MEETING_BREAKOUT_UPDATED,\n {\n breakout,\n }\n );\n }\n\n if (hasInterpretationChanged) {\n const {interpretation} = current;\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.CONTROLS_MEETING_INTERPRETATION_UPDATED,\n {\n interpretation,\n }\n );\n }\n\n if (hasEntryExitToneChanged) {\n const {entryExitTone} = current;\n\n this.updateMeeting({entryExitTone});\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.CONTROLS_ENTRY_EXIT_TONE_UPDATED,\n {\n entryExitTone,\n }\n );\n }\n\n // videoEnabled is handled differently than other controls,\n // to fit with audio mute status logic\n if (hasVideoEnabledChanged) {\n const {videoEnabled} = current;\n\n this.updateMeeting({unmuteVideoAllowed: videoEnabled});\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED,\n {\n // muted: not part of locus.controls\n unmuteAllowed: videoEnabled,\n }\n );\n }\n\n if (hasWebcastChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_WEBCAST_CHANGED,\n {state: current.webcastControl}\n );\n }\n\n if (hasMeetingFullChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_MEETING_FULL_CHANGED,\n {state: current.meetingFull}\n );\n }\n\n if (hasPracticeSessionEnabledChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_PRACTICE_SESSION_STATUS_UPDATED,\n {state: current.practiceSession}\n );\n }\n\n if (hasStageViewChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_STAGE_VIEW_UPDATED,\n {state: current.videoLayout}\n );\n }\n\n if (hasAnnotationControlChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_ANNOTATION_CHANGED,\n {state: current.annotationControl}\n );\n }\n\n if (hasRemoteDesktopControlChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_REMOTE_DESKTOP_CONTROL_CHANGED,\n {state: current.rdcControl}\n );\n }\n\n if (hasPollingQAControlChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_POLLING_QA_CHANGED,\n {state: current.pollingQAControl}\n );\n }\n\n this.controls = controls;\n }\n }\n\n /**\n * @param {String} conversationUrl\n * @param {Object} info\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateConversationUrl(conversationUrl: string, info: any) {\n if (conversationUrl && !isEqual(this.conversationUrl, conversationUrl)) {\n this.conversationUrl = conversationUrl;\n this.updateMeeting({conversationUrl});\n } else if (\n info &&\n info.conversationUrl &&\n !isEqual(this.conversationUrl, info.conversationUrl)\n ) {\n this.conversationUrl = info.conversationUrl;\n this.updateMeeting({conversationUrl: info.conversationUrl});\n }\n }\n\n /**\n * @param {Object} created\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateCreated(created: object) {\n if (created && !isEqual(this.created, created)) {\n this.created = created;\n }\n }\n\n /**\n * @param {Object} services\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateServices(services: Record<'breakout' | 'record', {url: string}>) {\n if (services && !isEqual(this.services, services)) {\n this.services = services;\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateServices',\n },\n LOCUSINFO.EVENTS.LINKS_SERVICES,\n {\n services,\n }\n );\n }\n }\n\n /**\n * @param {Object} resources\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateResources(resources: Record<'webcastInstance', {url: string}>) {\n if (resources && !isEqual(this.resources, resources)) {\n this.resources = resources;\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateResources',\n },\n LOCUSINFO.EVENTS.LINKS_RESOURCES,\n {\n resources,\n }\n );\n }\n }\n\n /**\n * @param {Object} fullState\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateFullState(fullState: object) {\n if (fullState && !isEqual(this.fullState, fullState)) {\n const result = FullState.getFullState(this.fullState, fullState);\n\n this.updateMeeting(result.current);\n\n if (result.updates.meetingStateChangedTo) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateFullState',\n },\n LOCUSINFO.EVENTS.FULL_STATE_MEETING_STATE_CHANGE,\n {\n previousState: result.previous && result.previous.meetingState,\n currentState: result.current.meetingState,\n }\n );\n }\n\n if (result.updates.meetingTypeChangedTo) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateFullState',\n },\n LOCUSINFO.EVENTS.FULL_STATE_TYPE_UPDATE,\n {\n type: result.current.type,\n }\n );\n }\n this.parsedLocus.fullState = result.current;\n this.fullState = fullState;\n }\n }\n\n /**\n * handles when the locus.host is updated\n * @param {Object} host the locus.host property\n * @returns {undefined}\n * @memberof LocusInfo\n * emits internal event locus_info_update_host\n */\n updateHostInfo(host: object) {\n if (host && !isEqual(this.host, host)) {\n const parsedHosts = HostUtils.getHosts(this.host, host);\n\n this.updateMeeting(parsedHosts.current);\n this.parsedLocus.host = parsedHosts.current;\n if (parsedHosts.updates.isNewHost) {\n this.compareAndUpdateFlags.compareSelfAndHost = true;\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateHostInfo',\n },\n EVENTS.LOCUS_INFO_UPDATE_HOST,\n {\n newHost: parsedHosts.current,\n oldHost: parsedHosts.previous,\n }\n );\n }\n this.host = host;\n } else {\n this.compareAndUpdateFlags.compareSelfAndHost = false;\n }\n }\n\n /**\n * @param {Object} info\n * @param {Object} self\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateMeetingInfo(info: object, self?: object) {\n const roles = self ? SelfUtils.getRoles(self) : this.parsedLocus.self?.roles || [];\n if ((info && !isEqual(this.info, info)) || (!isEqual(this.roles, roles) && info)) {\n const isJoined = SelfUtils.isJoined(self || this.parsedLocus.self);\n const parsedInfo = InfoUtils.getInfos(this.parsedLocus.info, info, roles, isJoined);\n\n if (parsedInfo.updates.isLocked) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateMeetingInfo',\n },\n LOCUSINFO.EVENTS.MEETING_LOCKED,\n info\n );\n }\n if (parsedInfo.updates.isUnlocked) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateMeetingInfo',\n },\n LOCUSINFO.EVENTS.MEETING_UNLOCKED,\n info\n );\n }\n\n this.info = info;\n this.parsedLocus.info = parsedInfo.current;\n // Parses the info and adds necessary values\n this.updateMeeting(parsedInfo.current);\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateMeetingInfo',\n },\n LOCUSINFO.EVENTS.MEETING_INFO_UPDATED,\n {\n isInitializing: !self, // if self is undefined, then the update is caused by locus init\n }\n );\n }\n this.roles = roles;\n }\n\n /**\n * @param {Object} embeddedApps\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateEmbeddedApps(embeddedApps: object) {\n // don't do anything if the arrays of apps haven't changed significantly\n if (EmbeddedAppsUtils.areSimilar(this.embeddedApps, embeddedApps)) {\n return;\n }\n\n const parsedEmbeddedApps = EmbeddedAppsUtils.parse(embeddedApps);\n\n this.updateMeeting({embeddedApps: parsedEmbeddedApps});\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateEmbeddedApps',\n },\n LOCUSINFO.EVENTS.EMBEDDED_APPS_UPDATED,\n parsedEmbeddedApps\n );\n this.embeddedApps = embeddedApps;\n }\n\n /**\n * handles when the locus.mediaShares is updated\n * @param {Object} mediaShares the locus.mediaShares property\n * @param {boolean} forceUpdate force to update the mediaShares\n * @returns {undefined}\n * @memberof LocusInfo\n * emits internal event locus_info_update_media_shares\n */\n updateMediaShares(mediaShares: object, forceUpdate = false) {\n if (mediaShares && (!isEqual(this.mediaShares, mediaShares) || forceUpdate)) {\n const parsedMediaShares = MediaSharesUtils.getMediaShares(this.mediaShares, mediaShares);\n\n this.updateMeeting(parsedMediaShares.current);\n this.parsedLocus.mediaShares = parsedMediaShares.current;\n this.mediaShares = mediaShares;\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateMediaShares',\n },\n EVENTS.LOCUS_INFO_UPDATE_MEDIA_SHARES,\n {\n current: parsedMediaShares.current,\n previous: parsedMediaShares.previous,\n forceUpdate,\n }\n );\n }\n }\n\n /**\n * @param {String} participantsUrl\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateParticipantsUrl(participantsUrl: string) {\n if (participantsUrl && !isEqual(this.participantsUrl, participantsUrl)) {\n this.participantsUrl = participantsUrl;\n }\n }\n\n /**\n * @param {Object} replace\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateReplace(replace: object) {\n if (replace && !isEqual(this.replace, replace)) {\n this.replace = replace;\n }\n }\n\n /**\n * handles when the locus.self is updated\n * @param {Object} self the new locus.self\n * @returns {undefined}\n * @memberof LocusInfo\n * emits internal events self_admitted_guest, self_unadmitted_guest, locus_info_update_self\n */\n updateSelf(self: any) {\n if (self) {\n // @ts-ignore\n const parsedSelves = SelfUtils.getSelves(\n this.parsedLocus.self,\n self,\n this.webex.internal.device.url,\n this.participants // using this.participants instead of locus.participants here, because with delta DTOs locus.participants will only contain a small subset of participants\n );\n\n this.updateMeeting(parsedSelves.current);\n this.parsedLocus.self = parsedSelves.current;\n\n const element = this.parsedLocus.states[this.parsedLocus.states.length - 1];\n\n if (element !== parsedSelves.current.state) {\n this.parsedLocus.states.push(parsedSelves.current.state);\n }\n\n // TODO: check if we need to save the sipUri here as well\n // this.emit(LOCUSINFO.EVENTS.MEETING_UPDATE, SelfUtils.getSipUrl(this.getLocusPartner(participants, self), this.parsedLocus.fullState.type, this.parsedLocus.info.sipUri));\n const result = SelfUtils.getSipUrl(\n this.getLocusPartner(this.participants, self),\n this.parsedLocus.fullState.type,\n this.parsedLocus.info.sipUri\n );\n\n if (result.sipUri) {\n this.updateMeeting(result);\n }\n\n if (parsedSelves.updates.moderatorChanged) {\n this.compareAndUpdateFlags.compareHostAndSelf = true;\n } else {\n this.compareAndUpdateFlags.compareHostAndSelf = false;\n }\n\n if (parsedSelves.updates.layoutChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.CONTROLS_MEETING_LAYOUT_UPDATED,\n {layout: parsedSelves.current.layout}\n );\n }\n\n if (parsedSelves.updates.breakoutsChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_MEETING_BREAKOUTS_CHANGED,\n {breakoutSessions: parsedSelves.current.breakoutSessions}\n );\n }\n\n if (parsedSelves.updates.brbChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_MEETING_BRB_CHANGED,\n {\n brb: parsedSelves.current.brb,\n }\n );\n }\n\n if (parsedSelves.updates.interpretationChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_MEETING_INTERPRETATION_CHANGED,\n {\n interpretation: parsedSelves.current.interpretation,\n selfParticipantId: parsedSelves.current.selfId,\n }\n );\n }\n\n if (parsedSelves.updates.isMediaInactiveOrReleased) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.DISCONNECT_DUE_TO_INACTIVITY,\n {reason: self.reason}\n );\n }\n\n if (parsedSelves.updates.moderatorChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_MODERATOR_CHANGED,\n self\n );\n }\n\n if (parsedSelves.updates.isRolesChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_ROLES_CHANGED,\n {oldRoles: parsedSelves.previous?.roles, newRoles: parsedSelves.current?.roles}\n );\n }\n\n if (parsedSelves.updates.isVideoMutedByOthersChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED,\n {\n muted: parsedSelves.current.remoteVideoMuted,\n // unmuteAllowed: not part of .self\n }\n );\n }\n if (parsedSelves.updates.localAudioUnmuteRequiredByServer) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.LOCAL_UNMUTE_REQUIRED,\n {\n muted: parsedSelves.current.remoteMuted,\n unmuteAllowed: parsedSelves.current.unmuteAllowed,\n }\n );\n }\n if (parsedSelves.updates.isMutedByOthersChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_REMOTE_MUTE_STATUS_UPDATED,\n {\n muted: parsedSelves.current.remoteMuted,\n unmuteAllowed: parsedSelves.current.unmuteAllowed,\n }\n );\n }\n if (parsedSelves.updates.localAudioUnmuteRequestedByServer) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.LOCAL_UNMUTE_REQUESTED,\n {}\n );\n }\n if (parsedSelves.updates.hasUserEnteredLobby) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_UNADMITTED_GUEST,\n self\n );\n }\n if (parsedSelves.updates.hasUserBeenAdmitted) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_ADMITTED_GUEST,\n self\n );\n }\n\n if (parsedSelves.updates.isMediaInactive) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n // @ts-ignore\n LOCUSINFO.EVENTS.MEDIA_INACTIVITY,\n SelfUtils.getMediaStatus(self.mediaSessions)\n );\n }\n\n if (\n parsedSelves.updates.audioStateChange ||\n parsedSelves.updates.videoStateChange ||\n parsedSelves.updates.shareStateChange\n ) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.MEDIA_STATUS_CHANGE,\n {\n audioStatus: parsedSelves.current.currentMediaStatus?.audio,\n videoStatus: parsedSelves.current.currentMediaStatus?.video,\n shareStatus: parsedSelves.current.currentMediaStatus?.share,\n }\n );\n }\n\n if (parsedSelves.updates.isUserObserving) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_OBSERVING\n );\n }\n\n if (parsedSelves.updates.canNotViewTheParticipantListChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_CANNOT_VIEW_PARTICIPANT_LIST_CHANGE,\n {canNotViewTheParticipantList: parsedSelves.current.canNotViewTheParticipantList}\n );\n }\n\n if (parsedSelves.updates.isSharingBlockedChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_IS_SHARING_BLOCKED_CHANGE,\n {isSharingBlocked: parsedSelves.current.isSharingBlocked}\n );\n }\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n EVENTS.LOCUS_INFO_UPDATE_SELF,\n {\n oldSelf: parsedSelves.previous,\n newSelf: parsedSelves.current,\n }\n );\n this.parsedLocus.self = parsedSelves.current;\n // @ts-ignore\n this.self = self;\n } else {\n this.compareAndUpdateFlags.compareHostAndSelf = false;\n }\n }\n\n /**\n * handles when the locus.url is updated\n * @param {String} url\n * @returns {undefined}\n * emits internal event locus_info_update_url\n */\n updateLocusUrl(url: string) {\n if (url && this.url !== url) {\n this.url = url;\n this.updateMeeting({locusUrl: url});\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateLocusUrl',\n },\n EVENTS.LOCUS_INFO_UPDATE_URL,\n url\n );\n }\n }\n\n /**\n * @param {String} aclUrl\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateAclUrl(aclUrl: string) {\n if (aclUrl && !isEqual(this.aclUrl, aclUrl)) {\n this.aclUrl = aclUrl;\n }\n }\n\n /**\n * @param {Number} baseSequence\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateBasequence(baseSequence: number) {\n if (baseSequence && !isEqual(this.baseSequence, baseSequence)) {\n this.baseSequence = baseSequence;\n }\n }\n\n /**\n * @param {Number} sequence\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateSequence(sequence: number) {\n if (sequence && !isEqual(this.sequence, sequence)) {\n this.sequence = sequence;\n }\n }\n\n /**\n * @param {Object} membership\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateMemberShip(membership: object) {\n if (membership && !isEqual(this.membership, membership)) {\n this.membership = membership;\n }\n }\n\n /**\n * @param {Array} identities\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateIdentifiers(identities: Array<any>) {\n if (identities && !isEqual(this.identities, identities)) {\n this.identities = identities;\n }\n }\n\n /**\n * check the locus is main session's one or not, if is main session's, update main session cache\n * @param {Object} locus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateLocusCache(locus: any) {\n const isMainSessionDTO = ControlsUtils.isMainSessionDTO(locus);\n if (isMainSessionDTO) {\n this.updateMainSessionLocusCache(locus);\n }\n }\n\n /**\n * if return from breakout to main session, need to use cached main session DTO since locus won't send the full locus (participants)\n * if join breakout from main session, main session is not active for the attendee and remove main session locus cache\n * @param {Object} newLocus\n * @returns {Object}\n * @memberof LocusInfo\n */\n getTheLocusToUpdate(newLocus: any) {\n const switchStatus = ControlsUtils.getSessionSwitchStatus(this, newLocus);\n\n if (switchStatus.isReturnToMain && this.mainSessionLocusCache) {\n return cloneDeep(this.mainSessionLocusCache);\n }\n const isMainSessionDTO =\n this.mainSessionLocusCache && ControlsUtils.isMainSessionDTO(this.mainSessionLocusCache);\n\n if (isMainSessionDTO) {\n const isActive =\n [LOCUS.STATE.ACTIVE, LOCUS.STATE.INITIALIZING, LOCUS.STATE.TERMINATING].includes(\n this.fullState?.state\n ) && !this.mainSessionLocusCache?.self?.removed;\n\n if (!isActive) {\n this.clearMainSessionLocusCache();\n }\n }\n\n return newLocus;\n }\n\n /**\n * merge participants by participant id\n * @param {Array} participants\n * @param {Array} sourceParticipants\n * @returns {Array} merged participants\n * @memberof LocusInfo\n */\n // eslint-disable-next-line class-methods-use-this\n mergeParticipants(participants, sourceParticipants) {\n if (!sourceParticipants || !sourceParticipants.length) return participants;\n if (!participants || !participants.length) {\n return sourceParticipants;\n }\n sourceParticipants.forEach((participant) => {\n const existIndex = participants.findIndex((p) => p.id === participant.id);\n if (existIndex > -1) {\n participants.splice(existIndex, 1, participant);\n } else {\n participants.push(participant);\n }\n });\n\n return participants;\n }\n\n /**\n * need cache main sessions' participants since locus will not send the full list when cohost/host leave breakout\n * @param {Object} mainLocus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateMainSessionLocusCache(mainLocus: any) {\n if (!mainLocus) {\n return;\n }\n const locusClone = cloneDeep(mainLocus);\n if (this.mainSessionLocusCache) {\n // shallow merge and do special merge for participants\n assignWith(this.mainSessionLocusCache, locusClone, (objValue, srcValue, key) => {\n if (key === 'participants') {\n return this.mergeParticipants(objValue, srcValue);\n }\n\n return srcValue || objValue;\n });\n } else {\n this.mainSessionLocusCache = locusClone;\n }\n }\n\n /**\n * clear main session cache\n * @returns {undefined}\n * @memberof LocusInfo\n */\n clearMainSessionLocusCache() {\n this.mainSessionLocusCache = null;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AAEA,IAAAC,YAAA,GAAAC,sBAAA,CAAAF,OAAA;AACA,IAAAG,YAAA,GAAAD,sBAAA,CAAAF,OAAA;AACA,IAAAI,UAAA,GAAAJ,OAAA;AAkBA,IAAAK,UAAA,GAAAH,sBAAA,CAAAF,OAAA;AACA,IAAAM,UAAA,GAAAJ,sBAAA,CAAAF,OAAA;AACA,IAAAO,UAAA,GAAAL,sBAAA,CAAAF,OAAA;AACA,IAAAQ,UAAA,GAAAN,sBAAA,CAAAF,OAAA;AACA,IAAAS,cAAA,GAAAP,sBAAA,CAAAF,OAAA;AACA,IAAAU,kBAAA,GAAAR,sBAAA,CAAAF,OAAA;AACA,IAAAW,iBAAA,GAAAT,sBAAA,CAAAF,OAAA;AACA,IAAAY,OAAA,GAAAV,sBAAA,CAAAF,OAAA;AACA,IAAAa,QAAA,GAAAX,sBAAA,CAAAF,OAAA;AACA,IAAAc,WAAA,GAAAZ,sBAAA,CAAAF,OAAA;AAAsD,SAAAe,2BAAAC,CAAA,EAAAC,cAAA,QAAAC,EAAA,UAAAC,OAAA,oBAAAH,CAAA,CAAAI,gBAAA,KAAAJ,CAAA,qBAAAE,EAAA,QAAAG,eAAA,CAAAL,CAAA,MAAAE,EAAA,GAAAI,2BAAA,CAAAN,CAAA,MAAAC,cAAA,IAAAD,CAAA,WAAAA,CAAA,CAAAO,MAAA,qBAAAL,EAAA,EAAAF,CAAA,GAAAE,EAAA,MAAAM,CAAA,UAAAC,CAAA,YAAAA,EAAA,eAAAC,CAAA,EAAAD,CAAA,EAAAE,CAAA,WAAAA,EAAA,QAAAH,CAAA,IAAAR,CAAA,CAAAO,MAAA,WAAAK,IAAA,mBAAAA,IAAA,SAAAC,KAAA,EAAAb,CAAA,CAAAQ,CAAA,UAAAM,CAAA,WAAAA,EAAAC,EAAA,UAAAA,EAAA,KAAAC,CAAA,EAAAP,CAAA,gBAAAQ,SAAA,iJAAAC,gBAAA,SAAAC,MAAA,UAAAC,GAAA,WAAAV,CAAA,WAAAA,EAAA,IAAAR,EAAA,GAAAA,EAAA,CAAAmB,IAAA,CAAArB,CAAA,MAAAW,CAAA,WAAAA,EAAA,QAAAW,IAAA,GAAApB,EAAA,CAAAqB,IAAA,IAAAL,gBAAA,GAAAI,IAAA,CAAAV,IAAA,SAAAU,IAAA,KAAAR,CAAA,WAAAA,EAAAU,GAAA,IAAAL,MAAA,SAAAC,GAAA,GAAAI,GAAA,KAAAR,CAAA,WAAAA,EAAA,eAAAE,gBAAA,IAAAhB,EAAA,CAAAuB,MAAA,UAAAvB,EAAA,CAAAuB,MAAA,oBAAAN,MAAA,QAAAC,GAAA;AAAA,SAAAd,4BAAAN,CAAA,EAAA0B,MAAA,SAAA1B,CAAA,qBAAAA,CAAA,sBAAA2B,iBAAA,CAAA3B,CAAA,EAAA0B,MAAA,OAAAf,CAAA,GAAAiB,MAAA,CAAAC,SAAA,CAAAC,QAAA,CAAAT,IAAA,CAAArB,CAAA,EAAA+B,KAAA,aAAApB,CAAA,iBAAAX,CAAA,CAAAgC,WAAA,EAAArB,CAAA,GAAAX,CAAA,CAAAgC,WAAA,CAAAC,IAAA,MAAAtB,CAAA,cAAAA,CAAA,mBAAAuB,WAAA,CAAAlC,CAAA,OAAAW,CAAA,+DAAAwB,IAAA,CAAAxB,CAAA,UAAAgB,iBAAA,CAAA3B,CAAA,EAAA0B,MAAA;AAAA,SAAAC,kBAAAS,GAAA,EAAAC,GAAA,QAAAA,GAAA,YAAAA,GAAA,GAAAD,GAAA,CAAA7B,MAAA,EAAA8B,GAAA,GAAAD,GAAA,CAAA7B,MAAA,WAAAC,CAAA,MAAA8B,IAAA,OAAAC,KAAA,CAAAF,GAAA,GAAA7B,CAAA,GAAA6B,GAAA,EAAA7B,CAAA,IAAA8B,IAAA,CAAA9B,CAAA,IAAA4B,GAAA,CAAA5B,CAAA,UAAA8B,IAAA;AAAA,SAAAE,aAAAC,OAAA,QAAAC,yBAAA,GAAAC,yBAAA,oBAAAC,qBAAA,QAAAC,KAAA,OAAAC,gBAAA,CAAAC,OAAA,EAAAN,OAAA,GAAAO,MAAA,MAAAN,yBAAA,QAAAO,SAAA,OAAAH,gBAAA,CAAAC,OAAA,QAAAf,WAAA,EAAAgB,MAAA,GAAAE,kBAAA,CAAAL,KAAA,EAAAM,SAAA,EAAAF,SAAA,YAAAD,MAAA,GAAAH,KAAA,CAAAO,KAAA,OAAAD,SAAA,gBAAAE,2BAAA,CAAAN,OAAA,QAAAC,MAAA;AAAA,SAAAL,0BAAA,eAAAW,OAAA,qBAAAJ,kBAAA,oBAAAA,kBAAA,CAAAK,IAAA,2BAAAC,KAAA,oCAAAC,OAAA,CAAA5B,SAAA,CAAA6B,OAAA,CAAArC,IAAA,CAAA6B,kBAAA,CAAAO,OAAA,8CAAA3C,CAAA;AAEtD;AACA;AACA;AACA;AACA;AACA;AALA,IAMqB6C,SAAS,GAAAC,OAAA,CAAAb,OAAA,0BAAAc,YAAA;EAAA,IAAAC,UAAA,CAAAf,OAAA,EAAAY,SAAA,EAAAE,YAAA;EAAA,IAAAE,MAAA,GAAAvB,YAAA,CAAAmB,SAAA;EAgC5B;AACF;AACA;AACA;AACA;AACA;AACA;EACE,SAAAA,UAAYK,aAAa,EAAEC,KAAK,EAAEC,SAAS,EAAE;IAAA,IAAAC,KAAA;IAAA,IAAAC,gBAAA,CAAArB,OAAA,QAAAY,SAAA;IAC3CQ,KAAA,GAAAJ,MAAA,CAAA1C,IAAA;IAAQ,IAAAgD,gBAAA,CAAAtB,OAAA,MAAAuB,uBAAA,CAAAvB,OAAA,EAAAoB,KAAA;IAAA,IAAAE,gBAAA,CAAAtB,OAAA,MAAAuB,uBAAA,CAAAvB,OAAA,EAAAoB,KAAA;IAAA,IAAAE,gBAAA,CAAAtB,OAAA,MAAAuB,uBAAA,CAAAvB,OAAA,EAAAoB,KAAA;IAAA,IAAAE,gBAAA,CAAAtB,OAAA,MAAAuB,uBAAA,CAAAvB,OAAA,EAAAoB,KAAA;IAAA,IAAAE,gBAAA,CAAAtB,OAAA,MAAAuB,uBAAA,CAAAvB,OAAA,EAAAoB,KAAA;IAAA,IAAAE,gBAAA,CAAAtB,OAAA,MAAAuB,uBAAA,CAAAvB,OAAA,EAAAoB,KAAA;IAAA,IAAAE,gBAAA,CAAAtB,OAAA,MAAAuB,uBAAA,CAAAvB,OAAA,EAAAoB,KAAA;IAAA,IAAAE,gBAAA,CAAAtB,OAAA,MAAAuB,uBAAA,CAAAvB,OAAA,EAAAoB,KAAA;IAAA,IAAAE,gBAAA,CAAAtB,OAAA,MAAAuB,uBAAA,CAAAvB,OAAA,EAAAoB,KAAA;IAAA,IAAAE,gBAAA,CAAAtB,OAAA,MAAAuB,uBAAA,CAAAvB,OAAA,EAAAoB,KAAA;IAAA,IAAAE,gBAAA,CAAAtB,OAAA,MAAAuB,uBAAA,CAAAvB,OAAA,EAAAoB,KAAA;IAAA,IAAAE,gBAAA,CAAAtB,OAAA,MAAAuB,uBAAA,CAAAvB,OAAA,EAAAoB,KAAA;IAAA,IAAAE,gBAAA,CAAAtB,OAAA,MAAAuB,uBAAA,CAAAvB,OAAA,EAAAoB,KAAA;IAAA,IAAAE,gBAAA,CAAAtB,OAAA,MAAAuB,uBAAA,CAAAvB,OAAA,EAAAoB,KAAA;IAAA,IAAAE,gBAAA,CAAAtB,OAAA,MAAAuB,uBAAA,CAAAvB,OAAA,EAAAoB,KAAA;IAAA,IAAAE,gBAAA,CAAAtB,OAAA,MAAAuB,uBAAA,CAAAvB,OAAA,EAAAoB,KAAA;IAAA,IAAAE,gBAAA,CAAAtB,OAAA,MAAAuB,uBAAA,CAAAvB,OAAA,EAAAoB,KAAA;IAAA,IAAAE,gBAAA,CAAAtB,OAAA,MAAAuB,uBAAA,CAAAvB,OAAA,EAAAoB,KAAA;IAAA,IAAAE,gBAAA,CAAAtB,OAAA,MAAAuB,uBAAA,CAAAvB,OAAA,EAAAoB,KAAA;IAAA,IAAAE,gBAAA,CAAAtB,OAAA,MAAAuB,uBAAA,CAAAvB,OAAA,EAAAoB,KAAA;IAAA,IAAAE,gBAAA,CAAAtB,OAAA,MAAAuB,uBAAA,CAAAvB,OAAA,EAAAoB,KAAA;IAAA,IAAAE,gBAAA,CAAAtB,OAAA,MAAAuB,uBAAA,CAAAvB,OAAA,EAAAoB,KAAA;IAAA,IAAAE,gBAAA,CAAAtB,OAAA,MAAAuB,uBAAA,CAAAvB,OAAA,EAAAoB,KAAA;IAAA,IAAAE,gBAAA,CAAAtB,OAAA,MAAAuB,uBAAA,CAAAvB,OAAA,EAAAoB,KAAA;IAAA,IAAAE,gBAAA,CAAAtB,OAAA,MAAAuB,uBAAA,CAAAvB,OAAA,EAAAoB,KAAA;IAAA,IAAAE,gBAAA,CAAAtB,OAAA,MAAAuB,uBAAA,CAAAvB,OAAA,EAAAoB,KAAA;IAAA,IAAAE,gBAAA,CAAAtB,OAAA,MAAAuB,uBAAA,CAAAvB,OAAA,EAAAoB,KAAA;IAAA,IAAAE,gBAAA,CAAAtB,OAAA,MAAAuB,uBAAA,CAAAvB,OAAA,EAAAoB,KAAA;IAAA,IAAAE,gBAAA,CAAAtB,OAAA,MAAAuB,uBAAA,CAAAvB,OAAA,EAAAoB,KAAA;IAAA,IAAAE,gBAAA,CAAAtB,OAAA,MAAAuB,uBAAA,CAAAvB,OAAA,EAAAoB,KAAA;IAAA,IAAAE,gBAAA,CAAAtB,OAAA,MAAAuB,uBAAA,CAAAvB,OAAA,EAAAoB,KAAA;IACRA,KAAA,CAAKI,WAAW,GAAG;MACjBC,MAAM,EAAE;IACV,CAAC;IACDL,KAAA,CAAKF,KAAK,GAAGA,KAAK;IAClBE,KAAA,CAAKM,UAAU,GAAG,KAAK;IACvBN,KAAA,CAAKO,qBAAqB,GAAG,CAAC,CAAC;IAC/BP,KAAA,CAAKD,SAAS,GAAGA,SAAS;IAC1BC,KAAA,CAAKH,aAAa,GAAGA,aAAa;IAClCG,KAAA,CAAKQ,WAAW,GAAG,IAAIC,eAAgB,CAAC,CAAC;IAAC,OAAAT,KAAA;EAC5C;;EAEA;AACF;AACA;AACA;AACA;AACA;EALE,IAAAU,aAAA,CAAA9B,OAAA,EAAAY,SAAA;IAAAmB,GAAA;IAAAjE,KAAA,EAMA,SAAAkE,YAAoBC,OAAY,EAAE;MAAA,IAAAC,MAAA;MAChC,IAAIC,OAAO;MACX,IAAIC,GAAG;MACP,IAAIC,gBAAgB,GAAG,KAAK;MAE5B,IAAI,IAAI,CAACT,WAAW,CAACU,WAAW,CAACC,OAAO,EAAE;QACxCH,GAAG,GAAG,IAAI,CAACR,WAAW,CAACU,WAAW,CAACC,OAAO;QAC1CJ,OAAO,GAAG,IAAI;MAChB,CAAC,MAAM;QACLC,GAAG,GAAGH,OAAO,CAACO,QAAQ;QACtBL,OAAO,GAAG,KAAK;MACjB;MAEAM,oBAAW,CAACC,MAAM,CAACC,IAAI,+DAAAC,MAAA,CAEnBT,OAAO,GAAG,OAAO,GAAG,MAAM,UAE9B,CAAC;;MAED;MACAF,OAAO,CAACY,cAAc,CACnBC,WAAW,CAAC;QAACV,GAAG,EAAHA;MAAG,CAAC,CAAC,CAClBW,KAAK,CAAC,UAAChF,CAAC,EAAK;QACZ,IAAIoE,OAAO,EAAE;UACXM,oBAAW,CAACC,MAAM,CAACC,IAAI,CACrB,+EACF,CAAC;UAEDK,gBAAO,CAACC,oBAAoB,CAACC,mBAAkB,CAACC,uBAAuB,EAAE;YACvEC,aAAa,EAAEnB,OAAO,CAACmB,aAAa;YACpChB,GAAG,EAAHA,GAAG;YACHiB,MAAM,EAAEtF,CAAC,CAACuF,OAAO;YACjBC,SAAS,EAAExF,CAAC,CAACmB,IAAI;YACjBsE,KAAK,EAAEzF,CAAC,CAACyF,KAAK;YACdC,IAAI,EAAE1F,CAAC,CAAC0F;UACV,CAAC,CAAC;UAEFtB,OAAO,GAAG,KAAK;;UAEf;UACA,IAAIpE,CAAC,CAAC2F,UAAU,KAAK,GAAG,EAAE;YACxB,OAAOzB,OAAO,CAACY,cAAc,CAACC,WAAW,CAAC;cAACV,GAAG,EAAEH,OAAO,CAACO;YAAQ,CAAC,CAAC,CAACO,KAAK,CAAC,UAAC1E,GAAG,EAAK;cAChFoE,oBAAW,CAACC,MAAM,CAACC,IAAI,CACrB,oFACF,CAAC;cACDT,MAAI,CAAChB,KAAK,CAACyC,QAAQ,CAACC,OAAO,CAAC3B,OAAO,EAAE4B,iCAAsB,CAACC,qBAAqB,CAAC;cAClFzB,gBAAgB,GAAG,IAAI;cACvB,MAAMhE,GAAG;YACX,CAAC,CAAC;UACJ;UACAoE,oBAAW,CAACC,MAAM,CAACC,IAAI,CACrB,6GACF,CAAC;QACH,CAAC,MAAM;UACLF,oBAAW,CAACC,MAAM,CAACC,IAAI,CACrB,oFACF,CAAC;QACH;QACAT,MAAI,CAAChB,KAAK,CAACyC,QAAQ,CAACC,OAAO,CAAC3B,OAAO,EAAE4B,iCAAsB,CAACC,qBAAqB,CAAC;QAClFzB,gBAAgB,GAAG,IAAI;QACvB,MAAMtE,CAAC;MACT,CAAC,CAAC,CACDgG,IAAI,CAAC,UAACC,GAAG,EAAK;QACb,IAAI,IAAAC,eAAO,EAACD,GAAG,CAACE,IAAI,CAAC,EAAE;UACrB,IAAI/B,OAAO,EAAE;YACXM,oBAAW,CAACC,MAAM,CAACC,IAAI,CACrB,wGACF,CAAC;UACH,CAAC,MAAM;YACLF,oBAAW,CAACC,MAAM,CAACC,IAAI,CACrB,iFACF,CAAC;UACH;UAEA;QACF;QAEA,IAAIR,OAAO,EAAE;UACX,IAAI6B,GAAG,CAACE,IAAI,CAACC,YAAY,EAAE;YACzBlC,OAAO,CAACmC,SAAS,CAACC,gBAAgB,CAACL,GAAG,CAACE,IAAI,EAAEjC,OAAO,CAAC;YAErD;UACF;UACA;UACAQ,oBAAW,CAACC,MAAM,CAACC,IAAI,CACrB,uEACF,CAAC;QACH;QACAV,OAAO,CAACmC,SAAS,CAACE,WAAW,CAACN,GAAG,CAACE,IAAI,CAAC;MACzC,CAAC,CAAC,CACDnB,KAAK,CAAC,UAAChF,CAAC,EAAK;QACZ0E,oBAAW,CAACC,MAAM,CAACC,IAAI,iJAAAC,MAAA,CAC2H7E,CAAC,CAACgB,QAAQ,CAAC,CAAC,MAC9J,CAAC;QAEDiE,gBAAO,CAACC,oBAAoB,CAACC,mBAAkB,CAACqB,0BAA0B,EAAE;UAC1EnB,aAAa,EAAEnB,OAAO,CAACmB,aAAa;UACpChB,GAAG,EAAHA,GAAG;UACHiB,MAAM,EAAEtF,CAAC,CAACuF,OAAO;UACjBC,SAAS,EAAExF,CAAC,CAACmB,IAAI;UACjBsE,KAAK,EAAEzF,CAAC,CAACyF,KAAK;UACdC,IAAI,EAAE1F,CAAC,CAAC0F;QACV,CAAC,CAAC;MACJ,CAAC,CAAC,CACDe,OAAO,CAAC,YAAM;QACb,IAAI,CAACnC,gBAAgB,EAAE;UACrB;UACA;UACAH,MAAI,CAACN,WAAW,CAAC6C,MAAM,CAAC,CAAC;QAC3B;MACF,CAAC,CAAC;IACN;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAA1C,GAAA;IAAAjE,KAAA,EAOA,SAAA4G,oBAAoBC,MAAc,EAAEC,KAAU,EAAE3C,OAAY,EAAE;MAC5D,IAAA4C,qBAAA,GAAqEhD,eAAgB,CAACiD,IAAI;QAAnFC,MAAM,GAAAF,qBAAA,CAANE,MAAM;QAAEC,WAAW,GAAAH,qBAAA,CAAXG,WAAW;QAAEC,YAAY,GAAAJ,qBAAA,CAAZI,YAAY;QAAEC,IAAI,GAAAL,qBAAA,CAAJK,IAAI;QAAEC,iBAAiB,GAAAN,qBAAA,CAAjBM,iBAAiB;MAEjE,QAAQR,MAAM;QACZ,KAAKM,YAAY;UACfhD,OAAO,CAACmC,SAAS,CAACgB,YAAY,CAACR,KAAK,CAAC;UACrC;QACF,KAAKI,WAAW;QAChB,KAAKE,IAAI;UACP;UACA;QACF,KAAKH,MAAM;QACX,KAAKI,iBAAiB;UACpB,IAAI,CAACnD,WAAW,CAACC,OAAO,CAAC;UACzB;QACF;UACEQ,oBAAW,CAACC,MAAM,CAACC,IAAI,yEAAAC,MAAA,CACmD+B,MAAM,CAChF,CAAC;MACL;IACF;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EAPE;IAAA5C,GAAA;IAAAjE,KAAA,EAQA,SAAAuG,iBAAiBO,KAAU,EAAE3C,OAAY,EAAE;MAAA,IAAAoD,MAAA;MACzC;MACA,IAAI,CAAC,IAAI,CAACzD,WAAW,CAAC0D,aAAa,EAAE;QACnC;QACA;QACA,IAAI,CAAC1D,WAAW,CAAC0D,aAAa,GAAG,UAACX,MAAM,EAAEY,UAAU,EAAK;UACvDF,MAAI,CAACX,mBAAmB,CAACC,MAAM,EAAEY,UAAU,EAAEtD,OAAO,CAAC;QACvD,CAAC;MACH;MACA;MACA,IAAI,CAACL,WAAW,CAAC4D,YAAY,CAACZ,KAAK,CAAC;IACtC;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAA7C,GAAA;IAAAjE,KAAA,EAKA,SAAA2H,KAAA,EAAsB;MAAA,IAAAC,YAAA,EAAAC,aAAA;MAAA,IAAjBf,KAAU,GAAAxE,SAAA,CAAA5C,MAAA,QAAA4C,SAAA,QAAAwF,SAAA,GAAAxF,SAAA,MAAG,CAAC,CAAC;MAClB,IAAI,CAACyF,OAAO,GAAGjB,KAAK,CAACiB,OAAO,IAAI,IAAI;MACpC,IAAI,CAACC,gBAAgB,GAAGlB,KAAK,CAAC3C,OAAO,IAAI,IAAI;MAC7C,IAAI,CAAC8D,eAAe,GAAGnB,KAAK,CAACmB,eAAe,IAAI,IAAI;MACpD,IAAI,CAACC,QAAQ,GAAGpB,KAAK,CAACoB,QAAQ,IAAI,IAAI;MACtC,IAAI,CAACC,MAAM,GAAGrB,KAAK,CAACqB,MAAM,IAAI,IAAI;MAClC,IAAI,CAAC9B,YAAY,GAAGS,KAAK,CAACT,YAAY,IAAI,IAAI;MAC9C,IAAI,CAAC+B,QAAQ,GAAGtB,KAAK,CAACsB,QAAQ,IAAI,IAAI;MACtC,IAAI,CAACC,UAAU,GAAGvB,KAAK,CAACuB,UAAU,IAAI,IAAI;MAC1C,IAAI,CAACC,UAAU,GAAGxB,KAAK,CAACwB,UAAU,IAAI,IAAI;MAC1C,IAAI,CAACC,YAAY,GAAGzB,KAAK,CAACyB,YAAY,IAAI,IAAI;;MAE9C;AACJ;AACA;AACA;AACA;AACA;AACA;;MAEI,IAAI,CAACC,gBAAgB,CAAC1B,KAAK,CAAC;MAC5B;MACA;MACA,IAAI,CAAC2B,kBAAkB,CAAC3B,KAAK,CAACyB,YAAY,CAAC;MAC3C;MACA,IAAI,CAACG,qBAAqB,CAAC5B,KAAK,CAAC6B,eAAe,EAAE7B,KAAK,CAACjC,IAAI,CAAC;MAC7D,IAAI,CAAC+D,cAAc,CAAC9B,KAAK,CAAC+B,QAAQ,EAAE/B,KAAK,CAACgC,IAAI,CAAC;MAC/C,IAAI,CAACC,cAAc,CAACjC,KAAK,CAACxC,GAAG,CAAC;MAC9B,IAAI,CAAC0E,eAAe,CAAClC,KAAK,CAACmC,SAAS,CAAC;MACrC,IAAI,CAACC,iBAAiB,CAACpC,KAAK,CAACjC,IAAI,CAAC;MAClC,IAAI,CAACsE,kBAAkB,CAACrC,KAAK,CAACsC,YAAY,CAAC;MAC3C;MACA,IAAI,CAACC,UAAU,CAACvC,KAAK,CAACgC,IAAI,CAAC;MAC3B,IAAI,CAACQ,cAAc,CAACxC,KAAK,CAACyC,IAAI,CAAC;MAC/B,IAAI,CAACC,iBAAiB,CAAC1C,KAAK,CAAC2C,WAAW,CAAC;MACzC,IAAI,CAACC,cAAc,EAAA9B,YAAA,GAACd,KAAK,CAAC6C,KAAK,cAAA/B,YAAA,uBAAXA,YAAA,CAAagC,QAAQ,CAAC;MAC1C,IAAI,CAACC,eAAe,EAAAhC,aAAA,GAACf,KAAK,CAAC6C,KAAK,cAAA9B,aAAA,uBAAXA,aAAA,CAAaiC,SAAS,CAAC;IAC9C;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAA7F,GAAA;IAAAjE,KAAA,EAKA,SAAA+J,aAAajD,KAAa,EAAE;MAC1B,IAAI,CAAC0B,gBAAgB,CAAC1B,KAAK,CAAC;MAC5B,IAAI,CAACN,WAAW,CAACM,KAAK,CAAC;;MAEvB;MACA,IAAI,CAAClD,UAAU,GAAG,IAAI;IACxB;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAAK,GAAA;IAAAjE,KAAA,EAMA,SAAAgK,MAAM7F,OAAY,EAAE8F,IAAS,EAAE;MAC7B;MACA,IAAOC,SAAS,GAAID,IAAI,CAAjBC,SAAS;MAChB,IAAMpD,KAAK,GAAG,IAAI,CAACqD,mBAAmB,CAACF,IAAI,CAACnD,KAAK,CAAC;MAClDnC,oBAAW,CAACC,MAAM,CAACC,IAAI,oDAAAC,MAAA,CAAoDoF,SAAS,CAAE,CAAC;MAEvF,QAAQA,SAAS;QACf,KAAKE,qBAAU,CAACC,gBAAgB;QAChC,KAAKD,qBAAU,CAACE,gBAAgB;QAChC,KAAKF,qBAAU,CAACG,gBAAgB;QAChC,KAAKH,qBAAU,CAACI,uBAAuB;QACvC,KAAKJ,qBAAU,CAACK,yBAAyB;QACzC,KAAKL,qBAAU,CAACM,uBAAuB;QACvC,KAAKN,qBAAU,CAACO,yBAAyB;QACzC,KAAKP,qBAAU,CAACQ,YAAY;QAC5B,KAAKR,qBAAU,CAACS,mBAAmB;QACnC,KAAKT,qBAAU,CAACU,4BAA4B;QAC5C,KAAKV,qBAAU,CAACW,yBAAyB;QACzC,KAAKX,qBAAU,CAACY,oBAAoB;QACpC,KAAKZ,qBAAU,CAACa,aAAa;QAC7B,KAAKb,qBAAU,CAACc,cAAc;UAC5B,IAAI,CAAC1E,WAAW,CAACM,KAAK,EAAEoD,SAAS,CAAC;UAClC;QACF,KAAKE,qBAAU,CAACe,UAAU;UACxB,IAAI,CAAC5E,gBAAgB,CAACO,KAAK,EAAE3C,OAAO,CAAC;UACrC;QAEF;UACE;UACA;UACA,IAAI,CAACoC,gBAAgB,CAACO,KAAK,EAAE3C,OAAO,CAAC;MACzC;IACF;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAAF,GAAA;IAAAjE,KAAA,EAOA,SAAAoL,WAAWC,KAAW,EAAEC,SAAkB,EAAEC,IAAU,EAAE;MACtD,OAAO,IAAI,CAACC,IAAI,CAACH,KAAK,EAAEC,SAAS,EAAEC,IAAI,CAAC;IAC1C;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAAtH,GAAA;IAAAjE,KAAA,EAOA,SAAAwG,YAAYM,KAAU,EAAEoD,SAAkB,EAAE;MAC1C,IAAI,CAACpD,KAAK,EAAE;QACVnC,oBAAW,CAACC,MAAM,CAAC6G,KAAK,CACtB,qFACF,CAAC;MACH;MAEA,IAAI,CAAC,IAAI,CAAC3H,WAAW,CAAC4H,cAAc,CAAC5E,KAAK,CAAC,EAAE;QAC3CnC,oBAAW,CAACC,MAAM,CAACC,IAAI,4EAAAC,MAAA,CACsDoF,SAAS,CACtF,CAAC;QAED;MACF;MAEA,IAAI,CAAClC,gBAAgB,GAAGlB,KAAK,CAAC3C,OAAO,IAAI,IAAI;MAC7C,IAAI,CAACoE,YAAY,GAAGzB,KAAK,CAACyB,YAAY;MACtC,IAAMoD,gBAAgB,GAAGC,sBAAa,CAACC,oBAAoB,CAAC,IAAI,CAAChD,QAAQ,EAAE/B,KAAK,CAAC+B,QAAQ,CAAC;MAC1F,IAAI,CAACiD,eAAe,CAAChF,KAAK,CAAC;MAC3B,IAAI,CAAC2B,kBAAkB,CAAC3B,KAAK,CAACyB,YAAY,EAAEoD,gBAAgB,CAAC;MAC7D,IAAI,CAACI,eAAe,CAAC,CAAC;MACtB,IAAI,CAACC,mBAAmB,CAAC9B,SAAS,CAAC;MACnC,IAAI,CAACf,kBAAkB,CAACrC,KAAK,CAACsC,YAAY,CAAC;MAC3C;MACA,IAAI,CAACtF,WAAW,CAACU,WAAW,GAAGsC,KAAK;IACtC;;IAEA;IACA;AACF;AACA;AACA;AACA;IACE;EAAA;IAAA7C,GAAA;IAAAjE,KAAA,EACA,SAAAgM,oBAAoB9B,SAAiB,EAAE;MACrC,IACE,IAAI,CAACxG,WAAW,CAACuF,SAAS,CAACgD,IAAI,KAAKC,iBAAM,IAC1C,IAAI,CAACxI,WAAW,CAACuF,SAAS,CAACgD,IAAI,KAAKE,uBAAY,EAChD;QACA;QACA,IAAIjC,SAAS,KAAKE,qBAAU,CAACY,oBAAoB,EAAE;UACjD;UACA,IAAI,CAACI,UAAU,CACb;YACEgB,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACDC,iBAAM,CAACC,eAAe,EACtB;YACEC,cAAc,EAAE,IAAI;YACpBC,cAAc,EAAE;UAClB,CACF,CAAC;QACH;QACA;QACA,IAAIvC,SAAS,KAAKE,qBAAU,CAACC,gBAAgB,EAAE;UAC7C;UACA,IAAI,CAACe,UAAU,CACb;YACEgB,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACDC,iBAAM,CAACC,eAAe,EACtB;YACEC,cAAc,EAAE,KAAK;YACrBC,cAAc,EAAE;UAClB,CACF,CAAC;QACH;MACF;IACF;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAAxI,GAAA;IAAAjE,KAAA,EAKA,SAAAsH,aAAaR,KAAU,EAAE;MACvB,IAAM6E,gBAAgB,GAAGC,sBAAa,CAACC,oBAAoB,CAAC,IAAI,CAAChD,QAAQ,EAAE/B,KAAK,CAAC+B,QAAQ,CAAC;MAC1F,IAAI,CAAC6D,iBAAiB,CAAC,IAAI,CAACnE,YAAY,EAAEzB,KAAK,CAACyB,YAAY,CAAC;MAC7D,IAAI,CAACuD,eAAe,CAAChF,KAAK,CAAC;MAC3B,IAAI,CAAC2B,kBAAkB,CAAC3B,KAAK,CAACyB,YAAY,EAAEoD,gBAAgB,CAAC;MAC7D,IAAI,CAACI,eAAe,CAAC,CAAC;IACxB;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAA9H,GAAA;IAAAjE,KAAA,EAKA,SAAA8L,gBAAgBhF,KAAK,EAAE;MAAA,IAAA6F,WAAA,EAAAC,YAAA,EAAAC,aAAA,EAAAC,aAAA;MACrB,IAAI,EAAAH,WAAA,GAAA7F,KAAK,CAACgC,IAAI,cAAA6D,WAAA,uBAAVA,WAAA,CAAYpH,MAAM,MAAK,OAAO,IAAI,EAAAqH,YAAA,GAAA9F,KAAK,CAACgC,IAAI,cAAA8D,YAAA,uBAAVA,YAAA,CAAYG,KAAK,MAAK,MAAM,EAAE;QAClE;QACA;QACA;QACA;MACF;MAEA,IAAI,CAACnE,cAAc,CAAC9B,KAAK,CAAC+B,QAAQ,EAAE/B,KAAK,CAACgC,IAAI,CAAC;MAC/C,IAAI,CAACJ,qBAAqB,CAAC5B,KAAK,CAAC6B,eAAe,EAAE7B,KAAK,CAACjC,IAAI,CAAC;MAC7D,IAAI,CAACmI,aAAa,CAAClG,KAAK,CAACiB,OAAO,CAAC;MACjC,IAAI,CAACiB,eAAe,CAAClC,KAAK,CAACmC,SAAS,CAAC;MACrC,IAAI,CAACK,cAAc,CAACxC,KAAK,CAACyC,IAAI,CAAC;MAC/B,IAAI,CAACR,cAAc,CAACjC,KAAK,CAACxC,GAAG,CAAC;MAC9B,IAAI,CAAC4E,iBAAiB,CAACpC,KAAK,CAACjC,IAAI,EAAEiC,KAAK,CAACgC,IAAI,CAAC;MAC9C,IAAI,CAACU,iBAAiB,CAAC1C,KAAK,CAAC2C,WAAW,CAAC;MACzC,IAAI,CAACwD,qBAAqB,CAACnG,KAAK,CAACmB,eAAe,CAAC;MACjD,IAAI,CAACiF,aAAa,CAACpG,KAAK,CAACqG,OAAO,CAAC;MACjC,IAAI,CAAC9D,UAAU,CAACvC,KAAK,CAACgC,IAAI,CAAC;MAC3B,IAAI,CAACsE,YAAY,CAACtG,KAAK,CAACqB,MAAM,CAAC;MAC/B,IAAI,CAACkF,gBAAgB,CAACvG,KAAK,CAACT,YAAY,CAAC;MACzC,IAAI,CAACiH,cAAc,CAACxG,KAAK,CAACsB,QAAQ,CAAC;MACnC,IAAI,CAACmF,gBAAgB,CAACzG,KAAK,CAACuB,UAAU,CAAC;MACvC,IAAI,CAACmF,iBAAiB,CAAC1G,KAAK,CAACwB,UAAU,CAAC;MACxC,IAAI,CAACa,kBAAkB,CAACrC,KAAK,CAACsC,YAAY,CAAC;MAC3C,IAAI,CAACM,cAAc,EAAAmD,aAAA,GAAC/F,KAAK,CAAC6C,KAAK,cAAAkD,aAAA,uBAAXA,aAAA,CAAajD,QAAQ,CAAC;MAC1C,IAAI,CAACC,eAAe,EAAAiD,aAAA,GAAChG,KAAK,CAAC6C,KAAK,cAAAmD,aAAA,uBAAXA,aAAA,CAAahD,SAAS,CAAC;MAC5C,IAAI,CAAC2D,gBAAgB,CAAC,CAAC;MACvB;IACF;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAAxJ,GAAA;IAAAjE,KAAA,EAMA,SAAA0N,gBAAgBnF,YAAwB,EAAEO,IAAS,EAAE;MACnD,IAAI,CAACP,YAAY,IAAIA,YAAY,CAAC7I,MAAM,KAAK,CAAC,EAAE;QAC9C,OAAO,IAAI;MACb;MAEA,OACE6I,YAAY,CAACoF,IAAI,CACf,UAACC,WAAW;QAAA,OACV9E,IAAI,IACJ8E,WAAW,CAACC,QAAQ,KAAK/E,IAAI,CAAC+E,QAAQ,KACrCtF,YAAY,CAAC7I,MAAM,IAAI,CAAC,IAAKkO,WAAW,CAAC3B,IAAI,KAAK6B,iBAAM,IAAI,CAACF,WAAW,CAACG,OAAQ,CAAC;MAAA;MACrF;MACF,CAAC,IAAI,IAAI,CAACC,OAAO;IAErB;;IAEA;IACA;AACF;AACA;AACA;EAHE;IAAA/J,GAAA;IAAAjE,KAAA,EAIA,SAAA+L,gBAAA,EAAkB;MAChB,IACE,IAAI,CAACrI,WAAW,CAACuF,SAAS,CAACgD,IAAI,KAAKC,iBAAM,IAC1C,IAAI,CAACxI,WAAW,CAACuF,SAAS,CAACgD,IAAI,KAAKE,uBAAY,IAChD,IAAI,CAACzI,WAAW,CAACuF,SAAS,CAACgD,IAAI,KAAKgC,wBAAa,EACjD;QACA;QACA,IAAMD,OAAO,GAAG,IAAI,CAACN,eAAe,CAAC,IAAI,CAACnF,YAAY,EAAE,IAAI,CAACO,IAAI,CAAC;QAElE,IAAI,CAAC3F,aAAa,CAAC;UAAC6K,OAAO,EAAPA;QAAO,CAAC,CAAC;;QAE7B;;QAEA;QACA;;QAEA;;QAEA,IAAI,IAAI,CAAC/E,SAAS,IAAI,IAAI,CAACA,SAAS,CAAC8D,KAAK,KAAKmB,gBAAK,CAACC,KAAK,CAACC,QAAQ,EAAE;UACnE;UACAzJ,oBAAW,CAACC,MAAM,CAACyJ,IAAI,CACrB,2EACF,CAAC;;UAED;UACA,IAAI,CAACjL,KAAK,CAACkL,QAAQ,CAACC,UAAU,CAACC,iBAAiB,CAAC;YAC/CpN,IAAI,EAAE,0BAA0B;YAChCqN,OAAO,EAAE;cACPpL,SAAS,EAAE,IAAI,CAACA;YAClB;UACF,CAAC,CAAC;UAEF,IAAI,CAAC+H,UAAU,CACb;YACEgB,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACDC,iBAAM,CAACoC,eAAe,EACtB;YACEnJ,MAAM,EAAEoJ,8BAAmB,CAACC,aAAa;YACzCC,WAAW,EAAE;UACf,CACF,CAAC;QACH,CAAC,MAAM,IACLb,OAAO,CAACjB,KAAK,KAAK+B,wBAAa,CAACC,MAAM,CAACC,IAAI,IAC3C,IAAI,CAACtL,WAAW,CAACoF,IAAI,KACpB,IAAI,CAACpF,WAAW,CAACoF,IAAI,CAACiE,KAAK,KAAK+B,wBAAa,CAACC,MAAM,CAACE,QAAQ,IAC5D,IAAI,CAACvL,WAAW,CAACoF,IAAI,CAACiE,KAAK,KAAK+B,wBAAa,CAACC,MAAM,CAACG,QAAQ,IAC7D,IAAI,CAACxL,WAAW,CAACoF,IAAI,CAACiE,KAAK,KAAK+B,wBAAa,CAACC,MAAM,CAACI,MAAM,CAAC,EAC9D;UACA;UACA,IAAI,CAAC/L,KAAK,CAACkL,QAAQ,CAACC,UAAU,CAACC,iBAAiB,CAAC;YAC/CpN,IAAI,EAAE,0BAA0B;YAChCqN,OAAO,EAAE;cACPpL,SAAS,EAAE,IAAI,CAACA;YAClB;UACF,CAAC,CAAC;UACF,IAAI,CAAC+H,UAAU,CACb;YACEgB,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACDC,iBAAM,CAACoC,eAAe,EACtB;YACEnJ,MAAM,EAAEoJ,8BAAmB,CAACS,YAAY;YACxCP,WAAW,EACT,IAAI,CAACnL,WAAW,CAACoF,IAAI,CAACuG,UAAU,IAAI,IAAI,CAAC3L,WAAW,CAACoF,IAAI,CAACuG,UAAU,CAACtC,KAAK,KAAKuC;UACnF,CACF,CAAC;QACH,CAAC,MAAM,IACL,IAAI,CAAC5L,WAAW,CAACoF,IAAI,IACrB,IAAI,CAACpF,WAAW,CAACoF,IAAI,CAACiE,KAAK,KAAK+B,wBAAa,CAACC,MAAM,CAACC,IAAI,KACxDhB,OAAO,CAACjB,KAAK,KAAK+B,wBAAa,CAACC,MAAM,CAACC,IAAI,IAC1ChB,OAAO,CAACjB,KAAK,KAAK+B,wBAAa,CAACC,MAAM,CAACE,QAAQ,IAC/CjB,OAAO,CAACjB,KAAK,KAAK+B,wBAAa,CAACC,MAAM,CAACG,QAAQ,IAC/ClB,OAAO,CAACjB,KAAK,KAAK+B,wBAAa,CAACC,MAAM,CAACQ,IAAI,CAAC,CAAC;QAAA,EAC/C;UACA;UACA,IAAI,CAACnM,KAAK,CAACkL,QAAQ,CAACC,UAAU,CAACC,iBAAiB,CAAC;YAC/CpN,IAAI,EAAE,0BAA0B;YAChCqN,OAAO,EAAE;cACPpL,SAAS,EAAE,IAAI,CAACA;YAClB;UACF,CAAC,CAAC;UAEF,IAAI,CAAC+H,UAAU,CACb;YACEgB,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACDC,iBAAM,CAACoC,eAAe,EACtB;YACEnJ,MAAM,EAAEoJ,8BAAmB,CAACa,SAAS;YACrCX,WAAW,EAAE;UACf,CACF,CAAC;QACH;MACF,CAAC,MAAM,IAAI,IAAI,CAACnL,WAAW,CAACuF,SAAS,CAACgD,IAAI,KAAKwD,oBAAS,EAAE;QACxD,IACE,IAAI,CAACxG,SAAS,KACb,IAAI,CAACA,SAAS,CAAC8D,KAAK,KAAKmB,gBAAK,CAACC,KAAK,CAACC,QAAQ;QAC5C;QACA,IAAI,CAACnF,SAAS,CAAC8D,KAAK,KAAKmB,gBAAK,CAACC,KAAK,CAACuB,WAAW,CAAC,EACnD;UACA/K,oBAAW,CAACC,MAAM,CAACyJ,IAAI,CACrB,uFACF,CAAC;;UAED;UACA,IAAI,CAACjL,KAAK,CAACkL,QAAQ,CAACC,UAAU,CAACC,iBAAiB,CAAC;YAC/CpN,IAAI,EAAE,0BAA0B;YAChCqN,OAAO,EAAE;cACPpL,SAAS,EAAE,IAAI,CAACA;YAClB;UACF,CAAC,CAAC;UACF,IAAI,CAAC+H,UAAU,CACb;YACEgB,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACDC,iBAAM,CAACoC,eAAe,EACtB;YACEnJ,MAAM,EAAEQ,iCAAsB,CAAC4J,4BAA4B;YAC3Dd,WAAW,EAAE;UACf,CACF,CAAC;QACH,CAAC,MAAM,IAAI,IAAI,CAAC5F,SAAS,IAAI,IAAI,CAACA,SAAS,CAAC8E,OAAO,EAAE;UACnD;;UAEA;UACA,IAAI,CAAC3K,KAAK,CAACkL,QAAQ,CAACC,UAAU,CAACC,iBAAiB,CAAC;YAC/CpN,IAAI,EAAE,0BAA0B;YAChCqN,OAAO,EAAE;cACPpL,SAAS,EAAE,IAAI,CAACA;YAClB;UACF,CAAC,CAAC;UACF,IAAI,CAAC+H,UAAU,CACb;YACEgB,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACDC,iBAAM,CAACoC,eAAe,EACtB;YACEnJ,MAAM,EAAEQ,iCAAsB,CAAC6J,iBAAiB;YAChDf,WAAW,EAAE;UACf,CACF,CAAC;QACH;QACA;QACA;QAAA,KACK,IAAI,IAAI,CAACnL,WAAW,CAACoF,IAAI,IAAI,IAAI,CAACpF,WAAW,CAACoF,IAAI,CAACiF,OAAO,EAAE;UAC/D;UACA,IAAI,CAAC3C,UAAU,CACb;YACEgB,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACDC,iBAAM,CAACoC,eAAe,EACtB;YACEnJ,MAAM,EAAEQ,iCAAsB,CAAC8J,YAAY;YAC3ChB,WAAW,EAAE;UACf,CACF,CAAC;QACH;MACF,CAAC,MAAM;QACLlK,oBAAW,CAACC,MAAM,CAACyJ,IAAI,CAAC,+DAA+D,CAAC;MAC1F;IACF;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAApK,GAAA;IAAAjE,KAAA,EAMA,SAAAyN,iBAAA,EAAmB;MACjB;MACA;MACA,IACE,IAAI,CAAC5J,qBAAqB,CAACiM,kBAAkB,IAC7C,IAAI,CAACjM,qBAAqB,CAACkM,kBAAkB,EAC7C;QACA,IAAI,CAACD,kBAAkB,CAAC,CAAC;MAC3B;IACF;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAA7L,GAAA;IAAAjE,KAAA,EAKA,SAAA8P,mBAAA,EAAqB;MAAA,IAAAE,qBAAA;MACnB;MACA,IACE,IAAI,CAACtM,WAAW,CAACoF,IAAI,CAACmH,YAAY,OAAAD,qBAAA,GAAK,IAAI,CAACtM,WAAW,CAAC6F,IAAI,cAAAyG,qBAAA,uBAArBA,qBAAA,CAAuBE,MAAM,KACpE,IAAI,CAACxM,WAAW,CAACoF,IAAI,CAACqH,SAAS,EAC/B;QACA,IAAI,CAAC/E,UAAU,CACb;UACEgB,IAAI,EAAE,YAAY;UAClBC,QAAQ,EAAE;QACZ,CAAC,EACDC,iBAAM,CAAC8D,0BAA0B,EACjC;UACEC,aAAa,EAAE;QACjB,CACF,CAAC;MACH,CAAC,MAAM;QACL,IAAI,CAACjF,UAAU,CACb;UACEgB,IAAI,EAAE,YAAY;UAClBC,QAAQ,EAAE;QACZ,CAAC,EACDC,iBAAM,CAAC8D,0BAA0B,EACjC;UACEC,aAAa,EAAE;QACjB,CACF,CAAC;MACH;IACF;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAApM,GAAA;IAAAjE,KAAA,EAOA,SAAAyI,mBAAmBF,YAAoB,EAAE+H,SAAmB,EAAE;MAAA,IAAAC,qBAAA;MAC5D,IAAI,CAACnF,UAAU,CACb;QACEgB,IAAI,EAAE,YAAY;QAClBC,QAAQ,EAAE;MACZ,CAAC,EACDC,iBAAM,CAACkE,8BAA8B,EACrC;QACEjI,YAAY,EAAZA,YAAY;QACZkI,WAAW,EAAE,IAAI,CAAC/M,WAAW,CAACmF,QAAQ,MAAA0H,qBAAA,GAAI,IAAI,CAAC7M,WAAW,CAACmF,QAAQ,CAAC6H,MAAM,cAAAH,qBAAA,uBAAhCA,qBAAA,CAAkCI,UAAU;QACtFV,YAAY,EAAE,IAAI,CAACvM,WAAW,CAACoF,IAAI,IAAI,IAAI,CAACpF,WAAW,CAACoF,IAAI,CAACmH,YAAY;QACzEW,MAAM,EAAE,IAAI,CAAClN,WAAW,CAACoF,IAAI,IAAI,IAAI,CAACpF,WAAW,CAACoF,IAAI,CAAC8H,MAAM;QAC7DV,MAAM,EAAE,IAAI,CAACxM,WAAW,CAAC6F,IAAI,IAAI,IAAI,CAAC7F,WAAW,CAAC6F,IAAI,CAAC2G,MAAM;QAC7DI,SAAS,EAATA;MACF,CACF,CAAC;MAED,IAAI/H,YAAY,IAAI,IAAAsI,QAAA,CAAA3O,OAAA,EAAcqG,YAAY,CAAC,IAAIA,YAAY,CAAC7I,MAAM,GAAG,CAAC,EAAE;QAAA,IAAAoR,SAAA,GAAA5R,0BAAA,CAChDqJ,YAAY;UAAAwI,KAAA;QAAA;UAAtC,KAAAD,SAAA,CAAAjR,CAAA,MAAAkR,KAAA,GAAAD,SAAA,CAAAhR,CAAA,IAAAC,IAAA,GAAwC;YAAA,IAA7B6N,WAAW,GAAAmD,KAAA,CAAA/Q,KAAA;YACpB,IAAI4N,WAAW,IAAI,CAAAA,WAAW,aAAXA,WAAW,uBAAXA,WAAW,CAAErI,MAAM,MAAK,SAAS,EAAE;cAAA,IAAAyL,mBAAA;cACpD,IAAI,CAAC5F,UAAU,CACb;gBACEgB,IAAI,EAAE,YAAY;gBAClBC,QAAQ,EAAE;cACZ,CAAC,EACD4E,oBAAS,CAAC3E,MAAM,CAAC4E,0BAA0B,EAC3C;gBACEC,WAAW,EAAEvD,WAAW,aAAXA,WAAW,wBAAAoD,mBAAA,GAAXpD,WAAW,CAAEwD,MAAM,cAAAJ,mBAAA,uBAAnBA,mBAAA,CAAqBK;cACpC,CACF,CAAC;YACH;UACF;QAAC,SAAA9Q,GAAA;UAAAuQ,SAAA,CAAA7Q,CAAA,CAAAM,GAAA;QAAA;UAAAuQ,SAAA,CAAA3Q,CAAA;QAAA;MACH;IACF;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAA8D,GAAA;IAAAjE,KAAA,EAMA,SAAA4I,eAAeC,QAAgB,EAAEC,IAAY,EAAE;MAC7C,IAAID,QAAQ,IAAI,CAAC,IAAAyI,eAAO,EAAC,IAAI,CAACzI,QAAQ,EAAEA,QAAQ,CAAC,EAAE;QACjD,IAAI,CAACnF,WAAW,CAACmF,QAAQ,GAAG+C,sBAAa,CAAC5B,KAAK,CAACnB,QAAQ,CAAC;QACzD,IAAA0I,qBAAA,GA6BI3F,sBAAa,CAAC4F,WAAW,CAAC,IAAI,CAAC3I,QAAQ,EAAEA,QAAQ,CAAC;UAAA4I,sBAAA,GAAAF,qBAAA,CA5BpDG,OAAO;UACLC,mBAAmB,GAAAF,sBAAA,CAAnBE,mBAAmB;UACnBC,yBAAyB,GAAAH,sBAAA,CAAzBG,yBAAyB;UACzBC,0BAA0B,GAAAJ,sBAAA,CAA1BI,0BAA0B;UAC1BC,oBAAoB,GAAAL,sBAAA,CAApBK,oBAAoB;UACpBC,kCAAkC,GAAAN,sBAAA,CAAlCM,kCAAkC;UAClCC,uBAAuB,GAAAP,sBAAA,CAAvBO,uBAAuB;UACvBC,uBAAuB,GAAAR,sBAAA,CAAvBQ,uBAAuB;UACvBC,kBAAkB,GAAAT,sBAAA,CAAlBS,kBAAkB;UAClBC,sBAAsB,GAAAV,sBAAA,CAAtBU,sBAAsB;UACtBC,qBAAqB,GAAAX,sBAAA,CAArBW,qBAAqB;UACrBC,sBAAsB,GAAAZ,sBAAA,CAAtBY,sBAAsB;UACtBC,wBAAwB,GAAAb,sBAAA,CAAxBa,wBAAwB;UACxBC,mBAAmB,GAAAd,sBAAA,CAAnBc,mBAAmB;UACnBC,8BAA8B,GAAAf,sBAAA,CAA9Be,8BAA8B;UAC9BC,gCAAgC,GAAAhB,sBAAA,CAAhCgB,gCAAgC;UAChCC,mBAAmB,GAAAjB,sBAAA,CAAnBiB,mBAAmB;UACnBC,eAAe,GAAAlB,sBAAA,CAAfkB,eAAe;UACfC,wBAAwB,GAAAnB,sBAAA,CAAxBmB,wBAAwB;UACxBC,iBAAiB,GAAApB,sBAAA,CAAjBoB,iBAAiB;UACjBC,qBAAqB,GAAArB,sBAAA,CAArBqB,qBAAqB;UACrBC,gCAAgC,GAAAtB,sBAAA,CAAhCsB,gCAAgC;UAChCC,mBAAmB,GAAAvB,sBAAA,CAAnBuB,mBAAmB;UACnBC,2BAA2B,GAAAxB,sBAAA,CAA3BwB,2BAA2B;UAC3BC,8BAA8B,GAAAzB,sBAAA,CAA9ByB,8BAA8B;UAC9BC,0BAA0B,GAAA1B,sBAAA,CAA1B0B,0BAA0B;UAE5BC,OAAO,GAAA7B,qBAAA,CAAP6B,OAAO;QAGT,IAAIhB,qBAAqB,EAAE;UACzB,IAAI,CAAChH,UAAU,CACb;YAACgB,IAAI,EAAE,YAAY;YAAEC,QAAQ,EAAE;UAAgB,CAAC,EAChD4E,oBAAS,CAAC3E,MAAM,CAAC+G,8BAA8B,EAC/C;YAACtG,KAAK,EAAEqG,OAAO,CAACE;UAAW,CAC7B,CAAC;QACH;QAEA,IAAIjB,sBAAsB,EAAE;UAC1B,IAAI,CAACjH,UAAU,CACb;YAACgB,IAAI,EAAE,YAAY;YAAEC,QAAQ,EAAE;UAAgB,CAAC,EAChD4E,oBAAS,CAAC3E,MAAM,CAACiH,8BAA8B,EAC/C;YAACxG,KAAK,EAAEqG,OAAO,CAACI;UAAY,CAC9B,CAAC;QACH;QAEA,IAAIlB,wBAAwB,EAAE;UAC5B,IAAI,CAAClH,UAAU,CACb;YAACgB,IAAI,EAAE,YAAY;YAAEC,QAAQ,EAAE;UAAgB,CAAC,EAChD4E,oBAAS,CAAC3E,MAAM,CAACmH,gCAAgC,EACjD;YAAC1G,KAAK,EAAEqG,OAAO,CAACM;UAAc,CAChC,CAAC;QACH;QAEA,IAAInB,mBAAmB,IAAIC,8BAA8B,EAAE;UACzD,IAAI,CAACpH,UAAU,CACb;YAACgB,IAAI,EAAE,YAAY;YAAEC,QAAQ,EAAE;UAAgB,CAAC,EAChD4E,oBAAS,CAAC3E,MAAM,CAACqH,0BAA0B,EAC3C;YAAC5G,KAAK,EAAEqG,OAAO,CAACQ;UAAS,CAC3B,CAAC;QACH;QAEA,IAAInB,gCAAgC,EAAE;UACpC,IAAI,CAACrH,UAAU,CACb;YAACgB,IAAI,EAAE,YAAY;YAAEC,QAAQ,EAAE;UAAgB,CAAC,EAChD4E,oBAAS,CAAC3E,MAAM,CAACuH,2CAA2C,EAC5D;YAAC9G,KAAK,EAAEqG,OAAO,CAACU;UAAsB,CACxC,CAAC;QACH;QAEA,IAAIpB,mBAAmB,EAAE;UACvB,IAAI,CAACtH,UAAU,CACb;YAACgB,IAAI,EAAE,YAAY;YAAEC,QAAQ,EAAE;UAAgB,CAAC,EAChD4E,oBAAS,CAAC3E,MAAM,CAACyH,2BAA2B,EAC5C;YAAChH,KAAK,EAAEqG,OAAO,CAACY;UAAS,CAC3B,CAAC;QACH;QAEA,IAAIrB,eAAe,EAAE;UACnB,IAAI,CAACvH,UAAU,CACb;YAACgB,IAAI,EAAE,YAAY;YAAEC,QAAQ,EAAE;UAAgB,CAAC,EAChD4E,oBAAS,CAAC3E,MAAM,CAAC2H,sBAAsB,EACvC;YAAClH,KAAK,EAAEqG,OAAO,CAACc;UAAK,CACvB,CAAC;QACH;QAEA,IAAIvC,mBAAmB,IAAIC,yBAAyB,EAAE;UACpD,IAAI7E,KAAK,GAAG,IAAI;UAEhB,IAAI6E,yBAAyB,EAAE;YAC7B,IAAIwB,OAAO,CAAC1C,MAAM,CAACyD,MAAM,EAAE;cACzBpH,KAAK,GAAGqH,0BAAe,CAACC,MAAM;YAChC,CAAC,MAAM;cACL;cACAtH,KAAK,GAAGqG,OAAO,CAAC1C,MAAM,CAAC4D,SAAS,GAAGF,0BAAe,CAACG,OAAO,GAAGH,0BAAe,CAAC7E,IAAI;YACnF;UACF,CAAC,MAAM,IAAIoC,mBAAmB,EAAE;YAC9B5E,KAAK,GAAGqG,OAAO,CAAC1C,MAAM,CAAC4D,SAAS,GAAGF,0BAAe,CAACI,SAAS,GAAGJ,0BAAe,CAAC7E,IAAI;UACrF;UAEA,IAAI,CAACnE,UAAU,CACb;YACEgB,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4E,oBAAS,CAAC3E,MAAM,CAACmI,0BAA0B,EAC3C;YACE1H,KAAK,EAALA,KAAK;YACL4D,UAAU,EAAEyC,OAAO,CAAC1C,MAAM,CAACC,UAAU;YACrC+D,YAAY,EAAEtB,OAAO,CAAC1C,MAAM,CAACgE;UAC/B,CACF,CAAC;QACH;QAEA,IAAI7C,0BAA0B,EAAE;UAC9B,IAAO8C,mBAAmB,GAAIvB,OAAO,CAACwB,gBAAgB,CAA/CD,mBAAmB;UAE1B,IAAI,CAACvJ,UAAU,CACb;YACEgB,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4E,oBAAS,CAAC3E,MAAM,CAACuI,kCAAkC,EACnD;YACEF,mBAAmB,EAAnBA;UACF,CACF,CAAC;QACH;QAEA,IAAI7C,oBAAoB,EAAE;UACxB,IAAAgD,mBAAA,GAAgC1B,OAAO,CAAC2B,UAAU;YAA3CC,YAAY,GAAAF,mBAAA,CAAZE,YAAY;YAAEC,OAAO,GAAAH,mBAAA,CAAPG,OAAO;UAE5B,IAAI,CAAC7J,UAAU,CACb;YACEgB,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4E,oBAAS,CAAC3E,MAAM,CAAC4I,mCAAmC,EACpD;YACEF,YAAY,EAAZA,YAAY;YACZC,OAAO,EAAPA;UACF,CACF,CAAC;QACH;QAEA,IAAIlD,kCAAkC,EAAE;UACtC,IAAOoD,cAAc,GAAI/B,OAAO,CAAC2B,UAAU,CAApCI,cAAc;UAErB,IAAI,CAAC/J,UAAU,CACb;YACEgB,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4E,oBAAS,CAAC3E,MAAM,CAAC8I,sDAAsD,EACvE;YACED,cAAc,EAAdA;UACF,CACF,CAAC;QACH;QAEA,IAAInD,uBAAuB,EAAE;UAC3B,IAAOqD,OAAO,GAAIjC,OAAO,CAACkC,oBAAoB,CAAvCD,OAAO;UAEd,IAAI,CAACjK,UAAU,CACb;YACEgB,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4E,oBAAS,CAAC3E,MAAM,CAACiJ,uCAAuC,EACxD;YACEF,OAAO,EAAPA;UACF,CACF,CAAC;QACH;QAEA,IAAInD,kBAAkB,EAAE;UACtB,IAAOsD,QAAQ,GAAIpC,OAAO,CAAnBoC,QAAQ;UACfA,QAAQ,CAACC,cAAc,GAAGC,kBAAS,CAACC,yBAAyB,CAC3D7M,IAAI,EACJ,IAAI,CAAC1F,KAAK,CAACkL,QAAQ,CAACsH,MAAM,CAACtR,GAC7B,CAAC;UACD,IAAI,CAAC8G,UAAU,CACb;YACEgB,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4E,oBAAS,CAAC3E,MAAM,CAACuJ,iCAAiC,EAClD;YACEL,QAAQ,EAARA;UACF,CACF,CAAC;QACH;QAEA,IAAI5C,wBAAwB,EAAE;UAC5B,IAAOkD,cAAc,GAAI1C,OAAO,CAAzB0C,cAAc;UACrB,IAAI,CAAC1K,UAAU,CACb;YACEgB,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4E,oBAAS,CAAC3E,MAAM,CAACyJ,uCAAuC,EACxD;YACED,cAAc,EAAdA;UACF,CACF,CAAC;QACH;QAEA,IAAI7D,uBAAuB,EAAE;UAC3B,IAAO+D,aAAa,GAAI5C,OAAO,CAAxB4C,aAAa;UAEpB,IAAI,CAAC7S,aAAa,CAAC;YAAC6S,aAAa,EAAbA;UAAa,CAAC,CAAC;UAEnC,IAAI,CAAC5K,UAAU,CACb;YACEgB,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4E,oBAAS,CAAC3E,MAAM,CAAC2J,gCAAgC,EACjD;YACED,aAAa,EAAbA;UACF,CACF,CAAC;QACH;;QAEA;QACA;QACA,IAAI7D,sBAAsB,EAAE;UAC1B,IAAO+D,YAAY,GAAI9C,OAAO,CAAvB8C,YAAY;UAEnB,IAAI,CAAC/S,aAAa,CAAC;YAACgT,kBAAkB,EAAED;UAAY,CAAC,CAAC;UAEtD,IAAI,CAAC9K,UAAU,CACb;YACEgB,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4E,oBAAS,CAAC3E,MAAM,CAAC8J,qCAAqC,EACtD;YACE;YACAC,aAAa,EAAEH;UACjB,CACF,CAAC;QACH;QAEA,IAAIrD,iBAAiB,EAAE;UACrB,IAAI,CAACzH,UAAU,CACb;YAACgB,IAAI,EAAE,YAAY;YAAEC,QAAQ,EAAE;UAAgB,CAAC,EAChD4E,oBAAS,CAAC3E,MAAM,CAACgK,wBAAwB,EACzC;YAACvJ,KAAK,EAAEqG,OAAO,CAACmD;UAAc,CAChC,CAAC;QACH;QAEA,IAAIzD,qBAAqB,EAAE;UACzB,IAAI,CAAC1H,UAAU,CACb;YAACgB,IAAI,EAAE,YAAY;YAAEC,QAAQ,EAAE;UAAgB,CAAC,EAChD4E,oBAAS,CAAC3E,MAAM,CAACkK,6BAA6B,EAC9C;YAACzJ,KAAK,EAAEqG,OAAO,CAACqD;UAAW,CAC7B,CAAC;QACH;QAEA,IAAI1D,gCAAgC,EAAE;UACpC,IAAI,CAAC3H,UAAU,CACb;YAACgB,IAAI,EAAE,YAAY;YAAEC,QAAQ,EAAE;UAAgB,CAAC,EAChD4E,oBAAS,CAAC3E,MAAM,CAACoK,wCAAwC,EACzD;YAAC3J,KAAK,EAAEqG,OAAO,CAACuD;UAAe,CACjC,CAAC;QACH;QAEA,IAAI3D,mBAAmB,EAAE;UACvB,IAAI,CAAC5H,UAAU,CACb;YAACgB,IAAI,EAAE,YAAY;YAAEC,QAAQ,EAAE;UAAgB,CAAC,EAChD4E,oBAAS,CAAC3E,MAAM,CAACsK,2BAA2B,EAC5C;YAAC7J,KAAK,EAAEqG,OAAO,CAACyD;UAAW,CAC7B,CAAC;QACH;QAEA,IAAI5D,2BAA2B,EAAE;UAC/B,IAAI,CAAC7H,UAAU,CACb;YAACgB,IAAI,EAAE,YAAY;YAAEC,QAAQ,EAAE;UAAgB,CAAC,EAChD4E,oBAAS,CAAC3E,MAAM,CAACwK,2BAA2B,EAC5C;YAAC/J,KAAK,EAAEqG,OAAO,CAAC2D;UAAiB,CACnC,CAAC;QACH;QAEA,IAAI7D,8BAA8B,EAAE;UAClC,IAAI,CAAC9H,UAAU,CACb;YAACgB,IAAI,EAAE,YAAY;YAAEC,QAAQ,EAAE;UAAgB,CAAC,EAChD4E,oBAAS,CAAC3E,MAAM,CAAC0K,uCAAuC,EACxD;YAACjK,KAAK,EAAEqG,OAAO,CAAC6D;UAAU,CAC5B,CAAC;QACH;QAEA,IAAI9D,0BAA0B,EAAE;UAC9B,IAAI,CAAC/H,UAAU,CACb;YAACgB,IAAI,EAAE,YAAY;YAAEC,QAAQ,EAAE;UAAgB,CAAC,EAChD4E,oBAAS,CAAC3E,MAAM,CAAC4K,2BAA2B,EAC5C;YAACnK,KAAK,EAAEqG,OAAO,CAAC+D;UAAgB,CAClC,CAAC;QACH;QAEA,IAAI,CAACtO,QAAQ,GAAGA,QAAQ;MAC1B;IACF;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAA5E,GAAA;IAAAjE,KAAA,EAMA,SAAA0I,sBAAsBC,eAAuB,EAAE9D,IAAS,EAAE;MACxD,IAAI8D,eAAe,IAAI,CAAC,IAAA2I,eAAO,EAAC,IAAI,CAAC3I,eAAe,EAAEA,eAAe,CAAC,EAAE;QACtE,IAAI,CAACA,eAAe,GAAGA,eAAe;QACtC,IAAI,CAACxF,aAAa,CAAC;UAACwF,eAAe,EAAfA;QAAe,CAAC,CAAC;MACvC,CAAC,MAAM,IACL9D,IAAI,IACJA,IAAI,CAAC8D,eAAe,IACpB,CAAC,IAAA2I,eAAO,EAAC,IAAI,CAAC3I,eAAe,EAAE9D,IAAI,CAAC8D,eAAe,CAAC,EACpD;QACA,IAAI,CAACA,eAAe,GAAG9D,IAAI,CAAC8D,eAAe;QAC3C,IAAI,CAACxF,aAAa,CAAC;UAACwF,eAAe,EAAE9D,IAAI,CAAC8D;QAAe,CAAC,CAAC;MAC7D;IACF;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAA1E,GAAA;IAAAjE,KAAA,EAKA,SAAAgN,cAAcjF,OAAe,EAAE;MAC7B,IAAIA,OAAO,IAAI,CAAC,IAAAuJ,eAAO,EAAC,IAAI,CAACvJ,OAAO,EAAEA,OAAO,CAAC,EAAE;QAC9C,IAAI,CAACA,OAAO,GAAGA,OAAO;MACxB;IACF;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAA9D,GAAA;IAAAjE,KAAA,EAKA,SAAA0J,eAAeE,QAAsD,EAAE;MACrE,IAAIA,QAAQ,IAAI,CAAC,IAAA0H,eAAO,EAAC,IAAI,CAAC1H,QAAQ,EAAEA,QAAQ,CAAC,EAAE;QACjD,IAAI,CAACA,QAAQ,GAAGA,QAAQ;QACxB,IAAI,CAACwB,UAAU,CACb;UACEgB,IAAI,EAAE,YAAY;UAClBC,QAAQ,EAAE;QACZ,CAAC,EACD4E,oBAAS,CAAC3E,MAAM,CAAC8K,cAAc,EAC/B;UACExN,QAAQ,EAARA;QACF,CACF,CAAC;MACH;IACF;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAA3F,GAAA;IAAAjE,KAAA,EAKA,SAAA6J,gBAAgBC,SAAmD,EAAE;MACnE,IAAIA,SAAS,IAAI,CAAC,IAAAwH,eAAO,EAAC,IAAI,CAACxH,SAAS,EAAEA,SAAS,CAAC,EAAE;QACpD,IAAI,CAACA,SAAS,GAAGA,SAAS;QAC1B,IAAI,CAACsB,UAAU,CACb;UACEgB,IAAI,EAAE,YAAY;UAClBC,QAAQ,EAAE;QACZ,CAAC,EACD4E,oBAAS,CAAC3E,MAAM,CAAC+K,eAAe,EAChC;UACEvN,SAAS,EAATA;QACF,CACF,CAAC;MACH;IACF;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAA7F,GAAA;IAAAjE,KAAA,EAKA,SAAAgJ,gBAAgBC,SAAiB,EAAE;MACjC,IAAIA,SAAS,IAAI,CAAC,IAAAqI,eAAO,EAAC,IAAI,CAACrI,SAAS,EAAEA,SAAS,CAAC,EAAE;QACpD,IAAM9G,MAAM,GAAGmV,kBAAS,CAACC,YAAY,CAAC,IAAI,CAACtO,SAAS,EAAEA,SAAS,CAAC;QAEhE,IAAI,CAAC9F,aAAa,CAAChB,MAAM,CAACiR,OAAO,CAAC;QAElC,IAAIjR,MAAM,CAACuP,OAAO,CAAC8F,qBAAqB,EAAE;UACxC,IAAI,CAACpM,UAAU,CACb;YACEgB,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4E,oBAAS,CAAC3E,MAAM,CAACmL,+BAA+B,EAChD;YACEC,aAAa,EAAEvV,MAAM,CAACwV,QAAQ,IAAIxV,MAAM,CAACwV,QAAQ,CAACC,YAAY;YAC9DC,YAAY,EAAE1V,MAAM,CAACiR,OAAO,CAACwE;UAC/B,CACF,CAAC;QACH;QAEA,IAAIzV,MAAM,CAACuP,OAAO,CAACoG,oBAAoB,EAAE;UACvC,IAAI,CAAC1M,UAAU,CACb;YACEgB,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4E,oBAAS,CAAC3E,MAAM,CAACyL,sBAAsB,EACvC;YACE9L,IAAI,EAAE9J,MAAM,CAACiR,OAAO,CAACnH;UACvB,CACF,CAAC;QACH;QACA,IAAI,CAACvI,WAAW,CAACuF,SAAS,GAAG9G,MAAM,CAACiR,OAAO;QAC3C,IAAI,CAACnK,SAAS,GAAGA,SAAS;MAC5B;IACF;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAAhF,GAAA;IAAAjE,KAAA,EAOA,SAAAsJ,eAAeC,IAAY,EAAE;MAC3B,IAAIA,IAAI,IAAI,CAAC,IAAA+H,eAAO,EAAC,IAAI,CAAC/H,IAAI,EAAEA,IAAI,CAAC,EAAE;QACrC,IAAMyO,WAAW,GAAGC,kBAAS,CAACC,QAAQ,CAAC,IAAI,CAAC3O,IAAI,EAAEA,IAAI,CAAC;QAEvD,IAAI,CAACpG,aAAa,CAAC6U,WAAW,CAAC5E,OAAO,CAAC;QACvC,IAAI,CAAC1P,WAAW,CAAC6F,IAAI,GAAGyO,WAAW,CAAC5E,OAAO;QAC3C,IAAI4E,WAAW,CAACtG,OAAO,CAACyG,SAAS,EAAE;UACjC,IAAI,CAACtU,qBAAqB,CAACiM,kBAAkB,GAAG,IAAI;UACpD,IAAI,CAAC1E,UAAU,CACb;YACEgB,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACDC,iBAAM,CAAC8L,sBAAsB,EAC7B;YACEC,OAAO,EAAEL,WAAW,CAAC5E,OAAO;YAC5BkF,OAAO,EAAEN,WAAW,CAACL;UACvB,CACF,CAAC;QACH;QACA,IAAI,CAACpO,IAAI,GAAGA,IAAI;MAClB,CAAC,MAAM;QACL,IAAI,CAAC1F,qBAAqB,CAACiM,kBAAkB,GAAG,KAAK;MACvD;IACF;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAA7L,GAAA;IAAAjE,KAAA,EAMA,SAAAkJ,kBAAkBrE,IAAY,EAAEiE,IAAa,EAAE;MAAA,IAAAyP,qBAAA;MAC7C,IAAMC,KAAK,GAAG1P,IAAI,GAAG4M,kBAAS,CAAC+C,QAAQ,CAAC3P,IAAI,CAAC,GAAG,EAAAyP,qBAAA,OAAI,CAAC7U,WAAW,CAACoF,IAAI,cAAAyP,qBAAA,uBAArBA,qBAAA,CAAuBC,KAAK,KAAI,EAAE;MAClF,IAAK3T,IAAI,IAAI,CAAC,IAAAyM,eAAO,EAAC,IAAI,CAACzM,IAAI,EAAEA,IAAI,CAAC,IAAM,CAAC,IAAAyM,eAAO,EAAC,IAAI,CAACkH,KAAK,EAAEA,KAAK,CAAC,IAAI3T,IAAK,EAAE;QAChF,IAAM6T,QAAQ,GAAGhD,kBAAS,CAACgD,QAAQ,CAAC5P,IAAI,IAAI,IAAI,CAACpF,WAAW,CAACoF,IAAI,CAAC;QAClE,IAAM6P,UAAU,GAAGC,kBAAS,CAACC,QAAQ,CAAC,IAAI,CAACnV,WAAW,CAACmB,IAAI,EAAEA,IAAI,EAAE2T,KAAK,EAAEE,QAAQ,CAAC;QAEnF,IAAIC,UAAU,CAACjH,OAAO,CAACoH,QAAQ,EAAE;UAC/B,IAAI,CAAC1N,UAAU,CACb;YACEgB,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4E,oBAAS,CAAC3E,MAAM,CAACyM,cAAc,EAC/BlU,IACF,CAAC;QACH;QACA,IAAI8T,UAAU,CAACjH,OAAO,CAACsH,UAAU,EAAE;UACjC,IAAI,CAAC5N,UAAU,CACb;YACEgB,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4E,oBAAS,CAAC3E,MAAM,CAAC2M,gBAAgB,EACjCpU,IACF,CAAC;QACH;QAEA,IAAI,CAACA,IAAI,GAAGA,IAAI;QAChB,IAAI,CAACnB,WAAW,CAACmB,IAAI,GAAG8T,UAAU,CAACvF,OAAO;QAC1C;QACA,IAAI,CAACjQ,aAAa,CAACwV,UAAU,CAACvF,OAAO,CAAC;QAEtC,IAAI,CAAChI,UAAU,CACb;UACEgB,IAAI,EAAE,YAAY;UAClBC,QAAQ,EAAE;QACZ,CAAC,EACD4E,oBAAS,CAAC3E,MAAM,CAAC4M,oBAAoB,EACrC;UACEC,cAAc,EAAE,CAACrQ,IAAI,CAAE;QACzB,CACF,CAAC;MACH;;MACA,IAAI,CAAC0P,KAAK,GAAGA,KAAK;IACpB;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAAvU,GAAA;IAAAjE,KAAA,EAKA,SAAAmJ,mBAAmBC,YAAoB,EAAE;MACvC;MACA,IAAIgQ,0BAAiB,CAACC,UAAU,CAAC,IAAI,CAACjQ,YAAY,EAAEA,YAAY,CAAC,EAAE;QACjE;MACF;MAEA,IAAMkQ,kBAAkB,GAAGF,0BAAiB,CAACpP,KAAK,CAACZ,YAAY,CAAC;MAEhE,IAAI,CAACjG,aAAa,CAAC;QAACiG,YAAY,EAAEkQ;MAAkB,CAAC,CAAC;MAEtD,IAAI,CAAClO,UAAU,CACb;QACEgB,IAAI,EAAE,YAAY;QAClBC,QAAQ,EAAE;MACZ,CAAC,EACD4E,oBAAS,CAAC3E,MAAM,CAACiN,qBAAqB,EACtCD,kBACF,CAAC;MACD,IAAI,CAAClQ,YAAY,GAAGA,YAAY;IAClC;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EAPE;IAAAnF,GAAA;IAAAjE,KAAA,EAQA,SAAAwJ,kBAAkBC,WAAmB,EAAuB;MAAA,IAArB+P,WAAW,GAAAlX,SAAA,CAAA5C,MAAA,QAAA4C,SAAA,QAAAwF,SAAA,GAAAxF,SAAA,MAAG,KAAK;MACxD,IAAImH,WAAW,KAAK,CAAC,IAAA6H,eAAO,EAAC,IAAI,CAAC7H,WAAW,EAAEA,WAAW,CAAC,IAAI+P,WAAW,CAAC,EAAE;QAC3E,IAAMC,iBAAiB,GAAGC,yBAAgB,CAACC,cAAc,CAAC,IAAI,CAAClQ,WAAW,EAAEA,WAAW,CAAC;QAExF,IAAI,CAACtG,aAAa,CAACsW,iBAAiB,CAACrG,OAAO,CAAC;QAC7C,IAAI,CAAC1P,WAAW,CAAC+F,WAAW,GAAGgQ,iBAAiB,CAACrG,OAAO;QACxD,IAAI,CAAC3J,WAAW,GAAGA,WAAW;QAC9B,IAAI,CAAC2B,UAAU,CACb;UACEgB,IAAI,EAAE,YAAY;UAClBC,QAAQ,EAAE;QACZ,CAAC,EACDC,iBAAM,CAACsN,8BAA8B,EACrC;UACExG,OAAO,EAAEqG,iBAAiB,CAACrG,OAAO;UAClCuE,QAAQ,EAAE8B,iBAAiB,CAAC9B,QAAQ;UACpC6B,WAAW,EAAXA;QACF,CACF,CAAC;MACH;IACF;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAAvV,GAAA;IAAAjE,KAAA,EAKA,SAAAiN,sBAAsBhF,eAAuB,EAAE;MAC7C,IAAIA,eAAe,IAAI,CAAC,IAAAqJ,eAAO,EAAC,IAAI,CAACrJ,eAAe,EAAEA,eAAe,CAAC,EAAE;QACtE,IAAI,CAACA,eAAe,GAAGA,eAAe;MACxC;IACF;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAAhE,GAAA;IAAAjE,KAAA,EAKA,SAAAkN,cAAcC,OAAe,EAAE;MAC7B,IAAIA,OAAO,IAAI,CAAC,IAAAmE,eAAO,EAAC,IAAI,CAACnE,OAAO,EAAEA,OAAO,CAAC,EAAE;QAC9C,IAAI,CAACA,OAAO,GAAGA,OAAO;MACxB;IACF;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAAlJ,GAAA;IAAAjE,KAAA,EAOA,SAAAqJ,WAAWP,IAAS,EAAE;MACpB,IAAIA,IAAI,EAAE;QACR;QACA,IAAM+Q,YAAY,GAAGnE,kBAAS,CAACoE,SAAS,CACtC,IAAI,CAACpW,WAAW,CAACoF,IAAI,EACrBA,IAAI,EACJ,IAAI,CAAC1F,KAAK,CAACkL,QAAQ,CAACsH,MAAM,CAACtR,GAAG,EAC9B,IAAI,CAACiE,YAAY,CAAC;QACpB,CAAC;;QAED,IAAI,CAACpF,aAAa,CAAC0W,YAAY,CAACzG,OAAO,CAAC;QACxC,IAAI,CAAC1P,WAAW,CAACoF,IAAI,GAAG+Q,YAAY,CAACzG,OAAO;QAE5C,IAAM2G,OAAO,GAAG,IAAI,CAACrW,WAAW,CAACC,MAAM,CAAC,IAAI,CAACD,WAAW,CAACC,MAAM,CAACjE,MAAM,GAAG,CAAC,CAAC;QAE3E,IAAIqa,OAAO,KAAKF,YAAY,CAACzG,OAAO,CAACrG,KAAK,EAAE;UAC1C,IAAI,CAACrJ,WAAW,CAACC,MAAM,CAACqW,IAAI,CAACH,YAAY,CAACzG,OAAO,CAACrG,KAAK,CAAC;QAC1D;;QAEA;QACA;QACA,IAAM5K,MAAM,GAAGuT,kBAAS,CAACuE,SAAS,CAChC,IAAI,CAACvM,eAAe,CAAC,IAAI,CAACnF,YAAY,EAAEO,IAAI,CAAC,EAC7C,IAAI,CAACpF,WAAW,CAACuF,SAAS,CAACgD,IAAI,EAC/B,IAAI,CAACvI,WAAW,CAACmB,IAAI,CAACqV,MACxB,CAAC;QAED,IAAI/X,MAAM,CAAC+X,MAAM,EAAE;UACjB,IAAI,CAAC/W,aAAa,CAAChB,MAAM,CAAC;QAC5B;QAEA,IAAI0X,YAAY,CAACnI,OAAO,CAACyI,gBAAgB,EAAE;UACzC,IAAI,CAACtW,qBAAqB,CAACkM,kBAAkB,GAAG,IAAI;QACtD,CAAC,MAAM;UACL,IAAI,CAAClM,qBAAqB,CAACkM,kBAAkB,GAAG,KAAK;QACvD;QAEA,IAAI8J,YAAY,CAACnI,OAAO,CAAC0I,aAAa,EAAE;UACtC,IAAI,CAAChP,UAAU,CACb;YACEgB,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4E,oBAAS,CAAC3E,MAAM,CAAC+N,+BAA+B,EAChD;YAACC,MAAM,EAAET,YAAY,CAACzG,OAAO,CAACkH;UAAM,CACtC,CAAC;QACH;QAEA,IAAIT,YAAY,CAACnI,OAAO,CAAC6I,gBAAgB,EAAE;UACzC,IAAI,CAACnP,UAAU,CACb;YACEgB,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4E,oBAAS,CAAC3E,MAAM,CAACkO,8BAA8B,EAC/C;YAACC,gBAAgB,EAAEZ,YAAY,CAACzG,OAAO,CAACqH;UAAgB,CAC1D,CAAC;QACH;QAEA,IAAIZ,YAAY,CAACnI,OAAO,CAACgJ,UAAU,EAAE;UACnC,IAAI,CAACtP,UAAU,CACb;YACEgB,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4E,oBAAS,CAAC3E,MAAM,CAACqO,wBAAwB,EACzC;YACEC,GAAG,EAAEf,YAAY,CAACzG,OAAO,CAACwH;UAC5B,CACF,CAAC;QACH;QAEA,IAAIf,YAAY,CAACnI,OAAO,CAACmJ,qBAAqB,EAAE;UAC9C,IAAI,CAACzP,UAAU,CACb;YACEgB,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4E,oBAAS,CAAC3E,MAAM,CAACwO,mCAAmC,EACpD;YACEhF,cAAc,EAAE+D,YAAY,CAACzG,OAAO,CAAC0C,cAAc;YACnDiF,iBAAiB,EAAElB,YAAY,CAACzG,OAAO,CAACxC;UAC1C,CACF,CAAC;QACH;QAEA,IAAIiJ,YAAY,CAACnI,OAAO,CAACsJ,yBAAyB,EAAE;UAClD,IAAI,CAAC5P,UAAU,CACb;YACEgB,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4E,oBAAS,CAAC3E,MAAM,CAAC2O,4BAA4B,EAC7C;YAAC1V,MAAM,EAAEuD,IAAI,CAACvD;UAAM,CACtB,CAAC;QACH;QAEA,IAAIsU,YAAY,CAACnI,OAAO,CAACyI,gBAAgB,EAAE;UACzC,IAAI,CAAC/O,UAAU,CACb;YACEgB,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4E,oBAAS,CAAC3E,MAAM,CAAC4O,sBAAsB,EACvCpS,IACF,CAAC;QACH;QAEA,IAAI+Q,YAAY,CAACnI,OAAO,CAACyJ,cAAc,EAAE;UAAA,IAAAC,qBAAA,EAAAC,qBAAA;UACvC,IAAI,CAACjQ,UAAU,CACb;YACEgB,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4E,oBAAS,CAAC3E,MAAM,CAACgP,kBAAkB,EACnC;YAACC,QAAQ,GAAAH,qBAAA,GAAEvB,YAAY,CAAClC,QAAQ,cAAAyD,qBAAA,uBAArBA,qBAAA,CAAuB5C,KAAK;YAAEgD,QAAQ,GAAAH,qBAAA,GAAExB,YAAY,CAACzG,OAAO,cAAAiI,qBAAA,uBAApBA,qBAAA,CAAsB7C;UAAK,CAChF,CAAC;QACH;QAEA,IAAIqB,YAAY,CAACnI,OAAO,CAAC+J,2BAA2B,EAAE;UACpD,IAAI,CAACrQ,UAAU,CACb;YACEgB,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4E,oBAAS,CAAC3E,MAAM,CAAC8J,qCAAqC,EACtD;YACEsF,KAAK,EAAE7B,YAAY,CAACzG,OAAO,CAACuI;YAC5B;UACF,CACF,CAAC;QACH;;QACA,IAAI9B,YAAY,CAACnI,OAAO,CAACkK,gCAAgC,EAAE;UACzD,IAAI,CAACxQ,UAAU,CACb;YACEgB,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4E,oBAAS,CAAC3E,MAAM,CAACuP,qBAAqB,EACtC;YACEH,KAAK,EAAE7B,YAAY,CAACzG,OAAO,CAAC0I,WAAW;YACvCzF,aAAa,EAAEwD,YAAY,CAACzG,OAAO,CAACiD;UACtC,CACF,CAAC;QACH;QACA,IAAIwD,YAAY,CAACnI,OAAO,CAACqK,sBAAsB,EAAE;UAC/C,IAAI,CAAC3Q,UAAU,CACb;YACEgB,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4E,oBAAS,CAAC3E,MAAM,CAAC0P,+BAA+B,EAChD;YACEN,KAAK,EAAE7B,YAAY,CAACzG,OAAO,CAAC0I,WAAW;YACvCzF,aAAa,EAAEwD,YAAY,CAACzG,OAAO,CAACiD;UACtC,CACF,CAAC;QACH;QACA,IAAIwD,YAAY,CAACnI,OAAO,CAACuK,iCAAiC,EAAE;UAC1D,IAAI,CAAC7Q,UAAU,CACb;YACEgB,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4E,oBAAS,CAAC3E,MAAM,CAAC4P,sBAAsB,EACvC,CAAC,CACH,CAAC;QACH;QACA,IAAIrC,YAAY,CAACnI,OAAO,CAACyK,mBAAmB,EAAE;UAC5C,IAAI,CAAC/Q,UAAU,CACb;YACEgB,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4E,oBAAS,CAAC3E,MAAM,CAAC8P,qBAAqB,EACtCtT,IACF,CAAC;QACH;QACA,IAAI+Q,YAAY,CAACnI,OAAO,CAAC2K,mBAAmB,EAAE;UAC5C,IAAI,CAACjR,UAAU,CACb;YACEgB,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4E,oBAAS,CAAC3E,MAAM,CAACgQ,mBAAmB,EACpCxT,IACF,CAAC;QACH;QAEA,IAAI+Q,YAAY,CAACnI,OAAO,CAAC6K,eAAe,EAAE;UACxC,IAAI,CAACnR,UAAU,CACb;YACEgB,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC;UACD;UACA4E,oBAAS,CAAC3E,MAAM,CAACkQ,gBAAgB,EACjC9G,kBAAS,CAAC+G,cAAc,CAAC3T,IAAI,CAAC4T,aAAa,CAC7C,CAAC;QACH;QAEA,IACE7C,YAAY,CAACnI,OAAO,CAACiL,gBAAgB,IACrC9C,YAAY,CAACnI,OAAO,CAACkL,gBAAgB,IACrC/C,YAAY,CAACnI,OAAO,CAACmL,gBAAgB,EACrC;UAAA,IAAAC,sBAAA,EAAAC,sBAAA,EAAAC,sBAAA;UACA,IAAI,CAAC5R,UAAU,CACb;YACEgB,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4E,oBAAS,CAAC3E,MAAM,CAAC2Q,mBAAmB,EACpC;YACEC,WAAW,GAAAJ,sBAAA,GAAEjD,YAAY,CAACzG,OAAO,CAAC+J,kBAAkB,cAAAL,sBAAA,uBAAvCA,sBAAA,CAAyCM,KAAK;YAC3DC,WAAW,GAAAN,sBAAA,GAAElD,YAAY,CAACzG,OAAO,CAAC+J,kBAAkB,cAAAJ,sBAAA,uBAAvCA,sBAAA,CAAyC7I,KAAK;YAC3DoJ,WAAW,GAAAN,sBAAA,GAAEnD,YAAY,CAACzG,OAAO,CAAC+J,kBAAkB,cAAAH,sBAAA,uBAAvCA,sBAAA,CAAyCO;UACxD,CACF,CAAC;QACH;QAEA,IAAI1D,YAAY,CAACnI,OAAO,CAAC8L,eAAe,EAAE;UACxC,IAAI,CAACpS,UAAU,CACb;YACEgB,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4E,oBAAS,CAAC3E,MAAM,CAACmR,cACnB,CAAC;QACH;QAEA,IAAI5D,YAAY,CAACnI,OAAO,CAACgM,mCAAmC,EAAE;UAC5D,IAAI,CAACtS,UAAU,CACb;YACEgB,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4E,oBAAS,CAAC3E,MAAM,CAACqR,wCAAwC,EACzD;YAACC,4BAA4B,EAAE/D,YAAY,CAACzG,OAAO,CAACwK;UAA4B,CAClF,CAAC;QACH;QAEA,IAAI/D,YAAY,CAACnI,OAAO,CAACmM,uBAAuB,EAAE;UAChD,IAAI,CAACzS,UAAU,CACb;YACEgB,IAAI,EAAE,YAAY;YAClBC,QAAQ,EAAE;UACZ,CAAC,EACD4E,oBAAS,CAAC3E,MAAM,CAACwR,8BAA8B,EAC/C;YAACC,gBAAgB,EAAElE,YAAY,CAACzG,OAAO,CAAC2K;UAAgB,CAC1D,CAAC;QACH;QAEA,IAAI,CAAC3S,UAAU,CACb;UACEgB,IAAI,EAAE,YAAY;UAClBC,QAAQ,EAAE;QACZ,CAAC,EACDC,iBAAM,CAAC0R,sBAAsB,EAC7B;UACEC,OAAO,EAAEpE,YAAY,CAAClC,QAAQ;UAC9BuG,OAAO,EAAErE,YAAY,CAACzG;QACxB,CACF,CAAC;QACD,IAAI,CAAC1P,WAAW,CAACoF,IAAI,GAAG+Q,YAAY,CAACzG,OAAO;QAC5C;QACA,IAAI,CAACtK,IAAI,GAAGA,IAAI;MAClB,CAAC,MAAM;QACL,IAAI,CAACjF,qBAAqB,CAACkM,kBAAkB,GAAG,KAAK;MACvD;IACF;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAA9L,GAAA;IAAAjE,KAAA,EAMA,SAAA+I,eAAezE,GAAW,EAAE;MAC1B,IAAIA,GAAG,IAAI,IAAI,CAACA,GAAG,KAAKA,GAAG,EAAE;QAC3B,IAAI,CAACA,GAAG,GAAGA,GAAG;QACd,IAAI,CAACnB,aAAa,CAAC;UAACuB,QAAQ,EAAEJ;QAAG,CAAC,CAAC;QACnC,IAAI,CAAC8G,UAAU,CACb;UACEgB,IAAI,EAAE,YAAY;UAClBC,QAAQ,EAAE;QACZ,CAAC,EACDC,iBAAM,CAAC6R,qBAAqB,EAC5B7Z,GACF,CAAC;MACH;IACF;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAAL,GAAA;IAAAjE,KAAA,EAKA,SAAAoN,aAAajF,MAAc,EAAE;MAC3B,IAAIA,MAAM,IAAI,CAAC,IAAAmJ,eAAO,EAAC,IAAI,CAACnJ,MAAM,EAAEA,MAAM,CAAC,EAAE;QAC3C,IAAI,CAACA,MAAM,GAAGA,MAAM;MACtB;IACF;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAAlE,GAAA;IAAAjE,KAAA,EAKA,SAAAqN,iBAAiBhH,YAAoB,EAAE;MACrC,IAAIA,YAAY,IAAI,CAAC,IAAAiL,eAAO,EAAC,IAAI,CAACjL,YAAY,EAAEA,YAAY,CAAC,EAAE;QAC7D,IAAI,CAACA,YAAY,GAAGA,YAAY;MAClC;IACF;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAApC,GAAA;IAAAjE,KAAA,EAKA,SAAAsN,eAAelF,QAAgB,EAAE;MAC/B,IAAIA,QAAQ,IAAI,CAAC,IAAAkJ,eAAO,EAAC,IAAI,CAAClJ,QAAQ,EAAEA,QAAQ,CAAC,EAAE;QACjD,IAAI,CAACA,QAAQ,GAAGA,QAAQ;MAC1B;IACF;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAAnE,GAAA;IAAAjE,KAAA,EAKA,SAAAuN,iBAAiBlF,UAAkB,EAAE;MACnC,IAAIA,UAAU,IAAI,CAAC,IAAAiJ,eAAO,EAAC,IAAI,CAACjJ,UAAU,EAAEA,UAAU,CAAC,EAAE;QACvD,IAAI,CAACA,UAAU,GAAGA,UAAU;MAC9B;IACF;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAApE,GAAA;IAAAjE,KAAA,EAKA,SAAAwN,kBAAkBlF,UAAsB,EAAE;MACxC,IAAIA,UAAU,IAAI,CAAC,IAAAgJ,eAAO,EAAC,IAAI,CAAChJ,UAAU,EAAEA,UAAU,CAAC,EAAE;QACvD,IAAI,CAACA,UAAU,GAAGA,UAAU;MAC9B;IACF;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAArE,GAAA;IAAAjE,KAAA,EAMA,SAAAwI,iBAAiB1B,KAAU,EAAE;MAC3B,IAAMsX,gBAAgB,GAAGxS,sBAAa,CAACwS,gBAAgB,CAACtX,KAAK,CAAC;MAC9D,IAAIsX,gBAAgB,EAAE;QACpB,IAAI,CAACC,2BAA2B,CAACvX,KAAK,CAAC;MACzC;IACF;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAA7C,GAAA;IAAAjE,KAAA,EAOA,SAAAmK,oBAAoBmU,QAAa,EAAE;MACjC,IAAMC,YAAY,GAAG3S,sBAAa,CAAC4S,sBAAsB,CAAC,IAAI,EAAEF,QAAQ,CAAC;MAEzE,IAAIC,YAAY,CAACE,cAAc,IAAI,IAAI,CAACC,qBAAqB,EAAE;QAC7D,OAAO,IAAAC,iBAAS,EAAC,IAAI,CAACD,qBAAqB,CAAC;MAC9C;MACA,IAAMN,gBAAgB,GACpB,IAAI,CAACM,qBAAqB,IAAI9S,sBAAa,CAACwS,gBAAgB,CAAC,IAAI,CAACM,qBAAqB,CAAC;MAE1F,IAAIN,gBAAgB,EAAE;QAAA,IAAAQ,eAAA,EAAAC,qBAAA,EAAAC,sBAAA;QACpB,IAAMC,QAAQ,GACZ,CAAC7Q,gBAAK,CAACC,KAAK,CAAC6Q,MAAM,EAAE9Q,gBAAK,CAACC,KAAK,CAAC8Q,YAAY,EAAE/Q,gBAAK,CAACC,KAAK,CAACuB,WAAW,CAAC,CAACwP,QAAQ,EAAAN,eAAA,GAC9E,IAAI,CAAC3V,SAAS,cAAA2V,eAAA,uBAAdA,eAAA,CAAgB7R,KAClB,CAAC,IAAI,GAAA8R,qBAAA,GAAC,IAAI,CAACH,qBAAqB,cAAAG,qBAAA,gBAAAC,sBAAA,GAA1BD,qBAAA,CAA4B/V,IAAI,cAAAgW,sBAAA,eAAhCA,sBAAA,CAAkC/Q,OAAO;QAEjD,IAAI,CAACgR,QAAQ,EAAE;UACb,IAAI,CAACI,0BAA0B,CAAC,CAAC;QACnC;MACF;MAEA,OAAOb,QAAQ;IACjB;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;IACE;EAAA;IAAAra,GAAA;IAAAjE,KAAA,EACA,SAAA0M,kBAAkBnE,YAAY,EAAE6W,kBAAkB,EAAE;MAClD,IAAI,CAACA,kBAAkB,IAAI,CAACA,kBAAkB,CAAC1f,MAAM,EAAE,OAAO6I,YAAY;MAC1E,IAAI,CAACA,YAAY,IAAI,CAACA,YAAY,CAAC7I,MAAM,EAAE;QACzC,OAAO0f,kBAAkB;MAC3B;MACAA,kBAAkB,CAACC,OAAO,CAAC,UAACzR,WAAW,EAAK;QAC1C,IAAM0R,UAAU,GAAG/W,YAAY,CAACgX,SAAS,CAAC,UAACC,CAAC;UAAA,OAAKA,CAAC,CAACC,EAAE,KAAK7R,WAAW,CAAC6R,EAAE;QAAA,EAAC;QACzE,IAAIH,UAAU,GAAG,CAAC,CAAC,EAAE;UACnB/W,YAAY,CAACmX,MAAM,CAACJ,UAAU,EAAE,CAAC,EAAE1R,WAAW,CAAC;QACjD,CAAC,MAAM;UACLrF,YAAY,CAACyR,IAAI,CAACpM,WAAW,CAAC;QAChC;MACF,CAAC,CAAC;MAEF,OAAOrF,YAAY;IACrB;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAAtE,GAAA;IAAAjE,KAAA,EAMA,SAAAqe,4BAA4BsB,SAAc,EAAE;MAAA,IAAAC,MAAA;MAC1C,IAAI,CAACD,SAAS,EAAE;QACd;MACF;MACA,IAAME,UAAU,GAAG,IAAAlB,iBAAS,EAACgB,SAAS,CAAC;MACvC,IAAI,IAAI,CAACjB,qBAAqB,EAAE;QAC9B;QACA,IAAAoB,kBAAU,EAAC,IAAI,CAACpB,qBAAqB,EAAEmB,UAAU,EAAE,UAACE,QAAQ,EAAEC,QAAQ,EAAE/b,GAAG,EAAK;UAC9E,IAAIA,GAAG,KAAK,cAAc,EAAE;YAC1B,OAAO2b,MAAI,CAAClT,iBAAiB,CAACqT,QAAQ,EAAEC,QAAQ,CAAC;UACnD;UAEA,OAAOA,QAAQ,IAAID,QAAQ;QAC7B,CAAC,CAAC;MACJ,CAAC,MAAM;QACL,IAAI,CAACrB,qBAAqB,GAAGmB,UAAU;MACzC;IACF;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAA5b,GAAA;IAAAjE,KAAA,EAKA,SAAAmf,2BAAA,EAA6B;MAC3B,IAAI,CAACT,qBAAqB,GAAG,IAAI;IACnC;EAAC;EAAA,OAAA5b,SAAA;AAAA,EAjwDoCmd,oBAAW"}
|
1
|
+
{"version":3,"names":["_lodash","require","_loggerProxy","_interopRequireDefault","_eventsScope","_constants","_infoUtils","_fullState","_selfUtils","_hostUtils","_controlsUtils","_embeddedAppsUtils","_mediaSharesUtils","_parser","_metrics","_constants2","_createForOfIteratorHelper","o","allowArrayLike","it","_Symbol","_Symbol$iterator","_Array$isArray2","_unsupportedIterableToArray","length","i","F","s","n","done","value","e","_e","f","TypeError","normalCompletion","didErr","err","call","step","next","_e2","return","minLen","_arrayLikeToArray","Object","prototype","toString","slice","constructor","name","_Array$from","test","arr","len","arr2","Array","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf2","default","result","NewTarget","_Reflect$construct","arguments","apply","_possibleConstructorReturn2","Reflect","sham","Proxy","Boolean","valueOf","LocusInfo","exports","_EventsScope","_inherits2","_super","updateMeeting","webex","meetingId","_this","_classCallCheck2","_defineProperty2","_assertThisInitialized2","parsedLocus","states","emitChange","compareAndUpdateFlags","locusParser","LocusDeltaParser","_createClass2","key","doLocusSync","meeting","isLocusUrlChanged","locus","_this$locusParser$wor","_this2","url","isDelta","meetingDestroyed","workingCopy","syncUrl","locusUrl","LoggerProxy","logger","info","concat","meetingRequest","getLocusDTO","catch","Metrics","sendBehavioralMetric","BEHAVIORAL_METRICS","LOCUS_DELTA_SYNC_FAILED","correlationId","reason","message","errorName","stack","code","statusCode","meetings","destroy","MEETING_REMOVED_REASON","LOCUS_DTO_SYNC_FAILED","then","res","isEmpty","body","baseSequence","locusInfo","handleLocusDelta","onFullLocus","LOCUS_SYNC_HANDLING_FAILED","finally","resume","applyLocusDeltaData","action","_LocusDeltaParser$loc","loci","DESYNC","USE_CURRENT","USE_INCOMING","WAIT","LOCUS_URL_CHANGED","onDeltaLocus","_this3","onDeltaAction","parsedLoci","onDeltaEvent","init","_locus$links","_locus$links2","undefined","created","scheduledMeeting","participantsUrl","replaces","aclUrl","sequence","membership","identities","participants","updateLocusCache","updateParticipants","updateConversationUrl","conversationUrl","updateControls","controls","self","updateLocusUrl","updateFullState","fullState","updateMeetingInfo","updateEmbeddedApps","embeddedApps","updateSelf","updateHostInfo","host","updateMediaShares","mediaShares","updateServices","links","services","updateResources","resources","initialSetup","parse","data","eventType","getTheLocusToUpdate","LOCUSEVENT","PARTICIPANT_JOIN","PARTICIPANT_LEFT","CONTROLS_UPDATED","PARTICIPANT_AUDIO_MUTED","PARTICIPANT_AUDIO_UNMUTED","PARTICIPANT_VIDEO_MUTED","PARTICIPANT_VIDEO_UNMUTED","SELF_CHANGED","PARTICIPANT_UPDATED","PARTICIPANT_CONTROLS_UPDATED","PARTICIPANT_ROLES_UPDATED","PARTICIPANT_DECLINED","FLOOR_GRANTED","FLOOR_RELEASED","DIFFERENCE","emitScoped","scope","eventName","args","emit","error","isNewFullLocus","isReplaceMembers","ControlsUtils","isNeedReplaceMembers","updateLocusInfo","isMeetingActive","handleOneOnOneEvent","type","_CALL_","_SIP_BRIDGE_","file","function","EVENTS","REMOTE_RESPONSE","remoteDeclined","remoteAnswered","mergeParticipants","_locus$self","_locus$self2","_locus$links3","_locus$links4","state","updateCreated","updateParticipantsUrl","updateReplace","replace","updateAclUrl","updateBasequence","updateSequence","updateMemberShip","updateIdentifiers","compareAndUpdate","getLocusPartner","find","participant","identity","_USER_","removed","partner","_SPACE_SHARE_","LOCUS","STATE","INACTIVE","warn","internal","newMetrics","submitClientEvent","options","DESTROY_MEETING","CALL_REMOVED_REASON","CALL_INACTIVE","shouldLeave","MEETING_STATE","STATES","LEFT","DECLINED","NOTIFIED","JOINED","PARTNER_LEFT","joinedWith","_LEFT_","IDLE","SELF_LEFT","_MEETING_","TERMINATING","MEETING_INACTIVE_TERMINATING","FULLSTATE_REMOVED","SELF_REMOVED","compareSelfAndHost","compareHostAndSelf","_this$parsedLocus$hos","selfIdentity","hostId","moderator","LOCUS_INFO_CAN_ASSIGN_HOST","canAssignHost","isReplace","_this$parsedLocus$con","LOCUS_INFO_UPDATE_PARTICIPANTS","recordingId","record","modifiedBy","selfId","_isArray","_iterator","_step","_participant$person","LOCUSINFO","PARTICIPANT_REASON_CHANGED","displayName","person","primaryDisplayString","isEqual","_ControlsUtils$getCon","getControls","_ControlsUtils$getCon2","updates","hasRecordingChanged","hasRecordingPausedChanged","hasMeetingContainerChanged","hasTranscribeChanged","hasTranscribeSpokenLanguageChanged","hasManualCaptionChanged","hasEntryExitToneChanged","hasBreakoutChanged","hasVideoEnabledChanged","hasMuteOnEntryChanged","hasShareControlChanged","hasDisallowUnmuteChanged","hasReactionsChanged","hasReactionDisplayNamesChanged","hasViewTheParticipantListChanged","hasRaiseHandChanged","hasVideoChanged","hasInterpretationChanged","hasWebcastChanged","hasMeetingFullChanged","hasPracticeSessionEnabledChanged","hasStageViewChanged","hasAnnotationControlChanged","hasRemoteDesktopControlChanged","hasPollingQAControlChanged","current","CONTROLS_MUTE_ON_ENTRY_CHANGED","muteOnEntry","CONTROLS_SHARE_CONTROL_CHANGED","shareControl","CONTROLS_DISALLOW_UNMUTE_CHANGED","disallowUnmute","CONTROLS_REACTIONS_CHANGED","reactions","CONTROLS_VIEW_THE_PARTICIPANTS_LIST_CHANGED","viewTheParticipantList","CONTROLS_RAISE_HAND_CHANGED","raiseHand","CONTROLS_VIDEO_CHANGED","video","paused","RECORDING_STATE","PAUSED","recording","RESUMED","RECORDING","CONTROLS_RECORDING_UPDATED","lastModified","meetingContainerUrl","meetingContainer","CONTROLS_MEETING_CONTAINER_UPDATED","_current$transcribe","transcribe","transcribing","caption","CONTROLS_MEETING_TRANSCRIBE_UPDATED","spokenLanguage","CONTROLS_MEETING_TRANSCRIPTION_SPOKEN_LANGUAGE_UPDATED","enabled","manualCaptionControl","CONTROLS_MEETING_MANUAL_CAPTION_UPDATED","breakout","breakoutMoveId","SelfUtils","getReplacedBreakoutMoveId","device","CONTROLS_MEETING_BREAKOUT_UPDATED","interpretation","CONTROLS_MEETING_INTERPRETATION_UPDATED","entryExitTone","CONTROLS_ENTRY_EXIT_TONE_UPDATED","videoEnabled","unmuteVideoAllowed","SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED","unmuteAllowed","CONTROLS_WEBCAST_CHANGED","webcastControl","CONTROLS_MEETING_FULL_CHANGED","meetingFull","CONTROLS_PRACTICE_SESSION_STATUS_UPDATED","practiceSession","CONTROLS_STAGE_VIEW_UPDATED","videoLayout","CONTROLS_ANNOTATION_CHANGED","annotationControl","CONTROLS_REMOTE_DESKTOP_CONTROL_CHANGED","rdcControl","CONTROLS_POLLING_QA_CHANGED","pollingQAControl","LINKS_SERVICES","LINKS_RESOURCES","FullState","getFullState","meetingStateChangedTo","FULL_STATE_MEETING_STATE_CHANGE","previousState","previous","meetingState","currentState","meetingTypeChangedTo","FULL_STATE_TYPE_UPDATE","parsedHosts","HostUtils","getHosts","isNewHost","LOCUS_INFO_UPDATE_HOST","newHost","oldHost","_this$parsedLocus$sel","roles","getRoles","isJoined","parsedInfo","InfoUtils","getInfos","isLocked","MEETING_LOCKED","isUnlocked","MEETING_UNLOCKED","MEETING_INFO_UPDATED","isInitializing","EmbeddedAppsUtils","areSimilar","parsedEmbeddedApps","EMBEDDED_APPS_UPDATED","forceUpdate","parsedMediaShares","MediaSharesUtils","getMediaShares","LOCUS_INFO_UPDATE_MEDIA_SHARES","parsedSelves","getSelves","element","push","getSipUrl","sipUri","moderatorChanged","layoutChanged","CONTROLS_MEETING_LAYOUT_UPDATED","layout","breakoutsChanged","SELF_MEETING_BREAKOUTS_CHANGED","breakoutSessions","brbChanged","SELF_MEETING_BRB_CHANGED","brb","interpretationChanged","SELF_MEETING_INTERPRETATION_CHANGED","selfParticipantId","isMediaInactiveOrReleased","DISCONNECT_DUE_TO_INACTIVITY","SELF_MODERATOR_CHANGED","isRolesChanged","_parsedSelves$previou","_parsedSelves$current","SELF_ROLES_CHANGED","oldRoles","newRoles","isVideoMutedByOthersChanged","muted","remoteVideoMuted","localAudioUnmuteRequiredByServer","LOCAL_UNMUTE_REQUIRED","remoteMuted","isMutedByOthersChanged","SELF_REMOTE_MUTE_STATUS_UPDATED","localAudioUnmuteRequestedByServer","LOCAL_UNMUTE_REQUESTED","hasUserEnteredLobby","SELF_UNADMITTED_GUEST","hasUserBeenAdmitted","SELF_ADMITTED_GUEST","isMediaInactive","MEDIA_INACTIVITY","getMediaStatus","mediaSessions","audioStateChange","videoStateChange","shareStateChange","_parsedSelves$current2","_parsedSelves$current3","_parsedSelves$current4","MEDIA_STATUS_CHANGE","audioStatus","currentMediaStatus","audio","videoStatus","shareStatus","share","isUserObserving","SELF_OBSERVING","canNotViewTheParticipantListChanged","SELF_CANNOT_VIEW_PARTICIPANT_LIST_CHANGE","canNotViewTheParticipantList","isSharingBlockedChanged","SELF_IS_SHARING_BLOCKED_CHANGE","isSharingBlocked","LOCUS_INFO_UPDATE_SELF","oldSelf","newSelf","LOCUS_INFO_UPDATE_URL","isMainSessionDTO","updateMainSessionLocusCache","newLocus","switchStatus","getSessionSwitchStatus","isReturnToMain","mainSessionLocusCache","cloneDeep","_this$fullState","_this$mainSessionLocu","_this$mainSessionLocu2","isActive","ACTIVE","INITIALIZING","includes","clearMainSessionLocusCache","sourceParticipants","forEach","existIndex","findIndex","p","id","splice","mainLocus","_this4","locusClone","assignWith","objValue","srcValue","EventsScope"],"sources":["index.ts"],"sourcesContent":["import {isEqual, assignWith, cloneDeep, isEmpty, forEach} from 'lodash';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport EventsScope from '../common/events/events-scope';\nimport {\n EVENTS,\n LOCUSEVENT,\n _USER_,\n _CALL_,\n _SIP_BRIDGE_,\n MEETING_STATE,\n _MEETING_,\n _SPACE_SHARE_,\n LOCUSINFO,\n LOCUS,\n _LEFT_,\n MEETING_REMOVED_REASON,\n CALL_REMOVED_REASON,\n RECORDING_STATE,\n BREAKOUTS,\n} from '../constants';\n\nimport InfoUtils from './infoUtils';\nimport FullState from './fullState';\nimport SelfUtils from './selfUtils';\nimport HostUtils from './hostUtils';\nimport ControlsUtils from './controlsUtils';\nimport EmbeddedAppsUtils from './embeddedAppsUtils';\nimport MediaSharesUtils from './mediaSharesUtils';\nimport LocusDeltaParser from './parser';\nimport Metrics from '../metrics';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\n\n/**\n * @description LocusInfo extends ChildEmitter to convert locusInfo info a private emitter to parent object\n * @export\n * @private\n * @class LocusInfo\n */\nexport default class LocusInfo extends EventsScope {\n compareAndUpdateFlags: any;\n emitChange: any;\n locusParser: any;\n meetingId: any;\n parsedLocus: any;\n updateMeeting: any;\n webex: any;\n aclUrl: any;\n baseSequence: any;\n created: any;\n identities: any;\n membership: any;\n participants: any;\n participantsUrl: any;\n replaces: any;\n scheduledMeeting: any;\n sequence: any;\n controls: any;\n conversationUrl: any;\n embeddedApps: any;\n fullState: any;\n host: any;\n info: any;\n roles: any;\n mediaShares: any;\n replace: any;\n url: any;\n services: any;\n resources: any;\n mainSessionLocusCache: any;\n self: any;\n /**\n * Constructor\n * @param {function} updateMeeting callback to update the meeting object from an object\n * @param {object} webex\n * @param {string} meetingId\n * @returns {undefined}\n */\n constructor(updateMeeting, webex, meetingId) {\n super();\n this.parsedLocus = {\n states: [],\n };\n this.webex = webex;\n this.emitChange = false;\n this.compareAndUpdateFlags = {};\n this.meetingId = meetingId;\n this.updateMeeting = updateMeeting;\n this.locusParser = new LocusDeltaParser();\n }\n\n /**\n * Does a Locus sync. It tries to get the latest delta DTO or if it can't, it falls back to getting the full Locus DTO.\n *\n * @param {Meeting} meeting\n * @param {boolean} isLocusUrlChanged\n * @param {Locus} locus\n * @returns {undefined}\n */\n private doLocusSync(meeting: any, isLocusUrlChanged: boolean, locus: any) {\n let url;\n let isDelta = false;\n let meetingDestroyed = false;\n\n if (isLocusUrlChanged) {\n // for the locus url changed case from breakout to main session, we should always do a full sync, in this case, the url from locus is always on main session,\n // so use the main session locus url to get the full locus(full participants list in the response).\n // for the locus url changed case from main session to breakout, we don't need to care about it here,\n // because it is a USE_INCOMING case, it will not be executed here.\n url = locus.url;\n } else if (this.locusParser.workingCopy?.syncUrl) {\n url = this.locusParser.workingCopy.syncUrl;\n isDelta = true;\n } else {\n url = meeting.locusUrl;\n }\n\n LoggerProxy.logger.info(\n `Locus-info:index#doLocusSync --> doing Locus sync (getting ${\n isDelta ? 'delta' : 'full'\n } DTO)`\n );\n\n // return value ignored on purpose\n meeting.meetingRequest\n .getLocusDTO({url})\n .catch((e) => {\n if (isDelta) {\n LoggerProxy.logger.info(\n 'Locus-info:index#doLocusSync --> delta sync failed, falling back to full sync'\n );\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.LOCUS_DELTA_SYNC_FAILED, {\n correlationId: meeting.correlationId,\n url,\n reason: e.message,\n errorName: e.name,\n stack: e.stack,\n code: e.code,\n });\n\n isDelta = false;\n\n // Locus sometimes returns 403, for example if meeting has ended, no point trying the fallback to full sync in that case\n if (e.statusCode !== 403) {\n return meeting.meetingRequest.getLocusDTO({url: meeting.locusUrl}).catch((err) => {\n LoggerProxy.logger.info(\n 'Locus-info:index#doLocusSync --> fallback full sync failed, destroying the meeting'\n );\n this.webex.meetings.destroy(meeting, MEETING_REMOVED_REASON.LOCUS_DTO_SYNC_FAILED);\n meetingDestroyed = true;\n throw err;\n });\n }\n LoggerProxy.logger.info(\n 'Locus-info:index#doLocusSync --> got 403 from Locus, skipping fallback to full sync, destroying the meeting'\n );\n } else {\n LoggerProxy.logger.info(\n 'Locus-info:index#doLocusSync --> fallback full sync failed, destroying the meeting'\n );\n }\n this.webex.meetings.destroy(meeting, MEETING_REMOVED_REASON.LOCUS_DTO_SYNC_FAILED);\n meetingDestroyed = true;\n throw e;\n })\n .then((res) => {\n if (isEmpty(res.body)) {\n if (isDelta) {\n LoggerProxy.logger.info(\n 'Locus-info:index#doLocusSync --> received empty body from syncUrl, so we already have latest Locus DTO'\n );\n } else {\n LoggerProxy.logger.info(\n 'Locus-info:index#doLocusSync --> received empty body from full DTO sync request'\n );\n }\n\n return;\n }\n\n if (isDelta) {\n if (res.body.baseSequence) {\n meeting.locusInfo.handleLocusDelta(res.body, meeting);\n\n return;\n }\n // in some cases Locus might return us full DTO even when we asked for a delta\n LoggerProxy.logger.info(\n 'Locus-info:index#doLocusSync --> got full DTO when we asked for delta'\n );\n }\n meeting.locusInfo.onFullLocus(res.body);\n })\n .catch((e) => {\n LoggerProxy.logger.info(\n `Locus-info:index#doLocusSync --> getLocusDTO succeeded but failed to handle result, locus parser will resume but not all data may be synced (${e.toString()})`\n );\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.LOCUS_SYNC_HANDLING_FAILED, {\n correlationId: meeting.correlationId,\n url,\n reason: e.message,\n errorName: e.name,\n stack: e.stack,\n code: e.code,\n });\n })\n .finally(() => {\n if (!meetingDestroyed) {\n // Notify parser to resume processing delta events.\n // Any deltas in the queue that have now been superseded by this sync will simply be ignored\n this.locusParser.resume();\n }\n });\n }\n\n /**\n * Apply locus delta data to meeting\n * @param {string} action Locus delta action\n * @param {Locus} locus\n * @param {Meeting} meeting\n * @returns {undefined}\n */\n applyLocusDeltaData(action: string, locus: any, meeting: any) {\n const {DESYNC, USE_CURRENT, USE_INCOMING, WAIT, LOCUS_URL_CHANGED} = LocusDeltaParser.loci;\n const isLocusUrlChanged = action === LOCUS_URL_CHANGED;\n\n switch (action) {\n case USE_INCOMING:\n meeting.locusInfo.onDeltaLocus(locus);\n break;\n case USE_CURRENT:\n case WAIT:\n // do nothing\n break;\n case DESYNC:\n case LOCUS_URL_CHANGED:\n this.doLocusSync(meeting, isLocusUrlChanged, locus);\n break;\n default:\n LoggerProxy.logger.info(\n `Locus-info:index#applyLocusDeltaData --> Unknown locus delta action: ${action}`\n );\n }\n }\n\n /**\n * Adds locus delta to parser's queue\n * and registers a function handler\n * to recieve parsed actions from queue.\n * @param {Locus} locus\n * @param {Meeting} meeting\n * @returns {undefined}\n */\n handleLocusDelta(locus: any, meeting: any) {\n // register a function to process delta actions\n if (!this.locusParser.onDeltaAction) {\n // delta action, along with associated loci\n // is passed into the function.\n this.locusParser.onDeltaAction = (action, parsedLoci) => {\n this.applyLocusDeltaData(action, parsedLoci, meeting);\n };\n }\n // queue delta event with parser\n this.locusParser.onDeltaEvent(locus);\n }\n\n /**\n * @param {Locus} locus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n init(locus: any = {}) {\n this.created = locus.created || null;\n this.scheduledMeeting = locus.meeting || null;\n this.participantsUrl = locus.participantsUrl || null;\n this.replaces = locus.replaces || null;\n this.aclUrl = locus.aclUrl || null;\n this.baseSequence = locus.baseSequence || null;\n this.sequence = locus.sequence || null;\n this.membership = locus.membership || null;\n this.identities = locus.identities || null;\n this.participants = locus.participants || null;\n\n /**\n * Stores the delta values for a changed participant.\n *\n * @typedef {Object} DeltaParticipant\n * @property {Record<string, boolean>} delta - Contains changed streams.\n * @property {Object} person - Contains person data.\n */\n\n this.updateLocusCache(locus);\n // above section only updates the locusInfo object\n // The below section makes sure it updates the locusInfo as well as updates the meeting object\n this.updateParticipants(locus.participants);\n // For 1:1 space meeting the conversation Url does not exist in locus.conversation\n this.updateConversationUrl(locus.conversationUrl, locus.info);\n this.updateControls(locus.controls, locus.self);\n this.updateLocusUrl(locus.url);\n this.updateFullState(locus.fullState);\n this.updateMeetingInfo(locus.info);\n this.updateEmbeddedApps(locus.embeddedApps);\n // self and participants generate sipUrl for 1:1 meeting\n this.updateSelf(locus.self);\n this.updateHostInfo(locus.host);\n this.updateMediaShares(locus.mediaShares);\n this.updateServices(locus.links?.services);\n this.updateResources(locus.links?.resources);\n }\n\n /**\n * @param {Object} locus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n initialSetup(locus: object) {\n this.updateLocusCache(locus);\n this.onFullLocus(locus);\n\n // Change it to true after it receives it first locus object\n this.emitChange = true;\n }\n\n /**\n * @param {Meeting} meeting\n * @param {Object} data\n * @returns {undefined}\n * @memberof LocusInfo\n */\n parse(meeting: any, data: any) {\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const {eventType} = data;\n const locus = this.getTheLocusToUpdate(data.locus);\n LoggerProxy.logger.info(`Locus-info:index#parse --> received locus data: ${eventType}`);\n\n switch (eventType) {\n case LOCUSEVENT.PARTICIPANT_JOIN:\n case LOCUSEVENT.PARTICIPANT_LEFT:\n case LOCUSEVENT.CONTROLS_UPDATED:\n case LOCUSEVENT.PARTICIPANT_AUDIO_MUTED:\n case LOCUSEVENT.PARTICIPANT_AUDIO_UNMUTED:\n case LOCUSEVENT.PARTICIPANT_VIDEO_MUTED:\n case LOCUSEVENT.PARTICIPANT_VIDEO_UNMUTED:\n case LOCUSEVENT.SELF_CHANGED:\n case LOCUSEVENT.PARTICIPANT_UPDATED:\n case LOCUSEVENT.PARTICIPANT_CONTROLS_UPDATED:\n case LOCUSEVENT.PARTICIPANT_ROLES_UPDATED:\n case LOCUSEVENT.PARTICIPANT_DECLINED:\n case LOCUSEVENT.FLOOR_GRANTED:\n case LOCUSEVENT.FLOOR_RELEASED:\n this.onFullLocus(locus, eventType);\n break;\n case LOCUSEVENT.DIFFERENCE:\n this.handleLocusDelta(locus, meeting);\n break;\n\n default:\n // Why will there be a event with no eventType ????\n // we may not need this, we can get full locus\n this.handleLocusDelta(locus, meeting);\n }\n }\n\n /**\n * @param {String} scope\n * @param {String} eventName\n * @param {Array} args\n * @returns {undefined}\n * @memberof LocusInfo\n */\n emitScoped(scope?: any, eventName?: string, args?: any) {\n return this.emit(scope, eventName, args);\n }\n\n /**\n * updates the locus with full locus object\n * @param {object} locus locus object\n * @param {string} eventType particulat locus event\n * @returns {object} null\n * @memberof LocusInfo\n */\n onFullLocus(locus: any, eventType?: string) {\n if (!locus) {\n LoggerProxy.logger.error(\n 'Locus-info:index#onFullLocus --> object passed as argument was invalid, continuing.'\n );\n }\n\n if (!this.locusParser.isNewFullLocus(locus)) {\n LoggerProxy.logger.info(\n `Locus-info:index#onFullLocus --> ignoring old full locus DTO, eventType=${eventType}`\n );\n\n return;\n }\n\n this.scheduledMeeting = locus.meeting || null;\n this.participants = locus.participants;\n const isReplaceMembers = ControlsUtils.isNeedReplaceMembers(this.controls, locus.controls);\n this.updateLocusInfo(locus);\n this.updateParticipants(locus.participants, isReplaceMembers);\n this.isMeetingActive();\n this.handleOneOnOneEvent(eventType);\n this.updateEmbeddedApps(locus.embeddedApps);\n // set current (working copy) for parser\n this.locusParser.workingCopy = locus;\n }\n\n // used for ringing stops on one on one\n /**\n * @param {String} eventType\n * @returns {undefined}\n * @memberof LocusInfo\n */\n // eslint-disable-next-line @typescript-eslint/no-shadow\n handleOneOnOneEvent(eventType: string) {\n if (\n this.parsedLocus.fullState.type === _CALL_ ||\n this.parsedLocus.fullState.type === _SIP_BRIDGE_\n ) {\n // for 1:1 bob calls alice and alice declines, notify the meeting state\n if (eventType === LOCUSEVENT.PARTICIPANT_DECLINED) {\n // trigger the event for stop ringing\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'handleOneonOneEvent',\n },\n EVENTS.REMOTE_RESPONSE,\n {\n remoteDeclined: true,\n remoteAnswered: false,\n }\n );\n }\n // for 1:1 bob calls alice and alice answers, notify the meeting state\n if (eventType === LOCUSEVENT.PARTICIPANT_JOIN) {\n // trigger the event for stop ringing\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'handleOneonOneEvent',\n },\n EVENTS.REMOTE_RESPONSE,\n {\n remoteDeclined: false,\n remoteAnswered: true,\n }\n );\n }\n }\n }\n\n /**\n * @param {Object} locus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n onDeltaLocus(locus: any) {\n const isReplaceMembers = ControlsUtils.isNeedReplaceMembers(this.controls, locus.controls);\n this.mergeParticipants(this.participants, locus.participants);\n this.updateLocusInfo(locus);\n this.updateParticipants(locus.participants, isReplaceMembers);\n this.isMeetingActive();\n }\n\n /**\n * @param {Object} locus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateLocusInfo(locus) {\n if (locus.self?.reason === 'MOVED' && locus.self?.state === 'LEFT') {\n // When moved to a breakout session locus sends a message for the previous locus\n // indicating that we have been moved. It isn't helpful to continue parsing this\n // as it gets interpreted as if we have left the call\n return;\n }\n\n this.updateControls(locus.controls, locus.self);\n this.updateConversationUrl(locus.conversationUrl, locus.info);\n this.updateCreated(locus.created);\n this.updateFullState(locus.fullState);\n this.updateHostInfo(locus.host);\n this.updateLocusUrl(locus.url);\n this.updateMeetingInfo(locus.info, locus.self);\n this.updateMediaShares(locus.mediaShares);\n this.updateParticipantsUrl(locus.participantsUrl);\n this.updateReplace(locus.replace);\n this.updateSelf(locus.self);\n this.updateAclUrl(locus.aclUrl);\n this.updateBasequence(locus.baseSequence);\n this.updateSequence(locus.sequence);\n this.updateMemberShip(locus.membership);\n this.updateIdentifiers(locus.identities);\n this.updateEmbeddedApps(locus.embeddedApps);\n this.updateServices(locus.links?.services);\n this.updateResources(locus.links?.resources);\n this.compareAndUpdate();\n // update which required to compare different objects from locus\n }\n\n /**\n * @param {Array} participants\n * @param {Object} self\n * @returns {Array}\n * @memberof LocusInfo\n */\n getLocusPartner(participants: Array<any>, self: any) {\n if (!participants || participants.length === 0) {\n return null;\n }\n\n return (\n participants.find(\n (participant) =>\n self &&\n participant.identity !== self.identity &&\n (participants.length <= 2 || (participant.type === _USER_ && !participant.removed))\n // @ts-ignore\n ) || this.partner\n );\n }\n\n // TODO: all the leave states need to be checked\n /**\n * @returns {undefined}\n * @memberof LocusInfo\n */\n isMeetingActive() {\n if (\n this.parsedLocus.fullState.type === _CALL_ ||\n this.parsedLocus.fullState.type === _SIP_BRIDGE_ ||\n this.parsedLocus.fullState.type === _SPACE_SHARE_\n ) {\n // @ts-ignore\n const partner = this.getLocusPartner(this.participants, this.self);\n\n this.updateMeeting({partner});\n\n // Check if guest user needs to be checked here\n\n // 1) when bob declines call from bob, (bob='DECLINED')\n // 2) When alice rejects call to bob , (bob='NOTIFIED')\n\n // When we dont add MEDIA for condition 2. The state of bob='IDLE'\n\n if (this.fullState && this.fullState.state === LOCUS.STATE.INACTIVE) {\n // TODO: update the meeting state\n LoggerProxy.logger.warn(\n 'Locus-info:index#isMeetingActive --> Call Ended, locus state is inactive.'\n );\n\n // @ts-ignore\n this.webex.internal.newMetrics.submitClientEvent({\n name: 'client.call.remote-ended',\n options: {\n meetingId: this.meetingId,\n },\n });\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive',\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: CALL_REMOVED_REASON.CALL_INACTIVE,\n shouldLeave: false,\n }\n );\n } else if (\n partner.state === MEETING_STATE.STATES.LEFT &&\n this.parsedLocus.self &&\n (this.parsedLocus.self.state === MEETING_STATE.STATES.DECLINED ||\n this.parsedLocus.self.state === MEETING_STATE.STATES.NOTIFIED ||\n this.parsedLocus.self.state === MEETING_STATE.STATES.JOINED)\n ) {\n // @ts-ignore\n this.webex.internal.newMetrics.submitClientEvent({\n name: 'client.call.remote-ended',\n options: {\n meetingId: this.meetingId,\n },\n });\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive',\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: CALL_REMOVED_REASON.PARTNER_LEFT,\n shouldLeave:\n this.parsedLocus.self.joinedWith && this.parsedLocus.self.joinedWith.state !== _LEFT_,\n }\n );\n } else if (\n this.parsedLocus.self &&\n this.parsedLocus.self.state === MEETING_STATE.STATES.LEFT &&\n (partner.state === MEETING_STATE.STATES.LEFT ||\n partner.state === MEETING_STATE.STATES.DECLINED ||\n partner.state === MEETING_STATE.STATES.NOTIFIED ||\n partner.state === MEETING_STATE.STATES.IDLE) // Happens when user just joins and adds no Media\n ) {\n // @ts-ignore\n this.webex.internal.newMetrics.submitClientEvent({\n name: 'client.call.remote-ended',\n options: {\n meetingId: this.meetingId,\n },\n });\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive',\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: CALL_REMOVED_REASON.SELF_LEFT,\n shouldLeave: false,\n }\n );\n }\n } else if (this.parsedLocus.fullState.type === _MEETING_) {\n if (\n this.fullState &&\n (this.fullState.state === LOCUS.STATE.INACTIVE ||\n // @ts-ignore\n this.fullState.state === LOCUS.STATE.TERMINATING)\n ) {\n LoggerProxy.logger.warn(\n 'Locus-info:index#isMeetingActive --> Meeting is ending due to inactive or terminating'\n );\n\n // @ts-ignore\n this.webex.internal.newMetrics.submitClientEvent({\n name: 'client.call.remote-ended',\n options: {\n meetingId: this.meetingId,\n },\n });\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive',\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: MEETING_REMOVED_REASON.MEETING_INACTIVE_TERMINATING,\n shouldLeave: false,\n }\n );\n } else if (this.fullState && this.fullState.removed) {\n // user has been dropped from a meeting\n\n // @ts-ignore\n this.webex.internal.newMetrics.submitClientEvent({\n name: 'client.call.remote-ended',\n options: {\n meetingId: this.meetingId,\n },\n });\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive',\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: MEETING_REMOVED_REASON.FULLSTATE_REMOVED,\n shouldLeave: false,\n }\n );\n }\n // If you are guest and you are removed from the meeting\n // You wont get any further events\n else if (this.parsedLocus.self && this.parsedLocus.self.removed) {\n // Check if we need to send an event\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'isMeetingActive',\n },\n EVENTS.DESTROY_MEETING,\n {\n reason: MEETING_REMOVED_REASON.SELF_REMOVED,\n shouldLeave: false,\n }\n );\n }\n } else {\n LoggerProxy.logger.warn('Locus-info:index#isMeetingActive --> Meeting Type is unknown.');\n }\n }\n\n /**\n * checks if the host permissions have changed while in the meeting\n * This would be the case if your role as host or moderator has been updated\n * @returns {undefined}\n * @memberof LocusInfo\n */\n compareAndUpdate() {\n // TODO: check with locus team on host and moderator doc\n // use host as a validator if needed\n if (\n this.compareAndUpdateFlags.compareSelfAndHost ||\n this.compareAndUpdateFlags.compareHostAndSelf\n ) {\n this.compareSelfAndHost();\n }\n }\n\n /**\n * compared the self object to check if the user has host permissions\n * @returns {undefined}\n * @memberof LocusInfo\n */\n compareSelfAndHost() {\n // In some cases the host info is not present but the moderator values changes from null to false so it triggers an update\n if (\n this.parsedLocus.self.selfIdentity === this.parsedLocus.host?.hostId &&\n this.parsedLocus.self.moderator\n ) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'compareSelfAndHost',\n },\n EVENTS.LOCUS_INFO_CAN_ASSIGN_HOST,\n {\n canAssignHost: true,\n }\n );\n } else {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'compareSelfAndHost',\n },\n EVENTS.LOCUS_INFO_CAN_ASSIGN_HOST,\n {\n canAssignHost: false,\n }\n );\n }\n }\n\n /**\n * update meeting's members\n * @param {Object} participants new participants object\n * @param {Boolean} isReplace is replace the whole members\n * @returns {Array} updatedParticipants\n * @memberof LocusInfo\n */\n updateParticipants(participants: object, isReplace?: boolean) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateParticipants',\n },\n EVENTS.LOCUS_INFO_UPDATE_PARTICIPANTS,\n {\n participants,\n recordingId: this.parsedLocus.controls && this.parsedLocus.controls.record?.modifiedBy,\n selfIdentity: this.parsedLocus.self && this.parsedLocus.self.selfIdentity,\n selfId: this.parsedLocus.self && this.parsedLocus.self.selfId,\n hostId: this.parsedLocus.host && this.parsedLocus.host.hostId,\n isReplace,\n }\n );\n\n if (participants && Array.isArray(participants) && participants.length > 0) {\n for (const participant of participants) {\n if (participant && participant?.reason === 'FAILURE') {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateParticipants',\n },\n LOCUSINFO.EVENTS.PARTICIPANT_REASON_CHANGED,\n {\n displayName: participant?.person?.primaryDisplayString,\n }\n );\n }\n }\n }\n }\n\n /**\n * @param {Object} controls\n * @param {Object} self\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateControls(controls: object, self: object) {\n if (controls && !isEqual(this.controls, controls)) {\n this.parsedLocus.controls = ControlsUtils.parse(controls);\n const {\n updates: {\n hasRecordingChanged,\n hasRecordingPausedChanged,\n hasMeetingContainerChanged,\n hasTranscribeChanged,\n hasTranscribeSpokenLanguageChanged,\n hasManualCaptionChanged,\n hasEntryExitToneChanged,\n hasBreakoutChanged,\n hasVideoEnabledChanged,\n hasMuteOnEntryChanged,\n hasShareControlChanged,\n hasDisallowUnmuteChanged,\n hasReactionsChanged,\n hasReactionDisplayNamesChanged,\n hasViewTheParticipantListChanged,\n hasRaiseHandChanged,\n hasVideoChanged,\n hasInterpretationChanged,\n hasWebcastChanged,\n hasMeetingFullChanged,\n hasPracticeSessionEnabledChanged,\n hasStageViewChanged,\n hasAnnotationControlChanged,\n hasRemoteDesktopControlChanged,\n hasPollingQAControlChanged,\n },\n current,\n } = ControlsUtils.getControls(this.controls, controls);\n\n if (hasMuteOnEntryChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_MUTE_ON_ENTRY_CHANGED,\n {state: current.muteOnEntry}\n );\n }\n\n if (hasShareControlChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_SHARE_CONTROL_CHANGED,\n {state: current.shareControl}\n );\n }\n\n if (hasDisallowUnmuteChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_DISALLOW_UNMUTE_CHANGED,\n {state: current.disallowUnmute}\n );\n }\n\n if (hasReactionsChanged || hasReactionDisplayNamesChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_REACTIONS_CHANGED,\n {state: current.reactions}\n );\n }\n\n if (hasViewTheParticipantListChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_VIEW_THE_PARTICIPANTS_LIST_CHANGED,\n {state: current.viewTheParticipantList}\n );\n }\n\n if (hasRaiseHandChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_RAISE_HAND_CHANGED,\n {state: current.raiseHand}\n );\n }\n\n if (hasVideoChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_VIDEO_CHANGED,\n {state: current.video}\n );\n }\n\n if (hasRecordingChanged || hasRecordingPausedChanged) {\n let state = null;\n\n if (hasRecordingPausedChanged) {\n if (current.record.paused) {\n state = RECORDING_STATE.PAUSED;\n } else {\n // state will be `IDLE` if the recording is not active, even when there is a `pause` status change.\n state = current.record.recording ? RECORDING_STATE.RESUMED : RECORDING_STATE.IDLE;\n }\n } else if (hasRecordingChanged) {\n state = current.record.recording ? RECORDING_STATE.RECORDING : RECORDING_STATE.IDLE;\n }\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.CONTROLS_RECORDING_UPDATED,\n {\n state,\n modifiedBy: current.record.modifiedBy,\n lastModified: current.record.lastModified,\n }\n );\n }\n\n if (hasMeetingContainerChanged) {\n const {meetingContainerUrl} = current.meetingContainer;\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.CONTROLS_MEETING_CONTAINER_UPDATED,\n {\n meetingContainerUrl,\n }\n );\n }\n\n if (hasTranscribeChanged) {\n const {transcribing, caption} = current.transcribe;\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.CONTROLS_MEETING_TRANSCRIBE_UPDATED,\n {\n transcribing,\n caption,\n }\n );\n }\n\n if (hasTranscribeSpokenLanguageChanged) {\n const {spokenLanguage} = current.transcribe;\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.CONTROLS_MEETING_TRANSCRIPTION_SPOKEN_LANGUAGE_UPDATED,\n {\n spokenLanguage,\n }\n );\n }\n\n if (hasManualCaptionChanged) {\n const {enabled} = current.manualCaptionControl;\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.CONTROLS_MEETING_MANUAL_CAPTION_UPDATED,\n {\n enabled,\n }\n );\n }\n\n if (hasBreakoutChanged) {\n const {breakout} = current;\n breakout.breakoutMoveId = SelfUtils.getReplacedBreakoutMoveId(\n self,\n this.webex.internal.device.url\n );\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.CONTROLS_MEETING_BREAKOUT_UPDATED,\n {\n breakout,\n }\n );\n }\n\n if (hasInterpretationChanged) {\n const {interpretation} = current;\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.CONTROLS_MEETING_INTERPRETATION_UPDATED,\n {\n interpretation,\n }\n );\n }\n\n if (hasEntryExitToneChanged) {\n const {entryExitTone} = current;\n\n this.updateMeeting({entryExitTone});\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.CONTROLS_ENTRY_EXIT_TONE_UPDATED,\n {\n entryExitTone,\n }\n );\n }\n\n // videoEnabled is handled differently than other controls,\n // to fit with audio mute status logic\n if (hasVideoEnabledChanged) {\n const {videoEnabled} = current;\n\n this.updateMeeting({unmuteVideoAllowed: videoEnabled});\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateControls',\n },\n LOCUSINFO.EVENTS.SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED,\n {\n // muted: not part of locus.controls\n unmuteAllowed: videoEnabled,\n }\n );\n }\n\n if (hasWebcastChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_WEBCAST_CHANGED,\n {state: current.webcastControl}\n );\n }\n\n if (hasMeetingFullChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_MEETING_FULL_CHANGED,\n {state: current.meetingFull}\n );\n }\n\n if (hasPracticeSessionEnabledChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_PRACTICE_SESSION_STATUS_UPDATED,\n {state: current.practiceSession}\n );\n }\n\n if (hasStageViewChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_STAGE_VIEW_UPDATED,\n {state: current.videoLayout}\n );\n }\n\n if (hasAnnotationControlChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_ANNOTATION_CHANGED,\n {state: current.annotationControl}\n );\n }\n\n if (hasRemoteDesktopControlChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_REMOTE_DESKTOP_CONTROL_CHANGED,\n {state: current.rdcControl}\n );\n }\n\n if (hasPollingQAControlChanged) {\n this.emitScoped(\n {file: 'locus-info', function: 'updateControls'},\n LOCUSINFO.EVENTS.CONTROLS_POLLING_QA_CHANGED,\n {state: current.pollingQAControl}\n );\n }\n\n this.controls = controls;\n }\n }\n\n /**\n * @param {String} conversationUrl\n * @param {Object} info\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateConversationUrl(conversationUrl: string, info: any) {\n if (conversationUrl && !isEqual(this.conversationUrl, conversationUrl)) {\n this.conversationUrl = conversationUrl;\n this.updateMeeting({conversationUrl});\n } else if (\n info &&\n info.conversationUrl &&\n !isEqual(this.conversationUrl, info.conversationUrl)\n ) {\n this.conversationUrl = info.conversationUrl;\n this.updateMeeting({conversationUrl: info.conversationUrl});\n }\n }\n\n /**\n * @param {Object} created\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateCreated(created: object) {\n if (created && !isEqual(this.created, created)) {\n this.created = created;\n }\n }\n\n /**\n * @param {Object} services\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateServices(services: Record<'breakout' | 'record', {url: string}>) {\n if (services && !isEqual(this.services, services)) {\n this.services = services;\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateServices',\n },\n LOCUSINFO.EVENTS.LINKS_SERVICES,\n {\n services,\n }\n );\n }\n }\n\n /**\n * @param {Object} resources\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateResources(resources: Record<'webcastInstance', {url: string}>) {\n if (resources && !isEqual(this.resources, resources)) {\n this.resources = resources;\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateResources',\n },\n LOCUSINFO.EVENTS.LINKS_RESOURCES,\n {\n resources,\n }\n );\n }\n }\n\n /**\n * @param {Object} fullState\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateFullState(fullState: object) {\n if (fullState && !isEqual(this.fullState, fullState)) {\n const result = FullState.getFullState(this.fullState, fullState);\n\n this.updateMeeting(result.current);\n\n if (result.updates.meetingStateChangedTo) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateFullState',\n },\n LOCUSINFO.EVENTS.FULL_STATE_MEETING_STATE_CHANGE,\n {\n previousState: result.previous && result.previous.meetingState,\n currentState: result.current.meetingState,\n }\n );\n }\n\n if (result.updates.meetingTypeChangedTo) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateFullState',\n },\n LOCUSINFO.EVENTS.FULL_STATE_TYPE_UPDATE,\n {\n type: result.current.type,\n }\n );\n }\n this.parsedLocus.fullState = result.current;\n this.fullState = fullState;\n }\n }\n\n /**\n * handles when the locus.host is updated\n * @param {Object} host the locus.host property\n * @returns {undefined}\n * @memberof LocusInfo\n * emits internal event locus_info_update_host\n */\n updateHostInfo(host: object) {\n if (host && !isEqual(this.host, host)) {\n const parsedHosts = HostUtils.getHosts(this.host, host);\n\n this.updateMeeting(parsedHosts.current);\n this.parsedLocus.host = parsedHosts.current;\n if (parsedHosts.updates.isNewHost) {\n this.compareAndUpdateFlags.compareSelfAndHost = true;\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateHostInfo',\n },\n EVENTS.LOCUS_INFO_UPDATE_HOST,\n {\n newHost: parsedHosts.current,\n oldHost: parsedHosts.previous,\n }\n );\n }\n this.host = host;\n } else {\n this.compareAndUpdateFlags.compareSelfAndHost = false;\n }\n }\n\n /**\n * @param {Object} info\n * @param {Object} self\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateMeetingInfo(info: object, self?: object) {\n const roles = self ? SelfUtils.getRoles(self) : this.parsedLocus.self?.roles || [];\n if ((info && !isEqual(this.info, info)) || (!isEqual(this.roles, roles) && info)) {\n const isJoined = SelfUtils.isJoined(self || this.parsedLocus.self);\n const parsedInfo = InfoUtils.getInfos(this.parsedLocus.info, info, roles, isJoined);\n\n if (parsedInfo.updates.isLocked) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateMeetingInfo',\n },\n LOCUSINFO.EVENTS.MEETING_LOCKED,\n info\n );\n }\n if (parsedInfo.updates.isUnlocked) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateMeetingInfo',\n },\n LOCUSINFO.EVENTS.MEETING_UNLOCKED,\n info\n );\n }\n\n this.info = info;\n this.parsedLocus.info = parsedInfo.current;\n // Parses the info and adds necessary values\n this.updateMeeting(parsedInfo.current);\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateMeetingInfo',\n },\n LOCUSINFO.EVENTS.MEETING_INFO_UPDATED,\n {\n isInitializing: !self, // if self is undefined, then the update is caused by locus init\n }\n );\n }\n this.roles = roles;\n }\n\n /**\n * @param {Object} embeddedApps\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateEmbeddedApps(embeddedApps: object) {\n // don't do anything if the arrays of apps haven't changed significantly\n if (EmbeddedAppsUtils.areSimilar(this.embeddedApps, embeddedApps)) {\n return;\n }\n\n const parsedEmbeddedApps = EmbeddedAppsUtils.parse(embeddedApps);\n\n this.updateMeeting({embeddedApps: parsedEmbeddedApps});\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateEmbeddedApps',\n },\n LOCUSINFO.EVENTS.EMBEDDED_APPS_UPDATED,\n parsedEmbeddedApps\n );\n this.embeddedApps = embeddedApps;\n }\n\n /**\n * handles when the locus.mediaShares is updated\n * @param {Object} mediaShares the locus.mediaShares property\n * @param {boolean} forceUpdate force to update the mediaShares\n * @returns {undefined}\n * @memberof LocusInfo\n * emits internal event locus_info_update_media_shares\n */\n updateMediaShares(mediaShares: object, forceUpdate = false) {\n if (mediaShares && (!isEqual(this.mediaShares, mediaShares) || forceUpdate)) {\n const parsedMediaShares = MediaSharesUtils.getMediaShares(this.mediaShares, mediaShares);\n\n this.updateMeeting(parsedMediaShares.current);\n this.parsedLocus.mediaShares = parsedMediaShares.current;\n this.mediaShares = mediaShares;\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateMediaShares',\n },\n EVENTS.LOCUS_INFO_UPDATE_MEDIA_SHARES,\n {\n current: parsedMediaShares.current,\n previous: parsedMediaShares.previous,\n forceUpdate,\n }\n );\n }\n }\n\n /**\n * @param {String} participantsUrl\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateParticipantsUrl(participantsUrl: string) {\n if (participantsUrl && !isEqual(this.participantsUrl, participantsUrl)) {\n this.participantsUrl = participantsUrl;\n }\n }\n\n /**\n * @param {Object} replace\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateReplace(replace: object) {\n if (replace && !isEqual(this.replace, replace)) {\n this.replace = replace;\n }\n }\n\n /**\n * handles when the locus.self is updated\n * @param {Object} self the new locus.self\n * @returns {undefined}\n * @memberof LocusInfo\n * emits internal events self_admitted_guest, self_unadmitted_guest, locus_info_update_self\n */\n updateSelf(self: any) {\n if (self) {\n // @ts-ignore\n const parsedSelves = SelfUtils.getSelves(\n this.parsedLocus.self,\n self,\n this.webex.internal.device.url,\n this.participants // using this.participants instead of locus.participants here, because with delta DTOs locus.participants will only contain a small subset of participants\n );\n\n this.updateMeeting(parsedSelves.current);\n this.parsedLocus.self = parsedSelves.current;\n\n const element = this.parsedLocus.states[this.parsedLocus.states.length - 1];\n\n if (element !== parsedSelves.current.state) {\n this.parsedLocus.states.push(parsedSelves.current.state);\n }\n\n // TODO: check if we need to save the sipUri here as well\n // this.emit(LOCUSINFO.EVENTS.MEETING_UPDATE, SelfUtils.getSipUrl(this.getLocusPartner(participants, self), this.parsedLocus.fullState.type, this.parsedLocus.info.sipUri));\n const result = SelfUtils.getSipUrl(\n this.getLocusPartner(this.participants, self),\n this.parsedLocus.fullState.type,\n this.parsedLocus.info.sipUri\n );\n\n if (result.sipUri) {\n this.updateMeeting(result);\n }\n\n if (parsedSelves.updates.moderatorChanged) {\n this.compareAndUpdateFlags.compareHostAndSelf = true;\n } else {\n this.compareAndUpdateFlags.compareHostAndSelf = false;\n }\n\n if (parsedSelves.updates.layoutChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.CONTROLS_MEETING_LAYOUT_UPDATED,\n {layout: parsedSelves.current.layout}\n );\n }\n\n if (parsedSelves.updates.breakoutsChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_MEETING_BREAKOUTS_CHANGED,\n {breakoutSessions: parsedSelves.current.breakoutSessions}\n );\n }\n\n if (parsedSelves.updates.brbChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_MEETING_BRB_CHANGED,\n {\n brb: parsedSelves.current.brb,\n }\n );\n }\n\n if (parsedSelves.updates.interpretationChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_MEETING_INTERPRETATION_CHANGED,\n {\n interpretation: parsedSelves.current.interpretation,\n selfParticipantId: parsedSelves.current.selfId,\n }\n );\n }\n\n if (parsedSelves.updates.isMediaInactiveOrReleased) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.DISCONNECT_DUE_TO_INACTIVITY,\n {reason: self.reason}\n );\n }\n\n if (parsedSelves.updates.moderatorChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_MODERATOR_CHANGED,\n self\n );\n }\n\n if (parsedSelves.updates.isRolesChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_ROLES_CHANGED,\n {oldRoles: parsedSelves.previous?.roles, newRoles: parsedSelves.current?.roles}\n );\n }\n\n if (parsedSelves.updates.isVideoMutedByOthersChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED,\n {\n muted: parsedSelves.current.remoteVideoMuted,\n // unmuteAllowed: not part of .self\n }\n );\n }\n if (parsedSelves.updates.localAudioUnmuteRequiredByServer) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.LOCAL_UNMUTE_REQUIRED,\n {\n muted: parsedSelves.current.remoteMuted,\n unmuteAllowed: parsedSelves.current.unmuteAllowed,\n }\n );\n }\n if (parsedSelves.updates.isMutedByOthersChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_REMOTE_MUTE_STATUS_UPDATED,\n {\n muted: parsedSelves.current.remoteMuted,\n unmuteAllowed: parsedSelves.current.unmuteAllowed,\n }\n );\n }\n if (parsedSelves.updates.localAudioUnmuteRequestedByServer) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.LOCAL_UNMUTE_REQUESTED,\n {}\n );\n }\n if (parsedSelves.updates.hasUserEnteredLobby) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_UNADMITTED_GUEST,\n self\n );\n }\n if (parsedSelves.updates.hasUserBeenAdmitted) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_ADMITTED_GUEST,\n self\n );\n }\n\n if (parsedSelves.updates.isMediaInactive) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n // @ts-ignore\n LOCUSINFO.EVENTS.MEDIA_INACTIVITY,\n SelfUtils.getMediaStatus(self.mediaSessions)\n );\n }\n\n if (\n parsedSelves.updates.audioStateChange ||\n parsedSelves.updates.videoStateChange ||\n parsedSelves.updates.shareStateChange\n ) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.MEDIA_STATUS_CHANGE,\n {\n audioStatus: parsedSelves.current.currentMediaStatus?.audio,\n videoStatus: parsedSelves.current.currentMediaStatus?.video,\n shareStatus: parsedSelves.current.currentMediaStatus?.share,\n }\n );\n }\n\n if (parsedSelves.updates.isUserObserving) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_OBSERVING\n );\n }\n\n if (parsedSelves.updates.canNotViewTheParticipantListChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_CANNOT_VIEW_PARTICIPANT_LIST_CHANGE,\n {canNotViewTheParticipantList: parsedSelves.current.canNotViewTheParticipantList}\n );\n }\n\n if (parsedSelves.updates.isSharingBlockedChanged) {\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n LOCUSINFO.EVENTS.SELF_IS_SHARING_BLOCKED_CHANGE,\n {isSharingBlocked: parsedSelves.current.isSharingBlocked}\n );\n }\n\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateSelf',\n },\n EVENTS.LOCUS_INFO_UPDATE_SELF,\n {\n oldSelf: parsedSelves.previous,\n newSelf: parsedSelves.current,\n }\n );\n this.parsedLocus.self = parsedSelves.current;\n // @ts-ignore\n this.self = self;\n } else {\n this.compareAndUpdateFlags.compareHostAndSelf = false;\n }\n }\n\n /**\n * handles when the locus.url is updated\n * @param {String} url\n * @returns {undefined}\n * emits internal event locus_info_update_url\n */\n updateLocusUrl(url: string) {\n if (url && this.url !== url) {\n this.url = url;\n this.updateMeeting({locusUrl: url});\n this.emitScoped(\n {\n file: 'locus-info',\n function: 'updateLocusUrl',\n },\n EVENTS.LOCUS_INFO_UPDATE_URL,\n url\n );\n }\n }\n\n /**\n * @param {String} aclUrl\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateAclUrl(aclUrl: string) {\n if (aclUrl && !isEqual(this.aclUrl, aclUrl)) {\n this.aclUrl = aclUrl;\n }\n }\n\n /**\n * @param {Number} baseSequence\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateBasequence(baseSequence: number) {\n if (baseSequence && !isEqual(this.baseSequence, baseSequence)) {\n this.baseSequence = baseSequence;\n }\n }\n\n /**\n * @param {Number} sequence\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateSequence(sequence: number) {\n if (sequence && !isEqual(this.sequence, sequence)) {\n this.sequence = sequence;\n }\n }\n\n /**\n * @param {Object} membership\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateMemberShip(membership: object) {\n if (membership && !isEqual(this.membership, membership)) {\n this.membership = membership;\n }\n }\n\n /**\n * @param {Array} identities\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateIdentifiers(identities: Array<any>) {\n if (identities && !isEqual(this.identities, identities)) {\n this.identities = identities;\n }\n }\n\n /**\n * check the locus is main session's one or not, if is main session's, update main session cache\n * @param {Object} locus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateLocusCache(locus: any) {\n const isMainSessionDTO = ControlsUtils.isMainSessionDTO(locus);\n if (isMainSessionDTO) {\n this.updateMainSessionLocusCache(locus);\n }\n }\n\n /**\n * if return from breakout to main session, need to use cached main session DTO since locus won't send the full locus (participants)\n * if join breakout from main session, main session is not active for the attendee and remove main session locus cache\n * @param {Object} newLocus\n * @returns {Object}\n * @memberof LocusInfo\n */\n getTheLocusToUpdate(newLocus: any) {\n const switchStatus = ControlsUtils.getSessionSwitchStatus(this, newLocus);\n\n if (switchStatus.isReturnToMain && this.mainSessionLocusCache) {\n return cloneDeep(this.mainSessionLocusCache);\n }\n const isMainSessionDTO =\n this.mainSessionLocusCache && ControlsUtils.isMainSessionDTO(this.mainSessionLocusCache);\n\n if (isMainSessionDTO) {\n const isActive =\n [LOCUS.STATE.ACTIVE, LOCUS.STATE.INITIALIZING, LOCUS.STATE.TERMINATING].includes(\n this.fullState?.state\n ) && !this.mainSessionLocusCache?.self?.removed;\n\n if (!isActive) {\n this.clearMainSessionLocusCache();\n }\n }\n\n return newLocus;\n }\n\n /**\n * merge participants by participant id\n * @param {Array} participants\n * @param {Array} sourceParticipants\n * @returns {Array} merged participants\n * @memberof LocusInfo\n */\n // eslint-disable-next-line class-methods-use-this\n mergeParticipants(participants, sourceParticipants) {\n if (!sourceParticipants || !sourceParticipants.length) return participants;\n if (!participants || !participants.length) {\n return sourceParticipants;\n }\n sourceParticipants.forEach((participant) => {\n const existIndex = participants.findIndex((p) => p.id === participant.id);\n if (existIndex > -1) {\n participants.splice(existIndex, 1, participant);\n } else {\n participants.push(participant);\n }\n });\n\n return participants;\n }\n\n /**\n * need cache main sessions' participants since locus will not send the full list when cohost/host leave breakout\n * @param {Object} mainLocus\n * @returns {undefined}\n * @memberof LocusInfo\n */\n updateMainSessionLocusCache(mainLocus: any) {\n if (!mainLocus) {\n return;\n }\n const locusClone = cloneDeep(mainLocus);\n if (this.mainSessionLocusCache) {\n // shallow merge and do special merge for participants\n assignWith(this.mainSessionLocusCache, locusClone, (objValue, srcValue, key) => {\n if (key === 'participants') {\n return this.mergeParticipants(objValue, srcValue);\n }\n\n return srcValue || objValue;\n });\n } else {\n this.mainSessionLocusCache = locusClone;\n }\n }\n\n /**\n * clear main session cache\n * @returns {undefined}\n * @memberof LocusInfo\n */\n clearMainSessionLocusCache() {\n this.mainSessionLocusCache = null;\n }\n}\n"],"mappings":"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"}
|
@@ -287,12 +287,15 @@ var Parser = exports.default = /*#__PURE__*/function () {
|
|
287
287
|
this.pause();
|
288
288
|
break;
|
289
289
|
case USE_INCOMING:
|
290
|
-
case LOCUS_URL_CHANGED:
|
291
290
|
// update working copy for future comparisons.
|
292
291
|
// Note: The working copy of parser gets updated in .onFullLocus()
|
293
292
|
// and here when USE_INCOMING or LOCUS_URL_CHANGED locus.
|
294
293
|
this.workingCopy = newLoci;
|
295
294
|
break;
|
295
|
+
case LOCUS_URL_CHANGED:
|
296
|
+
// clear the working copy completely, do a full locus sync
|
297
|
+
this.workingCopy = null;
|
298
|
+
break;
|
296
299
|
case WAIT:
|
297
300
|
// we've taken newLoci from the front of the queue, so put it back there as we have to wait
|
298
301
|
// for the one that should be in front of it, before we can process it
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"names":["_lodash","require","_queue","_interopRequireDefault","_loggerProxy","_metrics","_constants","_templateObject","_templateObject2","_templateObject3","_templateObject4","_templateObject5","_templateObject6","_templateObject7","_templateObject8","_templateObject9","_templateObject10","MAX_OOO_DELTA_COUNT","OOO_DELTA_WAIT_TIME","OOO_DELTA_WAIT_TIME_RANDOM_DELAY","Parser","exports","default","_classCallCheck2","_defineProperty2","deltaCompareFunc","left","right","_Parser$loci","loci","LT","GT","extract","extractComparisonState","isSequenceEmpty","result","compareSequence","baseSequence","queue","SortedQueue","status","onDeltaAction","workingCopy","syncTimer","undefined","_createClass2","key","value","isNewFullLocus","incomingFullDto","isLoci","LoggerProxy","logger","info","comparisonResult","compareFullDtoSequence","USE_INCOMING","isValidLocus","newLoci","isValid","nextEvent","size","processDeltaEvent","action","locus","onDeltaEvent","enqueue","triggerSync","pause","reason","concat","stopSyncTimer","DESYNC","startSyncTimer","_this","timeout","Math","random","setTimeout","clearTimeout","_Parser$loci2","WAIT","LOCUS_URL_CHANGED","dequeue","compare","lociComparison","debug","needToWait","locus2string","error","resume","_locus$sequence","sequence","entries","length","at","checkSequenceOverlap","current","incoming","comparison","min","max","checkUnequalRanges","currentIsNotUnique","unique","incomingIsNotUnique","currentTotalRange","end","incomingTotalRange","EQ","checkForUniqueEntries","currentIsUnique","incomingIsUnique","checkIfOutOfSync","currentUniqueMin","incomingUniqueMin","currentHasNoRange","start","incomingHasNoRange","neitherSeqHasRange","hasUniqOverlap","list","some","seq","currentUniqOverlap","incomingUniqOverlap","debugInfo","pack","packComparisonResult","compareDelta","compareToAction","_Parser$loci3","url","Metrics","sendBehavioralMetric","BEHAVIORAL_METRICS","LOCUS_DELTA_OUT_OF_ORDER","stack","Error","slice","USE_CURRENT","local","getMetaData","delta","getUniqueSequences","rules","_i","_rules","rule","ERROR","_Parser$loci4","lociComparisonResult","split","first","last","rangeStart","rangeEnd","baseLoci","otherLoci","diff","difference","getNumbersOutOfRange","output","filter","num","sort","a","b","_sequence$entries","hasEmptyEntries","hasEmptyRange","hasProp","prop","Object","prototype","hasOwnProperty","call","newData","oldData","getDebugMessage","debugCode","mStr","strings","join","replace","resolutionMap","debugMap","SO001","title","description","_taggedTemplateLiteral2","logic","SO002","UR001","UR002","UR003","UE001","UE002","OOS001","OOS002","OOS003","debugObj","resolution"],"sources":["parser.ts"],"sourcesContent":["import {difference} from 'lodash';\n\nimport SortedQueue from '../common/queue';\nimport LoggerProxy from '../common/logs/logger-proxy';\n\nimport Metrics from '../metrics';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\n\nconst MAX_OOO_DELTA_COUNT = 5; // when we receive an out-of-order delta and the queue builds up to MAX_OOO_DELTA_COUNT, we do a sync with Locus\nconst OOO_DELTA_WAIT_TIME = 10000; // [ms] minimum wait time before we do a sync if we get out-of-order deltas\nconst OOO_DELTA_WAIT_TIME_RANDOM_DELAY = 5000; // [ms] max random delay added to OOO_DELTA_WAIT_TIME\n\ntype LocusDeltaDto = {\n url: string;\n baseSequence: {\n rangeStart: number;\n rangeEnd: number;\n entries: number[];\n };\n sequence: {\n rangeStart: number;\n rangeEnd: number;\n entries: number[];\n };\n syncUrl: string;\n};\n\n/**\n * Locus Delta Parser\n * @private\n * https://sqbu-github.cisco.com/WebExSquared/cloud-apps/wiki/Locus-Delta-Events\n */\nexport default class Parser {\n // processing status\n status:\n | 'IDLE' // not doing anything\n | 'PAUSED' // paused, because we are doing a sync\n | 'WORKING' // processing a delta event\n | 'BLOCKED'; // received an out-of-order delta, so waiting for the missing one\n\n // loci comparison states\n static loci = {\n EQ: 'EQUAL',\n GT: 'GREATER_THAN',\n LT: 'LESS_THAN',\n DESYNC: 'DESYNC',\n USE_INCOMING: 'USE_INCOMING',\n USE_CURRENT: 'USE_CURRENT',\n WAIT: 'WAIT',\n ERROR: 'ERROR',\n LOCUS_URL_CHANGED: 'LOCUS_URL_CHANGED',\n };\n\n queue: SortedQueue<LocusDeltaDto>;\n workingCopy: any;\n syncTimer?: ReturnType<typeof setTimeout>;\n\n /**\n * @constructs Parser\n */\n constructor() {\n const deltaCompareFunc = (left: LocusDeltaDto, right: LocusDeltaDto) => {\n const {LT, GT} = Parser.loci;\n const {extractComparisonState: extract} = Parser;\n\n if (Parser.isSequenceEmpty(left)) {\n return -1;\n }\n if (Parser.isSequenceEmpty(right)) {\n return 1;\n }\n const result = extract(Parser.compareSequence(left.baseSequence, right.baseSequence));\n\n if (result === LT) {\n return -1;\n }\n if (result === GT) {\n return 1;\n }\n\n return 0;\n };\n\n this.queue = new SortedQueue<LocusDeltaDto>(deltaCompareFunc);\n this.status = 'IDLE';\n this.onDeltaAction = null;\n this.workingCopy = null;\n this.syncTimer = undefined;\n }\n\n /**\n * Returns a debug string representing a locus delta - useful for logging\n *\n * @param {LocusDeltaDto} locus Locus delta\n * @returns {string}\n */\n static locus2string(locus: LocusDeltaDto) {\n if (!locus.sequence?.entries) {\n return 'invalid';\n }\n\n return locus.sequence.entries.length ? `seq=${locus.sequence.entries.at(-1)}` : 'empty';\n }\n\n /**\n * Checks if two sequences overlap in time,\n * the sequence with the higher minimum value is greater.\n * Chooses sequence with most recent data.\n * @param {Types~Locus} current\n * @param {Types~Locus} incoming\n * @returns {string} loci comparison state\n */\n static checkSequenceOverlap(current, incoming) {\n let comparison = null;\n\n // if earliest working copy sequence is more recent than last incoming sequence\n if (current.min > incoming.max) {\n // choose left side (current)\n comparison = `${Parser.loci.GT}:SO001`;\n }\n // if last working copy sequence is before the earliest incoming sequence\n else if (current.max < incoming.min) {\n // choose right side (incoming)\n comparison = `${Parser.loci.LT}:SO002`;\n }\n\n // if no match above, defaults to null\n return comparison;\n }\n\n /**\n * Checks if two sequences have unequal ranges.\n * Chooses sequence with most larger range.\n * @param {Types~Locus} current\n * @param {Types~Locus} incoming\n * @returns {object} loci comparison\n */\n static checkUnequalRanges(current, incoming) {\n let comparison = null;\n const currentIsNotUnique = current.unique.length === 0;\n const incomingIsNotUnique = incoming.unique.length === 0;\n const currentTotalRange = current.end - current.min;\n const incomingTotalRange = incoming.end - incoming.min;\n\n // no unique values for both loci\n if (currentIsNotUnique && incomingIsNotUnique) {\n // current working copy loci has a larger range\n if (currentTotalRange > incomingTotalRange) {\n // choose left side (current)\n comparison = `${Parser.loci.GT}:UR001`;\n }\n // incoming delta loci has a larger range\n else if (currentTotalRange < incomingTotalRange) {\n // choose right side (incoming)\n comparison = `${Parser.loci.LT}:UR002`;\n } else {\n // with no unique entries and with ranges either absent or\n // of the same size, the sequences are considered equal.\n comparison = `${Parser.loci.EQ}:UR003`;\n }\n }\n\n return comparison;\n }\n\n /**\n * Checks if either sequences has unique entries.\n * Entries are considered unique if they do not overlap\n * with other Loci sequences or range values.\n * Chooses sequence with the unique entries.\n * @param {Types~Locus} current\n * @param {Types~Locus} incoming\n * @returns {string} loci comparison state\n */\n static checkForUniqueEntries(current, incoming) {\n let comparison = null;\n const currentIsUnique = current.unique.length > 0;\n const incomingIsUnique = incoming.unique.length > 0;\n\n // current has unique entries and incoming does not\n if (currentIsUnique && !incomingIsUnique) {\n // choose left side (current)\n comparison = `${Parser.loci.GT}:UE001`;\n }\n // current has no unique entries but incoming does\n else if (!currentIsUnique && incomingIsUnique) {\n // choose right side (incoming)\n comparison = `${Parser.loci.LT}:UE002`;\n }\n\n return comparison;\n }\n\n /**\n * Checks both Locus Delta objects to see if they are\n * out of sync with one another. If so sends a DESYNC\n * request to the server.\n * @param {Types~Locus} current\n * @param {Types~Locus} incoming\n * @returns {string} loci comparison state\n */\n static checkIfOutOfSync(current, incoming) {\n let comparison = null;\n const currentUniqueMin = current.unique[0];\n const incomingUniqueMin = incoming.unique[0];\n\n const currentHasNoRange = !current.start && !current.end;\n const incomingHasNoRange = !incoming.start && !incoming.end;\n const neitherSeqHasRange = currentHasNoRange && incomingHasNoRange;\n\n const hasUniqOverlap = (list, min, max) => list.some((seq) => min < seq && seq < max);\n // current unique entries overlap the total range of incoming\n const currentUniqOverlap = hasUniqOverlap(current.unique, incoming.min, incoming.max);\n // vice-versa, incoming unique entries overlap the total range of current\n const incomingUniqOverlap = hasUniqOverlap(incoming.unique, current.min, current.max);\n\n if (neitherSeqHasRange || currentUniqOverlap || incomingUniqOverlap) {\n // outputs string indicating which condition occurred. ex: 0,1,0\n const debugInfo = `${+neitherSeqHasRange},${+currentUniqOverlap},${+incomingUniqOverlap}`;\n\n // send DESYNC to server\n comparison = `${Parser.loci.DESYNC}:OOS001:${debugInfo}`;\n } else if (currentUniqueMin > incomingUniqueMin) {\n // choose left side (current)\n comparison = `${Parser.loci.GT}:OOS002`;\n } else {\n // choose right side (incoming)\n comparison = `${Parser.loci.LT}:OOS003`;\n }\n\n return comparison;\n }\n\n /**\n * Compares two loci to determine which one contains the most recent state\n * @instance\n * @memberof Locus\n * @param {Types~Locus} current\n * @param {Types~Locus} incoming\n * @returns {string} loci comparison state\n */\n static compare(current, incoming) {\n const {isSequenceEmpty} = Parser;\n const {extractComparisonState: extract} = Parser;\n const {packComparisonResult: pack} = Parser;\n\n if (isSequenceEmpty(current) || isSequenceEmpty(incoming)) {\n return pack(Parser.loci.USE_INCOMING, 'C001');\n }\n\n if (incoming.baseSequence) {\n return pack(Parser.compareDelta(current, incoming), 'C002');\n }\n\n const result = Parser.compareSequence(current.sequence, incoming.sequence);\n const action = Parser.compareToAction(extract(result));\n\n return pack(action, result);\n }\n\n /**\n * Compares two loci sequences (with delta params) and indicates what action\n * to take.\n * @instance\n * @memberof Locus\n * @param {Types~Locus} current\n * @param {Types~Locus} incoming\n * @private\n * @returns {string} loci comparison state\n */\n private static compareDelta(current, incoming) {\n const {LT, GT, EQ, DESYNC, USE_INCOMING, WAIT, LOCUS_URL_CHANGED} = Parser.loci;\n\n const {extractComparisonState: extract} = Parser;\n const {packComparisonResult: pack} = Parser;\n\n const result = Parser.compareSequence(current.sequence, incoming.sequence);\n let comparison = extract(result);\n\n if (comparison !== LT) {\n return pack(Parser.compareToAction(comparison), result);\n }\n\n if (incoming.url !== current.url) {\n // when moving to/from a breakout session, the locus URL will change and also\n // the baseSequence, making incoming and current incomparable, so use a\n // unique comparison state\n return pack(LOCUS_URL_CHANGED, result);\n }\n\n comparison = Parser.compareSequence(current.sequence, incoming.baseSequence);\n\n switch (extract(comparison)) {\n case GT:\n case EQ:\n comparison = USE_INCOMING;\n break;\n\n case LT:\n if (extract(Parser.compareSequence(incoming.baseSequence, incoming.sequence)) === EQ) {\n // special case where Locus sends a delta with baseSequence === sequence to trigger a sync,\n // because the delta event is too large to be sent over mercury connection\n comparison = DESYNC;\n } else {\n // the incoming locus has baseSequence from the future, so it is out-of-order,\n // we are missing 1 or more locus that should be in front of it, we need to wait for it\n comparison = WAIT;\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.LOCUS_DELTA_OUT_OF_ORDER, {\n stack: new Error().stack,\n });\n }\n break;\n default:\n comparison = DESYNC;\n }\n\n return pack(comparison, result);\n }\n\n /**\n * Compares Locus sequences - it should be called only for full Locus DTOs, not deltas\n *\n * @param {Types~Locus} current Current working copy\n * @param {Types~Locus} incomingFullDto New Full Locus DTO\n * @returns {string} either Parser.loci.USE_INCOMING or Parser.loci.USE_CURRENT\n */\n static compareFullDtoSequence(current, incomingFullDto) {\n if (Parser.isSequenceEmpty(current) || Parser.isSequenceEmpty(incomingFullDto)) {\n return Parser.loci.USE_INCOMING;\n }\n\n // the sequence.entries list will always contain at least 1 entry\n // https://sqbu-github.cisco.com/WebExSquared/cloud-apps/wiki/Locus-Sequence-Comparison-Algorithm\n\n return incomingFullDto.sequence.entries.slice(-1)[0] > current.sequence.entries.slice(-1)[0]\n ? Parser.loci.USE_INCOMING\n : Parser.loci.USE_CURRENT;\n }\n\n /**\n * Returns true if the incoming full locus DTO is newer than the current working copy\n *\n * @param {Types~Locus} incomingFullDto New Full Locus DTO\n * @returns {string} either Parser.loci.USE_INCOMING or Parser.loci.USE_CURRENT\n */\n isNewFullLocus(incomingFullDto) {\n if (!Parser.isLoci(incomingFullDto)) {\n LoggerProxy.logger.info('Locus-info:parser#isNewFullLocus --> Ignoring non-locus object.');\n\n return false;\n }\n\n if (!this.workingCopy) {\n // we don't have a working copy yet, so any full locus is better than nothing\n return true;\n }\n\n const comparisonResult = Parser.compareFullDtoSequence(this.workingCopy, incomingFullDto);\n\n return comparisonResult === Parser.loci.USE_INCOMING;\n }\n\n /**\n * Compares Locus sequences\n * @param {Types~Locus} current Current working copy\n * @param {Types~Locus} incoming New Locus delta\n * @returns {string}\n */\n static compareSequence(current, incoming) {\n // Locus sequence comparison rules in order of priority.\n // https://sqbu-github.cisco.com/WebExSquared/cloud-apps/wiki/Locus-Sequence-Comparison-Algorithm\n\n const local: any = Parser.getMetaData(current);\n const delta: any = Parser.getMetaData(incoming);\n\n // update loci metadata\n local.unique = Parser.getUniqueSequences(local, delta);\n delta.unique = Parser.getUniqueSequences(delta, local);\n\n // Locus sequence comparison rules\n // order matters\n const rules = [\n Parser.checkSequenceOverlap,\n Parser.checkUnequalRanges,\n Parser.checkForUniqueEntries,\n Parser.checkIfOutOfSync,\n ];\n\n for (const rule of rules) {\n // Rule only returns a value if the rule applies,\n // otherwise returns null.\n const result = rule(local, delta);\n\n if (result) {\n return result;\n }\n }\n\n // error, none of rules above applied\n // should never get here as last rule\n // should be catch all.\n return Parser.loci.ERROR;\n }\n\n /**\n * Transates the result of a sequence comparison into an intended behavior\n * @param {string} result\n * @returns {string} Locus comparison action\n */\n static compareToAction(result: string) {\n const {DESYNC, EQ, ERROR, GT, LT, USE_CURRENT, USE_INCOMING} = Parser.loci;\n\n let action = ERROR;\n\n switch (result) {\n case EQ:\n case GT:\n action = USE_CURRENT;\n break;\n case LT:\n action = USE_INCOMING;\n break;\n case DESYNC:\n action = DESYNC;\n break;\n default:\n LoggerProxy.logger.info(\n `Locus-info:parser#compareToAction --> Error: ${result} is not a recognized sequence comparison result.`\n );\n }\n\n return action;\n }\n\n /**\n * Extracts a loci comparison from a string of data.\n * @param {string} lociComparisonResult Comparison result with extra data\n * @returns {string} Comparison of EQ, LT, GT, or DESYNC.\n */\n static extractComparisonState(lociComparisonResult: string) {\n return lociComparisonResult.split(':')[0];\n }\n\n /**\n * @typedef {object} LociMetadata\n * @property {number} start - Starting sequence number\n * @property {number} end - Ending sequence number\n * @property {number} first - First sequence number\n * @property {number} last - Last sequence number\n * @property {number} min - Minimum sequence number\n * @property {number} max - Maximum sequence number\n * @property {number} entries - Loci sequence entries\n */\n\n /**\n * Metadata for Locus delta\n * @param {Array.<number>} sequence Locus delta sequence\n * @returns {LociMetadata} Locus Delta Metadata\n */\n static getMetaData(sequence: any) {\n const {entries} = sequence;\n const first = entries[0];\n const last = entries.slice(-1)[0];\n\n // rangeStart or rangeEnd is 0 if a range doesn't exist\n const start = sequence.rangeStart;\n const end = sequence.rangeEnd;\n\n // sequence data\n return {\n start,\n end,\n first,\n last,\n // Rule is: rangeStart <= rangeEnd <= min(entries)\n min: start || first,\n // Grab last entry if exist else default to rangeEnd\n max: last || end,\n // keep reference to actual sequence entries\n entries,\n };\n }\n\n /**\n * Compares two Locus delta objects and notes unique\n * values contained within baseLoci.\n * @param {LociMetadata} baseLoci\n * @param {LociMetadata} otherLoci\n * @returns {Array.<number>} List of unique sequences\n */\n static getUniqueSequences(baseLoci: any, otherLoci: any) {\n const diff: any = difference(baseLoci.entries, otherLoci.entries);\n\n const {start, end} = otherLoci;\n\n return Parser.getNumbersOutOfRange(diff, start, end);\n }\n\n /**\n * Returns an array of numbers outside of a given range.\n * @param {Array.<number>} list Array to filter\n * @param {number} rangeStart Start of range\n * @param {number} rangeEnd End of range\n * @returns {Array.<number>} Array of numbers sorted ASC\n */\n static getNumbersOutOfRange(list: Array<number>, rangeStart: number, rangeEnd: number) {\n // Collect all numbers if number is outside of specified range\n const output = list.filter((num) => num < rangeStart || num > rangeEnd);\n\n // sort ascending\n return output.sort((a, b) => a - b);\n }\n\n /**\n * Checks if newLoci or workingCopy is invalid.\n * @param {Types~Locus} newLoci\n * @returns {boolean}\n */\n isValidLocus(newLoci) {\n let isValid = false;\n const {isLoci} = Parser;\n\n // one or both objects are not locus delta events\n if (!isLoci(this.workingCopy) || !isLoci(newLoci)) {\n LoggerProxy.logger.info(\n 'Locus-info:parser#processDeltaEvent --> Ignoring non-locus object. workingCopy:',\n this.workingCopy,\n 'newLoci:',\n newLoci\n );\n } else {\n isValid = true;\n }\n\n return isValid;\n }\n\n /**\n * Determines if a paricular locus's sequence is empty\n * @param {Types~Locus} locus\n * @returns {bool}\n */\n static isSequenceEmpty(locus) {\n const {sequence} = locus;\n const hasEmptyEntries = !sequence.entries?.length;\n const hasEmptyRange = sequence.rangeStart === 0 && sequence.rangeEnd === 0;\n\n return hasEmptyEntries && hasEmptyRange;\n }\n\n /**\n * Determines if an object has basic\n * structure of a locus object.\n * @param {Types~Locus} loci\n * @returns {boolean}\n */\n static isLoci(loci) {\n if (!loci || !loci.sequence) {\n return false;\n }\n const hasProp = (prop) => Object.prototype.hasOwnProperty.call(loci.sequence, prop);\n\n if (hasProp('rangeStart') && hasProp('rangeEnd')) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Processes next event in queue,\n * if queue is empty sets status to idle.\n * @returns {undefined}\n */\n nextEvent() {\n if (this.status === 'PAUSED') {\n LoggerProxy.logger.info('Locus-info:parser#nextEvent --> Locus parser paused.');\n\n return;\n }\n\n if (this.status === 'BLOCKED') {\n LoggerProxy.logger.info(\n 'Locus-info:parser#nextEvent --> Locus parser blocked by out-of-order delta.'\n );\n\n return;\n }\n\n // continue processing until queue is empty\n if (this.queue.size() > 0) {\n this.processDeltaEvent();\n } else {\n this.status = 'IDLE';\n }\n }\n\n /**\n * Function handler for delta actions,\n * is set by instance callee.\n * @param {string} action Locus delta action\n * @param {Types~Locus} locus Locus delta\n * @returns {undefined}\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onDeltaAction(action: string, locus) {}\n\n /**\n * Event handler for locus delta events\n * @param {Types~Locus} loci Locus Delta\n * @returns {undefined}\n */\n onDeltaEvent(loci) {\n // enqueue the new loci\n this.queue.enqueue(loci);\n\n if (this.onDeltaAction) {\n if (this.status === 'BLOCKED') {\n if (this.queue.size() > MAX_OOO_DELTA_COUNT) {\n this.triggerSync('queue too big, blocked on out-of-order delta');\n } else {\n this.processDeltaEvent();\n }\n } else if (this.status === 'IDLE') {\n // Update status, ensure we only process one event at a time.\n this.status = 'WORKING';\n\n this.processDeltaEvent();\n }\n }\n }\n\n /**\n * Appends new data onto a string of existing data.\n * @param {string} newData\n * @param {string} oldData\n * @returns {string}\n */\n static packComparisonResult(newData: string, oldData: string) {\n return `${newData}:${oldData}`;\n }\n\n /**\n * Pause locus processing\n * @returns {undefined}\n */\n pause() {\n this.status = 'PAUSED';\n LoggerProxy.logger.info('Locus-info:parser#pause --> Locus parser paused.');\n }\n\n /**\n * Triggers a sync with Locus\n *\n * @param {string} reason used just for logging\n * @returns {undefined}\n */\n private triggerSync(reason: string) {\n LoggerProxy.logger.info(`Locus-info:parser#triggerSync --> doing sync, reason: ${reason}`);\n this.stopSyncTimer();\n this.pause();\n this.onDeltaAction(Parser.loci.DESYNC, this.workingCopy);\n }\n\n /**\n * Starts a timer with a random delay. When that timer expires we will do a sync.\n *\n * The main purpose of this timer is to handle a case when we get some out-of-order deltas,\n * so we start waiting to receive the missing delta. If that delta never arrives, this timer\n * will trigger a sync with Locus.\n *\n * @returns {undefined}\n */\n private startSyncTimer() {\n if (this.syncTimer === undefined) {\n const timeout = OOO_DELTA_WAIT_TIME + Math.random() * OOO_DELTA_WAIT_TIME_RANDOM_DELAY;\n\n this.syncTimer = setTimeout(() => {\n this.syncTimer = undefined;\n this.triggerSync('timer expired, blocked on out-of-order delta');\n }, timeout);\n }\n }\n\n /**\n * Stops the timer for triggering a sync\n *\n * @returns {undefined}\n */\n private stopSyncTimer() {\n if (this.syncTimer !== undefined) {\n clearTimeout(this.syncTimer);\n this.syncTimer = undefined;\n }\n }\n\n /**\n * Processes next locus delta in the queue,\n * continues until the queue is empty\n * or cleared.\n * @returns {undefined}\n */\n processDeltaEvent() {\n const {DESYNC, USE_INCOMING, WAIT, LOCUS_URL_CHANGED} = Parser.loci;\n const {extractComparisonState: extract} = Parser;\n const newLoci = this.queue.dequeue();\n\n if (!this.isValidLocus(newLoci)) {\n this.nextEvent();\n\n return;\n }\n\n const result = Parser.compare(this.workingCopy, newLoci);\n const lociComparison = extract(result);\n\n // limited debugging, use chrome extension\n // for full debugging.\n LoggerProxy.logger.debug(`Locus-info:parser#processDeltaEvent --> Locus Debug: ${result}`);\n\n let needToWait = false;\n\n switch (lociComparison) {\n case DESYNC:\n // wait for desync response\n this.pause();\n break;\n\n case USE_INCOMING:\n case LOCUS_URL_CHANGED:\n // update working copy for future comparisons.\n // Note: The working copy of parser gets updated in .onFullLocus()\n // and here when USE_INCOMING or LOCUS_URL_CHANGED locus.\n this.workingCopy = newLoci;\n break;\n\n case WAIT:\n // we've taken newLoci from the front of the queue, so put it back there as we have to wait\n // for the one that should be in front of it, before we can process it\n this.queue.enqueue(newLoci);\n needToWait = true;\n break;\n\n default:\n break;\n }\n\n if (needToWait) {\n this.status = 'BLOCKED';\n this.startSyncTimer();\n } else {\n this.stopSyncTimer();\n\n if (this.status === 'BLOCKED') {\n // we are not blocked anymore\n this.status = 'WORKING';\n\n LoggerProxy.logger.info(\n `Locus-info:parser#processDeltaEvent --> received delta that we were waiting for ${Parser.locus2string(\n newLoci\n )}, not blocked anymore`\n );\n }\n }\n\n if (this.onDeltaAction) {\n LoggerProxy.logger.info(\n `Locus-info:parser#processDeltaEvent --> Locus Delta ${Parser.locus2string(\n newLoci\n )}, Action: ${lociComparison}`\n );\n\n try {\n this.onDeltaAction(lociComparison, newLoci);\n } catch (error) {\n LoggerProxy.logger.error(\n 'Locus-info:parser#processDeltaEvent --> Error in onDeltaAction',\n error\n );\n }\n }\n\n this.nextEvent();\n }\n\n /**\n * Resume from a paused state\n * @returns {undefined}\n */\n resume() {\n LoggerProxy.logger.info('Locus-info:parser#resume --> Locus parser resumed.');\n this.status = 'WORKING';\n this.nextEvent();\n }\n\n /**\n * Gets related debug info for given error code\n * @param {string} debugCode Debug code\n * @param {string} comparison Locus comparison string\n * @returns {object} Debug message\n */\n static getDebugMessage(debugCode: string, comparison: string) {\n // removes extra spaces from multiline string\n const mStr = (strings) => strings.join('').replace(/\\s{2,}/g, ' ');\n\n const resolutionMap = {\n EQ: `${Parser.loci.LT}: is equal (current == incoming).`,\n LT: `${Parser.loci.LT}: choose right side (incoming).`,\n GT: `${Parser.loci.GT}: choose left side (current).`,\n };\n\n const debugMap = {\n SO001: {\n title: 'checkSequenceOverlap-001',\n description: mStr`Occurs if earliest working copy sequence is more \\\n recent than last incoming sequence.`,\n logic: 'current.min > incoming.max',\n },\n\n SO002: {\n title: 'checkSequenceOverlap-002',\n description: mStr`Occurs if last working copy sequence is before the \\\n earliest incoming sequence.`,\n logic: 'current.max < incoming.min',\n },\n\n UR001: {\n title: 'checkUnequalRanges-001',\n description: mStr`Occurs if there are no unique values for both loci, \\\n and the current working copy loci has a larger range.`,\n logic: 'currentTotalRange > incomingTotalRange',\n },\n\n UR002: {\n title: 'checkUnequalRanges-002',\n description: mStr`Occurs if there are no unique values for both loci, \\\n and the incoming delta loci has a larger range.`,\n logic: 'currentTotalRange < incomingTotalRange',\n },\n\n UR003: {\n title: 'checkUnequalRanges-003',\n description: mStr`Occurs if there are no unique values for both loci, \\\n and with ranges either absent or of the same size, the sequences \\\n are considered equal.`,\n logic: 'currentTotalRange == incomingTotalRange',\n },\n\n UE001: {\n title: 'checkForUniqueEntries-001',\n description: mStr`Occurs if current loci has unique entries and \\\n incoming does not. Entries are considered unique if they \\\n do not overlap with other Loci sequences or range values.`,\n logic: 'currentIsUnique && !incomingIsUnique',\n },\n\n UE002: {\n title: 'checkForUniqueEntries-002',\n description: mStr`Occurs if current has no unique entries but \\\n incoming does. Entries are considered unique if they \\\n do not overlap with other Loci sequences or range values.`,\n logic: '!currentIsUnique && incomingIsUnique',\n },\n\n OOS001: {\n title: 'checkIfOutOfSync-001',\n description: mStr`Occurs if neither sequence has a range, or \\\n if the current loci unique entries overlap the total range of the \\\n incoming sequence, or if the incoming unique entries overlap \\\n the total range of current sequence.`,\n logic: 'neitherSeqHasRange || currentUniqOverlap || incomingUniqOverlap',\n },\n\n OOS002: {\n title: 'checkIfOutOfSync-002',\n description: mStr`Occurs if the minimum value from sequences that are \\\n unique to the current loci is greater than the minimum value from \\\n sequences that are unique to the incoming loci.`,\n logic: 'currentUniqueMin > incomingUniqueMin',\n },\n\n OOS003: {\n title: 'checkIfOutOfSync-003',\n description: mStr`Occurs if none of the comparison rules applied. \\\n It is a catch all.`,\n logic: 'else (catch all)',\n },\n };\n\n const debugObj = debugMap[debugCode];\n\n debugObj.title = `Debug: ${debugObj.title}`;\n debugObj.resolution = resolutionMap[comparison];\n\n return debugObj;\n }\n}\n"],"mappings":"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"}
|
1
|
+
{"version":3,"names":["_lodash","require","_queue","_interopRequireDefault","_loggerProxy","_metrics","_constants","_templateObject","_templateObject2","_templateObject3","_templateObject4","_templateObject5","_templateObject6","_templateObject7","_templateObject8","_templateObject9","_templateObject10","MAX_OOO_DELTA_COUNT","OOO_DELTA_WAIT_TIME","OOO_DELTA_WAIT_TIME_RANDOM_DELAY","Parser","exports","default","_classCallCheck2","_defineProperty2","deltaCompareFunc","left","right","_Parser$loci","loci","LT","GT","extract","extractComparisonState","isSequenceEmpty","result","compareSequence","baseSequence","queue","SortedQueue","status","onDeltaAction","workingCopy","syncTimer","undefined","_createClass2","key","value","isNewFullLocus","incomingFullDto","isLoci","LoggerProxy","logger","info","comparisonResult","compareFullDtoSequence","USE_INCOMING","isValidLocus","newLoci","isValid","nextEvent","size","processDeltaEvent","action","locus","onDeltaEvent","enqueue","triggerSync","pause","reason","concat","stopSyncTimer","DESYNC","startSyncTimer","_this","timeout","Math","random","setTimeout","clearTimeout","_Parser$loci2","WAIT","LOCUS_URL_CHANGED","dequeue","compare","lociComparison","debug","needToWait","locus2string","error","resume","_locus$sequence","sequence","entries","length","at","checkSequenceOverlap","current","incoming","comparison","min","max","checkUnequalRanges","currentIsNotUnique","unique","incomingIsNotUnique","currentTotalRange","end","incomingTotalRange","EQ","checkForUniqueEntries","currentIsUnique","incomingIsUnique","checkIfOutOfSync","currentUniqueMin","incomingUniqueMin","currentHasNoRange","start","incomingHasNoRange","neitherSeqHasRange","hasUniqOverlap","list","some","seq","currentUniqOverlap","incomingUniqOverlap","debugInfo","pack","packComparisonResult","compareDelta","compareToAction","_Parser$loci3","url","Metrics","sendBehavioralMetric","BEHAVIORAL_METRICS","LOCUS_DELTA_OUT_OF_ORDER","stack","Error","slice","USE_CURRENT","local","getMetaData","delta","getUniqueSequences","rules","_i","_rules","rule","ERROR","_Parser$loci4","lociComparisonResult","split","first","last","rangeStart","rangeEnd","baseLoci","otherLoci","diff","difference","getNumbersOutOfRange","output","filter","num","sort","a","b","_sequence$entries","hasEmptyEntries","hasEmptyRange","hasProp","prop","Object","prototype","hasOwnProperty","call","newData","oldData","getDebugMessage","debugCode","mStr","strings","join","replace","resolutionMap","debugMap","SO001","title","description","_taggedTemplateLiteral2","logic","SO002","UR001","UR002","UR003","UE001","UE002","OOS001","OOS002","OOS003","debugObj","resolution"],"sources":["parser.ts"],"sourcesContent":["import {difference} from 'lodash';\n\nimport SortedQueue from '../common/queue';\nimport LoggerProxy from '../common/logs/logger-proxy';\n\nimport Metrics from '../metrics';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\n\nconst MAX_OOO_DELTA_COUNT = 5; // when we receive an out-of-order delta and the queue builds up to MAX_OOO_DELTA_COUNT, we do a sync with Locus\nconst OOO_DELTA_WAIT_TIME = 10000; // [ms] minimum wait time before we do a sync if we get out-of-order deltas\nconst OOO_DELTA_WAIT_TIME_RANDOM_DELAY = 5000; // [ms] max random delay added to OOO_DELTA_WAIT_TIME\n\ntype LocusDeltaDto = {\n url: string;\n baseSequence: {\n rangeStart: number;\n rangeEnd: number;\n entries: number[];\n };\n sequence: {\n rangeStart: number;\n rangeEnd: number;\n entries: number[];\n };\n syncUrl: string;\n};\n\n/**\n * Locus Delta Parser\n * @private\n * https://sqbu-github.cisco.com/WebExSquared/cloud-apps/wiki/Locus-Delta-Events\n */\nexport default class Parser {\n // processing status\n status:\n | 'IDLE' // not doing anything\n | 'PAUSED' // paused, because we are doing a sync\n | 'WORKING' // processing a delta event\n | 'BLOCKED'; // received an out-of-order delta, so waiting for the missing one\n\n // loci comparison states\n static loci = {\n EQ: 'EQUAL',\n GT: 'GREATER_THAN',\n LT: 'LESS_THAN',\n DESYNC: 'DESYNC',\n USE_INCOMING: 'USE_INCOMING',\n USE_CURRENT: 'USE_CURRENT',\n WAIT: 'WAIT',\n ERROR: 'ERROR',\n LOCUS_URL_CHANGED: 'LOCUS_URL_CHANGED',\n };\n\n queue: SortedQueue<LocusDeltaDto>;\n workingCopy: any;\n syncTimer?: ReturnType<typeof setTimeout>;\n\n /**\n * @constructs Parser\n */\n constructor() {\n const deltaCompareFunc = (left: LocusDeltaDto, right: LocusDeltaDto) => {\n const {LT, GT} = Parser.loci;\n const {extractComparisonState: extract} = Parser;\n\n if (Parser.isSequenceEmpty(left)) {\n return -1;\n }\n if (Parser.isSequenceEmpty(right)) {\n return 1;\n }\n const result = extract(Parser.compareSequence(left.baseSequence, right.baseSequence));\n\n if (result === LT) {\n return -1;\n }\n if (result === GT) {\n return 1;\n }\n\n return 0;\n };\n\n this.queue = new SortedQueue<LocusDeltaDto>(deltaCompareFunc);\n this.status = 'IDLE';\n this.onDeltaAction = null;\n this.workingCopy = null;\n this.syncTimer = undefined;\n }\n\n /**\n * Returns a debug string representing a locus delta - useful for logging\n *\n * @param {LocusDeltaDto} locus Locus delta\n * @returns {string}\n */\n static locus2string(locus: LocusDeltaDto) {\n if (!locus.sequence?.entries) {\n return 'invalid';\n }\n\n return locus.sequence.entries.length ? `seq=${locus.sequence.entries.at(-1)}` : 'empty';\n }\n\n /**\n * Checks if two sequences overlap in time,\n * the sequence with the higher minimum value is greater.\n * Chooses sequence with most recent data.\n * @param {Types~Locus} current\n * @param {Types~Locus} incoming\n * @returns {string} loci comparison state\n */\n static checkSequenceOverlap(current, incoming) {\n let comparison = null;\n\n // if earliest working copy sequence is more recent than last incoming sequence\n if (current.min > incoming.max) {\n // choose left side (current)\n comparison = `${Parser.loci.GT}:SO001`;\n }\n // if last working copy sequence is before the earliest incoming sequence\n else if (current.max < incoming.min) {\n // choose right side (incoming)\n comparison = `${Parser.loci.LT}:SO002`;\n }\n\n // if no match above, defaults to null\n return comparison;\n }\n\n /**\n * Checks if two sequences have unequal ranges.\n * Chooses sequence with most larger range.\n * @param {Types~Locus} current\n * @param {Types~Locus} incoming\n * @returns {object} loci comparison\n */\n static checkUnequalRanges(current, incoming) {\n let comparison = null;\n const currentIsNotUnique = current.unique.length === 0;\n const incomingIsNotUnique = incoming.unique.length === 0;\n const currentTotalRange = current.end - current.min;\n const incomingTotalRange = incoming.end - incoming.min;\n\n // no unique values for both loci\n if (currentIsNotUnique && incomingIsNotUnique) {\n // current working copy loci has a larger range\n if (currentTotalRange > incomingTotalRange) {\n // choose left side (current)\n comparison = `${Parser.loci.GT}:UR001`;\n }\n // incoming delta loci has a larger range\n else if (currentTotalRange < incomingTotalRange) {\n // choose right side (incoming)\n comparison = `${Parser.loci.LT}:UR002`;\n } else {\n // with no unique entries and with ranges either absent or\n // of the same size, the sequences are considered equal.\n comparison = `${Parser.loci.EQ}:UR003`;\n }\n }\n\n return comparison;\n }\n\n /**\n * Checks if either sequences has unique entries.\n * Entries are considered unique if they do not overlap\n * with other Loci sequences or range values.\n * Chooses sequence with the unique entries.\n * @param {Types~Locus} current\n * @param {Types~Locus} incoming\n * @returns {string} loci comparison state\n */\n static checkForUniqueEntries(current, incoming) {\n let comparison = null;\n const currentIsUnique = current.unique.length > 0;\n const incomingIsUnique = incoming.unique.length > 0;\n\n // current has unique entries and incoming does not\n if (currentIsUnique && !incomingIsUnique) {\n // choose left side (current)\n comparison = `${Parser.loci.GT}:UE001`;\n }\n // current has no unique entries but incoming does\n else if (!currentIsUnique && incomingIsUnique) {\n // choose right side (incoming)\n comparison = `${Parser.loci.LT}:UE002`;\n }\n\n return comparison;\n }\n\n /**\n * Checks both Locus Delta objects to see if they are\n * out of sync with one another. If so sends a DESYNC\n * request to the server.\n * @param {Types~Locus} current\n * @param {Types~Locus} incoming\n * @returns {string} loci comparison state\n */\n static checkIfOutOfSync(current, incoming) {\n let comparison = null;\n const currentUniqueMin = current.unique[0];\n const incomingUniqueMin = incoming.unique[0];\n\n const currentHasNoRange = !current.start && !current.end;\n const incomingHasNoRange = !incoming.start && !incoming.end;\n const neitherSeqHasRange = currentHasNoRange && incomingHasNoRange;\n\n const hasUniqOverlap = (list, min, max) => list.some((seq) => min < seq && seq < max);\n // current unique entries overlap the total range of incoming\n const currentUniqOverlap = hasUniqOverlap(current.unique, incoming.min, incoming.max);\n // vice-versa, incoming unique entries overlap the total range of current\n const incomingUniqOverlap = hasUniqOverlap(incoming.unique, current.min, current.max);\n\n if (neitherSeqHasRange || currentUniqOverlap || incomingUniqOverlap) {\n // outputs string indicating which condition occurred. ex: 0,1,0\n const debugInfo = `${+neitherSeqHasRange},${+currentUniqOverlap},${+incomingUniqOverlap}`;\n\n // send DESYNC to server\n comparison = `${Parser.loci.DESYNC}:OOS001:${debugInfo}`;\n } else if (currentUniqueMin > incomingUniqueMin) {\n // choose left side (current)\n comparison = `${Parser.loci.GT}:OOS002`;\n } else {\n // choose right side (incoming)\n comparison = `${Parser.loci.LT}:OOS003`;\n }\n\n return comparison;\n }\n\n /**\n * Compares two loci to determine which one contains the most recent state\n * @instance\n * @memberof Locus\n * @param {Types~Locus} current\n * @param {Types~Locus} incoming\n * @returns {string} loci comparison state\n */\n static compare(current, incoming) {\n const {isSequenceEmpty} = Parser;\n const {extractComparisonState: extract} = Parser;\n const {packComparisonResult: pack} = Parser;\n\n if (isSequenceEmpty(current) || isSequenceEmpty(incoming)) {\n return pack(Parser.loci.USE_INCOMING, 'C001');\n }\n\n if (incoming.baseSequence) {\n return pack(Parser.compareDelta(current, incoming), 'C002');\n }\n\n const result = Parser.compareSequence(current.sequence, incoming.sequence);\n const action = Parser.compareToAction(extract(result));\n\n return pack(action, result);\n }\n\n /**\n * Compares two loci sequences (with delta params) and indicates what action\n * to take.\n * @instance\n * @memberof Locus\n * @param {Types~Locus} current\n * @param {Types~Locus} incoming\n * @private\n * @returns {string} loci comparison state\n */\n private static compareDelta(current, incoming) {\n const {LT, GT, EQ, DESYNC, USE_INCOMING, WAIT, LOCUS_URL_CHANGED} = Parser.loci;\n\n const {extractComparisonState: extract} = Parser;\n const {packComparisonResult: pack} = Parser;\n\n const result = Parser.compareSequence(current.sequence, incoming.sequence);\n let comparison = extract(result);\n\n if (comparison !== LT) {\n return pack(Parser.compareToAction(comparison), result);\n }\n\n if (incoming.url !== current.url) {\n // when moving to/from a breakout session, the locus URL will change and also\n // the baseSequence, making incoming and current incomparable, so use a\n // unique comparison state\n return pack(LOCUS_URL_CHANGED, result);\n }\n\n comparison = Parser.compareSequence(current.sequence, incoming.baseSequence);\n\n switch (extract(comparison)) {\n case GT:\n case EQ:\n comparison = USE_INCOMING;\n break;\n\n case LT:\n if (extract(Parser.compareSequence(incoming.baseSequence, incoming.sequence)) === EQ) {\n // special case where Locus sends a delta with baseSequence === sequence to trigger a sync,\n // because the delta event is too large to be sent over mercury connection\n comparison = DESYNC;\n } else {\n // the incoming locus has baseSequence from the future, so it is out-of-order,\n // we are missing 1 or more locus that should be in front of it, we need to wait for it\n comparison = WAIT;\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.LOCUS_DELTA_OUT_OF_ORDER, {\n stack: new Error().stack,\n });\n }\n break;\n default:\n comparison = DESYNC;\n }\n\n return pack(comparison, result);\n }\n\n /**\n * Compares Locus sequences - it should be called only for full Locus DTOs, not deltas\n *\n * @param {Types~Locus} current Current working copy\n * @param {Types~Locus} incomingFullDto New Full Locus DTO\n * @returns {string} either Parser.loci.USE_INCOMING or Parser.loci.USE_CURRENT\n */\n static compareFullDtoSequence(current, incomingFullDto) {\n if (Parser.isSequenceEmpty(current) || Parser.isSequenceEmpty(incomingFullDto)) {\n return Parser.loci.USE_INCOMING;\n }\n\n // the sequence.entries list will always contain at least 1 entry\n // https://sqbu-github.cisco.com/WebExSquared/cloud-apps/wiki/Locus-Sequence-Comparison-Algorithm\n\n return incomingFullDto.sequence.entries.slice(-1)[0] > current.sequence.entries.slice(-1)[0]\n ? Parser.loci.USE_INCOMING\n : Parser.loci.USE_CURRENT;\n }\n\n /**\n * Returns true if the incoming full locus DTO is newer than the current working copy\n *\n * @param {Types~Locus} incomingFullDto New Full Locus DTO\n * @returns {string} either Parser.loci.USE_INCOMING or Parser.loci.USE_CURRENT\n */\n isNewFullLocus(incomingFullDto) {\n if (!Parser.isLoci(incomingFullDto)) {\n LoggerProxy.logger.info('Locus-info:parser#isNewFullLocus --> Ignoring non-locus object.');\n\n return false;\n }\n\n if (!this.workingCopy) {\n // we don't have a working copy yet, so any full locus is better than nothing\n return true;\n }\n\n const comparisonResult = Parser.compareFullDtoSequence(this.workingCopy, incomingFullDto);\n\n return comparisonResult === Parser.loci.USE_INCOMING;\n }\n\n /**\n * Compares Locus sequences\n * @param {Types~Locus} current Current working copy\n * @param {Types~Locus} incoming New Locus delta\n * @returns {string}\n */\n static compareSequence(current, incoming) {\n // Locus sequence comparison rules in order of priority.\n // https://sqbu-github.cisco.com/WebExSquared/cloud-apps/wiki/Locus-Sequence-Comparison-Algorithm\n\n const local: any = Parser.getMetaData(current);\n const delta: any = Parser.getMetaData(incoming);\n\n // update loci metadata\n local.unique = Parser.getUniqueSequences(local, delta);\n delta.unique = Parser.getUniqueSequences(delta, local);\n\n // Locus sequence comparison rules\n // order matters\n const rules = [\n Parser.checkSequenceOverlap,\n Parser.checkUnequalRanges,\n Parser.checkForUniqueEntries,\n Parser.checkIfOutOfSync,\n ];\n\n for (const rule of rules) {\n // Rule only returns a value if the rule applies,\n // otherwise returns null.\n const result = rule(local, delta);\n\n if (result) {\n return result;\n }\n }\n\n // error, none of rules above applied\n // should never get here as last rule\n // should be catch all.\n return Parser.loci.ERROR;\n }\n\n /**\n * Transates the result of a sequence comparison into an intended behavior\n * @param {string} result\n * @returns {string} Locus comparison action\n */\n static compareToAction(result: string) {\n const {DESYNC, EQ, ERROR, GT, LT, USE_CURRENT, USE_INCOMING} = Parser.loci;\n\n let action = ERROR;\n\n switch (result) {\n case EQ:\n case GT:\n action = USE_CURRENT;\n break;\n case LT:\n action = USE_INCOMING;\n break;\n case DESYNC:\n action = DESYNC;\n break;\n default:\n LoggerProxy.logger.info(\n `Locus-info:parser#compareToAction --> Error: ${result} is not a recognized sequence comparison result.`\n );\n }\n\n return action;\n }\n\n /**\n * Extracts a loci comparison from a string of data.\n * @param {string} lociComparisonResult Comparison result with extra data\n * @returns {string} Comparison of EQ, LT, GT, or DESYNC.\n */\n static extractComparisonState(lociComparisonResult: string) {\n return lociComparisonResult.split(':')[0];\n }\n\n /**\n * @typedef {object} LociMetadata\n * @property {number} start - Starting sequence number\n * @property {number} end - Ending sequence number\n * @property {number} first - First sequence number\n * @property {number} last - Last sequence number\n * @property {number} min - Minimum sequence number\n * @property {number} max - Maximum sequence number\n * @property {number} entries - Loci sequence entries\n */\n\n /**\n * Metadata for Locus delta\n * @param {Array.<number>} sequence Locus delta sequence\n * @returns {LociMetadata} Locus Delta Metadata\n */\n static getMetaData(sequence: any) {\n const {entries} = sequence;\n const first = entries[0];\n const last = entries.slice(-1)[0];\n\n // rangeStart or rangeEnd is 0 if a range doesn't exist\n const start = sequence.rangeStart;\n const end = sequence.rangeEnd;\n\n // sequence data\n return {\n start,\n end,\n first,\n last,\n // Rule is: rangeStart <= rangeEnd <= min(entries)\n min: start || first,\n // Grab last entry if exist else default to rangeEnd\n max: last || end,\n // keep reference to actual sequence entries\n entries,\n };\n }\n\n /**\n * Compares two Locus delta objects and notes unique\n * values contained within baseLoci.\n * @param {LociMetadata} baseLoci\n * @param {LociMetadata} otherLoci\n * @returns {Array.<number>} List of unique sequences\n */\n static getUniqueSequences(baseLoci: any, otherLoci: any) {\n const diff: any = difference(baseLoci.entries, otherLoci.entries);\n\n const {start, end} = otherLoci;\n\n return Parser.getNumbersOutOfRange(diff, start, end);\n }\n\n /**\n * Returns an array of numbers outside of a given range.\n * @param {Array.<number>} list Array to filter\n * @param {number} rangeStart Start of range\n * @param {number} rangeEnd End of range\n * @returns {Array.<number>} Array of numbers sorted ASC\n */\n static getNumbersOutOfRange(list: Array<number>, rangeStart: number, rangeEnd: number) {\n // Collect all numbers if number is outside of specified range\n const output = list.filter((num) => num < rangeStart || num > rangeEnd);\n\n // sort ascending\n return output.sort((a, b) => a - b);\n }\n\n /**\n * Checks if newLoci or workingCopy is invalid.\n * @param {Types~Locus} newLoci\n * @returns {boolean}\n */\n isValidLocus(newLoci) {\n let isValid = false;\n const {isLoci} = Parser;\n\n // one or both objects are not locus delta events\n if (!isLoci(this.workingCopy) || !isLoci(newLoci)) {\n LoggerProxy.logger.info(\n 'Locus-info:parser#processDeltaEvent --> Ignoring non-locus object. workingCopy:',\n this.workingCopy,\n 'newLoci:',\n newLoci\n );\n } else {\n isValid = true;\n }\n\n return isValid;\n }\n\n /**\n * Determines if a paricular locus's sequence is empty\n * @param {Types~Locus} locus\n * @returns {bool}\n */\n static isSequenceEmpty(locus) {\n const {sequence} = locus;\n const hasEmptyEntries = !sequence.entries?.length;\n const hasEmptyRange = sequence.rangeStart === 0 && sequence.rangeEnd === 0;\n\n return hasEmptyEntries && hasEmptyRange;\n }\n\n /**\n * Determines if an object has basic\n * structure of a locus object.\n * @param {Types~Locus} loci\n * @returns {boolean}\n */\n static isLoci(loci) {\n if (!loci || !loci.sequence) {\n return false;\n }\n const hasProp = (prop) => Object.prototype.hasOwnProperty.call(loci.sequence, prop);\n\n if (hasProp('rangeStart') && hasProp('rangeEnd')) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Processes next event in queue,\n * if queue is empty sets status to idle.\n * @returns {undefined}\n */\n nextEvent() {\n if (this.status === 'PAUSED') {\n LoggerProxy.logger.info('Locus-info:parser#nextEvent --> Locus parser paused.');\n\n return;\n }\n\n if (this.status === 'BLOCKED') {\n LoggerProxy.logger.info(\n 'Locus-info:parser#nextEvent --> Locus parser blocked by out-of-order delta.'\n );\n\n return;\n }\n\n // continue processing until queue is empty\n if (this.queue.size() > 0) {\n this.processDeltaEvent();\n } else {\n this.status = 'IDLE';\n }\n }\n\n /**\n * Function handler for delta actions,\n * is set by instance callee.\n * @param {string} action Locus delta action\n * @param {Types~Locus} locus Locus delta\n * @returns {undefined}\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onDeltaAction(action: string, locus) {}\n\n /**\n * Event handler for locus delta events\n * @param {Types~Locus} loci Locus Delta\n * @returns {undefined}\n */\n onDeltaEvent(loci) {\n // enqueue the new loci\n this.queue.enqueue(loci);\n\n if (this.onDeltaAction) {\n if (this.status === 'BLOCKED') {\n if (this.queue.size() > MAX_OOO_DELTA_COUNT) {\n this.triggerSync('queue too big, blocked on out-of-order delta');\n } else {\n this.processDeltaEvent();\n }\n } else if (this.status === 'IDLE') {\n // Update status, ensure we only process one event at a time.\n this.status = 'WORKING';\n\n this.processDeltaEvent();\n }\n }\n }\n\n /**\n * Appends new data onto a string of existing data.\n * @param {string} newData\n * @param {string} oldData\n * @returns {string}\n */\n static packComparisonResult(newData: string, oldData: string) {\n return `${newData}:${oldData}`;\n }\n\n /**\n * Pause locus processing\n * @returns {undefined}\n */\n pause() {\n this.status = 'PAUSED';\n LoggerProxy.logger.info('Locus-info:parser#pause --> Locus parser paused.');\n }\n\n /**\n * Triggers a sync with Locus\n *\n * @param {string} reason used just for logging\n * @returns {undefined}\n */\n private triggerSync(reason: string) {\n LoggerProxy.logger.info(`Locus-info:parser#triggerSync --> doing sync, reason: ${reason}`);\n this.stopSyncTimer();\n this.pause();\n this.onDeltaAction(Parser.loci.DESYNC, this.workingCopy);\n }\n\n /**\n * Starts a timer with a random delay. When that timer expires we will do a sync.\n *\n * The main purpose of this timer is to handle a case when we get some out-of-order deltas,\n * so we start waiting to receive the missing delta. If that delta never arrives, this timer\n * will trigger a sync with Locus.\n *\n * @returns {undefined}\n */\n private startSyncTimer() {\n if (this.syncTimer === undefined) {\n const timeout = OOO_DELTA_WAIT_TIME + Math.random() * OOO_DELTA_WAIT_TIME_RANDOM_DELAY;\n\n this.syncTimer = setTimeout(() => {\n this.syncTimer = undefined;\n this.triggerSync('timer expired, blocked on out-of-order delta');\n }, timeout);\n }\n }\n\n /**\n * Stops the timer for triggering a sync\n *\n * @returns {undefined}\n */\n private stopSyncTimer() {\n if (this.syncTimer !== undefined) {\n clearTimeout(this.syncTimer);\n this.syncTimer = undefined;\n }\n }\n\n /**\n * Processes next locus delta in the queue,\n * continues until the queue is empty\n * or cleared.\n * @returns {undefined}\n */\n processDeltaEvent() {\n const {DESYNC, USE_INCOMING, WAIT, LOCUS_URL_CHANGED} = Parser.loci;\n const {extractComparisonState: extract} = Parser;\n const newLoci = this.queue.dequeue();\n\n if (!this.isValidLocus(newLoci)) {\n this.nextEvent();\n\n return;\n }\n\n const result = Parser.compare(this.workingCopy, newLoci);\n const lociComparison = extract(result);\n\n // limited debugging, use chrome extension\n // for full debugging.\n LoggerProxy.logger.debug(`Locus-info:parser#processDeltaEvent --> Locus Debug: ${result}`);\n\n let needToWait = false;\n\n switch (lociComparison) {\n case DESYNC:\n // wait for desync response\n this.pause();\n break;\n\n case USE_INCOMING:\n // update working copy for future comparisons.\n // Note: The working copy of parser gets updated in .onFullLocus()\n // and here when USE_INCOMING or LOCUS_URL_CHANGED locus.\n this.workingCopy = newLoci;\n break;\n\n case LOCUS_URL_CHANGED:\n // clear the working copy completely, do a full locus sync\n this.workingCopy = null;\n break;\n\n case WAIT:\n // we've taken newLoci from the front of the queue, so put it back there as we have to wait\n // for the one that should be in front of it, before we can process it\n this.queue.enqueue(newLoci);\n needToWait = true;\n break;\n\n default:\n break;\n }\n\n if (needToWait) {\n this.status = 'BLOCKED';\n this.startSyncTimer();\n } else {\n this.stopSyncTimer();\n\n if (this.status === 'BLOCKED') {\n // we are not blocked anymore\n this.status = 'WORKING';\n\n LoggerProxy.logger.info(\n `Locus-info:parser#processDeltaEvent --> received delta that we were waiting for ${Parser.locus2string(\n newLoci\n )}, not blocked anymore`\n );\n }\n }\n\n if (this.onDeltaAction) {\n LoggerProxy.logger.info(\n `Locus-info:parser#processDeltaEvent --> Locus Delta ${Parser.locus2string(\n newLoci\n )}, Action: ${lociComparison}`\n );\n\n try {\n this.onDeltaAction(lociComparison, newLoci);\n } catch (error) {\n LoggerProxy.logger.error(\n 'Locus-info:parser#processDeltaEvent --> Error in onDeltaAction',\n error\n );\n }\n }\n\n this.nextEvent();\n }\n\n /**\n * Resume from a paused state\n * @returns {undefined}\n */\n resume() {\n LoggerProxy.logger.info('Locus-info:parser#resume --> Locus parser resumed.');\n this.status = 'WORKING';\n this.nextEvent();\n }\n\n /**\n * Gets related debug info for given error code\n * @param {string} debugCode Debug code\n * @param {string} comparison Locus comparison string\n * @returns {object} Debug message\n */\n static getDebugMessage(debugCode: string, comparison: string) {\n // removes extra spaces from multiline string\n const mStr = (strings) => strings.join('').replace(/\\s{2,}/g, ' ');\n\n const resolutionMap = {\n EQ: `${Parser.loci.LT}: is equal (current == incoming).`,\n LT: `${Parser.loci.LT}: choose right side (incoming).`,\n GT: `${Parser.loci.GT}: choose left side (current).`,\n };\n\n const debugMap = {\n SO001: {\n title: 'checkSequenceOverlap-001',\n description: mStr`Occurs if earliest working copy sequence is more \\\n recent than last incoming sequence.`,\n logic: 'current.min > incoming.max',\n },\n\n SO002: {\n title: 'checkSequenceOverlap-002',\n description: mStr`Occurs if last working copy sequence is before the \\\n earliest incoming sequence.`,\n logic: 'current.max < incoming.min',\n },\n\n UR001: {\n title: 'checkUnequalRanges-001',\n description: mStr`Occurs if there are no unique values for both loci, \\\n and the current working copy loci has a larger range.`,\n logic: 'currentTotalRange > incomingTotalRange',\n },\n\n UR002: {\n title: 'checkUnequalRanges-002',\n description: mStr`Occurs if there are no unique values for both loci, \\\n and the incoming delta loci has a larger range.`,\n logic: 'currentTotalRange < incomingTotalRange',\n },\n\n UR003: {\n title: 'checkUnequalRanges-003',\n description: mStr`Occurs if there are no unique values for both loci, \\\n and with ranges either absent or of the same size, the sequences \\\n are considered equal.`,\n logic: 'currentTotalRange == incomingTotalRange',\n },\n\n UE001: {\n title: 'checkForUniqueEntries-001',\n description: mStr`Occurs if current loci has unique entries and \\\n incoming does not. Entries are considered unique if they \\\n do not overlap with other Loci sequences or range values.`,\n logic: 'currentIsUnique && !incomingIsUnique',\n },\n\n UE002: {\n title: 'checkForUniqueEntries-002',\n description: mStr`Occurs if current has no unique entries but \\\n incoming does. Entries are considered unique if they \\\n do not overlap with other Loci sequences or range values.`,\n logic: '!currentIsUnique && incomingIsUnique',\n },\n\n OOS001: {\n title: 'checkIfOutOfSync-001',\n description: mStr`Occurs if neither sequence has a range, or \\\n if the current loci unique entries overlap the total range of the \\\n incoming sequence, or if the incoming unique entries overlap \\\n the total range of current sequence.`,\n logic: 'neitherSeqHasRange || currentUniqOverlap || incomingUniqOverlap',\n },\n\n OOS002: {\n title: 'checkIfOutOfSync-002',\n description: mStr`Occurs if the minimum value from sequences that are \\\n unique to the current loci is greater than the minimum value from \\\n sequences that are unique to the incoming loci.`,\n logic: 'currentUniqueMin > incomingUniqueMin',\n },\n\n OOS003: {\n title: 'checkIfOutOfSync-003',\n description: mStr`Occurs if none of the comparison rules applied. \\\n It is a catch all.`,\n logic: 'else (catch all)',\n },\n };\n\n const debugObj = debugMap[debugCode];\n\n debugObj.title = `Debug: ${debugObj.title}`;\n debugObj.resolution = resolutionMap[comparison];\n\n return debugObj;\n }\n}\n"],"mappings":"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"}
|
@@ -49,6 +49,8 @@ export default class LocusInfo extends EventsScope {
|
|
49
49
|
* Does a Locus sync. It tries to get the latest delta DTO or if it can't, it falls back to getting the full Locus DTO.
|
50
50
|
*
|
51
51
|
* @param {Meeting} meeting
|
52
|
+
* @param {boolean} isLocusUrlChanged
|
53
|
+
* @param {Locus} locus
|
52
54
|
* @returns {undefined}
|
53
55
|
*/
|
54
56
|
private doLocusSync;
|
package/dist/webinar/index.js
CHANGED
package/package.json
CHANGED
package/src/locus-info/index.ts
CHANGED
@@ -93,19 +93,26 @@ export default class LocusInfo extends EventsScope {
|
|
93
93
|
* Does a Locus sync. It tries to get the latest delta DTO or if it can't, it falls back to getting the full Locus DTO.
|
94
94
|
*
|
95
95
|
* @param {Meeting} meeting
|
96
|
+
* @param {boolean} isLocusUrlChanged
|
97
|
+
* @param {Locus} locus
|
96
98
|
* @returns {undefined}
|
97
99
|
*/
|
98
|
-
private doLocusSync(meeting: any) {
|
99
|
-
let isDelta;
|
100
|
+
private doLocusSync(meeting: any, isLocusUrlChanged: boolean, locus: any) {
|
100
101
|
let url;
|
102
|
+
let isDelta = false;
|
101
103
|
let meetingDestroyed = false;
|
102
104
|
|
103
|
-
if (
|
105
|
+
if (isLocusUrlChanged) {
|
106
|
+
// for the locus url changed case from breakout to main session, we should always do a full sync, in this case, the url from locus is always on main session,
|
107
|
+
// so use the main session locus url to get the full locus(full participants list in the response).
|
108
|
+
// for the locus url changed case from main session to breakout, we don't need to care about it here,
|
109
|
+
// because it is a USE_INCOMING case, it will not be executed here.
|
110
|
+
url = locus.url;
|
111
|
+
} else if (this.locusParser.workingCopy?.syncUrl) {
|
104
112
|
url = this.locusParser.workingCopy.syncUrl;
|
105
113
|
isDelta = true;
|
106
114
|
} else {
|
107
115
|
url = meeting.locusUrl;
|
108
|
-
isDelta = false;
|
109
116
|
}
|
110
117
|
|
111
118
|
LoggerProxy.logger.info(
|
@@ -217,6 +224,7 @@ export default class LocusInfo extends EventsScope {
|
|
217
224
|
*/
|
218
225
|
applyLocusDeltaData(action: string, locus: any, meeting: any) {
|
219
226
|
const {DESYNC, USE_CURRENT, USE_INCOMING, WAIT, LOCUS_URL_CHANGED} = LocusDeltaParser.loci;
|
227
|
+
const isLocusUrlChanged = action === LOCUS_URL_CHANGED;
|
220
228
|
|
221
229
|
switch (action) {
|
222
230
|
case USE_INCOMING:
|
@@ -228,7 +236,7 @@ export default class LocusInfo extends EventsScope {
|
|
228
236
|
break;
|
229
237
|
case DESYNC:
|
230
238
|
case LOCUS_URL_CHANGED:
|
231
|
-
this.doLocusSync(meeting);
|
239
|
+
this.doLocusSync(meeting, isLocusUrlChanged, locus);
|
232
240
|
break;
|
233
241
|
default:
|
234
242
|
LoggerProxy.logger.info(
|
package/src/locus-info/parser.ts
CHANGED
@@ -728,13 +728,17 @@ export default class Parser {
|
|
728
728
|
break;
|
729
729
|
|
730
730
|
case USE_INCOMING:
|
731
|
-
case LOCUS_URL_CHANGED:
|
732
731
|
// update working copy for future comparisons.
|
733
732
|
// Note: The working copy of parser gets updated in .onFullLocus()
|
734
733
|
// and here when USE_INCOMING or LOCUS_URL_CHANGED locus.
|
735
734
|
this.workingCopy = newLoci;
|
736
735
|
break;
|
737
736
|
|
737
|
+
case LOCUS_URL_CHANGED:
|
738
|
+
// clear the working copy completely, do a full locus sync
|
739
|
+
this.workingCopy = null;
|
740
|
+
break;
|
741
|
+
|
738
742
|
case WAIT:
|
739
743
|
// we've taken newLoci from the front of the queue, so put it back there as we have to wait
|
740
744
|
// for the one that should be in front of it, before we can process it
|
@@ -2369,23 +2369,23 @@ describe('plugin-meetings', () => {
|
|
2369
2369
|
|
2370
2370
|
it('applyLocusDeltaData handles LOCUS_URL_CHANGED action correctly', () => {
|
2371
2371
|
const {LOCUS_URL_CHANGED} = LocusDeltaParser.loci;
|
2372
|
-
const
|
2372
|
+
const fakeFullLocus = {
|
2373
|
+
url: 'new full loci url',
|
2374
|
+
};
|
2373
2375
|
const meeting = {
|
2374
2376
|
meetingRequest: {
|
2375
|
-
getLocusDTO: sandbox.stub().resolves({body:
|
2377
|
+
getLocusDTO: sandbox.stub().resolves({body: fakeFullLocus}),
|
2376
2378
|
},
|
2377
2379
|
locusInfo: {
|
2378
2380
|
handleLocusDelta: sandbox.stub(),
|
2379
2381
|
},
|
2380
|
-
locusUrl: 'current locus url',
|
2382
|
+
locusUrl: 'current BO session locus url',
|
2381
2383
|
};
|
2382
2384
|
|
2383
|
-
locusInfo.locusParser.workingCopy =
|
2384
|
-
syncUrl: 'current sync url',
|
2385
|
-
};
|
2385
|
+
locusInfo.locusParser.workingCopy = null;
|
2386
2386
|
|
2387
2387
|
locusInfo.applyLocusDeltaData(LOCUS_URL_CHANGED, fakeLocus, meeting);
|
2388
|
-
assert.calledOnceWithExactly(meeting.meetingRequest.getLocusDTO, {url:
|
2388
|
+
assert.calledOnceWithExactly(meeting.meetingRequest.getLocusDTO, {url: fakeLocus.url});
|
2389
2389
|
});
|
2390
2390
|
|
2391
2391
|
describe('edge cases for sync failing', () => {
|
@@ -253,7 +253,8 @@ describe('locus-info/parser', () => {
|
|
253
253
|
});
|
254
254
|
|
255
255
|
it('replaces current loci when the locus URL changes and incoming sequence is later, even when baseSequence doesn\'t match', () => {
|
256
|
-
const {
|
256
|
+
const {LOCUS_URL_CHANGED} = LocusDeltaParser.loci;
|
257
|
+
sandbox.stub(LocusDeltaParser, 'compare').returns(LOCUS_URL_CHANGED);
|
257
258
|
|
258
259
|
parser.queue.dequeue = sandbox.stub().returns(NEW_LOCI);
|
259
260
|
parser.onDeltaAction = sandbox.stub();
|
@@ -262,7 +263,7 @@ describe('locus-info/parser', () => {
|
|
262
263
|
|
263
264
|
parser.processDeltaEvent();
|
264
265
|
|
265
|
-
assert.equal(parser.workingCopy,
|
266
|
+
assert.equal(parser.workingCopy, null);
|
266
267
|
});
|
267
268
|
|
268
269
|
it('does not replace current loci when the locus URL changes but incoming sequence is not later', () => {
|