speechrecorderng 3.6.0 → 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 +114 -114
  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 -16454
  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 -79
  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 -107
  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 -123
  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 -409
  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 -1333
  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 -17708
  219. package/fesm2015/speechrecorderng.mjs.map +0 -1
  220. package/fesm2020/speechrecorderng.mjs.map +0 -1
@@ -0,0 +1,79 @@
1
+ export class AudioContextProvider {
2
+ static { this._audioContext = null; }
3
+ static { this._offlineAudioContext = null; }
4
+ static audioContextInstance() {
5
+ if (!this._audioContext) {
6
+ let debugFail = false;
7
+ if (!window.AudioContext || typeof window.AudioContext !== 'function' || debugFail) {
8
+ this._audioContext = null;
9
+ throw new Error('Browser does not support Web Audio API!');
10
+ }
11
+ else {
12
+ console.debug("Get new audio context...");
13
+ this._audioContext = new window.AudioContext();
14
+ console.debug("Created new audio context.");
15
+ this._audioContext.addEventListener('statechange', () => {
16
+ console.debug("Audio context state changed: " + this._audioContext?.state);
17
+ });
18
+ console.debug("Created new audio context with state: " + this._audioContext?.state);
19
+ }
20
+ }
21
+ return this._audioContext;
22
+ }
23
+ // public static audioContextInstanceRunning(audioContext?:AudioContext):Promise<AudioContext>{
24
+ //
25
+ // return new Promise<AudioContext>((resolve,reject)=>{
26
+ // let aCtx=audioContext?audioContext:AudioContextProvider.audioContextInstance();
27
+ // if(aCtx) {
28
+ // if(aCtx.state==='closed') {
29
+ // reject(new Error('Audio context already closed.'));
30
+ // }else if(aCtx.state==='running') {
31
+ // resolve(aCtx);
32
+ // }else{
33
+ // aCtx.resume().then(() => {
34
+ // if(aCtx) {
35
+ // resolve(aCtx);
36
+ // }else{
37
+ // reject(new Error('Could not get audio context'));
38
+ // }
39
+ // }).catch(() => {
40
+ // reject(new Error('Could not resume audio context'));
41
+ // })
42
+ // }
43
+ // }else{
44
+ // reject(new Error('Could not get audio context from browser'));
45
+ // }
46
+ // });
47
+ // }
48
+ // public static decodeAudioData(data:ArrayBuffer,audioContext?:AudioContext):Promise<AudioBuffer>{
49
+ // return new Promise<AudioBuffer>((resolve,reject)=>{
50
+ // // decodeAudioData requires an audio context in running state
51
+ // AudioContextProvider.audioContextInstanceRunning(audioContext).then(
52
+ // (aCtx)=>{
53
+ // // Do not use Promise version, which does not work with Safari 13
54
+ // aCtx.decodeAudioData(data,decodedData => {
55
+ // resolve(decodedData);
56
+ // },(reason) => {
57
+ // reject(reason);
58
+ // });
59
+ // }
60
+ // ).catch((reason)=>{
61
+ // reject(reason);
62
+ // })
63
+ // })
64
+ // }
65
+ static decodeAudioData(data) {
66
+ return new Promise((resolve, reject) => {
67
+ if (!this._offlineAudioContext) {
68
+ this._offlineAudioContext = new OfflineAudioContext(1, 44100, 44100);
69
+ }
70
+ // Do not use Promise version, which does not work with Safari 13
71
+ this._offlineAudioContext.decodeAudioData(data, decodedData => {
72
+ resolve(decodedData);
73
+ }, (reason) => {
74
+ reject(reason);
75
+ });
76
+ });
77
+ }
78
+ }
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwZWVjaHJlY29yZGVybmcvc3JjL2xpYi9hdWRpby9jb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE1BQU0sT0FBTyxvQkFBb0I7YUFFaEIsa0JBQWEsR0FBb0IsSUFBSSxDQUFDO2FBQ3RDLHlCQUFvQixHQUEwQixJQUFJLENBQUM7SUFFM0QsTUFBTSxDQUFDLG9CQUFvQjtRQUVoQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUN2QixJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDdEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLElBQUksT0FBTyxNQUFNLENBQUMsWUFBWSxLQUFLLFVBQVUsSUFBSSxTQUFTLEVBQUU7Z0JBQ2xGLElBQUksQ0FBQyxhQUFhLEdBQUMsSUFBSSxDQUFDO2dCQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7YUFDNUQ7aUJBQU07Z0JBQ0wsT0FBTyxDQUFDLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO2dCQUMxQyxJQUFJLENBQUMsYUFBYSxHQUFFLElBQUksTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUM5QyxPQUFPLENBQUMsS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUM7Z0JBQzVDLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLEdBQUcsRUFBRTtvQkFDdEQsT0FBTyxDQUFDLEtBQUssQ0FBQywrQkFBK0IsR0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUMzRSxDQUFDLENBQUMsQ0FBQztnQkFDSCxPQUFPLENBQUMsS0FBSyxDQUFDLHdDQUF3QyxHQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLENBQUM7YUFDbkY7U0FDRjtRQUNELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBRUQsK0ZBQStGO0lBQy9GLEVBQUU7SUFDRiwyREFBMkQ7SUFDM0Qsd0ZBQXdGO0lBQ3hGLG1CQUFtQjtJQUNuQixzQ0FBc0M7SUFDdEMsZ0VBQWdFO0lBQ2hFLDZDQUE2QztJQUM3QywyQkFBMkI7SUFDM0IsaUJBQWlCO0lBQ2pCLHVDQUF1QztJQUN2Qyx5QkFBeUI7SUFDekIsK0JBQStCO0lBQy9CLHFCQUFxQjtJQUNyQixrRUFBa0U7SUFDbEUsZ0JBQWdCO0lBQ2hCLDZCQUE2QjtJQUM3QixtRUFBbUU7SUFDbkUsZUFBZTtJQUNmLFlBQVk7SUFDWixlQUFlO0lBQ2YseUVBQXlFO0lBQ3pFLFVBQVU7SUFDVixRQUFRO0lBQ1IsSUFBSTtJQUVKLG1HQUFtRztJQUNuRyx3REFBd0Q7SUFDeEQsb0VBQW9FO0lBQ3BFLDJFQUEyRTtJQUMzRSxrQkFBa0I7SUFDbEIsNEVBQTRFO0lBQzVFLHFEQUFxRDtJQUNyRCxrQ0FBa0M7SUFDbEMsMEJBQTBCO0lBQzFCLDRCQUE0QjtJQUM1QixjQUFjO0lBQ2QsVUFBVTtJQUNWLDBCQUEwQjtJQUMxQix3QkFBd0I7SUFDeEIsU0FBUztJQUNULE9BQU87SUFDUCxJQUFJO0lBR0csTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFnQjtRQUMxQyxPQUFPLElBQUksT0FBTyxDQUFjLENBQUMsT0FBTyxFQUFDLE1BQU0sRUFBQyxFQUFFO1lBQ2hELElBQUcsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUU7Z0JBQzNCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLG1CQUFtQixDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7YUFDeEU7WUFDQyxpRUFBaUU7WUFDakUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUMsV0FBVyxDQUFDLEVBQUU7Z0JBQzNELE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN2QixDQUFDLEVBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDWCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDakIsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQ0YsQ0FBQTtJQUVMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJcclxuZXhwb3J0IGNsYXNzIEF1ZGlvQ29udGV4dFByb3ZpZGVyXHJcbntcclxuICBwcml2YXRlIHN0YXRpYyBfYXVkaW9Db250ZXh0OkF1ZGlvQ29udGV4dHwgbnVsbD1udWxsO1xyXG4gIHByaXZhdGUgc3RhdGljIF9vZmZsaW5lQXVkaW9Db250ZXh0Ok9mZmxpbmVBdWRpb0NvbnRleHR8bnVsbD1udWxsO1xyXG5cclxuICBwdWJsaWMgc3RhdGljIGF1ZGlvQ29udGV4dEluc3RhbmNlKCk6QXVkaW9Db250ZXh0fG51bGxcclxuICB7XHJcbiAgICBpZiAoIXRoaXMuX2F1ZGlvQ29udGV4dCkge1xyXG4gICAgICBsZXQgZGVidWdGYWlsID0gZmFsc2U7XHJcbiAgICAgIGlmICghd2luZG93LkF1ZGlvQ29udGV4dCB8fCB0eXBlb2Ygd2luZG93LkF1ZGlvQ29udGV4dCAhPT0gJ2Z1bmN0aW9uJyB8fCBkZWJ1Z0ZhaWwpIHtcclxuICAgICAgICB0aGlzLl9hdWRpb0NvbnRleHQ9bnVsbDtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Jyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBXZWIgQXVkaW8gQVBJIScpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUuZGVidWcoXCJHZXQgbmV3IGF1ZGlvIGNvbnRleHQuLi5cIik7XHJcbiAgICAgICAgdGhpcy5fYXVkaW9Db250ZXh0PSBuZXcgd2luZG93LkF1ZGlvQ29udGV4dCgpO1xyXG4gICAgICAgIGNvbnNvbGUuZGVidWcoXCJDcmVhdGVkIG5ldyBhdWRpbyBjb250ZXh0LlwiKTtcclxuICAgICAgICB0aGlzLl9hdWRpb0NvbnRleHQuYWRkRXZlbnRMaXN0ZW5lcignc3RhdGVjaGFuZ2UnLCAoKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmRlYnVnKFwiQXVkaW8gY29udGV4dCBzdGF0ZSBjaGFuZ2VkOiBcIit0aGlzLl9hdWRpb0NvbnRleHQ/LnN0YXRlKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBjb25zb2xlLmRlYnVnKFwiQ3JlYXRlZCBuZXcgYXVkaW8gY29udGV4dCB3aXRoIHN0YXRlOiBcIit0aGlzLl9hdWRpb0NvbnRleHQ/LnN0YXRlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuX2F1ZGlvQ29udGV4dDtcclxuICB9XHJcblxyXG4gIC8vIHB1YmxpYyBzdGF0aWMgYXVkaW9Db250ZXh0SW5zdGFuY2VSdW5uaW5nKGF1ZGlvQ29udGV4dD86QXVkaW9Db250ZXh0KTpQcm9taXNlPEF1ZGlvQ29udGV4dD57XHJcbiAgLy9cclxuICAvLyAgICAgcmV0dXJuIG5ldyBQcm9taXNlPEF1ZGlvQ29udGV4dD4oKHJlc29sdmUscmVqZWN0KT0+e1xyXG4gIC8vICAgICAgIGxldCBhQ3R4PWF1ZGlvQ29udGV4dD9hdWRpb0NvbnRleHQ6QXVkaW9Db250ZXh0UHJvdmlkZXIuYXVkaW9Db250ZXh0SW5zdGFuY2UoKTtcclxuICAvLyAgICAgICBpZihhQ3R4KSB7XHJcbiAgLy8gICAgICAgICBpZihhQ3R4LnN0YXRlPT09J2Nsb3NlZCcpIHtcclxuICAvLyAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignQXVkaW8gY29udGV4dCBhbHJlYWR5IGNsb3NlZC4nKSk7XHJcbiAgLy8gICAgICAgICB9ZWxzZSBpZihhQ3R4LnN0YXRlPT09J3J1bm5pbmcnKSB7XHJcbiAgLy8gICAgICAgICAgIHJlc29sdmUoYUN0eCk7XHJcbiAgLy8gICAgICAgICB9ZWxzZXtcclxuICAvLyAgICAgICAgICAgYUN0eC5yZXN1bWUoKS50aGVuKCgpID0+IHtcclxuICAvLyAgICAgICAgICAgICBpZihhQ3R4KSB7XHJcbiAgLy8gICAgICAgICAgICAgICByZXNvbHZlKGFDdHgpO1xyXG4gIC8vICAgICAgICAgICAgIH1lbHNle1xyXG4gIC8vICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignQ291bGQgbm90IGdldCBhdWRpbyBjb250ZXh0JykpO1xyXG4gIC8vICAgICAgICAgICAgIH1cclxuICAvLyAgICAgICAgICAgfSkuY2F0Y2goKCkgPT4ge1xyXG4gIC8vICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0NvdWxkIG5vdCByZXN1bWUgYXVkaW8gY29udGV4dCcpKTtcclxuICAvLyAgICAgICAgICAgfSlcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9ZWxzZXtcclxuICAvLyAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0NvdWxkIG5vdCBnZXQgYXVkaW8gY29udGV4dCBmcm9tIGJyb3dzZXInKSk7XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgfSk7XHJcbiAgLy8gfVxyXG5cclxuICAvLyBwdWJsaWMgc3RhdGljIGRlY29kZUF1ZGlvRGF0YShkYXRhOkFycmF5QnVmZmVyLGF1ZGlvQ29udGV4dD86QXVkaW9Db250ZXh0KTpQcm9taXNlPEF1ZGlvQnVmZmVyPntcclxuICAvLyAgIHJldHVybiBuZXcgUHJvbWlzZTxBdWRpb0J1ZmZlcj4oKHJlc29sdmUscmVqZWN0KT0+e1xyXG4gIC8vICAgICAvLyBkZWNvZGVBdWRpb0RhdGEgcmVxdWlyZXMgYW4gYXVkaW8gY29udGV4dCBpbiBydW5uaW5nIHN0YXRlXHJcbiAgLy8gICAgIEF1ZGlvQ29udGV4dFByb3ZpZGVyLmF1ZGlvQ29udGV4dEluc3RhbmNlUnVubmluZyhhdWRpb0NvbnRleHQpLnRoZW4oXHJcbiAgLy8gICAgICAgKGFDdHgpPT57XHJcbiAgLy8gICAgICAgICAvLyBEbyBub3QgdXNlIFByb21pc2UgdmVyc2lvbiwgd2hpY2ggZG9lcyBub3Qgd29yayB3aXRoIFNhZmFyaSAxM1xyXG4gIC8vICAgICAgICAgYUN0eC5kZWNvZGVBdWRpb0RhdGEoZGF0YSxkZWNvZGVkRGF0YSA9PiB7XHJcbiAgLy8gICAgICAgICAgIHJlc29sdmUoZGVjb2RlZERhdGEpO1xyXG4gIC8vICAgICAgICAgfSwocmVhc29uKSA9PiB7XHJcbiAgLy8gICAgICAgICAgIHJlamVjdChyZWFzb24pO1xyXG4gIC8vICAgICAgICAgfSk7XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICApLmNhdGNoKChyZWFzb24pPT57XHJcbiAgLy8gICAgICAgcmVqZWN0KHJlYXNvbik7XHJcbiAgLy8gICAgIH0pXHJcbiAgLy8gICB9KVxyXG4gIC8vIH1cclxuXHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgZGVjb2RlQXVkaW9EYXRhKGRhdGE6QXJyYXlCdWZmZXIpOlByb21pc2U8QXVkaW9CdWZmZXI+e1xyXG4gICAgICByZXR1cm4gbmV3IFByb21pc2U8QXVkaW9CdWZmZXI+KChyZXNvbHZlLHJlamVjdCk9PntcclxuICAgICAgICBpZighdGhpcy5fb2ZmbGluZUF1ZGlvQ29udGV4dCkge1xyXG4gICAgICAgICAgICB0aGlzLl9vZmZsaW5lQXVkaW9Db250ZXh0ID0gbmV3IE9mZmxpbmVBdWRpb0NvbnRleHQoMSwgNDQxMDAsIDQ0MTAwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgICAvLyBEbyBub3QgdXNlIFByb21pc2UgdmVyc2lvbiwgd2hpY2ggZG9lcyBub3Qgd29yayB3aXRoIFNhZmFyaSAxM1xyXG4gICAgICAgICAgdGhpcy5fb2ZmbGluZUF1ZGlvQ29udGV4dC5kZWNvZGVBdWRpb0RhdGEoZGF0YSxkZWNvZGVkRGF0YSA9PiB7XHJcbiAgICAgICAgICAgIHJlc29sdmUoZGVjb2RlZERhdGEpO1xyXG4gICAgICAgICAgfSwocmVhc29uKSA9PiB7XHJcbiAgICAgICAgICAgIHJlamVjdChyZWFzb24pO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICApXHJcblxyXG4gIH1cclxuXHJcbn1cclxuIl19