tas-uell-sdk 0.0.5 → 0.1.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.
Files changed (32) hide show
  1. package/README.md +161 -51
  2. package/esm2020/lib/components/tas-avatar/tas-avatar.component.mjs +75 -0
  3. package/esm2020/lib/components/tas-btn/tas-btn.component.mjs +146 -61
  4. package/esm2020/lib/components/tas-floating-call/tas-floating-call.component.mjs +48 -23
  5. package/esm2020/lib/components/tas-incoming-appointment/tas-incoming-appointment.component.mjs +109 -0
  6. package/esm2020/lib/components/tas-videocall/tas-videocall.component.mjs +217 -20
  7. package/esm2020/lib/components/tas-waiting-room/tas-waiting-room.component.mjs +226 -160
  8. package/esm2020/lib/config/tas.config.mjs +1 -1
  9. package/esm2020/lib/interfaces/tas.interfaces.mjs +45 -2
  10. package/esm2020/lib/services/geolocation.service.mjs +56 -0
  11. package/esm2020/lib/services/tas.service.mjs +400 -34
  12. package/esm2020/lib/tas-uell-sdk.module.mjs +25 -21
  13. package/esm2020/public-api.mjs +4 -1
  14. package/fesm2015/tas-uell-sdk.mjs +1323 -302
  15. package/fesm2015/tas-uell-sdk.mjs.map +1 -1
  16. package/fesm2020/tas-uell-sdk.mjs +1307 -300
  17. package/fesm2020/tas-uell-sdk.mjs.map +1 -1
  18. package/lib/components/tas-avatar/tas-avatar.component.d.ts +9 -0
  19. package/lib/components/tas-btn/tas-btn.component.d.ts +35 -15
  20. package/lib/components/tas-floating-call/tas-floating-call.component.d.ts +5 -1
  21. package/lib/components/tas-incoming-appointment/tas-incoming-appointment.component.d.ts +33 -0
  22. package/lib/components/tas-videocall/tas-videocall.component.d.ts +49 -3
  23. package/lib/components/tas-waiting-room/tas-waiting-room.component.d.ts +50 -35
  24. package/lib/config/tas.config.d.ts +7 -0
  25. package/lib/interfaces/tas.interfaces.d.ts +127 -35
  26. package/lib/services/geolocation.service.d.ts +24 -0
  27. package/lib/services/tas.service.d.ts +98 -9
  28. package/lib/tas-uell-sdk.module.d.ts +6 -3
  29. package/package.json +1 -1
  30. package/public-api.d.ts +3 -0
  31. package/src/lib/styles/tas-global.scss +27 -28
  32. package/INSTALL_AND_TEST.md +0 -427
@@ -1,8 +1,8 @@
1
- import { Component, Input } from "@angular/core";
2
- import { Subscription } from "rxjs";
3
- import { ViewMode } from "../../interfaces/tas.interfaces";
4
- import { TasWaitingRoomComponent } from "../tas-waiting-room/tas-waiting-room.component";
5
- import { TasVideocallComponent } from "../tas-videocall/tas-videocall.component";
1
+ import { Component, Input } from '@angular/core';
2
+ import { Subscription } from 'rxjs';
3
+ import { TasRoomType, ViewMode, TasBusinessRole, } from '../../interfaces/tas.interfaces';
4
+ import { TasWaitingRoomComponent } from '../tas-waiting-room/tas-waiting-room.component';
5
+ import { TasVideocallComponent } from '../tas-videocall/tas-videocall.component';
6
6
  import * as i0 from "@angular/core";
7
7
  import * as i1 from "@ng-bootstrap/ng-bootstrap";
8
8
  import * as i2 from "../../services/tas.service";
