botframework-directlinejs 0.15.6-master.bb3d7ee → 0.15.7-master.13f7a42

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.
@@ -1,61 +1,37 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  var _typeof = require("@babel/runtime/helpers/typeof");
6
-
7
5
  Object.defineProperty(exports, "__esModule", {
8
6
  value: true
9
7
  });
10
8
  exports.DirectLineStreaming = void 0;
11
-
12
9
  var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
13
-
14
10
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
15
-
16
11
  var _classPrivateFieldGet2 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateFieldGet"));
17
-
18
12
  var _classPrivateFieldSet2 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateFieldSet"));
19
-
20
13
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
21
-
22
14
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
23
-
24
15
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
25
-
26
16
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
27
-
28
17
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
29
-
30
18
  var _BehaviorSubject = require("rxjs/BehaviorSubject");
31
-
32
19
  var _buffer = require("buffer");
33
-
34
20
  var _Observable = require("rxjs/Observable");
35
-
36
21
  var BFSE = _interopRequireWildcard(require("botframework-streaming"));
37
-
38
22
  var _createDeferred = _interopRequireDefault(require("./createDeferred"));
39
-
40
23
  var _crossFetch = _interopRequireDefault(require("cross-fetch"));
41
-
42
24
  var _directLine = require("./directLine");
43
-
44
25
  var _WebSocketClientWithNetworkInformation = _interopRequireDefault(require("./streaming/WebSocketClientWithNetworkInformation"));
45
-
46
- var _excluded = ["attachments"];
47
-
26
+ var _excluded = ["attachments"]; // In order to keep file size down, only import the parts of rxjs that we use
48
27
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
49
-
50
28
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
51
-
52
29
  var DIRECT_LINE_VERSION = 'DirectLine/3.0';
53
30
  var MAX_RETRY_COUNT = 3;
54
- var refreshTokenLifetime = 30 * 60 * 1000; //const refreshTokenLifetime = 5000;
31
+ var refreshTokenLifetime = 30 * 60 * 1000;
32
+ //const refreshTokenLifetime = 5000;
55
33
  // const timeout = 20 * 1000;
56
-
57
34
  var refreshTokenInterval = refreshTokenLifetime / 2;
