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