speechrecorderng 3.6.1 → 3.8.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 (220) hide show
  1. package/esm2022/lib/action/action.mjs +73 -0
  2. package/{esm2020 → esm2022}/lib/audio/array_audio_buffer.mjs +163 -163
  3. package/{esm2020 → esm2022}/lib/audio/array_audio_buffer_input_stream.mjs +85 -85
  4. package/{esm2020 → esm2022}/lib/audio/array_audio_buffer_random_access_stream.mjs +15 -15
  5. package/esm2022/lib/audio/audio_data_holder.mjs +264 -0
  6. package/{esm2020 → esm2022}/lib/audio/audio_display.mjs +93 -93
  7. package/{esm2020 → esm2022}/lib/audio/audio_player.mjs +213 -213
  8. package/esm2022/lib/audio/capture/capture.mjs +855 -0
  9. package/esm2022/lib/audio/context.mjs +79 -0
  10. package/{esm2020 → esm2022}/lib/audio/dsp/level_measure.mjs +515 -515
  11. package/{esm2020 → esm2022}/lib/audio/format.mjs +16 -16
  12. package/esm2022/lib/audio/impl/wavformat.mjs +6 -0
  13. package/{esm2020 → esm2022}/lib/audio/impl/wavreader.mjs +133 -133
  14. package/esm2022/lib/audio/impl/wavwriter.mjs +105 -0
  15. package/esm2022/lib/audio/inddb_audio_buffer.mjs +508 -0
  16. package/{esm2020 → esm2022}/lib/audio/io/stream.mjs +58 -58
  17. package/esm2022/lib/audio/net_audio_buffer.mjs +293 -0
  18. package/{esm2020 → esm2022}/lib/audio/persistor.mjs +80 -80
  19. package/{esm2020 → esm2022}/lib/audio/playback/array_audio_buffer_source_node.mjs +125 -125
  20. package/esm2022/lib/audio/playback/audio_source_node.mjs +18 -0
  21. package/esm2022/lib/audio/playback/audio_source_worklet_module_loader.mjs +167 -0
  22. package/{esm2020 → esm2022}/lib/audio/playback/inddb_audio_buffer_source_node.mjs +166 -166
  23. package/{esm2020 → esm2022}/lib/audio/playback/net_audio_buffer_source_node.mjs +217 -217
  24. package/esm2022/lib/audio/playback/player.mjs +402 -0
  25. package/esm2022/lib/audio/ui/audio_canvas_layer_comp.mjs +347 -0
  26. package/{esm2020 → esm2022}/lib/audio/ui/audio_display_control.mjs +65 -65
  27. package/{esm2020 → esm2022}/lib/audio/ui/audio_display_scroll_pane.mjs +139 -139
  28. package/{esm2020 → esm2022}/lib/audio/ui/audiosignal.mjs +524 -524
  29. package/{esm2020 → esm2022}/lib/audio/ui/common.mjs +18 -18
  30. package/esm2022/lib/audio/ui/container.mjs +414 -0
  31. package/{esm2020 → esm2022}/lib/audio/ui/livelevel.mjs +352 -352
  32. package/esm2022/lib/audio/ui/scroll_pane_horizontal.mjs +11 -0
  33. package/esm2022/lib/audio/ui/sonagram.mjs +900 -0
  34. package/esm2022/lib/db/inddb.mjs +120 -0
  35. package/esm2022/lib/dsp/utils.mjs +48 -0
  36. package/{esm2020 → esm2022}/lib/io/BinaryReader.mjs +84 -84
  37. package/esm2022/lib/io/BinaryWriter.mjs +74 -0
  38. package/{esm2020 → esm2022}/lib/io/stream.mjs +258 -258
  39. package/{esm2020 → esm2022}/lib/math/2d/geometry.mjs +27 -27
  40. package/esm2022/lib/math/complex.mjs +58 -0
  41. package/{esm2020 → esm2022}/lib/math/dft.mjs +195 -195
  42. package/{esm2020 → esm2022}/lib/media/utils.mjs +13 -13
  43. package/esm2022/lib/net/uploader.mjs +367 -0
  44. package/{esm2020 → esm2022}/lib/recorder_component.mjs +64 -64
  45. package/esm2022/lib/speechrecorder/project/project.mjs +49 -0
  46. package/esm2022/lib/speechrecorder/project/project.service.mjs +64 -0
  47. package/{esm2020 → esm2022}/lib/speechrecorder/recording.mjs +123 -123
  48. package/esm2022/lib/speechrecorder/recordings/basic_recording.service.mjs +218 -0
  49. package/esm2022/lib/speechrecorder/recordings/recordings.service.mjs +1014 -0
  50. package/{esm2020 → esm2022}/lib/speechrecorder/script/script.mjs +113 -113
  51. package/{esm2020 → esm2022}/lib/speechrecorder/script/script.service.mjs +47 -47
  52. package/esm2022/lib/speechrecorder/session/audiorecorder.mjs +1179 -0
  53. package/esm2022/lib/speechrecorder/session/basicrecorder.mjs +668 -0
  54. package/esm2022/lib/speechrecorder/session/controlpanel.mjs +416 -0
  55. package/{esm2020 → esm2022}/lib/speechrecorder/session/item.mjs +29 -29
  56. package/{esm2020 → esm2022}/lib/speechrecorder/session/progress.mjs +69 -69
  57. package/{esm2020 → esm2022}/lib/speechrecorder/session/prompting.mjs +571 -571
  58. package/{esm2020 → esm2022}/lib/speechrecorder/session/recorder_combi_pane.mjs +65 -65
  59. package/esm2022/lib/speechrecorder/session/recording_file_cache.mjs +195 -0
  60. package/{esm2020 → esm2022}/lib/speechrecorder/session/recording_list.mjs +103 -103
  61. package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +63 -63
  62. package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs +51 -51
  63. package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +104 -104
  64. package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +381 -381
  65. package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file.mjs +67 -67
  66. package/esm2022/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +288 -0
  67. package/{esm2020 → esm2022}/lib/speechrecorder/session/session.mjs +1 -1
  68. package/esm2022/lib/speechrecorder/session/session.service.mjs +69 -0
  69. package/{esm2020 → esm2022}/lib/speechrecorder/session/session_finished_dialog.mjs +29 -29
  70. package/esm2022/lib/speechrecorder/session/sessionmanager.mjs +1386 -0
  71. package/{esm2020 → esm2022}/lib/speechrecorder/session/warning_bar.mjs +28 -28
  72. package/{esm2020 → esm2022}/lib/speechrecorder/spruploader.mjs +22 -22
  73. package/{esm2020 → esm2022}/lib/speechrecorder/startstopsignal/startstopsignal.mjs +1 -1
  74. package/esm2022/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +57 -0
  75. package/{esm2020 → esm2022}/lib/speechrecorderng.component.mjs +388 -388
  76. package/{esm2020 → esm2022}/lib/speechrecorderng.module.mjs +100 -100
  77. package/{esm2020 → esm2022}/lib/spr.config.mjs +26 -26
  78. package/{esm2020 → esm2022}/lib/spr.module.version.mjs +2 -2
  79. package/{esm2020 → esm2022}/lib/ui/canvas_layer_comp.mjs +38 -38
  80. package/{esm2020 → esm2022}/lib/ui/message_dialog.mjs +30 -30
  81. package/esm2022/lib/ui/recordingitem_display.mjs +253 -0
  82. package/{esm2020 → esm2022}/lib/ui/responsive_component.mjs +24 -24
  83. package/{esm2020 → esm2022}/lib/utils/scrollIntoViewToBottom.mjs +23 -23
  84. package/esm2022/lib/utils/ua-parser.mjs +190 -0
  85. package/esm2022/lib/utils/utils.mjs +105 -0
  86. package/esm2022/lib/utils/wake_lock.mjs +114 -0
  87. package/{esm2020 → esm2022}/lib/utils/wake_lock_media.mjs +1 -1
  88. package/{esm2020 → esm2022}/public-api.mjs +33 -33
  89. package/{esm2020 → esm2022}/speechrecorderng.mjs +4 -4
  90. package/{fesm2020 → fesm2022}/speechrecorderng.mjs +16518 -16514
  91. package/fesm2022/speechrecorderng.mjs.map +1 -0
  92. package/index.d.ts +5 -5
  93. package/lib/action/action.d.ts +27 -27
  94. package/lib/audio/array_audio_buffer.d.ts +31 -31
  95. package/lib/audio/array_audio_buffer_input_stream.d.ts +14 -14
  96. package/lib/audio/array_audio_buffer_random_access_stream.d.ts +9 -9
  97. package/lib/audio/audio_data_holder.d.ts +84 -84
  98. package/lib/audio/audio_display.d.ts +36 -36
  99. package/lib/audio/audio_player.d.ts +47 -47
  100. package/lib/audio/capture/capture.d.ts +67 -67
  101. package/lib/audio/context.d.ts +6 -6
  102. package/lib/audio/dsp/level_measure.d.ts +60 -60
  103. package/lib/audio/format.d.ts +11 -11
  104. package/lib/audio/impl/wavformat.d.ts +5 -5
  105. package/lib/audio/impl/wavreader.d.ts +16 -16
  106. package/lib/audio/impl/wavwriter.d.ts +13 -13
  107. package/lib/audio/inddb_audio_buffer.d.ts +68 -68
  108. package/lib/audio/io/stream.d.ts +28 -28
  109. package/lib/audio/net_audio_buffer.d.ts +57 -57
  110. package/lib/audio/persistor.d.ts +29 -29
  111. package/lib/audio/playback/array_audio_buffer_source_node.d.ts +18 -18
  112. package/lib/audio/playback/audio_source_node.d.ts +10 -10
  113. package/lib/audio/playback/audio_source_worklet_module_loader.d.ts +4 -4
  114. package/lib/audio/playback/inddb_audio_buffer_source_node.d.ts +21 -21
  115. package/lib/audio/playback/net_audio_buffer_source_node.d.ts +27 -27
  116. package/lib/audio/playback/player.d.ts +65 -65
  117. package/lib/audio/ui/audio_canvas_layer_comp.d.ts +68 -68
  118. package/lib/audio/ui/audio_display_control.d.ts +25 -25
  119. package/lib/audio/ui/audio_display_scroll_pane.d.ts +26 -26
  120. package/lib/audio/ui/audiosignal.d.ts +30 -30
  121. package/lib/audio/ui/common.d.ts +11 -11
  122. package/lib/audio/ui/container.d.ts +63 -63
  123. package/lib/audio/ui/livelevel.d.ts +60 -60
  124. package/lib/audio/ui/scroll_pane_horizontal.d.ts +5 -5
  125. package/lib/audio/ui/sonagram.d.ts +37 -37
  126. package/lib/db/inddb.d.ts +21 -21
  127. package/lib/dsp/utils.d.ts +19 -19
  128. package/lib/io/BinaryReader.d.ts +18 -18
  129. package/lib/io/BinaryWriter.d.ts +15 -15
  130. package/lib/io/stream.d.ts +59 -59
  131. package/lib/math/2d/geometry.d.ts +18 -18
  132. package/lib/math/complex.d.ts +17 -17
  133. package/lib/math/dft.d.ts +22 -22
  134. package/lib/media/utils.d.ts +3 -3
  135. package/lib/net/uploader.d.ts +81 -81
  136. package/lib/recorder_component.d.ts +16 -16
  137. package/lib/speechrecorder/project/project.d.ts +59 -59
  138. package/lib/speechrecorder/project/project.service.d.ts +21 -21
  139. package/lib/speechrecorder/recording.d.ts +51 -51
  140. package/lib/speechrecorder/recordings/basic_recording.service.d.ts +27 -27
  141. package/lib/speechrecorder/recordings/recordings.service.d.ts +48 -48
  142. package/lib/speechrecorder/script/script.d.ts +80 -80
  143. package/lib/speechrecorder/script/script.service.d.ts +16 -16
  144. package/lib/speechrecorder/session/audiorecorder.d.ts +122 -122
  145. package/lib/speechrecorder/session/basicrecorder.d.ts +139 -139
  146. package/lib/speechrecorder/session/controlpanel.d.ts +109 -109
  147. package/lib/speechrecorder/session/item.d.ts +12 -12
  148. package/lib/speechrecorder/session/progress.d.ts +17 -17
  149. package/lib/speechrecorder/session/prompting.d.ts +121 -121
  150. package/lib/speechrecorder/session/recorder_combi_pane.d.ts +32 -32
  151. package/lib/speechrecorder/session/recording_file_cache.d.ts +33 -33
  152. package/lib/speechrecorder/session/recording_list.d.ts +24 -24
  153. package/lib/speechrecorder/session/recordingfile/recording-file-meta.component.d.ts +15 -15
  154. package/lib/speechrecorder/session/recordingfile/recording-file-navi.component.d.ts +20 -20
  155. package/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.d.ts +31 -31
  156. package/lib/speechrecorder/session/recordingfile/recording-file-view.component.d.ts +55 -55
  157. package/lib/speechrecorder/session/recordingfile/recording-file.d.ts +7 -7
  158. package/lib/speechrecorder/session/recordingfile/recordingfile-service.d.ts +24 -24
  159. package/lib/speechrecorder/session/session.d.ts +15 -15
  160. package/lib/speechrecorder/session/session.service.d.ts +20 -20
  161. package/lib/speechrecorder/session/session_finished_dialog.d.ts +10 -10
  162. package/lib/speechrecorder/session/sessionmanager.d.ts +129 -129
  163. package/lib/speechrecorder/session/warning_bar.d.ts +8 -8
  164. package/lib/speechrecorder/spruploader.d.ts +11 -11
  165. package/lib/speechrecorder/startstopsignal/startstopsignal.d.ts +10 -10
  166. package/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.d.ts +11 -11
  167. package/lib/speechrecorderng.component.d.ts +61 -61
  168. package/lib/speechrecorderng.module.d.ts +56 -56
  169. package/lib/spr.config.d.ts +17 -17
  170. package/lib/spr.module.version.d.ts +1 -1
  171. package/lib/ui/canvas_layer_comp.d.ts +13 -13
  172. package/lib/ui/message_dialog.d.ts +10 -10
  173. package/lib/ui/recordingitem_display.d.ts +84 -84
  174. package/lib/ui/responsive_component.d.ts +9 -9
  175. package/lib/utils/scrollIntoViewToBottom.d.ts +9 -9
  176. package/lib/utils/ua-parser.d.ts +43 -43
  177. package/lib/utils/utils.d.ts +19 -19
  178. package/lib/utils/wake_lock.d.ts +23 -23
  179. package/lib/utils/wake_lock_media.d.ts +1 -1
  180. package/package.json +17 -23
  181. package/public-api.d.ts +33 -33
  182. package/esm2020/lib/action/action.mjs +0 -73
  183. package/esm2020/lib/audio/audio_data_holder.mjs +0 -264
  184. package/esm2020/lib/audio/capture/capture.mjs +0 -855
  185. package/esm2020/lib/audio/context.mjs +0 -79
  186. package/esm2020/lib/audio/impl/wavformat.mjs +0 -6
  187. package/esm2020/lib/audio/impl/wavwriter.mjs +0 -105
  188. package/esm2020/lib/audio/inddb_audio_buffer.mjs +0 -508
  189. package/esm2020/lib/audio/net_audio_buffer.mjs +0 -293
  190. package/esm2020/lib/audio/playback/audio_source_node.mjs +0 -18
  191. package/esm2020/lib/audio/playback/audio_source_worklet_module_loader.mjs +0 -167
  192. package/esm2020/lib/audio/playback/player.mjs +0 -402
  193. package/esm2020/lib/audio/ui/audio_canvas_layer_comp.mjs +0 -347
  194. package/esm2020/lib/audio/ui/container.mjs +0 -414
  195. package/esm2020/lib/audio/ui/scroll_pane_horizontal.mjs +0 -11
  196. package/esm2020/lib/audio/ui/sonagram.mjs +0 -900
  197. package/esm2020/lib/db/inddb.mjs +0 -120
  198. package/esm2020/lib/dsp/utils.mjs +0 -48
  199. package/esm2020/lib/io/BinaryWriter.mjs +0 -74
  200. package/esm2020/lib/math/complex.mjs +0 -58
  201. package/esm2020/lib/net/uploader.mjs +0 -367
  202. package/esm2020/lib/speechrecorder/project/project.mjs +0 -49
  203. package/esm2020/lib/speechrecorder/project/project.service.mjs +0 -64
  204. package/esm2020/lib/speechrecorder/recordings/basic_recording.service.mjs +0 -216
  205. package/esm2020/lib/speechrecorder/recordings/recordings.service.mjs +0 -1014
  206. package/esm2020/lib/speechrecorder/session/audiorecorder.mjs +0 -1179
  207. package/esm2020/lib/speechrecorder/session/basicrecorder.mjs +0 -666
  208. package/esm2020/lib/speechrecorder/session/controlpanel.mjs +0 -416
  209. package/esm2020/lib/speechrecorder/session/recording_file_cache.mjs +0 -195
  210. package/esm2020/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +0 -288
  211. package/esm2020/lib/speechrecorder/session/session.service.mjs +0 -69
  212. package/esm2020/lib/speechrecorder/session/sessionmanager.mjs +0 -1386
  213. package/esm2020/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +0 -57
  214. package/esm2020/lib/ui/recordingitem_display.mjs +0 -253
  215. package/esm2020/lib/utils/ua-parser.mjs +0 -190
  216. package/esm2020/lib/utils/utils.mjs +0 -105
  217. package/esm2020/lib/utils/wake_lock.mjs +0 -114
  218. package/fesm2015/speechrecorderng.mjs +0 -17768
  219. package/fesm2015/speechrecorderng.mjs.map +0 -1
  220. package/fesm2020/speechrecorderng.mjs.map +0 -1
