active-connect-ng2 0.2.39 → 0.2.41

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 (53) hide show
  1. package/ng-package.json +7 -0
  2. package/package.json +13 -32
  3. package/src/lib/active-connect-ng2.module.ts +34 -0
  4. package/src/lib/websocket/client.ts +438 -0
  5. package/src/lib/websocket/decorators/function.ts +44 -0
  6. package/src/lib/websocket/decorators/websocket/handle.ts +12 -0
  7. package/src/lib/websocket/decorators/websocket/on-reconnect.ts +6 -0
  8. package/src/lib/websocket/decorators/websocket/on-success.ts +11 -0
  9. package/src/lib/websocket/decorators/websocket/outbound.ts +212 -0
  10. package/src/lib/websocket/decorators/websocket/route.ts +32 -0
  11. package/src/lib/websocket/decorators/websocket/shared.ts +11 -0
  12. package/{lib/websocket/decorators/websocket/websocket-route-service.d.ts → src/lib/websocket/decorators/websocket/websocket-route-service.ts} +3 -2
  13. package/src/lib/websocket/json/json-parser.ts +26 -0
  14. package/src/lib/websocket/lifecycle/loading-status.ts +32 -0
  15. package/src/lib/websocket/objects/outbound-object.ts +430 -0
  16. package/{public-api.d.ts → src/public-api.ts} +4 -0
  17. package/tsconfig.lib.json +14 -0
  18. package/tsconfig.lib.prod.json +10 -0
  19. package/tsconfig.spec.json +14 -0
  20. package/esm2020/active-connect-ng2.mjs +0 -5
  21. package/esm2020/lib/active-connect-ng2.module.mjs +0 -42
  22. package/esm2020/lib/websocket/client.mjs +0 -345
  23. package/esm2020/lib/websocket/decorators/function.mjs +0 -40
  24. package/esm2020/lib/websocket/decorators/websocket/handle.mjs +0 -9
  25. package/esm2020/lib/websocket/decorators/websocket/on-reconnect.mjs +0 -6
  26. package/esm2020/lib/websocket/decorators/websocket/on-success.mjs +0 -8
  27. package/esm2020/lib/websocket/decorators/websocket/outbound.mjs +0 -213
  28. package/esm2020/lib/websocket/decorators/websocket/route.mjs +0 -31
  29. package/esm2020/lib/websocket/decorators/websocket/shared.mjs +0 -10
  30. package/esm2020/lib/websocket/decorators/websocket/websocket-route-service.mjs +0 -2
  31. package/esm2020/lib/websocket/index.mjs +0 -11
  32. package/esm2020/lib/websocket/json/json-parser.mjs +0 -23
  33. package/esm2020/lib/websocket/lifecycle/loading-status.mjs +0 -31
  34. package/esm2020/lib/websocket/objects/outbound-object.mjs +0 -398
  35. package/esm2020/public-api.mjs +0 -7
  36. package/fesm2015/active-connect-ng2.mjs +0 -1176
  37. package/fesm2015/active-connect-ng2.mjs.map +0 -1
  38. package/fesm2020/active-connect-ng2.mjs +0 -1158
  39. package/fesm2020/active-connect-ng2.mjs.map +0 -1
  40. package/index.d.ts +0 -5
  41. package/lib/active-connect-ng2.module.d.ts +0 -7
  42. package/lib/websocket/client.d.ts +0 -59
  43. package/lib/websocket/decorators/function.d.ts +0 -30
  44. package/lib/websocket/decorators/websocket/handle.d.ts +0 -1
  45. package/lib/websocket/decorators/websocket/on-reconnect.d.ts +0 -1
  46. package/lib/websocket/decorators/websocket/on-success.d.ts +0 -1
  47. package/lib/websocket/decorators/websocket/outbound.d.ts +0 -1
  48. package/lib/websocket/decorators/websocket/route.d.ts +0 -1
  49. package/lib/websocket/decorators/websocket/shared.d.ts +0 -4
  50. package/lib/websocket/json/json-parser.d.ts +0 -5
  51. package/lib/websocket/lifecycle/loading-status.d.ts +0 -9
  52. package/lib/websocket/objects/outbound-object.d.ts +0 -48
  53. /package/{lib/websocket/index.d.ts → src/lib/websocket/index.ts} +0 -0