58
-
59
35
  var StreamHandler = /*#__PURE__*/function () {
60
36
  function StreamHandler(s, c$, sq) {
61
37
  (0, _classCallCheck2["default"])(this, StreamHandler);
@@ -64,7 +40,6 @@ var StreamHandler = /*#__PURE__*/function () {
64
40
  this.connectionStatus$ = c$;
65
41
  this.shouldQueue = sq;
66
42
  }
67
-
68
43
  (0, _createClass2["default"])(StreamHandler, [{
69
44
  key: "setSubscriber",
70
45
  value: function setSubscriber(s) {
@@ -73,7 +48,7 @@ var StreamHandler = /*#__PURE__*/function () {
73
48
  }, {
74
49
  key: "processRequest",
75
50
  value: function () {
76
- var _processRequest = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(request, logger) {
51
+ var _processRequest = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee(request, logger) {
77
52
  var streams, stream0, activitySetJson, activitySet, activity, attachments, stream, attachment, dataUri;
78
53
  return _regenerator["default"].wrap(function _callee$(_context) {
79
54
  while (1) {
@@ -83,39 +58,30 @@ var StreamHandler = /*#__PURE__*/function () {
83
58
  stream0 = streams.shift();
84
59
  _context.next = 4;
85
60
  return stream0.readAsString();
86
-
87
61
  case 4:
88
62
  activitySetJson = _context.sent;
89
63
  activitySet = JSON.parse(activitySetJson);
90
-
91
64
  if (!(activitySet.activities.length !== 1)) {
92
65
  _context.next = 9;
93
66
  break;
94
67
  }
95
-
96
68
  // Only one activity is expected in a set in streaming
97
69
  this.subscriber.error(new Error('there should be exactly one activity'));
98
70
  return _context.abrupt("return", BFSE.StreamingResponse.create(500));
99
-
100
71
  case 9:
101
72
  activity = activitySet.activities[0];
102
-
103
73
  if (!(streams.length > 0)) {
104
74
  _context.next = 21;
105
75
  break;
106
76
  }
107
-
108
77
  attachments = (0, _toConsumableArray2["default"])(activity.attachments);
109
-
110
78
  case 12:
111
79
  if (!(stream = streams.shift())) {
112
80
  _context.next = 20;
113
81
  break;
114
82
  }
115
-
116
83
  _context.next = 15;
117
84
  return stream.readAsString();
118
-
119
85
  case 15:
120
86
  attachment = _context.sent;
121
87
  dataUri = 'data:text/plain;base64,' + attachment;
@@ -125,19 +91,15 @@ var StreamHandler = /*#__PURE__*/function () {
125
91
  });
126
92
  _context.next = 12;
127
93
  break;
128
-
129
94
  case 20:
130
95
  activity.attachments = attachments;
131
-
132
96
  case 21:
133
97
  if (this.shouldQueue()) {
134
98
  this.activityQueue.push(activity);
135
99
  } else {
136
100
  this.subscriber.next(activity);
137
101
  }
138
-
139
102
  return _context.abrupt("return", BFSE.StreamingResponse.create(200));
140
-
141
103
  case 23:
142
104
  case "end":
143
105
  return _context.stop();
@@ -145,18 +107,15 @@ var StreamHandler = /*#__PURE__*/function () {
145
107
  }
146
108
  }, _callee, this);
147
109
  }));
148
-
149
110
  function processRequest(_x, _x2) {
150
111
  return _processRequest.apply(this, arguments);
151
112
  }
152
-
153
113
  return processRequest;
154
114
  }()
155
115
  }, {
156
116
  key: "flush",
157
117
  value: function flush() {
158
118
  var _this = this;
159
-
160
119
  this.connectionStatus$.subscribe(function () {});
161
120
  this.activityQueue.forEach(function (a) {
162
121
  return _this.subscriber.next(a);
@@ -171,45 +130,36 @@ var StreamHandler = /*#__PURE__*/function () {
171
130
  }]);
172
131
  return StreamHandler;
173
132
  }();
174
-
175
133
  var _networkInformation = /*#__PURE__*/new WeakMap();
176
-
177
134
  var DirectLineStreaming = /*#__PURE__*/function () {
178
135
  function DirectLineStreaming(options) {
179
136
  var _this2 = this;
180
-
181
137
  (0, _classCallCheck2["default"])(this, DirectLineStreaming);
182
138
  (0, _defineProperty2["default"])(this, "connectionStatus$", new _BehaviorSubject.BehaviorSubject(_directLine.ConnectionStatus.Uninitialized));
183
139
  (0, _defineProperty2["default"])(this, "_botAgent", '');
184
-
185
140
  _networkInformation.set(this, {
186
141
  writable: true,
187
142
  value: void 0
188
143
  });
189
-
190
144
  // Rectifies `options.networkInformation`.
191
145
  var networkInformation = options === null || options === void 0 ? void 0 : options.networkInformation;
192
-
193
146
  if (typeof networkInformation === 'undefined' || typeof networkInformation.addEventListener === 'function' && typeof networkInformation.removeEventListener === 'function' && typeof networkInformation.type === 'string') {
194
147
  (0, _classPrivateFieldSet2["default"])(this, _networkInformation, networkInformation);
195
148
  } else {
196
149
  console.warn('botframework-directlinejs: "networkInformation" option specified must be a `NetworkInformation`-like instance extending `EventTarget` interface with a `type` property returning a string.');
197
150
  }
198
-
199
151
  this.token = options.token;
200
152
  this.refreshToken()["catch"](function () {
201
153
  _this2.connectionStatus$.next(_directLine.ConnectionStatus.ExpiredToken);
202
154
  });
203
155
  this.domain = options.domain;
204
-
205
156
  if (options.conversationId) {
206
157
  this.conversationId = options.conversationId;
207
158
  }
208
-
209
159
  this._botAgent = this.getBotAgent(options.botAgent);
210
160
  this.queueActivities = true;
211
- this.activity$ = _Observable.Observable.create( /*#__PURE__*/function () {
212
- var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(subscriber) {
161
+ this.activity$ = _Observable.Observable.create(/*#__PURE__*/function () {
162
+ var _ref = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2(subscriber) {
213
163
  return _regenerator["default"].wrap(function _callee2$(_context2) {
214
164
  while (1) {
215
165
  switch (_context2.prev = _context2.next) {
@@ -217,10 +167,10 @@ var DirectLineStreaming = /*#__PURE__*/function () {
217
167
  _this2.activitySubscriber = subscriber;
218
168
  _this2.theStreamHandler = new StreamHandler(subscriber, _this2.connectionStatus$, function () {
219
169
  return _this2.queueActivities;
220
- }); // Resolving connectDeferred will kick-off the connection.
170
+ });
221
171
 
172
+ // Resolving connectDeferred will kick-off the connection.
222
173
  _this2.connectDeferred.resolve();
223
-
224
174
  case 3:
225
175
  case "end":
226
176
  return _context2.stop();
@@ -228,25 +178,22 @@ var DirectLineStreaming = /*#__PURE__*/function () {
228
178
  }
229
179
  }, _callee2);
230
180
  }));
231
-
232
181
  return function (_x3) {
233
182
  return _ref.apply(this, arguments);
234
183
  };
235
- }()).share(); // connectWithRetryAsync() will create the connectDeferred object required in activity$.
184
+ }()).share();
236
185
 
186
+ // connectWithRetryAsync() will create the connectDeferred object required in activity$.
237
187
  this.connectWithRetryAsync();
238
188
  }
239
-
240
189
  (0, _createClass2["default"])(DirectLineStreaming, [{
241
190
  key: "reconnect",
242
191
  value: function reconnect(_ref2) {
243
192
  var conversationId = _ref2.conversationId,
244
- token = _ref2.token;
245
-
193
+ token = _ref2.token;
246
194
  if (this.connectionStatus$.getValue() === _directLine.ConnectionStatus.Ended) {
247
195
  throw new Error('Connection has ended.');
248
196
  }
249
-
250
197
  this.conversationId = conversationId;
251
198
  this.token = token;
252
199
  this.connectDeferred.resolve();
@@ -273,25 +220,22 @@ var DirectLineStreaming = /*#__PURE__*/function () {
273
220
  value: function getBotAgent() {
274
221
  var customAgent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
275
222
  var clientAgent = 'directlineStreaming';
276
-
277
223
  if (customAgent) {
278
224
  clientAgent += "; ".concat(customAgent);
279
225
  }
280
-
281
226
  return "".concat(DIRECT_LINE_VERSION, " (").concat(clientAgent, ")");
282
227
  }
283
228
  }, {
284
229
  key: "refreshToken",
285
230
  value: function () {
286
- var _refreshToken = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
231
+ var _refreshToken = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee3() {
287
232
  var firstCall,
288
- retryCount,
289
- numberOfAttempts,
290
- res,
291
- _yield$res$json,
292
- token,
293
- _args3 = arguments;
294
-
233
+ retryCount,
234
+ numberOfAttempts,
235
+ res,
236
+ _yield$res$json,
237
+ token,
238
+ _args3 = arguments;
295
239
  return _regenerator["default"].wrap(function _callee3$(_context3) {
296
240
  while (1) {
297
241
  switch (_context3.prev = _context3.next) {
@@ -300,22 +244,18 @@ var DirectLineStreaming = /*#__PURE__*/function () {
300
244
  retryCount = _args3.length > 1 && _args3[1] !== undefined ? _args3[1] : 0;
301
245
  _context3.next = 4;
302
246
  return this.waitUntilOnline();
303
-
304
247
  case 4:
305
248
  numberOfAttempts = 0;
306
-
307
249
  case 5:
308
250
  if (!(numberOfAttempts < MAX_RETRY_COUNT)) {
309
251
  _context3.next = 30;
310
252
  break;
311
253
  }
312
-
313
254
  numberOfAttempts++;
314
255
  _context3.next = 9;
315
256
  return new Promise(function (r) {
316
257
  return setTimeout(r, refreshTokenInterval);
317
258
  });
318
-
319
259
  case 9:
320
260
  _context3.prev = 9;
321
261
  _context3.next = 12;
@@ -323,26 +263,21 @@ var DirectLineStreaming = /*#__PURE__*/function () {
323
263
  method: 'POST',
324
264
  headers: this.commonHeaders()
325
265
  });
326
-
327
266
  case 12:
328
267
  res = _context3.sent;
329
-
330
268
  if (!res.ok) {
331
269
  _context3.next = 22;
332
270
  break;
333
271
  }
334
-
335
272
  numberOfAttempts = 0;
336
273
  _context3.next = 17;
337
274
  return res.json();
338
-
339
275
  case 17:
340
276
  _yield$res$json = _context3.sent;
341
277
  token = _yield$res$json.token;
342
278
  this.token = token;
343
279
  _context3.next = 23;
344
280
  break;
345
-
346
281
  case 22:
347
282
  if (res.status === 403 || res.status === 403) {
348
283
  console.error("Fatal error while refreshing the token: ".concat(res.status, " ").concat(res.statusText));
@@ -350,24 +285,19 @@ var DirectLineStreaming = /*#__PURE__*/function () {
350
285
  } else {
351
286
  console.warn("Refresh attempt #".concat(numberOfAttempts, " failed: ").concat(res.status, " ").concat(res.statusText));
352
287
  }
353
-
354
288
  case 23:
355
289
  _context3.next = 28;
356
290
  break;
357
-
358
291
  case 25:
359
292
  _context3.prev = 25;
360
293
  _context3.t0 = _context3["catch"](9);
361
294
  console.warn("Refresh attempt #".concat(numberOfAttempts, " threw an exception: ").concat(_context3.t0));
362
-
363
295
  case 28:
364
296
  _context3.next = 5;
365
297
  break;
366
-
367
298
  case 30:
368
299
  console.error('Retries exhausted');
369
300
  this.streamConnection.disconnect();
370
-
371
301
  case 32:
372
302
  case "end":
373
303
  return _context3.stop();
@@ -375,30 +305,24 @@ var DirectLineStreaming = /*#__PURE__*/function () {
375
305
  }
376
306
  }, _callee3, this, [[9, 25]]);
377
307
  }));
378
-
379
308
  function refreshToken() {
380
309
  return _refreshToken.apply(this, arguments);
381
310
  }
382
-
383
311
  return refreshToken;
384
312
  }()
385
313
  }, {
386
314
  key: "postActivity",
387
315
  value: function postActivity(activity) {
388
316
  var _this3 = this;
389
-
390
317
  if (this.connectionStatus$.value === _directLine.ConnectionStatus.Ended || this.connectionStatus$.value === _directLine.ConnectionStatus.FailedToConnect) {
391
318
  return _Observable.Observable["throw"](new Error('Connection is closed'));
392
319
  }
393
-
394
320
  if (activity.type === 'message' && activity.attachments && activity.attachments.length > 0) {
395
321
  return this.postMessageWithAttachments(activity);
396
322
  }
397
-
398
- var resp$ = _Observable.Observable.create( /*#__PURE__*/function () {
399
- var _ref3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4(subscriber) {
323
+ var resp$ = _Observable.Observable.create(/*#__PURE__*/function () {
324
+ var _ref3 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee4(subscriber) {
400
325
  var request, resp, numberOfStreams, idString, _JSON$parse, id;
401
-
402
326
  return _regenerator["default"].wrap(function _callee4$(_context4) {
403
327
  while (1) {
404
328
  switch (_context4.prev = _context4.next) {
@@ -408,37 +332,28 @@ var DirectLineStreaming = /*#__PURE__*/function () {
408
332
  _context4.prev = 2;
409
333
  _context4.next = 5;
410
334
  return _this3.streamConnection.send(request);
411
-
412
335
  case 5:
413
336
  resp = _context4.sent;
414
-
415
337
  if (!(resp.statusCode !== 200)) {
416
338
  _context4.next = 8;
417
339
  break;
418
340
  }
419
-
420
341
  throw new Error('PostActivity returned ' + resp.statusCode);
421
-
422
342
  case 8:
423
343
  numberOfStreams = resp.streams.length;
424
-
425
344
  if (!(numberOfStreams !== 1)) {
426
345
  _context4.next = 11;
427
346
  break;
428
347
  }
429
-
430
348
  throw new Error('Expected one stream but got ' + numberOfStreams);
431
-
432
349
  case 11:
433
350
  _context4.next = 13;
434
351
  return resp.streams[0].readAsString();
435
-
436
352
  case 13:
437
353
  idString = _context4.sent;
438
354
  _JSON$parse = JSON.parse(idString), id = _JSON$parse.Id;
439
355
  subscriber.next(id);
440
356
  return _context4.abrupt("return", subscriber.complete());
441
-
442
357
  case 19:
443
358
  _context4.prev = 19;
444
359
  _context4.t0 = _context4["catch"](2);
@@ -446,11 +361,8 @@ var DirectLineStreaming = /*#__PURE__*/function () {
446
361
  // the disconnectionHandler. Everything else can
447
362
  // be retried
448
363
  console.warn(_context4.t0);
449
-
450
364
  _this3.streamConnection.disconnect();
451
-
452
365
  return _context4.abrupt("return", subscriber.error(_context4.t0));
453
-
454
366
  case 24:
455
367
  case "end":
456
368
  return _context4.stop();
@@ -458,34 +370,30 @@ var DirectLineStreaming = /*#__PURE__*/function () {
458
370
  }
459
371
  }, _callee4, null, [[2, 19]]);
460
372
  }));
461
-
462
373
  return function (_x4) {
463
374
  return _ref3.apply(this, arguments);
464
375
  };
465
376
  }());
466
-
467
377
  return resp$;
468
378
  }
469
379
  }, {
470
380
  key: "postMessageWithAttachments",
471
381
  value: function postMessageWithAttachments(message) {
472
382
  var _this4 = this;
473
-
474
383
  var attachments = message.attachments,
475
- messageWithoutAttachments = (0, _objectWithoutProperties2["default"])(message, _excluded);
384
+ messageWithoutAttachments = (0, _objectWithoutProperties2["default"])(message, _excluded);
476
385
  return _Observable.Observable.create(function (subscriber) {
477
386
  var httpContentList = [];
478
- (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6() {
387
+ (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee6() {
479
388
  var arrayBuffers, url, request, activityStream, resp, _yield$resp$streams$, id;
480
-
481
389
  return _regenerator["default"].wrap(function _callee6$(_context6) {
482
390
  while (1) {
483
391
  switch (_context6.prev = _context6.next) {
484
392
  case 0:
485
393
  _context6.prev = 0;
486
394
  _context6.next = 3;
487
- return Promise.all(attachments.map( /*#__PURE__*/function () {
488
- var _ref5 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(attachment) {
395
+ return Promise.all(attachments.map(/*#__PURE__*/function () {
396
+ var _ref5 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee5(attachment) {
489
397
  var media, res;
490
398
  return _regenerator["default"].wrap(function _callee5$(_context5) {
491
399
  while (1) {
@@ -494,18 +402,14 @@ var DirectLineStreaming = /*#__PURE__*/function () {
494
402
  media = attachment;
495
403
  _context5.next = 3;
496
404
  return (0, _crossFetch["default"])(media.contentUrl);
497
-
498
405
  case 3:
499
406
  res = _context5.sent;
500
-
501
407
  if (!res.ok) {
502
408
  _context5.next = 12;
503
409
  break;
504
410
  }
505
-
506
411
  _context5.next = 7;
507
412
  return res.arrayBuffer();
508
-
509
413
  case 7:
510
414
  _context5.t0 = _context5.sent;
511
415
  _context5.t1 = media;
@@ -513,10 +417,8 @@ var DirectLineStreaming = /*#__PURE__*/function () {
513
417
  arrayBuffer: _context5.t0,
514
418
  media: _context5.t1
515
419
  });
516
-
517
420
  case 12:
518
421
  throw new Error('...');
519
-
520
422
  case 13:
521
423
  case "end":
522
424
  return _context5.stop();
@@ -524,20 +426,16 @@ var DirectLineStreaming = /*#__PURE__*/function () {
524
426
  }
525
427
  }, _callee5);
526
428
  }));
527
-
528
429
  return function (_x5) {
529
430
  return _ref5.apply(this, arguments);
530
431
  };
531
432
  }()));
532
-
533
433
  case 3:
534
434
  arrayBuffers = _context6.sent;
535
435
  arrayBuffers.forEach(function (_ref6) {
536
436
  var arrayBuffer = _ref6.arrayBuffer,
537
- media = _ref6.media;
538
-
437
+ media = _ref6.media;
539
438
  var buffer = _buffer.Buffer.from(arrayBuffer);
540
-
541
439
  var stream = new BFSE.SubscribableStream();
542
440
  stream.write(buffer);
543
441
  var httpContent = new BFSE.HttpContent({
@@ -559,38 +457,30 @@ var DirectLineStreaming = /*#__PURE__*/function () {
559
457
  });
560
458
  _context6.next = 13;
561
459
  return _this4.streamConnection.send(request);
562
-
563
460
  case 13:
564
461
  resp = _context6.sent;
565
-
566
462
  if (!(resp.streams && resp.streams.length !== 1)) {
567
463
  _context6.next = 18;
568
464
  break;
569
465
  }
570
-
571
466
  subscriber.error(new Error("Invalid stream count ".concat(resp.streams.length)));
572
467
  _context6.next = 24;
573
468
  break;
574
-
575
469
  case 18:
576
470
  _context6.next = 20;
577
471
  return resp.streams[0].readAsJson();
578
-
579
472
  case 20:
580
473
  _yield$resp$streams$ = _context6.sent;
581
474
  id = _yield$resp$streams$.Id;
582
475
  subscriber.next(id);
583
476
  subscriber.complete();
584
-
585
477
  case 24:
586
478
  _context6.next = 29;
587
479
  break;
588
-
589
480
  case 26:
590
481
  _context6.prev = 26;
591
482
  _context6.t0 = _context6["catch"](0);
592
483
  subscriber.error(_context6.t0);
593
-
594
484
  case 29:
595
485
  case "end":
596
486
  return _context6.stop();
@@ -603,9 +493,8 @@ var DirectLineStreaming = /*#__PURE__*/function () {
603
493
  }, {
604
494
  key: "waitUntilOnline",
605
495
  value: function () {
606
- var _waitUntilOnline = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7() {
496
+ var _waitUntilOnline = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee7() {
607
497
  var _this5 = this;
608
-
609
498
  return _regenerator["default"].wrap(function _callee7$(_context7) {
610
499
  while (1) {
611
500
  switch (_context7.prev = _context7.next) {
@@ -619,7 +508,6 @@ var DirectLineStreaming = /*#__PURE__*/function () {
619
508
  return reject(e);
620
509
  });
621
510
  }));
622
-
623
511
  case 1:
624
512
  case "end":
625
513
  return _context7.stop();
@@ -627,48 +515,39 @@ var DirectLineStreaming = /*#__PURE__*/function () {
627
515
  }
628
516
  }, _callee7);
629
517
  }));
630
-
631
518
  function waitUntilOnline() {
632
519
  return _waitUntilOnline.apply(this, arguments);
633
520
  }
634
-
635
521
  return waitUntilOnline;
636
522
  }()
637
523
  }, {
638
524
  key: "connectAsync",
639
525
  value: function () {
640
- var _connectAsync = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee9() {
526
+ var _connectAsync = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee9() {
641
527
  var _this6 = this;
642
-
643
528
  var re, params, abortController, urlSearchParams, wsUrl;
644
529
  return _regenerator["default"].wrap(function _callee9$(_context9) {
645
530
  while (1) {
646
531
  switch (_context9.prev = _context9.next) {
647
532
  case 0:
648
533
  re = new RegExp('^http(s?)');
649
-
650
534
  if (re.test(this.domain)) {
651
535
  _context9.next = 3;
652
536
  break;
653
537
  }
654
-
655
538
  throw 'Domain must begin with http or https';
656
-
657
539
  case 3:
658
540
  params = {
659
541
  token: this.token
660
542
  };
661
-
662
543
  if (this.conversationId) {
663
544
  params['conversationId'] = this.conversationId;
664
545
  }
665
-
666
546
  abortController = new AbortController();
667
547
  urlSearchParams = new URLSearchParams(params).toString();
668
548
  wsUrl = "".concat(this.domain.replace(re, 'ws$1'), "/conversations/connect?").concat(urlSearchParams); // This promise will resolve when it is disconnected.
669
-
670
- return _context9.abrupt("return", new Promise( /*#__PURE__*/function () {
671
- var _ref7 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee8(resolve, reject) {
549
+ return _context9.abrupt("return", new Promise(/*#__PURE__*/function () {
550
+ var _ref7 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee8(resolve, reject) {
672
551
  var request, response, responseString, conversation;
673
552
  return _regenerator["default"].wrap(function _callee8$(_context8) {
674
553
  while (1) {
@@ -685,7 +564,6 @@ var DirectLineStreaming = /*#__PURE__*/function () {
685
564
  if (abortController.signal.aborted) {
686
565
  throw new Error('Cannot process streaming request, `streamingConnection` should be disconnected.');
687
566
  }
688
-
689
567
  return _this6.theStreamHandler.processRequest(streamingRequest);
690
568
  }
691
569
  },
@@ -694,59 +572,46 @@ var DirectLineStreaming = /*#__PURE__*/function () {
694
572
  _this6.queueActivities = true;
695
573
  _context8.next = 5;
696
574
  return _this6.streamConnection.connect();
697
-
698
575
  case 5:
699
576
  request = BFSE.StreamingRequest.create('POST', '/v3/directline/conversations');
700
577
  _context8.next = 8;
701
578
  return _this6.streamConnection.send(request);
702
-
703
579
  case 8:
704
580
  response = _context8.sent;
705
-
706
581
  if (!(response.statusCode !== 200)) {
707
582
  _context8.next = 11;
708
583
  break;
709
584
  }
710
-
711
585
  throw new Error('Connection response code ' + response.statusCode);
712
-
713
586
  case 11:
714
587
  if (!(response.streams.length !== 1)) {
715
588
  _context8.next = 13;
716
589
  break;
717
590
  }
718
-
719
591
  throw new Error('Expected 1 stream but got ' + response.streams.length);
720
-
721
592
  case 13:
722
593
  _context8.next = 15;
723
594
  return response.streams[0].readAsString();
724
-
725
595
  case 15:
726
596
  responseString = _context8.sent;
727
597
  conversation = JSON.parse(responseString);
728
598
  _this6.conversationId = conversation.conversationId;
599
+ _this6.connectionStatus$.next(_directLine.ConnectionStatus.Online);
729
600
 
730
- _this6.connectionStatus$.next(_directLine.ConnectionStatus.Online); // Wait until DL consumers have had a chance to be notified
601
+ // Wait until DL consumers have had a chance to be notified
731
602
  // of the connection status change.
732
603
  // This is specific to RxJS implementation of observable, which calling subscribe() after next() will still get the value.
733
-
734
-
735
604
  _context8.next = 21;
736
605
  return _this6.waitUntilOnline();
737
-
738
606
  case 21:
739
607
  _this6.theStreamHandler.flush();
740
-
741
608
  _this6.queueActivities = false;
742
609
  _context8.next = 28;
743
610
  break;
744
-
745
611
  case 25:
746
612
  _context8.prev = 25;
747
613
  _context8.t0 = _context8["catch"](0);
748
614
  reject(_context8.t0);
749
-
750
615
  case 28:
751
616
  case "end":
752
617
  return _context8.stop();
@@ -754,14 +619,12 @@ var DirectLineStreaming = /*#__PURE__*/function () {
754
619
  }
755
620
  }, _callee8, null, [[0, 25]]);
756
621
  }));
757
-
758
622
  return function (_x6, _x7) {
759
623
  return _ref7.apply(this, arguments);
760
624
  };
761
625
  }())["finally"](function () {
762
626
  return abortController.abort();
763
627
  }));
764
-
765
628
  case 9:
766
629
  case "end":
767
630
  return _context9.stop();
@@ -769,19 +632,16 @@ var DirectLineStreaming = /*#__PURE__*/function () {
769
632
  }
770
633
  }, _callee9, this);
771
634
  }));
772
-
773
635
  function connectAsync() {
774
636
  return _connectAsync.apply(this, arguments);
775
637
  }
776
-
777
638
  return connectAsync;
778
639
  }()
779
640
  }, {
780
641
  key: "connectWithRetryAsync",
781
642
  value: function () {
782
- var _connectWithRetryAsync = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee10() {
643
+ var _connectWithRetryAsync = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee10() {
783
644
  var _this7 = this;
784
-
785
645
  var numRetries, start;
786
646
  return _regenerator["default"].wrap(function _callee10$(_context10) {
787
647
  while (1) {
@@ -789,83 +649,68 @@ var DirectLineStreaming = /*#__PURE__*/function () {
789
649
  case 0:
790
650
  _context10.next = 2;
791
651
  return (this.connectDeferred = (0, _createDeferred["default"])()).promise;
792
-
793
652
  case 2:
794
653
  numRetries = MAX_RETRY_COUNT;
795
654
  this.connectionStatus$.next(_directLine.ConnectionStatus.Connecting);
796
-
797
655
  case 4:
798
656
  if (!(numRetries > 0)) {
799
657
  _context10.next = 27;
800
658
  break;
801
659
  }
802
-
803
660
  numRetries--;
804
661
  start = Date.now();
805
662
  _context10.prev = 7;
806
663
  _context10.next = 10;
807
664
  return this.connectAsync();
808
-
809
665
  case 10:
810
666
  _context10.next = 15;
811
667
  break;
812
-
813
668
  case 12:
814
669
  _context10.prev = 12;
815
670
  _context10.t0 = _context10["catch"](7);
816
671
  console.error(_context10.t0);
817
-
818
672
  case 15:
819
673
  if (!(this.connectionStatus$.getValue() === _directLine.ConnectionStatus.Ended)) {
820
674
  _context10.next = 17;
821
675
  break;
822
676
  }
823
-
824
677
  return _context10.abrupt("return");
825
-
826
678
  case 17:
827
679
  // Make sure we don't signal ConnectionStatus.Connecting twice or more without an actual connection.
828
680
  // Subsequent retries should be transparent.
829
681
  if (this.connectionStatus$.getValue() !== _directLine.ConnectionStatus.Connecting) {
830
682
  this.connectionStatus$.next(_directLine.ConnectionStatus.Connecting);
831
- } // If the current connection lasted for more than a minute, the previous connection is good, which means:
683
+ }
684
+
685
+ // If the current connection lasted for more than a minute, the previous connection is good, which means:
832
686
  // - we should reset the retry counter, and;
833
687
  // - we should reconnect immediately.
834
-
835
-
836
688
  if (!(60000 < Date.now() - start)) {
837
689
  _context10.next = 22;
838
690
  break;
839
691
  }
840
-
841
692
  numRetries = MAX_RETRY_COUNT;
842
693
  _context10.next = 25;
843
694
  break;
844
-
845
695
  case 22:
846
696
  if (!(numRetries > 0)) {
847
697
  _context10.next = 25;
848
698
  break;
849
699
  }
850
-
851
700
  _context10.next = 25;
852
701
  return new Promise(function (r) {
853
702
  return setTimeout(r, _this7.getRetryDelay());
854
703
  });
855
-
856
704
  case 25:
857
705
  _context10.next = 4;
858
706
  break;
859
-
860
707
  case 27:
861
708
  // TODO: [TEST] Make sure FailedToConnect is reported immediately after last disconnection, should be no getRetryDelay().
862
709
  // Failed to reconnect after multiple retries.
863
710
  this.connectionStatus$.next(_directLine.ConnectionStatus.FailedToConnect);
864
-
865
711
  case 28:
866
712
  _context10.next = 0;
867
713
  break;
868
-
869
714
  case 30:
870
715
  case "end":
871
716
  return _context10.stop();
@@ -873,14 +718,11 @@ var DirectLineStreaming = /*#__PURE__*/function () {
873
718
  }
874
719
  }, _callee10, this, [[7, 12]]);
875
720
  }));
876
-
877
721
  function connectWithRetryAsync() {
878
722
  return _connectWithRetryAsync.apply(this, arguments);
879
723
  }
880
-
881
724
  return connectWithRetryAsync;
882
725
  }() // Returns the delay duration in milliseconds
883
-
884
726
  }, {
885
727
  key: "getRetryDelay",
886
728
  value: function getRetryDelay() {
@@ -889,6 +731,5 @@ var DirectLineStreaming = /*#__PURE__*/function () {
889
731
  }]);
890
732
  return DirectLineStreaming;
891
733
  }();
892
-
893
734
  exports.DirectLineStreaming = DirectLineStreaming;
894
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9kaXJlY3RMaW5lU3RyZWFtaW5nLnRzIl0sIm5hbWVzIjpbIkRJUkVDVF9MSU5FX1ZFUlNJT04iLCJNQVhfUkVUUllfQ09VTlQiLCJyZWZyZXNoVG9rZW5MaWZldGltZSIsInJlZnJlc2hUb2tlbkludGVydmFsIiwiU3RyZWFtSGFuZGxlciIsInMiLCJjJCIsInNxIiwic3Vic2NyaWJlciIsImNvbm5lY3Rpb25TdGF0dXMkIiwic2hvdWxkUXVldWUiLCJyZXF1ZXN0IiwibG9nZ2VyIiwic3RyZWFtcyIsInN0cmVhbTAiLCJzaGlmdCIsInJlYWRBc1N0cmluZyIsImFjdGl2aXR5U2V0SnNvbiIsImFjdGl2aXR5U2V0IiwiSlNPTiIsInBhcnNlIiwiYWN0aXZpdGllcyIsImxlbmd0aCIsImVycm9yIiwiRXJyb3IiLCJCRlNFIiwiU3RyZWFtaW5nUmVzcG9uc2UiLCJjcmVhdGUiLCJhY3Rpdml0eSIsImF0dGFjaG1lbnRzIiwic3RyZWFtIiwiYXR0YWNobWVudCIsImRhdGFVcmkiLCJwdXNoIiwiY29udGVudFR5cGUiLCJjb250ZW50VXJsIiwiYWN0aXZpdHlRdWV1ZSIsIm5leHQiLCJzdWJzY3JpYmUiLCJmb3JFYWNoIiwiYSIsImNvbXBsZXRlIiwiRGlyZWN0TGluZVN0cmVhbWluZyIsIm9wdGlvbnMiLCJCZWhhdmlvclN1YmplY3QiLCJDb25uZWN0aW9uU3RhdHVzIiwiVW5pbml0aWFsaXplZCIsIm5ldHdvcmtJbmZvcm1hdGlvbiIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwidHlwZSIsImNvbnNvbGUiLCJ3YXJuIiwidG9rZW4iLCJyZWZyZXNoVG9rZW4iLCJFeHBpcmVkVG9rZW4iLCJkb21haW4iLCJjb252ZXJzYXRpb25JZCIsIl9ib3RBZ2VudCIsImdldEJvdEFnZW50IiwiYm90QWdlbnQiLCJxdWV1ZUFjdGl2aXRpZXMiLCJhY3Rpdml0eSQiLCJPYnNlcnZhYmxlIiwiYWN0aXZpdHlTdWJzY3JpYmVyIiwidGhlU3RyZWFtSGFuZGxlciIsImNvbm5lY3REZWZlcnJlZCIsInJlc29sdmUiLCJzaGFyZSIsImNvbm5lY3RXaXRoUmV0cnlBc3luYyIsImdldFZhbHVlIiwiRW5kZWQiLCJzdHJlYW1Db25uZWN0aW9uIiwiZGlzY29ubmVjdCIsIkF1dGhvcml6YXRpb24iLCJjdXN0b21BZ2VudCIsImNsaWVudEFnZW50IiwiZmlyc3RDYWxsIiwicmV0cnlDb3VudCIsIndhaXRVbnRpbE9ubGluZSIsIm51bWJlck9mQXR0ZW1wdHMiLCJQcm9taXNlIiwiciIsInNldFRpbWVvdXQiLCJtZXRob2QiLCJoZWFkZXJzIiwiY29tbW9uSGVhZGVycyIsInJlcyIsIm9rIiwianNvbiIsInN0YXR1cyIsInN0YXR1c1RleHQiLCJ2YWx1ZSIsIkZhaWxlZFRvQ29ubmVjdCIsInBvc3RNZXNzYWdlV2l0aEF0dGFjaG1lbnRzIiwicmVzcCQiLCJTdHJlYW1pbmdSZXF1ZXN0Iiwic2V0Qm9keSIsInN0cmluZ2lmeSIsInNlbmQiLCJyZXNwIiwic3RhdHVzQ29kZSIsIm51bWJlck9mU3RyZWFtcyIsImlkU3RyaW5nIiwiaWQiLCJJZCIsIm1lc3NhZ2UiLCJtZXNzYWdlV2l0aG91dEF0dGFjaG1lbnRzIiwiaHR0cENvbnRlbnRMaXN0IiwiYWxsIiwibWFwIiwibWVkaWEiLCJhcnJheUJ1ZmZlciIsImFycmF5QnVmZmVycyIsImJ1ZmZlciIsIkJ1ZmZlciIsImZyb20iLCJTdWJzY3JpYmFibGVTdHJlYW0iLCJ3cml0ZSIsImh0dHBDb250ZW50IiwiSHR0cENvbnRlbnQiLCJjb250ZW50TGVuZ3RoIiwidXJsIiwiYWN0aXZpdHlTdHJlYW0iLCJhZGRTdHJlYW0iLCJlIiwicmVhZEFzSnNvbiIsInJlamVjdCIsImNzIiwiT25saW5lIiwicmUiLCJSZWdFeHAiLCJ0ZXN0IiwicGFyYW1zIiwiYWJvcnRDb250cm9sbGVyIiwiQWJvcnRDb250cm9sbGVyIiwidXJsU2VhcmNoUGFyYW1zIiwiVVJMU2VhcmNoUGFyYW1zIiwidG9TdHJpbmciLCJ3c1VybCIsInJlcGxhY2UiLCJXZWJTb2NrZXRDbGllbnRXaXRoTmV0d29ya0luZm9ybWF0aW9uIiwiZGlzY29ubmVjdGlvbkhhbmRsZXIiLCJyZXF1ZXN0SGFuZGxlciIsInByb2Nlc3NSZXF1ZXN0Iiwic3RyZWFtaW5nUmVxdWVzdCIsInNpZ25hbCIsImFib3J0ZWQiLCJjb25uZWN0IiwicmVzcG9uc2UiLCJyZXNwb25zZVN0cmluZyIsImNvbnZlcnNhdGlvbiIsImZsdXNoIiwiYWJvcnQiLCJwcm9taXNlIiwibnVtUmV0cmllcyIsIkNvbm5lY3RpbmciLCJzdGFydCIsIkRhdGUiLCJub3ciLCJjb25uZWN0QXN5bmMiLCJnZXRSZXRyeURlbGF5IiwiTWF0aCIsImZsb29yIiwicmFuZG9tIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOzs7Ozs7OztBQUdBLElBQU1BLG1CQUFtQixHQUFHLGdCQUE1QjtBQUNBLElBQU1DLGVBQWUsR0FBRyxDQUF4QjtBQUNBLElBQU1DLG9CQUFvQixHQUFHLEtBQUssRUFBTCxHQUFVLElBQXZDLEMsQ0FDQTtBQUNBOztBQUNBLElBQU1DLG9CQUFvQixHQUFHRCxvQkFBb0IsR0FBRyxDQUFwRDs7SUFnQk1FLGE7QUFNSix5QkFBWUMsQ0FBWixFQUFxQ0MsRUFBckMsRUFBdUVDLEVBQXZFLEVBQTBGO0FBQUE7QUFBQSw0REFGakQsRUFFaUQ7QUFDeEYsU0FBS0MsVUFBTCxHQUFrQkgsQ0FBbEI7QUFDQSxTQUFLSSxpQkFBTCxHQUF5QkgsRUFBekI7QUFDQSxTQUFLSSxXQUFMLEdBQW1CSCxFQUFuQjtBQUNEOzs7O1dBRUQsdUJBQXFCRixDQUFyQixFQUE4QztBQUM1QyxXQUFLRyxVQUFMLEdBQWtCSCxDQUFsQjtBQUNEOzs7OzBHQUVELGlCQUFxQk0sT0FBckIsRUFBb0RDLE1BQXBEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNRQyxnQkFBQUEsT0FEUix1Q0FDc0JGLE9BQU8sQ0FBQ0UsT0FEOUI7QUFFUUMsZ0JBQUFBLE9BRlIsR0FFa0JELE9BQU8sQ0FBQ0UsS0FBUixFQUZsQjtBQUFBO0FBQUEsdUJBR2dDRCxPQUFPLENBQUNFLFlBQVIsRUFIaEM7O0FBQUE7QUFHUUMsZ0JBQUFBLGVBSFI7QUFJUUMsZ0JBQUFBLFdBSlIsR0FJc0JDLElBQUksQ0FBQ0MsS0FBTCxDQUFXSCxlQUFYLENBSnRCOztBQUFBLHNCQU1NQyxXQUFXLENBQUNHLFVBQVosQ0FBdUJDLE1BQXZCLEtBQWtDLENBTnhDO0FBQUE7QUFBQTtBQUFBOztBQU9JO0FBQ0EscUJBQUtkLFVBQUwsQ0FBZ0JlLEtBQWhCLENBQXNCLElBQUlDLEtBQUosQ0FBVSxzQ0FBVixDQUF0QjtBQVJKLGlEQVNXQyxJQUFJLENBQUNDLGlCQUFMLENBQXVCQyxNQUF2QixDQUE4QixHQUE5QixDQVRYOztBQUFBO0FBWVFDLGdCQUFBQSxRQVpSLEdBWW1CVixXQUFXLENBQUNHLFVBQVosQ0FBdUIsQ0FBdkIsQ0FabkI7O0FBQUEsc0JBY01SLE9BQU8sQ0FBQ1MsTUFBUixHQUFpQixDQWR2QjtBQUFBO0FBQUE7QUFBQTs7QUFlVU8sZ0JBQUFBLFdBZlYsdUNBZTRCRCxRQUFRLENBQUNDLFdBZnJDOztBQUFBO0FBQUEsc0JBa0JZQyxNQUFNLEdBQUdqQixPQUFPLENBQUNFLEtBQVIsRUFsQnJCO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUEsdUJBbUIrQmUsTUFBTSxDQUFDZCxZQUFQLEVBbkIvQjs7QUFBQTtBQW1CWWUsZ0JBQUFBLFVBbkJaO0FBb0JZQyxnQkFBQUEsT0FwQlosR0FvQnNCLDRCQUE0QkQsVUFwQmxEO0FBcUJNRixnQkFBQUEsV0FBVyxDQUFDSSxJQUFaLENBQWlCO0FBQUVDLGtCQUFBQSxXQUFXLEVBQUVKLE1BQU0sQ0FBQ0ksV0FBdEI7QUFBbUNDLGtCQUFBQSxVQUFVLEVBQUVIO0FBQS9DLGlCQUFqQjtBQXJCTjtBQUFBOztBQUFBO0FBd0JJSixnQkFBQUEsUUFBUSxDQUFDQyxXQUFULEdBQXVCQSxXQUF2Qjs7QUF4Qko7QUEyQkUsb0JBQUksS0FBS25CLFdBQUwsRUFBSixFQUF3QjtBQUN0Qix1QkFBSzBCLGFBQUwsQ0FBbUJILElBQW5CLENBQXdCTCxRQUF4QjtBQUNELGlCQUZELE1BRU87QUFDTCx1QkFBS3BCLFVBQUwsQ0FBZ0I2QixJQUFoQixDQUFxQlQsUUFBckI7QUFDRDs7QUEvQkgsaURBaUNTSCxJQUFJLENBQUNDLGlCQUFMLENBQXVCQyxNQUF2QixDQUE4QixHQUE5QixDQWpDVDs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxPOzs7Ozs7Ozs7O1dBb0NBLGlCQUFlO0FBQUE7O0FBQ2IsV0FBS2xCLGlCQUFMLENBQXVCNkIsU0FBdkIsQ0FBaUMsWUFBTSxDQUFFLENBQXpDO0FBQ0EsV0FBS0YsYUFBTCxDQUFtQkcsT0FBbkIsQ0FBMkIsVUFBQUMsQ0FBQztBQUFBLGVBQUksS0FBSSxDQUFDaEMsVUFBTCxDQUFnQjZCLElBQWhCLENBQXFCRyxDQUFyQixDQUFKO0FBQUEsT0FBNUI7QUFDQSxXQUFLSixhQUFMLEdBQXFCLEVBQXJCO0FBQ0Q7OztXQUVELGVBQWE7QUFDWCxXQUFLNUIsVUFBTCxDQUFnQmlDLFFBQWhCO0FBQ0Q7Ozs7Ozs7SUFHVUMsbUI7QUFtQlgsK0JBQVlDLE9BQVosRUFBaUQ7QUFBQTs7QUFBQTtBQUFBLGdFQWxCdEIsSUFBSUMsZ0NBQUosQ0FBb0JDLDZCQUFpQkMsYUFBckMsQ0FrQnNCO0FBQUEsd0RBSjdCLEVBSTZCOztBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUMvQztBQUNBLFFBQU1DLGtCQUFrQixHQUFHSixPQUFILGFBQUdBLE9BQUgsdUJBQUdBLE9BQU8sQ0FBRUksa0JBQXBDOztBQUVBLFFBQ0UsT0FBT0Esa0JBQVAsS0FBOEIsV0FBOUIsSUFDQyxPQUFPQSxrQkFBa0IsQ0FBQ0MsZ0JBQTFCLEtBQStDLFVBQS9DLElBQ0MsT0FBT0Qsa0JBQWtCLENBQUNFLG1CQUExQixLQUFrRCxVQURuRCxJQUVDLE9BQU9GLGtCQUFrQixDQUFDRyxJQUExQixLQUFtQyxRQUp2QyxFQUtFO0FBQ0Esd0VBQTJCSCxrQkFBM0I7QUFDRCxLQVBELE1BT087QUFDTEksTUFBQUEsT0FBTyxDQUFDQyxJQUFSLENBQ0UsNExBREY7QUFHRDs7QUFFRCxTQUFLQyxLQUFMLEdBQWFWLE9BQU8sQ0FBQ1UsS0FBckI7QUFFQSxTQUFLQyxZQUFMLFlBQTBCLFlBQU07QUFDOUIsTUFBQSxNQUFJLENBQUM3QyxpQkFBTCxDQUF1QjRCLElBQXZCLENBQTRCUSw2QkFBaUJVLFlBQTdDO0FBQ0QsS0FGRDtBQUlBLFNBQUtDLE1BQUwsR0FBY2IsT0FBTyxDQUFDYSxNQUF0Qjs7QUFFQSxRQUFJYixPQUFPLENBQUNjLGNBQVosRUFBNEI7QUFDMUIsV0FBS0EsY0FBTCxHQUFzQmQsT0FBTyxDQUFDYyxjQUE5QjtBQUNEOztBQUVELFNBQUtDLFNBQUwsR0FBaUIsS0FBS0MsV0FBTCxDQUFpQmhCLE9BQU8sQ0FBQ2lCLFFBQXpCLENBQWpCO0FBRUEsU0FBS0MsZUFBTCxHQUF1QixJQUF2QjtBQUNBLFNBQUtDLFNBQUwsR0FBaUJDLHVCQUFXcEMsTUFBWDtBQUFBLCtGQUFrQixrQkFBT25CLFVBQVA7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNqQyxnQkFBQSxNQUFJLENBQUN3RCxrQkFBTCxHQUEwQnhELFVBQTFCO0FBQ0EsZ0JBQUEsTUFBSSxDQUFDeUQsZ0JBQUwsR0FBd0IsSUFBSTdELGFBQUosQ0FBa0JJLFVBQWxCLEVBQThCLE1BQUksQ0FBQ0MsaUJBQW5DLEVBQXNEO0FBQUEseUJBQU0sTUFBSSxDQUFDb0QsZUFBWDtBQUFBLGlCQUF0RCxDQUF4QixDQUZpQyxDQUlqQzs7QUFDQSxnQkFBQSxNQUFJLENBQUNLLGVBQUwsQ0FBcUJDLE9BQXJCOztBQUxpQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxPQUFsQjs7QUFBQTtBQUFBO0FBQUE7QUFBQSxTQU1kQyxLQU5jLEVBQWpCLENBaEMrQyxDQXdDL0M7O0FBQ0EsU0FBS0MscUJBQUw7QUFDRDs7OztXQUVELDBCQUEwRDtBQUFBLFVBQXZDWixjQUF1QyxTQUF2Q0EsY0FBdUM7QUFBQSxVQUF2QkosS0FBdUIsU0FBdkJBLEtBQXVCOztBQUN4RCxVQUFJLEtBQUs1QyxpQkFBTCxDQUF1QjZELFFBQXZCLE9BQXNDekIsNkJBQWlCMEIsS0FBM0QsRUFBa0U7QUFDaEUsY0FBTSxJQUFJL0MsS0FBSixDQUFVLHVCQUFWLENBQU47QUFDRDs7QUFFRCxXQUFLaUMsY0FBTCxHQUFzQkEsY0FBdEI7QUFDQSxXQUFLSixLQUFMLEdBQWFBLEtBQWI7QUFFQSxXQUFLYSxlQUFMLENBQXFCQyxPQUFyQjtBQUNEOzs7V0FFRCxlQUFNO0FBQ0o7QUFDQSxXQUFLSCxrQkFBTCxDQUF3QnZCLFFBQXhCO0FBRUEsV0FBS2hDLGlCQUFMLENBQXVCNEIsSUFBdkIsQ0FBNEJRLDZCQUFpQjBCLEtBQTdDO0FBQ0EsV0FBSzlELGlCQUFMLENBQXVCZ0MsUUFBdkI7QUFFQSxXQUFLK0IsZ0JBQUwsQ0FBc0JDLFVBQXRCO0FBQ0Q7OztXQUVELHlCQUF3QjtBQUN0QixhQUFPO0FBQ0xDLFFBQUFBLGFBQWEsbUJBQVksS0FBS3JCLEtBQWpCLENBRFI7QUFFTCwwQkFBa0IsS0FBS0s7QUFGbEIsT0FBUDtBQUlEOzs7V0FFRCx1QkFBc0Q7QUFBQSxVQUFsQ2lCLFdBQWtDLHVFQUFaLEVBQVk7QUFDcEQsVUFBSUMsV0FBVyxHQUFHLHFCQUFsQjs7QUFFQSxVQUFJRCxXQUFKLEVBQWlCO0FBQ2ZDLFFBQUFBLFdBQVcsZ0JBQVNELFdBQVQsQ0FBWDtBQUNEOztBQUVELHVCQUFVM0UsbUJBQVYsZUFBa0M0RSxXQUFsQztBQUNEOzs7O3dHQUVEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBMkJDLGdCQUFBQSxTQUEzQiw4REFBdUMsSUFBdkM7QUFBNkNDLGdCQUFBQSxVQUE3Qyw4REFBMEQsQ0FBMUQ7QUFBQTtBQUFBLHVCQUNRLEtBQUtDLGVBQUwsRUFEUjs7QUFBQTtBQUdNQyxnQkFBQUEsZ0JBSE4sR0FHeUIsQ0FIekI7O0FBQUE7QUFBQSxzQkFJU0EsZ0JBQWdCLEdBQUcvRSxlQUo1QjtBQUFBO0FBQUE7QUFBQTs7QUFLSStFLGdCQUFBQSxnQkFBZ0I7QUFMcEI7QUFBQSx1QkFNVSxJQUFJQyxPQUFKLENBQVksVUFBQUMsQ0FBQztBQUFBLHlCQUFJQyxVQUFVLENBQUNELENBQUQsRUFBSS9FLG9CQUFKLENBQWQ7QUFBQSxpQkFBYixDQU5WOztBQUFBO0FBQUE7QUFBQTtBQUFBLHVCQVF3QixzQ0FBUyxLQUFLcUQsTUFBZCxzQkFBdUM7QUFBRTRCLGtCQUFBQSxNQUFNLEVBQUUsTUFBVjtBQUFrQkMsa0JBQUFBLE9BQU8sRUFBRSxLQUFLQyxhQUFMO0FBQTNCLGlCQUF2QyxDQVJ4Qjs7QUFBQTtBQVFZQyxnQkFBQUEsR0FSWjs7QUFBQSxxQkFTVUEsR0FBRyxDQUFDQyxFQVRkO0FBQUE7QUFBQTtBQUFBOztBQVVRUixnQkFBQUEsZ0JBQWdCLEdBQUcsQ0FBbkI7QUFWUjtBQUFBLHVCQVdnQ08sR0FBRyxDQUFDRSxJQUFKLEVBWGhDOztBQUFBO0FBQUE7QUFXZ0JwQyxnQkFBQUEsS0FYaEIsbUJBV2dCQSxLQVhoQjtBQVlRLHFCQUFLQSxLQUFMLEdBQWFBLEtBQWI7QUFaUjtBQUFBOztBQUFBO0FBY1Esb0JBQUlrQyxHQUFHLENBQUNHLE1BQUosS0FBZSxHQUFmLElBQXNCSCxHQUFHLENBQUNHLE1BQUosS0FBZSxHQUF6QyxFQUE4QztBQUM1Q3ZDLGtCQUFBQSxPQUFPLENBQUM1QixLQUFSLG1EQUF5RGdFLEdBQUcsQ0FBQ0csTUFBN0QsY0FBdUVILEdBQUcsQ0FBQ0ksVUFBM0U7QUFDQSx1QkFBS25CLGdCQUFMLENBQXNCQyxVQUF0QjtBQUNELGlCQUhELE1BR087QUFDTHRCLGtCQUFBQSxPQUFPLENBQUNDLElBQVIsNEJBQWlDNEIsZ0JBQWpDLHNCQUE2RE8sR0FBRyxDQUFDRyxNQUFqRSxjQUEyRUgsR0FBRyxDQUFDSSxVQUEvRTtBQUNEOztBQW5CVDtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBc0JNeEMsZ0JBQUFBLE9BQU8sQ0FBQ0MsSUFBUiw0QkFBaUM0QixnQkFBakM7O0FBdEJOO0FBQUE7QUFBQTs7QUFBQTtBQTBCRTdCLGdCQUFBQSxPQUFPLENBQUM1QixLQUFSLENBQWMsbUJBQWQ7QUFDQSxxQkFBS2lELGdCQUFMLENBQXNCQyxVQUF0Qjs7QUEzQkY7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTzs7Ozs7Ozs7OztXQThCQSxzQkFBYTdDLFFBQWIsRUFBaUM7QUFBQTs7QUFDL0IsVUFDRSxLQUFLbkIsaUJBQUwsQ0FBdUJtRixLQUF2QixLQUFpQy9DLDZCQUFpQjBCLEtBQWxELElBQ0EsS0FBSzlELGlCQUFMLENBQXVCbUYsS0FBdkIsS0FBaUMvQyw2QkFBaUJnRCxlQUZwRCxFQUdFO0FBQ0EsZUFBTzlCLGdDQUFpQixJQUFJdkMsS0FBSixDQUFVLHNCQUFWLENBQWpCLENBQVA7QUFDRDs7QUFFRCxVQUFJSSxRQUFRLENBQUNzQixJQUFULEtBQWtCLFNBQWxCLElBQStCdEIsUUFBUSxDQUFDQyxXQUF4QyxJQUF1REQsUUFBUSxDQUFDQyxXQUFULENBQXFCUCxNQUFyQixHQUE4QixDQUF6RixFQUE0RjtBQUMxRixlQUFPLEtBQUt3RSwwQkFBTCxDQUFnQ2xFLFFBQWhDLENBQVA7QUFDRDs7QUFFRCxVQUFNbUUsS0FBSyxHQUFHaEMsdUJBQVdwQyxNQUFYO0FBQUEsa0dBQWtCLGtCQUFNbkIsVUFBTjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ3hCRyxrQkFBQUEsT0FEd0IsR0FDZGMsSUFBSSxDQUFDdUUsZ0JBQUwsQ0FBc0JyRSxNQUF0QixDQUNkLE1BRGMsRUFFZCxrQ0FBa0MsTUFBSSxDQUFDOEIsY0FBdkMsR0FBd0QsYUFGMUMsQ0FEYztBQUs5QjlDLGtCQUFBQSxPQUFPLENBQUNzRixPQUFSLENBQWdCOUUsSUFBSSxDQUFDK0UsU0FBTCxDQUFldEUsUUFBZixDQUFoQjtBQUw4QjtBQUFBO0FBQUEseUJBUVQsTUFBSSxDQUFDNEMsZ0JBQUwsQ0FBc0IyQixJQUF0QixDQUEyQnhGLE9BQTNCLENBUlM7O0FBQUE7QUFRdEJ5RixrQkFBQUEsSUFSc0I7O0FBQUEsd0JBU3hCQSxJQUFJLENBQUNDLFVBQUwsS0FBb0IsR0FUSTtBQUFBO0FBQUE7QUFBQTs7QUFBQSx3QkFTTyxJQUFJN0UsS0FBSixDQUFVLDJCQUEyQjRFLElBQUksQ0FBQ0MsVUFBMUMsQ0FUUDs7QUFBQTtBQVV0QkMsa0JBQUFBLGVBVnNCLEdBVUpGLElBQUksQ0FBQ3ZGLE9BQUwsQ0FBYVMsTUFWVDs7QUFBQSx3QkFXeEJnRixlQUFlLEtBQUssQ0FYSTtBQUFBO0FBQUE7QUFBQTs7QUFBQSx3QkFXSyxJQUFJOUUsS0FBSixDQUFVLGlDQUFpQzhFLGVBQTNDLENBWEw7O0FBQUE7QUFBQTtBQUFBLHlCQVlMRixJQUFJLENBQUN2RixPQUFMLENBQWEsQ0FBYixFQUFnQkcsWUFBaEIsRUFaSzs7QUFBQTtBQVl0QnVGLGtCQUFBQSxRQVpzQjtBQUFBLGdDQWFUcEYsSUFBSSxDQUFDQyxLQUFMLENBQVdtRixRQUFYLENBYlMsRUFhaEJDLEVBYmdCLGVBYXBCQyxFQWJvQjtBQWM1QmpHLGtCQUFBQSxVQUFVLENBQUM2QixJQUFYLENBQWdCbUUsRUFBaEI7QUFkNEIsb0RBZXJCaEcsVUFBVSxDQUFDaUMsUUFBWCxFQWZxQjs7QUFBQTtBQUFBO0FBQUE7QUFpQjVCO0FBQ0E7QUFDQTtBQUNBVSxrQkFBQUEsT0FBTyxDQUFDQyxJQUFSOztBQUNBLGtCQUFBLE1BQUksQ0FBQ29CLGdCQUFMLENBQXNCQyxVQUF0Qjs7QUFyQjRCLG9EQXNCckJqRSxVQUFVLENBQUNlLEtBQVgsY0F0QnFCOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFNBQWxCOztBQUFBO0FBQUE7QUFBQTtBQUFBLFVBQWQ7O0FBeUJBLGFBQU93RSxLQUFQO0FBQ0Q7OztXQUVELG9DQUFtQ1csT0FBbkMsRUFBcUQ7QUFBQTs7QUFDbkQsVUFBUTdFLFdBQVIsR0FBc0Q2RSxPQUF0RCxDQUFRN0UsV0FBUjtBQUFBLFVBQXdCOEUseUJBQXhCLDZDQUFzREQsT0FBdEQ7QUFFQSxhQUFPM0MsdUJBQVdwQyxNQUFYLENBQWtCLFVBQUFuQixVQUFVLEVBQUk7QUFDckMsWUFBTW9HLGVBQWUsR0FBRyxFQUF4QjtBQUNBLHNGQUFDO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEseUJBRThCM0IsT0FBTyxDQUFDNEIsR0FBUixDQUN6QmhGLFdBQVcsQ0FBQ2lGLEdBQVo7QUFBQSw4R0FBZ0Isa0JBQU0vRSxVQUFOO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNSZ0YsOEJBQUFBLEtBRFEsR0FDQWhGLFVBREE7QUFBQTtBQUFBLHFDQUVJLDRCQUFNZ0YsS0FBSyxDQUFDNUUsVUFBWixDQUZKOztBQUFBO0FBRVJvRCw4QkFBQUEsR0FGUTs7QUFBQSxtQ0FHVkEsR0FBRyxDQUFDQyxFQUhNO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUEscUNBSWdCRCxHQUFHLENBQUN5QixXQUFKLEVBSmhCOztBQUFBO0FBQUE7QUFBQSw2Q0FJbUNELEtBSm5DO0FBQUE7QUFJSEMsZ0NBQUFBLFdBSkc7QUFJbUNELGdDQUFBQSxLQUpuQztBQUFBOztBQUFBO0FBQUEsb0NBTU4sSUFBSXZGLEtBQUosQ0FBVSxLQUFWLENBTk07O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEscUJBQWhCOztBQUFBO0FBQUE7QUFBQTtBQUFBLHNCQUR5QixDQUY5Qjs7QUFBQTtBQUVTeUYsa0JBQUFBLFlBRlQ7QUFjR0Esa0JBQUFBLFlBQVksQ0FBQzFFLE9BQWIsQ0FBcUIsaUJBQTRCO0FBQUEsd0JBQXpCeUUsV0FBeUIsU0FBekJBLFdBQXlCO0FBQUEsd0JBQVpELEtBQVksU0FBWkEsS0FBWTs7QUFDL0Msd0JBQU1HLE1BQU0sR0FBR0MsZUFBT0MsSUFBUCxDQUFZSixXQUFaLENBQWY7O0FBQ0Esd0JBQU1sRixNQUFNLEdBQUcsSUFBSUwsSUFBSSxDQUFDNEYsa0JBQVQsRUFBZjtBQUNBdkYsb0JBQUFBLE1BQU0sQ0FBQ3dGLEtBQVAsQ0FBYUosTUFBYjtBQUNBLHdCQUFNSyxXQUFXLEdBQUcsSUFBSTlGLElBQUksQ0FBQytGLFdBQVQsQ0FBcUI7QUFBRXRFLHNCQUFBQSxJQUFJLEVBQUU2RCxLQUFLLENBQUM3RSxXQUFkO0FBQTJCdUYsc0JBQUFBLGFBQWEsRUFBRVAsTUFBTSxDQUFDNUY7QUFBakQscUJBQXJCLEVBQWdGUSxNQUFoRixDQUFwQjtBQUNBOEUsb0JBQUFBLGVBQWUsQ0FBQzNFLElBQWhCLENBQXFCc0YsV0FBckI7QUFDRCxtQkFORDtBQVFNRyxrQkFBQUEsR0F0QlQsMENBc0IrQyxNQUFJLENBQUNqRSxjQXRCcEQsb0JBc0I0RWtELHlCQUF5QixDQUFDUyxJQUExQixDQUErQlosRUF0QjNHO0FBdUJTN0Ysa0JBQUFBLE9BdkJULEdBdUJtQmMsSUFBSSxDQUFDdUUsZ0JBQUwsQ0FBc0JyRSxNQUF0QixDQUE2QixLQUE3QixFQUFvQytGLEdBQXBDLENBdkJuQjtBQXdCU0Msa0JBQUFBLGNBeEJULEdBd0IwQixJQUFJbEcsSUFBSSxDQUFDNEYsa0JBQVQsRUF4QjFCO0FBeUJHTSxrQkFBQUEsY0FBYyxDQUFDTCxLQUFmLENBQXFCbkcsSUFBSSxDQUFDK0UsU0FBTCxDQUFlUyx5QkFBZixDQUFyQixFQUFnRSxPQUFoRTtBQUNBaEcsa0JBQUFBLE9BQU8sQ0FBQ2lILFNBQVIsQ0FDRSxJQUFJbkcsSUFBSSxDQUFDK0YsV0FBVCxDQUNFO0FBQUV0RSxvQkFBQUEsSUFBSSxFQUFFLG9DQUFSO0FBQThDdUUsb0JBQUFBLGFBQWEsRUFBRUUsY0FBYyxDQUFDckc7QUFBNUUsbUJBREYsRUFFRXFHLGNBRkYsQ0FERjtBQU1BZixrQkFBQUEsZUFBZSxDQUFDckUsT0FBaEIsQ0FBd0IsVUFBQXNGLENBQUM7QUFBQSwyQkFBSWxILE9BQU8sQ0FBQ2lILFNBQVIsQ0FBa0JDLENBQWxCLENBQUo7QUFBQSxtQkFBekI7QUFoQ0g7QUFBQSx5QkFrQ3NCLE1BQUksQ0FBQ3JELGdCQUFMLENBQXNCMkIsSUFBdEIsQ0FBMkJ4RixPQUEzQixDQWxDdEI7O0FBQUE7QUFrQ1N5RixrQkFBQUEsSUFsQ1Q7O0FBQUEsd0JBbUNPQSxJQUFJLENBQUN2RixPQUFMLElBQWdCdUYsSUFBSSxDQUFDdkYsT0FBTCxDQUFhUyxNQUFiLEtBQXdCLENBbkMvQztBQUFBO0FBQUE7QUFBQTs7QUFvQ0tkLGtCQUFBQSxVQUFVLENBQUNlLEtBQVgsQ0FBaUIsSUFBSUMsS0FBSixnQ0FBa0M0RSxJQUFJLENBQUN2RixPQUFMLENBQWFTLE1BQS9DLEVBQWpCO0FBcENMO0FBQUE7O0FBQUE7QUFBQTtBQUFBLHlCQXNDOEI4RSxJQUFJLENBQUN2RixPQUFMLENBQWEsQ0FBYixFQUFnQmlILFVBQWhCLEVBdEM5Qjs7QUFBQTtBQUFBO0FBc0NpQnRCLGtCQUFBQSxFQXRDakIsd0JBc0NhQyxFQXRDYjtBQXVDS2pHLGtCQUFBQSxVQUFVLENBQUM2QixJQUFYLENBQWdCbUUsRUFBaEI7QUFDQWhHLGtCQUFBQSxVQUFVLENBQUNpQyxRQUFYOztBQXhDTDtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBMkNHakMsa0JBQUFBLFVBQVUsQ0FBQ2UsS0FBWDs7QUEzQ0g7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsU0FBRDtBQThDRCxPQWhETSxDQUFQO0FBaUREOzs7OzJHQUVEO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxrREFDUyxJQUFJMEQsT0FBSixDQUFrQixVQUFDZCxPQUFELEVBQVU0RCxNQUFWLEVBQXFCO0FBQzVDLGtCQUFBLE1BQUksQ0FBQ3RILGlCQUFMLENBQXVCNkIsU0FBdkIsQ0FDRSxVQUFBMEYsRUFBRSxFQUFJO0FBQ0osd0JBQUlBLEVBQUUsS0FBS25GLDZCQUFpQm9GLE1BQTVCLEVBQW9DO0FBQ2xDLDZCQUFPOUQsT0FBTyxFQUFkO0FBQ0Q7QUFDRixtQkFMSCxFQU1FLFVBQUEwRCxDQUFDO0FBQUEsMkJBQUlFLE1BQU0sQ0FBQ0YsQ0FBRCxDQUFWO0FBQUEsbUJBTkg7QUFRRCxpQkFUTSxDQURUOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE87Ozs7Ozs7Ozs7O3dHQWFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNRSyxnQkFBQUEsRUFEUixHQUNhLElBQUlDLE1BQUosQ0FBVyxXQUFYLENBRGI7O0FBQUEsb0JBR09ELEVBQUUsQ0FBQ0UsSUFBSCxDQUFRLEtBQUs1RSxNQUFiLENBSFA7QUFBQTtBQUFBO0FBQUE7O0FBQUEsc0JBSVUsc0NBSlY7O0FBQUE7QUFPUTZFLGdCQUFBQSxNQVBSLEdBT2lCO0FBQUVoRixrQkFBQUEsS0FBSyxFQUFFLEtBQUtBO0FBQWQsaUJBUGpCOztBQVNFLG9CQUFJLEtBQUtJLGNBQVQsRUFBeUI7QUFDdkI0RSxrQkFBQUEsTUFBTSxDQUFDLGdCQUFELENBQU4sR0FBMkIsS0FBSzVFLGNBQWhDO0FBQ0Q7O0FBRUs2RSxnQkFBQUEsZUFiUixHQWEwQixJQUFJQyxlQUFKLEVBYjFCO0FBY1FDLGdCQUFBQSxlQWRSLEdBYzBCLElBQUlDLGVBQUosQ0FBb0JKLE1BQXBCLEVBQTRCSyxRQUE1QixFQWQxQjtBQWVRQyxnQkFBQUEsS0FmUixhQWVtQixLQUFLbkYsTUFBTCxDQUFZb0YsT0FBWixDQUFvQlYsRUFBcEIsRUFBd0IsTUFBeEIsQ0FmbkIsb0NBZTRFTSxlQWY1RSxHQWlCRTs7QUFqQkYsa0RBa0JTLElBQUl2RCxPQUFKO0FBQUEsNEdBQVksa0JBQU9kLE9BQVAsRUFBZ0I0RCxNQUFoQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVmLDRCQUFBLE1BQUksQ0FBQ3ZELGdCQUFMLEdBQXdCLElBQUlxRSxpREFBSixDQUEwQztBQUNoRUMsOEJBQUFBLG9CQUFvQixFQUFFM0UsT0FEMEM7QUFFaEVwQiw4QkFBQUEsa0JBQWtCLHlDQUFFLE1BQUYsc0JBRjhDO0FBR2hFZ0csOEJBQUFBLGNBQWMsRUFBRTtBQUNkQyxnQ0FBQUEsY0FBYyxFQUFFLHdCQUFBQyxnQkFBZ0IsRUFBSTtBQUNsQztBQUNBO0FBQ0Esc0NBQUlYLGVBQWUsQ0FBQ1ksTUFBaEIsQ0FBdUJDLE9BQTNCLEVBQW9DO0FBQ2xDLDBDQUFNLElBQUkzSCxLQUFKLENBQVUsaUZBQVYsQ0FBTjtBQUNEOztBQUVELHlDQUFPLE1BQUksQ0FBQ3lDLGdCQUFMLENBQXNCK0UsY0FBdEIsQ0FBcUNDLGdCQUFyQyxDQUFQO0FBQ0Q7QUFUYSwrQkFIZ0Q7QUFjaEV2Qiw4QkFBQUEsR0FBRyxFQUFFaUI7QUFkMkQsNkJBQTFDLENBQXhCO0FBaUJBLDRCQUFBLE1BQUksQ0FBQzlFLGVBQUwsR0FBdUIsSUFBdkI7QUFuQmU7QUFBQSxtQ0FxQlQsTUFBSSxDQUFDVyxnQkFBTCxDQUFzQjRFLE9BQXRCLEVBckJTOztBQUFBO0FBdUJUekksNEJBQUFBLE9BdkJTLEdBdUJDYyxJQUFJLENBQUN1RSxnQkFBTCxDQUFzQnJFLE1BQXRCLENBQTZCLE1BQTdCLEVBQXFDLDhCQUFyQyxDQXZCRDtBQUFBO0FBQUEsbUNBd0JRLE1BQUksQ0FBQzZDLGdCQUFMLENBQXNCMkIsSUFBdEIsQ0FBMkJ4RixPQUEzQixDQXhCUjs7QUFBQTtBQXdCVDBJLDRCQUFBQSxRQXhCUzs7QUFBQSxrQ0EwQlhBLFFBQVEsQ0FBQ2hELFVBQVQsS0FBd0IsR0ExQmI7QUFBQTtBQUFBO0FBQUE7O0FBQUEsa0NBMkJQLElBQUk3RSxLQUFKLENBQVUsOEJBQThCNkgsUUFBUSxDQUFDaEQsVUFBakQsQ0EzQk87O0FBQUE7QUFBQSxrQ0E4QlhnRCxRQUFRLENBQUN4SSxPQUFULENBQWlCUyxNQUFqQixLQUE0QixDQTlCakI7QUFBQTtBQUFBO0FBQUE7O0FBQUEsa0NBK0JQLElBQUlFLEtBQUosQ0FBVSwrQkFBK0I2SCxRQUFRLENBQUN4SSxPQUFULENBQWlCUyxNQUExRCxDQS9CTzs7QUFBQTtBQUFBO0FBQUEsbUNBa0NjK0gsUUFBUSxDQUFDeEksT0FBVCxDQUFpQixDQUFqQixFQUFvQkcsWUFBcEIsRUFsQ2Q7O0FBQUE7QUFrQ1RzSSw0QkFBQUEsY0FsQ1M7QUFtQ1RDLDRCQUFBQSxZQW5DUyxHQW1DTXBJLElBQUksQ0FBQ0MsS0FBTCxDQUFXa0ksY0FBWCxDQW5DTjtBQXFDZiw0QkFBQSxNQUFJLENBQUM3RixjQUFMLEdBQXNCOEYsWUFBWSxDQUFDOUYsY0FBbkM7O0FBQ0EsNEJBQUEsTUFBSSxDQUFDaEQsaUJBQUwsQ0FBdUI0QixJQUF2QixDQUE0QlEsNkJBQWlCb0YsTUFBN0MsRUF0Q2UsQ0F3Q2Y7QUFDQTtBQUNBOzs7QUExQ2U7QUFBQSxtQ0EyQ1QsTUFBSSxDQUFDbEQsZUFBTCxFQTNDUzs7QUFBQTtBQTZDZiw0QkFBQSxNQUFJLENBQUNkLGdCQUFMLENBQXNCdUYsS0FBdEI7O0FBQ0EsNEJBQUEsTUFBSSxDQUFDM0YsZUFBTCxHQUF1QixLQUF2QjtBQTlDZTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQWdEZmtFLDRCQUFBQSxNQUFNLGNBQU47O0FBaERlO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG1CQUFaOztBQUFBO0FBQUE7QUFBQTtBQUFBLGdDQWtESTtBQUFBLHlCQUFNTyxlQUFlLENBQUNtQixLQUFoQixFQUFOO0FBQUEsaUJBbERKLENBbEJUOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE87Ozs7Ozs7Ozs7O2lIQXVFQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHVCQU1VLENBQUMsS0FBS3ZGLGVBQUwsR0FBdUIsaUNBQXhCLEVBQTBDd0YsT0FOcEQ7O0FBQUE7QUFRUUMsZ0JBQUFBLFVBUlIsR0FRcUIxSixlQVJyQjtBQVVJLHFCQUFLUSxpQkFBTCxDQUF1QjRCLElBQXZCLENBQTRCUSw2QkFBaUIrRyxVQUE3Qzs7QUFWSjtBQUFBLHNCQVlXRCxVQUFVLEdBQUcsQ0FaeEI7QUFBQTtBQUFBO0FBQUE7O0FBYU1BLGdCQUFBQSxVQUFVO0FBRUpFLGdCQUFBQSxLQWZaLEdBZW9CQyxJQUFJLENBQUNDLEdBQUwsRUFmcEI7QUFBQTtBQUFBO0FBQUEsdUJBbUJjLEtBQUtDLFlBQUwsRUFuQmQ7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQXFCUTdHLGdCQUFBQSxPQUFPLENBQUM1QixLQUFSOztBQXJCUjtBQUFBLHNCQXlCVSxLQUFLZCxpQkFBTCxDQUF1QjZELFFBQXZCLE9BQXNDekIsNkJBQWlCMEIsS0F6QmpFO0FBQUE7QUFBQTtBQUFBOztBQUFBOztBQUFBO0FBOEJNO0FBQ0E7QUFDQSxvQkFBSSxLQUFLOUQsaUJBQUwsQ0FBdUI2RCxRQUF2QixPQUFzQ3pCLDZCQUFpQitHLFVBQTNELEVBQXVFO0FBQ3JFLHVCQUFLbkosaUJBQUwsQ0FBdUI0QixJQUF2QixDQUE0QlEsNkJBQWlCK0csVUFBN0M7QUFDRCxpQkFsQ1AsQ0FvQ007QUFDQTtBQUNBOzs7QUF0Q04sc0JBdUNVLFFBQVFFLElBQUksQ0FBQ0MsR0FBTCxLQUFhRixLQXZDL0I7QUFBQTtBQUFBO0FBQUE7O0FBd0NRRixnQkFBQUEsVUFBVSxHQUFHMUosZUFBYjtBQXhDUjtBQUFBOztBQUFBO0FBQUEsc0JBeUNpQjBKLFVBQVUsR0FBRyxDQXpDOUI7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQSx1QkEyQ2MsSUFBSTFFLE9BQUosQ0FBWSxVQUFBQyxDQUFDO0FBQUEseUJBQUlDLFVBQVUsQ0FBQ0QsQ0FBRCxFQUFJLE1BQUksQ0FBQytFLGFBQUwsRUFBSixDQUFkO0FBQUEsaUJBQWIsQ0EzQ2Q7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBK0NJO0FBQ0E7QUFDQSxxQkFBS3hKLGlCQUFMLENBQXVCNEIsSUFBdkIsQ0FBNEJRLDZCQUFpQmdELGVBQTdDOztBQWpESjtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTzs7Ozs7OztRQXVEQTs7OztXQUNBLHlCQUF3QjtBQUN0QixhQUFPcUUsSUFBSSxDQUFDQyxLQUFMLENBQVcsT0FBT0QsSUFBSSxDQUFDRSxNQUFMLEtBQWdCLEtBQWxDLENBQVA7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbIi8vIEluIG9yZGVyIHRvIGtlZXAgZmlsZSBzaXplIGRvd24sIG9ubHkgaW1wb3J0IHRoZSBwYXJ0cyBvZiByeGpzIHRoYXQgd2UgdXNlXG5cbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMvQmVoYXZpb3JTdWJqZWN0JztcbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ2J1ZmZlcic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcy9PYnNlcnZhYmxlJztcbmltcG9ydCB7IFN1YnNjcmliZXIgfSBmcm9tICdyeGpzL1N1YnNjcmliZXInO1xuaW1wb3J0ICogYXMgQkZTRSBmcm9tICdib3RmcmFtZXdvcmstc3RyZWFtaW5nJztcbmltcG9ydCBjcmVhdGVEZWZlcnJlZCBmcm9tICcuL2NyZWF0ZURlZmVycmVkJztcbmltcG9ydCBmZXRjaCBmcm9tICdjcm9zcy1mZXRjaCc7XG5cbmltcG9ydCB7IEFjdGl2aXR5LCBDb25uZWN0aW9uU3RhdHVzLCBDb252ZXJzYXRpb24sIERpcmVjdExpbmUsIElCb3RDb25uZWN0aW9uLCBNZWRpYSwgTWVzc2FnZSB9IGZyb20gJy4vZGlyZWN0TGluZSc7XG5pbXBvcnQgV2ViU29ja2V0Q2xpZW50V2l0aE5ldHdvcmtJbmZvcm1hdGlvbiBmcm9tICcuL3N0cmVhbWluZy9XZWJTb2NrZXRDbGllbnRXaXRoTmV0d29ya0luZm9ybWF0aW9uJztcbmltcG9ydCB0eXBlIHsgRGVmZXJyZWQgfSBmcm9tICcuL2NyZWF0ZURlZmVycmVkJztcblxuY29uc3QgRElSRUNUX0xJTkVfVkVSU0lPTiA9ICdEaXJlY3RMaW5lLzMuMCc7XG5jb25zdCBNQVhfUkVUUllfQ09VTlQgPSAzO1xuY29uc3QgcmVmcmVzaFRva2VuTGlmZXRpbWUgPSAzMCAqIDYwICogMTAwMDtcbi8vY29uc3QgcmVmcmVzaFRva2VuTGlmZXRpbWUgPSA1MDAwO1xuLy8gY29uc3QgdGltZW91dCA9IDIwICogMTAwMDtcbmNvbnN0IHJlZnJlc2hUb2tlbkludGVydmFsID0gcmVmcmVzaFRva2VuTGlmZXRpbWUgLyAyO1xuXG5pbnRlcmZhY2UgRGlyZWN0TGluZVN0cmVhbWluZ09wdGlvbnMge1xuICB0b2tlbjogc3RyaW5nO1xuICBjb252ZXJzYXRpb25JZD86IHN0cmluZztcbiAgZG9tYWluOiBzdHJpbmc7XG4gIC8vIEF0dGFjaGVkIHRvIGFsbCByZXF1ZXN0cyB0byBpZGVudGlmeSByZXF1ZXN0aW5nIGFnZW50LlxuICBib3RBZ2VudD86IHN0cmluZztcblxuICAvKipcbiAgICogU2V0cyB0aGUgW2BOZXR3b3JrSW5mb3JtYXRpb25gIEFQSV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL05ldHdvcmtfSW5mb3JtYXRpb25fQVBJKS5cbiAgICogV2hlbiB0aGUgYE5ldHdvcmtJbmZvcm1hdGlvbmAgZGV0ZWN0IG5ldHdvcmsgY2hhbmdlcyBvciBvZmZsaW5lLCBpdCB3aWxsIGRpc2Nvbm5lY3QgdGhlIFdlYiBTb2NrZXQgYW5kIHJlY29ubmVjdCBpdC5cbiAgICovXG4gIG5ldHdvcmtJbmZvcm1hdGlvbj86IE5ldHdvcmtJbmZvcm1hdGlvbjtcbn1cblxuY2xhc3MgU3RyZWFtSGFuZGxlciBpbXBsZW1lbnRzIEJGU0UuUmVxdWVzdEhhbmRsZXIge1xuICBwcml2YXRlIGNvbm5lY3Rpb25TdGF0dXMkO1xuICBwcml2YXRlIHN1YnNjcmliZXI6IFN1YnNjcmliZXI8QWN0aXZpdHk+O1xuICBwcml2YXRlIHNob3VsZFF1ZXVlOiAoKSA9PiBib29sZWFuO1xuICBwcml2YXRlIGFjdGl2aXR5UXVldWU6IEFycmF5PEFjdGl2aXR5PiA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHM6IFN1YnNjcmliZXI8QWN0aXZpdHk+LCBjJDogT2JzZXJ2YWJsZTxDb25uZWN0aW9uU3RhdHVzPiwgc3E6ICgpID0+IGJvb2xlYW4pIHtcbiAgICB0aGlzLnN1YnNjcmliZXIgPSBzO1xuICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQgPSBjJDtcbiAgICB0aGlzLnNob3VsZFF1ZXVlID0gc3E7XG4gIH1cblxuICBwdWJsaWMgc2V0U3Vic2NyaWJlcihzOiBTdWJzY3JpYmVyPEFjdGl2aXR5Pikge1xuICAgIHRoaXMuc3Vic2NyaWJlciA9IHM7XG4gIH1cblxuICBhc3luYyBwcm9jZXNzUmVxdWVzdChyZXF1ZXN0OiBCRlNFLklSZWNlaXZlUmVxdWVzdCwgbG9nZ2VyPzogYW55KTogUHJvbWlzZTxCRlNFLlN0cmVhbWluZ1Jlc3BvbnNlPiB7XG4gICAgY29uc3Qgc3RyZWFtcyA9IFsuLi5yZXF1ZXN0LnN0cmVhbXNdO1xuICAgIGNvbnN0IHN0cmVhbTAgPSBzdHJlYW1zLnNoaWZ0KCk7XG4gICAgY29uc3QgYWN0aXZpdHlTZXRKc29uID0gYXdhaXQgc3RyZWFtMC5yZWFkQXNTdHJpbmcoKTtcbiAgICBjb25zdCBhY3Rpdml0eVNldCA9IEpTT04ucGFyc2UoYWN0aXZpdHlTZXRKc29uKTtcblxuICAgIGlmIChhY3Rpdml0eVNldC5hY3Rpdml0aWVzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgLy8gT25seSBvbmUgYWN0aXZpdHkgaXMgZXhwZWN0ZWQgaW4gYSBzZXQgaW4gc3RyZWFtaW5nXG4gICAgICB0aGlzLnN1YnNjcmliZXIuZXJyb3IobmV3IEVycm9yKCd0aGVyZSBzaG91bGQgYmUgZXhhY3RseSBvbmUgYWN0aXZpdHknKSk7XG4gICAgICByZXR1cm4gQkZTRS5TdHJlYW1pbmdSZXNwb25zZS5jcmVhdGUoNTAwKTtcbiAgICB9XG5cbiAgICBjb25zdCBhY3Rpdml0eSA9IGFjdGl2aXR5U2V0LmFjdGl2aXRpZXNbMF07XG5cbiAgICBpZiAoc3RyZWFtcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBhdHRhY2htZW50cyA9IFsuLi5hY3Rpdml0eS5hdHRhY2htZW50c107XG5cbiAgICAgIGxldCBzdHJlYW06IEJGU0UuQ29udGVudFN0cmVhbTtcbiAgICAgIHdoaWxlICgoc3RyZWFtID0gc3RyZWFtcy5zaGlmdCgpKSkge1xuICAgICAgICBjb25zdCBhdHRhY2htZW50ID0gYXdhaXQgc3RyZWFtLnJlYWRBc1N0cmluZygpO1xuICAgICAgICBjb25zdCBkYXRhVXJpID0gJ2RhdGE6dGV4dC9wbGFpbjtiYXNlNjQsJyArIGF0dGFjaG1lbnQ7XG4gICAgICAgIGF0dGFjaG1lbnRzLnB1c2goeyBjb250ZW50VHlwZTogc3RyZWFtLmNvbnRlbnRUeXBlLCBjb250ZW50VXJsOiBkYXRhVXJpIH0pO1xuICAgICAgfVxuXG4gICAgICBhY3Rpdml0eS5hdHRhY2htZW50cyA9IGF0dGFjaG1lbnRzO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNob3VsZFF1ZXVlKCkpIHtcbiAgICAgIHRoaXMuYWN0aXZpdHlRdWV1ZS5wdXNoKGFjdGl2aXR5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdWJzY3JpYmVyLm5leHQoYWN0aXZpdHkpO1xuICAgIH1cblxuICAgIHJldHVybiBCRlNFLlN0cmVhbWluZ1Jlc3BvbnNlLmNyZWF0ZSgyMDApO1xuICB9XG5cbiAgcHVibGljIGZsdXNoKCkge1xuICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQuc3Vic2NyaWJlKCgpID0+IHt9KTtcbiAgICB0aGlzLmFjdGl2aXR5UXVldWUuZm9yRWFjaChhID0+IHRoaXMuc3Vic2NyaWJlci5uZXh0KGEpKTtcbiAgICB0aGlzLmFjdGl2aXR5UXVldWUgPSBbXTtcbiAgfVxuXG4gIHB1YmxpYyBlbmQoKSB7XG4gICAgdGhpcy5zdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERpcmVjdExpbmVTdHJlYW1pbmcgaW1wbGVtZW50cyBJQm90Q29ubmVjdGlvbiB7XG4gIHB1YmxpYyBjb25uZWN0aW9uU3RhdHVzJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoQ29ubmVjdGlvblN0YXR1cy5VbmluaXRpYWxpemVkKTtcbiAgcHVibGljIGFjdGl2aXR5JDogT2JzZXJ2YWJsZTxBY3Rpdml0eT47XG5cbiAgcHJpdmF0ZSBhY3Rpdml0eVN1YnNjcmliZXI6IFN1YnNjcmliZXI8QWN0aXZpdHk+O1xuICBwcml2YXRlIGNvbm5lY3REZWZlcnJlZDogRGVmZXJyZWQ8dm9pZD47XG4gIHByaXZhdGUgdGhlU3RyZWFtSGFuZGxlcjogU3RyZWFtSGFuZGxlcjtcblxuICBwcml2YXRlIGRvbWFpbjogc3RyaW5nO1xuXG4gIHByaXZhdGUgY29udmVyc2F0aW9uSWQ6IHN0cmluZztcbiAgcHJpdmF0ZSB0b2tlbjogc3RyaW5nO1xuICBwcml2YXRlIHN0cmVhbUNvbm5lY3Rpb246IEJGU0UuV2ViU29ja2V0Q2xpZW50O1xuICBwcml2YXRlIHF1ZXVlQWN0aXZpdGllczogYm9vbGVhbjtcblxuICBwcml2YXRlIF9ib3RBZ2VudCA9ICcnO1xuXG4gICNuZXR3b3JrSW5mb3JtYXRpb246IE5ldHdvcmtJbmZvcm1hdGlvbiB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBEaXJlY3RMaW5lU3RyZWFtaW5nT3B0aW9ucykge1xuICAgIC8vIFJlY3RpZmllcyBgb3B0aW9ucy5uZXR3b3JrSW5mb3JtYXRpb25gLlxuICAgIGNvbnN0IG5ldHdvcmtJbmZvcm1hdGlvbiA9IG9wdGlvbnM/Lm5ldHdvcmtJbmZvcm1hdGlvbjtcblxuICAgIGlmIChcbiAgICAgIHR5cGVvZiBuZXR3b3JrSW5mb3JtYXRpb24gPT09ICd1bmRlZmluZWQnIHx8XG4gICAgICAodHlwZW9mIG5ldHdvcmtJbmZvcm1hdGlvbi5hZGRFdmVudExpc3RlbmVyID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAgIHR5cGVvZiBuZXR3b3JrSW5mb3JtYXRpb24ucmVtb3ZlRXZlbnRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgICB0eXBlb2YgbmV0d29ya0luZm9ybWF0aW9uLnR5cGUgPT09ICdzdHJpbmcnKVxuICAgICkge1xuICAgICAgdGhpcy4jbmV0d29ya0luZm9ybWF0aW9uID0gbmV0d29ya0luZm9ybWF0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICdib3RmcmFtZXdvcmstZGlyZWN0bGluZWpzOiBcIm5ldHdvcmtJbmZvcm1hdGlvblwiIG9wdGlvbiBzcGVjaWZpZWQgbXVzdCBiZSBhIGBOZXR3b3JrSW5mb3JtYXRpb25gLWxpa2UgaW5zdGFuY2UgZXh0ZW5kaW5nIGBFdmVudFRhcmdldGAgaW50ZXJmYWNlIHdpdGggYSBgdHlwZWAgcHJvcGVydHkgcmV0dXJuaW5nIGEgc3RyaW5nLidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy50b2tlbiA9IG9wdGlvbnMudG9rZW47XG5cbiAgICB0aGlzLnJlZnJlc2hUb2tlbigpLmNhdGNoKCgpID0+IHtcbiAgICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQubmV4dChDb25uZWN0aW9uU3RhdHVzLkV4cGlyZWRUb2tlbik7XG4gICAgfSk7XG5cbiAgICB0aGlzLmRvbWFpbiA9IG9wdGlvbnMuZG9tYWluO1xuXG4gICAgaWYgKG9wdGlvbnMuY29udmVyc2F0aW9uSWQpIHtcbiAgICAgIHRoaXMuY29udmVyc2F0aW9uSWQgPSBvcHRpb25zLmNvbnZlcnNhdGlvbklkO1xuICAgIH1cblxuICAgIHRoaXMuX2JvdEFnZW50ID0gdGhpcy5nZXRCb3RBZ2VudChvcHRpb25zLmJvdEFnZW50KTtcblxuICAgIHRoaXMucXVldWVBY3Rpdml0aWVzID0gdHJ1ZTtcbiAgICB0aGlzLmFjdGl2aXR5JCA9IE9ic2VydmFibGUuY3JlYXRlKGFzeW5jIChzdWJzY3JpYmVyOiBTdWJzY3JpYmVyPEFjdGl2aXR5PikgPT4ge1xuICAgICAgdGhpcy5hY3Rpdml0eVN1YnNjcmliZXIgPSBzdWJzY3JpYmVyO1xuICAgICAgdGhpcy50aGVTdHJlYW1IYW5kbGVyID0gbmV3IFN0cmVhbUhhbmRsZXIoc3Vic2NyaWJlciwgdGhpcy5jb25uZWN0aW9uU3RhdHVzJCwgKCkgPT4gdGhpcy5xdWV1ZUFjdGl2aXRpZXMpO1xuXG4gICAgICAvLyBSZXNvbHZpbmcgY29ubmVjdERlZmVycmVkIHdpbGwga2ljay1vZmYgdGhlIGNvbm5lY3Rpb24uXG4gICAgICB0aGlzLmNvbm5lY3REZWZlcnJlZC5yZXNvbHZlKCk7XG4gICAgfSkuc2hhcmUoKTtcblxuICAgIC8vIGNvbm5lY3RXaXRoUmV0cnlBc3luYygpIHdpbGwgY3JlYXRlIHRoZSBjb25uZWN0RGVmZXJyZWQgb2JqZWN0IHJlcXVpcmVkIGluIGFjdGl2aXR5JC5cbiAgICB0aGlzLmNvbm5lY3RXaXRoUmV0cnlBc3luYygpO1xuICB9XG5cbiAgcHVibGljIHJlY29ubmVjdCh7IGNvbnZlcnNhdGlvbklkLCB0b2tlbiB9OiBDb252ZXJzYXRpb24pIHtcbiAgICBpZiAodGhpcy5jb25uZWN0aW9uU3RhdHVzJC5nZXRWYWx1ZSgpID09PSBDb25uZWN0aW9uU3RhdHVzLkVuZGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nvbm5lY3Rpb24gaGFzIGVuZGVkLicpO1xuICAgIH1cblxuICAgIHRoaXMuY29udmVyc2F0aW9uSWQgPSBjb252ZXJzYXRpb25JZDtcbiAgICB0aGlzLnRva2VuID0gdG9rZW47XG5cbiAgICB0aGlzLmNvbm5lY3REZWZlcnJlZC5yZXNvbHZlKCk7XG4gIH1cblxuICBlbmQoKSB7XG4gICAgLy8gT25jZSBlbmQoKSBpcyBjYWxsZWQsIG5vIHJlY29ubmVjdGlvbiBjYW4gYmUgbWFkZS5cbiAgICB0aGlzLmFjdGl2aXR5U3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuXG4gICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5uZXh0KENvbm5lY3Rpb25TdGF0dXMuRW5kZWQpO1xuICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQuY29tcGxldGUoKTtcblxuICAgIHRoaXMuc3RyZWFtQ29ubmVjdGlvbi5kaXNjb25uZWN0KCk7XG4gIH1cblxuICBwcml2YXRlIGNvbW1vbkhlYWRlcnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0aGlzLnRva2VufWAsXG4gICAgICAneC1tcy1ib3QtYWdlbnQnOiB0aGlzLl9ib3RBZ2VudFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldEJvdEFnZW50KGN1c3RvbUFnZW50OiBzdHJpbmcgPSAnJyk6IHN0cmluZyB7XG4gICAgbGV0IGNsaWVudEFnZW50ID0gJ2RpcmVjdGxpbmVTdHJlYW1pbmcnO1xuXG4gICAgaWYgKGN1c3RvbUFnZW50KSB7XG4gICAgICBjbGllbnRBZ2VudCArPSBgOyAke2N1c3RvbUFnZW50fWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGAke0RJUkVDVF9MSU5FX1ZFUlNJT059ICgke2NsaWVudEFnZW50fSlgO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoVG9rZW4oZmlyc3RDYWxsID0gdHJ1ZSwgcmV0cnlDb3VudCA9IDApIHtcbiAgICBhd2FpdCB0aGlzLndhaXRVbnRpbE9ubGluZSgpO1xuXG4gICAgbGV0IG51bWJlck9mQXR0ZW1wdHMgPSAwO1xuICAgIHdoaWxlIChudW1iZXJPZkF0dGVtcHRzIDwgTUFYX1JFVFJZX0NPVU5UKSB7XG4gICAgICBudW1iZXJPZkF0dGVtcHRzKys7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgcmVmcmVzaFRva2VuSW50ZXJ2YWwpKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke3RoaXMuZG9tYWlufS90b2tlbnMvcmVmcmVzaGAsIHsgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHRoaXMuY29tbW9uSGVhZGVycygpIH0pO1xuICAgICAgICBpZiAocmVzLm9rKSB7XG4gICAgICAgICAgbnVtYmVyT2ZBdHRlbXB0cyA9IDA7XG4gICAgICAgICAgY29uc3QgeyB0b2tlbiB9ID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgICB0aGlzLnRva2VuID0gdG9rZW47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IDQwMyB8fCByZXMuc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhdGFsIGVycm9yIHdoaWxlIHJlZnJlc2hpbmcgdGhlIHRva2VuOiAke3Jlcy5zdGF0dXN9ICR7cmVzLnN0YXR1c1RleHR9YCk7XG4gICAgICAgICAgICB0aGlzLnN0cmVhbUNvbm5lY3Rpb24uZGlzY29ubmVjdCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFJlZnJlc2ggYXR0ZW1wdCAjJHtudW1iZXJPZkF0dGVtcHRzfSBmYWlsZWQ6ICR7cmVzLnN0YXR1c30gJHtyZXMuc3RhdHVzVGV4dH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBSZWZyZXNoIGF0dGVtcHQgIyR7bnVtYmVyT2ZBdHRlbXB0c30gdGhyZXcgYW4gZXhjZXB0aW9uOiAke2V9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc29sZS5lcnJvcignUmV0cmllcyBleGhhdXN0ZWQnKTtcbiAgICB0aGlzLnN0cmVhbUNvbm5lY3Rpb24uZGlzY29ubmVjdCgpO1xuICB9XG5cbiAgcG9zdEFjdGl2aXR5KGFjdGl2aXR5OiBBY3Rpdml0eSkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQudmFsdWUgPT09IENvbm5lY3Rpb25TdGF0dXMuRW5kZWQgfHxcbiAgICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQudmFsdWUgPT09IENvbm5lY3Rpb25TdGF0dXMuRmFpbGVkVG9Db25uZWN0XG4gICAgKSB7XG4gICAgICByZXR1cm4gT2JzZXJ2YWJsZS50aHJvdyhuZXcgRXJyb3IoJ0Nvbm5lY3Rpb24gaXMgY2xvc2VkJykpO1xuICAgIH1cblxuICAgIGlmIChhY3Rpdml0eS50eXBlID09PSAnbWVzc2FnZScgJiYgYWN0aXZpdHkuYXR0YWNobWVudHMgJiYgYWN0aXZpdHkuYXR0YWNobWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRoaXMucG9zdE1lc3NhZ2VXaXRoQXR0YWNobWVudHMoYWN0aXZpdHkpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3AkID0gT2JzZXJ2YWJsZS5jcmVhdGUoYXN5bmMgc3Vic2NyaWJlciA9PiB7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gQkZTRS5TdHJlYW1pbmdSZXF1ZXN0LmNyZWF0ZShcbiAgICAgICAgJ1BPU1QnLFxuICAgICAgICAnL3YzL2RpcmVjdGxpbmUvY29udmVyc2F0aW9ucy8nICsgdGhpcy5jb252ZXJzYXRpb25JZCArICcvYWN0aXZpdGllcydcbiAgICAgICk7XG4gICAgICByZXF1ZXN0LnNldEJvZHkoSlNPTi5zdHJpbmdpZnkoYWN0aXZpdHkpKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuc3RyZWFtQ29ubmVjdGlvbi5zZW5kKHJlcXVlc3QpO1xuICAgICAgICBpZiAocmVzcC5zdGF0dXNDb2RlICE9PSAyMDApIHRocm93IG5ldyBFcnJvcignUG9zdEFjdGl2aXR5IHJldHVybmVkICcgKyByZXNwLnN0YXR1c0NvZGUpO1xuICAgICAgICBjb25zdCBudW1iZXJPZlN0cmVhbXMgPSByZXNwLnN0cmVhbXMubGVuZ3RoO1xuICAgICAgICBpZiAobnVtYmVyT2ZTdHJlYW1zICE9PSAxKSB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIG9uZSBzdHJlYW0gYnV0IGdvdCAnICsgbnVtYmVyT2ZTdHJlYW1zKTtcbiAgICAgICAgY29uc3QgaWRTdHJpbmcgPSBhd2FpdCByZXNwLnN0cmVhbXNbMF0ucmVhZEFzU3RyaW5nKCk7XG4gICAgICAgIGNvbnN0IHsgSWQ6IGlkIH0gPSBKU09OLnBhcnNlKGlkU3RyaW5nKTtcbiAgICAgICAgc3Vic2NyaWJlci5uZXh0KGlkKTtcbiAgICAgICAgcmV0dXJuIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBuZXR3b3JrIGlzc3VlIHRoZW4gaXRzIGhhbmRsZWQgYnlcbiAgICAgICAgLy8gdGhlIGRpc2Nvbm5lY3Rpb25IYW5kbGVyLiBFdmVyeXRoaW5nIGVsc2UgY2FuXG4gICAgICAgIC8vIGJlIHJldHJpZWRcbiAgICAgICAgY29uc29sZS53YXJuKGUpO1xuICAgICAgICB0aGlzLnN0cmVhbUNvbm5lY3Rpb24uZGlzY29ubmVjdCgpO1xuICAgICAgICByZXR1cm4gc3Vic2NyaWJlci5lcnJvcihlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzcCQ7XG4gIH1cblxuICBwcml2YXRlIHBvc3RNZXNzYWdlV2l0aEF0dGFjaG1lbnRzKG1lc3NhZ2U6IE1lc3NhZ2UpIHtcbiAgICBjb25zdCB7IGF0dGFjaG1lbnRzLCAuLi5tZXNzYWdlV2l0aG91dEF0dGFjaG1lbnRzIH0gPSBtZXNzYWdlO1xuXG4gICAgcmV0dXJuIE9ic2VydmFibGUuY3JlYXRlKHN1YnNjcmliZXIgPT4ge1xuICAgICAgY29uc3QgaHR0cENvbnRlbnRMaXN0ID0gW107XG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGFycmF5QnVmZmVycyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgYXR0YWNobWVudHMubWFwKGFzeW5jIGF0dGFjaG1lbnQgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBtZWRpYSA9IGF0dGFjaG1lbnQgYXMgTWVkaWE7XG4gICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKG1lZGlhLmNvbnRlbnRVcmwpO1xuICAgICAgICAgICAgICBpZiAocmVzLm9rKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgYXJyYXlCdWZmZXI6IGF3YWl0IHJlcy5hcnJheUJ1ZmZlcigpLCBtZWRpYSB9O1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignLi4uJyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGFycmF5QnVmZmVycy5mb3JFYWNoKCh7IGFycmF5QnVmZmVyLCBtZWRpYSB9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuZnJvbShhcnJheUJ1ZmZlcik7XG4gICAgICAgICAgICBjb25zdCBzdHJlYW0gPSBuZXcgQkZTRS5TdWJzY3JpYmFibGVTdHJlYW0oKTtcbiAgICAgICAgICAgIHN0cmVhbS53cml0ZShidWZmZXIpO1xuICAgICAgICAgICAgY29uc3QgaHR0cENvbnRlbnQgPSBuZXcgQkZTRS5IdHRwQ29udGVudCh7IHR5cGU6IG1lZGlhLmNvbnRlbnRUeXBlLCBjb250ZW50TGVuZ3RoOiBidWZmZXIubGVuZ3RoIH0sIHN0cmVhbSk7XG4gICAgICAgICAgICBodHRwQ29udGVudExpc3QucHVzaChodHRwQ29udGVudCk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb25zdCB1cmwgPSBgL3YzL2RpcmVjdGxpbmUvY29udmVyc2F0aW9ucy8ke3RoaXMuY29udmVyc2F0aW9uSWR9L3VzZXJzLyR7bWVzc2FnZVdpdGhvdXRBdHRhY2htZW50cy5mcm9tLmlkfS91cGxvYWRgO1xuICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSBCRlNFLlN0cmVhbWluZ1JlcXVlc3QuY3JlYXRlKCdQVVQnLCB1cmwpO1xuICAgICAgICAgIGNvbnN0IGFjdGl2aXR5U3RyZWFtID0gbmV3IEJGU0UuU3Vic2NyaWJhYmxlU3RyZWFtKCk7XG4gICAgICAgICAgYWN0aXZpdHlTdHJlYW0ud3JpdGUoSlNPTi5zdHJpbmdpZnkobWVzc2FnZVdpdGhvdXRBdHRhY2htZW50cyksICd1dGYtOCcpO1xuICAgICAgICAgIHJlcXVlc3QuYWRkU3RyZWFtKFxuICAgICAgICAgICAgbmV3IEJGU0UuSHR0cENvbnRlbnQoXG4gICAgICAgICAgICAgIHsgdHlwZTogJ2FwcGxpY2F0aW9uL3ZuZC5taWNyb3NvZnQuYWN0aXZpdHknLCBjb250ZW50TGVuZ3RoOiBhY3Rpdml0eVN0cmVhbS5sZW5ndGggfSxcbiAgICAgICAgICAgICAgYWN0aXZpdHlTdHJlYW1cbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICAgIGh0dHBDb250ZW50TGlzdC5mb3JFYWNoKGUgPT4gcmVxdWVzdC5hZGRTdHJlYW0oZSkpO1xuXG4gICAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuc3RyZWFtQ29ubmVjdGlvbi5zZW5kKHJlcXVlc3QpO1xuICAgICAgICAgIGlmIChyZXNwLnN0cmVhbXMgJiYgcmVzcC5zdHJlYW1zLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihuZXcgRXJyb3IoYEludmFsaWQgc3RyZWFtIGNvdW50ICR7cmVzcC5zdHJlYW1zLmxlbmd0aH1gKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHsgSWQ6IGlkIH0gPSBhd2FpdCByZXNwLnN0cmVhbXNbMF0ucmVhZEFzSnNvbjx7IElkOiBzdHJpbmcgfT4oKTtcbiAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChpZCk7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgfSkoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd2FpdFVudGlsT25saW5lKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLnN1YnNjcmliZShcbiAgICAgICAgY3MgPT4ge1xuICAgICAgICAgIGlmIChjcyA9PT0gQ29ubmVjdGlvblN0YXR1cy5PbmxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlID0+IHJlamVjdChlKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29ubmVjdEFzeW5jKCkge1xuICAgIGNvbnN0IHJlID0gbmV3IFJlZ0V4cCgnXmh0dHAocz8pJyk7XG5cbiAgICBpZiAoIXJlLnRlc3QodGhpcy5kb21haW4pKSB7XG4gICAgICB0aHJvdyAnRG9tYWluIG11c3QgYmVnaW4gd2l0aCBodHRwIG9yIGh0dHBzJztcbiAgICB9XG5cbiAgICBjb25zdCBwYXJhbXMgPSB7IHRva2VuOiB0aGlzLnRva2VuIH07XG5cbiAgICBpZiAodGhpcy5jb252ZXJzYXRpb25JZCkge1xuICAgICAgcGFyYW1zWydjb252ZXJzYXRpb25JZCddID0gdGhpcy5jb252ZXJzYXRpb25JZDtcbiAgICB9XG5cbiAgICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgY29uc3QgdXJsU2VhcmNoUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhwYXJhbXMpLnRvU3RyaW5nKCk7XG4gICAgY29uc3Qgd3NVcmwgPSBgJHt0aGlzLmRvbWFpbi5yZXBsYWNlKHJlLCAnd3MkMScpfS9jb252ZXJzYXRpb25zL2Nvbm5lY3Q/JHt1cmxTZWFyY2hQYXJhbXN9YDtcblxuICAgIC8vIFRoaXMgcHJvbWlzZSB3aWxsIHJlc29sdmUgd2hlbiBpdCBpcyBkaXNjb25uZWN0ZWQuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuc3RyZWFtQ29ubmVjdGlvbiA9IG5ldyBXZWJTb2NrZXRDbGllbnRXaXRoTmV0d29ya0luZm9ybWF0aW9uKHtcbiAgICAgICAgICBkaXNjb25uZWN0aW9uSGFuZGxlcjogcmVzb2x2ZSxcbiAgICAgICAgICBuZXR3b3JrSW5mb3JtYXRpb246IHRoaXMuI25ldHdvcmtJbmZvcm1hdGlvbixcbiAgICAgICAgICByZXF1ZXN0SGFuZGxlcjoge1xuICAgICAgICAgICAgcHJvY2Vzc1JlcXVlc3Q6IHN0cmVhbWluZ1JlcXVlc3QgPT4ge1xuICAgICAgICAgICAgICAvLyBJZiBgc3RyZWFtQ29ubmVjdGlvbmAgaXMgc3RpbGwgY3VycmVudCwgYWxsb3cgY2FsbCB0byBgcHJvY2Vzc1JlcXVlc3QoKWAsIG90aGVyd2lzZSwgaWdub3JlIGNhbGxzIHRvIGBwcm9jZXNzUmVxdWVzdCgpYC5cbiAgICAgICAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyB6b21iaWUgY29ubmVjdGlvbnMgZnJvbSBzZW5kaW5nIHVzIHJlcXVlc3RzLlxuICAgICAgICAgICAgICBpZiAoYWJvcnRDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcHJvY2VzcyBzdHJlYW1pbmcgcmVxdWVzdCwgYHN0cmVhbWluZ0Nvbm5lY3Rpb25gIHNob3VsZCBiZSBkaXNjb25uZWN0ZWQuJyk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy50aGVTdHJlYW1IYW5kbGVyLnByb2Nlc3NSZXF1ZXN0KHN0cmVhbWluZ1JlcXVlc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgdXJsOiB3c1VybFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnF1ZXVlQWN0aXZpdGllcyA9IHRydWU7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5zdHJlYW1Db25uZWN0aW9uLmNvbm5lY3QoKTtcblxuICAgICAgICBjb25zdCByZXF1ZXN0ID0gQkZTRS5TdHJlYW1pbmdSZXF1ZXN0LmNyZWF0ZSgnUE9TVCcsICcvdjMvZGlyZWN0bGluZS9jb252ZXJzYXRpb25zJyk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zdHJlYW1Db25uZWN0aW9uLnNlbmQocmVxdWVzdCk7XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgIT09IDIwMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29ubmVjdGlvbiByZXNwb25zZSBjb2RlICcgKyByZXNwb25zZS5zdGF0dXNDb2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXNwb25zZS5zdHJlYW1zLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgMSBzdHJlYW0gYnV0IGdvdCAnICsgcmVzcG9uc2Uuc3RyZWFtcy5sZW5ndGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2VTdHJpbmcgPSBhd2FpdCByZXNwb25zZS5zdHJlYW1zWzBdLnJlYWRBc1N0cmluZygpO1xuICAgICAgICBjb25zdCBjb252ZXJzYXRpb24gPSBKU09OLnBhcnNlKHJlc3BvbnNlU3RyaW5nKTtcblxuICAgICAgICB0aGlzLmNvbnZlcnNhdGlvbklkID0gY29udmVyc2F0aW9uLmNvbnZlcnNhdGlvbklkO1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLm5leHQoQ29ubmVjdGlvblN0YXR1cy5PbmxpbmUpO1xuXG4gICAgICAgIC8vIFdhaXQgdW50aWwgREwgY29uc3VtZXJzIGhhdmUgaGFkIGEgY2hhbmNlIHRvIGJlIG5vdGlmaWVkXG4gICAgICAgIC8vIG9mIHRoZSBjb25uZWN0aW9uIHN0YXR1cyBjaGFuZ2UuXG4gICAgICAgIC8vIFRoaXMgaXMgc3BlY2lmaWMgdG8gUnhKUyBpbXBsZW1lbnRhdGlvbiBvZiBvYnNlcnZhYmxlLCB3aGljaCBjYWxsaW5nIHN1YnNjcmliZSgpIGFmdGVyIG5leHQoKSB3aWxsIHN0aWxsIGdldCB0aGUgdmFsdWUuXG4gICAgICAgIGF3YWl0IHRoaXMud2FpdFVudGlsT25saW5lKCk7XG5cbiAgICAgICAgdGhpcy50aGVTdHJlYW1IYW5kbGVyLmZsdXNoKCk7XG4gICAgICAgIHRoaXMucXVldWVBY3Rpdml0aWVzID0gZmFsc2U7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9KS5maW5hbGx5KCgpID0+IGFib3J0Q29udHJvbGxlci5hYm9ydCgpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29ubmVjdFdpdGhSZXRyeUFzeW5jKCkge1xuICAgIC8vIFRoaXMgZm9yLWxvb3Agd2lsbCBicmVhayB3aGVuIHNvbWVvbmUgY2FsbCBlbmQoKSBhbmQgaXQgd2lsbCBzaWduYWwgQ29ubmVjdGlvblN0YXR1cy5FbmRlZC5cbiAgICBmb3IgKDs7KSB7XG4gICAgICAvLyBDcmVhdGUgYSBuZXcgc2lnbmFsIGFuZCB3YWl0IGZvciBzb21lb25lIGtpY2tpbmcgb2ZmIHRoZSBjb25uZWN0aW9uOlxuICAgICAgLy8gLSBzdWJzY3JpYmUgdG8gYWN0aXZpdHkkLCBvcjtcbiAgICAgIC8vIC0gcmV0cmllcyBleGhhdXN0ZWQgKEZhaWxlZFRvQ29ubmVjdCksIHRoZW4sIHNvbWVvbmUgY2FsbCByZWNvbm5lY3QoKVxuICAgICAgYXdhaXQgKHRoaXMuY29ubmVjdERlZmVycmVkID0gY3JlYXRlRGVmZXJyZWQoKSkucHJvbWlzZTtcblxuICAgICAgbGV0IG51bVJldHJpZXMgPSBNQVhfUkVUUllfQ09VTlQ7XG5cbiAgICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQubmV4dChDb25uZWN0aW9uU3RhdHVzLkNvbm5lY3RpbmcpO1xuXG4gICAgICB3aGlsZSAobnVtUmV0cmllcyA+IDApIHtcbiAgICAgICAgbnVtUmV0cmllcy0tO1xuXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFRoaXMgcHJvbWlzZSB3aWxsIHJlamVjdC9yZXNvbHZlIHdoZW4gZGlzY29ubmVjdGVkLlxuICAgICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdEFzeW5jKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHNvbWVvbmUgY2FsbCBlbmQoKSB0byBicmVhayB0aGUgY29ubmVjdGlvbiwgd2Ugd2lsbCBuZXZlciBsaXN0ZW4gdG8gYW55IHJlY29ubmVjdCgpLlxuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uU3RhdHVzJC5nZXRWYWx1ZSgpID09PSBDb25uZWN0aW9uU3RhdHVzLkVuZGVkKSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyB0aGUgb25seSBwbGFjZSB0aGUgbG9vcCBpbiB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgYnJva2UuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGRvbid0IHNpZ25hbCBDb25uZWN0aW9uU3RhdHVzLkNvbm5lY3RpbmcgdHdpY2Ugb3IgbW9yZSB3aXRob3V0IGFuIGFjdHVhbCBjb25uZWN0aW9uLlxuICAgICAgICAvLyBTdWJzZXF1ZW50IHJldHJpZXMgc2hvdWxkIGJlIHRyYW5zcGFyZW50LlxuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uU3RhdHVzJC5nZXRWYWx1ZSgpICE9PSBDb25uZWN0aW9uU3RhdHVzLkNvbm5lY3RpbmcpIHtcbiAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLm5leHQoQ29ubmVjdGlvblN0YXR1cy5Db25uZWN0aW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24gbGFzdGVkIGZvciBtb3JlIHRoYW4gYSBtaW51dGUsIHRoZSBwcmV2aW91cyBjb25uZWN0aW9uIGlzIGdvb2QsIHdoaWNoIG1lYW5zOlxuICAgICAgICAvLyAtIHdlIHNob3VsZCByZXNldCB0aGUgcmV0cnkgY291bnRlciwgYW5kO1xuICAgICAgICAvLyAtIHdlIHNob3VsZCByZWNvbm5lY3QgaW1tZWRpYXRlbHkuXG4gICAgICAgIGlmICg2MDAwMCA8IERhdGUubm93KCkgLSBzdGFydCkge1xuICAgICAgICAgIG51bVJldHJpZXMgPSBNQVhfUkVUUllfQ09VTlQ7XG4gICAgICAgIH0gZWxzZSBpZiAobnVtUmV0cmllcyA+IDApIHtcbiAgICAgICAgICAvLyBTbGVlcCBvbmx5IGlmIHdlIGFyZSBkb2luZyByZXRyeS4gT3RoZXJ3aXNlLCB3ZSBhcmUgZ29pbmcgdG8gYnJlYWsgdGhlIGxvb3AgYW5kIHNpZ25hbCBGYWlsZWRUb0Nvbm5lY3QuXG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UociA9PiBzZXRUaW1lb3V0KHIsIHRoaXMuZ2V0UmV0cnlEZWxheSgpKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVE9ETzogW1RFU1RdIE1ha2Ugc3VyZSBGYWlsZWRUb0Nvbm5lY3QgaXMgcmVwb3J0ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgbGFzdCBkaXNjb25uZWN0aW9uLCBzaG91bGQgYmUgbm8gZ2V0UmV0cnlEZWxheSgpLlxuICAgICAgLy8gRmFpbGVkIHRvIHJlY29ubmVjdCBhZnRlciBtdWx0aXBsZSByZXRyaWVzLlxuICAgICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5uZXh0KENvbm5lY3Rpb25TdGF0dXMuRmFpbGVkVG9Db25uZWN0KTtcbiAgICB9XG5cbiAgICAvLyBOb3RlOiBObyBjb2RlIHdpbGwgaGl0IHRoaXMgbGluZS5cbiAgfVxuXG4gIC8vIFJldHVybnMgdGhlIGRlbGF5IGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kc1xuICBwcml2YXRlIGdldFJldHJ5RGVsYXkoKSB7XG4gICAgcmV0dXJuIE1hdGguZmxvb3IoMzAwMCArIE1hdGgucmFuZG9tKCkgKiAxMjAwMCk7XG4gIH1cbn1cbiJdfQ==
735
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfQmVoYXZpb3JTdWJqZWN0IiwicmVxdWlyZSIsIl9idWZmZXIiLCJfT2JzZXJ2YWJsZSIsIkJGU0UiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9jcmVhdGVEZWZlcnJlZCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfY3Jvc3NGZXRjaCIsIl9kaXJlY3RMaW5lIiwiX1dlYlNvY2tldENsaWVudFdpdGhOZXR3b3JrSW5mb3JtYXRpb24iLCJfZXhjbHVkZWQiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJub2RlSW50ZXJvcCIsIldlYWtNYXAiLCJjYWNoZUJhYmVsSW50ZXJvcCIsImNhY2hlTm9kZUludGVyb3AiLCJvYmoiLCJfX2VzTW9kdWxlIiwiX3R5cGVvZiIsImNhY2hlIiwiaGFzIiwiZ2V0IiwibmV3T2JqIiwiaGFzUHJvcGVydHlEZXNjcmlwdG9yIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJrZXkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJkZXNjIiwic2V0IiwiRElSRUNUX0xJTkVfVkVSU0lPTiIsIk1BWF9SRVRSWV9DT1VOVCIsInJlZnJlc2hUb2tlbkxpZmV0aW1lIiwicmVmcmVzaFRva2VuSW50ZXJ2YWwiLCJTdHJlYW1IYW5kbGVyIiwicyIsImMkIiwic3EiLCJfY2xhc3NDYWxsQ2hlY2syIiwiX2RlZmluZVByb3BlcnR5MiIsInN1YnNjcmliZXIiLCJjb25uZWN0aW9uU3RhdHVzJCIsInNob3VsZFF1ZXVlIiwiX2NyZWF0ZUNsYXNzMiIsInZhbHVlIiwic2V0U3Vic2NyaWJlciIsIl9wcm9jZXNzUmVxdWVzdCIsIl9hc3luY1RvR2VuZXJhdG9yMiIsIl9yZWdlbmVyYXRvciIsIm1hcmsiLCJfY2FsbGVlIiwicmVxdWVzdCIsImxvZ2dlciIsInN0cmVhbXMiLCJzdHJlYW0wIiwiYWN0aXZpdHlTZXRKc29uIiwiYWN0aXZpdHlTZXQiLCJhY3Rpdml0eSIsImF0dGFjaG1lbnRzIiwic3RyZWFtIiwiYXR0YWNobWVudCIsImRhdGFVcmkiLCJ3cmFwIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwiX3RvQ29uc3VtYWJsZUFycmF5MiIsInNoaWZ0IiwicmVhZEFzU3RyaW5nIiwic2VudCIsIkpTT04iLCJwYXJzZSIsImFjdGl2aXRpZXMiLCJsZW5ndGgiLCJlcnJvciIsIkVycm9yIiwiYWJydXB0IiwiU3RyZWFtaW5nUmVzcG9uc2UiLCJjcmVhdGUiLCJwdXNoIiwiY29udGVudFR5cGUiLCJjb250ZW50VXJsIiwiYWN0aXZpdHlRdWV1ZSIsInN0b3AiLCJwcm9jZXNzUmVxdWVzdCIsIl94IiwiX3gyIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJmbHVzaCIsIl90aGlzIiwic3Vic2NyaWJlIiwiZm9yRWFjaCIsImEiLCJlbmQiLCJjb21wbGV0ZSIsIl9uZXR3b3JrSW5mb3JtYXRpb24iLCJEaXJlY3RMaW5lU3RyZWFtaW5nIiwib3B0aW9ucyIsIl90aGlzMiIsIkJlaGF2aW9yU3ViamVjdCIsIkNvbm5lY3Rpb25TdGF0dXMiLCJVbmluaXRpYWxpemVkIiwid3JpdGFibGUiLCJuZXR3b3JrSW5mb3JtYXRpb24iLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInR5cGUiLCJfY2xhc3NQcml2YXRlRmllbGRTZXQyIiwiY29uc29sZSIsIndhcm4iLCJ0b2tlbiIsInJlZnJlc2hUb2tlbiIsIkV4cGlyZWRUb2tlbiIsImRvbWFpbiIsImNvbnZlcnNhdGlvbklkIiwiX2JvdEFnZW50IiwiZ2V0Qm90QWdlbnQiLCJib3RBZ2VudCIsInF1ZXVlQWN0aXZpdGllcyIsImFjdGl2aXR5JCIsIk9ic2VydmFibGUiLCJfcmVmIiwiX2NhbGxlZTIiLCJfY2FsbGVlMiQiLCJfY29udGV4dDIiLCJhY3Rpdml0eVN1YnNjcmliZXIiLCJ0aGVTdHJlYW1IYW5kbGVyIiwiY29ubmVjdERlZmVycmVkIiwicmVzb2x2ZSIsIl94MyIsInNoYXJlIiwiY29ubmVjdFdpdGhSZXRyeUFzeW5jIiwicmVjb25uZWN0IiwiX3JlZjIiLCJnZXRWYWx1ZSIsIkVuZGVkIiwic3RyZWFtQ29ubmVjdGlvbiIsImRpc2Nvbm5lY3QiLCJjb21tb25IZWFkZXJzIiwiQXV0aG9yaXphdGlvbiIsImNvbmNhdCIsImN1c3RvbUFnZW50IiwidW5kZWZpbmVkIiwiY2xpZW50QWdlbnQiLCJfcmVmcmVzaFRva2VuIiwiX2NhbGxlZTMiLCJmaXJzdENhbGwiLCJyZXRyeUNvdW50IiwibnVtYmVyT2ZBdHRlbXB0cyIsInJlcyIsIl95aWVsZCRyZXMkanNvbiIsIl9hcmdzMyIsIl9jYWxsZWUzJCIsIl9jb250ZXh0MyIsIndhaXRVbnRpbE9ubGluZSIsIlByb21pc2UiLCJyIiwic2V0VGltZW91dCIsImZldGNoIiwibWV0aG9kIiwiaGVhZGVycyIsIm9rIiwianNvbiIsInN0YXR1cyIsInN0YXR1c1RleHQiLCJ0MCIsInBvc3RBY3Rpdml0eSIsIl90aGlzMyIsIkZhaWxlZFRvQ29ubmVjdCIsInBvc3RNZXNzYWdlV2l0aEF0dGFjaG1lbnRzIiwicmVzcCQiLCJfcmVmMyIsIl9jYWxsZWU0IiwicmVzcCIsIm51bWJlck9mU3RyZWFtcyIsImlkU3RyaW5nIiwiX0pTT04kcGFyc2UiLCJpZCIsIl9jYWxsZWU0JCIsIl9jb250ZXh0NCIsIlN0cmVhbWluZ1JlcXVlc3QiLCJzZXRCb2R5Iiwic3RyaW5naWZ5Iiwic2VuZCIsInN0YXR1c0NvZGUiLCJJZCIsIl94NCIsIm1lc3NhZ2UiLCJfdGhpczQiLCJtZXNzYWdlV2l0aG91dEF0dGFjaG1lbnRzIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiIsImh0dHBDb250ZW50TGlzdCIsIl9jYWxsZWU2IiwiYXJyYXlCdWZmZXJzIiwidXJsIiwiYWN0aXZpdHlTdHJlYW0iLCJfeWllbGQkcmVzcCRzdHJlYW1zJCIsIl9jYWxsZWU2JCIsIl9jb250ZXh0NiIsImFsbCIsIm1hcCIsIl9yZWY1IiwiX2NhbGxlZTUiLCJtZWRpYSIsIl9jYWxsZWU1JCIsIl9jb250ZXh0NSIsImFycmF5QnVmZmVyIiwidDEiLCJfeDUiLCJfcmVmNiIsImJ1ZmZlciIsIkJ1ZmZlciIsImZyb20iLCJTdWJzY3JpYmFibGVTdHJlYW0iLCJ3cml0ZSIsImh0dHBDb250ZW50IiwiSHR0cENvbnRlbnQiLCJjb250ZW50TGVuZ3RoIiwiYWRkU3RyZWFtIiwiZSIsInJlYWRBc0pzb24iLCJfd2FpdFVudGlsT25saW5lIiwiX2NhbGxlZTciLCJfdGhpczUiLCJfY2FsbGVlNyQiLCJfY29udGV4dDciLCJyZWplY3QiLCJjcyIsIk9ubGluZSIsIl9jb25uZWN0QXN5bmMiLCJfY2FsbGVlOSIsIl90aGlzNiIsInJlIiwicGFyYW1zIiwiYWJvcnRDb250cm9sbGVyIiwidXJsU2VhcmNoUGFyYW1zIiwid3NVcmwiLCJfY2FsbGVlOSQiLCJfY29udGV4dDkiLCJSZWdFeHAiLCJ0ZXN0IiwiQWJvcnRDb250cm9sbGVyIiwiVVJMU2VhcmNoUGFyYW1zIiwidG9TdHJpbmciLCJyZXBsYWNlIiwiX3JlZjciLCJfY2FsbGVlOCIsInJlc3BvbnNlIiwicmVzcG9uc2VTdHJpbmciLCJjb252ZXJzYXRpb24iLCJfY2FsbGVlOCQiLCJfY29udGV4dDgiLCJXZWJTb2NrZXRDbGllbnRXaXRoTmV0d29ya0luZm9ybWF0aW9uIiwiZGlzY29ubmVjdGlvbkhhbmRsZXIiLCJfY2xhc3NQcml2YXRlRmllbGRHZXQyIiwicmVxdWVzdEhhbmRsZXIiLCJzdHJlYW1pbmdSZXF1ZXN0Iiwic2lnbmFsIiwiYWJvcnRlZCIsImNvbm5lY3QiLCJfeDYiLCJfeDciLCJhYm9ydCIsImNvbm5lY3RBc3luYyIsIl9jb25uZWN0V2l0aFJldHJ5QXN5bmMiLCJfY2FsbGVlMTAiLCJfdGhpczciLCJudW1SZXRyaWVzIiwic3RhcnQiLCJfY2FsbGVlMTAkIiwiX2NvbnRleHQxMCIsImNyZWF0ZURlZmVycmVkIiwicHJvbWlzZSIsIkNvbm5lY3RpbmciLCJEYXRlIiwibm93IiwiZ2V0UmV0cnlEZWxheSIsIk1hdGgiLCJmbG9vciIsInJhbmRvbSIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi9zcmMvZGlyZWN0TGluZVN0cmVhbWluZy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbiBvcmRlciB0byBrZWVwIGZpbGUgc2l6ZSBkb3duLCBvbmx5IGltcG9ydCB0aGUgcGFydHMgb2YgcnhqcyB0aGF0IHdlIHVzZVxuXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzL0JlaGF2aW9yU3ViamVjdCc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMvT2JzZXJ2YWJsZSc7XG5pbXBvcnQgeyBTdWJzY3JpYmVyIH0gZnJvbSAncnhqcy9TdWJzY3JpYmVyJztcbmltcG9ydCAqIGFzIEJGU0UgZnJvbSAnYm90ZnJhbWV3b3JrLXN0cmVhbWluZyc7XG5pbXBvcnQgY3JlYXRlRGVmZXJyZWQgZnJvbSAnLi9jcmVhdGVEZWZlcnJlZCc7XG5pbXBvcnQgZmV0Y2ggZnJvbSAnY3Jvc3MtZmV0Y2gnO1xuXG5pbXBvcnQgeyBBY3Rpdml0eSwgQ29ubmVjdGlvblN0YXR1cywgQ29udmVyc2F0aW9uLCBEaXJlY3RMaW5lLCBJQm90Q29ubmVjdGlvbiwgTWVkaWEsIE1lc3NhZ2UgfSBmcm9tICcuL2RpcmVjdExpbmUnO1xuaW1wb3J0IFdlYlNvY2tldENsaWVudFdpdGhOZXR3b3JrSW5mb3JtYXRpb24gZnJvbSAnLi9zdHJlYW1pbmcvV2ViU29ja2V0Q2xpZW50V2l0aE5ldHdvcmtJbmZvcm1hdGlvbic7XG5pbXBvcnQgdHlwZSB7IERlZmVycmVkIH0gZnJvbSAnLi9jcmVhdGVEZWZlcnJlZCc7XG5cbmNvbnN0IERJUkVDVF9MSU5FX1ZFUlNJT04gPSAnRGlyZWN0TGluZS8zLjAnO1xuY29uc3QgTUFYX1JFVFJZX0NPVU5UID0gMztcbmNvbnN0IHJlZnJlc2hUb2tlbkxpZmV0aW1lID0gMzAgKiA2MCAqIDEwMDA7XG4vL2NvbnN0IHJlZnJlc2hUb2tlbkxpZmV0aW1lID0gNTAwMDtcbi8vIGNvbnN0IHRpbWVvdXQgPSAyMCAqIDEwMDA7XG5jb25zdCByZWZyZXNoVG9rZW5JbnRlcnZhbCA9IHJlZnJlc2hUb2tlbkxpZmV0aW1lIC8gMjtcblxuaW50ZXJmYWNlIERpcmVjdExpbmVTdHJlYW1pbmdPcHRpb25zIHtcbiAgdG9rZW46IHN0cmluZztcbiAgY29udmVyc2F0aW9uSWQ/OiBzdHJpbmc7XG4gIGRvbWFpbjogc3RyaW5nO1xuICAvLyBBdHRhY2hlZCB0byBhbGwgcmVxdWVzdHMgdG8gaWRlbnRpZnkgcmVxdWVzdGluZyBhZ2VudC5cbiAgYm90QWdlbnQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIFtgTmV0d29ya0luZm9ybWF0aW9uYCBBUEldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9OZXR3b3JrX0luZm9ybWF0aW9uX0FQSSkuXG4gICAqIFdoZW4gdGhlIGBOZXR3b3JrSW5mb3JtYXRpb25gIGRldGVjdCBuZXR3b3JrIGNoYW5nZXMgb3Igb2ZmbGluZSwgaXQgd2lsbCBkaXNjb25uZWN0IHRoZSBXZWIgU29ja2V0IGFuZCByZWNvbm5lY3QgaXQuXG4gICAqL1xuICBuZXR3b3JrSW5mb3JtYXRpb24/OiBOZXR3b3JrSW5mb3JtYXRpb247XG59XG5cbmNsYXNzIFN0cmVhbUhhbmRsZXIgaW1wbGVtZW50cyBCRlNFLlJlcXVlc3RIYW5kbGVyIHtcbiAgcHJpdmF0ZSBjb25uZWN0aW9uU3RhdHVzJDtcbiAgcHJpdmF0ZSBzdWJzY3JpYmVyOiBTdWJzY3JpYmVyPEFjdGl2aXR5PjtcbiAgcHJpdmF0ZSBzaG91bGRRdWV1ZTogKCkgPT4gYm9vbGVhbjtcbiAgcHJpdmF0ZSBhY3Rpdml0eVF1ZXVlOiBBcnJheTxBY3Rpdml0eT4gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihzOiBTdWJzY3JpYmVyPEFjdGl2aXR5PiwgYyQ6IE9ic2VydmFibGU8Q29ubmVjdGlvblN0YXR1cz4sIHNxOiAoKSA9PiBib29sZWFuKSB7XG4gICAgdGhpcy5zdWJzY3JpYmVyID0gcztcbiAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkID0gYyQ7XG4gICAgdGhpcy5zaG91bGRRdWV1ZSA9IHNxO1xuICB9XG5cbiAgcHVibGljIHNldFN1YnNjcmliZXIoczogU3Vic2NyaWJlcjxBY3Rpdml0eT4pIHtcbiAgICB0aGlzLnN1YnNjcmliZXIgPSBzO1xuICB9XG5cbiAgYXN5bmMgcHJvY2Vzc1JlcXVlc3QocmVxdWVzdDogQkZTRS5JUmVjZWl2ZVJlcXVlc3QsIGxvZ2dlcj86IGFueSk6IFByb21pc2U8QkZTRS5TdHJlYW1pbmdSZXNwb25zZT4ge1xuICAgIGNvbnN0IHN0cmVhbXMgPSBbLi4ucmVxdWVzdC5zdHJlYW1zXTtcbiAgICBjb25zdCBzdHJlYW0wID0gc3RyZWFtcy5zaGlmdCgpO1xuICAgIGNvbnN0IGFjdGl2aXR5U2V0SnNvbiA9IGF3YWl0IHN0cmVhbTAucmVhZEFzU3RyaW5nKCk7XG4gICAgY29uc3QgYWN0aXZpdHlTZXQgPSBKU09OLnBhcnNlKGFjdGl2aXR5U2V0SnNvbik7XG5cbiAgICBpZiAoYWN0aXZpdHlTZXQuYWN0aXZpdGllcy5sZW5ndGggIT09IDEpIHtcbiAgICAgIC8vIE9ubHkgb25lIGFjdGl2aXR5IGlzIGV4cGVjdGVkIGluIGEgc2V0IGluIHN0cmVhbWluZ1xuICAgICAgdGhpcy5zdWJzY3JpYmVyLmVycm9yKG5ldyBFcnJvcigndGhlcmUgc2hvdWxkIGJlIGV4YWN0bHkgb25lIGFjdGl2aXR5JykpO1xuICAgICAgcmV0dXJuIEJGU0UuU3RyZWFtaW5nUmVzcG9uc2UuY3JlYXRlKDUwMCk7XG4gICAgfVxuXG4gICAgY29uc3QgYWN0aXZpdHkgPSBhY3Rpdml0eVNldC5hY3Rpdml0aWVzWzBdO1xuXG4gICAgaWYgKHN0cmVhbXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgYXR0YWNobWVudHMgPSBbLi4uYWN0aXZpdHkuYXR0YWNobWVudHNdO1xuXG4gICAgICBsZXQgc3RyZWFtOiBCRlNFLkNvbnRlbnRTdHJlYW07XG4gICAgICB3aGlsZSAoKHN0cmVhbSA9IHN0cmVhbXMuc2hpZnQoKSkpIHtcbiAgICAgICAgY29uc3QgYXR0YWNobWVudCA9IGF3YWl0IHN0cmVhbS5yZWFkQXNTdHJpbmcoKTtcbiAgICAgICAgY29uc3QgZGF0YVVyaSA9ICdkYXRhOnRleHQvcGxhaW47YmFzZTY0LCcgKyBhdHRhY2htZW50O1xuICAgICAgICBhdHRhY2htZW50cy5wdXNoKHsgY29udGVudFR5cGU6IHN0cmVhbS5jb250ZW50VHlwZSwgY29udGVudFVybDogZGF0YVVyaSB9KTtcbiAgICAgIH1cblxuICAgICAgYWN0aXZpdHkuYXR0YWNobWVudHMgPSBhdHRhY2htZW50cztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zaG91bGRRdWV1ZSgpKSB7XG4gICAgICB0aGlzLmFjdGl2aXR5UXVldWUucHVzaChhY3Rpdml0eSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3Vic2NyaWJlci5uZXh0KGFjdGl2aXR5KTtcbiAgICB9XG5cbiAgICByZXR1cm4gQkZTRS5TdHJlYW1pbmdSZXNwb25zZS5jcmVhdGUoMjAwKTtcbiAgfVxuXG4gIHB1YmxpYyBmbHVzaCgpIHtcbiAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLnN1YnNjcmliZSgoKSA9PiB7fSk7XG4gICAgdGhpcy5hY3Rpdml0eVF1ZXVlLmZvckVhY2goYSA9PiB0aGlzLnN1YnNjcmliZXIubmV4dChhKSk7XG4gICAgdGhpcy5hY3Rpdml0eVF1ZXVlID0gW107XG4gIH1cblxuICBwdWJsaWMgZW5kKCkge1xuICAgIHRoaXMuc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEaXJlY3RMaW5lU3RyZWFtaW5nIGltcGxlbWVudHMgSUJvdENvbm5lY3Rpb24ge1xuICBwdWJsaWMgY29ubmVjdGlvblN0YXR1cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KENvbm5lY3Rpb25TdGF0dXMuVW5pbml0aWFsaXplZCk7XG4gIHB1YmxpYyBhY3Rpdml0eSQ6IE9ic2VydmFibGU8QWN0aXZpdHk+O1xuXG4gIHByaXZhdGUgYWN0aXZpdHlTdWJzY3JpYmVyOiBTdWJzY3JpYmVyPEFjdGl2aXR5PjtcbiAgcHJpdmF0ZSBjb25uZWN0RGVmZXJyZWQ6IERlZmVycmVkPHZvaWQ+O1xuICBwcml2YXRlIHRoZVN0cmVhbUhhbmRsZXI6IFN0cmVhbUhhbmRsZXI7XG5cbiAgcHJpdmF0ZSBkb21haW46IHN0cmluZztcblxuICBwcml2YXRlIGNvbnZlcnNhdGlvbklkOiBzdHJpbmc7XG4gIHByaXZhdGUgdG9rZW46IHN0cmluZztcbiAgcHJpdmF0ZSBzdHJlYW1Db25uZWN0aW9uOiBCRlNFLldlYlNvY2tldENsaWVudDtcbiAgcHJpdmF0ZSBxdWV1ZUFjdGl2aXRpZXM6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBfYm90QWdlbnQgPSAnJztcblxuICAjbmV0d29ya0luZm9ybWF0aW9uOiBOZXR3b3JrSW5mb3JtYXRpb24gfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogRGlyZWN0TGluZVN0cmVhbWluZ09wdGlvbnMpIHtcbiAgICAvLyBSZWN0aWZpZXMgYG9wdGlvbnMubmV0d29ya0luZm9ybWF0aW9uYC5cbiAgICBjb25zdCBuZXR3b3JrSW5mb3JtYXRpb24gPSBvcHRpb25zPy5uZXR3b3JrSW5mb3JtYXRpb247XG5cbiAgICBpZiAoXG4gICAgICB0eXBlb2YgbmV0d29ya0luZm9ybWF0aW9uID09PSAndW5kZWZpbmVkJyB8fFxuICAgICAgKHR5cGVvZiBuZXR3b3JrSW5mb3JtYXRpb24uYWRkRXZlbnRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgICB0eXBlb2YgbmV0d29ya0luZm9ybWF0aW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgdHlwZW9mIG5ldHdvcmtJbmZvcm1hdGlvbi50eXBlID09PSAnc3RyaW5nJylcbiAgICApIHtcbiAgICAgIHRoaXMuI25ldHdvcmtJbmZvcm1hdGlvbiA9IG5ldHdvcmtJbmZvcm1hdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAnYm90ZnJhbWV3b3JrLWRpcmVjdGxpbmVqczogXCJuZXR3b3JrSW5mb3JtYXRpb25cIiBvcHRpb24gc3BlY2lmaWVkIG11c3QgYmUgYSBgTmV0d29ya0luZm9ybWF0aW9uYC1saWtlIGluc3RhbmNlIGV4dGVuZGluZyBgRXZlbnRUYXJnZXRgIGludGVyZmFjZSB3aXRoIGEgYHR5cGVgIHByb3BlcnR5IHJldHVybmluZyBhIHN0cmluZy4nXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMudG9rZW4gPSBvcHRpb25zLnRva2VuO1xuXG4gICAgdGhpcy5yZWZyZXNoVG9rZW4oKS5jYXRjaCgoKSA9PiB7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLm5leHQoQ29ubmVjdGlvblN0YXR1cy5FeHBpcmVkVG9rZW4pO1xuICAgIH0pO1xuXG4gICAgdGhpcy5kb21haW4gPSBvcHRpb25zLmRvbWFpbjtcblxuICAgIGlmIChvcHRpb25zLmNvbnZlcnNhdGlvbklkKSB7XG4gICAgICB0aGlzLmNvbnZlcnNhdGlvbklkID0gb3B0aW9ucy5jb252ZXJzYXRpb25JZDtcbiAgICB9XG5cbiAgICB0aGlzLl9ib3RBZ2VudCA9IHRoaXMuZ2V0Qm90QWdlbnQob3B0aW9ucy5ib3RBZ2VudCk7XG5cbiAgICB0aGlzLnF1ZXVlQWN0aXZpdGllcyA9IHRydWU7XG4gICAgdGhpcy5hY3Rpdml0eSQgPSBPYnNlcnZhYmxlLmNyZWF0ZShhc3luYyAoc3Vic2NyaWJlcjogU3Vic2NyaWJlcjxBY3Rpdml0eT4pID0+IHtcbiAgICAgIHRoaXMuYWN0aXZpdHlTdWJzY3JpYmVyID0gc3Vic2NyaWJlcjtcbiAgICAgIHRoaXMudGhlU3RyZWFtSGFuZGxlciA9IG5ldyBTdHJlYW1IYW5kbGVyKHN1YnNjcmliZXIsIHRoaXMuY29ubmVjdGlvblN0YXR1cyQsICgpID0+IHRoaXMucXVldWVBY3Rpdml0aWVzKTtcblxuICAgICAgLy8gUmVzb2x2aW5nIGNvbm5lY3REZWZlcnJlZCB3aWxsIGtpY2stb2ZmIHRoZSBjb25uZWN0aW9uLlxuICAgICAgdGhpcy5jb25uZWN0RGVmZXJyZWQucmVzb2x2ZSgpO1xuICAgIH0pLnNoYXJlKCk7XG5cbiAgICAvLyBjb25uZWN0V2l0aFJldHJ5QXN5bmMoKSB3aWxsIGNyZWF0ZSB0aGUgY29ubmVjdERlZmVycmVkIG9iamVjdCByZXF1aXJlZCBpbiBhY3Rpdml0eSQuXG4gICAgdGhpcy5jb25uZWN0V2l0aFJldHJ5QXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyByZWNvbm5lY3QoeyBjb252ZXJzYXRpb25JZCwgdG9rZW4gfTogQ29udmVyc2F0aW9uKSB7XG4gICAgaWYgKHRoaXMuY29ubmVjdGlvblN0YXR1cyQuZ2V0VmFsdWUoKSA9PT0gQ29ubmVjdGlvblN0YXR1cy5FbmRlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb25uZWN0aW9uIGhhcyBlbmRlZC4nKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbnZlcnNhdGlvbklkID0gY29udmVyc2F0aW9uSWQ7XG4gICAgdGhpcy50b2tlbiA9IHRva2VuO1xuXG4gICAgdGhpcy5jb25uZWN0RGVmZXJyZWQucmVzb2x2ZSgpO1xuICB9XG5cbiAgZW5kKCkge1xuICAgIC8vIE9uY2UgZW5kKCkgaXMgY2FsbGVkLCBubyByZWNvbm5lY3Rpb24gY2FuIGJlIG1hZGUuXG4gICAgdGhpcy5hY3Rpdml0eVN1YnNjcmliZXIuY29tcGxldGUoKTtcblxuICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQubmV4dChDb25uZWN0aW9uU3RhdHVzLkVuZGVkKTtcbiAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLmNvbXBsZXRlKCk7XG5cbiAgICB0aGlzLnN0cmVhbUNvbm5lY3Rpb24uZGlzY29ubmVjdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21tb25IZWFkZXJzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dGhpcy50b2tlbn1gLFxuICAgICAgJ3gtbXMtYm90LWFnZW50JzogdGhpcy5fYm90QWdlbnRcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRCb3RBZ2VudChjdXN0b21BZ2VudDogc3RyaW5nID0gJycpOiBzdHJpbmcge1xuICAgIGxldCBjbGllbnRBZ2VudCA9ICdkaXJlY3RsaW5lU3RyZWFtaW5nJztcblxuICAgIGlmIChjdXN0b21BZ2VudCkge1xuICAgICAgY2xpZW50QWdlbnQgKz0gYDsgJHtjdXN0b21BZ2VudH1gO1xuICAgIH1cblxuICAgIHJldHVybiBgJHtESVJFQ1RfTElORV9WRVJTSU9OfSAoJHtjbGllbnRBZ2VudH0pYDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaFRva2VuKGZpcnN0Q2FsbCA9IHRydWUsIHJldHJ5Q291bnQgPSAwKSB7XG4gICAgYXdhaXQgdGhpcy53YWl0VW50aWxPbmxpbmUoKTtcblxuICAgIGxldCBudW1iZXJPZkF0dGVtcHRzID0gMDtcbiAgICB3aGlsZSAobnVtYmVyT2ZBdHRlbXB0cyA8IE1BWF9SRVRSWV9DT1VOVCkge1xuICAgICAgbnVtYmVyT2ZBdHRlbXB0cysrO1xuICAgICAgYXdhaXQgbmV3IFByb21pc2UociA9PiBzZXRUaW1lb3V0KHIsIHJlZnJlc2hUb2tlbkludGVydmFsKSk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgJHt0aGlzLmRvbWFpbn0vdG9rZW5zL3JlZnJlc2hgLCB7IG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB0aGlzLmNvbW1vbkhlYWRlcnMoKSB9KTtcbiAgICAgICAgaWYgKHJlcy5vaykge1xuICAgICAgICAgIG51bWJlck9mQXR0ZW1wdHMgPSAwO1xuICAgICAgICAgIGNvbnN0IHsgdG9rZW4gfSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgICAgdGhpcy50b2tlbiA9IHRva2VuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChyZXMuc3RhdHVzID09PSA0MDMgfHwgcmVzLnN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYXRhbCBlcnJvciB3aGlsZSByZWZyZXNoaW5nIHRoZSB0b2tlbjogJHtyZXMuc3RhdHVzfSAke3Jlcy5zdGF0dXNUZXh0fWApO1xuICAgICAgICAgICAgdGhpcy5zdHJlYW1Db25uZWN0aW9uLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBSZWZyZXNoIGF0dGVtcHQgIyR7bnVtYmVyT2ZBdHRlbXB0c30gZmFpbGVkOiAke3Jlcy5zdGF0dXN9ICR7cmVzLnN0YXR1c1RleHR9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgUmVmcmVzaCBhdHRlbXB0ICMke251bWJlck9mQXR0ZW1wdHN9IHRocmV3IGFuIGV4Y2VwdGlvbjogJHtlfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnNvbGUuZXJyb3IoJ1JldHJpZXMgZXhoYXVzdGVkJyk7XG4gICAgdGhpcy5zdHJlYW1Db25uZWN0aW9uLmRpc2Nvbm5lY3QoKTtcbiAgfVxuXG4gIHBvc3RBY3Rpdml0eShhY3Rpdml0eTogQWN0aXZpdHkpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLnZhbHVlID09PSBDb25uZWN0aW9uU3RhdHVzLkVuZGVkIHx8XG4gICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLnZhbHVlID09PSBDb25uZWN0aW9uU3RhdHVzLkZhaWxlZFRvQ29ubmVjdFxuICAgICkge1xuICAgICAgcmV0dXJuIE9ic2VydmFibGUudGhyb3cobmV3IEVycm9yKCdDb25uZWN0aW9uIGlzIGNsb3NlZCcpKTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aXZpdHkudHlwZSA9PT0gJ21lc3NhZ2UnICYmIGFjdGl2aXR5LmF0dGFjaG1lbnRzICYmIGFjdGl2aXR5LmF0dGFjaG1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB0aGlzLnBvc3RNZXNzYWdlV2l0aEF0dGFjaG1lbnRzKGFjdGl2aXR5KTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNwJCA9IE9ic2VydmFibGUuY3JlYXRlKGFzeW5jIHN1YnNjcmliZXIgPT4ge1xuICAgICAgY29uc3QgcmVxdWVzdCA9IEJGU0UuU3RyZWFtaW5nUmVxdWVzdC5jcmVhdGUoXG4gICAgICAgICdQT1NUJyxcbiAgICAgICAgJy92My9kaXJlY3RsaW5lL2NvbnZlcnNhdGlvbnMvJyArIHRoaXMuY29udmVyc2F0aW9uSWQgKyAnL2FjdGl2aXRpZXMnXG4gICAgICApO1xuICAgICAgcmVxdWVzdC5zZXRCb2R5KEpTT04uc3RyaW5naWZ5KGFjdGl2aXR5KSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLnN0cmVhbUNvbm5lY3Rpb24uc2VuZChyZXF1ZXN0KTtcbiAgICAgICAgaWYgKHJlc3Auc3RhdHVzQ29kZSAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoJ1Bvc3RBY3Rpdml0eSByZXR1cm5lZCAnICsgcmVzcC5zdGF0dXNDb2RlKTtcbiAgICAgICAgY29uc3QgbnVtYmVyT2ZTdHJlYW1zID0gcmVzcC5zdHJlYW1zLmxlbmd0aDtcbiAgICAgICAgaWYgKG51bWJlck9mU3RyZWFtcyAhPT0gMSkgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBvbmUgc3RyZWFtIGJ1dCBnb3QgJyArIG51bWJlck9mU3RyZWFtcyk7XG4gICAgICAgIGNvbnN0IGlkU3RyaW5nID0gYXdhaXQgcmVzcC5zdHJlYW1zWzBdLnJlYWRBc1N0cmluZygpO1xuICAgICAgICBjb25zdCB7IElkOiBpZCB9ID0gSlNPTi5wYXJzZShpZFN0cmluZyk7XG4gICAgICAgIHN1YnNjcmliZXIubmV4dChpZCk7XG4gICAgICAgIHJldHVybiBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIElmIHRoZXJlIGlzIGEgbmV0d29yayBpc3N1ZSB0aGVuIGl0cyBoYW5kbGVkIGJ5XG4gICAgICAgIC8vIHRoZSBkaXNjb25uZWN0aW9uSGFuZGxlci4gRXZlcnl0aGluZyBlbHNlIGNhblxuICAgICAgICAvLyBiZSByZXRyaWVkXG4gICAgICAgIGNvbnNvbGUud2FybihlKTtcbiAgICAgICAgdGhpcy5zdHJlYW1Db25uZWN0aW9uLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgcmV0dXJuIHN1YnNjcmliZXIuZXJyb3IoZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3AkO1xuICB9XG5cbiAgcHJpdmF0ZSBwb3N0TWVzc2FnZVdpdGhBdHRhY2htZW50cyhtZXNzYWdlOiBNZXNzYWdlKSB7XG4gICAgY29uc3QgeyBhdHRhY2htZW50cywgLi4ubWVzc2FnZVdpdGhvdXRBdHRhY2htZW50cyB9ID0gbWVzc2FnZTtcblxuICAgIHJldHVybiBPYnNlcnZhYmxlLmNyZWF0ZShzdWJzY3JpYmVyID0+IHtcbiAgICAgIGNvbnN0IGh0dHBDb250ZW50TGlzdCA9IFtdO1xuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBhcnJheUJ1ZmZlcnMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgIGF0dGFjaG1lbnRzLm1hcChhc3luYyBhdHRhY2htZW50ID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgbWVkaWEgPSBhdHRhY2htZW50IGFzIE1lZGlhO1xuICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChtZWRpYS5jb250ZW50VXJsKTtcbiAgICAgICAgICAgICAgaWYgKHJlcy5vaykge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGFycmF5QnVmZmVyOiBhd2FpdCByZXMuYXJyYXlCdWZmZXIoKSwgbWVkaWEgfTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJy4uLicpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBhcnJheUJ1ZmZlcnMuZm9yRWFjaCgoeyBhcnJheUJ1ZmZlciwgbWVkaWEgfSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20oYXJyYXlCdWZmZXIpO1xuICAgICAgICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IEJGU0UuU3Vic2NyaWJhYmxlU3RyZWFtKCk7XG4gICAgICAgICAgICBzdHJlYW0ud3JpdGUoYnVmZmVyKTtcbiAgICAgICAgICAgIGNvbnN0IGh0dHBDb250ZW50ID0gbmV3IEJGU0UuSHR0cENvbnRlbnQoeyB0eXBlOiBtZWRpYS5jb250ZW50VHlwZSwgY29udGVudExlbmd0aDogYnVmZmVyLmxlbmd0aCB9LCBzdHJlYW0pO1xuICAgICAgICAgICAgaHR0cENvbnRlbnRMaXN0LnB1c2goaHR0cENvbnRlbnQpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3QgdXJsID0gYC92My9kaXJlY3RsaW5lL2NvbnZlcnNhdGlvbnMvJHt0aGlzLmNvbnZlcnNhdGlvbklkfS91c2Vycy8ke21lc3NhZ2VXaXRob3V0QXR0YWNobWVudHMuZnJvbS5pZH0vdXBsb2FkYDtcbiAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gQkZTRS5TdHJlYW1pbmdSZXF1ZXN0LmNyZWF0ZSgnUFVUJywgdXJsKTtcbiAgICAgICAgICBjb25zdCBhY3Rpdml0eVN0cmVhbSA9IG5ldyBCRlNFLlN1YnNjcmliYWJsZVN0cmVhbSgpO1xuICAgICAgICAgIGFjdGl2aXR5U3RyZWFtLndyaXRlKEpTT04uc3RyaW5naWZ5KG1lc3NhZ2VXaXRob3V0QXR0YWNobWVudHMpLCAndXRmLTgnKTtcbiAgICAgICAgICByZXF1ZXN0LmFkZFN0cmVhbShcbiAgICAgICAgICAgIG5ldyBCRlNFLkh0dHBDb250ZW50KFxuICAgICAgICAgICAgICB7IHR5cGU6ICdhcHBsaWNhdGlvbi92bmQubWljcm9zb2Z0LmFjdGl2aXR5JywgY29udGVudExlbmd0aDogYWN0aXZpdHlTdHJlYW0ubGVuZ3RoIH0sXG4gICAgICAgICAgICAgIGFjdGl2aXR5U3RyZWFtXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgICBodHRwQ29udGVudExpc3QuZm9yRWFjaChlID0+IHJlcXVlc3QuYWRkU3RyZWFtKGUpKTtcblxuICAgICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLnN0cmVhbUNvbm5lY3Rpb24uc2VuZChyZXF1ZXN0KTtcbiAgICAgICAgICBpZiAocmVzcC5zdHJlYW1zICYmIHJlc3Auc3RyZWFtcy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IobmV3IEVycm9yKGBJbnZhbGlkIHN0cmVhbSBjb3VudCAke3Jlc3Auc3RyZWFtcy5sZW5ndGh9YCkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB7IElkOiBpZCB9ID0gYXdhaXQgcmVzcC5zdHJlYW1zWzBdLnJlYWRBc0pzb248eyBJZDogc3RyaW5nIH0+KCk7XG4gICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoaWQpO1xuICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICAgIH0pKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdhaXRVbnRpbE9ubGluZSgpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5zdWJzY3JpYmUoXG4gICAgICAgIGNzID0+IHtcbiAgICAgICAgICBpZiAoY3MgPT09IENvbm5lY3Rpb25TdGF0dXMuT25saW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZSA9PiByZWplY3QoZSlcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbm5lY3RBc3luYygpIHtcbiAgICBjb25zdCByZSA9IG5ldyBSZWdFeHAoJ15odHRwKHM/KScpO1xuXG4gICAgaWYgKCFyZS50ZXN0KHRoaXMuZG9tYWluKSkge1xuICAgICAgdGhyb3cgJ0RvbWFpbiBtdXN0IGJlZ2luIHdpdGggaHR0cCBvciBodHRwcyc7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1zID0geyB0b2tlbjogdGhpcy50b2tlbiB9O1xuXG4gICAgaWYgKHRoaXMuY29udmVyc2F0aW9uSWQpIHtcbiAgICAgIHBhcmFtc1snY29udmVyc2F0aW9uSWQnXSA9IHRoaXMuY29udmVyc2F0aW9uSWQ7XG4gICAgfVxuXG4gICAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIGNvbnN0IHVybFNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMocGFyYW1zKS50b1N0cmluZygpO1xuICAgIGNvbnN0IHdzVXJsID0gYCR7dGhpcy5kb21haW4ucmVwbGFjZShyZSwgJ3dzJDEnKX0vY29udmVyc2F0aW9ucy9jb25uZWN0PyR7dXJsU2VhcmNoUGFyYW1zfWA7XG5cbiAgICAvLyBUaGlzIHByb21pc2Ugd2lsbCByZXNvbHZlIHdoZW4gaXQgaXMgZGlzY29ubmVjdGVkLlxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnN0cmVhbUNvbm5lY3Rpb24gPSBuZXcgV2ViU29ja2V0Q2xpZW50V2l0aE5ldHdvcmtJbmZvcm1hdGlvbih7XG4gICAgICAgICAgZGlzY29ubmVjdGlvbkhhbmRsZXI6IHJlc29sdmUsXG4gICAgICAgICAgbmV0d29ya0luZm9ybWF0aW9uOiB0aGlzLiNuZXR3b3JrSW5mb3JtYXRpb24sXG4gICAgICAgICAgcmVxdWVzdEhhbmRsZXI6IHtcbiAgICAgICAgICAgIHByb2Nlc3NSZXF1ZXN0OiBzdHJlYW1pbmdSZXF1ZXN0ID0+IHtcbiAgICAgICAgICAgICAgLy8gSWYgYHN0cmVhbUNvbm5lY3Rpb25gIGlzIHN0aWxsIGN1cnJlbnQsIGFsbG93IGNhbGwgdG8gYHByb2Nlc3NSZXF1ZXN0KClgLCBvdGhlcndpc2UsIGlnbm9yZSBjYWxscyB0byBgcHJvY2Vzc1JlcXVlc3QoKWAuXG4gICAgICAgICAgICAgIC8vIFRoaXMgcHJldmVudHMgem9tYmllIGNvbm5lY3Rpb25zIGZyb20gc2VuZGluZyB1cyByZXF1ZXN0cy5cbiAgICAgICAgICAgICAgaWYgKGFib3J0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHByb2Nlc3Mgc3RyZWFtaW5nIHJlcXVlc3QsIGBzdHJlYW1pbmdDb25uZWN0aW9uYCBzaG91bGQgYmUgZGlzY29ubmVjdGVkLicpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudGhlU3RyZWFtSGFuZGxlci5wcm9jZXNzUmVxdWVzdChzdHJlYW1pbmdSZXF1ZXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHVybDogd3NVcmxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5xdWV1ZUFjdGl2aXRpZXMgPSB0cnVlO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuc3RyZWFtQ29ubmVjdGlvbi5jb25uZWN0KCk7XG5cbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IEJGU0UuU3RyZWFtaW5nUmVxdWVzdC5jcmVhdGUoJ1BPU1QnLCAnL3YzL2RpcmVjdGxpbmUvY29udmVyc2F0aW9ucycpO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc3RyZWFtQ29ubmVjdGlvbi5zZW5kKHJlcXVlc3QpO1xuXG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlICE9PSAyMDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nvbm5lY3Rpb24gcmVzcG9uc2UgY29kZSAnICsgcmVzcG9uc2Uuc3RhdHVzQ29kZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzcG9uc2Uuc3RyZWFtcy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIDEgc3RyZWFtIGJ1dCBnb3QgJyArIHJlc3BvbnNlLnN0cmVhbXMubGVuZ3RoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlU3RyaW5nID0gYXdhaXQgcmVzcG9uc2Uuc3RyZWFtc1swXS5yZWFkQXNTdHJpbmcoKTtcbiAgICAgICAgY29uc3QgY29udmVyc2F0aW9uID0gSlNPTi5wYXJzZShyZXNwb25zZVN0cmluZyk7XG5cbiAgICAgICAgdGhpcy5jb252ZXJzYXRpb25JZCA9IGNvbnZlcnNhdGlvbi5jb252ZXJzYXRpb25JZDtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5uZXh0KENvbm5lY3Rpb25TdGF0dXMuT25saW5lKTtcblxuICAgICAgICAvLyBXYWl0IHVudGlsIERMIGNvbnN1bWVycyBoYXZlIGhhZCBhIGNoYW5jZSB0byBiZSBub3RpZmllZFxuICAgICAgICAvLyBvZiB0aGUgY29ubmVjdGlvbiBzdGF0dXMgY2hhbmdlLlxuICAgICAgICAvLyBUaGlzIGlzIHNwZWNpZmljIHRvIFJ4SlMgaW1wbGVtZW50YXRpb24gb2Ygb2JzZXJ2YWJsZSwgd2hpY2ggY2FsbGluZyBzdWJzY3JpYmUoKSBhZnRlciBuZXh0KCkgd2lsbCBzdGlsbCBnZXQgdGhlIHZhbHVlLlxuICAgICAgICBhd2FpdCB0aGlzLndhaXRVbnRpbE9ubGluZSgpO1xuXG4gICAgICAgIHRoaXMudGhlU3RyZWFtSGFuZGxlci5mbHVzaCgpO1xuICAgICAgICB0aGlzLnF1ZXVlQWN0aXZpdGllcyA9IGZhbHNlO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfSkuZmluYWxseSgoKSA9PiBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbm5lY3RXaXRoUmV0cnlBc3luYygpIHtcbiAgICAvLyBUaGlzIGZvci1sb29wIHdpbGwgYnJlYWsgd2hlbiBzb21lb25lIGNhbGwgZW5kKCkgYW5kIGl0IHdpbGwgc2lnbmFsIENvbm5lY3Rpb25TdGF0dXMuRW5kZWQuXG4gICAgZm9yICg7Oykge1xuICAgICAgLy8gQ3JlYXRlIGEgbmV3IHNpZ25hbCBhbmQgd2FpdCBmb3Igc29tZW9uZSBraWNraW5nIG9mZiB0aGUgY29ubmVjdGlvbjpcbiAgICAgIC8vIC0gc3Vic2NyaWJlIHRvIGFjdGl2aXR5JCwgb3I7XG4gICAgICAvLyAtIHJldHJpZXMgZXhoYXVzdGVkIChGYWlsZWRUb0Nvbm5lY3QpLCB0aGVuLCBzb21lb25lIGNhbGwgcmVjb25uZWN0KClcbiAgICAgIGF3YWl0ICh0aGlzLmNvbm5lY3REZWZlcnJlZCA9IGNyZWF0ZURlZmVycmVkKCkpLnByb21pc2U7XG5cbiAgICAgIGxldCBudW1SZXRyaWVzID0gTUFYX1JFVFJZX0NPVU5UO1xuXG4gICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMkLm5leHQoQ29ubmVjdGlvblN0YXR1cy5Db25uZWN0aW5nKTtcblxuICAgICAgd2hpbGUgKG51bVJldHJpZXMgPiAwKSB7XG4gICAgICAgIG51bVJldHJpZXMtLTtcblxuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBUaGlzIHByb21pc2Ugd2lsbCByZWplY3QvcmVzb2x2ZSB3aGVuIGRpc2Nvbm5lY3RlZC5cbiAgICAgICAgICBhd2FpdCB0aGlzLmNvbm5lY3RBc3luYygpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBzb21lb25lIGNhbGwgZW5kKCkgdG8gYnJlYWsgdGhlIGNvbm5lY3Rpb24sIHdlIHdpbGwgbmV2ZXIgbGlzdGVuIHRvIGFueSByZWNvbm5lY3QoKS5cbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvblN0YXR1cyQuZ2V0VmFsdWUoKSA9PT0gQ29ubmVjdGlvblN0YXR1cy5FbmRlZCkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIG9ubHkgcGxhY2UgdGhlIGxvb3AgaW4gdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGJyb2tlLlxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCBzaWduYWwgQ29ubmVjdGlvblN0YXR1cy5Db25uZWN0aW5nIHR3aWNlIG9yIG1vcmUgd2l0aG91dCBhbiBhY3R1YWwgY29ubmVjdGlvbi5cbiAgICAgICAgLy8gU3Vic2VxdWVudCByZXRyaWVzIHNob3VsZCBiZSB0cmFuc3BhcmVudC5cbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvblN0YXR1cyQuZ2V0VmFsdWUoKSAhPT0gQ29ubmVjdGlvblN0YXR1cy5Db25uZWN0aW5nKSB7XG4gICAgICAgICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzJC5uZXh0KENvbm5lY3Rpb25TdGF0dXMuQ29ubmVjdGluZyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGUgY3VycmVudCBjb25uZWN0aW9uIGxhc3RlZCBmb3IgbW9yZSB0aGFuIGEgbWludXRlLCB0aGUgcHJldmlvdXMgY29ubmVjdGlvbiBpcyBnb29kLCB3aGljaCBtZWFuczpcbiAgICAgICAgLy8gLSB3ZSBzaG91bGQgcmVzZXQgdGhlIHJldHJ5IGNvdW50ZXIsIGFuZDtcbiAgICAgICAgLy8gLSB3ZSBzaG91bGQgcmVjb25uZWN0IGltbWVkaWF0ZWx5LlxuICAgICAgICBpZiAoNjAwMDAgPCBEYXRlLm5vdygpIC0gc3RhcnQpIHtcbiAgICAgICAgICBudW1SZXRyaWVzID0gTUFYX1JFVFJZX0NPVU5UO1xuICAgICAgICB9IGVsc2UgaWYgKG51bVJldHJpZXMgPiAwKSB7XG4gICAgICAgICAgLy8gU2xlZXAgb25seSBpZiB3ZSBhcmUgZG9pbmcgcmV0cnkuIE90aGVyd2lzZSwgd2UgYXJlIGdvaW5nIHRvIGJyZWFrIHRoZSBsb29wIGFuZCBzaWduYWwgRmFpbGVkVG9Db25uZWN0LlxuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCB0aGlzLmdldFJldHJ5RGVsYXkoKSkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRPRE86IFtURVNUXSBNYWtlIHN1cmUgRmFpbGVkVG9Db25uZWN0IGlzIHJlcG9ydGVkIGltbWVkaWF0ZWx5IGFmdGVyIGxhc3QgZGlzY29ubmVjdGlvbiwgc2hvdWxkIGJlIG5vIGdldFJldHJ5RGVsYXkoKS5cbiAgICAgIC8vIEZhaWxlZCB0byByZWNvbm5lY3QgYWZ0ZXIgbXVsdGlwbGUgcmV0cmllcy5cbiAgICAgIHRoaXMuY29ubmVjdGlvblN0YXR1cyQubmV4dChDb25uZWN0aW9uU3RhdHVzLkZhaWxlZFRvQ29ubmVjdCk7XG4gICAgfVxuXG4gICAgLy8gTm90ZTogTm8gY29kZSB3aWxsIGhpdCB0aGlzIGxpbmUuXG4gIH1cblxuICAvLyBSZXR1cm5zIHRoZSBkZWxheSBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHNcbiAgcHJpdmF0ZSBnZXRSZXRyeURlbGF5KCkge1xuICAgIHJldHVybiBNYXRoLmZsb29yKDMwMDAgKyBNYXRoLnJhbmRvbSgpICogMTIwMDApO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsSUFBQUEsZ0JBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFdBQUEsR0FB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