@@ -1,416 +0,0 @@
1
- import { Action } from '../../action/action';
2
- import { Component, ViewChild, Input } from "@angular/core";
3
- import { ResponsiveComponent } from "../../ui/responsive_component";
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@angular/common";
6
- import * as i2 from "@angular/material/icon";
7
- import * as i3 from "@angular/material/progress-spinner";
8
- import * as i4 from "@angular/material/tooltip";
9
- import * as i5 from "@angular/cdk/layout";
10
- import * as i6 from "@angular/material/button";
11
- import * as i7 from "@angular/material/dialog";
12
- export class StatusDisplay {
13
- constructor() {
14
- this.statusAlertType = 'info';
15
- this.statusMsg = 'Initialize...';
16
- this.statusWaiting = false;
17
- }
18
- }
19
- StatusDisplay.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: StatusDisplay, deps: [], target: i0.ɵɵFactoryTarget.Component });
20
- StatusDisplay.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: StatusDisplay, selector: "app-sprstatusdisplay", inputs: { statusAlertType: "statusAlertType", statusMsg: "statusMsg", statusWaiting: "statusWaiting" }, ngImport: i0, template: `
21
- <p matTooltip="Status">
22
- <mat-progress-spinner *ngIf="statusWaiting" color="black" mode="indeterminate" [diameter]="30" [strokeWidth]="5"></mat-progress-spinner><mat-icon *ngIf="statusAlertType==='error'" style="color:red">report_problem</mat-icon>
23
- {{statusMsg}}
24
- </p>
25
- `, isInline: true, styles: [":host{display:inline;text-align:left;font-size:smaller}\n", "p{padding:4px;white-space:nowrap;display:inline-block}\n", "mat-progress-spinner{color:#000;display:inline-block}\n", "span{color:red}\n"], dependencies: [{ 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", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] });
26
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: StatusDisplay, decorators: [{
27
- type: Component,
28
- args: [{ selector: 'app-sprstatusdisplay', template: `
29
- <p matTooltip="Status">
30
- <mat-progress-spinner *ngIf="statusWaiting" color="black" mode="indeterminate" [diameter]="30" [strokeWidth]="5"></mat-progress-spinner><mat-icon *ngIf="statusAlertType==='error'" style="color:red">report_problem</mat-icon>
31
- {{statusMsg}}
32
- </p>
33
- `, styles: [":host{display:inline;text-align:left;font-size:smaller}\n", "p{padding:4px;white-space:nowrap;display:inline-block}\n", "mat-progress-spinner{color:#000;display:inline-block}\n", "span{color:red}\n"] }]
34
- }], propDecorators: { statusAlertType: [{
35
- type: Input
36
- }], statusMsg: [{
37
- type: Input
38
- }], statusWaiting: [{
39
- type: Input
40
- }] } });
41
- export class UploadStatus {
42
- constructor() {
43
- this._awaitNewUpload = false;
44
- this.spinnerMode = 'determinate';
45
- this.colorStatus = 'primary';
46
- this._value = 100;
47
- this.displayValue = null;
48
- this.toolTipText = '';
49
- }
50
- _updateSpinner() {
51
- let uplMsg;
52
- if (this._awaitNewUpload || this._value === 0) {
53
- this.spinnerMode = 'indeterminate';
54
- this.displayValue = '&nbsp;&nbsp;&nbsp;&nbsp;';
55
- uplMsg = 'Preparing upload.';
56
- }
57
- else {
58
- this.spinnerMode = 'determinate';
59
- this.displayValue = this._value + '%';
60
- if (this._value === 100) {
61
- uplMsg = 'Upload complete';
62
- }
63
- else {
64
- uplMsg = 'Upload progress: ' + this.displayValue;
65
- }
66
- }
67
- if (this.status === 'warn') {
68
- uplMsg = 'Upload error occurred. Please check your network connection. ' + uplMsg;
69
- }
70
- this.toolTipText = uplMsg;
71
- }
72
- set value(value) {
73
- this._value = value;
74
- this._updateSpinner();
75
- }
76
- ;
77
- set awaitNewUpload(awaitNewUpload) {
78
- this._awaitNewUpload = awaitNewUpload;
79
- this._updateSpinner();
80
- }
81
- set status(status) {
82
- this._status = status;
83
- if ('accent' === status) {
84
- this.colorStatus = 'accent';
85
- }
86
- else if ('warn' === status) {
87
- this.colorStatus = 'warn';
88
- }
89
- else {
90
- this.colorStatus = 'primary';
91
- }
92
- this._updateSpinner();
93
- }
94
- get status() {
95
- return this._status;
96
- }
97
- }
98
- UploadStatus.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: UploadStatus, deps: [], target: i0.ɵɵFactoryTarget.Component });
99
- UploadStatus.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: UploadStatus, selector: "app-uploadstatus", inputs: { value: "value", awaitNewUpload: "awaitNewUpload", status: "status" }, ngImport: i0, template: `
100
- <mat-progress-spinner [mode]="spinnerMode" [color]="colorStatus" [diameter]="30" [strokeWidth]="5" [value]="_value"
101
- [matTooltip]="toolTipText"></mat-progress-spinner>
102
- `, isInline: true, styles: [":host{text-align:left}\n", "mat-progress-spinner{display:inline-block}\n"], dependencies: [{ kind: "component", type: i3.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] });
103
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: UploadStatus, decorators: [{
104
- type: Component,
105
- args: [{ selector: 'app-uploadstatus', template: `
106
- <mat-progress-spinner [mode]="spinnerMode" [color]="colorStatus" [diameter]="30" [strokeWidth]="5" [value]="_value"
107
- [matTooltip]="toolTipText"></mat-progress-spinner>
108
- `, styles: [":host{text-align:left}\n", "mat-progress-spinner{display:inline-block}\n"] }]
109
- }], propDecorators: { value: [{
110
- type: Input
111
- }], awaitNewUpload: [{
112
- type: Input
113
- }], status: [{
114
- type: Input
115
- }] } });
116
- export class ProgressDisplay {
117
- constructor() {
118
- this.progressMsg = '[itemcode]';
119
- }
120
- }
121
- ProgressDisplay.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ProgressDisplay, deps: [], target: i0.ɵɵFactoryTarget.Component });
122
- ProgressDisplay.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ProgressDisplay, selector: "app-sprprogressdisplay", ngImport: i0, template: `
123
- <p>{{progressMsg}}</p>
124
- `, isInline: true, styles: [":host{flex:1;width:100%;text-align:left}\n"] });
125
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ProgressDisplay, decorators: [{
126
- type: Component,
127
- args: [{ selector: 'app-sprprogressdisplay', template: `
128
- <p>{{progressMsg}}</p>
129
- `, styles: [":host{flex:1;width:100%;text-align:left}\n"] }]
130
- }] });
131
- export class TransportActions {
132
- constructor() {
133
- this.startAction = new Action('Start');
134
- this.stopAction = new Action('Stop');
135
- this.nextAction = new Action('Next');
136
- this.pauseAction = new Action('Pause');
137
- this.fwdNextAction = new Action('Next recording');
138
- this.fwdAction = new Action('Forward');
139
- this.bwdAction = new Action('Backward');
140
- this.stopNonrecordingAction = new Action('Next');
141
- }
142
- }
143
- export class TransportPanel extends ResponsiveComponent {
144
- constructor(breakpointObserver) {
145
- super(breakpointObserver);
146
- this.navigationEnabled = true;
147
- this.pausingEnabled = true;
148
- }
149
- startDisabled() {
150
- return !this.actions || this.readonly || this.actions.startAction.disabled;
151
- }
152
- stopDisabled() {
153
- return !this.actions || this.actions.stopAction.disabled;
154
- }
155
- nextDisabled() {
156
- return !this.actions || this.actions.nextAction.disabled || !this.navigationEnabled;
157
- }
158
- stopNonrecordingDisabled() {
159
- return !this.actions || this.actions.stopNonrecordingAction.disabled || !this.navigationEnabled;
160
- }
161
- pauseDisabled() {
162
- return !this.actions || this.actions.pauseAction.disabled || !this.pausingEnabled;
163
- }
164
- fwdDisabled() {
165
- return !this.actions || this.actions.fwdAction.disabled || !this.navigationEnabled;
166
- }
167
- fwdNextDisabled() {
168
- return !this.actions || this.actions.fwdNextAction.disabled || !this.navigationEnabled;
169
- }
170
- bwdDisabled() {
171
- return !this.actions || this.actions.bwdAction.disabled || !this.navigationEnabled;
172
- }
173
- startStopNextName() {
174
- if (!this.nextDisabled() || !this.stopNonrecordingDisabled()) {
175
- this.startStopNextButtonName = "Next";
176
- }
177
- else if (!this.startDisabled()) {
178
- this.startStopNextButtonName = "Start";
179
- }
180
- else if (!this.stopDisabled()) {
181
- this.startStopNextButtonName = "Stop";
182
- }
183
- return this.startStopNextButtonName;
184
- }
185
- startStopNextIconName() {
186
- if (!this.startDisabled()) {
187
- this.startStopNextButtonIconName = "fiber_manual_record";
188
- }
189
- else if (!this.stopDisabled() || !this.stopNonrecordingDisabled()) {
190
- this.startStopNextButtonIconName = "stop";
191
- }
192
- else if (!this.nextDisabled()) {
193
- this.startStopNextButtonIconName = "stop";
194
- }
195
- return this.startStopNextButtonIconName;
196
- }
197
- startStopNextIconColor() {
198
- if (!this.startDisabled()) {
199
- return "red";
200
- }
201
- else if (!this.stopDisabled() || !this.nextDisabled()) {
202
- return "yellow";
203
- }
204
- else {
205
- return "grey";
206
- }
207
- }
208
- startStopNextPerform() {
209
- if (!this.startDisabled()) {
210
- this.actions.startAction.perform();
211
- }
212
- else if (!this.stopDisabled()) {
213
- this.actions.stopAction.perform();
214
- }
215
- else if (!this.nextDisabled()) {
216
- this.actions.nextAction.perform();
217
- }
218
- else if (!this.stopNonrecordingDisabled()) {
219
- this.actions.stopNonrecordingAction.perform();
220
- }
221
- }
222
- }
223
- TransportPanel.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: TransportPanel, deps: [{ token: i5.BreakpointObserver }], target: i0.ɵɵFactoryTarget.Component });
224
- TransportPanel.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: TransportPanel, selector: "app-sprtransport", inputs: { readonly: "readonly", actions: "actions", navigationEnabled: "navigationEnabled", pausingEnabled: "pausingEnabled" }, usesInheritance: true, ngImport: i0, template: `
225
- <button id="bwdBtn" *ngIf="navigationEnabled" (click)="actions.bwdAction.perform()" [disabled]="bwdDisabled()"
226
- mat-raised-button>
227
- <mat-icon>chevron_left</mat-icon>
228
- </button>
229
- <button (click)="startStopNextPerform()" [disabled]="startDisabled() && stopDisabled() && nextDisabled() && stopNonrecordingDisabled()" mat-raised-button>
230
- <mat-icon [style.color]="startStopNextIconColor()">{{startStopNextIconName()}}</mat-icon><mat-icon *ngIf="!nextDisabled() || !stopNonrecordingDisabled()" [style.color]="nextDisabled() ? 'grey' : 'black'">chevron_right</mat-icon>
231
- <span *ngIf="!screenXs">{{startStopNextName()}}</span>
232
- </button>
233
- <button *ngIf="pausingEnabled" (click)="actions.pauseAction.perform()" [disabled]="pauseDisabled()" mat-raised-button>
234
- <mat-icon>pause</mat-icon>
235
- <span *ngIf="!screenXs">Pause</span>
236
- </button>
237
- <button id="fwdNextBtn" *ngIf="navigationEnabled && !screenXs" (click)="actions.fwdNextAction.perform()" [disabled]="fwdNextDisabled()" mat-raised-button>
238
- <mat-icon>redo</mat-icon>
239
- </button>
240
- <button id="fwdBtn" *ngIf="navigationEnabled" (click)="actions.fwdAction.perform()" [disabled]="fwdDisabled()" mat-raised-button>
241
- <mat-icon>chevron_right</mat-icon>
242
- </button>
243
-
244
- `, isInline: true, styles: [":host{flex:20;align-self:center;width:100%;text-align:center;align-content:center;margin:0}\n", "div{display:inline;flex:0}\n", "button{touch-action:manipulation}\n"], dependencies: [{ 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: i6.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }] });
245
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: TransportPanel, decorators: [{
246
- type: Component,
247
- args: [{ selector: 'app-sprtransport', template: `
248
- <button id="bwdBtn" *ngIf="navigationEnabled" (click)="actions.bwdAction.perform()" [disabled]="bwdDisabled()"
249
- mat-raised-button>
250
- <mat-icon>chevron_left</mat-icon>
251
- </button>
252
- <button (click)="startStopNextPerform()" [disabled]="startDisabled() && stopDisabled() && nextDisabled() && stopNonrecordingDisabled()" mat-raised-button>
253
- <mat-icon [style.color]="startStopNextIconColor()">{{startStopNextIconName()}}</mat-icon><mat-icon *ngIf="!nextDisabled() || !stopNonrecordingDisabled()" [style.color]="nextDisabled() ? 'grey' : 'black'">chevron_right</mat-icon>
254
- <span *ngIf="!screenXs">{{startStopNextName()}}</span>
255
- </button>
256
- <button *ngIf="pausingEnabled" (click)="actions.pauseAction.perform()" [disabled]="pauseDisabled()" mat-raised-button>
257
- <mat-icon>pause</mat-icon>
258
- <span *ngIf="!screenXs">Pause</span>
259
- </button>
260
- <button id="fwdNextBtn" *ngIf="navigationEnabled && !screenXs" (click)="actions.fwdNextAction.perform()" [disabled]="fwdNextDisabled()" mat-raised-button>
261
- <mat-icon>redo</mat-icon>
262
- </button>
263
- <button id="fwdBtn" *ngIf="navigationEnabled" (click)="actions.fwdAction.perform()" [disabled]="fwdDisabled()" mat-raised-button>
264
- <mat-icon>chevron_right</mat-icon>
265
- </button>
266
-
267
- `, styles: [":host{flex:20;align-self:center;width:100%;text-align:center;align-content:center;margin:0}\n", "div{display:inline;flex:0}\n", "button{touch-action:manipulation}\n"] }]
268
- }], ctorParameters: function () { return [{ type: i5.BreakpointObserver }]; }, propDecorators: { readonly: [{
269
- type: Input
270
- }], actions: [{
271
- type: Input
272
- }], navigationEnabled: [{
273
- type: Input
274
- }], pausingEnabled: [{
275
- type: Input
276
- }] } });
277
- export class WakeLockIndicator {
278
- constructor() {
279
- this._screenLocked = false;
280
- }
281
- set screenLocked(screenLock) {
282
- this._screenLocked = screenLock;
283
- }
284
- }
285
- WakeLockIndicator.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: WakeLockIndicator, deps: [], target: i0.ɵɵFactoryTarget.Component });
286
- WakeLockIndicator.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: WakeLockIndicator, selector: "app-wakelockindicator", inputs: { screenLocked: "screenLocked" }, ngImport: i0, template: `
287
- <mat-icon *ngIf="_screenLocked">screen_lock_portrait</mat-icon>
288
- `, isInline: true, dependencies: [{ 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"] }] });
289
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: WakeLockIndicator, decorators: [{
290
- type: Component,
291
- args: [{ selector: 'app-wakelockindicator', template: `
292
- <mat-icon *ngIf="_screenLocked">screen_lock_portrait</mat-icon>
293
- ` }]
294
- }], ctorParameters: function () { return []; }, propDecorators: { screenLocked: [{
295
- type: Input
296
- }] } });
297
- export class ReadyStateIndicator {
298
- constructor() {
299
- this._ready = true;
300
- this.hourGlassIconName = 'hourglass_empty';
301
- this.readyStateToolTip = '';
302
- }
303
- set ready(ready) {
304
- this._ready = ready;
305
- this.hourGlassIconName = this._ready ? 'hourglass_empty' : 'hourglass_full';
306
- this.readyStateToolTip = this._ready ? 'Audio processing and upload done. You can leave the page without data loss.' : 'Please wait until audio processing and upload have finished. Please do not leave the page.';
307
- }
308
- get ready() {
309
- return this._ready;
310
- }
311
- }
312
- ReadyStateIndicator.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ReadyStateIndicator, deps: [], target: i0.ɵɵFactoryTarget.Component });
313
- ReadyStateIndicator.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ReadyStateIndicator, selector: "app-readystateindicator", inputs: { ready: "ready" }, ngImport: i0, template: `
314
- <mat-icon [matTooltip]="readyStateToolTip">{{hourGlassIconName}}</mat-icon>
315
- `, isInline: true, dependencies: [{ kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] });
316
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ReadyStateIndicator, decorators: [{
317
- type: Component,
318
- args: [{ selector: 'app-readystateindicator', template: `
319
- <mat-icon [matTooltip]="readyStateToolTip">{{hourGlassIconName}}</mat-icon>
320
- ` }]
321
- }], ctorParameters: function () { return []; }, propDecorators: { ready: [{
322
- type: Input
323
- }] } });
324
- export class ControlPanel extends ResponsiveComponent {
325
- constructor(bpo, dialog) {
326
- super(bpo);
327
- this.bpo = bpo;
328
- this.dialog = dialog;
329
- this.processing = false;
330
- this.navigationEnabled = true;
331
- this._ready = true;
332
- }
333
- set ready(ready) {
334
- this._ready = ready;
335
- }
336
- get ready() {
337
- return this._ready;
338
- }
339
- }
340
- ControlPanel.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ControlPanel, deps: [{ token: i5.BreakpointObserver }, { token: i7.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
341
- ControlPanel.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ControlPanel, selector: "app-sprcontrolpanel", inputs: { readonly: "readonly", transportActions: "transportActions", processing: "processing", statusMsg: "statusMsg", statusAlertType: "statusAlertType", statusWaiting: "statusWaiting", uploadStatus: "uploadStatus", uploadProgress: "uploadProgress", currentRecording: "currentRecording", enableUploadRecordings: "enableUploadRecordings", navigationEnabled: "navigationEnabled", ready: "ready" }, viewQueries: [{ propertyName: "statusDisplay", first: true, predicate: StatusDisplay, descendants: true, static: true }, { propertyName: "transportPanel", first: true, predicate: TransportPanel, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
342
- <div *ngIf="!screenXs" style="flex-direction: row" >
343
- <app-sprstatusdisplay style="flex:0 0 0" [statusMsg]="statusMsg" [statusAlertType]="statusAlertType" [statusWaiting]="statusWaiting"
344
- class="hidden-xs"></app-sprstatusdisplay>
345
- <app-sprtransport style="flex:10 0 0" [readonly]="readonly" [actions]="transportActions" [navigationEnabled]="navigationEnabled"></app-sprtransport>
346
- <app-uploadstatus style="flex:0 0 0" *ngIf="enableUploadRecordings" [value]="uploadProgress"
347
- [status]="uploadStatus" [awaitNewUpload]="processing"></app-uploadstatus>
348
- <app-readystateindicator [ready]="_ready"></app-readystateindicator>
349
- </div>
350
- <div *ngIf="screenXs" style="flex-direction: column" >
351
- <div style="flex-direction: row" class="flexFill" >
352
- <app-sprstatusdisplay style="flex:10 0 0" [statusMsg]="statusMsg" [statusAlertType]="statusAlertType" [statusWaiting]="statusWaiting"
353
- class="hidden-xs"></app-sprstatusdisplay>
354
- <app-uploadstatus style="flex:0 0 0" *ngIf="enableUploadRecordings" [value]="uploadProgress"
355
- [status]="uploadStatus" [awaitNewUpload]="processing"></app-uploadstatus>
356
- <app-readystateindicator [ready]="_ready"></app-readystateindicator>
357
- </div>
358
- <app-sprtransport [readonly]="readonly" [actions]="transportActions" [navigationEnabled]="navigationEnabled"></app-sprtransport>
359
-
360
- </div>
361
- `, isInline: true, styles: ["div{align-content:center;align-items:center;margin:0;padding:20px;min-height:min-content}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: StatusDisplay, selector: "app-sprstatusdisplay", inputs: ["statusAlertType", "statusMsg", "statusWaiting"] }, { kind: "component", type: UploadStatus, selector: "app-uploadstatus", inputs: ["value", "awaitNewUpload", "status"] }, { kind: "component", type: TransportPanel, selector: "app-sprtransport", inputs: ["readonly", "actions", "navigationEnabled", "pausingEnabled"] }, { kind: "component", type: ReadyStateIndicator, selector: "app-readystateindicator", inputs: ["ready"] }] });
362
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ControlPanel, decorators: [{
363
- type: Component,
364
- args: [{ selector: 'app-sprcontrolpanel', template: `
365
- <div *ngIf="!screenXs" style="flex-direction: row" >
366
- <app-sprstatusdisplay style="flex:0 0 0" [statusMsg]="statusMsg" [statusAlertType]="statusAlertType" [statusWaiting]="statusWaiting"
367
- class="hidden-xs"></app-sprstatusdisplay>
368
- <app-sprtransport style="flex:10 0 0" [readonly]="readonly" [actions]="transportActions" [navigationEnabled]="navigationEnabled"></app-sprtransport>
369
- <app-uploadstatus style="flex:0 0 0" *ngIf="enableUploadRecordings" [value]="uploadProgress"
370
- [status]="uploadStatus" [awaitNewUpload]="processing"></app-uploadstatus>
371
- <app-readystateindicator [ready]="_ready"></app-readystateindicator>
372
- </div>
373
- <div *ngIf="screenXs" style="flex-direction: column" >
374
- <div style="flex-direction: row" class="flexFill" >
375
- <app-sprstatusdisplay style="flex:10 0 0" [statusMsg]="statusMsg" [statusAlertType]="statusAlertType" [statusWaiting]="statusWaiting"
376
- class="hidden-xs"></app-sprstatusdisplay>
377
- <app-uploadstatus style="flex:0 0 0" *ngIf="enableUploadRecordings" [value]="uploadProgress"
378
- [status]="uploadStatus" [awaitNewUpload]="processing"></app-uploadstatus>
379
- <app-readystateindicator [ready]="_ready"></app-readystateindicator>
380
- </div>
381
- <app-sprtransport [readonly]="readonly" [actions]="transportActions" [navigationEnabled]="navigationEnabled"></app-sprtransport>
382
-
383
- </div>
384
- `, styles: ["div{align-content:center;align-items:center;margin:0;padding:20px;min-height:min-content}\n"] }]
385
- }], ctorParameters: function () { return [{ type: i5.BreakpointObserver }, { type: i7.MatDialog }]; }, propDecorators: { statusDisplay: [{
386
- type: ViewChild,
387
- args: [StatusDisplay, { static: true }]
388
- }], transportPanel: [{
389
- type: ViewChild,
390
- args: [TransportPanel, { static: true }]
391
- }], readonly: [{
392
- type: Input
393
- }], transportActions: [{
394
- type: Input
395
- }], processing: [{
396
- type: Input
397
- }], statusMsg: [{
398
- type: Input
399
- }], statusAlertType: [{
400
- type: Input
401
- }], statusWaiting: [{
402
- type: Input
403
- }], uploadStatus: [{
404
- type: Input
405
- }], uploadProgress: [{
406
- type: Input
407
- }], currentRecording: [{
408
- type: Input
409
- }], enableUploadRecordings: [{
410
- type: Input
411
- }], navigationEnabled: [{
412
- type: Input
413
- }], ready: [{
414
- type: Input
415
- }] } });
416
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbHBhbmVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL3NwZWVjaHJlY29yZGVyL3Nlc3Npb24vY29udHJvbHBhbmVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQTtBQUMxQyxPQUFPLEVBQ0wsU0FBUyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQzVCLE1BQU0sZUFBZSxDQUFDO0FBS3ZCLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLCtCQUErQixDQUFDOzs7Ozs7Ozs7QUFzQ2xFLE1BQU0sT0FBTyxhQUFhO0lBakMxQjtRQWtDVyxvQkFBZSxHQUFHLE1BQU0sQ0FBQztRQUN6QixjQUFTLEdBQUcsZUFBZSxDQUFDO1FBQzVCLGtCQUFhLEdBQUUsS0FBSyxDQUFDO0tBQy9COzsyR0FKWSxhQUFhOytGQUFiLGFBQWEsb0tBN0JkOzs7OztHQUtUOzRGQXdCVSxhQUFhO2tCQWpDekIsU0FBUzsrQkFFRSxzQkFBc0IsWUFFdEI7Ozs7O0dBS1Q7OEJBeUJRLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLOztBQWdCUixNQUFNLE9BQU8sWUFBWTtJQVp6QjtRQWFVLG9CQUFlLEdBQUMsS0FBSyxDQUFDO1FBQzlCLGdCQUFXLEdBQXVCLGFBQWEsQ0FBQztRQUVoRCxnQkFBVyxHQUFjLFNBQVMsQ0FBQztRQUNuQyxXQUFNLEdBQUcsR0FBRyxDQUFDO1FBQ2IsaUJBQVksR0FBYSxJQUFJLENBQUM7UUFDOUIsZ0JBQVcsR0FBUSxFQUFFLENBQUM7S0FtRHZCO0lBakRTLGNBQWM7UUFFcEIsSUFBSSxNQUFNLENBQUM7UUFDWCxJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVB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L2FjdGlvbi9hY3Rpb24nXHJcbmltcG9ydCB7XHJcbiAgQ29tcG9uZW50LCBWaWV3Q2hpbGQsIElucHV0XHJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbmltcG9ydCB7IE1hdERpYWxvZ30gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2RpYWxvZ1wiO1xyXG5pbXBvcnQge1Byb2dyZXNzU3Bpbm5lck1vZGV9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1zcGlubmVyXCI7XHJcbmltcG9ydCB7QnJlYWtwb2ludE9ic2VydmVyfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL2xheW91dFwiO1xyXG5pbXBvcnQge1Jlc3BvbnNpdmVDb21wb25lbnR9IGZyb20gXCIuLi8uLi91aS9yZXNwb25zaXZlX2NvbXBvbmVudFwiO1xyXG5pbXBvcnQge1RoZW1lUGFsZXR0ZX0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2NvcmVcIjtcclxuXHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcblxyXG4gIHNlbGVjdG9yOiAnYXBwLXNwcnN0YXR1c2Rpc3BsYXknLFxyXG5cclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPHAgbWF0VG9vbHRpcD1cIlN0YXR1c1wiPlxyXG4gICAgICA8bWF0LXByb2dyZXNzLXNwaW5uZXIgKm5nSWY9XCJzdGF0dXNXYWl0aW5nXCIgY29sb3I9XCJibGFja1wiICBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiIFtkaWFtZXRlcl09XCIzMFwiIFtzdHJva2VXaWR0aF09XCI1XCI+PC9tYXQtcHJvZ3Jlc3Mtc3Bpbm5lcj48bWF0LWljb24gKm5nSWY9XCJzdGF0dXNBbGVydFR5cGU9PT0nZXJyb3InXCIgc3R5bGU9XCJjb2xvcjpyZWRcIj5yZXBvcnRfcHJvYmxlbTwvbWF0LWljb24+XHJcbiAgICAgIHt7c3RhdHVzTXNnfX1cclxuICAgIDwvcD5cclxuICBgLFxyXG4gIHN0eWxlczogW2A6aG9zdCB7XHJcbiAgICBkaXNwbGF5OiBpbmxpbmU7XHJcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xyXG4gICAgZm9udC1zaXplOiBzbWFsbGVyO1xyXG4gIH1gLCBgXHJcbiAgICBwIHtcclxuICAgICAgcGFkZGluZzogNHB4O1xyXG4gICAgICB3aGl0ZS1zcGFjZTpub3dyYXA7XHJcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcclxuICAgIH1cclxuICBgLCBgXHJcbiAgICBtYXQtcHJvZ3Jlc3Mtc3Bpbm5lciB7XHJcbiAgICAgIGNvbG9yOiBibGFjaztcclxuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG4gICAgfVxyXG4gIGAsIGBcclxuICAgIHNwYW4ge1xyXG4gICAgICBjb2xvcjogcmVkO1xyXG4gICAgfVxyXG4gIGBdXHJcblxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIFN0YXR1c0Rpc3BsYXkge1xyXG4gIEBJbnB1dCgpIHN0YXR1c0FsZXJ0VHlwZSA9ICdpbmZvJztcclxuICBASW5wdXQoKSBzdGF0dXNNc2cgPSAnSW5pdGlhbGl6ZS4uLic7XHJcbiAgQElucHV0KCkgc3RhdHVzV2FpdGluZyA9ZmFsc2U7XHJcbn1cclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC11cGxvYWRzdGF0dXMnLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8bWF0LXByb2dyZXNzLXNwaW5uZXIgW21vZGVdPVwic3Bpbm5lck1vZGVcIiBbY29sb3JdPVwiY29sb3JTdGF0dXNcIiBbZGlhbWV0ZXJdPVwiMzBcIiBbc3Ryb2tlV2lkdGhdPVwiNVwiIFt2YWx1ZV09XCJfdmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cInRvb2xUaXBUZXh0XCI+PC9tYXQtcHJvZ3Jlc3Mtc3Bpbm5lcj5cclxuICBgLFxyXG4gIHN0eWxlczogW2A6aG9zdCB7XHJcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xyXG4gIH1gLGBtYXQtcHJvZ3Jlc3Mtc3Bpbm5lcntcclxuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG4gIH1gXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgVXBsb2FkU3RhdHVzIHtcclxuICBwcml2YXRlIF9hd2FpdE5ld1VwbG9hZD1mYWxzZTtcclxuICBzcGlubmVyTW9kZTpQcm9ncmVzc1NwaW5uZXJNb2RlID0gJ2RldGVybWluYXRlJztcclxuICBfc3RhdHVzITpzdHJpbmc7XHJcbiAgY29sb3JTdGF0dXM6VGhlbWVQYWxldHRlPSdwcmltYXJ5JztcclxuICBfdmFsdWUgPSAxMDA7XHJcbiAgZGlzcGxheVZhbHVlOnN0cmluZ3xudWxsPW51bGw7XHJcbiAgdG9vbFRpcFRleHQ6c3RyaW5nPScnO1xyXG5cclxuICBwcml2YXRlIF91cGRhdGVTcGlubmVyKCl7XHJcblxyXG4gICAgbGV0IHVwbE1zZztcclxuICAgIGlmICh0aGlzLl9hd2FpdE5ld1VwbG9hZCB8fCB0aGlzLl92YWx1ZSA9PT0gMCkge1xyXG4gICAgICB0aGlzLnNwaW5uZXJNb2RlID0gJ2luZGV0ZXJtaW5hdGUnXHJcbiAgICAgIHRoaXMuZGlzcGxheVZhbHVlPScmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsnXHJcbiAgICAgIHVwbE1zZz0nUHJlcGFyaW5nIHVwbG9hZC4nXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNwaW5uZXJNb2RlID0gJ2RldGVybWluYXRlJ1xyXG4gICAgICB0aGlzLmRpc3BsYXlWYWx1ZT10aGlzLl92YWx1ZSsnJSdcclxuICAgICAgaWYodGhpcy5fdmFsdWU9PT0xMDApe1xyXG4gICAgICAgIHVwbE1zZyA9ICdVcGxvYWQgY29tcGxldGUnXHJcbiAgICAgIH1lbHNlIHtcclxuICAgICAgICB1cGxNc2cgPSAnVXBsb2FkIHByb2dyZXNzOiAnICsgdGhpcy5kaXNwbGF5VmFsdWVcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYodGhpcy5zdGF0dXM9PT0nd2Fybicpe1xyXG4gICAgICB1cGxNc2c9J1VwbG9hZCBlcnJvciBvY2N1cnJlZC4gUGxlYXNlIGNoZWNrIHlvdXIgbmV0d29yayBjb25uZWN0aW9uLiAnK3VwbE1zZ1xyXG4gICAgfVxyXG4gICAgdGhpcy50b29sVGlwVGV4dD11cGxNc2dcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHZhbHVlKHZhbHVlOiBudW1iZXIpIHtcclxuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XHJcbiAgICB0aGlzLl91cGRhdGVTcGlubmVyKClcclxuICB9O1xyXG5cclxuICBASW5wdXQoKSBzZXQgYXdhaXROZXdVcGxvYWQoYXdhaXROZXdVcGxvYWQ6Ym9vbGVhbil7XHJcbiAgICB0aGlzLl9hd2FpdE5ld1VwbG9hZD1hd2FpdE5ld1VwbG9hZFxyXG4gICAgdGhpcy5fdXBkYXRlU3Bpbm5lcigpXHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBzZXQgc3RhdHVzKHN0YXR1czpzdHJpbmcpIHtcclxuICAgIHRoaXMuX3N0YXR1cyA9IHN0YXR1cztcclxuICAgIGlmICgnYWNjZW50JyA9PT0gc3RhdHVzKSB7XHJcbiAgICAgIHRoaXMuY29sb3JTdGF0dXMgPSAnYWNjZW50JztcclxuICAgIH0gZWxzZSBpZiAoJ3dhcm4nID09PSBzdGF0dXMpIHtcclxuICAgICAgdGhpcy5jb2xvclN0YXR1cyA9ICd3YXJuJztcclxuICAgIH0gZWxzZXtcclxuICAgICAgdGhpcy5jb2xvclN0YXR1cyA9ICdwcmltYXJ5JztcclxuICAgIH1cclxuICAgIHRoaXMuX3VwZGF0ZVNwaW5uZXIoKVxyXG4gIH1cclxuXHJcbiAgZ2V0IHN0YXR1cygpOnN0cmluZ3tcclxuICAgIHJldHVybiB0aGlzLl9zdGF0dXNcclxuICB9XHJcblxyXG59XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtc3BycHJvZ3Jlc3NkaXNwbGF5JyxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPHA+e3twcm9ncmVzc01zZ319PC9wPlxyXG4gIGAsXHJcbiAgc3R5bGVzOiBbYDpob3N0IHtcclxuICAgIGZsZXg6IDE7XHJcbiAgLyogYWxpZ24tc2VsZjogZmxleC1zdGFydDsgKi9cclxuICAgIC8qZGlzcGxheTogaW5saW5lOyAqL1xyXG4gICAgICB3aWR0aDogMTAwJTtcclxuICAgIHRleHQtYWxpZ246IGxlZnQ7XHJcbiAgfWBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQcm9ncmVzc0Rpc3BsYXkge1xyXG4gIHByb2dyZXNzTXNnID0gJ1tpdGVtY29kZV0nO1xyXG59XHJcblxyXG5cclxuXHJcblxyXG5leHBvcnQgY2xhc3MgVHJhbnNwb3J0QWN0aW9ucyB7XHJcbiAgc3RhcnRBY3Rpb246IEFjdGlvbjx2b2lkPjtcclxuICBzdG9wQWN0aW9uOiBBY3Rpb248dm9pZD47XHJcbiAgbmV4dEFjdGlvbjogQWN0aW9uPHZvaWQ+O1xyXG4gIGZ3ZE5leHRBY3Rpb246IEFjdGlvbjx2b2lkPjtcclxuICBwYXVzZUFjdGlvbjogQWN0aW9uPHZvaWQ+O1xyXG4gIGZ3ZEFjdGlvbjogQWN0aW9uPHZvaWQ+O1xyXG4gIGJ3ZEFjdGlvbjogQWN0aW9uPHZvaWQ+O1xyXG4gIHN0b3BOb25yZWNvcmRpbmdBY3Rpb246QWN0aW9uPHZvaWQ+O1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMuc3RhcnRBY3Rpb24gPSBuZXcgQWN0aW9uKCdTdGFydCcpO1xyXG4gICAgdGhpcy5zdG9wQWN0aW9uID0gbmV3IEFjdGlvbignU3RvcCcpO1xyXG4gICAgdGhpcy5uZXh0QWN0aW9uID0gbmV3IEFjdGlvbignTmV4dCcpO1xyXG4gICAgdGhpcy5wYXVzZUFjdGlvbiA9IG5ldyBBY3Rpb24oJ1BhdXNlJyk7XHJcbiAgICB0aGlzLmZ3ZE5leHRBY3Rpb24gPSBuZXcgQWN0aW9uKCdOZXh0IHJlY29yZGluZycpO1xyXG4gICAgdGhpcy5md2RBY3Rpb24gPSBuZXcgQWN0aW9uKCdGb3J3YXJkJyk7XHJcbiAgICB0aGlzLmJ3ZEFjdGlvbiA9IG5ldyBBY3Rpb24oJ0JhY2t3YXJkJyk7XHJcbiAgICB0aGlzLnN0b3BOb25yZWNvcmRpbmdBY3Rpb249bmV3IEFjdGlvbignTmV4dCcpO1xyXG5cclxuICB9XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG5cclxuICBzZWxlY3RvcjogJ2FwcC1zcHJ0cmFuc3BvcnQnLFxyXG5cclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPGJ1dHRvbiBpZD1cImJ3ZEJ0blwiICpuZ0lmPVwibmF2aWdhdGlvbkVuYWJsZWRcIiAgKGNsaWNrKT1cImFjdGlvbnMuYndkQWN0aW9uLnBlcmZvcm0oKVwiIFtkaXNhYmxlZF09XCJid2REaXNhYmxlZCgpXCJcclxuICAgICAgICAgICAgbWF0LXJhaXNlZC1idXR0b24+XHJcbiAgICAgIDxtYXQtaWNvbj5jaGV2cm9uX2xlZnQ8L21hdC1pY29uPlxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8YnV0dG9uIChjbGljayk9XCJzdGFydFN0b3BOZXh0UGVyZm9ybSgpXCIgW2Rpc2FibGVkXT1cInN0YXJ0RGlzYWJsZWQoKSAmJiBzdG9wRGlzYWJsZWQoKSAmJiBuZXh0RGlzYWJsZWQoKSAmJiBzdG9wTm9ucmVjb3JkaW5nRGlzYWJsZWQoKVwiICBtYXQtcmFpc2VkLWJ1dHRvbj5cclxuICAgICAgPG1hdC1pY29uIFtzdHlsZS5jb2xvcl09XCJzdGFydFN0b3BOZXh0SWNvbkNvbG9yKClcIj57e3N0YXJ0U3RvcE5leHRJY29uTmFtZSgpfX08L21hdC1pY29uPjxtYXQtaWNvbiAqbmdJZj1cIiFuZXh0RGlzYWJsZWQoKSB8fCAhc3RvcE5vbnJlY29yZGluZ0Rpc2FibGVkKClcIiBbc3R5bGUuY29sb3JdPVwibmV4dERpc2FibGVkKCkgPyAnZ3JleScgOiAnYmxhY2snXCI+Y2hldnJvbl9yaWdodDwvbWF0LWljb24+XHJcbiAgICAgIDxzcGFuICpuZ0lmPVwiIXNjcmVlblhzXCI+e3tzdGFydFN0b3BOZXh0TmFtZSgpfX08L3NwYW4+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIDxidXR0b24gKm5nSWY9XCJwYXVzaW5nRW5hYmxlZFwiIChjbGljayk9XCJhY3Rpb25zLnBhdXNlQWN0aW9uLnBlcmZvcm0oKVwiIFtkaXNhYmxlZF09XCJwYXVzZURpc2FibGVkKClcIiBtYXQtcmFpc2VkLWJ1dHRvbj5cclxuICAgICAgPG1hdC1pY29uPnBhdXNlPC9tYXQtaWNvbj5cclxuICAgICAgPHNwYW4gKm5nSWY9XCIhc2NyZWVuWHNcIj5QYXVzZTwvc3Bhbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvbiBpZD1cImZ3ZE5leHRCdG5cIiAqbmdJZj1cIm5hdmlnYXRpb25FbmFibGVkICYmICFzY3JlZW5Yc1wiIChjbGljayk9XCJhY3Rpb25zLmZ3ZE5leHRBY3Rpb24ucGVyZm9ybSgpXCIgW2Rpc2FibGVkXT1cImZ3ZE5leHREaXNhYmxlZCgpXCIgbWF0LXJhaXNlZC1idXR0b24+XHJcbiAgICAgIDxtYXQtaWNvbj5yZWRvPC9tYXQtaWNvbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvbiBpZD1cImZ3ZEJ0blwiICpuZ0lmPVwibmF2aWdhdGlvbkVuYWJsZWRcIiAgKGNsaWNrKT1cImFjdGlvbnMuZndkQWN0aW9uLnBlcmZvcm0oKVwiIFtkaXNhYmxlZF09XCJmd2REaXNhYmxlZCgpXCIgbWF0LXJhaXNlZC1idXR0b24+XHJcbiAgICAgIDxtYXQtaWNvbj5jaGV2cm9uX3JpZ2h0PC9tYXQtaWNvbj5cclxuICAgIDwvYnV0dG9uPlxyXG5cclxuICBgLFxyXG4gIHN0eWxlczogW2A6aG9zdCB7XHJcbiAgICBmbGV4OiAyMDtcclxuICAgIGFsaWduLXNlbGY6IGNlbnRlcjtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgYWxpZ24tY29udGVudDogY2VudGVyO1xyXG4gICAgbWFyZ2luOiAwO1xyXG5cclxuICB9YCwgYFxyXG4gICAgZGl2IHtcclxuICAgICAgZGlzcGxheTogaW5saW5lO1xyXG4gICAgICBmbGV4OiAwO1xyXG4gICAgfWAsYFxyXG4gICAgIGJ1dHRvbiB7XHJcbiAgICAgICB0b3VjaC1hY3Rpb246IG1hbmlwdWxhdGlvbjtcclxuICAgICB9YFxyXG4gIF1cclxuXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUcmFuc3BvcnRQYW5lbCBleHRlbmRzIFJlc3BvbnNpdmVDb21wb25lbnR7XHJcblxyXG4gIEBJbnB1dCgpIHJlYWRvbmx5ITpib29sZWFuO1xyXG4gIEBJbnB1dCgpIGFjdGlvbnMhOiBUcmFuc3BvcnRBY3Rpb25zO1xyXG4gIEBJbnB1dCgpIG5hdmlnYXRpb25FbmFibGVkPXRydWU7XHJcbiAgQElucHV0KCkgcGF1c2luZ0VuYWJsZWQ9dHJ1ZTtcclxuXHJcbiAgc3RhcnRTdG9wTmV4dEJ1dHRvbk5hbWUhOnN0cmluZztcclxuICBzdGFydFN0b3BOZXh0QnV0dG9uSWNvbk5hbWUhOnN0cmluZztcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihicmVha3BvaW50T2JzZXJ2ZXI6IEJyZWFrcG9pbnRPYnNlcnZlcikge1xyXG4gICAgICBzdXBlcihicmVha3BvaW50T2JzZXJ2ZXIpO1xyXG4gICAgfVxyXG5cclxuICBzdGFydERpc2FibGVkKCkge1xyXG4gICAgcmV0dXJuICF0aGlzLmFjdGlvbnMgfHwgdGhpcy5yZWFkb25seSB8fCB0aGlzLmFjdGlvbnMuc3RhcnRBY3Rpb24uZGlzYWJsZWRcclxuICB9XHJcblxyXG4gIHN0b3BEaXNhYmxlZCgpIHtcclxuICAgIHJldHVybiAhdGhpcy5hY3Rpb25zIHx8IHRoaXMuYWN0aW9ucy5zdG9wQWN0aW9uLmRpc2FibGVkXHJcbiAgfVxyXG5cclxuICBuZXh0RGlzYWJsZWQoKSB7XHJcbiAgICByZXR1cm4gIXRoaXMuYWN0aW9ucyB8fCB0aGlzLmFjdGlvbnMubmV4dEFjdGlvbi5kaXNhYmxlZCB8fCAhdGhpcy5uYXZpZ2F0aW9uRW5hYmxlZDtcclxuICB9XHJcblxyXG4gIHN0b3BOb25yZWNvcmRpbmdEaXNhYmxlZCgpIHtcclxuICAgIHJldHVybiAhdGhpcy5hY3Rpb25zIHx8IHRoaXMuYWN0aW9ucy5zdG9wTm9ucmVjb3JkaW5nQWN0aW9uLmRpc2FibGVkIHx8ICF0aGlzLm5hdmlnYXRpb25FbmFibGVkO1xyXG4gIH1cclxuXHJcbiAgcGF1c2VEaXNhYmxlZCgpIHtcclxuICAgIHJldHVybiAhdGhpcy5hY3Rpb25zIHx8IHRoaXMuYWN0aW9ucy5wYXVzZUFjdGlvbi5kaXNhYmxlZCB8fCAhdGhpcy5wYXVzaW5nRW5hYmxlZDtcclxuICB9XHJcblxyXG4gIGZ3ZERpc2FibGVkKCkge1xyXG4gICAgcmV0dXJuICF0aGlzLmFjdGlvbnMgfHwgdGhpcy5hY3Rpb25zLmZ3ZEFjdGlvbi5kaXNhYmxlZCB8fCAhdGhpcy5uYXZpZ2F0aW9uRW5hYmxlZDtcclxuICB9XHJcblxyXG4gIGZ3ZE5leHREaXNhYmxlZCgpIHtcclxuICAgIHJldHVybiAhdGhpcy5hY3Rpb25zIHx8IHRoaXMuYWN0aW9ucy5md2ROZXh0QWN0aW9uLmRpc2FibGVkIHx8ICF0aGlzLm5hdmlnYXRpb25FbmFibGVkO1xyXG4gIH1cclxuXHJcbiAgYndkRGlzYWJsZWQoKSB7XHJcbiAgICByZXR1cm4gIXRoaXMuYWN0aW9ucyB8fCB0aGlzLmFjdGlvbnMuYndkQWN0aW9uLmRpc2FibGVkIHx8ICF0aGlzLm5hdmlnYXRpb25FbmFibGVkO1xyXG4gIH1cclxuXHJcbiAgICBzdGFydFN0b3BOZXh0TmFtZSgpOnN0cmluZ3tcclxuICAgICAgICBpZighdGhpcy5uZXh0RGlzYWJsZWQoKSB8fCAhdGhpcy5zdG9wTm9ucmVjb3JkaW5nRGlzYWJsZWQoKSl7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhcnRTdG9wTmV4dEJ1dHRvbk5hbWU9IFwiTmV4dFwiXHJcbiAgICAgICAgfWVsc2UgaWYoIXRoaXMuc3RhcnREaXNhYmxlZCgpKXtcclxuICAgICAgICAgICAgdGhpcy5zdGFydFN0b3BOZXh0QnV0dG9uTmFtZT1cIlN0YXJ0XCJcclxuICAgICAgICB9ZWxzZSBpZighdGhpcy5zdG9wRGlzYWJsZWQoKSkge1xyXG4gICAgICAgICAgICB0aGlzLnN0YXJ0U3RvcE5leHRCdXR0b25OYW1lID0gXCJTdG9wXCJcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnRTdG9wTmV4dEJ1dHRvbk5hbWU7XHJcbiAgICB9XHJcbiAgc3RhcnRTdG9wTmV4dEljb25OYW1lKCk6c3RyaW5ne1xyXG4gICAgICBpZighdGhpcy5zdGFydERpc2FibGVkKCkpe1xyXG4gICAgICAgICB0aGlzLnN0YXJ0U3RvcE5leHRCdXR0b25JY29uTmFtZT1cImZpYmVyX21hbnVhbF9yZWNvcmRcIlxyXG4gICAgICB9ZWxzZSBpZighdGhpcy5zdG9wRGlzYWJsZWQoKSB8fCAhdGhpcy5zdG9wTm9ucmVjb3JkaW5nRGlzYWJsZWQoKSl7XHJcbiAgICAgICAgICB0aGlzLnN0YXJ0U3RvcE5leHRCdXR0b25JY29uTmFtZT1cInN0b3BcIlxyXG4gICAgICB9ZWxzZSBpZighdGhpcy5uZXh0RGlzYWJsZWQoKSl7XHJcbiAgICAgICAgICB0aGlzLnN0YXJ0U3RvcE5leHRCdXR0b25JY29uTmFtZT1cInN0b3BcIlxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0aGlzLnN0YXJ0U3RvcE5leHRCdXR0b25JY29uTmFtZVxyXG4gIH1cclxuICAgIHN0YXJ0U3RvcE5leHRJY29uQ29sb3IoKTpzdHJpbmd7XHJcbiAgICAgICAgaWYoIXRoaXMuc3RhcnREaXNhYmxlZCgpKXtcclxuICAgICAgICAgICAgcmV0dXJuIFwicmVkXCJcclxuICAgICAgICB9ZWxzZSBpZighdGhpcy5zdG9wRGlzYWJsZWQoKSB8fCAhdGhpcy5uZXh0RGlzYWJsZWQoKSl7XHJcbiAgICAgICAgICAgIHJldHVybiBcInllbGxvd1wiXHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHJldHVybiBcImdyZXlcIjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gIHN0YXJ0U3RvcE5leHRQZXJmb3JtKCl7XHJcbiAgICBpZighdGhpcy5zdGFydERpc2FibGVkKCkpe1xyXG4gICAgICB0aGlzLmFjdGlvbnMuc3RhcnRBY3Rpb24ucGVyZm9ybSgpO1xyXG4gICAgfWVsc2UgaWYoIXRoaXMuc3RvcERpc2FibGVkKCkpe1xyXG4gICAgICB0aGlzLmFjdGlvbnMuc3RvcEFjdGlvbi5wZXJmb3JtKCk7XHJcbiAgICB9ZWxzZSBpZighdGhpcy5uZXh0RGlzYWJsZWQoKSl7XHJcbiAgICAgIHRoaXMuYWN0aW9ucy5uZXh0QWN0aW9uLnBlcmZvcm0oKTtcclxuICAgIH1lbHNlIGlmKCF0aGlzLnN0b3BOb25yZWNvcmRpbmdEaXNhYmxlZCgpKXtcclxuICAgICAgdGhpcy5hY3Rpb25zLnN0b3BOb25yZWNvcmRpbmdBY3Rpb24ucGVyZm9ybSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLXdha2Vsb2NraW5kaWNhdG9yJyxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPG1hdC1pY29uICpuZ0lmPVwiX3NjcmVlbkxvY2tlZFwiPnNjcmVlbl9sb2NrX3BvcnRyYWl0PC9tYXQtaWNvbj5cclxuICBgLFxyXG4gIHN0eWxlczogW11cclxufSlcclxuZXhwb3J0IGNsYXNzIFdha2VMb2NrSW5kaWNhdG9yIHtcclxuICBfc2NyZWVuTG9ja2VkPWZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHt9XHJcblxyXG4gIEBJbnB1dCgpIHNldCBzY3JlZW5Mb2NrZWQoc2NyZWVuTG9jazpib29sZWFuKXtcclxuICAgIHRoaXMuX3NjcmVlbkxvY2tlZD1zY3JlZW5Mb2NrO1xyXG4gIH1cclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcblxyXG4gIHNlbGVjdG9yOiAnYXBwLXJlYWR5c3RhdGVpbmRpY2F0b3InLFxyXG5cclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPG1hdC1pY29uIFttYXRUb29sdGlwXT1cInJlYWR5U3RhdGVUb29sVGlwXCI+e3tob3VyR2xhc3NJY29uTmFtZX19PC9tYXQtaWNvbj5cclxuICBgLFxyXG4gIHN0eWxlczogW11cclxufSlcclxuZXhwb3J0IGNsYXNzIFJlYWR5U3RhdGVJbmRpY2F0b3Ige1xyXG4gIF9yZWFkeT10cnVlO1xyXG4gIGhvdXJHbGFzc0ljb25OYW1lPSdob3VyZ2xhc3NfZW1wdHknXHJcbiAgcmVhZHlTdGF0ZVRvb2xUaXA6c3RyaW5nPScnXHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge31cclxuXHJcbiAgQElucHV0KCkgc2V0IHJlYWR5KHJlYWR5OmJvb2xlYW4pe1xyXG4gICAgdGhpcy5fcmVhZHk9cmVhZHlcclxuICAgIHRoaXMuaG91ckdsYXNzSWNvbk5hbWU9dGhpcy5fcmVhZHk/J2hvdXJnbGFzc19lbXB0eSc6J2hvdXJnbGFzc19mdWxsJ1xyXG4gICAgdGhpcy5yZWFkeVN0YXRlVG9vbFRpcD10aGlzLl9yZWFkeT8nQXVkaW8gcHJvY2Vzc2luZyBhbmQgdXBsb2FkIGRvbmUuIFlvdSBjYW4gbGVhdmUgdGhlIHBhZ2Ugd2l0aG91dCBkYXRhIGxvc3MuJzonUGxlYXNlIHdhaXQgdW50aWwgYXVkaW8gcHJvY2Vzc2luZyBhbmQgdXBsb2FkIGhhdmUgZmluaXNoZWQuIFBsZWFzZSBkbyBub3QgbGVhdmUgdGhlIHBhZ2UuJ1xyXG4gIH1cclxuXHJcbiAgZ2V0IHJlYWR5KCk6Ym9vbGVhbntcclxuICAgIHJldHVybiB0aGlzLl9yZWFkeVxyXG4gIH1cclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcblxyXG4gIHNlbGVjdG9yOiAnYXBwLXNwcmNvbnRyb2xwYW5lbCcsXHJcblxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8ZGl2ICpuZ0lmPVwiIXNjcmVlblhzXCIgc3R5bGU9XCJmbGV4LWRpcmVjdGlvbjogcm93XCIgPlxyXG4gICAgIDxhcHAtc3Byc3RhdHVzZGlzcGxheSBzdHlsZT1cImZsZXg6MCAwIDBcIiBbc3RhdHVzTXNnXT1cInN0YXR1c01zZ1wiIFtzdGF0dXNBbGVydFR5cGVdPVwic3RhdHVzQWxlcnRUeXBlXCIgW3N0YXR1c1dhaXRpbmddPVwic3RhdHVzV2FpdGluZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJoaWRkZW4teHNcIj48L2FwcC1zcHJzdGF0dXNkaXNwbGF5PlxyXG4gICAgICA8YXBwLXNwcnRyYW5zcG9ydCBzdHlsZT1cImZsZXg6MTAgMCAwXCIgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCIgW2FjdGlvbnNdPVwidHJhbnNwb3J0QWN0aW9uc1wiIFtuYXZpZ2F0aW9uRW5hYmxlZF09XCJuYXZpZ2F0aW9uRW5hYmxlZFwiPjwvYXBwLXNwcnRyYW5zcG9ydD5cclxuICAgICAgPGFwcC11cGxvYWRzdGF0dXMgc3R5bGU9XCJmbGV4OjAgMCAwXCIgKm5nSWY9XCJlbmFibGVVcGxvYWRSZWNvcmRpbmdzXCIgW3ZhbHVlXT1cInVwbG9hZFByb2dyZXNzXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtzdGF0dXNdPVwidXBsb2FkU3RhdHVzXCIgW2F3YWl0TmV3VXBsb2FkXT1cInByb2Nlc3NpbmdcIj48L2FwcC11cGxvYWRzdGF0dXM+XHJcbiAgICAgIDxhcHAtcmVhZHlzdGF0ZWluZGljYXRvciBbcmVhZHldPVwiX3JlYWR5XCI+PC9hcHAtcmVhZHlzdGF0ZWluZGljYXRvcj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiAqbmdJZj1cInNjcmVlblhzXCIgc3R5bGU9XCJmbGV4LWRpcmVjdGlvbjogY29sdW1uXCIgID5cclxuICAgICAgPGRpdiBzdHlsZT1cImZsZXgtZGlyZWN0aW9uOiByb3dcIiBjbGFzcz1cImZsZXhGaWxsXCIgPlxyXG4gICAgICAgPGFwcC1zcHJzdGF0dXNkaXNwbGF5IHN0eWxlPVwiZmxleDoxMCAwIDBcIiBbc3RhdHVzTXNnXT1cInN0YXR1c01zZ1wiIFtzdGF0dXNBbGVydFR5cGVdPVwic3RhdHVzQWxlcnRUeXBlXCIgW3N0YXR1c1dhaXRpbmddPVwic3RhdHVzV2FpdGluZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImhpZGRlbi14c1wiPjwvYXBwLXNwcnN0YXR1c2Rpc3BsYXk+XHJcbiAgICAgICA8YXBwLXVwbG9hZHN0YXR1cyBzdHlsZT1cImZsZXg6MCAwIDBcIiAqbmdJZj1cImVuYWJsZVVwbG9hZFJlY29yZGluZ3NcIiBbdmFsdWVdPVwidXBsb2FkUHJvZ3Jlc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3RhdHVzXT1cInVwbG9hZFN0YXR1c1wiIFthd2FpdE5ld1VwbG9hZF09XCJwcm9jZXNzaW5nXCI+PC9hcHAtdXBsb2Fkc3RhdHVzPlxyXG4gICAgICAgIDxhcHAtcmVhZHlzdGF0ZWluZGljYXRvciBbcmVhZHldPVwiX3JlYWR5XCI+PC9hcHAtcmVhZHlzdGF0ZWluZGljYXRvcj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxhcHAtc3BydHJhbnNwb3J0IFtyZWFkb25seV09XCJyZWFkb25seVwiIFthY3Rpb25zXT1cInRyYW5zcG9ydEFjdGlvbnNcIiBbbmF2aWdhdGlvbkVuYWJsZWRdPVwibmF2aWdhdGlvbkVuYWJsZWRcIj48L2FwcC1zcHJ0cmFuc3BvcnQ+XHJcblxyXG4gICAgPC9kaXY+XHJcbiAgYCxcclxuICBzdHlsZXM6IFtgZGl2IHtcclxuICAgIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjtcclxuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICBtYXJnaW46IDA7XHJcbiAgICBwYWRkaW5nOiAyMHB4O1xyXG4gICAgbWluLWhlaWdodDogbWluLWNvbnRlbnQ7IC8qIGltcG9ydGFudCAqL1xyXG4gIH1gXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ29udHJvbFBhbmVsIGV4dGVuZHMgUmVzcG9uc2l2ZUNvbXBvbmVudCB7XHJcbiAgQFZpZXdDaGlsZChTdGF0dXNEaXNwbGF5LCB7IHN0YXRpYzogdHJ1ZSB9KSBzdGF0dXNEaXNwbGF5ITogU3RhdHVzRGlzcGxheTtcclxuICBAVmlld0NoaWxkKFRyYW5zcG9ydFBhbmVsLCB7IHN0YXRpYzogdHJ1ZSB9KSB0cmFuc3BvcnRQYW5lbCE6IFRyYW5zcG9ydFBhbmVsO1xyXG5cclxuICBASW5wdXQoKSByZWFkb25seSE6Ym9vbGVhblxyXG4gIEBJbnB1dCgpIHRyYW5zcG9ydEFjdGlvbnMhOiBUcmFuc3BvcnRBY3Rpb25zXHJcbiAgQElucHV0KCkgcHJvY2Vzc2luZz1mYWxzZVxyXG4gIEBJbnB1dCgpIHN0YXR1c01zZyE6IHN0cmluZztcclxuICBASW5wdXQoKSBzdGF0dXNBbGVydFR5cGUhOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgc3RhdHVzV2FpdGluZyE6IGJvb2xlYW47XHJcbiAgQElucHV0KCkgdXBsb2FkU3RhdHVzITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHVwbG9hZFByb2dyZXNzITogbnVtYmVyO1xyXG4gIEBJbnB1dCgpIGN1cnJlbnRSZWNvcmRpbmc6IEF1ZGlvQnVmZmVyfCBudWxsfCB1bmRlZmluZWQ7XHJcbiAgQElucHV0KCkgZW5hYmxlVXBsb2FkUmVjb3JkaW5ncyE6IGJvb2xlYW47XHJcbiAgQElucHV0KCkgbmF2aWdhdGlvbkVuYWJsZWQ9dHJ1ZTtcclxuXHJcbiAgX3JlYWR5PXRydWVcclxuXHJcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGJwbzpCcmVha3BvaW50T2JzZXJ2ZXIscHVibGljIGRpYWxvZzogTWF0RGlhbG9nKSB7XHJcbiAgICBzdXBlcihicG8pO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgc2V0IHJlYWR5KHJlYWR5OmJvb2xlYW4pe1xyXG4gICAgdGhpcy5fcmVhZHk9cmVhZHlcclxuICB9XHJcblxyXG4gIGdldCByZWFkeSgpOmJvb2xlYW57XHJcbiAgICByZXR1cm4gdGhpcy5fcmVhZHlcclxuICB9XHJcblxyXG59XHJcblxyXG5cclxuIl19