tas-uell-sdk 0.0.1 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/INSTALL_AND_TEST.md +427 -0
- package/README.md +122 -229
- package/esm2020/lib/components/tas-btn/tas-btn.component.mjs +79 -95
- package/esm2020/lib/components/tas-floating-call/tas-floating-call.component.mjs +74 -24
- package/esm2020/lib/components/tas-videocall/tas-videocall.component.mjs +50 -45
- package/esm2020/lib/components/tas-waiting-room/tas-waiting-room.component.mjs +179 -0
- package/esm2020/lib/config/tas.config.mjs +10 -0
- package/esm2020/lib/interfaces/tas.interfaces.mjs +32 -2
- package/esm2020/lib/services/tas.service.mjs +27 -48
- package/esm2020/lib/tas-uell-sdk.module.mjs +82 -0
- package/esm2020/public-api.mjs +13 -12
- package/esm2020/tas-uell-sdk.mjs +1 -1
- package/fesm2015/tas-uell-sdk.mjs +440 -218
- package/fesm2015/tas-uell-sdk.mjs.map +1 -1
- package/fesm2020/tas-uell-sdk.mjs +437 -216
- package/fesm2020/tas-uell-sdk.mjs.map +1 -1
- package/lib/components/tas-btn/tas-btn.component.d.ts +15 -11
- package/lib/components/tas-floating-call/tas-floating-call.component.d.ts +3 -2
- package/lib/components/tas-videocall/tas-videocall.component.d.ts +4 -3
- package/lib/components/tas-waiting-room/tas-waiting-room.component.d.ts +56 -0
- package/lib/config/tas.config.d.ts +28 -0
- package/lib/interfaces/tas.interfaces.d.ts +41 -6
- package/lib/services/tas.service.d.ts +6 -16
- package/lib/tas-uell-sdk.module.d.ts +46 -0
- package/package.json +36 -23
- package/public-api.d.ts +8 -7
- package/src/lib/styles/tas-global.scss +37 -0
- package/esm2020/lib/tas.config.mjs +0 -14
- package/esm2020/lib/tas.module.mjs +0 -73
- package/lib/tas.config.d.ts +0 -51
- package/lib/tas.module.d.ts +0 -34
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { Component, Input, ViewChild
|
|
2
|
-
import { CallState, ViewMode } from
|
|
3
|
-
import { Subscription } from
|
|
4
|
-
import interact from
|
|
1
|
+
import { Component, Input, ViewChild } from '@angular/core';
|
|
2
|
+
import { CallState, ViewMode } from '../../interfaces/tas.interfaces';
|
|
3
|
+
import { Subscription } from 'rxjs';
|
|
4
|
+
import interact from 'interactjs';
|
|
5
5
|
import * as i0 from "@angular/core";
|
|
6
6
|
import * as i1 from "@ng-bootstrap/ng-bootstrap";
|
|
7
7
|
import * as i2 from "../../services/tas.service";
|
|
@@ -24,10 +24,11 @@ export class TasVideocallComponent {
|
|
|
24
24
|
}
|
|
25
25
|
ngOnDestroy() {
|
|
26
26
|
this.subscriptions.unsubscribe();
|
|
27
|
+
// Only disconnect if not in PiP mode (keep session alive for floating window)
|
|
27
28
|
if (!this.tasService.isPipMode()) {
|
|
28
29
|
this.tasService.disconnectSession();
|
|
29
30
|
}
|
|
30
|
-
interact(
|
|
31
|
+
interact('.publisher-view').unset();
|
|
31
32
|
}
|
|
32
33
|
// Public Methods
|
|
33
34
|
hangUp() {
|
|
@@ -37,7 +38,8 @@ export class TasVideocallComponent {
|
|
|
37
38
|
this.tasService.toggleMute();
|
|
38
39
|
}
|
|
39
40
|
minimize() {
|
|
40
|
-
this.tasService.moveMainVideoTo(
|
|
41
|
+
this.tasService.moveMainVideoTo('pip-main-video');
|
|
42
|
+
// Small delay to ensure video is moved before closing modal
|
|
41
43
|
setTimeout(() => this.tasService.enterPipMode(), 50);
|
|
42
44
|
}
|
|
43
45
|
toggleSwap() {
|
|
@@ -50,30 +52,33 @@ export class TasVideocallComponent {
|
|
|
50
52
|
}
|
|
51
53
|
// Private Methods
|
|
52
54
|
setupSubscriptions() {
|
|
53
|
-
|
|
55
|
+
// Call state subscription
|
|
56
|
+
this.subscriptions.add(this.tasService.callState$.subscribe(state => {
|
|
54
57
|
this.callState = state;
|
|
55
58
|
if (state === CallState.DISCONNECTED) {
|
|
56
|
-
this.activeModal.close(
|
|
59
|
+
this.activeModal.close('hangup');
|
|
57
60
|
}
|
|
58
61
|
}));
|
|
59
|
-
|
|
62
|
+
// View mode subscription
|
|
63
|
+
this.subscriptions.add(this.tasService.viewMode$.subscribe(mode => {
|
|
60
64
|
if (mode === ViewMode.PIP) {
|
|
61
|
-
this.activeModal.close(
|
|
65
|
+
this.activeModal.close('pip');
|
|
62
66
|
}
|
|
63
67
|
}));
|
|
64
|
-
|
|
68
|
+
// Mute state subscription
|
|
69
|
+
this.subscriptions.add(this.tasService.isMuted$.subscribe(muted => {
|
|
65
70
|
this.isMuted = muted;
|
|
66
71
|
}));
|
|
67
72
|
}
|
|
68
73
|
initializeCall() {
|
|
69
74
|
if (this.isReturningFromPip) {
|
|
75
|
+
// Returning from PiP - just move videos back
|
|
70
76
|
setTimeout(() => this.tasService.moveVideosToFullscreen(), 100);
|
|
71
77
|
}
|
|
72
78
|
else if (this.sessionId && this.token) {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
.
|
|
76
|
-
console.error("Error connecting to video call:", err);
|
|
79
|
+
// New call - connect to session
|
|
80
|
+
this.tasService.connectSession(this.sessionId, this.token, 'publisher-container', 'subscriber-container').catch(err => {
|
|
81
|
+
console.error('Error connecting to video call:', err);
|
|
77
82
|
});
|
|
78
83
|
}
|
|
79
84
|
}
|
|
@@ -81,69 +86,69 @@ export class TasVideocallComponent {
|
|
|
81
86
|
const publisherEl = this.publisherContainer?.nativeElement;
|
|
82
87
|
const subscriberEl = this.subscriberContainer?.nativeElement;
|
|
83
88
|
if (publisherEl) {
|
|
84
|
-
publisherEl.removeAttribute(
|
|
85
|
-
publisherEl.removeAttribute(
|
|
86
|
-
publisherEl.removeAttribute(
|
|
89
|
+
publisherEl.removeAttribute('style');
|
|
90
|
+
publisherEl.removeAttribute('data-x');
|
|
91
|
+
publisherEl.removeAttribute('data-y');
|
|
87
92
|
}
|
|
88
93
|
if (subscriberEl) {
|
|
89
|
-
subscriberEl.removeAttribute(
|
|
90
|
-
subscriberEl.removeAttribute(
|
|
91
|
-
subscriberEl.removeAttribute(
|
|
94
|
+
subscriberEl.removeAttribute('style');
|
|
95
|
+
subscriberEl.removeAttribute('data-x');
|
|
96
|
+
subscriberEl.removeAttribute('data-y');
|
|
92
97
|
}
|
|
93
98
|
}
|
|
94
99
|
initInteract() {
|
|
95
|
-
interact(
|
|
96
|
-
interact(
|
|
100
|
+
interact('.publisher-view').unset();
|
|
101
|
+
interact('.publisher-view')
|
|
97
102
|
.draggable({
|
|
98
103
|
inertia: true,
|
|
99
104
|
modifiers: [
|
|
100
105
|
interact.modifiers.restrictRect({
|
|
101
|
-
restriction:
|
|
102
|
-
endOnly: true
|
|
103
|
-
})
|
|
106
|
+
restriction: 'parent',
|
|
107
|
+
endOnly: true
|
|
108
|
+
})
|
|
104
109
|
],
|
|
105
110
|
autoScroll: true,
|
|
106
111
|
listeners: {
|
|
107
112
|
move: (event) => {
|
|
108
113
|
const target = event.target;
|
|
109
|
-
const x = (parseFloat(target.getAttribute(
|
|
110
|
-
const y = (parseFloat(target.getAttribute(
|
|
114
|
+
const x = (parseFloat(target.getAttribute('data-x')) || 0) + event.dx;
|
|
115
|
+
const y = (parseFloat(target.getAttribute('data-y')) || 0) + event.dy;
|
|
111
116
|
target.style.transform = `translate(${x}px, ${y}px)`;
|
|
112
|
-
target.setAttribute(
|
|
113
|
-
target.setAttribute(
|
|
114
|
-
}
|
|
115
|
-
}
|
|
117
|
+
target.setAttribute('data-x', String(x));
|
|
118
|
+
target.setAttribute('data-y', String(y));
|
|
119
|
+
}
|
|
120
|
+
}
|
|
116
121
|
})
|
|
117
122
|
.resizable({
|
|
118
123
|
edges: { left: false, right: true, bottom: true, top: false },
|
|
119
124
|
listeners: {
|
|
120
125
|
move: (event) => {
|
|
121
126
|
const target = event.target;
|
|
122
|
-
let x = parseFloat(target.getAttribute(
|
|
123
|
-
let y = parseFloat(target.getAttribute(
|
|
127
|
+
let x = parseFloat(target.getAttribute('data-x')) || 0;
|
|
128
|
+
let y = parseFloat(target.getAttribute('data-y')) || 0;
|
|
124
129
|
target.style.width = `${event.rect.width}px`;
|
|
125
130
|
target.style.height = `${event.rect.height}px`;
|
|
126
131
|
x += event.deltaRect.left;
|
|
127
132
|
y += event.deltaRect.top;
|
|
128
133
|
target.style.transform = `translate(${x}px, ${y}px)`;
|
|
129
|
-
target.setAttribute(
|
|
130
|
-
target.setAttribute(
|
|
131
|
-
}
|
|
134
|
+
target.setAttribute('data-x', String(x));
|
|
135
|
+
target.setAttribute('data-y', String(y));
|
|
136
|
+
}
|
|
132
137
|
},
|
|
133
138
|
modifiers: [
|
|
134
|
-
interact.modifiers.restrictEdges({ outer:
|
|
139
|
+
interact.modifiers.restrictEdges({ outer: 'parent' }),
|
|
135
140
|
interact.modifiers.restrictSize({ min: { width: 150, height: 100 } }),
|
|
136
|
-
interact.modifiers.aspectRatio({ ratio:
|
|
141
|
+
interact.modifiers.aspectRatio({ ratio: 'preserve' })
|
|
137
142
|
],
|
|
138
|
-
inertia: true
|
|
143
|
+
inertia: true
|
|
139
144
|
});
|
|
140
145
|
}
|
|
141
146
|
}
|
|
142
147
|
TasVideocallComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TasVideocallComponent, deps: [{ token: i1.NgbActiveModal }, { token: i2.TasService }], target: i0.ɵɵFactoryTarget.Component });
|
|
143
|
-
TasVideocallComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TasVideocallComponent, selector: "tas-videocall", inputs: { sessionId: "sessionId", token: "token", isReturningFromPip: "isReturningFromPip" }, viewQueries: [{ propertyName: "publisherContainer", first: true, predicate: ["publisherContainer"], descendants: true }, { propertyName: "subscriberContainer", first: true, predicate: ["subscriberContainer"], descendants: true }], ngImport: i0, template: "<div class=\"tas-videocall-container\">\n
|
|
148
|
+
TasVideocallComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TasVideocallComponent, selector: "tas-videocall", inputs: { sessionId: "sessionId", token: "token", isReturningFromPip: "isReturningFromPip" }, viewQueries: [{ propertyName: "publisherContainer", first: true, predicate: ["publisherContainer"], descendants: true }, { propertyName: "subscriberContainer", first: true, predicate: ["subscriberContainer"], descendants: true }], ngImport: i0, template: "<div class=\"tas-videocall-container\">\n\t<div id=\"subscriber-container\" \n\t\t[class.subscriber-view]=\"isPublisherSmall\" \n\t\t[class.publisher-view]=\"!isPublisherSmall\"\n\t\t#subscriberContainer\n\t\t(dblclick)=\"onDoubleClick()\">\n\t</div>\n\n\t<div id=\"publisher-container\" \n\t\t[class.publisher-view]=\"isPublisherSmall\" \n\t\t[class.subscriber-view]=\"!isPublisherSmall\"\n\t\t#publisherContainer \n\t\t(dblclick)=\"onDoubleClick()\">\n\t</div>\n\t\n\t<div class=\"controls-container\">\n\t\t<button class=\"btn swap-btn\" (click)=\"toggleSwap()\" title=\"Swap view\">\n\t\t\t<i class=\"fa fa-refresh\"></i>\n\t\t</button>\n\t\t<button class=\"btn pip-btn\" (click)=\"minimize()\" title=\"Minimize (Picture in Picture)\">\n\t\t\t<i class=\"fa fa-compress\"></i>\n\t\t</button>\n\t\t<button class=\"btn mute-btn\" [class.muted]=\"isMuted\" (click)=\"toggleMute()\" [title]=\"isMuted ? 'Unmute microphone' : 'Mute microphone'\">\n\t\t\t<i class=\"fa\" [class.fa-microphone]=\"!isMuted\" [class.fa-microphone-slash]=\"isMuted\"></i>\n\t\t</button>\n\t\t<button class=\"btn hangup-btn\" (click)=\"hangUp()\" title=\"Hang up\">\n\t\t\t<i class=\"fa fa-phone\" style=\"transform: rotate(135deg);\"></i>\n\t\t</button>\n\t</div>\n</div>\n\n", styles: [".tas-videocall-container{position:relative;width:100vw;height:100vh;background-color:#000;overflow:hidden}.tas-videocall-container ::ng-deep .OT_edge-bar-item,.tas-videocall-container ::ng-deep .OT_mute,.tas-videocall-container ::ng-deep .OT_audio-level-meter,.tas-videocall-container ::ng-deep .OT_bar,.tas-videocall-container ::ng-deep .OT_name{display:none!important}.tas-videocall-container .subscriber-view{width:100%;height:100%;z-index:1}.tas-videocall-container .publisher-view{position:absolute;top:20px;right:20px;width:200px;height:150px;z-index:2;border:2px solid #fff;border-radius:8px;background-color:#333}.tas-videocall-container .controls-container{display:flex;flex-direction:row;gap:20px;position:absolute;bottom:30px;left:50%;transform:translate(-50%);z-index:3;background-color:#00000080;padding:15px 25px;border-radius:50px;-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px)}.tas-videocall-container .controls-container .hangup-btn,.tas-videocall-container .controls-container .swap-btn,.tas-videocall-container .controls-container .pip-btn,.tas-videocall-container .controls-container .mute-btn{width:60px;height:60px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:24px;border:none;box-shadow:0 4px 6px #0000004d;transition:all .2s ease}.tas-videocall-container .controls-container .hangup-btn i,.tas-videocall-container .controls-container .swap-btn i,.tas-videocall-container .controls-container .pip-btn i,.tas-videocall-container .controls-container .mute-btn i{color:#fff}.tas-videocall-container .controls-container .hangup-btn{background:#dc3545}.tas-videocall-container .controls-container .hangup-btn:hover{background:#c82333;transform:scale(1.05)}.tas-videocall-container .controls-container .swap-btn{background:rgba(255,255,255,.2)}.tas-videocall-container .controls-container .swap-btn:hover{background:rgba(255,255,255,.35);transform:scale(1.05)}.tas-videocall-container .controls-container .pip-btn{background:rgba(255,255,255,.2)}.tas-videocall-container .controls-container .pip-btn:hover{background:rgba(255,255,255,.35);transform:scale(1.05)}.tas-videocall-container .controls-container .mute-btn{background:rgba(255,255,255,.2)}.tas-videocall-container .controls-container .mute-btn:hover{background:rgba(255,255,255,.35);transform:scale(1.05)}.tas-videocall-container .controls-container .mute-btn.muted{background:#f39c12}.tas-videocall-container .controls-container .mute-btn.muted:hover{background:#e67e22}\n"] });
|
|
144
149
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TasVideocallComponent, decorators: [{
|
|
145
150
|
type: Component,
|
|
146
|
-
args: [{ selector:
|
|
151
|
+
args: [{ selector: 'tas-videocall', template: "<div class=\"tas-videocall-container\">\n\t<div id=\"subscriber-container\" \n\t\t[class.subscriber-view]=\"isPublisherSmall\" \n\t\t[class.publisher-view]=\"!isPublisherSmall\"\n\t\t#subscriberContainer\n\t\t(dblclick)=\"onDoubleClick()\">\n\t</div>\n\n\t<div id=\"publisher-container\" \n\t\t[class.publisher-view]=\"isPublisherSmall\" \n\t\t[class.subscriber-view]=\"!isPublisherSmall\"\n\t\t#publisherContainer \n\t\t(dblclick)=\"onDoubleClick()\">\n\t</div>\n\t\n\t<div class=\"controls-container\">\n\t\t<button class=\"btn swap-btn\" (click)=\"toggleSwap()\" title=\"Swap view\">\n\t\t\t<i class=\"fa fa-refresh\"></i>\n\t\t</button>\n\t\t<button class=\"btn pip-btn\" (click)=\"minimize()\" title=\"Minimize (Picture in Picture)\">\n\t\t\t<i class=\"fa fa-compress\"></i>\n\t\t</button>\n\t\t<button class=\"btn mute-btn\" [class.muted]=\"isMuted\" (click)=\"toggleMute()\" [title]=\"isMuted ? 'Unmute microphone' : 'Mute microphone'\">\n\t\t\t<i class=\"fa\" [class.fa-microphone]=\"!isMuted\" [class.fa-microphone-slash]=\"isMuted\"></i>\n\t\t</button>\n\t\t<button class=\"btn hangup-btn\" (click)=\"hangUp()\" title=\"Hang up\">\n\t\t\t<i class=\"fa fa-phone\" style=\"transform: rotate(135deg);\"></i>\n\t\t</button>\n\t</div>\n</div>\n\n", styles: [".tas-videocall-container{position:relative;width:100vw;height:100vh;background-color:#000;overflow:hidden}.tas-videocall-container ::ng-deep .OT_edge-bar-item,.tas-videocall-container ::ng-deep .OT_mute,.tas-videocall-container ::ng-deep .OT_audio-level-meter,.tas-videocall-container ::ng-deep .OT_bar,.tas-videocall-container ::ng-deep .OT_name{display:none!important}.tas-videocall-container .subscriber-view{width:100%;height:100%;z-index:1}.tas-videocall-container .publisher-view{position:absolute;top:20px;right:20px;width:200px;height:150px;z-index:2;border:2px solid #fff;border-radius:8px;background-color:#333}.tas-videocall-container .controls-container{display:flex;flex-direction:row;gap:20px;position:absolute;bottom:30px;left:50%;transform:translate(-50%);z-index:3;background-color:#00000080;padding:15px 25px;border-radius:50px;-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px)}.tas-videocall-container .controls-container .hangup-btn,.tas-videocall-container .controls-container .swap-btn,.tas-videocall-container .controls-container .pip-btn,.tas-videocall-container .controls-container .mute-btn{width:60px;height:60px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:24px;border:none;box-shadow:0 4px 6px #0000004d;transition:all .2s ease}.tas-videocall-container .controls-container .hangup-btn i,.tas-videocall-container .controls-container .swap-btn i,.tas-videocall-container .controls-container .pip-btn i,.tas-videocall-container .controls-container .mute-btn i{color:#fff}.tas-videocall-container .controls-container .hangup-btn{background:#dc3545}.tas-videocall-container .controls-container .hangup-btn:hover{background:#c82333;transform:scale(1.05)}.tas-videocall-container .controls-container .swap-btn{background:rgba(255,255,255,.2)}.tas-videocall-container .controls-container .swap-btn:hover{background:rgba(255,255,255,.35);transform:scale(1.05)}.tas-videocall-container .controls-container .pip-btn{background:rgba(255,255,255,.2)}.tas-videocall-container .controls-container .pip-btn:hover{background:rgba(255,255,255,.35);transform:scale(1.05)}.tas-videocall-container .controls-container .mute-btn{background:rgba(255,255,255,.2)}.tas-videocall-container .controls-container .mute-btn:hover{background:rgba(255,255,255,.35);transform:scale(1.05)}.tas-videocall-container .controls-container .mute-btn.muted{background:#f39c12}.tas-videocall-container .controls-container .mute-btn.muted:hover{background:#e67e22}\n"] }]
|
|
147
152
|
}], ctorParameters: function () { return [{ type: i1.NgbActiveModal }, { type: i2.TasService }]; }, propDecorators: { sessionId: [{
|
|
148
153
|
type: Input
|
|
149
154
|
}], token: [{
|
|
@@ -152,9 +157,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
|
|
|
152
157
|
type: Input
|
|
153
158
|
}], publisherContainer: [{
|
|
154
159
|
type: ViewChild,
|
|
155
|
-
args: [
|
|
160
|
+
args: ['publisherContainer']
|
|
156
161
|
}], subscriberContainer: [{
|
|
157
162
|
type: ViewChild,
|
|
158
|
-
args: [
|
|
163
|
+
args: ['subscriberContainer']
|
|
159
164
|
}] } });
|
|
160
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzLXZpZGVvY2FsbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvdGFzLXZpZGVvY2FsbC90YXMtdmlkZW9jYWxsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy90YXMtdmlkZW9jYWxsL3Rhcy12aWRlb2NhbGwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFHVCxLQUFLLEVBQ0wsU0FBUyxHQUdWLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBYyxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLFFBQVEsTUFBTSxZQUFZLENBQUM7Ozs7QUFPbEMsTUFBTSxPQUFPLHFCQUFxQjtJQWNoQyxZQUNTLFdBQTJCLEVBQzFCLFVBQXNCO1FBRHZCLGdCQUFXLEdBQVgsV0FBVyxDQUFnQjtRQUMxQixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBYnZCLHVCQUFrQixHQUFZLEtBQUssQ0FBQztRQUt0QyxxQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFDeEIsY0FBUyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7UUFDM0IsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUVmLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUt4QyxDQUFDO0lBRUosUUFBUTtRQUNOLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUM7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LE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO29CQUNyRCxNQUFNLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDekMsTUFBTSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzNDLENBQUM7YUFDRjtZQUNELFNBQVMsRUFBRTtnQkFDVCxRQUFRLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsQ0FBQztnQkFDckQsUUFBUSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO2dCQUNyRSxRQUFRLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsQ0FBQzthQUN0RDtZQUNELE9BQU8sRUFBRSxJQUFJO1NBQ2QsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzs7a0hBL0tVLHFCQUFxQjtzR0FBckIscUJBQXFCLDBYQ25CbEMsdTFDQTZDQTsyRkQxQmEscUJBQXFCO2tCQUxqQyxTQUFTOytCQUNFLGVBQWU7OEhBS2hCLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFFMkIsa0JBQWtCO3NCQUFsRCxTQUFTO3VCQUFDLG9CQUFvQjtnQkFDRyxtQkFBbUI7c0JBQXBELFNBQVM7dUJBQUMscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBPbkluaXQsXG4gIE9uRGVzdHJveSxcbiAgSW5wdXQsXG4gIFZpZXdDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgQWZ0ZXJWaWV3SW5pdCxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IE5nYkFjdGl2ZU1vZGFsIH0gZnJvbSBcIkBuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXCI7XG5pbXBvcnQgeyBUYXNTZXJ2aWNlLCBDYWxsU3RhdGUsIFZpZXdNb2RlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL3Rhcy5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IGludGVyYWN0IGZyb20gXCJpbnRlcmFjdGpzXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJ0YXMtdmlkZW9jYWxsXCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vdGFzLXZpZGVvY2FsbC5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vdGFzLXZpZGVvY2FsbC5jb21wb25lbnQuc2Nzc1wiXSxcbn0pXG5leHBvcnQgY2xhc3MgVGFzVmlkZW9jYWxsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQge1xuICBASW5wdXQoKSBzZXNzaW9uSWQhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHRva2VuITogc3RyaW5nO1xuICBASW5wdXQoKSBpc1JldHVybmluZ0Zyb21QaXA6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBAVmlld0NoaWxkKFwicHVibGlzaGVyQ29udGFpbmVyXCIpIHB1Ymxpc2hlckNvbnRhaW5lciE6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoXCJzdWJzY3JpYmVyQ29udGFpbmVyXCIpIHN1YnNjcmliZXJDb250YWluZXIhOiBFbGVtZW50UmVmO1xuXG4gIHB1YmxpYyBpc1B1Ymxpc2hlclNtYWxsID0gdHJ1ZTtcbiAgcHVibGljIGNhbGxTdGF0ZSA9IENhbGxTdGF0ZS5JRExFO1xuICBwdWJsaWMgaXNNdXRlZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgYWN0aXZlTW9kYWw6IE5nYkFjdGl2ZU1vZGFsLFxuICAgIHByaXZhdGUgdGFzU2VydmljZTogVGFzU2VydmljZVxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zZXR1cFN1YnNjcmlwdGlvbnMoKTtcbiAgICB0aGlzLmluaXRpYWxpemVDYWxsKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pbml0SW50ZXJhY3QoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuXG4gICAgaWYgKCF0aGlzLnRhc1NlcnZpY2UuaXNQaXBNb2RlKCkpIHtcbiAgICAgIHRoaXMudGFzU2VydmljZS5kaXNjb25uZWN0U2Vzc2lvbigpO1xuICAgIH1cblxuICAgIGludGVyYWN0KFwiLnB1Ymxpc2hlci12aWV3XCIpLnVuc2V0KCk7XG4gIH1cblxuICAvLyBQdWJsaWMgTWV0aG9kc1xuICBoYW5nVXAoKTogdm9pZCB7XG4gICAgdGhpcy50YXNTZXJ2aWNlLmRpc2Nvbm5lY3RTZXNzaW9uKCk7XG4gIH1cblxuICB0b2dnbGVNdXRlKCk6IHZvaWQge1xuICAgIHRoaXMudGFzU2VydmljZS50b2dnbGVNdXRlKCk7XG4gIH1cblxuICBtaW5pbWl6ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnRhc1NlcnZpY2UubW92ZU1haW5WaWRlb1RvKFwicGlwLW1haW4tdmlkZW9cIik7XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnRhc1NlcnZpY2UuZW50ZXJQaXBNb2RlKCksIDUwKTtcbiAgfVxuXG4gIHRvZ2dsZVN3YXAoKTogdm9pZCB7XG4gICAgdGhpcy5pc1B1Ymxpc2hlclNtYWxsID0gIXRoaXMuaXNQdWJsaXNoZXJTbWFsbDtcbiAgICB0aGlzLnJlc2V0VmlkZW9Qb3NpdGlvbnMoKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuaW5pdEludGVyYWN0KCkpO1xuICB9XG5cbiAgb25Eb3VibGVDbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLnRvZ2dsZVN3YXAoKTtcbiAgfVxuXG4gIC8vIFByaXZhdGUgTWV0aG9kc1xuICBwcml2YXRlIHNldHVwU3Vic2NyaXB0aW9ucygpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy50YXNTZXJ2aWNlLmNhbGxTdGF0ZSQuc3Vic2NyaWJlKChzdGF0ZSkgPT4ge1xuICAgICAgICB0aGlzLmNhbGxTdGF0ZSA9IHN0YXRlO1xuICAgICAgICBpZiAoc3RhdGUgPT09IENhbGxTdGF0ZS5ESVNDT05ORUNURUQpIHtcbiAgICAgICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKFwiaGFuZ3VwXCIpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy50YXNTZXJ2aWNlLnZpZXdNb2RlJC5zdWJzY3JpYmUoKG1vZGUpID0+IHtcbiAgICAgICAgaWYgKG1vZGUgPT09IFZpZXdNb2RlLlBJUCkge1xuICAgICAgICAgIHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoXCJwaXBcIik7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLnRhc1NlcnZpY2UuaXNNdXRlZCQuc3Vic2NyaWJlKChtdXRlZCkgPT4ge1xuICAgICAgICB0aGlzLmlzTXV0ZWQgPSBtdXRlZDtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUNhbGwoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNSZXR1cm5pbmdGcm9tUGlwKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudGFzU2VydmljZS5tb3ZlVmlkZW9zVG9GdWxsc2NyZWVuKCksIDEwMCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnNlc3Npb25JZCAmJiB0aGlzLnRva2VuKSB7XG4gICAgICB0aGlzLnRhc1NlcnZpY2VcbiAgICAgICAgLmNvbm5lY3RTZXNzaW9uKFxuICAgICAgICAgIHRoaXMuc2Vzc2lvbklkLFxuICAgICAgICAgIHRoaXMudG9rZW4sXG4gICAgICAgICAgXCJwdWJsaXNoZXItY29udGFpbmVyXCIsXG4gICAgICAgICAgXCJzdWJzY3JpYmVyLWNvbnRhaW5lclwiXG4gICAgICAgIClcbiAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgY29ubmVjdGluZyB0byB2aWRlbyBjYWxsOlwiLCBlcnIpO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc2V0VmlkZW9Qb3NpdGlvbnMoKTogdm9pZCB7XG4gICAgY29uc3QgcHVibGlzaGVyRWwgPSB0aGlzLnB1Ymxpc2hlckNvbnRhaW5lcj8ubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCBzdWJzY3JpYmVyRWwgPSB0aGlzLnN1YnNjcmliZXJDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICBpZiAocHVibGlzaGVyRWwpIHtcbiAgICAgIHB1Ymxpc2hlckVsLnJlbW92ZUF0dHJpYnV0ZShcInN0eWxlXCIpO1xuICAgICAgcHVibGlzaGVyRWwucmVtb3ZlQXR0cmlidXRlKFwiZGF0YS14XCIpO1xuICAgICAgcHVibGlzaGVyRWwucmVtb3ZlQXR0cmlidXRlKFwiZGF0YS15XCIpO1xuICAgIH1cblxuICAgIGlmIChzdWJzY3JpYmVyRWwpIHtcbiAgICAgIHN1YnNjcmliZXJFbC5yZW1vdmVBdHRyaWJ1dGUoXCJzdHlsZVwiKTtcbiAgICAgIHN1YnNjcmliZXJFbC5yZW1vdmVBdHRyaWJ1dGUoXCJkYXRhLXhcIik7XG4gICAgICBzdWJzY3JpYmVyRWwucmVtb3ZlQXR0cmlidXRlKFwiZGF0YS15XCIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5pdEludGVyYWN0KCk6IHZvaWQge1xuICAgIGludGVyYWN0KFwiLnB1Ymxpc2hlci12aWV3XCIpLnVuc2V0KCk7XG5cbiAgICBpbnRlcmFjdChcIi5wdWJsaXNoZXItdmlld1wiKVxuICAgICAgLmRyYWdnYWJsZSh7XG4gICAgICAgIGluZXJ0aWE6IHRydWUsXG4gICAgICAgIG1vZGlmaWVyczogW1xuICAgICAgICAgIGludGVyYWN0Lm1vZGlmaWVycy5yZXN0cmljdFJlY3Qoe1xuICAgICAgICAgICAgcmVzdHJpY3Rpb246IFwicGFyZW50XCIsXG4gICAgICAgICAgICBlbmRPbmx5OiB0cnVlLFxuICAgICAgICAgIH0pLFxuICAgICAgICBdLFxuICAgICAgICBhdXRvU2Nyb2xsOiB0cnVlLFxuICAgICAgICBsaXN0ZW5lcnM6IHtcbiAgICAgICAgICBtb3ZlOiAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICAgICAgICAgIGNvbnN0IHggPVxuICAgICAgICAgICAgICAocGFyc2VGbG9hdCh0YXJnZXQuZ2V0QXR0cmlidXRlKFwiZGF0YS14XCIpKSB8fCAwKSArIGV2ZW50LmR4O1xuICAgICAgICAgICAgY29uc3QgeSA9XG4gICAgICAgICAgICAgIChwYXJzZUZsb2F0KHRhcmdldC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXlcIikpIHx8IDApICsgZXZlbnQuZHk7XG5cbiAgICAgICAgICAgIHRhcmdldC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlKCR7eH1weCwgJHt5fXB4KWA7XG4gICAgICAgICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKFwiZGF0YS14XCIsIFN0cmluZyh4KSk7XG4gICAgICAgICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKFwiZGF0YS15XCIsIFN0cmluZyh5KSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICAucmVzaXphYmxlKHtcbiAgICAgICAgZWRnZXM6IHsgbGVmdDogZmFsc2UsIHJpZ2h0OiB0cnVlLCBib3R0b206IHRydWUsIHRvcDogZmFsc2UgfSxcbiAgICAgICAgbGlzdGVuZXJzOiB7XG4gICAgICAgICAgbW92ZTogKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgICAgICAgICBsZXQgeCA9IHBhcnNlRmxvYXQodGFyZ2V0LmdldEF0dHJpYnV0ZShcImRhdGEteFwiKSkgfHwgMDtcbiAgICAgICAgICAgIGxldCB5ID0gcGFyc2VGbG9hdCh0YXJnZXQuZ2V0QXR0cmlidXRlKFwiZGF0YS15XCIpKSB8fCAwO1xuXG4gICAgICAgICAgICB0YXJnZXQuc3R5bGUud2lkdGggPSBgJHtldmVudC5yZWN0LndpZHRofXB4YDtcbiAgICAgICAgICAgIHRhcmdldC5zdHlsZS5oZWlnaHQgPSBgJHtldmVudC5yZWN0LmhlaWdodH1weGA7XG5cbiAgICAgICAgICAgIHggKz0gZXZlbnQuZGVsdGFSZWN0LmxlZnQ7XG4gICAgICAgICAgICB5ICs9IGV2ZW50LmRlbHRhUmVjdC50b3A7XG5cbiAgICAgICAgICAgIHRhcmdldC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlKCR7eH1weCwgJHt5fXB4KWA7XG4gICAgICAgICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKFwiZGF0YS14XCIsIFN0cmluZyh4KSk7XG4gICAgICAgICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKFwiZGF0YS15XCIsIFN0cmluZyh5KSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgbW9kaWZpZXJzOiBbXG4gICAgICAgICAgaW50ZXJhY3QubW9kaWZpZXJzLnJlc3RyaWN0RWRnZXMoeyBvdXRlcjogXCJwYXJlbnRcIiB9KSxcbiAgICAgICAgICBpbnRlcmFjdC5tb2RpZmllcnMucmVzdHJpY3RTaXplKHsgbWluOiB7IHdpZHRoOiAxNTAsIGhlaWdodDogMTAwIH0gfSksXG4gICAgICAgICAgaW50ZXJhY3QubW9kaWZpZXJzLmFzcGVjdFJhdGlvKHsgcmF0aW86IFwicHJlc2VydmVcIiB9KSxcbiAgICAgICAgXSxcbiAgICAgICAgaW5lcnRpYTogdHJ1ZSxcbiAgICAgIH0pO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwidGFzLXZpZGVvY2FsbC1jb250YWluZXJcIj5cbiAgPGRpdlxuICAgIGlkPVwic3Vic2NyaWJlci1jb250YWluZXJcIlxuICAgIFtjbGFzcy5zdWJzY3JpYmVyLXZpZXddPVwiaXNQdWJsaXNoZXJTbWFsbFwiXG4gICAgW2NsYXNzLnB1Ymxpc2hlci12aWV3XT1cIiFpc1B1Ymxpc2hlclNtYWxsXCJcbiAgICAjc3Vic2NyaWJlckNvbnRhaW5lclxuICAgIChkYmxjbGljayk9XCJvbkRvdWJsZUNsaWNrKClcIlxuICA+PC9kaXY+XG5cbiAgPGRpdlxuICAgIGlkPVwicHVibGlzaGVyLWNvbnRhaW5lclwiXG4gICAgW2NsYXNzLnB1Ymxpc2hlci12aWV3XT1cImlzUHVibGlzaGVyU21hbGxcIlxuICAgIFtjbGFzcy5zdWJzY3JpYmVyLXZpZXddPVwiIWlzUHVibGlzaGVyU21hbGxcIlxuICAgICNwdWJsaXNoZXJDb250YWluZXJcbiAgICAoZGJsY2xpY2spPVwib25Eb3VibGVDbGljaygpXCJcbiAgPjwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJjb250cm9scy1jb250YWluZXJcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIHN3YXAtYnRuXCIgKGNsaWNrKT1cInRvZ2dsZVN3YXAoKVwiIHRpdGxlPVwiQ2FtYmlhciB2aXN0YVwiPlxuICAgICAgPGkgY2xhc3M9XCJmYSBmYS1yZWZyZXNoXCI+PC9pPlxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b25cbiAgICAgIGNsYXNzPVwiYnRuIHBpcC1idG5cIlxuICAgICAgKGNsaWNrKT1cIm1pbmltaXplKClcIlxuICAgICAgdGl0bGU9XCJNaW5pbWl6YXIgKFBpY3R1cmUgaW4gUGljdHVyZSlcIlxuICAgID5cbiAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY29tcHJlc3NcIj48L2k+XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvblxuICAgICAgY2xhc3M9XCJidG4gbXV0ZS1idG5cIlxuICAgICAgW2NsYXNzLm11dGVkXT1cImlzTXV0ZWRcIlxuICAgICAgKGNsaWNrKT1cInRvZ2dsZU11dGUoKVwiXG4gICAgICBbdGl0bGVdPVwiaXNNdXRlZCA/ICdBY3RpdmFyIG1pY3LDs2Zvbm8nIDogJ1NpbGVuY2lhciBtaWNyw7Nmb25vJ1wiXG4gICAgPlxuICAgICAgPGlcbiAgICAgICAgY2xhc3M9XCJmYVwiXG4gICAgICAgIFtjbGFzcy5mYS1taWNyb3Bob25lXT1cIiFpc011dGVkXCJcbiAgICAgICAgW2NsYXNzLmZhLW1pY3JvcGhvbmUtc2xhc2hdPVwiaXNNdXRlZFwiXG4gICAgICA+PC9pPlxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidG4gaGFuZ3VwLWJ0blwiIChjbGljayk9XCJoYW5nVXAoKVwiIHRpdGxlPVwiQ29sZ2FyXCI+XG4gICAgICA8aSBjbGFzcz1cImZhIGZhLXBob25lXCIgc3R5bGU9XCJ0cmFuc2Zvcm06IHJvdGF0ZSgxMzVkZWcpXCI+PC9pPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|
|
165
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzLXZpZGVvY2FsbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9jb21wb25lbnRzL3Rhcy12aWRlb2NhbGwvdGFzLXZpZGVvY2FsbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9jb21wb25lbnRzL3Rhcy12aWRlb2NhbGwvdGFzLXZpZGVvY2FsbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixLQUFLLEVBQUUsU0FBUyxFQUE2QixNQUFNLGVBQWUsQ0FBQztBQUcxRyxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxRQUFRLE1BQU0sWUFBWSxDQUFDOzs7O0FBT2xDLE1BQU0sT0FBTyxxQkFBcUI7SUFlakMsWUFDUSxXQUEyQixFQUMxQixVQUFzQjtRQUR2QixnQkFBVyxHQUFYLFdBQVcsQ0FBZ0I7UUFDMUIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQWJ0Qix1QkFBa0IsR0FBWSxLQUFLLENBQUM7UUFLdEMscUJBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLGNBQVMsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO1FBQzNCLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFFZixrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFLdkMsQ0FBQztJQUVMLFFBQVE7UUFDUCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVELGVBQWU7UUFDZCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDckIsQ0FB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b21wb25lbnQsIE9uSW5pdCwgT25EZXN0cm95LCBJbnB1dCwgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBBZnRlclZpZXdJbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ2JBY3RpdmVNb2RhbCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcbmltcG9ydCB7IFRhc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90YXMuc2VydmljZSc7XG5pbXBvcnQgeyBDYWxsU3RhdGUsIFZpZXdNb2RlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy90YXMuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCBpbnRlcmFjdCBmcm9tICdpbnRlcmFjdGpzJztcblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAndGFzLXZpZGVvY2FsbCcsXG5cdHRlbXBsYXRlVXJsOiAnLi90YXMtdmlkZW9jYWxsLmNvbXBvbmVudC5odG1sJyxcblx0c3R5bGVVcmxzOiBbJy4vdGFzLXZpZGVvY2FsbC5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFRhc1ZpZGVvY2FsbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcblxuXHRASW5wdXQoKSBzZXNzaW9uSWQhOiBzdHJpbmc7XG5cdEBJbnB1dCgpIHRva2VuITogc3RyaW5nO1xuXHRASW5wdXQoKSBpc1JldHVybmluZ0Zyb21QaXA6IGJvb2xlYW4gPSBmYWxzZTtcblx0XG5cdEBWaWV3Q2hpbGQoJ3B1Ymxpc2hlckNvbnRhaW5lcicpIHB1Ymxpc2hlckNvbnRhaW5lciE6IEVsZW1lbnRSZWY7XG5cdEBWaWV3Q2hpbGQoJ3N1YnNjcmliZXJDb250YWluZXInKSBzdWJzY3JpYmVyQ29udGFpbmVyITogRWxlbWVudFJlZjtcblxuXHRwdWJsaWMgaXNQdWJsaXNoZXJTbWFsbCA9IHRydWU7XG5cdHB1YmxpYyBjYWxsU3RhdGUgPSBDYWxsU3RhdGUuSURMRTtcblx0cHVibGljIGlzTXV0ZWQgPSBmYWxzZTtcblxuXHRwcml2YXRlIHN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cblx0Y29uc3RydWN0b3IoXG5cdFx0cHVibGljIGFjdGl2ZU1vZGFsOiBOZ2JBY3RpdmVNb2RhbCxcblx0XHRwcml2YXRlIHRhc1NlcnZpY2U6IFRhc1NlcnZpY2Vcblx0KSB7IH1cblxuXHRuZ09uSW5pdCgpOiB2b2lkIHtcblx0XHR0aGlzLnNldHVwU3Vic2NyaXB0aW9ucygpO1xuXHRcdHRoaXMuaW5pdGlhbGl6ZUNhbGwoKTtcblx0fVxuXG5cdG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcblx0XHR0aGlzLmluaXRJbnRlcmFjdCgpO1xuXHR9XG5cblx0bmdPbkRlc3Ryb3koKTogdm9pZCB7XG5cdFx0dGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG5cdFx0XG5cdFx0Ly8gT25seSBkaXNjb25uZWN0IGlmIG5vdCBpbiBQaVAgbW9kZSAoa2VlcCBzZXNzaW9uIGFsaXZlIGZvciBmbG9hdGluZyB3aW5kb3cpXG5cdFx0aWYgKCF0aGlzLnRhc1NlcnZpY2UuaXNQaXBNb2RlKCkpIHtcblx0XHRcdHRoaXMudGFzU2VydmljZS5kaXNjb25uZWN0U2Vzc2lvbigpO1xuXHRcdH1cblx0XHRcblx0XHRpbnRlcmFjdCgnLnB1Ymxpc2hlci12aWV3JykudW5zZXQoKTtcblx0fVxuXG5cdC8vIFB1YmxpYyBNZXRob2RzXG5cdGhhbmdVcCgpOiB2b2lkIHtcblx0XHR0aGlzLnRhc1NlcnZpY2UuZGlzY29ubmVjdFNlc3Npb24oKTtcblx0fVxuXG5cdHRvZ2dsZU11dGUoKTogdm9pZCB7XG5cdFx0dGhpcy50YXNTZXJ2aWNlLnRvZ2dsZU11dGUoKTtcblx0fVxuXG5cdG1pbmltaXplKCk6IHZvaWQge1xuXHRcdHRoaXMudGFzU2VydmljZS5tb3ZlTWFpblZpZGVvVG8oJ3BpcC1tYWluLXZpZGVvJyk7XG5cdFx0Ly8gU21hbGwgZGVsYXkgdG8gZW5zdXJlIHZpZGVvIGlzIG1vdmVkIGJlZm9yZSBjbG9zaW5nIG1vZGFsXG5cdFx0c2V0VGltZW91dCgoKSA9PiB0aGlzLnRhc1NlcnZpY2UuZW50ZXJQaXBNb2RlKCksIDUwKTtcblx0fVxuXG5cdHRvZ2dsZVN3YXAoKTogdm9pZCB7XG5cdFx0dGhpcy5pc1B1Ymxpc2hlclNtYWxsID0gIXRoaXMuaXNQdWJsaXNoZXJTbWFsbDtcblx0XHR0aGlzLnJlc2V0VmlkZW9Qb3NpdGlvbnMoKTtcblx0XHRzZXRUaW1lb3V0KCgpID0+IHRoaXMuaW5pdEludGVyYWN0KCkpO1xuXHR9XG5cblx0b25Eb3VibGVDbGljaygpOiB2b2lkIHtcblx0XHR0aGlzLnRvZ2dsZVN3YXAoKTtcblx0fVxuXG5cdC8vIFByaXZhdGUgTWV0aG9kc1xuXHRwcml2YXRlIHNldHVwU3Vic2NyaXB0aW9ucygpOiB2b2lkIHtcblx0XHQvLyBDYWxsIHN0YXRlIHN1YnNjcmlwdGlvblxuXHRcdHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG5cdFx0XHR0aGlzLnRhc1NlcnZpY2UuY2FsbFN0YXRlJC5zdWJzY3JpYmUoc3RhdGUgPT4ge1xuXHRcdFx0XHR0aGlzLmNhbGxTdGF0ZSA9IHN0YXRlO1xuXHRcdFx0XHRpZiAoc3RhdGUgPT09IENhbGxTdGF0ZS5ESVNDT05ORUNURUQpIHtcblx0XHRcdFx0XHR0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCdoYW5ndXAnKTtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHQpO1xuXG5cdFx0Ly8gVmlldyBtb2RlIHN1YnNjcmlwdGlvblxuXHRcdHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG5cdFx0XHR0aGlzLnRhc1NlcnZpY2Uudmlld01vZGUkLnN1YnNjcmliZShtb2RlID0+IHtcblx0XHRcdFx0aWYgKG1vZGUgPT09IFZpZXdNb2RlLlBJUCkge1xuXHRcdFx0XHRcdHRoaXMuYWN0aXZlTW9kYWwuY2xvc2UoJ3BpcCcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdCk7XG5cblx0XHQvLyBNdXRlIHN0YXRlIHN1YnNjcmlwdGlvblxuXHRcdHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG5cdFx0XHR0aGlzLnRhc1NlcnZpY2UuaXNNdXRlZCQuc3Vic2NyaWJlKG11dGVkID0+IHtcblx0XHRcdFx0dGhpcy5pc011dGVkID0gbXV0ZWQ7XG5cdFx0XHR9KVxuXHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIGluaXRpYWxpemVDYWxsKCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLmlzUmV0dXJuaW5nRnJvbVBpcCkge1xuXHRcdFx0Ly8gUmV0dXJuaW5nIGZyb20gUGlQIC0ganVzdCBtb3ZlIHZpZGVvcyBiYWNrXG5cdFx0XHRzZXRUaW1lb3V0KCgpID0+IHRoaXMudGFzU2VydmljZS5tb3ZlVmlkZW9zVG9GdWxsc2NyZWVuKCksIDEwMCk7XG5cdFx0fSBlbHNlIGlmICh0aGlzLnNlc3Npb25JZCAmJiB0aGlzLnRva2VuKSB7XG5cdFx0XHQvLyBOZXcgY2FsbCAtIGNvbm5lY3QgdG8gc2Vzc2lvblxuXHRcdFx0dGhpcy50YXNTZXJ2aWNlLmNvbm5lY3RTZXNzaW9uKFxuXHRcdFx0XHR0aGlzLnNlc3Npb25JZCxcblx0XHRcdFx0dGhpcy50b2tlbixcblx0XHRcdFx0J3B1Ymxpc2hlci1jb250YWluZXInLFxuXHRcdFx0XHQnc3Vic2NyaWJlci1jb250YWluZXInXG5cdFx0XHQpLmNhdGNoKGVyciA9PiB7XG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGNvbm5lY3RpbmcgdG8gdmlkZW8gY2FsbDonLCBlcnIpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSByZXNldFZpZGVvUG9zaXRpb25zKCk6IHZvaWQge1xuXHRcdGNvbnN0IHB1Ymxpc2hlckVsID0gdGhpcy5wdWJsaXNoZXJDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG5cdFx0Y29uc3Qgc3Vic2NyaWJlckVsID0gdGhpcy5zdWJzY3JpYmVyQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuXG5cdFx0aWYgKHB1Ymxpc2hlckVsKSB7XG5cdFx0XHRwdWJsaXNoZXJFbC5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJyk7XG5cdFx0XHRwdWJsaXNoZXJFbC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEteCcpO1xuXHRcdFx0cHVibGlzaGVyRWwucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXknKTtcblx0XHR9XG5cblx0XHRpZiAoc3Vic2NyaWJlckVsKSB7XG5cdFx0XHRzdWJzY3JpYmVyRWwucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpO1xuXHRcdFx0c3Vic2NyaWJlckVsLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS14Jyk7XG5cdFx0XHRzdWJzY3JpYmVyRWwucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXknKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGluaXRJbnRlcmFjdCgpOiB2b2lkIHtcblx0XHRpbnRlcmFjdCgnLnB1Ymxpc2hlci12aWV3JykudW5zZXQoKTtcblxuXHRcdGludGVyYWN0KCcucHVibGlzaGVyLXZpZXcnKVxuXHRcdFx0LmRyYWdnYWJsZSh7XG5cdFx0XHRcdGluZXJ0aWE6IHRydWUsXG5cdFx0XHRcdG1vZGlmaWVyczogW1xuXHRcdFx0XHRcdGludGVyYWN0Lm1vZGlmaWVycy5yZXN0cmljdFJlY3Qoe1xuXHRcdFx0XHRcdFx0cmVzdHJpY3Rpb246ICdwYXJlbnQnLFxuXHRcdFx0XHRcdFx0ZW5kT25seTogdHJ1ZVxuXHRcdFx0XHRcdH0pXG5cdFx0XHRcdF0sXG5cdFx0XHRcdGF1dG9TY3JvbGw6IHRydWUsXG5cdFx0XHRcdGxpc3RlbmVyczoge1xuXHRcdFx0XHRcdG1vdmU6IChldmVudCkgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuXHRcdFx0XHRcdFx0Y29uc3QgeCA9IChwYXJzZUZsb2F0KHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEteCcpKSB8fCAwKSArIGV2ZW50LmR4O1xuXHRcdFx0XHRcdFx0Y29uc3QgeSA9IChwYXJzZUZsb2F0KHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEteScpKSB8fCAwKSArIGV2ZW50LmR5O1xuXG5cdFx0XHRcdFx0XHR0YXJnZXQuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZSgke3h9cHgsICR7eX1weClgO1xuXHRcdFx0XHRcdFx0dGFyZ2V0LnNldEF0dHJpYnV0ZSgnZGF0YS14JywgU3RyaW5nKHgpKTtcblx0XHRcdFx0XHRcdHRhcmdldC5zZXRBdHRyaWJ1dGUoJ2RhdGEteScsIFN0cmluZyh5KSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LnJlc2l6YWJsZSh7XG5cdFx0XHRcdGVkZ2VzOiB7IGxlZnQ6IGZhbHNlLCByaWdodDogdHJ1ZSwgYm90dG9tOiB0cnVlLCB0b3A6IGZhbHNlIH0sXG5cdFx0XHRcdGxpc3RlbmVyczoge1xuXHRcdFx0XHRcdG1vdmU6IChldmVudCkgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuXHRcdFx0XHRcdFx0bGV0IHggPSBwYXJzZUZsb2F0KHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEteCcpKSB8fCAwO1xuXHRcdFx0XHRcdFx0bGV0IHkgPSBwYXJzZUZsb2F0KHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEteScpKSB8fCAwO1xuXG5cdFx0XHRcdFx0XHR0YXJnZXQuc3R5bGUud2lkdGggPSBgJHtldmVudC5yZWN0LndpZHRofXB4YDtcblx0XHRcdFx0XHRcdHRhcmdldC5zdHlsZS5oZWlnaHQgPSBgJHtldmVudC5yZWN0LmhlaWdodH1weGA7XG5cblx0XHRcdFx0XHRcdHggKz0gZXZlbnQuZGVsdGFSZWN0LmxlZnQ7XG5cdFx0XHRcdFx0XHR5ICs9IGV2ZW50LmRlbHRhUmVjdC50b3A7XG5cblx0XHRcdFx0XHRcdHRhcmdldC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlKCR7eH1weCwgJHt5fXB4KWA7XG5cdFx0XHRcdFx0XHR0YXJnZXQuc2V0QXR0cmlidXRlKCdkYXRhLXgnLCBTdHJpbmcoeCkpO1xuXHRcdFx0XHRcdFx0dGFyZ2V0LnNldEF0dHJpYnV0ZSgnZGF0YS15JywgU3RyaW5nKHkpKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdG1vZGlmaWVyczogW1xuXHRcdFx0XHRcdGludGVyYWN0Lm1vZGlmaWVycy5yZXN0cmljdEVkZ2VzKHsgb3V0ZXI6ICdwYXJlbnQnIH0pLFxuXHRcdFx0XHRcdGludGVyYWN0Lm1vZGlmaWVycy5yZXN0cmljdFNpemUoeyBtaW46IHsgd2lkdGg6IDE1MCwgaGVpZ2h0OiAxMDAgfSB9KSxcblx0XHRcdFx0XHRpbnRlcmFjdC5tb2RpZmllcnMuYXNwZWN0UmF0aW8oeyByYXRpbzogJ3ByZXNlcnZlJyB9KVxuXHRcdFx0XHRdLFxuXHRcdFx0XHRpbmVydGlhOiB0cnVlXG5cdFx0XHR9KTtcblx0fVxufVxuXG4iLCI8ZGl2IGNsYXNzPVwidGFzLXZpZGVvY2FsbC1jb250YWluZXJcIj5cblx0PGRpdiBpZD1cInN1YnNjcmliZXItY29udGFpbmVyXCIgXG5cdFx0W2NsYXNzLnN1YnNjcmliZXItdmlld109XCJpc1B1Ymxpc2hlclNtYWxsXCIgXG5cdFx0W2NsYXNzLnB1Ymxpc2hlci12aWV3XT1cIiFpc1B1Ymxpc2hlclNtYWxsXCJcblx0XHQjc3Vic2NyaWJlckNvbnRhaW5lclxuXHRcdChkYmxjbGljayk9XCJvbkRvdWJsZUNsaWNrKClcIj5cblx0PC9kaXY+XG5cblx0PGRpdiBpZD1cInB1Ymxpc2hlci1jb250YWluZXJcIiBcblx0XHRbY2xhc3MucHVibGlzaGVyLXZpZXddPVwiaXNQdWJsaXNoZXJTbWFsbFwiIFxuXHRcdFtjbGFzcy5zdWJzY3JpYmVyLXZpZXddPVwiIWlzUHVibGlzaGVyU21hbGxcIlxuXHRcdCNwdWJsaXNoZXJDb250YWluZXIgXG5cdFx0KGRibGNsaWNrKT1cIm9uRG91YmxlQ2xpY2soKVwiPlxuXHQ8L2Rpdj5cblx0XG5cdDxkaXYgY2xhc3M9XCJjb250cm9scy1jb250YWluZXJcIj5cblx0XHQ8YnV0dG9uIGNsYXNzPVwiYnRuIHN3YXAtYnRuXCIgKGNsaWNrKT1cInRvZ2dsZVN3YXAoKVwiIHRpdGxlPVwiU3dhcCB2aWV3XCI+XG5cdFx0XHQ8aSBjbGFzcz1cImZhIGZhLXJlZnJlc2hcIj48L2k+XG5cdFx0PC9idXR0b24+XG5cdFx0PGJ1dHRvbiBjbGFzcz1cImJ0biBwaXAtYnRuXCIgKGNsaWNrKT1cIm1pbmltaXplKClcIiB0aXRsZT1cIk1pbmltaXplIChQaWN0dXJlIGluIFBpY3R1cmUpXCI+XG5cdFx0XHQ8aSBjbGFzcz1cImZhIGZhLWNvbXByZXNzXCI+PC9pPlxuXHRcdDwvYnV0dG9uPlxuXHRcdDxidXR0b24gY2xhc3M9XCJidG4gbXV0ZS1idG5cIiBbY2xhc3MubXV0ZWRdPVwiaXNNdXRlZFwiIChjbGljayk9XCJ0b2dnbGVNdXRlKClcIiBbdGl0bGVdPVwiaXNNdXRlZCA/ICdVbm11dGUgbWljcm9waG9uZScgOiAnTXV0ZSBtaWNyb3Bob25lJ1wiPlxuXHRcdFx0PGkgY2xhc3M9XCJmYVwiIFtjbGFzcy5mYS1taWNyb3Bob25lXT1cIiFpc011dGVkXCIgW2NsYXNzLmZhLW1pY3JvcGhvbmUtc2xhc2hdPVwiaXNNdXRlZFwiPjwvaT5cblx0XHQ8L2J1dHRvbj5cblx0XHQ8YnV0dG9uIGNsYXNzPVwiYnRuIGhhbmd1cC1idG5cIiAoY2xpY2spPVwiaGFuZ1VwKClcIiB0aXRsZT1cIkhhbmcgdXBcIj5cblx0XHRcdDxpIGNsYXNzPVwiZmEgZmEtcGhvbmVcIiBzdHlsZT1cInRyYW5zZm9ybTogcm90YXRlKDEzNWRlZyk7XCI+PC9pPlxuXHRcdDwvYnV0dG9uPlxuXHQ8L2Rpdj5cbjwvZGl2PlxuXG4iXX0=
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { Component, Input } from '@angular/core';
|
|
2
|
+
import { Subscription } from 'rxjs';
|
|
3
|
+
import { switchMap } from 'rxjs/operators';
|
|
4
|
+
import { TasRoomType, TasSessionType, TasUserRole, ViewMode } from '../../interfaces/tas.interfaces';
|
|
5
|
+
import { TasVideocallComponent } from '../tas-videocall/tas-videocall.component';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "@ng-bootstrap/ng-bootstrap";
|
|
8
|
+
import * as i2 from "../../services/tas.service";
|
|
9
|
+
import * as i3 from "@angular/common";
|
|
10
|
+
export var WaitingRoomState;
|
|
11
|
+
(function (WaitingRoomState) {
|
|
12
|
+
WaitingRoomState["IDLE"] = "IDLE";
|
|
13
|
+
WaitingRoomState["CREATING_ROOM"] = "CREATING_ROOM";
|
|
14
|
+
WaitingRoomState["GETTING_TOKEN"] = "GETTING_TOKEN";
|
|
15
|
+
WaitingRoomState["READY"] = "READY";
|
|
16
|
+
WaitingRoomState["ERROR"] = "ERROR";
|
|
17
|
+
})(WaitingRoomState || (WaitingRoomState = {}));
|
|
18
|
+
export class TasWaitingRoomComponent {
|
|
19
|
+
constructor(activeModal, tasService, modalService) {
|
|
20
|
+
this.activeModal = activeModal;
|
|
21
|
+
this.tasService = tasService;
|
|
22
|
+
this.modalService = modalService;
|
|
23
|
+
// Room configuration inputs
|
|
24
|
+
this.appointmentId = 1;
|
|
25
|
+
this.product = 'uell';
|
|
26
|
+
this.tenantId = '';
|
|
27
|
+
this.regularUserIds = [];
|
|
28
|
+
this.moderatorUserIds = [];
|
|
29
|
+
// Component state
|
|
30
|
+
this.state = WaitingRoomState.IDLE;
|
|
31
|
+
this.WaitingRoomState = WaitingRoomState; // Expose enum to template
|
|
32
|
+
this.errorMessage = '';
|
|
33
|
+
// Session data
|
|
34
|
+
this.sessionId = '';
|
|
35
|
+
this.token = '';
|
|
36
|
+
this.users = [];
|
|
37
|
+
this.subscriptions = new Subscription();
|
|
38
|
+
this.videoCallModalRef = null;
|
|
39
|
+
}
|
|
40
|
+
ngOnInit() {
|
|
41
|
+
this.buildUsersArray();
|
|
42
|
+
this.setupViewModeSubscription();
|
|
43
|
+
}
|
|
44
|
+
ngOnDestroy() {
|
|
45
|
+
this.subscriptions.unsubscribe();
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Creates the room and fetches the token
|
|
49
|
+
*/
|
|
50
|
+
createRoom() {
|
|
51
|
+
if (!this.tenantId || !this.currentUser?.name) {
|
|
52
|
+
this.state = WaitingRoomState.ERROR;
|
|
53
|
+
this.errorMessage = 'Missing configuration data (tenant or user)';
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
this.state = WaitingRoomState.CREATING_ROOM;
|
|
57
|
+
this.errorMessage = '';
|
|
58
|
+
const body = {
|
|
59
|
+
roomType: TasRoomType.TAS,
|
|
60
|
+
type: TasSessionType.SPONTANEOUS,
|
|
61
|
+
tenant: this.tenantId,
|
|
62
|
+
appointmentId: this.appointmentId,
|
|
63
|
+
users: this.users,
|
|
64
|
+
product: this.product
|
|
65
|
+
};
|
|
66
|
+
this.subscriptions.add(this.tasService.createRoom(body).pipe(switchMap(response => {
|
|
67
|
+
this.sessionId = response.content.sessionId;
|
|
68
|
+
this.state = WaitingRoomState.GETTING_TOKEN;
|
|
69
|
+
return this.tasService.generateToken({
|
|
70
|
+
sessionId: this.sessionId,
|
|
71
|
+
name: this.currentUser.name,
|
|
72
|
+
lastname: this.currentUser.lastname,
|
|
73
|
+
roleVC: this.currentUser.role
|
|
74
|
+
});
|
|
75
|
+
})).subscribe({
|
|
76
|
+
next: (tokenResponse) => {
|
|
77
|
+
this.token = tokenResponse.content.token;
|
|
78
|
+
this.state = WaitingRoomState.READY;
|
|
79
|
+
},
|
|
80
|
+
error: (err) => {
|
|
81
|
+
console.error('Error creating room or getting token:', err);
|
|
82
|
+
this.state = WaitingRoomState.ERROR;
|
|
83
|
+
this.errorMessage = 'Error creating room. Please try again.';
|
|
84
|
+
}
|
|
85
|
+
}));
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Joins the video call session
|
|
89
|
+
*/
|
|
90
|
+
joinSession() {
|
|
91
|
+
if (!this.sessionId || !this.token) {
|
|
92
|
+
this.errorMessage = 'Cannot join session. Incomplete data.';
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
// Close waiting room and open video call
|
|
96
|
+
this.activeModal.close('joining');
|
|
97
|
+
this.openVideoCallModal();
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Closes the waiting room
|
|
101
|
+
*/
|
|
102
|
+
cancel() {
|
|
103
|
+
this.activeModal.dismiss('cancel');
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Retry after an error
|
|
107
|
+
*/
|
|
108
|
+
retry() {
|
|
109
|
+
this.state = WaitingRoomState.IDLE;
|
|
110
|
+
this.errorMessage = '';
|
|
111
|
+
this.sessionId = '';
|
|
112
|
+
this.token = '';
|
|
113
|
+
}
|
|
114
|
+
// Private Methods
|
|
115
|
+
buildUsersArray() {
|
|
116
|
+
this.users = [];
|
|
117
|
+
// Add owners from input
|
|
118
|
+
this.ownerUserIds.forEach(id => {
|
|
119
|
+
this.users.push({ userExternalId: id, rol: TasUserRole.OWNER });
|
|
120
|
+
});
|
|
121
|
+
// Add regular users from input
|
|
122
|
+
this.regularUserIds.forEach(id => {
|
|
123
|
+
this.users.push({ userExternalId: id, rol: TasUserRole.USER });
|
|
124
|
+
});
|
|
125
|
+
// Add moderators from input
|
|
126
|
+
this.moderatorUserIds.forEach(id => {
|
|
127
|
+
this.users.push({ userExternalId: id, rol: TasUserRole.MODERATOR });
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
setupViewModeSubscription() {
|
|
131
|
+
this.subscriptions.add(this.tasService.viewMode$.subscribe(mode => {
|
|
132
|
+
// Re-open video call modal when returning from PiP mode
|
|
133
|
+
if (mode === ViewMode.FULLSCREEN &&
|
|
134
|
+
this.tasService.isCallActive() &&
|
|
135
|
+
!this.videoCallModalRef) {
|
|
136
|
+
const sessionId = this.tasService.sessionId;
|
|
137
|
+
const token = this.tasService.token;
|
|
138
|
+
if (sessionId && token) {
|
|
139
|
+
this.openVideoCallModal(true);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}));
|
|
143
|
+
}
|
|
144
|
+
openVideoCallModal(isReturningFromPip = false) {
|
|
145
|
+
this.videoCallModalRef = this.modalService.open(TasVideocallComponent, {
|
|
146
|
+
size: 'xl',
|
|
147
|
+
windowClass: 'tas-video-modal',
|
|
148
|
+
backdrop: 'static',
|
|
149
|
+
keyboard: false
|
|
150
|
+
});
|
|
151
|
+
const sessionIdToUse = this.sessionId || this.tasService.sessionId;
|
|
152
|
+
const tokenToUse = this.token || this.tasService.token;
|
|
153
|
+
this.videoCallModalRef.componentInstance.sessionId = sessionIdToUse;
|
|
154
|
+
this.videoCallModalRef.componentInstance.token = tokenToUse;
|
|
155
|
+
this.videoCallModalRef.componentInstance.isReturningFromPip = isReturningFromPip;
|
|
156
|
+
this.videoCallModalRef.result.then(() => { this.videoCallModalRef = null; }, () => { this.videoCallModalRef = null; });
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
TasWaitingRoomComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TasWaitingRoomComponent, deps: [{ token: i1.NgbActiveModal }, { token: i2.TasService }, { token: i1.NgbModal }], target: i0.ɵɵFactoryTarget.Component });
|
|
160
|
+
TasWaitingRoomComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TasWaitingRoomComponent, selector: "tas-waiting-room", inputs: { appointmentId: "appointmentId", product: "product", tenantId: "tenantId", currentUser: "currentUser", ownerUserIds: "ownerUserIds", regularUserIds: "regularUserIds", moderatorUserIds: "moderatorUserIds" }, ngImport: i0, template: "<div class=\"tas-waiting-room\">\n\t<!-- Header -->\n\t<div class=\"waiting-room-header\">\n\t\t<div class=\"header-icon\">\n\t\t\t<i class=\"fa fa-video-camera\"></i>\n\t\t</div>\n\t\t<h2 class=\"header-title\">Waiting Room</h2>\n\t\t<p class=\"header-subtitle\">Prepare for your video call</p>\n\t\t<button type=\"button\" class=\"close-btn\" (click)=\"cancel()\" aria-label=\"Close\">\n\t\t\t<span aria-hidden=\"true\">×</span>\n\t\t</button>\n\t</div>\n\n\t<!-- Content -->\n\t<div class=\"waiting-room-content\">\n\t\t<!-- IDLE State -->\n\t\t<div class=\"state-container\" *ngIf=\"state === WaitingRoomState.IDLE\">\n\t\t\t<div class=\"state-icon idle\">\n\t\t\t\t<i class=\"fa fa-plus-circle\"></i>\n\t\t\t</div>\n\t\t\t<p class=\"state-message\">\n\t\t\t\tCreate a new video call room\n\t\t\t</p>\n\t\t\t<p class=\"state-submessage\">\n\t\t\t\tPress the button to begin\n\t\t\t</p>\n\t\t\t<button \n\t\t\t\ttype=\"button\" \n\t\t\t\tclass=\"btn action-btn create-btn\"\n\t\t\t\t(click)=\"createRoom()\">\n\t\t\t\t<i class=\"fa fa-plus\"></i>\n\t\t\t\tCreate Room\n\t\t\t</button>\n\t\t</div>\n\n\t\t<!-- CREATING_ROOM State -->\n\t\t<div class=\"state-container\" *ngIf=\"state === WaitingRoomState.CREATING_ROOM\">\n\t\t\t<div class=\"state-icon loading\">\n\t\t\t\t<div class=\"spinner\"></div>\n\t\t\t</div>\n\t\t\t<p class=\"state-message\">\n\t\t\t\tCreating video call room...\n\t\t\t</p>\n\t\t\t<div class=\"progress-steps\">\n\t\t\t\t<div class=\"step active\">\n\t\t\t\t\t<span class=\"step-indicator\"></span>\n\t\t\t\t\t<span class=\"step-label\">Creating</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"step\">\n\t\t\t\t\t<span class=\"step-indicator\"></span>\n\t\t\t\t\t<span class=\"step-label\">Access</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"step\">\n\t\t\t\t\t<span class=\"step-indicator\"></span>\n\t\t\t\t\t<span class=\"step-label\">Ready</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<!-- GETTING_TOKEN State -->\n\t\t<div class=\"state-container\" *ngIf=\"state === WaitingRoomState.GETTING_TOKEN\">\n\t\t\t<div class=\"state-icon loading\">\n\t\t\t\t<div class=\"spinner\"></div>\n\t\t\t</div>\n\t\t\t<p class=\"state-message\">\n\t\t\t\tPreparing room access...\n\t\t\t</p>\n\t\t\t<div class=\"progress-steps\">\n\t\t\t\t<div class=\"step completed\">\n\t\t\t\t\t<span class=\"step-indicator\"><i class=\"fa fa-check\"></i></span>\n\t\t\t\t\t<span class=\"step-label\">Created</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"step active\">\n\t\t\t\t\t<span class=\"step-indicator\"></span>\n\t\t\t\t\t<span class=\"step-label\">Access</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"step\">\n\t\t\t\t\t<span class=\"step-indicator\"></span>\n\t\t\t\t\t<span class=\"step-label\">Ready</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<!-- READY State -->\n\t\t<div class=\"state-container\" *ngIf=\"state === WaitingRoomState.READY\">\n\t\t\t<div class=\"state-icon ready\">\n\t\t\t\t<i class=\"fa fa-check-circle\"></i>\n\t\t\t</div>\n\t\t\t<p class=\"state-message success\">\n\t\t\t\tRoom is ready!\n\t\t\t</p>\n\t\t\t<p class=\"state-submessage\">\n\t\t\t\tYou can join the video call when ready\n\t\t\t</p>\n\t\t\t<div class=\"progress-steps\">\n\t\t\t\t<div class=\"step completed\">\n\t\t\t\t\t<span class=\"step-indicator\"><i class=\"fa fa-check\"></i></span>\n\t\t\t\t\t<span class=\"step-label\">Created</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"step completed\">\n\t\t\t\t\t<span class=\"step-indicator\"><i class=\"fa fa-check\"></i></span>\n\t\t\t\t\t<span class=\"step-label\">Access</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"step completed\">\n\t\t\t\t\t<span class=\"step-indicator\"><i class=\"fa fa-check\"></i></span>\n\t\t\t\t\t<span class=\"step-label\">Ready</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<button \n\t\t\t\ttype=\"button\" \n\t\t\t\tclass=\"btn action-btn join-btn\"\n\t\t\t\t(click)=\"joinSession()\">\n\t\t\t\t<i class=\"fa fa-sign-in\"></i>\n\t\t\t\tJoin Session\n\t\t\t</button>\n\t\t</div>\n\n\t\t<!-- ERROR State -->\n\t\t<div class=\"state-container\" *ngIf=\"state === WaitingRoomState.ERROR\">\n\t\t\t<div class=\"state-icon error\">\n\t\t\t\t<i class=\"fa fa-exclamation-triangle\"></i>\n\t\t\t</div>\n\t\t\t<p class=\"state-message error\">\n\t\t\t\tAn error occurred\n\t\t\t</p>\n\t\t\t<p class=\"error-details\" *ngIf=\"errorMessage\">\n\t\t\t\t{{ errorMessage }}\n\t\t\t</p>\n\t\t\t<button \n\t\t\t\ttype=\"button\" \n\t\t\t\tclass=\"btn action-btn retry-btn\"\n\t\t\t\t(click)=\"retry()\">\n\t\t\t\t<i class=\"fa fa-refresh\"></i>\n\t\t\t\tRetry\n\t\t\t</button>\n\t\t</div>\n\t</div>\n\n\t<!-- Footer -->\n\t<div class=\"waiting-room-footer\">\n\t\t<button \n\t\t\ttype=\"button\" \n\t\t\tclass=\"btn cancel-btn\"\n\t\t\t(click)=\"cancel()\">\n\t\t\tCancel\n\t\t</button>\n\t</div>\n</div>\n\n", styles: [".tas-waiting-room{display:flex;flex-direction:column;min-height:420px;background:#ffffff;border-radius:5px;overflow:hidden}.waiting-room-header{position:relative;padding:32px 40px 24px;text-align:center;border-bottom:1px solid #e9ecef}.waiting-room-header .header-icon{width:72px;height:72px;margin:0 auto 16px;background:linear-gradient(135deg,#1da4b1 0%,#0077b3 100%);border-radius:50%;display:flex;align-items:center;justify-content:center;box-shadow:0 4px 16px #1da4b140}.waiting-room-header .header-icon i{font-size:28px;color:#fff}.waiting-room-header .header-title{margin:0 0 8px;font-size:20px;font-weight:700;line-height:28px;color:#212529}.waiting-room-header .header-subtitle{margin:0;font-size:14px;color:#6c757d;font-weight:400}.waiting-room-header .close-btn{position:absolute;top:16px;right:16px;width:32px;height:32px;border:none;background:transparent;border-radius:4px;color:#6c757d;cursor:pointer;transition:all .2s ease;font-size:20px}.waiting-room-header .close-btn:hover{background:#f8f9fa;color:#212529}.waiting-room-content{flex:1;display:flex;align-items:center;justify-content:center;padding:32px 40px;background:#ffffff}.state-container{text-align:center;max-width:360px;width:100%}.state-icon{width:80px;height:80px;margin:0 auto 24px;border-radius:50%;display:flex;align-items:center;justify-content:center}.state-icon i{font-size:36px}.state-icon.idle{background:rgba(29,164,177,.1);border:2px dashed #1da4b1}.state-icon.idle i{color:#1da4b1}.state-icon.loading{background:rgba(29,164,177,.1);border:2px solid #1da4b1}.state-icon.ready{background:linear-gradient(135deg,#1da4b1 0%,#38b89a 100%);box-shadow:0 4px 16px #1da4b14d}.state-icon.ready i{color:#fff}.state-icon.error{background:rgba(238,49,107,.1);border:2px solid #ee316b}.state-icon.error i{color:#ee316b}.spinner{width:40px;height:40px;border:3px solid #e9ecef;border-top-color:#1da4b1;border-radius:50%;animation:spin 1s linear infinite}.state-message{font-size:16px;font-weight:600;margin:0 0 8px;color:#212529;line-height:24px}.state-message.success{color:#1da4b1}.state-message.error{color:#ee316b}.state-submessage{font-size:14px;color:#6c757d;margin:0 0 24px;font-weight:400}.error-details{font-size:13px;color:#ee316b;margin:0 0 24px;padding:12px 16px;background:rgba(238,49,107,.08);border-radius:8px;border:1px solid rgba(238,49,107,.2)}.progress-steps{display:flex;justify-content:center;gap:24px;margin:24px 0 32px}.step{display:flex;flex-direction:column;align-items:center;gap:8px}.step .step-indicator{width:32px;height:32px;border-radius:50%;background:#f8f9fa;border:2px solid #e9ecef;display:flex;align-items:center;justify-content:center;transition:all .3s ease}.step .step-indicator i{font-size:12px;color:#fff}.step .step-label{font-size:11px;color:#6c757d;text-transform:uppercase;letter-spacing:.5px;font-weight:500}.step.active .step-indicator{background:rgba(29,164,177,.1);border-color:#1da4b1;animation:pulse-active 1.5s infinite}.step.active .step-label{color:#1da4b1;font-weight:600}.step.completed .step-indicator{background:#1da4b1;border-color:#1da4b1}.step.completed .step-label{color:#1da4b1;font-weight:600}.action-btn{padding:12px 32px;font-size:16px;font-weight:600;border-radius:4px;border:none;cursor:pointer;transition:all .2s ease;display:inline-flex;align-items:center;gap:10px}.action-btn i{font-size:16px}.action-btn.create-btn{background:#0077b3;color:#fff;box-shadow:0 2px 8px #0077b340}.action-btn.create-btn:hover{background:#005c8a;box-shadow:0 4px 12px #0077b359}.action-btn.create-btn:active{transform:translateY(1px)}.action-btn.join-btn{background:#1da4b1;color:#fff;box-shadow:0 2px 8px #1da4b140;animation:pulse-ready 2s infinite}.action-btn.join-btn:hover{background:#17848e;box-shadow:0 4px 12px #1da4b159}.action-btn.join-btn:active{transform:translateY(1px)}.action-btn.retry-btn{background:transparent;color:#6c757d;border:1px solid #e9ecef}.action-btn.retry-btn:hover{background:#f8f9fa;border-color:#6c757d;color:#212529}.waiting-room-footer{padding:16px 40px 24px;background:#ffffff;border-top:1px solid #e9ecef;display:flex;justify-content:center}.waiting-room-footer .cancel-btn{padding:10px 24px;font-size:14px;font-weight:600;border-radius:4px;background:transparent;color:#6c757d;border:none;cursor:pointer;transition:all .2s ease}.waiting-room-footer .cancel-btn:hover{background:#f8f9fa;color:#212529}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse-active{0%,to{box-shadow:0 0 #1da4b166}50%{box-shadow:0 0 0 8px #1da4b100}}@keyframes pulse-ready{0%,to{box-shadow:0 2px 8px #1da4b140}50%{box-shadow:0 4px 16px #1da4b166}}@media (max-width: 576px){.tas-waiting-room{min-height:380px}.waiting-room-header{padding:24px 24px 20px}.waiting-room-header .header-icon{width:56px;height:56px}.waiting-room-header .header-icon i{font-size:22px}.waiting-room-header .header-title{font-size:18px}.waiting-room-content{padding:24px}.state-icon{width:64px;height:64px}.state-icon i{font-size:28px}.spinner{width:32px;height:32px}.progress-steps{gap:12px}.step .step-indicator{width:28px;height:28px}.step .step-label{font-size:9px}.action-btn{padding:10px 24px;font-size:14px}.waiting-room-footer{padding:16px 24px 20px}}\n"], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
|
|
161
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TasWaitingRoomComponent, decorators: [{
|
|
162
|
+
type: Component,
|
|
163
|
+
args: [{ selector: 'tas-waiting-room', template: "<div class=\"tas-waiting-room\">\n\t<!-- Header -->\n\t<div class=\"waiting-room-header\">\n\t\t<div class=\"header-icon\">\n\t\t\t<i class=\"fa fa-video-camera\"></i>\n\t\t</div>\n\t\t<h2 class=\"header-title\">Waiting Room</h2>\n\t\t<p class=\"header-subtitle\">Prepare for your video call</p>\n\t\t<button type=\"button\" class=\"close-btn\" (click)=\"cancel()\" aria-label=\"Close\">\n\t\t\t<span aria-hidden=\"true\">×</span>\n\t\t</button>\n\t</div>\n\n\t<!-- Content -->\n\t<div class=\"waiting-room-content\">\n\t\t<!-- IDLE State -->\n\t\t<div class=\"state-container\" *ngIf=\"state === WaitingRoomState.IDLE\">\n\t\t\t<div class=\"state-icon idle\">\n\t\t\t\t<i class=\"fa fa-plus-circle\"></i>\n\t\t\t</div>\n\t\t\t<p class=\"state-message\">\n\t\t\t\tCreate a new video call room\n\t\t\t</p>\n\t\t\t<p class=\"state-submessage\">\n\t\t\t\tPress the button to begin\n\t\t\t</p>\n\t\t\t<button \n\t\t\t\ttype=\"button\" \n\t\t\t\tclass=\"btn action-btn create-btn\"\n\t\t\t\t(click)=\"createRoom()\">\n\t\t\t\t<i class=\"fa fa-plus\"></i>\n\t\t\t\tCreate Room\n\t\t\t</button>\n\t\t</div>\n\n\t\t<!-- CREATING_ROOM State -->\n\t\t<div class=\"state-container\" *ngIf=\"state === WaitingRoomState.CREATING_ROOM\">\n\t\t\t<div class=\"state-icon loading\">\n\t\t\t\t<div class=\"spinner\"></div>\n\t\t\t</div>\n\t\t\t<p class=\"state-message\">\n\t\t\t\tCreating video call room...\n\t\t\t</p>\n\t\t\t<div class=\"progress-steps\">\n\t\t\t\t<div class=\"step active\">\n\t\t\t\t\t<span class=\"step-indicator\"></span>\n\t\t\t\t\t<span class=\"step-label\">Creating</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"step\">\n\t\t\t\t\t<span class=\"step-indicator\"></span>\n\t\t\t\t\t<span class=\"step-label\">Access</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"step\">\n\t\t\t\t\t<span class=\"step-indicator\"></span>\n\t\t\t\t\t<span class=\"step-label\">Ready</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<!-- GETTING_TOKEN State -->\n\t\t<div class=\"state-container\" *ngIf=\"state === WaitingRoomState.GETTING_TOKEN\">\n\t\t\t<div class=\"state-icon loading\">\n\t\t\t\t<div class=\"spinner\"></div>\n\t\t\t</div>\n\t\t\t<p class=\"state-message\">\n\t\t\t\tPreparing room access...\n\t\t\t</p>\n\t\t\t<div class=\"progress-steps\">\n\t\t\t\t<div class=\"step completed\">\n\t\t\t\t\t<span class=\"step-indicator\"><i class=\"fa fa-check\"></i></span>\n\t\t\t\t\t<span class=\"step-label\">Created</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"step active\">\n\t\t\t\t\t<span class=\"step-indicator\"></span>\n\t\t\t\t\t<span class=\"step-label\">Access</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"step\">\n\t\t\t\t\t<span class=\"step-indicator\"></span>\n\t\t\t\t\t<span class=\"step-label\">Ready</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<!-- READY State -->\n\t\t<div class=\"state-container\" *ngIf=\"state === WaitingRoomState.READY\">\n\t\t\t<div class=\"state-icon ready\">\n\t\t\t\t<i class=\"fa fa-check-circle\"></i>\n\t\t\t</div>\n\t\t\t<p class=\"state-message success\">\n\t\t\t\tRoom is ready!\n\t\t\t</p>\n\t\t\t<p class=\"state-submessage\">\n\t\t\t\tYou can join the video call when ready\n\t\t\t</p>\n\t\t\t<div class=\"progress-steps\">\n\t\t\t\t<div class=\"step completed\">\n\t\t\t\t\t<span class=\"step-indicator\"><i class=\"fa fa-check\"></i></span>\n\t\t\t\t\t<span class=\"step-label\">Created</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"step completed\">\n\t\t\t\t\t<span class=\"step-indicator\"><i class=\"fa fa-check\"></i></span>\n\t\t\t\t\t<span class=\"step-label\">Access</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"step completed\">\n\t\t\t\t\t<span class=\"step-indicator\"><i class=\"fa fa-check\"></i></span>\n\t\t\t\t\t<span class=\"step-label\">Ready</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<button \n\t\t\t\ttype=\"button\" \n\t\t\t\tclass=\"btn action-btn join-btn\"\n\t\t\t\t(click)=\"joinSession()\">\n\t\t\t\t<i class=\"fa fa-sign-in\"></i>\n\t\t\t\tJoin Session\n\t\t\t</button>\n\t\t</div>\n\n\t\t<!-- ERROR State -->\n\t\t<div class=\"state-container\" *ngIf=\"state === WaitingRoomState.ERROR\">\n\t\t\t<div class=\"state-icon error\">\n\t\t\t\t<i class=\"fa fa-exclamation-triangle\"></i>\n\t\t\t</div>\n\t\t\t<p class=\"state-message error\">\n\t\t\t\tAn error occurred\n\t\t\t</p>\n\t\t\t<p class=\"error-details\" *ngIf=\"errorMessage\">\n\t\t\t\t{{ errorMessage }}\n\t\t\t</p>\n\t\t\t<button \n\t\t\t\ttype=\"button\" \n\t\t\t\tclass=\"btn action-btn retry-btn\"\n\t\t\t\t(click)=\"retry()\">\n\t\t\t\t<i class=\"fa fa-refresh\"></i>\n\t\t\t\tRetry\n\t\t\t</button>\n\t\t</div>\n\t</div>\n\n\t<!-- Footer -->\n\t<div class=\"waiting-room-footer\">\n\t\t<button \n\t\t\ttype=\"button\" \n\t\t\tclass=\"btn cancel-btn\"\n\t\t\t(click)=\"cancel()\">\n\t\t\tCancel\n\t\t</button>\n\t</div>\n</div>\n\n", styles: [".tas-waiting-room{display:flex;flex-direction:column;min-height:420px;background:#ffffff;border-radius:5px;overflow:hidden}.waiting-room-header{position:relative;padding:32px 40px 24px;text-align:center;border-bottom:1px solid #e9ecef}.waiting-room-header .header-icon{width:72px;height:72px;margin:0 auto 16px;background:linear-gradient(135deg,#1da4b1 0%,#0077b3 100%);border-radius:50%;display:flex;align-items:center;justify-content:center;box-shadow:0 4px 16px #1da4b140}.waiting-room-header .header-icon i{font-size:28px;color:#fff}.waiting-room-header .header-title{margin:0 0 8px;font-size:20px;font-weight:700;line-height:28px;color:#212529}.waiting-room-header .header-subtitle{margin:0;font-size:14px;color:#6c757d;font-weight:400}.waiting-room-header .close-btn{position:absolute;top:16px;right:16px;width:32px;height:32px;border:none;background:transparent;border-radius:4px;color:#6c757d;cursor:pointer;transition:all .2s ease;font-size:20px}.waiting-room-header .close-btn:hover{background:#f8f9fa;color:#212529}.waiting-room-content{flex:1;display:flex;align-items:center;justify-content:center;padding:32px 40px;background:#ffffff}.state-container{text-align:center;max-width:360px;width:100%}.state-icon{width:80px;height:80px;margin:0 auto 24px;border-radius:50%;display:flex;align-items:center;justify-content:center}.state-icon i{font-size:36px}.state-icon.idle{background:rgba(29,164,177,.1);border:2px dashed #1da4b1}.state-icon.idle i{color:#1da4b1}.state-icon.loading{background:rgba(29,164,177,.1);border:2px solid #1da4b1}.state-icon.ready{background:linear-gradient(135deg,#1da4b1 0%,#38b89a 100%);box-shadow:0 4px 16px #1da4b14d}.state-icon.ready i{color:#fff}.state-icon.error{background:rgba(238,49,107,.1);border:2px solid #ee316b}.state-icon.error i{color:#ee316b}.spinner{width:40px;height:40px;border:3px solid #e9ecef;border-top-color:#1da4b1;border-radius:50%;animation:spin 1s linear infinite}.state-message{font-size:16px;font-weight:600;margin:0 0 8px;color:#212529;line-height:24px}.state-message.success{color:#1da4b1}.state-message.error{color:#ee316b}.state-submessage{font-size:14px;color:#6c757d;margin:0 0 24px;font-weight:400}.error-details{font-size:13px;color:#ee316b;margin:0 0 24px;padding:12px 16px;background:rgba(238,49,107,.08);border-radius:8px;border:1px solid rgba(238,49,107,.2)}.progress-steps{display:flex;justify-content:center;gap:24px;margin:24px 0 32px}.step{display:flex;flex-direction:column;align-items:center;gap:8px}.step .step-indicator{width:32px;height:32px;border-radius:50%;background:#f8f9fa;border:2px solid #e9ecef;display:flex;align-items:center;justify-content:center;transition:all .3s ease}.step .step-indicator i{font-size:12px;color:#fff}.step .step-label{font-size:11px;color:#6c757d;text-transform:uppercase;letter-spacing:.5px;font-weight:500}.step.active .step-indicator{background:rgba(29,164,177,.1);border-color:#1da4b1;animation:pulse-active 1.5s infinite}.step.active .step-label{color:#1da4b1;font-weight:600}.step.completed .step-indicator{background:#1da4b1;border-color:#1da4b1}.step.completed .step-label{color:#1da4b1;font-weight:600}.action-btn{padding:12px 32px;font-size:16px;font-weight:600;border-radius:4px;border:none;cursor:pointer;transition:all .2s ease;display:inline-flex;align-items:center;gap:10px}.action-btn i{font-size:16px}.action-btn.create-btn{background:#0077b3;color:#fff;box-shadow:0 2px 8px #0077b340}.action-btn.create-btn:hover{background:#005c8a;box-shadow:0 4px 12px #0077b359}.action-btn.create-btn:active{transform:translateY(1px)}.action-btn.join-btn{background:#1da4b1;color:#fff;box-shadow:0 2px 8px #1da4b140;animation:pulse-ready 2s infinite}.action-btn.join-btn:hover{background:#17848e;box-shadow:0 4px 12px #1da4b159}.action-btn.join-btn:active{transform:translateY(1px)}.action-btn.retry-btn{background:transparent;color:#6c757d;border:1px solid #e9ecef}.action-btn.retry-btn:hover{background:#f8f9fa;border-color:#6c757d;color:#212529}.waiting-room-footer{padding:16px 40px 24px;background:#ffffff;border-top:1px solid #e9ecef;display:flex;justify-content:center}.waiting-room-footer .cancel-btn{padding:10px 24px;font-size:14px;font-weight:600;border-radius:4px;background:transparent;color:#6c757d;border:none;cursor:pointer;transition:all .2s ease}.waiting-room-footer .cancel-btn:hover{background:#f8f9fa;color:#212529}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse-active{0%,to{box-shadow:0 0 #1da4b166}50%{box-shadow:0 0 0 8px #1da4b100}}@keyframes pulse-ready{0%,to{box-shadow:0 2px 8px #1da4b140}50%{box-shadow:0 4px 16px #1da4b166}}@media (max-width: 576px){.tas-waiting-room{min-height:380px}.waiting-room-header{padding:24px 24px 20px}.waiting-room-header .header-icon{width:56px;height:56px}.waiting-room-header .header-icon i{font-size:22px}.waiting-room-header .header-title{font-size:18px}.waiting-room-content{padding:24px}.state-icon{width:64px;height:64px}.state-icon i{font-size:28px}.spinner{width:32px;height:32px}.progress-steps{gap:12px}.step .step-indicator{width:28px;height:28px}.step .step-label{font-size:9px}.action-btn{padding:10px 24px;font-size:14px}.waiting-room-footer{padding:16px 24px 20px}}\n"] }]
|
|
164
|
+
}], ctorParameters: function () { return [{ type: i1.NgbActiveModal }, { type: i2.TasService }, { type: i1.NgbModal }]; }, propDecorators: { appointmentId: [{
|
|
165
|
+
type: Input
|
|
166
|
+
}], product: [{
|
|
167
|
+
type: Input
|
|
168
|
+
}], tenantId: [{
|
|
169
|
+
type: Input
|
|
170
|
+
}], currentUser: [{
|
|
171
|
+
type: Input
|
|
172
|
+
}], ownerUserIds: [{
|
|
173
|
+
type: Input
|
|
174
|
+
}], regularUserIds: [{
|
|
175
|
+
type: Input
|
|
176
|
+
}], moderatorUserIds: [{
|
|
177
|
+
type: Input
|
|
178
|
+
}] } });
|
|
179
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzLXdhaXRpbmctcm9vbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9jb21wb25lbnRzL3Rhcy13YWl0aW5nLXJvb20vdGFzLXdhaXRpbmctcm9vbS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YXMtdWVsbC1zZGsvc3JjL2xpYi9jb21wb25lbnRzL3Rhcy13YWl0aW5nLXJvb20vdGFzLXdhaXRpbmctcm9vbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHcEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUlOLFdBQVcsRUFDWCxjQUFjLEVBQ2QsV0FBVyxFQUNYLFFBQVEsRUFDUixNQUFNLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDOzs7OztBQUVqRixNQUFNLENBQU4sSUFBWSxnQkFNWDtBQU5ELFdBQVksZ0JBQWdCO0lBQzNCLGlDQUFhLENBQUE7SUFDYixtREFBK0IsQ0FBQTtJQUMvQixtREFBK0IsQ0FBQTtJQUMvQixtQ0FBZSxDQUFBO0lBQ2YsbUNBQWUsQ0FBQTtBQUNoQixDQUFDLEVBTlcsZ0JBQWdCLEtBQWhCLGdCQUFnQixRQU0zQjtBQU9ELE1BQU0sT0FBTyx1QkFBdUI7SUFzQm5DLFlBQ1EsV0FBMkIsRUFDMUIsVUFBc0IsRUFDdEIsWUFBc0I7UUFGdkIsZ0JBQVcsR0FBWCxXQUFXLENBQWdCO1FBQzFCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsaUJBQVksR0FBWixZQUFZLENBQVU7UUF4Qi9C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bml0LCBPbkRlc3Ryb3ksIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ2JBY3RpdmVNb2RhbCwgTmdiTW9kYWwsIE5nYk1vZGFsUmVmIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xuaW1wb3J0IHsgVGFzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3Rhcy5zZXJ2aWNlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcblx0Q3JlYXRlUm9vbVJlcXVlc3QsXG5cdENyZWF0ZVJvb21Vc2VyLFxuXHRUYXNDdXJyZW50VXNlcixcblx0VGFzUm9vbVR5cGUsXG5cdFRhc1Nlc3Npb25UeXBlLFxuXHRUYXNVc2VyUm9sZSxcblx0Vmlld01vZGVcbn0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy90YXMuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBUYXNWaWRlb2NhbGxDb21wb25lbnQgfSBmcm9tICcuLi90YXMtdmlkZW9jYWxsL3Rhcy12aWRlb2NhbGwuY29tcG9uZW50JztcblxuZXhwb3J0IGVudW0gV2FpdGluZ1Jvb21TdGF0ZSB7XG5cdElETEUgPSAnSURMRScsXG5cdENSRUFUSU5HX1JPT00gPSAnQ1JFQVRJTkdfUk9PTScsXG5cdEdFVFRJTkdfVE9LRU4gPSAnR0VUVElOR19UT0tFTicsXG5cdFJFQURZID0gJ1JFQURZJyxcblx0RVJST1IgPSAnRVJST1InXG59XG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ3Rhcy13YWl0aW5nLXJvb20nLFxuXHR0ZW1wbGF0ZVVybDogJy4vdGFzLXdhaXRpbmctcm9vbS5jb21wb25lbnQuaHRtbCcsXG5cdHN0eWxlVXJsczogWycuL3Rhcy13YWl0aW5nLXJvb20uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBUYXNXYWl0aW5nUm9vbUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblx0Ly8gUm9vbSBjb25maWd1cmF0aW9uIGlucHV0c1xuXHRASW5wdXQoKSBhcHBvaW50bWVudElkOiBudW1iZXIgPSAxO1xuXHRASW5wdXQoKSBwcm9kdWN0OiBzdHJpbmcgPSAndWVsbCc7XG5cdEBJbnB1dCgpIHRlbmFudElkOiBzdHJpbmcgPSAnJztcblx0QElucHV0KCkgY3VycmVudFVzZXIhOiBUYXNDdXJyZW50VXNlcjtcblx0QElucHV0KCkgb3duZXJVc2VySWRzITogbnVtYmVyW107XG5cdEBJbnB1dCgpIHJlZ3VsYXJVc2VySWRzOiBudW1iZXJbXSA9IFtdO1xuXHRASW5wdXQoKSBtb2RlcmF0b3JVc2VySWRzOiBudW1iZXJbXSA9IFtdO1xuXG5cdC8vIENvbXBvbmVudCBzdGF0ZVxuXHRwdWJsaWMgc3RhdGU6IFdhaXRpbmdSb29tU3RhdGUgPSBXYWl0aW5nUm9vbVN0YXRlLklETEU7XG5cdHB1YmxpYyBXYWl0aW5nUm9vbVN0YXRlID0gV2FpdGluZ1Jvb21TdGF0ZTsgLy8gRXhwb3NlIGVudW0gdG8gdGVtcGxhdGVcblx0cHVibGljIGVycm9yTWVzc2FnZTogc3RyaW5nID0gJyc7XG5cblx0Ly8gU2Vzc2lvbiBkYXRhXG5cdHByaXZhdGUgc2Vzc2lvbklkOiBzdHJpbmcgPSAnJztcblx0cHJpdmF0ZSB0b2tlbjogc3RyaW5nID0gJyc7XG5cdHByaXZhdGUgdXNlcnM6IENyZWF0ZVJvb21Vc2VyW10gPSBbXTtcblx0cHJpdmF0ZSBzdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXHRwcml2YXRlIHZpZGVvQ2FsbE1vZGFsUmVmOiBOZ2JNb2RhbFJlZiB8IG51bGwgPSBudWxsO1xuXG5cdGNvbnN0cnVjdG9yKFxuXHRcdHB1YmxpYyBhY3RpdmVNb2RhbDogTmdiQWN0aXZlTW9kYWwsXG5cdFx0cHJpdmF0ZSB0YXNTZXJ2aWNlOiBUYXNTZXJ2aWNlLFxuXHRcdHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbFxuXHQpIHt9XG5cblx0bmdPbkluaXQoKTogdm9pZCB7XG5cdFx0dGhpcy5idWlsZFVzZXJzQXJyYXkoKTtcblx0XHR0aGlzLnNldHVwVmlld01vZGVTdWJzY3JpcHRpb24oKTtcblx0fVxuXG5cdG5nT25EZXN0cm95KCk6IHZvaWQge1xuXHRcdHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgdGhlIHJvb20gYW5kIGZldGNoZXMgdGhlIHRva2VuXG5cdCAqL1xuXHRjcmVhdGVSb29tKCk6IHZvaWQge1xuXHRcdGlmICghdGhpcy50ZW5hbnRJZCB8fCAhdGhpcy5jdXJyZW50VXNlcj8ubmFtZSkge1xuXHRcdFx0dGhpcy5zdGF0ZSA9IFdhaXRpbmdSb29tU3RhdGUuRVJST1I7XG5cdFx0XHR0aGlzLmVycm9yTWVzc2FnZSA9ICdNaXNzaW5nIGNvbmZpZ3VyYXRpb24gZGF0YSAodGVuYW50IG9yIHVzZXIpJztcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLnN0YXRlID0gV2FpdGluZ1Jvb21TdGF0ZS5DUkVBVElOR19ST09NO1xuXHRcdHRoaXMuZXJyb3JNZXNzYWdlID0gJyc7XG5cblx0XHRjb25zdCBib2R5OiBDcmVhdGVSb29tUmVxdWVzdCA9IHtcblx0XHRcdHJvb21UeXBlOiBUYXNSb29tVHlwZS5UQVMsXG5cdFx0XHR0eXBlOiBUYXNTZXNzaW9uVHlwZS5TUE9OVEFORU9VUyxcblx0XHRcdHRlbmFudDogdGhpcy50ZW5hbnRJZCxcblx0XHRcdGFwcG9pbnRtZW50SWQ6IHRoaXMuYXBwb2ludG1lbnRJZCxcblx0XHRcdHVzZXJzOiB0aGlzLnVzZXJzLFxuXHRcdFx0cHJvZHVjdDogdGhpcy5wcm9kdWN0XG5cdFx0fTtcblxuXHRcdHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG5cdFx0XHR0aGlzLnRhc1NlcnZpY2UuY3JlYXRlUm9vbShib2R5KS5waXBlKFxuXHRcdFx0XHRzd2l0Y2hNYXAocmVzcG9uc2UgPT4ge1xuXHRcdFx0XHRcdHRoaXMuc2Vzc2lvbklkID0gcmVzcG9uc2UuY29udGVudC5zZXNzaW9uSWQ7XG5cdFx0XHRcdFx0dGhpcy5zdGF0ZSA9IFdhaXRpbmdSb29tU3RhdGUuR0VUVElOR19UT0tFTjtcblxuXHRcdFx0XHRcdHJldHVybiB0aGlzLnRhc1NlcnZpY2UuZ2VuZXJhdGVUb2tlbih7XG5cdFx0XHRcdFx0XHRzZXNzaW9uSWQ6IHRoaXMuc2Vzc2lvbklkLFxuXHRcdFx0XHRcdFx0bmFtZTogdGhpcy5jdXJyZW50VXNlci5uYW1lLFxuXHRcdFx0XHRcdFx0bGFzdG5hbWU6IHRoaXMuY3VycmVudFVzZXIubGFzdG5hbWUsXG5cdFx0XHRcdFx0XHRyb2xlVkM6IHRoaXMuY3VycmVudFVzZXIucm9sZVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KVxuXHRcdFx0KS5zdWJzY3JpYmUoe1xuXHRcdFx0XHRuZXh0OiAodG9rZW5SZXNwb25zZSkgPT4ge1xuXHRcdFx0XHRcdHRoaXMudG9rZW4gPSB0b2tlblJlc3BvbnNlLmNvbnRlbnQudG9rZW47XG5cdFx0XHRcdFx0dGhpcy5zdGF0ZSA9IFdhaXRpbmdSb29tU3RhdGUuUkVBRFk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGVycm9yOiAoZXJyKSA9PiB7XG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvcignRXJyb3IgY3JlYXRpbmcgcm9vbSBvciBnZXR0aW5nIHRva2VuOicsIGVycik7XG5cdFx0XHRcdFx0dGhpcy5zdGF0ZSA9IFdhaXRpbmdSb29tU3RhdGUuRVJST1I7XG5cdFx0XHRcdFx0dGhpcy5lcnJvck1lc3NhZ2UgPSAnRXJyb3IgY3JlYXRpbmcgcm9vbS4gUGxlYXNlIHRyeSBhZ2Fpbi4nO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogSm9pbnMgdGhlIHZpZGVvIGNhbGwgc2Vzc2lvblxuXHQgKi9cblx0am9pblNlc3Npb24oKTogdm9pZCB7XG5cdFx0aWYgKCF0aGlzLnNlc3Npb25JZCB8fCAhdGhpcy50b2tlbikge1xuXHRcdFx0dGhpcy5lcnJvck1lc3NhZ2UgPSAnQ2Fubm90IGpvaW4gc2Vzc2lvbi4gSW5jb21wbGV0ZSBkYXRhLic7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gQ2xvc2Ugd2FpdGluZyByb29tIGFuZCBvcGVuIHZpZGVvIGNhbGxcblx0XHR0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKCdqb2luaW5nJyk7XG5cdFx0dGhpcy5vcGVuVmlkZW9DYWxsTW9kYWwoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDbG9zZXMgdGhlIHdhaXRpbmcgcm9vbVxuXHQgKi9cblx0Y2FuY2VsKCk6IHZvaWQge1xuXHRcdHRoaXMuYWN0aXZlTW9kYWwuZGlzbWlzcygnY2FuY2VsJyk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cnkgYWZ0ZXIgYW4gZXJyb3Jcblx0ICovXG5cdHJldHJ5KCk6IHZvaWQge1xuXHRcdHRoaXMuc3RhdGUgPSBXYWl0aW5nUm9vbVN0YXRlLklETEU7XG5cdFx0dGhpcy5lcnJvck1lc3NhZ2UgPSAnJztcblx0XHR0aGlzLnNlc3Npb25JZCA9ICcnO1xuXHRcdHRoaXMudG9rZW4gPSAnJztcblx0fVxuXG5cdC8vIFByaXZhdGUgTWV0aG9kc1xuXHRwcml2YXRlIGJ1aWxkVXNlcnNBcnJheSgpOiB2b2lkIHtcblx0XHR0aGlzLnVzZXJzID0gW107XG5cblx0XHQvLyBBZGQgb3duZXJzIGZyb20gaW5wdXRcblx0XHR0aGlzLm93bmVyVXNlcklkcy5mb3JFYWNoKGlkID0+IHtcblx0XHRcdHRoaXMudXNlcnMucHVzaCh7IHVzZXJFeHRlcm5hbElkOiBpZCwgcm9sOiBUYXNVc2VyUm9sZS5PV05FUiB9KTtcblx0XHR9KTtcblxuXHRcdC8vIEFkZCByZWd1bGFyIHVzZXJzIGZyb20gaW5wdXRcblx0XHR0aGlzLnJlZ3VsYXJVc2VySWRzLmZvckVhY2goaWQgPT4ge1xuXHRcdFx0dGhpcy51c2Vycy5wdXNoKHsgdXNlckV4dGVybmFsSWQ6IGlkLCByb2w6IFRhc1VzZXJSb2xlLlVTRVIgfSk7XG5cdFx0fSk7XG5cblx0XHQvLyBBZGQgbW9kZXJhdG9ycyBmcm9tIGlucHV0XG5cdFx0dGhpcy5tb2RlcmF0b3JVc2VySWRzLmZvckVhY2goaWQgPT4ge1xuXHRcdFx0dGhpcy51c2Vycy5wdXNoKHsgdXNlckV4dGVybmFsSWQ6IGlkLCByb2w6IFRhc1VzZXJSb2xlLk1PREVSQVRPUiB9KTtcblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgc2V0dXBWaWV3TW9kZVN1YnNjcmlwdGlvbigpOiB2b2lkIHtcblx0XHR0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuXHRcdFx0dGhpcy50YXNTZXJ2aWNlLnZpZXdNb2RlJC5zdWJzY3JpYmUobW9kZSA9PiB7XG5cdFx0XHRcdC8vIFJlLW9wZW4gdmlkZW8gY2FsbCBtb2RhbCB3aGVuIHJldHVybmluZyBmcm9tIFBpUCBtb2RlXG5cdFx0XHRcdGlmIChtb2RlID09PSBWaWV3TW9kZS5GVUxMU0NSRUVOICYmIFxuXHRcdFx0XHRcdHRoaXMudGFzU2VydmljZS5pc0NhbGxBY3RpdmUoKSAmJiBcblx0XHRcdFx0XHQhdGhpcy52aWRlb0NhbGxNb2RhbFJlZikge1xuXHRcdFx0XHRcdGNvbnN0IHNlc3Npb25JZCA9IHRoaXMudGFzU2VydmljZS5zZXNzaW9uSWQ7XG5cdFx0XHRcdFx0Y29uc3QgdG9rZW4gPSB0aGlzLnRhc1NlcnZpY2UudG9rZW47XG5cdFx0XHRcdFx0aWYgKHNlc3Npb25JZCAmJiB0b2tlbikge1xuXHRcdFx0XHRcdFx0dGhpcy5vcGVuVmlkZW9DYWxsTW9kYWwodHJ1ZSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIG9wZW5WaWRlb0NhbGxNb2RhbChpc1JldHVybmluZ0Zyb21QaXA6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuXHRcdHRoaXMudmlkZW9DYWxsTW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKFRhc1ZpZGVvY2FsbENvbXBvbmVudCwge1xuXHRcdFx0c2l6ZTogJ3hsJyxcblx0XHRcdHdpbmRvd0NsYXNzOiAndGFzLXZpZGVvLW1vZGFsJyxcblx0XHRcdGJhY2tkcm9wOiAnc3RhdGljJyxcblx0XHRcdGtleWJvYXJkOiBmYWxzZVxuXHRcdH0pO1xuXG5cdFx0Y29uc3Qgc2Vzc2lvbklkVG9Vc2UgPSB0aGlzLnNlc3Npb25JZCB8fCB0aGlzLnRhc1NlcnZpY2Uuc2Vzc2lvbklkO1xuXHRcdGNvbnN0IHRva2VuVG9Vc2UgPSB0aGlzLnRva2VuIHx8IHRoaXMudGFzU2VydmljZS50b2tlbjtcblxuXHRcdHRoaXMudmlkZW9DYWxsTW9kYWxSZWYuY29tcG9uZW50SW5zdGFuY2Uuc2Vzc2lvbklkID0gc2Vzc2lvbklkVG9Vc2U7XG5cdFx0dGhpcy52aWRlb0NhbGxNb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS50b2tlbiA9IHRva2VuVG9Vc2U7XG5cdFx0dGhpcy52aWRlb0NhbGxNb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5pc1JldHVybmluZ0Zyb21QaXAgPSBpc1JldHVybmluZ0Zyb21QaXA7XG5cblx0XHR0aGlzLnZpZGVvQ2FsbE1vZGFsUmVmLnJlc3VsdC50aGVuKFxuXHRcdFx0KCkgPT4geyB0aGlzLnZpZGVvQ2FsbE1vZGFsUmVmID0gbnVsbDsgfSxcblx0XHRcdCgpID0+IHsgdGhpcy52aWRlb0NhbGxNb2RhbFJlZiA9IG51bGw7IH1cblx0XHQpO1xuXHR9XG59XG5cbiIsIjxkaXYgY2xhc3M9XCJ0YXMtd2FpdGluZy1yb29tXCI+XG5cdDwhLS0gSGVhZGVyIC0tPlxuXHQ8ZGl2IGNsYXNzPVwid2FpdGluZy1yb29tLWhlYWRlclwiPlxuXHRcdDxkaXYgY2xhc3M9XCJoZWFkZXItaWNvblwiPlxuXHRcdFx0PGkgY2xhc3M9XCJmYSBmYS12aWRlby1jYW1lcmFcIj48L2k+XG5cdFx0PC9kaXY+XG5cdFx0PGgyIGNsYXNzPVwiaGVhZGVyLXRpdGxlXCI+V2FpdGluZyBSb29tPC9oMj5cblx0XHQ8cCBjbGFzcz1cImhlYWRlci1zdWJ0aXRsZVwiPlByZXBhcmUgZm9yIHlvdXIgdmlkZW8gY2FsbDwvcD5cblx0XHQ8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNsb3NlLWJ0blwiIChjbGljayk9XCJjYW5jZWwoKVwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiPlxuXHRcdFx0PHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvc3Bhbj5cblx0XHQ8L2J1dHRvbj5cblx0PC9kaXY+XG5cblx0PCEtLSBDb250ZW50IC0tPlxuXHQ8ZGl2IGNsYXNzPVwid2FpdGluZy1yb29tLWNvbnRlbnRcIj5cblx0XHQ8IS0tIElETEUgU3RhdGUgLS0+XG5cdFx0PGRpdiBjbGFzcz1cInN0YXRlLWNvbnRhaW5lclwiICpuZ0lmPVwic3RhdGUgPT09IFdhaXRpbmdSb29tU3RhdGUuSURMRVwiPlxuXHRcdFx0PGRpdiBjbGFzcz1cInN0YXRlLWljb24gaWRsZVwiPlxuXHRcdFx0XHQ8aSBjbGFzcz1cImZhIGZhLXBsdXMtY2lyY2xlXCI+PC9pPlxuXHRcdFx0PC9kaXY+XG5cdFx0XHQ8cCBjbGFzcz1cInN0YXRlLW1lc3NhZ2VcIj5cblx0XHRcdFx0Q3JlYXRlIGEgbmV3IHZpZGVvIGNhbGwgcm9vbVxuXHRcdFx0PC9wPlxuXHRcdFx0PHAgY2xhc3M9XCJzdGF0ZS1zdWJtZXNzYWdlXCI+XG5cdFx0XHRcdFByZXNzIHRoZSBidXR0b24gdG8gYmVnaW5cblx0XHRcdDwvcD5cblx0XHRcdDxidXR0b24gXG5cdFx0XHRcdHR5cGU9XCJidXR0b25cIiBcblx0XHRcdFx0Y2xhc3M9XCJidG4gYWN0aW9uLWJ0biBjcmVhdGUtYnRuXCJcblx0XHRcdFx0KGNsaWNrKT1cImNyZWF0ZVJvb20oKVwiPlxuXHRcdFx0XHQ8aSBjbGFzcz1cImZhIGZhLXBsdXNcIj48L2k+XG5cdFx0XHRcdENyZWF0ZSBSb29tXG5cdFx0XHQ8L2J1dHRvbj5cblx0XHQ8L2Rpdj5cblxuXHRcdDwhLS0gQ1JFQVRJTkdfUk9PTSBTdGF0ZSAtLT5cblx0XHQ8ZGl2IGNsYXNzPVwic3RhdGUtY29udGFpbmVyXCIgKm5nSWY9XCJzdGF0ZSA9PT0gV2FpdGluZ1Jvb21TdGF0ZS5DUkVBVElOR19ST09NXCI+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwic3RhdGUtaWNvbiBsb2FkaW5nXCI+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJzcGlubmVyXCI+PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblx0XHRcdDxwIGNsYXNzPVwic3RhdGUtbWVzc2FnZVwiPlxuXHRcdFx0XHRDcmVhdGluZyB2aWRlbyBjYWxsIHJvb20uLi5cblx0XHRcdDwvcD5cblx0XHRcdDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1zdGVwc1wiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwic3RlcCBhY3RpdmVcIj5cblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cInN0ZXAtaW5kaWNhdG9yXCI+PC9zcGFuPlxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwic3RlcC1sYWJlbFwiPkNyZWF0aW5nPC9zcGFuPlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cInN0ZXBcIj5cblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cInN0ZXAtaW5kaWNhdG9yXCI+PC9zcGFuPlxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwic3RlcC1sYWJlbFwiPkFjY2Vzczwvc3Bhbj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJzdGVwXCI+XG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJzdGVwLWluZGljYXRvclwiPjwvc3Bhbj5cblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cInN0ZXAtbGFiZWxcIj5SZWFkeTwvc3Bhbj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblx0XHQ8L2Rpdj5cblxuXHRcdDwhLS0gR0VUVElOR19UT0tFTiBTdGF0ZSAtLT5cblx0XHQ8ZGl2IGNsYXNzPVwic3RhdGUtY29udGFpbmVyXCIgKm5nSWY9XCJzdGF0ZSA9PT0gV2FpdGluZ1Jvb21TdGF0ZS5HRVRUSU5HX1RPS0VOXCI+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwic3RhdGUtaWNvbiBsb2FkaW5nXCI+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJzcGlubmVyXCI+PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblx0XHRcdDxwIGNsYXNzPVwic3RhdGUtbWVzc2FnZVwiPlxuXHRcdFx0XHRQcmVwYXJpbmcgcm9vbSBhY2Nlc3MuLi5cblx0XHRcdDwvcD5cblx0XHRcdDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1zdGVwc1wiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwic3RlcCBjb21wbGV0ZWRcIj5cblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cInN0ZXAtaW5kaWNhdG9yXCI+PGkgY2xhc3M9XCJmYSBmYS1jaGVja1wiPjwvaT48L3NwYW4+XG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJzdGVwLWxhYmVsXCI+Q3JlYXRlZDwvc3Bhbj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJzdGVwIGFjdGl2ZVwiPlxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwic3RlcC1pbmRpY2F0b3JcIj48L3NwYW4+XG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJzdGVwLWxhYmVsXCI+QWNjZXNzPC9zcGFuPlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cInN0ZXBcIj5cblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cInN0ZXAtaW5kaWNhdG9yXCI+PC9zcGFuPlxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwic3RlcC1sYWJlbFwiPlJlYWR5PC9zcGFuPlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvZGl2PlxuXHRcdDwvZGl2PlxuXG5cdFx0PCEtLSBSRUFEWSBTdGF0ZSAtLT5cblx0XHQ8ZGl2IGNsYXNzPVwic3RhdGUtY29udGFpbmVyXCIgKm5nSWY9XCJzdGF0ZSA9PT0gV2FpdGluZ1Jvb21TdGF0ZS5SRUFEWVwiPlxuXHRcdFx0PGRpdiBjbGFzcz1cInN0YXRlLWljb24gcmVhZHlcIj5cblx0XHRcdFx0PGkgY2xhc3M9XCJmYSBmYS1jaGVjay1jaXJjbGVcIj48L2k+XG5cdFx0XHQ8L2Rpdj5cblx0XHRcdDxwIGNsYXNzPVwic3RhdGUtbWVzc2FnZSBzdWNjZXNzXCI+XG5cdFx0XHRcdFJvb20gaXMgcmVhZHkhXG5cdFx0XHQ8L3A+XG5cdFx0XHQ8cCBjbGFzcz1cInN0YXRlLXN1Ym1lc3NhZ2VcIj5cblx0XHRcdFx0WW91IGNhbiBqb2luIHRoZSB2aWRlbyBjYWxsIHdoZW4gcmVhZHlcblx0XHRcdDwvcD5cblx0XHRcdDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1zdGVwc1wiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwic3RlcCBjb21wbGV0ZWRcIj5cblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cInN0ZXAtaW5kaWNhdG9yXCI+PGkgY2xhc3M9XCJmYSBmYS1jaGVja1wiPjwvaT48L3NwYW4+XG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJzdGVwLWxhYmVsXCI+Q3JlYXRlZDwvc3Bhbj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJzdGVwIGNvbXBsZXRlZFwiPlxuXHRcdFx0XHRcdDxzcGFuIGNsYXNzPVwic3RlcC1pbmRpY2F0b3JcIj48aSBjbGFzcz1cImZhIGZhLWNoZWNrXCI+PC9pPjwvc3Bhbj5cblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cInN0ZXAtbGFiZWxcIj5BY2Nlc3M8L3NwYW4+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwic3RlcCBjb21wbGV0ZWRcIj5cblx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cInN0ZXAtaW5kaWNhdG9yXCI+PGkgY2xhc3M9XCJmYSBmYS1jaGVja1wiPjwvaT48L3NwYW4+XG5cdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJzdGVwLWxhYmVsXCI+UmVhZHk8L3NwYW4+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cdFx0XHQ8YnV0dG9uIFxuXHRcdFx0XHR0eXBlPVwiYnV0dG9uXCIgXG5cdFx0XHRcdGNsYXNzPVwiYnRuIGFjdGlvbi1idG4gam9pbi1idG5cIlxuXHRcdFx0XHQoY2xpY2spPVwiam9pblNlc3Npb24oKVwiPlxuXHRcdFx0XHQ8aSBjbGFzcz1cImZhIGZhLXNpZ24taW5cIj48L2k+XG5cdFx0XHRcdEpvaW4gU2Vzc2lvblxuXHRcdFx0PC9idXR0b24+XG5cdFx0PC9kaXY+XG5cblx0XHQ8IS0tIEVSUk9SIFN0YXRlIC0tPlxuXHRcdDxkaXYgY2xhc3M9XCJzdGF0ZS1jb250YWluZXJcIiAqbmdJZj1cInN0YXRlID09PSBXYWl0aW5nUm9vbVN0YXRlLkVSUk9SXCI+XG5cdFx0XHQ8ZGl2IGNsYXNzPVwic3RhdGUtaWNvbiBlcnJvclwiPlxuXHRcdFx0XHQ8aSBjbGFzcz1cImZhIGZhLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlXCI+PC9pPlxuXHRcdFx0PC9kaXY+XG5cdFx0XHQ8cCBjbGFzcz1cInN0YXRlLW1lc3NhZ2UgZXJyb3JcIj5cblx0XHRcdFx0QW4gZXJyb3Igb2NjdXJyZWRcblx0XHRcdDwvcD5cblx0XHRcdDxwIGNsYXNzPVwiZXJyb3ItZGV0YWlsc1wiICpuZ0lmPVwiZXJyb3JNZXNzYWdlXCI+XG5cdFx0XHRcdHt7IGVycm9yTWVzc2FnZSB9fVxuXHRcdFx0PC9wPlxuXHRcdFx0PGJ1dHRvbiBcblx0XHRcdFx0dHlwZT1cImJ1dHRvblwiIFxuXHRcdFx0XHRjbGFzcz1cImJ0biBhY3Rpb24tYnRuIHJldHJ5LWJ0blwiXG5cdFx0XHRcdChjbGljayk9XCJyZXRyeSgpXCI+XG5cdFx0XHRcdDxpIGNsYXNzPVwiZmEgZmEtcmVmcmVzaFwiPjwvaT5cblx0XHRcdFx0UmV0cnlcblx0XHRcdDwvYnV0dG9uPlxuXHRcdDwvZGl2PlxuXHQ8L2Rpdj5cblxuXHQ8IS0tIEZvb3RlciAtLT5cblx0PGRpdiBjbGFzcz1cIndhaXRpbmctcm9vbS1mb290ZXJcIj5cblx0XHQ8YnV0dG9uIFxuXHRcdFx0dHlwZT1cImJ1dHRvblwiIFxuXHRcdFx0Y2xhc3M9XCJidG4gY2FuY2VsLWJ0blwiXG5cdFx0XHQoY2xpY2spPVwiY2FuY2VsKClcIj5cblx0XHRcdENhbmNlbFxuXHRcdDwvYnV0dG9uPlxuXHQ8L2Rpdj5cbjwvZGl2PlxuXG4iXX0=
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { InjectionToken } from '@angular/core';
|
|
2
|
+
/**
|
|
3
|
+
* Injection token for TAS configuration
|
|
4
|
+
*/
|
|
5
|
+
export const TAS_CONFIG = new InjectionToken('TAS_CONFIG');
|
|
6
|
+
/**
|
|
7
|
+
* Injection token for HTTP client adapter
|
|
8
|
+
*/
|
|
9
|
+
export const TAS_HTTP_CLIENT = new InjectionToken('TAS_HTTP_CLIENT');
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzLmNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Rhcy11ZWxsLXNkay9zcmMvbGliL2NvbmZpZy90YXMuY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFvQi9DOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLElBQUksY0FBYyxDQUFZLFlBQVksQ0FBQyxDQUFDO0FBRXRFOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLElBQUksY0FBYyxDQUFnQixpQkFBaUIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGludGVyZmFjZSBmb3IgdGhlIFRBUyBtb2R1bGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYXNDb25maWcge1xuXHQvKiogVG9rQm94L1ZvbmFnZSBBUEkgS2V5ICovXG5cdHRva0JveEFwaUtleTogc3RyaW5nO1xuXHQvKiogT3B0aW9uYWwgQVBJIGJhc2UgVVJMIGZvciByb29tL3Rva2VuIGVuZHBvaW50cyAqL1xuXHRhcGlCYXNlVXJsPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEhUVFAgY2xpZW50IGludGVyZmFjZSB0aGF0IGNvbnN1bWluZyBhcHBzIG11c3QgaW1wbGVtZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFzSHR0cENsaWVudCB7XG5cdHBvc3Q8VD4odXJsOiBzdHJpbmcsIG9wdGlvbnM6IHsgYm9keTogYW55OyBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB9KTogT2JzZXJ2YWJsZTxUPjtcbn1cblxuLyoqXG4gKiBJbmplY3Rpb24gdG9rZW4gZm9yIFRBUyBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBUQVNfQ09ORklHID0gbmV3IEluamVjdGlvblRva2VuPFRhc0NvbmZpZz4oJ1RBU19DT05GSUcnKTtcblxuLyoqXG4gKiBJbmplY3Rpb24gdG9rZW4gZm9yIEhUVFAgY2xpZW50IGFkYXB0ZXJcbiAqL1xuZXhwb3J0IGNvbnN0IFRBU19IVFRQX0NMSUVOVCA9IG5ldyBJbmplY3Rpb25Ub2tlbjxUYXNIdHRwQ2xpZW50PignVEFTX0hUVFBfQ0xJRU5UJyk7XG5cbiJdfQ==
|