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,88 +0,0 @@
1
- import { Component, EventEmitter, Input, Output, ViewChild } from "@angular/core";
2
- import { RecordingList } from "./recording_list";
3
- import { AudioDisplay } from "../../audio/audio_display";
4
- import { ResponsiveComponent } from "../../ui/responsive_component";
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@angular/cdk/layout";
7
- import * as i2 from "../../audio/audio_display";
8
- import * as i3 from "./recording_list";
9
- export class RecorderCombiPane extends ResponsiveComponent {
10
- constructor(bpo) {
11
- super(bpo);
12
- this.bpo = bpo;
13
- this.selectDisabled = false;
14
- this.selectedRecordingFileChanged = new EventEmitter();
15
- this.selectedRecordingFile = null;
16
- this.audioSignalCollapsed = true;
17
- this.displayAudioClip = null;
18
- }
19
- ngAfterViewInit() {
20
- }
21
- addRecFile(rf) {
22
- this.recordingListComp.addRecFile(rf);
23
- }
24
- setRecFileAudioData(recFile, adh) {
25
- this.recordingListComp.setRecFileAudioData(recFile, adh);
26
- }
27
- selectRecordingFile(rf) {
28
- this.selectedRecordingFileChanged.emit(rf);
29
- }
30
- selectTop() {
31
- this.recordingListComp.selectTop();
32
- }
33
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: RecorderCombiPane, deps: [{ token: i1.BreakpointObserver }], target: i0.ɵɵFactoryTarget.Component }); }
34
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: RecorderCombiPane, selector: "app-recordercombipane", inputs: { selectDisabled: "selectDisabled", selectedRecordingFile: "selectedRecordingFile", audioSignalCollapsed: "audioSignalCollapsed", displayAudioClip: "displayAudioClip", playStartAction: "playStartAction", playSelectionAction: "playSelectionAction", autoPlayOnSelectToggleAction: "autoPlayOnSelectToggleAction", playStopAction: "playStopAction" }, outputs: { selectedRecordingFileChanged: "selectedRecordingFileChanged" }, viewQueries: [{ propertyName: "recordingListComp", first: true, predicate: RecordingList, descendants: true }, { propertyName: "audioDisplay", first: true, predicate: AudioDisplay, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
35
- <div class="scrollList">
36
- <app-recordinglist [selectedRecordingFile]="selectedRecordingFile" [selectDisabled]="selectDisabled" (selectedRecordingFileChanged)="selectRecordingFile($event)"></app-recordinglist>
37
- </div>
38
- <div class="collapsable" #asCt [class.active]="!audioSignalCollapsed && !screenXs">
39
- <app-audiodisplay #audioSignalContainer [class.active]="!audioSignalCollapsed"
40
- [audioClip]="displayAudioClip"
41
- [playStartAction]="playStartAction"
42
- [playSelectionAction]="playSelectionAction"
43
- [autoPlayOnSelectToggleAction]="autoPlayOnSelectToggleAction"
44
- [playStopAction]="playStopAction"></app-audiodisplay>
45
- </div>
46
- `, isInline: true, styles: [".monospaced{font-family:monospace}.mat-mdc-cell,.mat-mdc-header-cell{padding-left:5px;padding-right:5px}.mat-mdc-card,.mat-mdc-card-header,.mat-mdc-card-content{width:auto}.flexForm{display:flex;flex-direction:column;width:auto}.flexFill{margin:0;width:100%;height:100%;min-width:100%;min-height:100%}.spr-button-icon{font-size:24px;vertical-align:middle;overflow:hidden;text-overflow:clip;white-space:nowrap}\n", ":host{background-color:#ff0;position:relative;margin:0;padding:0;background:#d3d3d3;width:100%;flex:1;min-height:0px}\n", ".scrollList{margin:0;padding:0;background:#d3d3d3;width:100%;height:100%;overflow-y:auto}\n", ".collapsable{display:none;position:absolute;z-index:5}\n", ".collapsable.active{display:flex;position:absolute;bottom:0;height:90%;width:100%;overflow:hidden;padding:0;z-index:200;box-sizing:border-box;background-color:#0000}\n"], dependencies: [{ kind: "component", type: i2.AudioDisplay, selector: "app-audiodisplay", inputs: ["playStartAction", "playStopAction", "playSelectionAction", "autoPlayOnSelectToggleAction", "audioData", "audioClip"] }, { kind: "component", type: i3.RecordingList, selector: "app-recordinglist", inputs: ["selectDisabled", "selectedRecordingFile"], outputs: ["selectedRecordingFileChanged"] }] }); }
47
- }
48
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: RecorderCombiPane, decorators: [{
49
- type: Component,
50
- args: [{ selector: 'app-recordercombipane', template: `
51
- <div class="scrollList">
52
- <app-recordinglist [selectedRecordingFile]="selectedRecordingFile" [selectDisabled]="selectDisabled" (selectedRecordingFileChanged)="selectRecordingFile($event)"></app-recordinglist>
53
- </div>
54
- <div class="collapsable" #asCt [class.active]="!audioSignalCollapsed && !screenXs">
55
- <app-audiodisplay #audioSignalContainer [class.active]="!audioSignalCollapsed"
56
- [audioClip]="displayAudioClip"
57
- [playStartAction]="playStartAction"
58
- [playSelectionAction]="playSelectionAction"
59
- [autoPlayOnSelectToggleAction]="autoPlayOnSelectToggleAction"
60
- [playStopAction]="playStopAction"></app-audiodisplay>
61
- </div>
62
- `, styles: [".monospaced{font-family:monospace}.mat-mdc-cell,.mat-mdc-header-cell{padding-left:5px;padding-right:5px}.mat-mdc-card,.mat-mdc-card-header,.mat-mdc-card-content{width:auto}.flexForm{display:flex;flex-direction:column;width:auto}.flexFill{margin:0;width:100%;height:100%;min-width:100%;min-height:100%}.spr-button-icon{font-size:24px;vertical-align:middle;overflow:hidden;text-overflow:clip;white-space:nowrap}\n", ":host{background-color:#ff0;position:relative;margin:0;padding:0;background:#d3d3d3;width:100%;flex:1;min-height:0px}\n", ".scrollList{margin:0;padding:0;background:#d3d3d3;width:100%;height:100%;overflow-y:auto}\n", ".collapsable{display:none;position:absolute;z-index:5}\n", ".collapsable.active{display:flex;position:absolute;bottom:0;height:90%;width:100%;overflow:hidden;padding:0;z-index:200;box-sizing:border-box;background-color:#0000}\n"] }]
63
- }], ctorParameters: () => [{ type: i1.BreakpointObserver }], propDecorators: { recordingListComp: [{
64
- type: ViewChild,
65
- args: [RecordingList]
66
- }], selectDisabled: [{
67
- type: Input
68
- }], selectedRecordingFileChanged: [{
69
- type: Output
70
- }], selectedRecordingFile: [{
71
- type: Input
72
- }], audioDisplay: [{
73
- type: ViewChild,
74
- args: [AudioDisplay, { static: true }]
75
- }], audioSignalCollapsed: [{
76
- type: Input
77
- }], displayAudioClip: [{
78
- type: Input
79
- }], playStartAction: [{
80
- type: Input
81
- }], playSelectionAction: [{
82
- type: Input
83
- }], autoPlayOnSelectToggleAction: [{
84
- type: Input
85
- }], playStopAction: [{
86
- type: Input
87
- }] } });
88
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkZXJfY29tYmlfcGFuZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwZWVjaHJlY29yZGVybmcvc3JjL2xpYi9zcGVlY2hyZWNvcmRlci9zZXNzaW9uL3JlY29yZGVyX2NvbWJpX3BhbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFnQixTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRS9GLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUcvQyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFFdkQsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sK0JBQStCLENBQUM7Ozs7O0FBK0RsRSxNQUFNLE9BQU8saUJBQWtCLFNBQVEsbUJBQW1CO0lBZXhELFlBQXNCLEdBQXNCO1FBQzFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQURTLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBWm5DLG1CQUFjLEdBQVMsS0FBSyxDQUFDO1FBQzVCLGlDQUE0QixHQUFHLElBQUksWUFBWSxFQUFpQixDQUFDO1FBQ2xFLDBCQUFxQixHQUFvQixJQUFJLENBQUM7UUFHOUMseUJBQW9CLEdBQVUsSUFBSSxDQUFDO1FBQ25DLHFCQUFnQixHQUFtQixJQUFJLENBQUM7SUFRakQsQ0FBQztJQUVELGVBQWU7SUFFZixDQUFDO0lBRUQsVUFBVSxDQUFDLEVBQWdCO1FBQ3pCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELG1CQUFtQixDQUFDLE9BQXFCLEVBQUMsR0FBd0I7UUFDaEUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBR0QsbUJBQW1CLENBQUMsRUFBZ0I7UUFDbEMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsU0FBUztRQUNQLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNyQyxDQUFDOytHQXRDVSxpQkFBaUI7bUdBQWpCLGlCQUFpQiw2aEJBRWpCLGFBQWEsK0VBS2IsWUFBWSxxRkEvRGI7Ozs7Ozs7Ozs7OztHQVlUOzs0RkE0Q1UsaUJBQWlCO2tCQTVEN0IsU0FBUzsrQkFFRSx1QkFBdUIsWUFFdkI7Ozs7Ozs7Ozs7OztHQVlUO3VGQThDeUIsaUJBQWlCO3NCQUExQyxTQUFTO3VCQUFDLGFBQWE7Z0JBQ2YsY0FBYztzQkFBdEIsS0FBSztnQkFDSSw0QkFBNEI7c0JBQXJDLE1BQU07Z0JBQ0UscUJBQXFCO3NCQUE3QixLQUFLO2dCQUVxQyxZQUFZO3NCQUF0RCxTQUFTO3VCQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBQ2hDLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0csNEJBQTRCO3NCQUFwQyxLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBWaWV3Q2hpbGR9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7UmVjb3JkaW5nRmlsZX0gZnJvbSBcIi4uL3JlY29yZGluZ1wiO1xyXG5pbXBvcnQge1JlY29yZGluZ0xpc3R9IGZyb20gXCIuL3JlY29yZGluZ19saXN0XCI7XHJcbmltcG9ydCB7QXVkaW9DbGlwfSBmcm9tIFwiLi4vLi4vYXVkaW8vcGVyc2lzdG9yXCI7XHJcbmltcG9ydCB7QWN0aW9ufSBmcm9tIFwiLi4vLi4vYWN0aW9uL2FjdGlvblwiO1xyXG5pbXBvcnQge0F1ZGlvRGlzcGxheX0gZnJvbSBcIi4uLy4uL2F1ZGlvL2F1ZGlvX2Rpc3BsYXlcIjtcclxuaW1wb3J0IHtBdWRpb0RhdGFIb2xkZXJ9IGZyb20gXCIuLi8uLi9hdWRpby9hdWRpb19kYXRhX2hvbGRlclwiO1xyXG5pbXBvcnQge1Jlc3BvbnNpdmVDb21wb25lbnR9IGZyb20gXCIuLi8uLi91aS9yZXNwb25zaXZlX2NvbXBvbmVudFwiO1xyXG5pbXBvcnQge0JyZWFrcG9pbnRPYnNlcnZlcn0gZnJvbSBcIkBhbmd1bGFyL2Nkay9sYXlvdXRcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG5cclxuICBzZWxlY3RvcjogJ2FwcC1yZWNvcmRlcmNvbWJpcGFuZScsXHJcblxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8ZGl2IGNsYXNzPVwic2Nyb2xsTGlzdFwiPlxyXG4gICAgICAgIDxhcHAtcmVjb3JkaW5nbGlzdCBbc2VsZWN0ZWRSZWNvcmRpbmdGaWxlXT1cInNlbGVjdGVkUmVjb3JkaW5nRmlsZVwiIFtzZWxlY3REaXNhYmxlZF09XCJzZWxlY3REaXNhYmxlZFwiIChzZWxlY3RlZFJlY29yZGluZ0ZpbGVDaGFuZ2VkKT1cInNlbGVjdFJlY29yZGluZ0ZpbGUoJGV2ZW50KVwiPjwvYXBwLXJlY29yZGluZ2xpc3Q+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2xsYXBzYWJsZVwiICAjYXNDdCBbY2xhc3MuYWN0aXZlXT1cIiFhdWRpb1NpZ25hbENvbGxhcHNlZCAmJiAhc2NyZWVuWHNcIj5cclxuICAgICAgPGFwcC1hdWRpb2Rpc3BsYXkgI2F1ZGlvU2lnbmFsQ29udGFpbmVyIFtjbGFzcy5hY3RpdmVdPVwiIWF1ZGlvU2lnbmFsQ29sbGFwc2VkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2F1ZGlvQ2xpcF09XCJkaXNwbGF5QXVkaW9DbGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3BsYXlTdGFydEFjdGlvbl09XCJwbGF5U3RhcnRBY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcGxheVNlbGVjdGlvbkFjdGlvbl09XCJwbGF5U2VsZWN0aW9uQWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2F1dG9QbGF5T25TZWxlY3RUb2dnbGVBY3Rpb25dPVwiYXV0b1BsYXlPblNlbGVjdFRvZ2dsZUFjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwbGF5U3RvcEFjdGlvbl09XCJwbGF5U3RvcEFjdGlvblwiPjwvYXBwLWF1ZGlvZGlzcGxheT5cclxuICAgIDwvZGl2PlxyXG4gIGAsXHJcbiAgc3R5bGVzOiBbYDpob3N0IHtcclxuICAgYmFja2dyb3VuZC1jb2xvcjogeWVsbG93O1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgbWFyZ2luOiAwO1xyXG4gICAgcGFkZGluZzogMDtcclxuICAgIGJhY2tncm91bmQ6IGxpZ2h0Z3JleTtcclxuICAgIHdpZHRoOiAxMDAlOyAvKiB1c2UgYWxsIGhvcml6b250YWwgYXZhaWxhYmxlIHNwYWNlICovXHJcbiAgICBmbGV4OiAxOyAvKiAuLi4gYW5kIGZpbGwgcmVzdCBvZiB2ZXJ0aWNhbCBhdmFpbGFibGUgc3BhY2UgKG90aGVyIGNvbXBvbmVudHMgaGF2ZSBmbGV4IDApICovXHJcbiAgICAvKiBXb3JrYXJvdW5kIGZvciBGaXJlZm94XHJcbiAgICBJZiB0aGUgcHJvZ3Jlc3MgdGFibGUgZ2V0cyBsb25nIChzY3JpcHQgd2l0aCBtYW55IGl0ZW1zKSBGRiBpbmNyZWFzZXMgdGhlIGhlaWdodCBvZiB0aGUgb3ZlcmZsb3cgcHJvZ3Jlc3NDb250YWluZXIgYW5kXHJcbiAgICB0aGUgd2hvbGUgYXBwIGRvZXMgbm90IGZpdCBpbnRvIHRoZSBwYWdlIGFueW1vcmUuIFRoZSBhcHAgb3ZlcmZsb3dzIGFuZCBzaG93cyBhIHZlcnRpY2FsIHNjcm9sbGJhciBmb3IgdGhlIHdob2xlIGFwcC5cclxuICAgIFNlZSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yODYzNjgzMi9maXJlZm94LW92ZXJmbG93LXktbm90LXdvcmtpbmctd2l0aC1uZXN0ZWQtZmxleGJveFxyXG4gICAgKi9cclxuICAgIG1pbi1oZWlnaHQ6IDBweDtcclxuXHJcbiAgfWAsYC5zY3JvbGxMaXN0e1xyXG4gICAgbWFyZ2luOiAwO1xyXG4gICAgcGFkZGluZzogMDtcclxuICAgIGJhY2tncm91bmQ6IGxpZ2h0Z3JleTtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgb3ZlcmZsb3cteTogYXV0bztcclxuICB9YCwgYFxyXG4gICAgLmNvbGxhcHNhYmxlIHtcclxuICAgICAgZGlzcGxheTogbm9uZTtcclxuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgICB6LWluZGV4OiA1O1xyXG4gICAgfWAsIGBcclxuICAgIC5jb2xsYXBzYWJsZS5hY3RpdmUge1xyXG4gICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICAgIGJvdHRvbTogMHB4O1xyXG4gICAgICBoZWlnaHQ6IDkwJTtcclxuICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgICAgIHBhZGRpbmc6IDBweDtcclxuICAgICAgei1pbmRleDogMjAwOyAgLyogTmVlZHMgYSBoaWdoZXIgdmFsdWUgdGhlbiB0aGUgc3RpY2t5IE1hdGVyaWFsIHRhYmxlIGhlYWRlciAod2hpY2ggaXMgei1pbmRleDogMTAwKSAqL1xyXG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDApXHJcbiAgICB9YF0sXHJcbiAgc3R5bGVVcmxzOiBbJy4uLy4uL3NwZWVjaHJlY29yZGVyX21hdC5zY3NzJ11cclxuXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSZWNvcmRlckNvbWJpUGFuZSBleHRlbmRzIFJlc3BvbnNpdmVDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0e1xyXG5cclxuICBAVmlld0NoaWxkKFJlY29yZGluZ0xpc3QpIHJlY29yZGluZ0xpc3RDb21wITpSZWNvcmRpbmdMaXN0O1xyXG4gIEBJbnB1dCgpIHNlbGVjdERpc2FibGVkOmJvb2xlYW49ZmFsc2U7XHJcbiAgQE91dHB1dCgpIHNlbGVjdGVkUmVjb3JkaW5nRmlsZUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFJlY29yZGluZ0ZpbGU+KCk7XHJcbiAgQElucHV0KCkgc2VsZWN0ZWRSZWNvcmRpbmdGaWxlOlJlY29yZGluZ0ZpbGV8bnVsbD1udWxsO1xyXG5cclxuICBAVmlld0NoaWxkKEF1ZGlvRGlzcGxheSwgeyBzdGF0aWM6IHRydWUgfSkgYXVkaW9EaXNwbGF5ITogQXVkaW9EaXNwbGF5O1xyXG4gIEBJbnB1dCgpIGF1ZGlvU2lnbmFsQ29sbGFwc2VkOiBib29sZWFuPXRydWU7XHJcbiAgQElucHV0KCkgZGlzcGxheUF1ZGlvQ2xpcDogQXVkaW9DbGlwIHwgbnVsbD1udWxsO1xyXG4gIEBJbnB1dCgpIHBsYXlTdGFydEFjdGlvbjogQWN0aW9uPHZvaWQ+fHVuZGVmaW5lZDtcclxuICBASW5wdXQoKSBwbGF5U2VsZWN0aW9uQWN0aW9uOiBBY3Rpb248dm9pZD58dW5kZWZpbmVkO1xyXG4gIEBJbnB1dCgpIGF1dG9QbGF5T25TZWxlY3RUb2dnbGVBY3Rpb246QWN0aW9uPGJvb2xlYW4+fHVuZGVmaW5lZDtcclxuICBASW5wdXQoKSBwbGF5U3RvcEFjdGlvbjogQWN0aW9uPHZvaWQ+fHVuZGVmaW5lZDtcclxuXHJcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGJwbzpCcmVha3BvaW50T2JzZXJ2ZXIpIHtcclxuICAgIHN1cGVyKGJwbyk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcblxyXG4gIH1cclxuXHJcbiAgYWRkUmVjRmlsZShyZjpSZWNvcmRpbmdGaWxlKXtcclxuICAgIHRoaXMucmVjb3JkaW5nTGlzdENvbXAuYWRkUmVjRmlsZShyZik7XHJcbiAgfVxyXG5cclxuICBzZXRSZWNGaWxlQXVkaW9EYXRhKHJlY0ZpbGU6UmVjb3JkaW5nRmlsZSxhZGg6QXVkaW9EYXRhSG9sZGVyfG51bGwpIHtcclxuICAgIHRoaXMucmVjb3JkaW5nTGlzdENvbXAuc2V0UmVjRmlsZUF1ZGlvRGF0YShyZWNGaWxlLCBhZGgpO1xyXG4gIH1cclxuXHJcblxyXG4gIHNlbGVjdFJlY29yZGluZ0ZpbGUocmY6UmVjb3JkaW5nRmlsZSl7XHJcbiAgICB0aGlzLnNlbGVjdGVkUmVjb3JkaW5nRmlsZUNoYW5nZWQuZW1pdChyZik7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RUb3AoKSB7XHJcbiAgICB0aGlzLnJlY29yZGluZ0xpc3RDb21wLnNlbGVjdFRvcCgpO1xyXG4gIH1cclxuXHJcbn1cclxuIl19
@@ -1,195 +0,0 @@
1
- import { RecordingFileUtils } from "../recording";
2
- export class BasicRecFilesCache {
3
- constructor() {
4
- //public static readonly DEFAULT_MAX_SAMPLES=30*48000; // TEST 30 seconds
5
- this._sampleCount = 0;
6
- this.maxSampleCount = BasicRecFilesCache.DEFAULT_MAX_SAMPLES;
7
- this._currentRecordingFile = null;
8
- }
9
- static { this.DEBUG = false; }
10
- static { this.DEFAULT_MAX_SAMPLES = 10 * 60 * 48000; } // 10 Minutes mono 48kHz
11
- get currentRecordingFile() {
12
- return this._currentRecordingFile;
13
- }
14
- set currentRecordingFile(value) {
15
- this._currentRecordingFile = value;
16
- this.expire();
17
- }
18
- }
19
- export class SprItemsCache extends BasicRecFilesCache {
20
- constructor() {
21
- super(...arguments);
22
- this._items = new Array();
23
- }
24
- get items() {
25
- return this._items;
26
- }
27
- addItem(item) {
28
- this._items.push(item);
29
- }
30
- getItem(index) {
31
- return this._items[index];
32
- }
33
- length() {
34
- return this._items.length;
35
- }
36
- tryExpire(toBeExpiredRf) {
37
- if (BasicRecFilesCache.DEBUG)
38
- console.debug("Rec. files cache: " + toBeExpiredRf.toString() + " try expire:");
39
- if (!RecordingFileUtils.equals(toBeExpiredRf, this.currentRecordingFile)) {
40
- if (BasicRecFilesCache.DEBUG)
41
- console.debug("Rec. files cache: " + toBeExpiredRf.toString() + " not current file...");
42
- if (toBeExpiredRf.serverPersisted) {
43
- if (BasicRecFilesCache.DEBUG)
44
- console.debug("Rec. files cache: " + toBeExpiredRf.toString() + " is server persisted...");
45
- // expire recording files first stored to the cache
46
- let expiredSamples = RecordingFileUtils.expireAudioData(toBeExpiredRf);
47
- this._sampleCount -= expiredSamples;
48
- if (expiredSamples > 0) {
49
- if (BasicRecFilesCache.DEBUG)
50
- console.debug("Rec. files cache: Expired: " + toBeExpiredRf.toString() + ". Cache samples now: " + this._sampleCount);
51
- }
52
- }
53
- else {
54
- if (BasicRecFilesCache.DEBUG)
55
- console.debug("Rec. files cache: #" + toBeExpiredRf.toString() + " not yet persisted on server.");
56
- }
57
- }
58
- else {
59
- if (BasicRecFilesCache.DEBUG)
60
- console.debug("Rec. files cache: " + toBeExpiredRf.toString() + " is current file.");
61
- }
62
- }
63
- expire() {
64
- // expire corrected versions first
65
- if (BasicRecFilesCache.DEBUG)
66
- console.debug("Rec. files cache: Expire? current: " + this._sampleCount + ", max: " + this.maxSampleCount);
67
- if (this._sampleCount > this.maxSampleCount) {
68
- // expire older versions of an item first
69
- for (let ii = 0; ii < this._items.length; ii++) {
70
- if (this._sampleCount <= this.maxSampleCount) {
71
- break;
72
- }
73
- let it = this._items[ii];
74
- let itRfs = it.recs;
75
- if (itRfs && itRfs.length > 1) {
76
- for (let rfi = 0; rfi < itRfs.length - 1; rfi++) {
77
- if (this._sampleCount <= this.maxSampleCount) {
78
- break;
79
- }
80
- let toBeExpiredRf = itRfs[rfi];
81
- this.tryExpire(toBeExpiredRf);
82
- }
83
- }
84
- }
85
- // if that's not sufficient expire audio data of latest versions as well
86
- for (let ii = 0; ii < this._items.length; ii++) {
87
- if (this._sampleCount <= this.maxSampleCount) {
88
- break;
89
- }
90
- let it = this._items[ii];
91
- let itRfs = it.recs;
92
- if (itRfs && itRfs.length > 0) {
93
- for (let rfi = 0; rfi < itRfs.length; rfi++) {
94
- if (this._sampleCount <= this.maxSampleCount) {
95
- break;
96
- }
97
- let toBeExpiredRf = itRfs[rfi];
98
- this.tryExpire(toBeExpiredRf);
99
- }
100
- }
101
- }
102
- }
103
- }
104
- addSprRecFile(item, sprRecFile) {
105
- this.expire();
106
- if (!item.recs) {
107
- item.recs = new Array();
108
- }
109
- item.recs[sprRecFile.version] = sprRecFile;
110
- this._sampleCount += RecordingFileUtils.sampleCount(sprRecFile);
111
- if (BasicRecFilesCache.DEBUG)
112
- console.debug("Rec. files cache: Added. Cache samples: " + this._sampleCount);
113
- }
114
- setSprRecFileAudioData(sprRecFile, adh) {
115
- this.expire();
116
- if (BasicRecFilesCache.DEBUG)
117
- console.debug("Rec. files cache: Set audio data after expire. Cache samples: " + this._sampleCount);
118
- let currSampleCnt = RecordingFileUtils.sampleCount(sprRecFile);
119
- this._sampleCount -= currSampleCnt;
120
- if (BasicRecFilesCache.DEBUG)
121
- console.debug("Rec. files cache: Set audio data subtracted curr sample count: " + currSampleCnt + ". Cache samples: " + this._sampleCount);
122
- RecordingFileUtils.setAudioData(sprRecFile, adh);
123
- let newSampleCnt = RecordingFileUtils.sampleCount(sprRecFile);
124
- this._sampleCount += newSampleCnt;
125
- if (BasicRecFilesCache.DEBUG)
126
- console.debug("Rec. files cache: Set audio data added new sample count: " + newSampleCnt + ". Cache samples: " + this._sampleCount);
127
- let fl = adh?.frameLen;
128
- if (sprRecFile.frames == null && fl) {
129
- sprRecFile.frames = fl;
130
- }
131
- if (BasicRecFilesCache.DEBUG)
132
- console.debug("Rec. files cache: Set audio data. Cache samples: " + this._sampleCount);
133
- }
134
- }
135
- export class RecFilesCache extends BasicRecFilesCache {
136
- constructor() {
137
- super(...arguments);
138
- this._recFiles = new Array();
139
- }
140
- get recFiles() {
141
- return this._recFiles;
142
- }
143
- getRecFile(index) {
144
- return this._recFiles[index];
145
- }
146
- length() {
147
- return this._recFiles.length;
148
- }
149
- expire() {
150
- if (this._sampleCount > this.maxSampleCount) {
151
- // audio recorder list is sorted: lower index is newer
152
- for (let rfI = this._recFiles.length - 1; rfI >= 0; rfI--) {
153
- if (this._sampleCount <= this.maxSampleCount) {
154
- break;
155
- }
156
- let toBeExpiredRf = this._recFiles[rfI];
157
- if (toBeExpiredRf.serverPersisted) {
158
- if (!RecordingFileUtils.equals(toBeExpiredRf, this.currentRecordingFile)) {
159
- // expire recording files first stored to the cache
160
- let expiredSamples = RecordingFileUtils.expireAudioData(toBeExpiredRf);
161
- this._sampleCount -= expiredSamples;
162
- if (expiredSamples > 0) {
163
- if (BasicRecFilesCache.DEBUG)
164
- console.debug("Rec. files cache: Expired #" + rfI + ". Cache samples: " + this._sampleCount);
165
- }
166
- }
167
- else {
168
- if (BasicRecFilesCache.DEBUG)
169
- console.debug("Rec. files cache: #" + rfI + " is current file. (not expiring)");
170
- }
171
- }
172
- else {
173
- if (BasicRecFilesCache.DEBUG)
174
- console.debug("Rec. files cache: #" + rfI + " not yet server persisted.");
175
- }
176
- }
177
- }
178
- }
179
- addRecFile(recFile) {
180
- this.expire();
181
- this._recFiles.push(recFile);
182
- this._sampleCount += RecordingFileUtils.sampleCount(recFile);
183
- if (BasicRecFilesCache.DEBUG)
184
- console.debug("Rec. files cache: Added. Cache samples: " + this._sampleCount);
185
- }
186
- setRecFileAudioData(recFile, adh) {
187
- this.expire();
188
- this._sampleCount -= RecordingFileUtils.sampleCount(recFile);
189
- RecordingFileUtils.setAudioData(recFile, adh);
190
- this._sampleCount += RecordingFileUtils.sampleCount(recFile);
191
- if (BasicRecFilesCache.DEBUG)
192
- console.debug("Rec. files cache: Set audio data. Cache samples: " + this._sampleCount);
193
- }
194
- }
195
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkaW5nX2ZpbGVfY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvc3BlZWNocmVjb3JkZXIvc2Vzc2lvbi9yZWNvcmRpbmdfZmlsZV9jYWNoZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWdCLGtCQUFrQixFQUFtQixNQUFNLGNBQWMsQ0FBQztBQUlqRixNQUFNLE9BQWdCLGtCQUFrQjtJQUF4QztRQUtFLDBFQUEwRTtRQUVoRSxpQkFBWSxHQUFRLENBQUMsQ0FBQztRQUNoQyxtQkFBYyxHQUFRLGtCQUFrQixDQUFDLG1CQUFtQixDQUFDO1FBQ3JELDBCQUFxQixHQUFvQixJQUFJLENBQUM7SUFXeEQsQ0FBQzthQWxCd0IsVUFBSyxHQUFDLEtBQUssQUFBTixDQUFPO2FBQ1osd0JBQW1CLEdBQUMsRUFBRSxHQUFDLEVBQUUsR0FBQyxLQUFLLEFBQVosQ0FBYSxHQUFFLHdCQUF3QjtJQVNqRixJQUFJLG9CQUFvQjtRQUN0QixPQUFPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztJQUNwQyxDQUFDO0lBRUQsSUFBSSxvQkFBb0IsQ0FBQyxLQUEyQjtRQUNsRCxJQUFJLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDO1FBQ25DLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNoQixDQUFDOztBQUtILE1BQU0sT0FBTyxhQUFjLFNBQVEsa0JBQWtCO0lBQXJEOztRQUdZLFdBQU0sR0FBYSxJQUFJLEtBQUssRUFBUSxDQUFDO0lBOEdqRCxDQUFDO0lBNUdHLElBQUksS0FBSztRQUNMLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQsT0FBTyxDQUFDLElBQVM7UUFDYixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQsT0FBTyxDQUFDLEtB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LEdBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzFHLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxPQUFxQixFQUFFLEdBQXdCO1FBQ2pFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNkLElBQUksQ0FBQyxZQUFZLElBQUUsa0JBQWtCLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzNELGtCQUFrQixDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLFlBQVksSUFBRSxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0QsSUFBRyxrQkFBa0IsQ0FBQyxLQUFLO1lBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxtREFBbUQsR0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDbkgsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtSZWNvcmRpbmdGaWxlLCBSZWNvcmRpbmdGaWxlVXRpbHMsIFNwclJlY29yZGluZ0ZpbGV9IGZyb20gXCIuLi9yZWNvcmRpbmdcIjtcclxuaW1wb3J0IHtJdGVtfSBmcm9tIFwiLi9pdGVtXCI7XHJcbmltcG9ydCB7QXVkaW9EYXRhSG9sZGVyfSBmcm9tIFwiLi4vLi4vYXVkaW8vYXVkaW9fZGF0YV9ob2xkZXJcIjtcclxuXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNpY1JlY0ZpbGVzQ2FjaGUge1xyXG5cclxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERFQlVHPWZhbHNlO1xyXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9NQVhfU0FNUExFUz0xMCo2MCo0ODAwMDsgIC8vIDEwIE1pbnV0ZXMgbW9ubyA0OGtIelxyXG5cclxuICAvL3B1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9NQVhfU0FNUExFUz0zMCo0ODAwMDsgIC8vIFRFU1QgMzAgc2Vjb25kc1xyXG5cclxuICBwcm90ZWN0ZWQgX3NhbXBsZUNvdW50Om51bWJlcj0wO1xyXG4gIG1heFNhbXBsZUNvdW50Om51bWJlcj1CYXNpY1JlY0ZpbGVzQ2FjaGUuREVGQVVMVF9NQVhfU0FNUExFUztcclxuICBwcml2YXRlIF9jdXJyZW50UmVjb3JkaW5nRmlsZTpSZWNvcmRpbmdGaWxlfG51bGw9bnVsbDtcclxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZXhwaXJlKCk6dm9pZDtcclxuXHJcbiAgZ2V0IGN1cnJlbnRSZWNvcmRpbmdGaWxlKCk6IFJlY29yZGluZ0ZpbGUgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLl9jdXJyZW50UmVjb3JkaW5nRmlsZTtcclxuICB9XHJcblxyXG4gIHNldCBjdXJyZW50UmVjb3JkaW5nRmlsZSh2YWx1ZTogUmVjb3JkaW5nRmlsZSB8IG51bGwpIHtcclxuICAgIHRoaXMuX2N1cnJlbnRSZWNvcmRpbmdGaWxlID0gdmFsdWU7XHJcbiAgICB0aGlzLmV4cGlyZSgpO1xyXG4gIH1cclxufVxyXG5cclxuXHJcblxyXG5leHBvcnQgY2xhc3MgU3BySXRlbXNDYWNoZSBleHRlbmRzIEJhc2ljUmVjRmlsZXNDYWNoZXtcclxuXHJcblxyXG4gICAgcHJpdmF0ZSBfaXRlbXM6QXJyYXk8SXRlbT49bmV3IEFycmF5PEl0ZW0+KCk7XHJcblxyXG4gICAgZ2V0IGl0ZW1zKCk6IEFycmF5PEl0ZW0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faXRlbXM7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkSXRlbShpdGVtOkl0ZW0pe1xyXG4gICAgICAgIHRoaXMuX2l0ZW1zLnB1c2goaXRlbSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0SXRlbShpbmRleDpudW1iZXIpe1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pdGVtc1tpbmRleF07XHJcbiAgICB9XHJcblxyXG4gICAgbGVuZ3RoKCk6bnVtYmVye1xyXG4gICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zLmxlbmd0aDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHJpdmF0ZSB0cnlFeHBpcmUodG9CZUV4cGlyZWRSZjpTcHJSZWNvcmRpbmdGaWxlKXtcclxuICAgICAgaWYoQmFzaWNSZWNGaWxlc0NhY2hlLkRFQlVHKWNvbnNvbGUuZGVidWcoXCJSZWMuIGZpbGVzIGNhY2hlOiBcIiArIHRvQmVFeHBpcmVkUmYudG9TdHJpbmcoKStcIiB0cnkgZXhwaXJlOlwiKTtcclxuICAgICAgaWYoIVJlY29yZGluZ0ZpbGVVdGlscy5lcXVhbHModG9CZUV4cGlyZWRSZix0aGlzLmN1cnJlbnRSZWNvcmRpbmdGaWxlKSkge1xyXG4gICAgICAgIGlmKEJhc2ljUmVjRmlsZXNDYWNoZS5ERUJVRyljb25zb2xlLmRlYnVnKFwiUmVjLiBmaWxlcyBjYWNoZTogXCIgKyB0b0JlRXhwaXJlZFJmLnRvU3RyaW5nKCkrXCIgbm90IGN1cnJlbnQgZmlsZS4uLlwiKTtcclxuICAgICAgICBpZiAodG9CZUV4cGlyZWRSZi5zZXJ2ZXJQZXJzaXN0ZWQpIHtcclxuICAgICAgICAgIGlmKEJhc2ljUmVjRmlsZXNDYWNoZS5ERUJVRyljb25zb2xlLmRlYnVnKFwiUmVjLiBmaWxlcyBjYWNoZTogXCIgKyB0b0JlRXhwaXJlZFJmLnRvU3RyaW5nKCkrXCIgaXMgc2VydmVyIHBlcnNpc3RlZC4uLlwiKTtcclxuICAgICAgICAgIC8vIGV4cGlyZSByZWNvcmRpbmcgZmlsZXMgZmlyc3Qgc3RvcmVkIHRvIHRoZSBjYWNoZVxyXG4gICAgICAgICAgbGV0IGV4cGlyZWRTYW1wbGVzID0gUmVjb3JkaW5nRmlsZVV0aWxzLmV4cGlyZUF1ZGlvRGF0YSh0b0JlRXhwaXJlZFJmKTtcclxuICAgICAgICAgIHRoaXMuX3NhbXBsZUNvdW50IC09IGV4cGlyZWRTYW1wbGVzO1xyXG4gICAgICAgICAgaWYoZXhwaXJlZFNhbXBsZXM+MCkge1xyXG4gICAgICAgICAgICBpZiAoQmFzaWNSZWNGaWxlc0NhY2hlLkRFQlVHKSBjb25zb2xlLmRlYnVnKFwiUmVjLiBmaWxlcyBjYWNoZTogRXhwaXJlZDogXCIgKyB0b0JlRXhwaXJlZFJmLnRvU3RyaW5nKCkgKyBcIi4gQ2FjaGUgc2FtcGxlcyBub3c6IFwiICsgdGhpcy5fc2FtcGxlQ291bnQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZihCYXNpY1JlY0ZpbGVzQ2FjaGUuREVCVUcpY29uc29sZS5kZWJ1ZyhcIlJlYy4gZmlsZXMgY2FjaGU6ICNcIiArIHRvQmVFeHBpcmVkUmYudG9TdHJpbmcoKSArIFwiIG5vdCB5ZXQgcGVyc2lzdGVkIG9uIHNlcnZlci5cIik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICBpZihCYXNpY1JlY0ZpbGVzQ2FjaGUuREVCVUcpY29uc29sZS5kZWJ1ZyhcIlJlYy4gZmlsZXMgY2FjaGU6IFwiICsgdG9CZUV4cGlyZWRSZi50b1N0cmluZygpK1wiIGlzIGN1cnJlbnQgZmlsZS5cIik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgcHJvdGVjdGVkIGV4cGlyZSgpIHtcclxuICAgIC8vIGV4cGlyZSBjb3JyZWN0ZWQgdmVyc2lvbnMgZmlyc3RcclxuICAgIGlmKEJhc2ljUmVjRmlsZXNDYWNoZS5ERUJVRyljb25zb2xlLmRlYnVnKFwiUmVjLiBmaWxlcyBjYWNoZTogRXhwaXJlPyBjdXJyZW50OiBcIit0aGlzLl9zYW1wbGVDb3VudCtcIiwgbWF4OiBcIit0aGlzLm1heFNhbXBsZUNvdW50KTtcclxuICAgIGlmICh0aGlzLl9zYW1wbGVDb3VudCA+IHRoaXMubWF4U2FtcGxlQ291bnQpIHtcclxuXHJcbiAgICAgIC8vIGV4cGlyZSBvbGRlciB2ZXJzaW9ucyBvZiBhbiBpdGVtIGZpcnN0XHJcbiAgICAgIGZvciAobGV0IGlpID0gMDsgaWkgPCB0aGlzLl9pdGVtcy5sZW5ndGg7IGlpKyspIHtcclxuICAgICAgICBpZiAodGhpcy5fc2FtcGxlQ291bnQgPD0gdGhpcy5tYXhTYW1wbGVDb3VudCkge1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBpdCA9IHRoaXMuX2l0ZW1zW2lpXTtcclxuICAgICAgICBsZXQgaXRSZnMgPSBpdC5yZWNzO1xyXG5cclxuICAgICAgICBpZiAoaXRSZnMgJiYgaXRSZnMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgZm9yIChsZXQgcmZpID0gMDsgcmZpIDwgaXRSZnMubGVuZ3RoIC0gMTsgcmZpKyspIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3NhbXBsZUNvdW50IDw9IHRoaXMubWF4U2FtcGxlQ291bnQpIHtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgdG9CZUV4cGlyZWRSZiA9IGl0UmZzW3JmaV07XHJcbiAgICAgICAgICAgIHRoaXMudHJ5RXhwaXJlKHRvQmVFeHBpcmVkUmYpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gaWYgdGhhdCdzIG5vdCBzdWZmaWNpZW50IGV4cGlyZSBhdWRpbyBkYXRhIG9mIGxhdGVzdCB2ZXJzaW9ucyBhcyB3ZWxsXHJcbiAgICAgIGZvciAobGV0IGlpID0gMDsgaWkgPCB0aGlzLl9pdGVtcy5sZW5ndGg7IGlpKyspIHtcclxuICAgICAgICBpZiAodGhpcy5fc2FtcGxlQ291bnQgPD0gdGhpcy5tYXhTYW1wbGVDb3VudCkge1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBpdCA9IHRoaXMuX2l0ZW1zW2lpXTtcclxuICAgICAgICBsZXQgaXRSZnMgPSBpdC5yZWNzO1xyXG5cclxuICAgICAgICBpZiAoaXRSZnMgJiYgaXRSZnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgZm9yIChsZXQgcmZpID0gMDsgcmZpIDwgaXRSZnMubGVuZ3RoOyByZmkrKykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fc2FtcGxlQ291bnQgPD0gdGhpcy5tYXhTYW1wbGVDb3VudCkge1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCB0b0JlRXhwaXJlZFJmID0gaXRSZnNbcmZpXTtcclxuICAgICAgICAgICAgdGhpcy50cnlFeHBpcmUodG9CZUV4cGlyZWRSZik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGRTcHJSZWNGaWxlKGl0ZW06SXRlbSxzcHJSZWNGaWxlOlNwclJlY29yZGluZ0ZpbGUpe1xyXG4gICAgdGhpcy5leHBpcmUoKTtcclxuICAgIGlmKCFpdGVtLnJlY3MpIHtcclxuICAgICAgaXRlbS5yZWNzPW5ldyBBcnJheTxTcHJSZWNvcmRpbmdGaWxlPigpO1xyXG4gICAgfVxyXG4gICAgaXRlbS5yZWNzW3NwclJlY0ZpbGUudmVyc2lvbl09c3ByUmVjRmlsZTtcclxuICAgIHRoaXMuX3NhbXBsZUNvdW50ICs9IFJlY29yZGluZ0ZpbGVVdGlscy5zYW1wbGVDb3VudChzcHJSZWNGaWxlKTtcclxuICAgIGlmKEJhc2ljUmVjRmlsZXNDYWNoZS5ERUJVRyljb25zb2xlLmRlYnVnKFwiUmVjLiBmaWxlcyBjYWNoZTogQWRkZWQuIENhY2hlIHNhbXBsZXM6IFwiK3RoaXMuX3NhbXBsZUNvdW50KTtcclxuICB9XHJcblxyXG4gIHNldFNwclJlY0ZpbGVBdWRpb0RhdGEoc3ByUmVjRmlsZTpTcHJSZWNvcmRpbmdGaWxlLCBhZGg6QXVkaW9EYXRhSG9sZGVyfG51bGwpe1xyXG4gICAgdGhpcy5leHBpcmUoKTtcclxuICAgIGlmKEJhc2ljUmVjRmlsZXNDYWNoZS5ERUJVRyljb25zb2xlLmRlYnVnKFwiUmVjLiBmaWxlcyBjYWNoZTogU2V0IGF1ZGlvIGRhdGEgYWZ0ZXIgZXhwaXJlLiBDYWNoZSBzYW1wbGVzOiBcIit0aGlzLl9zYW1wbGVDb3VudCk7XHJcbiAgICBsZXQgY3VyclNhbXBsZUNudD1SZWNvcmRpbmdGaWxlVXRpbHMuc2FtcGxlQ291bnQoc3ByUmVjRmlsZSk7XHJcbiAgICB0aGlzLl9zYW1wbGVDb3VudC09Y3VyclNhbXBsZUNudDtcclxuICAgIGlmKEJhc2ljUmVjRmlsZXNDYWNoZS5ERUJVRyljb25zb2xlLmRlYnVnKFwiUmVjLiBmaWxlcyBjYWNoZTogU2V0IGF1ZGlvIGRhdGEgc3VidHJhY3RlZCBjdXJyIHNhbXBsZSBjb3VudDogXCIrY3VyclNhbXBsZUNudCtcIi4gQ2FjaGUgc2FtcGxlczogXCIrdGhpcy5fc2FtcGxlQ291bnQpO1xyXG4gICAgUmVjb3JkaW5nRmlsZVV0aWxzLnNldEF1ZGlvRGF0YShzcHJSZWNGaWxlLGFkaCk7XHJcbiAgICBsZXQgbmV3U2FtcGxlQ250PVJlY29yZGluZ0ZpbGVVdGlscy5zYW1wbGVDb3VudChzcHJSZWNGaWxlKTtcclxuICAgIHRoaXMuX3NhbXBsZUNvdW50Kz1uZXdTYW1wbGVDbnQ7XHJcbiAgICBpZihCYXNpY1JlY0ZpbGVzQ2FjaGUuREVCVUcpY29uc29sZS5kZWJ1ZyhcIlJlYy4gZmlsZXMgY2FjaGU6IFNldCBhdWRpbyBkYXRhIGFkZGVkIG5ldyBzYW1wbGUgY291bnQ6IFwiK25ld1NhbXBsZUNudCtcIi4gQ2FjaGUgc2FtcGxlczogXCIrdGhpcy5fc2FtcGxlQ291bnQpO1xyXG4gICAgbGV0IGZsPWFkaD8uZnJhbWVMZW47XHJcbiAgICBpZihzcHJSZWNGaWxlLmZyYW1lcz09bnVsbCAmJiBmbCl7XHJcbiAgICAgIHNwclJlY0ZpbGUuZnJhbWVzPWZsO1xyXG4gICAgfVxyXG4gICAgaWYoQmFzaWNSZWNGaWxlc0NhY2hlLkRFQlVHKWNvbnNvbGUuZGVidWcoXCJSZWMuIGZpbGVzIGNhY2hlOiBTZXQgYXVkaW8gZGF0YS4gQ2FjaGUgc2FtcGxlczogXCIrdGhpcy5fc2FtcGxlQ291bnQpO1xyXG4gIH1cclxufVxyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBSZWNGaWxlc0NhY2hlIGV4dGVuZHMgQmFzaWNSZWNGaWxlc0NhY2hle1xyXG5cclxuICBwcml2YXRlIF9yZWNGaWxlczpBcnJheTxSZWNvcmRpbmdGaWxlPj1uZXcgQXJyYXk8UmVjb3JkaW5nRmlsZT4oKTtcclxuXHJcbiAgZ2V0IHJlY0ZpbGVzKCk6IEFycmF5PFJlY29yZGluZ0ZpbGU+IHtcclxuICAgIHJldHVybiB0aGlzLl9yZWNGaWxlcztcclxuICB9XHJcblxyXG4gIGdldFJlY0ZpbGUoaW5kZXg6bnVtYmVyKXtcclxuICAgIHJldHVybiB0aGlzLl9yZWNGaWxlc1tpbmRleF07XHJcbiAgfVxyXG5cclxuICBsZW5ndGgoKTpudW1iZXJ7XHJcbiAgICByZXR1cm4gdGhpcy5fcmVjRmlsZXMubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGV4cGlyZSgpIHtcclxuICAgIGlmICh0aGlzLl9zYW1wbGVDb3VudCA+IHRoaXMubWF4U2FtcGxlQ291bnQpIHtcclxuICAgICAgLy8gYXVkaW8gcmVjb3JkZXIgbGlzdCBpcyBzb3J0ZWQ6IGxvd2VyIGluZGV4IGlzIG5ld2VyXHJcbiAgICAgIGZvciAobGV0IHJmSSA9IHRoaXMuX3JlY0ZpbGVzLmxlbmd0aC0xOyByZkkgPj0wOyByZkktLSkge1xyXG4gICAgICAgIGlmICh0aGlzLl9zYW1wbGVDb3VudCA8PSB0aGlzLm1heFNhbXBsZUNvdW50KSB7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHRvQmVFeHBpcmVkUmYgPSB0aGlzLl9yZWNGaWxlc1tyZkldO1xyXG4gICAgICAgIGlmICh0b0JlRXhwaXJlZFJmLnNlcnZlclBlcnNpc3RlZCkge1xyXG4gICAgICAgICAgaWYoIVJlY29yZGluZ0ZpbGVVdGlscy5lcXVhbHModG9CZUV4cGlyZWRSZix0aGlzLmN1cnJlbnRSZWNvcmRpbmdGaWxlKSkge1xyXG4gICAgICAgICAgICAvLyBleHBpcmUgcmVjb3JkaW5nIGZpbGVzIGZpcnN0IHN0b3JlZCB0byB0aGUgY2FjaGVcclxuICAgICAgICAgICAgbGV0IGV4cGlyZWRTYW1wbGVzID0gUmVjb3JkaW5nRmlsZVV0aWxzLmV4cGlyZUF1ZGlvRGF0YSh0b0JlRXhwaXJlZFJmKTtcclxuICAgICAgICAgICAgdGhpcy5fc2FtcGxlQ291bnQgLT0gZXhwaXJlZFNhbXBsZXM7XHJcbiAgICAgICAgICAgIGlmKGV4cGlyZWRTYW1wbGVzPjApIHtcclxuICAgICAgICAgICAgICBpZiAoQmFzaWNSZWNGaWxlc0NhY2hlLkRFQlVHKSBjb25zb2xlLmRlYnVnKFwiUmVjLiBmaWxlcyBjYWNoZTogRXhwaXJlZCAjXCIgKyByZkkgKyBcIi4gQ2FjaGUgc2FtcGxlczogXCIgKyB0aGlzLl9zYW1wbGVDb3VudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBpZihCYXNpY1JlY0ZpbGVzQ2FjaGUuREVCVUcpY29uc29sZS5kZWJ1ZyhcIlJlYy4gZmlsZXMgY2FjaGU6ICNcIityZkkrXCIgaXMgY3VycmVudCBmaWxlLiAobm90IGV4cGlyaW5nKVwiKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIGlmKEJhc2ljUmVjRmlsZXNDYWNoZS5ERUJVRyljb25zb2xlLmRlYnVnKFwiUmVjLiBmaWxlcyBjYWNoZTogI1wiK3JmSStcIiBub3QgeWV0IHNlcnZlciBwZXJzaXN0ZWQuXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkUmVjRmlsZShyZWNGaWxlOlJlY29yZGluZ0ZpbGUpe1xyXG4gICAgdGhpcy5leHBpcmUoKTtcclxuICAgIHRoaXMuX3JlY0ZpbGVzLnB1c2gocmVjRmlsZSk7XHJcbiAgICB0aGlzLl9zYW1wbGVDb3VudCArPSBSZWNvcmRpbmdGaWxlVXRpbHMuc2FtcGxlQ291bnQocmVjRmlsZSk7XHJcbiAgICBpZihCYXNpY1JlY0ZpbGVzQ2FjaGUuREVCVUcpY29uc29sZS5kZWJ1ZyhcIlJlYy4gZmlsZXMgY2FjaGU6IEFkZGVkLiBDYWNoZSBzYW1wbGVzOiBcIit0aGlzLl9zYW1wbGVDb3VudCk7XHJcbiAgfVxyXG5cclxuICBzZXRSZWNGaWxlQXVkaW9EYXRhKHJlY0ZpbGU6UmVjb3JkaW5nRmlsZSwgYWRoOkF1ZGlvRGF0YUhvbGRlcnxudWxsKXtcclxuICAgIHRoaXMuZXhwaXJlKCk7XHJcbiAgICB0aGlzLl9zYW1wbGVDb3VudC09UmVjb3JkaW5nRmlsZVV0aWxzLnNhbXBsZUNvdW50KHJlY0ZpbGUpO1xyXG4gICAgUmVjb3JkaW5nRmlsZVV0aWxzLnNldEF1ZGlvRGF0YShyZWNGaWxlLGFkaCk7XHJcbiAgICB0aGlzLl9zYW1wbGVDb3VudCs9UmVjb3JkaW5nRmlsZVV0aWxzLnNhbXBsZUNvdW50KHJlY0ZpbGUpO1xyXG4gICAgaWYoQmFzaWNSZWNGaWxlc0NhY2hlLkRFQlVHKWNvbnNvbGUuZGVidWcoXCJSZWMuIGZpbGVzIGNhY2hlOiBTZXQgYXVkaW8gZGF0YS4gQ2FjaGUgc2FtcGxlczogXCIrdGhpcy5fc2FtcGxlQ291bnQpO1xyXG4gIH1cclxufVxyXG5cclxuIl19
@@ -1,188 +0,0 @@
1
- import { Component, EventEmitter, Input, Output } from "@angular/core";
2
- import { MediaUtils } from "../../media/utils";
3
- import { MatTableDataSource } from "@angular/material/table";
4
- import { RecFilesCache } from "./recording_file_cache";
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@angular/material/icon";
7
- import * as i2 from "@angular/material/button";
8
- import * as i3 from "@angular/material/card";
9
- import * as i4 from "@angular/material/table";
10
- import * as i5 from "../../utils/scrollIntoViewToBottom";
11
- import * as i6 from "@angular/common";
12
- export class RecordingList {
13
- constructor() {
14
- //private recordingList:Array<RecordingFile>=new Array<RecordingFile>();
15
- this.recordingList = new RecFilesCache();
16
- //cols=['index','length','samples','samplerate','action'];
17
- this.cols = ['index', 'startedDate', 'length', 'action'];
18
- this.selectDisabled = false;
19
- this.selectedRecordingFileChanged = new EventEmitter();
20
- this.selectedRecordingFile = null;
21
- this.recordingListDataSource = new MatTableDataSource();
22
- }
23
- ngAfterViewInit() {
24
- this.buildDataSource();
25
- }
26
- buildDataSource() {
27
- this.recordingList.recFiles.sort((a, b) => {
28
- let cmp = 0;
29
- let aD = null;
30
- let bD = null;
31
- if (a._startedAsDateObj && b._startedAsDateObj) {
32
- aD = a._startedAsDateObj;
33
- bD = b._startedAsDateObj;
34
- }
35
- else if (a.startedDate && b.startedDate) {
36
- aD = new Date(a.startedDate);
37
- bD = new Date(b.startedDate);
38
- }
39
- else if (a.date && b.date) {
40
- aD = new Date(a.date);
41
- bD = new Date(b.date);
42
- }
43
- if (aD !== null && bD !== null) {
44
- cmp = bD.getTime() - aD.getTime();
45
- }
46
- return cmp;
47
- });
48
- this.recordingListDataSource.data = this.recordingList.recFiles;
49
- }
50
- addRecFile(rf) {
51
- this.recordingList.addRecFile(rf);
52
- this.buildDataSource();
53
- }
54
- setRecFileAudioData(recFile, adh) {
55
- this.recordingList.setRecFileAudioData(recFile, adh);
56
- }
57
- selectRecordingFile(rf) {
58
- this.recordingList.currentRecordingFile = rf;
59
- this.selectedRecordingFileChanged.emit(rf);
60
- }
61
- selectTop() {
62
- if (this.recordingList.recFiles.length > 0) {
63
- this.selectRecordingFile(this.recordingList.recFiles[0]);
64
- }
65
- }
66
- lengthTimeFormatted(rf) {
67
- let str = '--:--:--';
68
- let tl = null;
69
- if (rf.timeLength) {
70
- tl = rf.timeLength;
71
- }
72
- else if (rf.frames && rf.audioDataHolder) {
73
- tl = rf.frames / rf.audioDataHolder?.sampleRate;
74
- }
75
- if (tl) {
76
- str = MediaUtils.toMediaTime(tl);
77
- }
78
- return str;
79
- }
80
- recordingFileCached(rf) {
81
- let cached = null;
82
- if (rf && rf.serverPersisted) {
83
- cached = (rf.audioDataHolder != null);
84
- }
85
- return cached;
86
- }
87
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: RecordingList, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
88
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: RecordingList, selector: "app-recordinglist", inputs: { selectDisabled: "selectDisabled", selectedRecordingFile: "selectedRecordingFile" }, outputs: { selectedRecordingFileChanged: "selectedRecordingFileChanged" }, ngImport: i0, template: `
89
- <mat-card appearance="outlined">
90
- <mat-card-header>
91
- <h2>Recording list</h2>
92
- </mat-card-header>
93
- <mat-card-content>
94
- <table mat-table [dataSource]="recordingListDataSource" class="mat-elevation-z0">
95
- <tr mat-header-row *matHeaderRowDef="cols;sticky:true"></tr>
96
- <tr mat-row *matRowDef="let element; columns: cols;"
97
- [scrollIntoViewToBottom]="element.uuid===selectedRecordingFile?.uuid" [class.selected]="element.uuid===selectedRecordingFile?.uuid"></tr>
98
- <ng-container matColumnDef="index">
99
- <th mat-header-cell *matHeaderCellDef mat-header>#</th>
100
- <td mat-cell class="monospaced"
101
- *matCellDef="let element;let i = index">{{recordingListDataSource.data.length - i}}</td>
102
- </ng-container>
103
- <ng-container matColumnDef="startedDate">
104
- <th mat-header-cell *matHeaderCellDef mat-header>Started</th>
105
- <td mat-cell class="monospaced"
106
- *matCellDef="let element">{{element.startedDate | date:'YYYY-MM-dd HH:mm:ss'}}</td>
107
- </ng-container>
108
- <ng-container matColumnDef="length">
109
- <th mat-header-cell *matHeaderCellDef mat-header>Length</th>
110
- <td mat-cell class="monospaced" *matCellDef="let element">{{lengthTimeFormatted(element)}}</td>
111
- </ng-container>
112
- <ng-container matColumnDef="action">
113
- <th mat-header-cell *matHeaderCellDef>Action</th>
114
- <td mat-cell *matCellDef="let element">
115
- <!--
116
- <mat-icon *ngIf="recordingFileCached(element)===false" style="font-size:0.8em;width:0.8em;height:0.8em">
117
- cloud_download
118
- </mat-icon>
119
- -->
120
- <button mat-stroked-button color="primary" (click)="selectRecordingFile(element)"
121
- [disabled]="selectDisabled || element.uuid===selectedRecordingFile?.uuid">
122
- <mat-icon>edit_attributes</mat-icon>
123
- Select
124
- </button>
125
-
126
- </td>
127
- </ng-container>
128
- </table>
129
- </mat-card-content>
130
- </mat-card>
131
-
132
- `, isInline: true, styles: [".monospaced{font-family:monospace}.mat-mdc-cell,.mat-mdc-header-cell{padding-left:5px;padding-right:5px}.mat-mdc-card,.mat-mdc-card-header,.mat-mdc-card-content{width:auto}.flexForm{display:flex;flex-direction:column;width:auto}.flexFill{margin:0;width:100%;height:100%;min-width:100%;min-height:100%}.spr-button-icon{font-size:24px;vertical-align:middle;overflow:hidden;text-overflow:clip;white-space:nowrap}\n", ":host{position:relative;margin:0;padding:0;background:#d3d3d3;width:100%;flex:1;overflow-y:auto;min-height:0px}\n", ".selected{font-weight:700}\n"], dependencies: [{ kind: "component", type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i2.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i3.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i3.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i3.MatCardHeader, selector: "mat-card-header" }, { kind: "component", type: i4.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i4.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i4.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i4.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i4.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i4.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i4.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i4.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i4.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i4.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i5.ScrollIntoViewDirective, selector: "[scrollIntoViewToBottom]", inputs: ["scrollIntoViewToBottom"] }, { kind: "pipe", type: i6.DatePipe, name: "date" }] }); }
133
- }
134
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: RecordingList, decorators: [{
135
- type: Component,
136
- args: [{ selector: 'app-recordinglist', template: `
137
- <mat-card appearance="outlined">
138
- <mat-card-header>
139
- <h2>Recording list</h2>
140
- </mat-card-header>
141
- <mat-card-content>
142
- <table mat-table [dataSource]="recordingListDataSource" class="mat-elevation-z0">
143
- <tr mat-header-row *matHeaderRowDef="cols;sticky:true"></tr>
144
- <tr mat-row *matRowDef="let element; columns: cols;"
145
- [scrollIntoViewToBottom]="element.uuid===selectedRecordingFile?.uuid" [class.selected]="element.uuid===selectedRecordingFile?.uuid"></tr>
146
- <ng-container matColumnDef="index">
147
- <th mat-header-cell *matHeaderCellDef mat-header>#</th>
148
- <td mat-cell class="monospaced"
149
- *matCellDef="let element;let i = index">{{recordingListDataSource.data.length - i}}</td>
150
- </ng-container>
151
- <ng-container matColumnDef="startedDate">
152
- <th mat-header-cell *matHeaderCellDef mat-header>Started</th>
153
- <td mat-cell class="monospaced"
154
- *matCellDef="let element">{{element.startedDate | date:'YYYY-MM-dd HH:mm:ss'}}</td>
155
- </ng-container>
156
- <ng-container matColumnDef="length">
157
- <th mat-header-cell *matHeaderCellDef mat-header>Length</th>
158
- <td mat-cell class="monospaced" *matCellDef="let element">{{lengthTimeFormatted(element)}}</td>
159
- </ng-container>
160
- <ng-container matColumnDef="action">
161
- <th mat-header-cell *matHeaderCellDef>Action</th>
162
- <td mat-cell *matCellDef="let element">
163
- <!--
164
- <mat-icon *ngIf="recordingFileCached(element)===false" style="font-size:0.8em;width:0.8em;height:0.8em">
165
- cloud_download
166
- </mat-icon>
167
- -->
168
- <button mat-stroked-button color="primary" (click)="selectRecordingFile(element)"
169
- [disabled]="selectDisabled || element.uuid===selectedRecordingFile?.uuid">
170
- <mat-icon>edit_attributes</mat-icon>
171
- Select
172
- </button>
173
-
174
- </td>
175
- </ng-container>
176
- </table>
177
- </mat-card-content>
178
- </mat-card>
179
-
180
- `, styles: [".monospaced{font-family:monospace}.mat-mdc-cell,.mat-mdc-header-cell{padding-left:5px;padding-right:5px}.mat-mdc-card,.mat-mdc-card-header,.mat-mdc-card-content{width:auto}.flexForm{display:flex;flex-direction:column;width:auto}.flexFill{margin:0;width:100%;height:100%;min-width:100%;min-height:100%}.spr-button-icon{font-size:24px;vertical-align:middle;overflow:hidden;text-overflow:clip;white-space:nowrap}\n", ":host{position:relative;margin:0;padding:0;background:#d3d3d3;width:100%;flex:1;overflow-y:auto;min-height:0px}\n", ".selected{font-weight:700}\n"] }]
181
- }], ctorParameters: () => [], propDecorators: { selectDisabled: [{
182
- type: Input
183
- }], selectedRecordingFileChanged: [{
184
- type: Output
185
- }], selectedRecordingFile: [{
186
- type: Input
187
- }] } });
188
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkaW5nX2xpc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvc3BlZWNocmVjb3JkZXIvc2Vzc2lvbi9yZWNvcmRpbmdfbGlzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWdCLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUVwRixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDN0MsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDM0QsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7OztBQTRFckQsTUFBTSxPQUFPLGFBQWE7SUFXeEI7UUFWQSx3RUFBd0U7UUFDaEUsa0JBQWEsR0FBZSxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBR3hELDBEQUEwRDtRQUMxRCxTQUFJLEdBQUMsQ0FBQyxPQUFPLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxRQUFRLENBQUMsQ0FBQztRQUN0QyxtQkFBYyxHQUFTLEtBQUssQ0FBQztRQUM1QixpQ0FBNEIsR0FBRyxJQUFJLFlBQVksRUFBaUIsQ0FBQztRQUNsRSwwQkFBcUIsR0FBb0IsSUFBSSxDQUFDO1FBR3JELElBQUksQ0FBQyx1QkFBdUIsR0FBQyxJQUFJLGtCQUFrQixFQUFpQixDQUFDO0lBQ3ZFLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFTyxlQUFlO1FBQ3JCLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN4QyxJQUFJLEdBQUcsR0FBUSxDQUFDLENBQUM7WUFDakIsSUFBSSxFQUFFLEdBQVcsSUFB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UUFDaEIsSUFBRyxFQUFFLElBQUksRUFBRSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzVCLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7K0dBbEZVLGFBQWE7bUdBQWIsYUFBYSxrT0FyRWQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNENUOzs0RkF5QlUsYUFBYTtrQkF6RXpCLFNBQVM7K0JBRUUsbUJBQW1CLFlBRW5COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRDVDt3REFnQ1EsY0FBYztzQkFBdEIsS0FBSztnQkFDSSw0QkFBNEI7c0JBQXJDLE1BQU07Z0JBQ0UscUJBQXFCO3NCQUE3QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtSZWNvcmRpbmdGaWxlfSBmcm9tIFwiLi4vcmVjb3JkaW5nXCI7XHJcbmltcG9ydCB7TWVkaWFVdGlsc30gZnJvbSBcIi4uLy4uL21lZGlhL3V0aWxzXCI7XHJcbmltcG9ydCB7TWF0VGFibGVEYXRhU291cmNlfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGVcIjtcclxuaW1wb3J0IHtSZWNGaWxlc0NhY2hlfSBmcm9tIFwiLi9yZWNvcmRpbmdfZmlsZV9jYWNoZVwiO1xyXG5pbXBvcnQge0F1ZGlvRGF0YUhvbGRlcn0gZnJvbSBcIi4uLy4uL2F1ZGlvL2F1ZGlvX2RhdGFfaG9sZGVyXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuXHJcbiAgc2VsZWN0b3I6ICdhcHAtcmVjb3JkaW5nbGlzdCcsXHJcblxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8bWF0LWNhcmQgYXBwZWFyYW5jZT1cIm91dGxpbmVkXCI+XHJcbiAgICAgIDxtYXQtY2FyZC1oZWFkZXI+XHJcbiAgICAgICAgPGgyPlJlY29yZGluZyBsaXN0PC9oMj5cclxuICAgICAgPC9tYXQtY2FyZC1oZWFkZXI+XHJcbiAgICAgIDxtYXQtY2FyZC1jb250ZW50PlxyXG4gICAgICAgIDx0YWJsZSBtYXQtdGFibGUgW2RhdGFTb3VyY2VdPVwicmVjb3JkaW5nTGlzdERhdGFTb3VyY2VcIiBjbGFzcz1cIm1hdC1lbGV2YXRpb24tejBcIj5cclxuICAgICAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiY29scztzdGlja3k6dHJ1ZVwiPjwvdHI+XHJcbiAgICAgICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IGVsZW1lbnQ7IGNvbHVtbnM6IGNvbHM7XCJcclxuICAgICAgICAgICAgICBbc2Nyb2xsSW50b1ZpZXdUb0JvdHRvbV09XCJlbGVtZW50LnV1aWQ9PT1zZWxlY3RlZFJlY29yZGluZ0ZpbGU/LnV1aWRcIiBbY2xhc3Muc2VsZWN0ZWRdPVwiZWxlbWVudC51dWlkPT09c2VsZWN0ZWRSZWNvcmRpbmdGaWxlPy51dWlkXCI+PC90cj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiaW5kZXhcIj5cclxuICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXQtaGVhZGVyPiM8L3RoPlxyXG4gICAgICAgICAgICA8dGQgbWF0LWNlbGwgY2xhc3M9XCJtb25vc3BhY2VkXCJcclxuICAgICAgICAgICAgICAgICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnQ7bGV0IGkgPSBpbmRleFwiPnt7cmVjb3JkaW5nTGlzdERhdGFTb3VyY2UuZGF0YS5sZW5ndGggLSBpfX08L3RkPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInN0YXJ0ZWREYXRlXCI+XHJcbiAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LWhlYWRlcj5TdGFydGVkPC90aD5cclxuICAgICAgICAgICAgPHRkIG1hdC1jZWxsIGNsYXNzPVwibW9ub3NwYWNlZFwiXHJcbiAgICAgICAgICAgICAgICAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+e3tlbGVtZW50LnN0YXJ0ZWREYXRlIHwgZGF0ZTonWVlZWS1NTS1kZCBISDptbTpzcyd9fTwvdGQ+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwibGVuZ3RoXCI+XHJcbiAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LWhlYWRlcj5MZW5ndGg8L3RoPlxyXG4gICAgICAgICAgICA8dGQgbWF0LWNlbGwgY2xhc3M9XCJtb25vc3BhY2VkXCIgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPnt7bGVuZ3RoVGltZUZvcm1hdHRlZChlbGVtZW50KX19PC90ZD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJhY3Rpb25cIj5cclxuICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5BY3Rpb248L3RoPlxyXG4gICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxyXG4gICAgICAgICAgICAgIDwhLS1cclxuICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJyZWNvcmRpbmdGaWxlQ2FjaGVkKGVsZW1lbnQpPT09ZmFsc2VcIiBzdHlsZT1cImZvbnQtc2l6ZTowLjhlbTt3aWR0aDowLjhlbTtoZWlnaHQ6MC44ZW1cIj5cclxuICAgICAgICAgICAgICAgIGNsb3VkX2Rvd25sb2FkXHJcbiAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAtLT5cclxuICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwic2VsZWN0UmVjb3JkaW5nRmlsZShlbGVtZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwic2VsZWN0RGlzYWJsZWQgfHwgZWxlbWVudC51dWlkPT09c2VsZWN0ZWRSZWNvcmRpbmdGaWxlPy51dWlkXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24+ZWRpdF9hdHRyaWJ1dGVzPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgIFNlbGVjdFxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvdGFibGU+XHJcbiAgICAgIDwvbWF0LWNhcmQtY29udGVudD5cclxuICAgIDwvbWF0LWNhcmQ+XHJcblxyXG4gIGAsXHJcbiAgc3R5bGVzOiBbYDpob3N0IHtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIHBhZGRpbmc6IDA7XHJcbiAgICBiYWNrZ3JvdW5kOiBsaWdodGdyZXk7XHJcbiAgICB3aWR0aDogMTAwJTsgLyogdXNlIGFsbCBob3Jpem9udGFsIGF2YWlsYWJsZSBzcGFjZSAqL1xyXG4gICAgZmxleDogMTsgLyogLi4uIGFuZCBmaWxsIHJlc3Qgb2YgdmVydGljYWwgYXZhaWxhYmxlIHNwYWNlIChvdGhlciBjb21wb25lbnRzIGhhdmUgZmxleCAwKSAqL1xyXG4gICAgb3ZlcmZsb3cteTogYXV0bztcclxuXHJcbiAgICAvKiBXb3JrYXJvdW5kIGZvciBGaXJlZm94XHJcbiAgICBJZiB0aGUgcHJvZ3Jlc3MgdGFibGUgZ2V0cyBsb25nIChzY3JpcHQgd2l0aCBtYW55IGl0ZW1zKSBGRiBpbmNyZWFzZXMgdGhlIGhlaWdodCBvZiB0aGUgb3ZlcmZsb3cgcHJvZ3Jlc3NDb250YWluZXIgYW5kXHJcbiAgICB0aGUgd2hvbGUgYXBwIGRvZXMgbm90IGZpdCBpbnRvIHRoZSBwYWdlIGFueW1vcmUuIFRoZSBhcHAgb3ZlcmZsb3dzIGFuZCBzaG93cyBhIHZlcnRpY2FsIHNjcm9sbGJhciBmb3IgdGhlIHdob2xlIGFwcC5cclxuICAgIFNlZSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yODYzNjgzMi9maXJlZm94LW92ZXJmbG93LXktbm90LXdvcmtpbmctd2l0aC1uZXN0ZWQtZmxleGJveFxyXG4gICAgKi9cclxuICAgIG1pbi1oZWlnaHQ6IDBweDtcclxuXHJcbiAgfWAsYFxyXG4gICAgLnNlbGVjdGVke1xyXG4gICAgICBmb250LXdlaWdodDogYm9sZDtcclxuICAgIH1cclxuICBgXSxcclxuICBzdHlsZVVybHM6IFsnLi4vLi4vc3BlZWNocmVjb3JkZXJfbWF0LnNjc3MnXVxyXG5cclxufSlcclxuZXhwb3J0IGNsYXNzIFJlY29yZGluZ0xpc3QgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0e1xyXG4gIC8vcHJpdmF0ZSByZWNvcmRpbmdMaXN0OkFycmF5PFJlY29yZGluZ0ZpbGU+PW5ldyBBcnJheTxSZWNvcmRpbmdGaWxlPigpO1xyXG4gIHByaXZhdGUgcmVjb3JkaW5nTGlzdDpSZWNGaWxlc0NhY2hlPW5ldyBSZWNGaWxlc0NhY2hlKCk7XHJcbiAgLy9yZWNvcmRpbmdMaXN0U3ViamVjdDpTdWJqZWN0PEFycmF5PFJlY29yZGluZ0ZpbGU+PiA9IG5ldyBTdWJqZWN0PEFycmF5PFJlY29yZGluZ0ZpbGU+PigpO1xyXG4gIHJlY29yZGluZ0xpc3REYXRhU291cmNlOk1hdFRhYmxlRGF0YVNvdXJjZTxSZWNvcmRpbmdGaWxlPjtcclxuICAvL2NvbHM9WydpbmRleCcsJ2xlbmd0aCcsJ3NhbXBsZXMnLCdzYW1wbGVyYXRlJywnYWN0aW9uJ107XHJcbiAgY29scz1bJ2luZGV4Jywnc3RhcnRlZERhdGUnLCdsZW5ndGgnLCdhY3Rpb24nXTtcclxuICBASW5wdXQoKSBzZWxlY3REaXNhYmxlZDpib29sZWFuPWZhbHNlO1xyXG4gIEBPdXRwdXQoKSBzZWxlY3RlZFJlY29yZGluZ0ZpbGVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxSZWNvcmRpbmdGaWxlPigpO1xyXG4gIEBJbnB1dCgpIHNlbGVjdGVkUmVjb3JkaW5nRmlsZTpSZWNvcmRpbmdGaWxlfG51bGw9bnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICB0aGlzLnJlY29yZGluZ0xpc3REYXRhU291cmNlPW5ldyBNYXRUYWJsZURhdGFTb3VyY2U8UmVjb3JkaW5nRmlsZT4oKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIHRoaXMuYnVpbGREYXRhU291cmNlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJ1aWxkRGF0YVNvdXJjZSgpe1xyXG4gICAgdGhpcy5yZWNvcmRpbmdMaXN0LnJlY0ZpbGVzLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgbGV0IGNtcDpudW1iZXI9MDtcclxuICAgICAgbGV0IGFEOkRhdGV8bnVsbD1udWxsO1xyXG4gICAgICBsZXQgYkQ6RGF0ZXxudWxsPW51bGw7XHJcbiAgICAgIGlmKGEuX3N0YXJ0ZWRBc0RhdGVPYmogJiYgYi5fc3RhcnRlZEFzRGF0ZU9iail7XHJcbiAgICAgICAgYUQ9YS5fc3RhcnRlZEFzRGF0ZU9ialxyXG4gICAgICAgIGJEPWIuX3N0YXJ0ZWRBc0RhdGVPYmpcclxuICAgICAgfWVsc2UgaWYoYS5zdGFydGVkRGF0ZSAmJiBiLnN0YXJ0ZWREYXRlKXtcclxuICAgICAgICBhRD1uZXcgRGF0ZShhLnN0YXJ0ZWREYXRlKTtcclxuICAgICAgICBiRD1uZXcgRGF0ZShiLnN0YXJ0ZWREYXRlKTtcclxuICAgICAgfWVsc2UgaWYoYS5kYXRlICYmIGIuZGF0ZSkge1xyXG4gICAgICAgIGFEPW5ldyBEYXRlKGEuZGF0ZSk7XHJcbiAgICAgICAgYkQ9bmV3IERhdGUoYi5kYXRlKTtcclxuICAgICAgfVxyXG4gICAgICBpZihhRCE9PW51bGwgJiYgYkQhPT1udWxsKXtcclxuICAgICAgICBjbXA9YkQuZ2V0VGltZSgpLWFELmdldFRpbWUoKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gY21wO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLnJlY29yZGluZ0xpc3REYXRhU291cmNlLmRhdGE9dGhpcy5yZWNvcmRpbmdMaXN0LnJlY0ZpbGVzO1xyXG4gIH1cclxuXHJcbiAgYWRkUmVjRmlsZShyZjpSZWNvcmRpbmdGaWxlKXtcclxuICAgIHRoaXMucmVjb3JkaW5nTGlzdC5hZGRSZWNGaWxlKHJmKTtcclxuICAgIHRoaXMuYnVpbGREYXRhU291cmNlKCk7XHJcbiAgfVxyXG5cclxuICBzZXRSZWNGaWxlQXVkaW9EYXRhKHJlY0ZpbGU6UmVjb3JkaW5nRmlsZSwgYWRoOkF1ZGlvRGF0YUhvbGRlcnxudWxsKSB7XHJcbiAgICB0aGlzLnJlY29yZGluZ0xpc3Quc2V0UmVjRmlsZUF1ZGlvRGF0YShyZWNGaWxlLGFkaCk7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RSZWNvcmRpbmdGaWxlKHJmOlJlY29yZGluZ0ZpbGUpe1xyXG4gICAgdGhpcy5yZWNvcmRpbmdMaXN0LmN1cnJlbnRSZWNvcmRpbmdGaWxlPXJmO1xyXG4gICAgdGhpcy5zZWxlY3RlZFJlY29yZGluZ0ZpbGVDaGFuZ2VkLmVtaXQocmYpO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0VG9wKCkge1xyXG4gICAgaWYgKHRoaXMucmVjb3JkaW5nTGlzdC5yZWNGaWxlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0UmVjb3JkaW5nRmlsZSh0aGlzLnJlY29yZGluZ0xpc3QucmVjRmlsZXNbMF0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbGVuZ3RoVGltZUZvcm1hdHRlZChyZjpSZWNvcmRpbmdGaWxlKXtcclxuICAgIGxldCBzdHI9Jy0tOi0tOi0tJztcclxuICAgIGxldCB0bD1udWxsO1xyXG4gICAgaWYocmYudGltZUxlbmd0aCl7XHJcbiAgICAgIHRsPXJmLnRpbWVMZW5ndGg7XHJcbiAgICB9ZWxzZSBpZihyZi5mcmFtZXMgJiYgcmYuYXVkaW9EYXRhSG9sZGVyKSB7XHJcbiAgICAgIHRsPXJmLmZyYW1lcyAvIHJmLmF1ZGlvRGF0YUhvbGRlcj8uc2FtcGxlUmF0ZVxyXG4gICAgfVxyXG4gICAgaWYodGwpIHtcclxuICAgICAgc3RyID0gTWVkaWFVdGlscy50b01lZGlhVGltZSh0bCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3RyO1xyXG4gIH1cclxuXHJcbiAgcmVjb3JkaW5nRmlsZUNhY2hlZChyZjpSZWNvcmRpbmdGaWxlKTpib29sZWFufG51bGx7XHJcbiAgICBsZXQgY2FjaGVkPW51bGw7XHJcbiAgICBpZihyZiAmJiByZi5zZXJ2ZXJQZXJzaXN0ZWQpIHtcclxuICAgICAgY2FjaGVkID0gKHJmLmF1ZGlvRGF0YUhvbGRlciAhPSBudWxsKTtcclxuICAgIH1cclxuICAgIHJldHVybiBjYWNoZWQ7XHJcbiAgfVxyXG5cclxufVxyXG4iXX0=