speechrecorderng 3.0.0 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/esm2020/lib/action/action.mjs +2 -1
  2. package/esm2020/lib/audio/array_audio_buffer.mjs +65 -2
  3. package/esm2020/lib/audio/array_audio_buffer_input_stream.mjs +2 -2
  4. package/esm2020/lib/audio/array_audio_buffer_random_access_stream.mjs +16 -0
  5. package/esm2020/lib/audio/audio_data_holder.mjs +203 -48
  6. package/esm2020/lib/audio/audio_display.mjs +10 -34
  7. package/esm2020/lib/audio/audio_player.mjs +18 -45
  8. package/esm2020/lib/audio/capture/capture.mjs +293 -69
  9. package/esm2020/lib/audio/dsp/level_measure.mjs +211 -88
  10. package/esm2020/lib/audio/impl/wavformat.mjs +1 -1
  11. package/esm2020/lib/audio/impl/wavreader.mjs +134 -0
  12. package/esm2020/lib/audio/impl/wavwriter.mjs +10 -9
  13. package/esm2020/lib/audio/inddb_audio_buffer.mjs +508 -0
  14. package/esm2020/lib/audio/net_audio_buffer.mjs +297 -0
  15. package/esm2020/lib/audio/persistor.mjs +8 -2
  16. package/esm2020/lib/audio/playback/array_audio_buffer_source_node.mjs +15 -154
  17. package/esm2020/lib/audio/playback/audio_source_node.mjs +18 -0
  18. package/esm2020/lib/audio/playback/audio_source_worklet_module_loader.mjs +167 -0
  19. package/esm2020/lib/audio/playback/inddb_audio_buffer_source_node.mjs +167 -0
  20. package/esm2020/lib/audio/playback/net_audio_buffer_source_node.mjs +218 -0
  21. package/esm2020/lib/audio/playback/player.mjs +190 -171
  22. package/esm2020/lib/audio/ui/audio_canvas_layer_comp.mjs +35 -76
  23. package/esm2020/lib/audio/ui/audio_display_control.mjs +12 -24
  24. package/esm2020/lib/audio/ui/audio_display_scroll_pane.mjs +14 -45
  25. package/esm2020/lib/audio/ui/audiosignal.mjs +333 -267
  26. package/esm2020/lib/audio/ui/container.mjs +40 -57
  27. package/esm2020/lib/audio/ui/livelevel.mjs +53 -52
  28. package/esm2020/lib/audio/ui/scroll_pane_horizontal.mjs +5 -19
  29. package/esm2020/lib/audio/ui/sonagram.mjs +386 -339
  30. package/esm2020/lib/db/inddb.mjs +120 -0
  31. package/esm2020/lib/io/BinaryReader.mjs +85 -0
  32. package/esm2020/lib/io/stream.mjs +101 -1
  33. package/esm2020/lib/net/uploader.mjs +111 -5
  34. package/esm2020/lib/recorder_component.mjs +59 -1
  35. package/esm2020/lib/speechrecorder/project/project.mjs +10 -1
  36. package/esm2020/lib/speechrecorder/project/project.service.mjs +3 -3
  37. package/esm2020/lib/speechrecorder/recording.mjs +30 -6
  38. package/esm2020/lib/speechrecorder/recordings/basic_recording.service.mjs +213 -0
  39. package/esm2020/lib/speechrecorder/recordings/recordings.service.mjs +732 -65
  40. package/esm2020/lib/speechrecorder/script/script.service.mjs +3 -3
  41. package/esm2020/lib/speechrecorder/session/audiorecorder.mjs +358 -184
  42. package/esm2020/lib/speechrecorder/session/basicrecorder.mjs +181 -28
  43. package/esm2020/lib/speechrecorder/session/controlpanel.mjs +47 -129
  44. package/esm2020/lib/speechrecorder/session/item.mjs +13 -1
  45. package/esm2020/lib/speechrecorder/session/progress.mjs +26 -55
  46. package/esm2020/lib/speechrecorder/session/prompting.mjs +33 -176
  47. package/esm2020/lib/speechrecorder/session/recorder_combi_pane.mjs +6 -6
  48. package/esm2020/lib/speechrecorder/session/recording_file_cache.mjs +28 -15
  49. package/esm2020/lib/speechrecorder/session/recording_list.mjs +92 -55
  50. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +9 -13
  51. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs +9 -18
  52. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +10 -36
  53. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +10 -37
  54. package/esm2020/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +80 -56
  55. package/esm2020/lib/speechrecorder/session/session.service.mjs +3 -3
  56. package/esm2020/lib/speechrecorder/session/session_finished_dialog.mjs +4 -4
  57. package/esm2020/lib/speechrecorder/session/sessionmanager.mjs +409 -165
  58. package/esm2020/lib/speechrecorder/session/warning_bar.mjs +6 -29
  59. package/esm2020/lib/speechrecorder/spruploader.mjs +3 -3
  60. package/esm2020/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +6 -41
  61. package/esm2020/lib/speechrecorderng.component.mjs +42 -31
  62. package/esm2020/lib/speechrecorderng.module.mjs +5 -5
  63. package/esm2020/lib/spr.config.mjs +3 -3
  64. package/esm2020/lib/spr.module.version.mjs +2 -2
  65. package/esm2020/lib/ui/canvas_layer_comp.mjs +3 -3
  66. package/esm2020/lib/ui/message_dialog.mjs +7 -7
  67. package/esm2020/lib/ui/recordingitem_display.mjs +26 -59
  68. package/esm2020/lib/utils/scrollIntoViewToBottom.mjs +3 -3
  69. package/esm2020/lib/utils/ua-parser.mjs +28 -4
  70. package/esm2020/lib/utils/utils.mjs +29 -1
  71. package/fesm2015/speechrecorderng.mjs +12755 -9195
  72. package/fesm2015/speechrecorderng.mjs.map +1 -1
  73. package/fesm2020/speechrecorderng.mjs +12652 -9101
  74. package/fesm2020/speechrecorderng.mjs.map +1 -1
  75. package/{speechrecorderng.d.ts → index.d.ts} +0 -0
  76. package/lib/audio/array_audio_buffer.d.ts +17 -1
  77. package/lib/audio/array_audio_buffer_random_access_stream.d.ts +9 -0
  78. package/lib/audio/audio_data_holder.d.ts +69 -14
  79. package/lib/audio/audio_display.d.ts +1 -1
  80. package/lib/audio/audio_player.d.ts +3 -7
  81. package/lib/audio/capture/capture.d.ts +24 -4
  82. package/lib/audio/dsp/level_measure.d.ts +2 -23
  83. package/lib/audio/impl/wavformat.d.ts +3 -3
  84. package/lib/audio/impl/wavreader.d.ts +16 -0
  85. package/lib/audio/impl/wavwriter.d.ts +1 -4
  86. package/lib/audio/inddb_audio_buffer.d.ts +68 -0
  87. package/lib/audio/net_audio_buffer.d.ts +59 -0
  88. package/lib/audio/persistor.d.ts +3 -9
  89. package/lib/audio/playback/array_audio_buffer_source_node.d.ts +2 -8
  90. package/lib/audio/playback/audio_source_node.d.ts +10 -0
  91. package/lib/audio/playback/audio_source_worklet_module_loader.d.ts +4 -0
  92. package/lib/audio/playback/inddb_audio_buffer_source_node.d.ts +21 -0
  93. package/lib/audio/playback/net_audio_buffer_source_node.d.ts +27 -0
  94. package/lib/audio/playback/player.d.ts +19 -16
  95. package/lib/audio/ui/audio_canvas_layer_comp.d.ts +3 -3
  96. package/lib/audio/ui/audio_display_control.d.ts +3 -6
  97. package/lib/audio/ui/audio_display_scroll_pane.d.ts +1 -1
  98. package/lib/audio/ui/audiosignal.d.ts +4 -3
  99. package/lib/audio/ui/container.d.ts +1 -1
  100. package/lib/audio/ui/livelevel.d.ts +11 -4
  101. package/lib/audio/ui/scroll_pane_horizontal.d.ts +1 -1
  102. package/lib/audio/ui/sonagram.d.ts +4 -3
  103. package/lib/db/inddb.d.ts +21 -0
  104. package/lib/io/BinaryReader.d.ts +18 -0
  105. package/lib/io/stream.d.ts +18 -0
  106. package/lib/net/uploader.d.ts +20 -2
  107. package/lib/recorder_component.d.ts +5 -0
  108. package/lib/speechrecorder/project/project.d.ts +9 -0
  109. package/lib/speechrecorder/recording.d.ts +8 -2
  110. package/lib/speechrecorder/recordings/basic_recording.service.d.ts +27 -0
  111. package/lib/speechrecorder/recordings/recordings.service.d.ts +21 -6
  112. package/lib/speechrecorder/session/audiorecorder.d.ts +7 -18
  113. package/lib/speechrecorder/session/basicrecorder.d.ts +28 -4
  114. package/lib/speechrecorder/session/controlpanel.d.ts +7 -7
  115. package/lib/speechrecorder/session/item.d.ts +1 -0
  116. package/lib/speechrecorder/session/progress.d.ts +2 -1
  117. package/lib/speechrecorder/session/prompting.d.ts +5 -5
  118. package/lib/speechrecorder/session/recorder_combi_pane.d.ts +1 -1
  119. package/lib/speechrecorder/session/recording_file_cache.d.ts +7 -4
  120. package/lib/speechrecorder/session/recording_list.d.ts +2 -1
  121. package/lib/speechrecorder/session/recordingfile/recording-file-meta.component.d.ts +1 -1
  122. package/lib/speechrecorder/session/recordingfile/recording-file-navi.component.d.ts +1 -1
  123. package/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.d.ts +1 -1
  124. package/lib/speechrecorder/session/recordingfile/recording-file-view.component.d.ts +1 -1
  125. package/lib/speechrecorder/session/recordingfile/recordingfile-service.d.ts +4 -5
  126. package/lib/speechrecorder/session/session_finished_dialog.d.ts +1 -1
  127. package/lib/speechrecorder/session/sessionmanager.d.ts +10 -10
  128. package/lib/speechrecorder/session/warning_bar.d.ts +1 -1
  129. package/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.d.ts +1 -1
  130. package/lib/speechrecorderng.component.d.ts +2 -1
  131. package/lib/spr.module.version.d.ts +1 -1
  132. package/lib/ui/canvas_layer_comp.d.ts +1 -1
  133. package/lib/ui/message_dialog.d.ts +1 -1
  134. package/lib/ui/recordingitem_display.d.ts +3 -2
  135. package/lib/utils/scrollIntoViewToBottom.d.ts +1 -1
  136. package/lib/utils/ua-parser.d.ts +4 -1
  137. package/lib/utils/utils.d.ts +6 -0
  138. package/package.json +5 -4
  139. package/esm2020/lib/math/utils.mjs +0 -14
  140. package/esm2020/lib/utils/css_utils.mjs +0 -7
  141. package/lib/math/utils.d.ts +0 -3
  142. package/lib/utils/css_utils.d.ts +0 -3
