@resolveio/client-lib-core 15.1.19 → 15.2.1
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.
- package/index.d.ts +0 -3
- package/package.json +1 -1
- package/esm2020/lib/account-manager.service.mjs +0 -222
- package/esm2020/lib/auth/auth-guard.service.mjs +0 -165
- package/esm2020/lib/auth/auth-permissions.service.mjs +0 -24
- package/esm2020/lib/auth/auth.service.mjs +0 -244
- package/esm2020/lib/auth/auth365.component.mjs +0 -44
- package/esm2020/lib/auth/can-deactivate-guard.service.mjs +0 -13
- package/esm2020/lib/auth/enroll.component.mjs +0 -81
- package/esm2020/lib/auth/forgot-password.component.mjs +0 -82
- package/esm2020/lib/core.component.mjs +0 -400
- package/esm2020/lib/core.module.mjs +0 -184
- package/esm2020/lib/core.service.mjs +0 -89
- package/esm2020/lib/directive/focus.mjs +0 -22
- package/esm2020/lib/directive/scroll.mjs +0 -55
- package/esm2020/lib/home/home.component.mjs +0 -77
- package/esm2020/lib/logger/logger.component.mjs +0 -220
- package/esm2020/lib/models/app-status.model.mjs +0 -2
- package/esm2020/lib/models/collection-document.model.mjs +0 -2
- package/esm2020/lib/models/cron-job.model.mjs +0 -2
- package/esm2020/lib/models/dialog.model.mjs +0 -2
- package/esm2020/lib/models/file.model.mjs +0 -2
- package/esm2020/lib/models/log-method-latency.model.mjs +0 -2
- package/esm2020/lib/models/navbar-main-tab.model.mjs +0 -2
- package/esm2020/lib/models/pagination.model.mjs +0 -2
- package/esm2020/lib/models/permission.model.mjs +0 -2
- package/esm2020/lib/models/select-data-label.model.mjs +0 -2
- package/esm2020/lib/models/subscription.model.mjs +0 -2
- package/esm2020/lib/models/support-ticket.model.mjs +0 -2
- package/esm2020/lib/models/user-group.model.mjs +0 -2
- package/esm2020/lib/models/user.model.mjs +0 -2
- package/esm2020/lib/offline-db.mjs +0 -519
- package/esm2020/lib/offline-manager.service.mjs +0 -107
- package/esm2020/lib/pipes/domsanitizor.pipe.mjs +0 -28
- package/esm2020/lib/pipes/filter.pipe.mjs +0 -36
- package/esm2020/lib/pipes/json-parse.pipe.mjs +0 -29
- package/esm2020/lib/pipes/minus-currency.pipe.mjs +0 -16
- package/esm2020/lib/pipes/phone.pipe.mjs +0 -47
- package/esm2020/lib/pipes/pipe.module.mjs +0 -54
- package/esm2020/lib/pipes/reverse-list.pipe.mjs +0 -17
- package/esm2020/lib/pipes/titlecase.pipe.mjs +0 -22
- package/esm2020/lib/report-builder.permission.mjs +0 -13
- package/esm2020/lib/resolveio-class.mjs +0 -41
- package/esm2020/lib/shared/shared.module.mjs +0 -96
- package/esm2020/lib/socket-manager.service.mjs +0 -339
- package/esm2020/lib/socket.service.mjs +0 -215
- package/esm2020/lib/super-admin.permission.mjs +0 -9
- package/esm2020/lib/support-ticket/detail/support-ticket-detail.component.mjs +0 -204
- package/esm2020/lib/support-ticket/edit/support-ticket-edit.component.mjs +0 -122
- package/esm2020/lib/support-ticket/list/support-ticket-list.component.mjs +0 -137
- package/esm2020/lib/support-ticket/new/support-ticket-new.component.mjs +0 -115
- package/esm2020/lib/support-ticket/support-ticket.component.mjs +0 -63
- package/esm2020/lib/support-ticket/support-ticket.module.mjs +0 -50
- package/esm2020/lib/support-ticket/support-ticket.routing.mjs +0 -20
- package/esm2020/lib/support-ticket/support-ticket.service.mjs +0 -17
- package/esm2020/lib/token-manager.service.mjs +0 -26
- package/esm2020/lib/user-settings/settings/users-settings.component.mjs +0 -296
- package/esm2020/lib/user-settings/user-settings.component.mjs +0 -57
- package/esm2020/lib/user-settings/user-settings.module.mjs +0 -41
- package/esm2020/lib/user-settings/user-settings.permission.mjs +0 -10
- package/esm2020/lib/user-settings/user-settings.routing.mjs +0 -14
- package/esm2020/lib/user-settings/user-settings.service.mjs +0 -17
- package/esm2020/lib/util/action-name.helper.mjs +0 -9
- package/esm2020/lib/util/aws.service.mjs +0 -79
- package/esm2020/lib/util/common.helper.mjs +0 -161
- package/esm2020/lib/util/validation.service.mjs +0 -185
- package/esm2020/lib/util/window-resize.service.mjs +0 -24
- package/esm2020/lib/util/window.service.mjs +0 -16
- package/esm2020/lib/widgets/alert/alert.model.mjs +0 -2
- package/esm2020/lib/widgets/alert/alert.service.mjs +0 -78
- package/esm2020/lib/widgets/collapse-table/collapse-table.component.mjs +0 -79
- package/esm2020/lib/widgets/collapse-table/collapse-table.module.mjs +0 -34
- package/esm2020/lib/widgets/data-table/data-table.component.mjs +0 -77
- package/esm2020/lib/widgets/data-table/data-table.model.mjs +0 -2
- package/esm2020/lib/widgets/data-table/data-table.module.mjs +0 -41
- package/esm2020/lib/widgets/date-shortcut/date-shortcut.component.mjs +0 -295
- package/esm2020/lib/widgets/date-shortcut/date-shortcut.module.mjs +0 -32
- package/esm2020/lib/widgets/dialog/dialog.confirm.content.mjs +0 -63
- package/esm2020/lib/widgets/dialog/dialog.error.content.mjs +0 -57
- package/esm2020/lib/widgets/dialog/dialog.input.content.mjs +0 -271
- package/esm2020/lib/widgets/dialog/dialog.login.content.mjs +0 -517
- package/esm2020/lib/widgets/dialog/dialog.notify.content.mjs +0 -57
- package/esm2020/lib/widgets/dialog/dialog.register.content.mjs +0 -328
- package/esm2020/lib/widgets/dialog/dialog.select-array-objs.content.mjs +0 -200
- package/esm2020/lib/widgets/dialog/dialog.select-array.content.mjs +0 -305
- package/esm2020/lib/widgets/dialog/dialog.select-data-labels.content.mjs +0 -191
- package/esm2020/lib/widgets/dialog/dialog.select-datetime.content.mjs +0 -185
- package/esm2020/lib/widgets/dialog/dialog.select-with-buttons-url.content.mjs +0 -162
- package/esm2020/lib/widgets/dialog/dialog.service.mjs +0 -97
- package/esm2020/lib/widgets/file/file-upload.component.mjs +0 -426
- package/esm2020/lib/widgets/file/file-upload.module.mjs +0 -48
- package/esm2020/lib/widgets/form-button/form-button.component.mjs +0 -94
- package/esm2020/lib/widgets/form-button/form-button.module.mjs +0 -28
- package/esm2020/lib/widgets/navbar-main/navbar-main.component.mjs +0 -220
- package/esm2020/lib/widgets/navbar-module/navbar-module.component.mjs +0 -104
- package/esm2020/lib/widgets/navbar-module/navbar-module.model.mjs +0 -2
- package/esm2020/lib/widgets/responsive-button-group/responsive-button-group.component.mjs +0 -38
- package/esm2020/lib/widgets/responsive-button-group/responsive-button-group.module.mjs +0 -24
- package/esm2020/lib/widgets/scheduler/scheduler.component.mjs +0 -184
- package/esm2020/lib/widgets/scheduler/scheduler.module.mjs +0 -37
- package/esm2020/lib/widgets/sort-table/sort-table-header.component.mjs +0 -67
- package/esm2020/lib/widgets/sort-table/sort-table-ngfor.component.mjs +0 -48
- package/esm2020/lib/widgets/sort-table/sort-table.directive.mjs +0 -174
- package/esm2020/lib/widgets/sort-table/sort-table.module.mjs +0 -38
- package/esm2020/lib/widgets/user-role/user-role.component.mjs +0 -27
- package/esm2020/lib/widgets/user-role/user-role.module.mjs +0 -24
- package/esm2020/public_api.mjs +0 -91
- package/esm2020/resolveio-client-lib-core.mjs +0 -5
- package/fesm2015/resolveio-client-lib-core.mjs +0 -9191
- package/fesm2015/resolveio-client-lib-core.mjs.map +0 -1
- package/fesm2020/resolveio-client-lib-core.mjs +0 -9184
- package/fesm2020/resolveio-client-lib-core.mjs.map +0 -1
- package/lib/account-manager.service.d.ts +0 -41
- package/lib/auth/auth-guard.service.d.ts +0 -26
- package/lib/auth/auth-permissions.service.d.ts +0 -10
- package/lib/auth/auth.service.d.ts +0 -30
- package/lib/auth/auth365.component.d.ts +0 -20
- package/lib/auth/can-deactivate-guard.service.d.ts +0 -11
- package/lib/auth/enroll.component.d.ts +0 -28
- package/lib/auth/forgot-password.component.d.ts +0 -28
- package/lib/core.component.d.ts +0 -64
- package/lib/core.module.d.ts +0 -35
- package/lib/core.service.d.ts +0 -49
- package/lib/directive/focus.d.ts +0 -10
- package/lib/directive/scroll.d.ts +0 -20
- package/lib/home/home.component.d.ts +0 -28
- package/lib/logger/logger.component.d.ts +0 -37
- package/lib/models/app-status.model.d.ts +0 -4
- package/lib/models/collection-document.model.d.ts +0 -6
- package/lib/models/cron-job.model.d.ts +0 -13
- package/lib/models/dialog.model.d.ts +0 -23
- package/lib/models/file.model.d.ts +0 -9
- package/lib/models/log-method-latency.model.d.ts +0 -7
- package/lib/models/navbar-main-tab.model.d.ts +0 -14
- package/lib/models/pagination.model.d.ts +0 -17
- package/lib/models/permission.model.d.ts +0 -14
- package/lib/models/select-data-label.model.d.ts +0 -9
- package/lib/models/subscription.model.d.ts +0 -19
- package/lib/models/support-ticket.model.d.ts +0 -71
- package/lib/models/user-group.model.d.ts +0 -20
- package/lib/models/user.model.d.ts +0 -70
- package/lib/offline-db.d.ts +0 -28
- package/lib/offline-manager.service.d.ts +0 -23
- package/lib/pipes/domsanitizor.pipe.d.ts +0 -10
- package/lib/pipes/filter.pipe.d.ts +0 -12
- package/lib/pipes/json-parse.pipe.d.ts +0 -7
- package/lib/pipes/minus-currency.pipe.d.ts +0 -7
- package/lib/pipes/phone.pipe.d.ts +0 -7
- package/lib/pipes/pipe.module.d.ts +0 -13
- package/lib/pipes/reverse-list.pipe.d.ts +0 -6
- package/lib/pipes/titlecase.pipe.d.ts +0 -7
- package/lib/report-builder.permission.d.ts +0 -2
- package/lib/resolveio-class.d.ts +0 -26
- package/lib/shared/shared.module.d.ts +0 -17
- package/lib/socket-manager.service.d.ts +0 -38
- package/lib/socket.service.d.ts +0 -44
- package/lib/super-admin.permission.d.ts +0 -2
- package/lib/support-ticket/detail/support-ticket-detail.component.d.ts +0 -32
- package/lib/support-ticket/edit/support-ticket-edit.component.d.ts +0 -30
- package/lib/support-ticket/list/support-ticket-list.component.d.ts +0 -26
- package/lib/support-ticket/new/support-ticket-new.component.d.ts +0 -26
- package/lib/support-ticket/support-ticket.component.d.ts +0 -20
- package/lib/support-ticket/support-ticket.module.d.ts +0 -15
- package/lib/support-ticket/support-ticket.routing.d.ts +0 -3
- package/lib/support-ticket/support-ticket.service.d.ts +0 -9
- package/lib/token-manager.service.d.ts +0 -11
- package/lib/user-settings/settings/users-settings.component.d.ts +0 -54
- package/lib/user-settings/user-settings.component.d.ts +0 -20
- package/lib/user-settings/user-settings.module.d.ts +0 -12
- package/lib/user-settings/user-settings.permission.d.ts +0 -2
- package/lib/user-settings/user-settings.routing.d.ts +0 -3
- package/lib/user-settings/user-settings.service.d.ts +0 -9
- package/lib/util/action-name.helper.d.ts +0 -1
- package/lib/util/aws.service.d.ts +0 -17
- package/lib/util/common.helper.d.ts +0 -12
- package/lib/util/validation.service.d.ts +0 -88
- package/lib/util/window-resize.service.d.ts +0 -12
- package/lib/util/window.service.d.ts +0 -6
- package/lib/widgets/alert/alert.model.d.ts +0 -1
- package/lib/widgets/alert/alert.service.d.ts +0 -11
- package/lib/widgets/collapse-table/collapse-table.component.d.ts +0 -23
- package/lib/widgets/collapse-table/collapse-table.module.d.ts +0 -9
- package/lib/widgets/data-table/data-table.component.d.ts +0 -23
- package/lib/widgets/data-table/data-table.model.d.ts +0 -13
- package/lib/widgets/data-table/data-table.module.d.ts +0 -12
- package/lib/widgets/date-shortcut/date-shortcut.component.d.ts +0 -24
- package/lib/widgets/date-shortcut/date-shortcut.module.d.ts +0 -10
- package/lib/widgets/dialog/dialog.confirm.content.d.ts +0 -12
- package/lib/widgets/dialog/dialog.error.content.d.ts +0 -11
- package/lib/widgets/dialog/dialog.input.content.d.ts +0 -18
- package/lib/widgets/dialog/dialog.login.content.d.ts +0 -17
- package/lib/widgets/dialog/dialog.notify.content.d.ts +0 -11
- package/lib/widgets/dialog/dialog.register.content.d.ts +0 -13
- package/lib/widgets/dialog/dialog.select-array-objs.content.d.ts +0 -23
- package/lib/widgets/dialog/dialog.select-array.content.d.ts +0 -31
- package/lib/widgets/dialog/dialog.select-data-labels.content.d.ts +0 -22
- package/lib/widgets/dialog/dialog.select-datetime.content.d.ts +0 -21
- package/lib/widgets/dialog/dialog.select-with-buttons-url.content.d.ts +0 -25
- package/lib/widgets/dialog/dialog.service.d.ts +0 -21
- package/lib/widgets/file/file-upload.component.d.ts +0 -49
- package/lib/widgets/file/file-upload.module.d.ts +0 -14
- package/lib/widgets/form-button/form-button.component.d.ts +0 -15
- package/lib/widgets/form-button/form-button.module.d.ts +0 -9
- package/lib/widgets/navbar-main/navbar-main.component.d.ts +0 -53
- package/lib/widgets/navbar-module/navbar-module.component.d.ts +0 -24
- package/lib/widgets/navbar-module/navbar-module.model.d.ts +0 -13
- package/lib/widgets/responsive-button-group/responsive-button-group.component.d.ts +0 -17
- package/lib/widgets/responsive-button-group/responsive-button-group.module.d.ts +0 -8
- package/lib/widgets/scheduler/scheduler.component.d.ts +0 -50
- package/lib/widgets/scheduler/scheduler.module.d.ts +0 -11
- package/lib/widgets/sort-table/sort-table-header.component.d.ts +0 -23
- package/lib/widgets/sort-table/sort-table-ngfor.component.d.ts +0 -17
- package/lib/widgets/sort-table/sort-table.directive.d.ts +0 -48
- package/lib/widgets/sort-table/sort-table.module.d.ts +0 -11
- package/lib/widgets/user-role/user-role.component.d.ts +0 -10
- package/lib/widgets/user-role/user-role.module.d.ts +0 -8
|
@@ -1,339 +0,0 @@
|
|
|
1
|
-
import { SocketService } from './socket.service';
|
|
2
|
-
import { Injectable } from '@angular/core';
|
|
3
|
-
import { Subject } from 'rxjs';
|
|
4
|
-
import { finalize } from 'rxjs/operators';
|
|
5
|
-
import { deepCopy } from './util/common.helper';
|
|
6
|
-
import { OfflineManagerService } from './offline-manager.service';
|
|
7
|
-
import { AlertService } from './widgets/alert/alert.service';
|
|
8
|
-
import { Router } from '@angular/router';
|
|
9
|
-
import { TokenManagerService } from './token-manager.service';
|
|
10
|
-
import * as i0 from "@angular/core";
|
|
11
|
-
import * as i1 from "./socket.service";
|
|
12
|
-
import * as i2 from "./offline-manager.service";
|
|
13
|
-
import * as i3 from "./widgets/alert/alert.service";
|
|
14
|
-
import * as i4 from "@angular/router";
|
|
15
|
-
import * as i5 from "./token-manager.service";
|
|
16
|
-
export class SocketManagerService {
|
|
17
|
-
constructor(_socket, _offline, _alert, _router, _token) {
|
|
18
|
-
this._socket = _socket;
|
|
19
|
-
this._offline = _offline;
|
|
20
|
-
this._alert = _alert;
|
|
21
|
-
this._router = _router;
|
|
22
|
-
this._token = _token;
|
|
23
|
-
this.messageId = 0;
|
|
24
|
-
this._cbArray = [];
|
|
25
|
-
this._subArray = [];
|
|
26
|
-
this._sendQueue = [];
|
|
27
|
-
this._offlineUpdates = [];
|
|
28
|
-
this._runningQueue = false;
|
|
29
|
-
this.initConnection = false;
|
|
30
|
-
this._connectionDelayTimeout = null;
|
|
31
|
-
this.onerror = function () { };
|
|
32
|
-
}
|
|
33
|
-
getSubArray() {
|
|
34
|
-
return this._subArray;
|
|
35
|
-
}
|
|
36
|
-
initSocketManager() {
|
|
37
|
-
this._socket.readyState$.subscribe(socketStatus => {
|
|
38
|
-
this.socketStatus = socketStatus;
|
|
39
|
-
});
|
|
40
|
-
this._socket.onmessage = (event) => {
|
|
41
|
-
this.handleMessage(event);
|
|
42
|
-
};
|
|
43
|
-
this._socket.onopen = (event) => {
|
|
44
|
-
this._connectionDelayTimeout = setTimeout(() => {
|
|
45
|
-
this._connectionDelayTimeout = null;
|
|
46
|
-
this._offline.setOffline(false);
|
|
47
|
-
let collectionUpdates = this._offline.find('collectionUpdate', {});
|
|
48
|
-
collectionUpdates.forEach(update => {
|
|
49
|
-
let messageId = this.messageId++;
|
|
50
|
-
this._offlineUpdates.push({
|
|
51
|
-
id_offline_doc: update._id,
|
|
52
|
-
messageId: messageId,
|
|
53
|
-
type: 'collectionUpdate'
|
|
54
|
-
});
|
|
55
|
-
update.data[2] = messageId;
|
|
56
|
-
if (update.type === 'updateDocument') {
|
|
57
|
-
update.data[4] = 'updateDocumentOffline';
|
|
58
|
-
update.data[0] = 'Offline - ' + update.data[0];
|
|
59
|
-
}
|
|
60
|
-
else if (update.type === 'updateDocumentProps') {
|
|
61
|
-
update.data[4] = 'updateDocumentPropsOffline';
|
|
62
|
-
update.data[0] = 'Offline - ' + update.data[0];
|
|
63
|
-
}
|
|
64
|
-
else {
|
|
65
|
-
update.data[0] = 'Offline - ' + update.data[0];
|
|
66
|
-
}
|
|
67
|
-
});
|
|
68
|
-
if (collectionUpdates.length) {
|
|
69
|
-
this.send('Offline Updates', new Date(), this.messageId++, 'offline', collectionUpdates.sort((a, b) => a.date.getTime() - b.date.getTime()));
|
|
70
|
-
}
|
|
71
|
-
this._subArray.forEach(sub => {
|
|
72
|
-
this.send(sub.messageRoute, new Date(), sub.messageId, 'subscription', 'sub', sub.subscription, ...sub.parameters);
|
|
73
|
-
});
|
|
74
|
-
this.initConnection = true;
|
|
75
|
-
}, 1000);
|
|
76
|
-
};
|
|
77
|
-
this._socket.onerror = (ev) => {
|
|
78
|
-
if (this._connectionDelayTimeout) {
|
|
79
|
-
clearTimeout(this._connectionDelayTimeout);
|
|
80
|
-
}
|
|
81
|
-
console.log(new Date(), 'SOCKET ERROR', ev);
|
|
82
|
-
this.onerror();
|
|
83
|
-
};
|
|
84
|
-
this._socket.onclose = (ev) => {
|
|
85
|
-
if (this._connectionDelayTimeout) {
|
|
86
|
-
clearTimeout(this._connectionDelayTimeout);
|
|
87
|
-
}
|
|
88
|
-
};
|
|
89
|
-
setInterval(() => {
|
|
90
|
-
if (this.initConnection) {
|
|
91
|
-
if (!this._runningQueue) {
|
|
92
|
-
if (this._sendQueue.length) {
|
|
93
|
-
this._runningQueue = true;
|
|
94
|
-
if (this._socket && this._socket.ws) {
|
|
95
|
-
let nextSendItem = this._sendQueue[this._sendQueue.length - 1];
|
|
96
|
-
let sendStatus = this._socket.send(...nextSendItem);
|
|
97
|
-
if (sendStatus) {
|
|
98
|
-
this._sendQueue.pop();
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
this._runningQueue = false;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
}, 25);
|
|
106
|
-
}
|
|
107
|
-
handleMessage(resData) {
|
|
108
|
-
if (resData.data === 'reloadWSCommand') {
|
|
109
|
-
window.location.href = window.location.href + '?forceReload=true';
|
|
110
|
-
}
|
|
111
|
-
else if (resData.data === 'reconnectWSCommand') {
|
|
112
|
-
this._socket.reconnect();
|
|
113
|
-
}
|
|
114
|
-
else if (resData.data === 'disconnectWSCommand') {
|
|
115
|
-
this.closeSocket();
|
|
116
|
-
}
|
|
117
|
-
let offlineIndex = this._offlineUpdates.findIndex(a => a.messageId === resData.messageId);
|
|
118
|
-
if (offlineIndex >= 0) {
|
|
119
|
-
this._offline.removeDocument(this._offlineUpdates[offlineIndex].type, this._offlineUpdates[offlineIndex].id_offline_doc);
|
|
120
|
-
this._offlineUpdates.splice(offlineIndex, 1);
|
|
121
|
-
}
|
|
122
|
-
if (resData.data !== 'ACK' && resData.data !== 'NACK') {
|
|
123
|
-
if (this._cbArray.map(a => a.messageId).includes(resData.messageId)) {
|
|
124
|
-
let index = this._cbArray.findIndex(a => a.messageId === resData.messageId);
|
|
125
|
-
if (index >= 0) {
|
|
126
|
-
clearInterval(this._cbArray[index].timerId);
|
|
127
|
-
if (this._cbArray[index].cb) {
|
|
128
|
-
this._cbArray[index].cb(resData.hasError ? resData.data : null, resData.hasError ? null : resData.data);
|
|
129
|
-
this._cbArray[index].resolveFn(resData.hasError ? resData.data : null);
|
|
130
|
-
}
|
|
131
|
-
else {
|
|
132
|
-
if (resData.hasError) {
|
|
133
|
-
this._cbArray[index].rejectFn(resData.data);
|
|
134
|
-
}
|
|
135
|
-
else {
|
|
136
|
-
this._cbArray[index].resolveFn(resData.data);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
this._cbArray.splice(index, 1);
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
else if (this._subArray.map(a => a.messageId).includes(resData.messageId)) {
|
|
143
|
-
let index = this._subArray.findIndex(a => a.messageId === resData.messageId);
|
|
144
|
-
if (index >= 0) {
|
|
145
|
-
this._subArray[index].subject.next(resData.data);
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
openSocket(environment, protocols) {
|
|
151
|
-
this._socket.openSocket(environment, protocols);
|
|
152
|
-
}
|
|
153
|
-
closeSocket() {
|
|
154
|
-
this._token.removeToken('accessToken');
|
|
155
|
-
this._socket.close();
|
|
156
|
-
}
|
|
157
|
-
call(method, ...parameters) {
|
|
158
|
-
let resolveFn = null;
|
|
159
|
-
let rejectFn = null;
|
|
160
|
-
let promise = new Promise((resolve, reject) => {
|
|
161
|
-
resolveFn = resolve;
|
|
162
|
-
rejectFn = reject;
|
|
163
|
-
});
|
|
164
|
-
let messageId = this.messageId++;
|
|
165
|
-
let timerId = setInterval(() => {
|
|
166
|
-
if (this._cbArray.filter(a => a.messageId === messageId)[0]) {
|
|
167
|
-
this.send((this._router.url.includes('?') ? this._router.url.substring(0, this._router.url.indexOf('?')) : this._router.url), new Date(), messageId, 'methodResponse', method, ...parameters);
|
|
168
|
-
}
|
|
169
|
-
else {
|
|
170
|
-
clearInterval(timerId);
|
|
171
|
-
}
|
|
172
|
-
}, 5000);
|
|
173
|
-
if (parameters[parameters.length - 1] && typeof (parameters[parameters.length - 1]) === 'function') {
|
|
174
|
-
this._cbArray.push({
|
|
175
|
-
messageId: messageId,
|
|
176
|
-
cb: parameters.pop(),
|
|
177
|
-
resolveFn: resolveFn,
|
|
178
|
-
rejectFn: rejectFn,
|
|
179
|
-
timerId: timerId,
|
|
180
|
-
retryCnt: 0
|
|
181
|
-
});
|
|
182
|
-
}
|
|
183
|
-
else {
|
|
184
|
-
this._cbArray.push({
|
|
185
|
-
messageId: messageId,
|
|
186
|
-
cb: null,
|
|
187
|
-
resolveFn: resolveFn,
|
|
188
|
-
rejectFn: rejectFn,
|
|
189
|
-
timerId: timerId,
|
|
190
|
-
retryCnt: 0
|
|
191
|
-
});
|
|
192
|
-
}
|
|
193
|
-
let cnt = parameters.length;
|
|
194
|
-
while ((parameters[parameters.length - 1] === undefined || parameters[parameters.length - 1] === null) && cnt > 0) {
|
|
195
|
-
parameters.pop();
|
|
196
|
-
cnt = parameters.length;
|
|
197
|
-
}
|
|
198
|
-
this.send((this._router.url.includes('?') ? this._router.url.substring(0, this._router.url.indexOf('?')) : this._router.url), new Date(), messageId, 'method', method, ...parameters);
|
|
199
|
-
return promise;
|
|
200
|
-
}
|
|
201
|
-
subscribe(subscription, ...parameters) {
|
|
202
|
-
const copyParameters = deepCopy(parameters);
|
|
203
|
-
const newSubject = new Subject();
|
|
204
|
-
let messageId = this.messageId++;
|
|
205
|
-
this._subArray.push({
|
|
206
|
-
messageId: messageId,
|
|
207
|
-
messageRoute: (this._router.url.includes('?') ? this._router.url.substring(0, this._router.url.indexOf('?')) : this._router.url),
|
|
208
|
-
subscription: subscription,
|
|
209
|
-
parameters: copyParameters,
|
|
210
|
-
subject: newSubject
|
|
211
|
-
});
|
|
212
|
-
const observable = newSubject.pipe(finalize(() => {
|
|
213
|
-
this.unsubscribe(messageId, subscription, ...copyParameters);
|
|
214
|
-
this._subArray.splice(this._subArray.map(a => a.messageId).indexOf(messageId), 1);
|
|
215
|
-
}));
|
|
216
|
-
this.send((this._router.url.includes('?') ? this._router.url.substring(0, this._router.url.indexOf('?')) : this._router.url), new Date(), messageId, 'subscription', 'sub', subscription, ...copyParameters);
|
|
217
|
-
return observable;
|
|
218
|
-
}
|
|
219
|
-
subscribeBypassRoute(subscription, ...parameters) {
|
|
220
|
-
const copyParameters = deepCopy(parameters);
|
|
221
|
-
const newSubject = new Subject();
|
|
222
|
-
let messageId = this.messageId++;
|
|
223
|
-
this._subArray.push({
|
|
224
|
-
messageId: messageId,
|
|
225
|
-
messageRoute: 'Bypass',
|
|
226
|
-
subscription: subscription,
|
|
227
|
-
parameters: copyParameters,
|
|
228
|
-
subject: newSubject
|
|
229
|
-
});
|
|
230
|
-
const observable = newSubject.pipe(finalize(() => {
|
|
231
|
-
this.unsubscribe(messageId, subscription, ...copyParameters);
|
|
232
|
-
this._subArray.splice(this._subArray.map(a => a.messageId).indexOf(messageId), 1);
|
|
233
|
-
}));
|
|
234
|
-
this.send('Bypass', new Date(), messageId, 'subscription', 'sub', subscription, ...copyParameters);
|
|
235
|
-
return observable;
|
|
236
|
-
}
|
|
237
|
-
unsubscribe(messageId, subscription, ...parameters) {
|
|
238
|
-
this.send((this._router.url.includes('?') ? this._router.url.substring(0, this._router.url.indexOf('?')) : this._router.url), new Date(), messageId, 'subscription', 'unsub', subscription, ...parameters);
|
|
239
|
-
}
|
|
240
|
-
send(...data) {
|
|
241
|
-
if (data[3] === 'subscription') {
|
|
242
|
-
this._socket.send(...data);
|
|
243
|
-
}
|
|
244
|
-
else if (data[3] === 'method') {
|
|
245
|
-
if (this.socketStatus === WebSocket.OPEN) {
|
|
246
|
-
if (!this._sendQueue.filter(a => JSON.stringify(a) === JSON.stringify(data)).length) {
|
|
247
|
-
this._sendQueue.splice(0, 0, data);
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
else {
|
|
251
|
-
if (data[4] === 'insertDocument') {
|
|
252
|
-
if (data[5] !== 'driver-gps') {
|
|
253
|
-
this._alert.setAlert('warning', 'This insert command has not taken place on the server yet because you are offline. It will automatically sync up next time you are online as long as you do not clear your cache!');
|
|
254
|
-
}
|
|
255
|
-
this._offline.insertDocument('collectionUpdate', {
|
|
256
|
-
type: 'insert',
|
|
257
|
-
data: data,
|
|
258
|
-
date: new Date()
|
|
259
|
-
});
|
|
260
|
-
let res = this._offline.insertDocument(data[5], data[6]);
|
|
261
|
-
let cb = this._cbArray.filter(a => a.messageId === data[2])[0];
|
|
262
|
-
if (cb && cb.cb) {
|
|
263
|
-
cb.cb(null, res);
|
|
264
|
-
this._cbArray.splice(this._cbArray.findIndex(a => a.messageId === data[2]), 1);
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
else if (data[4] === 'updateDocument') {
|
|
268
|
-
this._alert.setAlert('warning', 'This update command has not taken place on the server yet because you are offline. It will automatically sync up next time you are online as long as you do not clear your cache!');
|
|
269
|
-
this._offline.insertDocument('collectionUpdate', {
|
|
270
|
-
type: 'updateDocument',
|
|
271
|
-
data: data,
|
|
272
|
-
date: new Date()
|
|
273
|
-
});
|
|
274
|
-
if (this._offline.findOne(data[5], { _id: data[6]._id })) {
|
|
275
|
-
this._offline.updateDocument(data[5], data[6]);
|
|
276
|
-
}
|
|
277
|
-
else {
|
|
278
|
-
console.log('Could not find Offline data', data[5], data[6]);
|
|
279
|
-
}
|
|
280
|
-
let cb = this._cbArray.filter(a => a.messageId === data[2])[0];
|
|
281
|
-
if (cb && cb.cb) {
|
|
282
|
-
cb.cb(null, 1);
|
|
283
|
-
this._cbArray.splice(this._cbArray.findIndex(a => a.messageId === data[2]), 1);
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
else if (data[4] === 'updateDocumentProps') {
|
|
287
|
-
this._alert.setAlert('warning', 'This update command has not taken place on the server yet because you are offline. It will automatically sync up next time you are online as long as you do not clear your cache!');
|
|
288
|
-
this._offline.insertDocument('collectionUpdate', {
|
|
289
|
-
type: 'updateDocumentProps',
|
|
290
|
-
data: data,
|
|
291
|
-
date: new Date()
|
|
292
|
-
});
|
|
293
|
-
if (this._offline.findOne(data[5], { _id: data[6] })) {
|
|
294
|
-
this._offline.updateDocumentProps(data[5], data[6], data[7], data[8]);
|
|
295
|
-
}
|
|
296
|
-
else {
|
|
297
|
-
console.log('Could not find Offline data', data[5], data[6]);
|
|
298
|
-
}
|
|
299
|
-
let cb = this._cbArray.filter(a => a.messageId === data[2])[0];
|
|
300
|
-
if (cb && cb.cb) {
|
|
301
|
-
cb.cb(null, 1);
|
|
302
|
-
this._cbArray.splice(this._cbArray.findIndex(a => a.messageId === data[2]), 1);
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
else if (data[4] === 'removeDocument') {
|
|
306
|
-
this._alert.setAlert('warning', 'This remove command has not taken place on the server yet because you are offline. It will automatically sync up next time you are online as long as you do not clear your cache!');
|
|
307
|
-
this._offline.insertDocument('collectionUpdate', {
|
|
308
|
-
type: 'removeDocument',
|
|
309
|
-
data: data,
|
|
310
|
-
date: new Date()
|
|
311
|
-
});
|
|
312
|
-
if (this._offline.findOne(data[5], { _id: data[6] })) {
|
|
313
|
-
this._offline.removeDocument(data[5], data[6]);
|
|
314
|
-
}
|
|
315
|
-
else {
|
|
316
|
-
console.log('Could not find Offline data', data[5], data[6]);
|
|
317
|
-
}
|
|
318
|
-
let cb = this._cbArray.filter(a => a.messageId === data[2])[0];
|
|
319
|
-
if (cb && cb.cb) {
|
|
320
|
-
cb.cb(null, 1);
|
|
321
|
-
this._cbArray.splice(this._cbArray.findIndex(a => a.messageId === data[2]), 1);
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
else if (data[3] === 'offline') {
|
|
327
|
-
this._socket.send(...data);
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
getStatus() {
|
|
331
|
-
return this._socket.readyState$;
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
SocketManagerService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: SocketManagerService, deps: [{ token: i1.SocketService }, { token: i2.OfflineManagerService }, { token: i3.AlertService }, { token: i4.Router }, { token: i5.TokenManagerService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
335
|
-
SocketManagerService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: SocketManagerService });
|
|
336
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: SocketManagerService, decorators: [{
|
|
337
|
-
type: Injectable
|
|
338
|
-
}], ctorParameters: function () { return [{ type: i1.SocketService }, { type: i2.OfflineManagerService }, { type: i3.AlertService }, { type: i4.Router }, { type: i5.TokenManagerService }]; } });
|
|
339
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ja2V0LW1hbmFnZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL2xpYi9zb2NrZXQtbWFuYWdlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTFDLE9BQU8sRUFBZSxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDN0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDOzs7Ozs7O0FBRzlELE1BQU0sT0FBTyxvQkFBb0I7SUFnQmhDLFlBQW9CLE9BQXNCLEVBQVUsUUFBK0IsRUFBVSxNQUFvQixFQUFVLE9BQWUsRUFBVSxNQUEyQjtRQUEzSixZQUFPLEdBQVAsT0FBTyxDQUFlO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBdUI7UUFBVSxXQUFNLEdBQU4sTUFBTSxDQUFjO1FBQVUsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQUFVLFdBQU0sR0FBTixNQUFNLENBQXFCO1FBYnZLLGNBQVMsR0FBRyxDQUFDLENBQUM7UUFDZCxhQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ2QsY0FBUyxHQUFvQyxFQUFFLENBQUM7UUFDaEQsZUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNoQixvQkFBZSxHQUFHLEVBQUUsQ0FBQztRQUVy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SUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUM3RDtvQkFFRCxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQy9ELElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUU7d0JBQ2hCLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUNmLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztxQkFDL0U7aUJBQ0Q7YUFDRDtTQUNEO2FBQ0ksSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxFQUFFO1lBQy9CLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7U0FDM0I7SUFDRixDQUFDO0lBRUQsU0FBUztRQUNSLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7SUFDakMsQ0FBQzs7a0hBelhXLG9CQUFvQjtzSEFBcEIsb0JBQW9COzRGQUFwQixvQkFBb0I7a0JBRGhDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTb2NrZXRTZXJ2aWNlIH0gZnJvbSAnLi9zb2NrZXQuc2VydmljZSc7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaW5hbGl6ZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEFjdGl2ZUNsaWVudFN1YnNjcmlwdGlvbk1vZGVsIH0gZnJvbSAnLi9tb2RlbHMvc3Vic2NyaXB0aW9uLm1vZGVsJztcbmltcG9ydCB7IGRhdGVSZXZpdmVyLCBkZWVwQ29weSB9IGZyb20gJy4vdXRpbC9jb21tb24uaGVscGVyJztcbmltcG9ydCB7IE9mZmxpbmVNYW5hZ2VyU2VydmljZSB9IGZyb20gJy4vb2ZmbGluZS1tYW5hZ2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWxlcnRTZXJ2aWNlIH0gZnJvbSAnLi93aWRnZXRzL2FsZXJ0L2FsZXJ0LnNlcnZpY2UnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IFRva2VuTWFuYWdlclNlcnZpY2UgfSBmcm9tICcuL3Rva2VuLW1hbmFnZXIuc2VydmljZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTb2NrZXRNYW5hZ2VyU2VydmljZSB7XG5cdHByaXZhdGUgc29ja2V0U3RhdHVzO1xuXG5cdHByaXZhdGUgbWVzc2FnZUlkID0gMDtcblx0cHJpdmF0ZSBfY2JBcnJheSA9IFtdO1xuXHRwcml2YXRlIF9zdWJBcnJheTogQWN0aXZlQ2xpZW50U3Vic2NyaXB0aW9uTW9kZWxbXSA9IFtdO1xuXHRwcml2YXRlIF9zZW5kUXVldWUgPSBbXTtcblx0cHJpdmF0ZSBfb2ZmbGluZVVwZGF0ZXMgPSBbXTtcblxuXHRwcml2YXRlIF9ydW5uaW5nUXVldWUgPSBmYWxzZTtcblx0cHJpdmF0ZSBpbml0Q29ubmVjdGlvbiA9IGZhbHNlO1xuXG5cdHByaXZhdGUgX2Nvbm5lY3Rpb25EZWxheVRpbWVvdXQgPSBudWxsO1xuXG5cdHB1YmxpYyBvbmVycm9yOiAoKSA9PiB2b2lkID0gZnVuY3Rpb24gKCkge307XG5cblx0Y29uc3RydWN0b3IocHJpdmF0ZSBfc29ja2V0OiBTb2NrZXRTZXJ2aWNlLCBwcml2YXRlIF9vZmZsaW5lOiBPZmZsaW5lTWFuYWdlclNlcnZpY2UsIHByaXZhdGUgX2FsZXJ0OiBBbGVydFNlcnZpY2UsIHByaXZhdGUgX3JvdXRlcjogUm91dGVyLCBwcml2YXRlIF90b2tlbjogVG9rZW5NYW5hZ2VyU2VydmljZSkge31cblxuXHRwdWJsaWMgZ2V0U3ViQXJyYXkoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX3N1YkFycmF5O1xuXHR9XG5cblx0cHVibGljIGluaXRTb2NrZXRNYW5hZ2VyKCk6IHZvaWQge1xuXHRcdHRoaXMuX3NvY2tldC5yZWFkeVN0YXRlJC5zdWJzY3JpYmUoc29ja2V0U3RhdHVzID0+IHtcblx0XHRcdHRoaXMuc29ja2V0U3RhdHVzID0gc29ja2V0U3RhdHVzO1xuXHRcdH0pO1xuXG5cdFx0dGhpcy5fc29ja2V0Lm9ubWVzc2FnZSA9IChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7XG5cdFx0XHR0aGlzLmhhbmRsZU1lc3NhZ2UoZXZlbnQpO1xuXHRcdH07XG5cblx0XHR0aGlzLl9zb2NrZXQub25vcGVuID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuXHRcdFx0dGhpcy5fY29ubmVjdGlvbkRlbGF5VGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHR0aGlzLl9jb25uZWN0aW9uRGVsYXlUaW1lb3V0ID0gbnVsbDtcblxuXHRcdFx0XHR0aGlzLl9vZmZsaW5lLnNldE9mZmxpbmUoZmFsc2UpO1xuXHRcdFx0XHRcblx0XHRcdFx0bGV0IGNvbGxlY3Rpb25VcGRhdGVzID0gdGhpcy5fb2ZmbGluZS5maW5kKCdjb2xsZWN0aW9uVXBkYXRlJywge30pO1xuXG5cdFx0XHRcdGNvbGxlY3Rpb25VcGRhdGVzLmZvckVhY2godXBkYXRlID0+IHtcblx0XHRcdFx0XHRsZXQgbWVzc2FnZUlkID0gdGhpcy5tZXNzYWdlSWQrKztcblxuXHRcdFx0XHRcdHRoaXMuX29mZmxpbmVVcGRhdGVzLnB1c2goe1xuXHRcdFx0XHRcdFx0aWRfb2ZmbGluZV9kb2M6IHVwZGF0ZS5faWQsXG5cdFx0XHRcdFx0XHRtZXNzYWdlSWQ6IG1lc3NhZ2VJZCxcblx0XHRcdFx0XHRcdHR5cGU6ICdjb2xsZWN0aW9uVXBkYXRlJ1xuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0dXBkYXRlLmRhdGFbMl0gPSBtZXNzYWdlSWQ7XG5cblx0XHRcdFx0XHRpZiAodXBkYXRlLnR5cGUgPT09ICd1cGRhdGVEb2N1bWVudCcpIHtcblx0XHRcdFx0XHRcdHVwZGF0ZS5kYXRhWzRdID0gJ3VwZGF0ZURvY3VtZW50T2ZmbGluZSc7XG5cdFx0XHRcdFx0XHR1cGRhdGUuZGF0YVswXSA9ICdPZmZsaW5lIC0gJyArIHVwZGF0ZS5kYXRhWzBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRlbHNlIGlmICh1cGRhdGUudHlwZSA9PT0gJ3VwZGF0ZURvY3VtZW50UHJvcHMnKSB7XG5cdFx0XHRcdFx0XHR1cGRhdGUuZGF0YVs0XSA9ICd1cGRhdGVEb2N1bWVudFByb3BzT2ZmbGluZSc7XG5cdFx0XHRcdFx0XHR1cGRhdGUuZGF0YVswXSA9ICdPZmZsaW5lIC0gJyArIHVwZGF0ZS5kYXRhWzBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRcdHVwZGF0ZS5kYXRhWzBdID0gJ09mZmxpbmUgLSAnICsgdXBkYXRlLmRhdGFbMF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRpZiAoY29sbGVjdGlvblVwZGF0ZXMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0dGhpcy5zZW5kKCdPZmZsaW5lIFVwZGF0ZXMnLCBuZXcgRGF0ZSgpLCB0aGlzLm1lc3NhZ2VJZCsrLCAnb2ZmbGluZScsIGNvbGxlY3Rpb25VcGRhdGVzLnNvcnQoKGEsIGIpID0+IGEuZGF0ZS5nZXRUaW1lKCkgLSBiLmRhdGUuZ2V0VGltZSgpKSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLl9zdWJBcnJheS5mb3JFYWNoKHN1YiA9PiB7XG5cdFx0XHRcdFx0dGhpcy5zZW5kKHN1Yi5tZXNzYWdlUm91dGUsIG5ldyBEYXRlKCksIHN1Yi5tZXNzYWdlSWQsICdzdWJzY3JpcHRpb24nLCAnc3ViJywgc3ViLnN1YnNjcmlwdGlvbiwgLi4uc3ViLnBhcmFtZXRlcnMpO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHR0aGlzLmluaXRDb25uZWN0aW9uID0gdHJ1ZTtcblx0XHRcdH0sIDEwMDApO1xuXHRcdH07XG5cblx0XHR0aGlzLl9zb2NrZXQub25lcnJvciA9IChldjogRXJyb3JFdmVudCkgPT4ge1xuXHRcdFx0aWYgKHRoaXMuX2Nvbm5lY3Rpb25EZWxheVRpbWVvdXQpIHtcblx0XHRcdFx0Y2xlYXJUaW1lb3V0KHRoaXMuX2Nvbm5lY3Rpb25EZWxheVRpbWVvdXQpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc29sZS5sb2cobmV3IERhdGUoKSwgJ1NPQ0tFVCBFUlJPUicsIGV2KTtcblx0XHRcdHRoaXMub25lcnJvcigpO1xuXHRcdH07XG5cblx0XHR0aGlzLl9zb2NrZXQub25jbG9zZSA9IChldjogQ2xvc2VFdmVudCkgPT4ge1xuXHRcdFx0aWYgKHRoaXMuX2Nvbm5lY3Rpb25EZWxheVRpbWVvdXQpIHtcblx0XHRcdFx0Y2xlYXJUaW1lb3V0KHRoaXMuX2Nvbm5lY3Rpb25EZWxheVRpbWVvdXQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHNldEludGVydmFsKCgpID0+IHtcblx0XHRcdGlmICh0aGlzLmluaXRDb25uZWN0aW9uKSB7XG5cdFx0XHRcdGlmICghdGhpcy5fcnVubmluZ1F1ZXVlKSB7XG5cdFx0XHRcdFx0aWYgKHRoaXMuX3NlbmRRdWV1ZS5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdHRoaXMuX3J1bm5pbmdRdWV1ZSA9IHRydWU7XG5cdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdGlmICh0aGlzLl9zb2NrZXQgJiYgdGhpcy5fc29ja2V0LndzKSB7XHRcdFx0XHRcdFx0XHRcdFxuXHRcdFx0XHRcdFx0XHRsZXQgbmV4dFNlbmRJdGVtID0gdGhpcy5fc2VuZFF1ZXVlW3RoaXMuX3NlbmRRdWV1ZS5sZW5ndGggLSAxXTtcblx0XHRcdFx0XHRcdFx0bGV0IHNlbmRTdGF0dXMgPSB0aGlzLl9zb2NrZXQuc2VuZCguLi5uZXh0U2VuZEl0ZW0pO1xuXG5cdFx0XHRcdFx0XHRcdGlmIChzZW5kU3RhdHVzKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5fc2VuZFF1ZXVlLnBvcCgpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHRoaXMuX3J1bm5pbmdRdWV1ZSA9IGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sIDI1KTtcblx0fVxuXG5cdGhhbmRsZU1lc3NhZ2UocmVzRGF0YTogYW55KSB7XG5cdFx0aWYgKHJlc0RhdGEuZGF0YSA9PT0gJ3JlbG9hZFdTQ29tbWFuZCcpIHtcblx0XHRcdHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gd2luZG93LmxvY2F0aW9uLmhyZWYgKyAnP2ZvcmNlUmVsb2FkPXRydWUnO1xuXHRcdH1cblx0XHRlbHNlIGlmIChyZXNEYXRhLmRhdGEgPT09ICdyZWNvbm5lY3RXU0NvbW1hbmQnKSB7XG5cdFx0XHR0aGlzLl9zb2NrZXQucmVjb25uZWN0KCk7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKHJlc0RhdGEuZGF0YSA9PT0gJ2Rpc2Nvbm5lY3RXU0NvbW1hbmQnKSB7XG5cdFx0XHR0aGlzLmNsb3NlU29ja2V0KCk7XG5cdFx0fVxuXG5cdFx0bGV0IG9mZmxpbmVJbmRleCA9IHRoaXMuX29mZmxpbmVVcGRhdGVzLmZpbmRJbmRleChhID0+IGEubWVzc2FnZUlkID09PSByZXNEYXRhLm1lc3NhZ2VJZCk7XG5cdFx0aWYgKG9mZmxpbmVJbmRleCA+PSAwKSB7XG5cdFx0XHR0aGlzLl9vZmZsaW5lLnJlbW92ZURvY3VtZW50KHRoaXMuX29mZmxpbmVVcGRhdGVzW29mZmxpbmVJbmRleF0udHlwZSwgdGhpcy5fb2ZmbGluZVVwZGF0ZXNbb2ZmbGluZUluZGV4XS5pZF9vZmZsaW5lX2RvYyk7XG5cdFx0XHR0aGlzLl9vZmZsaW5lVXBkYXRlcy5zcGxpY2Uob2ZmbGluZUluZGV4LCAxKTtcblx0XHR9XG5cblx0XHRpZiAocmVzRGF0YS5kYXRhICE9PSAnQUNLJyAmJiByZXNEYXRhLmRhdGEgIT09ICdOQUNLJykge1xuXHRcdFx0aWYgKHRoaXMuX2NiQXJyYXkubWFwKGEgPT4gYS5tZXNzYWdlSWQpLmluY2x1ZGVzKHJlc0RhdGEubWVzc2FnZUlkKSkge1x0XG5cdFx0XHRcdGxldCBpbmRleCA9IHRoaXMuX2NiQXJyYXkuZmluZEluZGV4KGEgPT4gYS5tZXNzYWdlSWQgPT09IHJlc0RhdGEubWVzc2FnZUlkKTtcblx0XHRcdFx0XG5cdFx0XHRcdGlmIChpbmRleCA+PSAwKSB7XG5cdFx0XHRcdFx0Y2xlYXJJbnRlcnZhbCh0aGlzLl9jYkFycmF5W2luZGV4XS50aW1lcklkKTtcblxuXHRcdFx0XHRcdGlmICh0aGlzLl9jYkFycmF5W2luZGV4XS5jYikge1xuXHRcdFx0XHRcdFx0dGhpcy5fY2JBcnJheVtpbmRleF0uY2IocmVzRGF0YS5oYXNFcnJvciA/IHJlc0RhdGEuZGF0YSA6IG51bGwsIHJlc0RhdGEuaGFzRXJyb3IgPyBudWxsIDogcmVzRGF0YS5kYXRhKTtcblx0XHRcdFx0XHRcdHRoaXMuX2NiQXJyYXlbaW5kZXhdLnJlc29sdmVGbihyZXNEYXRhLmhhc0Vycm9yID8gcmVzRGF0YS5kYXRhIDogbnVsbCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0aWYgKHJlc0RhdGEuaGFzRXJyb3IpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5fY2JBcnJheVtpbmRleF0ucmVqZWN0Rm4ocmVzRGF0YS5kYXRhKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0XHR0aGlzLl9jYkFycmF5W2luZGV4XS5yZXNvbHZlRm4ocmVzRGF0YS5kYXRhKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XG5cdFx0XHRcdFx0dGhpcy5fY2JBcnJheS5zcGxpY2UoaW5kZXgsIDEpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmICh0aGlzLl9zdWJBcnJheS5tYXAoYSA9PiBhLm1lc3NhZ2VJZCkuaW5jbHVkZXMocmVzRGF0YS5tZXNzYWdlSWQpKSB7XHRcblx0XHRcdFx0bGV0IGluZGV4ID0gdGhpcy5fc3ViQXJyYXkuZmluZEluZGV4KGEgPT4gYS5tZXNzYWdlSWQgPT09IHJlc0RhdGEubWVzc2FnZUlkKTtcblx0XHRcdFx0XG5cdFx0XHRcdGlmIChpbmRleCA+PSAwKSB7XG5cdFx0XHRcdFx0dGhpcy5fc3ViQXJyYXlbaW5kZXhdLnN1YmplY3QubmV4dChyZXNEYXRhLmRhdGEpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIG9wZW5Tb2NrZXQoZW52aXJvbm1lbnQsIHByb3RvY29scykge1xuXHRcdHRoaXMuX3NvY2tldC5vcGVuU29ja2V0KGVudmlyb25tZW50LCBwcm90b2NvbHMpO1xuXHR9XG5cblx0cHVibGljIGNsb3NlU29ja2V0KCkge1xuXHRcdHRoaXMuX3Rva2VuLnJlbW92ZVRva2VuKCdhY2Nlc3NUb2tlbicpO1xuXHRcdHRoaXMuX3NvY2tldC5jbG9zZSgpO1xuXHR9XG5cblx0cHVibGljIGNhbGwobWV0aG9kOiBzdHJpbmcsIC4uLnBhcmFtZXRlcnM6IGFueVtdKSB7XG5cdFx0bGV0IHJlc29sdmVGbiA9IG51bGw7XG5cdFx0bGV0IHJlamVjdEZuID0gbnVsbDtcblxuXHRcdGxldCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0cmVzb2x2ZUZuID0gcmVzb2x2ZTtcblx0XHRcdHJlamVjdEZuID0gcmVqZWN0O1xuXHRcdH0pO1xuXG5cdFx0bGV0IG1lc3NhZ2VJZCA9IHRoaXMubWVzc2FnZUlkKys7XG5cblx0XHRsZXQgdGltZXJJZCA9IHNldEludGVydmFsKCgpID0+IHtcblx0XHRcdGlmICh0aGlzLl9jYkFycmF5LmZpbHRlcihhID0+IGEubWVzc2FnZUlkID09PSBtZXNzYWdlSWQpWzBdKSB7XG5cdFx0XHRcdHRoaXMuc2VuZCgodGhpcy5fcm91dGVyLnVybC5pbmNsdWRlcygnPycpID8gdGhpcy5fcm91dGVyLnVybC5zdWJzdHJpbmcoMCwgdGhpcy5fcm91dGVyLnVybC5pbmRleE9mKCc/JykpIDogdGhpcy5fcm91dGVyLnVybCksIG5ldyBEYXRlKCksIG1lc3NhZ2VJZCwgJ21ldGhvZFJlc3BvbnNlJywgbWV0aG9kLCAuLi5wYXJhbWV0ZXJzKTtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRjbGVhckludGVydmFsKHRpbWVySWQpO1xuXHRcdFx0fVxuXHRcdH0sIDUwMDApO1xuXG5cdFx0aWYgKHBhcmFtZXRlcnNbcGFyYW1ldGVycy5sZW5ndGggLSAxXSAmJiB0eXBlb2YocGFyYW1ldGVyc1twYXJhbWV0ZXJzLmxlbmd0aCAtIDFdKSA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0dGhpcy5fY2JBcnJheS5wdXNoKHtcblx0XHRcdFx0bWVzc2FnZUlkOiBtZXNzYWdlSWQsXG5cdFx0XHRcdGNiOiBwYXJhbWV0ZXJzLnBvcCgpLFxuXHRcdFx0XHRyZXNvbHZlRm46IHJlc29sdmVGbixcblx0XHRcdFx0cmVqZWN0Rm46IHJlamVjdEZuLFxuXHRcdFx0XHR0aW1lcklkOiB0aW1lcklkLFxuXHRcdFx0XHRyZXRyeUNudDogMFxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0dGhpcy5fY2JBcnJheS5wdXNoKHtcblx0XHRcdFx0bWVzc2FnZUlkOiBtZXNzYWdlSWQsXG5cdFx0XHRcdGNiOiBudWxsLFxuXHRcdFx0XHRyZXNvbHZlRm46IHJlc29sdmVGbixcblx0XHRcdFx0cmVqZWN0Rm46IHJlamVjdEZuLFxuXHRcdFx0XHR0aW1lcklkOiB0aW1lcklkLFxuXHRcdFx0XHRyZXRyeUNudDogMFxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0bGV0IGNudCA9IHBhcmFtZXRlcnMubGVuZ3RoO1xuXHRcdHdoaWxlICgocGFyYW1ldGVyc1twYXJhbWV0ZXJzLmxlbmd0aCAtIDFdID09PSB1bmRlZmluZWQgfHwgcGFyYW1ldGVyc1twYXJhbWV0ZXJzLmxlbmd0aCAtIDFdID09PSBudWxsKSAmJiBjbnQgPiAwKSB7XG5cdFx0XHRwYXJhbWV0ZXJzLnBvcCgpO1xuXHRcdFx0Y250ID0gcGFyYW1ldGVycy5sZW5ndGg7XG5cdFx0fVxuXG5cdFx0dGhpcy5zZW5kKCh0aGlzLl9yb3V0ZXIudXJsLmluY2x1ZGVzKCc/JykgPyB0aGlzLl9yb3V0ZXIudXJsLnN1YnN0cmluZygwLCB0aGlzLl9yb3V0ZXIudXJsLmluZGV4T2YoJz8nKSkgOiB0aGlzLl9yb3V0ZXIudXJsKSwgbmV3IERhdGUoKSwgbWVzc2FnZUlkLCAnbWV0aG9kJywgbWV0aG9kLCAuLi5wYXJhbWV0ZXJzKTtcblxuXHRcdHJldHVybiBwcm9taXNlO1xuXHR9XG5cblx0cHVibGljIHN1YnNjcmliZShzdWJzY3JpcHRpb246IHN0cmluZywgLi4ucGFyYW1ldGVycykge1xuXHRcdGNvbnN0IGNvcHlQYXJhbWV0ZXJzID0gZGVlcENvcHkocGFyYW1ldGVycyk7XG5cdFx0Y29uc3QgbmV3U3ViamVjdCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcblxuXHRcdGxldCBtZXNzYWdlSWQgPSB0aGlzLm1lc3NhZ2VJZCsrO1xuXG5cdFx0dGhpcy5fc3ViQXJyYXkucHVzaCh7XG5cdFx0XHRtZXNzYWdlSWQ6IG1lc3NhZ2VJZCxcblx0XHRcdG1lc3NhZ2VSb3V0ZTogKHRoaXMuX3JvdXRlci51cmwuaW5jbHVkZXMoJz8nKSA/IHRoaXMuX3JvdXRlci51cmwuc3Vic3RyaW5nKDAsIHRoaXMuX3JvdXRlci51cmwuaW5kZXhPZignPycpKSA6IHRoaXMuX3JvdXRlci51cmwpLFxuXHRcdFx0c3Vic2NyaXB0aW9uOiBzdWJzY3JpcHRpb24sXG5cdFx0XHRwYXJhbWV0ZXJzOiBjb3B5UGFyYW1ldGVycyxcblx0XHRcdHN1YmplY3Q6IG5ld1N1YmplY3Rcblx0XHR9KTtcblxuXHRcdGNvbnN0IG9ic2VydmFibGUgPSBuZXdTdWJqZWN0LnBpcGUoZmluYWxpemUoKCkgPT4ge1xuXHRcdFx0dGhpcy51bnN1YnNjcmliZShtZXNzYWdlSWQsIHN1YnNjcmlwdGlvbiwgLi4uY29weVBhcmFtZXRlcnMpO1xuXHRcdFx0dGhpcy5fc3ViQXJyYXkuc3BsaWNlKHRoaXMuX3N1YkFycmF5Lm1hcChhID0+IGEubWVzc2FnZUlkKS5pbmRleE9mKG1lc3NhZ2VJZCksIDEpO1xuXHRcdH0pKTtcblxuXHRcdHRoaXMuc2VuZCgodGhpcy5fcm91dGVyLnVybC5pbmNsdWRlcygnPycpID8gdGhpcy5fcm91dGVyLnVybC5zdWJzdHJpbmcoMCwgdGhpcy5fcm91dGVyLnVybC5pbmRleE9mKCc/JykpIDogdGhpcy5fcm91dGVyLnVybCksIG5ldyBEYXRlKCksIG1lc3NhZ2VJZCwgJ3N1YnNjcmlwdGlvbicsICdzdWInLCBzdWJzY3JpcHRpb24sIC4uLmNvcHlQYXJhbWV0ZXJzKTtcblxuXHRcdHJldHVybiBvYnNlcnZhYmxlO1xuXHR9XG5cblx0cHVibGljIHN1YnNjcmliZUJ5cGFzc1JvdXRlKHN1YnNjcmlwdGlvbjogc3RyaW5nLCAuLi5wYXJhbWV0ZXJzKSB7XG5cdFx0Y29uc3QgY29weVBhcmFtZXRlcnMgPSBkZWVwQ29weShwYXJhbWV0ZXJzKTtcblx0XHRjb25zdCBuZXdTdWJqZWN0ID0gbmV3IFN1YmplY3Q8YW55PigpO1xuXG5cdFx0bGV0IG1lc3NhZ2VJZCA9IHRoaXMubWVzc2FnZUlkKys7XG5cblx0XHR0aGlzLl9zdWJBcnJheS5wdXNoKHtcblx0XHRcdG1lc3NhZ2VJZDogbWVzc2FnZUlkLFxuXHRcdFx0bWVzc2FnZVJvdXRlOiAnQnlwYXNzJyxcblx0XHRcdHN1YnNjcmlwdGlvbjogc3Vic2NyaXB0aW9uLFxuXHRcdFx0cGFyYW1ldGVyczogY29weVBhcmFtZXRlcnMsXG5cdFx0XHRzdWJqZWN0OiBuZXdTdWJqZWN0XG5cdFx0fSk7XG5cblx0XHRjb25zdCBvYnNlcnZhYmxlID0gbmV3U3ViamVjdC5waXBlKGZpbmFsaXplKCgpID0+IHtcblx0XHRcdHRoaXMudW5zdWJzY3JpYmUobWVzc2FnZUlkLCBzdWJzY3JpcHRpb24sIC4uLmNvcHlQYXJhbWV0ZXJzKTtcblx0XHRcdHRoaXMuX3N1YkFycmF5LnNwbGljZSh0aGlzLl9zdWJBcnJheS5tYXAoYSA9PiBhLm1lc3NhZ2VJZCkuaW5kZXhPZihtZXNzYWdlSWQpLCAxKTtcblx0XHR9KSk7XG5cblx0XHR0aGlzLnNlbmQoJ0J5cGFzcycsIG5ldyBEYXRlKCksIG1lc3NhZ2VJZCwgJ3N1YnNjcmlwdGlvbicsICdzdWInLCBzdWJzY3JpcHRpb24sIC4uLmNvcHlQYXJhbWV0ZXJzKTtcblxuXHRcdHJldHVybiBvYnNlcnZhYmxlO1xuXHR9XG5cblx0cHVibGljIHVuc3Vic2NyaWJlKG1lc3NhZ2VJZCwgc3Vic2NyaXB0aW9uOiBzdHJpbmcsIC4uLnBhcmFtZXRlcnMpIHtcblx0XHR0aGlzLnNlbmQoKHRoaXMuX3JvdXRlci51cmwuaW5jbHVkZXMoJz8nKSA/IHRoaXMuX3JvdXRlci51cmwuc3Vic3RyaW5nKDAsIHRoaXMuX3JvdXRlci51cmwuaW5kZXhPZignPycpKSA6IHRoaXMuX3JvdXRlci51cmwpLCBuZXcgRGF0ZSgpLCBtZXNzYWdlSWQsICdzdWJzY3JpcHRpb24nLCAndW5zdWInLCBzdWJzY3JpcHRpb24sIC4uLnBhcmFtZXRlcnMpO1xuXHR9XG5cdFxuXHRwcml2YXRlIHNlbmQoLi4uZGF0YTogYW55W10pIHtcblx0XHRpZiAoZGF0YVszXSA9PT0gJ3N1YnNjcmlwdGlvbicpIHtcblx0XHRcdHRoaXMuX3NvY2tldC5zZW5kKC4uLmRhdGEpO1xuXHRcdH1cblx0XHRlbHNlIGlmIChkYXRhWzNdID09PSAnbWV0aG9kJykge1xuXHRcdFx0aWYgKHRoaXMuc29ja2V0U3RhdHVzID09PSBXZWJTb2NrZXQuT1BFTikge1xuXHRcdFx0XHRpZiAoIXRoaXMuX3NlbmRRdWV1ZS5maWx0ZXIoYSA9PiBKU09OLnN0cmluZ2lmeShhKSA9PT0gSlNPTi5zdHJpbmdpZnkoZGF0YSkpLmxlbmd0aCkge1xuXHRcdFx0XHRcdHRoaXMuX3NlbmRRdWV1ZS5zcGxpY2UoMCwgMCwgZGF0YSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRpZiAoZGF0YVs0XSA9PT0gJ2luc2VydERvY3VtZW50Jykge1xuXHRcdFx0XHRcdGlmIChkYXRhWzVdICE9PSAnZHJpdmVyLWdwcycpIHtcblx0XHRcdFx0XHRcdHRoaXMuX2FsZXJ0LnNldEFsZXJ0KCd3YXJuaW5nJywgJ1RoaXMgaW5zZXJ0IGNvbW1hbmQgaGFzIG5vdCB0YWtlbiBwbGFjZSBvbiB0aGUgc2VydmVyIHlldCBiZWNhdXNlIHlvdSBhcmUgb2ZmbGluZS4gIEl0IHdpbGwgYXV0b21hdGljYWxseSBzeW5jIHVwIG5leHQgdGltZSB5b3UgYXJlIG9ubGluZSBhcyBsb25nIGFzIHlvdSBkbyBub3QgY2xlYXIgeW91ciBjYWNoZSEnKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR0aGlzLl9vZmZsaW5lLmluc2VydERvY3VtZW50KCdjb2xsZWN0aW9uVXBkYXRlJywge1xuXHRcdFx0XHRcdFx0dHlwZTogJ2luc2VydCcsXG5cdFx0XHRcdFx0XHRkYXRhOiBkYXRhLFxuXHRcdFx0XHRcdFx0ZGF0ZTogbmV3IERhdGUoKVxuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0bGV0IHJlcyA9IHRoaXMuX29mZmxpbmUuaW5zZXJ0RG9jdW1lbnQoZGF0YVs1XSwgZGF0YVs2XSk7XG5cblx0XHRcdFx0XHRsZXQgY2IgPSB0aGlzLl9jYkFycmF5LmZpbHRlcihhID0+IGEubWVzc2FnZUlkID09PSBkYXRhWzJdKVswXTtcblx0XHRcdFx0XHRpZiAoY2IgJiYgY2IuY2IpIHtcblx0XHRcdFx0XHRcdGNiLmNiKG51bGwsIHJlcyk7XG5cblx0XHRcdFx0XHRcdHRoaXMuX2NiQXJyYXkuc3BsaWNlKHRoaXMuX2NiQXJyYXkuZmluZEluZGV4KGEgPT4gYS5tZXNzYWdlSWQgPT09IGRhdGFbMl0pLCAxKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSBpZiAoZGF0YVs0XSA9PT0gJ3VwZGF0ZURvY3VtZW50Jykge1xuXHRcdFx0XHRcdHRoaXMuX2FsZXJ0LnNldEFsZXJ0KCd3YXJuaW5nJywgJ1RoaXMgdXBkYXRlIGNvbW1hbmQgaGFzIG5vdCB0YWtlbiBwbGFjZSBvbiB0aGUgc2VydmVyIHlldCBiZWNhdXNlIHlvdSBhcmUgb2ZmbGluZS4gIEl0IHdpbGwgYXV0b21hdGljYWxseSBzeW5jIHVwIG5leHQgdGltZSB5b3UgYXJlIG9ubGluZSBhcyBsb25nIGFzIHlvdSBkbyBub3QgY2xlYXIgeW91ciBjYWNoZSEnKTtcblx0XHRcdFx0XHR0aGlzLl9vZmZsaW5lLmluc2VydERvY3VtZW50KCdjb2xsZWN0aW9uVXBkYXRlJywge1xuXHRcdFx0XHRcdFx0dHlwZTogJ3VwZGF0ZURvY3VtZW50Jyxcblx0XHRcdFx0XHRcdGRhdGE6IGRhdGEsXG5cdFx0XHRcdFx0XHRkYXRlOiBuZXcgRGF0ZSgpXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRpZiAodGhpcy5fb2ZmbGluZS5maW5kT25lKGRhdGFbNV0sIHtfaWQ6IGRhdGFbNl0uX2lkfSkpIHtcblx0XHRcdFx0XHRcdHRoaXMuX29mZmxpbmUudXBkYXRlRG9jdW1lbnQoZGF0YVs1XSwgZGF0YVs2XSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0Y29uc29sZS5sb2coJ0NvdWxkIG5vdCBmaW5kIE9mZmxpbmUgZGF0YScsIGRhdGFbNV0sIGRhdGFbNl0pO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGxldCBjYiA9IHRoaXMuX2NiQXJyYXkuZmlsdGVyKGEgPT4gYS5tZXNzYWdlSWQgPT09IGRhdGFbMl0pWzBdO1xuXHRcdFx0XHRcdGlmIChjYiAmJiBjYi5jYikge1xuXHRcdFx0XHRcdFx0Y2IuY2IobnVsbCwgMSk7XG5cdFx0XHRcdFx0XHR0aGlzLl9jYkFycmF5LnNwbGljZSh0aGlzLl9jYkFycmF5LmZpbmRJbmRleChhID0+IGEubWVzc2FnZUlkID09PSBkYXRhWzJdKSwgMSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2UgaWYgKGRhdGFbNF0gPT09ICd1cGRhdGVEb2N1bWVudFByb3BzJykge1xuXHRcdFx0XHRcdHRoaXMuX2FsZXJ0LnNldEFsZXJ0KCd3YXJuaW5nJywgJ1RoaXMgdXBkYXRlIGNvbW1hbmQgaGFzIG5vdCB0YWtlbiBwbGFjZSBvbiB0aGUgc2VydmVyIHlldCBiZWNhdXNlIHlvdSBhcmUgb2ZmbGluZS4gIEl0IHdpbGwgYXV0b21hdGljYWxseSBzeW5jIHVwIG5leHQgdGltZSB5b3UgYXJlIG9ubGluZSBhcyBsb25nIGFzIHlvdSBkbyBub3QgY2xlYXIgeW91ciBjYWNoZSEnKTtcblx0XHRcdFx0XHR0aGlzLl9vZmZsaW5lLmluc2VydERvY3VtZW50KCdjb2xsZWN0aW9uVXBkYXRlJywge1xuXHRcdFx0XHRcdFx0dHlwZTogJ3VwZGF0ZURvY3VtZW50UHJvcHMnLFxuXHRcdFx0XHRcdFx0ZGF0YTogZGF0YSxcblx0XHRcdFx0XHRcdGRhdGU6IG5ldyBEYXRlKClcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdGlmICh0aGlzLl9vZmZsaW5lLmZpbmRPbmUoZGF0YVs1XSwge19pZDogZGF0YVs2XX0pKSB7XG5cdFx0XHRcdFx0XHR0aGlzLl9vZmZsaW5lLnVwZGF0ZURvY3VtZW50UHJvcHMoZGF0YVs1XSwgZGF0YVs2XSwgZGF0YVs3XSwgZGF0YVs4XSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0Y29uc29sZS5sb2coJ0NvdWxkIG5vdCBmaW5kIE9mZmxpbmUgZGF0YScsIGRhdGFbNV0sIGRhdGFbNl0pO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGxldCBjYiA9IHRoaXMuX2NiQXJyYXkuZmlsdGVyKGEgPT4gYS5tZXNzYWdlSWQgPT09IGRhdGFbMl0pWzBdO1xuXHRcdFx0XHRcdGlmIChjYiAmJiBjYi5jYikge1xuXHRcdFx0XHRcdFx0Y2IuY2IobnVsbCwgMSk7XG5cdFx0XHRcdFx0XHR0aGlzLl9jYkFycmF5LnNwbGljZSh0aGlzLl9jYkFycmF5LmZpbmRJbmRleChhID0+IGEubWVzc2FnZUlkID09PSBkYXRhWzJdKSwgMSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2UgaWYgKGRhdGFbNF0gPT09ICdyZW1vdmVEb2N1bWVudCcpIHtcblx0XHRcdFx0XHR0aGlzLl9hbGVydC5zZXRBbGVydCgnd2FybmluZycsICdUaGlzIHJlbW92ZSBjb21tYW5kIGhhcyBub3QgdGFrZW4gcGxhY2Ugb24gdGhlIHNlcnZlciB5ZXQgYmVjYXVzZSB5b3UgYXJlIG9mZmxpbmUuICBJdCB3aWxsIGF1dG9tYXRpY2FsbHkgc3luYyB1cCBuZXh0IHRpbWUgeW91IGFyZSBvbmxpbmUgYXMgbG9uZyBhcyB5b3UgZG8gbm90IGNsZWFyIHlvdXIgY2FjaGUhJyk7XG5cdFx0XHRcdFx0dGhpcy5fb2ZmbGluZS5pbnNlcnREb2N1bWVudCgnY29sbGVjdGlvblVwZGF0ZScsIHtcblx0XHRcdFx0XHRcdHR5cGU6ICdyZW1vdmVEb2N1bWVudCcsXG5cdFx0XHRcdFx0XHRkYXRhOiBkYXRhLFxuXHRcdFx0XHRcdFx0ZGF0ZTogbmV3IERhdGUoKVxuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0aWYgKHRoaXMuX29mZmxpbmUuZmluZE9uZShkYXRhWzVdLCB7X2lkOiBkYXRhWzZdfSkpIHtcblx0XHRcdFx0XHRcdHRoaXMuX29mZmxpbmUucmVtb3ZlRG9jdW1lbnQoZGF0YVs1XSwgZGF0YVs2XSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0Y29uc29sZS5sb2coJ0NvdWxkIG5vdCBmaW5kIE9mZmxpbmUgZGF0YScsIGRhdGFbNV0sIGRhdGFbNl0pO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGxldCBjYiA9IHRoaXMuX2NiQXJyYXkuZmlsdGVyKGEgPT4gYS5tZXNzYWdlSWQgPT09IGRhdGFbMl0pWzBdO1xuXHRcdFx0XHRcdGlmIChjYiAmJiBjYi5jYikge1xuXHRcdFx0XHRcdFx0Y2IuY2IobnVsbCwgMSk7XG5cdFx0XHRcdFx0XHR0aGlzLl9jYkFycmF5LnNwbGljZSh0aGlzLl9jYkFycmF5LmZpbmRJbmRleChhID0+IGEubWVzc2FnZUlkID09PSBkYXRhWzJdKSwgMSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGVsc2UgaWYgKGRhdGFbM10gPT09ICdvZmZsaW5lJykge1xuXHRcdFx0dGhpcy5fc29ja2V0LnNlbmQoLi4uZGF0YSk7XG5cdFx0fVxuXHR9XG5cblx0Z2V0U3RhdHVzKCkge1xuXHRcdHJldHVybiB0aGlzLl9zb2NrZXQucmVhZHlTdGF0ZSQ7XG5cdH1cbn1cbiJdfQ==
|