@@ -11,107 +11,192 @@ export class TasButtonComponent {
11
11
  constructor(modalService, tasService) {
12
12
  this.modalService = modalService;
13
13
  this.tasService = tasService;
14
- this.appointmentId = 1;
15
- this.product = "uell";
16
- this.tenantId = "";
17
- this.regularUserIds = [];
18
- this.moderatorUserIds = [];
19
- /** Optional: If provided, skips room creation and goes directly to getting a token */
20
- this.existingSessionId = "";
21
- /** Optional: Custom button text */
22
- this.buttonText = "Iniciar TAS";
14
+ // Status endpoint params
15
+ this.roomType = TasRoomType.TAS;
16
+ this.businessRole = TasBusinessRole.USER;
17
+ // Style customization
18
+ this.variant = 'default';
19
+ this.buttonLabel = 'Iniciar TAS';
23
20
  this.isLoading = false;
21
+ // Status check state
22
+ this.isCheckingStatus = false;
23
+ this.isStatusError = false;
24
+ this.statusErrorMessage = '';
25
+ this.isJoinable = false; // Tracks joinable field from status response
24
26
  this.subscriptions = new Subscription();
25
27
  this.currentModalRef = null;
26
28
  this.videoCallModalRef = null;
29
+ this.statusPollingInterval = null;
30
+ this.STATUS_POLL_INTERVAL_MS = 30000; // 30 seconds
27
31
  }
28
- ngOnInit() {
29
- if (!this.ownerUserIds || this.ownerUserIds.length !== 1) {
30
- throw new Error('tas-btn: ownerUserIds input is required and must contain exactly one user');
32
+ /** Whether user is backoffice (or admin/manager) */
33
+ get isBackoffice() {
34
+ return (this.businessRole === TasBusinessRole.BACKOFFICE ||
35
+ this.businessRole === TasBusinessRole.ADMIN_MANAGER ||
36
+ this.businessRole === TasBusinessRole.MANAGER);
37
+ }
38
+ /** Whether the button should be disabled */
39
+ get isDisabled() {
40
+ return this.isLoading || this.isStatusError || !this.isJoinable;
41
+ }
42
+ /** Reason why the button is disabled (for tooltip) */
43
+ get disabledReason() {
44
+ if (this.isLoading) {
45
+ return '';
46
+ }
47
+ if (this.isStatusError) {
48
+ return this.statusErrorMessage || 'Error al verificar el estado';
31
49
  }
50
+ if (!this.isJoinable) {
51
+ return 'Todavía no es el horario de la llamada';
52
+ }
53
+ return '';
54
+ }
55
+ ngOnInit() {
32
56
  // Subscribe to viewMode to handle PiP return
33
- this.subscriptions.add(this.tasService.viewMode$.subscribe(mode => {
34
- // Reopen video call modal when returning from PiP
35
- if (mode === ViewMode.FULLSCREEN &&
36
- this.tasService.isCallActive() &&
37
- !this.videoCallModalRef) {
38
- const sessionId = this.tasService.sessionId;
39
- const token = this.tasService.token;
40
- if (sessionId && token) {
41
- this.openVideoCallModal(true);
42
- }
43
- }
57
+ this.subscriptions.add(this.tasService.viewMode$.subscribe((mode) => {
44
58
  // When entering PiP, clear the videoCallModalRef since modal will close
45
59
  if (mode === ViewMode.PIP) {
46
60
  this.videoCallModalRef = null;
47
61
  }
48
62
  }));
63
+ // Start status checking
64
+ this.startStatusPolling();
49
65
  }
50
66
  ngOnDestroy() {
51
67
  this.subscriptions.unsubscribe();
68
+ this.stopStatusPolling();
69
+ }
70
+ /**
71
+ * Start polling status every 30 seconds
72
+ */
73
+ startStatusPolling() {
74
+ // Initial status check
75
+ this.checkStatus();
76
+ // Set up periodic polling
77
+ this.statusPollingInterval = setInterval(() => {
78
+ this.checkStatus();
79
+ }, this.STATUS_POLL_INTERVAL_MS);
80
+ }
81
+ /**
82
+ * Stop status polling
83
+ */
84
+ stopStatusPolling() {
85
+ if (this.statusPollingInterval) {
86
+ clearInterval(this.statusPollingInterval);
87
+ this.statusPollingInterval = null;
88
+ }
89
+ }
90
+ /**
91
+ * Check status endpoint to determine if button should be enabled
92
+ */
93
+ checkStatus() {
94
+ // Skip if required inputs are not available
95
+ if (!this.tenant || !this.entityId) {
96
+ return;
97
+ }
98
+ this.isCheckingStatus = true;
99
+ this.statusErrorMessage = '';
100
+ this.subscriptions.add(this.tasService.getProxyVideoStatus({
101
+ roomType: this.roomType,
102
+ entityId: this.entityId,
103
+ tenant: this.tenant,
104
+ businessRole: this.businessRole,
105
+ }).subscribe({
106
+ next: (response) => {
107
+ // Check if response is actually an error (some HTTP adapters return errors in next)
108
+ // Also check for undefined/null or missing content
109
+ const isErrorResponse = !response ||
110
+ !response.content ||
111
+ response?.ok === false ||
112
+ response?.status >= 400 ||
113
+ response?.error ||
114
+ response?.name === 'HttpErrorResponse';
115
+ if (isErrorResponse) {
116
+ this.isCheckingStatus = false;
117
+ this.isStatusError = true;
118
+ this.statusErrorMessage = response?.error?.message || response?.message || 'Error checking status';
119
+ }
120
+ else {
121
+ this.isCheckingStatus = false;
122
+ this.isStatusError = false;
123
+ this.statusErrorMessage = '';
124
+ // Update joinable state from response
125
+ this.isJoinable = response.content?.joinable ?? false;
126
+ }
127
+ },
128
+ error: (err) => {
129
+ this.isCheckingStatus = false;
130
+ this.isStatusError = true;
131
+ this.statusErrorMessage = err?.error?.message || err?.message || 'Error checking status';
132
+ },
133
+ }));
52
134
  }
53
135
  onClick() {
54
- if (!this.tenantId || !this.currentUser?.name) {
55
- console.error("Tenant ID or current user not available");
136
+ if (!this.tenant || !this.currentUser?.name) {
137
+ return;
138
+ }
139
+ if (!this.entityId) {
56
140
  return;
57
141
  }
58
142
  this.openWaitingRoomModal();
59
143
  }
60
144
  openWaitingRoomModal() {
61
145
  this.currentModalRef = this.modalService.open(TasWaitingRoomComponent, {
62
- size: "lg",
63
- windowClass: "tas-waiting-room-modal",
64
- backdrop: "static",
146
+ size: 'lg',
147
+ windowClass: 'tas-waiting-room-modal',
148
+ backdrop: 'static',
65
149
  keyboard: false,
66
- centered: true
150
+ centered: true,
67
151
  });
68
152
  // Pass all necessary inputs to the waiting room component
69
- this.currentModalRef.componentInstance.appointmentId = this.appointmentId;
70
- this.currentModalRef.componentInstance.product = this.product;
71
- this.currentModalRef.componentInstance.tenantId = this.tenantId;
153
+ this.currentModalRef.componentInstance.roomType = this.roomType;
154
+ this.currentModalRef.componentInstance.entityId = this.entityId;
155
+ this.currentModalRef.componentInstance.tenant = this.tenant;
156
+ this.currentModalRef.componentInstance.businessRole = this.businessRole;
72
157
  this.currentModalRef.componentInstance.currentUser = this.currentUser;
73
- this.currentModalRef.componentInstance.ownerUserIds = this.ownerUserIds;
74
- this.currentModalRef.componentInstance.regularUserIds = this.regularUserIds;
75
- this.currentModalRef.componentInstance.moderatorUserIds = this.moderatorUserIds;
76
- // Pass existing session ID if provided
77
- this.currentModalRef.componentInstance.existingSessionId = this.existingSessionId;
78
- this.currentModalRef.result.then(() => { this.currentModalRef = null; }, () => { this.currentModalRef = null; });
158
+ this.currentModalRef.result.then(() => {
159
+ this.currentModalRef = null;
160
+ }, () => {
161
+ this.currentModalRef = null;
162
+ });
79
163
  }
80
164
  openVideoCallModal(isReturningFromPip = false) {
81
165
  this.videoCallModalRef = this.modalService.open(TasVideocallComponent, {
82
166
  size: 'xl',
83
167
  windowClass: 'tas-video-modal',
84
168
  backdrop: 'static',
85
- keyboard: false
169
+ keyboard: false,
86
170
  });
87
171
  this.videoCallModalRef.componentInstance.sessionId = this.tasService.sessionId;
88
172
  this.videoCallModalRef.componentInstance.token = this.tasService.token;
173
+ this.videoCallModalRef.componentInstance.businessRole = this.businessRole;
89
174
  this.videoCallModalRef.componentInstance.isReturningFromPip = isReturningFromPip;
90
- this.videoCallModalRef.result.then(() => { this.videoCallModalRef = null; }, () => { this.videoCallModalRef = null; });
175
+ this.videoCallModalRef.result.then(() => {
176
+ this.videoCallModalRef = null;
177
+ }, () => {
178
+ this.videoCallModalRef = null;
179
+ });
91
180
  }
92
181
  }
93
- TasButtonComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TasButtonComponent, deps: [{ token: i1.NgbModal }, { token: i2.TasService }], target: i0.ɵɵFactoryTarget.Component });
94
- TasButtonComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TasButtonComponent, selector: "tas-btn", inputs: { appointmentId: "appointmentId", product: "product", tenantId: "tenantId", currentUser: "currentUser", ownerUserIds: "ownerUserIds", regularUserIds: "regularUserIds", moderatorUserIds: "moderatorUserIds", existingSessionId: "existingSessionId", buttonText: "buttonText" }, ngImport: i0, template: "<button\n\ttype=\"button\"\n\tclass=\"btn btn-primary tas-btn\"\n\t(click)=\"onClick()\"\n\t[disabled]=\"isLoading\"\n>\n\t<i class=\"fa fa-video-camera\" aria-hidden=\"true\" *ngIf=\"!isLoading\"></i>\n\t<span *ngIf=\"!isLoading\"> {{ buttonText }}</span>\n\t<span *ngIf=\"isLoading\"> Processing...</span>\n</button>\n", styles: [":host{display:inline-block}.tas-btn{background-color:#ee316b!important;color:#fff!important;border-color:#ee316b!important;margin-right:24px}.tas-btn:disabled{background-color:#ccc!important;border-color:#ccc!important;cursor:not-allowed}.tas-btn:hover:not(:disabled){background-color:#d62a5f!important;border-color:#d62a5f!important}.tas-btn i{margin-right:5px}\n"], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
95
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TasButtonComponent, decorators: [{
182
+ TasButtonComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TasButtonComponent, deps: [{ token: i1.NgbModal }, { token: i2.TasService }], target: i0.ɵɵFactoryTarget.Component });
183
+ TasButtonComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: TasButtonComponent, selector: "tas-btn", inputs: { roomType: "roomType", entityId: "entityId", tenant: "tenant", businessRole: "businessRole", currentUser: "currentUser", variant: "variant", buttonLabel: "buttonLabel" }, ngImport: i0, template: "<span\n [ngbTooltip]=\"isDisabled && disabledReason ? disabledReason : null\"\n container=\"body\"\n placement=\"top\"\n tooltipClass=\"tas-btn-tooltip\"\n>\n <button\n type=\"button\"\n class=\"btn btn-primary tas-btn\"\n [class.tas-btn--teal]=\"variant === 'teal'\"\n (click)=\"onClick()\"\n [disabled]=\"isDisabled\"\n >\n <i class=\"fa fa-video-camera\" aria-hidden=\"true\" *ngIf=\"!isLoading\"></i>\n <span *ngIf=\"!isLoading\">{{ buttonLabel }}</span>\n <span *ngIf=\"isLoading\">Processing...</span>\n </button>\n</span>\n", styles: [":host{display:inline-block}.tas-btn{background-color:#ee316b!important;color:#fff!important;border-color:#ee316b!important;margin-right:24px;display:flex;padding:6px 14px;justify-content:center;align-items:center;gap:7px;flex-shrink:0;flex-grow:0}.tas-btn:disabled{background-color:#ccc!important;border-color:#ccc!important;cursor:not-allowed}.tas-btn:hover:not(:disabled){background-color:#d62a5f!important;border-color:#d62a5f!important}.tas-btn i{margin-right:5px}.tas-btn--teal{background-color:#0097a7!important;border-color:#0097a7!important;border-radius:24px;padding:10px 24px;font-weight:500;margin-right:0}.tas-btn--teal:hover:not(:disabled){background-color:#00838f!important;border-color:#00838f!important}\n"], directives: [{ type: i1.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
184
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TasButtonComponent, decorators: [{
96
185
  type: Component,
97
- args: [{ selector: "tas-btn", template: "<button\n\ttype=\"button\"\n\tclass=\"btn btn-primary tas-btn\"\n\t(click)=\"onClick()\"\n\t[disabled]=\"isLoading\"\n>\n\t<i class=\"fa fa-video-camera\" aria-hidden=\"true\" *ngIf=\"!isLoading\"></i>\n\t<span *ngIf=\"!isLoading\"> {{ buttonText }}</span>\n\t<span *ngIf=\"isLoading\"> Processing...</span>\n</button>\n", styles: [":host{display:inline-block}.tas-btn{background-color:#ee316b!important;color:#fff!important;border-color:#ee316b!important;margin-right:24px}.tas-btn:disabled{background-color:#ccc!important;border-color:#ccc!important;cursor:not-allowed}.tas-btn:hover:not(:disabled){background-color:#d62a5f!important;border-color:#d62a5f!important}.tas-btn i{margin-right:5px}\n"] }]
98
- }], ctorParameters: function () { return [{ type: i1.NgbModal }, { type: i2.TasService }]; }, propDecorators: { appointmentId: [{
186
+ args: [{ selector: 'tas-btn', template: "<span\n [ngbTooltip]=\"isDisabled && disabledReason ? disabledReason : null\"\n container=\"body\"\n placement=\"top\"\n tooltipClass=\"tas-btn-tooltip\"\n>\n <button\n type=\"button\"\n class=\"btn btn-primary tas-btn\"\n [class.tas-btn--teal]=\"variant === 'teal'\"\n (click)=\"onClick()\"\n [disabled]=\"isDisabled\"\n >\n <i class=\"fa fa-video-camera\" aria-hidden=\"true\" *ngIf=\"!isLoading\"></i>\n <span *ngIf=\"!isLoading\">{{ buttonLabel }}</span>\n <span *ngIf=\"isLoading\">Processing...</span>\n </button>\n</span>\n", styles: [":host{display:inline-block}.tas-btn{background-color:#ee316b!important;color:#fff!important;border-color:#ee316b!important;margin-right:24px;display:flex;padding:6px 14px;justify-content:center;align-items:center;gap:7px;flex-shrink:0;flex-grow:0}.tas-btn:disabled{background-color:#ccc!important;border-color:#ccc!important;cursor:not-allowed}.tas-btn:hover:not(:disabled){background-color:#d62a5f!important;border-color:#d62a5f!important}.tas-btn i{margin-right:5px}.tas-btn--teal{background-color:#0097a7!important;border-color:#0097a7!important;border-radius:24px;padding:10px 24px;font-weight:500;margin-right:0}.tas-btn--teal:hover:not(:disabled){background-color:#00838f!important;border-color:#00838f!important}\n"] }]
187
+ }], ctorParameters: function () { return [{ type: i1.NgbModal }, { type: i2.TasService }]; }, propDecorators: { roomType: [{
99
188
  type: Input
100
- }], product: [{
189
+ }], entityId: [{
101
190
  type: Input
102
- }], tenantId: [{
191
+ }], tenant: [{
103
192
  type: Input
104
- }], currentUser: [{
193
+ }], businessRole: [{
105
194
  type: Input
106
- }], ownerUserIds: [{
107
- type: Input
108
- }], regularUserIds: [{
109
- type: Input
110
- }], moderatorUserIds: [{
195
+ }], currentUser: [{
111
196
  type: Input
112
- }], existingSessionId: [{
197
+ }], variant: [{
113
198
  type: Input
114
- }], buttonText: [{
199
+ }], buttonLabel: [{
115
200
  type: Input
116
201
  }] } });
117
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzLWJ0bi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9jb21wb25lbnRzL3Rhcy1idG4vdGFzLWJ0bi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9jb21wb25lbnRzL3Rhcy1idG4vdGFzLWJ0bi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFcEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQWtCLFFBQVEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDOzs7OztBQVFqRixNQUFNLE9BQU8sa0JBQWtCO0lBcUI5QixZQUNTLFlBQXNCLEVBQ3RCLFVBQXNCO1FBRHRCLGlCQUFZLEdBQVosWUFBWSxDQUFVO1FBQ3RCLGVBQVUsR0FBVixVQUFVLENBQVk7UUF0QnRCLGtCQUFhLEdBQVcsQ0FBQyxDQUFDO1FBQzFCLFlBQU8sR0FBVyxNQUFNLENBQUM7UUFDekIsYUFBUSxHQUFXLEVBQUUsQ0FBQztRQUd0QixtQkFBYyxHQUFhLEVBQUUsQ0FBQztRQUM5QixxQkFBZ0IsR0FBYSxFQUFFLENBQUM7UUFFekMsc0ZBQXNGO1FBQzdFLHNCQUFpQixHQUFXLEVBQUUsQ0FBQztRQUV4QyxtQ0FBbUM7UUFDMUIsZUFBVSxHQUFXLGFBQWEsQ0FBQztRQUVyQyxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBRWpCLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNuQyxvQkFB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QUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUdHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFHRyxVQUFVO3NCQUFsQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIE9uRGVzdHJveSwgSW5wdXQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgTmdiTW9kYWwsIE5nYk1vZGFsUmVmIH0gZnJvbSBcIkBuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXCI7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgVGFzQ3VycmVudFVzZXIsIFZpZXdNb2RlIH0gZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvdGFzLmludGVyZmFjZXNcIjtcbmltcG9ydCB7IFRhc1dhaXRpbmdSb29tQ29tcG9uZW50IH0gZnJvbSBcIi4uL3Rhcy13YWl0aW5nLXJvb20vdGFzLXdhaXRpbmctcm9vbS5jb21wb25lbnRcIjtcbmltcG9ydCB7IFRhc1ZpZGVvY2FsbENvbXBvbmVudCB9IGZyb20gXCIuLi90YXMtdmlkZW9jYWxsL3Rhcy12aWRlb2NhbGwuY29tcG9uZW50XCI7XG5pbXBvcnQgeyBUYXNTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL3Rhcy5zZXJ2aWNlXCI7XG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogXCJ0YXMtYnRuXCIsXG5cdHRlbXBsYXRlVXJsOiBcIi4vdGFzLWJ0bi5jb21wb25lbnQuaHRtbFwiLFxuXHRzdHlsZVVybHM6IFtcIi4vdGFzLWJ0bi5jb21wb25lbnQuc2Nzc1wiXSxcbn0pXG5leHBvcnQgY2xhc3MgVGFzQnV0dG9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXHRASW5wdXQoKSBhcHBvaW50bWVudElkOiBudW1iZXIgPSAxO1xuXHRASW5wdXQoKSBwcm9kdWN0OiBzdHJpbmcgPSBcInVlbGxcIjtcblx0QElucHV0KCkgdGVuYW50SWQ6IHN0cmluZyA9IFwiXCI7XG5cdEBJbnB1dCgpIGN1cnJlbnRVc2VyITogVGFzQ3VycmVudFVzZXI7XG5cdEBJbnB1dCgpIG93bmVyVXNlcklkcyE6IG51bWJlcltdO1xuXHRASW5wdXQoKSByZWd1bGFyVXNlcklkczogbnVtYmVyW10gPSBbXTtcblx0QElucHV0KCkgbW9kZXJhdG9yVXNlcklkczogbnVtYmVyW10gPSBbXTtcblx0XG5cdC8qKiBPcHRpb25hbDogSWYgcHJvdmlkZWQsIHNraXBzIHJvb20gY3JlYXRpb24gYW5kIGdvZXMgZGlyZWN0bHkgdG8gZ2V0dGluZyBhIHRva2VuICovXG5cdEBJbnB1dCgpIGV4aXN0aW5nU2Vzc2lvbklkOiBzdHJpbmcgPSBcIlwiO1xuXHRcblx0LyoqIE9wdGlvbmFsOiBDdXN0b20gYnV0dG9uIHRleHQgKi9cblx0QElucHV0KCkgYnV0dG9uVGV4dDogc3RyaW5nID0gXCJJbmljaWFyIFRBU1wiO1xuXHRcblx0cHVibGljIGlzTG9hZGluZyA9IGZhbHNlO1xuXHRcblx0cHJpdmF0ZSBzdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXHRwcml2YXRlIGN1cnJlbnRNb2RhbFJlZjogTmdiTW9kYWxSZWYgfCBudWxsID0gbnVsbDtcblx0cHJpdmF0ZSB2aWRlb0NhbGxNb2RhbFJlZjogTmdiTW9kYWxSZWYgfCBudWxsID0gbnVsbDtcblxuXHRjb25zdHJ1Y3Rvcihcblx0XHRwcml2YXRlIG1vZGFsU2VydmljZTogTmdiTW9kYWwsXG5cdFx0cHJpdmF0ZSB0YXNTZXJ2aWNlOiBUYXNTZXJ2aWNlXG5cdCkge31cblxuXHRuZ09uSW5pdCgpOiB2b2lkIHtcblx0XHRpZiAoIXRoaXMub3duZXJVc2VySWRzIHx8IHRoaXMub3duZXJVc2VySWRzLmxlbmd0aCAhPT0gMSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCd0YXMtYnRuOiBvd25lclVzZXJJZHMgaW5wdXQgaXMgcmVxdWlyZWQgYW5kIG11c3QgY29udGFpbiBleGFjdGx5IG9uZSB1c2VyJyk7XG5cdFx0fVxuXHRcdFxuXHRcdC8vIFN1YnNjcmliZSB0byB2aWV3TW9kZSB0byBoYW5kbGUgUGlQIHJldHVyblxuXHRcdHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG5cdFx0XHR0aGlzLnRhc1NlcnZpY2Uudmlld01vZGUkLnN1YnNjcmliZShtb2RlID0+IHtcblx0XHRcdFx0Ly8gUmVvcGVuIHZpZGVvIGNhbGwgbW9kYWwgd2hlbiByZXR1cm5pbmcgZnJvbSBQaVBcblx0XHRcdFx0aWYgKG1vZGUgPT09IFZpZXdNb2RlLkZVTExTQ1JFRU4gJiYgXG5cdFx0XHRcdFx0dGhpcy50YXNTZXJ2aWNlLmlzQ2FsbEFjdGl2ZSgpICYmIFxuXHRcdFx0XHRcdCF0aGlzLnZpZGVvQ2FsbE1vZGFsUmVmKSB7XG5cdFx0XHRcdFx0Y29uc3Qgc2Vzc2lvbklkID0gdGhpcy50YXNTZXJ2aWNlLnNlc3Npb25JZDtcblx0XHRcdFx0XHRjb25zdCB0b2tlbiA9IHRoaXMudGFzU2VydmljZS50b2tlbjtcblx0XHRcdFx0XHRpZiAoc2Vzc2lvbklkICYmIHRva2VuKSB7XG5cdFx0XHRcdFx0XHR0aGlzLm9wZW5WaWRlb0NhbGxNb2RhbCh0cnVlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0XG5cdFx0XHRcdC8vIFdoZW4gZW50ZXJpbmcgUGlQLCBjbGVhciB0aGUgdmlkZW9DYWxsTW9kYWxSZWYgc2luY2UgbW9kYWwgd2lsbCBjbG9zZVxuXHRcdFx0XHRpZiAobW9kZSA9PT0gVmlld01vZGUuUElQKSB7XG5cdFx0XHRcdFx0dGhpcy52aWRlb0NhbGxNb2RhbFJlZiA9IG51bGw7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0KTtcblx0fVxuXG5cdG5nT25EZXN0cm95KCk6IHZvaWQge1xuXHRcdHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuXHR9XG5cblx0b25DbGljaygpOiB2b2lkIHtcblx0XHRpZiAoIXRoaXMudGVuYW50SWQgfHwgIXRoaXMuY3VycmVudFVzZXI/Lm5hbWUpIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoXCJUZW5hbnQgSUQgb3IgY3VycmVudCB1c2VyIG5vdCBhdmFpbGFibGVcIik7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5vcGVuV2FpdGluZ1Jvb21Nb2RhbCgpO1xuXHR9XG5cblx0cHJpdmF0ZSBvcGVuV2FpdGluZ1Jvb21Nb2RhbCgpOiB2b2lkIHtcblx0XHR0aGlzLmN1cnJlbnRNb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oVGFzV2FpdGluZ1Jvb21Db21wb25lbnQsIHtcblx0XHRcdHNpemU6IFwibGdcIixcblx0XHRcdHdpbmRvd0NsYXNzOiBcInRhcy13YWl0aW5nLXJvb20tbW9kYWxcIixcblx0XHRcdGJhY2tkcm9wOiBcInN0YXRpY1wiLFxuXHRcdFx0a2V5Ym9hcmQ6IGZhbHNlLFxuXHRcdFx0Y2VudGVyZWQ6IHRydWVcblx0XHR9KTtcblxuXHRcdC8vIFBhc3MgYWxsIG5lY2Vzc2FyeSBpbnB1dHMgdG8gdGhlIHdhaXRpbmcgcm9vbSBjb21wb25lbnRcblx0XHR0aGlzLmN1cnJlbnRNb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5hcHBvaW50bWVudElkID0gdGhpcy5hcHBvaW50bWVudElkO1xuXHRcdHRoaXMuY3VycmVudE1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLnByb2R1Y3QgPSB0aGlzLnByb2R1Y3Q7XG5cdFx0dGhpcy5jdXJyZW50TW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UudGVuYW50SWQgPSB0aGlzLnRlbmFudElkO1xuXHRcdHRoaXMuY3VycmVudE1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmN1cnJlbnRVc2VyID0gdGhpcy5jdXJyZW50VXNlcjtcblx0XHR0aGlzLmN1cnJlbnRNb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5vd25lclVzZXJJZHMgPSB0aGlzLm93bmVyVXNlcklkcztcblx0XHR0aGlzLmN1cnJlbnRNb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5yZWd1bGFyVXNlcklkcyA9IHRoaXMucmVndWxhclVzZXJJZHM7XG5cdFx0dGhpcy5jdXJyZW50TW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UubW9kZXJhdG9yVXNlcklkcyA9IHRoaXMubW9kZXJhdG9yVXNlcklkcztcblx0XHRcblx0XHQvLyBQYXNzIGV4aXN0aW5nIHNlc3Npb24gSUQgaWYgcHJvdmlkZWRcblx0XHR0aGlzLmN1cnJlbnRNb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5leGlzdGluZ1Nlc3Npb25JZCA9IHRoaXMuZXhpc3RpbmdTZXNzaW9uSWQ7XG5cblx0XHR0aGlzLmN1cnJlbnRNb2RhbFJlZi5yZXN1bHQudGhlbihcblx0XHRcdCgpID0+IHsgdGhpcy5jdXJyZW50TW9kYWxSZWYgPSBudWxsOyB9LFxuXHRcdFx0KCkgPT4geyB0aGlzLmN1cnJlbnRNb2RhbFJlZiA9IG51bGw7IH1cblx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSBvcGVuVmlkZW9DYWxsTW9kYWwoaXNSZXR1cm5pbmdGcm9tUGlwOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcblx0XHR0aGlzLnZpZGVvQ2FsbE1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihUYXNWaWRlb2NhbGxDb21wb25lbnQsIHtcblx0XHRcdHNpemU6ICd4bCcsXG5cdFx0XHR3aW5kb3dDbGFzczogJ3Rhcy12aWRlby1tb2RhbCcsXG5cdFx0XHRiYWNrZHJvcDogJ3N0YXRpYycsXG5cdFx0XHRrZXlib2FyZDogZmFsc2Vcblx0XHR9KTtcblxuXHRcdHRoaXMudmlkZW9DYWxsTW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2Uuc2Vzc2lvbklkID0gdGhpcy50YXNTZXJ2aWNlLnNlc3Npb25JZDtcblx0XHR0aGlzLnZpZGVvQ2FsbE1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLnRva2VuID0gdGhpcy50YXNTZXJ2aWNlLnRva2VuO1xuXHRcdHRoaXMudmlkZW9DYWxsTW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuaXNSZXR1cm5pbmdGcm9tUGlwID0gaXNSZXR1cm5pbmdGcm9tUGlwO1xuXG5cdFx0dGhpcy52aWRlb0NhbGxNb2RhbFJlZi5yZXN1bHQudGhlbihcblx0XHRcdCgpID0+IHsgdGhpcy52aWRlb0NhbGxNb2RhbFJlZiA9IG51bGw7IH0sXG5cdFx0XHQoKSA9PiB7IHRoaXMudmlkZW9DYWxsTW9kYWxSZWYgPSBudWxsOyB9XG5cdFx0KTtcblx0fVxufVxuIiwiPGJ1dHRvblxuXHR0eXBlPVwiYnV0dG9uXCJcblx0Y2xhc3M9XCJidG4gYnRuLXByaW1hcnkgdGFzLWJ0blwiXG5cdChjbGljayk9XCJvbkNsaWNrKClcIlxuXHRbZGlzYWJsZWRdPVwiaXNMb2FkaW5nXCJcbj5cblx0PGkgY2xhc3M9XCJmYSBmYS12aWRlby1jYW1lcmFcIiBhcmlhLWhpZGRlbj1cInRydWVcIiAqbmdJZj1cIiFpc0xvYWRpbmdcIj48L2k+XG5cdDxzcGFuICpuZ0lmPVwiIWlzTG9hZGluZ1wiPiB7eyBidXR0b25UZXh0IH19PC9zcGFuPlxuXHQ8c3BhbiAqbmdJZj1cImlzTG9hZGluZ1wiPiBQcm9jZXNzaW5nLi4uPC9zcGFuPlxuPC9idXR0b24+XG4iXX0=
202
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzLWJ0bi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9jb21wb25lbnRzL3Rhcy1idG4vdGFzLWJ0bi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9jb21wb25lbnRzL3Rhcy1idG4vdGFzLWJ0bi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFcEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBRUwsV0FBVyxFQUNYLFFBQVEsRUFDUixlQUFlLEdBQ2hCLE1BQU0saUNBQWlDLENBQUM7QUFDekMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDekYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMENBQTBDLENBQUM7Ozs7O0FBUWpGLE1BQU0sT0FBTyxrQkFBa0I7SUF3RDdCLFlBQ1UsWUFBc0IsRUFDdEIsVUFBc0I7UUFEdEIsaUJBQVksR0FBWixZQUFZLENBQVU7UUFDdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQXpEaEMseUJBQXlCO1FBQ2hCLGFBQVEsR0FBZ0IsV0FBVyxDQUFDLEdBQUcsQ0FBQztRQUd4QyxpQkFBWSxHQUFvQixlQUFlLENBQUMsSUFBSSxDQUFDO1FBSzlELHNCQUFzQjtRQUNiLFlBQU8sR0FBdUIsU0FBUyxDQUFDO1FBQ3hDLGdCQUFXLEdBQVcsYUFBYSxDQUFDO1FBRXRDLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFFekIscUJBQXFCO1FBQ2QscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLHVCQUFrQixHQUFHLEVB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YSxrQkFBa0I7a0JBTDlCLFNBQVM7K0JBQ0UsU0FBUzt3SEFNVixRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBR0csV0FBVztzQkFBbkIsS0FBSztnQkFHRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBPbkRlc3Ryb3ksIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ2JNb2RhbCwgTmdiTW9kYWxSZWYgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIFRhc0N1cnJlbnRVc2VyLFxuICBUYXNSb29tVHlwZSxcbiAgVmlld01vZGUsXG4gIFRhc0J1c2luZXNzUm9sZSxcbn0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy90YXMuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBUYXNXYWl0aW5nUm9vbUNvbXBvbmVudCB9IGZyb20gJy4uL3Rhcy13YWl0aW5nLXJvb20vdGFzLXdhaXRpbmctcm9vbS5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGFzVmlkZW9jYWxsQ29tcG9uZW50IH0gZnJvbSAnLi4vdGFzLXZpZGVvY2FsbC90YXMtdmlkZW9jYWxsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUYXNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdGFzLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0YXMtYnRuJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Rhcy1idG4uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90YXMtYnRuLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFRhc0J1dHRvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgLy8gU3RhdHVzIGVuZHBvaW50IHBhcmFtc1xuICBASW5wdXQoKSByb29tVHlwZTogVGFzUm9vbVR5cGUgPSBUYXNSb29tVHlwZS5UQVM7XG4gIEBJbnB1dCgpIGVudGl0eUlkITogbnVtYmVyO1xuICBASW5wdXQoKSB0ZW5hbnQhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGJ1c2luZXNzUm9sZTogVGFzQnVzaW5lc3NSb2xlID0gVGFzQnVzaW5lc3NSb2xlLlVTRVI7XG5cbiAgLy8gVXNlciBpbmZvIGZvciB0b2tlbiByZXF1ZXN0XG4gIEBJbnB1dCgpIGN1cnJlbnRVc2VyITogVGFzQ3VycmVudFVzZXI7XG5cbiAgLy8gU3R5bGUgY3VzdG9taXphdGlvblxuICBASW5wdXQoKSB2YXJpYW50OiAnZGVmYXVsdCcgfCAndGVhbCcgPSAnZGVmYXVsdCc7XG4gIEBJbnB1dCgpIGJ1dHRvbkxhYmVsOiBzdHJpbmcgPSAnSW5pY2lhciBUQVMnO1xuXG4gIHB1YmxpYyBpc0xvYWRpbmcgPSBmYWxzZTtcblxuICAvLyBTdGF0dXMgY2hlY2sgc3RhdGVcbiAgcHVibGljIGlzQ2hlY2tpbmdTdGF0dXMgPSBmYWxzZTtcbiAgcHVibGljIGlzU3RhdHVzRXJyb3IgPSBmYWxzZTtcbiAgcHVibGljIHN0YXR1c0Vycm9yTWVzc2FnZSA9ICcnO1xuICBwdWJsaWMgaXNKb2luYWJsZSA9IGZhbHNlOyAvLyBUcmFja3Mgam9pbmFibGUgZmllbGQgZnJvbSBzdGF0dXMgcmVzcG9uc2VcblxuICBwcml2YXRlIHN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHByaXZhdGUgY3VycmVudE1vZGFsUmVmOiBOZ2JNb2RhbFJlZiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHZpZGVvQ2FsbE1vZGFsUmVmOiBOZ2JNb2RhbFJlZiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHN0YXR1c1BvbGxpbmdJbnRlcnZhbDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgU1RBVFVTX1BPTExfSU5URVJWQUxfTVMgPSAzMDAwMDsgLy8gMzAgc2Vjb25kc1xuXG4gIC8qKiBXaGV0aGVyIHVzZXIgaXMgYmFja29mZmljZSAob3IgYWRtaW4vbWFuYWdlcikgKi9cbiAgcHVibGljIGdldCBpc0JhY2tvZmZpY2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuYnVzaW5lc3NSb2xlID09PSBUYXNCdXNpbmVzc1JvbGUuQkFDS09GRklDRSB8fFxuICAgICAgdGhpcy5idXNpbmVzc1JvbGUgPT09IFRhc0J1c2luZXNzUm9sZS5BRE1JTl9NQU5BR0VSIHx8XG4gICAgICB0aGlzLmJ1c2luZXNzUm9sZSA9PT0gVGFzQnVzaW5lc3NSb2xlLk1BTkFHRVJcbiAgICApO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIGJ1dHRvbiBzaG91bGQgYmUgZGlzYWJsZWQgKi9cbiAgcHVibGljIGdldCBpc0Rpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzTG9hZGluZyB8fCB0aGlzLmlzU3RhdHVzRXJyb3IgfHwgIXRoaXMuaXNKb2luYWJsZTtcbiAgfVxuXG4gIC8qKiBSZWFzb24gd2h5IHRoZSBidXR0b24gaXMgZGlzYWJsZWQgKGZvciB0b29sdGlwKSAqL1xuICBwdWJsaWMgZ2V0IGRpc2FibGVkUmVhc29uKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzU3RhdHVzRXJyb3IpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0YXR1c0Vycm9yTWVzc2FnZSB8fCAnRXJyb3IgYWwgdmVyaWZpY2FyIGVsIGVzdGFkbyc7XG4gICAgfVxuICAgIGlmICghdGhpcy5pc0pvaW5hYmxlKSB7XG4gICAgICByZXR1cm4gJ1RvZGF2w61hIG5vIGVzIGVsIGhvcmFyaW8gZGUgbGEgbGxhbWFkYSc7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbCxcbiAgICBwcml2YXRlIHRhc1NlcnZpY2U6IFRhc1NlcnZpY2VcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIFN1YnNjcmliZSB0byB2aWV3TW9kZSB0byBoYW5kbGUgUGlQIHJldHVyblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLnRhc1NlcnZpY2Uudmlld01vZGUkLnN1YnNjcmliZSgobW9kZSkgPT4ge1xuICAgICAgICAvLyBXaGVuIGVudGVyaW5nIFBpUCwgY2xlYXIgdGhlIHZpZGVvQ2FsbE1vZGFsUmVmIHNpbmNlIG1vZGFsIHdpbGwgY2xvc2VcbiAgICAgICAgaWYgKG1vZGUgPT09IFZpZXdNb2RlLlBJUCkge1xuICAgICAgICAgIHRoaXMudmlkZW9DYWxsTW9kYWxSZWYgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBTdGFydCBzdGF0dXMgY2hlY2tpbmdcbiAgICB0aGlzLnN0YXJ0U3RhdHVzUG9sbGluZygpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5zdG9wU3RhdHVzUG9sbGluZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IHBvbGxpbmcgc3RhdHVzIGV2ZXJ5IDMwIHNlY29uZHNcbiAgICovXG4gIHByaXZhdGUgc3RhcnRTdGF0dXNQb2xsaW5nKCk6IHZvaWQge1xuICAgIC8vIEluaXRpYWwgc3RhdHVzIGNoZWNrXG4gICAgdGhpcy5jaGVja1N0YXR1cygpO1xuXG4gICAgLy8gU2V0IHVwIHBlcmlvZGljIHBvbGxpbmdcbiAgICB0aGlzLnN0YXR1c1BvbGxpbmdJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHRoaXMuY2hlY2tTdGF0dXMoKTtcbiAgICB9LCB0aGlzLlNUQVRVU19QT0xMX0lOVEVSVkFMX01TKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIHN0YXR1cyBwb2xsaW5nXG4gICAqL1xuICBwcml2YXRlIHN0b3BTdGF0dXNQb2xsaW5nKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnN0YXR1c1BvbGxpbmdJbnRlcnZhbCkge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLnN0YXR1c1BvbGxpbmdJbnRlcnZhbCk7XG4gICAgICB0aGlzLnN0YXR1c1BvbGxpbmdJbnRlcnZhbCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHN0YXR1cyBlbmRwb2ludCB0byBkZXRlcm1pbmUgaWYgYnV0dG9uIHNob3VsZCBiZSBlbmFibGVkXG4gICAqL1xuICBwcml2YXRlIGNoZWNrU3RhdHVzKCk6IHZvaWQge1xuICAgIC8vIFNraXAgaWYgcmVxdWlyZWQgaW5wdXRzIGFyZSBub3QgYXZhaWxhYmxlXG4gICAgaWYgKCF0aGlzLnRlbmFudCB8fCAhdGhpcy5lbnRpdHlJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNDaGVja2luZ1N0YXR1cyA9IHRydWU7XG4gICAgdGhpcy5zdGF0dXNFcnJvck1lc3NhZ2UgPSAnJztcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLnRhc1NlcnZpY2UuZ2V0UHJveHlWaWRlb1N0YXR1cyh7XG4gICAgICAgIHJvb21UeXBlOiB0aGlzLnJvb21UeXBlLFxuICAgICAgICBlbnRpdHlJZDogdGhpcy5lbnRpdHlJZCxcbiAgICAgICAgdGVuYW50OiB0aGlzLnRlbmFudCxcbiAgICAgICAgYnVzaW5lc3NSb2xlOiB0aGlzLmJ1c2luZXNzUm9sZSxcbiAgICAgIH0pLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgcmVzcG9uc2UgaXMgYWN0dWFsbHkgYW4gZXJyb3IgKHNvbWUgSFRUUCBhZGFwdGVycyByZXR1cm4gZXJyb3JzIGluIG5leHQpXG4gICAgICAgICAgLy8gQWxzbyBjaGVjayBmb3IgdW5kZWZpbmVkL251bGwgb3IgbWlzc2luZyBjb250ZW50XG4gICAgICAgICAgY29uc3QgaXNFcnJvclJlc3BvbnNlID0gIXJlc3BvbnNlIHx8IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFyZXNwb25zZS5jb250ZW50IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2U/Lm9rID09PSBmYWxzZSB8fCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZT8uc3RhdHVzID49IDQwMCB8fCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZT8uZXJyb3IgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZT8ubmFtZSA9PT0gJ0h0dHBFcnJvclJlc3BvbnNlJztcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAoaXNFcnJvclJlc3BvbnNlKSB7XG4gICAgICAgICAgICB0aGlzLmlzQ2hlY2tpbmdTdGF0dXMgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuaXNTdGF0dXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnN0YXR1c0Vycm9yTWVzc2FnZSA9IHJlc3BvbnNlPy5lcnJvcj8ubWVzc2FnZSB8fCByZXNwb25zZT8ubWVzc2FnZSB8fCAnRXJyb3IgY2hlY2tpbmcgc3RhdHVzJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pc0NoZWNraW5nU3RhdHVzID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmlzU3RhdHVzRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzRXJyb3JNZXNzYWdlID0gJyc7XG4gICAgICAgICAgICAvLyBVcGRhdGUgam9pbmFibGUgc3RhdGUgZnJvbSByZXNwb25zZVxuICAgICAgICAgICAgdGhpcy5pc0pvaW5hYmxlID0gcmVzcG9uc2UuY29udGVudD8uam9pbmFibGUgPz8gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICAgIHRoaXMuaXNDaGVja2luZ1N0YXR1cyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuaXNTdGF0dXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgdGhpcy5zdGF0dXNFcnJvck1lc3NhZ2UgPSBlcnI/LmVycm9yPy5tZXNzYWdlIHx8IGVycj8ubWVzc2FnZSB8fCAnRXJyb3IgY2hlY2tpbmcgc3RhdHVzJztcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIG9uQ2xpY2soKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRlbmFudCB8fCAhdGhpcy5jdXJyZW50VXNlcj8ubmFtZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5lbnRpdHlJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMub3BlbldhaXRpbmdSb29tTW9kYWwoKTtcbiAgfVxuXG4gIHByaXZhdGUgb3BlbldhaXRpbmdSb29tTW9kYWwoKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50TW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKFRhc1dhaXRpbmdSb29tQ29tcG9uZW50LCB7XG4gICAgICBzaXplOiAnbGcnLFxuICAgICAgd2luZG93Q2xhc3M6ICd0YXMtd2FpdGluZy1yb29tLW1vZGFsJyxcbiAgICAgIGJhY2tkcm9wOiAnc3RhdGljJyxcbiAgICAgIGtleWJvYXJkOiBmYWxzZSxcbiAgICAgIGNlbnRlcmVkOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgLy8gUGFzcyBhbGwgbmVjZXNzYXJ5IGlucHV0cyB0byB0aGUgd2FpdGluZyByb29tIGNvbXBvbmVudFxuICAgIHRoaXMuY3VycmVudE1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLnJvb21UeXBlID0gdGhpcy5yb29tVHlwZTtcbiAgICB0aGlzLmN1cnJlbnRNb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5lbnRpdHlJZCA9IHRoaXMuZW50aXR5SWQ7XG4gICAgdGhpcy5jdXJyZW50TW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UudGVuYW50ID0gdGhpcy50ZW5hbnQ7XG4gICAgdGhpcy5jdXJyZW50TW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuYnVzaW5lc3NSb2xlID0gdGhpcy5idXNpbmVzc1JvbGU7XG4gICAgdGhpcy5jdXJyZW50TW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuY3VycmVudFVzZXIgPSB0aGlzLmN1cnJlbnRVc2VyO1xuXG4gICAgdGhpcy5jdXJyZW50TW9kYWxSZWYucmVzdWx0LnRoZW4oXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMuY3VycmVudE1vZGFsUmVmID0gbnVsbDtcbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMuY3VycmVudE1vZGFsUmVmID0gbnVsbDtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuVmlkZW9DYWxsTW9kYWwoaXNSZXR1cm5pbmdGcm9tUGlwOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICB0aGlzLnZpZGVvQ2FsbE1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihUYXNWaWRlb2NhbGxDb21wb25lbnQsIHtcbiAgICAgIHNpemU6ICd4bCcsXG4gICAgICB3aW5kb3dDbGFzczogJ3Rhcy12aWRlby1tb2RhbCcsXG4gICAgICBiYWNrZHJvcDogJ3N0YXRpYycsXG4gICAgICBrZXlib2FyZDogZmFsc2UsXG4gICAgfSk7XG5cbiAgICB0aGlzLnZpZGVvQ2FsbE1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLnNlc3Npb25JZCA9IHRoaXMudGFzU2VydmljZS5zZXNzaW9uSWQ7XG4gICAgdGhpcy52aWRlb0NhbGxNb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS50b2tlbiA9IHRoaXMudGFzU2VydmljZS50b2tlbjtcbiAgICB0aGlzLnZpZGVvQ2FsbE1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmJ1c2luZXNzUm9sZSA9IHRoaXMuYnVzaW5lc3NSb2xlO1xuICAgIHRoaXMudmlkZW9DYWxsTW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuaXNSZXR1cm5pbmdGcm9tUGlwID0gaXNSZXR1cm5pbmdGcm9tUGlwO1xuXG4gICAgdGhpcy52aWRlb0NhbGxNb2RhbFJlZi5yZXN1bHQudGhlbihcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy52aWRlb0NhbGxNb2RhbFJlZiA9IG51bGw7XG4gICAgICB9LFxuICAgICAgKCkgPT4ge1xuICAgICAgICB0aGlzLnZpZGVvQ2FsbE1vZGFsUmVmID0gbnVsbDtcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG4iLCI8c3BhblxuICBbbmdiVG9vbHRpcF09XCJpc0Rpc2FibGVkICYmIGRpc2FibGVkUmVhc29uID8gZGlzYWJsZWRSZWFzb24gOiBudWxsXCJcbiAgY29udGFpbmVyPVwiYm9keVwiXG4gIHBsYWNlbWVudD1cInRvcFwiXG4gIHRvb2x0aXBDbGFzcz1cInRhcy1idG4tdG9vbHRpcFwiXG4+XG4gIDxidXR0b25cbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSB0YXMtYnRuXCJcbiAgICBbY2xhc3MudGFzLWJ0bi0tdGVhbF09XCJ2YXJpYW50ID09PSAndGVhbCdcIlxuICAgIChjbGljayk9XCJvbkNsaWNrKClcIlxuICAgIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkXCJcbiAgPlxuICAgIDxpIGNsYXNzPVwiZmEgZmEtdmlkZW8tY2FtZXJhXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgKm5nSWY9XCIhaXNMb2FkaW5nXCI+PC9pPlxuICAgIDxzcGFuICpuZ0lmPVwiIWlzTG9hZGluZ1wiPnt7IGJ1dHRvbkxhYmVsIH19PC9zcGFuPlxuICAgIDxzcGFuICpuZ0lmPVwiaXNMb2FkaW5nXCI+UHJvY2Vzc2luZy4uLjwvc3Bhbj5cbiAgPC9idXR0b24+XG48L3NwYW4+XG4iXX0=
@@ -1,15 +1,19 @@
1
1
  import { Component } from '@angular/core';
2
2
  import { CallState, ViewMode } from '../../interfaces/tas.interfaces';
3
+ import { TasVideocallComponent } from '../tas-videocall/tas-videocall.component';
3
4
  import { Subscription } from 'rxjs';
4
5
  import interact from 'interactjs';
5
6
  import * as i0 from "@angular/core";
6
7
  import * as i1 from "../../services/tas.service";
8
+ import * as i2 from "@ng-bootstrap/ng-bootstrap";
7
9
  export class TasFloatingCallComponent {
8
- constructor(tasService) {
10
+ constructor(tasService, modalService) {
9
11
  this.tasService = tasService;
12
+ this.modalService = modalService;
10
13
  this.isVisible = false;
11
14
  this.isMuted = false;
12
15
  this.subscriptions = new Subscription();
16
+ this.videoCallModalRef = null;
13
17
  // Margin from screen edges (in pixels)
14
18
  this.PIP_MARGIN = 20;
15
19
  }
@@ -22,6 +26,7 @@ export class TasFloatingCallComponent {
22
26
  }
23
27
  // Public Methods
24
28
  onExpand() {
29
+ this.openVideoCallModal(true);
25
30
  this.tasService.exitPipMode();
26
31
  }
27
32
  onHangUp() {
@@ -33,23 +38,45 @@ export class TasFloatingCallComponent {
33
38
  // Private Methods
34
39
  setupSubscriptions() {
35
40
  // Call state subscription
36
- this.subscriptions.add(this.tasService.callState$.subscribe(state => {
41
+ this.subscriptions.add(this.tasService.callState$.subscribe((state) => {
37
42
  if (state === CallState.DISCONNECTED) {
38
43
  this.isVisible = false;
39
44
  }
40
45
  }));
41
46
  // View mode subscription
42
- this.subscriptions.add(this.tasService.viewMode$.subscribe(mode => {
47
+ this.subscriptions.add(this.tasService.viewMode$.subscribe((mode) => {
43
48
  this.isVisible = mode === ViewMode.PIP && this.tasService.isCallActive();
44
49
  if (this.isVisible) {
45
50
  setTimeout(() => this.initInteract(), 100);
51
+ // Clear modal ref if we enter PiP mode (modal closes itself)
52
+ this.videoCallModalRef = null;
46
53
  }
47
54
  }));
48
55
  // Mute state subscription
49
- this.subscriptions.add(this.tasService.isMuted$.subscribe(muted => {
56
+ this.subscriptions.add(this.tasService.isMuted$.subscribe((muted) => {
50
57
  this.isMuted = muted;
51
58
  }));
52
59
  }
60
+ openVideoCallModal(isReturningFromPip = false) {
61
+ if (this.videoCallModalRef) {
62
+ return;
63
+ }
64
+ this.videoCallModalRef = this.modalService.open(TasVideocallComponent, {
65
+ size: 'xl',
66
+ windowClass: 'tas-video-modal',
67
+ backdrop: 'static',
68
+ keyboard: false,
69
+ });
70
+ this.videoCallModalRef.componentInstance.sessionId = this.tasService.sessionId;
71
+ this.videoCallModalRef.componentInstance.token = this.tasService.token;
72
+ this.videoCallModalRef.componentInstance.businessRole = this.tasService.businessRole;
73
+ this.videoCallModalRef.componentInstance.isReturningFromPip = isReturningFromPip;
74
+ this.videoCallModalRef.result.then(() => {
75
+ this.videoCallModalRef = null;
76
+ }, () => {
77
+ this.videoCallModalRef = null;
78
+ });
79
+ }
53
80
  initInteract() {
54
81
  interact('.tas-floating-container').unset();
55
82
  // Create restriction area with margin
@@ -60,17 +87,15 @@ export class TasFloatingCallComponent {
60
87
  left: margin,
61
88
  top: margin,
62
89
  right: window.innerWidth - margin,
63
- bottom: window.innerHeight - margin
90
+ bottom: window.innerHeight - margin,
64
91
  };
65
92
  },
66
- elementRect: { left: 0, right: 1, top: 0, bottom: 1 }
93
+ elementRect: { left: 0, right: 1, top: 0, bottom: 1 },
67
94
  };
68
95
  interact('.tas-floating-container')
69
96
  .draggable({
70
97
  inertia: true,
71
- modifiers: [
72
- interact.modifiers.restrict(restrictToBodyWithMargin)
73
- ],
98
+ modifiers: [interact.modifiers.restrict(restrictToBodyWithMargin)],
74
99
  autoScroll: false,
75
100
  listeners: {
76
101
  move: (event) => {
@@ -80,8 +105,8 @@ export class TasFloatingCallComponent {
80
105
  target.style.transform = `translate(${x}px, ${y}px)`;
81
106
  target.setAttribute('data-x', String(x));
82
107
  target.setAttribute('data-y', String(y));
83
- }
84
- }
108
+ },
109
+ },
85
110
  })
86
111
  .resizable({
87
112
  edges: { left: false, right: true, bottom: true, top: false },
@@ -99,7 +124,7 @@ export class TasFloatingCallComponent {
99
124
  target.style.transform = `translate(${x}px, ${y}px)`;
100
125
  target.setAttribute('data-x', String(x));
101
126
  target.setAttribute('data-y', String(y));
102
- }
127
+ },
103
128
  },
104
129
  modifiers: [
105
130
  interact.modifiers.restrictEdges({
@@ -107,23 +132,23 @@ export class TasFloatingCallComponent {
107
132
  left: margin,
108
133
  top: margin,
109
134
  right: window.innerWidth - margin,
110
- bottom: window.innerHeight - margin
111
- }
135
+ bottom: window.innerHeight - margin,
136
+ },
112
137
  }),
113
138
  interact.modifiers.restrictSize({
114
139
  min: { width: 200, height: 130 },
115
- max: { width: 500, height: 350 }
140
+ max: { width: 500, height: 350 },
116
141
  }),
117
- interact.modifiers.aspectRatio({ ratio: 'preserve' })
142
+ interact.modifiers.aspectRatio({ ratio: 'preserve' }),
118
143
  ],
119
- inertia: true
144
+ inertia: true,
120
145
  });
121
146
  }
122
147
  }
123
- TasFloatingCallComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TasFloatingCallComponent, deps: [{ token: i1.TasService }], target: i0.ɵɵFactoryTarget.Component });
124
- TasFloatingCallComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TasFloatingCallComponent, selector: "tas-floating-call", ngImport: i0, template: "<div class=\"tas-floating-container\" [class.visible]=\"isVisible\">\n\t<!-- Video content area - shows main video only -->\n\t<div class=\"floating-content\">\n\t\t<!-- Main video container (subscriber if available, otherwise publisher) -->\n\t\t<div id=\"pip-main-video\" class=\"pip-main-video\"></div>\n\n\t\t<!-- Bottom controls -->\n\t\t<div class=\"floating-controls\">\n\t\t\t<button class=\"action-btn expand-btn\" (click)=\"onExpand()\" title=\"Expand to fullscreen\">\n\t\t\t\t<i class=\"fa fa-expand\"></i>\n\t\t\t</button>\n\t\t\t<button class=\"action-btn mute-btn\" [class.muted]=\"isMuted\" (click)=\"toggleMute()\" [title]=\"isMuted ? 'Unmute microphone' : 'Mute microphone'\">\n\t\t\t\t<i class=\"fa\" [class.fa-microphone]=\"!isMuted\" [class.fa-microphone-slash]=\"isMuted\"></i>\n\t\t\t</button>\n\t\t\t<button class=\"action-btn hangup-btn\" (click)=\"onHangUp()\" title=\"Hang up call\">\n\t\t\t\t<i class=\"fa fa-phone\" style=\"transform: rotate(135deg);\"></i>\n\t\t\t</button>\n\t\t</div>\n\t</div>\n</div>\n\n", styles: [".tas-floating-container{position:fixed;bottom:20px;right:20px;width:280px;height:180px;background:#000;border-radius:12px;box-shadow:0 8px 32px #00000080;z-index:9999;overflow:hidden;touch-action:none;-webkit-user-select:none;user-select:none;transition:opacity .3s ease,visibility .3s ease,box-shadow .2s ease;opacity:0;visibility:hidden;pointer-events:none}.tas-floating-container.visible{opacity:1;visibility:visible;pointer-events:auto}.tas-floating-container:hover{box-shadow:0 8px 32px #00000080,0 0 0 2px #ffffff4d}.floating-content{position:relative;width:100%;height:100%;overflow:hidden}.pip-main-video{position:absolute;top:0;left:0;width:100%;height:100%;background:#000}.pip-main-video ::ng-deep video{width:100%;height:100%;object-fit:cover}.pip-main-video ::ng-deep .OT_subscriber,.pip-main-video ::ng-deep .OT_publisher{width:100%!important;height:100%!important}.pip-main-video ::ng-deep .OT_edge-bar-item,.pip-main-video ::ng-deep .OT_mute,.pip-main-video ::ng-deep .OT_audio-level-meter,.pip-main-video ::ng-deep .OT_bar,.pip-main-video ::ng-deep .OT_name{display:none!important}.floating-controls{position:absolute;bottom:10px;left:50%;transform:translate(-50%);display:flex;gap:12px;padding:6px 14px;background:rgba(0,0,0,.7);border-radius:24px;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);opacity:0;visibility:hidden;transition:opacity .3s ease,visibility .3s ease}.tas-floating-container:hover .floating-controls{opacity:1;visibility:visible}.action-btn{width:32px;height:32px;border:none;border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:13px;transition:all .2s ease}.action-btn.expand-btn{background:rgba(255,255,255,.2);color:#fff}.action-btn.expand-btn:hover{background:rgba(255,255,255,.35);transform:scale(1.1)}.action-btn.mute-btn{background:rgba(255,255,255,.2);color:#fff}.action-btn.mute-btn:hover{background:rgba(255,255,255,.35);transform:scale(1.1)}.action-btn.mute-btn.muted{background:#f39c12;color:#fff}.action-btn.mute-btn.muted:hover{background:#e67e22}.action-btn.hangup-btn{background:#dc3545;color:#fff}.action-btn.hangup-btn:hover{background:#c82333;transform:scale(1.1)}\n"] });
125
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TasFloatingCallComponent, decorators: [{
148
+ TasFloatingCallComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TasFloatingCallComponent, deps: [{ token: i1.TasService }, { token: i2.NgbModal }], target: i0.ɵɵFactoryTarget.Component });
149
+ TasFloatingCallComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: TasFloatingCallComponent, selector: "tas-floating-call", ngImport: i0, template: "<div class=\"tas-floating-container\" [class.visible]=\"isVisible\">\n <!-- Video content area - shows main video only -->\n <div class=\"floating-content\">\n <!-- Main video container (subscriber if available, otherwise publisher) -->\n <div id=\"pip-main-video\" class=\"pip-main-video\"></div>\n\n <!-- Bottom controls -->\n <div class=\"floating-controls\">\n <button\n class=\"action-btn expand-btn\"\n (click)=\"onExpand()\"\n title=\"Expand to fullscreen\"\n >\n <i class=\"fa fa-expand\"></i>\n </button>\n <button\n class=\"action-btn mute-btn\"\n [class.muted]=\"isMuted\"\n (click)=\"toggleMute()\"\n [title]=\"isMuted ? 'Unmute microphone' : 'Mute microphone'\"\n >\n <i\n class=\"fa\"\n [class.fa-microphone]=\"!isMuted\"\n [class.fa-microphone-slash]=\"isMuted\"\n ></i>\n </button>\n <button class=\"action-btn hangup-btn\" (click)=\"onHangUp()\" title=\"Hang up call\">\n <i class=\"fa fa-phone\" style=\"transform: rotate(135deg)\"></i>\n </button>\n </div>\n </div>\n</div>\n", styles: [".tas-floating-container{position:fixed;bottom:20px;right:20px;width:280px;height:180px;background:#000;border-radius:12px;box-shadow:0 8px 32px #00000080;z-index:9999;overflow:hidden;touch-action:none;-webkit-user-select:none;user-select:none;transition:opacity .3s ease,visibility .3s ease,box-shadow .2s ease;opacity:0;visibility:hidden;pointer-events:none}.tas-floating-container.visible{opacity:1;visibility:visible;pointer-events:auto}.tas-floating-container:hover{box-shadow:0 8px 32px #00000080,0 0 0 2px #ffffff4d}.floating-content{position:relative;width:100%;height:100%;overflow:hidden}.pip-main-video{position:absolute;top:0;left:0;width:100%;height:100%;background:#000}.pip-main-video ::ng-deep video{width:100%;height:100%;object-fit:cover}.pip-main-video ::ng-deep .OT_subscriber,.pip-main-video ::ng-deep .OT_publisher{width:100%!important;height:100%!important}.pip-main-video ::ng-deep .OT_edge-bar-item,.pip-main-video ::ng-deep .OT_mute,.pip-main-video ::ng-deep .OT_audio-level-meter,.pip-main-video ::ng-deep .OT_bar,.pip-main-video ::ng-deep .OT_name{display:none!important}.floating-controls{position:absolute;bottom:10px;left:50%;transform:translate(-50%);display:flex;gap:12px;padding:6px 14px;background:rgba(0,0,0,.7);border-radius:24px;backdrop-filter:blur(8px);opacity:0;visibility:hidden;transition:opacity .3s ease,visibility .3s ease}.tas-floating-container:hover .floating-controls{opacity:1;visibility:visible}.action-btn{width:32px;height:32px;border:none;border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:13px;transition:all .2s ease}.action-btn.expand-btn{background:rgba(255,255,255,.2);color:#fff}.action-btn.expand-btn:hover{background:rgba(255,255,255,.35);transform:scale(1.1)}.action-btn.mute-btn{background:rgba(255,255,255,.2);color:#fff}.action-btn.mute-btn:hover{background:rgba(255,255,255,.35);transform:scale(1.1)}.action-btn.mute-btn.muted{background:#f39c12;color:#fff}.action-btn.mute-btn.muted:hover{background:#e67e22}.action-btn.hangup-btn{background:#dc3545;color:#fff}.action-btn.hangup-btn:hover{background:#c82333;transform:scale(1.1)}\n"] });
150
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TasFloatingCallComponent, decorators: [{
126
151
  type: Component,
127
- args: [{ selector: 'tas-floating-call', template: "<div class=\"tas-floating-container\" [class.visible]=\"isVisible\">\n\t<!-- Video content area - shows main video only -->\n\t<div class=\"floating-content\">\n\t\t<!-- Main video container (subscriber if available, otherwise publisher) -->\n\t\t<div id=\"pip-main-video\" class=\"pip-main-video\"></div>\n\n\t\t<!-- Bottom controls -->\n\t\t<div class=\"floating-controls\">\n\t\t\t<button class=\"action-btn expand-btn\" (click)=\"onExpand()\" title=\"Expand to fullscreen\">\n\t\t\t\t<i class=\"fa fa-expand\"></i>\n\t\t\t</button>\n\t\t\t<button class=\"action-btn mute-btn\" [class.muted]=\"isMuted\" (click)=\"toggleMute()\" [title]=\"isMuted ? 'Unmute microphone' : 'Mute microphone'\">\n\t\t\t\t<i class=\"fa\" [class.fa-microphone]=\"!isMuted\" [class.fa-microphone-slash]=\"isMuted\"></i>\n\t\t\t</button>\n\t\t\t<button class=\"action-btn hangup-btn\" (click)=\"onHangUp()\" title=\"Hang up call\">\n\t\t\t\t<i class=\"fa fa-phone\" style=\"transform: rotate(135deg);\"></i>\n\t\t\t</button>\n\t\t</div>\n\t</div>\n</div>\n\n", styles: [".tas-floating-container{position:fixed;bottom:20px;right:20px;width:280px;height:180px;background:#000;border-radius:12px;box-shadow:0 8px 32px #00000080;z-index:9999;overflow:hidden;touch-action:none;-webkit-user-select:none;user-select:none;transition:opacity .3s ease,visibility .3s ease,box-shadow .2s ease;opacity:0;visibility:hidden;pointer-events:none}.tas-floating-container.visible{opacity:1;visibility:visible;pointer-events:auto}.tas-floating-container:hover{box-shadow:0 8px 32px #00000080,0 0 0 2px #ffffff4d}.floating-content{position:relative;width:100%;height:100%;overflow:hidden}.pip-main-video{position:absolute;top:0;left:0;width:100%;height:100%;background:#000}.pip-main-video ::ng-deep video{width:100%;height:100%;object-fit:cover}.pip-main-video ::ng-deep .OT_subscriber,.pip-main-video ::ng-deep .OT_publisher{width:100%!important;height:100%!important}.pip-main-video ::ng-deep .OT_edge-bar-item,.pip-main-video ::ng-deep .OT_mute,.pip-main-video ::ng-deep .OT_audio-level-meter,.pip-main-video ::ng-deep .OT_bar,.pip-main-video ::ng-deep .OT_name{display:none!important}.floating-controls{position:absolute;bottom:10px;left:50%;transform:translate(-50%);display:flex;gap:12px;padding:6px 14px;background:rgba(0,0,0,.7);border-radius:24px;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);opacity:0;visibility:hidden;transition:opacity .3s ease,visibility .3s ease}.tas-floating-container:hover .floating-controls{opacity:1;visibility:visible}.action-btn{width:32px;height:32px;border:none;border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:13px;transition:all .2s ease}.action-btn.expand-btn{background:rgba(255,255,255,.2);color:#fff}.action-btn.expand-btn:hover{background:rgba(255,255,255,.35);transform:scale(1.1)}.action-btn.mute-btn{background:rgba(255,255,255,.2);color:#fff}.action-btn.mute-btn:hover{background:rgba(255,255,255,.35);transform:scale(1.1)}.action-btn.mute-btn.muted{background:#f39c12;color:#fff}.action-btn.mute-btn.muted:hover{background:#e67e22}.action-btn.hangup-btn{background:#dc3545;color:#fff}.action-btn.hangup-btn:hover{background:#c82333;transform:scale(1.1)}\n"] }]
128
- }], ctorParameters: function () { return [{ type: i1.TasService }]; } });
129
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzLWZsb2F0aW5nLWNhbGwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFzLXVlbGwtc2RrL3NyYy9saWIvY29tcG9uZW50cy90YXMtZmxvYXRpbmctY2FsbC90YXMtZmxvYXRpbmctY2FsbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9jb21wb25lbnRzL3Rhcy1mbG9hdGluZy1jYWxsL3Rhcy1mbG9hdGluZy1jYWxsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBRTdELE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDdEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLFFBQVEsTUFBTSxZQUFZLENBQUM7OztBQU9sQyxNQUFNLE9BQU8sd0JBQXdCO0lBT3BDLFlBQW9CLFVBQXNCO1FBQXRCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFMbkMsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNsQixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBRWYsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBdUQzQyx1Q0FBdUM7UUFDdEIsZUFBVSxHQUFHLEVBQUUsQ0FBQztJQXREYSxDQUFDO0lBRS9DLFFBQVE7UUFDUCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsV0FBVztRQUNWLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDakMsUUFBUSxDQUFDLHlCQUF5QixDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDN0MsQ0FBQztJQUVELGlCQUFpQjtJQUNqQixRQUFRO1FBQ1AsSUFBSSxDQUFD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SyxDQUFDLFNBQVMsR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztvQkFDckQsTUFBTSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3pDLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMxQyxDQUFDO2FBQ0Q7WUFDRCxTQUFTLEVBQUU7Z0JBQ1YsUUFBUSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUM7b0JBQ2hDLEtBQUssRUFBRTt3QkFDTixJQUFJLEVBQUUsTUFBTTt3QkFDWixHQUFHLEVBQUUsTUFBTTt3QkFDWCxLQUFLLEVBQUUsTUFBTSxDQUFDLFVBQVUsR0FBRyxNQUFNO3dCQUNqQyxNQUFNLEVBQUUsTUFBTSxDQUFDLFdBQVcsR0FBRyxNQUFNO3FCQUNuQztpQkFDRCxDQUFDO2dCQUNGLFFBQVEsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDO29CQUMvQixHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUU7b0JBQ2hDLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRTtpQkFDaEMsQ0FBQztnQkFDRixRQUFRLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsQ0FBQzthQUNyRDtZQUNELE9BQU8sRUFBRSxJQUFJO1NBQ2IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7cUhBeklXLHdCQUF3Qjt5R0FBeEIsd0JBQXdCLHlEQ1hyQywrZ0NBcUJBOzJGRFZhLHdCQUF3QjtrQkFMcEMsU0FBUzsrQkFDQyxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUYXNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdGFzLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2FsbFN0YXRlLCBWaWV3TW9kZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvdGFzLmludGVyZmFjZXMnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgaW50ZXJhY3QgZnJvbSAnaW50ZXJhY3Rqcyc7XG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ3Rhcy1mbG9hdGluZy1jYWxsJyxcblx0dGVtcGxhdGVVcmw6ICcuL3Rhcy1mbG9hdGluZy1jYWxsLmNvbXBvbmVudC5odG1sJyxcblx0c3R5bGVVcmxzOiBbJy4vdGFzLWZsb2F0aW5nLWNhbGwuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBUYXNGbG9hdGluZ0NhbGxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cblx0cHVibGljIGlzVmlzaWJsZSA9IGZhbHNlO1xuXHRwdWJsaWMgaXNNdXRlZCA9IGZhbHNlO1xuXG5cdHByaXZhdGUgc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuXHRjb25zdHJ1Y3Rvcihwcml2YXRlIHRhc1NlcnZpY2U6IFRhc1NlcnZpY2UpIHsgfVxuXG5cdG5nT25Jbml0KCk6IHZvaWQge1xuXHRcdHRoaXMuc2V0dXBTdWJzY3JpcHRpb25zKCk7XG5cdH1cblxuXHRuZ09uRGVzdHJveSgpOiB2b2lkIHtcblx0XHR0aGlzLnN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcblx0XHRpbnRlcmFjdCgnLnRhcy1mbG9hdGluZy1jb250YWluZXInKS51bnNldCgpO1xuXHR9XG5cblx0Ly8gUHVibGljIE1ldGhvZHNcblx0b25FeHBhbmQoKTogdm9pZCB7XG5cdFx0dGhpcy50YXNTZXJ2aWNlLmV4aXRQaXBNb2RlKCk7XG5cdH1cblxuXHRvbkhhbmdVcCgpOiB2b2lkIHtcblx0XHR0aGlzLnRhc1NlcnZpY2UuZGlzY29ubmVjdFNlc3Npb24oKTtcblx0fVxuXG5cdHRvZ2dsZU11dGUoKTogdm9pZCB7XG5cdFx0dGhpcy50YXNTZXJ2aWNlLnRvZ2dsZU11dGUoKTtcblx0fVxuXG5cdC8vIFByaXZhdGUgTWV0aG9kc1xuXHRwcml2YXRlIHNldHVwU3Vic2NyaXB0aW9ucygpOiB2b2lkIHtcblx0XHQvLyBDYWxsIHN0YXRlIHN1YnNjcmlwdGlvblxuXHRcdHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG5cdFx0XHR0aGlzLnRhc1NlcnZpY2UuY2FsbFN0YXRlJC5zdWJzY3JpYmUoc3RhdGUgPT4ge1xuXHRcdFx0XHRpZiAoc3RhdGUgPT09IENhbGxTdGF0ZS5ESVNDT05ORUNURUQpIHtcblx0XHRcdFx0XHR0aGlzLmlzVmlzaWJsZSA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdCk7XG5cblx0XHQvLyBWaWV3IG1vZGUgc3Vic2NyaXB0aW9uXG5cdFx0dGhpcy5zdWJzY3JpcHRpb25zLmFkZChcblx0XHRcdHRoaXMudGFzU2VydmljZS52aWV3TW9kZSQuc3Vic2NyaWJlKG1vZGUgPT4ge1xuXHRcdFx0XHR0aGlzLmlzVmlzaWJsZSA9IG1vZGUgPT09IFZpZXdNb2RlLlBJUCAmJiB0aGlzLnRhc1NlcnZpY2UuaXNDYWxsQWN0aXZlKCk7XG5cdFx0XHRcdGlmICh0aGlzLmlzVmlzaWJsZSkge1xuXHRcdFx0XHRcdHNldFRpbWVvdXQoKCkgPT4gdGhpcy5pbml0SW50ZXJhY3QoKSwgMTAwKTtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHQpO1xuXG5cdFx0Ly8gTXV0ZSBzdGF0ZSBzdWJzY3JpcHRpb25cblx0XHR0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuXHRcdFx0dGhpcy50YXNTZXJ2aWNlLmlzTXV0ZWQkLnN1YnNjcmliZShtdXRlZCA9PiB7XG5cdFx0XHRcdHRoaXMuaXNNdXRlZCA9IG11dGVkO1xuXHRcdFx0fSlcblx0XHQpO1xuXHR9XG5cblx0Ly8gTWFyZ2luIGZyb20gc2NyZWVuIGVkZ2VzIChpbiBwaXhlbHMpXG5cdHByaXZhdGUgcmVhZG9ubHkgUElQX01BUkdJTiA9IDIwO1xuXG5cdHByaXZhdGUgaW5pdEludGVyYWN0KCk6IHZvaWQge1xuXHRcdGludGVyYWN0KCcudGFzLWZsb2F0aW5nLWNvbnRhaW5lcicpLnVuc2V0KCk7XG5cblx0XHQvLyBDcmVhdGUgcmVzdHJpY3Rpb24gYXJlYSB3aXRoIG1hcmdpblxuXHRcdGNvbnN0IG1hcmdpbiA9IHRoaXMuUElQX01BUkdJTjtcblx0XHRjb25zdCByZXN0cmljdFRvQm9keVdpdGhNYXJnaW4gPSB7XG5cdFx0XHRyZXN0cmljdGlvbjogKCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdGxlZnQ6IG1hcmdpbixcblx0XHRcdFx0XHR0b3A6IG1hcmdpbixcblx0XHRcdFx0XHRyaWdodDogd2luZG93LmlubmVyV2lkdGggLSBtYXJnaW4sXG5cdFx0XHRcdFx0Ym90dG9tOiB3aW5kb3cuaW5uZXJIZWlnaHQgLSBtYXJnaW5cblx0XHRcdFx0fTtcblx0XHRcdH0sXG5cdFx0XHRlbGVtZW50UmVjdDogeyBsZWZ0OiAwLCByaWdodDogMSwgdG9wOiAwLCBib3R0b206IDEgfVxuXHRcdH07XG5cblx0XHRpbnRlcmFjdCgnLnRhcy1mbG9hdGluZy1jb250YWluZXInKVxuXHRcdFx0LmRyYWdnYWJsZSh7XG5cdFx0XHRcdGluZXJ0aWE6IHRydWUsXG5cdFx0XHRcdG1vZGlmaWVyczogW1xuXHRcdFx0XHRcdGludGVyYWN0Lm1vZGlmaWVycy5yZXN0cmljdChyZXN0cmljdFRvQm9keVdpdGhNYXJnaW4pXG5cdFx0XHRcdF0sXG5cdFx0XHRcdGF1dG9TY3JvbGw6IGZhbHNlLFxuXHRcdFx0XHRsaXN0ZW5lcnM6IHtcblx0XHRcdFx0XHRtb3ZlOiAoZXZlbnQpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDtcblx0XHRcdFx0XHRcdGNvbnN0IHggPSAocGFyc2VGbG9hdCh0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXgnKSkgfHwgMCkgKyBldmVudC5keDtcblx0XHRcdFx0XHRcdGNvbnN0IHkgPSAocGFyc2VGbG9hdCh0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXknKSkgfHwgMCkgKyBldmVudC5keTtcblxuXHRcdFx0XHRcdFx0dGFyZ2V0LnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGUoJHt4fXB4LCAke3l9cHgpYDtcblx0XHRcdFx0XHRcdHRhcmdldC5zZXRBdHRyaWJ1dGUoJ2RhdGEteCcsIFN0cmluZyh4KSk7XG5cdFx0XHRcdFx0XHR0YXJnZXQuc2V0QXR0cmlidXRlKCdkYXRhLXknLCBTdHJpbmcoeSkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5yZXNpemFibGUoe1xuXHRcdFx0XHRlZGdlczogeyBsZWZ0OiBmYWxzZSwgcmlnaHQ6IHRydWUsIGJvdHRvbTogdHJ1ZSwgdG9wOiBmYWxzZSB9LFxuXHRcdFx0XHRsaXN0ZW5lcnM6IHtcblx0XHRcdFx0XHRtb3ZlOiAoZXZlbnQpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDtcblx0XHRcdFx0XHRcdGxldCB4ID0gcGFyc2VGbG9hdCh0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXgnKSkgfHwgMDtcblx0XHRcdFx0XHRcdGxldCB5ID0gcGFyc2VGbG9hdCh0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXknKSkgfHwgMDtcblxuXHRcdFx0XHRcdFx0Ly8gVXBkYXRlIGVsZW1lbnQgc2l6ZVxuXHRcdFx0XHRcdFx0dGFyZ2V0LnN0eWxlLndpZHRoID0gYCR7ZXZlbnQucmVjdC53aWR0aH1weGA7XG5cdFx0XHRcdFx0XHR0YXJnZXQuc3R5bGUuaGVpZ2h0ID0gYCR7ZXZlbnQucmVjdC5oZWlnaHR9cHhgO1xuXG5cdFx0XHRcdFx0XHQvLyBUcmFuc2xhdGUgd2hlbiByZXNpemluZyBmcm9tIHRvcCBvciBsZWZ0IGVkZ2VzXG5cdFx0XHRcdFx0XHR4ICs9IGV2ZW50LmRlbHRhUmVjdC5sZWZ0O1xuXHRcdFx0XHRcdFx0eSArPSBldmVudC5kZWx0YVJlY3QudG9wO1xuXG5cdFx0XHRcdFx0XHR0YXJnZXQuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZSgke3h9cHgsICR7eX1weClgO1xuXHRcdFx0XHRcdFx0dGFyZ2V0LnNldEF0dHJpYnV0ZSgnZGF0YS14JywgU3RyaW5nKHgpKTtcblx0XHRcdFx0XHRcdHRhcmdldC5zZXRBdHRyaWJ1dGUoJ2RhdGEteScsIFN0cmluZyh5KSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRtb2RpZmllcnM6IFtcblx0XHRcdFx0XHRpbnRlcmFjdC5tb2RpZmllcnMucmVzdHJpY3RFZGdlcyh7XG5cdFx0XHRcdFx0XHRvdXRlcjoge1xuXHRcdFx0XHRcdFx0XHRsZWZ0OiBtYXJnaW4sXG5cdFx0XHRcdFx0XHRcdHRvcDogbWFyZ2luLFxuXHRcdFx0XHRcdFx0XHRyaWdodDogd2luZG93LmlubmVyV2lkdGggLSBtYXJnaW4sXG5cdFx0XHRcdFx0XHRcdGJvdHRvbTogd2luZG93LmlubmVySGVpZ2h0IC0gbWFyZ2luXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0aW50ZXJhY3QubW9kaWZpZXJzLnJlc3RyaWN0U2l6ZSh7XG5cdFx0XHRcdFx0XHRtaW46IHsgd2lkdGg6IDIwMCwgaGVpZ2h0OiAxMzAgfSxcblx0XHRcdFx0XHRcdG1heDogeyB3aWR0aDogNTAwLCBoZWlnaHQ6IDM1MCB9XG5cdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0aW50ZXJhY3QubW9kaWZpZXJzLmFzcGVjdFJhdGlvKHsgcmF0aW86ICdwcmVzZXJ2ZScgfSlcblx0XHRcdFx0XSxcblx0XHRcdFx0aW5lcnRpYTogdHJ1ZVxuXHRcdFx0fSk7XG5cdH1cbn1cblxuIiwiPGRpdiBjbGFzcz1cInRhcy1mbG9hdGluZy1jb250YWluZXJcIiBbY2xhc3MudmlzaWJsZV09XCJpc1Zpc2libGVcIj5cblx0PCEtLSBWaWRlbyBjb250ZW50IGFyZWEgLSBzaG93cyBtYWluIHZpZGVvIG9ubHkgLS0+XG5cdDxkaXYgY2xhc3M9XCJmbG9hdGluZy1jb250ZW50XCI+XG5cdFx0PCEtLSBNYWluIHZpZGVvIGNvbnRhaW5lciAoc3Vic2NyaWJlciBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBwdWJsaXNoZXIpIC0tPlxuXHRcdDxkaXYgaWQ9XCJwaXAtbWFpbi12aWRlb1wiIGNsYXNzPVwicGlwLW1haW4tdmlkZW9cIj48L2Rpdj5cblxuXHRcdDwhLS0gQm90dG9tIGNvbnRyb2xzIC0tPlxuXHRcdDxkaXYgY2xhc3M9XCJmbG9hdGluZy1jb250cm9sc1wiPlxuXHRcdFx0PGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gZXhwYW5kLWJ0blwiIChjbGljayk9XCJvbkV4cGFuZCgpXCIgdGl0bGU9XCJFeHBhbmQgdG8gZnVsbHNjcmVlblwiPlxuXHRcdFx0XHQ8aSBjbGFzcz1cImZhIGZhLWV4cGFuZFwiPjwvaT5cblx0XHRcdDwvYnV0dG9uPlxuXHRcdFx0PGJ1dHRvbiBjbGFzcz1cImFjdGlvbi1idG4gbXV0ZS1idG5cIiBbY2xhc3MubXV0ZWRdPVwiaXNNdXRlZFwiIChjbGljayk9XCJ0b2dnbGVNdXRlKClcIiBbdGl0bGVdPVwiaXNNdXRlZCA/ICdVbm11dGUgbWljcm9waG9uZScgOiAnTXV0ZSBtaWNyb3Bob25lJ1wiPlxuXHRcdFx0XHQ8aSBjbGFzcz1cImZhXCIgW2NsYXNzLmZhLW1pY3JvcGhvbmVdPVwiIWlzTXV0ZWRcIiBbY2xhc3MuZmEtbWljcm9waG9uZS1zbGFzaF09XCJpc011dGVkXCI+PC9pPlxuXHRcdFx0PC9idXR0b24+XG5cdFx0XHQ8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBoYW5ndXAtYnRuXCIgKGNsaWNrKT1cIm9uSGFuZ1VwKClcIiB0aXRsZT1cIkhhbmcgdXAgY2FsbFwiPlxuXHRcdFx0XHQ8aSBjbGFzcz1cImZhIGZhLXBob25lXCIgc3R5bGU9XCJ0cmFuc2Zvcm06IHJvdGF0ZSgxMzVkZWcpO1wiPjwvaT5cblx0XHRcdDwvYnV0dG9uPlxuXHRcdDwvZGl2PlxuXHQ8L2Rpdj5cbjwvZGl2PlxuXG4iXX0=
152
+ args: [{ selector: 'tas-floating-call', template: "<div class=\"tas-floating-container\" [class.visible]=\"isVisible\">\n <!-- Video content area - shows main video only -->\n <div class=\"floating-content\">\n <!-- Main video container (subscriber if available, otherwise publisher) -->\n <div id=\"pip-main-video\" class=\"pip-main-video\"></div>\n\n <!-- Bottom controls -->\n <div class=\"floating-controls\">\n <button\n class=\"action-btn expand-btn\"\n (click)=\"onExpand()\"\n title=\"Expand to fullscreen\"\n >\n <i class=\"fa fa-expand\"></i>\n </button>\n <button\n class=\"action-btn mute-btn\"\n [class.muted]=\"isMuted\"\n (click)=\"toggleMute()\"\n [title]=\"isMuted ? 'Unmute microphone' : 'Mute microphone'\"\n >\n <i\n class=\"fa\"\n [class.fa-microphone]=\"!isMuted\"\n [class.fa-microphone-slash]=\"isMuted\"\n ></i>\n </button>\n <button class=\"action-btn hangup-btn\" (click)=\"onHangUp()\" title=\"Hang up call\">\n <i class=\"fa fa-phone\" style=\"transform: rotate(135deg)\"></i>\n </button>\n </div>\n </div>\n</div>\n", styles: [".tas-floating-container{position:fixed;bottom:20px;right:20px;width:280px;height:180px;background:#000;border-radius:12px;box-shadow:0 8px 32px #00000080;z-index:9999;overflow:hidden;touch-action:none;-webkit-user-select:none;user-select:none;transition:opacity .3s ease,visibility .3s ease,box-shadow .2s ease;opacity:0;visibility:hidden;pointer-events:none}.tas-floating-container.visible{opacity:1;visibility:visible;pointer-events:auto}.tas-floating-container:hover{box-shadow:0 8px 32px #00000080,0 0 0 2px #ffffff4d}.floating-content{position:relative;width:100%;height:100%;overflow:hidden}.pip-main-video{position:absolute;top:0;left:0;width:100%;height:100%;background:#000}.pip-main-video ::ng-deep video{width:100%;height:100%;object-fit:cover}.pip-main-video ::ng-deep .OT_subscriber,.pip-main-video ::ng-deep .OT_publisher{width:100%!important;height:100%!important}.pip-main-video ::ng-deep .OT_edge-bar-item,.pip-main-video ::ng-deep .OT_mute,.pip-main-video ::ng-deep .OT_audio-level-meter,.pip-main-video ::ng-deep .OT_bar,.pip-main-video ::ng-deep .OT_name{display:none!important}.floating-controls{position:absolute;bottom:10px;left:50%;transform:translate(-50%);display:flex;gap:12px;padding:6px 14px;background:rgba(0,0,0,.7);border-radius:24px;backdrop-filter:blur(8px);opacity:0;visibility:hidden;transition:opacity .3s ease,visibility .3s ease}.tas-floating-container:hover .floating-controls{opacity:1;visibility:visible}.action-btn{width:32px;height:32px;border:none;border-radius:50%;cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:13px;transition:all .2s ease}.action-btn.expand-btn{background:rgba(255,255,255,.2);color:#fff}.action-btn.expand-btn:hover{background:rgba(255,255,255,.35);transform:scale(1.1)}.action-btn.mute-btn{background:rgba(255,255,255,.2);color:#fff}.action-btn.mute-btn:hover{background:rgba(255,255,255,.35);transform:scale(1.1)}.action-btn.mute-btn.muted{background:#f39c12;color:#fff}.action-btn.mute-btn.muted:hover{background:#e67e22}.action-btn.hangup-btn{background:#dc3545;color:#fff}.action-btn.hangup-btn:hover{background:#c82333;transform:scale(1.1)}\n"] }]
153
+ }], ctorParameters: function () { return [{ type: i1.TasService }, { type: i2.NgbModal }]; } });
154
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzLWZsb2F0aW5nLWNhbGwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFzLXVlbGwtc2RrL3NyYy9saWIvY29tcG9uZW50cy90YXMtZmxvYXRpbmctY2FsbC90YXMtZmxvYXRpbmctY2FsbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9jb21wb25lbnRzL3Rhcy1mbG9hdGluZy1jYWxsL3Rhcy1mbG9hdGluZy1jYWxsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBRzdELE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDdEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDakYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLFFBQVEsTUFBTSxZQUFZLENBQUM7Ozs7QUFPbEMsTUFBTSxPQUFPLHdCQUF3QjtJQU9uQyxZQUNVLFVBQXNCLEVBQ3RCLFlBQXNCO1FBRHRCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsaUJBQVksR0FBWixZQUFZLENBQVU7UUFSekIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNsQixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBRWYsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ25DLHNCQUFpQixHQUF1QixJQUFJLENBQUM7UUF3RnJELHVDQUF1QztRQUN0QixlQUFVLEdBQUcsRUFBRSxDQUFDO0lBcEY5QixDQUFDO0lBRUosUUFBUTtRQUNOLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNqQyxRQUFRLENBQUMseUJBQXlCLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUM5QyxDQUFDO0lBRUQsaUJBQWlCO0lBQ2pCLFFBQVE7UUFDTixJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxVQUFVLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRUQsVUFBVTtRQUNSLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVELGtCQUFrQjtJQUNWLGtCQUFrQjtRQUN4QiwwQkFBMEI7UUFDMUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQ3BCLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQzdDLElBQUksS0FBSyxLQUFLLFNBQVMsQ0FBQyxZQUFZLEVBQUU7Z0JBQ3BDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO2FBQ3hCO1FBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUVGLHlCQUF5QjtRQUN6QixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FDcEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDM0MsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLEtBQUssUUFBUSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3pFLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDbEIsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDM0MsNkRBQTZEO2dCQUM3RCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO2FBQy9CO1FBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUVGLDBCQUEwQjtRQUMxQixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FDcEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDM0MsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxxQkFBOEIsS0FBSztRQUM1RCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUMxQixPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUU7WUFDckUsSUFBSSxFQUFFLElBQUk7WUFDVixXQUFXLEVBQUUsaUJBQWlCO1lBQzlCLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFFBQVEsRUFBRSxLQUFLO1NBQ2hCLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7UUFDL0UsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztRQUN2RSxJQUFJLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDO1FBQ3JGLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztRQUVqRixJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDaEMsR0FBRyxFQUFFO1lBQ0gsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUNoQyxDQUFDLEVBQ0QsR0FBRyxFQUFFO1lBQ0gsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUNoQyxDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFLTyxZQUFZO1FBQ2xCLFFBQVEsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRTVDLHNDQUFzQztRQUN0QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQy9CLE1BQU0sd0JBQXdCLEdBQUc7WUFDL0IsV0FBVyxFQUFFLEdBQUcsRUFBRTtnQkFDaEIsT0FBTztvQkFDTCxJQUFJLEVBQUUsTUFBTTtvQkFDWixHQUFHLEVBQUUsTUFBTTtvQkFDWCxLQUFLLEVBQUUsTUFBTSxDQUFDLFVBQVUsR0FBRyxNQUFNO29CQUNqQyxNQUFNLEVBQUUsTUFBTSxDQUFDLFdBQVcsR0FBRyxNQUFNO2lCQUNwQyxDQUFDO1lBQ0osQ0FBQztZQUNELFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUU7U0FDdEQsQ0FBQztRQUVGLFFBQVEsQ0FBQyx5QkFBeUIsQ0FBQzthQUNoQyxTQUFTLENBQUM7WUFDVCxPQUFPLEVBQUUsSUFBSTtZQUNiLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLHdCQUF3QixDQUFDLENBQUM7WUFDbEUsVUFBVSxFQUFFLEtBQUs7WUFDakIsU0FBUyxFQUFFO2dCQUNULElBQUksRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO29CQUNkLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7b0JBQzVCLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUN0RSxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFFdEUsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7b0JBQ3JELE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN6QyxNQUFNLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDM0MsQ0FBQzthQUNGO1NBQ0YsQ0FBQzthQUNELFNBQVMsQ0FBQztZQUNULEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUU7WUFDN0QsU0FBUyxFQUFFO2dCQUNULElBQUksRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO29CQUNkLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7b0JBQzVCLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUN2RCxJQUFJLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFFdkQsc0JBQXNCO29CQUN0QixNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUM7b0JBQzdDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQztvQkFFL0MsaURBQWlEO29CQUNqRCxDQUFDLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7b0JBQzFCLENBQUMsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQztvQkFFekIsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7b0JBQ3JELE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN6QyxNQUFNLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDM0MsQ0FBQzthQUNGO1lBQ0QsU0FBUyxFQUFFO2dCQUNULFFBQVEsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDO29CQUMvQixLQUFLLEVBQUU7d0JBQ0wsSUFBSSxFQUFFLE1BQU07d0JBQ1osR0FBRyxFQUFFLE1BQU07d0JBQ1gsS0FBSyxFQUFFLE1BQU0sQ0FBQyxVQUFVLEdBQUcsTUFBTTt3QkFDakMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxXQUFXLEdBQUcsTUFBTTtxQkFDcEM7aUJBQ0YsQ0FBQztnQkFDRixRQUFRLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQztvQkFDOUIsR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFO29CQUNoQyxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUU7aUJBQ2pDLENBQUM7Z0JBQ0YsUUFBUSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLENBQUM7YUFDdEQ7WUFDRCxPQUFPLEVBQUUsSUFBSTtTQUNkLENBQUMsQ0FBQztJQUNQLENBQUM7O3NIQXhLVSx3QkFBd0I7MEdBQXhCLHdCQUF3Qix5RENickMsc29DQWlDQTs0RkRwQmEsd0JBQXdCO2tCQUxwQyxTQUFTOytCQUNFLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5nYk1vZGFsLCBOZ2JNb2RhbFJlZiB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcbmltcG9ydCB7IFRhc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90YXMuc2VydmljZSc7XG5pbXBvcnQgeyBDYWxsU3RhdGUsIFZpZXdNb2RlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy90YXMuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBUYXNWaWRlb2NhbGxDb21wb25lbnQgfSBmcm9tICcuLi90YXMtdmlkZW9jYWxsL3Rhcy12aWRlb2NhbGwuY29tcG9uZW50JztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IGludGVyYWN0IGZyb20gJ2ludGVyYWN0anMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0YXMtZmxvYXRpbmctY2FsbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi90YXMtZmxvYXRpbmctY2FsbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3Rhcy1mbG9hdGluZy1jYWxsLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFRhc0Zsb2F0aW5nQ2FsbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgcHVibGljIGlzVmlzaWJsZSA9IGZhbHNlO1xuICBwdWJsaWMgaXNNdXRlZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgcHJpdmF0ZSB2aWRlb0NhbGxNb2RhbFJlZjogTmdiTW9kYWxSZWYgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHRhc1NlcnZpY2U6IFRhc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE5nYk1vZGFsXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNldHVwU3Vic2NyaXB0aW9ucygpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgaW50ZXJhY3QoJy50YXMtZmxvYXRpbmctY29udGFpbmVyJykudW5zZXQoKTtcbiAgfVxuXG4gIC8vIFB1YmxpYyBNZXRob2RzXG4gIG9uRXhwYW5kKCk6IHZvaWQge1xuICAgIHRoaXMub3BlblZpZGVvQ2FsbE1vZGFsKHRydWUpO1xuICAgIHRoaXMudGFzU2VydmljZS5leGl0UGlwTW9kZSgpO1xuICB9XG5cbiAgb25IYW5nVXAoKTogdm9pZCB7XG4gICAgdGhpcy50YXNTZXJ2aWNlLmRpc2Nvbm5lY3RTZXNzaW9uKCk7XG4gIH1cblxuICB0b2dnbGVNdXRlKCk6IHZvaWQge1xuICAgIHRoaXMudGFzU2VydmljZS50b2dnbGVNdXRlKCk7XG4gIH1cblxuICAvLyBQcml2YXRlIE1ldGhvZHNcbiAgcHJpdmF0ZSBzZXR1cFN1YnNjcmlwdGlvbnMoKTogdm9pZCB7XG4gICAgLy8gQ2FsbCBzdGF0ZSBzdWJzY3JpcHRpb25cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy50YXNTZXJ2aWNlLmNhbGxTdGF0ZSQuc3Vic2NyaWJlKChzdGF0ZSkgPT4ge1xuICAgICAgICBpZiAoc3RhdGUgPT09IENhbGxTdGF0ZS5ESVNDT05ORUNURUQpIHtcbiAgICAgICAgICB0aGlzLmlzVmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBWaWV3IG1vZGUgc3Vic2NyaXB0aW9uXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMudGFzU2VydmljZS52aWV3TW9kZSQuc3Vic2NyaWJlKChtb2RlKSA9PiB7XG4gICAgICAgIHRoaXMuaXNWaXNpYmxlID0gbW9kZSA9PT0gVmlld01vZGUuUElQICYmIHRoaXMudGFzU2VydmljZS5pc0NhbGxBY3RpdmUoKTtcbiAgICAgICAgaWYgKHRoaXMuaXNWaXNpYmxlKSB7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmluaXRJbnRlcmFjdCgpLCAxMDApO1xuICAgICAgICAgIC8vIENsZWFyIG1vZGFsIHJlZiBpZiB3ZSBlbnRlciBQaVAgbW9kZSAobW9kYWwgY2xvc2VzIGl0c2VsZilcbiAgICAgICAgICB0aGlzLnZpZGVvQ2FsbE1vZGFsUmVmID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuXG4gICAgLy8gTXV0ZSBzdGF0ZSBzdWJzY3JpcHRpb25cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy50YXNTZXJ2aWNlLmlzTXV0ZWQkLnN1YnNjcmliZSgobXV0ZWQpID0+IHtcbiAgICAgICAgdGhpcy5pc011dGVkID0gbXV0ZWQ7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIG9wZW5WaWRlb0NhbGxNb2RhbChpc1JldHVybmluZ0Zyb21QaXA6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgIGlmICh0aGlzLnZpZGVvQ2FsbE1vZGFsUmVmKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy52aWRlb0NhbGxNb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oVGFzVmlkZW9jYWxsQ29tcG9uZW50LCB7XG4gICAgICBzaXplOiAneGwnLFxuICAgICAgd2luZG93Q2xhc3M6ICd0YXMtdmlkZW8tbW9kYWwnLFxuICAgICAgYmFja2Ryb3A6ICdzdGF0aWMnLFxuICAgICAga2V5Ym9hcmQ6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgdGhpcy52aWRlb0NhbGxNb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5zZXNzaW9uSWQgPSB0aGlzLnRhc1NlcnZpY2Uuc2Vzc2lvbklkO1xuICAgIHRoaXMudmlkZW9DYWxsTW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UudG9rZW4gPSB0aGlzLnRhc1NlcnZpY2UudG9rZW47XG4gICAgdGhpcy52aWRlb0NhbGxNb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5idXNpbmVzc1JvbGUgPSB0aGlzLnRhc1NlcnZpY2UuYnVzaW5lc3NSb2xlO1xuICAgIHRoaXMudmlkZW9DYWxsTW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2UuaXNSZXR1cm5pbmdGcm9tUGlwID0gaXNSZXR1cm5pbmdGcm9tUGlwO1xuXG4gICAgdGhpcy52aWRlb0NhbGxNb2RhbFJlZi5yZXN1bHQudGhlbihcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy52aWRlb0NhbGxNb2RhbFJlZiA9IG51bGw7XG4gICAgICB9LFxuICAgICAgKCkgPT4ge1xuICAgICAgICB0aGlzLnZpZGVvQ2FsbE1vZGFsUmVmID0gbnVsbDtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLy8gTWFyZ2luIGZyb20gc2NyZWVuIGVkZ2VzIChpbiBwaXhlbHMpXG4gIHByaXZhdGUgcmVhZG9ubHkgUElQX01BUkdJTiA9IDIwO1xuXG4gIHByaXZhdGUgaW5pdEludGVyYWN0KCk6IHZvaWQge1xuICAgIGludGVyYWN0KCcudGFzLWZsb2F0aW5nLWNvbnRhaW5lcicpLnVuc2V0KCk7XG5cbiAgICAvLyBDcmVhdGUgcmVzdHJpY3Rpb24gYXJlYSB3aXRoIG1hcmdpblxuICAgIGNvbnN0IG1hcmdpbiA9IHRoaXMuUElQX01BUkdJTjtcbiAgICBjb25zdCByZXN0cmljdFRvQm9keVdpdGhNYXJnaW4gPSB7XG4gICAgICByZXN0cmljdGlvbjogKCkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxlZnQ6IG1hcmdpbixcbiAgICAgICAgICB0b3A6IG1hcmdpbixcbiAgICAgICAgICByaWdodDogd2luZG93LmlubmVyV2lkdGggLSBtYXJnaW4sXG4gICAgICAgICAgYm90dG9tOiB3aW5kb3cuaW5uZXJIZWlnaHQgLSBtYXJnaW4sXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAgZWxlbWVudFJlY3Q6IHsgbGVmdDogMCwgcmlnaHQ6IDEsIHRvcDogMCwgYm90dG9tOiAxIH0sXG4gICAgfTtcblxuICAgIGludGVyYWN0KCcudGFzLWZsb2F0aW5nLWNvbnRhaW5lcicpXG4gICAgICAuZHJhZ2dhYmxlKHtcbiAgICAgICAgaW5lcnRpYTogdHJ1ZSxcbiAgICAgICAgbW9kaWZpZXJzOiBbaW50ZXJhY3QubW9kaWZpZXJzLnJlc3RyaWN0KHJlc3RyaWN0VG9Cb2R5V2l0aE1hcmdpbildLFxuICAgICAgICBhdXRvU2Nyb2xsOiBmYWxzZSxcbiAgICAgICAgbGlzdGVuZXJzOiB7XG4gICAgICAgICAgbW92ZTogKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgICAgICAgICBjb25zdCB4ID0gKHBhcnNlRmxvYXQodGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS14JykpIHx8IDApICsgZXZlbnQuZHg7XG4gICAgICAgICAgICBjb25zdCB5ID0gKHBhcnNlRmxvYXQodGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS15JykpIHx8IDApICsgZXZlbnQuZHk7XG5cbiAgICAgICAgICAgIHRhcmdldC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlKCR7eH1weCwgJHt5fXB4KWA7XG4gICAgICAgICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKCdkYXRhLXgnLCBTdHJpbmcoeCkpO1xuICAgICAgICAgICAgdGFyZ2V0LnNldEF0dHJpYnV0ZSgnZGF0YS15JywgU3RyaW5nKHkpKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC5yZXNpemFibGUoe1xuICAgICAgICBlZGdlczogeyBsZWZ0OiBmYWxzZSwgcmlnaHQ6IHRydWUsIGJvdHRvbTogdHJ1ZSwgdG9wOiBmYWxzZSB9LFxuICAgICAgICBsaXN0ZW5lcnM6IHtcbiAgICAgICAgICBtb3ZlOiAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICAgICAgICAgIGxldCB4ID0gcGFyc2VGbG9hdCh0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXgnKSkgfHwgMDtcbiAgICAgICAgICAgIGxldCB5ID0gcGFyc2VGbG9hdCh0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLXknKSkgfHwgMDtcblxuICAgICAgICAgICAgLy8gVXBkYXRlIGVsZW1lbnQgc2l6ZVxuICAgICAgICAgICAgdGFyZ2V0LnN0eWxlLndpZHRoID0gYCR7ZXZlbnQucmVjdC53aWR0aH1weGA7XG4gICAgICAgICAgICB0YXJnZXQuc3R5bGUuaGVpZ2h0ID0gYCR7ZXZlbnQucmVjdC5oZWlnaHR9cHhgO1xuXG4gICAgICAgICAgICAvLyBUcmFuc2xhdGUgd2hlbiByZXNpemluZyBmcm9tIHRvcCBvciBsZWZ0IGVkZ2VzXG4gICAgICAgICAgICB4ICs9IGV2ZW50LmRlbHRhUmVjdC5sZWZ0O1xuICAgICAgICAgICAgeSArPSBldmVudC5kZWx0YVJlY3QudG9wO1xuXG4gICAgICAgICAgICB0YXJnZXQuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZSgke3h9cHgsICR7eX1weClgO1xuICAgICAgICAgICAgdGFyZ2V0LnNldEF0dHJpYnV0ZSgnZGF0YS14JywgU3RyaW5nKHgpKTtcbiAgICAgICAgICAgIHRhcmdldC5zZXRBdHRyaWJ1dGUoJ2RhdGEteScsIFN0cmluZyh5KSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgbW9kaWZpZXJzOiBbXG4gICAgICAgICAgaW50ZXJhY3QubW9kaWZpZXJzLnJlc3RyaWN0RWRnZXMoe1xuICAgICAgICAgICAgb3V0ZXI6IHtcbiAgICAgICAgICAgICAgbGVmdDogbWFyZ2luLFxuICAgICAgICAgICAgICB0b3A6IG1hcmdpbixcbiAgICAgICAgICAgICAgcmlnaHQ6IHdpbmRvdy5pbm5lcldpZHRoIC0gbWFyZ2luLFxuICAgICAgICAgICAgICBib3R0b206IHdpbmRvdy5pbm5lckhlaWdodCAtIG1hcmdpbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSksXG4gICAgICAgICAgaW50ZXJhY3QubW9kaWZpZXJzLnJlc3RyaWN0U2l6ZSh7XG4gICAgICAgICAgICBtaW46IHsgd2lkdGg6IDIwMCwgaGVpZ2h0OiAxMzAgfSxcbiAgICAgICAgICAgIG1heDogeyB3aWR0aDogNTAwLCBoZWlnaHQ6IDM1MCB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIGludGVyYWN0Lm1vZGlmaWVycy5hc3BlY3RSYXRpbyh7IHJhdGlvOiAncHJlc2VydmUnIH0pLFxuICAgICAgICBdLFxuICAgICAgICBpbmVydGlhOiB0cnVlLFxuICAgICAgfSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ0YXMtZmxvYXRpbmctY29udGFpbmVyXCIgW2NsYXNzLnZpc2libGVdPVwiaXNWaXNpYmxlXCI+XG4gIDwhLS0gVmlkZW8gY29udGVudCBhcmVhIC0gc2hvd3MgbWFpbiB2aWRlbyBvbmx5IC0tPlxuICA8ZGl2IGNsYXNzPVwiZmxvYXRpbmctY29udGVudFwiPlxuICAgIDwhLS0gTWFpbiB2aWRlbyBjb250YWluZXIgKHN1YnNjcmliZXIgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgcHVibGlzaGVyKSAtLT5cbiAgICA8ZGl2IGlkPVwicGlwLW1haW4tdmlkZW9cIiBjbGFzcz1cInBpcC1tYWluLXZpZGVvXCI+PC9kaXY+XG5cbiAgICA8IS0tIEJvdHRvbSBjb250cm9scyAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiZmxvYXRpbmctY29udHJvbHNcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJhY3Rpb24tYnRuIGV4cGFuZC1idG5cIlxuICAgICAgICAoY2xpY2spPVwib25FeHBhbmQoKVwiXG4gICAgICAgIHRpdGxlPVwiRXhwYW5kIHRvIGZ1bGxzY3JlZW5cIlxuICAgICAgPlxuICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWV4cGFuZFwiPjwvaT5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImFjdGlvbi1idG4gbXV0ZS1idG5cIlxuICAgICAgICBbY2xhc3MubXV0ZWRdPVwiaXNNdXRlZFwiXG4gICAgICAgIChjbGljayk9XCJ0b2dnbGVNdXRlKClcIlxuICAgICAgICBbdGl0bGVdPVwiaXNNdXRlZCA/ICdVbm11dGUgbWljcm9waG9uZScgOiAnTXV0ZSBtaWNyb3Bob25lJ1wiXG4gICAgICA+XG4gICAgICAgIDxpXG4gICAgICAgICAgY2xhc3M9XCJmYVwiXG4gICAgICAgICAgW2NsYXNzLmZhLW1pY3JvcGhvbmVdPVwiIWlzTXV0ZWRcIlxuICAgICAgICAgIFtjbGFzcy5mYS1taWNyb3Bob25lLXNsYXNoXT1cImlzTXV0ZWRcIlxuICAgICAgICA+PC9pPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiYWN0aW9uLWJ0biBoYW5ndXAtYnRuXCIgKGNsaWNrKT1cIm9uSGFuZ1VwKClcIiB0aXRsZT1cIkhhbmcgdXAgY2FsbFwiPlxuICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXBob25lXCIgc3R5bGU9XCJ0cmFuc2Zvcm06IHJvdGF0ZSgxMzVkZWcpXCI+PC9pPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=