uneeq-js 2.43.0 → 2.44.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +8 -8
- package/dist/src/service/device-manager.d.ts +1 -0
- package/dist/src/service/resume-session-check.d.ts +6 -0
- package/dist/src/service/stream-manager.d.ts +0 -4
- package/dist/src/types/MessageTypes.d.ts +2 -1
- package/dist/src/types/NewSessionRequest.d.ts +1 -0
- package/dist/src/types/PersonaStartRequest.d.ts +1 -0
- package/dist/src/types/ResumeSessionCheckResponse.d.ts +4 -0
- package/dist/src/types/UneeqOptions.d.ts +4 -0
- package/dist/src/uneeq.d.ts +3 -0
- package/dist/umd/index.js +107 -82
- package/package.json +1 -1
- package/readme.md +6 -0
|
@@ -16,6 +16,7 @@ export interface DeviceManagerOptions {
|
|
|
16
16
|
sessionLiveHandler?: () => void;
|
|
17
17
|
streamManager: StreamManager;
|
|
18
18
|
voiceInputManager: VoiceInputManager;
|
|
19
|
+
digitalHumanVideoElement: HTMLVideoElement;
|
|
19
20
|
}
|
|
20
21
|
export declare class DeviceManager {
|
|
21
22
|
options: DeviceManagerOptions;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { ResumeSessionCheckResponse } from '../types/ResumeSessionCheckResponse';
|
|
2
|
+
import { UneeqOptions } from '../types/UneeqOptions';
|
|
3
|
+
export declare class ResumeSessionCheck {
|
|
4
|
+
static validate(options: UneeqOptions): ResumeSessionCheckResponse;
|
|
5
|
+
static browserTabIsActive(): boolean;
|
|
6
|
+
}
|
|
@@ -1,16 +1,12 @@
|
|
|
1
1
|
export declare class StreamManager {
|
|
2
|
-
private static audioData;
|
|
3
|
-
silentAudioElement: HTMLAudioElement;
|
|
4
2
|
private readonly silentAudioTrack;
|
|
5
3
|
private readonly canvasVideoTrack;
|
|
6
4
|
private audioContextInstance?;
|
|
7
5
|
private audioSourceNode?;
|
|
8
6
|
private audioSourceDestination?;
|
|
9
|
-
private canvasInterval?;
|
|
10
7
|
constructor();
|
|
11
8
|
addCanvasVideoTrackToStream(stream: MediaStream): MediaStream;
|
|
12
9
|
addSilentAudioTrackToStream(stream: MediaStream): MediaStream;
|
|
13
|
-
remoteVideoReadyToPlay(): void;
|
|
14
10
|
resumeAudioContext(): void;
|
|
15
11
|
private generateCanvasVideoTrack;
|
|
16
12
|
private generateSilentAudioTrack;
|
|
@@ -290,8 +290,9 @@ export declare class WarningMessage implements UneeqMessage {
|
|
|
290
290
|
*/
|
|
291
291
|
export declare class SessionLiveMessage implements UneeqMessage {
|
|
292
292
|
readonly showLogo: boolean;
|
|
293
|
+
readonly sessionResumed: boolean;
|
|
293
294
|
uneeqMessageType: UneeqMessageType;
|
|
294
|
-
constructor(showLogo: boolean);
|
|
295
|
+
constructor(showLogo: boolean, sessionResumed: boolean);
|
|
295
296
|
}
|
|
296
297
|
/**
|
|
297
298
|
* WebRTC data channel message
|
|
@@ -53,6 +53,10 @@ export interface UneeqOptions {
|
|
|
53
53
|
* This option specifies what the default voice input mode will be.
|
|
54
54
|
*/
|
|
55
55
|
voiceInputMode: VoiceInputMode | string;
|
|
56
|
+
/**
|
|
57
|
+
* Resume user session if available.
|
|
58
|
+
*/
|
|
59
|
+
resumeSession?: boolean;
|
|
56
60
|
/**
|
|
57
61
|
* This option specifies the URL of the background image to be used when the digital human is rendered.
|
|
58
62
|
*/
|
package/dist/src/uneeq.d.ts
CHANGED
|
@@ -26,6 +26,8 @@ export declare class Uneeq {
|
|
|
26
26
|
private startSessionTime;
|
|
27
27
|
private availableResponseTime;
|
|
28
28
|
private streamManager;
|
|
29
|
+
private digitalHumanVideoElement;
|
|
30
|
+
private sessionWasResumed;
|
|
29
31
|
constructor(options: UneeqOptions);
|
|
30
32
|
setLoggerEnabled(enabled: boolean): void;
|
|
31
33
|
/**
|
|
@@ -124,6 +126,7 @@ export declare class Uneeq {
|
|
|
124
126
|
*/
|
|
125
127
|
playWelcomeMessage(): Promise<void>;
|
|
126
128
|
unmuteDigitalHuman(): void;
|
|
129
|
+
private initDigitalHumanVideoElement;
|
|
127
130
|
private gatherWebRtcMetrics;
|
|
128
131
|
/**
|
|
129
132
|
* Initializes the real time messaging service. On ready, ReadyMessage will be sent.
|
package/dist/umd/index.js
CHANGED
|
@@ -5761,13 +5761,14 @@ const messaging_1 = __webpack_require__(280);
|
|
|
5761
5761
|
const metrics_service_1 = __webpack_require__(302);
|
|
5762
5762
|
const online_status_service_1 = __webpack_require__(304);
|
|
5763
5763
|
const prom_1 = __webpack_require__(269);
|
|
5764
|
-
const
|
|
5765
|
-
const
|
|
5764
|
+
const resume_session_check_1 = __webpack_require__(305);
|
|
5765
|
+
const stream_manager_1 = __webpack_require__(306);
|
|
5766
|
+
const voice_input_manager_1 = __webpack_require__(307);
|
|
5766
5767
|
const MessageTypes_1 = __webpack_require__(267);
|
|
5767
|
-
const NewSessionRequest_1 = __webpack_require__(
|
|
5768
|
+
const NewSessionRequest_1 = __webpack_require__(310);
|
|
5768
5769
|
const PublishSubscribeState_1 = __webpack_require__(231);
|
|
5769
|
-
const SourceApp_1 = __webpack_require__(
|
|
5770
|
-
const VoiceInputMode_1 = __webpack_require__(
|
|
5770
|
+
const SourceApp_1 = __webpack_require__(311);
|
|
5771
|
+
const VoiceInputMode_1 = __webpack_require__(309);
|
|
5771
5772
|
class Uneeq {
|
|
5772
5773
|
constructor(options) {
|
|
5773
5774
|
this.ready = new rxjs_1.BehaviorSubject(false);
|
|
@@ -5777,6 +5778,7 @@ class Uneeq {
|
|
|
5777
5778
|
this.sessionPaused = false;
|
|
5778
5779
|
this.sessionStarted = false; /* Whether the user is live in a session with an avatar (different from sessionPaused) */
|
|
5779
5780
|
this.unavailableAvatarMsgSent = false;
|
|
5781
|
+
this.sessionWasResumed = false;
|
|
5780
5782
|
logger_1.logger.enabled = options.logging || false;
|
|
5781
5783
|
this.options = options;
|
|
5782
5784
|
this.options.diagnostics = options.diagnostics || false;
|
|
@@ -5804,6 +5806,7 @@ class Uneeq {
|
|
|
5804
5806
|
}
|
|
5805
5807
|
logger_1.logger.log(`Uneeq Created (version ${this.version})`);
|
|
5806
5808
|
this.streamManager = new stream_manager_1.StreamManager();
|
|
5809
|
+
this.initDigitalHumanVideoElement();
|
|
5807
5810
|
this.metricsService = new metrics_service_1.MetricsService(this.options, this.internalMessages$, this.messages);
|
|
5808
5811
|
this.dhVideoPlayManager = new digital_human_video_play_manager_1.DigitalHumanVideoPlayManager(this.messages, () => { this.unmuteDigitalHuman(); });
|
|
5809
5812
|
}
|
|
@@ -5831,9 +5834,23 @@ class Uneeq {
|
|
|
5831
5834
|
return __awaiter(this, void 0, void 0, function* () {
|
|
5832
5835
|
this.startSessionTime = Date.now();
|
|
5833
5836
|
try {
|
|
5837
|
+
const resumeSessionCheck = resume_session_check_1.ResumeSessionCheck.validate(this.options);
|
|
5838
|
+
if (resumeSessionCheck.resumeSession === true) {
|
|
5839
|
+
this.startSessionData.resumeSessionId = resumeSessionCheck.resumeSessionId;
|
|
5840
|
+
}
|
|
5834
5841
|
this.startSessionData.tokenId = tokenId;
|
|
5835
5842
|
this.session = yield this.api.startSessionWithToken(this.startSessionData);
|
|
5836
5843
|
console.log('UneeQ Session ID: ' + this.session.id);
|
|
5844
|
+
if (this.session.id === this.startSessionData.resumeSessionId) {
|
|
5845
|
+
logger_1.logger.log('UneeQ: Session was resumed.');
|
|
5846
|
+
this.sessionWasResumed = true;
|
|
5847
|
+
}
|
|
5848
|
+
else {
|
|
5849
|
+
logger_1.logger.log('UneeQ: Session was not resumed.');
|
|
5850
|
+
}
|
|
5851
|
+
// put the session id and persona id into local storage so it can be resumed
|
|
5852
|
+
localStorage.setItem('uneeqResumeSessionId', this.session.id);
|
|
5853
|
+
localStorage.setItem('uneeqResumeSessionPersonaId', this.options.conversationId);
|
|
5837
5854
|
this.session.sourceApp = SourceApp_1.SourceApp[this.session.sourceApp ? this.session.sourceApp : ''] ?
|
|
5838
5855
|
this.session.sourceApp : SourceApp_1.SourceApp.UNKNOWN;
|
|
5839
5856
|
this.initialize();
|
|
@@ -6033,6 +6050,25 @@ class Uneeq {
|
|
|
6033
6050
|
this.voiceInputManager.resumeAudioContext();
|
|
6034
6051
|
this.dhVideoPlayManager.unmuteVideo();
|
|
6035
6052
|
}
|
|
6053
|
+
initDigitalHumanVideoElement() {
|
|
6054
|
+
/*
|
|
6055
|
+
iOS Safari requires the DH video element to be played as part of the users click event.
|
|
6056
|
+
Here, create a video element and play it. This will allow audio to be played out once
|
|
6057
|
+
the stream has started, as long as initWithToken() was called as part of a click event.
|
|
6058
|
+
If it was not part of a click event DigitalHumanVideoPlayManager will handle this.
|
|
6059
|
+
*/
|
|
6060
|
+
const video = document.createElement('video');
|
|
6061
|
+
this.digitalHumanVideoElement = video;
|
|
6062
|
+
video.volume = 1;
|
|
6063
|
+
video.controls = false;
|
|
6064
|
+
video.autoplay = false;
|
|
6065
|
+
video.setAttribute('playsinline', 'true'); // required for iOS
|
|
6066
|
+
video.setAttribute('style', 'object-fit: cover; width: 100%; height: 100%;');
|
|
6067
|
+
video.play().catch((err) => {
|
|
6068
|
+
logger_1.logger.log('UneeQ: Failed to play digital human video. ' +
|
|
6069
|
+
'Play() will be re-attempted when stream is ready.', err);
|
|
6070
|
+
});
|
|
6071
|
+
}
|
|
6036
6072
|
gatherWebRtcMetrics() {
|
|
6037
6073
|
var _a;
|
|
6038
6074
|
(_a = this.deviceManager) === null || _a === void 0 ? void 0 : _a.mediaHandler.gatherWebRTCStats((ptr, stats) => {
|
|
@@ -6072,14 +6108,15 @@ class Uneeq {
|
|
|
6072
6108
|
messaging: this.messaging,
|
|
6073
6109
|
uneeqOptions: this.options,
|
|
6074
6110
|
streamManager: this.streamManager,
|
|
6075
|
-
voiceInputManager: this.voiceInputManager
|
|
6111
|
+
voiceInputManager: this.voiceInputManager,
|
|
6112
|
+
digitalHumanVideoElement: this.digitalHumanVideoElement
|
|
6076
6113
|
}, this.api);
|
|
6077
6114
|
this.messageHandler.setDeviceManager(this.deviceManager);
|
|
6078
6115
|
}
|
|
6079
6116
|
sessionLiveHandler() {
|
|
6080
6117
|
// Send the SessionLive message and play welcome (optional)
|
|
6081
6118
|
if (!this.sessionStarted) {
|
|
6082
|
-
this.messages.next(new MessageTypes_1.SessionLiveMessage(this.session.showUneeqLogo || false));
|
|
6119
|
+
this.messages.next(new MessageTypes_1.SessionLiveMessage(this.session.showUneeqLogo || false, this.sessionWasResumed));
|
|
6083
6120
|
if (this.options.playWelcome) {
|
|
6084
6121
|
this.api.avatarWelcome();
|
|
6085
6122
|
}
|
|
@@ -6119,7 +6156,6 @@ class Uneeq {
|
|
|
6119
6156
|
.filter((message) => message.faceMeMessageType === 'remoteVideoReadyToPlay')
|
|
6120
6157
|
.subscribe((msg) => {
|
|
6121
6158
|
this.dhVideoPlayManager.play(this.deviceManager.mediaHandler.avatarVideoElement);
|
|
6122
|
-
this.streamManager.remoteVideoReadyToPlay();
|
|
6123
6159
|
});
|
|
6124
6160
|
}
|
|
6125
6161
|
/* Wait for an available avatar then start it */
|
|
@@ -6136,8 +6172,12 @@ class Uneeq {
|
|
|
6136
6172
|
this.messages.next(new MessageTypes_1.AvatarAvailableMessage());
|
|
6137
6173
|
this.api.avatarStart({
|
|
6138
6174
|
enableTransparentBackground: this.options.enableTransparentBackground,
|
|
6175
|
+
resumeSession: this.sessionWasResumed,
|
|
6139
6176
|
backgroundImageUrl: this.options.backgroundImageUrl,
|
|
6140
6177
|
nameTagImageUrl: this.options.nameTagImageUrl
|
|
6178
|
+
}).catch((err) => {
|
|
6179
|
+
console.error('UneeQ: Digital human could not be started. Clearing resumeSession token and ending process.', err);
|
|
6180
|
+
localStorage.removeItem('uneeqResumeSessionId');
|
|
6141
6181
|
});
|
|
6142
6182
|
}
|
|
6143
6183
|
else {
|
|
@@ -18116,7 +18156,7 @@ function zipAll(project) {
|
|
|
18116
18156
|
/* 224 */
|
|
18117
18157
|
/***/ (function(module) {
|
|
18118
18158
|
|
|
18119
|
-
module.exports = JSON.parse("{\"name\":\"uneeq-js\",\"version\":\"2.
|
|
18159
|
+
module.exports = JSON.parse("{\"name\":\"uneeq-js\",\"version\":\"2.44.1\",\"description\":\"\",\"main\":\"dist/index.js\",\"types\":\"dist/src/index.d.ts\",\"scripts\":{\"start\":\"npx webpack -w\",\"test-local\":\"./node_modules/karma/bin/karma start karma.conf.js -logLevel=DEBUG\",\"test\":\"./node_modules/karma/bin/karma start --browsers ChromeHeadless --single-run\",\"test:windows\":\"karma start karma.conf.js\",\"build\":\"webpack --config webpack.config.prod.js && webpack --config webpack.config.umd.js\",\"lint\":\"./node_modules/tslint/bin/tslint -p tsconfig.json --fix\",\"docs\":\"./node_modules/typedoc/bin/typedoc --options\"},\"files\":[\"dist\",\"!dist/test\"],\"author\":\"\",\"license\":\"ISC\",\"dependencies\":{\"@stomp/stompjs\":\"^6.0.0\",\"@uehreka/seriously\":\"^1.0.1\",\"fast-text-encoding\":\"^1.0.0\",\"intrinsic-scale\":\"^3.0.4\",\"promjs\":\"^0.4.1\",\"rxjs\":\"^6.2.2\",\"rxjs-compat\":\"^6.3.2\",\"simple-peer\":\"9.11.0\",\"webrtc-adapter\":\"8.1.0\"},\"devDependencies\":{\"@types/jasmine\":\"^2.8.8\",\"@types/node\":\"^10.9.4\",\"fetch-mock\":\"7.7.3\",\"ignore-styles\":\"^5.0.1\",\"jasmine\":\"^3.2.0\",\"jasmine-class-mock\":\"^1.0.1\",\"jasmine-core\":\"^3.3.0\",\"karma\":\"^5.0.0\",\"karma-chrome-launcher\":\"^2.2.0\",\"karma-firefox-launcher\":\"^1.1.0\",\"karma-jasmine\":\"^2.0.1\",\"karma-jasmine-html-reporter\":\"^1.4.0\",\"karma-requirejs\":\"^1.1.0\",\"karma-safari-launcher\":\"^1.0.0\",\"karma-typescript\":\"^5.0.0\",\"karma-typescript-es6-transform\":\"^5.0.0\",\"nock\":\"^9.6.1\",\"requirejs\":\"^2.3.6\",\"ts-loader\":\"^5.0.0\",\"ts-node\":\"^7.0.1\",\"tslint\":\"^5.11.0\",\"tslint-no-focused-test\":\"^0.5.0\",\"typedoc\":\"^0.18.0\",\"typescript\":\"^3.9.7\",\"webpack\":\"^4.17.1\",\"webpack-cli\":\"^3.1.0\"}}");
|
|
18120
18160
|
|
|
18121
18161
|
/***/ }),
|
|
18122
18162
|
/* 225 */
|
|
@@ -18496,19 +18536,13 @@ class MediaHandler {
|
|
|
18496
18536
|
this.publishState$ = new rxjs_1.BehaviorSubject(PublishSubscribeState_1.PublishSubscribeState.DISCONNECTED);
|
|
18497
18537
|
this.publishingStream = false;
|
|
18498
18538
|
this.remoteStream$.filter((stream) => stream !== null).subscribe((stream) => {
|
|
18499
|
-
|
|
18500
|
-
this.avatarVideoElement =
|
|
18501
|
-
video.srcObject = stream;
|
|
18502
|
-
video.volume = 1;
|
|
18503
|
-
video.controls = false;
|
|
18504
|
-
video.autoplay = false;
|
|
18505
|
-
video.setAttribute('playsinline', 'true'); // required for iOS
|
|
18506
|
-
video.setAttribute('style', 'object-fit: cover; width: 100%; height: 100%;');
|
|
18539
|
+
this.avatarVideoElement = this.options.digitalHumanVideoElement;
|
|
18540
|
+
this.avatarVideoElement.srcObject = stream;
|
|
18507
18541
|
options.uneeqOptions.avatarVideoContainerElement.style.overflow = 'hidden';
|
|
18508
18542
|
options.uneeqOptions.avatarVideoContainerElement.innerHTML = '';
|
|
18509
|
-
options.uneeqOptions.avatarVideoContainerElement.appendChild(
|
|
18543
|
+
options.uneeqOptions.avatarVideoContainerElement.appendChild(this.avatarVideoElement);
|
|
18510
18544
|
if (this.options.uneeqOptions.enableTransparentBackground) {
|
|
18511
|
-
this.initTransparentBackground(
|
|
18545
|
+
this.initTransparentBackground(this.avatarVideoElement);
|
|
18512
18546
|
}
|
|
18513
18547
|
remoteVideoReady();
|
|
18514
18548
|
});
|
|
@@ -32729,8 +32763,9 @@ exports.WarningMessage = WarningMessage;
|
|
|
32729
32763
|
* Session is Live, avatar video is active
|
|
32730
32764
|
*/
|
|
32731
32765
|
class SessionLiveMessage {
|
|
32732
|
-
constructor(showLogo) {
|
|
32766
|
+
constructor(showLogo, sessionResumed) {
|
|
32733
32767
|
this.showLogo = showLogo;
|
|
32768
|
+
this.sessionResumed = sessionResumed;
|
|
32734
32769
|
this.uneeqMessageType = UneeqMessageType.SessionLive;
|
|
32735
32770
|
}
|
|
32736
32771
|
}
|
|
@@ -53309,12 +53344,56 @@ exports.OnlineStatusService = OnlineStatusService;
|
|
|
53309
53344
|
|
|
53310
53345
|
"use strict";
|
|
53311
53346
|
|
|
53347
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
53348
|
+
exports.ResumeSessionCheck = void 0;
|
|
53349
|
+
const logger_1 = __webpack_require__(233);
|
|
53350
|
+
class ResumeSessionCheck {
|
|
53351
|
+
static validate(options) {
|
|
53352
|
+
let resumeSession = options.resumeSession !== undefined ? options.resumeSession : false;
|
|
53353
|
+
const resumeSessionPersonaId = localStorage.getItem('uneeqResumeSessionPersonaId');
|
|
53354
|
+
const resumingSamePersona = resumeSessionPersonaId === options.conversationId;
|
|
53355
|
+
if (!resumingSamePersona) {
|
|
53356
|
+
logger_1.logger.log('UneeQ: Persona Id\'s do not match, unable to resume session.');
|
|
53357
|
+
resumeSession = false;
|
|
53358
|
+
}
|
|
53359
|
+
const tabIsActive = ResumeSessionCheck.browserTabIsActive();
|
|
53360
|
+
if (resumeSession && !tabIsActive) {
|
|
53361
|
+
logger_1.logger.log('UneeQ: Browser tab is not active so unable to resume');
|
|
53362
|
+
resumeSession = false;
|
|
53363
|
+
}
|
|
53364
|
+
if (resumeSession) {
|
|
53365
|
+
const resumeSessionId = localStorage.getItem('uneeqResumeSessionId');
|
|
53366
|
+
if (resumeSessionId !== null) {
|
|
53367
|
+
return {
|
|
53368
|
+
resumeSession: true,
|
|
53369
|
+
resumeSessionId: resumeSessionId
|
|
53370
|
+
};
|
|
53371
|
+
}
|
|
53372
|
+
}
|
|
53373
|
+
return {
|
|
53374
|
+
resumeSession: false
|
|
53375
|
+
};
|
|
53376
|
+
}
|
|
53377
|
+
// Set this up as a method to make the class more testable.
|
|
53378
|
+
// You cannot easily mock document.hidden as it is readonly.
|
|
53379
|
+
static browserTabIsActive() {
|
|
53380
|
+
return !document.hidden;
|
|
53381
|
+
}
|
|
53382
|
+
}
|
|
53383
|
+
exports.ResumeSessionCheck = ResumeSessionCheck;
|
|
53384
|
+
|
|
53385
|
+
|
|
53386
|
+
/***/ }),
|
|
53387
|
+
/* 306 */
|
|
53388
|
+
/***/ (function(module, exports, __webpack_require__) {
|
|
53389
|
+
|
|
53390
|
+
"use strict";
|
|
53391
|
+
|
|
53312
53392
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
53313
53393
|
exports.StreamManager = void 0;
|
|
53314
53394
|
class StreamManager {
|
|
53315
53395
|
constructor() {
|
|
53316
53396
|
window.AudioContext = window.AudioContext || window.webkitAudioContext;
|
|
53317
|
-
this.silentAudioElement = document.createElement('audio');
|
|
53318
53397
|
this.silentAudioTrack = this.generateSilentAudioTrack();
|
|
53319
53398
|
this.canvasVideoTrack = this.generateCanvasVideoTrack();
|
|
53320
53399
|
}
|
|
@@ -53332,22 +53411,6 @@ class StreamManager {
|
|
|
53332
53411
|
stream.addTrack(this.silentAudioTrack);
|
|
53333
53412
|
return stream;
|
|
53334
53413
|
}
|
|
53335
|
-
/*
|
|
53336
|
-
* Stream Manager handler for when the session is live (video/audio is streaming). By pausing and playing the
|
|
53337
|
-
* silent audio element this works around the issue of some iOS devices experiencing low digital human volume
|
|
53338
|
-
* or digital human audio from the wrong speaker.
|
|
53339
|
-
* */
|
|
53340
|
-
remoteVideoReadyToPlay() {
|
|
53341
|
-
if (this.silentAudioElement !== null) {
|
|
53342
|
-
/* To work around iOS Safari low volume issue we pause and play the silent audio track */
|
|
53343
|
-
setTimeout(() => {
|
|
53344
|
-
this.silentAudioElement.pause();
|
|
53345
|
-
setTimeout(() => {
|
|
53346
|
-
this.silentAudioElement.play();
|
|
53347
|
-
}, 500);
|
|
53348
|
-
}, 500);
|
|
53349
|
-
}
|
|
53350
|
-
}
|
|
53351
53414
|
/* Resumes an audio context
|
|
53352
53415
|
* If the session was initiated outside of a user click event, the browsers autoplay
|
|
53353
53416
|
* policy will block playing of media streams that have audio. Calling this method
|
|
@@ -53361,19 +53424,9 @@ class StreamManager {
|
|
|
53361
53424
|
* Generated video stream is a 40x30 rect that changes color every second.
|
|
53362
53425
|
* Server can decode a 40x30 video frame, other frame sizes could cause issues. */
|
|
53363
53426
|
generateCanvasVideoTrack() {
|
|
53364
|
-
if (this.canvasInterval) {
|
|
53365
|
-
clearInterval(this.canvasInterval);
|
|
53366
|
-
}
|
|
53367
53427
|
const canvas = document.createElement('canvas');
|
|
53368
53428
|
canvas.width = 40; // 40px canvas width
|
|
53369
53429
|
canvas.height = 30; // 30px canvas height
|
|
53370
|
-
const ctx = canvas.getContext('2d'); // FF requires call to Canvas.getContext() before calling captureStream()
|
|
53371
|
-
// Draw on the canvas a random colour every second
|
|
53372
|
-
this.canvasInterval = setInterval(() => {
|
|
53373
|
-
ctx.fillStyle = '#' + (0x1000000 + (Math.random()) * 0xffffff).toString(16).substr(1, 6);
|
|
53374
|
-
ctx.fillRect(0, 0, canvas.width, canvas.height);
|
|
53375
|
-
return canvas;
|
|
53376
|
-
}, 1000);
|
|
53377
53430
|
const canvasStream = canvas.captureStream(1); // use the canvas as a video stream at 1 fps
|
|
53378
53431
|
return canvasStream.getVideoTracks()[0];
|
|
53379
53432
|
}
|
|
@@ -53383,47 +53436,19 @@ class StreamManager {
|
|
|
53383
53436
|
* to avoid Safari blocking auto play (i.e. click or keyboard event). */
|
|
53384
53437
|
generateSilentAudioTrack() {
|
|
53385
53438
|
if (!this.audioSourceNode || !this.audioSourceDestination) {
|
|
53386
|
-
this.silentAudioElement.loop = true;
|
|
53387
|
-
this.silentAudioElement.volume = 1;
|
|
53388
|
-
const convertURIToBinary = (dataURI) => {
|
|
53389
|
-
const BASE64_MARKER = ';base64,';
|
|
53390
|
-
const base64Index = dataURI.indexOf(BASE64_MARKER) + BASE64_MARKER.length;
|
|
53391
|
-
const base64 = dataURI.substring(base64Index);
|
|
53392
|
-
const raw = window.atob(base64);
|
|
53393
|
-
const rawLength = raw.length;
|
|
53394
|
-
const arr = new Uint8Array(new ArrayBuffer(rawLength));
|
|
53395
|
-
for (let i = 0; i < rawLength; i++) {
|
|
53396
|
-
arr[i] = raw.charCodeAt(i);
|
|
53397
|
-
}
|
|
53398
|
-
return arr;
|
|
53399
|
-
};
|
|
53400
|
-
const binary = convertURIToBinary(StreamManager.audioData);
|
|
53401
|
-
const blob = new Blob([binary], { type: 'audio/mpeg' });
|
|
53402
|
-
this.silentAudioElement.src = URL.createObjectURL(blob);
|
|
53403
|
-
this.silentAudioElement.play().then().catch((err) => {
|
|
53404
|
-
console.log('UneeQ audio track could not play: ', err);
|
|
53405
|
-
});
|
|
53406
53439
|
// Use AudioContext to get a stream from the audio element
|
|
53407
53440
|
const ctx = new window.AudioContext();
|
|
53408
53441
|
this.audioContextInstance = ctx;
|
|
53409
53442
|
this.audioSourceDestination = ctx.createMediaStreamDestination();
|
|
53410
|
-
this.audioSourceNode = ctx.createMediaElementSource(this.silentAudioElement);
|
|
53411
|
-
this.audioSourceNode.connect(this.audioSourceDestination);
|
|
53412
|
-
this.audioSourceNode.connect(ctx.destination);
|
|
53413
53443
|
}
|
|
53414
53444
|
return this.audioSourceDestination.stream.getAudioTracks()[0];
|
|
53415
53445
|
}
|
|
53416
53446
|
}
|
|
53417
53447
|
exports.StreamManager = StreamManager;
|
|
53418
|
-
/* Base64 encoded string data of 1 second of silence (48kHz Stereo - alternatives may cause issue in iOS Safari)
|
|
53419
|
-
* Audio generated using ffmpeg command:
|
|
53420
|
-
* ffmpeg -f lavfi -i anullsrc=r=48000:cl=stereo -t 1 -acodec mp3 out.mp3
|
|
53421
|
-
*/
|
|
53422
|
-
StreamManager.audioData = 'data:audio/mpeg;base64,SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU3LjgzLjEwMAAAAAAAAAAAAAAA//tUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASW5mbwAAAA8AAAArAABBQAAICA4OFBQaGhogICYmLCwsMjI3Nz09PUNDSUlPT09VVVtbYWFhZmZsbHJycnh4fn6EhISKipCQlpaWm5uhoaenp62ts7O5ubm/v8XFy8vL0NDW1tzc3OLi6Oju7u709Pr6//8AAAAATGF2YzU3LjEwAAAAAAAAAAAAAAAAJAPAAAAAAAAAQUCaftgR//uUZAAP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAETEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uUZFGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uUZFGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uUZFGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uUZFGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uUZFGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uUZFGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uUZFGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uUZFGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uUZFGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uUZFGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uUZFGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uUZFGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uUZFGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uUZFGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uUZFGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uUZFGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uUZFGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uUZFGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uUZFGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uUZFGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uUZFGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uUZFGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uUZFGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uUZFGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uUZFGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uUZFGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uUZFGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uUZFGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uUZFGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uUZFGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uUZFGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uUZFGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uUZFGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uUZFGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uUZFGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uUZFGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uUZFGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uUZFGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uUZFGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uUZFGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uUZFGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVMQU1FMy4xMDBVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uUZFGP8AAAaQAAAAgAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV';
|
|
53423
53448
|
|
|
53424
53449
|
|
|
53425
53450
|
/***/ }),
|
|
53426
|
-
/*
|
|
53451
|
+
/* 307 */
|
|
53427
53452
|
/***/ (function(module, exports, __webpack_require__) {
|
|
53428
53453
|
|
|
53429
53454
|
"use strict";
|
|
@@ -53431,9 +53456,9 @@ StreamManager.audioData = 'data:audio/mpeg;base64,SUQzBAAAAAAAI1RTU0UAAAAPAAADTG
|
|
|
53431
53456
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
53432
53457
|
exports.VoiceInputManager = void 0;
|
|
53433
53458
|
const operators_1 = __webpack_require__(126);
|
|
53434
|
-
const soundmeter_1 = __webpack_require__(
|
|
53459
|
+
const soundmeter_1 = __webpack_require__(308);
|
|
53435
53460
|
const MessageTypes_1 = __webpack_require__(267);
|
|
53436
|
-
const VoiceInputMode_1 = __webpack_require__(
|
|
53461
|
+
const VoiceInputMode_1 = __webpack_require__(309);
|
|
53437
53462
|
const logger_1 = __webpack_require__(233);
|
|
53438
53463
|
class VoiceInputManager {
|
|
53439
53464
|
constructor(options, api, messages, enableMicrophone) {
|
|
@@ -53606,7 +53631,7 @@ exports.VoiceInputManager = VoiceInputManager;
|
|
|
53606
53631
|
|
|
53607
53632
|
|
|
53608
53633
|
/***/ }),
|
|
53609
|
-
/*
|
|
53634
|
+
/* 308 */
|
|
53610
53635
|
/***/ (function(module, exports, __webpack_require__) {
|
|
53611
53636
|
|
|
53612
53637
|
"use strict";
|
|
@@ -53685,7 +53710,7 @@ exports.SoundMeter = SoundMeter;
|
|
|
53685
53710
|
|
|
53686
53711
|
|
|
53687
53712
|
/***/ }),
|
|
53688
|
-
/*
|
|
53713
|
+
/* 309 */
|
|
53689
53714
|
/***/ (function(module, exports, __webpack_require__) {
|
|
53690
53715
|
|
|
53691
53716
|
"use strict";
|
|
@@ -53700,7 +53725,7 @@ var VoiceInputMode;
|
|
|
53700
53725
|
|
|
53701
53726
|
|
|
53702
53727
|
/***/ }),
|
|
53703
|
-
/*
|
|
53728
|
+
/* 310 */
|
|
53704
53729
|
/***/ (function(module, exports, __webpack_require__) {
|
|
53705
53730
|
|
|
53706
53731
|
"use strict";
|
|
@@ -53714,7 +53739,7 @@ var SessionType;
|
|
|
53714
53739
|
|
|
53715
53740
|
|
|
53716
53741
|
/***/ }),
|
|
53717
|
-
/*
|
|
53742
|
+
/* 311 */
|
|
53718
53743
|
/***/ (function(module, exports, __webpack_require__) {
|
|
53719
53744
|
|
|
53720
53745
|
"use strict";
|
package/package.json
CHANGED
package/readme.md
CHANGED
|
@@ -8,6 +8,12 @@ https://docs.uneeq.io/build-your-own-experience
|
|
|
8
8
|
To use uneeq-js with a typescript version < 3.8, 'skipLibCheck' must be set to true.
|
|
9
9
|
|
|
10
10
|
## Release Notes
|
|
11
|
+
#### 2.44.1
|
|
12
|
+
* Optimized publish stream and improved audio performance on iOS
|
|
13
|
+
|
|
14
|
+
#### 2.44.0
|
|
15
|
+
* Added beta support for session resume.
|
|
16
|
+
|
|
11
17
|
#### 2.43.0
|
|
12
18
|
* Adding support for setting a background image and name tag image when starting a session using new fields in UneeqOptions. Url restrictions apply, please reach out to the Customer Service team.
|
|
13
19
|
|