speechrecorderng 3.0.0 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/esm2020/lib/action/action.mjs +2 -1
  2. package/esm2020/lib/audio/array_audio_buffer.mjs +65 -2
  3. package/esm2020/lib/audio/array_audio_buffer_input_stream.mjs +2 -2
  4. package/esm2020/lib/audio/array_audio_buffer_random_access_stream.mjs +16 -0
  5. package/esm2020/lib/audio/audio_data_holder.mjs +203 -48
  6. package/esm2020/lib/audio/audio_display.mjs +10 -34
  7. package/esm2020/lib/audio/audio_player.mjs +18 -45
  8. package/esm2020/lib/audio/capture/capture.mjs +293 -69
  9. package/esm2020/lib/audio/dsp/level_measure.mjs +211 -88
  10. package/esm2020/lib/audio/impl/wavformat.mjs +1 -1
  11. package/esm2020/lib/audio/impl/wavreader.mjs +134 -0
  12. package/esm2020/lib/audio/impl/wavwriter.mjs +10 -9
  13. package/esm2020/lib/audio/inddb_audio_buffer.mjs +508 -0
  14. package/esm2020/lib/audio/net_audio_buffer.mjs +297 -0
  15. package/esm2020/lib/audio/persistor.mjs +8 -2
  16. package/esm2020/lib/audio/playback/array_audio_buffer_source_node.mjs +15 -154
  17. package/esm2020/lib/audio/playback/audio_source_node.mjs +18 -0
  18. package/esm2020/lib/audio/playback/audio_source_worklet_module_loader.mjs +167 -0
  19. package/esm2020/lib/audio/playback/inddb_audio_buffer_source_node.mjs +167 -0
  20. package/esm2020/lib/audio/playback/net_audio_buffer_source_node.mjs +218 -0
  21. package/esm2020/lib/audio/playback/player.mjs +190 -171
  22. package/esm2020/lib/audio/ui/audio_canvas_layer_comp.mjs +35 -76
  23. package/esm2020/lib/audio/ui/audio_display_control.mjs +12 -24
  24. package/esm2020/lib/audio/ui/audio_display_scroll_pane.mjs +14 -45
  25. package/esm2020/lib/audio/ui/audiosignal.mjs +333 -267
  26. package/esm2020/lib/audio/ui/container.mjs +40 -57
  27. package/esm2020/lib/audio/ui/livelevel.mjs +53 -52
  28. package/esm2020/lib/audio/ui/scroll_pane_horizontal.mjs +5 -19
  29. package/esm2020/lib/audio/ui/sonagram.mjs +386 -339
  30. package/esm2020/lib/db/inddb.mjs +120 -0
  31. package/esm2020/lib/io/BinaryReader.mjs +85 -0
  32. package/esm2020/lib/io/stream.mjs +101 -1
  33. package/esm2020/lib/net/uploader.mjs +111 -5
  34. package/esm2020/lib/recorder_component.mjs +59 -1
  35. package/esm2020/lib/speechrecorder/project/project.mjs +10 -1
  36. package/esm2020/lib/speechrecorder/project/project.service.mjs +3 -3
  37. package/esm2020/lib/speechrecorder/recording.mjs +30 -6
  38. package/esm2020/lib/speechrecorder/recordings/basic_recording.service.mjs +213 -0
  39. package/esm2020/lib/speechrecorder/recordings/recordings.service.mjs +732 -65
  40. package/esm2020/lib/speechrecorder/script/script.service.mjs +3 -3
  41. package/esm2020/lib/speechrecorder/session/audiorecorder.mjs +358 -184
  42. package/esm2020/lib/speechrecorder/session/basicrecorder.mjs +181 -28
  43. package/esm2020/lib/speechrecorder/session/controlpanel.mjs +47 -129
  44. package/esm2020/lib/speechrecorder/session/item.mjs +13 -1
  45. package/esm2020/lib/speechrecorder/session/progress.mjs +26 -55
  46. package/esm2020/lib/speechrecorder/session/prompting.mjs +33 -176
  47. package/esm2020/lib/speechrecorder/session/recorder_combi_pane.mjs +6 -6
  48. package/esm2020/lib/speechrecorder/session/recording_file_cache.mjs +28 -15
  49. package/esm2020/lib/speechrecorder/session/recording_list.mjs +92 -55
  50. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +9 -13
  51. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs +9 -18
  52. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +10 -36
  53. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +10 -37
  54. package/esm2020/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +80 -56
  55. package/esm2020/lib/speechrecorder/session/session.service.mjs +3 -3
  56. package/esm2020/lib/speechrecorder/session/session_finished_dialog.mjs +4 -4
  57. package/esm2020/lib/speechrecorder/session/sessionmanager.mjs +409 -165
  58. package/esm2020/lib/speechrecorder/session/warning_bar.mjs +6 -29
  59. package/esm2020/lib/speechrecorder/spruploader.mjs +3 -3
  60. package/esm2020/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +6 -41
  61. package/esm2020/lib/speechrecorderng.component.mjs +42 -31
  62. package/esm2020/lib/speechrecorderng.module.mjs +5 -5
  63. package/esm2020/lib/spr.config.mjs +3 -3
  64. package/esm2020/lib/spr.module.version.mjs +2 -2
  65. package/esm2020/lib/ui/canvas_layer_comp.mjs +3 -3
  66. package/esm2020/lib/ui/message_dialog.mjs +7 -7
  67. package/esm2020/lib/ui/recordingitem_display.mjs +26 -59
  68. package/esm2020/lib/utils/scrollIntoViewToBottom.mjs +3 -3
  69. package/esm2020/lib/utils/ua-parser.mjs +28 -4
  70. package/esm2020/lib/utils/utils.mjs +29 -1
  71. package/fesm2015/speechrecorderng.mjs +12755 -9195
  72. package/fesm2015/speechrecorderng.mjs.map +1 -1
  73. package/fesm2020/speechrecorderng.mjs +12652 -9101
  74. package/fesm2020/speechrecorderng.mjs.map +1 -1
  75. package/{speechrecorderng.d.ts → index.d.ts} +0 -0
  76. package/lib/audio/array_audio_buffer.d.ts +17 -1
  77. package/lib/audio/array_audio_buffer_random_access_stream.d.ts +9 -0
  78. package/lib/audio/audio_data_holder.d.ts +69 -14
  79. package/lib/audio/audio_display.d.ts +1 -1
  80. package/lib/audio/audio_player.d.ts +3 -7
  81. package/lib/audio/capture/capture.d.ts +24 -4
  82. package/lib/audio/dsp/level_measure.d.ts +2 -23
  83. package/lib/audio/impl/wavformat.d.ts +3 -3
  84. package/lib/audio/impl/wavreader.d.ts +16 -0
  85. package/lib/audio/impl/wavwriter.d.ts +1 -4
  86. package/lib/audio/inddb_audio_buffer.d.ts +68 -0
  87. package/lib/audio/net_audio_buffer.d.ts +59 -0
  88. package/lib/audio/persistor.d.ts +3 -9
  89. package/lib/audio/playback/array_audio_buffer_source_node.d.ts +2 -8
  90. package/lib/audio/playback/audio_source_node.d.ts +10 -0
  91. package/lib/audio/playback/audio_source_worklet_module_loader.d.ts +4 -0
  92. package/lib/audio/playback/inddb_audio_buffer_source_node.d.ts +21 -0
  93. package/lib/audio/playback/net_audio_buffer_source_node.d.ts +27 -0
  94. package/lib/audio/playback/player.d.ts +19 -16
  95. package/lib/audio/ui/audio_canvas_layer_comp.d.ts +3 -3
  96. package/lib/audio/ui/audio_display_control.d.ts +3 -6
  97. package/lib/audio/ui/audio_display_scroll_pane.d.ts +1 -1
  98. package/lib/audio/ui/audiosignal.d.ts +4 -3
  99. package/lib/audio/ui/container.d.ts +1 -1
  100. package/lib/audio/ui/livelevel.d.ts +11 -4
  101. package/lib/audio/ui/scroll_pane_horizontal.d.ts +1 -1
  102. package/lib/audio/ui/sonagram.d.ts +4 -3
  103. package/lib/db/inddb.d.ts +21 -0
  104. package/lib/io/BinaryReader.d.ts +18 -0
  105. package/lib/io/stream.d.ts +18 -0
  106. package/lib/net/uploader.d.ts +20 -2
  107. package/lib/recorder_component.d.ts +5 -0
  108. package/lib/speechrecorder/project/project.d.ts +9 -0
  109. package/lib/speechrecorder/recording.d.ts +8 -2
  110. package/lib/speechrecorder/recordings/basic_recording.service.d.ts +27 -0
  111. package/lib/speechrecorder/recordings/recordings.service.d.ts +21 -6
  112. package/lib/speechrecorder/session/audiorecorder.d.ts +7 -18
  113. package/lib/speechrecorder/session/basicrecorder.d.ts +28 -4
  114. package/lib/speechrecorder/session/controlpanel.d.ts +7 -7
  115. package/lib/speechrecorder/session/item.d.ts +1 -0
  116. package/lib/speechrecorder/session/progress.d.ts +2 -1
  117. package/lib/speechrecorder/session/prompting.d.ts +5 -5
  118. package/lib/speechrecorder/session/recorder_combi_pane.d.ts +1 -1
  119. package/lib/speechrecorder/session/recording_file_cache.d.ts +7 -4
  120. package/lib/speechrecorder/session/recording_list.d.ts +2 -1
  121. package/lib/speechrecorder/session/recordingfile/recording-file-meta.component.d.ts +1 -1
  122. package/lib/speechrecorder/session/recordingfile/recording-file-navi.component.d.ts +1 -1
  123. package/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.d.ts +1 -1
  124. package/lib/speechrecorder/session/recordingfile/recording-file-view.component.d.ts +1 -1
  125. package/lib/speechrecorder/session/recordingfile/recordingfile-service.d.ts +4 -5
  126. package/lib/speechrecorder/session/session_finished_dialog.d.ts +1 -1
  127. package/lib/speechrecorder/session/sessionmanager.d.ts +10 -10
  128. package/lib/speechrecorder/session/warning_bar.d.ts +1 -1
  129. package/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.d.ts +1 -1
  130. package/lib/speechrecorderng.component.d.ts +2 -1
  131. package/lib/spr.module.version.d.ts +1 -1
  132. package/lib/ui/canvas_layer_comp.d.ts +1 -1
  133. package/lib/ui/message_dialog.d.ts +1 -1
  134. package/lib/ui/recordingitem_display.d.ts +3 -2
  135. package/lib/utils/scrollIntoViewToBottom.d.ts +1 -1
  136. package/lib/utils/ua-parser.d.ts +4 -1
  137. package/lib/utils/utils.d.ts +6 -0
  138. package/package.json +5 -4
  139. package/esm2020/lib/math/utils.mjs +0 -14
  140. package/esm2020/lib/utils/css_utils.mjs +0 -7
  141. package/lib/math/utils.d.ts +0 -3
  142. package/lib/utils/css_utils.d.ts +0 -3