@@ -1,398 +0,0 @@
1
- import { Observable } from 'rxjs';
2
- import { WebsocketClient } from '../client';
3
- export class OutboundObject {
4
- constructor(client, method, lazyLoaded, cached, initialLoadingCount, sortBy) {
5
- this.client = client;
6
- this.method = method;
7
- this.lazyLoaded = lazyLoaded;
8
- this.cached = cached;
9
- this.initialLoadingCount = initialLoadingCount;
10
- this.sortBy = sortBy;
11
- this.dataMap = new Map();
12
- this.data = undefined;
13
- this.requested = false;
14
- this._loading = false;
15
- this._length = undefined;
16
- this.requestedId = null;
17
- this.loadedObservable = null;
18
- this.loadedId = null;
19
- this.loadedIdData = null;
20
- this.loadedIdChanged = null;
21
- this.requestedGroupId = null;
22
- this.loadedGroupObservable = null;
23
- this.loadedGroupId = null;
24
- this.loadedGroupData = null;
25
- this.loadedGroupChanged = null;
26
- this.target.loading = new Map();
27
- if (this.client.dbService) {
28
- try {
29
- this.client.dbService
30
- .getByKey('outbound', method)
31
- .subscribe((result) => {
32
- if (result) {
33
- this.previouslyCachedCount = result.data?.length || null;
34
- }
35
- });
36
- }
37
- catch (e) {
38
- console.error('ActiveConnect: Unable to read cached data');
39
- console.error(e);
40
- }
41
- }
42
- const _this = this;
43
- WebsocketClient.expectOutbound(method, function setOutbound(data, specificHash, insertedOrGroupData, updatedOrGroupId, deleted, length, _client) {
44
- if (!cached) {
45
- if (_client.dbService) {
46
- try {
47
- _client.dbService
48
- .deleteByKey('outbound', method)
49
- .subscribe(() => { });
50
- }
51
- catch (e) {
52
- console.error('ActiveConnect: Unable to delete cached data');
53
- console.error(e);
54
- }
55
- }
56
- }
57
- if (data == 'cache_restore') {
58
- if (_client.dbService) {
59
- try {
60
- _client.dbService
61
- .getByKey('outbound', method)
62
- .subscribe((result) => {
63
- _this.setData(result.data);
64
- if (result.length)
65
- _this._length = result.length;
66
- _this.loading = false;
67
- });
68
- }
69
- catch (e) {
70
- console.error('ActiveConnect: Unable to restore cached data');
71
- console.error(e);
72
- }
73
- }
74
- else {
75
- console.error('ActiveConnect: Caching / restore not possible as the indexedDB is not accessible');
76
- }
77
- }
78
- else if (data == 'cache_delete') {
79
- if (_client.dbService) {
80
- try {
81
- _client.dbService
82
- .deleteByKey('outbound', method)
83
- .subscribe(() => { });
84
- }
85
- catch (e) {
86
- console.error('ActiveConnect: Unable to delete cached data');
87
- console.error(e);
88
- }
89
- }
90
- else {
91
- console.error('ActiveConnect: Caching / restore not possible as the indexedDB is not accessible');
92
- }
93
- _this.loading = false;
94
- _this.requested = false;
95
- }
96
- else if (data == 'data_delete') {
97
- _this.data = undefined;
98
- _this.dataMap = new Map();
99
- _this.requested = false;
100
- _this.loadedGroupData = null;
101
- _this.loadedGroupId = null;
102
- _this._length = undefined;
103
- _this.loading = false;
104
- }
105
- else if (data == 'data_group') {
106
- if (_this.requestedGroupId ==
107
- (updatedOrGroupId ? updatedOrGroupId[0] : 0)) {
108
- _this.loadedGroupData = insertedOrGroupData;
109
- _this.loadedGroupId = updatedOrGroupId ? updatedOrGroupId[0] : 0;
110
- _this.loadedGroupChanged?.next(insertedOrGroupData);
111
- _this.loading = false;
112
- }
113
- }
114
- else if (data == 'data_id') {
115
- if (_this.requestedId == (updatedOrGroupId ? updatedOrGroupId[0] : 0)) {
116
- _this.loadedIdData =
117
- (insertedOrGroupData?.length || 0) > 0
118
- ? insertedOrGroupData[0]
119
- : null;
120
- _this.loadedId = updatedOrGroupId ? updatedOrGroupId[0] : 0;
121
- _this.loadedIdChanged?.next(_this.loadedIdData);
122
- _this.loading = false;
123
- }
124
- }
125
- else if (data == 'data_diff') {
126
- insertedOrGroupData?.forEach((e) => {
127
- _this.dataMap.set(e.id, e);
128
- if (e.id == _this.loadedId) {
129
- _this.loadedIdChanged?.next(e);
130
- }
131
- });
132
- updatedOrGroupId?.forEach((e) => {
133
- _this.dataMap.set(e.id, e);
134
- if (e.id == _this.loadedId) {
135
- _this.loadedIdChanged?.next(e);
136
- }
137
- });
138
- deleted?.forEach((e) => {
139
- _this.dataMap.delete(e.id);
140
- if (e.id == _this.loadedId) {
141
- _this.loadedIdChanged?.next(null);
142
- }
143
- });
144
- _this.data = Array.from(_this.dataMap.values());
145
- if (_this.data && _this.sortBy)
146
- _this.data = _this.data.sort(_this.sortBy);
147
- _this.loading = false;
148
- if (cached && specificHash) {
149
- if (_client.dbService) {
150
- try {
151
- if (_this.data && _this.data?.length > 0) {
152
- _client.dbService
153
- .update('outbound', {
154
- method,
155
- data: _this.data,
156
- specificHash,
157
- length,
158
- })
159
- .subscribe(() => { });
160
- }
161
- else {
162
- _client.dbService
163
- .deleteByKey('outbound', method)
164
- .subscribe(() => { });
165
- }
166
- }
167
- catch (e) {
168
- console.error('ActiveConnect: Unable to update cached data.');
169
- console.error(e);
170
- }
171
- }
172
- else {
173
- console.error('ActiveConnect: Caching not possible as the indexedDB has not been initialized');
174
- }
175
- }
176
- }
177
- else {
178
- _this.setData(data);
179
- if (_this.loadedId) {
180
- const loadedValue = _this.dataMap.get(_this.loadedId);
181
- if (loadedValue) {
182
- _this.loadedIdData = loadedValue;
183
- _this.loadedIdChanged?.next(_this.loadedIdData);
184
- }
185
- }
186
- _this.loading = false;
187
- if (cached && specificHash) {
188
- if (_client.dbService) {
189
- try {
190
- if (data && data?.length > 0) {
191
- _client.dbService
192
- .update('outbound', {
193
- method,
194
- data,
195
- specificHash,
196
- length,
197
- })
198
- .subscribe(() => { });
199
- }
200
- else {
201
- _client.dbService
202
- .deleteByKey('outbound', method)
203
- .subscribe(() => { });
204
- }
205
- }
206
- catch (e) {
207
- console.error('ActiveConnect: Unable to update cached data.');
208
- console.error(e);
209
- }
210
- }
211
- else {
212
- console.error('ActiveConnect: Caching not possible as the indexedDB has not been initialized');
213
- }
214
- }
215
- }
216
- if (length)
217
- _this._length = length;
218
- });
219
- WebsocketClient.addResetRequestingStateCallback(() => {
220
- this.afterServerReconnected();
221
- });
222
- }
223
- get target() {
224
- return this.client.__proto__;
225
- }
226
- get(id) {
227
- if (this.requestedId == id && this.loadedObservable && this.loadedIdData) {
228
- if (this.loadedIdData)
229
- setTimeout(() => {
230
- if (this.loadedIdData)
231
- this.loadedIdChanged?.next(this.loadedIdData);
232
- }, 50);
233
- return this.loadedObservable;
234
- }
235
- let observablePromise;
236
- if (this.requestedId != id || !this.loadedObservable) {
237
- observablePromise = new Promise((resolve) => {
238
- this.loadedObservable = new Observable((observer) => {
239
- this.loadedIdChanged = observer;
240
- resolve();
241
- });
242
- });
243
- }
244
- Promise.all([observablePromise]).then(() => {
245
- new Promise(async (resolve) => {
246
- if (!this.requested && this.lazyLoaded) {
247
- this.load().then();
248
- }
249
- if (this.data) {
250
- const res = this.dataMap.get(id);
251
- if (res) {
252
- this.loadedIdChanged?.next(res);
253
- resolve();
254
- return;
255
- }
256
- }
257
- if (this.loadedId == id) {
258
- this.loadedIdChanged?.next(this.loadedIdData);
259
- }
260
- else {
261
- await this.requestById(id);
262
- }
263
- resolve();
264
- }).then();
265
- });
266
- return this.loadedObservable;
267
- }
268
- getForGroup(groupId) {
269
- if (this.requestedGroupId == groupId &&
270
- this.loadedGroupObservable &&
271
- this.loadedGroupData) {
272
- setTimeout(() => {
273
- if (this.loadedGroupData)
274
- this.loadedGroupChanged?.next(this.loadedGroupData);
275
- }, 50);
276
- return this.loadedGroupObservable;
277
- }
278
- let observablePromise;
279
- if (this.requestedGroupId != groupId || !this.loadedGroupObservable) {
280
- observablePromise = new Promise((resolve) => {
281
- this.loadedGroupObservable = new Observable((observer) => {
282
- this.loadedGroupChanged = observer;
283
- resolve();
284
- });
285
- });
286
- }
287
- Promise.all([observablePromise]).then(() => {
288
- new Promise(async (resolve) => {
289
- if (!this.requested && this.lazyLoaded) {
290
- this.load().then();
291
- }
292
- if (this.loadedGroupId == groupId && this.loadedGroupData) {
293
- this.loadedGroupChanged?.next(this.loadedGroupData);
294
- }
295
- else {
296
- await this.requestForGroup(groupId);
297
- }
298
- resolve();
299
- }).then();
300
- });
301
- return this.loadedGroupObservable;
302
- }
303
- get all() {
304
- if (!this.requested && this.lazyLoaded) {
305
- this.load().then();
306
- }
307
- return this.data;
308
- }
309
- async load(count) {
310
- if (this.lazyLoaded) {
311
- const hasBeenRequestedBefore = this.requested;
312
- this._loading = true;
313
- if (!this.requested) {
314
- this.loading = true;
315
- }
316
- this.requested = true;
317
- await this.client.send('request.' + this.method, {
318
- count: hasBeenRequestedBefore
319
- ? this.data
320
- ? count || this.initialLoadingCount
321
- ? (count || this.initialLoadingCount) +
322
- this.loadedLength
323
- : undefined
324
- : undefined
325
- : this.previouslyCachedCount || this.initialLoadingCount,
326
- loaded: this.loadedLength,
327
- });
328
- }
329
- else {
330
- throw Error('Active-Connect: Cannot run loading request as this outbound is not lazy-loaded.');
331
- }
332
- }
333
- set loading(value) {
334
- this._loading = value;
335
- this.target.loading.set(this.method, value);
336
- }
337
- get loading() {
338
- return this._loading;
339
- }
340
- get loadedLength() {
341
- return this.data?.length || 0;
342
- }
343
- get length() {
344
- return this._length;
345
- }
346
- requestById(id) {
347
- this.loading = true;
348
- this.requestedId = id;
349
- return this.client.send('request.' + this.method, { id });
350
- }
351
- requestForGroup(groupId) {
352
- this.loading = true;
353
- this.requestedGroupId = groupId;
354
- return this.client.send('request.' + this.method, { groupId });
355
- }
356
- setData(data) {
357
- this.data = data;
358
- if (this.data && this.sortBy)
359
- this.data = this.data.sort(this.sortBy);
360
- this._length = data.length;
361
- this.dataMap = new Map();
362
- this.data.forEach((d) => {
363
- this.dataMap.set(d.id, d);
364
- });
365
- }
366
- get isEmpty() {
367
- return this.data == undefined;
368
- }
369
- /**
370
- * The contained data can be modified within the callback method
371
- */
372
- update(callback) {
373
- if (this.data) {
374
- const updateLengthVariable = this.data.length == this._length;
375
- const length = this.length;
376
- callback(this.data);
377
- this.setData(this.data);
378
- if (!updateLengthVariable) {
379
- this._length = length;
380
- }
381
- }
382
- }
383
- afterServerReconnected() {
384
- if (this.requested && this.lazyLoaded) {
385
- this.requested = false;
386
- this.load(1).then();
387
- }
388
- if (this.loadedId) {
389
- this.loadedIdData = null;
390
- this.get(this.loadedId);
391
- }
392
- if (this.loadedGroupId) {
393
- this.loadedGroupData = null;
394
- this.getForGroup(this.loadedGroupId);
395
- }
396
- }
397
- }
398
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0Ym91bmQtb2JqZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYWN0aXZlLWNvbm5lY3QtbmcyL3NyYy9saWIvd2Vic29ja2V0L29iamVjdHMvb3V0Ym91bmQtb2JqZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQVksTUFBTSxNQUFNLENBQUM7QUFDNUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQU01QyxNQUFNLE9BQU8sY0FBYztJQUV6QixZQUNVLE1BQXVCLEVBQ3ZCLE1BQWMsRUFDZCxVQUFvQixFQUNaLE1BQWdCLEVBQ3hCLG1CQUE0QixFQUM1QixNQUErQjtRQUwvQixXQUFNLEdBQU4sTUFBTSxDQUFpQjtRQUN2QixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsZUFBVSxHQUFWLFVBQVUsQ0FBVTtRQUNaLFdBQU0sR0FBTixNQUFNLENBQVU7UUFDeEIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFTO1FBQzVCLFdBQU0sR0FBTixNQUFNLENBQXlCO1FBb05qQyxZQUFPLEdBQXNDLElBQUksR0FBRyxFQUFFLENBQUM7UUFDdkQsU0FBSSxHQUFvQixTQUFTLENBQUM7UUE2RmxDLGNBQVMsR0FBWSxLQUFLLENBQUM7UUEyQjNCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFXakIsWUFBTyxHQUF1QixTQUFTLENBQUM7UUFLeEMsZ0JBQVcsR0FBa0IsSUFBSSxDQUFDO1FBQ2xDLHFCQUFnQixHQUF5QixJQUFJLENBQUM7UUFDOUMsYUFBUSxHQUFrQixJQUFJLENBQUM7UUFDL0IsaUJBQVksR0FBYSxJQUFJLENBQUM7UUFDOUIsb0JBQWUsR0FBdUIsSUFBSSxDQUFDO1FBTzNDLHFCQUFnQixHQUFrQixJQUFJLENBQUM7UUFDdkMsMEJBQXFCLEdBQTJCLElBQUksQ0FBQztRQUNyRCxrQkFBYSxHQUFrQixJQUFJLENBQUM7UUFDcEMs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LENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4QixJQUFJLENBQUMsb0JBQW9CLEVBQUU7Z0JBQ3pCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO2FBQ3ZCO1NBQ0Y7SUFDSCxDQUFDO0lBRU8sc0JBQXNCO1FBQzVCLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ3JDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDckI7UUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDekIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDekI7UUFDRCxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDdEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7WUFDNUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDdEM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlLCBPYnNlcnZlciB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBXZWJzb2NrZXRDbGllbnQgfSBmcm9tICcuLi9jbGllbnQnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJZE9iamVjdCB7XHJcbiAgaWQ6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBPdXRib3VuZE9iamVjdDxUIGV4dGVuZHMgSWRPYmplY3Q+IHtcclxuICBwcml2YXRlIHByZXZpb3VzbHlDYWNoZWRDb3VudDogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBjbGllbnQ6IFdlYnNvY2tldENsaWVudCxcclxuICAgIHByaXZhdGUgbWV0aG9kOiBzdHJpbmcsXHJcbiAgICBwcml2YXRlIGxhenlMb2FkZWQ/OiBib29sZWFuLFxyXG4gICAgcHVibGljIHJlYWRvbmx5IGNhY2hlZD86IGJvb2xlYW4sXHJcbiAgICBwcml2YXRlIGluaXRpYWxMb2FkaW5nQ291bnQ/OiBudW1iZXIsXHJcbiAgICBwcml2YXRlIHNvcnRCeT86IChhOiBULCBiOiBUKSA9PiBudW1iZXJcclxuICApIHtcclxuICAgIHRoaXMudGFyZ2V0LmxvYWRpbmcgPSBuZXcgTWFwPHN0cmluZywgYm9vbGVhbj4oKTtcclxuXHJcbiAgICBpZiAodGhpcy5jbGllbnQuZGJTZXJ2aWNlKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGhpcy5jbGllbnQuZGJTZXJ2aWNlXHJcbiAgICAgICAgICAuZ2V0QnlLZXkoJ291dGJvdW5kJywgbWV0aG9kKVxyXG4gICAgICAgICAgLnN1YnNjcmliZSgocmVzdWx0OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgIHRoaXMucHJldmlvdXNseUNhY2hlZENvdW50ID0gcmVzdWx0LmRhdGE/Lmxlbmd0aCB8fCBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0FjdGl2ZUNvbm5lY3Q6IFVuYWJsZSB0byByZWFkIGNhY2hlZCBkYXRhJyk7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IF90aGlzID0gdGhpcztcclxuICAgIFdlYnNvY2tldENsaWVudC5leHBlY3RPdXRib3VuZChcclxuICAgICAgbWV0aG9kLFxyXG4gICAgICBmdW5jdGlvbiBzZXRPdXRib3VuZChcclxuICAgICAgICBkYXRhOiBhbnksXHJcbiAgICAgICAgc3BlY2lmaWNIYXNoOiBudW1iZXIgfCBudWxsLFxyXG4gICAgICAgIGluc2VydGVkT3JHcm91cERhdGE6IGFueVtdIHwgbnVsbCxcclxuICAgICAgICB1cGRhdGVkT3JHcm91cElkOiBhbnlbXSB8IG51bGwsXHJcbiAgICAgICAgZGVsZXRlZDogYW55W10gfCBudWxsLFxyXG4gICAgICAgIGxlbmd0aDogbnVtYmVyIHwgbnVsbCxcclxuICAgICAgICBfY2xpZW50OiBXZWJzb2NrZXRDbGllbnRcclxuICAgICAgKSB7XHJcbiAgICAgICAgaWYgKCFjYWNoZWQpIHtcclxuICAgICAgICAgIGlmIChfY2xpZW50LmRiU2VydmljZSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIF9jbGllbnQuZGJTZXJ2aWNlXHJcbiAgICAgICAgICAgICAgICAuZGVsZXRlQnlLZXkoJ291dGJvdW5kJywgbWV0aG9kKVxyXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7fSk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdBY3RpdmVDb25uZWN0OiBVbmFibGUgdG8gZGVsZXRlIGNhY2hlZCBkYXRhJyk7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGRhdGEgPT0gJ2NhY2hlX3Jlc3RvcmUnKSB7XHJcbiAgICAgICAgICBpZiAoX2NsaWVudC5kYlNlcnZpY2UpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICBfY2xpZW50LmRiU2VydmljZVxyXG4gICAgICAgICAgICAgICAgLmdldEJ5S2V5KCdvdXRib3VuZCcsIG1ldGhvZClcclxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIF90aGlzLnNldERhdGEocmVzdWx0LmRhdGEpO1xyXG4gICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCkgX3RoaXMuX2xlbmd0aCA9IHJlc3VsdC5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgIF90aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignQWN0aXZlQ29ubmVjdDogVW5hYmxlIHRvIHJlc3RvcmUgY2FjaGVkIGRhdGEnKTtcclxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxyXG4gICAgICAgICAgICAgICdBY3RpdmVDb25uZWN0OiBDYWNoaW5nIC8gcmVzdG9yZSBub3QgcG9zc2libGUgYXMgdGhlIGluZGV4ZWREQiBpcyBub3QgYWNjZXNzaWJsZSdcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKGRhdGEgPT0gJ2NhY2hlX2RlbGV0ZScpIHtcclxuICAgICAgICAgIGlmIChfY2xpZW50LmRiU2VydmljZSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIF9jbGllbnQuZGJTZXJ2aWNlXHJcbiAgICAgICAgICAgICAgICAuZGVsZXRlQnlLZXkoJ291dGJvdW5kJywgbWV0aG9kKVxyXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7fSk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdBY3RpdmVDb25uZWN0OiBVbmFibGUgdG8gZGVsZXRlIGNhY2hlZCBkYXRhJyk7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcclxuICAgICAgICAgICAgICAnQWN0aXZlQ29ubmVjdDogQ2FjaGluZyAvIHJlc3RvcmUgbm90IHBvc3NpYmxlIGFzIHRoZSBpbmRleGVkREIgaXMgbm90IGFjY2Vzc2libGUnXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBfdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICBfdGhpcy5yZXF1ZXN0ZWQgPSBmYWxzZTtcclxuICAgICAgICB9IGVsc2UgaWYgKGRhdGEgPT0gJ2RhdGFfZGVsZXRlJykge1xyXG4gICAgICAgICAgX3RoaXMuZGF0YSA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgIF90aGlzLmRhdGFNYXAgPSBuZXcgTWFwKCk7XHJcbiAgICAgICAgICBfdGhpcy5yZXF1ZXN0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgIF90aGlzLmxvYWRlZEdyb3VwRGF0YSA9IG51bGw7XHJcbiAgICAgICAgICBfdGhpcy5sb2FkZWRHcm91cElkID0gbnVsbDtcclxuICAgICAgICAgIF90aGlzLl9sZW5ndGggPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICBfdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhID09ICdkYXRhX2dyb3VwJykge1xyXG4gICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBfdGhpcy5yZXF1ZXN0ZWRHcm91cElkID09XHJcbiAgICAgICAgICAgICh1cGRhdGVkT3JHcm91cElkID8gdXBkYXRlZE9yR3JvdXBJZFswXSA6IDApXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgX3RoaXMubG9hZGVkR3JvdXBEYXRhID0gaW5zZXJ0ZWRPckdyb3VwRGF0YTtcclxuICAgICAgICAgICAgX3RoaXMubG9hZGVkR3JvdXBJZCA9IHVwZGF0ZWRPckdyb3VwSWQgPyB1cGRhdGVkT3JHcm91cElkWzBdIDogMDtcclxuICAgICAgICAgICAgX3RoaXMubG9hZGVkR3JvdXBDaGFuZ2VkPy5uZXh0KGluc2VydGVkT3JHcm91cERhdGEgYXMgVFtdKTtcclxuICAgICAgICAgICAgX3RoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YSA9PSAnZGF0YV9pZCcpIHtcclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgX3RoaXMucmVxdWVzdGVkSWQgPT0gKHVwZGF0ZWRPckdyb3VwSWQgPyB1cGRhdGVkT3JHcm91cElkWzBdIDogMClcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICBfdGhpcy5sb2FkZWRJZERhdGEgPVxyXG4gICAgICAgICAgICAgIChpbnNlcnRlZE9yR3JvdXBEYXRhPy5sZW5ndGggfHwgMCkgPiAwXHJcbiAgICAgICAgICAgICAgICA/IChpbnNlcnRlZE9yR3JvdXBEYXRhIGFzIGFueVtdKVswXVxyXG4gICAgICAgICAgICAgICAgOiBudWxsO1xyXG4gICAgICAgICAgICBfdGhpcy5sb2FkZWRJZCA9IHVwZGF0ZWRPckdyb3VwSWQgPyB1cGRhdGVkT3JHcm91cElkWzBdIDogMDtcclxuICAgICAgICAgICAgX3RoaXMubG9hZGVkSWRDaGFuZ2VkPy5uZXh0KF90aGlzLmxvYWRlZElkRGF0YSBhcyBUKTtcclxuICAgICAgICAgICAgX3RoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YSA9PSAnZGF0YV9kaWZmJykge1xyXG4gICAgICAgICAgaW5zZXJ0ZWRPckdyb3VwRGF0YT8uZm9yRWFjaCgoZSkgPT4ge1xyXG4gICAgICAgICAgICBfdGhpcy5kYXRhTWFwLnNldChlLmlkLCBlKTtcclxuICAgICAgICAgICAgaWYgKGUuaWQgPT0gX3RoaXMubG9hZGVkSWQpIHtcclxuICAgICAgICAgICAgICBfdGhpcy5sb2FkZWRJZENoYW5nZWQ/Lm5leHQoZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgdXBkYXRlZE9yR3JvdXBJZD8uZm9yRWFjaCgoZSkgPT4ge1xyXG4gICAgICAgICAgICBfdGhpcy5kYXRhTWFwLnNldChlLmlkLCBlKTtcclxuICAgICAgICAgICAgaWYgKGUuaWQgPT0gX3RoaXMubG9hZGVkSWQpIHtcclxuICAgICAgICAgICAgICBfdGhpcy5sb2FkZWRJZENoYW5nZWQ/Lm5leHQoZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgZGVsZXRlZD8uZm9yRWFjaCgoZSkgPT4ge1xyXG4gICAgICAgICAgICBfdGhpcy5kYXRhTWFwLmRlbGV0ZShlLmlkKTtcclxuICAgICAgICAgICAgaWYgKGUuaWQgPT0gX3RoaXMubG9hZGVkSWQpIHtcclxuICAgICAgICAgICAgICBfdGhpcy5sb2FkZWRJZENoYW5nZWQ/Lm5leHQobnVsbCBhcyBhbnkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIF90aGlzLmRhdGEgPSBBcnJheS5mcm9tKF90aGlzLmRhdGFNYXAudmFsdWVzKCkpO1xyXG4gICAgICAgICAgaWYgKF90aGlzLmRhdGEgJiYgX3RoaXMuc29ydEJ5KVxyXG4gICAgICAgICAgICBfdGhpcy5kYXRhID0gX3RoaXMuZGF0YS5zb3J0KF90aGlzLnNvcnRCeSk7XHJcbiAgICAgICAgICBfdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgaWYgKGNhY2hlZCAmJiBzcGVjaWZpY0hhc2gpIHtcclxuICAgICAgICAgICAgaWYgKF9jbGllbnQuZGJTZXJ2aWNlKSB7XHJcbiAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5kYXRhICYmIF90aGlzLmRhdGE/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgX2NsaWVudC5kYlNlcnZpY2VcclxuICAgICAgICAgICAgICAgICAgICAudXBkYXRlKCdvdXRib3VuZCcsIHtcclxuICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCxcclxuICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IF90aGlzLmRhdGEsXHJcbiAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpY0hhc2gsXHJcbiAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgsXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHt9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIF9jbGllbnQuZGJTZXJ2aWNlXHJcbiAgICAgICAgICAgICAgICAgICAgLmRlbGV0ZUJ5S2V5KCdvdXRib3VuZCcsIG1ldGhvZClcclxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHt9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdBY3RpdmVDb25uZWN0OiBVbmFibGUgdG8gdXBkYXRlIGNhY2hlZCBkYXRhLicpO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcclxuICAgICAgICAgICAgICAgICdBY3RpdmVDb25uZWN0OiBDYWNoaW5nIG5vdCBwb3NzaWJsZSBhcyB0aGUgaW5kZXhlZERCIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCdcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIF90aGlzLnNldERhdGEoZGF0YSk7XHJcbiAgICAgICAgICBpZiAoX3RoaXMubG9hZGVkSWQpIHtcclxuICAgICAgICAgICAgY29uc3QgbG9hZGVkVmFsdWUgPSBfdGhpcy5kYXRhTWFwLmdldChfdGhpcy5sb2FkZWRJZCk7XHJcbiAgICAgICAgICAgIGlmIChsb2FkZWRWYWx1ZSkge1xyXG4gICAgICAgICAgICAgIF90aGlzLmxvYWRlZElkRGF0YSA9IGxvYWRlZFZhbHVlO1xyXG4gICAgICAgICAgICAgIF90aGlzLmxvYWRlZElkQ2hhbmdlZD8ubmV4dChfdGhpcy5sb2FkZWRJZERhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBfdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICBpZiAoY2FjaGVkICYmIHNwZWNpZmljSGFzaCkge1xyXG4gICAgICAgICAgICBpZiAoX2NsaWVudC5kYlNlcnZpY2UpIHtcclxuICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEgJiYgZGF0YT8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICBfY2xpZW50LmRiU2VydmljZVxyXG4gICAgICAgICAgICAgICAgICAgIC51cGRhdGUoJ291dGJvdW5kJywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLFxyXG4gICAgICAgICAgICAgICAgICAgICAgZGF0YSxcclxuICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmljSGFzaCxcclxuICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCxcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge30pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgX2NsaWVudC5kYlNlcnZpY2VcclxuICAgICAgICAgICAgICAgICAgICAuZGVsZXRlQnlLZXkoJ291dGJvdW5kJywgbWV0aG9kKVxyXG4gICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge30pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0FjdGl2ZUNvbm5lY3Q6IFVuYWJsZSB0byB1cGRhdGUgY2FjaGVkIGRhdGEuJyk7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxyXG4gICAgICAgICAgICAgICAgJ0FjdGl2ZUNvbm5lY3Q6IENhY2hpbmcgbm90IHBvc3NpYmxlIGFzIHRoZSBpbmRleGVkREIgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkJ1xyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGxlbmd0aCkgX3RoaXMuX2xlbmd0aCA9IGxlbmd0aDtcclxuICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgICBXZWJzb2NrZXRDbGllbnQuYWRkUmVzZXRSZXF1ZXN0aW5nU3RhdGVDYWxsYmFjaygoKSA9PiB7XHJcbiAgICAgIHRoaXMuYWZ0ZXJTZXJ2ZXJSZWNvbm5lY3RlZCgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXQgdGFyZ2V0KCk6IGFueSB7XHJcbiAgICByZXR1cm4gKHRoaXMuY2xpZW50IGFzIGFueSkuX19wcm90b19fO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkYXRhTWFwOiBNYXA8bnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCwgVD4gPSBuZXcgTWFwKCk7XHJcbiAgcHJpdmF0ZSBkYXRhOiBUW10gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XHJcblxyXG4gIHB1YmxpYyBnZXQoaWQ6IG51bWJlcik6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgaWYgKHRoaXMucmVxdWVzdGVkSWQgPT0gaWQgJiYgdGhpcy5sb2FkZWRPYnNlcnZhYmxlICYmIHRoaXMubG9hZGVkSWREYXRhKSB7XHJcbiAgICAgIGlmICh0aGlzLmxvYWRlZElkRGF0YSlcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIGlmICh0aGlzLmxvYWRlZElkRGF0YSkgdGhpcy5sb2FkZWRJZENoYW5nZWQ/Lm5leHQodGhpcy5sb2FkZWRJZERhdGEpO1xyXG4gICAgICAgIH0sIDUwKTtcclxuICAgICAgcmV0dXJuIHRoaXMubG9hZGVkT2JzZXJ2YWJsZTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgb2JzZXJ2YWJsZVByb21pc2U6IFByb21pc2U8YW55PiB8IHVuZGVmaW5lZDtcclxuICAgIGlmICh0aGlzLnJlcXVlc3RlZElkICE9IGlkIHx8ICF0aGlzLmxvYWRlZE9ic2VydmFibGUpIHtcclxuICAgICAgb2JzZXJ2YWJsZVByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgIHRoaXMubG9hZGVkT2JzZXJ2YWJsZSA9IG5ldyBPYnNlcnZhYmxlPFQ+KChvYnNlcnZlcjogT2JzZXJ2ZXI8VD4pID0+IHtcclxuICAgICAgICAgIHRoaXMubG9hZGVkSWRDaGFuZ2VkID0gb2JzZXJ2ZXI7XHJcbiAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIFByb21pc2UuYWxsKFtvYnNlcnZhYmxlUHJvbWlzZV0pLnRoZW4oKCkgPT4ge1xyXG4gICAgICBuZXcgUHJvbWlzZTx2b2lkPihhc3luYyAocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5yZXF1ZXN0ZWQgJiYgdGhpcy5sYXp5TG9hZGVkKSB7XHJcbiAgICAgICAgICB0aGlzLmxvYWQoKS50aGVuKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmRhdGEpIHtcclxuICAgICAgICAgIGNvbnN0IHJlcyA9IHRoaXMuZGF0YU1hcC5nZXQoaWQpO1xyXG4gICAgICAgICAgaWYgKHJlcykge1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRlZElkQ2hhbmdlZD8ubmV4dChyZXMpO1xyXG4gICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMubG9hZGVkSWQgPT0gaWQpIHtcclxuICAgICAgICAgIHRoaXMubG9hZGVkSWRDaGFuZ2VkPy5uZXh0KHRoaXMubG9hZGVkSWREYXRhIGFzIFQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlcXVlc3RCeUlkKGlkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICB9KS50aGVuKCk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB0aGlzLmxvYWRlZE9ic2VydmFibGUgYXMgT2JzZXJ2YWJsZTxUPjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRGb3JHcm91cChncm91cElkOiBudW1iZXIpOiBPYnNlcnZhYmxlPFRbXT4ge1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLnJlcXVlc3RlZEdyb3VwSWQgPT0gZ3JvdXBJZCAmJlxyXG4gICAgICB0aGlzLmxvYWRlZEdyb3VwT2JzZXJ2YWJsZSAmJlxyXG4gICAgICB0aGlzLmxvYWRlZEdyb3VwRGF0YVxyXG4gICAgKSB7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmxvYWRlZEdyb3VwRGF0YSlcclxuICAgICAgICAgIHRoaXMubG9hZGVkR3JvdXBDaGFuZ2VkPy5uZXh0KHRoaXMubG9hZGVkR3JvdXBEYXRhKTtcclxuICAgICAgfSwgNTApO1xyXG4gICAgICByZXR1cm4gdGhpcy5sb2FkZWRHcm91cE9ic2VydmFibGU7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG9ic2VydmFibGVQcm9taXNlOiBQcm9taXNlPGFueT4gfCB1bmRlZmluZWQ7XHJcbiAgICBpZiAodGhpcy5yZXF1ZXN0ZWRHcm91cElkICE9IGdyb3VwSWQgfHwgIXRoaXMubG9hZGVkR3JvdXBPYnNlcnZhYmxlKSB7XHJcbiAgICAgIG9ic2VydmFibGVQcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcclxuICAgICAgICB0aGlzLmxvYWRlZEdyb3VwT2JzZXJ2YWJsZSA9IG5ldyBPYnNlcnZhYmxlPFRbXT4oXHJcbiAgICAgICAgICAob2JzZXJ2ZXI6IE9ic2VydmVyPFRbXT4pID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sb2FkZWRHcm91cENoYW5nZWQgPSBvYnNlcnZlcjtcclxuICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIFByb21pc2UuYWxsKFtvYnNlcnZhYmxlUHJvbWlzZV0pLnRoZW4oKCkgPT4ge1xyXG4gICAgICBuZXcgUHJvbWlzZTx2b2lkPihhc3luYyAocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5yZXF1ZXN0ZWQgJiYgdGhpcy5sYXp5TG9hZGVkKSB7XHJcbiAgICAgICAgICB0aGlzLmxvYWQoKS50aGVuKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmxvYWRlZEdyb3VwSWQgPT0gZ3JvdXBJZCAmJiB0aGlzLmxvYWRlZEdyb3VwRGF0YSkge1xyXG4gICAgICAgICAgdGhpcy5sb2FkZWRHcm91cENoYW5nZWQ/Lm5leHQodGhpcy5sb2FkZWRHcm91cERhdGEgYXMgVFtdKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5yZXF1ZXN0Rm9yR3JvdXAoZ3JvdXBJZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgfSkudGhlbigpO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdGhpcy5sb2FkZWRHcm91cE9ic2VydmFibGUgYXMgT2JzZXJ2YWJsZTxUW10+O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBhbGwoKTogVFtdIHwgdW5kZWZpbmVkIHtcclxuICAgIGlmICghdGhpcy5yZXF1ZXN0ZWQgJiYgdGhpcy5sYXp5TG9hZGVkKSB7XHJcbiAgICAgIHRoaXMubG9hZCgpLnRoZW4oKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmRhdGE7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlcXVlc3RlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBhc3luYyBsb2FkKGNvdW50PzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5sYXp5TG9hZGVkKSB7XHJcbiAgICAgIGNvbnN0IGhhc0JlZW5SZXF1ZXN0ZWRCZWZvcmUgPSB0aGlzLnJlcXVlc3RlZDtcclxuICAgICAgdGhpcy5fbG9hZGluZyA9IHRydWU7XHJcbiAgICAgIGlmICghdGhpcy5yZXF1ZXN0ZWQpIHtcclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucmVxdWVzdGVkID0gdHJ1ZTtcclxuICAgICAgYXdhaXQgdGhpcy5jbGllbnQuc2VuZCgncmVxdWVzdC4nICsgdGhpcy5tZXRob2QsIHtcclxuICAgICAgICBjb3VudDogaGFzQmVlblJlcXVlc3RlZEJlZm9yZVxyXG4gICAgICAgICAgPyB0aGlzLmRhdGFcclxuICAgICAgICAgICAgPyBjb3VudCB8fCB0aGlzLmluaXRpYWxMb2FkaW5nQ291bnRcclxuICAgICAgICAgICAgICA/IChjb3VudCB8fCAodGhpcy5pbml0aWFsTG9hZGluZ0NvdW50IGFzIG51bWJlcikpICtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9hZGVkTGVuZ3RoXHJcbiAgICAgICAgICAgICAgOiB1bmRlZmluZWRcclxuICAgICAgICAgICAgOiB1bmRlZmluZWRcclxuICAgICAgICAgIDogdGhpcy5wcmV2aW91c2x5Q2FjaGVkQ291bnQgfHwgKHRoaXMuaW5pdGlhbExvYWRpbmdDb3VudCBhcyBudW1iZXIpLFxyXG4gICAgICAgIGxvYWRlZDogdGhpcy5sb2FkZWRMZW5ndGgsXHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhyb3cgRXJyb3IoXHJcbiAgICAgICAgJ0FjdGl2ZS1Db25uZWN0OiBDYW5ub3QgcnVuIGxvYWRpbmcgcmVxdWVzdCBhcyB0aGlzIG91dGJvdW5kIGlzIG5vdCBsYXp5LWxvYWRlZC4nXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9sb2FkaW5nID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBzZXQgbG9hZGluZyh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fbG9hZGluZyA9IHZhbHVlO1xyXG4gICAgdGhpcy50YXJnZXQubG9hZGluZy5zZXQodGhpcy5tZXRob2QsIHZhbHVlKTtcclxuICB9XHJcbiAgcHVibGljIGdldCBsb2FkaW5nKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2xvYWRpbmc7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgbG9hZGVkTGVuZ3RoKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhPy5sZW5ndGggfHwgMDtcclxuICB9XHJcbiAgcHJpdmF0ZSBfbGVuZ3RoOiBudW1iZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XHJcbiAgcHVibGljIGdldCBsZW5ndGgoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLl9sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlcXVlc3RlZElkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIGxvYWRlZE9ic2VydmFibGU6IE9ic2VydmFibGU8VD4gfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIGxvYWRlZElkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIGxvYWRlZElkRGF0YTogVCB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgbG9hZGVkSWRDaGFuZ2VkOiBPYnNlcnZlcjxUPiB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgcmVxdWVzdEJ5SWQoaWQ6IG51bWJlcik6IFByb21pc2U8YW55PiB7XHJcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5yZXF1ZXN0ZWRJZCA9IGlkO1xyXG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmQoJ3JlcXVlc3QuJyArIHRoaXMubWV0aG9kLCB7IGlkIH0pIGFzIFByb21pc2U8YW55PjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVxdWVzdGVkR3JvdXBJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBsb2FkZWRHcm91cE9ic2VydmFibGU6IE9ic2VydmFibGU8VFtdPiB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgbG9hZGVkR3JvdXBJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBsb2FkZWRHcm91cERhdGE6IFRbXSB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgbG9hZGVkR3JvdXBDaGFuZ2VkOiBPYnNlcnZlcjxUW10+IHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSByZXF1ZXN0Rm9yR3JvdXAoZ3JvdXBJZDogbnVtYmVyKTogUHJvbWlzZTxUW10+IHtcclxuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLnJlcXVlc3RlZEdyb3VwSWQgPSBncm91cElkO1xyXG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlbmQoJ3JlcXVlc3QuJyArIHRoaXMubWV0aG9kLCB7IGdyb3VwSWQgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldERhdGEoZGF0YTogVFtdIHwgeyBhZGRlZDogVFtdIHwgdW5kZWZpbmVkOyBsZW5ndGg6IG51bWJlciB9KSB7XHJcbiAgICB0aGlzLmRhdGEgPSBkYXRhIGFzIFRbXTtcclxuICAgIGlmICh0aGlzLmRhdGEgJiYgdGhpcy5zb3J0QnkpIHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5zb3J0KHRoaXMuc29ydEJ5KTtcclxuICAgIHRoaXMuX2xlbmd0aCA9IGRhdGEubGVuZ3RoO1xyXG4gICAgdGhpcy5kYXRhTWFwID0gbmV3IE1hcCgpO1xyXG4gICAgdGhpcy5kYXRhLmZvckVhY2goKGQpID0+IHtcclxuICAgICAgdGhpcy5kYXRhTWFwLnNldChkLmlkLCBkKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzRW1wdHkoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhID09IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBjb250YWluZWQgZGF0YSBjYW4gYmUgbW9kaWZpZWQgd2l0aGluIHRoZSBjYWxsYmFjayBtZXRob2RcclxuICAgKi9cclxuICBwdWJsaWMgdXBkYXRlKGNhbGxiYWNrOiAoZGF0YTogVFtdKSA9PiB2b2lkKSB7XHJcbiAgICBpZiAodGhpcy5kYXRhKSB7XHJcbiAgICAgIGNvbnN0IHVwZGF0ZUxlbmd0aFZhcmlhYmxlID0gdGhpcy5kYXRhLmxlbmd0aCA9PSB0aGlzLl9sZW5ndGg7XHJcbiAgICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMubGVuZ3RoO1xyXG4gICAgICBjYWxsYmFjayh0aGlzLmRhdGEpO1xyXG4gICAgICB0aGlzLnNldERhdGEodGhpcy5kYXRhKTtcclxuICAgICAgaWYgKCF1cGRhdGVMZW5ndGhWYXJpYWJsZSkge1xyXG4gICAgICAgIHRoaXMuX2xlbmd0aCA9IGxlbmd0aDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZnRlclNlcnZlclJlY29ubmVjdGVkKCkge1xyXG4gICAgaWYgKHRoaXMucmVxdWVzdGVkICYmIHRoaXMubGF6eUxvYWRlZCkge1xyXG4gICAgICB0aGlzLnJlcXVlc3RlZCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmxvYWQoMSkudGhlbigpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubG9hZGVkSWQpIHtcclxuICAgICAgdGhpcy5sb2FkZWRJZERhdGEgPSBudWxsO1xyXG4gICAgICB0aGlzLmdldCh0aGlzLmxvYWRlZElkKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmxvYWRlZEdyb3VwSWQpIHtcclxuICAgICAgdGhpcy5sb2FkZWRHcm91cERhdGEgPSBudWxsO1xyXG4gICAgICB0aGlzLmdldEZvckdyb3VwKHRoaXMubG9hZGVkR3JvdXBJZCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==
@@ -1,7 +0,0 @@
1
- /*
2
- * Public API Surface of active-connect-ng2
3
- */
4
- export * from './lib/active-connect-ng2.module';
5
- export * from './lib/websocket';
6
- export { NgxIndexedDBService } from 'ngx-indexed-db';
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2FjdGl2ZS1jb25uZWN0LW5nMi9zcmMvcHVibGljLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsaUNBQWlDLENBQUM7QUFDaEQsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBhY3RpdmUtY29ubmVjdC1uZzJcclxuICovXHJcblxyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9hY3RpdmUtY29ubmVjdC1uZzIubW9kdWxlJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvd2Vic29ja2V0JztcclxuZXhwb3J0IHsgTmd4SW5kZXhlZERCU2VydmljZSB9IGZyb20gJ25neC1pbmRleGVkLWRiJztcclxuIl19