speechrecorderng 3.10.13 → 3.11.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 (99) hide show
  1. package/README.md +1 -1
  2. package/fesm2022/speechrecorderng.mjs +204 -201
  3. package/fesm2022/speechrecorderng.mjs.map +1 -1
  4. package/lib/audio/ui/audio_canvas_layer_comp.d.ts +2 -2
  5. package/lib/spr.module.version.d.ts +1 -1
  6. package/lib/ui/canvas_layer_comp.d.ts +1 -1
  7. package/lib/ui/responsive_component.d.ts +1 -1
  8. package/package.json +13 -15
  9. package/esm2022/lib/action/action.mjs +0 -73
  10. package/esm2022/lib/audio/array_audio_buffer.mjs +0 -164
  11. package/esm2022/lib/audio/array_audio_buffer_input_stream.mjs +0 -86
  12. package/esm2022/lib/audio/array_audio_buffer_random_access_stream.mjs +0 -16
  13. package/esm2022/lib/audio/audio_data_holder.mjs +0 -264
  14. package/esm2022/lib/audio/audio_display.mjs +0 -118
  15. package/esm2022/lib/audio/audio_player.mjs +0 -238
  16. package/esm2022/lib/audio/capture/capture.mjs +0 -855
  17. package/esm2022/lib/audio/context.mjs +0 -79
  18. package/esm2022/lib/audio/dsp/level_measure.mjs +0 -517
  19. package/esm2022/lib/audio/format.mjs +0 -20
  20. package/esm2022/lib/audio/impl/wavformat.mjs +0 -7
  21. package/esm2022/lib/audio/impl/wavreader.mjs +0 -144
  22. package/esm2022/lib/audio/impl/wavwriter.mjs +0 -191
  23. package/esm2022/lib/audio/inddb_audio_buffer.mjs +0 -508
  24. package/esm2022/lib/audio/io/stream.mjs +0 -59
  25. package/esm2022/lib/audio/net_audio_buffer.mjs +0 -293
  26. package/esm2022/lib/audio/persistor.mjs +0 -81
  27. package/esm2022/lib/audio/playback/array_audio_buffer_source_node.mjs +0 -126
  28. package/esm2022/lib/audio/playback/audio_source_node.mjs +0 -18
  29. package/esm2022/lib/audio/playback/audio_source_worklet_module_loader.mjs +0 -167
  30. package/esm2022/lib/audio/playback/inddb_audio_buffer_source_node.mjs +0 -167
  31. package/esm2022/lib/audio/playback/net_audio_buffer_source_node.mjs +0 -218
  32. package/esm2022/lib/audio/playback/player.mjs +0 -402
  33. package/esm2022/lib/audio/ui/audio_canvas_layer_comp.mjs +0 -347
  34. package/esm2022/lib/audio/ui/audio_display_control.mjs +0 -150
  35. package/esm2022/lib/audio/ui/audio_display_scroll_pane.mjs +0 -146
  36. package/esm2022/lib/audio/ui/audiosignal.mjs +0 -533
  37. package/esm2022/lib/audio/ui/common.mjs +0 -19
  38. package/esm2022/lib/audio/ui/container.mjs +0 -414
  39. package/esm2022/lib/audio/ui/livelevel.mjs +0 -361
  40. package/esm2022/lib/audio/ui/scroll_pane_horizontal.mjs +0 -11
  41. package/esm2022/lib/audio/ui/sonagram.mjs +0 -900
  42. package/esm2022/lib/db/inddb.mjs +0 -120
  43. package/esm2022/lib/dsp/utils.mjs +0 -48
  44. package/esm2022/lib/environment/environment.defaults.mjs +0 -9
  45. package/esm2022/lib/io/BinaryReader.mjs +0 -93
  46. package/esm2022/lib/io/BinaryWriter.mjs +0 -80
  47. package/esm2022/lib/io/stream.mjs +0 -259
  48. package/esm2022/lib/math/2d/geometry.mjs +0 -28
  49. package/esm2022/lib/math/complex.mjs +0 -58
  50. package/esm2022/lib/math/dft.mjs +0 -196
  51. package/esm2022/lib/media/utils.mjs +0 -14
  52. package/esm2022/lib/net/uploader.mjs +0 -367
  53. package/esm2022/lib/recorder_component.mjs +0 -65
  54. package/esm2022/lib/speechrecorder/project/project.mjs +0 -54
  55. package/esm2022/lib/speechrecorder/project/project.service.mjs +0 -64
  56. package/esm2022/lib/speechrecorder/recording.mjs +0 -124
  57. package/esm2022/lib/speechrecorder/recordings/basic_recording.service.mjs +0 -221
  58. package/esm2022/lib/speechrecorder/recordings/recordings.service.mjs +0 -1014
  59. package/esm2022/lib/speechrecorder/script/script.mjs +0 -114
  60. package/esm2022/lib/speechrecorder/script/script.service.mjs +0 -47
  61. package/esm2022/lib/speechrecorder/session/audiorecorder.mjs +0 -1179
  62. package/esm2022/lib/speechrecorder/session/basicrecorder.mjs +0 -676
  63. package/esm2022/lib/speechrecorder/session/controlpanel.mjs +0 -416
  64. package/esm2022/lib/speechrecorder/session/item.mjs +0 -30
  65. package/esm2022/lib/speechrecorder/session/progress.mjs +0 -135
  66. package/esm2022/lib/speechrecorder/session/prompting.mjs +0 -639
  67. package/esm2022/lib/speechrecorder/session/recorder_combi_pane.mjs +0 -88
  68. package/esm2022/lib/speechrecorder/session/recording_file_cache.mjs +0 -195
  69. package/esm2022/lib/speechrecorder/session/recording_list.mjs +0 -188
  70. package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +0 -128
  71. package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs +0 -114
  72. package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +0 -146
  73. package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +0 -424
  74. package/esm2022/lib/speechrecorder/session/recordingfile/recording-file.mjs +0 -68
  75. package/esm2022/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +0 -288
  76. package/esm2022/lib/speechrecorder/session/session.mjs +0 -2
  77. package/esm2022/lib/speechrecorder/session/session.service.mjs +0 -69
  78. package/esm2022/lib/speechrecorder/session/session_finished_dialog.mjs +0 -46
  79. package/esm2022/lib/speechrecorder/session/sessionmanager.mjs +0 -1385
  80. package/esm2022/lib/speechrecorder/session/warning_bar.mjs +0 -33
  81. package/esm2022/lib/speechrecorder/spruploader.mjs +0 -22
  82. package/esm2022/lib/speechrecorder/startstopsignal/startstopsignal.mjs +0 -2
  83. package/esm2022/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +0 -57
  84. package/esm2022/lib/speechrecorderng.component.mjs +0 -392
  85. package/esm2022/lib/speechrecorderng.module.mjs +0 -97
  86. package/esm2022/lib/spr.config.mjs +0 -27
  87. package/esm2022/lib/spr.module.version.mjs +0 -2
  88. package/esm2022/lib/ui/canvas_layer_comp.mjs +0 -38
  89. package/esm2022/lib/ui/intersection-observer.directive.mjs +0 -32
  90. package/esm2022/lib/ui/message_dialog.mjs +0 -51
  91. package/esm2022/lib/ui/recordingitem_display.mjs +0 -253
  92. package/esm2022/lib/ui/responsive_component.mjs +0 -24
  93. package/esm2022/lib/utils/scrollIntoViewToBottom.mjs +0 -23
  94. package/esm2022/lib/utils/ua-parser.mjs +0 -190
  95. package/esm2022/lib/utils/utils.mjs +0 -132
  96. package/esm2022/lib/utils/wake_lock.mjs +0 -114
  97. package/esm2022/lib/utils/wake_lock_media.mjs +0 -2
  98. package/esm2022/public-api.mjs +0 -35
  99. package/esm2022/speechrecorderng.mjs +0 -5