@@ -4,32 +4,18 @@ import { Observable } from "rxjs";
4
4
  import { ApiType, SPEECHRECORDER_CONFIG } from "../../../spr.config";
5
5
  import { UUID } from "../../../utils/utils";
6
6
  import { RecordingFileUtils } from "../../recording";
7
- import { AudioDataHolder } from "../../../audio/audio_data_holder";
7
+ import { AudioBufferSource, AudioDataHolder } from "../../../audio/audio_data_holder";
8
+ import { BasicRecordingService } from "../../recordings/basic_recording.service";
8
9
  import * as i0 from "@angular/core";
9
10
  import * as i1 from "@angular/common/http";
10
11
  import * as i2 from "../../../spr.config";
11
- export class RecordingFileService {
12
+ export class RecordingFileService extends BasicRecordingService {
12
13
  constructor(http, config) {
14
+ super(http, config);
13
15
  this.http = http;
14
16
  this.config = config;
15
- this.withCredentials = false;
16
17
  //private debugDelay:number=10000;
17
18
  this.debugDelay = 0;
18
- //constructor(private http: HttpClient) {
19
- // TODO test only
20
- this.apiEndPoint = '';
21
- // this.apiEndPoint = '/wikispeech/api/v1'
22
- if (config && config.apiEndPoint) {
23
- this.apiEndPoint = config.apiEndPoint;
24
- }
25
- if (this.apiEndPoint !== '') {
26
- this.apiEndPoint = this.apiEndPoint + '/';
27
- }
28
- if (config != null && config.withCredentials != null) {
29
- this.withCredentials = config.withCredentials;
30
- }
31
- //this.withCredentials=true
32
- //this.recordingCtxUrl = apiEndPoint + REC_API_CTX;
33
19
  }
34
20
  recoFileUrl(recordingFileId) {
35
21
  let encRecfileId = encodeURIComponent(recordingFileId);
@@ -93,7 +79,8 @@ export class RecordingFileService {
93
79
  // Do not use Promise version, which does not work with Safari 13
94
80
  if (resp.body) {
95
81
  aCtx.decodeAudioData(resp.body, ab => {
96
- RecordingFileUtils.setAudioData(recordingFile, new AudioDataHolder(ab));
82
+ let as = new AudioBufferSource(ab);
83
+ RecordingFileUtils.setAudioData(recordingFile, new AudioDataHolder(as));
97
84
  if (this.debugDelay > 0) {
98
85
  window.setTimeout(() => {
99
86
  observer.next(recordingFile);
@@ -143,7 +130,8 @@ export class RecordingFileService {
143
130
  if (resp.body) {
144
131
  aCtx.decodeAudioData(resp.body, ab => {
145
132
  if (rf) {
146
- RecordingFileUtils.setAudioData(rf, new AudioDataHolder(ab));
133
+ let as = new AudioBufferSource(ab);
134
+ RecordingFileUtils.setAudioData(rf, new AudioDataHolder(as));
147
135
  }
148
136
  else {
149
137
  observer.error('Recording file object null');
@@ -188,45 +176,81 @@ export class RecordingFileService {
188
176
  }, (error) => {
189
177
  observer.error(error);
190
178
  }, () => {
191
- let rfAudioObs = this.fetchAudiofile(recordingFileId);
192
- rfAudioObs.subscribe(resp => {
193
- // Do not use Promise version, which does not work with Safari 13
194
- if (resp.body) {
195
- aCtx.decodeAudioData(resp.body, ab => {
179
+ let sampleCnt = null;
180
+ if (rf && rf.channels && rf.frames) {
181
+ sampleCnt = rf.channels * rf.frames;
182
+ }
183
+ // TODO use download storage type depending on sample count of file
184
+ if (rf && rf.samplerate && sampleCnt != null && sampleCnt > this._maxAutoNetMemStoreSamples) {
185
+ const baseUrl = this.recoFileUrl(recordingFileId);
186
+ const obNetAb = this.chunkAudioRequestToNetAudioBuffer(aCtx, baseUrl, 0, rf?.samplerate, BasicRecordingService.DEFAULT_CHUNKED_DOWNLOAD_SECONDS, rf.frames);
187
+ obNetAb.subscribe({
188
+ next: (nab) => {
189
+ let adh = new AudioDataHolder(nab);
196
190
  if (rf) {
197
- let adh = new AudioDataHolder(ab);
198
191
  RecordingFileUtils.setAudioData(rf, adh);
192
+ observer.next(rf);
199
193
  }
200
- else {
201
- observer.error('Recording file object null');
202
- }
203
- if (this.debugDelay > 0) {
204
- window.setTimeout(() => {
205
- observer.next(rf);
206
- observer.complete();
207
- }, this.debugDelay);
194
+ },
195
+ complete: () => {
196
+ observer.complete();
197
+ },
198
+ error: (error) => {
199
+ if (error.status == 404) {
200
+ // Interpret not as an error, the file ist not recorded yet
201
+ observer.next(null);
202
+ observer.complete();
208
203
  }
209
204
  else {
210
- observer.next(rf);
205
+ // all other states are errors
206
+ observer.error(error);
211
207
  observer.complete();
212
208
  }
213
- });
214
- }
215
- else {
216
- observer.error('Received no audio data');
217
- }
218
- }, (error) => {
219
- if (error.status == 404) {
220
- // Interpret not as an error, the file ist not recorded yet
221
- observer.next(null);
222
- observer.complete();
223
- }
224
- else {
225
- // all other states are errors
226
- observer.error(error);
227
- observer.complete();
228
- }
229
- });
209
+ }
210
+ });
211
+ }
212
+ else {
213
+ let rfAudioObs = this.fetchAudiofile(recordingFileId);
214
+ rfAudioObs.subscribe(resp => {
215
+ // Do not use Promise version, which does not work with Safari 13
216
+ if (resp.body) {
217
+ aCtx.decodeAudioData(resp.body, ab => {
218
+ if (rf) {
219
+ let as = new AudioBufferSource(ab);
220
+ let adh = new AudioDataHolder(as);
221
+ RecordingFileUtils.setAudioData(rf, adh);
222
+ }
223
+ else {
224
+ observer.error('Recording file object null');
225
+ }
226
+ if (this.debugDelay > 0) {
227
+ window.setTimeout(() => {
228
+ observer.next(rf);
229
+ observer.complete();
230
+ }, this.debugDelay);
231
+ }
232
+ else {
233
+ observer.next(rf);
234
+ observer.complete();
235
+ }
236
+ });
237
+ }
238
+ else {
239
+ observer.error('Received no audio data');
240
+ }
241
+ }, (error) => {
242
+ if (error.status == 404) {
243
+ // Interpret not as an error, the file ist not recorded yet
244
+ observer.next(null);
245
+ observer.complete();
246
+ }
247
+ else {
248
+ // all other states are errors
249
+ observer.error(error);
250
+ observer.complete();
251
+ }
252
+ });
253
+ }
230
254
  });
231
255
  });
232
256
  return wobs;
@@ -243,12 +267,12 @@ export class RecordingFileService {
243
267
  }
244
268
  }
245
269
  RecordingFileService.RECOFILE_API_CTX = 'recordingfile';
246
- RecordingFileService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: RecordingFileService, deps: [{ token: i1.HttpClient }, { token: SPEECHRECORDER_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable });
247
- RecordingFileService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: RecordingFileService });
248
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: RecordingFileService, decorators: [{
270
+ RecordingFileService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: RecordingFileService, deps: [{ token: i1.HttpClient }, { token: SPEECHRECORDER_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable });
271
+ RecordingFileService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: RecordingFileService });
272
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: RecordingFileService, decorators: [{
249
273
  type: Injectable
250
274
  }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.SpeechRecorderConfig, decorators: [{
251
275
  type: Inject,
252
276
  args: [SPEECHRECORDER_CONFIG]
253
277
  }] }]; } });
254
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkaW5nZmlsZS1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL3NwZWVjaHJlY29yZGVyL3Nlc3Npb24vcmVjb3JkaW5nZmlsZS9yZWNvcmRpbmdmaWxlLXNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFnQyxXQUFXLEVBQWUsTUFBTSxzQkFBc0IsQ0FBQztBQUc5RixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBR2hDLE9BQU8sRUFBQyxPQUFPLEVBQUUscUJBQXFCLEVBQXVCLE1BQU0scUJBQXFCLENBQUM7QUFDekYsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzFDLE9BQU8sRUFBZ0Isa0JBQWtCLEVBQW1CLE1BQU0saUJBQWlCLENBQUM7QUFDcEYsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLGtDQUFrQyxDQUFDOzs7O0FBSWpFLE1BQU0sT0FBTyxvQkFBb0I7SUFTL0IsWUFBb0IsSUFBZ0IsRUFBeUMsTUFBNkI7UUFBdEYsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUF5QyxXQUFNLEdBQU4sTUFBTSxDQUF1QjtRQUxsRyxvQkFBZSxHQUFZLEtBQUssQ0FBQztRQUV6QyxrQ0FBa0M7UUFDMUIsZUFBVSxHQUFRLENBQUMsQ0FBQztRQUcxQix5Q0FBeUM7UUFDdkMsaUJBQWlCO1FBQ25CLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFBO1FBQ3BCLDJDQUEyQztRQUU1QyxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsV0FBVyxFQUFFO1lBQ2hDLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztTQUN2QztRQUNELElBQUksSUFBSSxD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QkFBb0IsR0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDeEQ7UUFDRCwwQ0FBMEM7UUFDMUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBbUIsTUFBTSxFQUFDLEVBQUMsY0FBYyxFQUFDLGNBQWMsRUFBQyxjQUFjLEVBQUMsY0FBYyxFQUFDLFlBQVksRUFBQyxZQUFZLEVBQUMsRUFBQyxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztJQUNyTCxDQUFDOztBQS9Qc0IscUNBQWdCLEdBQUcsZUFBZSxDQUFBO2tIQUY5QyxvQkFBb0IsNENBU2UscUJBQXFCO3NIQVR4RCxvQkFBb0I7NEZBQXBCLG9CQUFvQjtrQkFEaEMsVUFBVTs7MEJBVThCLE1BQU07MkJBQUMscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3QsIEluamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge0h0dHBDbGllbnQsIEh0dHBFcnJvclJlc3BvbnNlLCBIdHRwSGVhZGVycywgSHR0cFJlc3BvbnNlfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcclxuXHJcblxyXG5pbXBvcnQge09ic2VydmFibGV9IGZyb20gXCJyeGpzXCI7XHJcblxyXG5cclxuaW1wb3J0IHtBcGlUeXBlLCBTUEVFQ0hSRUNPUkRFUl9DT05GSUcsIFNwZWVjaFJlY29yZGVyQ29uZmlnfSBmcm9tIFwiLi4vLi4vLi4vc3ByLmNvbmZpZ1wiO1xyXG5pbXBvcnQge1VVSUR9IGZyb20gXCIuLi8uLi8uLi91dGlscy91dGlsc1wiO1xyXG5pbXBvcnQge1JlY29yZGluZ0ZpbGUsIFJlY29yZGluZ0ZpbGVVdGlscywgU3ByUmVjb3JkaW5nRmlsZX0gZnJvbSBcIi4uLy4uL3JlY29yZGluZ1wiO1xyXG5pbXBvcnQge0F1ZGlvRGF0YUhvbGRlcn0gZnJvbSBcIi4uLy4uLy4uL2F1ZGlvL2F1ZGlvX2RhdGFfaG9sZGVyXCI7XHJcblxyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgUmVjb3JkaW5nRmlsZVNlcnZpY2Uge1xyXG5cclxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFJFQ09GSUxFX0FQSV9DVFggPSAncmVjb3JkaW5nZmlsZSdcclxuICBwcml2YXRlIGFwaUVuZFBvaW50OiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSB3aXRoQ3JlZGVudGlhbHM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy9wcml2YXRlIGRlYnVnRGVsYXk6bnVtYmVyPTEwMDAwO1xyXG4gIHByaXZhdGUgZGVidWdEZWxheTpudW1iZXI9MDtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LCBASW5qZWN0KFNQRUVDSFJFQ09SREVSX0NPTkZJRykgcHJpdmF0ZSBjb25maWc/OiBTcGVlY2hSZWNvcmRlckNvbmZpZykge1xyXG4gICAgLy9jb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQpIHtcclxuICAgICAgLy8gVE9ETyB0ZXN0IG9ubHlcclxuICAgIHRoaXMuYXBpRW5kUG9pbnQgPSAnJ1xyXG4gICAgIC8vIHRoaXMuYXBpRW5kUG9pbnQgPSAgJy93aWtpc3BlZWNoL2FwaS92MSdcclxuXHJcbiAgICBpZiAoY29uZmlnICYmIGNvbmZpZy5hcGlFbmRQb2ludCkge1xyXG4gICAgICB0aGlzLmFwaUVuZFBvaW50ID0gY29uZmlnLmFwaUVuZFBvaW50O1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuYXBpRW5kUG9pbnQgIT09ICcnKSB7XHJcbiAgICAgIHRoaXMuYXBpRW5kUG9pbnQgPSB0aGlzLmFwaUVuZFBvaW50ICsgJy8nXHJcbiAgICB9XHJcbiAgICBpZiAoY29uZmlnICE9IG51bGwgJiYgY29uZmlnLndpdGhDcmVkZW50aWFscyAhPSBudWxsKSB7XHJcbiAgICAgIHRoaXMud2l0aENyZWRlbnRpYWxzID0gY29uZmlnLndpdGhDcmVkZW50aWFscztcclxuICAgIH1cclxuICAvL3RoaXMud2l0aENyZWRlbnRpYWxzPXRydWVcclxuXHJcbiAgICAvL3RoaXMucmVjb3JkaW5nQ3R4VXJsID0gYXBpRW5kUG9pbnQgKyBSRUNfQVBJX0NUWDtcclxuXHJcblxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWNvRmlsZVVybChyZWNvcmRpbmdGaWxlSWQ6IHN0cmluZyB8IG51bWJlcik6c3RyaW5ne1xyXG4gICAgbGV0IGVuY1JlY2ZpbGVJZD1lbmNvZGVVUklDb21wb25lbnQocmVjb3JkaW5nRmlsZUlkKTtcclxuICAgIGxldCByZWNVcmwgPSB0aGlzLmFwaUVuZFBvaW50ICsgUmVjb3JkaW5nRmlsZVNlcnZpY2UuUkVDT0ZJTEVfQVBJX0NUWCArICcvJyArIGVuY1JlY2ZpbGVJZDtcclxuXHJcbiAgICByZXR1cm4gcmVjVXJsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmZXRjaEF1ZGlvZmlsZShyZWNvcmRpbmdGaWxlSWQ6IHN0cmluZyB8IG51bWJlcik6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEFycmF5QnVmZmVyPj4ge1xyXG4gICAgbGV0IHJlY1VybCA9IHRoaXMucmVjb0ZpbGVVcmwocmVjb3JkaW5nRmlsZUlkKTtcclxuICAgIGlmICh0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5hcGlUeXBlID09PSBBcGlUeXBlLkZJTEVTKSB7XHJcbiAgICAgIC8vIGZvciBkZXZlbG9wbWVudCBhbmQgZGVtb1xyXG4gICAgICAvLyBhcHBlbmQgVVVJRCB0byBtYWtlIHJlcXVlc3QgVVJMIHVuaXF1ZSB0byBhdm9pZCBsb2NhbGhvc3Qgc2VydmVyIGNhY2hpbmdcclxuICAgICAgcmVjVXJsID0gcmVjVXJsICsgJy53YXYnO1xyXG4gICAgfVxyXG4gICAgbGV0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoe1xyXG4gICAgICAnQWNjZXB0JzogJ2F1ZGlvL3dhdidcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHJlY1VybCwge1xyXG4gICAgICBvYnNlcnZlOiAncmVzcG9uc2UnLFxyXG4gICAgICBoZWFkZXJzOiBoZWFkZXJzLFxyXG4gICAgICByZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcicsXHJcbiAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy53aXRoQ3JlZGVudGlhbHNcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWNvcmRpbmdGaWxlRGVzY3JPYnNlcnZlcihyZWNvcmRpbmdGaWxlSWQ6IHN0cmluZyB8IG51bWJlcik6IE9ic2VydmFibGU8UmVjb3JkaW5nRmlsZT4ge1xyXG5cclxuICAgIGxldCByZWNVcmwgPSB0aGlzLnJlY29GaWxlVXJsKHJlY29yZGluZ0ZpbGVJZCk7XHJcbiAgICBpZiAodGhpcy5jb25maWcgJiYgdGhpcy5jb25maWcuYXBpVHlwZSA9PT0gQXBpVHlwZS5GSUxFUykge1xyXG4gICAgICAvLyBmb3IgZGV2ZWxvcG1lbnQgYW5kIGRlbW9cclxuICAgICAgLy8gYXBwZW5kIFVVSUQgdG8gbWFrZSByZXF1ZXN0IFVSTCB1bmlxdWUgdG8gYXZvaWQgbG9jYWxob3N0IHNlcnZlciBjYWNoaW5nXHJcbiAgICAgIHJlY1VybCA9IHJlY1VybCArICcuanNvbj9yZXF1ZXN0VVVJRD0nK1VVSUQuZ2VuZXJhdGUoKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFJlY29yZGluZ0ZpbGU+KHJlY1VybCx7IHdpdGhDcmVkZW50aWFsczogdGhpcy53aXRoQ3JlZGVudGlhbHMgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNwclJlY29yZGluZ0ZpbGVEZXNjck9ic2VydmVyKHJlY29yZGluZ0ZpbGVJZDogc3RyaW5nIHwgbnVtYmVyKTogT2JzZXJ2YWJsZTxTcHJSZWNvcmRpbmdGaWxlPiB7XHJcblxyXG4gICAgbGV0IHJlY1VybCA9IHRoaXMucmVjb0ZpbGVVcmwocmVjb3JkaW5nRmlsZUlkKTtcclxuICAgIGlmICh0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5hcGlUeXBlID09PSBBcGlUeXBlLkZJTEVTKSB7XHJcbiAgICAgIC8vIGZvciBkZXZlbG9wbWVudCBhbmQgZGVtb1xyXG4gICAgICAvLyBhcHBlbmQgVVVJRCB0byBtYWtlIHJlcXVlc3QgVVJMIHVuaXF1ZSB0byBhdm9pZCBsb2NhbGhvc3Qgc2VydmVyIGNhY2hpbmdcclxuICAgICAgcmVjVXJsID0gcmVjVXJsICsgJy5qc29uP3JlcXVlc3RVVUlEPScrVVVJRC5nZW5lcmF0ZSgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8U3ByUmVjb3JkaW5nRmlsZT4ocmVjVXJsLHsgd2l0aENyZWRlbnRpYWxzOiB0aGlzLndpdGhDcmVkZW50aWFscyB9KTtcclxuICB9XHJcblxyXG5cclxuICBwcml2YXRlIGZldGNoU2Vzc2lvbkF1ZGlvZmlsZUJ5SWQocHJvamVjdE5hbWU6IHN0cmluZywgc2Vzc0lkOiBzdHJpbmcgfCBudW1iZXIsIHJlY29yZGluZ0ZpbGVJZDogc3RyaW5nIHwgbnVtYmVyKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXJyYXlCdWZmZXI+PiB7XHJcblxyXG4gICAgbGV0IHJlY1VybCA9IHRoaXMucmVjb0ZpbGVVcmwocmVjb3JkaW5nRmlsZUlkKTtcclxuICAgIC8vIGlmICh0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5hcGlUeXBlID09PSBBcGlUeXBlLkZJTEVTKSB7XHJcbiAgICAvLyAgIC8vIGZvciBkZXZlbG9wbWVudCBhbmQgZGVtb1xyXG4gICAgLy8gICAvLyBhcHBlbmQgVVVJRCB0byBtYWtlIHJlcXVlc3QgVVJMIHVuaXF1ZSB0byBhdm9pZCBsb2NhbGhvc3Qgc2VydmVyIGNhY2hpbmdcclxuICAgIC8vICAgcmVjVXJsID0gcmVjVXJsICsgJy53YXY/cmVxdWVzdFVVSUQ9JyArIFVVSUQuZ2VuZXJhdGUoKTtcclxuICAgIC8vIH1cclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHJlY1VybCwge1xyXG4gICAgICBvYnNlcnZlOiAncmVzcG9uc2UnLFxyXG4gICAgICByZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcicsXHJcbiAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy53aXRoQ3JlZGVudGlhbHNcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vIFRPRE8gdGVzdFxyXG5cclxuICBmZXRjaEFuZEFwcGx5UmVjb3JkaW5nRmlsZShhQ3R4OiBBdWRpb0NvbnRleHQsIHJlY29yZGluZ0ZpbGU6U3ByUmVjb3JkaW5nRmlsZSk6T2JzZXJ2YWJsZTxTcHJSZWNvcmRpbmdGaWxlfG51bGw+IHtcclxuXHJcbiAgICBsZXQgd29icyA9IG5ldyBPYnNlcnZhYmxlPFNwclJlY29yZGluZ0ZpbGV8bnVsbD4ob2JzZXJ2ZXI9PntcclxuICAgICAgaWYocmVjb3JkaW5nRmlsZS5yZWNvcmRpbmdGaWxlSWQpIHtcclxuICAgICAgICBsZXQgb2JzID0gdGhpcy5mZXRjaEF1ZGlvZmlsZShyZWNvcmRpbmdGaWxlLnJlY29yZGluZ0ZpbGVJZCk7XHJcblxyXG4gICAgICAgIG9icy5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgICAgLy8gRG8gbm90IHVzZSBQcm9taXNlIHZlcnNpb24sIHdoaWNoIGRvZXMgbm90IHdvcmsgd2l0aCBTYWZhcmkgMTNcclxuICAgICAgICAgICAgICBpZihyZXNwLmJvZHkpIHtcclxuICAgICAgICAgICAgICAgIGFDdHguZGVjb2RlQXVkaW9EYXRhKHJlc3AuYm9keSwgYWIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBSZWNvcmRpbmdGaWxlVXRpbHMuc2V0QXVkaW9EYXRhKHJlY29yZGluZ0ZpbGUsbmV3IEF1ZGlvRGF0YUhvbGRlcihhYikpO1xyXG4gICAgICAgICAgICAgICAgICBpZiAodGhpcy5kZWJ1Z0RlbGF5ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KHJlY29yZGluZ0ZpbGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLmRlYnVnRGVsYXkpO1xyXG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQocmVjb3JkaW5nRmlsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKCdSZWNlaXZlZCBubyBhdWRpbyBkYXRhIScpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT0gNDA0KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBJbnRlcnByZXQgbm90IGFzIGFuIGVycm9yLCB0aGUgZmlsZSBpc3Qgbm90IHJlY29yZGVkIHlldFxyXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChudWxsKTtcclxuICAgICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKClcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gYWxsIG90aGVyIHN0YXRlcyBhcmUgZXJyb3JzXHJcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIG9ic2VydmVyLmVycm9yKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB3b2JzO1xyXG4gIH1cclxuXHJcbiAgZmV0Y2hSZWNvcmRpbmdGaWxlKGFDdHg6IEF1ZGlvQ29udGV4dCwgcmVjb3JkaW5nRmlsZUlkOiBzdHJpbmcgfCBudW1iZXIpOiBPYnNlcnZhYmxlPFJlY29yZGluZ0ZpbGUgfCBudWxsPiB7XHJcblxyXG4gICAgbGV0IHdvYnMgPSBuZXcgT2JzZXJ2YWJsZTxSZWNvcmRpbmdGaWxlIHwgbnVsbD4ob2JzZXJ2ZXIgPT4ge1xyXG4gICAgICBsZXQgcmY6IFJlY29yZGluZ0ZpbGV8bnVsbCA9IG51bGw7XHJcbiAgICAgIGxldCByZkRlc2NyT2JzID0gdGhpcy5yZWNvcmRpbmdGaWxlRGVzY3JPYnNlcnZlcihyZWNvcmRpbmdGaWxlSWQpO1xyXG4gICAgICByZkRlc2NyT2JzLnN1YnNjcmliZSh2YWx1ZSA9PiB7XHJcbiAgICAgICAgcmYgPSB2YWx1ZTtcclxuICAgICAgfSwgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZXJyb3IpO1xyXG4gICAgICB9LCAoKSA9PiB7XHJcbiAgICAgICAgbGV0IHJmQXVkaW9PYnMgPSB0aGlzLmZldGNoQXVkaW9maWxlKHJlY29yZGluZ0ZpbGVJZCk7XHJcbiAgICAgICAgcmZBdWRpb09icy5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vIERvIG5vdCB1c2UgUHJvbWlzZSB2ZXJzaW9uLCB3aGljaCBkb2VzIG5vdCB3b3JrIHdpdGggU2FmYXJpIDEzXHJcbiAgICAgICAgICAgIGlmKHJlc3AuYm9keSkge1xyXG4gICAgICAgICAgICAgIGFDdHguZGVjb2RlQXVkaW9EYXRhKHJlc3AuYm9keSwgYWIgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYocmYpIHtcclxuICAgICAgICAgICAgICAgICAgUmVjb3JkaW5nRmlsZVV0aWxzLnNldEF1ZGlvRGF0YShyZixuZXcgQXVkaW9EYXRhSG9sZGVyKGFiKSk7XHJcbiAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoJ1JlY29yZGluZyBmaWxlIG9iamVjdCBudWxsJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kZWJ1Z0RlbGF5ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChyZik7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICAgICAgfSwgdGhpcy5kZWJ1Z0RlbGF5KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQocmYpO1xyXG4gICAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKCdSZWNlaXZlZCBubyBhdWRpbyBkYXRhJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICAoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT0gNDA0KSB7XHJcbiAgICAgICAgICAgICAgLy8gSW50ZXJwcmV0IG5vdCBhcyBhbiBlcnJvciwgdGhlIGZpbGUgaXN0IG5vdCByZWNvcmRlZCB5ZXRcclxuICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KG51bGwpO1xyXG4gICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKClcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAvLyBhbGwgb3RoZXIgc3RhdGVzIGFyZSBlcnJvcnNcclxuICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB3b2JzO1xyXG4gIH1cclxuXHJcbiAgZmV0Y2hTcHJSZWNvcmRpbmdGaWxlKGFDdHg6IEF1ZGlvQ29udGV4dCwgcmVjb3JkaW5nRmlsZUlkOiBzdHJpbmcgfCBudW1iZXIpOiBPYnNlcnZhYmxlPFNwclJlY29yZGluZ0ZpbGUgfCBudWxsPiB7XHJcblxyXG4gICAgbGV0IHdvYnMgPSBuZXcgT2JzZXJ2YWJsZTxTcHJSZWNvcmRpbmdGaWxlIHwgbnVsbD4ob2JzZXJ2ZXIgPT4ge1xyXG4gICAgICBsZXQgcmY6IFNwclJlY29yZGluZ0ZpbGV8bnVsbCA9IG51bGw7XHJcbiAgICAgIGxldCByZkRlc2NyT2JzID0gdGhpcy5zcHJSZWNvcmRpbmdGaWxlRGVzY3JPYnNlcnZlcihyZWNvcmRpbmdGaWxlSWQpO1xyXG4gICAgICByZkRlc2NyT2JzLnN1YnNjcmliZSh2YWx1ZSA9PiB7XHJcbiAgICAgICAgcmYgPSB2YWx1ZTtcclxuICAgICAgfSwgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZXJyb3IpO1xyXG4gICAgICB9LCAoKSA9PiB7XHJcbiAgICAgICAgbGV0IHJmQXVkaW9PYnMgPSB0aGlzLmZldGNoQXVkaW9maWxlKHJlY29yZGluZ0ZpbGVJZCk7XHJcbiAgICAgICAgcmZBdWRpb09icy5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgICAgLy8gRG8gbm90IHVzZSBQcm9taXNlIHZlcnNpb24sIHdoaWNoIGRvZXMgbm90IHdvcmsgd2l0aCBTYWZhcmkgMTNcclxuICAgICAgICAgIGlmKHJlc3AuYm9keSkge1xyXG4gICAgICAgICAgICBhQ3R4LmRlY29kZUF1ZGlvRGF0YShyZXNwLmJvZHksIGFiID0+IHtcclxuICAgICAgICAgICAgICBpZihyZikge1xyXG4gICAgICAgICAgICAgICAgbGV0IGFkaD1uZXcgQXVkaW9EYXRhSG9sZGVyKGFiKTtcclxuICAgICAgICAgICAgICAgIFJlY29yZGluZ0ZpbGVVdGlscy5zZXRBdWRpb0RhdGEocmYsYWRoKTtcclxuICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKCdSZWNvcmRpbmcgZmlsZSBvYmplY3QgbnVsbCcpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAodGhpcy5kZWJ1Z0RlbGF5ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KHJmKTtcclxuICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICAgIH0sIHRoaXMuZGVidWdEZWxheSk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQocmYpO1xyXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoJ1JlY2VpdmVkIG5vIGF1ZGlvIGRhdGEnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICAoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT0gNDA0KSB7XHJcbiAgICAgICAgICAgICAgLy8gSW50ZXJwcmV0IG5vdCBhcyBhbiBlcnJvciwgdGhlIGZpbGUgaXN0IG5vdCByZWNvcmRlZCB5ZXRcclxuICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KG51bGwpO1xyXG4gICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKClcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAvLyBhbGwgb3RoZXIgc3RhdGVzIGFyZSBlcnJvcnNcclxuICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB3b2JzO1xyXG4gIH1cclxuXHJcbiAgc2F2ZUVkaXRTZWxlY3Rpb24ocmVjb3JkaW5nRmlsZUlkOiBzdHJpbmcgfCBudW1iZXIsZWRpdFNhbXBsZVJhdGU6bnVtYmVyfG51bGwsZWRpdFN0YXJ0RnJhbWU6bnVtYmVyfG51bGwsZWRpdEVuZEZyYW1lOm51bWJlcnxudWxsKTogT2JzZXJ2YWJsZTxTcHJSZWNvcmRpbmdGaWxlIHwgbnVsbD4ge1xyXG4gICAgbGV0IHJlY1VybCA9IHRoaXMuYXBpRW5kUG9pbnQgKyBSZWNvcmRpbmdGaWxlU2VydmljZS5SRUNPRklMRV9BUElfQ1RYICsgJy8nICsgcmVjb3JkaW5nRmlsZUlkO1xyXG4gICAgaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmFwaVR5cGUgPT09IEFwaVR5cGUuRklMRVMpIHtcclxuICAgICAgLy8gZm9yIGRldmVsb3BtZW50IGFuZCBkZW1vXHJcbiAgICAgIC8vIGFwcGVuZCBVVUlEIHRvIG1ha2UgcmVxdWVzdCBVUkwgdW5pcXVlIHRvIGF2b2lkIGxvY2FsaG9zdCBzZXJ2ZXIgY2FjaGluZ1xyXG4gICAgICByZWNVcmwgPSByZWNVcmwgKyAnLmpzb24/cmVxdWVzdFVVSUQ9JytVVUlELmdlbmVyYXRlKCk7XHJcbiAgICB9XHJcbiAgICAvL2NvbnNvbGUubG9nKFwiUGF0aCByZXF1ZXN0IFVSTDogXCIrcmVjVXJsKVxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wYXRjaDxTcHJSZWNvcmRpbmdGaWxlPihyZWNVcmwse2VkaXRTYW1wbGVSYXRlOmVkaXRTYW1wbGVSYXRlLGVkaXRTdGFydEZyYW1lOmVkaXRTdGFydEZyYW1lLGVkaXRFbmRGcmFtZTplZGl0RW5kRnJhbWV9LHsgd2l0aENyZWRlbnRpYWxzOiB0aGlzLndpdGhDcmVkZW50aWFscyB9KTtcclxuICB9XHJcblxyXG59XHJcblxyXG5cclxuIl19
278
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkaW5nZmlsZS1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL3NwZWVjaHJlY29yZGVyL3Nlc3Npb24vcmVjb3JkaW5nZmlsZS9yZWNvcmRpbmdmaWxlLXNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFnQyxXQUFXLEVBQWUsTUFBTSxzQkFBc0IsQ0FBQztBQUc5RixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBR2hDLE9BQU8sRUFBQyxPQUFPLEVBQUUscUJBQXFCLEVBQXVCLE1BQU0scUJBQXFCLENBQUM7QUFDekYsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzFDLE9BQU8sRUFBZ0Isa0JBQWtCLEVBQW1CLE1BQU0saUJBQWlCLENBQUM7QUFDcEYsT0FBTyxFQUFDLGlCQUFpQixFQUFFLGVBQWUsRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBQ3BGLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLDBDQUEwQyxDQUFDOzs7O0FBSS9FLE1BQU0sT0FBTyxvQkFBcUIsU0FBUSxxQkFBcUI7SUFPN0QsWUFBc0IsSUFBZ0IsRUFBMkMsTUFBNkI7UUFDMUcsS0FBSyxDQUFDLElBQUksRUFBQyxNQUFNLENBQUMsQ0FBQztRQURELFNBQUksR0FBSixJQUFJLENBQVk7UUFBMkMsV0FBTSxHQUFOLE1BQU0sQ0FBdUI7UUFIOUcsa0NBQWtDO1FBQzFCLGVBQVUsR0FBUSxDQUFDLENBQUM7SUFJNUIsQ0FBQztJQUVPLFdBQVcsQ0FBQyxlQUFnQztRQUNsRCxJQUFJLFlBQVksR0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNyRCxJQUFJLE1BQU0sR0FBRyxJ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QiwyRUFBMkU7WUFDM0UsTUFBTSxHQUFHLE1BQU0sR0FBRyxvQkFBb0IsR0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDeEQ7UUFDRCwwQ0FBMEM7UUFDMUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBbUIsTUFBTSxFQUFDLEVBQUMsY0FBYyxFQUFDLGNBQWMsRUFBQyxjQUFjLEVBQUMsY0FBYyxFQUFDLFlBQVksRUFBQyxZQUFZLEVBQUMsRUFBQyxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztJQUNyTCxDQUFDOztBQWpSc0IscUNBQWdCLEdBQUcsZUFBZSxDQUFBO2tIQUY5QyxvQkFBb0IsNENBT2lCLHFCQUFxQjtzSEFQMUQsb0JBQW9COzRGQUFwQixvQkFBb0I7a0JBRGhDLFVBQVU7OzBCQVFnQyxNQUFNOzJCQUFDLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtIdHRwQ2xpZW50LCBIdHRwRXJyb3JSZXNwb25zZSwgSHR0cEhlYWRlcnMsIEh0dHBSZXNwb25zZX0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XHJcblxyXG5cclxuaW1wb3J0IHtPYnNlcnZhYmxlfSBmcm9tIFwicnhqc1wiO1xyXG5cclxuXHJcbmltcG9ydCB7QXBpVHlwZSwgU1BFRUNIUkVDT1JERVJfQ09ORklHLCBTcGVlY2hSZWNvcmRlckNvbmZpZ30gZnJvbSBcIi4uLy4uLy4uL3Nwci5jb25maWdcIjtcclxuaW1wb3J0IHtVVUlEfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvdXRpbHNcIjtcclxuaW1wb3J0IHtSZWNvcmRpbmdGaWxlLCBSZWNvcmRpbmdGaWxlVXRpbHMsIFNwclJlY29yZGluZ0ZpbGV9IGZyb20gXCIuLi8uLi9yZWNvcmRpbmdcIjtcclxuaW1wb3J0IHtBdWRpb0J1ZmZlclNvdXJjZSwgQXVkaW9EYXRhSG9sZGVyfSBmcm9tIFwiLi4vLi4vLi4vYXVkaW8vYXVkaW9fZGF0YV9ob2xkZXJcIjtcclxuaW1wb3J0IHtCYXNpY1JlY29yZGluZ1NlcnZpY2V9IGZyb20gXCIuLi8uLi9yZWNvcmRpbmdzL2Jhc2ljX3JlY29yZGluZy5zZXJ2aWNlXCI7XHJcblxyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgUmVjb3JkaW5nRmlsZVNlcnZpY2UgZXh0ZW5kcyBCYXNpY1JlY29yZGluZ1NlcnZpY2V7XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUkVDT0ZJTEVfQVBJX0NUWCA9ICdyZWNvcmRpbmdmaWxlJ1xyXG5cclxuICAvL3ByaXZhdGUgZGVidWdEZWxheTpudW1iZXI9MTAwMDA7XHJcbiAgcHJpdmF0ZSBkZWJ1Z0RlbGF5Om51bWJlcj0wO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgaHR0cDogSHR0cENsaWVudCwgQEluamVjdChTUEVFQ0hSRUNPUkRFUl9DT05GSUcpIHByb3RlY3RlZCBjb25maWc/OiBTcGVlY2hSZWNvcmRlckNvbmZpZykge1xyXG4gICAgICBzdXBlcihodHRwLGNvbmZpZyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlY29GaWxlVXJsKHJlY29yZGluZ0ZpbGVJZDogc3RyaW5nIHwgbnVtYmVyKTpzdHJpbmd7XHJcbiAgICBsZXQgZW5jUmVjZmlsZUlkPWVuY29kZVVSSUNvbXBvbmVudChyZWNvcmRpbmdGaWxlSWQpO1xyXG4gICAgbGV0IHJlY1VybCA9IHRoaXMuYXBpRW5kUG9pbnQgKyBSZWNvcmRpbmdGaWxlU2VydmljZS5SRUNPRklMRV9BUElfQ1RYICsgJy8nICsgZW5jUmVjZmlsZUlkO1xyXG5cclxuICAgIHJldHVybiByZWNVcmw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZldGNoQXVkaW9maWxlKHJlY29yZGluZ0ZpbGVJZDogc3RyaW5nIHwgbnVtYmVyKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXJyYXlCdWZmZXI+PiB7XHJcbiAgICBsZXQgcmVjVXJsID0gdGhpcy5yZWNvRmlsZVVybChyZWNvcmRpbmdGaWxlSWQpO1xyXG4gICAgaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmFwaVR5cGUgPT09IEFwaVR5cGUuRklMRVMpIHtcclxuICAgICAgLy8gZm9yIGRldmVsb3BtZW50IGFuZCBkZW1vXHJcbiAgICAgIC8vIGFwcGVuZCBVVUlEIHRvIG1ha2UgcmVxdWVzdCBVUkwgdW5pcXVlIHRvIGF2b2lkIGxvY2FsaG9zdCBzZXJ2ZXIgY2FjaGluZ1xyXG4gICAgICByZWNVcmwgPSByZWNVcmwgKyAnLndhdic7XHJcbiAgICB9XHJcbiAgICBsZXQgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XHJcbiAgICAgICdBY2NlcHQnOiAnYXVkaW8vd2F2J1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQocmVjVXJsLCB7XHJcbiAgICAgIG9ic2VydmU6ICdyZXNwb25zZScsXHJcbiAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXHJcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJyxcclxuICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLndpdGhDcmVkZW50aWFsc1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlY29yZGluZ0ZpbGVEZXNjck9ic2VydmVyKHJlY29yZGluZ0ZpbGVJZDogc3RyaW5nIHwgbnVtYmVyKTogT2JzZXJ2YWJsZTxSZWNvcmRpbmdGaWxlPiB7XHJcblxyXG4gICAgbGV0IHJlY1VybCA9IHRoaXMucmVjb0ZpbGVVcmwocmVjb3JkaW5nRmlsZUlkKTtcclxuICAgIGlmICh0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5hcGlUeXBlID09PSBBcGlUeXBlLkZJTEVTKSB7XHJcbiAgICAgIC8vIGZvciBkZXZlbG9wbWVudCBhbmQgZGVtb1xyXG4gICAgICAvLyBhcHBlbmQgVVVJRCB0byBtYWtlIHJlcXVlc3QgVVJMIHVuaXF1ZSB0byBhdm9pZCBsb2NhbGhvc3Qgc2VydmVyIGNhY2hpbmdcclxuICAgICAgcmVjVXJsID0gcmVjVXJsICsgJy5qc29uP3JlcXVlc3RVVUlEPScrVVVJRC5nZW5lcmF0ZSgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8UmVjb3JkaW5nRmlsZT4ocmVjVXJsLHsgd2l0aENyZWRlbnRpYWxzOiB0aGlzLndpdGhDcmVkZW50aWFscyB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3ByUmVjb3JkaW5nRmlsZURlc2NyT2JzZXJ2ZXIocmVjb3JkaW5nRmlsZUlkOiBzdHJpbmcgfCBudW1iZXIpOiBPYnNlcnZhYmxlPFNwclJlY29yZGluZ0ZpbGU+IHtcclxuXHJcbiAgICBsZXQgcmVjVXJsID0gdGhpcy5yZWNvRmlsZVVybChyZWNvcmRpbmdGaWxlSWQpO1xyXG4gICAgaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmFwaVR5cGUgPT09IEFwaVR5cGUuRklMRVMpIHtcclxuICAgICAgLy8gZm9yIGRldmVsb3BtZW50IGFuZCBkZW1vXHJcbiAgICAgIC8vIGFwcGVuZCBVVUlEIHRvIG1ha2UgcmVxdWVzdCBVUkwgdW5pcXVlIHRvIGF2b2lkIGxvY2FsaG9zdCBzZXJ2ZXIgY2FjaGluZ1xyXG4gICAgICByZWNVcmwgPSByZWNVcmwgKyAnLmpzb24/cmVxdWVzdFVVSUQ9JytVVUlELmdlbmVyYXRlKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxTcHJSZWNvcmRpbmdGaWxlPihyZWNVcmwseyB3aXRoQ3JlZGVudGlhbHM6IHRoaXMud2l0aENyZWRlbnRpYWxzIH0pO1xyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgZmV0Y2hTZXNzaW9uQXVkaW9maWxlQnlJZChwcm9qZWN0TmFtZTogc3RyaW5nLCBzZXNzSWQ6IHN0cmluZyB8IG51bWJlciwgcmVjb3JkaW5nRmlsZUlkOiBzdHJpbmcgfCBudW1iZXIpOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxBcnJheUJ1ZmZlcj4+IHtcclxuXHJcbiAgICBsZXQgcmVjVXJsID0gdGhpcy5yZWNvRmlsZVVybChyZWNvcmRpbmdGaWxlSWQpO1xyXG4gICAgLy8gaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmFwaVR5cGUgPT09IEFwaVR5cGUuRklMRVMpIHtcclxuICAgIC8vICAgLy8gZm9yIGRldmVsb3BtZW50IGFuZCBkZW1vXHJcbiAgICAvLyAgIC8vIGFwcGVuZCBVVUlEIHRvIG1ha2UgcmVxdWVzdCBVUkwgdW5pcXVlIHRvIGF2b2lkIGxvY2FsaG9zdCBzZXJ2ZXIgY2FjaGluZ1xyXG4gICAgLy8gICByZWNVcmwgPSByZWNVcmwgKyAnLndhdj9yZXF1ZXN0VVVJRD0nICsgVVVJRC5nZW5lcmF0ZSgpO1xyXG4gICAgLy8gfVxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQocmVjVXJsLCB7XHJcbiAgICAgIG9ic2VydmU6ICdyZXNwb25zZScsXHJcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJyxcclxuICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLndpdGhDcmVkZW50aWFsc1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8gVE9ETyB0ZXN0XHJcblxyXG4gIGZldGNoQW5kQXBwbHlSZWNvcmRpbmdGaWxlKGFDdHg6IEF1ZGlvQ29udGV4dCwgcmVjb3JkaW5nRmlsZTpTcHJSZWNvcmRpbmdGaWxlKTpPYnNlcnZhYmxlPFNwclJlY29yZGluZ0ZpbGV8bnVsbD4ge1xyXG5cclxuICAgIGxldCB3b2JzID0gbmV3IE9ic2VydmFibGU8U3ByUmVjb3JkaW5nRmlsZXxudWxsPihvYnNlcnZlcj0+e1xyXG4gICAgICBpZihyZWNvcmRpbmdGaWxlLnJlY29yZGluZ0ZpbGVJZCkge1xyXG4gICAgICAgIGxldCBvYnMgPSB0aGlzLmZldGNoQXVkaW9maWxlKHJlY29yZGluZ0ZpbGUucmVjb3JkaW5nRmlsZUlkKTtcclxuXHJcbiAgICAgICAgb2JzLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgICAvLyBEbyBub3QgdXNlIFByb21pc2UgdmVyc2lvbiwgd2hpY2ggZG9lcyBub3Qgd29yayB3aXRoIFNhZmFyaSAxM1xyXG4gICAgICAgICAgICAgIGlmKHJlc3AuYm9keSkge1xyXG4gICAgICAgICAgICAgICAgYUN0eC5kZWNvZGVBdWRpb0RhdGEocmVzcC5ib2R5LCBhYiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBhcz1uZXcgQXVkaW9CdWZmZXJTb3VyY2UoYWIpO1xyXG4gICAgICAgICAgICAgICAgICBSZWNvcmRpbmdGaWxlVXRpbHMuc2V0QXVkaW9EYXRhKHJlY29yZGluZ0ZpbGUsbmV3IEF1ZGlvRGF0YUhvbGRlcihhcykpO1xyXG4gICAgICAgICAgICAgICAgICBpZiAodGhpcy5kZWJ1Z0RlbGF5ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KHJlY29yZGluZ0ZpbGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLmRlYnVnRGVsYXkpO1xyXG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQocmVjb3JkaW5nRmlsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKCdSZWNlaXZlZCBubyBhdWRpbyBkYXRhIScpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT0gNDA0KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBJbnRlcnByZXQgbm90IGFzIGFuIGVycm9yLCB0aGUgZmlsZSBpc3Qgbm90IHJlY29yZGVkIHlldFxyXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChudWxsKTtcclxuICAgICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKClcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gYWxsIG90aGVyIHN0YXRlcyBhcmUgZXJyb3JzXHJcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIG9ic2VydmVyLmVycm9yKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB3b2JzO1xyXG4gIH1cclxuXHJcbiAgZmV0Y2hSZWNvcmRpbmdGaWxlKGFDdHg6IEF1ZGlvQ29udGV4dCwgcmVjb3JkaW5nRmlsZUlkOiBzdHJpbmcgfCBudW1iZXIpOiBPYnNlcnZhYmxlPFJlY29yZGluZ0ZpbGUgfCBudWxsPiB7XHJcblxyXG4gICAgbGV0IHdvYnMgPSBuZXcgT2JzZXJ2YWJsZTxSZWNvcmRpbmdGaWxlIHwgbnVsbD4ob2JzZXJ2ZXIgPT4ge1xyXG4gICAgICBsZXQgcmY6IFJlY29yZGluZ0ZpbGV8bnVsbCA9IG51bGw7XHJcbiAgICAgIGxldCByZkRlc2NyT2JzID0gdGhpcy5yZWNvcmRpbmdGaWxlRGVzY3JPYnNlcnZlcihyZWNvcmRpbmdGaWxlSWQpO1xyXG4gICAgICByZkRlc2NyT2JzLnN1YnNjcmliZSh2YWx1ZSA9PiB7XHJcbiAgICAgICAgcmYgPSB2YWx1ZTtcclxuICAgICAgfSwgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZXJyb3IpO1xyXG4gICAgICB9LCAoKSA9PiB7XHJcbiAgICAgICAgbGV0IHJmQXVkaW9PYnMgPSB0aGlzLmZldGNoQXVkaW9maWxlKHJlY29yZGluZ0ZpbGVJZCk7XHJcbiAgICAgICAgcmZBdWRpb09icy5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vIERvIG5vdCB1c2UgUHJvbWlzZSB2ZXJzaW9uLCB3aGljaCBkb2VzIG5vdCB3b3JrIHdpdGggU2FmYXJpIDEzXHJcbiAgICAgICAgICAgIGlmKHJlc3AuYm9keSkge1xyXG4gICAgICAgICAgICAgIGFDdHguZGVjb2RlQXVkaW9EYXRhKHJlc3AuYm9keSwgYWIgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYocmYpIHtcclxuICAgICAgICAgICAgICAgICAgbGV0IGFzPW5ldyBBdWRpb0J1ZmZlclNvdXJjZShhYik7XHJcbiAgICAgICAgICAgICAgICAgIFJlY29yZGluZ0ZpbGVVdGlscy5zZXRBdWRpb0RhdGEocmYsbmV3IEF1ZGlvRGF0YUhvbGRlcihhcykpO1xyXG4gICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKCdSZWNvcmRpbmcgZmlsZSBvYmplY3QgbnVsbCcpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVidWdEZWxheSA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQocmYpO1xyXG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgICAgICAgICAgIH0sIHRoaXMuZGVidWdEZWxheSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KHJmKTtcclxuICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcignUmVjZWl2ZWQgbm8gYXVkaW8gZGF0YScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09IDQwNCkge1xyXG4gICAgICAgICAgICAgIC8vIEludGVycHJldCBub3QgYXMgYW4gZXJyb3IsIHRoZSBmaWxlIGlzdCBub3QgcmVjb3JkZWQgeWV0XHJcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChudWxsKTtcclxuICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgLy8gYWxsIG90aGVyIHN0YXRlcyBhcmUgZXJyb3JzXHJcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gd29icztcclxuICB9XHJcblxyXG4gIGZldGNoU3ByUmVjb3JkaW5nRmlsZShhQ3R4OiBBdWRpb0NvbnRleHQsIHJlY29yZGluZ0ZpbGVJZDogc3RyaW5nIHwgbnVtYmVyKTogT2JzZXJ2YWJsZTxTcHJSZWNvcmRpbmdGaWxlIHwgbnVsbD4ge1xyXG5cclxuICAgIGxldCB3b2JzID0gbmV3IE9ic2VydmFibGU8U3ByUmVjb3JkaW5nRmlsZSB8IG51bGw+KG9ic2VydmVyID0+IHtcclxuICAgICAgbGV0IHJmOiBTcHJSZWNvcmRpbmdGaWxlfG51bGwgPSBudWxsO1xyXG4gICAgICBsZXQgcmZEZXNjck9icyA9IHRoaXMuc3ByUmVjb3JkaW5nRmlsZURlc2NyT2JzZXJ2ZXIocmVjb3JkaW5nRmlsZUlkKTtcclxuICAgICAgcmZEZXNjck9icy5zdWJzY3JpYmUodmFsdWUgPT4ge1xyXG4gICAgICAgIHJmID0gdmFsdWU7XHJcbiAgICAgIH0sIChlcnJvcikgPT4ge1xyXG4gICAgICAgIG9ic2VydmVyLmVycm9yKGVycm9yKTtcclxuICAgICAgfSwgKCkgPT4ge1xyXG4gICAgICAgIGxldCBzYW1wbGVDbnQ6bnVtYmVyfG51bGw9bnVsbDtcclxuICAgICAgICBpZihyZiAmJiByZi5jaGFubmVscyAmJiByZi5mcmFtZXMpe1xyXG4gICAgICAgICAgc2FtcGxlQ250PXJmLmNoYW5uZWxzKnJmLmZyYW1lcztcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVE9ETyB1c2UgZG93bmxvYWQgc3RvcmFnZSB0eXBlIGRlcGVuZGluZyBvbiBzYW1wbGUgY291bnQgb2YgZmlsZVxyXG4gICAgICAgIGlmKHJmICYmIHJmLnNhbXBsZXJhdGUgJiYgc2FtcGxlQ250IT1udWxsICYmIHNhbXBsZUNudD50aGlzLl9tYXhBdXRvTmV0TWVtU3RvcmVTYW1wbGVzKSB7XHJcbiAgICAgICAgICBjb25zdCBiYXNlVXJsPXRoaXMucmVjb0ZpbGVVcmwocmVjb3JkaW5nRmlsZUlkKTtcclxuICAgICAgICAgIGNvbnN0IG9iTmV0QWI9dGhpcy5jaHVua0F1ZGlvUmVxdWVzdFRvTmV0QXVkaW9CdWZmZXIoYUN0eCwgYmFzZVVybCwwLHJmPy5zYW1wbGVyYXRlLEJhc2ljUmVjb3JkaW5nU2VydmljZS5ERUZBVUxUX0NIVU5LRURfRE9XTkxPQURfU0VDT05EUyxyZi5mcmFtZXMpO1xyXG4gICAgICAgICAgb2JOZXRBYi5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBuZXh0OihuYWIpPT57XHJcbiAgICAgICAgICAgICAgICBsZXQgYWRoID0gbmV3IEF1ZGlvRGF0YUhvbGRlcihuYWIpO1xyXG4gICAgICAgICAgICAgICAgaWYocmYpIHtcclxuICAgICAgICAgICAgICAgICAgUmVjb3JkaW5nRmlsZVV0aWxzLnNldEF1ZGlvRGF0YShyZiwgYWRoKTtcclxuICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChyZik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBjb21wbGV0ZTooKT0+e1xyXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIGVycm9yOihlcnJvcik9PntcclxuICAgICAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT0gNDA0KSB7XHJcbiAgICAgICAgICAgICAgICAgIC8vIEludGVycHJldCBub3QgYXMgYW4gZXJyb3IsIHRoZSBmaWxlIGlzdCBub3QgcmVjb3JkZWQgeWV0XHJcbiAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQobnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKClcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIC8vIGFsbCBvdGhlciBzdGF0ZXMgYXJlIGVycm9yc1xyXG4gICAgICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1lbHNlIHtcclxuXHJcbiAgICAgICAgICBsZXQgcmZBdWRpb09icyA9IHRoaXMuZmV0Y2hBdWRpb2ZpbGUocmVjb3JkaW5nRmlsZUlkKTtcclxuICAgICAgICAgIHJmQXVkaW9PYnMuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAgIC8vIERvIG5vdCB1c2UgUHJvbWlzZSB2ZXJzaW9uLCB3aGljaCBkb2VzIG5vdCB3b3JrIHdpdGggU2FmYXJpIDEzXHJcbiAgICAgICAgICAgICAgaWYgKHJlc3AuYm9keSkge1xyXG4gICAgICAgICAgICAgICAgYUN0eC5kZWNvZGVBdWRpb0RhdGEocmVzcC5ib2R5LCBhYiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChyZikge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBhcyA9IG5ldyBBdWRpb0J1ZmZlclNvdXJjZShhYik7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFkaCA9IG5ldyBBdWRpb0RhdGFIb2xkZXIoYXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIFJlY29yZGluZ0ZpbGVVdGlscy5zZXRBdWRpb0RhdGEocmYsIGFkaCk7XHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoJ1JlY29yZGluZyBmaWxlIG9iamVjdCBudWxsJyk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVidWdEZWxheSA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KHJmKTtcclxuICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSwgdGhpcy5kZWJ1Z0RlbGF5KTtcclxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KHJmKTtcclxuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcignUmVjZWl2ZWQgbm8gYXVkaW8gZGF0YScpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT0gNDA0KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBJbnRlcnByZXQgbm90IGFzIGFuIGVycm9yLCB0aGUgZmlsZSBpc3Qgbm90IHJlY29yZGVkIHlldFxyXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChudWxsKTtcclxuICAgICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKClcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gYWxsIG90aGVyIHN0YXRlcyBhcmUgZXJyb3JzXHJcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB3b2JzO1xyXG4gIH1cclxuXHJcbiAgc2F2ZUVkaXRTZWxlY3Rpb24ocmVjb3JkaW5nRmlsZUlkOiBzdHJpbmcgfCBudW1iZXIsZWRpdFNhbXBsZVJhdGU6bnVtYmVyfG51bGwsZWRpdFN0YXJ0RnJhbWU6bnVtYmVyfG51bGwsZWRpdEVuZEZyYW1lOm51bWJlcnxudWxsKTogT2JzZXJ2YWJsZTxTcHJSZWNvcmRpbmdGaWxlIHwgbnVsbD4ge1xyXG4gICAgbGV0IHJlY1VybCA9IHRoaXMuYXBpRW5kUG9pbnQgKyBSZWNvcmRpbmdGaWxlU2VydmljZS5SRUNPRklMRV9BUElfQ1RYICsgJy8nICsgcmVjb3JkaW5nRmlsZUlkO1xyXG4gICAgaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmFwaVR5cGUgPT09IEFwaVR5cGUuRklMRVMpIHtcclxuICAgICAgLy8gZm9yIGRldmVsb3BtZW50IGFuZCBkZW1vXHJcbiAgICAgIC8vIGFwcGVuZCBVVUlEIHRvIG1ha2UgcmVxdWVzdCBVUkwgdW5pcXVlIHRvIGF2b2lkIGxvY2FsaG9zdCBzZXJ2ZXIgY2FjaGluZ1xyXG4gICAgICByZWNVcmwgPSByZWNVcmwgKyAnLmpzb24/cmVxdWVzdFVVSUQ9JytVVUlELmdlbmVyYXRlKCk7XHJcbiAgICB9XHJcbiAgICAvL2NvbnNvbGUubG9nKFwiUGF0aCByZXF1ZXN0IFVSTDogXCIrcmVjVXJsKVxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wYXRjaDxTcHJSZWNvcmRpbmdGaWxlPihyZWNVcmwse2VkaXRTYW1wbGVSYXRlOmVkaXRTYW1wbGVSYXRlLGVkaXRTdGFydEZyYW1lOmVkaXRTdGFydEZyYW1lLGVkaXRFbmRGcmFtZTplZGl0RW5kRnJhbWV9LHsgd2l0aENyZWRlbnRpYWxzOiB0aGlzLndpdGhDcmVkZW50aWFscyB9KTtcclxuICB9XHJcblxyXG59XHJcblxyXG5cclxuIl19
@@ -55,9 +55,9 @@ export class SessionService {
55
55
  }
56
56
  }
57
57
  SessionService.SESSION_API_CTX = 'session';
58
- SessionService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: SessionService, deps: [{ token: i1.HttpClient }, { token: SPEECHRECORDER_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable });
59
- SessionService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: SessionService });
60
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: SessionService, decorators: [{
58
+ SessionService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: SessionService, deps: [{ token: i1.HttpClient }, { token: SPEECHRECORDER_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable });
59
+ SessionService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: SessionService });
60
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: SessionService, decorators: [{
61
61
  type: Injectable
62
62
  }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.SpeechRecorderConfig, decorators: [{
63
63
  type: Inject,
@@ -13,8 +13,8 @@ export class SessionFinishedDialog {
13
13
  this.dialogRef.close();
14
14
  }
15
15
  }
16
- SessionFinishedDialog.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: SessionFinishedDialog, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component });
17
- SessionFinishedDialog.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: SessionFinishedDialog, selector: "spr-session-finished-dialog", ngImport: i0, template: `<h1 mat-dialog-title><mat-icon [style.color]="'green'">done_all</mat-icon> Session finished</h1>
16
+ SessionFinishedDialog.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: SessionFinishedDialog, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component });
17
+ SessionFinishedDialog.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: SessionFinishedDialog, selector: "spr-session-finished-dialog", ngImport: i0, template: `<h1 mat-dialog-title><mat-icon [style.color]="'green'">done_all</mat-icon> Session finished</h1>
18
18
  <div mat-dialog-content>
19
19
 
20
20
  <p>Thank you! The recording session is complete.</p>
@@ -23,8 +23,8 @@ SessionFinishedDialog.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0",
23
23
  <div mat-dialog-actions>
24
24
  <button mat-button (click)="closeDialog()">OK</button>
25
25
  </div>
26
- `, isInline: true, components: [{ type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i3.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], directives: [{ type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]" }] });
27
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: SessionFinishedDialog, decorators: [{
26
+ `, isInline: true, dependencies: [{ kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i3.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }] });
27
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: SessionFinishedDialog, decorators: [{
28
28
  type: Component,
29
29
  args: [{
30
30
  selector: 'spr-session-finished-dialog',