@@ -0,0 +1,120 @@
1
+ import { Injectable } from "@angular/core";
2
+ import { Observable } from "rxjs";
3
+ import * as i0 from "@angular/core";
4
+ export class Sync {
5
+ constructor(objectStoreName, objectId) {
6
+ this._objectStoreName = objectStoreName;
7
+ this._objectId = objectId;
8
+ }
9
+ get objectStoreName() {
10
+ return this._objectStoreName;
11
+ }
12
+ get objectId() {
13
+ return this._objectId;
14
+ }
15
+ }
16
+ export class SprDb {
17
+ constructor() {
18
+ this._store = null;
19
+ }
20
+ static sprDbFactory() {
21
+ let sprDb = new SprDb();
22
+ return sprDb;
23
+ }
24
+ static prepare() {
25
+ let obs = new Observable((subscriber) => {
26
+ console.info("Prepare indexed database...");
27
+ if (indexedDB) {
28
+ let or;
29
+ or = indexedDB.open(SprDb.dbName, SprDb.dbVersion);
30
+ or.onupgradeneeded = (ev) => {
31
+ let db = or.result;
32
+ let tr = or.transaction;
33
+ // if (!db.objectStoreNames.contains(SprDb.RECORDING_FILE_CACHE_OBJECT_STORE_NAME)) {
34
+ // db.createObjectStore(SprDb.RECORDING_FILE_CACHE_OBJECT_STORE_NAME);
35
+ // }
36
+ // Future work towards a complete PWA which stores all clien data in indexed db and synchronizes to the server: See experimental Git branch "progressive_web_app"
37
+ // if (!db.objectStoreNames.contains('_sync')) {
38
+ // db.createObjectStore('_sync', {keyPath: 'id', autoIncrement:true});
39
+ // }
40
+ // if (!db.objectStoreNames.contains('project')) {
41
+ // db.createObjectStore('project', {keyPath: 'name'});
42
+ // }
43
+ // if (!db.objectStoreNames.contains('session')) {
44
+ // let sessStore=db.createObjectStore('session', {keyPath: 'sessionId'});
45
+ // sessStore.createIndex('projectIdx', ['project'], {unique:false});
46
+ // }else if(ev.oldVersion<5){
47
+ //
48
+ // let sessStore=tr.objectStore('session')
49
+ // sessStore.createIndex('projectIdx', ['project'], {unique:false});
50
+ // }
51
+ //
52
+ // if (!db.objectStoreNames.contains('script')) {
53
+ // let scrStore=db.createObjectStore('script', {keyPath: 'scriptId'});
54
+ // scrStore.createIndex('projectIdx', ['project'], {unique:false});
55
+ // }
56
+ //
57
+ // if (!db.objectStoreNames.contains('recfile')) {
58
+ // let rfStore=db.createObjectStore('recfile', {keyPath: 'uuid'});
59
+ // rfStore.createIndex('sessIdIdx', ['sessionId'], {unique:false});
60
+ // rfStore.createIndex('sessIdItemcodeIdx', ['sessionId','itemCode'], {unique:false});
61
+ // }
62
+ if (!db.objectStoreNames.contains(SprDb.RECORDING_FILE_CACHE_OBJECT_STORE_NAME)) {
63
+ let rfStore = db.createObjectStore(SprDb.RECORDING_FILE_CACHE_OBJECT_STORE_NAME);
64
+ }
65
+ if (ev.oldVersion) {
66
+ console.info("Upgraded indexed database " + SprDb.dbName + " schema from version " + ev.oldVersion + " to " + ev.newVersion);
67
+ }
68
+ else {
69
+ console.info("Created indexed database " + SprDb.dbName + " schema version " + ev.newVersion);
70
+ }
71
+ };
72
+ or.onsuccess = (ev) => {
73
+ console.info("Opened indexed database");
74
+ let db = or.result;
75
+ // // iPad WEbKit workaround
76
+ // does not help!
77
+ // db.onclose=(ev)=>{
78
+ // console.debug("DB closed...");
79
+ //
80
+ // }
81
+ // console.debug("Close db.");
82
+ // db.close();
83
+ // let opaRq=indexedDB.open(SprDb.dbName, SprDb.dbVersion);
84
+ // opaRq.onupgradeneeded=(ev)=>{}
85
+ //
86
+ // opaRq.onsuccess=(ev)=>{
87
+ // console.debug("and opened again");
88
+ // subscriber.next(opaRq.result);
89
+ // subscriber.complete();
90
+ // }
91
+ // opaRq.onerror = (err) => {
92
+ // console.error("Could not open indexed database: " + SprDb.dbName + ": " + err)
93
+ // subscriber.error(err)
94
+ // }
95
+ subscriber.next(db);
96
+ subscriber.complete();
97
+ };
98
+ or.onerror = (err) => {
99
+ console.error("Could not open indexed database: " + SprDb.dbName + ": " + err);
100
+ subscriber.error(err);
101
+ };
102
+ }
103
+ else {
104
+ console.info("Browser does not support indexed databases");
105
+ subscriber.error();
106
+ }
107
+ });
108
+ return obs;
109
+ }
110
+ }
111
+ SprDb.dbName = 'speechrecorder';
112
+ SprDb.RECORDING_FILE_CACHE_OBJECT_STORE_NAME = '_recording_file_cache';
113
+ //public static RECORDING_FILE_CHUNKS_OBJECT_STORE_NAME='rec_file_chunks';
114
+ SprDb.dbVersion = 1;
115
+ SprDb.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: SprDb, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
116
+ SprDb.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: SprDb });
117
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: SprDb, decorators: [{
118
+ type: Injectable
119
+ }], ctorParameters: function () { return []; } });
120
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZGIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvZGIvaW5kZGIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUl6QyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sTUFBTSxDQUFDOztBQUdoQyxNQUFNLE9BQU8sSUFBSTtJQUtiLFlBQVksZUFBc0IsRUFBQyxRQUFzQjtRQUNyRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUMsZUFBZSxDQUFBO1FBQ3JDLElBQUksQ0FBQyxTQUFTLEdBQUMsUUFBUSxDQUFBO0lBQzNCLENBQUM7SUFFRCxJQUFJLGVBQWU7UUFDaEIsT0FBUSxJQUFJLENBQUMsZ0JBQWdCLENBQUE7SUFDaEMsQ0FBQztJQUVELElBQUksUUFBUTtRQUNSLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQTtJQUN6QixDQUFDO0NBQ0o7QUFHRCxNQUFNLE9BQU8sS0FBSztJQVNkO1FBRFEsV0FBTSxHQUFrQixJQUFJLENBQUE7SUFFcEMsQ0FBQztJQUVELE1BQU0sQ0FBQyxZQUFZO1FBQ2hCLElBQUksS0FBSyxHQUFDLElBQUksS0FBSyxFQUFFLENBQUM7UUFFckIsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUlELE1BQU0sQ0FBQyxPQUFPO1FBQ1YsSUFBSSxHQUFHLEdBQUcsSUFBSSxVQUFVLENBQWMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtZQUU3QyxPQUFPLENBQUMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLENBQUE7WUFDM0MsSUFBSSxTQUFTLEVBQUU7Z0JBQ1gsSUFBSSxFQUFvQixDQUFDO2dCQUN6QixFQUFFLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDbkQsRUFBRSxDQUFDLGVBQWUs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QixDQUFBO0FBQzVFLDBFQUEwRTtBQUM3RCxlQUFTLEdBQUMsQ0FBRSxDQUFBO21HQU5qQixLQUFLO3VHQUFMLEtBQUs7NEZBQUwsS0FBSztrQkFEakIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtTZXNzaW9uRmluaXNoZWREaWFsb2d9IGZyb20gXCIuLi9zcGVlY2hyZWNvcmRlci9zZXNzaW9uL3Nlc3Npb25fZmluaXNoZWRfZGlhbG9nXCI7XHJcbmltcG9ydCB7U2Vzc2lvbn0gZnJvbSBcIi4uL3NwZWVjaHJlY29yZGVyL3Nlc3Npb24vc2Vzc2lvblwiO1xyXG5pbXBvcnQge1VVSUR9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xyXG5pbXBvcnQge09ic2VydmFibGV9IGZyb20gXCJyeGpzXCI7XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIFN5bmN7XHJcbiAgICBpZD86bnVtYmVyO1xyXG4gICAgX29iamVjdFN0b3JlTmFtZTpzdHJpbmc7XHJcbiAgICBfb2JqZWN0SWQ6c3RyaW5nfG51bWJlcjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihvYmplY3RTdG9yZU5hbWU6c3RyaW5nLG9iamVjdElkOnN0cmluZ3xudW1iZXIpe1xyXG4gICAgICAgIHRoaXMuX29iamVjdFN0b3JlTmFtZT1vYmplY3RTdG9yZU5hbWVcclxuICAgICAgICB0aGlzLl9vYmplY3RJZD1vYmplY3RJZFxyXG4gICAgfVxyXG5cclxuICAgIGdldCBvYmplY3RTdG9yZU5hbWUoKTpzdHJpbmd7XHJcbiAgICAgICByZXR1cm4gIHRoaXMuX29iamVjdFN0b3JlTmFtZVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBvYmplY3RJZCgpOnN0cmluZ3xudW1iZXJ7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX29iamVjdElkXHJcbiAgICB9XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFNwckRiIHtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGRiTmFtZT0nc3BlZWNocmVjb3JkZXInXHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBSRUNPUkRJTkdfRklMRV9DQUNIRV9PQkpFQ1RfU1RPUkVfTkFNRT0nX3JlY29yZGluZ19maWxlX2NhY2hlJztcclxuICAgICAvL3B1YmxpYyBzdGF0aWMgUkVDT1JESU5HX0ZJTEVfQ0hVTktTX09CSkVDVF9TVE9SRV9OQU1FPSdyZWNfZmlsZV9jaHVua3MnO1xyXG4gICAgcHVibGljIHN0YXRpYyBkYlZlcnNpb249MTtcclxuXHJcbiAgICBwcml2YXRlIF9zdG9yZTpJREJEYXRhYmFzZXxudWxsPW51bGxcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHNwckRiRmFjdG9yeSgpOlNwckRie1xyXG4gICAgICAgbGV0IHNwckRiPW5ldyBTcHJEYigpO1xyXG5cclxuICAgICAgICByZXR1cm4gc3ByRGI7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICBzdGF0aWMgcHJlcGFyZSgpOk9ic2VydmFibGU8SURCRGF0YWJhc2U+IHtcclxuICAgICAgICBsZXQgb2JzID0gbmV3IE9ic2VydmFibGU8SURCRGF0YWJhc2U+KChzdWJzY3JpYmVyKSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKFwiUHJlcGFyZSBpbmRleGVkIGRhdGFiYXNlLi4uXCIpXHJcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXhlZERCKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9yOiBJREJPcGVuREJSZXF1ZXN0O1xyXG4gICAgICAgICAgICAgICAgICAgIG9yID0gaW5kZXhlZERCLm9wZW4oU3ByRGIuZGJOYW1lLCBTcHJEYi5kYlZlcnNpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIG9yLm9udXBncmFkZW5lZWRlZCA9IChldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGIgPSBvci5yZXN1bHRcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRyPW9yLnRyYW5zYWN0aW9uXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAoIWRiLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoU3ByRGIuUkVDT1JESU5HX0ZJTEVfQ0FDSEVfT0JKRUNUX1NUT1JFX05BTUUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGRiLmNyZWF0ZU9iamVjdFN0b3JlKFNwckRiLlJFQ09SRElOR19GSUxFX0NBQ0hFX09CSkVDVF9TVE9SRV9OQU1FKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRnV0dXJlIHdvcmsgdG93YXJkcyBhIGNvbXBsZXRlIFBXQSB3aGljaCBzdG9yZXMgYWxsIGNsaWVuIGRhdGEgaW4gaW5kZXhlZCBkYiBhbmQgc3luY2hyb25pemVzIHRvIHRoZSBzZXJ2ZXI6IFNlZSBleHBlcmltZW50YWwgR2l0IGJyYW5jaCBcInByb2dyZXNzaXZlX3dlYl9hcHBcIlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKCFkYi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKCdfc3luYycpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBkYi5jcmVhdGVPYmplY3RTdG9yZSgnX3N5bmMnLCB7a2V5UGF0aDogJ2lkJywgYXV0b0luY3JlbWVudDp0cnVlfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKCFkYi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKCdwcm9qZWN0JykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGRiLmNyZWF0ZU9iamVjdFN0b3JlKCdwcm9qZWN0Jywge2tleVBhdGg6ICduYW1lJ30pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmICghZGIub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucygnc2Vzc2lvbicpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBsZXQgc2Vzc1N0b3JlPWRiLmNyZWF0ZU9iamVjdFN0b3JlKCdzZXNzaW9uJywge2tleVBhdGg6ICdzZXNzaW9uSWQnfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBzZXNzU3RvcmUuY3JlYXRlSW5kZXgoJ3Byb2plY3RJZHgnLCBbJ3Byb2plY3QnXSwge3VuaXF1ZTpmYWxzZX0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9ZWxzZSBpZihldi5vbGRWZXJzaW9uPDUpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgbGV0IHNlc3NTdG9yZT10ci5vYmplY3RTdG9yZSgnc2Vzc2lvbicpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHNlc3NTdG9yZS5jcmVhdGVJbmRleCgncHJvamVjdElkeCcsIFsncHJvamVjdCddLCB7dW5pcXVlOmZhbHNlfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKCFkYi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKCdzY3JpcHQnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgbGV0IHNjclN0b3JlPWRiLmNyZWF0ZU9iamVjdFN0b3JlKCdzY3JpcHQnLCB7a2V5UGF0aDogJ3NjcmlwdElkJ30pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgc2NyU3RvcmUuY3JlYXRlSW5kZXgoJ3Byb2plY3RJZHgnLCBbJ3Byb2plY3QnXSwge3VuaXF1ZTpmYWxzZX0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmICghZGIub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucygncmVjZmlsZScpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBsZXQgcmZTdG9yZT1kYi5jcmVhdGVPYmplY3RTdG9yZSgncmVjZmlsZScsIHtrZXlQYXRoOiAndXVpZCd9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHJmU3RvcmUuY3JlYXRlSW5kZXgoJ3Nlc3NJZElkeCcsIFsnc2Vzc2lvbklkJ10sIHt1bmlxdWU6ZmFsc2V9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHJmU3RvcmUuY3JlYXRlSW5kZXgoJ3Nlc3NJZEl0ZW1jb2RlSWR4JywgWydzZXNzaW9uSWQnLCdpdGVtQ29kZSddLCB7dW5pcXVlOmZhbHNlfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgICAgICAgIGlmICghZGIub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhTcHJEYi5SRUNPUkRJTkdfRklMRV9DQUNIRV9PQkpFQ1RfU1RPUkVfTkFNRSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZlN0b3JlPWRiLmNyZWF0ZU9iamVjdFN0b3JlKFNwckRiLlJFQ09SRElOR19GSUxFX0NBQ0hFX09CSkVDVF9TVE9SRV9OQU1FKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXYub2xkVmVyc2lvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKFwiVXBncmFkZWQgaW5kZXhlZCBkYXRhYmFzZSBcIiArIFNwckRiLmRiTmFtZSArIFwiIHNjaGVtYSBmcm9tIHZlcnNpb24gXCIgKyBldi5vbGRWZXJzaW9uICsgXCIgdG8gXCIgKyBldi5uZXdWZXJzaW9uKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKFwiQ3JlYXRlZCBpbmRleGVkIGRhdGFiYXNlIFwiICsgU3ByRGIuZGJOYW1lICsgXCIgc2NoZW1hIHZlcnNpb24gXCIgKyBldi5uZXdWZXJzaW9uKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIG9yLm9uc3VjY2VzcyA9IChldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oXCJPcGVuZWQgaW5kZXhlZCBkYXRhYmFzZVwiKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIGxldCBkYj1vci5yZXN1bHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgIC8vIGlQYWQgV0ViS2l0IHdvcmthcm91bmRcclxuICAgICAgICAgICAgICAgICAgICAgIC8vIGRvZXMgbm90IGhlbHAhXHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgIGRiLm9uY2xvc2U9KGV2KT0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGNvbnNvbGUuZGVidWcoXCJEQiBjbG9zZWQuLi5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAvL1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmRlYnVnKFwiQ2xvc2UgZGIuXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICBkYi5jbG9zZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbGV0IG9wYVJxPWluZGV4ZWREQi5vcGVuKFNwckRiLmRiTmFtZSwgU3ByRGIuZGJWZXJzaW9uKTtcclxuICAgICAgICAgICAgICAgICAgICAgIC8vIG9wYVJxLm9udXBncmFkZW5lZWRlZD0oZXYpPT57fVxyXG4gICAgICAgICAgICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgICAgICAgICAgIC8vIG9wYVJxLm9uc3VjY2Vzcz0oZXYpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgIGNvbnNvbGUuZGVidWcoXCJhbmQgb3BlbmVkIGFnYWluXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICBzdWJzY3JpYmVyLm5leHQob3BhUnEucmVzdWx0KTtcclxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gb3BhUnEub25lcnJvciA9IChlcnIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgY29uc29sZS5lcnJvcihcIkNvdWxkIG5vdCBvcGVuIGluZGV4ZWQgZGF0YWJhc2U6IFwiICsgU3ByRGIuZGJOYW1lICsgXCI6IFwiICsgZXJyKVxyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICBzdWJzY3JpYmVyLmVycm9yKGVycilcclxuICAgICAgICAgICAgICAgICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoZGIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgb3Iub25lcnJvciA9IChlcnIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkNvdWxkIG5vdCBvcGVuIGluZGV4ZWQgZGF0YWJhc2U6IFwiICsgU3ByRGIuZGJOYW1lICsgXCI6IFwiICsgZXJyKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGVycilcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhcIkJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBpbmRleGVkIGRhdGFiYXNlc1wiKVxyXG4gICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gb2JzO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
@@ -0,0 +1,85 @@
1
+ export class BinaryByteReader {
2
+ constructor(buf) {
3
+ this.buf = new Uint8Array(buf);
4
+ this.sbuf = new Int8Array(buf);
5
+ this._pos = 0;
6
+ }
7
+ get pos() {
8
+ return this._pos;
9
+ }
10
+ set pos(pos) {
11
+ this._pos = pos;
12
+ }
13
+ length() {
14
+ return this.buf.byteLength;
15
+ }
16
+ eof() {
17
+ return (this._pos >= this.buf.byteLength);
18
+ }
19
+ skip(byteCound) {
20
+ this.pos += 4;
21
+ }
22
+ readAscii(size) {
23
+ let i;
24
+ let txt = '';
25
+ for (i = 0; i < size; i++) {
26
+ txt += String.fromCharCode(this.buf[this._pos++]);
27
+ }
28
+ return txt;
29
+ }
30
+ readInt8() {
31
+ return (this.buf[this._pos++]);
32
+ }
33
+ readInt16BE() {
34
+ const b0 = this.sbuf[this._pos++];
35
+ const b1 = this.buf[this._pos++];
36
+ const val = (b0 << 8) | b1;
37
+ return val;
38
+ }
39
+ readInt16LE() {
40
+ const b0 = this.buf[this._pos++];
41
+ const b1 = this.sbuf[this._pos++];
42
+ const val = (b1 << 8) | b0;
43
+ return val;
44
+ }
45
+ readUint16LE() {
46
+ const seg = new Uint8Array(2);
47
+ let i;
48
+ for (i = 0; i < 2; i++) {
49
+ seg[i] = this.buf[this._pos++];
50
+ }
51
+ let val = 0;
52
+ val |= seg[1] << 8;
53
+ val |= seg[0];
54
+ return val;
55
+ }
56
+ readInt32BE() {
57
+ const seg = new Uint8Array(4);
58
+ let i;
59
+ for (i = 0; i < 4; i++) {
60
+ seg[i] = this.buf[this._pos++];
61
+ }
62
+ const val = seg[0] << 24 | seg[1] << 16 | seg[2] << 8 | seg[3];
63
+ return val;
64
+ }
65
+ readUint32LE() {
66
+ // this dircet data view does not work with nodejs: all avlues are zero
67
+ // var seg=new Uint8Array(this.buf,this._pos,4);
68
+ // ... copy value by value
69
+ const seg = new Uint8Array(4);
70
+ let i;
71
+ for (i = 0; i < 4; i++) {
72
+ seg[i] = this.buf[this._pos++];
73
+ }
74
+ // console.log("len:", seg.length, " ", seg.byteLength, " ", seg[0], " ", seg[1], " ", seg[2], " ", seg[3]);
75
+ let val = 0;
76
+ val |= seg[3] << 24;
77
+ val |= seg[2] << 16;
78
+ val |= seg[1] << 8;
79
+ val |= seg[0];
80
+ // var val = < 24(seg[3] <) | (seg[2] << 16) | (seg[1] << 8) | seg[0];
81
+ // this._pos=this._pos+4;
82
+ return val;
83
+ }
84
+ }
85
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmluYXJ5UmVhZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL2lvL0JpbmFyeVJlYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDSSxNQUFNLE9BQU8sZ0JBQWdCO0lBS3pCLFlBQVksR0FBZ0I7UUFDeEIsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLENBQUM7SUFFRCxJQUFJLEdBQUc7UUFDSCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDckIsQ0FBQztJQUVELElBQUksR0FBRyxDQUFDLEdBQVc7UUFDZixJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztJQUNwQixDQUFDO0lBRUQsTUFBTTtRQUNGLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUM7SUFDL0IsQ0FBQztJQUVELEdBQUc7UUFDQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxJQUFJLENBQUMsU0FBaUI7UUFDbEIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDbEIsQ0FBQztJQUVELFNBQVMsQ0FBQyxJQUFZO1FBQ2xCLElBQUksQ0FBQyxDQUFDO1FBQ04sSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2IsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDdkIsR0FBRyxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJ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RSxDQUFDO1FBQ3BCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3BCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25CLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDZCxzRUFBc0U7UUFDdEUseUJBQXlCO1FBQ3pCLE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQztDQUdKIiwic291cmNlc0NvbnRlbnQiOlsiXG4gICAgZXhwb3J0IGNsYXNzIEJpbmFyeUJ5dGVSZWFkZXIge1xuICAgICAgICBidWY6IFVpbnQ4QXJyYXk7XG4gICAgICAgIHNidWY6IEludDhBcnJheTtcbiAgICAgICAgcHJpdmF0ZSBfcG9zOiBudW1iZXI7XG5cbiAgICAgICAgY29uc3RydWN0b3IoYnVmOiBBcnJheUJ1ZmZlcikge1xuICAgICAgICAgICAgdGhpcy5idWYgPSBuZXcgVWludDhBcnJheShidWYpO1xuICAgICAgICAgICAgdGhpcy5zYnVmID0gbmV3IEludDhBcnJheShidWYpO1xuICAgICAgICAgICAgdGhpcy5fcG9zID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGdldCBwb3MoKTogbnVtYmVyIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wb3M7XG4gICAgICAgIH1cblxuICAgICAgICBzZXQgcG9zKHBvczogbnVtYmVyKSB7XG4gICAgICAgICAgICB0aGlzLl9wb3MgPSBwb3M7XG4gICAgICAgIH1cblxuICAgICAgICBsZW5ndGgoKTogbnVtYmVyIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJ1Zi5ieXRlTGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgZW9mKCk6IGJvb2xlYW4ge1xuICAgICAgICAgICAgcmV0dXJuICh0aGlzLl9wb3MgPj0gdGhpcy5idWYuYnl0ZUxlbmd0aCk7XG4gICAgICAgIH1cblxuICAgICAgICBza2lwKGJ5dGVDb3VuZDogbnVtYmVyKXtcbiAgICAgICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgICAgIH1cblxuICAgICAgICByZWFkQXNjaWkoc2l6ZTogbnVtYmVyKTogU3RyaW5nIHtcbiAgICAgICAgICAgIGxldCBpO1xuICAgICAgICAgICAgbGV0IHR4dCA9ICcnO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICAgICAgICAgIHR4dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHRoaXMuYnVmW3RoaXMuX3BvcysrXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHh0O1xuICAgICAgICB9XG5cbiAgICAgICAgcmVhZEludDgoKTogbnVtYmVyIHtcbiAgICAgICAgICAgIHJldHVybiAodGhpcy5idWZbdGhpcy5fcG9zKytdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlYWRJbnQxNkJFKCk6IG51bWJlciB7XG4gICAgICAgICAgICBjb25zdCBiMCA9IHRoaXMuc2J1Zlt0aGlzLl9wb3MrK107XG4gICAgICAgICAgICBjb25zdCBiMSA9IHRoaXMuYnVmW3RoaXMuX3BvcysrXTtcbiAgICAgICAgICAgIGNvbnN0IHZhbCA9ICggYjAgPDwgOCApIHwgYjE7XG4gICAgICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgICB9XG4gICAgICAgIHJlYWRJbnQxNkxFKCk6IG51bWJlciB7XG4gICAgICAgICAgICBjb25zdCBiMCA9IHRoaXMuYnVmW3RoaXMuX3BvcysrXTtcbiAgICAgICAgICAgIGNvbnN0IGIxID0gdGhpcy5zYnVmW3RoaXMuX3BvcysrXTtcbiAgICAgICAgICAgIGNvbnN0IHZhbCA9ICggYjEgPDwgOCApIHwgYjA7XG4gICAgICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgICB9XG4gICAgICAgIHJlYWRVaW50MTZMRSgpOiBudW1iZXIge1xuICAgICAgICAgICAgY29uc3Qgc2VnID0gbmV3IFVpbnQ4QXJyYXkoMik7XG4gICAgICAgICAgICBsZXQgaTogbnVtYmVyO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykge1xuICAgICAgICAgICAgICAgIHNlZ1tpXSA9IHRoaXMuYnVmW3RoaXMuX3BvcysrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB2YWwgPSAwO1xuICAgICAgICAgICAgdmFsIHw9IHNlZ1sxXSA8PCA4O1xuICAgICAgICAgICAgdmFsIHw9IHNlZ1swXTtcbiAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgIH1cblxuICAgICAgICByZWFkSW50MzJCRSgpOiBudW1iZXIge1xuICAgICAgICAgICAgY29uc3Qgc2VnID0gbmV3IFVpbnQ4QXJyYXkoNCk7XG4gICAgICAgICAgICBsZXQgaTogbnVtYmVyO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgICAgICAgICAgICAgIHNlZ1tpXSA9IHRoaXMuYnVmW3RoaXMuX3BvcysrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHZhbCA9IHNlZ1swXSA8PCAyNCB8IHNlZ1sxXSA8PCAxNiB8IHNlZ1syXSA8PCA4IHwgc2VnWzNdO1xuICAgICAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlYWRVaW50MzJMRSgpOiBudW1iZXIge1xuICAgICAgICAgICAgIC8vIHRoaXMgZGlyY2V0IGRhdGEgdmlldyBkb2VzIG5vdCB3b3JrIHdpdGggbm9kZWpzOiBhbGwgYXZsdWVzIGFyZSB6ZXJvXG4gICAgICAgICAgICAvLyB2YXIgc2VnPW5ldyBVaW50OEFycmF5KHRoaXMuYnVmLHRoaXMuX3Bvcyw0KTtcbiAgICAgICAgICAgIC8vIC4uLiBjb3B5IHZhbHVlIGJ5IHZhbHVlXG4gICAgICAgICAgICBjb25zdCBzZWcgPSBuZXcgVWludDhBcnJheSg0KTtcbiAgICAgICAgICAgIGxldCBpOiBudW1iZXI7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgc2VnW2ldID0gdGhpcy5idWZbdGhpcy5fcG9zKytdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJsZW46XCIsIHNlZy5sZW5ndGgsIFwiIFwiLCBzZWcuYnl0ZUxlbmd0aCwgXCIgXCIsIHNlZ1swXSwgXCIgXCIsIHNlZ1sxXSwgXCIgXCIsIHNlZ1syXSwgXCIgXCIsIHNlZ1szXSk7XG4gICAgICAgICAgICBsZXQgdmFsID0gMDtcbiAgICAgICAgICAgIHZhbCB8PSBzZWdbM10gPDwgMjQ7XG4gICAgICAgICAgICB2YWwgfD0gc2VnWzJdIDw8IDE2O1xuICAgICAgICAgICAgdmFsIHw9IHNlZ1sxXSA8PCA4O1xuICAgICAgICAgICAgdmFsIHw9IHNlZ1swXTtcbiAgICAgICAgICAgIC8vIHZhciB2YWwgPSA8IDI0KHNlZ1szXSA8KSB8IChzZWdbMl0gPDwgMTYpIHwgKHNlZ1sxXSA8PCA4KSB8IHNlZ1swXTtcbiAgICAgICAgICAgIC8vIHRoaXMuX3Bvcz10aGlzLl9wb3MrNDtcbiAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgIH1cblxuXG4gICAgfVxuIl19
@@ -1,3 +1,4 @@
1
+ import { Observable } from "rxjs";
1
2
  export class EditFloat32ArrayInputStream {
2
3
  constructor(_srcInputStream, offset = 0, length) {
3
4
  this._srcInputStream = _srcInputStream;
@@ -74,6 +75,105 @@ export class EditFloat32ArrayInputStream {
74
75
  this._srcInputStream.close();
75
76
  }
76
77
  }
78
+ export class AsyncEditFloat32ArrayInputStream {
79
+ constructor(_srcInputStream, offset = 0, length) {
80
+ this._srcInputStream = _srcInputStream;
81
+ this.offset = offset;
82
+ this.length = length;
83
+ this.framePos = 0;
84
+ this.readFrames = 0;
85
+ if (this.offset < 0) {
86
+ throw Error('Parameter offset must be undefined or greater or equal zero.');
87
+ }
88
+ if (this.length !== undefined && this.length < 0) {
89
+ throw Error('Parameter length must be undefined or greater or equal zero.');
90
+ }
91
+ }
92
+ skipToOffset() {
93
+ if (this.framePos == 0 && this.offset > 0) {
94
+ this._srcInputStream.skipFrames(this.offset);
95
+ this.framePos += this.offset;
96
+ }
97
+ }
98
+ readObs(buffers) {
99
+ return new Observable(subscriber => {
100
+ this.skipToOffset();
101
+ if (this.length === undefined) {
102
+ this._srcInputStream.readObs(buffers).subscribe(subscriber);
103
+ }
104
+ else {
105
+ if (buffers.length > 0) {
106
+ let bufsCh0 = buffers[0];
107
+ let bufsLen = bufsCh0.length;
108
+ let avail = this.length - this.readFrames;
109
+ if (avail > 0) {
110
+ if (avail > bufsLen) {
111
+ this._srcInputStream.readObs(buffers).subscribe({
112
+ next: (read) => {
113
+ this.readFrames += read;
114
+ this.framePos += read;
115
+ subscriber.next(read);
116
+ }, complete: () => {
117
+ subscriber.complete();
118
+ }
119
+ });
120
+ }
121
+ else {
122
+ // temporary buffers required
123
+ let tmpBufs = new Array(buffers.length);
124
+ for (let ch = 0; ch < buffers.length; ch++) {
125
+ tmpBufs[ch] = new Float32Array(avail);
126
+ }
127
+ this._srcInputStream.readObs(tmpBufs).subscribe({
128
+ next: (read) => {
129
+ for (let ch = 0; ch < buffers.length; ch++) {
130
+ buffers[ch].set(tmpBufs[ch]);
131
+ }
132
+ this.readFrames += read;
133
+ this.framePos += read;
134
+ subscriber.next(read);
135
+ }, complete: () => {
136
+ subscriber.complete();
137
+ }
138
+ });
139
+ }
140
+ }
141
+ else {
142
+ // end of stream
143
+ subscriber.next(0);
144
+ subscriber.complete();
145
+ }
146
+ }
147
+ else {
148
+ subscriber.next(0);
149
+ subscriber.complete();
150
+ }
151
+ }
152
+ });
153
+ }
154
+ skipFrames(n) {
155
+ this.skipToOffset();
156
+ if (this.length === undefined) {
157
+ this._srcInputStream.skipFrames(n);
158
+ }
159
+ else {
160
+ let avail = this.length - this.readFrames;
161
+ if (avail > 0) {
162
+ if (avail >= n) {
163
+ this._srcInputStream.skipFrames(n);
164
+ this.readFrames += n;
165
+ this.framePos += n;
166
+ }
167
+ else {
168
+ throw Error('Tried to skip out of bounds.');
169
+ }
170
+ }
171
+ }
172
+ }
173
+ close() {
174
+ this._srcInputStream.close();
175
+ }
176
+ }
77
177
  export class Float32ArrayChunkerOutStream {
78
178
  constructor(outStream) {
79
179
  this.outStream = outStream;
@@ -156,4 +256,4 @@ export class Float32ArrayChunkerOutStream {
156
256
  this.outStream.close();
157
257
  }
158
258
  }
159
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWFtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL2lvL3N0cmVhbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFNQSxNQUFNLE9BQU8sMkJBQTJCO0lBR3RDLFlBQW9CLGVBQXVDLEVBQVMsU0FBYyxDQUFDLEVBQVMsTUFBd0I7UUFBaEcsb0JBQWUsR0FBZixlQUFlLENBQXdCO1FBQVMsV0FBTSxHQUFOLE1BQU0sQ0FBUztRQUFTLFdBQU0sR0FBTixNQUFNLENBQWtCO1FBRjVHLGFBQVEsR0FBQyxDQUFDLENBQUM7UUFDWCxlQUFVLEdBQUMsQ0FBQyxDQUFDO1FBRW5CLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBQyxDQUFDLEVBQUM7WUFDZCxNQUFNLEtBQUssQ0FBQyw4REFBOEQsQ0FBQyxDQUFDO1NBQy9FO1FBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFHLFNBQVMsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFDLENBQUMsRUFBQztZQUMzQyxNQUFNLEtBQUssQ0FBQyw4REFBOEQsQ0FBQyxDQUFDO1NBQzdFO0lBQ0gsQ0FBQztJQUVPLFlBQVk7UUFDbEIsSUFBRyxJQUFJLENBQUMsUUFBUSxJQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFDLENBQUMsRUFBQztZQUNuQyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDN0MsSUFBSSxDQUFDLFFBQVEsSUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDO1NBQzVCO0lBQ0gsQ0FBQztJQUVELElBQUksQ0FBQyxPQUE0QjtRQUMvQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEIsSUFBSSxJQUFJLEdBQUMsQ0FBQyxDQUFDO1FBQ1gsSUFBRyxJQUFJLENBQUMsTUFBTSxLQUFHLFNBQVMsRUFBQztZQUN6QixJQUFJLEdBQUcsSUFBSSxD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ZSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDdkQsS0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxFQUFFLEVBQUU7Z0JBQzFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ3BEO1lBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDL0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDL0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7U0FDakI7SUFDSCxDQUFDO0lBR0QsS0FBSztRQUNILElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDekIsQ0FBQztDQUdGIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBGbG9hdDMyQXJyYXlJbnB1dFN0cmVhbXtcclxuICByZWFkKGJ1ZmZlcnM6IEFycmF5PEZsb2F0MzJBcnJheT4pOiBudW1iZXI7XHJcbiAgc2tpcEZyYW1lcyhuOm51bWJlcik6dm9pZDtcclxuICBjbG9zZSgpOnZvaWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBFZGl0RmxvYXQzMkFycmF5SW5wdXRTdHJlYW0gaW1wbGVtZW50cyBGbG9hdDMyQXJyYXlJbnB1dFN0cmVhbXtcclxuICBwcml2YXRlIGZyYW1lUG9zPTA7XHJcbiAgcHJpdmF0ZSByZWFkRnJhbWVzPTA7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfc3JjSW5wdXRTdHJlYW06RmxvYXQzMkFycmF5SW5wdXRTdHJlYW0scHJpdmF0ZSBvZmZzZXQ6bnVtYmVyPTAscHJpdmF0ZSBsZW5ndGg/Om51bWJlcnx1bmRlZmluZWQpIHtcclxuICAgIGlmICh0aGlzLm9mZnNldDwwKXtcclxuICAgICAgICB0aHJvdyBFcnJvcignUGFyYW1ldGVyIG9mZnNldCBtdXN0IGJlIHVuZGVmaW5lZCBvciBncmVhdGVyIG9yIGVxdWFsIHplcm8uJyk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5sZW5ndGghPT11bmRlZmluZWQgJiYgdGhpcy5sZW5ndGg8MCl7XHJcbiAgICAgIHRocm93IEVycm9yKCdQYXJhbWV0ZXIgbGVuZ3RoIG11c3QgYmUgdW5kZWZpbmVkIG9yIGdyZWF0ZXIgb3IgZXF1YWwgemVyby4nKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2tpcFRvT2Zmc2V0KCl7XHJcbiAgICBpZih0aGlzLmZyYW1lUG9zPT0wICYmIHRoaXMub2Zmc2V0PjApe1xyXG4gICAgICB0aGlzLl9zcmNJbnB1dFN0cmVhbS5za2lwRnJhbWVzKHRoaXMub2Zmc2V0KTtcclxuICAgICAgdGhpcy5mcmFtZVBvcys9dGhpcy5vZmZzZXQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZWFkKGJ1ZmZlcnM6IEFycmF5PEZsb2F0MzJBcnJheT4pOiBudW1iZXJ7XHJcbiAgICB0aGlzLnNraXBUb09mZnNldCgpO1xyXG4gICAgbGV0IHJlYWQ9MDtcclxuICAgIGlmKHRoaXMubGVuZ3RoPT09dW5kZWZpbmVkKXtcclxuICAgICAgcmVhZCA9IHRoaXMuX3NyY0lucHV0U3RyZWFtLnJlYWQoYnVmZmVycyk7XHJcbiAgICB9ZWxzZSB7XHJcbiAgICAgIGlmIChidWZmZXJzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBsZXQgYnVmc0NoMCA9IGJ1ZmZlcnNbMF07XHJcbiAgICAgICAgbGV0IGJ1ZnNMZW4gPSBidWZzQ2gwLmxlbmd0aDtcclxuICAgICAgICBsZXQgYXZhaWwgPSB0aGlzLmxlbmd0aCAtIHRoaXMucmVhZEZyYW1lcztcclxuICAgICAgICBpZiAoYXZhaWwgPiAwKSB7XHJcbiAgICAgICAgICBpZiAoYXZhaWwgPiBidWZzTGVuKSB7XHJcbiAgICAgICAgICAgIHJlYWQgPSB0aGlzLl9zcmNJbnB1dFN0cmVhbS5yZWFkKGJ1ZmZlcnMpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gdGVtcG9yYXJ5IGJ1ZmZlcnMgcmVxdWlyZWRcclxuICAgICAgICAgICAgbGV0IHRtcEJ1ZnMgPSBuZXcgQXJyYXk8RmxvYXQzMkFycmF5PihidWZmZXJzLmxlbmd0aCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBidWZmZXJzLmxlbmd0aDsgY2grKykge1xyXG4gICAgICAgICAgICAgIHRtcEJ1ZnNbY2hdID0gbmV3IEZsb2F0MzJBcnJheShhdmFpbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVhZCA9IHRoaXMuX3NyY0lucHV0U3RyZWFtLnJlYWQodG1wQnVmcyk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBidWZmZXJzLmxlbmd0aDsgY2grKykge1xyXG4gICAgICAgICAgICAgIGJ1ZmZlcnNbY2hdLnNldCh0bXBCdWZzW2NoXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMucmVhZEZyYW1lcys9cmVhZDtcclxuICAgIHRoaXMuZnJhbWVQb3MrPXJlYWQ7XHJcbiAgICByZXR1cm4gcmVhZDtcclxuICB9XHJcblxyXG4gIHNraXBGcmFtZXMobjpudW1iZXIpOnZvaWR7XHJcbiAgICB0aGlzLnNraXBUb09mZnNldCgpO1xyXG4gICAgaWYodGhpcy5sZW5ndGg9PT11bmRlZmluZWQpe1xyXG4gICAgICB0aGlzLl9zcmNJbnB1dFN0cmVhbS5za2lwRnJhbWVzKG4pO1xyXG4gICAgfWVsc2Uge1xyXG4gICAgICBsZXQgYXZhaWwgPSB0aGlzLmxlbmd0aCAtIHRoaXMucmVhZEZyYW1lcztcclxuICAgICAgaWYgKGF2YWlsID4gMCkge1xyXG4gICAgICAgIGlmIChhdmFpbCA+PSBuKSB7XHJcbiAgICAgICAgICB0aGlzLl9zcmNJbnB1dFN0cmVhbS5za2lwRnJhbWVzKG4pO1xyXG4gICAgICAgICAgdGhpcy5yZWFkRnJhbWVzICs9IG47XHJcbiAgICAgICAgICB0aGlzLmZyYW1lUG9zICs9IG47XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRocm93IEVycm9yKCdUcmllZCB0byBza2lwIG91dCBvZiBib3VuZHMuJylcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsb3NlKCk6dm9pZHtcclxuICAgIHRoaXMuX3NyY0lucHV0U3RyZWFtLmNsb3NlKCk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEZsb2F0MzJBcnJheU91dFN0cmVhbSB7XHJcblxyXG4gIHdyaXRlKGJ1ZmZlcnM6IEFycmF5PEZsb2F0MzJBcnJheT4pOiBudW1iZXI7XHJcblxyXG4gIGZsdXNoKCk6IHZvaWQ7XHJcblxyXG4gIGNsb3NlKCk6IHZvaWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBGbG9hdDMyQXJyYXlDaHVua2VyT3V0U3RyZWFtIGltcGxlbWVudHMgRmxvYXQzMkFycmF5T3V0U3RyZWFtIHtcclxuXHJcbiAgcHJpdmF0ZSBidWZzID0gbmV3IEFycmF5PEZsb2F0MzJBcnJheT4oKTtcclxuICBwcml2YXRlIGZpbGxlZDogbnVtYmVyO1xyXG5cclxuICBwcml2YXRlIF9jaGFubmVsczogbnVtYmVyPTA7XHJcbiAgcHJpdmF0ZSBfY2h1bmtTaXplOiBudW1iZXI9MDtcclxuXHJcbiAgcHJpdmF0ZSByZWNlaXZlZEZyYW1lczogbnVtYmVyO1xyXG4gIHByaXZhdGUgc2VudEZyYW1lczogbnVtYmVyO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG91dFN0cmVhbTogRmxvYXQzMkFycmF5T3V0U3RyZWFtKSB7XHJcbiAgICB0aGlzLmZpbGxlZCA9IDA7XHJcbiAgICB0aGlzLnJlY2VpdmVkRnJhbWVzID0gMDtcclxuICAgIHRoaXMuc2VudEZyYW1lcyA9IDA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZUJ1ZmZlcnMoKSB7XHJcbiAgICB0aGlzLmJ1ZnMgPSBuZXcgQXJyYXk8RmxvYXQzMkFycmF5Pih0aGlzLl9jaGFubmVscyk7XHJcbiAgICBmb3IgKGxldCBjaCA9IDA7IGNoIDwgdGhpcy5fY2hhbm5lbHM7IGNoKyspIHtcclxuICAgICAgdGhpcy5idWZzW2NoXSA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5fY2h1bmtTaXplKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldCBjaHVua1NpemUoY2h1bmtTaXplOiBudW1iZXIpIHtcclxuICAgIHRoaXMuX2NodW5rU2l6ZSA9IGNodW5rU2l6ZTtcclxuICAgIHRoaXMuY3JlYXRlQnVmZmVycygpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNodW5rU2l6ZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NodW5rU2l6ZTtcclxuICB9XHJcblxyXG4gIHNldCBjaGFubmVscyhjaGFubmVsczogbnVtYmVyKSB7XHJcbiAgICB0aGlzLl9jaGFubmVscyA9IGNoYW5uZWxzO1xyXG4gICAgdGhpcy5jcmVhdGVCdWZmZXJzKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgY2hhbm5lbHMoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jaGFubmVscztcclxuICB9XHJcblxyXG5cclxuICBhdmFpbGFibGUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jaHVua1NpemUtdGhpcy5maWxsZWQ7XHJcbiAgfVxyXG5cclxuICB3cml0ZShidWZmZXJzOiBBcnJheTxGbG9hdDMyQXJyYXk+KTogbnVtYmVyIHtcclxuXHJcbiAgICBsZXQgY29waWVkID0gMDtcclxuICAgIGlmKGJ1ZmZlcnMubGVuZ3RoPjApIHtcclxuICAgICAgbGV0IGJ1ZmZlcnNMZW4gPSBidWZmZXJzWzBdLmxlbmd0aDtcclxuICAgICAgdGhpcy5yZWNlaXZlZEZyYW1lcyArPSBidWZmZXJzTGVuO1xyXG4gICAgICBsZXQgYXZhaWwgPSBidWZmZXJzTGVuO1xyXG4gICAgICAvLyBGaWxsIG91dCBidWZmZXJzIHVudGlsIGFsbCB2YWx1ZXMgY29waWVkXHJcblxyXG4gICAgICB3aGlsZSAoYXZhaWwgPiAwKSB7XHJcbiAgICAgICAgbGV0IHRvRmlsbCA9IHRoaXMuX2NodW5rU2l6ZSAtIHRoaXMuZmlsbGVkO1xyXG4gICAgICAgIGlmICh0b0ZpbGwgPiBhdmFpbCkge1xyXG4gICAgICAgICAgdG9GaWxsID0gYXZhaWw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBzbGljZUVuZCA9IGNvcGllZCArIHRvRmlsbDtcclxuXHJcbiAgICAgICAgLy8gRmlyZWZveCBvbiBBbmRyb2lkIHNlbmRzIG9ubHkgdGhlIGZpcnN0IGNoYW5uZWxcclxuICAgICAgICBmb3IgKGxldCBjaCA9IDA7IGNoIDwgYnVmZmVyc0xlbjsgY2grKykge1xyXG4gICAgICAgICAgaWYoYnVmZmVyc1tjaF0pIHtcclxuICAgICAgICAgICAgbGV0IGNwUHJ0ID0gYnVmZmVyc1tjaF0uc2xpY2UoY29waWVkLCBzbGljZUVuZCk7XHJcbiAgICAgICAgICAgIGxldCBidWYgPSB0aGlzLmJ1ZnNbY2hdO1xyXG4gICAgICAgICAgICBidWYuc2V0KGNwUHJ0LCB0aGlzLmZpbGxlZCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvcGllZCArPSB0b0ZpbGw7XHJcbiAgICAgICAgYXZhaWwgLT0gdG9GaWxsO1xyXG4gICAgICAgIHRoaXMuZmlsbGVkICs9IHRvRmlsbDtcclxuICAgICAgICBpZiAodGhpcy5maWxsZWQgPT0gdGhpcy5fY2h1bmtTaXplKSB7XHJcbiAgICAgICAgICB0aGlzLm91dFN0cmVhbS53cml0ZSh0aGlzLmJ1ZnMpO1xyXG4gICAgICAgICAgdGhpcy5zZW50RnJhbWVzICs9IHRoaXMuZmlsbGVkO1xyXG4gICAgICAgICAgdGhpcy5maWxsZWQgPSAwO1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjb3BpZWQ7XHJcbiAgfVxyXG5cclxuICBmbHVzaCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmZpbGxlZCA+IDApIHtcclxuICAgICAgbGV0IHJlc3RCdWZzID0gbmV3IEFycmF5PEZsb2F0MzJBcnJheT4odGhpcy5fY2hhbm5lbHMpO1xyXG4gICAgICBmb3IgKGxldCBjaCA9IDA7IGNoIDwgdGhpcy5fY2hhbm5lbHM7IGNoKyspIHtcclxuICAgICAgICByZXN0QnVmc1tjaF0gPSB0aGlzLmJ1ZnNbY2hdLnNsaWNlKDAsIHRoaXMuZmlsbGVkKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLm91dFN0cmVhbS53cml0ZShyZXN0QnVmcyk7XHJcbiAgICAgIHRoaXMub3V0U3RyZWFtLmZsdXNoKCk7XHJcbiAgICAgIHRoaXMuc2VudEZyYW1lcyArPSB0aGlzLmZpbGxlZDtcclxuICAgICAgdGhpcy5maWxsZWQgPSAwO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIGNsb3NlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5vdXRTdHJlYW0uY2xvc2UoKTtcclxuICB9XHJcblxyXG5cclxufVxyXG4iXX0=
259
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWFtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL2lvL3N0cmVhbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBY2hDLE1BQU0sT0FBTywyQkFBMkI7SUFHdEMsWUFBb0IsZUFBdUMsRUFBUyxTQUFjLENBQUMsRUFBUyxNQUF3QjtRQUFoRyxvQkFBZSxHQUFmLGVBQWUsQ0FBd0I7UUFBUyxXQUFNLEdBQU4sTUFBTSxDQUFTO1FBQVMsV0FBTSxHQUFOLE1BQU0sQ0FBa0I7UUFGNUcsYUFBUSxHQUFDLENBQUMsQ0FBQztRQUNYLGVBQVUsR0FBQyxDQUFDLENBQUM7UUFFbkIsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFDLENBQUMsRUFBQztZQUNkLE1BQU0sS0FBSyxDQUFDLDhEQUE4RCxDQUFDLENBQUM7U0FDL0U7UUFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUcsU0FBUyxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUMsQ0FBQyxFQUFDO1lBQzNDLE1BQU0sS0FBSyxDQUFDLDhEQUE4RCxDQUFDLENBQUM7U0FDN0U7SUFDSCxDQUFDO0lBRU8sWUFBWTtRQUNsQixJQUFHLElBQUksQ0FBQyxRQUFRLElBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUMsQ0FBQyxFQUFDO1lBQ25DLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM3QyxJQUFJLENBQUMsUUFBUSxJQUFFLElBQUksQ0FBQyxNQUFNLENBQUM7U0FDNUI7SUFDSCxDQUFDO0lBRUQsSUFBSSxDQUFDLE9BQTRCO1FBQy9CLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixJQUFJLElBQUksR0FBQyxDQUFDLENBQUM7UUFDWCxJQUFHLElBQUksQ0FBQyxN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QUksQ0FBQyxDQUFDO29CQUNoQyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUM7b0JBQy9CLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2lCQUVqQjthQUNGO1NBQ0Y7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsS0FBSztRQUNILElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDbkIsSUFBSSxRQUFRLEdBQUcsSUFBSSxLQUFLLENBQWUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3ZELEtBQUssSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsRUFBRSxFQUFFO2dCQUMxQyxRQUFRLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUNwRDtZQUNELElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQy9CLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1NBQ2pCO0lBQ0gsQ0FBQztJQUdELEtBQUs7UUFDSCxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3pCLENBQUM7Q0FHRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSBcInJ4anNcIjtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRmxvYXQzMkFycmF5SW5wdXRTdHJlYW17XHJcbiAgcmVhZChidWZmZXJzOiBBcnJheTxGbG9hdDMyQXJyYXk+KTogbnVtYmVyO1xyXG4gIHNraXBGcmFtZXMobjpudW1iZXIpOnZvaWQ7XHJcbiAgY2xvc2UoKTp2b2lkO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEFzeW5jRmxvYXQzMkFycmF5SW5wdXRTdHJlYW17XHJcbiAgcmVhZE9icyhidWZmZXJzOiBBcnJheTxGbG9hdDMyQXJyYXk+KTpPYnNlcnZhYmxlPG51bWJlcj47XHJcbiAgc2tpcEZyYW1lcyhuOm51bWJlcik6dm9pZDtcclxuICBjbG9zZSgpOnZvaWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBFZGl0RmxvYXQzMkFycmF5SW5wdXRTdHJlYW0gaW1wbGVtZW50cyBGbG9hdDMyQXJyYXlJbnB1dFN0cmVhbXtcclxuICBwcml2YXRlIGZyYW1lUG9zPTA7XHJcbiAgcHJpdmF0ZSByZWFkRnJhbWVzPTA7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfc3JjSW5wdXRTdHJlYW06RmxvYXQzMkFycmF5SW5wdXRTdHJlYW0scHJpdmF0ZSBvZmZzZXQ6bnVtYmVyPTAscHJpdmF0ZSBsZW5ndGg/Om51bWJlcnx1bmRlZmluZWQpIHtcclxuICAgIGlmICh0aGlzLm9mZnNldDwwKXtcclxuICAgICAgICB0aHJvdyBFcnJvcignUGFyYW1ldGVyIG9mZnNldCBtdXN0IGJlIHVuZGVmaW5lZCBvciBncmVhdGVyIG9yIGVxdWFsIHplcm8uJyk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5sZW5ndGghPT11bmRlZmluZWQgJiYgdGhpcy5sZW5ndGg8MCl7XHJcbiAgICAgIHRocm93IEVycm9yKCdQYXJhbWV0ZXIgbGVuZ3RoIG11c3QgYmUgdW5kZWZpbmVkIG9yIGdyZWF0ZXIgb3IgZXF1YWwgemVyby4nKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2tpcFRvT2Zmc2V0KCl7XHJcbiAgICBpZih0aGlzLmZyYW1lUG9zPT0wICYmIHRoaXMub2Zmc2V0PjApe1xyXG4gICAgICB0aGlzLl9zcmNJbnB1dFN0cmVhbS5za2lwRnJhbWVzKHRoaXMub2Zmc2V0KTtcclxuICAgICAgdGhpcy5mcmFtZVBvcys9dGhpcy5vZmZzZXQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZWFkKGJ1ZmZlcnM6IEFycmF5PEZsb2F0MzJBcnJheT4pOiBudW1iZXJ7XHJcbiAgICB0aGlzLnNraXBUb09mZnNldCgpO1xyXG4gICAgbGV0IHJlYWQ9MDtcclxuICAgIGlmKHRoaXMubGVuZ3RoPT09dW5kZWZpbmVkKXtcclxuICAgICAgcmVhZCA9IHRoaXMuX3NyY0lucHV0U3RyZWFtLnJlYWQoYnVmZmVycyk7XHJcbiAgICB9ZWxzZSB7XHJcbiAgICAgIGlmIChidWZmZXJzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBsZXQgYnVmc0NoMCA9IGJ1ZmZlcnNbMF07XHJcbiAgICAgICAgbGV0IGJ1ZnNMZW4gPSBidWZzQ2gwLmxlbmd0aDtcclxuICAgICAgICBsZXQgYXZhaWwgPSB0aGlzLmxlbmd0aCAtIHRoaXMucmVhZEZyYW1lcztcclxuICAgICAgICBpZiAoYXZhaWwgPiAwKSB7XHJcbiAgICAgICAgICBpZiAoYXZhaWwgPiBidWZzTGVuKSB7XHJcbiAgICAgICAgICAgIHJlYWQgPSB0aGlzLl9zcmNJbnB1dFN0cmVhbS5yZWFkKGJ1ZmZlcnMpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gdGVtcG9yYXJ5IGJ1ZmZlcnMgcmVxdWlyZWRcclxuICAgICAgICAgICAgbGV0IHRtcEJ1ZnMgPSBuZXcgQXJyYXk8RmxvYXQzMkFycmF5PihidWZmZXJzLmxlbmd0aCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBidWZmZXJzLmxlbmd0aDsgY2grKykge1xyXG4gICAgICAgICAgICAgIHRtcEJ1ZnNbY2hdID0gbmV3IEZsb2F0MzJBcnJheShhdmFpbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVhZCA9IHRoaXMuX3NyY0lucHV0U3RyZWFtLnJlYWQodG1wQnVmcyk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBidWZmZXJzLmxlbmd0aDsgY2grKykge1xyXG4gICAgICAgICAgICAgIGJ1ZmZlcnNbY2hdLnNldCh0bXBCdWZzW2NoXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMucmVhZEZyYW1lcys9cmVhZDtcclxuICAgIHRoaXMuZnJhbWVQb3MrPXJlYWQ7XHJcbiAgICByZXR1cm4gcmVhZDtcclxuICB9XHJcblxyXG4gIHNraXBGcmFtZXMobjpudW1iZXIpOnZvaWR7XHJcbiAgICB0aGlzLnNraXBUb09mZnNldCgpO1xyXG4gICAgaWYodGhpcy5sZW5ndGg9PT11bmRlZmluZWQpe1xyXG4gICAgICB0aGlzLl9zcmNJbnB1dFN0cmVhbS5za2lwRnJhbWVzKG4pO1xyXG4gICAgfWVsc2Uge1xyXG4gICAgICBsZXQgYXZhaWwgPSB0aGlzLmxlbmd0aCAtIHRoaXMucmVhZEZyYW1lcztcclxuICAgICAgaWYgKGF2YWlsID4gMCkge1xyXG4gICAgICAgIGlmIChhdmFpbCA+PSBuKSB7XHJcbiAgICAgICAgICB0aGlzLl9zcmNJbnB1dFN0cmVhbS5za2lwRnJhbWVzKG4pO1xyXG4gICAgICAgICAgdGhpcy5yZWFkRnJhbWVzICs9IG47XHJcbiAgICAgICAgICB0aGlzLmZyYW1lUG9zICs9IG47XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRocm93IEVycm9yKCdUcmllZCB0byBza2lwIG91dCBvZiBib3VuZHMuJylcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsb3NlKCk6dm9pZHtcclxuICAgIHRoaXMuX3NyY0lucHV0U3RyZWFtLmNsb3NlKCk7XHJcbiAgfVxyXG59XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIEFzeW5jRWRpdEZsb2F0MzJBcnJheUlucHV0U3RyZWFtIGltcGxlbWVudHMgQXN5bmNGbG9hdDMyQXJyYXlJbnB1dFN0cmVhbXtcclxuICBwcml2YXRlIGZyYW1lUG9zPTA7XHJcbiAgcHJpdmF0ZSByZWFkRnJhbWVzPTA7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfc3JjSW5wdXRTdHJlYW06QXN5bmNGbG9hdDMyQXJyYXlJbnB1dFN0cmVhbSxwcml2YXRlIG9mZnNldDpudW1iZXI9MCxwcml2YXRlIGxlbmd0aD86bnVtYmVyfHVuZGVmaW5lZCkge1xyXG4gICAgaWYgKHRoaXMub2Zmc2V0PDApe1xyXG4gICAgICB0aHJvdyBFcnJvcignUGFyYW1ldGVyIG9mZnNldCBtdXN0IGJlIHVuZGVmaW5lZCBvciBncmVhdGVyIG9yIGVxdWFsIHplcm8uJyk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5sZW5ndGghPT11bmRlZmluZWQgJiYgdGhpcy5sZW5ndGg8MCl7XHJcbiAgICAgIHRocm93IEVycm9yKCdQYXJhbWV0ZXIgbGVuZ3RoIG11c3QgYmUgdW5kZWZpbmVkIG9yIGdyZWF0ZXIgb3IgZXF1YWwgemVyby4nKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2tpcFRvT2Zmc2V0KCl7XHJcbiAgICBpZih0aGlzLmZyYW1lUG9zPT0wICYmIHRoaXMub2Zmc2V0PjApe1xyXG4gICAgICB0aGlzLl9zcmNJbnB1dFN0cmVhbS5za2lwRnJhbWVzKHRoaXMub2Zmc2V0KTtcclxuICAgICAgdGhpcy5mcmFtZVBvcys9dGhpcy5vZmZzZXQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZWFkT2JzKGJ1ZmZlcnM6IEFycmF5PEZsb2F0MzJBcnJheT4pOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xyXG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPG51bWJlcj4oc3Vic2NyaWJlcj0+e1xyXG4gICAgICB0aGlzLnNraXBUb09mZnNldCgpO1xyXG4gICAgICBpZih0aGlzLmxlbmd0aD09PXVuZGVmaW5lZCl7XHJcbiAgICAgICAgdGhpcy5fc3JjSW5wdXRTdHJlYW0ucmVhZE9icyhidWZmZXJzKS5zdWJzY3JpYmUoc3Vic2NyaWJlcik7XHJcbiAgICAgIH1lbHNlIHtcclxuICAgICAgICBpZiAoYnVmZmVycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBsZXQgYnVmc0NoMCA9IGJ1ZmZlcnNbMF07XHJcbiAgICAgICAgICBsZXQgYnVmc0xlbiA9IGJ1ZnNDaDAubGVuZ3RoO1xyXG4gICAgICAgICAgbGV0IGF2YWlsID0gdGhpcy5sZW5ndGggLSB0aGlzLnJlYWRGcmFtZXM7XHJcbiAgICAgICAgICBpZiAoYXZhaWwgPiAwKSB7XHJcbiAgICAgICAgICAgIGlmIChhdmFpbCA+IGJ1ZnNMZW4pIHtcclxuICAgICAgICAgICAgICB0aGlzLl9zcmNJbnB1dFN0cmVhbS5yZWFkT2JzKGJ1ZmZlcnMpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgICAgICBuZXh0OiAocmVhZCk9PntcclxuICAgICAgICAgICAgICAgICAgdGhpcy5yZWFkRnJhbWVzKz1yZWFkO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLmZyYW1lUG9zKz1yZWFkO1xyXG4gICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQocmVhZCk7XHJcbiAgICAgICAgICAgICAgICB9LGNvbXBsZXRlOigpPT57XHJcbiAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIC8vIHRlbXBvcmFyeSBidWZmZXJzIHJlcXVpcmVkXHJcbiAgICAgICAgICAgICAgbGV0IHRtcEJ1ZnMgPSBuZXcgQXJyYXk8RmxvYXQzMkFycmF5PihidWZmZXJzLmxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IGJ1ZmZlcnMubGVuZ3RoOyBjaCsrKSB7XHJcbiAgICAgICAgICAgICAgICB0bXBCdWZzW2NoXSA9IG5ldyBGbG9hdDMyQXJyYXkoYXZhaWwpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB0aGlzLl9zcmNJbnB1dFN0cmVhbS5yZWFkT2JzKHRtcEJ1ZnMpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgICAgICBuZXh0OihyZWFkKT0+e1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IGJ1ZmZlcnMubGVuZ3RoOyBjaCsrKSB7XHJcbiAgICAgICAgICAgICAgICAgIGJ1ZmZlcnNbY2hdLnNldCh0bXBCdWZzW2NoXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlYWRGcmFtZXMrPXJlYWQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZyYW1lUG9zKz1yZWFkO1xyXG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHJlYWQpO1xyXG4gICAgICAgICAgICAgIH0sY29tcGxldGU6KCk9PntcclxuICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgLy8gZW5kIG9mIHN0cmVhbVxyXG4gICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoMCk7XHJcbiAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIHN1YnNjcmliZXIubmV4dCgwKTtcclxuICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2tpcEZyYW1lcyhuOm51bWJlcik6dm9pZHtcclxuICAgIHRoaXMuc2tpcFRvT2Zmc2V0KCk7XHJcbiAgICBpZih0aGlzLmxlbmd0aD09PXVuZGVmaW5lZCl7XHJcbiAgICAgIHRoaXMuX3NyY0lucHV0U3RyZWFtLnNraXBGcmFtZXMobik7XHJcbiAgICB9ZWxzZSB7XHJcbiAgICAgIGxldCBhdmFpbCA9IHRoaXMubGVuZ3RoIC0gdGhpcy5yZWFkRnJhbWVzO1xyXG4gICAgICBpZiAoYXZhaWwgPiAwKSB7XHJcbiAgICAgICAgaWYgKGF2YWlsID49IG4pIHtcclxuICAgICAgICAgIHRoaXMuX3NyY0lucHV0U3RyZWFtLnNraXBGcmFtZXMobik7XHJcbiAgICAgICAgICB0aGlzLnJlYWRGcmFtZXMgKz0gbjtcclxuICAgICAgICAgIHRoaXMuZnJhbWVQb3MgKz0gbjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhyb3cgRXJyb3IoJ1RyaWVkIHRvIHNraXAgb3V0IG9mIGJvdW5kcy4nKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2xvc2UoKTp2b2lke1xyXG4gICAgdGhpcy5fc3JjSW5wdXRTdHJlYW0uY2xvc2UoKTtcclxuICB9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBGbG9hdDMyQXJyYXlPdXRTdHJlYW0ge1xyXG5cclxuICB3cml0ZShidWZmZXJzOiBBcnJheTxGbG9hdDMyQXJyYXk+KTogbnVtYmVyO1xyXG5cclxuICBmbHVzaCgpOiB2b2lkO1xyXG5cclxuICBjbG9zZSgpOiB2b2lkO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgRmxvYXQzMkFycmF5Q2h1bmtlck91dFN0cmVhbSBpbXBsZW1lbnRzIEZsb2F0MzJBcnJheU91dFN0cmVhbSB7XHJcblxyXG4gIHByaXZhdGUgYnVmcyA9IG5ldyBBcnJheTxGbG9hdDMyQXJyYXk+KCk7XHJcbiAgcHJpdmF0ZSBmaWxsZWQ6IG51bWJlcjtcclxuXHJcbiAgcHJpdmF0ZSBfY2hhbm5lbHM6IG51bWJlcj0wO1xyXG4gIHByaXZhdGUgX2NodW5rU2l6ZTogbnVtYmVyPTA7XHJcblxyXG4gIHByaXZhdGUgcmVjZWl2ZWRGcmFtZXM6IG51bWJlcjtcclxuICBwcml2YXRlIHNlbnRGcmFtZXM6IG51bWJlcjtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBvdXRTdHJlYW06IEZsb2F0MzJBcnJheU91dFN0cmVhbSkge1xyXG4gICAgdGhpcy5maWxsZWQgPSAwO1xyXG4gICAgdGhpcy5yZWNlaXZlZEZyYW1lcyA9IDA7XHJcbiAgICB0aGlzLnNlbnRGcmFtZXMgPSAwO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVCdWZmZXJzKCkge1xyXG4gICAgdGhpcy5idWZzID0gbmV3IEFycmF5PEZsb2F0MzJBcnJheT4odGhpcy5fY2hhbm5lbHMpO1xyXG4gICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IHRoaXMuX2NoYW5uZWxzOyBjaCsrKSB7XHJcbiAgICAgIHRoaXMuYnVmc1tjaF0gPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMuX2NodW5rU2l6ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXQgY2h1bmtTaXplKGNodW5rU2l6ZTogbnVtYmVyKSB7XHJcbiAgICB0aGlzLl9jaHVua1NpemUgPSBjaHVua1NpemU7XHJcbiAgICB0aGlzLmNyZWF0ZUJ1ZmZlcnMoKTtcclxuICB9XHJcblxyXG4gIGdldCBjaHVua1NpemUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jaHVua1NpemU7XHJcbiAgfVxyXG5cclxuICBzZXQgY2hhbm5lbHMoY2hhbm5lbHM6IG51bWJlcikge1xyXG4gICAgdGhpcy5fY2hhbm5lbHMgPSBjaGFubmVscztcclxuICAgIHRoaXMuY3JlYXRlQnVmZmVycygpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNoYW5uZWxzKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2hhbm5lbHM7XHJcbiAgfVxyXG5cclxuXHJcbiAgYXZhaWxhYmxlKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2h1bmtTaXplLXRoaXMuZmlsbGVkO1xyXG4gIH1cclxuXHJcbiAgd3JpdGUoYnVmZmVyczogQXJyYXk8RmxvYXQzMkFycmF5Pik6IG51bWJlciB7XHJcblxyXG4gICAgbGV0IGNvcGllZCA9IDA7XHJcbiAgICBpZihidWZmZXJzLmxlbmd0aD4wKSB7XHJcbiAgICAgIGxldCBidWZmZXJzTGVuID0gYnVmZmVyc1swXS5sZW5ndGg7XHJcbiAgICAgIHRoaXMucmVjZWl2ZWRGcmFtZXMgKz0gYnVmZmVyc0xlbjtcclxuICAgICAgbGV0IGF2YWlsID0gYnVmZmVyc0xlbjtcclxuICAgICAgLy8gRmlsbCBvdXQgYnVmZmVycyB1bnRpbCBhbGwgdmFsdWVzIGNvcGllZFxyXG5cclxuICAgICAgd2hpbGUgKGF2YWlsID4gMCkge1xyXG4gICAgICAgIGxldCB0b0ZpbGwgPSB0aGlzLl9jaHVua1NpemUgLSB0aGlzLmZpbGxlZDtcclxuICAgICAgICBpZiAodG9GaWxsID4gYXZhaWwpIHtcclxuICAgICAgICAgIHRvRmlsbCA9IGF2YWlsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgc2xpY2VFbmQgPSBjb3BpZWQgKyB0b0ZpbGw7XHJcblxyXG4gICAgICAgIC8vIEZpcmVmb3ggb24gQW5kcm9pZCBzZW5kcyBvbmx5IHRoZSBmaXJzdCBjaGFubmVsXHJcbiAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IGJ1ZmZlcnNMZW47IGNoKyspIHtcclxuICAgICAgICAgIGlmKGJ1ZmZlcnNbY2hdKSB7XHJcbiAgICAgICAgICAgIGxldCBjcFBydCA9IGJ1ZmZlcnNbY2hdLnNsaWNlKGNvcGllZCwgc2xpY2VFbmQpO1xyXG4gICAgICAgICAgICBsZXQgYnVmID0gdGhpcy5idWZzW2NoXTtcclxuICAgICAgICAgICAgYnVmLnNldChjcFBydCwgdGhpcy5maWxsZWQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb3BpZWQgKz0gdG9GaWxsO1xyXG4gICAgICAgIGF2YWlsIC09IHRvRmlsbDtcclxuICAgICAgICB0aGlzLmZpbGxlZCArPSB0b0ZpbGw7XHJcbiAgICAgICAgaWYgKHRoaXMuZmlsbGVkID09IHRoaXMuX2NodW5rU2l6ZSkge1xyXG4gICAgICAgICAgdGhpcy5vdXRTdHJlYW0ud3JpdGUodGhpcy5idWZzKTtcclxuICAgICAgICAgIHRoaXMuc2VudEZyYW1lcyArPSB0aGlzLmZpbGxlZDtcclxuICAgICAgICAgIHRoaXMuZmlsbGVkID0gMDtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY29waWVkO1xyXG4gIH1cclxuXHJcbiAgZmx1c2goKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5maWxsZWQgPiAwKSB7XHJcbiAgICAgIGxldCByZXN0QnVmcyA9IG5ldyBBcnJheTxGbG9hdDMyQXJyYXk+KHRoaXMuX2NoYW5uZWxzKTtcclxuICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IHRoaXMuX2NoYW5uZWxzOyBjaCsrKSB7XHJcbiAgICAgICAgcmVzdEJ1ZnNbY2hdID0gdGhpcy5idWZzW2NoXS5zbGljZSgwLCB0aGlzLmZpbGxlZCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5vdXRTdHJlYW0ud3JpdGUocmVzdEJ1ZnMpO1xyXG4gICAgICB0aGlzLm91dFN0cmVhbS5mbHVzaCgpO1xyXG4gICAgICB0aGlzLnNlbnRGcmFtZXMgKz0gdGhpcy5maWxsZWQ7XHJcbiAgICAgIHRoaXMuZmlsbGVkID0gMDtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBjbG9zZSgpOiB2b2lkIHtcclxuICAgIHRoaXMub3V0U3RyZWFtLmNsb3NlKCk7XHJcbiAgfVxyXG5cclxuXHJcbn1cclxuIl19