@@ -1,128 +0,0 @@
1
- import { Component, Input } from '@angular/core';
2
- import { RecordingFileUtil } from "./recording-file";
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "@angular/common";
5
- import * as i2 from "@angular/material/progress-spinner";
6
- import * as i3 from "@angular/material/card";
7
- export class RecordingFileMetaComponent {
8
- constructor() {
9
- this.sessionId = null;
10
- this._recordingFile = null;
11
- this.itemCode = null;
12
- this.uuid = null;
13
- this.stateLoading = false;
14
- }
15
- get recordingFile() {
16
- return this._recordingFile;
17
- }
18
- set recordingFile(recordingFile) {
19
- this._recordingFile = recordingFile;
20
- if (this._recordingFile) {
21
- this.itemCode = this._recordingFile.itemCode;
22
- if (!this.itemCode && this._recordingFile.recording?.itemcode) {
23
- this.itemCode = this._recordingFile.recording.itemcode;
24
- }
25
- if (this.itemCode) {
26
- this.uuid = null;
27
- //console.debug("SprRecordingFile: "+this.itemCode+ " UUID: "+this.uuid)
28
- }
29
- else {
30
- this.itemCode = null;
31
- this.uuid = this._recordingFile?.uuid;
32
- //console.debug("RecordingFile: "+this.itemCode+ " UUID: "+this.uuid)
33
- }
34
- }
35
- else {
36
- this.itemCode = null;
37
- this.uuid = null;
38
- }
39
- }
40
- recordingAsPlainText() {
41
- let t = null;
42
- if (this._recordingFile) {
43
- t = RecordingFileUtil.recordingAsPlainText(this._recordingFile);
44
- }
45
- return t;
46
- }
47
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: RecordingFileMetaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
48
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: RecordingFileMetaComponent, selector: "app-recording-file-meta", inputs: { sessionId: "sessionId", stateLoading: "stateLoading", recordingFile: "recordingFile" }, ngImport: i0, template: `
49
- <mat-card appearance="outlined">
50
- <mat-card-title>Recording file ID: {{recordingFile?.recordingFileId}}</mat-card-title>
51
- <mat-card-content>
52
- <mat-progress-spinner *ngIf="stateLoading" mode="indeterminate" [diameter]="20"></mat-progress-spinner>
53
- <table>
54
- <tr *ngIf="itemCode">
55
- <td>Itemcode:</td>
56
- <td>{{itemCode}}</td>
57
- </tr>
58
- <tr *ngIf="uuid && !itemCode">
59
- <td>UUID:</td>
60
- <td>{{uuid}}</td>
61
- </tr>
62
- <tr *ngIf="recordingFile?.startedDate">
63
- <td>Started:</td>
64
- <td>{{recordingFile?.startedDate}}</td>
65
- </tr>
66
- <tr *ngIf="!recordingFile?.startedDate && recordingFile?.date">
67
- <td>Date:</td>
68
- <td>{{recordingFile?.date}}</td>
69
- </tr>
70
- <tr *ngIf="itemCode">
71
- <td>Prompt:</td>
72
- <td>{{recordingAsPlainText()}}</td>
73
- </tr>
74
-
75
- <tr *ngIf="sessionId">
76
- <td>Session:</td>
77
- <td>{{sessionId}}</td>
78
- </tr>
79
- </table>
80
- </mat-card-content>
81
- </mat-card>
82
- `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i3.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i3.MatCardContent, selector: "mat-card-content" }, { kind: "directive", type: i3.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }] }); }
83
- }
84
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: RecordingFileMetaComponent, decorators: [{
85
- type: Component,
86
- args: [{ selector: 'app-recording-file-meta', template: `
87
- <mat-card appearance="outlined">
88
- <mat-card-title>Recording file ID: {{recordingFile?.recordingFileId}}</mat-card-title>
89
- <mat-card-content>
90
- <mat-progress-spinner *ngIf="stateLoading" mode="indeterminate" [diameter]="20"></mat-progress-spinner>
91
- <table>
92
- <tr *ngIf="itemCode">
93
- <td>Itemcode:</td>
94
- <td>{{itemCode}}</td>
95
- </tr>
96
- <tr *ngIf="uuid && !itemCode">
97
- <td>UUID:</td>
98
- <td>{{uuid}}</td>
99
- </tr>
100
- <tr *ngIf="recordingFile?.startedDate">
101
- <td>Started:</td>
102
- <td>{{recordingFile?.startedDate}}</td>
103
- </tr>
104
- <tr *ngIf="!recordingFile?.startedDate && recordingFile?.date">
105
- <td>Date:</td>
106
- <td>{{recordingFile?.date}}</td>
107
- </tr>
108
- <tr *ngIf="itemCode">
109
- <td>Prompt:</td>
110
- <td>{{recordingAsPlainText()}}</td>
111
- </tr>
112
-
113
- <tr *ngIf="sessionId">
114
- <td>Session:</td>
115
- <td>{{sessionId}}</td>
116
- </tr>
117
- </table>
118
- </mat-card-content>
119
- </mat-card>
120
- ` }]
121
- }], ctorParameters: () => [], propDecorators: { sessionId: [{
122
- type: Input
123
- }], stateLoading: [{
124
- type: Input
125
- }], recordingFile: [{
126
- type: Input
127
- }] } });
128
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkaW5nLWZpbGUtbWV0YS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvc3BlZWNocmVjb3JkZXIvc2Vzc2lvbi9yZWNvcmRpbmdmaWxlL3JlY29yZGluZy1maWxlLW1ldGEuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQy9DLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGtCQUFrQixDQUFDOzs7OztBQTBDbkQsTUFBTSxPQUFPLDBCQUEwQjtJQVNyQztRQU5TLGNBQVMsR0FBd0IsSUFBSSxDQUFDO1FBRXZDLG1CQUFjLEdBQXVCLElBQUksQ0FBQztRQWtDbEQsYUFBUSxHQUFhLElBQUksQ0FBQztRQUMxQixTQUFJLEdBQXVCLElBQUksQ0FBQztRQTlCOUIsSUFBSSxDQUFDLFlBQVksR0FBQyxLQUFLLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQUksYUFBYTtRQUNmLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBYSxhQUFhLENBQUMsYUFBbUM7UUFDNUQsSUFBSSxDQUFDLGNBQWMsR0FBQyxhQUFhLENBQUM7UUFDbEMsSUFBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQztZQUM3QyxJQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUMsQ0FBQztnQkFDNUQsSUFBSSxDQUFDLFFBQVEsR0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUM7WUFDdkQsQ0FBQztZQUNELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUVsQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztnQkFDakIsd0VBQXdFO1lBQzFFLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztnQkFDckIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQztnQkFDdEMscUVBQXFFO1lBQ3ZFLENBQUM7UUFDSCxDQUFDO2FBQUksQ0FBQztZQUNKLElBQUksQ0FBQyxRQUFRLEdBQUMsSUFBSSxDQUFDO1lBQ25CLElBQUksQ0FBQyxJQUFJLEdBQUMsSUFBSSxDQUFDO1FBQ2pCLENBQUM7SUFDSCxDQUFDO0lBS0Qsb0JBQW9CO1FBQ2xCLElBQUksQ0FBQyxHQUFDLElBQUksQ0FBQztRQUNYLElBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZCLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDbEUsQ0FBQztRQUNELE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQzsrR0FoRFUsMEJBQTBCO21HQUExQiwwQkFBMEIsaUtBckMzQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtDVDs7NEZBR1UsMEJBQTBCO2tCQXZDdEMsU0FBUzsrQkFDRSx5QkFBeUIsWUFDekI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQ1Q7d0RBTVEsU0FBUztzQkFBakIsS0FBSztnQkFJRyxZQUFZO3NCQUFwQixLQUFLO2dCQVVPLGFBQWE7c0JBQXpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgSW5wdXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1JlY29yZGluZ0ZpbGVVdGlsfSBmcm9tIFwiLi9yZWNvcmRpbmctZmlsZVwiO1xyXG5pbXBvcnQge1NwclJlY29yZGluZ0ZpbGV9IGZyb20gXCIuLi8uLi9yZWNvcmRpbmdcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLXJlY29yZGluZy1maWxlLW1ldGEnLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8bWF0LWNhcmQgYXBwZWFyYW5jZT1cIm91dGxpbmVkXCI+XHJcbiAgICAgIDxtYXQtY2FyZC10aXRsZT5SZWNvcmRpbmcgZmlsZSBJRDoge3tyZWNvcmRpbmdGaWxlPy5yZWNvcmRpbmdGaWxlSWR9fTwvbWF0LWNhcmQtdGl0bGU+XHJcbiAgICAgIDxtYXQtY2FyZC1jb250ZW50PlxyXG4gICAgICAgIDxtYXQtcHJvZ3Jlc3Mtc3Bpbm5lciAqbmdJZj1cInN0YXRlTG9hZGluZ1wiIG1vZGU9XCJpbmRldGVybWluYXRlXCIgW2RpYW1ldGVyXT1cIjIwXCI+PC9tYXQtcHJvZ3Jlc3Mtc3Bpbm5lcj5cclxuICAgICAgICA8dGFibGU+XHJcbiAgICAgICAgICA8dHIgKm5nSWY9XCJpdGVtQ29kZVwiPlxyXG4gICAgICAgICAgICA8dGQ+SXRlbWNvZGU6PC90ZD5cclxuICAgICAgICAgICAgPHRkPnt7aXRlbUNvZGV9fTwvdGQ+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgPHRyICpuZ0lmPVwidXVpZCAmJiAhaXRlbUNvZGVcIj5cclxuICAgICAgICAgICAgPHRkPlVVSUQ6PC90ZD5cclxuICAgICAgICAgICAgPHRkPnt7dXVpZH19PC90ZD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICA8dHIgKm5nSWY9XCJyZWNvcmRpbmdGaWxlPy5zdGFydGVkRGF0ZVwiPlxyXG4gICAgICAgICAgICA8dGQ+U3RhcnRlZDo8L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3tyZWNvcmRpbmdGaWxlPy5zdGFydGVkRGF0ZX19PC90ZD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICA8dHIgKm5nSWY9XCIhcmVjb3JkaW5nRmlsZT8uc3RhcnRlZERhdGUgJiYgcmVjb3JkaW5nRmlsZT8uZGF0ZVwiPlxyXG4gICAgICAgICAgICA8dGQ+RGF0ZTo8L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3tyZWNvcmRpbmdGaWxlPy5kYXRlfX08L3RkPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICAgIDx0ciAqbmdJZj1cIml0ZW1Db2RlXCI+XHJcbiAgICAgICAgICAgIDx0ZD5Qcm9tcHQ6PC90ZD5cclxuICAgICAgICAgICAgPHRkPnt7cmVjb3JkaW5nQXNQbGFpblRleHQoKX19PC90ZD5cclxuICAgICAgICAgIDwvdHI+XHJcblxyXG4gICAgICAgICAgPHRyICpuZ0lmPVwic2Vzc2lvbklkXCI+XHJcbiAgICAgICAgICAgIDx0ZD5TZXNzaW9uOjwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD57e3Nlc3Npb25JZH19PC90ZD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC90YWJsZT5cclxuICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxyXG4gICAgPC9tYXQtY2FyZD5cclxuICBgLFxyXG4gIHN0eWxlczogW11cclxufSlcclxuZXhwb3J0IGNsYXNzIFJlY29yZGluZ0ZpbGVNZXRhQ29tcG9uZW50e1xyXG5cclxuXHJcbiAgQElucHV0KCkgc2Vzc2lvbklkOnN0cmluZyB8IG51bWJlciB8IG51bGw9bnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBfcmVjb3JkaW5nRmlsZTpTcHJSZWNvcmRpbmdGaWxlfG51bGw9bnVsbDtcclxuXHJcbiAgQElucHV0KCkgc3RhdGVMb2FkaW5nOmJvb2xlYW47XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5zdGF0ZUxvYWRpbmc9ZmFsc2U7XHJcbiAgfVxyXG5cclxuICBnZXQgcmVjb3JkaW5nRmlsZSgpOiBTcHJSZWNvcmRpbmdGaWxlIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5fcmVjb3JkaW5nRmlsZTtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIHNldCByZWNvcmRpbmdGaWxlKHJlY29yZGluZ0ZpbGU6U3ByUmVjb3JkaW5nRmlsZXxudWxsKXtcclxuICAgIHRoaXMuX3JlY29yZGluZ0ZpbGU9cmVjb3JkaW5nRmlsZTtcclxuICAgIGlmKHRoaXMuX3JlY29yZGluZ0ZpbGUpIHtcclxuICAgICAgdGhpcy5pdGVtQ29kZSA9IHRoaXMuX3JlY29yZGluZ0ZpbGUuaXRlbUNvZGU7XHJcbiAgICAgIGlmKCF0aGlzLml0ZW1Db2RlICYmIHRoaXMuX3JlY29yZGluZ0ZpbGUucmVjb3JkaW5nPy5pdGVtY29kZSl7XHJcbiAgICAgICAgdGhpcy5pdGVtQ29kZT10aGlzLl9yZWNvcmRpbmdGaWxlLnJlY29yZGluZy5pdGVtY29kZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5pdGVtQ29kZSkge1xyXG5cclxuICAgICAgICB0aGlzLnV1aWQgPSBudWxsO1xyXG4gICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlNwclJlY29yZGluZ0ZpbGU6IFwiK3RoaXMuaXRlbUNvZGUrIFwiIFVVSUQ6IFwiK3RoaXMudXVpZClcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLml0ZW1Db2RlID0gbnVsbDtcclxuICAgICAgICB0aGlzLnV1aWQgPSB0aGlzLl9yZWNvcmRpbmdGaWxlPy51dWlkO1xyXG4gICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlJlY29yZGluZ0ZpbGU6IFwiK3RoaXMuaXRlbUNvZGUrIFwiIFVVSUQ6IFwiK3RoaXMudXVpZClcclxuICAgICAgfVxyXG4gICAgfWVsc2V7XHJcbiAgICAgIHRoaXMuaXRlbUNvZGU9bnVsbDtcclxuICAgICAgdGhpcy51dWlkPW51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpdGVtQ29kZTpzdHJpbmd8bnVsbD1udWxsO1xyXG4gIHV1aWQ6c3RyaW5nfG51bGx8dW5kZWZpbmVkPW51bGw7XHJcblxyXG4gIHJlY29yZGluZ0FzUGxhaW5UZXh0KCl7XHJcbiAgICBsZXQgdD1udWxsO1xyXG4gICAgaWYodGhpcy5fcmVjb3JkaW5nRmlsZSkge1xyXG4gICAgICB0ID0gUmVjb3JkaW5nRmlsZVV0aWwucmVjb3JkaW5nQXNQbGFpblRleHQodGhpcy5fcmVjb3JkaW5nRmlsZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdDtcclxuICB9XHJcbn1cclxuIl19
@@ -1,114 +0,0 @@
1
- import { Component, Input } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- import * as i1 from "@angular/common";
4
- import * as i2 from "@angular/material/icon";
5
- import * as i3 from "@angular/material/progress-spinner";
6
- import * as i4 from "@angular/material/tooltip";
7
- export class RecordingFileNaviComponent {
8
- constructor() {
9
- this.versions = null;
10
- this.version = null;
11
- this.naviInfoLoading = false;
12
- }
13
- ngOnInit() {
14
- }
15
- selectVersionChange(ev) {
16
- //console.debug("Change event: "+ev.target.value+ ", as Nr: "+versionNr);
17
- const selEl = ev.target;
18
- let versionNr = parseInt(selEl.value);
19
- if (this.selectVersion) {
20
- this.selectVersion.perform(versionNr);
21
- }
22
- }
23
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: RecordingFileNaviComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: RecordingFileNaviComponent, selector: "app-recording-file-navi", inputs: { firstAction: "firstAction", prevAction: "prevAction", nextAction: "nextAction", lastAction: "lastAction", items: "items", itemPos: "itemPos", selectVersion: "selectVersion", versions: "versions", version: "version", naviInfoLoading: "naviInfoLoading" }, ngImport: i0, template: `
25
- <div #controlPanel style="display:flex;flex-direction: row;">
26
- <div #navi style="flex: 0;display:flex;flex-direction: row;flex-wrap: nowrap">
27
- <fieldset>
28
- <legend>Versions</legend>
29
- <mat-progress-spinner *ngIf="naviInfoLoading" mode="indeterminate" [diameter]="15"></mat-progress-spinner>
30
- <select *ngIf="!naviInfoLoading" [disabled]="versions==null || versions.length==1" (change)="selectVersionChange($event)">
31
- <option *ngFor="let v of versions; let i = index" [selected]="v===version" value="{{v}}">{{v}}<ng-container *ngIf="i==0"> (latest)</ng-container></option>
32
- </select>
33
- </fieldset>
34
- <fieldset>
35
- <legend>Navigate</legend>
36
- <mat-progress-spinner *ngIf="naviInfoLoading" mode="indeterminate" [diameter]="15"></mat-progress-spinner>
37
- <div *ngIf="!naviInfoLoading" style="flex: 0;display:flex;flex-direction: row;flex-wrap: nowrap">
38
- <button (click)="firstAction?.perform()" [disabled]="!firstAction || firstAction.disabled" matTooltip="First recording file">
39
- <mat-icon>first_page</mat-icon>
40
- </button>
41
- <button (click)="prevAction?.perform()" [disabled]="!prevAction || prevAction.disabled" matTooltip="Previous recording file">
42
- <mat-icon>chevron_left</mat-icon>
43
- </button>
44
- <button (click)="nextAction?.perform()" [disabled]="!nextAction || nextAction.disabled" matTooltip="Next recording file">
45
- <mat-icon>chevron_right</mat-icon>
46
- </button>
47
- <button (click)="lastAction?.perform()" [disabled]="!lastAction || lastAction.disabled" matTooltip="Last recording file">
48
- <mat-icon>last_page</mat-icon>
49
- </button>
50
- </div>
51
- <p *ngIf="items && itemPos!==null && itemPos!==undefined">Item {{itemPos+1}} of {{items}}</p>
52
- <p>(List ordered by date)</p>
53
- </fieldset>
54
- </div>
55
- </div>
56
- `, isInline: true, styles: [":host{flex:0}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i3.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] }); }
57
- }
58
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: RecordingFileNaviComponent, decorators: [{
59
- type: Component,
60
- args: [{ selector: 'app-recording-file-navi', template: `
61
- <div #controlPanel style="display:flex;flex-direction: row;">
62
- <div #navi style="flex: 0;display:flex;flex-direction: row;flex-wrap: nowrap">
63
- <fieldset>
64
- <legend>Versions</legend>
65
- <mat-progress-spinner *ngIf="naviInfoLoading" mode="indeterminate" [diameter]="15"></mat-progress-spinner>
66
- <select *ngIf="!naviInfoLoading" [disabled]="versions==null || versions.length==1" (change)="selectVersionChange($event)">
67
- <option *ngFor="let v of versions; let i = index" [selected]="v===version" value="{{v}}">{{v}}<ng-container *ngIf="i==0"> (latest)</ng-container></option>
68
- </select>
69
- </fieldset>
70
- <fieldset>
71
- <legend>Navigate</legend>
72
- <mat-progress-spinner *ngIf="naviInfoLoading" mode="indeterminate" [diameter]="15"></mat-progress-spinner>
73
- <div *ngIf="!naviInfoLoading" style="flex: 0;display:flex;flex-direction: row;flex-wrap: nowrap">
74
- <button (click)="firstAction?.perform()" [disabled]="!firstAction || firstAction.disabled" matTooltip="First recording file">
75
- <mat-icon>first_page</mat-icon>
76
- </button>
77
- <button (click)="prevAction?.perform()" [disabled]="!prevAction || prevAction.disabled" matTooltip="Previous recording file">
78
- <mat-icon>chevron_left</mat-icon>
79
- </button>
80
- <button (click)="nextAction?.perform()" [disabled]="!nextAction || nextAction.disabled" matTooltip="Next recording file">
81
- <mat-icon>chevron_right</mat-icon>
82
- </button>
83
- <button (click)="lastAction?.perform()" [disabled]="!lastAction || lastAction.disabled" matTooltip="Last recording file">
84
- <mat-icon>last_page</mat-icon>
85
- </button>
86
- </div>
87
- <p *ngIf="items && itemPos!==null && itemPos!==undefined">Item {{itemPos+1}} of {{items}}</p>
88
- <p>(List ordered by date)</p>
89
- </fieldset>
90
- </div>
91
- </div>
92
- `, styles: [":host{flex:0}\n"] }]
93
- }], ctorParameters: () => [], propDecorators: { firstAction: [{
94
- type: Input
95
- }], prevAction: [{
96
- type: Input
97
- }], nextAction: [{
98
- type: Input
99
- }], lastAction: [{
100
- type: Input
101
- }], items: [{
102
- type: Input
103
- }], itemPos: [{
104
- type: Input
105
- }], selectVersion: [{
106
- type: Input
107
- }], versions: [{
108
- type: Input
109
- }], version: [{
110
- type: Input
111
- }], naviInfoLoading: [{
112
- type: Input
113
- }] } });
114
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkaW5nLWZpbGUtbmF2aS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvc3BlZWNocmVjb3JkZXIvc2Vzc2lvbi9yZWNvcmRpbmdmaWxlL3JlY29yZGluZy1maWxlLW5hdmkuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFTLE1BQU0sZUFBZSxDQUFDOzs7Ozs7QUE0Q3ZELE1BQU0sT0FBTywwQkFBMEI7SUFhckM7UUFMUyxhQUFRLEdBQXFCLElBQUksQ0FBQztRQUNsQyxZQUFPLEdBQWMsSUFBSSxDQUFDO1FBSy9CLElBQUksQ0FBQyxlQUFlLEdBQUMsS0FBSyxDQUFDO0lBQy9CLENBQUM7SUFFRCxRQUFRO0lBRVIsQ0FBQztJQUVELG1CQUFtQixDQUFDLEVBQVE7UUFDMUIseUVBQXlFO1FBRXZFLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxNQUEyQixDQUFDO1FBQzdDLElBQUksU0FBUyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEMsSUFBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDeEMsQ0FBQztJQUNMLENBQUM7K0dBN0JVLDBCQUEwQjttR0FBMUIsMEJBQTBCLHVVQXZDM0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1dBZ0NEOzs0RkFPRSwwQkFBMEI7a0JBekN0QyxTQUFTOytCQUNFLHlCQUF5QixZQUN6Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7V0FnQ0Q7d0RBUUEsV0FBVztzQkFBbkIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBRUcsZUFBZTtzQkFBdkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBJbnB1dCwgT25Jbml0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtBY3Rpb259IGZyb20gXCIuLi8uLi8uLi9hY3Rpb24vYWN0aW9uXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1yZWNvcmRpbmctZmlsZS1uYXZpJyxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgICAgIDxkaXYgI2NvbnRyb2xQYW5lbCBzdHlsZT1cImRpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjogcm93O1wiPlxyXG4gICAgICAgICAgPGRpdiAjbmF2aSBzdHlsZT1cImZsZXg6IDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOiByb3c7ZmxleC13cmFwOiBub3dyYXBcIj5cclxuICAgICAgICAgICAgPGZpZWxkc2V0PlxyXG4gICAgICAgICAgICAgIDxsZWdlbmQ+VmVyc2lvbnM8L2xlZ2VuZD5cclxuICAgICAgICAgICAgICA8bWF0LXByb2dyZXNzLXNwaW5uZXIgKm5nSWY9XCJuYXZpSW5mb0xvYWRpbmdcIiBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiIFtkaWFtZXRlcl09XCIxNVwiPjwvbWF0LXByb2dyZXNzLXNwaW5uZXI+XHJcbiAgICAgICAgICAgICAgICA8c2VsZWN0ICpuZ0lmPVwiIW5hdmlJbmZvTG9hZGluZ1wiIFtkaXNhYmxlZF09XCJ2ZXJzaW9ucz09bnVsbCB8fCB2ZXJzaW9ucy5sZW5ndGg9PTFcIiAoY2hhbmdlKT1cInNlbGVjdFZlcnNpb25DaGFuZ2UoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCB2IG9mIHZlcnNpb25zOyBsZXQgaSA9IGluZGV4XCIgW3NlbGVjdGVkXT1cInY9PT12ZXJzaW9uXCIgdmFsdWU9XCJ7e3Z9fVwiPnt7dn19PG5nLWNvbnRhaW5lciAqbmdJZj1cImk9PTBcIj4gKGxhdGVzdCk8L25nLWNvbnRhaW5lcj48L29wdGlvbj5cclxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICA8L2ZpZWxkc2V0PlxyXG4gICAgICAgICAgICA8ZmllbGRzZXQ+XHJcbiAgICAgICAgICAgICAgPGxlZ2VuZD5OYXZpZ2F0ZTwvbGVnZW5kPlxyXG4gICAgICAgICAgICAgIDxtYXQtcHJvZ3Jlc3Mtc3Bpbm5lciAqbmdJZj1cIm5hdmlJbmZvTG9hZGluZ1wiIG1vZGU9XCJpbmRldGVybWluYXRlXCIgW2RpYW1ldGVyXT1cIjE1XCI+PC9tYXQtcHJvZ3Jlc3Mtc3Bpbm5lcj5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIW5hdmlJbmZvTG9hZGluZ1wiICBzdHlsZT1cImZsZXg6IDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOiByb3c7ZmxleC13cmFwOiBub3dyYXBcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cImZpcnN0QWN0aW9uPy5wZXJmb3JtKClcIiBbZGlzYWJsZWRdPVwiIWZpcnN0QWN0aW9uIHx8IGZpcnN0QWN0aW9uLmRpc2FibGVkXCIgbWF0VG9vbHRpcD1cIkZpcnN0IHJlY29yZGluZyBmaWxlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5maXJzdF9wYWdlPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwicHJldkFjdGlvbj8ucGVyZm9ybSgpXCIgW2Rpc2FibGVkXT1cIiFwcmV2QWN0aW9uIHx8IHByZXZBY3Rpb24uZGlzYWJsZWRcIiBtYXRUb29sdGlwPVwiUHJldmlvdXMgcmVjb3JkaW5nIGZpbGVcIj5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNoZXZyb25fbGVmdDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cIm5leHRBY3Rpb24/LnBlcmZvcm0oKVwiIFtkaXNhYmxlZF09XCIhbmV4dEFjdGlvbiB8fCBuZXh0QWN0aW9uLmRpc2FibGVkXCIgbWF0VG9vbHRpcD1cIk5leHQgcmVjb3JkaW5nIGZpbGVcIj5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNoZXZyb25fcmlnaHQ8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJsYXN0QWN0aW9uPy5wZXJmb3JtKClcIiBbZGlzYWJsZWRdPVwiIWxhc3RBY3Rpb24gfHwgbGFzdEFjdGlvbi5kaXNhYmxlZFwiIG1hdFRvb2x0aXA9XCJMYXN0IHJlY29yZGluZyBmaWxlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5sYXN0X3BhZ2U8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPHAgKm5nSWY9XCJpdGVtcyAmJiBpdGVtUG9zIT09bnVsbCAmJiBpdGVtUG9zIT09dW5kZWZpbmVkXCI+SXRlbSB7e2l0ZW1Qb3MrMX19IG9mIHt7aXRlbXN9fTwvcD5cclxuICAgICAgICAgICAgICA8cD4oTGlzdCBvcmRlcmVkIGJ5IGRhdGUpPC9wPlxyXG4gICAgICAgICAgICA8L2ZpZWxkc2V0PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICBgLFxyXG4gIHN0eWxlczogW1xyXG4gICAgYDpob3N0IHtcclxuICAgICAgICAgICAgIGZsZXg6IDA7XHJcbiAgICAgXHJcbiAgICAgICAgICAgfWBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSZWNvcmRpbmdGaWxlTmF2aUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQElucHV0KCkgZmlyc3RBY3Rpb246IEFjdGlvbjx2b2lkPnx1bmRlZmluZWQ7XHJcbiAgQElucHV0KCkgcHJldkFjdGlvbjogQWN0aW9uPHZvaWQ+fHVuZGVmaW5lZDtcclxuICBASW5wdXQoKSBuZXh0QWN0aW9uOiBBY3Rpb248dm9pZD58dW5kZWZpbmVkO1xyXG4gIEBJbnB1dCgpIGxhc3RBY3Rpb246IEFjdGlvbjx2b2lkPnx1bmRlZmluZWQ7XHJcbiAgQElucHV0KCkgaXRlbXM6bnVtYmVyIHwgbnVsbHx1bmRlZmluZWQ7XHJcbiAgQElucHV0KCkgaXRlbVBvczpudW1iZXIgfCBudWxsfHVuZGVmaW5lZDtcclxuICBASW5wdXQoKSBzZWxlY3RWZXJzaW9uOiBBY3Rpb248bnVtYmVyPnx1bmRlZmluZWQ7XHJcbiAgQElucHV0KCkgdmVyc2lvbnM6IEFycmF5PG51bWJlcj58bnVsbD1udWxsO1xyXG4gIEBJbnB1dCgpIHZlcnNpb246IG51bWJlcnxudWxsPW51bGw7XHJcblxyXG4gIEBJbnB1dCgpIG5hdmlJbmZvTG9hZGluZztcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgIHRoaXMubmF2aUluZm9Mb2FkaW5nPWZhbHNlO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcblxyXG4gIH1cclxuXHJcbiAgc2VsZWN0VmVyc2lvbkNoYW5nZShldjpFdmVudCl7XHJcbiAgICAvL2NvbnNvbGUuZGVidWcoXCJDaGFuZ2UgZXZlbnQ6IFwiK2V2LnRhcmdldC52YWx1ZSsgXCIsIGFzIE5yOiBcIit2ZXJzaW9uTnIpO1xyXG5cclxuICAgICAgY29uc3Qgc2VsRWwgPSBldi50YXJnZXQgYXMgSFRNTFNlbGVjdEVsZW1lbnQ7XHJcbiAgICAgIGxldCB2ZXJzaW9uTnIgPSBwYXJzZUludChzZWxFbC52YWx1ZSk7XHJcbiAgICAgIGlmKHRoaXMuc2VsZWN0VmVyc2lvbikge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0VmVyc2lvbi5wZXJmb3JtKHZlcnNpb25Ocik7XHJcbiAgICAgIH1cclxuICB9XHJcblxyXG59XHJcbiJdfQ==
@@ -1,146 +0,0 @@
1
- import { Component } from '@angular/core';
2
- import { MessageDialog } from "../../../ui/message_dialog";
3
- import { RecordingFileViewComponent } from "./recording-file-view.component";
4
- import { ErrorHelper } from "../../../utils/utils";
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "./recordingfile-service";
7
- import * as i2 from "../../recordings/recordings.service";
8
- import * as i3 from "../session.service";
9
- import * as i4 from "@angular/router";
10
- import * as i5 from "@angular/material/dialog";
11
- import * as i6 from "@angular/material/snack-bar";
12
- import * as i7 from "@angular/material/button";
13
- import * as i8 from "../../../audio/ui/audio_display_scroll_pane";
14
- import * as i9 from "../../../audio/ui/audio_display_control";
15
- import * as i10 from "./recording-file-navi.component";
16
- import * as i11 from "./recording-file-meta.component";
17
- export class RecordingFileUI extends RecordingFileViewComponent {
18
- constructor(recordingFileService, recordingService, sessionService, router, route, ref, eRef, dialog, snackBar) {
19
- super(recordingFileService, recordingService, sessionService, router, route, ref, eRef, dialog);
20
- this.recordingFileService = recordingFileService;
21
- this.recordingService = recordingService;
22
- this.sessionService = sessionService;
23
- this.router = router;
24
- this.route = route;
25
- this.ref = ref;
26
- this.eRef = eRef;
27
- this.dialog = dialog;
28
- this.snackBar = snackBar;
29
- this.savedEditSelection = null;
30
- this.editSaved = true;
31
- this.parentE = this.eRef.nativeElement;
32
- }
33
- ngAfterViewInit() {
34
- super.ngAfterViewInit();
35
- }
36
- applyButtonText() {
37
- if (this.audioClip) {
38
- let s = this.audioClip.selection;
39
- if (s) {
40
- return "Apply current selection as editing selection";
41
- }
42
- else {
43
- return "Cancel out editing selection";
44
- }
45
- }
46
- // just as fallback
47
- return "Apply selection";
48
- }
49
- loadRecFile(rfId) {
50
- this.editSaved = true;
51
- super.loadRecFile(rfId);
52
- }
53
- loadedRecfile() {
54
- super.loadedRecfile();
55
- if (this.audioClip) {
56
- this.audioClip.addSelectionObserver((clip) => {
57
- let s = clip.selection;
58
- this.editSaved = ((this.savedEditSelection == null && s == null) || this.savedEditSelection != null && this.savedEditSelection.equals(s));
59
- });
60
- }
61
- this.savedEditSelection = this.audioClip ? this.audioClip.selection : null;
62
- this.editSaved = true;
63
- }
64
- applySelection() {
65
- if (this.audioClip) {
66
- let ab = this.audioClip.audioDataHolder;
67
- let s = this.audioClip.selection;
68
- if (ab && this.recordingFile?.recordingFileId) {
69
- let sr = null;
70
- let sf = null;
71
- let ef = null;
72
- if (s) {
73
- sr = ab.sampleRate;
74
- sf = s.startFrame;
75
- ef = s.endFrame;
76
- }
77
- this.recordingFileService.saveEditSelection(this.recordingFile.recordingFileId, sr, sf, ef).subscribe({
78
- next: () => { },
79
- error: (err) => {
80
- const errMsg = ErrorHelper.message('Could not save edit selection to server', err);
81
- this.dialog.open(MessageDialog, {
82
- data: {
83
- type: 'error',
84
- title: 'Save selection edit error',
85
- msg: errMsg,
86
- advice: "Please check network connection and server state."
87
- }
88
- });
89
- }, complete: () => {
90
- // Or use returned selection value from server?
91
- this.savedEditSelection = s;
92
- this.editSaved = true;
93
- this.snackBar.open('Selection edit saved successfully.', 'OK', { duration: 1500 });
94
- }
95
- });
96
- }
97
- }
98
- }
99
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: RecordingFileUI, deps: [{ token: i1.RecordingFileService }, { token: i2.RecordingService }, { token: i3.SessionService }, { token: i4.Router }, { token: i4.ActivatedRoute }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i5.MatDialog }, { token: i6.MatSnackBar }], target: i0.ɵɵFactoryTarget.Component }); }
100
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: RecordingFileUI, selector: "app-audiodisplayplayer", usesInheritance: true, ngImport: i0, template: `
101
- <h1>Recording file editing</h1>
102
- <p>On export or delivery the editing selection of the recording file is cut out. If no editing selection is applied the original file is exported.</p>
103
-
104
- <audio-display-scroll-pane #audioDisplayScrollPane></audio-display-scroll-pane>
105
- <div class="ctrlview">
106
- <app-recording-file-meta [sessionId]="sessionId" [recordingFile]="recordingFile" [stateLoading]="audioFetching"></app-recording-file-meta>
107
- <audio-display-control [audioClip]="audioClip"
108
- [playStartAction]="playStartAction"
109
- [playSelectionAction]="playSelectionAction"
110
- [playStopAction]="playStopAction"
111
- [autoPlayOnSelectToggleAction]="ap?.autoPlayOnSelectToggleAction"
112
- [zoomInAction]="zoomInAction"
113
- [zoomOutAction]="zoomOutAction"
114
- [zoomSelectedAction]="zoomSelectedAction"
115
- [zoomFitToPanelAction]="zoomFitToPanelAction"></audio-display-control>
116
- <app-recording-file-navi [items]="availRecFiles?.length" [itemPos]="posInList" [version]="recordingFileVersion" [versions]="versions" [firstAction]="firstAction" [prevAction]="prevAction" [nextAction]="nextAction" [lastAction]="lastAction" [selectVersion]="toVersionAction" [naviInfoLoading]="naviInfoLoading"></app-recording-file-navi>
117
- </div>
118
-
119
- <button mat-raised-button color="accent" (click)="applySelection()" [disabled]="editSaved">{{this.applyButtonText()}}</button>
120
- `, isInline: true, styles: [":host{flex:2;display:flex;flex-direction:column;min-height:0;overflow:hidden;padding:20px;z-index:5;box-sizing:border-box;background-color:#fff}\n", ".ctrlview{display:flex;flex-direction:row}\n", "audio-display-control{flex:3}\n"], dependencies: [{ kind: "component", type: i7.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i8.AudioDisplayScrollPane, selector: "audio-display-scroll-pane", inputs: ["audioClip"], outputs: ["zoomInAction", "zoomOutAction", "zoomSelectedAction", "zoomFitToPanelAction"] }, { kind: "component", type: i9.AudioDisplayControl, selector: "audio-display-control", inputs: ["audioClip", "playStartAction", "playSelectionAction", "playStopAction", "zoomInAction", "zoomOutAction", "zoomFitToPanelAction", "zoomSelectedAction", "autoPlayOnSelectToggleAction"] }, { kind: "component", type: i10.RecordingFileNaviComponent, selector: "app-recording-file-navi", inputs: ["firstAction", "prevAction", "nextAction", "lastAction", "items", "itemPos", "selectVersion", "versions", "version", "naviInfoLoading"] }, { kind: "component", type: i11.RecordingFileMetaComponent, selector: "app-recording-file-meta", inputs: ["sessionId", "stateLoading", "recordingFile"] }] }); }
121
- }
122
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: RecordingFileUI, decorators: [{
123
- type: Component,
124
- args: [{ selector: 'app-audiodisplayplayer', template: `
125
- <h1>Recording file editing</h1>
126
- <p>On export or delivery the editing selection of the recording file is cut out. If no editing selection is applied the original file is exported.</p>
127
-
128
- <audio-display-scroll-pane #audioDisplayScrollPane></audio-display-scroll-pane>
129
- <div class="ctrlview">
130
- <app-recording-file-meta [sessionId]="sessionId" [recordingFile]="recordingFile" [stateLoading]="audioFetching"></app-recording-file-meta>
131
- <audio-display-control [audioClip]="audioClip"
132
- [playStartAction]="playStartAction"
133
- [playSelectionAction]="playSelectionAction"
134
- [playStopAction]="playStopAction"
135
- [autoPlayOnSelectToggleAction]="ap?.autoPlayOnSelectToggleAction"
136
- [zoomInAction]="zoomInAction"
137
- [zoomOutAction]="zoomOutAction"
138
- [zoomSelectedAction]="zoomSelectedAction"
139
- [zoomFitToPanelAction]="zoomFitToPanelAction"></audio-display-control>
140
- <app-recording-file-navi [items]="availRecFiles?.length" [itemPos]="posInList" [version]="recordingFileVersion" [versions]="versions" [firstAction]="firstAction" [prevAction]="prevAction" [nextAction]="nextAction" [lastAction]="lastAction" [selectVersion]="toVersionAction" [naviInfoLoading]="naviInfoLoading"></app-recording-file-navi>
141
- </div>
142
-
143
- <button mat-raised-button color="accent" (click)="applySelection()" [disabled]="editSaved">{{this.applyButtonText()}}</button>
144
- `, styles: [":host{flex:2;display:flex;flex-direction:column;min-height:0;overflow:hidden;padding:20px;z-index:5;box-sizing:border-box;background-color:#fff}\n", ".ctrlview{display:flex;flex-direction:row}\n", "audio-display-control{flex:3}\n"] }]
145
- }], ctorParameters: () => [{ type: i1.RecordingFileService }, { type: i2.RecordingService }, { type: i3.SessionService }, { type: i4.Router }, { type: i4.ActivatedRoute }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i5.MatDialog }, { type: i6.MatSnackBar }] });
146
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkaW5nLWZpbGUtdS1pLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwZWVjaHJlY29yZGVybmcvc3JjL2xpYi9zcGVlY2hyZWNvcmRlci9zZXNzaW9uL3JlY29yZGluZ2ZpbGUvcmVjb3JkaW5nLWZpbGUtdS1pLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUlWLE1BQU0sZUFBZSxDQUFBO0FBT3RCLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUN6RCxPQUFPLEVBQUMsMEJBQTBCLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUkzRSxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sc0JBQXNCLENBQUM7Ozs7Ozs7Ozs7Ozs7QUFtRGpELE1BQU0sT0FBTyxlQUFnQixTQUFRLDBCQUEwQjtJQUs3RCxZQUFzQixvQkFBeUMsRUFBVyxnQkFBaUMsRUFBVyxjQUE2QixFQUFXLE1BQWEsRUFBVyxLQUFxQixFQUFZLEdBQXNCLEVBQVcsSUFBZSxFQUFZLE1BQWdCLEVBQVMsUUFBcUI7UUFDL1QsS0FBSyxDQUFDLG9CQUFvQixFQUFDLGdCQUFnQixFQUFDLGNBQWMsRUFBQyxNQUFNLEVBQUMsS0FBSyxFQUFDLEdBQUcsRUFBQyxJQUFJLEVBQUMsTUFBTSxDQUFDLENBQUE7UUFEcEUseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFxQjtRQUFXLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBaUI7UUFBVyxtQkFBYyxHQUFkLGNBQWMsQ0FBZTtRQUFXLFdBQU0sR0FBTixNQUFNLENBQU87UUFBVyxVQUFLLEdBQUwsS0FBSyxDQUFnQjtRQUFZLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQVcsU0FBSSxHQUFKLElBQUksQ0FBVztRQUFZLFdBQU0sR0FBTixNQUFNLENBQVU7UUFBUyxhQUFRLEdBQVIsUUFBUSxDQUFhO1FBSGpVLHVCQUFrQixHQUFnQixJQUFJLENBQUM7UUFDdkMsY0FBUyxHQUFTLElBQUksQ0FBQTtRQUlwQixJQUFJLENBQUMsT0FBTyxHQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBRXZDLENBQUM7SUFFRCxlQUFlO1FBQ2IsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFBO0lBQ3pCLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUE7WUFDaEMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDTixPQUFPLDhDQUE4QyxDQUFDO1lBQ3hELENBQUM7aUJBQUksQ0FBQztnQkFDSixPQUFPLDhCQUE4QixDQUFDO1lBQ3hDLENBQUM7UUFDSCxDQUFDO1FBQ0QsbUJBQW1CO1FBQ25CLE9BQU8saUJBQWlCLENBQUM7SUFDM0IsQ0FBQztJQUVTLFdBQVcsQ0FBQyxJQUFvQjtRQUN4QyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFTyxhQUFhO1FBQ3JCLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN0QixJQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsU0FBUyxDQUFDLG9CQUFvQixDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQzNDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUE7Z0JBQ3RCLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQzNJLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFBLENBQUMsQ0FBQSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQSxDQUFDLENBQUEsSUFBSSxDQUFDO1FBQ3ZFLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFBO0lBQ3ZCLENBQUM7SUFFQyxjQUFjO1FBQ1osSUFBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbEIsSUFBSSxFQUFFLEdBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUM7WUFDdEMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUE7WUFDaEMsSUFBSSxFQUFFLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxlQUFlLEVBQUUsQ0FBQztnQkFFOUMsSUFBSSxFQUFFLEdBQUUsSUFBSSxDQUFDO2dCQUNiLElBQUksRUFBRSxHQUFDLElBQUksQ0FBQztnQkFDWixJQUFJLEVBQUUsR0FBQyxJQUFJLENBQUM7Z0JBQ1osSUFBRyxDQUFDLEVBQUUsQ0FBQztvQkFDTCxFQUFFLEdBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQztvQkFDbEIsRUFBRSxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUM7b0JBQ2xCLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDO2dCQUNsQixDQUFDO2dCQUNELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FDbkc7b0JBQ0UsSUFBSSxFQUFDLEdBQUcsRUFBRSxHQUFFLENBQUM7b0JBQ1gsS0FBSyxFQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7d0JBRWQsTUFBTSxNQUFNLEdBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyx5Q0FBeUMsRUFBQyxHQUFHLENBQUMsQ0FBQzt3QkFDaEYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFOzRCQUU5QixJQUFJLEVBQUU7Z0NBQ0osSUFBSSxFQUFFLE9BQU87Z0NBQ2IsS0FBSyxFQUFFLDJCQUEyQjtnQ0FDbEMsR0FBRyxFQUFFLE1BQU07Z0NBQ1gsTUFBTSxFQUFFLG1EQUFtRDs2QkFDNUQ7eUJBQ0YsQ0FBQyxDQUFBO29CQUNKLENBQUMsRUFBRSxRQUFRLEVBQUMsR0FBRyxFQUFFO3dCQUNmLCtDQUErQzt3QkFDL0MsSUFBSSxDQUFDLGtCQUFrQixHQUFHLENBQUMsQ0FBQTt3QkFDM0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUE7d0JBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLG9DQUFvQyxFQUFFLElBQUksRUFBRSxFQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFBO29CQUNsRixDQUFDO2lCQUNGLENBQUMsQ0FBQztZQUNQLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQzsrR0FuRlUsZUFBZTttR0FBZixlQUFlLHFGQTdDaEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JUOzs0RkF5QlUsZUFBZTtrQkFqRDNCLFNBQVM7K0JBRUUsd0JBQXdCLFlBRXhCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CVCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgRWxlbWVudFJlZlxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcblxyXG5cclxuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XHJcbmltcG9ydCB7UmVjb3JkaW5nRmlsZVNlcnZpY2V9IGZyb20gXCIuL3JlY29yZGluZ2ZpbGUtc2VydmljZVwiO1xyXG5pbXBvcnQge01hdERpYWxvZ30gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2RpYWxvZ1wiO1xyXG5pbXBvcnQge1NlbGVjdGlvbn0gZnJvbSBcIi4uLy4uLy4uL2F1ZGlvL3BlcnNpc3RvclwiO1xyXG5pbXBvcnQge01lc3NhZ2VEaWFsb2d9IGZyb20gXCIuLi8uLi8uLi91aS9tZXNzYWdlX2RpYWxvZ1wiO1xyXG5pbXBvcnQge1JlY29yZGluZ0ZpbGVWaWV3Q29tcG9uZW50fSBmcm9tIFwiLi9yZWNvcmRpbmctZmlsZS12aWV3LmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge1Nlc3Npb25TZXJ2aWNlfSBmcm9tIFwiLi4vc2Vzc2lvbi5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7UmVjb3JkaW5nU2VydmljZX0gZnJvbSBcIi4uLy4uL3JlY29yZGluZ3MvcmVjb3JkaW5ncy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7TWF0U25hY2tCYXJ9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9zbmFjay1iYXJcIjtcclxuaW1wb3J0IHtFcnJvckhlbHBlcn0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3V0aWxzXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuXHJcbiAgc2VsZWN0b3I6ICdhcHAtYXVkaW9kaXNwbGF5cGxheWVyJyxcclxuXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgICAgPGgxPlJlY29yZGluZyBmaWxlIGVkaXRpbmc8L2gxPlxyXG4gICAgICA8cD5PbiBleHBvcnQgb3IgZGVsaXZlcnkgdGhlIGVkaXRpbmcgc2VsZWN0aW9uIG9mIHRoZSByZWNvcmRpbmcgZmlsZSBpcyBjdXQgb3V0LiBJZiBubyBlZGl0aW5nIHNlbGVjdGlvbiBpcyBhcHBsaWVkIHRoZSBvcmlnaW5hbCBmaWxlIGlzIGV4cG9ydGVkLjwvcD5cclxuXHJcbiAgICA8YXVkaW8tZGlzcGxheS1zY3JvbGwtcGFuZSAjYXVkaW9EaXNwbGF5U2Nyb2xsUGFuZT48L2F1ZGlvLWRpc3BsYXktc2Nyb2xsLXBhbmU+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjdHJsdmlld1wiPlxyXG4gICAgICAgIDxhcHAtcmVjb3JkaW5nLWZpbGUtbWV0YSBbc2Vzc2lvbklkXT1cInNlc3Npb25JZFwiICBbcmVjb3JkaW5nRmlsZV09XCJyZWNvcmRpbmdGaWxlXCIgW3N0YXRlTG9hZGluZ109XCJhdWRpb0ZldGNoaW5nXCI+PC9hcHAtcmVjb3JkaW5nLWZpbGUtbWV0YT5cclxuICAgIDxhdWRpby1kaXNwbGF5LWNvbnRyb2wgW2F1ZGlvQ2xpcF09XCJhdWRpb0NsaXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGF5U3RhcnRBY3Rpb25dPVwicGxheVN0YXJ0QWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxheVNlbGVjdGlvbkFjdGlvbl09XCJwbGF5U2VsZWN0aW9uQWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxheVN0b3BBY3Rpb25dPVwicGxheVN0b3BBY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdXRvUGxheU9uU2VsZWN0VG9nZ2xlQWN0aW9uXT1cImFwPy5hdXRvUGxheU9uU2VsZWN0VG9nZ2xlQWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbem9vbUluQWN0aW9uXT1cInpvb21JbkFjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3pvb21PdXRBY3Rpb25dPVwiem9vbU91dEFjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3pvb21TZWxlY3RlZEFjdGlvbl09XCJ6b29tU2VsZWN0ZWRBY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbem9vbUZpdFRvUGFuZWxBY3Rpb25dPVwiem9vbUZpdFRvUGFuZWxBY3Rpb25cIj48L2F1ZGlvLWRpc3BsYXktY29udHJvbD5cclxuICAgICAgICA8YXBwLXJlY29yZGluZy1maWxlLW5hdmkgW2l0ZW1zXT1cImF2YWlsUmVjRmlsZXM/Lmxlbmd0aFwiIFtpdGVtUG9zXT1cInBvc0luTGlzdFwiIFt2ZXJzaW9uXT1cInJlY29yZGluZ0ZpbGVWZXJzaW9uXCIgW3ZlcnNpb25zXT1cInZlcnNpb25zXCIgW2ZpcnN0QWN0aW9uXT1cImZpcnN0QWN0aW9uXCIgW3ByZXZBY3Rpb25dPVwicHJldkFjdGlvblwiIFtuZXh0QWN0aW9uXT1cIm5leHRBY3Rpb25cIiBbbGFzdEFjdGlvbl09XCJsYXN0QWN0aW9uXCIgW3NlbGVjdFZlcnNpb25dPVwidG9WZXJzaW9uQWN0aW9uXCIgW25hdmlJbmZvTG9hZGluZ109XCJuYXZpSW5mb0xvYWRpbmdcIj48L2FwcC1yZWNvcmRpbmctZmlsZS1uYXZpPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJhY2NlbnRcIiAoY2xpY2spPVwiYXBwbHlTZWxlY3Rpb24oKVwiIFtkaXNhYmxlZF09XCJlZGl0U2F2ZWRcIj57e3RoaXMuYXBwbHlCdXR0b25UZXh0KCl9fTwvYnV0dG9uPlxyXG4gIGAsXHJcbiAgc3R5bGVzOiBbXHJcbiAgICBgOmhvc3Qge1xyXG4gICAgICAgICAgICAgICBmbGV4OiAyO1xyXG4gICAgICAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gICAgICAgICAgICAgICBtaW4taGVpZ2h0OjA7XHJcbiAgICAgICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgICAgICAgICAgcGFkZGluZzogMjBweDtcclxuICAgICAgICAgICB6LWluZGV4OiA1O1xyXG4gICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XHJcbiAgICAgICAgIH1gLGBcclxuICAgICAgICAuY3RybHZpZXd7XHJcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcclxuICAgICAgICB9XHJcbiAgICBgLGBcclxuICAgICAgYXVkaW8tZGlzcGxheS1jb250cm9se1xyXG5cclxuICAgICAgICBmbGV4OiAzO1xyXG4gICAgICB9XHJcbiAgICBgXVxyXG5cclxufSlcclxuZXhwb3J0IGNsYXNzIFJlY29yZGluZ0ZpbGVVSSBleHRlbmRzIFJlY29yZGluZ0ZpbGVWaWV3Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XHJcblxyXG4gIHNhdmVkRWRpdFNlbGVjdGlvbjpTZWxlY3Rpb258bnVsbD1udWxsO1xyXG4gIGVkaXRTYXZlZDpib29sZWFuPXRydWVcclxuXHJcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlY29yZGluZ0ZpbGVTZXJ2aWNlOlJlY29yZGluZ0ZpbGVTZXJ2aWNlLHByb3RlY3RlZCByZWNvcmRpbmdTZXJ2aWNlOlJlY29yZGluZ1NlcnZpY2UscHJvdGVjdGVkIHNlc3Npb25TZXJ2aWNlOlNlc3Npb25TZXJ2aWNlLHByb3RlY3RlZCByb3V0ZXI6Um91dGVyLHByb3RlY3RlZCByb3V0ZTogQWN0aXZhdGVkUm91dGUsIHByb3RlY3RlZCByZWY6IENoYW5nZURldGVjdG9yUmVmLHByb3RlY3RlZCBlUmVmOkVsZW1lbnRSZWYsIHByb3RlY3RlZCBkaWFsb2c6TWF0RGlhbG9nLHByaXZhdGUgc25hY2tCYXI6IE1hdFNuYWNrQmFyKSB7XHJcbiAgICBzdXBlcihyZWNvcmRpbmdGaWxlU2VydmljZSxyZWNvcmRpbmdTZXJ2aWNlLHNlc3Npb25TZXJ2aWNlLHJvdXRlcixyb3V0ZSxyZWYsZVJlZixkaWFsb2cpXHJcbiAgICB0aGlzLnBhcmVudEU9dGhpcy5lUmVmLm5hdGl2ZUVsZW1lbnQ7XHJcblxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgc3VwZXIubmdBZnRlclZpZXdJbml0KClcclxuICB9XHJcblxyXG4gIGFwcGx5QnV0dG9uVGV4dCgpOnN0cmluZyB7XHJcbiAgICBpZih0aGlzLmF1ZGlvQ2xpcCkge1xyXG4gICAgICBsZXQgcyA9IHRoaXMuYXVkaW9DbGlwLnNlbGVjdGlvblxyXG4gICAgICBpZiAocykge1xyXG4gICAgICAgIHJldHVybiBcIkFwcGx5IGN1cnJlbnQgc2VsZWN0aW9uIGFzIGVkaXRpbmcgc2VsZWN0aW9uXCI7XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIHJldHVybiBcIkNhbmNlbCBvdXQgZWRpdGluZyBzZWxlY3Rpb25cIjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgLy8ganVzdCBhcyBmYWxsYmFja1xyXG4gICAgcmV0dXJuIFwiQXBwbHkgc2VsZWN0aW9uXCI7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgbG9hZFJlY0ZpbGUocmZJZDpudW1iZXIgfCBzdHJpbmcpIHtcclxuICAgIHRoaXMuZWRpdFNhdmVkID0gdHJ1ZTtcclxuICAgIHN1cGVyLmxvYWRSZWNGaWxlKHJmSWQpO1xyXG4gIH1cclxuXHJcbnByb3RlY3RlZCBsb2FkZWRSZWNmaWxlKCkge1xyXG4gIHN1cGVyLmxvYWRlZFJlY2ZpbGUoKTtcclxuICBpZih0aGlzLmF1ZGlvQ2xpcCkge1xyXG4gICAgdGhpcy5hdWRpb0NsaXAuYWRkU2VsZWN0aW9uT2JzZXJ2ZXIoKGNsaXApID0+IHtcclxuICAgICAgbGV0IHMgPSBjbGlwLnNlbGVjdGlvblxyXG4gICAgICB0aGlzLmVkaXRTYXZlZCA9ICgodGhpcy5zYXZlZEVkaXRTZWxlY3Rpb24gPT0gbnVsbCAmJiBzID09IG51bGwpIHx8IHRoaXMuc2F2ZWRFZGl0U2VsZWN0aW9uICE9IG51bGwgJiYgdGhpcy5zYXZlZEVkaXRTZWxlY3Rpb24uZXF1YWxzKHMpKVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHRoaXMuc2F2ZWRFZGl0U2VsZWN0aW9uID0gdGhpcy5hdWRpb0NsaXA/dGhpcy5hdWRpb0NsaXAuc2VsZWN0aW9uOm51bGw7XHJcbiAgdGhpcy5lZGl0U2F2ZWQgPSB0cnVlXHJcbn1cclxuXHJcbiAgYXBwbHlTZWxlY3Rpb24oKXtcclxuICAgIGlmKHRoaXMuYXVkaW9DbGlwKSB7XHJcbiAgICAgIGxldCBhYj10aGlzLmF1ZGlvQ2xpcC5hdWRpb0RhdGFIb2xkZXI7XHJcbiAgICAgIGxldCBzID0gdGhpcy5hdWRpb0NsaXAuc2VsZWN0aW9uXHJcbiAgICAgIGlmIChhYiAmJiB0aGlzLnJlY29yZGluZ0ZpbGU/LnJlY29yZGluZ0ZpbGVJZCkge1xyXG5cclxuICAgICAgICBsZXQgc3I9IG51bGw7XHJcbiAgICAgICAgbGV0IHNmPW51bGw7XHJcbiAgICAgICAgbGV0IGVmPW51bGw7XHJcbiAgICAgICAgaWYocykge1xyXG4gICAgICAgICAgc3I9IGFiLnNhbXBsZVJhdGU7XHJcbiAgICAgICAgICBzZiA9IHMuc3RhcnRGcmFtZTtcclxuICAgICAgICAgIGVmID0gcy5lbmRGcmFtZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5yZWNvcmRpbmdGaWxlU2VydmljZS5zYXZlRWRpdFNlbGVjdGlvbih0aGlzLnJlY29yZGluZ0ZpbGUucmVjb3JkaW5nRmlsZUlkLCBzciwgc2YsIGVmKS5zdWJzY3JpYmUoXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5leHQ6KCkgPT4ge31cclxuICAgICAgICAgICAgLCBlcnJvcjooZXJyKSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgIGNvbnN0IGVyck1zZz1FcnJvckhlbHBlci5tZXNzYWdlKCdDb3VsZCBub3Qgc2F2ZSBlZGl0IHNlbGVjdGlvbiB0byBzZXJ2ZXInLGVycik7XHJcbiAgICAgICAgICAgICAgdGhpcy5kaWFsb2cub3BlbihNZXNzYWdlRGlhbG9nLCB7XHJcblxyXG4gICAgICAgICAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InLFxyXG4gICAgICAgICAgICAgICAgICB0aXRsZTogJ1NhdmUgc2VsZWN0aW9uIGVkaXQgZXJyb3InLFxyXG4gICAgICAgICAgICAgICAgICBtc2c6IGVyck1zZyxcclxuICAgICAgICAgICAgICAgICAgYWR2aWNlOiBcIlBsZWFzZSBjaGVjayBuZXR3b3JrIGNvbm5lY3Rpb24gYW5kIHNlcnZlciBzdGF0ZS5cIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH0sIGNvbXBsZXRlOigpID0+IHtcclxuICAgICAgICAgICAgICAvLyBPciB1c2UgcmV0dXJuZWQgc2VsZWN0aW9uIHZhbHVlIGZyb20gc2VydmVyP1xyXG4gICAgICAgICAgICAgIHRoaXMuc2F2ZWRFZGl0U2VsZWN0aW9uID0gc1xyXG4gICAgICAgICAgICAgIHRoaXMuZWRpdFNhdmVkID0gdHJ1ZVxyXG4gICAgICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbignU2VsZWN0aW9uIGVkaXQgc2F2ZWQgc3VjY2Vzc2Z1bGx5LicsICdPSycsIHtkdXJhdGlvbjogMTUwMH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxufVxyXG5cclxuIl19