@push.rocks/smartbrowser 2.0.11 → 3.0.0

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.
@@ -0,0 +1,1159 @@
1
+ const maxInputQueueLength = 128;
2
+ const maxPendingAcknowledgements = 16;
3
+ const maxInputReleaseAttempts = 2;
4
+ const coordinateEdgeInset = 0.001;
5
+ const defaultOperationTimeoutMs = 10000;
6
+ class LiveBrowserOperationTimeoutError extends Error {
7
+ }
8
+ const viewportEquals = (firstArg, secondArg) => (firstArg.width === secondArg.width
9
+ && firstArg.height === secondArg.height
10
+ && firstArg.deviceScaleFactor === secondArg.deviceScaleFactor);
11
+ const createModifiers = (eventArg) => ({
12
+ alt: eventArg.altKey,
13
+ control: eventArg.ctrlKey,
14
+ meta: eventArg.metaKey,
15
+ shift: eventArg.shiftKey,
16
+ });
17
+ const createFrameAcknowledgementRequest = (frameArg) => ({
18
+ tabId: frameArg.tabId,
19
+ sequence: frameArg.sequence,
20
+ generation: frameArg.generation,
21
+ viewportRevision: frameArg.viewportRevision,
22
+ });
23
+ const createInputIdentity = (displayedFrameArg) => ({
24
+ tabId: displayedFrameArg.tabId,
25
+ generation: displayedFrameArg.generation,
26
+ viewportRevision: displayedFrameArg.viewportRevision,
27
+ });
28
+ const getErrorMessage = (errorArg) => (errorArg instanceof Error ? errorArg.message : String(errorArg));
29
+ /**
30
+ * Renders transport-neutral live browser frames and maps DOM input back to the
31
+ * currently displayed SmartPuppeteer frame identity.
32
+ */
33
+ export class LiveBrowserCanvasRenderer {
34
+ constructor(optionsArg) {
35
+ this.lifecycleTail = Promise.resolve();
36
+ this.runEpoch = 0;
37
+ this.running = false;
38
+ this.stopping = false;
39
+ this.stopRequested = false;
40
+ this.terminallyStopped = false;
41
+ this.acceptingFrames = false;
42
+ this.focusWasAdjusted = false;
43
+ this.focusHadTabIndex = false;
44
+ this.focusTabIndexValue = null;
45
+ this.highestFrameSequence = -1;
46
+ this.acknowledgementPromises = new Set();
47
+ this.inputBlocked = true;
48
+ this.inputCommands = [];
49
+ this.inputProcessing = false;
50
+ this.inputIdleResolvers = [];
51
+ this.inputResetTail = Promise.resolve();
52
+ this.inputResetCount = 0;
53
+ this.inputOverflowRecoveryPending = false;
54
+ this.pressedKeys = new Map();
55
+ this.pressedMouseButtons = new Map();
56
+ this.capturedPointerIds = new Set();
57
+ this.viewportProcessing = false;
58
+ this.canvas = optionsArg.canvas;
59
+ this.client = optionsArg.client;
60
+ this.focusTarget = optionsArg.focusTarget ?? this.canvas;
61
+ this.resizeTarget = optionsArg.resizeTarget;
62
+ this.getDeviceScaleFactor = optionsArg.getDeviceScaleFactor
63
+ ?? (() => window.devicePixelRatio || 1);
64
+ this.operationTimeoutMs = this.validateTimeout(optionsArg.operationTimeoutMs ?? defaultOperationTimeoutMs, 'operationTimeoutMs');
65
+ this.frameDecodeTimeoutMs = this.validateTimeout(optionsArg.frameDecodeTimeoutMs ?? this.operationTimeoutMs, 'frameDecodeTimeoutMs');
66
+ this.onError = optionsArg.onError;
67
+ this.onFrameRendered = optionsArg.onFrameRendered;
68
+ this.initialCanvasWidth = this.canvas.width;
69
+ this.initialCanvasHeight = this.canvas.height;
70
+ const canvasContext = this.canvas.getContext('2d');
71
+ if (!canvasContext) {
72
+ throw new Error('LiveBrowserCanvasRenderer requires a 2D canvas context');
73
+ }
74
+ this.canvasContext = canvasContext;
75
+ }
76
+ get isRunning() {
77
+ return this.running;
78
+ }
79
+ start() {
80
+ return this.enqueueLifecycle(async () => {
81
+ if (this.terminallyStopped) {
82
+ throw new Error('Live browser renderer cannot restart after a terminal operation failure; create a new renderer and client');
83
+ }
84
+ if (this.running) {
85
+ return;
86
+ }
87
+ const runEpoch = ++this.runEpoch;
88
+ this.running = true;
89
+ this.stopping = false;
90
+ this.stopRequested = false;
91
+ this.acceptingFrames = true;
92
+ this.inputBlocked = true;
93
+ this.highestFrameSequence = -1;
94
+ try {
95
+ this.makeFocusTargetFocusable();
96
+ this.installDomListeners(runEpoch);
97
+ this.unsubscribe = this.client.onEvent((eventArg) => {
98
+ this.handleEvent(eventArg, runEpoch);
99
+ });
100
+ this.applyState(this.client.getState(), runEpoch);
101
+ this.installResizeObserver(runEpoch);
102
+ }
103
+ catch (error) {
104
+ await this.stopRun(runEpoch);
105
+ throw error;
106
+ }
107
+ });
108
+ }
109
+ stop() {
110
+ return this.enqueueLifecycle(async () => {
111
+ if (!this.running) {
112
+ return;
113
+ }
114
+ await this.stopRun(this.runEpoch);
115
+ });
116
+ }
117
+ /**
118
+ * Sends arbitrary committed text, including text produced by an external IME.
119
+ */
120
+ async insertText(textArg) {
121
+ const displayedFrame = this.requireInputFrame();
122
+ const inputIdentity = createInputIdentity(displayedFrame);
123
+ await this.enqueueInputCommand({
124
+ kind: 'text',
125
+ runEpoch: this.runEpoch,
126
+ execute: async () => {
127
+ await this.client.insertText({
128
+ ...inputIdentity,
129
+ text: textArg,
130
+ });
131
+ },
132
+ });
133
+ }
134
+ /**
135
+ * Reads the configured stable resize target and requests the corresponding
136
+ * remote CSS viewport. Intrinsic canvas dimensions are never used here.
137
+ */
138
+ syncViewport() {
139
+ if (!this.running || this.stopping || this.stopRequested || !this.resizeTarget) {
140
+ return;
141
+ }
142
+ const width = Math.floor(this.resizeTarget.clientWidth);
143
+ const height = Math.floor(this.resizeTarget.clientHeight);
144
+ this.queueViewport(width, height, this.runEpoch);
145
+ }
146
+ enqueueLifecycle(operationArg) {
147
+ const operation = this.lifecycleTail.then(operationArg, operationArg);
148
+ this.lifecycleTail = operation.then(() => undefined, () => undefined);
149
+ return operation;
150
+ }
151
+ async stopRun(runEpochArg) {
152
+ this.stopping = true;
153
+ this.acceptingFrames = false;
154
+ this.inputBlocked = true;
155
+ this.pendingViewport = undefined;
156
+ this.releasePointerCaptures();
157
+ try {
158
+ this.resizeObserver?.disconnect();
159
+ this.resizeObserver = undefined;
160
+ this.listenerController?.abort();
161
+ this.listenerController = undefined;
162
+ const unsubscribe = this.unsubscribe;
163
+ this.unsubscribe = undefined;
164
+ if (unsubscribe) {
165
+ try {
166
+ unsubscribe();
167
+ }
168
+ catch (error) {
169
+ this.reportError({
170
+ code: 'renderer_cleanup_failed',
171
+ message: `Could not unsubscribe the live browser renderer: ${getErrorMessage(error)}`,
172
+ cause: error,
173
+ }, runEpochArg);
174
+ }
175
+ }
176
+ if (this.queuedFrame) {
177
+ const queuedFrame = this.queuedFrame;
178
+ this.queuedFrame = undefined;
179
+ await this.acknowledgeFrame(queuedFrame);
180
+ }
181
+ await this.viewportProcessingPromise;
182
+ await this.inputResetTail;
183
+ await this.waitForInputIdle();
184
+ await this.releasePressedInput(runEpochArg);
185
+ this.running = false;
186
+ await this.frameProcessingPromise;
187
+ await Promise.all([...this.acknowledgementPromises]);
188
+ }
189
+ finally {
190
+ this.running = false;
191
+ this.acceptingFrames = false;
192
+ this.state = undefined;
193
+ this.displayedFrame = undefined;
194
+ this.resizeFence = undefined;
195
+ this.pendingViewport = undefined;
196
+ this.inFlightViewport = undefined;
197
+ this.viewportProcessing = false;
198
+ this.inputResetPromise = undefined;
199
+ this.inputBlocked = true;
200
+ this.pressedKeys.clear();
201
+ this.pressedMouseButtons.clear();
202
+ this.releasePointerCaptures();
203
+ const abandonedCommands = this.inputCommands.splice(0);
204
+ for (const command of abandonedCommands) {
205
+ command.reject(new Error('Live browser renderer stopped before dispatching input'));
206
+ }
207
+ const inputIdleResolvers = this.inputIdleResolvers;
208
+ this.inputIdleResolvers = [];
209
+ for (const resolver of inputIdleResolvers) {
210
+ resolver();
211
+ }
212
+ this.canvas.width = this.initialCanvasWidth;
213
+ this.canvas.height = this.initialCanvasHeight;
214
+ this.restoreFocusTarget();
215
+ this.stopRequested = false;
216
+ this.stopping = false;
217
+ }
218
+ }
219
+ installDomListeners(runEpochArg) {
220
+ const listenerController = new AbortController();
221
+ const signal = listenerController.signal;
222
+ this.listenerController = listenerController;
223
+ this.canvas.addEventListener('pointerdown', (eventArg) => {
224
+ this.handlePointerDown(eventArg, runEpochArg);
225
+ }, { signal });
226
+ this.canvas.addEventListener('pointermove', (eventArg) => {
227
+ this.handlePointerMove(eventArg, runEpochArg);
228
+ }, { signal });
229
+ this.canvas.addEventListener('pointerup', (eventArg) => {
230
+ this.handlePointerUp(eventArg, runEpochArg);
231
+ }, { signal });
232
+ this.canvas.addEventListener('pointercancel', (eventArg) => {
233
+ this.releasePointerCapture(eventArg.pointerId);
234
+ void this.scheduleInputReset(false, runEpochArg);
235
+ }, { signal });
236
+ this.canvas.addEventListener('lostpointercapture', (eventArg) => {
237
+ this.capturedPointerIds.delete(eventArg.pointerId);
238
+ if (this.pressedMouseButtons.size > 0) {
239
+ void this.scheduleInputReset(false, runEpochArg);
240
+ }
241
+ }, { signal });
242
+ this.canvas.addEventListener('contextmenu', (eventArg) => {
243
+ eventArg.preventDefault();
244
+ }, { signal });
245
+ this.canvas.addEventListener('wheel', (eventArg) => {
246
+ this.handleWheel(eventArg, runEpochArg);
247
+ }, { passive: false, signal });
248
+ this.focusTarget.addEventListener('keydown', (eventArg) => {
249
+ this.handleKey(eventArg, 'down', runEpochArg);
250
+ }, { signal });
251
+ this.focusTarget.addEventListener('keyup', (eventArg) => {
252
+ this.handleKey(eventArg, 'up', runEpochArg);
253
+ }, { signal });
254
+ this.focusTarget.addEventListener('compositionend', (eventArg) => {
255
+ if (!this.inputBlocked && eventArg.data) {
256
+ void this.insertText(eventArg.data).catch(() => undefined);
257
+ }
258
+ }, { signal });
259
+ window.addEventListener('blur', () => {
260
+ void this.scheduleInputReset(false, runEpochArg);
261
+ }, { signal });
262
+ window.addEventListener('resize', () => {
263
+ this.syncViewport();
264
+ }, { signal });
265
+ document.addEventListener('visibilitychange', () => {
266
+ if (document.visibilityState === 'hidden') {
267
+ void this.scheduleInputReset(false, runEpochArg);
268
+ }
269
+ }, { signal });
270
+ }
271
+ installResizeObserver(runEpochArg) {
272
+ if (!this.resizeTarget) {
273
+ return;
274
+ }
275
+ this.resizeObserver = new ResizeObserver((entriesArg) => {
276
+ const matchingEntry = entriesArg.find((entryArg) => entryArg.target === this.resizeTarget);
277
+ if (!matchingEntry) {
278
+ return;
279
+ }
280
+ this.queueViewport(Math.floor(matchingEntry.contentRect.width), Math.floor(matchingEntry.contentRect.height), runEpochArg);
281
+ });
282
+ this.resizeObserver.observe(this.resizeTarget);
283
+ this.syncViewport();
284
+ }
285
+ handleEvent(eventArg, runEpochArg) {
286
+ if (eventArg.type === 'frame') {
287
+ this.queueFrame(eventArg.frame, runEpochArg);
288
+ return;
289
+ }
290
+ if (!this.running || runEpochArg !== this.runEpoch) {
291
+ return;
292
+ }
293
+ if (eventArg.type === 'state') {
294
+ this.applyState(eventArg.state, runEpochArg);
295
+ return;
296
+ }
297
+ this.reportError({
298
+ code: 'remote_browser_error',
299
+ message: `${eventArg.error.code}: ${eventArg.error.message}`,
300
+ cause: eventArg.error,
301
+ }, runEpochArg);
302
+ }
303
+ applyState(stateArg, runEpochArg) {
304
+ if (!this.running || runEpochArg !== this.runEpoch) {
305
+ return;
306
+ }
307
+ this.state = stateArg;
308
+ if (this.displayedFrame && this.isStateAheadOfDisplayedFrame(stateArg, this.displayedFrame)) {
309
+ this.displayedFrame = undefined;
310
+ this.clearCanvas();
311
+ void this.scheduleInputReset(false, runEpochArg);
312
+ return;
313
+ }
314
+ this.updateInputAvailability();
315
+ }
316
+ isStateAheadOfDisplayedFrame(stateArg, displayedFrameArg) {
317
+ if (stateArg.status !== 'running' || stateArg.activeTabId !== displayedFrameArg.tabId) {
318
+ return true;
319
+ }
320
+ const activeTab = stateArg.tabs.find((tabArg) => tabArg.id === displayedFrameArg.tabId);
321
+ if (!activeTab || activeTab.status !== 'open') {
322
+ return true;
323
+ }
324
+ return stateArg.viewportRevision > displayedFrameArg.viewportRevision
325
+ || activeTab.generation > displayedFrameArg.generation;
326
+ }
327
+ queueFrame(frameArg, runEpochArg) {
328
+ const frameWork = {
329
+ frame: frameArg,
330
+ runEpoch: runEpochArg,
331
+ acknowledgementAttempted: false,
332
+ };
333
+ if (!this.running || !this.acceptingFrames || runEpochArg !== this.runEpoch) {
334
+ void this.acknowledgeFrame(frameWork);
335
+ return;
336
+ }
337
+ this.highestFrameSequence = Math.max(this.highestFrameSequence, frameArg.sequence);
338
+ if (this.queuedFrame) {
339
+ const supersededFrame = this.queuedFrame;
340
+ this.queuedFrame = undefined;
341
+ void this.acknowledgeFrame(supersededFrame);
342
+ }
343
+ this.queuedFrame = frameWork;
344
+ this.ensureFrameProcessor();
345
+ }
346
+ ensureFrameProcessor() {
347
+ if (this.frameProcessingPromise || !this.queuedFrame) {
348
+ return;
349
+ }
350
+ const processingPromise = this.processFrameQueue().finally(() => {
351
+ if (this.frameProcessingPromise === processingPromise) {
352
+ this.frameProcessingPromise = undefined;
353
+ if (this.queuedFrame) {
354
+ this.ensureFrameProcessor();
355
+ }
356
+ }
357
+ });
358
+ this.frameProcessingPromise = processingPromise;
359
+ }
360
+ async processFrameQueue() {
361
+ while (this.queuedFrame) {
362
+ const frameWork = this.queuedFrame;
363
+ this.queuedFrame = undefined;
364
+ await this.processFrame(frameWork);
365
+ }
366
+ }
367
+ async processFrame(frameWorkArg) {
368
+ const { frame, runEpoch } = frameWorkArg;
369
+ let imageBitmap;
370
+ try {
371
+ if (!this.canRenderFrame(frame, runEpoch)) {
372
+ return;
373
+ }
374
+ const frameBytes = new Uint8Array(frame.data.byteLength);
375
+ frameBytes.set(frame.data);
376
+ imageBitmap = await this.decodeFrame(new Blob([frameBytes.buffer], {
377
+ type: frame.mimeType,
378
+ }));
379
+ if (!this.canRenderFrame(frame, runEpoch) || frame.sequence !== this.highestFrameSequence) {
380
+ return;
381
+ }
382
+ if (imageBitmap.width !== frame.width || imageBitmap.height !== frame.height) {
383
+ throw new Error(`decoded frame dimensions ${imageBitmap.width}x${imageBitmap.height} do not match ${frame.width}x${frame.height}`);
384
+ }
385
+ this.canvas.width = frame.width;
386
+ this.canvas.height = frame.height;
387
+ this.canvasContext.clearRect(0, 0, frame.width, frame.height);
388
+ this.canvasContext.drawImage(imageBitmap, 0, 0, frame.width, frame.height);
389
+ this.displayedFrame = {
390
+ tabId: frame.tabId,
391
+ sequence: frame.sequence,
392
+ generation: frame.generation,
393
+ viewportRevision: frame.viewportRevision,
394
+ viewport: { ...frame.viewport },
395
+ };
396
+ if (this.resizeFence
397
+ && !this.viewportProcessing
398
+ && frame.viewportRevision >= this.resizeFence.minimumViewportRevision
399
+ && viewportEquals(frame.viewport, this.resizeFence.target)) {
400
+ this.resizeFence = undefined;
401
+ }
402
+ this.updateInputAvailability();
403
+ this.callFrameRendered(frame, runEpoch);
404
+ }
405
+ catch (error) {
406
+ this.reportError({
407
+ code: 'frame_render_failed',
408
+ message: `Could not render live browser frame: ${getErrorMessage(error)}`,
409
+ cause: error,
410
+ frame,
411
+ }, runEpoch);
412
+ if (error instanceof LiveBrowserOperationTimeoutError) {
413
+ this.requestStop(runEpoch);
414
+ }
415
+ }
416
+ finally {
417
+ imageBitmap?.close();
418
+ await this.acknowledgeFrame(frameWorkArg);
419
+ }
420
+ }
421
+ canRenderFrame(frameArg, runEpochArg) {
422
+ if (!this.running
423
+ || !this.acceptingFrames
424
+ || runEpochArg !== this.runEpoch
425
+ || this.viewportProcessing) {
426
+ return false;
427
+ }
428
+ const state = this.state;
429
+ if (!state || state.status !== 'running' || state.activeTabId !== frameArg.tabId) {
430
+ return false;
431
+ }
432
+ const activeTab = state.tabs.find((tabArg) => tabArg.id === frameArg.tabId);
433
+ if (!activeTab || activeTab.status !== 'open') {
434
+ return false;
435
+ }
436
+ if (state.viewportRevision > frameArg.viewportRevision
437
+ || activeTab.generation > frameArg.generation) {
438
+ return false;
439
+ }
440
+ if (this.resizeFence) {
441
+ return frameArg.viewportRevision >= this.resizeFence.minimumViewportRevision
442
+ && viewportEquals(frameArg.viewport, this.resizeFence.target);
443
+ }
444
+ return true;
445
+ }
446
+ acknowledgeFrame(frameWorkArg) {
447
+ if (frameWorkArg.acknowledgementAttempted) {
448
+ return Promise.resolve();
449
+ }
450
+ frameWorkArg.acknowledgementAttempted = true;
451
+ if (this.acknowledgementPromises.size >= maxPendingAcknowledgements) {
452
+ this.reportError({
453
+ code: 'frame_acknowledgement_failed',
454
+ message: `Live browser frame acknowledgement capacity of ${maxPendingAcknowledgements} was reached`,
455
+ }, frameWorkArg.runEpoch);
456
+ this.requestStop(frameWorkArg.runEpoch);
457
+ return Promise.resolve();
458
+ }
459
+ const acknowledgement = this.runClientOperation(() => this.client.acknowledgeFrame(createFrameAcknowledgementRequest(frameWorkArg.frame)), 'frame acknowledgement')
460
+ .then(() => undefined)
461
+ .catch((error) => {
462
+ this.reportError({
463
+ code: 'frame_acknowledgement_failed',
464
+ message: `Could not acknowledge live browser frame: ${getErrorMessage(error)}`,
465
+ cause: error,
466
+ frame: frameWorkArg.frame,
467
+ }, frameWorkArg.runEpoch);
468
+ this.requestStop(frameWorkArg.runEpoch);
469
+ });
470
+ let trackedAcknowledgement;
471
+ trackedAcknowledgement = acknowledgement.finally(() => {
472
+ this.acknowledgementPromises.delete(trackedAcknowledgement);
473
+ });
474
+ this.acknowledgementPromises.add(trackedAcknowledgement);
475
+ return trackedAcknowledgement;
476
+ }
477
+ handlePointerDown(eventArg, runEpochArg) {
478
+ if (eventArg.pointerType && eventArg.pointerType !== 'mouse') {
479
+ return;
480
+ }
481
+ const button = this.getMouseButton(eventArg.button);
482
+ if (!button) {
483
+ return;
484
+ }
485
+ const displayedFrame = this.getInputFrame();
486
+ if (!displayedFrame || runEpochArg !== this.runEpoch) {
487
+ return;
488
+ }
489
+ eventArg.preventDefault();
490
+ const coordinates = this.mapCoordinates(eventArg, displayedFrame.viewport);
491
+ if (!coordinates) {
492
+ return;
493
+ }
494
+ this.focusTarget.focus({ preventScroll: true });
495
+ try {
496
+ this.canvas.setPointerCapture(eventArg.pointerId);
497
+ this.capturedPointerIds.add(eventArg.pointerId);
498
+ }
499
+ catch {
500
+ // Pointer capture may already have been released by the browser.
501
+ }
502
+ const input = {
503
+ ...createInputIdentity(displayedFrame),
504
+ type: 'down',
505
+ ...coordinates,
506
+ button,
507
+ buttons: eventArg.buttons,
508
+ clickCount: Math.min(3, Math.max(1, eventArg.detail || 1)),
509
+ modifiers: createModifiers(eventArg),
510
+ };
511
+ void this.enqueueInputCommand({
512
+ kind: 'mouse',
513
+ runEpoch: runEpochArg,
514
+ execute: async () => this.client.dispatchMouse(input),
515
+ onAttempt: () => this.pressedMouseButtons.set(button, input),
516
+ }).catch(() => undefined);
517
+ }
518
+ handlePointerMove(eventArg, runEpochArg) {
519
+ if (eventArg.pointerType && eventArg.pointerType !== 'mouse') {
520
+ return;
521
+ }
522
+ const displayedFrame = this.getInputFrame();
523
+ if (!displayedFrame || runEpochArg !== this.runEpoch) {
524
+ return;
525
+ }
526
+ eventArg.preventDefault();
527
+ const coordinates = this.mapCoordinates(eventArg, displayedFrame.viewport);
528
+ if (!coordinates) {
529
+ this.releasePointerCapture(eventArg.pointerId);
530
+ void this.scheduleInputReset(false, runEpochArg);
531
+ return;
532
+ }
533
+ const input = {
534
+ ...createInputIdentity(displayedFrame),
535
+ type: 'move',
536
+ ...coordinates,
537
+ button: 'none',
538
+ buttons: eventArg.buttons,
539
+ modifiers: createModifiers(eventArg),
540
+ };
541
+ void this.enqueueInputCommand({
542
+ kind: 'mouseMove',
543
+ runEpoch: runEpochArg,
544
+ execute: async () => this.client.dispatchMouse(input),
545
+ }).catch(() => undefined);
546
+ }
547
+ handlePointerUp(eventArg, runEpochArg) {
548
+ if (eventArg.pointerType && eventArg.pointerType !== 'mouse') {
549
+ return;
550
+ }
551
+ const button = this.getMouseButton(eventArg.button);
552
+ const displayedFrame = this.getInputFrame();
553
+ if (!button || !displayedFrame || runEpochArg !== this.runEpoch) {
554
+ this.releasePointerCapture(eventArg.pointerId);
555
+ return;
556
+ }
557
+ eventArg.preventDefault();
558
+ const coordinates = this.mapCoordinates(eventArg, displayedFrame.viewport);
559
+ if (!coordinates) {
560
+ this.releasePointerCapture(eventArg.pointerId);
561
+ void this.scheduleInputReset(false, runEpochArg);
562
+ return;
563
+ }
564
+ const input = {
565
+ ...createInputIdentity(displayedFrame),
566
+ type: 'up',
567
+ ...coordinates,
568
+ button,
569
+ buttons: eventArg.buttons,
570
+ clickCount: Math.min(3, Math.max(1, eventArg.detail || 1)),
571
+ modifiers: createModifiers(eventArg),
572
+ };
573
+ void this.enqueueInputCommand({
574
+ kind: 'mouse',
575
+ runEpoch: runEpochArg,
576
+ execute: async () => this.client.dispatchMouse(input),
577
+ onSuccess: () => this.pressedMouseButtons.delete(button),
578
+ }).catch(() => undefined);
579
+ this.releasePointerCapture(eventArg.pointerId);
580
+ }
581
+ handleWheel(eventArg, runEpochArg) {
582
+ const displayedFrame = this.getInputFrame();
583
+ if (!displayedFrame || runEpochArg !== this.runEpoch) {
584
+ return;
585
+ }
586
+ eventArg.preventDefault();
587
+ const coordinates = this.mapCoordinates(eventArg, displayedFrame.viewport);
588
+ if (!coordinates) {
589
+ return;
590
+ }
591
+ const multiplier = eventArg.deltaMode === WheelEvent.DOM_DELTA_LINE
592
+ ? 16
593
+ : eventArg.deltaMode === WheelEvent.DOM_DELTA_PAGE
594
+ ? displayedFrame.viewport.height
595
+ : 1;
596
+ const clampDelta = (valueArg) => Math.max(-1000000, Math.min(1000000, valueArg));
597
+ void this.enqueueInputCommand({
598
+ kind: 'wheel',
599
+ runEpoch: runEpochArg,
600
+ execute: async () => this.client.dispatchWheel({
601
+ ...createInputIdentity(displayedFrame),
602
+ ...coordinates,
603
+ deltaX: clampDelta(eventArg.deltaX * multiplier),
604
+ deltaY: clampDelta(eventArg.deltaY * multiplier),
605
+ modifiers: createModifiers(eventArg),
606
+ }),
607
+ }).catch(() => undefined);
608
+ }
609
+ handleKey(eventArg, typeArg, runEpochArg) {
610
+ const displayedFrame = this.getInputFrame();
611
+ if (!displayedFrame
612
+ || runEpochArg !== this.runEpoch
613
+ || eventArg.isComposing
614
+ || eventArg.key === 'Process') {
615
+ return;
616
+ }
617
+ eventArg.preventDefault();
618
+ const text = typeArg === 'down'
619
+ && eventArg.key.length === 1
620
+ && !eventArg.metaKey
621
+ && (!eventArg.ctrlKey || eventArg.altKey)
622
+ ? eventArg.key
623
+ : undefined;
624
+ const input = {
625
+ ...createInputIdentity(displayedFrame),
626
+ type: typeArg,
627
+ key: eventArg.key,
628
+ code: eventArg.code || undefined,
629
+ text,
630
+ windowsVirtualKeyCode: eventArg.keyCode || undefined,
631
+ autoRepeat: eventArg.repeat,
632
+ isKeypad: eventArg.location === KeyboardEvent.DOM_KEY_LOCATION_NUMPAD,
633
+ location: eventArg.location,
634
+ modifiers: createModifiers(eventArg),
635
+ };
636
+ const keyIdentity = eventArg.code || eventArg.key;
637
+ void this.enqueueInputCommand({
638
+ kind: 'key',
639
+ runEpoch: runEpochArg,
640
+ execute: async () => this.client.dispatchKey(input),
641
+ onAttempt: typeArg === 'down'
642
+ ? () => this.pressedKeys.set(keyIdentity, input)
643
+ : undefined,
644
+ onSuccess: () => {
645
+ if (typeArg === 'up') {
646
+ this.pressedKeys.delete(keyIdentity);
647
+ }
648
+ },
649
+ }).catch(() => undefined);
650
+ }
651
+ mapCoordinates(eventArg, viewportArg) {
652
+ const canvasBounds = this.canvas.getBoundingClientRect();
653
+ if (canvasBounds.width <= 0 || canvasBounds.height <= 0) {
654
+ return undefined;
655
+ }
656
+ const x = ((eventArg.clientX - canvasBounds.left) / canvasBounds.width) * viewportArg.width;
657
+ const y = ((eventArg.clientY - canvasBounds.top) / canvasBounds.height) * viewportArg.height;
658
+ return {
659
+ x: Math.max(0, Math.min(viewportArg.width - coordinateEdgeInset, x)),
660
+ y: Math.max(0, Math.min(viewportArg.height - coordinateEdgeInset, y)),
661
+ };
662
+ }
663
+ getMouseButton(buttonArg) {
664
+ return buttonArg === 0
665
+ ? 'left'
666
+ : buttonArg === 1
667
+ ? 'middle'
668
+ : buttonArg === 2
669
+ ? 'right'
670
+ : buttonArg === 3
671
+ ? 'back'
672
+ : buttonArg === 4
673
+ ? 'forward'
674
+ : undefined;
675
+ }
676
+ getInputFrame() {
677
+ return this.inputBlocked || !this.isDisplayedFrameCurrent()
678
+ ? undefined
679
+ : this.displayedFrame;
680
+ }
681
+ requireInputFrame() {
682
+ const displayedFrame = this.getInputFrame();
683
+ if (!displayedFrame) {
684
+ throw new Error('Live browser input is unavailable until a current frame is displayed');
685
+ }
686
+ return displayedFrame;
687
+ }
688
+ isDisplayedFrameCurrent() {
689
+ const state = this.state;
690
+ const displayedFrame = this.displayedFrame;
691
+ if (!state || !displayedFrame || state.status !== 'running') {
692
+ return false;
693
+ }
694
+ if (state.activeTabId !== displayedFrame.tabId
695
+ || state.viewportRevision > displayedFrame.viewportRevision) {
696
+ return false;
697
+ }
698
+ const activeTab = state.tabs.find((tabArg) => tabArg.id === displayedFrame.tabId);
699
+ return Boolean(activeTab
700
+ && activeTab.status === 'open'
701
+ && activeTab.generation <= displayedFrame.generation);
702
+ }
703
+ enqueueInputCommand(commandArg) {
704
+ if (!this.running || this.inputBlocked || commandArg.runEpoch !== this.runEpoch) {
705
+ return Promise.reject(new Error('Live browser input is currently blocked'));
706
+ }
707
+ return new Promise((resolve, reject) => {
708
+ const command = {
709
+ ...commandArg,
710
+ resolve,
711
+ reject,
712
+ };
713
+ const lastCommand = this.inputCommands.at(-1);
714
+ if (command.kind === 'mouseMove' && lastCommand?.kind === 'mouseMove') {
715
+ lastCommand.resolve();
716
+ this.inputCommands[this.inputCommands.length - 1] = command;
717
+ }
718
+ else if (this.inputCommands.length >= maxInputQueueLength) {
719
+ if (command.kind === 'mouseMove') {
720
+ resolve();
721
+ return;
722
+ }
723
+ const error = new Error('Live browser input queue reached its capacity');
724
+ this.reportError({
725
+ code: 'input_queue_capacity_exceeded',
726
+ message: error.message,
727
+ cause: error,
728
+ }, command.runEpoch);
729
+ reject(error);
730
+ this.recoverFromInputOverflow(command.runEpoch);
731
+ return;
732
+ }
733
+ else {
734
+ this.inputCommands.push(command);
735
+ }
736
+ this.processInputCommands();
737
+ });
738
+ }
739
+ processInputCommands() {
740
+ if (this.inputProcessing) {
741
+ return;
742
+ }
743
+ this.inputProcessing = true;
744
+ void (async () => {
745
+ try {
746
+ while (this.inputCommands.length > 0) {
747
+ const command = this.inputCommands.shift();
748
+ if (command.runEpoch !== this.runEpoch) {
749
+ command.resolve();
750
+ continue;
751
+ }
752
+ try {
753
+ command.onAttempt?.();
754
+ await this.runClientOperation(command.execute, 'input dispatch');
755
+ command.onSuccess?.();
756
+ command.resolve();
757
+ }
758
+ catch (error) {
759
+ this.reportError({
760
+ code: 'input_dispatch_failed',
761
+ message: `Could not dispatch live browser input: ${getErrorMessage(error)}`,
762
+ cause: error,
763
+ }, command.runEpoch);
764
+ command.reject(error);
765
+ const abandonedCommands = this.inputCommands.splice(0);
766
+ for (const abandonedCommand of abandonedCommands) {
767
+ abandonedCommand.reject(new Error('Live browser input was abandoned after a dispatch failure'));
768
+ }
769
+ if (!this.stopping) {
770
+ void this.scheduleInputReset(false, command.runEpoch);
771
+ }
772
+ if (error instanceof LiveBrowserOperationTimeoutError) {
773
+ this.requestStop(command.runEpoch);
774
+ }
775
+ }
776
+ }
777
+ }
778
+ finally {
779
+ this.inputProcessing = false;
780
+ if (this.inputCommands.length > 0) {
781
+ this.processInputCommands();
782
+ }
783
+ else {
784
+ const resolvers = this.inputIdleResolvers;
785
+ this.inputIdleResolvers = [];
786
+ for (const resolver of resolvers) {
787
+ resolver();
788
+ }
789
+ }
790
+ }
791
+ })();
792
+ }
793
+ waitForInputIdle() {
794
+ if (!this.inputProcessing && this.inputCommands.length === 0) {
795
+ return Promise.resolve();
796
+ }
797
+ return new Promise((resolve) => {
798
+ this.inputIdleResolvers.push(resolve);
799
+ });
800
+ }
801
+ scheduleInputReset(clearDisplayArg, runEpochArg) {
802
+ if (runEpochArg !== this.runEpoch || this.stopping) {
803
+ return Promise.resolve();
804
+ }
805
+ this.inputBlocked = true;
806
+ this.releasePointerCaptures();
807
+ if (clearDisplayArg) {
808
+ this.displayedFrame = undefined;
809
+ this.clearCanvas();
810
+ }
811
+ if (this.inputResetPromise) {
812
+ return this.inputResetPromise;
813
+ }
814
+ this.inputResetCount++;
815
+ let resetOperation;
816
+ resetOperation = this.inputResetTail.then(async () => {
817
+ await this.waitForInputIdle();
818
+ await this.releasePressedInput(runEpochArg);
819
+ }).finally(() => {
820
+ this.inputResetCount--;
821
+ if (this.inputResetPromise === resetOperation) {
822
+ this.inputResetPromise = undefined;
823
+ }
824
+ this.updateInputAvailability();
825
+ });
826
+ this.inputResetPromise = resetOperation;
827
+ this.inputResetTail = resetOperation.then(() => undefined, () => undefined);
828
+ return resetOperation;
829
+ }
830
+ recoverFromInputOverflow(runEpochArg) {
831
+ if (this.inputOverflowRecoveryPending) {
832
+ return;
833
+ }
834
+ this.inputOverflowRecoveryPending = true;
835
+ this.inputBlocked = true;
836
+ void this.scheduleInputReset(false, runEpochArg).finally(() => {
837
+ this.inputOverflowRecoveryPending = false;
838
+ });
839
+ }
840
+ async releasePressedInput(runEpochArg) {
841
+ for (const [keyIdentity, pressedKey] of [...this.pressedKeys.entries()]) {
842
+ const released = await this.tryInputRelease(() => this.client.dispatchKey({
843
+ ...pressedKey,
844
+ type: 'up',
845
+ text: undefined,
846
+ autoRepeat: false,
847
+ modifiers: {},
848
+ }), runEpochArg);
849
+ if (released && this.pressedKeys.get(keyIdentity) === pressedKey) {
850
+ this.pressedKeys.delete(keyIdentity);
851
+ }
852
+ }
853
+ for (const [button, pressedButton] of [...this.pressedMouseButtons.entries()]) {
854
+ const released = await this.tryInputRelease(() => this.client.dispatchMouse({
855
+ ...pressedButton,
856
+ type: 'up',
857
+ buttons: 0,
858
+ clickCount: 1,
859
+ modifiers: {},
860
+ }), runEpochArg);
861
+ if (released && this.pressedMouseButtons.get(button) === pressedButton) {
862
+ this.pressedMouseButtons.delete(button);
863
+ }
864
+ }
865
+ }
866
+ async tryInputRelease(operationArg, runEpochArg) {
867
+ let lastError;
868
+ for (let attempt = 0; attempt < maxInputReleaseAttempts; attempt++) {
869
+ try {
870
+ await this.runClientOperation(operationArg, 'input release');
871
+ return true;
872
+ }
873
+ catch (error) {
874
+ lastError = error;
875
+ }
876
+ }
877
+ this.reportInputReleaseError(lastError, runEpochArg);
878
+ this.requestStop(runEpochArg);
879
+ return false;
880
+ }
881
+ reportInputReleaseError(errorArg, runEpochArg) {
882
+ this.reportError({
883
+ code: 'input_dispatch_failed',
884
+ message: `Could not release live browser input: ${getErrorMessage(errorArg)}`,
885
+ cause: errorArg,
886
+ }, runEpochArg);
887
+ }
888
+ queueViewport(widthArg, heightArg, runEpochArg) {
889
+ if (!this.running
890
+ || this.stopping
891
+ || this.stopRequested
892
+ || runEpochArg !== this.runEpoch
893
+ || widthArg <= 0
894
+ || heightArg <= 0) {
895
+ return;
896
+ }
897
+ const deviceScaleFactor = this.getDeviceScaleFactor();
898
+ if (!Number.isFinite(deviceScaleFactor) || deviceScaleFactor <= 0) {
899
+ this.reportError({
900
+ code: 'viewport_update_failed',
901
+ message: 'Live browser device scale factor must be a positive finite number',
902
+ }, runEpochArg);
903
+ return;
904
+ }
905
+ const viewport = {
906
+ width: widthArg,
907
+ height: heightArg,
908
+ deviceScaleFactor,
909
+ };
910
+ if (this.pendingViewport && viewportEquals(viewport, this.pendingViewport)) {
911
+ return;
912
+ }
913
+ if (this.inFlightViewport && viewportEquals(viewport, this.inFlightViewport)) {
914
+ this.pendingViewport = undefined;
915
+ return;
916
+ }
917
+ if (!this.inFlightViewport
918
+ && this.resizeFence
919
+ && viewportEquals(viewport, this.resizeFence.target)) {
920
+ this.pendingViewport = undefined;
921
+ return;
922
+ }
923
+ if (!this.inFlightViewport
924
+ && !this.resizeFence
925
+ && this.state
926
+ && viewportEquals(viewport, this.state.viewport)) {
927
+ this.pendingViewport = undefined;
928
+ this.updateInputAvailability();
929
+ return;
930
+ }
931
+ this.pendingViewport = viewport;
932
+ this.inputBlocked = true;
933
+ this.ensureViewportProcessor(runEpochArg);
934
+ }
935
+ ensureViewportProcessor(runEpochArg) {
936
+ if (this.viewportProcessingPromise || !this.pendingViewport) {
937
+ return;
938
+ }
939
+ const processingPromise = this.processViewportQueue(runEpochArg).finally(() => {
940
+ if (this.viewportProcessingPromise === processingPromise) {
941
+ this.viewportProcessingPromise = undefined;
942
+ if (this.pendingViewport
943
+ && this.running
944
+ && !this.stopping
945
+ && runEpochArg === this.runEpoch) {
946
+ this.ensureViewportProcessor(runEpochArg);
947
+ }
948
+ }
949
+ });
950
+ this.viewportProcessingPromise = processingPromise;
951
+ }
952
+ async processViewportQueue(runEpochArg) {
953
+ this.viewportProcessing = true;
954
+ try {
955
+ while (this.pendingViewport
956
+ && this.running
957
+ && !this.stopping
958
+ && runEpochArg === this.runEpoch) {
959
+ const viewport = this.pendingViewport;
960
+ this.pendingViewport = undefined;
961
+ this.inFlightViewport = viewport;
962
+ if (!this.resizeFence && this.state && viewportEquals(viewport, this.state.viewport)) {
963
+ this.inFlightViewport = undefined;
964
+ continue;
965
+ }
966
+ await this.scheduleInputReset(true, runEpochArg);
967
+ if (!this.running || this.stopping || runEpochArg !== this.runEpoch) {
968
+ return;
969
+ }
970
+ const currentRevision = this.state?.viewportRevision ?? 0;
971
+ const previousMinimumRevision = this.resizeFence?.minimumViewportRevision ?? currentRevision;
972
+ try {
973
+ await this.runClientOperation(() => this.client.setViewport(viewport), 'viewport update');
974
+ if (!this.running || this.stopping || runEpochArg !== this.runEpoch) {
975
+ return;
976
+ }
977
+ this.resizeFence = {
978
+ target: viewport,
979
+ minimumViewportRevision: Math.max(currentRevision, previousMinimumRevision) + 1,
980
+ };
981
+ }
982
+ catch (error) {
983
+ if (runEpochArg === this.runEpoch) {
984
+ this.resizeFence = undefined;
985
+ this.reportError({
986
+ code: 'viewport_update_failed',
987
+ message: `Could not update live browser viewport: ${getErrorMessage(error)}`,
988
+ cause: error,
989
+ }, runEpochArg);
990
+ if (error instanceof LiveBrowserOperationTimeoutError) {
991
+ this.requestStop(runEpochArg);
992
+ }
993
+ }
994
+ }
995
+ finally {
996
+ if (this.inFlightViewport && viewportEquals(this.inFlightViewport, viewport)) {
997
+ this.inFlightViewport = undefined;
998
+ }
999
+ }
1000
+ }
1001
+ }
1002
+ finally {
1003
+ this.viewportProcessing = false;
1004
+ this.updateInputAvailability();
1005
+ }
1006
+ }
1007
+ updateInputAvailability() {
1008
+ this.inputBlocked = !(this.running
1009
+ && this.acceptingFrames
1010
+ && !this.viewportProcessing
1011
+ && !this.resizeFence
1012
+ && this.inputResetCount === 0
1013
+ && this.pressedKeys.size === 0
1014
+ && this.pressedMouseButtons.size === 0
1015
+ && this.isDisplayedFrameCurrent());
1016
+ }
1017
+ makeFocusTargetFocusable() {
1018
+ this.focusWasAdjusted = false;
1019
+ if (this.focusTarget.tabIndex >= 0) {
1020
+ return;
1021
+ }
1022
+ this.focusHadTabIndex = this.focusTarget.hasAttribute('tabindex');
1023
+ this.focusTabIndexValue = this.focusTarget.getAttribute('tabindex');
1024
+ this.focusTarget.setAttribute('tabindex', '0');
1025
+ this.focusWasAdjusted = true;
1026
+ }
1027
+ restoreFocusTarget() {
1028
+ if (!this.focusWasAdjusted) {
1029
+ return;
1030
+ }
1031
+ if (this.focusHadTabIndex && this.focusTabIndexValue !== null) {
1032
+ this.focusTarget.setAttribute('tabindex', this.focusTabIndexValue);
1033
+ }
1034
+ else {
1035
+ this.focusTarget.removeAttribute('tabindex');
1036
+ }
1037
+ this.focusWasAdjusted = false;
1038
+ }
1039
+ clearCanvas() {
1040
+ this.canvasContext.clearRect(0, 0, this.canvas.width, this.canvas.height);
1041
+ }
1042
+ callFrameRendered(frameArg, runEpochArg) {
1043
+ if (!this.onFrameRendered || runEpochArg !== this.runEpoch || !this.running) {
1044
+ return;
1045
+ }
1046
+ try {
1047
+ this.onFrameRendered(frameArg);
1048
+ }
1049
+ catch (error) {
1050
+ this.reportError({
1051
+ code: 'renderer_callback_failed',
1052
+ message: `Live browser frame callback failed: ${getErrorMessage(error)}`,
1053
+ cause: error,
1054
+ frame: frameArg,
1055
+ }, runEpochArg);
1056
+ }
1057
+ }
1058
+ reportError(errorArg, runEpochArg) {
1059
+ if (!this.onError || runEpochArg !== this.runEpoch) {
1060
+ return;
1061
+ }
1062
+ try {
1063
+ this.onError(errorArg);
1064
+ }
1065
+ catch {
1066
+ // Consumer error reporting must not break renderer cleanup.
1067
+ }
1068
+ }
1069
+ requestStop(runEpochArg) {
1070
+ if (runEpochArg !== this.runEpoch
1071
+ || (!this.running && !this.stopping)) {
1072
+ return;
1073
+ }
1074
+ this.terminallyStopped = true;
1075
+ this.acceptingFrames = false;
1076
+ this.inputBlocked = true;
1077
+ this.pendingViewport = undefined;
1078
+ if (this.stopping || this.stopRequested) {
1079
+ return;
1080
+ }
1081
+ this.stopRequested = true;
1082
+ void this.stop();
1083
+ }
1084
+ validateTimeout(timeoutArg, nameArg) {
1085
+ if (!Number.isFinite(timeoutArg) || timeoutArg <= 0) {
1086
+ throw new Error(`${nameArg} must be a positive finite number`);
1087
+ }
1088
+ return timeoutArg;
1089
+ }
1090
+ runClientOperation(operationArg, operationNameArg) {
1091
+ let operation;
1092
+ try {
1093
+ operation = operationArg();
1094
+ }
1095
+ catch (error) {
1096
+ return Promise.reject(error);
1097
+ }
1098
+ return this.withTimeout(operation, this.operationTimeoutMs, operationNameArg);
1099
+ }
1100
+ withTimeout(operationArg, timeoutMsArg, operationNameArg) {
1101
+ return new Promise((resolve, reject) => {
1102
+ let settled = false;
1103
+ const timeout = globalThis.setTimeout(() => {
1104
+ if (!settled) {
1105
+ settled = true;
1106
+ reject(new LiveBrowserOperationTimeoutError(`${operationNameArg} timed out after ${timeoutMsArg}ms`));
1107
+ }
1108
+ }, timeoutMsArg);
1109
+ operationArg.then((valueArg) => {
1110
+ if (!settled) {
1111
+ settled = true;
1112
+ globalThis.clearTimeout(timeout);
1113
+ resolve(valueArg);
1114
+ }
1115
+ }, (errorArg) => {
1116
+ if (!settled) {
1117
+ settled = true;
1118
+ globalThis.clearTimeout(timeout);
1119
+ reject(errorArg);
1120
+ }
1121
+ });
1122
+ });
1123
+ }
1124
+ async decodeFrame(blobArg) {
1125
+ let decodeOperation;
1126
+ try {
1127
+ decodeOperation = createImageBitmap(blobArg);
1128
+ }
1129
+ catch (error) {
1130
+ throw error;
1131
+ }
1132
+ try {
1133
+ return await this.withTimeout(decodeOperation, this.frameDecodeTimeoutMs, 'frame decode');
1134
+ }
1135
+ catch (error) {
1136
+ void decodeOperation.then((lateBitmapArg) => lateBitmapArg.close(), () => undefined);
1137
+ throw error;
1138
+ }
1139
+ }
1140
+ releasePointerCapture(pointerIdArg) {
1141
+ this.capturedPointerIds.delete(pointerIdArg);
1142
+ try {
1143
+ if (this.canvas.hasPointerCapture(pointerIdArg)) {
1144
+ this.canvas.releasePointerCapture(pointerIdArg);
1145
+ }
1146
+ }
1147
+ catch {
1148
+ // Pointer capture may already have been released by the browser.
1149
+ }
1150
+ }
1151
+ releasePointerCaptures() {
1152
+ const pointerIds = [...this.capturedPointerIds];
1153
+ this.capturedPointerIds.clear();
1154
+ for (const pointerId of pointerIds) {
1155
+ this.releasePointerCapture(pointerId);
1156
+ }
1157
+ }
1158
+ }
1159
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5saXZlYnJvd3NlcmNhbnZhc3JlbmRlcmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfd2ViL2NsYXNzZXMubGl2ZWJyb3dzZXJjYW52YXNyZW5kZXJlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFpQkEsTUFBTSxtQkFBbUIsR0FBRyxHQUFHLENBQUM7QUFDaEMsTUFBTSwwQkFBMEIsR0FBRyxFQUFFLENBQUM7QUFDdEMsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLENBQUM7QUFDbEMsTUFBTSxtQkFBbUIsR0FBRyxLQUFLLENBQUM7QUFDbEMsTUFBTSx5QkFBeUIsR0FBRyxLQUFLLENBQUM7QUFFeEMsTUFBTSxnQ0FBaUMsU0FBUSxLQUFLO0NBQUc7QUE4QnZELE1BQU0sY0FBYyxHQUFHLENBQ3JCLFFBQThCLEVBQzlCLFNBQStCLEVBQ3RCLEVBQUUsQ0FBQyxDQUNaLFFBQVEsQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLEtBQUs7T0FDL0IsUUFBUSxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsTUFBTTtPQUNwQyxRQUFRLENBQUMsaUJBQWlCLEtBQUssU0FBUyxDQUFDLGlCQUFpQixDQUM5RCxDQUFDO0FBRUYsTUFBTSxlQUFlLEdBQUcsQ0FDdEIsUUFBb0MsRUFDVCxFQUFFLENBQUMsQ0FBQztJQUMvQixHQUFHLEVBQUUsUUFBUSxDQUFDLE1BQU07SUFDcEIsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPO0lBQ3pCLElBQUksRUFBRSxRQUFRLENBQUMsT0FBTztJQUN0QixLQUFLLEVBQUUsUUFBUSxDQUFDLFFBQVE7Q0FDekIsQ0FBQyxDQUFDO0FBRUgsTUFBTSxpQ0FBaUMsR0FBRyxDQUFDLFFBQTJCLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDMUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLO0lBQ3JCLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUTtJQUMzQixVQUFVLEVBQUUsUUFBUSxDQUFDLFVBQVU7SUFDL0Is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