@cloudbase/realtime 2.0.2-alpha.0 → 2.5.0-beta.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.
- package/.eslintrc.js +46 -0
- package/dist/cjs/common.js +1 -1
- package/dist/cjs/error.js +8 -12
- package/dist/cjs/index.js +3 -3
- package/dist/cjs/listener.js +2 -4
- package/dist/cjs/message.js +1 -1
- package/dist/cjs/snapshot.js +7 -7
- package/dist/cjs/utils.js +1 -1
- package/dist/cjs/virtual-websocket-client.d.ts +8 -8
- package/dist/cjs/virtual-websocket-client.js +281 -272
- package/dist/cjs/websocket-client.d.ts +21 -21
- package/dist/cjs/websocket-client.js +441 -444
- package/dist/cjs/ws-event.d.ts +2 -2
- package/dist/cjs/ws-event.js +47 -47
- package/dist/esm/common.js +1 -1
- package/dist/esm/error.js +8 -12
- package/dist/esm/index.js +3 -3
- package/dist/esm/listener.js +2 -4
- package/dist/esm/message.js +1 -1
- package/dist/esm/snapshot.js +7 -7
- package/dist/esm/utils.js +1 -1
- package/dist/esm/virtual-websocket-client.d.ts +8 -8
- package/dist/esm/virtual-websocket-client.js +282 -273
- package/dist/esm/websocket-client.d.ts +21 -21
- package/dist/esm/websocket-client.js +442 -445
- package/dist/esm/ws-event.d.ts +2 -2
- package/dist/esm/ws-event.js +46 -46
- package/package.json +9 -13
- package/src/common.ts +11 -11
- package/src/error.ts +13 -19
- package/src/index.ts +26 -26
- package/src/listener.ts +2 -4
- package/src/message.ts +2 -4
- package/src/snapshot.ts +6 -6
- package/src/utils.ts +1 -1
- package/src/virtual-websocket-client.ts +187 -387
- package/src/websocket-client.ts +385 -600
- package/src/ws-event.ts +24 -24
- package/.eslintrc +0 -30
|
@@ -58,7 +58,7 @@ var WS_READY_STATE = {
|
|
|
58
58
|
CONNECTING: 0,
|
|
59
59
|
OPEN: 1,
|
|
60
60
|
CLOSING: 2,
|
|
61
|
-
CLOSED: 3
|
|
61
|
+
CLOSED: 3,
|
|
62
62
|
};
|
|
63
63
|
var MAX_RTT_OBSERVED = 3;
|
|
64
64
|
var DEFAULT_EXPECTED_EVENT_WAIT_TIME = 5000;
|
|
@@ -71,401 +71,400 @@ var DEFAULT_LOGIN_TIMEOUT = 5000;
|
|
|
71
71
|
var RealtimeWebSocketClient = (function () {
|
|
72
72
|
function RealtimeWebSocketClient(options) {
|
|
73
73
|
var _this = this;
|
|
74
|
-
this.
|
|
75
|
-
this.
|
|
76
|
-
this.
|
|
77
|
-
this.
|
|
78
|
-
this.
|
|
79
|
-
this.
|
|
80
|
-
this.
|
|
81
|
-
this.
|
|
82
|
-
this.
|
|
74
|
+
this.virtualWSClient = new Set();
|
|
75
|
+
this.queryIdClientMap = new Map();
|
|
76
|
+
this.watchIdClientMap = new Map();
|
|
77
|
+
this.pingFailed = 0;
|
|
78
|
+
this.pongMissed = 0;
|
|
79
|
+
this.logins = new Map();
|
|
80
|
+
this.wsReadySubsribers = [];
|
|
81
|
+
this.wsResponseWait = new Map();
|
|
82
|
+
this.rttObserved = [];
|
|
83
83
|
this.send = function (opts) { return __awaiter(_this, void 0, void 0, function () {
|
|
84
84
|
var _this = this;
|
|
85
85
|
return __generator(this, function (_a) {
|
|
86
|
-
return [2, new Promise(function (_resolve, _reject) {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
86
|
+
return [2, new Promise(function (_resolve, _reject) {
|
|
87
|
+
void (function () { return __awaiter(_this, void 0, void 0, function () {
|
|
88
|
+
var timeoutId, hasResolved, hasRejected, resolve, reject, respWaitSpec, err_1, e_1;
|
|
89
|
+
var _this = this;
|
|
90
|
+
return __generator(this, function (_a) {
|
|
91
|
+
switch (_a.label) {
|
|
92
|
+
case 0:
|
|
93
|
+
hasResolved = false;
|
|
94
|
+
hasRejected = false;
|
|
95
|
+
resolve = function (value) {
|
|
96
|
+
hasResolved = true;
|
|
97
|
+
timeoutId && clearTimeout(timeoutId);
|
|
98
|
+
_resolve(value);
|
|
99
|
+
};
|
|
100
|
+
reject = function (error) {
|
|
101
|
+
hasRejected = true;
|
|
102
|
+
timeoutId && clearTimeout(timeoutId);
|
|
103
|
+
_reject(error);
|
|
104
|
+
};
|
|
105
|
+
if (opts.timeout) {
|
|
106
|
+
timeoutId = setTimeout(function () {
|
|
107
|
+
(function () { return __awaiter(_this, void 0, void 0, function () {
|
|
108
|
+
return __generator(this, function (_a) {
|
|
109
|
+
switch (_a.label) {
|
|
110
|
+
case 0:
|
|
111
|
+
if (!(!hasResolved || !hasRejected)) return [3, 2];
|
|
112
|
+
return [4, utils_1.sleep(0)];
|
|
113
|
+
case 1:
|
|
114
|
+
_a.sent();
|
|
115
|
+
if (!hasResolved || !hasRejected) {
|
|
116
|
+
reject(new error_1.TimeoutError('wsclient.send timedout'));
|
|
117
|
+
}
|
|
118
|
+
_a.label = 2;
|
|
119
|
+
case 2: return [2];
|
|
115
120
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
return [2];
|
|
138
|
-
}
|
|
139
|
-
if (opts.waitResponse) {
|
|
140
|
-
this._wsResponseWait.set(opts.msg.requestId, {
|
|
141
|
-
resolve: resolve,
|
|
142
|
-
reject: reject,
|
|
143
|
-
skipOnMessage: opts.skipOnMessage
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
_a.label = 4;
|
|
147
|
-
case 4:
|
|
148
|
-
_a.trys.push([4, 6, , 7]);
|
|
149
|
-
return [4, this._ws.send(JSON.stringify(opts.msg))];
|
|
150
|
-
case 5:
|
|
151
|
-
_a.sent();
|
|
152
|
-
if (!opts.waitResponse) {
|
|
153
|
-
resolve();
|
|
154
|
-
}
|
|
155
|
-
return [3, 7];
|
|
156
|
-
case 6:
|
|
157
|
-
err_1 = _a.sent();
|
|
158
|
-
if (err_1) {
|
|
159
|
-
reject(err_1);
|
|
121
|
+
});
|
|
122
|
+
}); })();
|
|
123
|
+
}, opts.timeout);
|
|
124
|
+
}
|
|
125
|
+
_a.label = 1;
|
|
126
|
+
case 1:
|
|
127
|
+
_a.trys.push([1, 8, , 9]);
|
|
128
|
+
if (!(this.wsInitPromise !== undefined || this.wsInitPromise !== null)) return [3, 3];
|
|
129
|
+
return [4, this.wsInitPromise];
|
|
130
|
+
case 2:
|
|
131
|
+
_a.sent();
|
|
132
|
+
_a.label = 3;
|
|
133
|
+
case 3:
|
|
134
|
+
if (!this.ws) {
|
|
135
|
+
reject(new Error('invalid state: ws connection not exists, can not send message'));
|
|
136
|
+
return [2];
|
|
137
|
+
}
|
|
138
|
+
if (this.ws.readyState !== WS_READY_STATE.OPEN) {
|
|
139
|
+
reject(new Error("ws readyState invalid: " + this.ws.readyState + ", can not send message"));
|
|
140
|
+
return [2];
|
|
141
|
+
}
|
|
160
142
|
if (opts.waitResponse) {
|
|
161
|
-
|
|
143
|
+
respWaitSpec = {
|
|
144
|
+
resolve: resolve,
|
|
145
|
+
reject: reject,
|
|
146
|
+
skipOnMessage: opts.skipOnMessage,
|
|
147
|
+
};
|
|
148
|
+
this.wsResponseWait.set(opts.msg.requestId, respWaitSpec);
|
|
162
149
|
}
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
150
|
+
_a.label = 4;
|
|
151
|
+
case 4:
|
|
152
|
+
_a.trys.push([4, 6, , 7]);
|
|
153
|
+
return [4, this.ws.send(JSON.stringify(opts.msg))];
|
|
154
|
+
case 5:
|
|
155
|
+
_a.sent();
|
|
156
|
+
if (!opts.waitResponse) {
|
|
157
|
+
resolve(void 0);
|
|
158
|
+
}
|
|
159
|
+
return [3, 7];
|
|
160
|
+
case 6:
|
|
161
|
+
err_1 = _a.sent();
|
|
162
|
+
if (err_1) {
|
|
163
|
+
reject(err_1);
|
|
164
|
+
if (opts.waitResponse) {
|
|
165
|
+
this.wsResponseWait.delete(opts.msg.requestId);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return [3, 7];
|
|
169
|
+
case 7: return [3, 9];
|
|
170
|
+
case 8:
|
|
171
|
+
e_1 = _a.sent();
|
|
172
|
+
reject(e_1);
|
|
173
|
+
return [3, 9];
|
|
174
|
+
case 9: return [2];
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
}); })();
|
|
178
|
+
})];
|
|
174
179
|
});
|
|
175
180
|
}); };
|
|
176
181
|
this.closeAllClients = function (error) {
|
|
177
|
-
_this.
|
|
182
|
+
_this.virtualWSClient.forEach(function (client) {
|
|
178
183
|
client.closeWithError(error);
|
|
179
184
|
});
|
|
180
185
|
};
|
|
181
186
|
this.pauseClients = function (clients) {
|
|
182
|
-
|
|
183
|
-
(clients || _this._virtualWSClient).forEach(function (client) {
|
|
187
|
+
(clients || _this.virtualWSClient).forEach(function (client) {
|
|
184
188
|
client.pause();
|
|
185
189
|
});
|
|
186
190
|
};
|
|
187
191
|
this.resumeClients = function (clients) {
|
|
188
|
-
|
|
189
|
-
(clients || _this._virtualWSClient).forEach(function (client) {
|
|
192
|
+
(clients || _this.virtualWSClient).forEach(function (client) {
|
|
190
193
|
client.resume();
|
|
191
194
|
});
|
|
192
195
|
};
|
|
193
196
|
this.initWebSocketConnection = function (reconnect, availableRetries) {
|
|
194
|
-
if (availableRetries === void 0) { availableRetries = _this.
|
|
197
|
+
if (availableRetries === void 0) { availableRetries = _this.maxReconnect; }
|
|
195
198
|
return __awaiter(_this, void 0, void 0, function () {
|
|
196
199
|
var e_2;
|
|
197
200
|
var _this = this;
|
|
198
201
|
return __generator(this, function (_a) {
|
|
199
202
|
switch (_a.label) {
|
|
200
203
|
case 0:
|
|
201
|
-
if (reconnect && this.
|
|
204
|
+
if (reconnect && this.reconnectState) {
|
|
202
205
|
return [2];
|
|
203
206
|
}
|
|
204
207
|
if (reconnect) {
|
|
205
|
-
this.
|
|
208
|
+
this.reconnectState = true;
|
|
206
209
|
}
|
|
207
|
-
if (this.
|
|
208
|
-
return [2, this.
|
|
210
|
+
if (this.wsInitPromise !== undefined && this.wsInitPromise !== null) {
|
|
211
|
+
return [2, this.wsInitPromise];
|
|
209
212
|
}
|
|
210
213
|
if (reconnect) {
|
|
211
214
|
this.pauseClients();
|
|
212
215
|
}
|
|
213
|
-
this.close(ws_event_1.
|
|
214
|
-
this.
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
216
|
+
this.close(ws_event_1.CloseEventCode.ReconnectWebSocket);
|
|
217
|
+
this.wsInitPromise = new Promise(function (resolve, reject) {
|
|
218
|
+
(function () { return __awaiter(_this, void 0, void 0, function () {
|
|
219
|
+
var wsSign_1, e_3, isConnected;
|
|
220
|
+
var _this = this;
|
|
221
|
+
return __generator(this, function (_a) {
|
|
222
|
+
switch (_a.label) {
|
|
223
|
+
case 0:
|
|
224
|
+
_a.trys.push([0, 6, , 11]);
|
|
225
|
+
return [4, this.getWsSign()];
|
|
226
|
+
case 1:
|
|
227
|
+
wsSign_1 = _a.sent();
|
|
228
|
+
return [4, new Promise(function (success) {
|
|
229
|
+
var url = wsSign_1.wsUrl || 'wss://tcb-ws.tencentcloudapi.com';
|
|
230
|
+
var wsClass = common_1.getWsClass();
|
|
231
|
+
_this.ws = wsClass ? new wsClass(url) : new WebSocket(url);
|
|
232
|
+
success(void 0);
|
|
233
|
+
})];
|
|
234
|
+
case 2:
|
|
235
|
+
_a.sent();
|
|
236
|
+
if (!this.ws.connect) return [3, 4];
|
|
237
|
+
return [4, this.ws.connect()];
|
|
238
|
+
case 3:
|
|
239
|
+
_a.sent();
|
|
240
|
+
_a.label = 4;
|
|
241
|
+
case 4: return [4, this.initWebSocketEvent()];
|
|
242
|
+
case 5:
|
|
243
|
+
_a.sent();
|
|
244
|
+
resolve();
|
|
245
|
+
if (reconnect) {
|
|
246
|
+
this.resumeClients();
|
|
247
|
+
this.reconnectState = false;
|
|
248
|
+
}
|
|
249
|
+
return [3, 11];
|
|
250
|
+
case 6:
|
|
251
|
+
e_3 = _a.sent();
|
|
252
|
+
console.error('[realtime] initWebSocketConnection connect fail', e_3);
|
|
253
|
+
if (!(availableRetries > 0)) return [3, 9];
|
|
254
|
+
isConnected = true;
|
|
255
|
+
this.wsInitPromise = undefined;
|
|
256
|
+
if (!isConnected) return [3, 8];
|
|
257
|
+
return [4, utils_1.sleep(this.reconnectInterval)];
|
|
258
|
+
case 7:
|
|
259
|
+
_a.sent();
|
|
260
|
+
if (reconnect) {
|
|
261
|
+
this.reconnectState = false;
|
|
262
|
+
}
|
|
263
|
+
_a.label = 8;
|
|
264
|
+
case 8:
|
|
265
|
+
resolve(this.initWebSocketConnection(reconnect, availableRetries - 1));
|
|
266
|
+
return [3, 10];
|
|
267
|
+
case 9:
|
|
268
|
+
reject(e_3);
|
|
269
|
+
if (reconnect) {
|
|
270
|
+
this.closeAllClients(new error_1.CloudSDKError({
|
|
271
|
+
errCode: error_1.ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_RECONNECT_WATCH_FAIL,
|
|
272
|
+
errMsg: e_3,
|
|
273
|
+
}));
|
|
274
|
+
}
|
|
275
|
+
_a.label = 10;
|
|
276
|
+
case 10: return [3, 11];
|
|
277
|
+
case 11: return [2];
|
|
278
|
+
}
|
|
279
|
+
});
|
|
280
|
+
}); })();
|
|
281
|
+
});
|
|
277
282
|
_a.label = 1;
|
|
278
283
|
case 1:
|
|
279
284
|
_a.trys.push([1, 3, 4, 5]);
|
|
280
|
-
return [4, this.
|
|
285
|
+
return [4, this.wsInitPromise];
|
|
281
286
|
case 2:
|
|
282
287
|
_a.sent();
|
|
283
|
-
this.
|
|
288
|
+
this.wsReadySubsribers.forEach(function (_a) {
|
|
284
289
|
var resolve = _a.resolve;
|
|
285
290
|
return resolve();
|
|
286
291
|
});
|
|
287
292
|
return [3, 5];
|
|
288
293
|
case 3:
|
|
289
294
|
e_2 = _a.sent();
|
|
290
|
-
this.
|
|
295
|
+
this.wsReadySubsribers.forEach(function (_a) {
|
|
291
296
|
var reject = _a.reject;
|
|
292
297
|
return reject();
|
|
293
298
|
});
|
|
294
299
|
return [3, 5];
|
|
295
300
|
case 4:
|
|
296
|
-
this.
|
|
297
|
-
this.
|
|
301
|
+
this.wsInitPromise = undefined;
|
|
302
|
+
this.wsReadySubsribers = [];
|
|
298
303
|
return [7];
|
|
299
304
|
case 5: return [2];
|
|
300
305
|
}
|
|
301
306
|
});
|
|
302
307
|
});
|
|
303
308
|
};
|
|
304
|
-
this.initWebSocketEvent = function () {
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
309
|
+
this.initWebSocketEvent = function () { return new Promise(function (resolve, reject) {
|
|
310
|
+
if (!_this.ws) {
|
|
311
|
+
throw new Error('can not initWebSocketEvent, ws not exists');
|
|
312
|
+
}
|
|
313
|
+
var wsOpened = false;
|
|
314
|
+
_this.ws.onopen = function (event) {
|
|
315
|
+
console.warn('[realtime] ws event: open', event);
|
|
316
|
+
wsOpened = true;
|
|
317
|
+
resolve();
|
|
318
|
+
};
|
|
319
|
+
_this.ws.onerror = function (event) {
|
|
320
|
+
_this.logins = new Map();
|
|
321
|
+
if (!wsOpened) {
|
|
322
|
+
console.error('[realtime] ws open failed with ws event: error', event);
|
|
323
|
+
reject(event);
|
|
308
324
|
}
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
325
|
+
else {
|
|
326
|
+
console.error('[realtime] ws event: error', event);
|
|
327
|
+
_this.clearHeartbeat();
|
|
328
|
+
_this.virtualWSClient.forEach(function (client) { return client.closeWithError(new error_1.CloudSDKError({
|
|
329
|
+
errCode: error_1.ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_WEBSOCKET_CONNECTION_ERROR,
|
|
330
|
+
errMsg: event,
|
|
331
|
+
})); });
|
|
332
|
+
}
|
|
333
|
+
};
|
|
334
|
+
_this.ws.onclose = function (closeEvent) {
|
|
335
|
+
console.warn('[realtime] ws event: close', closeEvent);
|
|
336
|
+
_this.logins = new Map();
|
|
337
|
+
_this.clearHeartbeat();
|
|
338
|
+
switch (closeEvent.code) {
|
|
339
|
+
case ws_event_1.CloseEventCode.ReconnectWebSocket: {
|
|
340
|
+
break;
|
|
320
341
|
}
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
_this.clearHeartbeat();
|
|
324
|
-
_this._virtualWSClient.forEach(function (client) {
|
|
325
|
-
return client.closeWithError(new error_1.CloudSDKError({
|
|
326
|
-
errCode: error_1.ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_WEBSOCKET_CONNECTION_ERROR,
|
|
327
|
-
errMsg: event
|
|
328
|
-
}));
|
|
329
|
-
});
|
|
342
|
+
case ws_event_1.CloseEventCode.NoRealtimeListeners: {
|
|
343
|
+
break;
|
|
330
344
|
}
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
case ws_event_1.CLOSE_EVENT_CODE.ReconnectWebSocket: {
|
|
338
|
-
break;
|
|
345
|
+
case ws_event_1.CloseEventCode.HeartbeatPingError:
|
|
346
|
+
case ws_event_1.CloseEventCode.HeartbeatPongTimeoutError:
|
|
347
|
+
case ws_event_1.CloseEventCode.NormalClosure:
|
|
348
|
+
case ws_event_1.CloseEventCode.AbnormalClosure: {
|
|
349
|
+
if (_this.maxReconnect > 0) {
|
|
350
|
+
_this.initWebSocketConnection(true, _this.maxReconnect);
|
|
339
351
|
}
|
|
340
|
-
|
|
341
|
-
|
|
352
|
+
else {
|
|
353
|
+
_this.closeAllClients(ws_event_1.getWSCloseError(closeEvent.code));
|
|
342
354
|
}
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
}
|
|
353
|
-
break;
|
|
355
|
+
break;
|
|
356
|
+
}
|
|
357
|
+
case ws_event_1.CloseEventCode.NoAuthentication: {
|
|
358
|
+
_this.closeAllClients(ws_event_1.getWSCloseError(closeEvent.code, closeEvent.reason));
|
|
359
|
+
break;
|
|
360
|
+
}
|
|
361
|
+
default: {
|
|
362
|
+
if (_this.maxReconnect > 0) {
|
|
363
|
+
_this.initWebSocketConnection(true, _this.maxReconnect);
|
|
354
364
|
}
|
|
355
|
-
|
|
356
|
-
_this.closeAllClients(ws_event_1.getWSCloseError(closeEvent.code
|
|
357
|
-
break;
|
|
365
|
+
else {
|
|
366
|
+
_this.closeAllClients(ws_event_1.getWSCloseError(closeEvent.code));
|
|
358
367
|
}
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
};
|
|
371
|
+
_this.ws.onmessage = function (res) {
|
|
372
|
+
var rawMsg = res.data;
|
|
373
|
+
_this.heartbeat();
|
|
374
|
+
var msg;
|
|
375
|
+
try {
|
|
376
|
+
msg = JSON.parse(rawMsg);
|
|
377
|
+
}
|
|
378
|
+
catch (e) {
|
|
379
|
+
throw new Error("[realtime] onMessage parse res.data error: " + e);
|
|
380
|
+
}
|
|
381
|
+
if (msg.msgType === 'ERROR') {
|
|
382
|
+
var virtualWatch_1 = null;
|
|
383
|
+
_this.virtualWSClient.forEach(function (item) {
|
|
384
|
+
if (item.watchId === msg.watchId) {
|
|
385
|
+
virtualWatch_1 = item;
|
|
366
386
|
}
|
|
387
|
+
});
|
|
388
|
+
if (virtualWatch_1) {
|
|
389
|
+
virtualWatch_1.listener.onError(msg);
|
|
367
390
|
}
|
|
368
|
-
}
|
|
369
|
-
_this.
|
|
370
|
-
|
|
371
|
-
_this.heartbeat();
|
|
372
|
-
var msg;
|
|
391
|
+
}
|
|
392
|
+
var responseWaitSpec = _this.wsResponseWait.get(msg.requestId);
|
|
393
|
+
if (responseWaitSpec) {
|
|
373
394
|
try {
|
|
374
|
-
msg
|
|
395
|
+
if (msg.msgType === 'ERROR') {
|
|
396
|
+
responseWaitSpec.reject(new error_1.RealtimeErrorMessageError(msg));
|
|
397
|
+
}
|
|
398
|
+
else {
|
|
399
|
+
responseWaitSpec.resolve(msg);
|
|
400
|
+
}
|
|
375
401
|
}
|
|
376
402
|
catch (e) {
|
|
377
|
-
|
|
403
|
+
console.error('ws onMessage responseWaitSpec.resolve(msg) errored:', e);
|
|
378
404
|
}
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
_this._virtualWSClient.forEach(function (item) {
|
|
382
|
-
if (item.watchId === msg.watchId) {
|
|
383
|
-
virtualWatch_1 = item;
|
|
384
|
-
}
|
|
385
|
-
});
|
|
386
|
-
if (virtualWatch_1) {
|
|
387
|
-
virtualWatch_1.listener.onError(msg);
|
|
388
|
-
}
|
|
405
|
+
finally {
|
|
406
|
+
_this.wsResponseWait.delete(msg.requestId);
|
|
389
407
|
}
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
}
|
|
400
|
-
catch (e) {
|
|
401
|
-
console.error('ws onMessage responseWaitSpec.resolve(msg) errored:', e);
|
|
402
|
-
}
|
|
403
|
-
finally {
|
|
404
|
-
_this._wsResponseWait.delete(msg.requestId);
|
|
405
|
-
}
|
|
406
|
-
if (responseWaitSpec.skipOnMessage) {
|
|
408
|
+
if (responseWaitSpec.skipOnMessage) {
|
|
409
|
+
return;
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
if (msg.msgType === 'PONG') {
|
|
413
|
+
if (_this.lastPingSendTS) {
|
|
414
|
+
var rtt = Date.now() - _this.lastPingSendTS;
|
|
415
|
+
if (rtt > DEFAULT_UNTRUSTED_RTT_THRESHOLD) {
|
|
416
|
+
console.warn("[realtime] untrusted rtt observed: " + rtt);
|
|
407
417
|
return;
|
|
408
418
|
}
|
|
419
|
+
if (_this.rttObserved.length >= MAX_RTT_OBSERVED) {
|
|
420
|
+
_this.rttObserved.splice(0, _this.rttObserved.length - MAX_RTT_OBSERVED + 1);
|
|
421
|
+
}
|
|
422
|
+
_this.rttObserved.push(rtt);
|
|
409
423
|
}
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
424
|
+
return;
|
|
425
|
+
}
|
|
426
|
+
var client = msg.watchId && _this.watchIdClientMap.get(msg.watchId);
|
|
427
|
+
if (client) {
|
|
428
|
+
client.onMessage(msg);
|
|
429
|
+
}
|
|
430
|
+
else {
|
|
431
|
+
console.error("[realtime] no realtime listener found responsible for watchId " + msg.watchId + ": ", msg);
|
|
432
|
+
switch (msg.msgType) {
|
|
433
|
+
case 'INIT_EVENT':
|
|
434
|
+
case 'NEXT_EVENT':
|
|
435
|
+
case 'CHECK_EVENT': {
|
|
436
|
+
client = _this.queryIdClientMap.get(msg.msgData.queryID);
|
|
437
|
+
if (client) {
|
|
438
|
+
client.onMessage(msg);
|
|
419
439
|
}
|
|
420
|
-
|
|
440
|
+
break;
|
|
421
441
|
}
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
client.onMessage(msg);
|
|
427
|
-
}
|
|
428
|
-
else {
|
|
429
|
-
console.error("[realtime] no realtime listener found responsible for watchId " + msg.watchId + ": ", msg);
|
|
430
|
-
switch (msg.msgType) {
|
|
431
|
-
case 'INIT_EVENT':
|
|
432
|
-
case 'NEXT_EVENT':
|
|
433
|
-
case 'CHECK_EVENT': {
|
|
434
|
-
client = _this._queryIdClientMap.get(msg.msgData.queryID);
|
|
435
|
-
if (client) {
|
|
436
|
-
client.onMessage(msg);
|
|
437
|
-
}
|
|
442
|
+
default: {
|
|
443
|
+
for (var _i = 0, _a = Array.from(_this.watchIdClientMap.entries()); _i < _a.length; _i++) {
|
|
444
|
+
var _b = _a[_i], client_1 = _b[1];
|
|
445
|
+
client_1.onMessage(msg);
|
|
438
446
|
break;
|
|
439
447
|
}
|
|
440
|
-
default: {
|
|
441
|
-
for (var _i = 0, _a = Array.from(_this._watchIdClientMap.entries()); _i < _a.length; _i++) {
|
|
442
|
-
var _b = _a[_i], client_1 = _b[1];
|
|
443
|
-
client_1.onMessage(msg);
|
|
444
|
-
break;
|
|
445
|
-
}
|
|
446
|
-
}
|
|
447
448
|
}
|
|
448
449
|
}
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
};
|
|
453
|
-
this.isWSConnected = function () {
|
|
454
|
-
return Boolean(_this._ws && _this._ws.readyState === WS_READY_STATE.OPEN);
|
|
455
|
-
};
|
|
450
|
+
}
|
|
451
|
+
};
|
|
452
|
+
_this.heartbeat();
|
|
453
|
+
}); };
|
|
454
|
+
this.isWSConnected = function () { return Boolean(_this.ws && _this.ws.readyState === WS_READY_STATE.OPEN); };
|
|
456
455
|
this.onceWSConnected = function () { return __awaiter(_this, void 0, void 0, function () {
|
|
457
456
|
var _this = this;
|
|
458
457
|
return __generator(this, function (_a) {
|
|
459
458
|
if (this.isWSConnected()) {
|
|
460
459
|
return [2];
|
|
461
460
|
}
|
|
462
|
-
if (this.
|
|
463
|
-
return [2, this.
|
|
461
|
+
if (this.wsInitPromise !== null && this.wsInitPromise !== undefined) {
|
|
462
|
+
return [2, this.wsInitPromise];
|
|
464
463
|
}
|
|
465
464
|
return [2, new Promise(function (resolve, reject) {
|
|
466
|
-
_this.
|
|
465
|
+
_this.wsReadySubsribers.push({
|
|
467
466
|
resolve: resolve,
|
|
468
|
-
reject: reject
|
|
467
|
+
reject: reject,
|
|
469
468
|
});
|
|
470
469
|
})];
|
|
471
470
|
});
|
|
@@ -478,76 +477,78 @@ var RealtimeWebSocketClient = (function () {
|
|
|
478
477
|
case 0:
|
|
479
478
|
if (!refresh) {
|
|
480
479
|
if (envId) {
|
|
481
|
-
loginInfo_1 = this.
|
|
480
|
+
loginInfo_1 = this.logins.get(envId);
|
|
482
481
|
if (loginInfo_1) {
|
|
483
482
|
if (loginInfo_1.loggedIn && loginInfo_1.loginResult) {
|
|
484
483
|
return [2, loginInfo_1.loginResult];
|
|
485
484
|
}
|
|
486
|
-
|
|
485
|
+
if (loginInfo_1.loggingInPromise !== null && loginInfo_1.loggingInPromise !== undefined) {
|
|
487
486
|
return [2, loginInfo_1.loggingInPromise];
|
|
488
487
|
}
|
|
489
488
|
}
|
|
490
489
|
}
|
|
491
490
|
else {
|
|
492
|
-
emptyEnvLoginInfo = this.
|
|
493
|
-
if (emptyEnvLoginInfo === null || emptyEnvLoginInfo === void 0 ? void 0 : emptyEnvLoginInfo.loggingInPromise) {
|
|
491
|
+
emptyEnvLoginInfo = this.logins.get('');
|
|
492
|
+
if ((emptyEnvLoginInfo === null || emptyEnvLoginInfo === void 0 ? void 0 : emptyEnvLoginInfo.loggingInPromise) !== null && (emptyEnvLoginInfo === null || emptyEnvLoginInfo === void 0 ? void 0 : emptyEnvLoginInfo.loggingInPromise) !== undefined) {
|
|
494
493
|
return [2, emptyEnvLoginInfo.loggingInPromise];
|
|
495
494
|
}
|
|
496
495
|
}
|
|
497
496
|
}
|
|
498
|
-
promise = new Promise(function (resolve, reject) {
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
497
|
+
promise = new Promise(function (resolve, reject) {
|
|
498
|
+
(function () { return __awaiter(_this, void 0, void 0, function () {
|
|
499
|
+
var wsSign, msgData, loginMsg, loginResMsg, e_5;
|
|
500
|
+
return __generator(this, function (_a) {
|
|
501
|
+
switch (_a.label) {
|
|
502
|
+
case 0:
|
|
503
|
+
_a.trys.push([0, 3, , 4]);
|
|
504
|
+
return [4, this.getWsSign()];
|
|
505
|
+
case 1:
|
|
506
|
+
wsSign = _a.sent();
|
|
507
|
+
msgData = {
|
|
508
|
+
envId: wsSign.envId || '',
|
|
509
|
+
accessToken: '',
|
|
510
|
+
referrer: 'web',
|
|
511
|
+
sdkVersion: '',
|
|
512
|
+
dataVersion: '',
|
|
513
|
+
};
|
|
514
|
+
loginMsg = {
|
|
515
|
+
watchId: undefined,
|
|
516
|
+
requestId: message_1.genRequestId(),
|
|
517
|
+
msgType: 'LOGIN',
|
|
518
|
+
msgData: msgData,
|
|
519
|
+
exMsgData: {
|
|
520
|
+
runtime: common_1.getRuntime(),
|
|
521
|
+
signStr: wsSign.signStr,
|
|
522
|
+
secretVersion: wsSign.secretVersion,
|
|
523
|
+
},
|
|
524
|
+
};
|
|
525
|
+
return [4, this.send({
|
|
526
|
+
msg: loginMsg,
|
|
527
|
+
waitResponse: true,
|
|
528
|
+
skipOnMessage: true,
|
|
529
|
+
timeout: DEFAULT_LOGIN_TIMEOUT,
|
|
530
|
+
})];
|
|
531
|
+
case 2:
|
|
532
|
+
loginResMsg = _a.sent();
|
|
533
|
+
if (!loginResMsg.msgData.code) {
|
|
534
|
+
resolve({
|
|
535
|
+
envId: wsSign.envId,
|
|
536
|
+
});
|
|
523
537
|
}
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
else {
|
|
539
|
-
reject(new Error(loginResMsg.msgData.code + " " + loginResMsg.msgData.message));
|
|
540
|
-
}
|
|
541
|
-
return [3, 4];
|
|
542
|
-
case 3:
|
|
543
|
-
e_5 = _a.sent();
|
|
544
|
-
reject(e_5);
|
|
545
|
-
return [3, 4];
|
|
546
|
-
case 4: return [2];
|
|
547
|
-
}
|
|
548
|
-
});
|
|
549
|
-
}); });
|
|
550
|
-
loginInfo = envId && this._logins.get(envId);
|
|
538
|
+
else {
|
|
539
|
+
reject(new Error(loginResMsg.msgData.code + " " + loginResMsg.msgData.message));
|
|
540
|
+
}
|
|
541
|
+
return [3, 4];
|
|
542
|
+
case 3:
|
|
543
|
+
e_5 = _a.sent();
|
|
544
|
+
reject(e_5);
|
|
545
|
+
return [3, 4];
|
|
546
|
+
case 4: return [2];
|
|
547
|
+
}
|
|
548
|
+
});
|
|
549
|
+
}); })();
|
|
550
|
+
});
|
|
551
|
+
loginInfo = envId && this.logins.get(envId);
|
|
551
552
|
loginStartTS = Date.now();
|
|
552
553
|
if (loginInfo) {
|
|
553
554
|
loginInfo.loggedIn = false;
|
|
@@ -558,9 +559,9 @@ var RealtimeWebSocketClient = (function () {
|
|
|
558
559
|
loginInfo = {
|
|
559
560
|
loggedIn: false,
|
|
560
561
|
loggingInPromise: promise,
|
|
561
|
-
loginStartTS: loginStartTS
|
|
562
|
+
loginStartTS: loginStartTS,
|
|
562
563
|
};
|
|
563
|
-
this.
|
|
564
|
+
this.logins.set(envId || '', loginInfo);
|
|
564
565
|
}
|
|
565
566
|
_a.label = 1;
|
|
566
567
|
case 1:
|
|
@@ -568,26 +569,24 @@ var RealtimeWebSocketClient = (function () {
|
|
|
568
569
|
return [4, promise];
|
|
569
570
|
case 2:
|
|
570
571
|
loginResult = _a.sent();
|
|
571
|
-
curLoginInfo = envId && this.
|
|
572
|
-
if (curLoginInfo
|
|
573
|
-
curLoginInfo === loginInfo
|
|
574
|
-
curLoginInfo.loginStartTS === loginStartTS) {
|
|
572
|
+
curLoginInfo = envId && this.logins.get(envId);
|
|
573
|
+
if (curLoginInfo
|
|
574
|
+
&& curLoginInfo === loginInfo
|
|
575
|
+
&& curLoginInfo.loginStartTS === loginStartTS) {
|
|
575
576
|
loginInfo.loggedIn = true;
|
|
576
577
|
loginInfo.loggingInPromise = undefined;
|
|
577
578
|
loginInfo.loginStartTS = undefined;
|
|
578
579
|
loginInfo.loginResult = loginResult;
|
|
579
580
|
return [2, loginResult];
|
|
580
581
|
}
|
|
581
|
-
|
|
582
|
+
if (curLoginInfo) {
|
|
582
583
|
if (curLoginInfo.loggedIn && curLoginInfo.loginResult) {
|
|
583
584
|
return [2, curLoginInfo.loginResult];
|
|
584
585
|
}
|
|
585
|
-
|
|
586
|
+
if (curLoginInfo.loggingInPromise !== null && curLoginInfo.loggingInPromise !== undefined) {
|
|
586
587
|
return [2, curLoginInfo.loggingInPromise];
|
|
587
588
|
}
|
|
588
|
-
|
|
589
|
-
throw new Error('ws unexpected login info');
|
|
590
|
-
}
|
|
589
|
+
throw new Error('ws unexpected login info');
|
|
591
590
|
}
|
|
592
591
|
else {
|
|
593
592
|
throw new Error('ws login info reset');
|
|
@@ -609,11 +608,11 @@ var RealtimeWebSocketClient = (function () {
|
|
|
609
608
|
return __generator(this, function (_b) {
|
|
610
609
|
switch (_b.label) {
|
|
611
610
|
case 0:
|
|
612
|
-
if (this.
|
|
613
|
-
return [2, this.
|
|
611
|
+
if (this.wsSign && this.wsSign.expiredTs > Date.now()) {
|
|
612
|
+
return [2, this.wsSign];
|
|
614
613
|
}
|
|
615
614
|
expiredTs = Date.now() + 60000;
|
|
616
|
-
return [4, this.
|
|
615
|
+
return [4, this.context.appConfig.request.send('auth.wsWebSign', { runtime: common_1.getRuntime() })];
|
|
617
616
|
case 1:
|
|
618
617
|
res = _b.sent();
|
|
619
618
|
if (res.code) {
|
|
@@ -626,23 +625,20 @@ var RealtimeWebSocketClient = (function () {
|
|
|
626
625
|
wsUrl: wsUrl,
|
|
627
626
|
secretVersion: secretVersion,
|
|
628
627
|
envId: envId,
|
|
629
|
-
expiredTs: expiredTs
|
|
628
|
+
expiredTs: expiredTs,
|
|
630
629
|
}];
|
|
631
630
|
}
|
|
632
|
-
|
|
633
|
-
throw new Error('[tcb-js-sdk] 获取实时数据推送登录票据失败');
|
|
634
|
-
}
|
|
635
|
-
return [2];
|
|
631
|
+
throw new Error('[tcb-js-sdk] 获取实时数据推送登录票据失败');
|
|
636
632
|
}
|
|
637
633
|
});
|
|
638
634
|
}); };
|
|
639
635
|
this.getWaitExpectedTimeoutLength = function () {
|
|
640
|
-
if (!_this.
|
|
636
|
+
if (!_this.rttObserved.length) {
|
|
641
637
|
return DEFAULT_EXPECTED_EVENT_WAIT_TIME;
|
|
642
638
|
}
|
|
643
|
-
return ((_this.
|
|
644
|
-
_this.
|
|
645
|
-
1.5);
|
|
639
|
+
return ((_this.rttObserved.reduce(function (acc, cur) { return acc + cur; })
|
|
640
|
+
/ _this.rttObserved.length)
|
|
641
|
+
* 1.5);
|
|
646
642
|
};
|
|
647
643
|
this.ping = function () { return __awaiter(_this, void 0, void 0, function () {
|
|
648
644
|
var msg;
|
|
@@ -653,10 +649,10 @@ var RealtimeWebSocketClient = (function () {
|
|
|
653
649
|
watchId: undefined,
|
|
654
650
|
requestId: message_1.genRequestId(),
|
|
655
651
|
msgType: 'PING',
|
|
656
|
-
msgData: null
|
|
652
|
+
msgData: null,
|
|
657
653
|
};
|
|
658
654
|
return [4, this.send({
|
|
659
|
-
msg: msg
|
|
655
|
+
msg: msg,
|
|
660
656
|
})];
|
|
661
657
|
case 1:
|
|
662
658
|
_a.sent();
|
|
@@ -665,88 +661,89 @@ var RealtimeWebSocketClient = (function () {
|
|
|
665
661
|
});
|
|
666
662
|
}); };
|
|
667
663
|
this.onWatchStart = function (client, queryID) {
|
|
668
|
-
_this.
|
|
664
|
+
_this.queryIdClientMap.set(queryID, client);
|
|
669
665
|
};
|
|
670
666
|
this.onWatchClose = function (client, queryID) {
|
|
671
667
|
if (queryID) {
|
|
672
|
-
_this.
|
|
668
|
+
_this.queryIdClientMap.delete(queryID);
|
|
673
669
|
}
|
|
674
|
-
_this.
|
|
675
|
-
_this.
|
|
676
|
-
if (!_this.
|
|
677
|
-
_this.close(ws_event_1.
|
|
670
|
+
_this.watchIdClientMap.delete(client.watchId);
|
|
671
|
+
_this.virtualWSClient.delete(client);
|
|
672
|
+
if (!_this.virtualWSClient.size) {
|
|
673
|
+
_this.close(ws_event_1.CloseEventCode.NoRealtimeListeners);
|
|
678
674
|
}
|
|
679
675
|
};
|
|
680
|
-
this.
|
|
681
|
-
this.
|
|
682
|
-
|
|
683
|
-
this._context = options.context;
|
|
676
|
+
this.maxReconnect = options.maxReconnect || DEFAULT_MAX_RECONNECT;
|
|
677
|
+
this.reconnectInterval = options.reconnectInterval || DEFAULT_WS_RECONNECT_INTERVAL;
|
|
678
|
+
this.context = options.context;
|
|
684
679
|
}
|
|
685
680
|
RealtimeWebSocketClient.prototype.clearHeartbeat = function () {
|
|
686
|
-
this.
|
|
687
|
-
this.
|
|
681
|
+
this.pingTimeoutId && clearTimeout(this.pingTimeoutId);
|
|
682
|
+
this.pongTimeoutId && clearTimeout(this.pongTimeoutId);
|
|
688
683
|
};
|
|
689
684
|
RealtimeWebSocketClient.prototype.close = function (code) {
|
|
690
685
|
this.clearHeartbeat();
|
|
691
|
-
if (this.
|
|
692
|
-
this.
|
|
693
|
-
this.
|
|
686
|
+
if (this.ws) {
|
|
687
|
+
this.ws.close(code, ws_event_1.CLOSE_EVENT_CODE_INFO[code].name);
|
|
688
|
+
this.ws = undefined;
|
|
694
689
|
}
|
|
695
690
|
};
|
|
696
691
|
RealtimeWebSocketClient.prototype.watch = function (options) {
|
|
697
|
-
if (!this.
|
|
692
|
+
if (!this.ws && (this.wsInitPromise === undefined || this.wsInitPromise === null)) {
|
|
698
693
|
this.initWebSocketConnection(false);
|
|
699
694
|
}
|
|
700
695
|
var virtualClient = new virtual_websocket_client_1.VirtualWebSocketClient(__assign(__assign({}, options), { send: this.send, login: this.webLogin, isWSConnected: this.isWSConnected, onceWSConnected: this.onceWSConnected, getWaitExpectedTimeoutLength: this.getWaitExpectedTimeoutLength, onWatchStart: this.onWatchStart, onWatchClose: this.onWatchClose, debug: true }));
|
|
701
|
-
this.
|
|
702
|
-
this.
|
|
696
|
+
this.virtualWSClient.add(virtualClient);
|
|
697
|
+
this.watchIdClientMap.set(virtualClient.watchId, virtualClient);
|
|
703
698
|
return virtualClient.listener;
|
|
704
699
|
};
|
|
705
700
|
RealtimeWebSocketClient.prototype.heartbeat = function (immediate) {
|
|
706
701
|
var _this = this;
|
|
707
702
|
this.clearHeartbeat();
|
|
708
|
-
this.
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
_this.
|
|
727
|
-
|
|
703
|
+
this.pingTimeoutId = setTimeout(function () {
|
|
704
|
+
(function () { return __awaiter(_this, void 0, void 0, function () {
|
|
705
|
+
var e_6;
|
|
706
|
+
var _this = this;
|
|
707
|
+
return __generator(this, function (_a) {
|
|
708
|
+
switch (_a.label) {
|
|
709
|
+
case 0:
|
|
710
|
+
_a.trys.push([0, 2, , 3]);
|
|
711
|
+
if (!this.ws || this.ws.readyState !== WS_READY_STATE.OPEN) {
|
|
712
|
+
return [2];
|
|
713
|
+
}
|
|
714
|
+
this.lastPingSendTS = Date.now();
|
|
715
|
+
return [4, this.ping()];
|
|
716
|
+
case 1:
|
|
717
|
+
_a.sent();
|
|
718
|
+
this.pingFailed = 0;
|
|
719
|
+
this.pongTimeoutId = setTimeout(function () {
|
|
720
|
+
console.error('pong timed out');
|
|
721
|
+
if (_this.pongMissed < DEFAULT_PONG_MISS_TOLERANCE) {
|
|
722
|
+
_this.pongMissed += 1;
|
|
723
|
+
_this.heartbeat(true);
|
|
724
|
+
}
|
|
725
|
+
else {
|
|
726
|
+
_this.initWebSocketConnection(true);
|
|
727
|
+
}
|
|
728
|
+
}, this.context.appConfig.realtimePongWaitTimeout);
|
|
729
|
+
return [3, 3];
|
|
730
|
+
case 2:
|
|
731
|
+
e_6 = _a.sent();
|
|
732
|
+
if (this.pingFailed < DEFAULT_PING_FAIL_TOLERANCE) {
|
|
733
|
+
this.pingFailed += 1;
|
|
734
|
+
this.heartbeat();
|
|
728
735
|
}
|
|
729
736
|
else {
|
|
730
|
-
|
|
737
|
+
this.close(ws_event_1.CloseEventCode.HeartbeatPingError);
|
|
731
738
|
}
|
|
732
|
-
|
|
733
|
-
return [
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
this.heartbeat();
|
|
739
|
-
}
|
|
740
|
-
else {
|
|
741
|
-
this.close(ws_event_1.CLOSE_EVENT_CODE.HeartbeatPingError);
|
|
742
|
-
}
|
|
743
|
-
return [3, 3];
|
|
744
|
-
case 3: return [2];
|
|
745
|
-
}
|
|
746
|
-
});
|
|
747
|
-
}); }, immediate ? 0 : this._context.appConfig.realtimePingInterval);
|
|
739
|
+
return [3, 3];
|
|
740
|
+
case 3: return [2];
|
|
741
|
+
}
|
|
742
|
+
});
|
|
743
|
+
}); })();
|
|
744
|
+
}, immediate ? 0 : this.context.appConfig.realtimePingInterval);
|
|
748
745
|
};
|
|
749
746
|
return RealtimeWebSocketClient;
|
|
750
747
|
}());
|
|
751
748
|
exports.RealtimeWebSocketClient = RealtimeWebSocketClient;
|
|
752
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93ZWJzb2NrZXQtY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsdUVBQW1FO0FBQ25FLHFDQUF3QztBQWN4Qyx1Q0FJbUI7QUFFbkIsaUNBQXlGO0FBQ3pGLG1DQUFpRDtBQUNqRCxpQ0FBK0I7QUE0RC9CLElBQU0sY0FBYyxHQUFHO0lBQ3JCLFVBQVUsRUFBRSxDQUFDO0lBQ2IsSUFBSSxFQUFFLENBQUM7SUFDUCxPQUFPLEVBQUUsQ0FBQztJQUNWLE1BQU0sRUFBRSxDQUFDO0NBQ1YsQ0FBQTtBQUVELElBQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFBO0FBQzFCLElBQU0sZ0NBQWdDLEdBQUcsSUFBSSxDQUFBO0FBQzdDLElBQU0sK0JBQStCLEdBQUcsS0FBSyxDQUFBO0FBQzdDLElBQU0scUJBQXFCLEdBQUcsQ0FBQyxDQUFBO0FBQy9CLElBQU0sNkJBQTZCLEdBQUcsS0FBSyxDQUFBO0FBRTNDLElBQU0sMkJBQTJCLEdBQUcsQ0FBQyxDQUFBO0FBQ3JDLElBQU0sMkJBQTJCLEdBQUcsQ0FBQyxDQUFBO0FBQ3JDLElBQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFBO0FBRWxDO0lBK0JFLGlDQUFZLE9BQW1EO1FBQS9ELGlCQU1DO1FBcENPLHFCQUFnQixHQUFnQyxJQUFJLEdBQUcsRUFBRSxDQUFBO1FBRXpELHNCQUFpQixHQUF3QyxJQUFJLEdBQUcsRUFBRSxDQUFBO1FBQ2xFLHNCQUFpQixHQUF3QyxJQUFJLEdBQUcsRUFBRSxDQUFBO1FBUWxFLGdCQUFXLEdBQUcsQ0FBQyxDQUFBO1FBQ2YsZ0JBQVcsR0FBRyxDQUFDLENBQUE7UUFHZixZQUFPLEdBQXdDLElBQUksR0FBRyxFQUFFLENBQUE7UUFJeEQsdUJBQWtCLEdBQXFCLEVBQUUsQ0FBQTtR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RTtnQ0FDbEQsS0FBSSxDQUFDLFdBQVcsRUFBRSxDQUFBO2dDQUNsQixLQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFBOzZCQUNyQjtpQ0FBTTtnQ0FFTCxLQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUE7NkJBQ25DO3dCQUNILENBQUMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFBOzs7O3dCQUVuRCxJQUFJLElBQUksQ0FBQyxXQUFXLEdBQUcsMkJBQTJCLEVBQUU7NEJBQ2xELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQTs0QkFDbEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFBO3lCQUNqQjs2QkFBTTs0QkFDTCxJQUFJLENBQUMsS0FBSyxDQUFDLDJCQUFnQixDQUFDLGtCQUFrQixDQUFDLENBQUE7eUJBQ2hEOzs7OzthQUVKLEVBQ0QsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLG9CQUFvQixDQUM3RCxDQUFBO0lBQ0gsQ0FBQztJQStCSCw4QkFBQztBQUFELENBQUMsQUEzM0JELElBMjNCQztBQTMzQlksMERBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVmlydHVhbFdlYlNvY2tldENsaWVudCB9IGZyb20gJy4vdmlydHVhbC13ZWJzb2NrZXQtY2xpZW50J1xuaW1wb3J0IHsgZ2VuUmVxdWVzdElkIH0gZnJvbSAnLi9tZXNzYWdlJ1xuaW1wb3J0IHtcbiAgSURhdGFiYXNlU2VydmljZUNvbnRleHQsXG59IGZyb20gJ0BjbG91ZGJhc2UvdHlwZXMvZGF0YWJhc2UnXG5pbXBvcnQge1xuICBJV2F0Y2hPcHRpb25zLFxuICBEQlJlYWx0aW1lTGlzdGVuZXIsXG4gIElSZXF1ZXN0TWVzc2FnZSxcbiAgSVJlc3BvbnNlTWVzc2FnZSxcbiAgSVJlcXVlc3RNZXNzYWdlUGluZ01zZyxcbiAgSVJlcXVlc3RNZXNzYWdlTG9naW5Nc2csXG4gIElSZXNwb25zZU1lc3NhZ2VMb2dpblJlc01zZyxcbiAgSVJlcXVlc3RNZXNzYWdlTG9naW5EYXRhXG59IGZyb20gJ0BjbG91ZGJhc2UvdHlwZXMvcmVhbHRpbWUnXG5pbXBvcnQge1xuICBDTE9TRV9FVkVOVF9DT0RFLFxuICBDTE9TRV9FVkVOVF9DT0RFX0lORk8sXG4gIGdldFdTQ2xvc2VFcnJvclxufSBmcm9tICcuL3dzLWV2ZW50J1xuXG5pbXBvcnQgeyBFUlJfQ09ERSwgVGltZW91dEVycm9yLCBSZWFsdGltZUVycm9yTWVzc2FnZUVycm9yLENsb3VkU0RLRXJyb3IgfSBmcm9tICcuL2Vycm9yJ1xuaW1wb3J0IHsgZ2V0V3NDbGFzcywgZ2V0UnVudGltZSB9IGZyb20gJy4vY29tbW9uJ1xuaW1wb3J0IHsgc2xlZXAgfSBmcm9tICcuL3V0aWxzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIElSZWFsdGltZVdlYlNvY2tldENsaWVudENvbnN0cnVjdG9yT3B0aW9ucyB7XG4gIG1heFJlY29ubmVjdD86IG51bWJlclxuICByZWNvbm5lY3RJbnRlcnZhbD86IG51bWJlclxuICBjb250ZXh0OiBJRGF0YWJhc2VTZXJ2aWNlQ29udGV4dFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTaWduYXR1cmUge1xuICBlbnZJZDogc3RyaW5nXG4gIHNlY3JldFZlcnNpb246IG51bWJlclxuICBzaWduU3RyOiBzdHJpbmdcbiAgd3NVcmw6IHN0cmluZ1xuICBleHBpcmVUUzogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUxvZ2luSW5mbyB7XG4gIGxvZ2dlZEluOiBib29sZWFuXG4gIGxvZ2dpbmdJblByb21pc2U/OiBQcm9taXNlPElMb2dpblJlc3VsdD5cbiAgbG9naW5TdGFydFRTPzogbnVtYmVyXG4gIGxvZ2luUmVzdWx0PzogSUxvZ2luUmVzdWx0XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUxvZ2luUmVzdWx0IHtcbiAgZW52SWQ6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElXU1NlbmRPcHRpb25zIHtcbiAgbXNnOiBJUmVxdWVzdE1lc3NhZ2VcbiAgd2FpdFJlc3BvbnNlPzogYm9vbGVhblxuICAvLyB3aGVuIHdhaXRSZXNwb25zZSBpcyBzZXQgdG8gdHJ1ZSwgaWYgc2tpcE9uTWVzc2FnZSBpcyB0cnVlLCBnZW5lcmFsIG9uTWVzc2FnZSBoYW5kbGVyIHdpbGwgYmUgc2tpcHBlZFxuICBza2lwT25NZXNzYWdlPzogYm9vbGVhblxuICB0aW1lb3V0PzogbnVtYmVyXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVdTV2F0Y2hPcHRpb25zIGV4dGVuZHMgSVdhdGNoT3B0aW9ucyB7XG4gIGVudklkPzogc3RyaW5nXG4gIGNvbGxlY3Rpb25OYW1lOiBzdHJpbmdcbiAgcXVlcnk6IHN0cmluZ1xuICBsaW1pdD86IG51bWJlclxuICBvcmRlckJ5PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxufVxuXG5pbnRlcmZhY2UgSVJlc29sdmVSZWplY3Qge1xuICByZXNvbHZlOiAodmFsdWU/OiBhbnkgfCBQcm9taXNlTGlrZTxhbnk+IHwgdW5kZWZpbmVkKSA9PiB2b2lkXG4gIHJlamVjdDogKHJlYXNvbj86IGFueSkgPT4gdm9pZFxufVxuXG5pbnRlcmZhY2UgSVJlc3BvbnNlV2FpdFNwZWMgZXh0ZW5kcyBJUmVzb2x2ZVJlamVjdCB7XG4gIHNraXBPbk1lc3NhZ2U/OiBib29sZWFuXG59XG5cbmludGVyZmFjZSBJV3NTaWduIHtcbiAgc2lnblN0cjogc3RyaW5nLFxuICB3c1VybDogc3RyaW5nLFxuICBzZWNyZXRWZXJzaW9uOiBzdHJpbmdcbiAgZW52SWQ6IHN0cmluZ1xuICBleHBpcmVkVHM6IG51bWJlclxufVxuXG5jb25zdCBXU19SRUFEWV9TVEFURSA9IHtcbiAgQ09OTkVDVElORzogMCxcbiAgT1BFTjogMSxcbiAgQ0xPU0lORzogMixcbiAgQ0xPU0VEOiAzXG59XG5cbmNvbnN0IE1BWF9SVFRfT0JTRVJWRUQgPSAzXG5jb25zdCBERUZBVUxUX0VYUEVDVEVEX0VWRU5UX1dBSVRfVElNRSA9IDUwMDBcbmNvbnN0IERFRkFVTFRfVU5UUlVTVEVEX1JUVF9USFJFU0hPTEQgPSAxMDAwMFxuY29uc3QgREVGQVVMVF9NQVhfUkVDT05ORUNUID0gNVxuY29uc3QgREVGQVVMVF9XU19SRUNPTk5FQ1RfSU5URVJWQUwgPSAxMDAwMFxuLy8gY29uc3QgREVGQVVMVF9XU19SRUNPTk5FQ1RfTUFYX1ZBTElEX0lOVEVSVkFMID0gMyAqIDYwICogMTAwMFxuY29uc3QgREVGQVVMVF9QSU5HX0ZBSUxfVE9MRVJBTkNFID0gMlxuY29uc3QgREVGQVVMVF9QT05HX01JU1NfVE9MRVJBTkNFID0gMlxuY29uc3QgREVGQVVMVF9MT0dJTl9USU1FT1VUID0gNTAwMFxuXG5leHBvcnQgY2xhc3MgUmVhbHRpbWVXZWJTb2NrZXRDbGllbnQge1xuICBwcml2YXRlIF92aXJ0dWFsV1NDbGllbnQ6IFNldDxWaXJ0dWFsV2ViU29ja2V0Q2xpZW50PiA9IG5ldyBTZXQoKVxuICAvLyBhZnRlciBsaXN0ZW5lciBpbml0V2F0Y2gsIHRoZSBsaXN0ZW5lciBoYXMgdGhlIHF1ZXJ5SUQgYW5kIGNhbiBzdG9yZSBpdCBoZXJlXG4gIHByaXZhdGUgX3F1ZXJ5SWRDbGllbnRNYXA6IE1hcDxzdHJpbmcsIFZpcnR1YWxXZWJTb2NrZXRDbGllbnQ+ID0gbmV3IE1hcCgpXG4gIHByaXZhdGUgX3dhdGNoSWRDbGllbnRNYXA6IE1hcDxzdHJpbmcsIFZpcnR1YWxXZWJTb2NrZXRDbGllbnQ+ID0gbmV3IE1hcCgpXG4gIHByaXZhdGUgX21heFJlY29ubmVjdDogbnVtYmVyXG4gIC8vIHByaXZhdGUgX2F2YWlsYWJsZVJldHJpZXM6IG51bWJlclxuICBwcml2YXRlIF9yZWNvbm5lY3RJbnRlcnZhbDogbnVtYmVyXG4gIHByaXZhdGUgX2NvbnRleHQ6IElEYXRhYmFzZVNlcnZpY2VDb250ZXh0XG4gIC8vIHByaXZhdGUgX3dzPzogV1hOUy5Tb2NrZXQuSVNvY2tldFRhc2tcbiAgcHJpdmF0ZSBfd3M/OiBhbnlcbiAgcHJpdmF0ZSBfbGFzdFBpbmdTZW5kVFM/OiBudW1iZXJcbiAgcHJpdmF0ZSBfcGluZ0ZhaWxlZCA9IDBcbiAgcHJpdmF0ZSBfcG9uZ01pc3NlZCA9IDBcbiAgcHJpdmF0ZSBfcGluZ1RpbWVvdXRJZD86IG51bWJlclxuICBwcml2YXRlIF9wb25nVGltZW91dElkPzogbnVtYmVyXG4gIHByaXZhdGUgX2xvZ2luczogTWFwPHN0cmluZyAvKiBlbnZJZCAqLywgSUxvZ2luSW5mbz4gPSBuZXcgTWFwKClcbiAgLy8gcHJpdmF0ZSBfbG9naW5JbmZvOiBJTG9naW5JbmZvXG4gIC8vIHByaXZhdGUgX3NpZ25hdHVyZXM6IE1hcDxzdHJpbmcgLyogZW52SWQgKi8sIElTaWduYXR1cmU+ID0gbmV3IE1hcCgpXG4gIHByaXZhdGUgX3dzSW5pdFByb21pc2U/OiBQcm9taXNlPHZvaWQ+XG4gIHByaXZhdGUgX3dzUmVhZHlTdWJzcmliZXJzOiBJUmVzb2x2ZVJlamVjdFtdID0gW11cbiAgcHJpdmF0ZSBfd3NSZXNwb25zZVdhaXQ6IE1hcDxcbiAgICBzdHJpbmcgLyogcmVxdWVzdElkICovLFxuICAgIElSZXNwb25zZVdhaXRTcGVjXG4gID4gPSBuZXcgTWFwKClcbiAgcHJpdmF0ZSBfcnR0T2JzZXJ2ZWQ6IG51bWJlcltdID0gW11cbiAgcHJpdmF0ZSBfcmVjb25uZWN0U3RhdGU6IGJvb2xlYW5cbiAgLy8gb2J0YWluZWQgZnJvbSB0aGUgZmlyc3QgZ2V0U2lnbmF0dXJlIHdpdGggbm8gZW52SWQgcHJvdmlkZWRcbiAgLy8gcHJpdmF0ZSBfZGVmYXVsdEVudklkPzogc3RyaW5nXG4gIHByaXZhdGUgX3dzU2lnbjogSVdzU2lnblxuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElSZWFsdGltZVdlYlNvY2tldENsaWVudENvbnN0cnVjdG9yT3B0aW9ucykge1xuICAgIHRoaXMuX21heFJlY29ubmVjdCA9IG9wdGlvbnMubWF4UmVjb25uZWN0IHx8IERFRkFVTFRfTUFYX1JFQ09OTkVDVFxuICAgIC8vIHRoaXMuX2F2YWlsYWJsZVJldHJpZXMgPSB0aGlzLl9tYXhSZWNvbm5lY3RcbiAgICB0aGlzLl9yZWNvbm5lY3RJbnRlcnZhbCA9XG4gICAgICBvcHRpb25zLnJlY29ubmVjdEludGVydmFsIHx8IERFRkFVTFRfV1NfUkVDT05ORUNUX0lOVEVSVkFMXG4gICAgdGhpcy5fY29udGV4dCA9IG9wdGlvbnMuY29udGV4dFxuICB9XG5cbiAgY2xlYXJIZWFydGJlYXQoKSB7XG4gICAgdGhpcy5fcGluZ1RpbWVvdXRJZCAmJiBjbGVhclRpbWVvdXQodGhpcy5fcGluZ1RpbWVvdXRJZClcbiAgICB0aGlzLl9wb25nVGltZW91dElkICYmIGNsZWFyVGltZW91dCh0aGlzLl9wb25nVGltZW91dElkKVxuICB9XG5cbiAgc2VuZCA9IGFzeW5jIDxUID0gYW55PihvcHRzOiBJV1NTZW5kT3B0aW9ucyk6IFByb21pc2U8VD4gPT5cbiAgICBuZXcgUHJvbWlzZTxUPihhc3luYyAoX3Jlc29sdmUsIF9yZWplY3QpID0+IHtcbiAgICAgIGxldCB0aW1lb3V0SWQ6IG51bWJlclxuICAgICAgbGV0IF9oYXNSZXNvbHZlZCA9IGZhbHNlXG4gICAgICBsZXQgX2hhc1JlamVjdGVkID0gZmFsc2VcblxuICAgICAgY29uc3QgcmVzb2x2ZTogdHlwZW9mIF9yZXNvbHZlID0gKFxuICAgICAgICB2YWx1ZT86IFQgfCBQcm9taXNlTGlrZTxUPiB8IHVuZGVmaW5lZFxuICAgICAgKSA9PiB7XG4gICAgICAgIF9oYXNSZXNvbHZlZCA9IHRydWVcbiAgICAgICAgdGltZW91dElkICYmIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpXG4gICAgICAgIF9yZXNvbHZlKHZhbHVlKVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZWplY3Q6IHR5cGVvZiBfcmVqZWN0ID0gKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgX2hhc1JlamVjdGVkID0gdHJ1ZVxuICAgICAgICB0aW1lb3V0SWQgJiYgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZClcbiAgICAgICAgX3JlamVjdChlcnJvcilcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdHMudGltZW91dCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGlmICghX2hhc1Jlc29sdmVkIHx8ICFfaGFzUmVqZWN0ZWQpIHtcbiAgICAgICAgICAgIC8vIHdhaXQgYW5vdGhlciBpbW1lZGlhdGUgdGltZW91dCB0byBhbGxvdyB0aGUgc3VjY2Vzcy9mYWlsIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgaWYgd3MgaGFzIGFscmVhZHkgZ290IHRoZSByZXN1bHQsXG4gICAgICAgICAgICAvLyB0aGlzIGlzIGJlY2F1c2UgdGhlIHRpbWVyIGlzIHJlZ2lzdGVyZWQgYmVmb3JlIHdzLnNlbmRcbiAgICAgICAgICAgIGF3YWl0IHNsZWVwKDApXG4gICAgICAgICAgICBpZiAoIV9oYXNSZXNvbHZlZCB8fCAhX2hhc1JlamVjdGVkKSB7XG4gICAgICAgICAgICAgIHJlamVjdChuZXcgVGltZW91dEVycm9yKCd3c2NsaWVudC5zZW5kIHRpbWVkb3V0JykpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LCBvcHRzLnRpbWVvdXQpXG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIGlmICh0aGlzLl9jb250ZXh0LmRlYnVnKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGBbcmVhbHRpbWVdIHdzIHNlbmQgKCR7bmV3IERhdGUoKX0pOiBgLCBvcHRzKVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgLy8gICBgW3JlYWx0aW1lXSB3cyBzZW5kICR7XG4gICAgICAgIC8vICAgICBvcHRzLm1zZy5tc2dUeXBlXG4gICAgICAgIC8vICAgfSAoJHtuZXcgRGF0ZSgpLnRvTG9jYWxlU3RyaW5nKCl9KTogYCxcbiAgICAgICAgLy8gICBvcHRzXG4gICAgICAgIC8vIClcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIGlmICh0aGlzLl93c0luaXRQcm9taXNlKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5fd3NJbml0UHJvbWlzZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl93cykge1xuICAgICAgICAgIHJlamVjdChcbiAgICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgJ2ludmFsaWQgc3RhdGU6IHdzIGNvbm5lY3Rpb24gbm90IGV4aXN0cywgY2FuIG5vdCBzZW5kIG1lc3NhZ2UnXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX3dzLnJlYWR5U3RhdGUgIT09IFdTX1JFQURZX1NUQVRFLk9QRU4pIHtcbiAgICAgICAgICByZWplY3QoXG4gICAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGB3cyByZWFkeVN0YXRlIGludmFsaWQ6ICR7dGhpcy5fd3MucmVhZHlTdGF0ZX0sIGNhbiBub3Qgc2VuZCBtZXNzYWdlYFxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRzLndhaXRSZXNwb25zZSkge1xuICAgICAgICAgIHRoaXMuX3dzUmVzcG9uc2VXYWl0LnNldChvcHRzLm1zZy5yZXF1ZXN0SWQsIHtcbiAgICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgICByZWplY3QsXG4gICAgICAgICAgICBza2lwT25NZXNzYWdlOiBvcHRzLnNraXBPbk1lc3NhZ2VcbiAgICAgICAgICB9IGFzIElSZXNwb25zZVdhaXRTcGVjKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gY29uc29sZS5sb2coJ3NlbmQgbXNnOicsIG9wdHMubXNnKVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuX3dzLnNlbmQoSlNPTi5zdHJpbmdpZnkob3B0cy5tc2cpKVxuICAgICAgICAgIGlmICghb3B0cy53YWl0UmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHJlc29sdmUoKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgcmVqZWN0KGVycilcbiAgICAgICAgICAgIGlmIChvcHRzLndhaXRSZXNwb25zZSkge1xuICAgICAgICAgICAgICB0aGlzLl93c1Jlc3BvbnNlV2FpdC5kZWxldGUob3B0cy5tc2cucmVxdWVzdElkKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyB0aGlzLl93cy5zZW5kKEpTT04uc3RyaW5naWZ5KG9wdHMubXNnKSwgZXJyID0+IHtcbiAgICAgICAgLy8gICBpZiAoZXJyKSB7XG4gICAgICAgIC8vICAgICByZWplY3QoZXJyKVxuICAgICAgICAvLyAgICAgaWYgKG9wdHMud2FpdFJlc3BvbnNlKSB7XG4gICAgICAgIC8vICAgICAgIHRoaXMuX3dzUmVzcG9uc2VXYWl0LmRlbGV0ZShvcHRzLm1zZy5yZXF1ZXN0SWQpXG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vICAgICByZXR1cm5cbiAgICAgICAgLy8gICB9XG5cbiAgICAgICAgLy8gICBpZiAoIW9wdHMud2FpdFJlc3BvbnNlKSB7XG4gICAgICAgIC8vICAgICByZXNvbHZlKClcbiAgICAgICAgLy8gICB9XG4gICAgICAgIC8vIH0pXG5cbiAgICAgICAgLy8gdGhpcy5fd3Muc2VuZCh7XG4gICAgICAgIC8vICAgZGF0YTogSlNPTi5zdHJpbmdpZnkob3B0cy5tc2cpLFxuICAgICAgICAvLyAgIHN1Y2Nlc3M6IHJlcyA9PiB7XG4gICAgICAgIC8vICAgICBpZiAoIW9wdHMud2FpdFJlc3BvbnNlKSB7XG4gICAgICAgIC8vICAgICAgIHJlc29sdmUocmVzKVxuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyAgIH0sXG4gICAgICAgIC8vICAgZmFpbDogZSA9PiB7XG4gICAgICAgIC8vICAgICByZWplY3QoZSlcbiAgICAgICAgLy8gICAgIGlmIChvcHRzLndhaXRSZXNwb25zZSkge1xuICAgICAgICAvLyAgICAgICB0aGlzLl93c1Jlc3BvbnNlV2FpdC5kZWxldGUob3B0cy5tc2cucmVxdWVzdElkKVxuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyAgIH1cbiAgICAgICAgLy8gfSlcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpXG4gICAgICB9XG4gICAgfSlcblxuICBjbG9zZShjb2RlOiBDTE9TRV9FVkVOVF9DT0RFKSB7XG4gICAgdGhpcy5jbGVhckhlYXJ0YmVhdCgpXG5cbiAgICBpZiAodGhpcy5fd3MpIHtcbiAgICAgIHRoaXMuX3dzLmNsb3NlKGNvZGUsIENMT1NFX0VWRU5UX0NPREVfSU5GT1tjb2RlXS5uYW1lKVxuICAgICAgdGhpcy5fd3MgPSB1bmRlZmluZWRcbiAgICB9XG4gIH1cblxuICBjbG9zZUFsbENsaWVudHMgPSAoZXJyb3I6IGFueSkgPT4ge1xuICAgIHRoaXMuX3ZpcnR1YWxXU0NsaWVudC5mb3JFYWNoKGNsaWVudCA9PiB7XG4gICAgICBjbGllbnQuY2xvc2VXaXRoRXJyb3IoZXJyb3IpXG4gICAgfSlcbiAgfVxuXG4gIHBhdXNlQ2xpZW50cyA9IChjbGllbnRzPzogU2V0PFZpcnR1YWxXZWJTb2NrZXRDbGllbnQ+KSA9PiB7XG4gICAgOyhjbGllbnRzIHx8IHRoaXMuX3ZpcnR1YWxXU0NsaWVudCkuZm9yRWFjaChjbGllbnQgPT4ge1xuICAgICAgY2xpZW50LnBhdXNlKClcbiAgICB9KVxuICB9XG5cbiAgcmVzdW1lQ2xpZW50cyA9IChjbGllbnRzPzogU2V0PFZpcnR1YWxXZWJTb2NrZXRDbGllbnQ+KSA9PiB7XG4gICAgOyhjbGllbnRzIHx8IHRoaXMuX3ZpcnR1YWxXU0NsaWVudCkuZm9yRWFjaChjbGllbnQgPT4ge1xuICAgICAgY2xpZW50LnJlc3VtZSgpXG4gICAgfSlcbiAgfVxuXG4gIHdhdGNoKG9wdGlvbnM6IElXU1dhdGNoT3B0aW9ucyk6IERCUmVhbHRpbWVMaXN0ZW5lciB7XG4gICAgaWYgKCF0aGlzLl93cyAmJiAhdGhpcy5fd3NJbml0UHJvbWlzZSkge1xuICAgICAgdGhpcy5pbml0V2ViU29ja2V0Q29ubmVjdGlvbihmYWxzZSlcbiAgICB9XG5cbiAgICBjb25zdCB2aXJ0dWFsQ2xpZW50ID0gbmV3IFZpcnR1YWxXZWJTb2NrZXRDbGllbnQoe1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHNlbmQ6IHRoaXMuc2VuZCxcbiAgICAgIGxvZ2luOiB0aGlzLndlYkxvZ2luLFxuICAgICAgaXNXU0Nvbm5lY3RlZDogdGhpcy5pc1dTQ29ubmVjdGVkLFxuICAgICAgb25jZVdTQ29ubmVjdGVkOiB0aGlzLm9uY2VXU0Nvbm5lY3RlZCxcbiAgICAgIGdldFdhaXRFeHBlY3RlZFRpbWVvdXRMZW5ndGg6IHRoaXMuZ2V0V2FpdEV4cGVjdGVkVGltZW91dExlbmd0aCxcbiAgICAgIG9uV2F0Y2hTdGFydDogdGhpcy5vbldhdGNoU3RhcnQsXG4gICAgICBvbldhdGNoQ2xvc2U6IHRoaXMub25XYXRjaENsb3NlLFxuICAgICAgZGVidWc6IHRydWVcbiAgICB9KVxuICAgIHRoaXMuX3ZpcnR1YWxXU0NsaWVudC5hZGQodmlydHVhbENsaWVudClcbiAgICB0aGlzLl93YXRjaElkQ2xpZW50TWFwLnNldCh2aXJ0dWFsQ2xpZW50LndhdGNoSWQsIHZpcnR1YWxDbGllbnQpXG4gICAgcmV0dXJuIHZpcnR1YWxDbGllbnQubGlzdGVuZXJcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFdlYlNvY2tldENvbm5lY3Rpb24gPSBhc3luYyAoXG4gICAgcmVjb25uZWN0OiBib29sZWFuLFxuICAgIGF2YWlsYWJsZVJldHJpZXM6IG51bWJlciA9IHRoaXMuX21heFJlY29ubmVjdFxuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAvLyDlvZPliY3lpITkuo7mraPlnKjph43ov57kuK3nmoTnirbmgIFcbiAgICBpZiAocmVjb25uZWN0ICYmIHRoaXMuX3JlY29ubmVjdFN0YXRlKSB7XG4gICAgICByZXR1cm4gLy8g5b+955WlXG4gICAgfVxuXG4gICAgaWYgKHJlY29ubmVjdCkge1xuICAgICAgdGhpcy5fcmVjb25uZWN0U3RhdGUgPSB0cnVlIC8vIOmHjei/nueKtuaAgeW8gOWni1xuICAgIH1cblxuICAgIGlmICh0aGlzLl93c0luaXRQcm9taXNlKSB7XG4gICAgICAvLyB0aGVyZSBhbHJlYWR5IGV4aXN0cyBhIHdlYnNvY2tldCBpbml0aWF0aW9uLCBqdXN0IHdhaXQgZm9yIGl0XG4gICAgICByZXR1cm4gdGhpcy5fd3NJbml0UHJvbWlzZVxuICAgIH1cblxuICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgIC8vIGNvbnNvbGUubG9nKFxuICAgIC8vICAgYFtyZWFsdGltZV0gaW5pdFdlYlNvY2tldENvbm5lY3Rpb24gcmVjb25uZWN0ICR7cmVjb25uZWN0fSBhdmFpbGFibGVSZXRyaWVzICR7YXZhaWxhYmxlUmV0cmllc31gXG4gICAgLy8gKVxuICAgIC8vIH1cblxuICAgIGlmIChyZWNvbm5lY3QpIHtcbiAgICAgIHRoaXMucGF1c2VDbGllbnRzKClcbiAgICB9XG5cbiAgICB0aGlzLmNsb3NlKENMT1NFX0VWRU5UX0NPREUuUmVjb25uZWN0V2ViU29ja2V0KVxuXG4gICAgdGhpcy5fd3NJbml0UHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgLy8gICAnW3JlYWx0aW1lXSBpbml0V2ViU29ja2V0Q29ubmVjdGlvbiBzdGFydCB0aHJvd0Vycm9ySWZOZXR3b3JrT2ZmbGluZSdcbiAgICAgICAgLy8gKVxuICAgICAgICAvLyB9XG5cbiAgICAgICAgLy8g5pqC5LiN5qOA5p+l572R57uc5oCBXG4gICAgICAgIC8vIGF3YWl0IHRocm93RXJyb3JJZk5ldHdvcmtPZmZsaW5lKClcblxuICAgICAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ1tyZWFsdGltZV0gaW5pdFdlYlNvY2tldENvbm5lY3Rpb24gc3RhcnQgZ2V0U2lnbmF0dXJlJylcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIC8vIGNvbnN0IHNpZ25hdHVyZSA9IGF3YWl0IHRoaXMuZ2V0U2lnbmF0dXJlKClcbiAgICAgICAgY29uc3Qgd3NTaWduID0gYXdhaXQgdGhpcy5nZXRXc1NpZ24oKVxuXG4gICAgICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnW3JlYWx0aW1lXSBpbml0V2ViU29ja2V0Q29ubmVjdGlvbiBnZXRTaWduYXR1cmUgc3VjY2VzcycpXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdbcmVhbHRpbWVdIGluaXRXZWJTb2NrZXRDb25uZWN0aW9uIHN0YXJ0IGNvbm5lY3RTb2NrZXQnKVxuICAgICAgICAvLyB9XG5cbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2Uoc3VjY2VzcyA9PiB7XG4gICAgICAgICAgLy8gdGhpcy5fd3MgPSBnZXRTREsodGhpcy5fY29udGV4dC5pZGVudGlmaWVycylcbiAgICAgICAgICAvLyAgIC5fc29ja2V0U2tpcENoZWNrRG9tYWluRmFjdG9yeSgpXG4gICAgICAgICAgLy8gICAuY29ubmVjdFNvY2tldCh7XG4gICAgICAgICAgLy8gICAgIHVybDogc2lnbmF0dXJlLndzVXJsLFxuICAgICAgICAgIC8vICAgICBoZWFkZXI6IHtcbiAgICAgICAgICAvLyAgICAgICBcImNvbnRlbnQtdHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgIC8vICAgICB9LFxuICAgICAgICAgIC8vICAgICBzdWNjZXNzOiAoKSA9PiBzdWNjZXNzKCksXG4gICAgICAgICAgLy8gICAgIGZhaWxcbiAgICAgICAgICAvLyAgIH0pXG5cbiAgICAgICAgICBjb25zdCB1cmwgPSB3c1NpZ24ud3NVcmwgfHwgJ3dzczovL3RjYi13cy50ZW5jZW50Y2xvdWRhcGkuY29tJztcbiAgICAgICAgICBjb25zdCB3c0NsYXNzID0gZ2V0V3NDbGFzcygpO1xuICAgICAgICAgIHRoaXMuX3dzID0gd3NDbGFzcyA/IG5ldyB3c0NsYXNzKHVybCkgOiBuZXcgV2ViU29ja2V0KHVybClcbiAgICAgICAgICBzdWNjZXNzKClcbiAgICAgICAgfSlcblxuICAgICAgICBpZih0aGlzLl93cy5jb25uZWN0KXtcbiAgICAgICAgICBhd2FpdCB0aGlzLl93cy5jb25uZWN0KClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgLy8gICAnW3JlYWx0aW1lXSBpbml0V2ViU29ja2V0Q29ubmVjdGlvbiBjb25uZWN0U29ja2V0IHN1Y2Nlc3NmdWxseSBmaXJlZCdcbiAgICAgICAgLy8gKVxuICAgICAgICAvLyB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5pbml0V2ViU29ja2V0RXZlbnQoKVxuICAgICAgICByZXNvbHZlKClcblxuICAgICAgICBpZiAocmVjb25uZWN0KSB7XG4gICAgICAgICAgdGhpcy5yZXN1bWVDbGllbnRzKClcbiAgICAgICAgICB0aGlzLl9yZWNvbm5lY3RTdGF0ZSA9IGZhbHNlIC8vIOmHjei/nueKtuaAgee7k+adn1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdbcmVhbHRpbWVdIGluaXRXZWJTb2NrZXRDb25uZWN0aW9uIGNvbm5lY3QgZmFpbCcsIGUpXG4gICAgICAgIC8vIH1cblxuICAgICAgICBpZiAoYXZhaWxhYmxlUmV0cmllcyA+IDApIHtcbiAgICAgICAgICAvLyB0aGlzIGlzIGFuIG9wdGltaXphdGlvbiwgaW4gY2FzZSBvZiBuZXR3b3JrIG9mZmxpbmUsIHdlIGRvbid0IG5lZWQgdG8gc3R1YmJvcm5seSBzbGVlcCBmb3Igc29tZXRpbWUsXG4gICAgICAgICAgLy8gd2Ugb25seSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBuZXR3b3JrIHRvIGJlIGJhY2sgb25saW5lLCB0aGlzIGVuc3VyZXMgbWluaW11bSBkb3dudGltZVxuICAgICAgICAgIC8vIGNvbnN0IHsgaXNDb25uZWN0ZWQgfSA9IGF3YWl0IGdldE5ldHdvcmtTdGF0dXMoKVxuICAgICAgICAgIGNvbnN0IGlzQ29ubmVjdGVkID0gdHJ1ZVxuXG4gICAgICAgICAgLy8gaWYgKHByb2Nlc3MuZW52LkRFQlVHKSB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICAnW3JlYWx0aW1lXSBpbml0V2ViU29ja2V0Q29ubmVjdGlvbiB3YWl0aW5nIGZvciBuZXR3b3JrIG9ubGluZSdcbiAgICAgICAgICAvLyApXG4gICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgLy8gYXV0byB3YWl0IHVudGlsIG5ldHdvcmsgb25saW5lLCBjYXVzZScgaXQgd291bGQgYmUgbWVhbmluZ2xlc3MgdG8gcmVjb25uZWN0IHdoaWxlIG5ldHdvcmsgaXMgb2ZmbGluZVxuXG4gICAgICAgICAgLy8gYXdhaXQgb25jZU5ldHdvcmtPbmxpbmUoKVxuXG4gICAgICAgICAgLy8gQ09NUEFUSUJJTElUWTogd2FpdCBmb3IgaWRlIHN0YXRlIHVwZGF0ZVxuICAgICAgICAgIC8vIGlmIChpc0RldlRvb2xzKCkpIHtcbiAgICAgICAgICAvLyAgIGF3YWl0IHNsZWVwKDApXG4gICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgLy8gaWYgKHByb2Nlc3MuZW52LkRFQlVHKSB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coJ1tyZWFsdGltZV0gaW5pdFdlYlNvY2tldENvbm5lY3Rpb24gbmV0d29yayBvbmxpbmUnKVxuICAgICAgICAgIC8vIH1cblxuICAgICAgICAgIHRoaXMuX3dzSW5pdFByb21pc2UgPSB1bmRlZmluZWRcblxuICAgICAgICAgIGlmIChpc0Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgLy8gaWYgKHByb2Nlc3MuZW52LkRFQlVHKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIC8vICAgYFtyZWFsdGltZV0gaW5pdFdlYlNvY2tldENvbm5lY3Rpb24gc2xlZXAgJHt0aGlzLl9yZWNvbm5lY3RJbnRlcnZhbH1tc2BcbiAgICAgICAgICAgIC8vIClcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIGF3YWl0IHNsZWVwKHRoaXMuX3JlY29ubmVjdEludGVydmFsKVxuICAgICAgICAgICAgaWYgKHJlY29ubmVjdCkge1xuICAgICAgICAgICAgICB0aGlzLl9yZWNvbm5lY3RTdGF0ZSA9IGZhbHNlIC8vIOmHjei/nuW8guW4uOS5n+eul+mHjei/nueKtuaAgee7k+adn1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlc29sdmUodGhpcy5pbml0V2ViU29ja2V0Q29ubmVjdGlvbihyZWNvbm5lY3QsIGF2YWlsYWJsZVJldHJpZXMgLSAxKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QoZSlcblxuICAgICAgICAgIGlmIChyZWNvbm5lY3QpIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VBbGxDbGllbnRzKFxuICAgICAgICAgICAgICBuZXcgQ2xvdWRTREtFcnJvcih7XG4gICAgICAgICAgICAgICAgZXJyQ29kZTogRVJSX0NPREUuU0RLX0RBVEFCQVNFX1JFQUxUSU1FX0xJU1RFTkVSX1JFQ09OTkVDVF9XQVRDSF9GQUlMIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICBlcnJNc2c6IGVcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gbGV0IHN1Y2Nlc3MgPSBmYWxzZVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX3dzSW5pdFByb21pc2VcbiAgICAgIC8vIHN1Y2Nlc3MgPSB0cnVlXG4gICAgICB0aGlzLl93c1JlYWR5U3Vic3JpYmVycy5mb3JFYWNoKCh7IHJlc29sdmUgfSkgPT4gcmVzb2x2ZSgpKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuX3dzUmVhZHlTdWJzcmliZXJzLmZvckVhY2goKHsgcmVqZWN0IH0pID0+IHJlamVjdCgpKVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl93c0luaXRQcm9taXNlID0gdW5kZWZpbmVkXG4gICAgICB0aGlzLl93c1JlYWR5U3Vic3JpYmVycyA9IFtdXG4gICAgfVxuXG4gICAgLy8gaWYgKHByb2Nlc3MuZW52LkRFQlVHKSB7XG4gICAgLy8gY29uc29sZS5sb2coXG4gICAgLy8gICBgW3JlYWx0aW1lXSBpbml0V2ViU29ja2V0Q29ubmVjdGlvbiAke3N1Y2Nlc3MgPyAnc3VjY2VzcycgOiAnZmFpbCd9YFxuICAgIC8vIClcbiAgICAvLyB9XG4gIH1cblxuICBwcml2YXRlIGluaXRXZWJTb2NrZXRFdmVudCA9ICgpID0+XG4gICAgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLl93cykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbiBub3QgaW5pdFdlYlNvY2tldEV2ZW50LCB3cyBub3QgZXhpc3RzJylcbiAgICAgIH1cblxuICAgICAgbGV0IHdzT3BlbmVkID0gZmFsc2VcblxuICAgICAgdGhpcy5fd3Mub25vcGVuID0gZXZlbnQgPT4ge1xuICAgICAgICAvLyB0aGlzLl93cy5vbk9wZW4oKCkgPT4ge1xuICAgICAgICAvLyB0aGlzLl93cy5vbihcIm9wZW5cIiwgKCkgPT4ge1xuICAgICAgICAvLyB0aGlzLl9jb250ZXh0LmRlYnVnICYmXG4gICAgICAgIGNvbnNvbGUud2FybignW3JlYWx0aW1lXSB3cyBldmVudDogb3BlbicsIGV2ZW50KVxuICAgICAgICB3c09wZW5lZCA9IHRydWVcbiAgICAgICAgcmVzb2x2ZSgpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3dzLm9uZXJyb3IgPSBldmVudCA9PiB7XG4gICAgICAgIC8vIHRoaXMuX3dzLm9uKFwiZXJyb3JcIiwgZXJyb3IgPT4ge1xuICAgICAgICAvLyB0aGlzLl93cy5vbkVycm9yKGVycm9yID0+IHtcbiAgICAgICAgLy8gYWxsIGxvZ2lucyBhcmUgaW52YWxpZCBhZnRlciBkaXNjb25uZWN0aW9uXG4gICAgICAgIHRoaXMuX2xvZ2lucyA9IG5ldyBNYXAoKVxuXG4gICAgICAgIC8vIGVycm9y5YaZ6L+bZmlsZVxuXG4gICAgICAgIGlmICghd3NPcGVuZWQpIHtcbiAgICAgICAgICAvLyB0aGlzLl9jb250ZXh0LmRlYnVnICYmXG4gICAgICAgICAgY29uc29sZS5lcnJvcignW3JlYWx0aW1lXSB3cyBvcGVuIGZhaWxlZCB3aXRoIHdzIGV2ZW50OiBlcnJvcicsIGV2ZW50KVxuICAgICAgICAgIC8vIHdyaXRlVG9GaWxlKFxuICAgICAgICAgIC8vICAgXCJ3c2Vycm9yLnR4dFwiLFxuICAgICAgICAgIC8vICAgYCR7XG4gICAgICAgICAgLy8gICAgIHRoaXMuc3BlY2lhbE51bWJlclxuICAgICAgICAgIC8vICAgfSBbcmVhbHRpbWVdIHdzIG9wZW4gZmFpbGVkIHdpdGggd3MgZXZlbnQ6IGVycm9yICR7ZXJyb3J9IFxcbmBcbiAgICAgICAgICAvLyApXG5cbiAgICAgICAgICByZWplY3QoZXZlbnQpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gdGhpcy5fY29udGV4dC5kZWJ1ZyAmJlxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tyZWFsdGltZV0gd3MgZXZlbnQ6IGVycm9yJywgZXZlbnQpXG5cbiAgICAgICAgICAvLyB3cml0ZVRvRmlsZShcbiAgICAgICAgICAvLyAgIFwid3NlcnJvci50eHRcIixcbiAgICAgICAgICAvLyAgIGAke3RoaXMuc3BlY2lhbE51bWJlcn0gW3JlYWx0aW1lXSB3cyBldmVudDogZXJyb3IgJHtlcnJvcn0gXFxuYFxuICAgICAgICAgIC8vIClcblxuICAgICAgICAgIHRoaXMuY2xlYXJIZWFydGJlYXQoKVxuICAgICAgICAgIHRoaXMuX3ZpcnR1YWxXU0NsaWVudC5mb3JFYWNoKGNsaWVudCA9PlxuICAgICAgICAgICAgY2xpZW50LmNsb3NlV2l0aEVycm9yKFxuICAgICAgICAgICAgICBuZXcgQ2xvdWRTREtFcnJvcih7XG4gICAgICAgICAgICAgICAgZXJyQ29kZTogRVJSX0NPREUuU0RLX0RBVEFCQVNFX1JFQUxUSU1FX0xJU1RFTkVSX1dFQlNPQ0tFVF9DT05ORUNUSU9OX0VSUk9SIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICBlcnJNc2c6IGV2ZW50XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRPRE86IHJlY29ubmVjdFxuICAgICAgdGhpcy5fd3Mub25jbG9zZSA9IGNsb3NlRXZlbnQgPT4ge1xuICAgICAgICAvLyB0aGlzLl93cy5vbihcImNsb3NlXCIsIChjbG9zZUV2ZW50LCBjbG9zZXJlYXNvbikgPT4ge1xuICAgICAgICAvLyB0aGlzLl93cy5vbkNsb3NlKGNsb3NlRXZlbnQgPT4ge1xuICAgICAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbcmVhbHRpbWVdIHdzIGV2ZW50OiBjbG9zZScsIGNsb3NlRXZlbnQpXG4gICAgICAgIC8vIH1cblxuICAgICAgICAvLyB3cml0ZVRvRmlsZShcbiAgICAgICAgLy8gICBcIndzY2xvc2UudHh0XCIsXG4gICAgICAgIC8vICAgYCR7XG4gICAgICAgIC8vICAgICB0aGlzLnNwZWNpYWxOdW1iZXJcbiAgICAgICAgLy8gICB9IFtyZWFsdGltZV0gd3MgZXZlbnQ6IGNsb3NlICR7Y2xvc2VFdmVudH0gJHtjbG9zZXJlYXNvbn0gXFxuYFxuICAgICAgICAvLyApXG5cbiAgICAgICAgLy8gYWxsIGxvZ2lucyBhcmUgaW52YWxpZCBhZnRlciBkaXNjb25uZWN0aW9uXG4gICAgICAgIHRoaXMuX2xvZ2lucyA9IG5ldyBNYXAoKVxuXG4gICAgICAgIHRoaXMuY2xlYXJIZWFydGJlYXQoKVxuICAgICAgICBzd2l0Y2ggKGNsb3NlRXZlbnQuY29kZSkge1xuICAgICAgICAgIGNhc2UgQ0xPU0VfRVZFTlRfQ09ERS5SZWNvbm5lY3RXZWJTb2NrZXQ6IHtcbiAgICAgICAgICAgIC8vIGp1c3QgaWdub3JlXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIENMT1NFX0VWRU5UX0NPREUuTm9SZWFsdGltZUxpc3RlbmVyczoge1xuICAgICAgICAgICAgLy8gcXVpdFxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBDTE9TRV9FVkVOVF9DT0RFLkhlYXJ0YmVhdFBpbmdFcnJvcjpcbiAgICAgICAgICBjYXNlIENMT1NFX0VWRU5UX0NPREUuSGVhcnRiZWF0UG9uZ1RpbWVvdXRFcnJvcjpcbiAgICAgICAgICBjYXNlIENMT1NFX0VWRU5UX0NPREUuTm9ybWFsQ2xvc3VyZTpcbiAgICAgICAgICBjYXNlIENMT1NFX0VWRU5UX0NPREUuQWJub3JtYWxDbG9zdXJlOiB7XG4gICAgICAgICAgICAvLyBOb3JtYWwgQ2xvc3VyZSBhbmQgQWJub3JtYWwgQ2xvc3VyZTpcbiAgICAgICAgICAgIC8vICAgZXhwZWN0ZWQgY2xvc3VyZSwgbW9zdCBsaWtlbHkgZGlzcGF0Y2hlZCBieSB3ZWNoYXQgY2xpZW50LFxuICAgICAgICAgICAgLy8gICBzaW5jZSB0aGlzIGlzIHRoZSBzdGF0dXMgY29kZSBkaXNwYXRjaGVkIGluIGNhc2Ugb2YgbmV0d29yayBmYWlsdXJlLFxuICAgICAgICAgICAgLy8gICB3ZSBzaG91bGQgcmV0cnlcblxuICAgICAgICAgICAgaWYgKHRoaXMuX21heFJlY29ubmVjdCA+IDApIHtcbiAgICAgICAgICAgICAgLy8gaWYgKHRoaXMuX2F2YWlsYWJsZVJldHJpZXMgPiAwKSB7XG4gICAgICAgICAgICAgIHRoaXMuaW5pdFdlYlNvY2tldENvbm5lY3Rpb24odHJ1ZSwgdGhpcy5fbWF4UmVjb25uZWN0KVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5jbG9zZUFsbENsaWVudHMoZ2V0V1NDbG9zZUVycm9yKGNsb3NlRXZlbnQuY29kZSkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIENMT1NFX0VWRU5UX0NPREUuTm9BdXRoZW50aWNhdGlvbjoge1xuICAgICAgICAgICAgdGhpcy5jbG9zZUFsbENsaWVudHMoXG4gICAgICAgICAgICAgIGdldFdTQ2xvc2VFcnJvcihjbG9zZUV2ZW50LmNvZGUsIGNsb3NlRXZlbnQucmVhc29uKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIHJldHJ5IGJ5IGRlZmF1bHRcbiAgICAgICAgICAgIGlmICh0aGlzLl9tYXhSZWNvbm5lY3QgPiAwKSB7XG4gICAgICAgICAgICAgIC8vIGlmICh0aGlzLl9hdmFpbGFibGVSZXRyaWVzID4gMCkge1xuICAgICAgICAgICAgICB0aGlzLmluaXRXZWJTb2NrZXRDb25uZWN0aW9uKHRydWUsIHRoaXMuX21heFJlY29ubmVjdClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuY2xvc2VBbGxDbGllbnRzKGdldFdTQ2xvc2VFcnJvcihjbG9zZUV2ZW50LmNvZGUpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY29uc29sZS53YXJuKGBbcmVhbHRpbWVdIHVucmVjb2duaXplIHdzIGNsb3NlIGV2ZW50YCwgY2xvc2VFdmVudClcbiAgICAgICAgICAgIC8vIHRoaXMuY2xvc2VBbGxDbGllbnRzKGdldFdTQ2xvc2VFcnJvcihjbG9zZUV2ZW50LmNvZGUpKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLl93cy5vbm1lc3NhZ2UgPSByZXMgPT4ge1xuICAgICAgICAvLyB0aGlzLl93cy5vbihcIm1lc3NhZ2VcIiwgcmVzID0+IHtcbiAgICAgICAgLy8gdGhpcy5fd3Mub25NZXNzYWdlKHJlcyA9PiB7XG4gICAgICAgIC8vIGNvbnN0IHJhd01zZyA9IHJlcy5kYXRhXG4gICAgICAgIGNvbnN0IHJhd01zZyA9IHJlcy5kYXRhXG5cbiAgICAgICAgLy8gcmVzZXQgJiByZXN0YXJ0IGhlYXJ0YmVhdFxuICAgICAgICB0aGlzLmhlYXJ0YmVhdCgpXG5cbiAgICAgICAgbGV0IG1zZzogSVJlc3BvbnNlTWVzc2FnZVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbXNnID0gSlNPTi5wYXJzZShyYXdNc2cgYXMgc3RyaW5nKVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBbcmVhbHRpbWVdIG9uTWVzc2FnZSBwYXJzZSByZXMuZGF0YSBlcnJvcjogJHtlfWApXG4gICAgICAgIH1cblxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgLy8gICBgW3JlYWx0aW1lXSBvbk1lc3NhZ2UgJHtcbiAgICAgICAgLy8gICAgIG1zZy5tc2dUeXBlXG4gICAgICAgIC8vICAgfSAoJHtuZXcgRGF0ZSgpLnRvTG9jYWxlU3RyaW5nKCl9KWAsXG4gICAgICAgIC8vICAgbXNnXG4gICAgICAgIC8vIClcblxuICAgICAgICBpZiAobXNnLm1zZ1R5cGUgPT09ICdFUlJPUicpIHtcbiAgICAgICAgICAvLyDmib7liLDlvZPliY3nm5HlkKzvvIzlubblsIZlcnJvcui/lOWbnlxuICAgICAgICAgIGxldCB2aXJ0dWFsV2F0Y2ggPSBudWxsXG4gICAgICAgICAgdGhpcy5fdmlydHVhbFdTQ2xpZW50LmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBpZiAoaXRlbS53YXRjaElkID09PSBtc2cud2F0Y2hJZCkge1xuICAgICAgICAgICAgICB2aXJ0dWFsV2F0Y2ggPSBpdGVtXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGlmICh2aXJ0dWFsV2F0Y2gpIHtcbiAgICAgICAgICAgIHZpcnR1YWxXYXRjaC5saXN0ZW5lci5vbkVycm9yKG1zZylcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZVdhaXRTcGVjID0gdGhpcy5fd3NSZXNwb25zZVdhaXQuZ2V0KG1zZy5yZXF1ZXN0SWQpXG4gICAgICAgIGlmIChyZXNwb25zZVdhaXRTcGVjKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChtc2cubXNnVHlwZSA9PT0gJ0VSUk9SJykge1xuICAgICAgICAgICAgICByZXNwb25zZVdhaXRTcGVjLnJlamVjdChuZXcgUmVhbHRpbWVFcnJvck1lc3NhZ2VFcnJvcihtc2cpKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzcG9uc2VXYWl0U3BlYy5yZXNvbHZlKG1zZylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyB0aGlzLl9jb250ZXh0LmRlYnVnICYmXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAnd3Mgb25NZXNzYWdlIHJlc3BvbnNlV2FpdFNwZWMucmVzb2x2ZShtc2cpIGVycm9yZWQ6JyxcbiAgICAgICAgICAgICAgZVxuICAgICAgICAgICAgKVxuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLl93c1Jlc3BvbnNlV2FpdC5kZWxldGUobXNnLnJlcXVlc3RJZClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlc3BvbnNlV2FpdFNwZWMuc2tpcE9uTWVzc2FnZSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1zZy5tc2dUeXBlID09PSAnUE9ORycpIHtcbiAgICAgICAgICBpZiAodGhpcy5fbGFzdFBpbmdTZW5kVFMpIHtcbiAgICAgICAgICAgIGNvbnN0IHJ0dCA9IERhdGUubm93KCkgLSB0aGlzLl9sYXN0UGluZ1NlbmRUU1xuICAgICAgICAgICAgaWYgKHJ0dCA+IERFRkFVTFRfVU5UUlVTVEVEX1JUVF9USFJFU0hPTEQpIHtcbiAgICAgICAgICAgICAgLy8gdGhpcy5fY29udGV4dC5kZWJ1ZyAmJlxuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYFtyZWFsdGltZV0gdW50cnVzdGVkIHJ0dCBvYnNlcnZlZDogJHtydHR9YClcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fcnR0T2JzZXJ2ZWQubGVuZ3RoID49IE1BWF9SVFRfT0JTRVJWRUQpIHtcbiAgICAgICAgICAgICAgdGhpcy5fcnR0T2JzZXJ2ZWQuc3BsaWNlKFxuICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgdGhpcy5fcnR0T2JzZXJ2ZWQubGVuZ3RoIC0gTUFYX1JUVF9PQlNFUlZFRCArIDFcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcnR0T2JzZXJ2ZWQucHVzaChydHQpXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNsaWVudCA9IG1zZy53YXRjaElkICYmIHRoaXMuX3dhdGNoSWRDbGllbnRNYXAuZ2V0KG1zZy53YXRjaElkKVxuICAgICAgICBpZiAoY2xpZW50KSB7XG4gICAgICAgICAgY2xpZW50Lm9uTWVzc2FnZShtc2cpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVE9ETywgdGhpcyBpcyBhIHRlbXBvcmFyeSBmaXggZG9uZSBmb3Igc2VydmVyXG4gICAgICAgICAgLy8gaWYgKHByb2Nlc3MuZW52LkRFQlVHKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIGBbcmVhbHRpbWVdIG5vIHJlYWx0aW1lIGxpc3RlbmVyIGZvdW5kIHJlc3BvbnNpYmxlIGZvciB3YXRjaElkICR7bXNnLndhdGNoSWR9OiBgLFxuICAgICAgICAgICAgbXNnXG4gICAgICAgICAgKVxuICAgICAgICAgIC8vIH1cbiAgICAgICAgICBzd2l0Y2ggKG1zZy5tc2dUeXBlKSB7XG4gICAgICAgICAgICBjYXNlICdJTklUX0VWRU5UJzpcbiAgICAgICAgICAgIGNhc2UgJ05FWFRfRVZFTlQnOlxuICAgICAgICAgICAgY2FzZSAnQ0hFQ0tfRVZFTlQnOiB7XG4gICAgICAgICAgICAgIGNsaWVudCA9IHRoaXMuX3F1ZXJ5SWRDbGllbnRNYXAuZ2V0KG1zZy5tc2dEYXRhLnF1ZXJ5SUQpXG4gICAgICAgICAgICAgIGlmIChjbGllbnQpIHtcbiAgICAgICAgICAgICAgICBjbGllbnQub25NZXNzYWdlKG1zZylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IFssY2xpZW50XSBvZiBBcnJheS5mcm9tKHRoaXMuX3dhdGNoSWRDbGllbnRNYXAuZW50cmllcygpKSkge1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCd3YXRjaGlkKioqKionLCB3YXRjaElkKVxuICAgICAgICAgICAgICAgIGNsaWVudC5vbk1lc3NhZ2UobXNnKVxuICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5oZWFydGJlYXQoKVxuICAgIH0pXG5cbiAgcHJpdmF0ZSBpc1dTQ29ubmVjdGVkID0gKCk6IGJvb2xlYW4gPT4ge1xuICAgIHJldHVybiBCb29sZWFuKHRoaXMuX3dzICYmIHRoaXMuX3dzLnJlYWR5U3RhdGUgPT09IFdTX1JFQURZX1NUQVRFLk9QRU4pXG4gIH1cblxuICBwcml2YXRlIG9uY2VXU0Nvbm5lY3RlZCA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZiAodGhpcy5pc1dTQ29ubmVjdGVkKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLl93c0luaXRQcm9taXNlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fd3NJbml0UHJvbWlzZVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLl93c1JlYWR5U3Vic3JpYmVycy5wdXNoKHtcbiAgICAgICAgcmVzb2x2ZSxcbiAgICAgICAgcmVqZWN0XG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIHdlYkxvZ2luID0gYXN5bmMgKFxuICAgIGVudklkPzogc3RyaW5nLFxuICAgIHJlZnJlc2g/OiBib29sZWFuXG4gICk6IFByb21pc2U8YW55PiA9PiB7XG4gICAgaWYgKCFyZWZyZXNoKSB7XG4gICAgICAvLyBsZXQgbG9naW5JbmZvID0gdGhpcy5fbG9naW5JbmZvXG4gICAgICBpZiAoZW52SWQpIHtcbiAgICAgICAgY29uc3QgbG9naW5JbmZvID0gdGhpcy5fbG9naW5zLmdldChlbnZJZClcbiAgICAgICAgaWYgKGxvZ2luSW5mbykge1xuICAgICAgICAgIGlmIChsb2dpbkluZm8ubG9nZ2VkSW4gJiYgbG9naW5JbmZvLmxvZ2luUmVzdWx0KSB7XG4gICAgICAgICAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdbcmVhbHRpbWVdIGxvZ2luOiBhbHJlYWR5IGxvZ2dlZCBpbicpXG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICByZXR1cm4gbG9naW5JbmZvLmxvZ2luUmVzdWx0XG4gICAgICAgICAgfSBlbHNlIGlmIChsb2dpbkluZm8ubG9nZ2luZ0luUHJvbWlzZSkge1xuICAgICAgICAgICAgcmV0dXJuIGxvZ2luSW5mby5sb2dnaW5nSW5Qcm9taXNlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBlbXB0eUVudkxvZ2luSW5mbyA9IHRoaXMuX2xvZ2lucy5nZXQoJycpXG4gICAgICAgIGlmIChlbXB0eUVudkxvZ2luSW5mbz8ubG9nZ2luZ0luUHJvbWlzZSkge1xuICAgICAgICAgIHJldHVybiBlbXB0eUVudkxvZ2luSW5mby5sb2dnaW5nSW5Qcm9taXNlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gY29uc29sZS5sb2coJ1tyZWFsdGltZV0gbG9naW46IGxvZ2dpbmcgaW4nKVxuXG4gICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlPElMb2dpblJlc3VsdD4oYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gY29uc3Qgc2lnbmF0dXJlID0gYXdhaXQgdGhpcy5nZXRTaWduYXR1cmUoZW52SWQsIHJlZnJlc2gpXG5cbiAgICAgICAgY29uc3Qgd3NTaWduID0gYXdhaXQgdGhpcy5nZXRXc1NpZ24oKVxuXG4gICAgICAgIC8vIGNvbnN0IHd4VmVyc2lvbiA9IGdldFdYVmVyc2lvbigpXG4gICAgICAgIGNvbnN0IG1zZ0RhdGE6IElSZXF1ZXN0TWVzc2FnZUxvZ2luRGF0YSA9IHtcbiAgICAgICAgICBlbnZJZDogd3NTaWduLmVudklkIHx8ICcnLFxuICAgICAgICAgIGFjY2Vzc1Rva2VuOiAnJywgLy8g5bey5bqf5byD5a2X5q61XG4gICAgICAgICAgLy8gc2lnblN0cjogc2lnbmF0dXJlLnNpZ25TdHIsXG4gICAgICAgICAgLy8gc2VjcmV0VmVyc2lvbjogc2lnbmF0dXJlLnNlY3JldFZlcnNpb24sXG4gICAgICAgICAgcmVmZXJyZXI6ICd3ZWInLFxuICAgICAgICAgIHNka1ZlcnNpb246ICcnLFxuICAgICAgICAgIGRhdGFWZXJzaW9uOiAnJ1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxvZ2luTXNnOiBJUmVxdWVzdE1lc3NhZ2VMb2dpbk1zZyA9IHtcbiAgICAgICAgICB3YXRjaElkOiB1bmRlZmluZWQsXG4gICAgICAgICAgcmVxdWVzdElkOiBnZW5SZXF1ZXN0SWQoKSxcbiAgICAgICAgICBtc2dUeXBlOiAnTE9HSU4nLFxuICAgICAgICAgIG1zZ0RhdGEsXG4gICAgICAgICAgZXhNc2dEYXRhOiB7XG4gICAgICAgICAgICBydW50aW1lOiBnZXRSdW50aW1lKCksXG4gICAgICAgICAgICBzaWduU3RyOiB3c1NpZ24uc2lnblN0cixcbiAgICAgICAgICAgIHNlY3JldFZlcnNpb246IHdzU2lnbi5zZWNyZXRWZXJzaW9uXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxvZ2luUmVzTXNnID0gYXdhaXQgdGhpcy5zZW5kPElSZXNwb25zZU1lc3NhZ2VMb2dpblJlc01zZz4oe1xuICAgICAgICAgIG1zZzogbG9naW5Nc2csXG4gICAgICAgICAgd2FpdFJlc3BvbnNlOiB0cnVlLFxuICAgICAgICAgIHNraXBPbk1lc3NhZ2U6IHRydWUsXG4gICAgICAgICAgdGltZW91dDogREVGQVVMVF9MT0dJTl9USU1FT1VUXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYgKCFsb2dpblJlc01zZy5tc2dEYXRhLmNvZGUpIHtcbiAgICAgICAgICAvLyBsb2dpbiBzdWNjZXNzXG4gICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICBlbnZJZDogd3NTaWduLmVudklkXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBsb2dpbiBmYWlsZWRcbiAgICAgICAgICByZWplY3QoXG4gICAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGAke2xvZ2luUmVzTXNnLm1zZ0RhdGEuY29kZX0gJHtsb2dpblJlc01zZy5tc2dEYXRhLm1lc3NhZ2V9YFxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gbGV0IGxvZ2luSW5mbyA9IHRoaXMuX2xvZ2luSW5mb1xuICAgIGxldCBsb2dpbkluZm8gPSBlbnZJZCAmJiB0aGlzLl9sb2dpbnMuZ2V0KGVudklkKVxuXG4gICAgY29uc3QgbG9naW5TdGFydFRTID0gRGF0ZS5ub3coKVxuXG4gICAgaWYgKGxvZ2luSW5mbykge1xuICAgICAgbG9naW5JbmZvLmxvZ2dlZEluID0gZmFsc2VcbiAgICAgIGxvZ2luSW5mby5sb2dnaW5nSW5Qcm9taXNlID0gcHJvbWlzZVxuICAgICAgbG9naW5JbmZvLmxvZ2luU3RhcnRUUyA9IGxvZ2luU3RhcnRUU1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2dpbkluZm8gPSB7XG4gICAgICAgIGxvZ2dlZEluOiBmYWxzZSxcbiAgICAgICAgbG9nZ2luZ0luUHJvbWlzZTogcHJvbWlzZSxcbiAgICAgICAgbG9naW5TdGFydFRTXG4gICAgICB9XG4gICAgICAvLyB0aGlzLl9sb2dpbkluZm8gPSBsb2dpbkluZm9cbiAgICAgIHRoaXMuX2xvZ2lucy5zZXQoZW52SWQgfHwgJycsIGxvZ2luSW5mbylcbiAgICB9XG5cbiAgICAvLyB0cnkge1xuICAgIC8vICAgY29uc3QgbG9naW5SZXN1bHQgPSBhd2FpdCBwcm9taXNlXG4gICAgLy8gICBsb2dpbkluZm8ubG9nZ2VkSW4gPSB0cnVlXG4gICAgLy8gICBsb2dpbkluZm8ubG9nZ2luZ0luUHJvbWlzZSA9IHVuZGVmaW5lZFxuICAgIC8vICAgbG9naW5JbmZvLmxvZ2luU3RhcnRUUyA9IHVuZGVmaW5lZFxuICAgIC8vICAgbG9naW5JbmZvLmxvZ2luUmVzdWx0ID0gbG9naW5SZXN1bHRcbiAgICAvLyAgIHJldHVybiBsb2dpblJlc3VsdFxuICAgIC8vIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyAgIGxvZ2luSW5mby5sb2dnZWRJbiA9IGZhbHNlXG4gICAgLy8gICBsb2dpbkluZm8ubG9nZ2luZ0luUHJvbWlzZSA9IHVuZGVmaW5lZFxuICAgIC8vICAgbG9naW5JbmZvLmxvZ2luU3RhcnRUUyA9IHVuZGVmaW5lZFxuICAgIC8vICAgbG9naW5JbmZvLmxvZ2luUmVzdWx0ID0gdW5kZWZpbmVkXG4gICAgLy8gICB0aHJvdyBlXG4gICAgLy8gfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGxvZ2luUmVzdWx0ID0gYXdhaXQgcHJvbWlzZVxuICAgICAgY29uc3QgY3VyTG9naW5JbmZvID0gZW52SWQgJiYgdGhpcy5fbG9naW5zLmdldChlbnZJZClcbiAgICAgIGlmIChcbiAgICAgICAgY3VyTG9naW5JbmZvICYmXG4gICAgICAgIGN1ckxvZ2luSW5mbyA9PT0gbG9naW5JbmZvICYmXG4gICAgICAgIGN1ckxvZ2luSW5mby5sb2dpblN0YXJ0VFMgPT09IGxvZ2luU3RhcnRUU1xuICAgICAgKSB7XG4gICAgICAgIGxvZ2luSW5mby5sb2dnZWRJbiA9IHRydWVcbiAgICAgICAgbG9naW5JbmZvLmxvZ2dpbmdJblByb21pc2UgPSB1bmRlZmluZWRcbiAgICAgICAgbG9naW5JbmZvLmxvZ2luU3RhcnRUUyA9IHVuZGVmaW5lZFxuICAgICAgICBsb2dpbkluZm8ubG9naW5SZXN1bHQgPSBsb2dpblJlc3VsdFxuICAgICAgICByZXR1cm4gbG9naW5SZXN1bHRcbiAgICAgIH0gZWxzZSBpZiAoY3VyTG9naW5JbmZvKSB7XG4gICAgICAgIGlmIChjdXJMb2dpbkluZm8ubG9nZ2VkSW4gJiYgY3VyTG9naW5JbmZvLmxvZ2luUmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIGN1ckxvZ2luSW5mby5sb2dpblJlc3VsdFxuICAgICAgICB9IGVsc2UgaWYgKGN1ckxvZ2luSW5mby5sb2dnaW5nSW5Qcm9taXNlKSB7XG4gICAgICAgICAgcmV0dXJuIGN1ckxvZ2luSW5mby5sb2dnaW5nSW5Qcm9taXNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd3cyB1bmV4cGVjdGVkIGxvZ2luIGluZm8nKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dzIGxvZ2luIGluZm8gcmVzZXQnKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZ2luSW5mby5sb2dnZWRJbiA9IGZhbHNlXG4gICAgICBsb2dpbkluZm8ubG9nZ2luZ0luUHJvbWlzZSA9IHVuZGVmaW5lZFxuICAgICAgbG9naW5JbmZvLmxvZ2luU3RhcnRUUyA9IHVuZGVmaW5lZFxuICAgICAgbG9naW5JbmZvLmxvZ2luUmVzdWx0ID0gdW5kZWZpbmVkXG4gICAgICB0aHJvdyBlXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRXc1NpZ24gPSBhc3luYyAoKTogUHJvbWlzZTxJV3NTaWduPiA9PiB7XG4gICAgaWYgKHRoaXMuX3dzU2lnbiAmJiB0aGlzLl93c1NpZ24uZXhwaXJlZFRzID4gRGF0ZS5ub3coKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3dzU2lnblxuICAgIH1cbiAgICBjb25zdCBleHBpcmVkVHMgPSBEYXRlLm5vdygpICsgNjAwMDBcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLl9jb250ZXh0LmFwcENvbmZpZy5yZXF1ZXN0LnNlbmQoJ2F1dGgud3NXZWJTaWduJywge3J1bnRpbWU6IGdldFJ1bnRpbWUoKX0pXG5cbiAgICBpZiAocmVzLmNvZGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW3RjYi1qcy1zZGtdIOiOt+WPluWunuaXtuaVsOaNruaOqOmAgeeZu+W9leelqOaNruWksei0pTogJHtyZXMuY29kZX1gKVxuICAgIH1cblxuICAgIGlmIChyZXMuZGF0YSkge1xuICAgICAgY29uc3Qge3NpZ25TdHIsIHdzVXJsLCBzZWNyZXRWZXJzaW9uLCBlbnZJZH0gPSByZXMuZGF0YVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2lnblN0cixcbiAgICAgICAgd3NVcmwsXG4gICAgICAgIHNlY3JldFZlcnNpb24sXG4gICAgICAgIGVudklkLFxuICAgICAgICBleHBpcmVkVHNcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdbdGNiLWpzLXNka10g6I635Y+W5a6e5pe25pWw5o2u5o6o6YCB55m75b2V56Wo5o2u5aSx6LSlJylcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFdhaXRFeHBlY3RlZFRpbWVvdXRMZW5ndGggPSAoKSA9PiB7XG4gICAgaWYgKCF0aGlzLl9ydHRPYnNlcnZlZC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBERUZBVUxUX0VYUEVDVEVEX0VWRU5UX1dBSVRfVElNRVxuICAgIH1cblxuICAgIC8vIDEuNSAqIFJUVFxuICAgIHJldHVybiAoXG4gICAgICAodGhpcy5fcnR0T2JzZXJ2ZWQucmVkdWNlKChhY2MsIGN1cikgPT4gYWNjICsgY3VyKSAvXG4gICAgICAgIHRoaXMuX3J0dE9ic2VydmVkLmxlbmd0aCkgKlxuICAgICAgMS41XG4gICAgKVxuICB9XG5cbiAgcHJpdmF0ZSBoZWFydGJlYXQoaW1tZWRpYXRlPzogYm9vbGVhbikge1xuICAgIHRoaXMuY2xlYXJIZWFydGJlYXQoKVxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLl9waW5nVGltZW91dElkID0gc2V0VGltZW91dChcbiAgICAgIGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoIXRoaXMuX3dzIHx8IHRoaXMuX3dzLnJlYWR5U3RhdGUgIT09IFdTX1JFQURZX1NUQVRFLk9QRU4pIHtcbiAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gcGluZ1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5fbGFzdFBpbmdTZW5kVFMgPSBEYXRlLm5vdygpXG4gICAgICAgICAgYXdhaXQgdGhpcy5waW5nKClcbiAgICAgICAgICB0aGlzLl9waW5nRmFpbGVkID0gMFxuXG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIHRoaXMuX3BvbmdUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3BvbmcgdGltZWQgb3V0JylcbiAgICAgICAgICAgIGlmICh0aGlzLl9wb25nTWlzc2VkIDwgREVGQVVMVF9QT05HX01JU1NfVE9MRVJBTkNFKSB7XG4gICAgICAgICAgICAgIHRoaXMuX3BvbmdNaXNzZWQrK1xuICAgICAgICAgICAgICB0aGlzLmhlYXJ0YmVhdCh0cnVlKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gbG9naWNhbCBwZXJjZWl2ZWQgY29ubmVjdGlvbiBsb3N0LCBldmVuIHRob3VnaCB3ZWJzb2NrZXQgZGlkIG5vdCByZWNlaXZlIGVycm9yIG9yIGNsb3NlIGV2ZW50XG4gICAgICAgICAgICAgIHRoaXMuaW5pdFdlYlNvY2tldENvbm5lY3Rpb24odHJ1ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCB0aGlzLl9jb250ZXh0LmFwcENvbmZpZy5yZWFsdGltZVBvbmdXYWl0VGltZW91dClcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmICh0aGlzLl9waW5nRmFpbGVkIDwgREVGQVVMVF9QSU5HX0ZBSUxfVE9MRVJBTkNFKSB7XG4gICAgICAgICAgICB0aGlzLl9waW5nRmFpbGVkKytcbiAgICAgICAgICAgIHRoaXMuaGVhcnRiZWF0KClcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jbG9zZShDTE9TRV9FVkVOVF9DT0RFLkhlYXJ0YmVhdFBpbmdFcnJvcilcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBpbW1lZGlhdGUgPyAwIDogdGhpcy5fY29udGV4dC5hcHBDb25maWcucmVhbHRpbWVQaW5nSW50ZXJ2YWxcbiAgICApXG4gIH1cblxuICBwcml2YXRlIHBpbmcgPSBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbXNnOiBJUmVxdWVzdE1lc3NhZ2VQaW5nTXNnID0ge1xuICAgICAgd2F0Y2hJZDogdW5kZWZpbmVkLFxuICAgICAgcmVxdWVzdElkOiBnZW5SZXF1ZXN0SWQoKSxcbiAgICAgIG1zZ1R5cGU6ICdQSU5HJyxcbiAgICAgIG1zZ0RhdGE6IG51bGxcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5zZW5kKHtcbiAgICAgIG1zZ1xuICAgIH0pXG4gICAgLy8gY29uc29sZS5sb2coJ3Bpbmcgc2VudCcpXG4gIH1cblxuICBwcml2YXRlIG9uV2F0Y2hTdGFydCA9IChjbGllbnQ6IFZpcnR1YWxXZWJTb2NrZXRDbGllbnQsIHF1ZXJ5SUQ6IHN0cmluZykgPT4ge1xuICAgIHRoaXMuX3F1ZXJ5SWRDbGllbnRNYXAuc2V0KHF1ZXJ5SUQsIGNsaWVudClcbiAgfVxuXG4gIHByaXZhdGUgb25XYXRjaENsb3NlID0gKGNsaWVudDogVmlydHVhbFdlYlNvY2tldENsaWVudCwgcXVlcnlJRDogc3RyaW5nKSA9PiB7XG4gICAgaWYgKHF1ZXJ5SUQpIHtcbiAgICAgIHRoaXMuX3F1ZXJ5SWRDbGllbnRNYXAuZGVsZXRlKHF1ZXJ5SUQpXG4gICAgfVxuICAgIHRoaXMuX3dhdGNoSWRDbGllbnRNYXAuZGVsZXRlKGNsaWVudC53YXRjaElkKVxuICAgIHRoaXMuX3ZpcnR1YWxXU0NsaWVudC5kZWxldGUoY2xpZW50KVxuXG4gICAgaWYgKCF0aGlzLl92aXJ0dWFsV1NDbGllbnQuc2l6ZSkge1xuICAgICAgLy8gbm8gbW9yZSBleGlzdGluZyB3YXRjaCwgd2Ugc2hvdWxkIHJlbGVhc2UgdGhlIHdlYnNvY2tldCBjb25uZWN0aW9uXG4gICAgICB0aGlzLmNsb3NlKENMT1NFX0VWRU5UX0NPREUuTm9SZWFsdGltZUxpc3RlbmVycylcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
749
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93ZWJzb2NrZXQtY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsdUVBQW1FO0FBQ25FLHFDQUF3QztBQWN4Qyx1Q0FJbUI7QUFFbkIsaUNBQTBGO0FBQzFGLG1DQUFpRDtBQUNqRCxpQ0FBK0I7QUE0RC9CLElBQU0sY0FBYyxHQUFHO0lBQ3JCLFVBQVUsRUFBRSxDQUFDO0lBQ2IsSUFBSSxFQUFFLENBQUM7SUFDUCxPQUFPLEVBQUUsQ0FBQztJQUNWLE1BQU0sRUFBRSxDQUFDO0NBQ1YsQ0FBQTtBQUVELElBQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFBO0FBQzFCLElBQU0sZ0NBQWdDLEdBQUcsSUFBSSxDQUFBO0FBQzdDLElBQU0sK0JBQStCLEdBQUcsS0FBSyxDQUFBO0FBQzdDLElBQU0scUJBQXFCLEdBQUcsQ0FBQyxDQUFBO0FBQy9CLElBQU0sNkJBQTZCLEdBQUcsS0FBSyxDQUFBO0FBRTNDLElBQU0sMkJBQTJCLEdBQUcsQ0FBQyxDQUFBO0FBQ3JDLElBQU0sMkJBQTJCLEdBQUcsQ0FBQyxDQUFBO0FBQ3JDLElBQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFBO0FBRWxDO0lBK0JFLGlDQUFZLE9BQW1EO1FBQS9ELGlCQUtDO1FBbkNPLG9CQUFlLEdBQWdDLElBQUksR0FBRyxFQUFFLENBQUE7UUFFeEQscUJBQWdCLEdBQXdDLElBQUksR0FBRyxFQUFFLENBQUE7UUFDakUscUJBQWdCLEdBQXdDLElBQUksR0FBRyxFQUFFLENBQUE7UUFRakUsZUFBVSxHQUFHLENBQUMsQ0FBQTtRQUNkLGVBQVUsR0FBRyxDQUFDLENBQUE7UUFHZCxXQUFNLEdBQXdDLElBQUksR0FBRyxFQUFFLENBQUE7UUFJdkQsc0JBQWlCLEdBQXFCLEVBQUUsQ0FBQTtRQUN4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QVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsQ0FDNUQsQ0FBQTtJQUNILENBQUM7SUE4QkgsOEJBQUM7QUFBRCxDQUFDLEFBNXFCRCxJQTRxQkM7QUE1cUJZLDBEQUF1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFZpcnR1YWxXZWJTb2NrZXRDbGllbnQgfSBmcm9tICcuL3ZpcnR1YWwtd2Vic29ja2V0LWNsaWVudCdcbmltcG9ydCB7IGdlblJlcXVlc3RJZCB9IGZyb20gJy4vbWVzc2FnZSdcbmltcG9ydCB7XG4gIElEYXRhYmFzZVNlcnZpY2VDb250ZXh0LFxufSBmcm9tICdAY2xvdWRiYXNlL3R5cGVzL2RhdGFiYXNlJ1xuaW1wb3J0IHtcbiAgSVdhdGNoT3B0aW9ucyxcbiAgREJSZWFsdGltZUxpc3RlbmVyLFxuICBJUmVxdWVzdE1lc3NhZ2UsXG4gIElSZXNwb25zZU1lc3NhZ2UsXG4gIElSZXF1ZXN0TWVzc2FnZVBpbmdNc2csXG4gIElSZXF1ZXN0TWVzc2FnZUxvZ2luTXNnLFxuICBJUmVzcG9uc2VNZXNzYWdlTG9naW5SZXNNc2csXG4gIElSZXF1ZXN0TWVzc2FnZUxvZ2luRGF0YSxcbn0gZnJvbSAnQGNsb3VkYmFzZS90eXBlcy9yZWFsdGltZSdcbmltcG9ydCB7XG4gIENsb3NlRXZlbnRDb2RlLFxuICBDTE9TRV9FVkVOVF9DT0RFX0lORk8sXG4gIGdldFdTQ2xvc2VFcnJvcixcbn0gZnJvbSAnLi93cy1ldmVudCdcblxuaW1wb3J0IHsgRVJSX0NPREUsIFRpbWVvdXRFcnJvciwgUmVhbHRpbWVFcnJvck1lc3NhZ2VFcnJvciwgQ2xvdWRTREtFcnJvciB9IGZyb20gJy4vZXJyb3InXG5pbXBvcnQgeyBnZXRXc0NsYXNzLCBnZXRSdW50aW1lIH0gZnJvbSAnLi9jb21tb24nXG5pbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4vdXRpbHMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJlYWx0aW1lV2ViU29ja2V0Q2xpZW50Q29uc3RydWN0b3JPcHRpb25zIHtcbiAgbWF4UmVjb25uZWN0PzogbnVtYmVyXG4gIHJlY29ubmVjdEludGVydmFsPzogbnVtYmVyXG4gIGNvbnRleHQ6IElEYXRhYmFzZVNlcnZpY2VDb250ZXh0XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNpZ25hdHVyZSB7XG4gIGVudklkOiBzdHJpbmdcbiAgc2VjcmV0VmVyc2lvbjogbnVtYmVyXG4gIHNpZ25TdHI6IHN0cmluZ1xuICB3c1VybDogc3RyaW5nXG4gIGV4cGlyZVRTOiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTG9naW5JbmZvIHtcbiAgbG9nZ2VkSW46IGJvb2xlYW5cbiAgbG9nZ2luZ0luUHJvbWlzZT86IFByb21pc2U8SUxvZ2luUmVzdWx0PlxuICBsb2dpblN0YXJ0VFM/OiBudW1iZXJcbiAgbG9naW5SZXN1bHQ/OiBJTG9naW5SZXN1bHRcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTG9naW5SZXN1bHQge1xuICBlbnZJZDogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVdTU2VuZE9wdGlvbnMge1xuICBtc2c6IElSZXF1ZXN0TWVzc2FnZVxuICB3YWl0UmVzcG9uc2U/OiBib29sZWFuXG4gIC8vIHdoZW4gd2FpdFJlc3BvbnNlIGlzIHNldCB0byB0cnVlLCBpZiBza2lwT25NZXNzYWdlIGlzIHRydWUsIGdlbmVyYWwgb25NZXNzYWdlIGhhbmRsZXIgd2lsbCBiZSBza2lwcGVkXG4gIHNraXBPbk1lc3NhZ2U/OiBib29sZWFuXG4gIHRpbWVvdXQ/OiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJV1NXYXRjaE9wdGlvbnMgZXh0ZW5kcyBJV2F0Y2hPcHRpb25zIHtcbiAgZW52SWQ/OiBzdHJpbmdcbiAgY29sbGVjdGlvbk5hbWU6IHN0cmluZ1xuICBxdWVyeTogc3RyaW5nXG4gIGxpbWl0PzogbnVtYmVyXG4gIG9yZGVyQnk/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG59XG5cbmludGVyZmFjZSBJUmVzb2x2ZVJlamVjdCB7XG4gIHJlc29sdmU6ICh2YWx1ZT86IGFueSB8IFByb21pc2VMaWtlPGFueT4gfCB1bmRlZmluZWQpID0+IHZvaWRcbiAgcmVqZWN0OiAocmVhc29uPzogYW55KSA9PiB2b2lkXG59XG5cbmludGVyZmFjZSBJUmVzcG9uc2VXYWl0U3BlYyBleHRlbmRzIElSZXNvbHZlUmVqZWN0IHtcbiAgc2tpcE9uTWVzc2FnZT86IGJvb2xlYW5cbn1cblxuaW50ZXJmYWNlIElXc1NpZ24ge1xuICBzaWduU3RyOiBzdHJpbmcsXG4gIHdzVXJsOiBzdHJpbmcsXG4gIHNlY3JldFZlcnNpb246IHN0cmluZ1xuICBlbnZJZDogc3RyaW5nXG4gIGV4cGlyZWRUczogbnVtYmVyXG59XG5cbmNvbnN0IFdTX1JFQURZX1NUQVRFID0ge1xuICBDT05ORUNUSU5HOiAwLFxuICBPUEVOOiAxLFxuICBDTE9TSU5HOiAyLFxuICBDTE9TRUQ6IDMsXG59XG5cbmNvbnN0IE1BWF9SVFRfT0JTRVJWRUQgPSAzXG5jb25zdCBERUZBVUxUX0VYUEVDVEVEX0VWRU5UX1dBSVRfVElNRSA9IDUwMDBcbmNvbnN0IERFRkFVTFRfVU5UUlVTVEVEX1JUVF9USFJFU0hPTEQgPSAxMDAwMFxuY29uc3QgREVGQVVMVF9NQVhfUkVDT05ORUNUID0gNVxuY29uc3QgREVGQVVMVF9XU19SRUNPTk5FQ1RfSU5URVJWQUwgPSAxMDAwMFxuLy8gY29uc3QgREVGQVVMVF9XU19SRUNPTk5FQ1RfTUFYX1ZBTElEX0lOVEVSVkFMID0gMyAqIDYwICogMTAwMFxuY29uc3QgREVGQVVMVF9QSU5HX0ZBSUxfVE9MRVJBTkNFID0gMlxuY29uc3QgREVGQVVMVF9QT05HX01JU1NfVE9MRVJBTkNFID0gMlxuY29uc3QgREVGQVVMVF9MT0dJTl9USU1FT1VUID0gNTAwMFxuXG5leHBvcnQgY2xhc3MgUmVhbHRpbWVXZWJTb2NrZXRDbGllbnQge1xuICBwcml2YXRlIHZpcnR1YWxXU0NsaWVudDogU2V0PFZpcnR1YWxXZWJTb2NrZXRDbGllbnQ+ID0gbmV3IFNldCgpXG4gIC8vIGFmdGVyIGxpc3RlbmVyIGluaXRXYXRjaCwgdGhlIGxpc3RlbmVyIGhhcyB0aGUgcXVlcnlJRCBhbmQgY2FuIHN0b3JlIGl0IGhlcmVcbiAgcHJpdmF0ZSBxdWVyeUlkQ2xpZW50TWFwOiBNYXA8c3RyaW5nLCBWaXJ0dWFsV2ViU29ja2V0Q2xpZW50PiA9IG5ldyBNYXAoKVxuICBwcml2YXRlIHdhdGNoSWRDbGllbnRNYXA6IE1hcDxzdHJpbmcsIFZpcnR1YWxXZWJTb2NrZXRDbGllbnQ+ID0gbmV3IE1hcCgpXG4gIHByaXZhdGUgbWF4UmVjb25uZWN0OiBudW1iZXJcbiAgLy8gcHJpdmF0ZSBfYXZhaWxhYmxlUmV0cmllczogbnVtYmVyXG4gIHByaXZhdGUgcmVjb25uZWN0SW50ZXJ2YWw6IG51bWJlclxuICBwcml2YXRlIGNvbnRleHQ6IElEYXRhYmFzZVNlcnZpY2VDb250ZXh0XG4gIC8vIHByaXZhdGUgX3dzPzogV1hOUy5Tb2NrZXQuSVNvY2tldFRhc2tcbiAgcHJpdmF0ZSB3cz86IGFueVxuICBwcml2YXRlIGxhc3RQaW5nU2VuZFRTPzogbnVtYmVyXG4gIHByaXZhdGUgcGluZ0ZhaWxlZCA9IDBcbiAgcHJpdmF0ZSBwb25nTWlzc2VkID0gMFxuICBwcml2YXRlIHBpbmdUaW1lb3V0SWQ/OiBudW1iZXJcbiAgcHJpdmF0ZSBwb25nVGltZW91dElkPzogbnVtYmVyXG4gIHByaXZhdGUgbG9naW5zOiBNYXA8c3RyaW5nIC8qIGVudklkICovLCBJTG9naW5JbmZvPiA9IG5ldyBNYXAoKVxuICAvLyBwcml2YXRlIF9sb2dpbkluZm86IElMb2dpbkluZm9cbiAgLy8gcHJpdmF0ZSBfc2lnbmF0dXJlczogTWFwPHN0cmluZyAvKiBlbnZJZCAqLywgSVNpZ25hdHVyZT4gPSBuZXcgTWFwKClcbiAgcHJpdmF0ZSB3c0luaXRQcm9taXNlPzogUHJvbWlzZTx2b2lkPlxuICBwcml2YXRlIHdzUmVhZHlTdWJzcmliZXJzOiBJUmVzb2x2ZVJlamVjdFtdID0gW11cbiAgcHJpdmF0ZSB3c1Jlc3BvbnNlV2FpdDogTWFwPFxuICBzdHJpbmcgLyogcmVxdWVzdElkICovLFxuICBJUmVzcG9uc2VXYWl0U3BlY1xuICA+ID0gbmV3IE1hcCgpXG4gIHByaXZhdGUgcnR0T2JzZXJ2ZWQ6IG51bWJlcltdID0gW11cbiAgcHJpdmF0ZSByZWNvbm5lY3RTdGF0ZTogYm9vbGVhblxuICAvLyBvYnRhaW5lZCBmcm9tIHRoZSBmaXJzdCBnZXRTaWduYXR1cmUgd2l0aCBubyBlbnZJZCBwcm92aWRlZFxuICAvLyBwcml2YXRlIF9kZWZhdWx0RW52SWQ/OiBzdHJpbmdcbiAgcHJpdmF0ZSB3c1NpZ246IElXc1NpZ25cblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJUmVhbHRpbWVXZWJTb2NrZXRDbGllbnRDb25zdHJ1Y3Rvck9wdGlvbnMpIHtcbiAgICB0aGlzLm1heFJlY29ubmVjdCA9IG9wdGlvbnMubWF4UmVjb25uZWN0IHx8IERFRkFVTFRfTUFYX1JFQ09OTkVDVFxuICAgIC8vIHRoaXMuX2F2YWlsYWJsZVJldHJpZXMgPSB0aGlzLl9tYXhSZWNvbm5lY3RcbiAgICB0aGlzLnJlY29ubmVjdEludGVydmFsID0gb3B0aW9ucy5yZWNvbm5lY3RJbnRlcnZhbCB8fCBERUZBVUxUX1dTX1JFQ09OTkVDVF9JTlRFUlZBTFxuICAgIHRoaXMuY29udGV4dCA9IG9wdGlvbnMuY29udGV4dFxuICB9XG5cbiAgY2xlYXJIZWFydGJlYXQoKSB7XG4gICAgdGhpcy5waW5nVGltZW91dElkICYmIGNsZWFyVGltZW91dCh0aGlzLnBpbmdUaW1lb3V0SWQpXG4gICAgdGhpcy5wb25nVGltZW91dElkICYmIGNsZWFyVGltZW91dCh0aGlzLnBvbmdUaW1lb3V0SWQpXG4gIH1cblxuICBzZW5kID0gYXN5bmMgPFQgPSBhbnk+KG9wdHM6IElXU1NlbmRPcHRpb25zKTogUHJvbWlzZTxUPiA9PiBuZXcgUHJvbWlzZTxUPigoX3Jlc29sdmUsIF9yZWplY3QpID0+IHtcbiAgICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgICBsZXQgdGltZW91dElkOiBudW1iZXJcbiAgICAgIGxldCBoYXNSZXNvbHZlZCA9IGZhbHNlXG4gICAgICBsZXQgaGFzUmVqZWN0ZWQgPSBmYWxzZVxuXG4gICAgICBjb25zdCByZXNvbHZlOiB0eXBlb2YgX3Jlc29sdmUgPSAodmFsdWU/OiBUIHwgUHJvbWlzZUxpa2U8VD4gfCB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgaGFzUmVzb2x2ZWQgPSB0cnVlXG4gICAgICAgIHRpbWVvdXRJZCAmJiBjbGVhclRpbWVvdXQodGltZW91dElkKVxuICAgICAgICBfcmVzb2x2ZSh2YWx1ZSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVqZWN0OiB0eXBlb2YgX3JlamVjdCA9IChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgIGhhc1JlamVjdGVkID0gdHJ1ZVxuICAgICAgICB0aW1lb3V0SWQgJiYgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZClcbiAgICAgICAgX3JlamVjdChlcnJvcilcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdHMudGltZW91dCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWhhc1Jlc29sdmVkIHx8ICFoYXNSZWplY3RlZCkge1xuICAgICAgICAgICAgICAvLyB3YWl0IGFub3RoZXIgaW1tZWRpYXRlIHRpbWVvdXQgdG8gYWxsb3cgdGhlIHN1Y2Nlc3MvZmFpbCBjYWxsYmFjayB0byBiZSBpbnZva2VkIGlmIHdzIGhhcyBhbHJlYWR5IGdvdCB0aGUgcmVzdWx0LFxuICAgICAgICAgICAgICAvLyB0aGlzIGlzIGJlY2F1c2UgdGhlIHRpbWVyIGlzIHJlZ2lzdGVyZWQgYmVmb3JlIHdzLnNlbmRcbiAgICAgICAgICAgICAgYXdhaXQgc2xlZXAoMClcbiAgICAgICAgICAgICAgaWYgKCFoYXNSZXNvbHZlZCB8fCAhaGFzUmVqZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICByZWplY3QobmV3IFRpbWVvdXRFcnJvcignd3NjbGllbnQuc2VuZCB0aW1lZG91dCcpKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkoKVxuICAgICAgICB9LCBvcHRzLnRpbWVvdXQpXG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh0aGlzLndzSW5pdFByb21pc2UgIT09IHVuZGVmaW5lZCB8fCB0aGlzLndzSW5pdFByb21pc2UgIT09IG51bGwpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLndzSW5pdFByb21pc2VcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy53cykge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ2ludmFsaWQgc3RhdGU6IHdzIGNvbm5lY3Rpb24gbm90IGV4aXN0cywgY2FuIG5vdCBzZW5kIG1lc3NhZ2UnKSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLndzLnJlYWR5U3RhdGUgIT09IFdTX1JFQURZX1NUQVRFLk9QRU4pIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKGB3cyByZWFkeVN0YXRlIGludmFsaWQ6ICR7dGhpcy53cy5yZWFkeVN0YXRlfSwgY2FuIG5vdCBzZW5kIG1lc3NhZ2VgKSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRzLndhaXRSZXNwb25zZSkge1xuICAgICAgICAgIGNvbnN0IHJlc3BXYWl0U3BlYzogSVJlc3BvbnNlV2FpdFNwZWMgPSB7XG4gICAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgICAgcmVqZWN0LFxuICAgICAgICAgICAgc2tpcE9uTWVzc2FnZTogb3B0cy5za2lwT25NZXNzYWdlLFxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLndzUmVzcG9uc2VXYWl0LnNldChvcHRzLm1zZy5yZXF1ZXN0SWQsIHJlc3BXYWl0U3BlYylcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdzZW5kIG1zZzonLCBvcHRzLm1zZylcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLndzLnNlbmQoSlNPTi5zdHJpbmdpZnkob3B0cy5tc2cpKVxuICAgICAgICAgIGlmICghb3B0cy53YWl0UmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHJlc29sdmUodm9pZCAwKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgcmVqZWN0KGVycilcbiAgICAgICAgICAgIGlmIChvcHRzLndhaXRSZXNwb25zZSkge1xuICAgICAgICAgICAgICB0aGlzLndzUmVzcG9uc2VXYWl0LmRlbGV0ZShvcHRzLm1zZy5yZXF1ZXN0SWQpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlKVxuICAgICAgfVxuICAgIH0pKClcbiAgfSlcblxuICBjbG9zZShjb2RlOiBDbG9zZUV2ZW50Q29kZSkge1xuICAgIHRoaXMuY2xlYXJIZWFydGJlYXQoKVxuXG4gICAgaWYgKHRoaXMud3MpIHtcbiAgICAgIHRoaXMud3MuY2xvc2UoY29kZSwgQ0xPU0VfRVZFTlRfQ09ERV9JTkZPW2NvZGVdLm5hbWUpXG4gICAgICB0aGlzLndzID0gdW5kZWZpbmVkXG4gICAgfVxuICB9XG5cbiAgY2xvc2VBbGxDbGllbnRzID0gKGVycm9yOiBhbnkpID0+IHtcbiAgICB0aGlzLnZpcnR1YWxXU0NsaWVudC5mb3JFYWNoKChjbGllbnQpID0+IHtcbiAgICAgIGNsaWVudC5jbG9zZVdpdGhFcnJvcihlcnJvcilcbiAgICB9KVxuICB9XG5cbiAgcGF1c2VDbGllbnRzID0gKGNsaWVudHM/OiBTZXQ8VmlydHVhbFdlYlNvY2tldENsaWVudD4pID0+IHtcbiAgICAoY2xpZW50cyB8fCB0aGlzLnZpcnR1YWxXU0NsaWVudCkuZm9yRWFjaCgoY2xpZW50KSA9PiB7XG4gICAgICBjbGllbnQucGF1c2UoKVxuICAgIH0pXG4gIH1cblxuICByZXN1bWVDbGllbnRzID0gKGNsaWVudHM/OiBTZXQ8VmlydHVhbFdlYlNvY2tldENsaWVudD4pID0+IHtcbiAgICAoY2xpZW50cyB8fCB0aGlzLnZpcnR1YWxXU0NsaWVudCkuZm9yRWFjaCgoY2xpZW50KSA9PiB7XG4gICAgICBjbGllbnQucmVzdW1lKClcbiAgICB9KVxuICB9XG5cbiAgd2F0Y2gob3B0aW9uczogSVdTV2F0Y2hPcHRpb25zKTogREJSZWFsdGltZUxpc3RlbmVyIHtcbiAgICBpZiAoIXRoaXMud3MgJiYgKHRoaXMud3NJbml0UHJvbWlzZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMud3NJbml0UHJvbWlzZSA9PT0gbnVsbCkpIHtcbiAgICAgIHRoaXMuaW5pdFdlYlNvY2tldENvbm5lY3Rpb24oZmFsc2UpXG4gICAgfVxuXG4gICAgY29uc3QgdmlydHVhbENsaWVudCA9IG5ldyBWaXJ0dWFsV2ViU29ja2V0Q2xpZW50KHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBzZW5kOiB0aGlzLnNlbmQsXG4gICAgICBsb2dpbjogdGhpcy53ZWJMb2dpbixcbiAgICAgIGlzV1NDb25uZWN0ZWQ6IHRoaXMuaXNXU0Nvbm5lY3RlZCxcbiAgICAgIG9uY2VXU0Nvbm5lY3RlZDogdGhpcy5vbmNlV1NDb25uZWN0ZWQsXG4gICAgICBnZXRXYWl0RXhwZWN0ZWRUaW1lb3V0TGVuZ3RoOiB0aGlzLmdldFdhaXRFeHBlY3RlZFRpbWVvdXRMZW5ndGgsXG4gICAgICBvbldhdGNoU3RhcnQ6IHRoaXMub25XYXRjaFN0YXJ0LFxuICAgICAgb25XYXRjaENsb3NlOiB0aGlzLm9uV2F0Y2hDbG9zZSxcbiAgICAgIGRlYnVnOiB0cnVlLFxuICAgIH0pXG4gICAgdGhpcy52aXJ0dWFsV1NDbGllbnQuYWRkKHZpcnR1YWxDbGllbnQpXG4gICAgdGhpcy53YXRjaElkQ2xpZW50TWFwLnNldCh2aXJ0dWFsQ2xpZW50LndhdGNoSWQsIHZpcnR1YWxDbGllbnQpXG4gICAgcmV0dXJuIHZpcnR1YWxDbGllbnQubGlzdGVuZXJcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFdlYlNvY2tldENvbm5lY3Rpb24gPSBhc3luYyAoXG4gICAgcmVjb25uZWN0OiBib29sZWFuLFxuICAgIGF2YWlsYWJsZVJldHJpZXM6IG51bWJlciA9IHRoaXMubWF4UmVjb25uZWN0XG4gICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIC8vIOW9k+WJjeWkhOS6juato+WcqOmHjei/nuS4reeahOeKtuaAgVxuICAgIGlmIChyZWNvbm5lY3QgJiYgdGhpcy5yZWNvbm5lY3RTdGF0ZSkge1xuICAgICAgcmV0dXJuIC8vIOW/veeVpVxuICAgIH1cblxuICAgIGlmIChyZWNvbm5lY3QpIHtcbiAgICAgIHRoaXMucmVjb25uZWN0U3RhdGUgPSB0cnVlIC8vIOmHjei/nueKtuaAgeW8gOWni1xuICAgIH1cblxuICAgIGlmICh0aGlzLndzSW5pdFByb21pc2UgIT09IHVuZGVmaW5lZCAmJiB0aGlzLndzSW5pdFByb21pc2UgIT09IG51bGwpIHtcbiAgICAgIC8vIHRoZXJlIGFscmVhZHkgZXhpc3RzIGEgd2Vic29ja2V0IGluaXRpYXRpb24sIGp1c3Qgd2FpdCBmb3IgaXRcbiAgICAgIHJldHVybiB0aGlzLndzSW5pdFByb21pc2VcbiAgICB9XG5cbiAgICBpZiAocmVjb25uZWN0KSB7XG4gICAgICB0aGlzLnBhdXNlQ2xpZW50cygpXG4gICAgfVxuXG4gICAgdGhpcy5jbG9zZShDbG9zZUV2ZW50Q29kZS5SZWNvbm5lY3RXZWJTb2NrZXQpXG5cbiAgICB0aGlzLndzSW5pdFByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHdzU2lnbiA9IGF3YWl0IHRoaXMuZ2V0V3NTaWduKClcblxuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChzdWNjZXNzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSB3c1NpZ24ud3NVcmwgfHwgJ3dzczovL3RjYi13cy50ZW5jZW50Y2xvdWRhcGkuY29tJ1xuICAgICAgICAgICAgY29uc3Qgd3NDbGFzcyA9IGdldFdzQ2xhc3MoKVxuICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lICovXG4gICAgICAgICAgICB0aGlzLndzID0gd3NDbGFzcyA/IG5ldyB3c0NsYXNzKHVybCkgOiBuZXcgV2ViU29ja2V0KHVybClcbiAgICAgICAgICAgIHN1Y2Nlc3Modm9pZCAwKVxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBpZiAodGhpcy53cy5jb25uZWN0KSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLndzLmNvbm5lY3QoKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGF3YWl0IHRoaXMuaW5pdFdlYlNvY2tldEV2ZW50KClcbiAgICAgICAgICByZXNvbHZlKClcblxuICAgICAgICAgIGlmIChyZWNvbm5lY3QpIHtcbiAgICAgICAgICAgIHRoaXMucmVzdW1lQ2xpZW50cygpXG4gICAgICAgICAgICB0aGlzLnJlY29ubmVjdFN0YXRlID0gZmFsc2UgLy8g6YeN6L+e54q25oCB57uT5p2fXG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignW3JlYWx0aW1lXSBpbml0V2ViU29ja2V0Q29ubmVjdGlvbiBjb25uZWN0IGZhaWwnLCBlKVxuXG4gICAgICAgICAgaWYgKGF2YWlsYWJsZVJldHJpZXMgPiAwKSB7XG4gICAgICAgICAgICAvLyB0aGlzIGlzIGFuIG9wdGltaXphdGlvbiwgaW4gY2FzZSBvZiBuZXR3b3JrIG9mZmxpbmUsIHdlIGRvbid0IG5lZWQgdG8gc3R1YmJvcm5seSBzbGVlcCBmb3Igc29tZXRpbWUsXG4gICAgICAgICAgICAvLyB3ZSBvbmx5IG5lZWQgdG8gd2FpdCBmb3IgdGhlIG5ldHdvcmsgdG8gYmUgYmFjayBvbmxpbmUsIHRoaXMgZW5zdXJlcyBtaW5pbXVtIGRvd250aW1lXG4gICAgICAgICAgICAvLyBjb25zdCB7IGlzQ29ubmVjdGVkIH0gPSBhd2FpdCBnZXROZXR3b3JrU3RhdHVzKClcbiAgICAgICAgICAgIGNvbnN0IGlzQ29ubmVjdGVkID0gdHJ1ZVxuXG4gICAgICAgICAgICB0aGlzLndzSW5pdFByb21pc2UgPSB1bmRlZmluZWRcblxuICAgICAgICAgICAgaWYgKGlzQ29ubmVjdGVkKSB7XG4gICAgICAgICAgICAgIGF3YWl0IHNsZWVwKHRoaXMucmVjb25uZWN0SW50ZXJ2YWwpXG4gICAgICAgICAgICAgIGlmIChyZWNvbm5lY3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlY29ubmVjdFN0YXRlID0gZmFsc2UgLy8g6YeN6L+e5byC5bi45Lmf566X6YeN6L+e54q25oCB57uT5p2fXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLmluaXRXZWJTb2NrZXRDb25uZWN0aW9uKHJlY29ubmVjdCwgYXZhaWxhYmxlUmV0cmllcyAtIDEpKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWplY3QoZSlcblxuICAgICAgICAgICAgaWYgKHJlY29ubmVjdCkge1xuICAgICAgICAgICAgICB0aGlzLmNsb3NlQWxsQ2xpZW50cyhuZXcgQ2xvdWRTREtFcnJvcih7XG4gICAgICAgICAgICAgICAgZXJyQ29kZTogRVJSX0NPREUuU0RLX0RBVEFCQVNFX1JFQUxUSU1FX0xJU1RFTkVSX1JFQ09OTkVDVF9XQVRDSF9GQUlMIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICBlcnJNc2c6IGUsXG4gICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSkoKVxuICAgIH0pXG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy53c0luaXRQcm9taXNlXG4gICAgICB0aGlzLndzUmVhZHlTdWJzcmliZXJzLmZvckVhY2goKHsgcmVzb2x2ZSB9KSA9PiByZXNvbHZlKCkpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy53c1JlYWR5U3Vic3JpYmVycy5mb3JFYWNoKCh7IHJlamVjdCB9KSA9PiByZWplY3QoKSlcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy53c0luaXRQcm9taXNlID0gdW5kZWZpbmVkXG4gICAgICB0aGlzLndzUmVhZHlTdWJzcmliZXJzID0gW11cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluaXRXZWJTb2NrZXRFdmVudCA9ICgpID0+IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBpZiAoIXRoaXMud3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY2FuIG5vdCBpbml0V2ViU29ja2V0RXZlbnQsIHdzIG5vdCBleGlzdHMnKVxuICAgIH1cblxuICAgIGxldCB3c09wZW5lZCA9IGZhbHNlXG5cbiAgICB0aGlzLndzLm9ub3BlbiA9IChldmVudCkgPT4ge1xuICAgICAgY29uc29sZS53YXJuKCdbcmVhbHRpbWVdIHdzIGV2ZW50OiBvcGVuJywgZXZlbnQpXG4gICAgICB3c09wZW5lZCA9IHRydWVcbiAgICAgIHJlc29sdmUoKVxuICAgIH1cblxuICAgIHRoaXMud3Mub25lcnJvciA9IChldmVudCkgPT4ge1xuICAgICAgLy8gYWxsIGxvZ2lucyBhcmUgaW52YWxpZCBhZnRlciBkaXNjb25uZWN0aW9uXG4gICAgICB0aGlzLmxvZ2lucyA9IG5ldyBNYXAoKVxuXG4gICAgICAvLyBlcnJvcuWGmei/m2ZpbGVcblxuICAgICAgaWYgKCF3c09wZW5lZCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdbcmVhbHRpbWVdIHdzIG9wZW4gZmFpbGVkIHdpdGggd3MgZXZlbnQ6IGVycm9yJywgZXZlbnQpXG4gICAgICAgIHJlamVjdChldmVudClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tyZWFsdGltZV0gd3MgZXZlbnQ6IGVycm9yJywgZXZlbnQpXG5cbiAgICAgICAgdGhpcy5jbGVhckhlYXJ0YmVhdCgpXG4gICAgICAgIHRoaXMudmlydHVhbFdTQ2xpZW50LmZvckVhY2goY2xpZW50ID0+IGNsaWVudC5jbG9zZVdpdGhFcnJvcihuZXcgQ2xvdWRTREtFcnJvcih7XG4gICAgICAgICAgZXJyQ29kZTogRVJSX0NPREUuU0RLX0RBVEFCQVNFX1JFQUxUSU1FX0xJU1RFTkVSX1dFQlNPQ0tFVF9DT05ORUNUSU9OX0VSUk9SIGFzIHN0cmluZyxcbiAgICAgICAgICBlcnJNc2c6IGV2ZW50LFxuICAgICAgICB9KSkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVE9ETzogcmVjb25uZWN0XG4gICAgdGhpcy53cy5vbmNsb3NlID0gKGNsb3NlRXZlbnQpID0+IHtcbiAgICAgIGNvbnNvbGUud2FybignW3JlYWx0aW1lXSB3cyBldmVudDogY2xvc2UnLCBjbG9zZUV2ZW50KVxuICAgICAgLy8gYWxsIGxvZ2lucyBhcmUgaW52YWxpZCBhZnRlciBkaXNjb25uZWN0aW9uXG4gICAgICB0aGlzLmxvZ2lucyA9IG5ldyBNYXAoKVxuXG4gICAgICB0aGlzLmNsZWFySGVhcnRiZWF0KClcbiAgICAgIHN3aXRjaCAoY2xvc2VFdmVudC5jb2RlKSB7XG4gICAgICAgIGNhc2UgQ2xvc2VFdmVudENvZGUuUmVjb25uZWN0V2ViU29ja2V0OiB7XG4gICAgICAgICAgLy8ganVzdCBpZ25vcmVcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgQ2xvc2VFdmVudENvZGUuTm9SZWFsdGltZUxpc3RlbmVyczoge1xuICAgICAgICAgIC8vIHF1aXRcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgQ2xvc2VFdmVudENvZGUuSGVhcnRiZWF0UGluZ0Vycm9yOlxuICAgICAgICBjYXNlIENsb3NlRXZlbnRDb2RlLkhlYXJ0YmVhdFBvbmdUaW1lb3V0RXJyb3I6XG4gICAgICAgIGNhc2UgQ2xvc2VFdmVudENvZGUuTm9ybWFsQ2xvc3VyZTpcbiAgICAgICAgY2FzZSBDbG9zZUV2ZW50Q29kZS5BYm5vcm1hbENsb3N1cmU6IHtcbiAgICAgICAgICAvLyBOb3JtYWwgQ2xvc3VyZSBhbmQgQWJub3JtYWwgQ2xvc3VyZTpcbiAgICAgICAgICAvLyAgIGV4cGVjdGVkIGNsb3N1cmUsIG1vc3QgbGlrZWx5IGRpc3BhdGNoZWQgYnkgd2VjaGF0IGNsaWVudCxcbiAgICAgICAgICAvLyAgIHNpbmNlIHRoaXMgaXMgdGhlIHN0YXR1cyBjb2RlIGRpc3BhdGNoZWQgaW4gY2FzZSBvZiBuZXR3b3JrIGZhaWx1cmUsXG4gICAgICAgICAgLy8gICB3ZSBzaG91bGQgcmV0cnlcblxuICAgICAgICAgIGlmICh0aGlzLm1heFJlY29ubmVjdCA+IDApIHtcbiAgICAgICAgICAgIC8vIGlmICh0aGlzLl9hdmFpbGFibGVSZXRyaWVzID4gMCkge1xuICAgICAgICAgICAgdGhpcy5pbml0V2ViU29ja2V0Q29ubmVjdGlvbih0cnVlLCB0aGlzLm1heFJlY29ubmVjdClcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jbG9zZUFsbENsaWVudHMoZ2V0V1NDbG9zZUVycm9yKGNsb3NlRXZlbnQuY29kZSkpXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBDbG9zZUV2ZW50Q29kZS5Ob0F1dGhlbnRpY2F0aW9uOiB7XG4gICAgICAgICAgdGhpcy5jbG9zZUFsbENsaWVudHMoZ2V0V1NDbG9zZUVycm9yKGNsb3NlRXZlbnQuY29kZSwgY2xvc2VFdmVudC5yZWFzb24pKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIC8vIHdlIHNob3VsZCByZXRyeSBieSBkZWZhdWx0XG4gICAgICAgICAgaWYgKHRoaXMubWF4UmVjb25uZWN0ID4gMCkge1xuICAgICAgICAgICAgLy8gaWYgKHRoaXMuX2F2YWlsYWJsZVJldHJpZXMgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmluaXRXZWJTb2NrZXRDb25uZWN0aW9uKHRydWUsIHRoaXMubWF4UmVjb25uZWN0KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlQWxsQ2xpZW50cyhnZXRXU0Nsb3NlRXJyb3IoY2xvc2VFdmVudC5jb2RlKSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLndzLm9ubWVzc2FnZSA9IChyZXMpID0+IHtcbiAgICAgIGNvbnN0IHJhd01zZyA9IHJlcy5kYXRhXG5cbiAgICAgIC8vIHJlc2V0ICYgcmVzdGFydCBoZWFydGJlYXRcbiAgICAgIHRoaXMuaGVhcnRiZWF0KClcblxuICAgICAgbGV0IG1zZzogSVJlc3BvbnNlTWVzc2FnZVxuXG4gICAgICB0cnkge1xuICAgICAgICBtc2cgPSBKU09OLnBhcnNlKHJhd01zZyBhcyBzdHJpbmcpXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgW3JlYWx0aW1lXSBvbk1lc3NhZ2UgcGFyc2UgcmVzLmRhdGEgZXJyb3I6ICR7ZX1gKVxuICAgICAgfVxuXG4gICAgICBpZiAobXNnLm1zZ1R5cGUgPT09ICdFUlJPUicpIHtcbiAgICAgICAgLy8g5om+5Yiw5b2T5YmN55uR5ZCs77yM5bm25bCGZXJyb3Lov5Tlm55cbiAgICAgICAgbGV0IHZpcnR1YWxXYXRjaCA9IG51bGxcbiAgICAgICAgdGhpcy52aXJ0dWFsV1NDbGllbnQuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGlmIChpdGVtLndhdGNoSWQgPT09IG1zZy53YXRjaElkKSB7XG4gICAgICAgICAgICB2aXJ0dWFsV2F0Y2ggPSBpdGVtXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIGlmICh2aXJ0dWFsV2F0Y2gpIHtcbiAgICAgICAgICB2aXJ0dWFsV2F0Y2gubGlzdGVuZXIub25FcnJvcihtc2cpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzcG9uc2VXYWl0U3BlYyA9IHRoaXMud3NSZXNwb25zZVdhaXQuZ2V0KG1zZy5yZXF1ZXN0SWQpXG4gICAgICBpZiAocmVzcG9uc2VXYWl0U3BlYykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChtc2cubXNnVHlwZSA9PT0gJ0VSUk9SJykge1xuICAgICAgICAgICAgcmVzcG9uc2VXYWl0U3BlYy5yZWplY3QobmV3IFJlYWx0aW1lRXJyb3JNZXNzYWdlRXJyb3IobXNnKSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzcG9uc2VXYWl0U3BlYy5yZXNvbHZlKG1zZylcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgJ3dzIG9uTWVzc2FnZSByZXNwb25zZVdhaXRTcGVjLnJlc29sdmUobXNnKSBlcnJvcmVkOicsXG4gICAgICAgICAgICBlXG4gICAgICAgICAgKVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRoaXMud3NSZXNwb25zZVdhaXQuZGVsZXRlKG1zZy5yZXF1ZXN0SWQpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3BvbnNlV2FpdFNwZWMuc2tpcE9uTWVzc2FnZSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChtc2cubXNnVHlwZSA9PT0gJ1BPTkcnKSB7XG4gICAgICAgIGlmICh0aGlzLmxhc3RQaW5nU2VuZFRTKSB7XG4gICAgICAgICAgY29uc3QgcnR0ID0gRGF0ZS5ub3coKSAtIHRoaXMubGFzdFBpbmdTZW5kVFNcbiAgICAgICAgICBpZiAocnR0ID4gREVGQVVMVF9VTlRSVVNURURfUlRUX1RIUkVTSE9MRCkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBbcmVhbHRpbWVdIHVudHJ1c3RlZCBydHQgb2JzZXJ2ZWQ6ICR7cnR0fWApXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMucnR0T2JzZXJ2ZWQubGVuZ3RoID49IE1BWF9SVFRfT0JTRVJWRUQpIHtcbiAgICAgICAgICAgIHRoaXMucnR0T2JzZXJ2ZWQuc3BsaWNlKFxuICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICB0aGlzLnJ0dE9ic2VydmVkLmxlbmd0aCAtIE1BWF9SVFRfT0JTRVJWRUQgKyAxXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMucnR0T2JzZXJ2ZWQucHVzaChydHQpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGxldCBjbGllbnQgPSBtc2cud2F0Y2hJZCAmJiB0aGlzLndhdGNoSWRDbGllbnRNYXAuZ2V0KG1zZy53YXRjaElkKVxuICAgICAgaWYgKGNsaWVudCkge1xuICAgICAgICBjbGllbnQub25NZXNzYWdlKG1zZylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgYFtyZWFsdGltZV0gbm8gcmVhbHRpbWUgbGlzdGVuZXIgZm91bmQgcmVzcG9uc2libGUgZm9yIHdhdGNoSWQgJHttc2cud2F0Y2hJZH06IGAsXG4gICAgICAgICAgbXNnXG4gICAgICAgIClcbiAgICAgICAgc3dpdGNoIChtc2cubXNnVHlwZSkge1xuICAgICAgICAgIGNhc2UgJ0lOSVRfRVZFTlQnOlxuICAgICAgICAgIGNhc2UgJ05FWFRfRVZFTlQnOlxuICAgICAgICAgIGNhc2UgJ0NIRUNLX0VWRU5UJzoge1xuICAgICAgICAgICAgY2xpZW50ID0gdGhpcy5xdWVyeUlkQ2xpZW50TWFwLmdldChtc2cubXNnRGF0YS5xdWVyeUlEKVxuICAgICAgICAgICAgaWYgKGNsaWVudCkge1xuICAgICAgICAgICAgICBjbGllbnQub25NZXNzYWdlKG1zZylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgWywgY2xpZW50XSBvZiBBcnJheS5mcm9tKHRoaXMud2F0Y2hJZENsaWVudE1hcC5lbnRyaWVzKCkpKSB7XG4gICAgICAgICAgICAgIGNsaWVudC5vbk1lc3NhZ2UobXNnKVxuICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuaGVhcnRiZWF0KClcbiAgfSlcblxuICBwcml2YXRlIGlzV1NDb25uZWN0ZWQgPSAoKTogYm9vbGVhbiA9PiBCb29sZWFuKHRoaXMud3MgJiYgdGhpcy53cy5yZWFkeVN0YXRlID09PSBXU19SRUFEWV9TVEFURS5PUEVOKVxuXG4gIHByaXZhdGUgb25jZVdTQ29ubmVjdGVkID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmICh0aGlzLmlzV1NDb25uZWN0ZWQoKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMud3NJbml0UHJvbWlzZSAhPT0gbnVsbCAmJiB0aGlzLndzSW5pdFByb21pc2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMud3NJbml0UHJvbWlzZVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLndzUmVhZHlTdWJzcmliZXJzLnB1c2goe1xuICAgICAgICByZXNvbHZlLFxuICAgICAgICByZWplY3QsXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIHdlYkxvZ2luID0gYXN5bmMgKFxuICAgIGVudklkPzogc3RyaW5nLFxuICAgIHJlZnJlc2g/OiBib29sZWFuXG4gICk6IFByb21pc2U8YW55PiA9PiB7XG4gICAgaWYgKCFyZWZyZXNoKSB7XG4gICAgICBpZiAoZW52SWQpIHtcbiAgICAgICAgY29uc3QgbG9naW5JbmZvID0gdGhpcy5sb2dpbnMuZ2V0KGVudklkKVxuICAgICAgICBpZiAobG9naW5JbmZvKSB7XG4gICAgICAgICAgaWYgKGxvZ2luSW5mby5sb2dnZWRJbiAmJiBsb2dpbkluZm8ubG9naW5SZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBsb2dpbkluZm8ubG9naW5SZXN1bHRcbiAgICAgICAgICB9IGlmIChsb2dpbkluZm8ubG9nZ2luZ0luUHJvbWlzZSAhPT0gbnVsbCAmJiBsb2dpbkluZm8ubG9nZ2luZ0luUHJvbWlzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9naW5JbmZvLmxvZ2dpbmdJblByb21pc2VcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGVtcHR5RW52TG9naW5JbmZvID0gdGhpcy5sb2dpbnMuZ2V0KCcnKVxuICAgICAgICBpZiAoZW1wdHlFbnZMb2dpbkluZm8/LmxvZ2dpbmdJblByb21pc2UgIT09IG51bGwgJiYgZW1wdHlFbnZMb2dpbkluZm8/LmxvZ2dpbmdJblByb21pc2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBlbXB0eUVudkxvZ2luSW5mby5sb2dnaW5nSW5Qcm9taXNlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8SUxvZ2luUmVzdWx0PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHdzU2lnbiA9IGF3YWl0IHRoaXMuZ2V0V3NTaWduKClcblxuICAgICAgICAgIGNvbnN0IG1zZ0RhdGE6IElSZXF1ZXN0TWVzc2FnZUxvZ2luRGF0YSA9IHtcbiAgICAgICAgICAgIGVudklkOiB3c1NpZ24uZW52SWQgfHwgJycsXG4gICAgICAgICAgICBhY2Nlc3NUb2tlbjogJycsIC8vIOW3suW6n+W8g+Wtl+autVxuICAgICAgICAgICAgcmVmZXJyZXI6ICd3ZWInLFxuICAgICAgICAgICAgc2RrVmVyc2lvbjogJycsXG4gICAgICAgICAgICBkYXRhVmVyc2lvbjogJycsXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGxvZ2luTXNnOiBJUmVxdWVzdE1lc3NhZ2VMb2dpbk1zZyA9IHtcbiAgICAgICAgICAgIHdhdGNoSWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHJlcXVlc3RJZDogZ2VuUmVxdWVzdElkKCksXG4gICAgICAgICAgICBtc2dUeXBlOiAnTE9HSU4nLFxuICAgICAgICAgICAgbXNnRGF0YSxcbiAgICAgICAgICAgIGV4TXNnRGF0YToge1xuICAgICAgICAgICAgICBydW50aW1lOiBnZXRSdW50aW1lKCksXG4gICAgICAgICAgICAgIHNpZ25TdHI6IHdzU2lnbi5zaWduU3RyLFxuICAgICAgICAgICAgICBzZWNyZXRWZXJzaW9uOiB3c1NpZ24uc2VjcmV0VmVyc2lvbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGxvZ2luUmVzTXNnID0gYXdhaXQgdGhpcy5zZW5kPElSZXNwb25zZU1lc3NhZ2VMb2dpblJlc01zZz4oe1xuICAgICAgICAgICAgbXNnOiBsb2dpbk1zZyxcbiAgICAgICAgICAgIHdhaXRSZXNwb25zZTogdHJ1ZSxcbiAgICAgICAgICAgIHNraXBPbk1lc3NhZ2U6IHRydWUsXG4gICAgICAgICAgICB0aW1lb3V0OiBERUZBVUxUX0xPR0lOX1RJTUVPVVQsXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGlmICghbG9naW5SZXNNc2cubXNnRGF0YS5jb2RlKSB7XG4gICAgICAgICAgICAvLyBsb2dpbiBzdWNjZXNzXG4gICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgZW52SWQ6IHdzU2lnbi5lbnZJZCxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGxvZ2luIGZhaWxlZFxuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgJHtsb2dpblJlc01zZy5tc2dEYXRhLmNvZGV9ICR7bG9naW5SZXNNc2cubXNnRGF0YS5tZXNzYWdlfWApKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHJlamVjdChlKVxuICAgICAgICB9XG4gICAgICB9KSgpXG4gICAgfSlcblxuICAgIGxldCBsb2dpbkluZm8gPSBlbnZJZCAmJiB0aGlzLmxvZ2lucy5nZXQoZW52SWQpXG5cbiAgICBjb25zdCBsb2dpblN0YXJ0VFMgPSBEYXRlLm5vdygpXG5cbiAgICBpZiAobG9naW5JbmZvKSB7XG4gICAgICBsb2dpbkluZm8ubG9nZ2VkSW4gPSBmYWxzZVxuICAgICAgbG9naW5JbmZvLmxvZ2dpbmdJblByb21pc2UgPSBwcm9taXNlXG4gICAgICBsb2dpbkluZm8ubG9naW5TdGFydFRTID0gbG9naW5TdGFydFRTXG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2luSW5mbyA9IHtcbiAgICAgICAgbG9nZ2VkSW46IGZhbHNlLFxuICAgICAgICBsb2dnaW5nSW5Qcm9taXNlOiBwcm9taXNlLFxuICAgICAgICBsb2dpblN0YXJ0VFMsXG4gICAgICB9XG4gICAgICB0aGlzLmxvZ2lucy5zZXQoZW52SWQgfHwgJycsIGxvZ2luSW5mbylcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgbG9naW5SZXN1bHQgPSBhd2FpdCBwcm9taXNlXG4gICAgICBjb25zdCBjdXJMb2dpbkluZm8gPSBlbnZJZCAmJiB0aGlzLmxvZ2lucy5nZXQoZW52SWQpXG4gICAgICBpZiAoXG4gICAgICAgIGN1ckxvZ2luSW5mb1xuICAgICAgICAmJiBjdXJMb2dpbkluZm8gPT09IGxvZ2luSW5mb1xuICAgICAgICAmJiBjdXJMb2dpbkluZm8ubG9naW5TdGFydFRTID09PSBsb2dpblN0YXJ0VFNcbiAgICAgICkge1xuICAgICAgICBsb2dpbkluZm8ubG9nZ2VkSW4gPSB0cnVlXG4gICAgICAgIGxvZ2luSW5mby5sb2dnaW5nSW5Qcm9taXNlID0gdW5kZWZpbmVkXG4gICAgICAgIGxvZ2luSW5mby5sb2dpblN0YXJ0VFMgPSB1bmRlZmluZWRcbiAgICAgICAgbG9naW5JbmZvLmxvZ2luUmVzdWx0ID0gbG9naW5SZXN1bHRcbiAgICAgICAgcmV0dXJuIGxvZ2luUmVzdWx0XG4gICAgICB9IGlmIChjdXJMb2dpbkluZm8pIHtcbiAgICAgICAgaWYgKGN1ckxvZ2luSW5mby5sb2dnZWRJbiAmJiBjdXJMb2dpbkluZm8ubG9naW5SZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gY3VyTG9naW5JbmZvLmxvZ2luUmVzdWx0XG4gICAgICAgIH0gaWYgKGN1ckxvZ2luSW5mby5sb2dnaW5nSW5Qcm9taXNlICE9PSBudWxsICYmIGN1ckxvZ2luSW5mby5sb2dnaW5nSW5Qcm9taXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gY3VyTG9naW5JbmZvLmxvZ2dpbmdJblByb21pc2VcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dzIHVuZXhwZWN0ZWQgbG9naW4gaW5mbycpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dzIGxvZ2luIGluZm8gcmVzZXQnKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZ2luSW5mby5sb2dnZWRJbiA9IGZhbHNlXG4gICAgICBsb2dpbkluZm8ubG9nZ2luZ0luUHJvbWlzZSA9IHVuZGVmaW5lZFxuICAgICAgbG9naW5JbmZvLmxvZ2luU3RhcnRUUyA9IHVuZGVmaW5lZFxuICAgICAgbG9naW5JbmZvLmxvZ2luUmVzdWx0ID0gdW5kZWZpbmVkXG4gICAgICB0aHJvdyBlXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRXc1NpZ24gPSBhc3luYyAoKTogUHJvbWlzZTxJV3NTaWduPiA9PiB7XG4gICAgaWYgKHRoaXMud3NTaWduICYmIHRoaXMud3NTaWduLmV4cGlyZWRUcyA+IERhdGUubm93KCkpIHtcbiAgICAgIHJldHVybiB0aGlzLndzU2lnblxuICAgIH1cbiAgICBjb25zdCBleHBpcmVkVHMgPSBEYXRlLm5vdygpICsgNjAwMDBcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNvbnRleHQuYXBwQ29uZmlnLnJlcXVlc3Quc2VuZCgnYXV0aC53c1dlYlNpZ24nLCB7IHJ1bnRpbWU6IGdldFJ1bnRpbWUoKSB9KVxuXG4gICAgaWYgKHJlcy5jb2RlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFt0Y2ItanMtc2RrXSDojrflj5blrp7ml7bmlbDmja7mjqjpgIHnmbvlvZXnpajmja7lpLHotKU6ICR7cmVzLmNvZGV9YClcbiAgICB9XG5cbiAgICBpZiAocmVzLmRhdGEpIHtcbiAgICAgIGNvbnN0IHsgc2lnblN0ciwgd3NVcmwsIHNlY3JldFZlcnNpb24sIGVudklkIH0gPSByZXMuZGF0YVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2lnblN0cixcbiAgICAgICAgd3NVcmwsXG4gICAgICAgIHNlY3JldFZlcnNpb24sXG4gICAgICAgIGVudklkLFxuICAgICAgICBleHBpcmVkVHMsXG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignW3RjYi1qcy1zZGtdIOiOt+WPluWunuaXtuaVsOaNruaOqOmAgeeZu+W9leelqOaNruWksei0pScpXG4gIH1cblxuICBwcml2YXRlIGdldFdhaXRFeHBlY3RlZFRpbWVvdXRMZW5ndGggPSAoKSA9PiB7XG4gICAgaWYgKCF0aGlzLnJ0dE9ic2VydmVkLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIERFRkFVTFRfRVhQRUNURURfRVZFTlRfV0FJVF9USU1FXG4gICAgfVxuXG4gICAgLy8gMS41ICogUlRUXG4gICAgcmV0dXJuIChcbiAgICAgICh0aGlzLnJ0dE9ic2VydmVkLnJlZHVjZSgoYWNjLCBjdXIpID0+IGFjYyArIGN1cilcbiAgICAgICAgLyB0aGlzLnJ0dE9ic2VydmVkLmxlbmd0aClcbiAgICAgICogMS41XG4gICAgKVxuICB9XG5cbiAgcHJpdmF0ZSBoZWFydGJlYXQoaW1tZWRpYXRlPzogYm9vbGVhbikge1xuICAgIHRoaXMuY2xlYXJIZWFydGJlYXQoKVxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLnBpbmdUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KFxuICAgICAgKCkgPT4ge1xuICAgICAgICAoXG4gICAgICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLndzIHx8IHRoaXMud3MucmVhZHlTdGF0ZSAhPT0gV1NfUkVBRFlfU1RBVEUuT1BFTikge1xuICAgICAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gcGluZ1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdGhpcy5sYXN0UGluZ1NlbmRUUyA9IERhdGUubm93KClcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5waW5nKClcbiAgICAgICAgICAgICAgdGhpcy5waW5nRmFpbGVkID0gMFxuXG4gICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgdGhpcy5wb25nVGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcigncG9uZyB0aW1lZCBvdXQnKVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBvbmdNaXNzZWQgPCBERUZBVUxUX1BPTkdfTUlTU19UT0xFUkFOQ0UpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMucG9uZ01pc3NlZCArPSAxXG4gICAgICAgICAgICAgICAgICB0aGlzLmhlYXJ0YmVhdCh0cnVlKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAvLyBsb2dpY2FsIHBlcmNlaXZlZCBjb25uZWN0aW9uIGxvc3QsIGV2ZW4gdGhvdWdoIHdlYnNvY2tldCBkaWQgbm90IHJlY2VpdmUgZXJyb3Igb3IgY2xvc2UgZXZlbnRcbiAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdFdlYlNvY2tldENvbm5lY3Rpb24odHJ1ZSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0sIHRoaXMuY29udGV4dC5hcHBDb25maWcucmVhbHRpbWVQb25nV2FpdFRpbWVvdXQpXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLnBpbmdGYWlsZWQgPCBERUZBVUxUX1BJTkdfRkFJTF9UT0xFUkFOQ0UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBpbmdGYWlsZWQgKz0gMVxuICAgICAgICAgICAgICAgIHRoaXMuaGVhcnRiZWF0KClcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKENsb3NlRXZlbnRDb2RlLkhlYXJ0YmVhdFBpbmdFcnJvcilcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgKSgpXG4gICAgICB9LFxuICAgICAgaW1tZWRpYXRlID8gMCA6IHRoaXMuY29udGV4dC5hcHBDb25maWcucmVhbHRpbWVQaW5nSW50ZXJ2YWxcbiAgICApXG4gIH1cblxuICBwcml2YXRlIHBpbmcgPSBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbXNnOiBJUmVxdWVzdE1lc3NhZ2VQaW5nTXNnID0ge1xuICAgICAgd2F0Y2hJZDogdW5kZWZpbmVkLFxuICAgICAgcmVxdWVzdElkOiBnZW5SZXF1ZXN0SWQoKSxcbiAgICAgIG1zZ1R5cGU6ICdQSU5HJyxcbiAgICAgIG1zZ0RhdGE6IG51bGwsXG4gICAgfVxuICAgIGF3YWl0IHRoaXMuc2VuZCh7XG4gICAgICBtc2csXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgb25XYXRjaFN0YXJ0ID0gKGNsaWVudDogVmlydHVhbFdlYlNvY2tldENsaWVudCwgcXVlcnlJRDogc3RyaW5nKSA9PiB7XG4gICAgdGhpcy5xdWVyeUlkQ2xpZW50TWFwLnNldChxdWVyeUlELCBjbGllbnQpXG4gIH1cblxuICBwcml2YXRlIG9uV2F0Y2hDbG9zZSA9IChjbGllbnQ6IFZpcnR1YWxXZWJTb2NrZXRDbGllbnQsIHF1ZXJ5SUQ6IHN0cmluZykgPT4ge1xuICAgIGlmIChxdWVyeUlEKSB7XG4gICAgICB0aGlzLnF1ZXJ5SWRDbGllbnRNYXAuZGVsZXRlKHF1ZXJ5SUQpXG4gICAgfVxuICAgIHRoaXMud2F0Y2hJZENsaWVudE1hcC5kZWxldGUoY2xpZW50LndhdGNoSWQpXG4gICAgdGhpcy52aXJ0dWFsV1NDbGllbnQuZGVsZXRlKGNsaWVudClcblxuICAgIGlmICghdGhpcy52aXJ0dWFsV1NDbGllbnQuc2l6ZSkge1xuICAgICAgLy8gbm8gbW9yZSBleGlzdGluZyB3YXRjaCwgd2Ugc2hvdWxkIHJlbGVhc2UgdGhlIHdlYnNvY2tldCBjb25uZWN0aW9uXG4gICAgICB0aGlzLmNsb3NlKENsb3NlRXZlbnRDb2RlLk5vUmVhbHRpbWVMaXN0ZW5lcnMpXG4gICAgfVxuICB9XG59XG4iXX0=
|