@hivegpt/hiveai-angular 0.0.598 → 0.0.599
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/esm2020/lib/components/voice-agent/components/voice-agent-modal/voice-agent-modal.component.mjs +41 -22
- package/esm2020/lib/components/voice-agent/services/audio-analyzer.service.mjs +18 -14
- package/esm2020/lib/components/voice-agent/services/voice-agent.service.mjs +29 -18
- package/fesm2015/hivegpt-hiveai-angular.mjs +85 -51
- package/fesm2015/hivegpt-hiveai-angular.mjs.map +1 -1
- package/fesm2020/hivegpt-hiveai-angular.mjs +85 -51
- package/fesm2020/hivegpt-hiveai-angular.mjs.map +1 -1
- package/lib/components/voice-agent/components/voice-agent-modal/voice-agent-modal.component.d.ts +10 -6
- package/lib/components/voice-agent/components/voice-agent-modal/voice-agent-modal.component.d.ts.map +1 -1
- package/lib/components/voice-agent/services/audio-analyzer.service.d.ts +2 -0
- package/lib/components/voice-agent/services/audio-analyzer.service.d.ts.map +1 -1
- package/lib/components/voice-agent/services/voice-agent.service.d.ts +3 -4
- package/lib/components/voice-agent/services/voice-agent.service.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -10,6 +10,7 @@ export class AudioAnalyzerService {
|
|
|
10
10
|
this.ngZone = ngZone;
|
|
11
11
|
this.audioContext = null;
|
|
12
12
|
this.analyserNode = null;
|
|
13
|
+
this.sourceNode = null;
|
|
13
14
|
this.dataArray = null;
|
|
14
15
|
this.animationFrameId = null;
|
|
15
16
|
this.isRunning = false;
|
|
@@ -23,6 +24,7 @@ export class AudioAnalyzerService {
|
|
|
23
24
|
this.WAVEFORM_BAR_COUNT = 60;
|
|
24
25
|
// Amplify raw amplitude so normal speech (±10–20 units) maps to visible levels
|
|
25
26
|
this.SENSITIVITY_MULTIPLIER = 5;
|
|
27
|
+
this.barsBuffer = new Array(this.WAVEFORM_BAR_COUNT).fill(0);
|
|
26
28
|
this.audioLevels$ = this.audioLevelsSubject.asObservable();
|
|
27
29
|
this.isUserSpeaking$ = this.isUserSpeakingSubject.asObservable();
|
|
28
30
|
}
|
|
@@ -35,13 +37,13 @@ export class AudioAnalyzerService {
|
|
|
35
37
|
if (this.audioContext.state === 'suspended') {
|
|
36
38
|
this.audioContext.resume().catch(console.warn);
|
|
37
39
|
}
|
|
38
|
-
|
|
40
|
+
this.sourceNode = this.audioContext.createMediaStreamSource(stream);
|
|
39
41
|
this.analyserNode = this.audioContext.createAnalyser();
|
|
40
42
|
this.analyserNode.fftSize = 2048;
|
|
41
43
|
this.analyserNode.smoothingTimeConstant = 0.4;
|
|
42
44
|
const bufferLength = this.analyserNode.frequencyBinCount;
|
|
43
45
|
this.dataArray = new Uint8Array(bufferLength);
|
|
44
|
-
|
|
46
|
+
this.sourceNode.connect(this.analyserNode);
|
|
45
47
|
this.isRunning = true;
|
|
46
48
|
this.noiseFloorSamples = [];
|
|
47
49
|
this.noiseFloor = 0;
|
|
@@ -58,6 +60,10 @@ export class AudioAnalyzerService {
|
|
|
58
60
|
cancelAnimationFrame(this.animationFrameId);
|
|
59
61
|
this.animationFrameId = null;
|
|
60
62
|
}
|
|
63
|
+
if (this.sourceNode) {
|
|
64
|
+
this.sourceNode.disconnect();
|
|
65
|
+
this.sourceNode = null;
|
|
66
|
+
}
|
|
61
67
|
if (this.analyserNode) {
|
|
62
68
|
this.analyserNode.disconnect();
|
|
63
69
|
this.analyserNode = null;
|
|
@@ -95,11 +101,12 @@ export class AudioAnalyzerService {
|
|
|
95
101
|
const isSpeaking = rms > threshold;
|
|
96
102
|
// Generate waveform bars
|
|
97
103
|
const bars = this.generateWaveformBars(this.dataArray);
|
|
98
|
-
//
|
|
99
|
-
this.
|
|
100
|
-
this.isUserSpeakingSubject.next(isSpeaking);
|
|
101
|
-
|
|
102
|
-
|
|
104
|
+
// Only trigger change detection when speaking state actually changes
|
|
105
|
+
if (isSpeaking !== this.isUserSpeakingSubject.value) {
|
|
106
|
+
this.ngZone.run(() => this.isUserSpeakingSubject.next(isSpeaking));
|
|
107
|
+
}
|
|
108
|
+
// Emit audio levels outside Angular's zone — no CD triggered here
|
|
109
|
+
this.audioLevelsSubject.next(bars);
|
|
103
110
|
this.animationFrameId = requestAnimationFrame(() => this.analyze());
|
|
104
111
|
}
|
|
105
112
|
calculateRMS(data) {
|
|
@@ -111,16 +118,13 @@ export class AudioAnalyzerService {
|
|
|
111
118
|
return Math.sqrt(sum / data.length);
|
|
112
119
|
}
|
|
113
120
|
generateWaveformBars(data) {
|
|
114
|
-
const bars = [];
|
|
115
121
|
const step = Math.floor(data.length / this.WAVEFORM_BAR_COUNT);
|
|
116
122
|
for (let i = 0; i < this.WAVEFORM_BAR_COUNT; i++) {
|
|
117
|
-
const
|
|
118
|
-
const value = data[index];
|
|
119
|
-
// Normalize and amplify so quiet speech produces visible movement
|
|
123
|
+
const value = data[i * step];
|
|
120
124
|
const normalized = Math.abs((value - 128) / 128) * 100 * this.SENSITIVITY_MULTIPLIER;
|
|
121
|
-
|
|
125
|
+
this.barsBuffer[i] = Math.min(100, Math.max(0, normalized));
|
|
122
126
|
}
|
|
123
|
-
return
|
|
127
|
+
return this.barsBuffer;
|
|
124
128
|
}
|
|
125
129
|
}
|
|
126
130
|
AudioAnalyzerService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AudioAnalyzerService, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
@@ -131,4 +135,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
|
|
|
131
135
|
providedIn: 'root'
|
|
132
136
|
}]
|
|
133
137
|
}], ctorParameters: function () { return [{ type: i0.NgZone }]; } });
|
|
134
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaW8tYW5hbHl6ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2hpdmVncHQvZXZlbnRzZ3B0LWFuZ3VsYXIvc3JjL2xpYi9jb21wb25lbnRzL3ZvaWNlLWFnZW50L3NlcnZpY2VzL2F1ZGlvLWFuYWx5emVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDOztBQUVuRDs7O0dBR0c7QUFJSCxNQUFNLE9BQU8sb0JBQW9CO0lBc0IvQixZQUFvQixNQUFjO1FBQWQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQXJCMUIsaUJBQVksR0FBd0IsSUFBSSxDQUFDO1FBQ3pDLGlCQUFZLEdBQXdCLElBQUksQ0FBQztRQUN6QyxjQUFTLEdBQXNCLElBQUksQ0FBQztRQUNwQyxxQkFBZ0IsR0FBa0IsSUFBSSxDQUFDO1FBQ3ZDLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFFbEIsdUJBQWtCLEdBQUcsSUFBSSxlQUFlLENBQVcsRUFBRSxDQUFDLENBQUM7UUFDdkQsMEJBQXFCLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFFcEUsaUNBQWlDO1FBQ3pCLGVBQVUsR0FBRyxDQUFDLENBQUM7UUFDZixzQkFBaUIsR0FBYSxFQUFFLENBQUM7UUFDeEIsNkJBQXdCLEdBQUcsRUFBRSxDQUFDO1FBQzlCLGtDQUE2QixHQUFHLEdBQUcsQ0FBQztRQUNwQyx1QkFBa0IsR0FBRyxFQUFFLENBQUM7UUFDekMsK0VBQStFO1FBQzlELDJCQUFzQixHQUFHLENBQUMsQ0FBQztRQUU1QyxpQkFBWSxHQUF5QixJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDNUUsb0JBQWUsR0FBd0IsSUFBSSxDQUFDLHFCQUFx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RyxDQUFDLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUM7WUFDckYsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDbkQ7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7O2tIQTVJVSxvQkFBb0I7c0hBQXBCLG9CQUFvQixjQUZuQixNQUFNOzRGQUVQLG9CQUFvQjtrQkFIaEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBOZ1pvbmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG4vKipcbiAqIEF1ZGlvIGFuYWx5emVyIGZvciB3YXZlZm9ybSB2aXN1YWxpemF0aW9uIGFuZCBsb2NhbCAobWljKSBzcGVha2luZyBkZXRlY3Rpb24uXG4gKiBWb2ljZUFnZW50U2VydmljZSBtYXkgY29tYmluZSB0aGlzIHdpdGggV2ViU29ja2V0IHNlcnZlciBldmVudHMgZm9yIGNhbGwgc3RhdGUuXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEF1ZGlvQW5hbHl6ZXJTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBhdWRpb0NvbnRleHQ6IEF1ZGlvQ29udGV4dCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGFuYWx5c2VyTm9kZTogQW5hbHlzZXJOb2RlIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZGF0YUFycmF5OiBVaW50OEFycmF5IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgYW5pbWF0aW9uRnJhbWVJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaXNSdW5uaW5nID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBhdWRpb0xldmVsc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcltdPihbXSk7XG4gIHByaXZhdGUgaXNVc2VyU3BlYWtpbmdTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG5cbiAgLy8gQWRhcHRpdmUgbm9pc2UgZmxvb3IgZGV0ZWN0aW9uXG4gIHByaXZhdGUgbm9pc2VGbG9vciA9IDA7XG4gIHByaXZhdGUgbm9pc2VGbG9vclNhbXBsZXM6IG51bWJlcltdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgTk9JU0VfRkxPT1JfU0FNUExFX0NPVU5UID0gMzA7XG4gIHByaXZhdGUgcmVhZG9ubHkgU1BFQUtJTkdfVEhSRVNIT0xEX01VTFRJUExJRVIgPSAyLjU7XG4gIHByaXZhdGUgcmVhZG9ubHkgV0FWRUZPUk1fQkFSX0NPVU5UID0gNjA7XG4gIC8vIEFtcGxpZnkgcmF3IGFtcGxpdHVkZSBzbyBub3JtYWwgc3BlZWNoICjCsTEw4oCTMjAgdW5pdHMpIG1hcHMgdG8gdmlzaWJsZSBsZXZlbHNcbiAgcHJpdmF0ZSByZWFkb25seSBTRU5TSVRJVklUWV9NVUxUSVBMSUVSID0gNTtcblxuICBhdWRpb0xldmVscyQ6IE9ic2VydmFibGU8bnVtYmVyW10+ID0gdGhpcy5hdWRpb0xldmVsc1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIGlzVXNlclNwZWFraW5nJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuaXNVc2VyU3BlYWtpbmdTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbmdab25lOiBOZ1pvbmUpIHt9XG5cbiAgc3RhcnQoc3RyZWFtOiBNZWRpYVN0cmVhbSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzUnVubmluZykge1xuICAgICAgdGhpcy5zdG9wKCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuYXVkaW9Db250ZXh0ID0gbmV3ICh3aW5kb3cuQXVkaW9Db250ZXh0IHx8ICh3aW5kb3cgYXMgYW55KS53ZWJraXRBdWRpb0NvbnRleHQpKCk7XG4gICAgICBpZiAodGhpcy5hdWRpb0NvbnRleHQuc3RhdGUgPT09ICdzdXNwZW5kZWQnKSB7XG4gICAgICAgIHRoaXMuYXVkaW9Db250ZXh0LnJlc3VtZSgpLmNhdGNoKGNvbnNvbGUud2Fybik7XG4gICAgICB9XG4gICAgICBjb25zdCBzb3VyY2UgPSB0aGlzLmF1ZGlvQ29udGV4dC5jcmVhdGVNZWRpYVN0cmVhbVNvdXJjZShzdHJlYW0pO1xuICAgICAgXG4gICAgICB0aGlzLmFuYWx5c2VyTm9kZSA9IHRoaXMuYXVkaW9Db250ZXh0LmNyZWF0ZUFuYWx5c2VyKCk7XG4gICAgICB0aGlzLmFuYWx5c2VyTm9kZS5mZnRTaXplID0gMjA0ODtcbiAgICAgIHRoaXMuYW5hbHlzZXJOb2RlLnNtb290aGluZ1RpbWVDb25zdGFudCA9IDAuNDtcbiAgICAgIFxuICAgICAgY29uc3QgYnVmZmVyTGVuZ3RoID0gdGhpcy5hbmFseXNlck5vZGUuZnJlcXVlbmN5QmluQ291bnQ7XG4gICAgICB0aGlzLmRhdGFBcnJheSA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlckxlbmd0aCk7XG4gICAgICBcbiAgICAgIHNvdXJjZS5jb25uZWN0KHRoaXMuYW5hbHlzZXJOb2RlKTtcbiAgICAgIFxuICAgICAgdGhpcy5pc1J1bm5pbmcgPSB0cnVlO1xuICAgICAgdGhpcy5ub2lzZUZsb29yU2FtcGxlcyA9IFtdO1xuICAgICAgdGhpcy5ub2lzZUZsb29yID0gMDtcbiAgICAgIFxuICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4gdGhpcy5hbmFseXplKCkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBzdGFydGluZyBhdWRpbyBhbmFseXplcjonLCBlcnJvcik7XG4gICAgICB0aGlzLnN0b3AoKTtcbiAgICB9XG4gIH1cblxuICBzdG9wKCk6IHZvaWQge1xuICAgIHRoaXMuaXNSdW5uaW5nID0gZmFsc2U7XG4gICAgXG4gICAgaWYgKHRoaXMuYW5pbWF0aW9uRnJhbWVJZCAhPT0gbnVsbCkge1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5hbmltYXRpb25GcmFtZUlkKTtcbiAgICAgIHRoaXMuYW5pbWF0aW9uRnJhbWVJZCA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYW5hbHlzZXJOb2RlKSB7XG4gICAgICB0aGlzLmFuYWx5c2VyTm9kZS5kaXNjb25uZWN0KCk7XG4gICAgICB0aGlzLmFuYWx5c2VyTm9kZSA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYXVkaW9Db250ZXh0ICYmIHRoaXMuYXVkaW9Db250ZXh0LnN0YXRlICE9PSAnY2xvc2VkJykge1xuICAgICAgdGhpcy5hdWRpb0NvbnRleHQuY2xvc2UoKS5jYXRjaChjb25zb2xlLmVycm9yKTtcbiAgICAgIHRoaXMuYXVkaW9Db250ZXh0ID0gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLmRhdGFBcnJheSA9IG51bGw7XG4gICAgdGhpcy5hdWRpb0xldmVsc1N1YmplY3QubmV4dChbXSk7XG4gICAgdGhpcy5pc1VzZXJTcGVha2luZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIGFuYWx5emUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzUnVubmluZyB8fCAhdGhpcy5hbmFseXNlck5vZGUgfHwgIXRoaXMuZGF0YUFycmF5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5hbmFseXNlck5vZGUuZ2V0Qnl0ZVRpbWVEb21haW5EYXRhKHRoaXMuZGF0YUFycmF5KTtcbiAgICBcbiAgICAvLyBDYWxjdWxhdGUgUk1TIChSb290IE1lYW4gU3F1YXJlKSB2b2x1bWVcbiAgICBjb25zdCBybXMgPSB0aGlzLmNhbGN1bGF0ZVJNUyh0aGlzLmRhdGFBcnJheSk7XG4gICAgXG4gICAgLy8gTGVhcm4gbm9pc2UgZmxvb3IgZHVyaW5nIGluaXRpYWwgc2FtcGxlc1xuICAgIGlmICh0aGlzLm5vaXNlRmxvb3JTYW1wbGVzLmxlbmd0aCA8IHRoaXMuTk9JU0VfRkxPT1JfU0FNUExFX0NPVU5UKSB7XG4gICAgICB0aGlzLm5vaXNlRmxvb3JTYW1wbGVzLnB1c2gocm1zKTtcbiAgICAgIGlmICh0aGlzLm5vaXNlRmxvb3JTYW1wbGVzLmxlbmd0aCA9PT0gdGhpcy5OT0lTRV9GTE9PUl9TQU1QTEVfQ09VTlQpIHtcbiAgICAgICAgLy8gQ2FsY3VsYXRlIGF2ZXJhZ2Ugbm9pc2UgZmxvb3JcbiAgICAgICAgY29uc3Qgc3VtID0gdGhpcy5ub2lzZUZsb29yU2FtcGxlcy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbiAgICAgICAgdGhpcy5ub2lzZUZsb29yID0gc3VtIC8gdGhpcy5OT0lTRV9GTE9PUl9TQU1QTEVfQ09VTlQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFVwZGF0ZSBub2lzZSBmbG9vciBhZGFwdGl2ZWx5IChtb3ZpbmcgYXZlcmFnZSlcbiAgICAgIHRoaXMubm9pc2VGbG9vciA9IHRoaXMubm9pc2VGbG9vciAqIDAuOTkgKyBybXMgKiAwLjAxO1xuICAgIH1cblxuICAgIC8vIERldGVjdCBpZiB1c2VyIGlzIHNwZWFraW5nXG4gICAgY29uc3QgdGhyZXNob2xkID0gdGhpcy5ub2lzZUZsb29yICogdGhpcy5TUEVBS0lOR19USFJFU0hPTERfTVVMVElQTElFUjtcbiAgICBjb25zdCBpc1NwZWFraW5nID0gcm1zID4gdGhyZXNob2xkO1xuXG4gICAgLy8gR2VuZXJhdGUgd2F2ZWZvcm0gYmFyc1xuICAgIGNvbnN0IGJhcnMgPSB0aGlzLmdlbmVyYXRlV2F2ZWZvcm1CYXJzKHRoaXMuZGF0YUFycmF5KTtcblxuICAgIC8vIEVtaXQgaW5zaWRlIEFuZ3VsYXIncyB6b25lIHNvIGNoYW5nZSBkZXRlY3Rpb24gcGlja3MgdXAgVUkgdXBkYXRlc1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLmlzVXNlclNwZWFraW5nU3ViamVjdC5uZXh0KGlzU3BlYWtpbmcpO1xuICAgICAgdGhpcy5hdWRpb0xldmVsc1N1YmplY3QubmV4dChiYXJzKTtcbiAgICB9KTtcblxuICAgIHRoaXMuYW5pbWF0aW9uRnJhbWVJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLmFuYWx5emUoKSk7XG4gIH1cblxuICBwcml2YXRlIGNhbGN1bGF0ZVJNUyhkYXRhOiBVaW50OEFycmF5KTogbnVtYmVyIHtcbiAgICBsZXQgc3VtID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSAoZGF0YVtpXSAtIDEyOCkgLyAxMjg7XG4gICAgICBzdW0gKz0gbm9ybWFsaXplZCAqIG5vcm1hbGl6ZWQ7XG4gICAgfVxuICAgIHJldHVybiBNYXRoLnNxcnQoc3VtIC8gZGF0YS5sZW5ndGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZVdhdmVmb3JtQmFycyhkYXRhOiBVaW50OEFycmF5KTogbnVtYmVyW10ge1xuICAgIGNvbnN0IGJhcnM6IG51bWJlcltdID0gW107XG4gICAgY29uc3Qgc3RlcCA9IE1hdGguZmxvb3IoZGF0YS5sZW5ndGggLyB0aGlzLldBVkVGT1JNX0JBUl9DT1VOVCk7XG4gICAgXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLldBVkVGT1JNX0JBUl9DT1VOVDsgaSsrKSB7XG4gICAgICBjb25zdCBpbmRleCA9IGkgKiBzdGVwO1xuICAgICAgY29uc3QgdmFsdWUgPSBkYXRhW2luZGV4XTtcbiAgICAgIC8vIE5vcm1hbGl6ZSBhbmQgYW1wbGlmeSBzbyBxdWlldCBzcGVlY2ggcHJvZHVjZXMgdmlzaWJsZSBtb3ZlbWVudFxuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IE1hdGguYWJzKCh2YWx1ZSAtIDEyOCkgLyAxMjgpICogMTAwICogdGhpcy5TRU5TSVRJVklUWV9NVUxUSVBMSUVSO1xuICAgICAgYmFycy5wdXNoKE1hdGgubWluKDEwMCwgTWF0aC5tYXgoMCwgbm9ybWFsaXplZCkpKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGJhcnM7XG4gIH1cbn1cbiJdfQ==
|
|
138
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaW8tYW5hbHl6ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2hpdmVncHQvZXZlbnRzZ3B0LWFuZ3VsYXIvc3JjL2xpYi9jb21wb25lbnRzL3ZvaWNlLWFnZW50L3NlcnZpY2VzL2F1ZGlvLWFuYWx5emVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDOztBQUVuRDs7O0dBR0c7QUFJSCxNQUFNLE9BQU8sb0JBQW9CO0lBd0IvQixZQUFvQixNQUFjO1FBQWQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQXZCMUIsaUJBQVksR0FBd0IsSUFBSSxDQUFDO1FBQ3pDLGlCQUFZLEdBQXdCLElBQUksQ0FBQztRQUN6QyxlQUFVLEdBQXNDLElBQUksQ0FBQztRQUNyRCxjQUFTLEdBQXNCLElBQUksQ0FBQztRQUNwQyxxQkFBZ0IsR0FBa0IsSUFBSSxDQUFDO1FBQ3ZDLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFFbEIsdUJBQWtCLEdBQUcsSUFBSSxlQUFlLENBQVcsRUFBRSxDQUFDLENBQUM7UUFDdkQsMEJBQXFCLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFFcEUsaUNBQWlDO1FBQ3pCLGVBQVUsR0FBRyxDQUFDLENBQUM7UUFDZixzQkFBaUIsR0FBYSxFQUFFLENBQUM7UUFDeEIsNkJBQXdCLEdBQUcsRUFBRSxDQUFDO1FBQzlCLGtDQUE2QixHQUFHLEdBQUcsQ0FBQztRQUNwQyx1QkFBa0IsR0FBRyxFQUFFLENBQUM7UUFDekMsK0VBQStFO1FBQzlELDJCQUFzQixHQUFHLENBQUMsQ0FBQztRQUNwQyxlQUFVLEdBQWEsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsSUFB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QUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDL0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNoRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1lBQzdCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztZQUNyRixJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7U0FDN0Q7UUFDRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQzs7a0hBL0lVLG9CQUFvQjtzSEFBcEIsb0JBQW9CLGNBRm5CLE1BQU07NEZBRVAsb0JBQW9CO2tCQUhoQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbi8qKlxuICogQXVkaW8gYW5hbHl6ZXIgZm9yIHdhdmVmb3JtIHZpc3VhbGl6YXRpb24gYW5kIGxvY2FsIChtaWMpIHNwZWFraW5nIGRldGVjdGlvbi5cbiAqIFZvaWNlQWdlbnRTZXJ2aWNlIG1heSBjb21iaW5lIHRoaXMgd2l0aCBXZWJTb2NrZXQgc2VydmVyIGV2ZW50cyBmb3IgY2FsbCBzdGF0ZS5cbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQXVkaW9BbmFseXplclNlcnZpY2Uge1xuICBwcml2YXRlIGF1ZGlvQ29udGV4dDogQXVkaW9Db250ZXh0IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgYW5hbHlzZXJOb2RlOiBBbmFseXNlck5vZGUgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzb3VyY2VOb2RlOiBNZWRpYVN0cmVhbUF1ZGlvU291cmNlTm9kZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGRhdGFBcnJheTogVWludDhBcnJheSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGFuaW1hdGlvbkZyYW1lSWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGlzUnVubmluZyA9IGZhbHNlO1xuXG4gIHByaXZhdGUgYXVkaW9MZXZlbHNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXJbXT4oW10pO1xuICBwcml2YXRlIGlzVXNlclNwZWFraW5nU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8vIEFkYXB0aXZlIG5vaXNlIGZsb29yIGRldGVjdGlvblxuICBwcml2YXRlIG5vaXNlRmxvb3IgPSAwO1xuICBwcml2YXRlIG5vaXNlRmxvb3JTYW1wbGVzOiBudW1iZXJbXSA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IE5PSVNFX0ZMT09SX1NBTVBMRV9DT1VOVCA9IDMwO1xuICBwcml2YXRlIHJlYWRvbmx5IFNQRUFLSU5HX1RIUkVTSE9MRF9NVUxUSVBMSUVSID0gMi41O1xuICBwcml2YXRlIHJlYWRvbmx5IFdBVkVGT1JNX0JBUl9DT1VOVCA9IDYwO1xuICAvLyBBbXBsaWZ5IHJhdyBhbXBsaXR1ZGUgc28gbm9ybWFsIHNwZWVjaCAowrExMOKAkzIwIHVuaXRzKSBtYXBzIHRvIHZpc2libGUgbGV2ZWxzXG4gIHByaXZhdGUgcmVhZG9ubHkgU0VOU0lUSVZJVFlfTVVMVElQTElFUiA9IDU7XG4gIHByaXZhdGUgYmFyc0J1ZmZlcjogbnVtYmVyW10gPSBuZXcgQXJyYXkodGhpcy5XQVZFRk9STV9CQVJfQ09VTlQpLmZpbGwoMCk7XG5cbiAgYXVkaW9MZXZlbHMkOiBPYnNlcnZhYmxlPG51bWJlcltdPiA9IHRoaXMuYXVkaW9MZXZlbHNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICBpc1VzZXJTcGVha2luZyQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLmlzVXNlclNwZWFraW5nU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG5nWm9uZTogTmdab25lKSB7fVxuXG4gIHN0YXJ0KHN0cmVhbTogTWVkaWFTdHJlYW0pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc1J1bm5pbmcpIHtcbiAgICAgIHRoaXMuc3RvcCgpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICB0aGlzLmF1ZGlvQ29udGV4dCA9IG5ldyAod2luZG93LkF1ZGlvQ29udGV4dCB8fCAod2luZG93IGFzIGFueSkud2Via2l0QXVkaW9Db250ZXh0KSgpO1xuICAgICAgaWYgKHRoaXMuYXVkaW9Db250ZXh0LnN0YXRlID09PSAnc3VzcGVuZGVkJykge1xuICAgICAgICB0aGlzLmF1ZGlvQ29udGV4dC5yZXN1bWUoKS5jYXRjaChjb25zb2xlLndhcm4pO1xuICAgICAgfVxuICAgICAgdGhpcy5zb3VyY2VOb2RlID0gdGhpcy5hdWRpb0NvbnRleHQuY3JlYXRlTWVkaWFTdHJlYW1Tb3VyY2Uoc3RyZWFtKTtcblxuICAgICAgdGhpcy5hbmFseXNlck5vZGUgPSB0aGlzLmF1ZGlvQ29udGV4dC5jcmVhdGVBbmFseXNlcigpO1xuICAgICAgdGhpcy5hbmFseXNlck5vZGUuZmZ0U2l6ZSA9IDIwNDg7XG4gICAgICB0aGlzLmFuYWx5c2VyTm9kZS5zbW9vdGhpbmdUaW1lQ29uc3RhbnQgPSAwLjQ7XG5cbiAgICAgIGNvbnN0IGJ1ZmZlckxlbmd0aCA9IHRoaXMuYW5hbHlzZXJOb2RlLmZyZXF1ZW5jeUJpbkNvdW50O1xuICAgICAgdGhpcy5kYXRhQXJyYXkgPSBuZXcgVWludDhBcnJheShidWZmZXJMZW5ndGgpO1xuXG4gICAgICB0aGlzLnNvdXJjZU5vZGUuY29ubmVjdCh0aGlzLmFuYWx5c2VyTm9kZSk7XG4gICAgICBcbiAgICAgIHRoaXMuaXNSdW5uaW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMubm9pc2VGbG9vclNhbXBsZXMgPSBbXTtcbiAgICAgIHRoaXMubm9pc2VGbG9vciA9IDA7XG4gICAgICBcbiAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHRoaXMuYW5hbHl6ZSgpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igc3RhcnRpbmcgYXVkaW8gYW5hbHl6ZXI6JywgZXJyb3IpO1xuICAgICAgdGhpcy5zdG9wKCk7XG4gICAgfVxuICB9XG5cbiAgc3RvcCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzUnVubmluZyA9IGZhbHNlO1xuICAgIFxuICAgIGlmICh0aGlzLmFuaW1hdGlvbkZyYW1lSWQgIT09IG51bGwpIHtcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuYW5pbWF0aW9uRnJhbWVJZCk7XG4gICAgICB0aGlzLmFuaW1hdGlvbkZyYW1lSWQgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNvdXJjZU5vZGUpIHtcbiAgICAgIHRoaXMuc291cmNlTm9kZS5kaXNjb25uZWN0KCk7XG4gICAgICB0aGlzLnNvdXJjZU5vZGUgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmFuYWx5c2VyTm9kZSkge1xuICAgICAgdGhpcy5hbmFseXNlck5vZGUuZGlzY29ubmVjdCgpO1xuICAgICAgdGhpcy5hbmFseXNlck5vZGUgPSBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmF1ZGlvQ29udGV4dCAmJiB0aGlzLmF1ZGlvQ29udGV4dC5zdGF0ZSAhPT0gJ2Nsb3NlZCcpIHtcbiAgICAgIHRoaXMuYXVkaW9Db250ZXh0LmNsb3NlKCkuY2F0Y2goY29uc29sZS5lcnJvcik7XG4gICAgICB0aGlzLmF1ZGlvQ29udGV4dCA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5kYXRhQXJyYXkgPSBudWxsO1xuICAgIHRoaXMuYXVkaW9MZXZlbHNTdWJqZWN0Lm5leHQoW10pO1xuICAgIHRoaXMuaXNVc2VyU3BlYWtpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBhbmFseXplKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1J1bm5pbmcgfHwgIXRoaXMuYW5hbHlzZXJOb2RlIHx8ICF0aGlzLmRhdGFBcnJheSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYW5hbHlzZXJOb2RlLmdldEJ5dGVUaW1lRG9tYWluRGF0YSh0aGlzLmRhdGFBcnJheSk7XG4gICAgXG4gICAgLy8gQ2FsY3VsYXRlIFJNUyAoUm9vdCBNZWFuIFNxdWFyZSkgdm9sdW1lXG4gICAgY29uc3Qgcm1zID0gdGhpcy5jYWxjdWxhdGVSTVModGhpcy5kYXRhQXJyYXkpO1xuICAgIFxuICAgIC8vIExlYXJuIG5vaXNlIGZsb29yIGR1cmluZyBpbml0aWFsIHNhbXBsZXNcbiAgICBpZiAodGhpcy5ub2lzZUZsb29yU2FtcGxlcy5sZW5ndGggPCB0aGlzLk5PSVNFX0ZMT09SX1NBTVBMRV9DT1VOVCkge1xuICAgICAgdGhpcy5ub2lzZUZsb29yU2FtcGxlcy5wdXNoKHJtcyk7XG4gICAgICBpZiAodGhpcy5ub2lzZUZsb29yU2FtcGxlcy5sZW5ndGggPT09IHRoaXMuTk9JU0VfRkxPT1JfU0FNUExFX0NPVU5UKSB7XG4gICAgICAgIC8vIENhbGN1bGF0ZSBhdmVyYWdlIG5vaXNlIGZsb29yXG4gICAgICAgIGNvbnN0IHN1bSA9IHRoaXMubm9pc2VGbG9vclNhbXBsZXMucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XG4gICAgICAgIHRoaXMubm9pc2VGbG9vciA9IHN1bSAvIHRoaXMuTk9JU0VfRkxPT1JfU0FNUExFX0NPVU5UO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBVcGRhdGUgbm9pc2UgZmxvb3IgYWRhcHRpdmVseSAobW92aW5nIGF2ZXJhZ2UpXG4gICAgICB0aGlzLm5vaXNlRmxvb3IgPSB0aGlzLm5vaXNlRmxvb3IgKiAwLjk5ICsgcm1zICogMC4wMTtcbiAgICB9XG5cbiAgICAvLyBEZXRlY3QgaWYgdXNlciBpcyBzcGVha2luZ1xuICAgIGNvbnN0IHRocmVzaG9sZCA9IHRoaXMubm9pc2VGbG9vciAqIHRoaXMuU1BFQUtJTkdfVEhSRVNIT0xEX01VTFRJUExJRVI7XG4gICAgY29uc3QgaXNTcGVha2luZyA9IHJtcyA+IHRocmVzaG9sZDtcblxuICAgIC8vIEdlbmVyYXRlIHdhdmVmb3JtIGJhcnNcbiAgICBjb25zdCBiYXJzID0gdGhpcy5nZW5lcmF0ZVdhdmVmb3JtQmFycyh0aGlzLmRhdGFBcnJheSk7XG5cbiAgICAvLyBPbmx5IHRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiB3aGVuIHNwZWFraW5nIHN0YXRlIGFjdHVhbGx5IGNoYW5nZXNcbiAgICBpZiAoaXNTcGVha2luZyAhPT0gdGhpcy5pc1VzZXJTcGVha2luZ1N1YmplY3QudmFsdWUpIHtcbiAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLmlzVXNlclNwZWFraW5nU3ViamVjdC5uZXh0KGlzU3BlYWtpbmcpKTtcbiAgICB9XG4gICAgLy8gRW1pdCBhdWRpbyBsZXZlbHMgb3V0c2lkZSBBbmd1bGFyJ3Mgem9uZSDigJQgbm8gQ0QgdHJpZ2dlcmVkIGhlcmVcbiAgICB0aGlzLmF1ZGlvTGV2ZWxzU3ViamVjdC5uZXh0KGJhcnMpO1xuXG4gICAgdGhpcy5hbmltYXRpb25GcmFtZUlkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMuYW5hbHl6ZSgpKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlUk1TKGRhdGE6IFVpbnQ4QXJyYXkpOiBudW1iZXIge1xuICAgIGxldCBzdW0gPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IChkYXRhW2ldIC0gMTI4KSAvIDEyODtcbiAgICAgIHN1bSArPSBub3JtYWxpemVkICogbm9ybWFsaXplZDtcbiAgICB9XG4gICAgcmV0dXJuIE1hdGguc3FydChzdW0gLyBkYXRhLmxlbmd0aCk7XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlV2F2ZWZvcm1CYXJzKGRhdGE6IFVpbnQ4QXJyYXkpOiBudW1iZXJbXSB7XG4gICAgY29uc3Qgc3RlcCA9IE1hdGguZmxvb3IoZGF0YS5sZW5ndGggLyB0aGlzLldBVkVGT1JNX0JBUl9DT1VOVCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLldBVkVGT1JNX0JBUl9DT1VOVDsgaSsrKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGRhdGFbaSAqIHN0ZXBdO1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IE1hdGguYWJzKCh2YWx1ZSAtIDEyOCkgLyAxMjgpICogMTAwICogdGhpcy5TRU5TSVRJVklUWV9NVUxUSVBMSUVSO1xuICAgICAgdGhpcy5iYXJzQnVmZmVyW2ldID0gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCBub3JtYWxpemVkKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmJhcnNCdWZmZXI7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -40,7 +40,7 @@ export class VoiceAgentService {
|
|
|
40
40
|
this.botAudioElement = null;
|
|
41
41
|
this.lifecycleToken = 0;
|
|
42
42
|
this.subscriptions = new Subscription();
|
|
43
|
-
this.
|
|
43
|
+
this.pcEventCleanup = [];
|
|
44
44
|
this.callState$ = this.callStateSubject.asObservable();
|
|
45
45
|
this.statusText$ = this.statusTextSubject.asObservable();
|
|
46
46
|
this.duration$ = this.durationSubject.asObservable();
|
|
@@ -49,12 +49,7 @@ export class VoiceAgentService {
|
|
|
49
49
|
this.audioLevels$ = this.audioLevelsSubject.asObservable();
|
|
50
50
|
this.userTranscript$ = this.userTranscriptSubject.asObservable();
|
|
51
51
|
this.botTranscript$ = this.botTranscriptSubject.asObservable();
|
|
52
|
-
this.subscriptions.add(this.audioAnalyzer.audioLevels$.pipe(throttleTime(50)).subscribe((levels) => this.audioLevelsSubject.next(levels)));
|
|
53
|
-
}
|
|
54
|
-
ngOnDestroy() {
|
|
55
|
-
this.destroy$.next();
|
|
56
|
-
this.subscriptions.unsubscribe();
|
|
57
|
-
void this.disconnect();
|
|
52
|
+
this.subscriptions.add(this.audioAnalyzer.audioLevels$.pipe(throttleTime(50)).subscribe((levels) => this.ngZone.run(() => this.audioLevelsSubject.next(levels))));
|
|
58
53
|
}
|
|
59
54
|
/** Reset to idle (e.g. when modal re-opens so user can click Start Call). */
|
|
60
55
|
resetToIdle() {
|
|
@@ -141,32 +136,36 @@ export class VoiceAgentService {
|
|
|
141
136
|
});
|
|
142
137
|
this.pcClient = pcClient;
|
|
143
138
|
// Bot audio arrives as a MediaStreamTrack — wire to a hidden <audio> element
|
|
144
|
-
|
|
139
|
+
const onTrackStarted = (track, participant) => {
|
|
145
140
|
if (!this.isLifecycleActive(connectToken))
|
|
146
141
|
return;
|
|
147
142
|
if (!participant?.local && track.kind === 'audio') {
|
|
148
143
|
this.ngZone.run(() => this.setupBotAudioTrack(track));
|
|
149
144
|
}
|
|
150
|
-
}
|
|
145
|
+
};
|
|
146
|
+
pcClient.on(RTVIEvent.TrackStarted, onTrackStarted);
|
|
151
147
|
// Speaking state comes straight from RTVI events
|
|
152
|
-
|
|
148
|
+
const onBotStarted = () => this.ngZone.run(() => {
|
|
153
149
|
if (!this.isLifecycleActive(connectToken))
|
|
154
150
|
return;
|
|
155
151
|
this.onBotStartedSpeaking();
|
|
156
|
-
})
|
|
157
|
-
pcClient.on(RTVIEvent.
|
|
152
|
+
});
|
|
153
|
+
pcClient.on(RTVIEvent.BotStartedSpeaking, onBotStarted);
|
|
154
|
+
const onBotStopped = () => this.ngZone.run(() => {
|
|
158
155
|
if (!this.isLifecycleActive(connectToken))
|
|
159
156
|
return;
|
|
160
157
|
this.onBotStoppedSpeaking();
|
|
161
|
-
})
|
|
162
|
-
pcClient.on(RTVIEvent.
|
|
158
|
+
});
|
|
159
|
+
pcClient.on(RTVIEvent.BotStoppedSpeaking, onBotStopped);
|
|
160
|
+
const onUserStarted = () => this.ngZone.run(() => {
|
|
163
161
|
if (!this.isLifecycleActive(connectToken))
|
|
164
162
|
return;
|
|
165
163
|
this.isUserSpeakingSubject.next(true);
|
|
166
164
|
this.callStateSubject.next('listening');
|
|
167
165
|
this.statusTextSubject.next('Listening...');
|
|
168
|
-
})
|
|
169
|
-
pcClient.on(RTVIEvent.
|
|
166
|
+
});
|
|
167
|
+
pcClient.on(RTVIEvent.UserStartedSpeaking, onUserStarted);
|
|
168
|
+
const onUserStopped = () => this.ngZone.run(() => {
|
|
170
169
|
if (!this.isLifecycleActive(connectToken))
|
|
171
170
|
return;
|
|
172
171
|
this.isUserSpeakingSubject.next(false);
|
|
@@ -175,7 +174,16 @@ export class VoiceAgentService {
|
|
|
175
174
|
this.callStateSubject.next('connected');
|
|
176
175
|
this.statusTextSubject.next('Processing...');
|
|
177
176
|
}
|
|
178
|
-
})
|
|
177
|
+
});
|
|
178
|
+
pcClient.on(RTVIEvent.UserStoppedSpeaking, onUserStopped);
|
|
179
|
+
// Store cleanup fns so listeners are removed on disconnect
|
|
180
|
+
this.pcEventCleanup = [
|
|
181
|
+
() => pcClient.off(RTVIEvent.TrackStarted, onTrackStarted),
|
|
182
|
+
() => pcClient.off(RTVIEvent.BotStartedSpeaking, onBotStarted),
|
|
183
|
+
() => pcClient.off(RTVIEvent.BotStoppedSpeaking, onBotStopped),
|
|
184
|
+
() => pcClient.off(RTVIEvent.UserStartedSpeaking, onUserStarted),
|
|
185
|
+
() => pcClient.off(RTVIEvent.UserStoppedSpeaking, onUserStopped),
|
|
186
|
+
];
|
|
179
187
|
// Acquire mic (triggers browser permission prompt)
|
|
180
188
|
await pcClient.initDevices();
|
|
181
189
|
// Build headers using the browser Headers API (required by pipecat's APIRequest type)
|
|
@@ -303,6 +311,9 @@ export class VoiceAgentService {
|
|
|
303
311
|
async cleanupPipecatClient() {
|
|
304
312
|
if (this.pcClient) {
|
|
305
313
|
try {
|
|
314
|
+
// Remove all event listeners before disconnecting
|
|
315
|
+
this.pcEventCleanup.forEach(fn => fn());
|
|
316
|
+
this.pcEventCleanup = [];
|
|
306
317
|
await this.pcClient.disconnect();
|
|
307
318
|
}
|
|
308
319
|
catch {
|
|
@@ -353,4 +364,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
|
|
|
353
364
|
type: Inject,
|
|
354
365
|
args: [PLATFORM_ID]
|
|
355
366
|
}] }]; } });
|
|
356
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidm9pY2UtYWdlbnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2hpdmVncHQvZXZlbnRzZ3B0LWFuZ3VsYXIvc3JjL2xpYi9jb21wb25lbnRzL3ZvaWNlLWFnZW50L3NlcnZpY2VzL3ZvaWNlLWFnZW50LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQXFCLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRixPQUFPLEVBQUUsZUFBZSxFQUFjLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDOzs7O0FBaUJyRTs7Ozs7Ozs7OztHQVVHO0FBSUgsTUFBTSxPQUFPLGlCQUFpQjtJQTZCNUIsWUFDVSxhQUFtQyxFQUNuQyxvQkFBaUQsRUFDakQsTUFBYztJQUN0Qiw4RkFBOEY7SUFDakUsVUFBa0I7UUFKdkMsa0JBQWEsR0FBYixhQUFhLENBQXNCO1FBQ25DLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBNkI7UUFDakQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUVPLGVBQVUsR0FBVixVQUFVLENBQVE7UUFqQ3pDLHFCQUFnQixHQUFHLElBQUksZUFBZSxDQUFZLE1BQU0sQ0FBQyxDQUFDO1FBQzFELHNCQUFpQixHQUFHLElBQUksZUFBZSxDQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ3BELG9CQUFlLEdBQUcsSUFBSSxlQUFlLENB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QUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ3hGO1FBQ0gsQ0FBQyxDQUFDO1FBQ0YsSUFBSSxFQUFFLENBQUM7UUFDUCxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtZQUNqQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsV0FBVyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxpQkFBaUI7UUFDdkIsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDekIsYUFBYSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3JDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7U0FDOUI7SUFDSCxDQUFDOzsrR0FyWFUsaUJBQWlCLHVIQWtDbEIsV0FBVzttSEFsQ1YsaUJBQWlCLGNBRmhCLE1BQU07NEZBRVAsaUJBQWlCO2tCQUg3QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBbUNJLE1BQU07MkJBQUMsV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgTmdab25lLCBPbkRlc3Ryb3ksIFBMQVRGT1JNX0lEIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIHRha2UsIHRocm90dGxlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFBpcGVjYXRDbGllbnQsIFJUVklFdmVudCB9IGZyb20gJ0BwaXBlY2F0LWFpL2NsaWVudC1qcyc7XG5pbXBvcnQgeyBXZWJTb2NrZXRUcmFuc3BvcnQgfSBmcm9tICdAcGlwZWNhdC1haS93ZWJzb2NrZXQtdHJhbnNwb3J0JztcbmltcG9ydCB7IFBsYXRmb3JtVG9rZW5SZWZyZXNoU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3BsYXRmb3JtLXRva2VuLXJlZnJlc2guc2VydmljZSc7XG5pbXBvcnQgeyBBdWRpb0FuYWx5emVyU2VydmljZSB9IGZyb20gJy4vYXVkaW8tYW5hbHl6ZXIuc2VydmljZSc7XG5cbmV4cG9ydCB0eXBlIENhbGxTdGF0ZSA9XG4gIHwgJ2lkbGUnXG4gIHwgJ2Nvbm5lY3RpbmcnXG4gIHwgJ2Nvbm5lY3RlZCdcbiAgfCAnbGlzdGVuaW5nJ1xuICB8ICd0YWxraW5nJ1xuICB8ICdlbmRlZCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNjcmlwdERhdGEge1xuICB0ZXh0OiBzdHJpbmc7XG4gIGZpbmFsOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFZvaWNlIGFnZW50IG9yY2hlc3RyYXRvciB1c2luZyB0aGUgb2ZmaWNpYWwgUGlwZWNhdENsaWVudCBTREsuXG4gKlxuICogQXVkaW8gZmxvdyAobWlycm9ycyB0aGUgUmVhY3QgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uKTpcbiAqICAtIExvY2FsIG1pYzogYWNxdWlyZWQgYnkgUGlwZWNhdENsaWVudC5pbml0RGV2aWNlcygpOyBsb2NhbCB0cmFjayBmZWQgdG9cbiAqICAgIEF1ZGlvQW5hbHl6ZXJTZXJ2aWNlIGZvciB3YXZlZm9ybSB2aXN1YWxpc2F0aW9uLlxuICogIC0gQm90IGF1ZGlvOiByZWNlaXZlZCBhcyBhIE1lZGlhU3RyZWFtVHJhY2sgdmlhIFJUVklFdmVudC5UcmFja1N0YXJ0ZWQsXG4gKiAgICBwbGF5ZWQgdGhyb3VnaCBhIGhpZGRlbiA8YXVkaW8+IGVsZW1lbnQuXG4gKiAgLSBBbGwgYmluYXJ5IHByb3RvYnVmIGZyYW1pbmcgLyBSVFZJIHByb3RvY29sIGhhbmRsZWQgYnlcbiAqICAgIEBwaXBlY2F0LWFpL2NsaWVudC1qcyArIEBwaXBlY2F0LWFpL3dlYnNvY2tldC10cmFuc3BvcnQuXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBWb2ljZUFnZW50U2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgY2FsbFN0YXRlU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q2FsbFN0YXRlPignaWRsZScpO1xuICBwcml2YXRlIHN0YXR1c1RleHRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKTtcbiAgcHJpdmF0ZSBkdXJhdGlvblN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJzAwOjAwJyk7XG4gIHByaXZhdGUgaXNNaWNNdXRlZFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBpc1VzZXJTcGVha2luZ1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBhdWRpb0xldmVsc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcltdPihbXSk7XG4gIHByaXZhdGUgdXNlclRyYW5zY3JpcHRTdWJqZWN0ID0gbmV3IFN1YmplY3Q8VHJhbnNjcmlwdERhdGE+KCk7XG4gIHByaXZhdGUgYm90VHJhbnNjcmlwdFN1YmplY3QgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG5cbiAgcHJpdmF0ZSBjYWxsU3RhcnRUaW1lID0gMDtcbiAgcHJpdmF0ZSBkdXJhdGlvbkludGVydmFsOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIHBjQ2xpZW50OiBQaXBlY2F0Q2xpZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgYm90QXVkaW9FbGVtZW50OiBIVE1MQXVkaW9FbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbGlmZWN5Y2xlVG9rZW4gPSAwO1xuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgY2FsbFN0YXRlJDogT2JzZXJ2YWJsZTxDYWxsU3RhdGU+ID0gdGhpcy5jYWxsU3RhdGVTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICBzdGF0dXNUZXh0JDogT2JzZXJ2YWJsZTxzdHJpbmc+ID0gdGhpcy5zdGF0dXNUZXh0U3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgZHVyYXRpb24kOiBPYnNlcnZhYmxlPHN0cmluZz4gPSB0aGlzLmR1cmF0aW9uU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgaXNNaWNNdXRlZCQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLmlzTWljTXV0ZWRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICBpc1VzZXJTcGVha2luZyQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLmlzVXNlclNwZWFraW5nU3ViamVjdC5hc09ic2VydmFibGUoKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xuICBhdWRpb0xldmVscyQ6IE9ic2VydmFibGU8bnVtYmVyW10+ID0gdGhpcy5hdWRpb0xldmVsc1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIHVzZXJUcmFuc2NyaXB0JDogT2JzZXJ2YWJsZTxUcmFuc2NyaXB0RGF0YT4gPSB0aGlzLnVzZXJUcmFuc2NyaXB0U3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgYm90VHJhbnNjcmlwdCQ6IE9ic2VydmFibGU8c3RyaW5nPiA9IHRoaXMuYm90VHJhbnNjcmlwdFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhdWRpb0FuYWx5emVyOiBBdWRpb0FuYWx5emVyU2VydmljZSxcbiAgICBwcml2YXRlIHBsYXRmb3JtVG9rZW5SZWZyZXNoOiBQbGF0Zm9ybVRva2VuUmVmcmVzaFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICAvKiogYE9iamVjdGAgbm90IGBvYmplY3RgIOKAlCBuZ2MgbWV0YWRhdGEgY29sbGVjdGlvbiByZWplY3RzIHRoZSBgb2JqZWN0YCB0eXBlIGluIERJIHBhcmFtcy4gKi9cbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IE9iamVjdCxcbiAgKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMuYXVkaW9BbmFseXplci5hdWRpb0xldmVscyQucGlwZSh0aHJvdHRsZVRpbWUoNTApKS5zdWJzY3JpYmUoKGxldmVscykgPT5cbiAgICAgICAgdGhpcy5hdWRpb0xldmVsc1N1YmplY3QubmV4dChsZXZlbHMpLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgdm9pZCB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgfVxuXG4gIC8qKiBSZXNldCB0byBpZGxlIChlLmcuIHdoZW4gbW9kYWwgcmUtb3BlbnMgc28gdXNlciBjYW4gY2xpY2sgU3RhcnQgQ2FsbCkuICovXG4gIHJlc2V0VG9JZGxlKCk6IHZvaWQge1xuICAgIHZvaWQgdGhpcy5wcmVwYXJlRnJlc2hTZXNzaW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogSGFyZCByZXNldCB2b2ljZSBzZXNzaW9uIHNvIGVhY2ggbW9kYWwgb3BlbiBzdGFydHMgZnJvbSBhIGNsZWFuIHN0YXRlLlxuICAgKiBDbG9zZXMgYW55IHByZXZpb3VzIGNsaWVudCBhbmQgcHJldmVudHMgc3RhbGUgY2FsbGJhY2tzIGZyb20gbXV0YXRpbmcgVUkgc3RhdGUuXG4gICAqL1xuICBhc3luYyBwcmVwYXJlRnJlc2hTZXNzaW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMubGlmZWN5Y2xlVG9rZW4gKz0gMTtcbiAgICB0aGlzLnN0b3BEdXJhdGlvblRpbWVyKCk7XG4gICAgdGhpcy5jYWxsU3RhcnRUaW1lID0gMDtcbiAgICB0aGlzLmF1ZGlvQW5hbHl6ZXIuc3RvcCgpO1xuICAgIHRoaXMuc3RvcEJvdEF1ZGlvKCk7XG4gICAgdGhpcy5pc1VzZXJTcGVha2luZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgdGhpcy5pc01pY011dGVkU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICB0aGlzLmR1cmF0aW9uU3ViamVjdC5uZXh0KCcwMDowMCcpO1xuICAgIHRoaXMuc3RhdHVzVGV4dFN1YmplY3QubmV4dCgnJyk7XG4gICAgdGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoJ2lkbGUnKTtcbiAgICBhd2FpdCB0aGlzLmNsZWFudXBQaXBlY2F0Q2xpZW50KCk7XG4gIH1cblxuICBhc3luYyBjb25uZWN0KFxuICAgIGFwaVVybDogc3RyaW5nLFxuICAgIHRva2VuOiBzdHJpbmcsXG4gICAgYm90SWQ6IHN0cmluZyxcbiAgICBjb252ZXJzYXRpb25JZDogc3RyaW5nLFxuICAgIGFwaUtleTogc3RyaW5nLFxuICAgIGV2ZW50VG9rZW46IHN0cmluZyxcbiAgICBldmVudElkOiBzdHJpbmcsXG4gICAgZXZlbnRVcmw6IHN0cmluZyxcbiAgICBkb21haW5BdXRob3JpdHk6IHN0cmluZyxcbiAgICB1c2Vyc0FwaVVybD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuY2FsbFN0YXRlU3ViamVjdC52YWx1ZSAhPT0gJ2lkbGUnKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tIaXZlR3B0IFZvaWNlXSBDYWxsIGFscmVhZHkgaW4gcHJvZ3Jlc3MnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjb25uZWN0VG9rZW4gPSArK3RoaXMubGlmZWN5Y2xlVG9rZW47XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoJ2Nvbm5lY3RpbmcnKTtcbiAgICAgIHRoaXMuc3RhdHVzVGV4dFN1YmplY3QubmV4dCgnQ29ubmVjdGluZy4uLicpO1xuXG4gICAgICBsZXQgYWNjZXNzVG9rZW4gPSB0b2tlbjtcbiAgICAgIGlmICh1c2Vyc0FwaVVybCAmJiBpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZW5zdXJlZCA9IGF3YWl0IHRoaXMucGxhdGZvcm1Ub2tlblJlZnJlc2hcbiAgICAgICAgICAgIC5lbnN1cmVWYWxpZEFjY2Vzc1Rva2VuKHRva2VuLCB1c2Vyc0FwaVVybClcbiAgICAgICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgICAgICAudG9Qcm9taXNlKCk7XG4gICAgICAgICAgaWYgKGVuc3VyZWQ/LmFjY2Vzc1Rva2VuKSBhY2Nlc3NUb2tlbiA9IGVuc3VyZWQuYWNjZXNzVG9rZW47XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1tIaXZlR3B0IFZvaWNlXSBUb2tlbiByZWZyZXNoIGZhaWxlZCcsIGUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJhc2VVcmwgPSBhcGlVcmwucmVwbGFjZSgvXFwvJC8sICcnKTtcblxuICAgICAgY29uc3QgcGNDbGllbnQgPSBuZXcgUGlwZWNhdENsaWVudCh7XG4gICAgICAgIHRyYW5zcG9ydDogbmV3IFdlYlNvY2tldFRyYW5zcG9ydCgpLFxuICAgICAgICBlbmFibGVNaWM6IHRydWUsXG4gICAgICAgIGVuYWJsZUNhbTogZmFsc2UsXG4gICAgICAgIGNhbGxiYWNrczoge1xuICAgICAgICAgIG9uQ29ubmVjdGVkOiAoKSA9PlxuICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzTGlmZWN5Y2xlQWN0aXZlKGNvbm5lY3RUb2tlbikpIHJldHVybjtcbiAgICAgICAgICAgICAgdGhpcy5vblBpcGVjYXRDb25uZWN0ZWQoKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIG9uRGlzY29ubmVjdGVkOiAoKSA9PlxuICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzTGlmZWN5Y2xlQWN0aXZlKGNvbm5lY3RUb2tlbikpIHJldHVybjtcbiAgICAgICAgICAgICAgdGhpcy5vblBpcGVjYXREaXNjb25uZWN0ZWQoKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIG9uQm90UmVhZHk6ICgpID0+XG4gICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNMaWZlY3ljbGVBY3RpdmUoY29ubmVjdFRva2VuKSkgcmV0dXJuO1xuICAgICAgICAgICAgICB0aGlzLm9uQm90UmVhZHkoKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIG9uVXNlclRyYW5zY3JpcHQ6IChkYXRhKSA9PlxuICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+XG4gICAgICAgICAgICAgIHRoaXMuaXNMaWZlY3ljbGVBY3RpdmUoY29ubmVjdFRva2VuKSAmJlxuICAgICAgICAgICAgICB0aGlzLnVzZXJUcmFuc2NyaXB0U3ViamVjdC5uZXh0KHsgdGV4dDogZGF0YS50ZXh0LCBmaW5hbDogISFkYXRhLmZpbmFsIH0pLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICBvbkJvdFRyYW5zY3JpcHQ6IChkYXRhKSA9PlxuICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzTGlmZWN5Y2xlQWN0aXZlKGNvbm5lY3RUb2tlbikpIHJldHVybjtcbiAgICAgICAgICAgICAgdGhpcy5ib3RUcmFuc2NyaXB0U3ViamVjdC5uZXh0KGRhdGEudGV4dCk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICBvbkVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNMaWZlY3ljbGVBY3RpdmUoY29ubmVjdFRva2VuKSkgcmV0dXJuO1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbSGl2ZUdwdCBWb2ljZV0gUGlwZWNhdENsaWVudCBlcnJvcicsIGVycik7XG4gICAgICAgICAgICAgIHRoaXMuY2FsbFN0YXRlU3ViamVjdC5uZXh0KCdlbmRlZCcpO1xuICAgICAgICAgICAgICB0aGlzLnN0YXR1c1RleHRTdWJqZWN0Lm5leHQoJ0Nvbm5lY3Rpb24gZmFpbGVkJyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucGNDbGllbnQgPSBwY0NsaWVudDtcblxuICAgICAgLy8gQm90IGF1ZGlvIGFycml2ZXMgYXMgYSBNZWRpYVN0cmVhbVRyYWNrIOKAlCB3aXJlIHRvIGEgaGlkZGVuIDxhdWRpbz4gZWxlbWVudFxuICAgICAgcGNDbGllbnQub24oXG4gICAgICAgIFJUVklFdmVudC5UcmFja1N0YXJ0ZWQsXG4gICAgICAgICh0cmFjazogTWVkaWFTdHJlYW1UcmFjaywgcGFydGljaXBhbnQ/OiB7IGxvY2FsPzogYm9vbGVhbiB9KSA9PiB7XG4gICAgICAgICAgaWYgKCF0aGlzLmlzTGlmZWN5Y2xlQWN0aXZlKGNvbm5lY3RUb2tlbikpIHJldHVybjtcbiAgICAgICAgICBpZiAoIXBhcnRpY2lwYW50Py5sb2NhbCAmJiB0cmFjay5raW5kID09PSAnYXVkaW8nKSB7XG4gICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy5zZXR1cEJvdEF1ZGlvVHJhY2sodHJhY2spKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgICAvLyBTcGVha2luZyBzdGF0ZSBjb21lcyBzdHJhaWdodCBmcm9tIFJUVkkgZXZlbnRzXG4gICAgICBwY0NsaWVudC5vbihSVFZJRXZlbnQuQm90U3RhcnRlZFNwZWFraW5nLCAoKSA9PlxuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIGlmICghdGhpcy5pc0xpZmVjeWNsZUFjdGl2ZShjb25uZWN0VG9rZW4pKSByZXR1cm47XG4gICAgICAgICAgdGhpcy5vbkJvdFN0YXJ0ZWRTcGVha2luZygpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgICBwY0NsaWVudC5vbihSVFZJRXZlbnQuQm90U3RvcHBlZFNwZWFraW5nLCAoKSA9PlxuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIGlmICghdGhpcy5pc0xpZmVjeWNsZUFjdGl2ZShjb25uZWN0VG9rZW4pKSByZXR1cm47XG4gICAgICAgICAgdGhpcy5vbkJvdFN0b3BwZWRTcGVha2luZygpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgICBwY0NsaWVudC5vbihSVFZJRXZlbnQuVXNlclN0YXJ0ZWRTcGVha2luZywgKCkgPT5cbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICBpZiAoIXRoaXMuaXNMaWZlY3ljbGVBY3RpdmUoY29ubmVjdFRva2VuKSkgcmV0dXJuO1xuICAgICAgICAgIHRoaXMuaXNVc2VyU3BlYWtpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgICAgICAgdGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoJ2xpc3RlbmluZycpO1xuICAgICAgICAgIHRoaXMuc3RhdHVzVGV4dFN1YmplY3QubmV4dCgnTGlzdGVuaW5nLi4uJyk7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICAgIHBjQ2xpZW50Lm9uKFJUVklFdmVudC5Vc2VyU3RvcHBlZFNwZWFraW5nLCAoKSA9PlxuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIGlmICghdGhpcy5pc0xpZmVjeWNsZUFjdGl2ZShjb25uZWN0VG9rZW4pKSByZXR1cm47XG4gICAgICAgICAgdGhpcy5pc1VzZXJTcGVha2luZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgICAgICAgaWYgKHRoaXMuY2FsbFN0YXRlU3ViamVjdC52YWx1ZSA9PT0gJ2xpc3RlbmluZycpIHtcbiAgICAgICAgICAgIC8vIEJyaWVmICdQcm9jZXNzaW5nLi4uJyB3aGlsZSB3ZSB3YWl0IGZvciB0aGUgYm90IHRvIHJlc3BvbmQuXG4gICAgICAgICAgICB0aGlzLmNhbGxTdGF0ZVN1YmplY3QubmV4dCgnY29ubmVjdGVkJyk7XG4gICAgICAgICAgICB0aGlzLnN0YXR1c1RleHRTdWJqZWN0Lm5leHQoJ1Byb2Nlc3NpbmcuLi4nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgKTtcblxuICAgICAgLy8gQWNxdWlyZSBtaWMgKHRyaWdnZXJzIGJyb3dzZXIgcGVybWlzc2lvbiBwcm9tcHQpXG4gICAgICBhd2FpdCBwY0NsaWVudC5pbml0RGV2aWNlcygpO1xuXG4gICAgICAvLyBCdWlsZCBoZWFkZXJzIHVzaW5nIHRoZSBicm93c2VyIEhlYWRlcnMgQVBJIChyZXF1aXJlZCBieSBwaXBlY2F0J3MgQVBJUmVxdWVzdCB0eXBlKVxuICAgICAgY29uc3QgcmVxdWVzdEhlYWRlcnMgPSBuZXcgSGVhZGVycygpO1xuICAgICAgcmVxdWVzdEhlYWRlcnMuYXBwZW5kKCdBdXRob3JpemF0aW9uJywgYEJlYXJlciAke2FjY2Vzc1Rva2VufWApO1xuICAgICAgcmVxdWVzdEhlYWRlcnMuYXBwZW5kKCd4LWFwaS1rZXknLCBhcGlLZXkpO1xuICAgICAgcmVxdWVzdEhlYWRlcnMuYXBwZW5kKCdoaXZlLWJvdC1pZCcsIGJvdElkKTtcbiAgICAgIHJlcXVlc3RIZWFkZXJzLmFwcGVuZCgnZG9tYWluLWF1dGhvcml0eScsIGRvbWFpbkF1dGhvcml0eSk7XG4gICAgICByZXF1ZXN0SGVhZGVycy5hcHBlbmQoJ2V2ZW50VXJsJywgZXZlbnRVcmwpO1xuICAgICAgcmVxdWVzdEhlYWRlcnMuYXBwZW5kKCdldmVudElkJywgZXZlbnRJZCk7XG4gICAgICByZXF1ZXN0SGVhZGVycy5hcHBlbmQoJ2V2ZW50VG9rZW4nLCBldmVudFRva2VuKTtcbiAgICAgIHJlcXVlc3RIZWFkZXJzLmFwcGVuZCgnbmdyb2stc2tpcC1icm93c2VyLXdhcm5pbmcnLCAndHJ1ZScpO1xuXG4gICAgICAvLyBQT1NUIHRvIC9haS9hc2stdm9pY2Utc29ja2V0IOKGkiByZWNlaXZlcyB7IHdzX3VybCB9IOKGkiBXZWJTb2NrZXRUcmFuc3BvcnQgY29ubmVjdHNcbiAgICAgIGF3YWl0IHBjQ2xpZW50LnN0YXJ0Qm90QW5kQ29ubmVjdCh7XG4gICAgICAgIGVuZHBvaW50OiBgJHtiYXNlVXJsfS9haS9hc2stdm9pY2Utc29ja2V0YCxcbiAgICAgICAgaGVhZGVyczogcmVxdWVzdEhlYWRlcnMsXG4gICAgICAgIHJlcXVlc3REYXRhOiB7XG4gICAgICAgICAgYm90X2lkOiBib3RJZCxcbiAgICAgICAgICBjb252ZXJzYXRpb25faWQ6IGNvbnZlcnNhdGlvbklkLFxuICAgICAgICAgIHZvaWNlOiAnYWxsb3knLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghdGhpcy5pc0xpZmVjeWNsZUFjdGl2ZShjb25uZWN0VG9rZW4pKSByZXR1cm47XG4gICAgICBjb25zb2xlLmVycm9yKCdbSGl2ZUdwdCBWb2ljZV0gY29ubmVjdCBmYWlsZWQnLCBlcnJvcik7XG4gICAgICB0aGlzLmNhbGxTdGF0ZVN1YmplY3QubmV4dCgnZW5kZWQnKTtcbiAgICAgIGF3YWl0IHRoaXMuY2xlYW51cFBpcGVjYXRDbGllbnQoKTtcbiAgICAgIHRoaXMuc3RhdHVzVGV4dFN1YmplY3QubmV4dCgnQ29ubmVjdGlvbiBmYWlsZWQnKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25QaXBlY2F0Q29ubmVjdGVkKCk6IHZvaWQge1xuICAgIC8vIFN0YXJ0IHRoZSBkdXJhdGlvbiB0aW1lciBmcm9tIHRoZSBtb21lbnQgdGhlIHNlc3Npb24gaXMgbGl2ZS5cbiAgICB0aGlzLmNhbGxTdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHRoaXMuc3RhcnREdXJhdGlvblRpbWVyKCk7XG4gICAgdGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoJ2Nvbm5lY3RlZCcpO1xuICAgIHRoaXMuc3RhdHVzVGV4dFN1YmplY3QubmV4dCgnQ29ubmVjdGVkJyk7XG4gICAgLy8gUHJlc2VydmUgYW55IG11dGUgYWN0aW9uIHRoZSB1c2VyIG1hZGUgZHVyaW5nIFwiY29ubmVjdGluZ1wiLlxuICAgIGNvbnN0IHNob3VsZEJlTXV0ZWQgPSB0aGlzLmlzTWljTXV0ZWRTdWJqZWN0LnZhbHVlO1xuICAgIHRoaXMucGNDbGllbnQ/LmVuYWJsZU1pYyghc2hvdWxkQmVNdXRlZCk7XG4gICAgdGhpcy5pc01pY011dGVkU3ViamVjdC5uZXh0KHNob3VsZEJlTXV0ZWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBvblBpcGVjYXREaXNjb25uZWN0ZWQoKTogdm9pZCB7XG4gICAgdGhpcy5zdG9wRHVyYXRpb25UaW1lcigpO1xuICAgIHRoaXMuY2FsbFN0YXJ0VGltZSA9IDA7XG4gICAgdGhpcy5hdWRpb0FuYWx5emVyLnN0b3AoKTtcbiAgICB0aGlzLnN0b3BCb3RBdWRpbygpO1xuICAgIHRoaXMuY2FsbFN0YXRlU3ViamVjdC5uZXh0KCdlbmRlZCcpO1xuICAgIHRoaXMuc3RhdHVzVGV4dFN1YmplY3QubmV4dCgnQ2FsbCBFbmRlZCcpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkJvdFJlYWR5KCk6IHZvaWQge1xuICAgIC8vIFJldHJ5IHRyYWNrIHdpcmluZyBpbiBjYXNlIHRyYWNrcyB3ZXJlbid0IHJlYWR5IGF0IG9uQ29ubmVjdGVkLlxuICAgIHRoaXMuc3RhcnRMb2NhbE1pY0FuYWx5emVyKCk7XG4gICAgY29uc3QgYm90VHJhY2sgPSAodGhpcy5wY0NsaWVudD8udHJhY2tzKCkgYXMgeyBib3Q/OiB7IGF1ZGlvPzogTWVkaWFTdHJlYW1UcmFjayB9IH0pXG4gICAgICA/LmJvdD8uYXVkaW87XG4gICAgaWYgKGJvdFRyYWNrKSB0aGlzLnNldHVwQm90QXVkaW9UcmFjayhib3RUcmFjayk7XG4gICAgLy8gQm90IGlzIGluaXRpYWxpc2VkIOKAlCBzaWduYWwgdGhhdCB3ZSdyZSBub3cgd2FpdGluZyBmb3IgdXNlciBpbnB1dC5cbiAgICB0aGlzLnN0YXR1c1RleHRTdWJqZWN0Lm5leHQoJ0xpc3RlbmluZy4uLicpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydExvY2FsTWljQW5hbHl6ZXIoKTogdm9pZCB7XG4gICAgY29uc3QgbG9jYWxUcmFjayA9ICh0aGlzLnBjQ2xpZW50Py50cmFja3MoKSBhcyB7IGxvY2FsPzogeyBhdWRpbz86IE1lZGlhU3RyZWFtVHJhY2sgfSB9KVxuICAgICAgPy5sb2NhbD8uYXVkaW87XG4gICAgaWYgKGxvY2FsVHJhY2spIHtcbiAgICAgIHRoaXMuYXVkaW9BbmFseXplci5zdGFydChuZXcgTWVkaWFTdHJlYW0oW2xvY2FsVHJhY2tdKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvbkJvdFN0YXJ0ZWRTcGVha2luZygpOiB2b2lkIHtcbiAgICB0aGlzLmNhbGxTdGF0ZVN1YmplY3QubmV4dCgndGFsa2luZycpO1xuICAgIHRoaXMuc3RhdHVzVGV4dFN1YmplY3QubmV4dCgnVGFsa2luZy4uLicpO1xuICAgIC8vIE1hcmsgdXNlciBhcyBubyBsb25nZXIgc3BlYWtpbmcgd2hlbiBib3QgdGFrZXMgdGhlIHR1cm4uXG4gICAgdGhpcy5pc1VzZXJTcGVha2luZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIG9uQm90U3RvcHBlZFNwZWFraW5nKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNhbGxTdGF0ZVN1YmplY3QudmFsdWUgPT09ICd0YWxraW5nJykge1xuICAgICAgdGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoJ2Nvbm5lY3RlZCcpO1xuICAgICAgdGhpcy5zdGF0dXNUZXh0U3ViamVjdC5uZXh0KCdMaXN0ZW5pbmcuLi4nKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldHVwQm90QXVkaW9UcmFjayh0cmFjazogTWVkaWFTdHJlYW1UcmFjayk6IHZvaWQge1xuICAgIGlmICghdGhpcy5ib3RBdWRpb0VsZW1lbnQpIHtcbiAgICAgIHRoaXMuYm90QXVkaW9FbGVtZW50ID0gbmV3IEF1ZGlvKCk7XG4gICAgICB0aGlzLmJvdEF1ZGlvRWxlbWVudC5hdXRvcGxheSA9IHRydWU7XG4gICAgICAodGhpcy5ib3RBdWRpb0VsZW1lbnQgYXMgYW55KS5wbGF5c0lubGluZSA9IHRydWU7XG4gICAgICB0aGlzLmJvdEF1ZGlvRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3BsYXlzaW5saW5lJywgJycpO1xuICAgIH1cbiAgICBjb25zdCBleGlzdGluZyA9ICh0aGlzLmJvdEF1ZGlvRWxlbWVudC5zcmNPYmplY3QgYXMgTWVkaWFTdHJlYW0gfCBudWxsKVxuICAgICAgPy5nZXRBdWRpb1RyYWNrcygpWzBdO1xuICAgIGlmIChleGlzdGluZz8uaWQgPT09IHRyYWNrLmlkKSByZXR1cm47XG5cbiAgICB0aGlzLmJvdEF1ZGlvRWxlbWVudC5wYXVzZSgpO1xuICAgIHRoaXMuYm90QXVkaW9FbGVtZW50LnNyY09iamVjdCA9IG5ldyBNZWRpYVN0cmVhbShbdHJhY2tdKTtcbiAgICB0aGlzLmJvdEF1ZGlvRWxlbWVudC5wbGF5KCkuY2F0Y2goKGVycikgPT5cbiAgICAgIGNvbnNvbGUud2FybignW0hpdmVHcHQgVm9pY2VdIEJvdCBhdWRpbyBwbGF5IGJsb2NrZWQnLCBlcnIpLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHN0b3BCb3RBdWRpbygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5ib3RBdWRpb0VsZW1lbnQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuYm90QXVkaW9FbGVtZW50LnBhdXNlKCk7XG4gICAgICAgICh0aGlzLmJvdEF1ZGlvRWxlbWVudC5zcmNPYmplY3QgYXMgTWVkaWFTdHJlYW0gfCBudWxsKVxuICAgICAgICAgID8uZ2V0QXVkaW9UcmFja3MoKVxuICAgICAgICAgIC5mb3JFYWNoKCh0KSA9PiB0LnN0b3AoKSk7XG4gICAgICAgIHRoaXMuYm90QXVkaW9FbGVtZW50LnNyY09iamVjdCA9IG51bGw7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gaWdub3JlXG4gICAgICB9XG4gICAgICB0aGlzLmJvdEF1ZGlvRWxlbWVudCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZGlzY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxpZmVjeWNsZVRva2VuICs9IDE7XG4gICAgdGhpcy5zdG9wRHVyYXRpb25UaW1lcigpO1xuICAgIHRoaXMuY2FsbFN0YXJ0VGltZSA9IDA7XG4gICAgdGhpcy5hdWRpb0FuYWx5emVyLnN0b3AoKTtcbiAgICB0aGlzLnN0b3BCb3RBdWRpbygpO1xuICAgIGF3YWl0IHRoaXMuY2xlYW51cFBpcGVjYXRDbGllbnQoKTtcbiAgICB0aGlzLmNhbGxTdGF0ZVN1YmplY3QubmV4dCgnZW5kZWQnKTtcbiAgICB0aGlzLnN0YXR1c1RleHRTdWJqZWN0Lm5leHQoJ0NhbGwgRW5kZWQnKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNMaWZlY3ljbGVBY3RpdmUodG9rZW46IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0b2tlbiA9PT0gdGhpcy5saWZlY3ljbGVUb2tlbjtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2xlYW51cFBpcGVjYXRDbGllbnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMucGNDbGllbnQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMucGNDbGllbnQuZGlzY29ubmVjdCgpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIGlnbm9yZVxuICAgICAgfVxuICAgICAgdGhpcy5wY0NsaWVudCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlTWljKCk6IHZvaWQge1xuICAgIGNvbnN0IG5leHRNdXRlZCA9ICF0aGlzLmlzTWljTXV0ZWRTdWJqZWN0LnZhbHVlO1xuICAgIC8vIFJlZmxlY3QgdGhlIHVzZXIncyBpbnRlbnQgaW1tZWRpYXRlbHksIGV2ZW4gaWYgY29ubmVjdCBpcyBzdGlsbCBpbiBwcm9ncmVzcy5cbiAgICB0aGlzLmlzTWljTXV0ZWRTdWJqZWN0Lm5leHQobmV4dE11dGVkKTtcbiAgICBpZiAodGhpcy5wY0NsaWVudCkge1xuICAgICAgdGhpcy5wY0NsaWVudC5lbmFibGVNaWMoIW5leHRNdXRlZCk7XG4gICAgfVxuICAgIGlmIChuZXh0TXV0ZWQpIHRoaXMuaXNVc2VyU3BlYWtpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydER1cmF0aW9uVGltZXIoKTogdm9pZCB7XG4gICAgY29uc3QgdGljayA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLmNhbGxTdGFydFRpbWUgPiAwKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWQgPSBNYXRoLmZsb29yKChEYXRlLm5vdygpIC0gdGhpcy5jYWxsU3RhcnRUaW1lKSAvIDEwMDApO1xuICAgICAgICBjb25zdCBtID0gTWF0aC5mbG9vcihlbGFwc2VkIC8gNjApO1xuICAgICAgICBjb25zdCBzID0gZWxhcHNlZCAlIDYwO1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy5kdXJhdGlvblN1YmplY3QubmV4dChgJHttfToke1N0cmluZyhzKS5wYWRTdGFydCgyLCAnMCcpfWApKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRpY2soKTtcbiAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmR1cmF0aW9uSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCh0aWNrLCAxMDAwKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RvcER1cmF0aW9uVGltZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZHVyYXRpb25JbnRlcnZhbCkge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmR1cmF0aW9uSW50ZXJ2YWwpO1xuICAgICAgdGhpcy5kdXJhdGlvbkludGVydmFsID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
367
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidm9pY2UtYWdlbnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2hpdmVncHQvZXZlbnRzZ3B0LWFuZ3VsYXIvc3JjL2xpYi9jb21wb25lbnRzL3ZvaWNlLWFnZW50L3NlcnZpY2VzL3ZvaWNlLWFnZW50LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQVUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxlQUFlLEVBQWMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDakUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saUNBQWlDLENBQUM7Ozs7QUFpQnJFOzs7Ozs7Ozs7O0dBVUc7QUFJSCxNQUFNLE9BQU8saUJBQWlCO0lBNkI1QixZQUNVLGFBQW1DLEVBQ25DLG9CQUFpRCxFQUNqRCxNQUFjO0lBQ3RCLDhGQUE4RjtJQUNqRSxVQUFrQjtRQUp2QyxrQkFBYSxHQUFiLGFBQWEsQ0FBc0I7UUFDbkMseUJBQW9CLEdBQXBCLG9CQUFvQixDQUE2QjtRQUNqRCxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBRU8sZUFBVSxHQUFWLFVBQVUsQ0FBUTtRQWpDekMscUJBQWdCLEdBQUcsSUFBSSxlQUFlLENBQVksTUFBTSxDQUFDLENBQUM7UUFDMUQsc0JBQWlCLEdBQUcsSUFBSSxlQUFlLENBQVMsRUFBRSxDQUFDLENBQUM7UUFDcEQsb0JBQWUsR0FBRyxJQUFJLGVBQWUsQ0FB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QUFnQixDQUFDLENBQUM7WUFDckMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztTQUM5QjtJQUNILENBQUM7OytHQTVYVSxpQkFBaUIsdUhBa0NsQixXQUFXO21IQWxDVixpQkFBaUIsY0FGaEIsTUFBTTs0RkFFUCxpQkFBaUI7a0JBSDdCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFtQ0ksTUFBTTsyQkFBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBOZ1pvbmUsIFBMQVRGT1JNX0lEIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIHRha2UsIHRocm90dGxlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFBpcGVjYXRDbGllbnQsIFJUVklFdmVudCB9IGZyb20gJ0BwaXBlY2F0LWFpL2NsaWVudC1qcyc7XG5pbXBvcnQgeyBXZWJTb2NrZXRUcmFuc3BvcnQgfSBmcm9tICdAcGlwZWNhdC1haS93ZWJzb2NrZXQtdHJhbnNwb3J0JztcbmltcG9ydCB7IFBsYXRmb3JtVG9rZW5SZWZyZXNoU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3BsYXRmb3JtLXRva2VuLXJlZnJlc2guc2VydmljZSc7XG5pbXBvcnQgeyBBdWRpb0FuYWx5emVyU2VydmljZSB9IGZyb20gJy4vYXVkaW8tYW5hbHl6ZXIuc2VydmljZSc7XG5cbmV4cG9ydCB0eXBlIENhbGxTdGF0ZSA9XG4gIHwgJ2lkbGUnXG4gIHwgJ2Nvbm5lY3RpbmcnXG4gIHwgJ2Nvbm5lY3RlZCdcbiAgfCAnbGlzdGVuaW5nJ1xuICB8ICd0YWxraW5nJ1xuICB8ICdlbmRlZCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNjcmlwdERhdGEge1xuICB0ZXh0OiBzdHJpbmc7XG4gIGZpbmFsOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFZvaWNlIGFnZW50IG9yY2hlc3RyYXRvciB1c2luZyB0aGUgb2ZmaWNpYWwgUGlwZWNhdENsaWVudCBTREsuXG4gKlxuICogQXVkaW8gZmxvdyAobWlycm9ycyB0aGUgUmVhY3QgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uKTpcbiAqICAtIExvY2FsIG1pYzogYWNxdWlyZWQgYnkgUGlwZWNhdENsaWVudC5pbml0RGV2aWNlcygpOyBsb2NhbCB0cmFjayBmZWQgdG9cbiAqICAgIEF1ZGlvQW5hbHl6ZXJTZXJ2aWNlIGZvciB3YXZlZm9ybSB2aXN1YWxpc2F0aW9uLlxuICogIC0gQm90IGF1ZGlvOiByZWNlaXZlZCBhcyBhIE1lZGlhU3RyZWFtVHJhY2sgdmlhIFJUVklFdmVudC5UcmFja1N0YXJ0ZWQsXG4gKiAgICBwbGF5ZWQgdGhyb3VnaCBhIGhpZGRlbiA8YXVkaW8+IGVsZW1lbnQuXG4gKiAgLSBBbGwgYmluYXJ5IHByb3RvYnVmIGZyYW1pbmcgLyBSVFZJIHByb3RvY29sIGhhbmRsZWQgYnlcbiAqICAgIEBwaXBlY2F0LWFpL2NsaWVudC1qcyArIEBwaXBlY2F0LWFpL3dlYnNvY2tldC10cmFuc3BvcnQuXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBWb2ljZUFnZW50U2VydmljZSB7XG4gIHByaXZhdGUgY2FsbFN0YXRlU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q2FsbFN0YXRlPignaWRsZScpO1xuICBwcml2YXRlIHN0YXR1c1RleHRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKTtcbiAgcHJpdmF0ZSBkdXJhdGlvblN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJzAwOjAwJyk7XG4gIHByaXZhdGUgaXNNaWNNdXRlZFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBpc1VzZXJTcGVha2luZ1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBhdWRpb0xldmVsc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcltdPihbXSk7XG4gIHByaXZhdGUgdXNlclRyYW5zY3JpcHRTdWJqZWN0ID0gbmV3IFN1YmplY3Q8VHJhbnNjcmlwdERhdGE+KCk7XG4gIHByaXZhdGUgYm90VHJhbnNjcmlwdFN1YmplY3QgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG5cbiAgcHJpdmF0ZSBjYWxsU3RhcnRUaW1lID0gMDtcbiAgcHJpdmF0ZSBkdXJhdGlvbkludGVydmFsOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIHBjQ2xpZW50OiBQaXBlY2F0Q2xpZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgYm90QXVkaW9FbGVtZW50OiBIVE1MQXVkaW9FbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbGlmZWN5Y2xlVG9rZW4gPSAwO1xuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgcHJpdmF0ZSBwY0V2ZW50Q2xlYW51cDogKCgpID0+IHZvaWQpW10gPSBbXTtcblxuICBjYWxsU3RhdGUkOiBPYnNlcnZhYmxlPENhbGxTdGF0ZT4gPSB0aGlzLmNhbGxTdGF0ZVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIHN0YXR1c1RleHQkOiBPYnNlcnZhYmxlPHN0cmluZz4gPSB0aGlzLnN0YXR1c1RleHRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICBkdXJhdGlvbiQ6IE9ic2VydmFibGU8c3RyaW5nPiA9IHRoaXMuZHVyYXRpb25TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICBpc01pY011dGVkJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuaXNNaWNNdXRlZFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIGlzVXNlclNwZWFraW5nJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuaXNVc2VyU3BlYWtpbmdTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG4gIGF1ZGlvTGV2ZWxzJDogT2JzZXJ2YWJsZTxudW1iZXJbXT4gPSB0aGlzLmF1ZGlvTGV2ZWxzU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgdXNlclRyYW5zY3JpcHQkOiBPYnNlcnZhYmxlPFRyYW5zY3JpcHREYXRhPiA9IHRoaXMudXNlclRyYW5zY3JpcHRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICBib3RUcmFuc2NyaXB0JDogT2JzZXJ2YWJsZTxzdHJpbmc+ID0gdGhpcy5ib3RUcmFuc2NyaXB0U3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGF1ZGlvQW5hbHl6ZXI6IEF1ZGlvQW5hbHl6ZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgcGxhdGZvcm1Ub2tlblJlZnJlc2g6IFBsYXRmb3JtVG9rZW5SZWZyZXNoU2VydmljZSxcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgIC8qKiBgT2JqZWN0YCBub3QgYG9iamVjdGAg4oCUIG5nYyBtZXRhZGF0YSBjb2xsZWN0aW9uIHJlamVjdHMgdGhlIGBvYmplY3RgIHR5cGUgaW4gREkgcGFyYW1zLiAqL1xuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogT2JqZWN0LFxuICApIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy5hdWRpb0FuYWx5emVyLmF1ZGlvTGV2ZWxzJC5waXBlKHRocm90dGxlVGltZSg1MCkpLnN1YnNjcmliZSgobGV2ZWxzKSA9PlxuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy5hdWRpb0xldmVsc1N1YmplY3QubmV4dChsZXZlbHMpKSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBSZXNldCB0byBpZGxlIChlLmcuIHdoZW4gbW9kYWwgcmUtb3BlbnMgc28gdXNlciBjYW4gY2xpY2sgU3RhcnQgQ2FsbCkuICovXG4gIHJlc2V0VG9JZGxlKCk6IHZvaWQge1xuICAgIHZvaWQgdGhpcy5wcmVwYXJlRnJlc2hTZXNzaW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogSGFyZCByZXNldCB2b2ljZSBzZXNzaW9uIHNvIGVhY2ggbW9kYWwgb3BlbiBzdGFydHMgZnJvbSBhIGNsZWFuIHN0YXRlLlxuICAgKiBDbG9zZXMgYW55IHByZXZpb3VzIGNsaWVudCBhbmQgcHJldmVudHMgc3RhbGUgY2FsbGJhY2tzIGZyb20gbXV0YXRpbmcgVUkgc3RhdGUuXG4gICAqL1xuICBhc3luYyBwcmVwYXJlRnJlc2hTZXNzaW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMubGlmZWN5Y2xlVG9rZW4gKz0gMTtcbiAgICB0aGlzLnN0b3BEdXJhdGlvblRpbWVyKCk7XG4gICAgdGhpcy5jYWxsU3RhcnRUaW1lID0gMDtcbiAgICB0aGlzLmF1ZGlvQW5hbHl6ZXIuc3RvcCgpO1xuICAgIHRoaXMuc3RvcEJvdEF1ZGlvKCk7XG4gICAgdGhpcy5pc1VzZXJTcGVha2luZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgdGhpcy5pc01pY011dGVkU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICB0aGlzLmR1cmF0aW9uU3ViamVjdC5uZXh0KCcwMDowMCcpO1xuICAgIHRoaXMuc3RhdHVzVGV4dFN1YmplY3QubmV4dCgnJyk7XG4gICAgdGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoJ2lkbGUnKTtcbiAgICBhd2FpdCB0aGlzLmNsZWFudXBQaXBlY2F0Q2xpZW50KCk7XG4gIH1cblxuICBhc3luYyBjb25uZWN0KFxuICAgIGFwaVVybDogc3RyaW5nLFxuICAgIHRva2VuOiBzdHJpbmcsXG4gICAgYm90SWQ6IHN0cmluZyxcbiAgICBjb252ZXJzYXRpb25JZDogc3RyaW5nLFxuICAgIGFwaUtleTogc3RyaW5nLFxuICAgIGV2ZW50VG9rZW46IHN0cmluZyxcbiAgICBldmVudElkOiBzdHJpbmcsXG4gICAgZXZlbnRVcmw6IHN0cmluZyxcbiAgICBkb21haW5BdXRob3JpdHk6IHN0cmluZyxcbiAgICB1c2Vyc0FwaVVybD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuY2FsbFN0YXRlU3ViamVjdC52YWx1ZSAhPT0gJ2lkbGUnKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tIaXZlR3B0IFZvaWNlXSBDYWxsIGFscmVhZHkgaW4gcHJvZ3Jlc3MnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjb25uZWN0VG9rZW4gPSArK3RoaXMubGlmZWN5Y2xlVG9rZW47XG5cbiAgICB0cnkge1xuICAgICAgdGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoJ2Nvbm5lY3RpbmcnKTtcbiAgICAgIHRoaXMuc3RhdHVzVGV4dFN1YmplY3QubmV4dCgnQ29ubmVjdGluZy4uLicpO1xuXG4gICAgICBsZXQgYWNjZXNzVG9rZW4gPSB0b2tlbjtcbiAgICAgIGlmICh1c2Vyc0FwaVVybCAmJiBpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZW5zdXJlZCA9IGF3YWl0IHRoaXMucGxhdGZvcm1Ub2tlblJlZnJlc2hcbiAgICAgICAgICAgIC5lbnN1cmVWYWxpZEFjY2Vzc1Rva2VuKHRva2VuLCB1c2Vyc0FwaVVybClcbiAgICAgICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgICAgICAudG9Qcm9taXNlKCk7XG4gICAgICAgICAgaWYgKGVuc3VyZWQ/LmFjY2Vzc1Rva2VuKSBhY2Nlc3NUb2tlbiA9IGVuc3VyZWQuYWNjZXNzVG9rZW47XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1tIaXZlR3B0IFZvaWNlXSBUb2tlbiByZWZyZXNoIGZhaWxlZCcsIGUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJhc2VVcmwgPSBhcGlVcmwucmVwbGFjZSgvXFwvJC8sICcnKTtcblxuICAgICAgY29uc3QgcGNDbGllbnQgPSBuZXcgUGlwZWNhdENsaWVudCh7XG4gICAgICAgIHRyYW5zcG9ydDogbmV3IFdlYlNvY2tldFRyYW5zcG9ydCgpLFxuICAgICAgICBlbmFibGVNaWM6IHRydWUsXG4gICAgICAgIGVuYWJsZUNhbTogZmFsc2UsXG4gICAgICAgIGNhbGxiYWNrczoge1xuICAgICAgICAgIG9uQ29ubmVjdGVkOiAoKSA9PlxuICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzTGlmZWN5Y2xlQWN0aXZlKGNvbm5lY3RUb2tlbikpIHJldHVybjtcbiAgICAgICAgICAgICAgdGhpcy5vblBpcGVjYXRDb25uZWN0ZWQoKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIG9uRGlzY29ubmVjdGVkOiAoKSA9PlxuICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzTGlmZWN5Y2xlQWN0aXZlKGNvbm5lY3RUb2tlbikpIHJldHVybjtcbiAgICAgICAgICAgICAgdGhpcy5vblBpcGVjYXREaXNjb25uZWN0ZWQoKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIG9uQm90UmVhZHk6ICgpID0+XG4gICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNMaWZlY3ljbGVBY3RpdmUoY29ubmVjdFRva2VuKSkgcmV0dXJuO1xuICAgICAgICAgICAgICB0aGlzLm9uQm90UmVhZHkoKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIG9uVXNlclRyYW5zY3JpcHQ6IChkYXRhKSA9PlxuICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+XG4gICAgICAgICAgICAgIHRoaXMuaXNMaWZlY3ljbGVBY3RpdmUoY29ubmVjdFRva2VuKSAmJlxuICAgICAgICAgICAgICB0aGlzLnVzZXJUcmFuc2NyaXB0U3ViamVjdC5uZXh0KHsgdGV4dDogZGF0YS50ZXh0LCBmaW5hbDogISFkYXRhLmZpbmFsIH0pLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICBvbkJvdFRyYW5zY3JpcHQ6IChkYXRhKSA9PlxuICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzTGlmZWN5Y2xlQWN0aXZlKGNvbm5lY3RUb2tlbikpIHJldHVybjtcbiAgICAgICAgICAgICAgdGhpcy5ib3RUcmFuc2NyaXB0U3ViamVjdC5uZXh0KGRhdGEudGV4dCk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICBvbkVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNMaWZlY3ljbGVBY3RpdmUoY29ubmVjdFRva2VuKSkgcmV0dXJuO1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbSGl2ZUdwdCBWb2ljZV0gUGlwZWNhdENsaWVudCBlcnJvcicsIGVycik7XG4gICAgICAgICAgICAgIHRoaXMuY2FsbFN0YXRlU3ViamVjdC5uZXh0KCdlbmRlZCcpO1xuICAgICAgICAgICAgICB0aGlzLnN0YXR1c1RleHRTdWJqZWN0Lm5leHQoJ0Nvbm5lY3Rpb24gZmFpbGVkJyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucGNDbGllbnQgPSBwY0NsaWVudDtcblxuICAgICAgLy8gQm90IGF1ZGlvIGFycml2ZXMgYXMgYSBNZWRpYVN0cmVhbVRyYWNrIOKAlCB3aXJlIHRvIGEgaGlkZGVuIDxhdWRpbz4gZWxlbWVudFxuICAgICAgY29uc3Qgb25UcmFja1N0YXJ0ZWQgPSAodHJhY2s6IE1lZGlhU3RyZWFtVHJhY2ssIHBhcnRpY2lwYW50PzogeyBsb2NhbD86IGJvb2xlYW4gfSkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuaXNMaWZlY3ljbGVBY3RpdmUoY29ubmVjdFRva2VuKSkgcmV0dXJuO1xuICAgICAgICBpZiAoIXBhcnRpY2lwYW50Py5sb2NhbCAmJiB0cmFjay5raW5kID09PSAnYXVkaW8nKSB7XG4gICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMuc2V0dXBCb3RBdWRpb1RyYWNrKHRyYWNrKSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBwY0NsaWVudC5vbihSVFZJRXZlbnQuVHJhY2tTdGFydGVkLCBvblRyYWNrU3RhcnRlZCk7XG5cbiAgICAgIC8vIFNwZWFraW5nIHN0YXRlIGNvbWVzIHN0cmFpZ2h0IGZyb20gUlRWSSBldmVudHNcbiAgICAgIGNvbnN0IG9uQm90U3RhcnRlZCA9ICgpID0+XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgaWYgKCF0aGlzLmlzTGlmZWN5Y2xlQWN0aXZlKGNvbm5lY3RUb2tlbikpIHJldHVybjtcbiAgICAgICAgICB0aGlzLm9uQm90U3RhcnRlZFNwZWFraW5nKCk7XG4gICAgICAgIH0pO1xuICAgICAgcGNDbGllbnQub24oUlRWSUV2ZW50LkJvdFN0YXJ0ZWRTcGVha2luZywgb25Cb3RTdGFydGVkKTtcblxuICAgICAgY29uc3Qgb25Cb3RTdG9wcGVkID0gKCkgPT5cbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICBpZiAoIXRoaXMuaXNMaWZlY3ljbGVBY3RpdmUoY29ubmVjdFRva2VuKSkgcmV0dXJuO1xuICAgICAgICAgIHRoaXMub25Cb3RTdG9wcGVkU3BlYWtpbmcoKTtcbiAgICAgICAgfSk7XG4gICAgICBwY0NsaWVudC5vbihSVFZJRXZlbnQuQm90U3RvcHBlZFNwZWFraW5nLCBvbkJvdFN0b3BwZWQpO1xuXG4gICAgICBjb25zdCBvblVzZXJTdGFydGVkID0gKCkgPT5cbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICBpZiAoIXRoaXMuaXNMaWZlY3ljbGVBY3RpdmUoY29ubmVjdFRva2VuKSkgcmV0dXJuO1xuICAgICAgICAgIHRoaXMuaXNVc2VyU3BlYWtpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgICAgICAgdGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoJ2xpc3RlbmluZycpO1xuICAgICAgICAgIHRoaXMuc3RhdHVzVGV4dFN1YmplY3QubmV4dCgnTGlzdGVuaW5nLi4uJyk7XG4gICAgICAgIH0pO1xuICAgICAgcGNDbGllbnQub24oUlRWSUV2ZW50LlVzZXJTdGFydGVkU3BlYWtpbmcsIG9uVXNlclN0YXJ0ZWQpO1xuXG4gICAgICBjb25zdCBvblVzZXJTdG9wcGVkID0gKCkgPT5cbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICBpZiAoIXRoaXMuaXNMaWZlY3ljbGVBY3RpdmUoY29ubmVjdFRva2VuKSkgcmV0dXJuO1xuICAgICAgICAgIHRoaXMuaXNVc2VyU3BlYWtpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgICAgICAgIGlmICh0aGlzLmNhbGxTdGF0ZVN1YmplY3QudmFsdWUgPT09ICdsaXN0ZW5pbmcnKSB7XG4gICAgICAgICAgICAvLyBCcmllZiAnUHJvY2Vzc2luZy4uLicgd2hpbGUgd2Ugd2FpdCBmb3IgdGhlIGJvdCB0byByZXNwb25kLlxuICAgICAgICAgICAgdGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoJ2Nvbm5lY3RlZCcpO1xuICAgICAgICAgICAgdGhpcy5zdGF0dXNUZXh0U3ViamVjdC5uZXh0KCdQcm9jZXNzaW5nLi4uJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIHBjQ2xpZW50Lm9uKFJUVklFdmVudC5Vc2VyU3RvcHBlZFNwZWFraW5nLCBvblVzZXJTdG9wcGVkKTtcblxuICAgICAgLy8gU3RvcmUgY2xlYW51cCBmbnMgc28gbGlzdGVuZXJzIGFyZSByZW1vdmVkIG9uIGRpc2Nvbm5lY3RcbiAgICAgIHRoaXMucGNFdmVudENsZWFudXAgPSBbXG4gICAgICAgICgpID0+IHBjQ2xpZW50Lm9mZihSVFZJRXZlbnQuVHJhY2tTdGFydGVkLCBvblRyYWNrU3RhcnRlZCksXG4gICAgICAgICgpID0+IHBjQ2xpZW50Lm9mZihSVFZJRXZlbnQuQm90U3RhcnRlZFNwZWFraW5nLCBvbkJvdFN0YXJ0ZWQpLFxuICAgICAgICAoKSA9PiBwY0NsaWVudC5vZmYoUlRWSUV2ZW50LkJvdFN0b3BwZWRTcGVha2luZywgb25Cb3RTdG9wcGVkKSxcbiAgICAgICAgKCkgPT4gcGNDbGllbnQub2ZmKFJUVklFdmVudC5Vc2VyU3RhcnRlZFNwZWFraW5nLCBvblVzZXJTdGFydGVkKSxcbiAgICAgICAgKCkgPT4gcGNDbGllbnQub2ZmKFJUVklFdmVudC5Vc2VyU3RvcHBlZFNwZWFraW5nLCBvblVzZXJTdG9wcGVkKSxcbiAgICAgIF07XG5cbiAgICAgIC8vIEFjcXVpcmUgbWljICh0cmlnZ2VycyBicm93c2VyIHBlcm1pc3Npb24gcHJvbXB0KVxuICAgICAgYXdhaXQgcGNDbGllbnQuaW5pdERldmljZXMoKTtcblxuICAgICAgLy8gQnVpbGQgaGVhZGVycyB1c2luZyB0aGUgYnJvd3NlciBIZWFkZXJzIEFQSSAocmVxdWlyZWQgYnkgcGlwZWNhdCdzIEFQSVJlcXVlc3QgdHlwZSlcbiAgICAgIGNvbnN0IHJlcXVlc3RIZWFkZXJzID0gbmV3IEhlYWRlcnMoKTtcbiAgICAgIHJlcXVlc3RIZWFkZXJzLmFwcGVuZCgnQXV0aG9yaXphdGlvbicsIGBCZWFyZXIgJHthY2Nlc3NUb2tlbn1gKTtcbiAgICAgIHJlcXVlc3RIZWFkZXJzLmFwcGVuZCgneC1hcGkta2V5JywgYXBpS2V5KTtcbiAgICAgIHJlcXVlc3RIZWFkZXJzLmFwcGVuZCgnaGl2ZS1ib3QtaWQnLCBib3RJZCk7XG4gICAgICByZXF1ZXN0SGVhZGVycy5hcHBlbmQoJ2RvbWFpbi1hdXRob3JpdHknLCBkb21haW5BdXRob3JpdHkpO1xuICAgICAgcmVxdWVzdEhlYWRlcnMuYXBwZW5kKCdldmVudFVybCcsIGV2ZW50VXJsKTtcbiAgICAgIHJlcXVlc3RIZWFkZXJzLmFwcGVuZCgnZXZlbnRJZCcsIGV2ZW50SWQpO1xuICAgICAgcmVxdWVzdEhlYWRlcnMuYXBwZW5kKCdldmVudFRva2VuJywgZXZlbnRUb2tlbik7XG4gICAgICByZXF1ZXN0SGVhZGVycy5hcHBlbmQoJ25ncm9rLXNraXAtYnJvd3Nlci13YXJuaW5nJywgJ3RydWUnKTtcblxuICAgICAgLy8gUE9TVCB0byAvYWkvYXNrLXZvaWNlLXNvY2tldCDihpIgcmVjZWl2ZXMgeyB3c191cmwgfSDihpIgV2ViU29ja2V0VHJhbnNwb3J0IGNvbm5lY3RzXG4gICAgICBhd2FpdCBwY0NsaWVudC5zdGFydEJvdEFuZENvbm5lY3Qoe1xuICAgICAgICBlbmRwb2ludDogYCR7YmFzZVVybH0vYWkvYXNrLXZvaWNlLXNvY2tldGAsXG4gICAgICAgIGhlYWRlcnM6IHJlcXVlc3RIZWFkZXJzLFxuICAgICAgICByZXF1ZXN0RGF0YToge1xuICAgICAgICAgIGJvdF9pZDogYm90SWQsXG4gICAgICAgICAgY29udmVyc2F0aW9uX2lkOiBjb252ZXJzYXRpb25JZCxcbiAgICAgICAgICB2b2ljZTogJ2FsbG95JyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIXRoaXMuaXNMaWZlY3ljbGVBY3RpdmUoY29ubmVjdFRva2VuKSkgcmV0dXJuO1xuICAgICAgY29uc29sZS5lcnJvcignW0hpdmVHcHQgVm9pY2VdIGNvbm5lY3QgZmFpbGVkJywgZXJyb3IpO1xuICAgICAgdGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoJ2VuZGVkJyk7XG4gICAgICBhd2FpdCB0aGlzLmNsZWFudXBQaXBlY2F0Q2xpZW50KCk7XG4gICAgICB0aGlzLnN0YXR1c1RleHRTdWJqZWN0Lm5leHQoJ0Nvbm5lY3Rpb24gZmFpbGVkJyk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uUGlwZWNhdENvbm5lY3RlZCgpOiB2b2lkIHtcbiAgICAvLyBTdGFydCB0aGUgZHVyYXRpb24gdGltZXIgZnJvbSB0aGUgbW9tZW50IHRoZSBzZXNzaW9uIGlzIGxpdmUuXG4gICAgdGhpcy5jYWxsU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB0aGlzLnN0YXJ0RHVyYXRpb25UaW1lcigpO1xuICAgIHRoaXMuY2FsbFN0YXRlU3ViamVjdC5uZXh0KCdjb25uZWN0ZWQnKTtcbiAgICB0aGlzLnN0YXR1c1RleHRTdWJqZWN0Lm5leHQoJ0Nvbm5lY3RlZCcpO1xuICAgIC8vIFByZXNlcnZlIGFueSBtdXRlIGFjdGlvbiB0aGUgdXNlciBtYWRlIGR1cmluZyBcImNvbm5lY3RpbmdcIi5cbiAgICBjb25zdCBzaG91bGRCZU11dGVkID0gdGhpcy5pc01pY011dGVkU3ViamVjdC52YWx1ZTtcbiAgICB0aGlzLnBjQ2xpZW50Py5lbmFibGVNaWMoIXNob3VsZEJlTXV0ZWQpO1xuICAgIHRoaXMuaXNNaWNNdXRlZFN1YmplY3QubmV4dChzaG91bGRCZU11dGVkKTtcbiAgfVxuXG4gIHByaXZhdGUgb25QaXBlY2F0RGlzY29ubmVjdGVkKCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcER1cmF0aW9uVGltZXIoKTtcbiAgICB0aGlzLmNhbGxTdGFydFRpbWUgPSAwO1xuICAgIHRoaXMuYXVkaW9BbmFseXplci5zdG9wKCk7XG4gICAgdGhpcy5zdG9wQm90QXVkaW8oKTtcbiAgICB0aGlzLmNhbGxTdGF0ZVN1YmplY3QubmV4dCgnZW5kZWQnKTtcbiAgICB0aGlzLnN0YXR1c1RleHRTdWJqZWN0Lm5leHQoJ0NhbGwgRW5kZWQnKTtcbiAgfVxuXG4gIHByaXZhdGUgb25Cb3RSZWFkeSgpOiB2b2lkIHtcbiAgICAvLyBSZXRyeSB0cmFjayB3aXJpbmcgaW4gY2FzZSB0cmFja3Mgd2VyZW4ndCByZWFkeSBhdCBvbkNvbm5lY3RlZC5cbiAgICB0aGlzLnN0YXJ0TG9jYWxNaWNBbmFseXplcigpO1xuICAgIGNvbnN0IGJvdFRyYWNrID0gKHRoaXMucGNDbGllbnQ/LnRyYWNrcygpIGFzIHsgYm90PzogeyBhdWRpbz86IE1lZGlhU3RyZWFtVHJhY2sgfSB9KVxuICAgICAgPy5ib3Q/LmF1ZGlvO1xuICAgIGlmIChib3RUcmFjaykgdGhpcy5zZXR1cEJvdEF1ZGlvVHJhY2soYm90VHJhY2spO1xuICAgIC8vIEJvdCBpcyBpbml0aWFsaXNlZCDigJQgc2lnbmFsIHRoYXQgd2UncmUgbm93IHdhaXRpbmcgZm9yIHVzZXIgaW5wdXQuXG4gICAgdGhpcy5zdGF0dXNUZXh0U3ViamVjdC5uZXh0KCdMaXN0ZW5pbmcuLi4nKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRMb2NhbE1pY0FuYWx5emVyKCk6IHZvaWQge1xuICAgIGNvbnN0IGxvY2FsVHJhY2sgPSAodGhpcy5wY0NsaWVudD8udHJhY2tzKCkgYXMgeyBsb2NhbD86IHsgYXVkaW8/OiBNZWRpYVN0cmVhbVRyYWNrIH0gfSlcbiAgICAgID8ubG9jYWw/LmF1ZGlvO1xuICAgIGlmIChsb2NhbFRyYWNrKSB7XG4gICAgICB0aGlzLmF1ZGlvQW5hbHl6ZXIuc3RhcnQobmV3IE1lZGlhU3RyZWFtKFtsb2NhbFRyYWNrXSkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25Cb3RTdGFydGVkU3BlYWtpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoJ3RhbGtpbmcnKTtcbiAgICB0aGlzLnN0YXR1c1RleHRTdWJqZWN0Lm5leHQoJ1RhbGtpbmcuLi4nKTtcbiAgICAvLyBNYXJrIHVzZXIgYXMgbm8gbG9uZ2VyIHNwZWFraW5nIHdoZW4gYm90IHRha2VzIHRoZSB0dXJuLlxuICAgIHRoaXMuaXNVc2VyU3BlYWtpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkJvdFN0b3BwZWRTcGVha2luZygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jYWxsU3RhdGVTdWJqZWN0LnZhbHVlID09PSAndGFsa2luZycpIHtcbiAgICAgIHRoaXMuY2FsbFN0YXRlU3ViamVjdC5uZXh0KCdjb25uZWN0ZWQnKTtcbiAgICAgIHRoaXMuc3RhdHVzVGV4dFN1YmplY3QubmV4dCgnTGlzdGVuaW5nLi4uJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cEJvdEF1ZGlvVHJhY2sodHJhY2s6IE1lZGlhU3RyZWFtVHJhY2spOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYm90QXVkaW9FbGVtZW50KSB7XG4gICAgICB0aGlzLmJvdEF1ZGlvRWxlbWVudCA9IG5ldyBBdWRpbygpO1xuICAgICAgdGhpcy5ib3RBdWRpb0VsZW1lbnQuYXV0b3BsYXkgPSB0cnVlO1xuICAgICAgKHRoaXMuYm90QXVkaW9FbGVtZW50IGFzIGFueSkucGxheXNJbmxpbmUgPSB0cnVlO1xuICAgICAgdGhpcy5ib3RBdWRpb0VsZW1lbnQuc2V0QXR0cmlidXRlKCdwbGF5c2lubGluZScsICcnKTtcbiAgICB9XG4gICAgY29uc3QgZXhpc3RpbmcgPSAodGhpcy5ib3RBdWRpb0VsZW1lbnQuc3JjT2JqZWN0IGFzIE1lZGlhU3RyZWFtIHwgbnVsbClcbiAgICAgID8uZ2V0QXVkaW9UcmFja3MoKVswXTtcbiAgICBpZiAoZXhpc3Rpbmc/LmlkID09PSB0cmFjay5pZCkgcmV0dXJuO1xuXG4gICAgdGhpcy5ib3RBdWRpb0VsZW1lbnQucGF1c2UoKTtcbiAgICB0aGlzLmJvdEF1ZGlvRWxlbWVudC5zcmNPYmplY3QgPSBuZXcgTWVkaWFTdHJlYW0oW3RyYWNrXSk7XG4gICAgdGhpcy5ib3RBdWRpb0VsZW1lbnQucGxheSgpLmNhdGNoKChlcnIpID0+XG4gICAgICBjb25zb2xlLndhcm4oJ1tIaXZlR3B0IFZvaWNlXSBCb3QgYXVkaW8gcGxheSBibG9ja2VkJywgZXJyKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9wQm90QXVkaW8oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYm90QXVkaW9FbGVtZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmJvdEF1ZGlvRWxlbWVudC5wYXVzZSgpO1xuICAgICAgICAodGhpcy5ib3RBdWRpb0VsZW1lbnQuc3JjT2JqZWN0IGFzIE1lZGlhU3RyZWFtIHwgbnVsbClcbiAgICAgICAgICA/LmdldEF1ZGlvVHJhY2tzKClcbiAgICAgICAgICAuZm9yRWFjaCgodCkgPT4gdC5zdG9wKCkpO1xuICAgICAgICB0aGlzLmJvdEF1ZGlvRWxlbWVudC5zcmNPYmplY3QgPSBudWxsO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIGlnbm9yZVxuICAgICAgfVxuICAgICAgdGhpcy5ib3RBdWRpb0VsZW1lbnQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRpc2Nvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5saWZlY3ljbGVUb2tlbiArPSAxO1xuICAgIHRoaXMuc3RvcER1cmF0aW9uVGltZXIoKTtcbiAgICB0aGlzLmNhbGxTdGFydFRpbWUgPSAwO1xuICAgIHRoaXMuYXVkaW9BbmFseXplci5zdG9wKCk7XG4gICAgdGhpcy5zdG9wQm90QXVkaW8oKTtcbiAgICBhd2FpdCB0aGlzLmNsZWFudXBQaXBlY2F0Q2xpZW50KCk7XG4gICAgdGhpcy5jYWxsU3RhdGVTdWJqZWN0Lm5leHQoJ2VuZGVkJyk7XG4gICAgdGhpcy5zdGF0dXNUZXh0U3ViamVjdC5uZXh0KCdDYWxsIEVuZGVkJyk7XG4gIH1cblxuICBwcml2YXRlIGlzTGlmZWN5Y2xlQWN0aXZlKHRva2VuOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdG9rZW4gPT09IHRoaXMubGlmZWN5Y2xlVG9rZW47XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNsZWFudXBQaXBlY2F0Q2xpZW50KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLnBjQ2xpZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBSZW1vdmUgYWxsIGV2ZW50IGxpc3RlbmVycyBiZWZvcmUgZGlzY29ubmVjdGluZ1xuICAgICAgICB0aGlzLnBjRXZlbnRDbGVhbnVwLmZvckVhY2goZm4gPT4gZm4oKSk7XG4gICAgICAgIHRoaXMucGNFdmVudENsZWFudXAgPSBbXTtcbiAgICAgICAgYXdhaXQgdGhpcy5wY0NsaWVudC5kaXNjb25uZWN0KCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gaWdub3JlXG4gICAgICB9XG4gICAgICB0aGlzLnBjQ2xpZW50ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVNaWMoKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dE11dGVkID0gIXRoaXMuaXNNaWNNdXRlZFN1YmplY3QudmFsdWU7XG4gICAgLy8gUmVmbGVjdCB0aGUgdXNlcidzIGludGVudCBpbW1lZGlhdGVseSwgZXZlbiBpZiBjb25uZWN0IGlzIHN0aWxsIGluIHByb2dyZXNzLlxuICAgIHRoaXMuaXNNaWNNdXRlZFN1YmplY3QubmV4dChuZXh0TXV0ZWQpO1xuICAgIGlmICh0aGlzLnBjQ2xpZW50KSB7XG4gICAgICB0aGlzLnBjQ2xpZW50LmVuYWJsZU1pYyghbmV4dE11dGVkKTtcbiAgICB9XG4gICAgaWYgKG5leHRNdXRlZCkgdGhpcy5pc1VzZXJTcGVha2luZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0RHVyYXRpb25UaW1lcigpOiB2b2lkIHtcbiAgICBjb25zdCB0aWNrID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuY2FsbFN0YXJ0VGltZSA+IDApIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZCA9IE1hdGguZmxvb3IoKERhdGUubm93KCkgLSB0aGlzLmNhbGxTdGFydFRpbWUpIC8gMTAwMCk7XG4gICAgICAgIGNvbnN0IG0gPSBNYXRoLmZsb29yKGVsYXBzZWQgLyA2MCk7XG4gICAgICAgIGNvbnN0IHMgPSBlbGFwc2VkICUgNjA7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLmR1cmF0aW9uU3ViamVjdC5uZXh0KGAke219OiR7U3RyaW5nKHMpLnBhZFN0YXJ0KDIsICcwJyl9YCkpO1xuICAgICAgfVxuICAgIH07XG4gICAgdGljaygpO1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuZHVyYXRpb25JbnRlcnZhbCA9IHNldEludGVydmFsKHRpY2ssIDEwMDApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9wRHVyYXRpb25UaW1lcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kdXJhdGlvbkludGVydmFsKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuZHVyYXRpb25JbnRlcnZhbCk7XG4gICAgICB0aGlzLmR1cmF0aW9uSW50ZXJ2YWwgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuIl19
|