chat4app-client-angular 1.0.14 → 1.0.16

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,7 +1,6 @@
1
- import { __awaiter } from "tslib";
2
1
  import { Injectable } from '@angular/core';
3
2
  import { HttpClient, HttpHeaders } from '@angular/common/http';
4
- import { lastValueFrom } from 'rxjs';
3
+ import { Observable } from 'rxjs';
5
4
  import * as NATS from './nats.min.js';
6
5
  import * as i0 from "@angular/core";
7
6
  import * as i1 from "@angular/common/http";
@@ -13,6 +12,7 @@ export class Chat4appClientAngularService {
13
12
  this.chatUrl = "";
14
13
  this.debug = false;
15
14
  this.chatUserExternalId = "";
15
+ this.configId = "";
16
16
  this.timeoutReconnect = 500;
17
17
  }
18
18
  ngOnInit() {
@@ -22,19 +22,33 @@ export class Chat4appClientAngularService {
22
22
  this.chatUrl = chat4AppConfig.endpoint + "/api/v1/";
23
23
  this.debug = chat4AppConfig.debug;
24
24
  }
25
- init(securityChatToken, callback, chatCallback, connectionClientId) {
26
- return __awaiter(this, void 0, void 0, function* () {
27
- if (!this.chatServer || this.chatServer.trim().length == 0) {
28
- throw new Error("Endpoint is empty");
29
- }
30
- if (!securityChatToken || securityChatToken.trim().length == 0) {
31
- throw new Error("SecurityChatToken is empty");
25
+ init(securityChatToken, chatCallback, connectionClientId) {
26
+ return new Observable((subscriber) => {
27
+ try {
28
+ // 1. Validações Iniciais
29
+ if (!this.chatServer || this.chatServer.trim().length === 0) {
30
+ subscriber.error(new Error("Endpoint is empty"));
31
+ return;
32
+ }
33
+ if (!securityChatToken || securityChatToken.trim().length === 0) {
34
+ subscriber.error(new Error("SecurityChatToken is empty"));
35
+ return;
36
+ }
37
+ // 2. Lógica de Negócio
38
+ this.setTokenChat4app(securityChatToken);
39
+ if (chatCallback && connectionClientId) {
40
+ this.chatUserExternalId = connectionClientId;
41
+ this.chatCallback = chatCallback;
42
+ this.connectWebsocket();
43
+ }
44
+ // 3. Emite o token e finaliza o fluxo
45
+ subscriber.next(securityChatToken);
46
+ subscriber.complete();
32
47
  }
33
- this.setTokenChat4app(securityChatToken);
34
- if (chatCallback && connectionClientId) {
35
- yield this.connectWebsocket(chatCallback, connectionClientId);
48
+ catch (err) {
49
+ // Captura erros inesperados e envia para o canal de erro do Observable
50
+ subscriber.error(err);
36
51
  }
37
- callback(securityChatToken);
38
52
  });
39
53
  }
40
54
  getChatUrlDownload(messageFileId) {
@@ -324,182 +338,29 @@ export class Chat4appClientAngularService {
324
338
  setTokenChat4app(chat4AppSessionToken) {
325
339
  window.sessionStorage.setItem("chat4AppSessionToken", chat4AppSessionToken);
326
340
  }
327
- /* Connection */
328
- onMessageFirebaseReceived(data, chatCallback) {
329
- //alert("onMessageReceived connectFirebase");
330
- if (data.type == "msg") {
331
- let chat4appMessage = new Chat4AppMessageReceive();
332
- chat4appMessage.data.chatId = data.chatId;
333
- chat4appMessage.data.chatMessageId = data.chatMessageId;
334
- chat4appMessage.data.externalId = data.externalId;
335
- chat4appMessage.data.fromId = data.fromId;
336
- chat4appMessage.data.toId = data.toId;
337
- chat4appMessage.data.groupId = data.groupId;
338
- chat4appMessage.data.dateHour = data.dateHour;
339
- chat4appMessage.data.type = data.type;
340
- chat4appMessage.notification.body = data.body;
341
- if (data.fileId && data.fileId.length > 0) {
342
- chat4appMessage.data.fileId = data.fileId;
343
- chat4appMessage.data.fileName = data.fileName;
344
- chat4appMessage.data.fileSize = data.fileSize;
345
- chat4appMessage.data.fileType = data.fileType;
346
- }
347
- let datTmp = new Map();
348
- for (let key in data) {
349
- datTmp.set(key, data[key]);
350
- }
351
- chat4appMessage.data.all = datTmp;
352
- chatCallback.onMessage(chat4appMessage);
353
- }
354
- else if ((data.type == "on" || data.type == "off")) {
355
- let chat4appMessage = new Chat4AppMessageReceive();
356
- chat4appMessage.data.chatId = data.chatId;
357
- chat4appMessage.data.chatMessageId = data.chatMessageId;
358
- chat4appMessage.data.externalId = data.externalId;
359
- chat4appMessage.data.fromId = data.fromId;
360
- chat4appMessage.data.toId = data.toId;
361
- chat4appMessage.data.groupId = data.groupId;
362
- chat4appMessage.data.dateHour = data.dateHour;
363
- chat4appMessage.data.type = data.type;
364
- let datTmp = new Map();
365
- for (let key in data) {
366
- datTmp.set(key, data[key]);
367
- }
368
- chat4appMessage.data.all = datTmp;
369
- chatCallback.onOffline(chat4appMessage);
370
- }
371
- else if (data.type == "read") {
372
- let chat4appMessage = new Chat4AppMessageReceive();
373
- chat4appMessage.data.chatId = data.chatId;
374
- chat4appMessage.data.chatMessageId = data.chatMessageId;
375
- chat4appMessage.data.externalId = data.externalId;
376
- chat4appMessage.data.fromId = data.fromId;
377
- chat4appMessage.data.toId = data.toId;
378
- chat4appMessage.data.groupId = data.groupId;
379
- chat4appMessage.data.dateHour = data.dateHour;
380
- chat4appMessage.data.type = data.type;
381
- let datTmp = new Map();
382
- for (let key in data) {
383
- datTmp.set(key, data[key]);
384
- }
385
- chat4appMessage.data.all = datTmp;
386
- chatCallback.onRead(chat4appMessage);
387
- }
388
- else if (data.type == "startTyping" || data.type == "stopTyping") {
389
- let chat4appMessage = new Chat4AppMessageReceive();
390
- chat4appMessage.data.chatId = data.chatId;
391
- chat4appMessage.data.chatMessageId = data.chatMessageId;
392
- chat4appMessage.data.externalId = data.externalId;
393
- chat4appMessage.data.fromId = data.fromId;
394
- chat4appMessage.data.toId = data.toId;
395
- chat4appMessage.data.groupId = data.groupId;
396
- chat4appMessage.data.dateHour = data.dateHour;
397
- chat4appMessage.data.type = data.type;
398
- let datTmp = new Map();
399
- for (let key in data) {
400
- datTmp.set(key, data[key]);
401
- }
402
- chat4appMessage.data.all = datTmp;
403
- chatCallback.onStartStopTyping(chat4appMessage);
404
- }
405
- else if (data.type == "new_user") {
406
- let chat4appMessage = new Chat4AppMessageReceive();
407
- chat4appMessage.data.chatId = data.chatId;
408
- chat4appMessage.data.chatMessageId = data.chatMessageId;
409
- chat4appMessage.data.externalId = data.externalId;
410
- chat4appMessage.data.fromId = data.fromId;
411
- chat4appMessage.data.toId = data.toId;
412
- chat4appMessage.data.groupId = data.groupId;
413
- chat4appMessage.data.dateHour = data.dateHour;
414
- chat4appMessage.data.type = data.type;
415
- let datTmp = new Map();
416
- for (let key in data) {
417
- datTmp.set(key, data[key]);
418
- }
419
- chat4appMessage.data.all = datTmp;
420
- chatCallback.onNewUser(chat4appMessage);
421
- }
422
- else if (data.type == "remove_user") {
423
- let chat4appMessage = new Chat4AppMessageReceive();
424
- chat4appMessage.data.chatId = data.chatId;
425
- chat4appMessage.data.chatMessageId = data.chatMessageId;
426
- chat4appMessage.data.externalId = data.externalId;
427
- chat4appMessage.data.fromId = data.fromId;
428
- chat4appMessage.data.toId = data.toId;
429
- chat4appMessage.data.groupId = data.groupId;
430
- chat4appMessage.data.dateHour = data.dateHour;
431
- chat4appMessage.data.type = data.type;
432
- let datTmp = new Map();
433
- for (let key in data) {
434
- datTmp.set(key, data[key]);
435
- }
436
- chat4appMessage.data.all = datTmp;
437
- chatCallback.onRemoveUser(chat4appMessage);
438
- }
439
- else if (data.type == "chat_closed") {
440
- let chat4appMessage = new Chat4AppMessageReceive();
441
- chat4appMessage.data.chatId = data.chatId;
442
- chat4appMessage.data.chatMessageId = data.chatMessageId;
443
- chat4appMessage.data.externalId = data.externalId;
444
- chat4appMessage.data.fromId = data.fromId;
445
- chat4appMessage.data.toId = data.toId;
446
- chat4appMessage.data.groupId = data.groupId;
447
- chat4appMessage.data.dateHour = data.dateHour;
448
- chat4appMessage.data.type = data.type;
449
- let datTmp = new Map();
450
- for (let key in data) {
451
- datTmp.set(key, data[key]);
452
- }
453
- chat4appMessage.data.all = datTmp;
454
- chatCallback.onChatClosed(chat4appMessage);
455
- }
456
- else if (data.type == "count_notread") {
457
- let chat4appMessage = new Chat4AppMessageReceive();
458
- chat4appMessage.data.chatId = data.chatId;
459
- chat4appMessage.data.chatMessageId = data.chatMessageId;
460
- chat4appMessage.data.externalId = data.externalId;
461
- chat4appMessage.data.fromId = data.fromId;
462
- chat4appMessage.data.toId = data.toId;
463
- chat4appMessage.data.groupId = data.groupId;
464
- chat4appMessage.data.dateHour = data.dateHour;
465
- chat4appMessage.data.type = data.type;
466
- let datTmp = new Map();
467
- for (let key in data) {
468
- datTmp.set(key, data[key]);
469
- }
470
- chat4appMessage.data.all = datTmp;
471
- chatCallback.onCountNotRead(chat4appMessage);
472
- }
473
- }
474
- ensureConn(chatUserExternalId, forceReconnectNats) {
475
- return __awaiter(this, void 0, void 0, function* () {
476
- if (this.debug) {
477
- console.log(`chatServer: ${this.chatServer}`);
478
- console.log(`userId: ${chatUserExternalId}`);
479
- console.log(`getBearerToken: ${this.getBearerToken()}`);
480
- }
481
- const that = this;
482
- let uriStep1 = this.chatServer.replace(/^https/, 'wss');
483
- let server = uriStep1.replace(/(\/\/.*?)\//, '$1\/ws/');
484
- if (this.debug) {
485
- console.log(`ws server: ${server}`);
486
- }
487
- if (forceReconnectNats || !this.nc || (this.nc.isClose && this.nc.isClose())) {
488
- yield that.disconnectInternal(true);
489
- that.nc = yield NATS.connect({ url: server, user: chatUserExternalId, pass: this.getBearerToken(), reconnect: false });
490
- }
491
- this.chatUserExternalId = chatUserExternalId;
492
- return that.nc;
493
- });
494
- }
495
- disconnect() {
496
- return __awaiter(this, void 0, void 0, function* () {
497
- return this.disconnectInternal(false);
498
- });
499
- }
500
- disconnectInternal(ignoreOffLine) {
501
- return __awaiter(this, void 0, void 0, function* () {
502
- // Check how we can disconnect
341
+ ensureConn() {
342
+ if (this.debug) {
343
+ console.log(`chatServer: ${this.chatServer}`);
344
+ console.log(`userId: ${this.chatUserExternalId}`);
345
+ console.log(`getBearerToken: ${this.getBearerToken()}`);
346
+ }
347
+ const that = this;
348
+ let uriStep1 = this.chatServer.replace(/^https/, 'wss');
349
+ let server = uriStep1.replace(/(\/\/.*?)\//, '$1\/ws/');
350
+ if (this.debug) {
351
+ console.log(`ws server: ${server}`);
352
+ }
353
+ that.disconnectInternal(true);
354
+ NATS.connect({ url: server, user: this.chatUserExternalId, pass: this.getBearerToken(), reconnect: false })
355
+ .then((nc) => {
356
+ that.nc = nc;
357
+ const subject = `chat4app.config.${this.configId}.user.${this.chatUserExternalId}`;
358
+ const sub = that.nc.subscribe(subject, (msg) => {
359
+ if (this.debug) {
360
+ console.log(msg);
361
+ }
362
+ this.processAndCallback(JSON.parse(msg.data));
363
+ });
503
364
  if (this.interval) {
504
365
  try {
505
366
  clearInterval(this.interval);
@@ -507,34 +368,68 @@ export class Chat4appClientAngularService {
507
368
  catch (e) {
508
369
  }
509
370
  }
510
- if (!ignoreOffLine && this.nc && this.chatUserExternalId && this.chatUserExternalId.length > 0 && this.getBearerToken() && this.getBearerToken().length > 0) {
511
- try {
512
- yield lastValueFrom(this.setOffLine(this.chatUserExternalId));
513
- if (this.debug)
514
- console.log("had set offline");
515
- }
516
- catch (e) {
517
- if (this.debug)
518
- console.error("Erro ao setar offline", e);
371
+ that.interval = setInterval(() => {
372
+ if (that.debug) {
373
+ console.log(`publish chat4app.user.online ${this.chatUserExternalId} `);
519
374
  }
520
- }
521
- if (this.nc) {
522
375
  try {
523
- yield this.nc.close();
376
+ that.nc.publish(`chat4app.user.online`, this.chatUserExternalId);
524
377
  }
525
378
  catch (e) {
526
379
  if (this.debug) {
527
- console.error(e);
380
+ console.log("try reconnect...");
528
381
  }
382
+ this.ensureConn();
529
383
  }
530
- this.nc = undefined;
531
- }
384
+ }, 1000);
532
385
  if (this.debug) {
533
- console.log("disconect");
386
+ console.log(`Subscribe online chat4app.user.${this.chatUserExternalId}.online`);
534
387
  }
388
+ })
389
+ .catch((err) => {
390
+ // Notifica o chamador sobre o erro na conexão
391
+ console.error("NATS Error:", err);
535
392
  });
536
393
  }
537
- processAndCallback(msgObj, chatCallback) {
394
+ disconnect() {
395
+ return this.disconnectInternal(false);
396
+ }
397
+ disconnectInternal(ignoreOffLine) {
398
+ // Check how we can disconnect
399
+ if (this.interval) {
400
+ try {
401
+ clearInterval(this.interval);
402
+ }
403
+ catch (e) {
404
+ }
405
+ }
406
+ if (!ignoreOffLine && this.nc && this.chatUserExternalId && this.chatUserExternalId.length > 0 && this.getBearerToken() && this.getBearerToken().length > 0) {
407
+ try {
408
+ this.setOffLine(this.chatUserExternalId).toPromise();
409
+ if (this.debug)
410
+ console.log("had set offline");
411
+ }
412
+ catch (e) {
413
+ if (this.debug)
414
+ console.error("Erro ao setar offline", e);
415
+ }
416
+ }
417
+ if (this.nc) {
418
+ try {
419
+ this.nc.close();
420
+ }
421
+ catch (e) {
422
+ if (this.debug) {
423
+ console.error(e);
424
+ }
425
+ }
426
+ this.nc = undefined;
427
+ }
428
+ if (this.debug) {
429
+ console.log("disconect");
430
+ }
431
+ }
432
+ processAndCallback(msgObj) {
538
433
  if (this.debug && msgObj) {
539
434
  console.log("Msg Received: " + JSON.stringify(msgObj));
540
435
  }
@@ -545,92 +440,45 @@ export class Chat4appClientAngularService {
545
440
  }
546
441
  msgObj.data.all = datTmp;
547
442
  if (msgObj.data.type == "msg") {
548
- chatCallback.onMessage(msgObj);
443
+ this.chatCallback.onMessage(msgObj);
549
444
  }
550
445
  else if ((msgObj.data.type == "on" || msgObj.data.type == "off")) {
551
- chatCallback.onOffline(msgObj);
446
+ this.chatCallback.onOffline(msgObj);
552
447
  }
553
448
  else if (msgObj.data.type == "read") {
554
- chatCallback.onRead(msgObj);
449
+ this.chatCallback.onRead(msgObj);
555
450
  }
556
451
  else if (msgObj.data.type == "startTyping" || msgObj.data.type == "stopTyping") {
557
- chatCallback.onStartStopTyping(msgObj);
452
+ this.chatCallback.onStartStopTyping(msgObj);
558
453
  }
559
454
  else if (msgObj.data.type == "new_user") {
560
- chatCallback.onNewUser(msgObj);
455
+ this.chatCallback.onNewUser(msgObj);
561
456
  }
562
457
  else if (msgObj.data.type == "remove_user") {
563
- chatCallback.onRemoveUser(msgObj);
458
+ this.chatCallback.onRemoveUser(msgObj);
564
459
  }
565
460
  else if (msgObj.data.type == "chat_closed") {
566
- chatCallback.onChatClosed(msgObj);
461
+ this.chatCallback.onChatClosed(msgObj);
567
462
  }
568
463
  else if (msgObj.data.type == "count_notread") {
569
- chatCallback.onCountNotRead(msgObj);
464
+ this.chatCallback.onCountNotRead(msgObj);
570
465
  }
571
466
  //}
572
467
  }
573
- connectWebsocket(chatCallback, userId) {
574
- return __awaiter(this, void 0, void 0, function* () {
575
- const that = this;
576
- this.disconnectInternal(true);
577
- let securityToken = this.getBearerToken();
578
- let tokenAuth = "";
579
- if (securityToken && securityToken.startsWith("Bearer ")) {
580
- tokenAuth = securityToken;
581
- }
582
- else {
583
- tokenAuth = "Bearer " + securityToken;
584
- }
585
- const configId = this.chatServer.split("/")[3];
586
- const nc = yield this.ensureConn(userId);
587
- //TODO Get the user id from jwt
588
- const subject = `chat4app.config.${configId}.user.${userId}`;
589
- const sub = nc.subscribe(subject, (msg) => {
590
- if (this.debug) {
591
- console.log(msg);
592
- }
593
- this.processAndCallback(JSON.parse(msg.data), chatCallback);
594
- });
595
- if (this.interval) {
596
- try {
597
- clearInterval(this.interval);
598
- }
599
- catch (e) {
600
- }
601
- }
602
- that.interval = setInterval(() => {
603
- if (that.debug) {
604
- console.log(`publish chat4app.user.online ${userId} `);
605
- }
606
- try {
607
- that.nc.publish(`chat4app.user.online`, userId);
608
- }
609
- catch (e) {
610
- if (this.debug) {
611
- console.log("try reconnect...");
612
- }
613
- this.ensureConn(userId, true);
614
- }
615
- }, 1000);
616
- if (this.debug) {
617
- console.log(`Subscribe online chat4app.user.${userId}.online`);
618
- }
619
- });
620
- }
621
- /*
622
- disconnect() {
623
- // console.log("disconnect")
624
- try {
625
- if (this.stompClient) {
626
- this.stompClient.disconnect();
468
+ connectWebsocket() {
469
+ const that = this;
470
+ this.disconnectInternal(true);
471
+ let securityToken = this.getBearerToken();
472
+ let tokenAuth = "";
473
+ if (securityToken && securityToken.startsWith("Bearer ")) {
474
+ tokenAuth = securityToken;
627
475
  }
628
-
629
- } catch (e) {
630
- console.log(e);
631
- }
476
+ else {
477
+ tokenAuth = "Bearer " + securityToken;
478
+ }
479
+ this.configId = this.chatServer.split("/")[3];
480
+ this.ensureConn();
632
481
  }
633
- */
634
482
  convertChat4AppMessageReceiveToChatMessage4App(msg) {
635
483
  var _a;
636
484
  let message = new ChatMessage4App();
@@ -728,4 +576,4 @@ export var GroupStatus4App;
728
576
  GroupStatus4App["CREATED"] = "CREATED";
729
577
  GroupStatus4App["CLOSED"] = "REMOVED";
730
578
  })(GroupStatus4App || (GroupStatus4App = {}));
731
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdDRhcHAtY2xpZW50LWFuZ3VsYXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NoYXQ0YXBwLWNsaWVudC1hbmd1bGFyL3NyYy9saWIvY2hhdDRhcHAtY2xpZW50LWFuZ3VsYXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxhQUFhLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDakQsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7OztBQUd0Qyw0QkFBNEI7QUFLNUIsTUFBTSxPQUFPLDRCQUE0QjtJQWFyQyxZQUFxQixJQUFnQjtRQUFoQixTQUFJLEdBQUosSUFBSSxDQUFZO1FBVHJDLGVBQVUsR0FBRyxFQUFFLENBQUM7UUFDaEIsWUFBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLFVBQUssR0FBRyxLQUFLLENBQUM7UUFDZCx1QkFBa0IsR0FBRyxFQUFFLENBQUM7UUFFeEIscUJBQWdCLEdBQUcsR0FBRyxDQUFDO0lBTXZCLENBQUM7SUFDRCxRQUFRO0lBQ1IsQ0FBQztJQUVELE1BQU0sQ0FBQyxjQUE4QjtRQUNuQyxJQUFJLENBQUMsVUFBVSxHQUFHLGNBQWMsQ0FBQyxRQUFRLENBQUM7UUFDMUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxjQUFjLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBRTtRQUNyRCxJQUFJLENBQUMsS0FBSyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUM7SUFDcEMsQ0FBQztJQUVLLElBQUksQ0FBQyxpQkFBeUIsRUFBRSxRQUFhLEVBQUUsWUFBNEIsRUFBRSxrQkFBMkI7O1lBRTFHLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxVQUFV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SyxDQUFVO0lBRTNELENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxpQkFBaUI7Q0FPN0I7QUFFRCxNQUFNLE9BQU8sWUFBWTtDQVV4QjtBQUdELE1BQU0sQ0FBTixJQUFZLGNBSVg7QUFKRCxXQUFZLGNBQWM7SUFDeEIscUNBQW1CLENBQUE7SUFDbkIsbUNBQWlCLENBQUE7QUFFbkIsQ0FBQyxFQUpXLGNBQWMsS0FBZCxjQUFjLFFBSXpCO0FBQ0QsTUFBTSxDQUFOLElBQVksa0JBR1g7QUFIRCxXQUFZLGtCQUFrQjtJQUM1Qix5Q0FBbUIsQ0FBQTtBQUVyQixDQUFDLEVBSFcsa0JBQWtCLEtBQWxCLGtCQUFrQixRQUc3QjtBQUNELE1BQU0sQ0FBTixJQUFZLGNBR1g7QUFIRCxXQUFZLGNBQWM7SUFDeEIsdUVBQWtCLENBQUE7SUFDbEIsbUVBQWdCLENBQUE7QUFDbEIsQ0FBQyxFQUhXLGNBQWMsS0FBZCxjQUFjLFFBR3pCO0FBRUQsTUFBTSxDQUFOLElBQVksZUFHWDtBQUhELFdBQVksZUFBZTtJQUN6QixzQ0FBbUIsQ0FBQTtJQUNuQixxQ0FBa0IsQ0FBQTtBQUNwQixDQUFDLEVBSFcsZUFBZSxLQUFmLGVBQWUsUUFHMUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEhlYWRlcnMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IGxhc3RWYWx1ZUZyb20sIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0ICogYXMgTkFUUyBmcm9tICcuL25hdHMubWluLmpzJztcclxuXHJcblxyXG4vL2RlY2xhcmUgbGV0IG5hdHNfbWluOiBhbnk7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDaGF0NGFwcENsaWVudEFuZ3VsYXJTZXJ2aWNlIGltcGxlbWVudHMgT25Jbml0ICB7XHJcblxyXG4gICAgbmM6IGFueTtcclxuXHJcbiAgICBjaGF0U2VydmVyID0gXCJcIjtcclxuICAgIGNoYXRVcmwgPSBcIlwiO1xyXG4gICAgZGVidWcgPSBmYWxzZTtcclxuICAgIGNoYXRVc2VyRXh0ZXJuYWxJZCA9IFwiXCI7XHJcbiAgICBcclxuICAgIHRpbWVvdXRSZWNvbm5lY3QgPSA1MDA7XHJcblxyXG4gICAgaW50ZXJ2YWw7XHJcblxyXG4gICAgY29uc3RydWN0b3IoIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCkge1xyXG4gIFxyXG4gICAgfVxyXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB9XHJcblxyXG4gICAgY29uZmlnKGNoYXQ0QXBwQ29uZmlnOiBDaGF0NEFwcENvbmZpZykge1xyXG4gICAgICB0aGlzLmNoYXRTZXJ2ZXIgPSBjaGF0NEFwcENvbmZpZy5lbmRwb2ludDtcclxuICAgICAgdGhpcy5jaGF0VXJsID0gY2hhdDRBcHBDb25maWcuZW5kcG9pbnQgKyBcIi9hcGkvdjEvXCIgO1xyXG4gICAgICB0aGlzLmRlYnVnID0gY2hhdDRBcHBDb25maWcuZGVidWc7XHJcbiAgICB9XHJcbiAgXHJcbiAgICBhc3luYyBpbml0KHNlY3VyaXR5Q2hhdFRva2VuOiBzdHJpbmcsIGNhbGxiYWNrOiBhbnksIGNoYXRDYWxsYmFjaz86IElDaGF0Q2FsbGJhY2ssIGNvbm5lY3Rpb25DbGllbnRJZD86IHN0cmluZykge1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuY2hhdFNlcnZlciB8fCB0aGlzLmNoYXRTZXJ2ZXIudHJpbSgpLmxlbmd0aCA9PSAwKXtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVuZHBvaW50IGlzIGVtcHR5XCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXNlY3VyaXR5Q2hhdFRva2VuIHx8IHNlY3VyaXR5Q2hhdFRva2VuLnRyaW0oKS5sZW5ndGggPT0gMCl7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTZWN1cml0eUNoYXRUb2tlbiBpcyBlbXB0eVwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2V0VG9rZW5DaGF0NGFwcChzZWN1cml0eUNoYXRUb2tlbik7XHJcbiAgXHJcbiAgICAgICAgaWYgKGNoYXRDYWxsYmFjayAmJiBjb25uZWN0aW9uQ2xpZW50SWQpIHtcclxuICAgICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdFdlYnNvY2tldChjaGF0Q2FsbGJhY2ssIGNvbm5lY3Rpb25DbGllbnRJZCk7XHJcbiAgICAgICAgfSBcclxuICAgICAgICBjYWxsYmFjayhzZWN1cml0eUNoYXRUb2tlbik7XHJcbiAgICB9XHJcbiAgXHJcbiAgICBnZXRDaGF0VXJsRG93bmxvYWQobWVzc2FnZUZpbGVJZDogc3RyaW5nKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNoYXRVcmwgKyBcImNoYXRtZXNzYWdlL2dldEZpbGU/bWVzc2FnZUZpbGVJZD1cIiArIG1lc3NhZ2VGaWxlSWQgKyBcIiZ0b2tlbj1cIiArIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKTtcclxuICAgIH1cclxuICBcclxuICBcclxuICAgIGdldE1lc3NhZ2VDaGF0KGNoYXRJZDogc3RyaW5nLCBmcm9tSWQ6IHN0cmluZywgdG9JZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxBcnJheTxDaGF0TWVzc2FnZTRBcHA+PiB7XHJcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImNoYXRtZXNzYWdlL1wiICsgY2hhdElkICsgXCIvXCIgKyBmcm9tSWQgKyBcIi9cIiArIHRvSWQ7XHJcbiAgXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEFycmF5PENoYXRNZXNzYWdlNEFwcD4+KHVybCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXHJcbiAgICAgICAgfSlcclxuICBcclxuICAgIH1cclxuICAgIGdldE1lc3NhZ2VDaGF0QnlHcm9wKGNoYXRJZDogc3RyaW5nLCBncm91cElkOiBzdHJpbmcsIGZyb21JZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxBcnJheTxDaGF0TWVzc2FnZTRBcHA+PiB7XHJcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImNoYXRtZXNzYWdlL2J5R3JvdXAvXCIgKyBjaGF0SWQgKyBcIi9cIiArIGdyb3VwSWQgKyBcIi9cIiArIGZyb21JZDtcclxuICBcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8QXJyYXk8Q2hhdE1lc3NhZ2U0QXBwPj4odXJsLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcclxuICAgICAgICB9KVxyXG4gIFxyXG4gICAgfVxyXG4gIFxyXG4gIFxyXG4gICAgYWRkTWVzc2FnZUNoYXQoY2hhdE1lc3NhZ2U0QXBwOiBDaGF0TWVzc2FnZTRBcHApOiBPYnNlcnZhYmxlPENoYXRNZXNzYWdlNEFwcD4ge1xyXG4gICAgICBsZXQgdXJsID0gdGhpcy5jaGF0VXJsICsgXCJjaGF0bWVzc2FnZS9cIiArIGNoYXRNZXNzYWdlNEFwcC5jaGF0SWQ7XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8Q2hhdE1lc3NhZ2U0QXBwPih1cmwsIGNoYXRNZXNzYWdlNEFwcCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXHJcbiAgICAgICAgfSlcclxuICBcclxuICAgIH1cclxuICAgIC8qXHJcbiAgICBwcm9wcyhjaGF0RmlsdGVyUmVxdWVzdDRBcHA6IEFycmF5PENoYXRGaWx0ZXJSZXF1ZXN0NEFwcD4pOiBPYnNlcnZhYmxlPENoYXRVc2VyUmVzcG9uc2U0QXBwW10+IHtcclxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdG1lc3NhZ2UvcHJvcHNcIjtcclxuICBcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PENoYXRVc2VyUmVzcG9uc2U0QXBwW10+KHVybCwgY2hhdEZpbHRlclJlcXVlc3Q0QXBwLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcclxuICAgICAgICB9KVxyXG4gIFxyXG4gICAgfVxyXG4gICAgKi8gICAgXHJcbiAgXHJcbiAgXHJcbiAgICByZW1vdmVVc2Vyc0NoYXQoY2hhdElkOiBzdHJpbmcsIGNoYXRVc2Vyc0lkPzogc3RyaW5nW10sIGNoYXRVc2Vyc0V4dGVybmFsSWQ/OiBzdHJpbmdbXSk6IE9ic2VydmFibGU8Q2hhdFVzZXI0QXBwW10+IHtcclxuICAgICAgbGV0IHBhcmFtcyA9IG5ldyBBcnJheSgpO1xyXG4gICAgICBpZiAoY2hhdFVzZXJzSWQgJiYgY2hhdFVzZXJzSWQubGVuZ3RoID4gMCkge1xyXG4gIFxyXG4gICAgICAgIGNoYXRVc2Vyc0lkLmZvckVhY2goY3VpID0+IHtcclxuICAgICAgICAgIHBhcmFtcy5wdXNoKFwiY2hhdFVzZXJJZD1cIiArIGN1aSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoY2hhdFVzZXJzRXh0ZXJuYWxJZCAmJiBjaGF0VXNlcnNFeHRlcm5hbElkLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjaGF0VXNlcnNFeHRlcm5hbElkLmZvckVhY2goY3VlaSA9PiB7XHJcbiAgICAgICAgICBwYXJhbXMucHVzaChcImNoYXRVc2VyRXh0ZXJuYWxJZD1cIiArIGN1ZWkpO1xyXG4gICAgICAgIH0pXHJcbiAgXHJcbiAgICAgIH1cclxuICBcclxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdHVzZXIvXCIgKyBjaGF0SWQgKyBcIj9cIiArIHBhcmFtcy5qb2luKFwiJlwiKTtcclxuICBcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5kZWxldGU8Q2hhdFVzZXI0QXBwW10+KHVybCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuICBcclxuICAgIHJlbW92ZVVzZXJDaGF0KGNoYXRJZDogc3RyaW5nLCBjaGF0VXNlcklkPzogc3RyaW5nLCBjaGF0VXNlckV4dGVybmFsSWQ/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPENoYXRVc2VyNEFwcD4ge1xyXG4gICAgICBsZXQgcGFyYW0gPSBcIlwiO1xyXG4gICAgICBpZiAoY2hhdFVzZXJJZCkge1xyXG4gICAgICAgIHBhcmFtID0gXCJjaGF0VXNlcklkPVwiICsgY2hhdFVzZXJJZDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBwYXJhbSA9IFwiY2hhdFVzZXJFeHRlcm5hbElkPVwiICsgY2hhdFVzZXJFeHRlcm5hbElkO1xyXG4gICAgICB9XHJcbiAgXHJcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImNoYXR1c2VyL1wiICsgY2hhdElkICsgXCI/XCIgKyBwYXJhbTtcclxuICBcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5kZWxldGU8Q2hhdFVzZXI0QXBwPih1cmwsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbiAgXHJcbiAgICB1cGRhdGVVc2VyQ2hhdChjaGF0SWQ6IHN0cmluZywgY2hhclVzZXI0QXBwVXBkYXRlOiBDaGF0VXNlcjRBcHApOiBPYnNlcnZhYmxlPENoYXRVc2VyNEFwcD4ge1xyXG4gIFxyXG4gICAgICBsZXQgdXJsID0gdGhpcy5jaGF0VXJsICsgXCJjaGF0dXNlci9cIiArIGNoYXRJZDtcclxuICBcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8Q2hhdFVzZXI0QXBwPih1cmwsIGNoYXJVc2VyNEFwcFVwZGF0ZSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuICBcclxuICBcclxuICAgIGNyZWF0ZVVzZXJDaGF0KGNoYXRJZDogc3RyaW5nLCBjaGF0VXNlcjRBcHA6IENoYXRVc2VyNEFwcCk6IE9ic2VydmFibGU8Q2hhdFVzZXI0QXBwPiB7XHJcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImNoYXR1c2VyL1wiICsgY2hhdElkO1xyXG4gIFxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8Q2hhdFVzZXI0QXBwPih1cmwsIGNoYXRVc2VyNEFwcCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuICBcclxuICAgIGNyZWF0ZVVzZXJzQ2hhdChjaGF0SWQ6IHN0cmluZywgY2hhdFVzZXI0QXBwOiBDaGF0VXNlcjRBcHBbXSk6IE9ic2VydmFibGU8Q2hhdFVzZXI0QXBwW10+IHtcclxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdHVzZXIvdXNlcnMvXCIgKyBjaGF0SWQ7XHJcbiAgXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxDaGF0VXNlcjRBcHBbXT4odXJsLCBjaGF0VXNlcjRBcHAsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbiAgXHJcbiAgXHJcbiAgICBjcmVhdGVDaGF0KGNoYXQ0YXBwOiBDaGF0NEFwcCk6IE9ic2VydmFibGU8Q2hhdDRBcHA+IHtcclxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdFwiO1xyXG4gIFxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8Q2hhdDRBcHA+KHVybCwgY2hhdDRhcHAsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBjcmVhdGVVcGRhdGVDaGF0KGNoYXQ0YXBwOiBDaGF0NEFwcCk6IE9ic2VydmFibGU8Q2hhdDRBcHA+IHtcclxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdFwiO1xyXG4gIFxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxDaGF0NEFwcD4odXJsLCBjaGF0NGFwcCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuICBcclxuICAgIC8qXHJcbiAgICBnZXRMYXN0TWVzc2FnZUdyb3VwKGNoYXRFeHRlcm5hbElkOiBzdHJpbmcsIGdyb3VwSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8Q2hhdFVzZXJSZXNwb25zZTRBcHA+IHtcclxuICBcclxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdG1lc3NhZ2UvbGFzdE1lc3NhZ2VHcm91cD9jaGF0RXh0ZXJuYWxJZD1cIiArIGNoYXRFeHRlcm5hbElkICsgXCImZ3JvdXBJZD1cIiArIGdyb3VwSWQ7XHJcbiAgXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PENoYXRVc2VyUmVzcG9uc2U0QXBwPih1cmwsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBnZXRMYXN0TWVzc2FnZShjaGF0RXh0ZXJuYWxJZDogc3RyaW5nLCBjaGF0VXNlckV4dGVybmFsSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8Q2hhdFVzZXJSZXNwb25zZTRBcHA+IHtcclxuICBcclxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdG1lc3NhZ2UvbGFzdE1lc3NhZ2U/Y2hhdEV4dGVybmFsSWQ9XCIgKyBjaGF0RXh0ZXJuYWxJZCArIFwiJmNoYXRVc2VyRXh0ZXJuYWxJZD1cIiArIGNoYXRVc2VyRXh0ZXJuYWxJZDtcclxuICBcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8Q2hhdFVzZXJSZXNwb25zZTRBcHA+KHVybCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuICAgICAgICBcclxuICAgIGNvdW50Tm90UmVhZE1lc3NhZ2VzKGNoYXRVc2VyRXh0ZXJuYWxJZDogc3RyaW5nLCBjaGF0RXh0ZXJuYWxJZD86IHN0cmluZywgZ3JvdXBJZD86IHN0cmluZywgZnJvbUlkPzpzdHJpbmcpOiBPYnNlcnZhYmxlPENoYXRVc2VyUmVzcG9uc2U0QXBwPiB7XHJcbiAgXHJcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImNoYXRtZXNzYWdlL2NvdW50Tm90UmVhZE1lc3NhZ2VzP2NoYXRVc2VyRXh0ZXJuYWxJZD1cIiArIGNoYXRVc2VyRXh0ZXJuYWxJZDtcclxuICBcclxuICAgICAgaWYgKGNoYXRFeHRlcm5hbElkICYmIGNoYXRFeHRlcm5hbElkLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB1cmwgKz0gXCImY2hhdEV4dGVybmFsSWQ9XCIgKyBjaGF0RXh0ZXJuYWxJZDtcclxuICAgICAgfVxyXG4gIFxyXG4gICAgICBpZiAoZ3JvdXBJZCAmJiBncm91cElkLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB1cmwgKz0gXCImZ3JvdXBJZD1cIiArIGdyb3VwSWQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChmcm9tSWQgJiYgZnJvbUlkLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB1cmwgKz0gXCImZnJvbUlkPVwiICsgZ3JvdXBJZDtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8Q2hhdFVzZXJSZXNwb25zZTRBcHA+KHVybCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuICAgICovXHJcbiAgXHJcbiAgICBnZXRDaGF0QnlFeHRlcm5hbElkKGV4dGVybmFsSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8Q2hhdDRBcHA+IHtcclxuICBcclxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdD9leHRlcm5hbElkPVwiICsgZXh0ZXJuYWxJZDtcclxuICBcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8Q2hhdDRBcHA+KHVybCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBnZXRDaGF0QnlJZChpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxDaGF0NEFwcD4ge1xyXG4gIFxyXG4gICAgICBsZXQgdXJsID0gdGhpcy5jaGF0VXJsICsgXCJjaGF0P2NoYXRJZD1cIiArIGlkO1xyXG4gIFxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxDaGF0NEFwcD4odXJsLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGxpc3RDaGF0QnlVc2VyKGV4dGVybmFsVXNlcklkOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nLCBjaGF0U3RhdHVzOiBDaGF0U3RhdHVzNEFwcCApOiBPYnNlcnZhYmxlPEFycmF5PCBDaGF0NEFwcD4+IHtcclxuICBcclxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdC9saXN0Q2hhdEJ5VXNlci8/ZXh0ZXJuYWxVc2VySWQ9XCIgKyBleHRlcm5hbFVzZXJJZCBcclxuICAgICAgKyBcIiZ1c2VySWQ9XCIgKyB1c2VySWRcclxuICAgICAgKyBcIiZjaGF0U3RhdHVzPVwiICsgY2hhdFN0YXR1cztcclxuICBcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8QXJyYXk8Q2hhdDRBcHA+Pih1cmwsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgY2xvc2VDaGF0KGNoYXRJZDogc3RyaW5nLCBjaGF0RXh0ZXJuYWxJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgXHJcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgO1xyXG5cclxuICAgICAgaWYgKGNoYXRJZCAmJiBjaGF0SWQubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgdXJsKz0gXCJjaGF0P2NoYXRJZD1cIiArIGNoYXRJZDsgXHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIGlmIChjaGF0RXh0ZXJuYWxJZCAmJiBjaGF0RXh0ZXJuYWxJZC5sZW5ndGggPiAwKXtcclxuICAgICAgICB1cmwrPSBcImNoYXQ/ZXh0ZXJuYWxJZD1cIiArIGNoYXRFeHRlcm5hbElkOyBcclxuICAgICAgfVxyXG4gIFxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmRlbGV0ZTx2b2lkPih1cmwsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgcmVhZE1lc3NhZ2UoY2hhdE1lc3NhZ2VJZDogc3RyaW5nLCB0b0lkPzogc3RyaW5nKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgXHJcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImNoYXRtZXNzYWdlL3JlYWQvXCIgKyBjaGF0TWVzc2FnZUlkO1xyXG4gIFxyXG4gICAgICBpZiAodG9JZCAmJiB0b0lkLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB1cmwgKz0gXCIvXCIgKyB0b0lkO1xyXG4gICAgICB9XHJcbiAgXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucHV0PHZvaWQ+KHVybCwgbnVsbCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuICAgIG9ubGluZShjaGF0SWQ6IHN0cmluZyk6IE9ic2VydmFibGU8bnVtYmVyPiB7XHJcbiAgXHJcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImNoYXRtZXNzYWdlL29ubGluZS9cIiArIGNoYXRJZCA7XHJcbiAgXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PG51bWJlcj4odXJsLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG4gICAgc2V0T2ZmTGluZShjaGF0VXNlckV4dGVybmFsSWRJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcclxuICBcclxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdG1lc3NhZ2Uvc2V0LW9mZmxpbmUvXCIgKyBjaGF0VXNlckV4dGVybmFsSWRJZCA7XHJcbiAgXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucHV0PG51bWJlcj4odXJsLCBudWxsLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBzZW5kRmlsZShjaGF0SWQ6IHN0cmluZywgZnJvbUlkOiBzdHJpbmcsIHRvSWQ6IHN0cmluZywgZmlsZVRvVXBsb2FkOiBGaWxlKTogT2JzZXJ2YWJsZTxDaGF0TWVzc2FnZUZpbGU0QXBwPiB7XHJcbiAgICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5jaGF0VXJsICsgXCJjaGF0bWVzc2FnZS9zZW5kRmlsZS9cIiArIGNoYXRJZCArIFwiL1wiICsgZnJvbUlkICsgXCIvXCIgKyB0b0lkO1xyXG4gIFxyXG4gICAgICBjb25zdCBmb3JtRGF0YTogRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcclxuICAgICAgZm9ybURhdGEuYXBwZW5kKCdmaWxlJywgZmlsZVRvVXBsb2FkKTtcclxuICBcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cFxyXG4gICAgICAgIC5wb3N0PENoYXRNZXNzYWdlRmlsZTRBcHA+KGVuZHBvaW50LCBmb3JtRGF0YSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxyXG4gICAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgXHJcbiAgICBzZW5kRmlsZUdyb3VwKGNoYXRJZDogc3RyaW5nLCBmcm9tSWQ6IHN0cmluZywgZ3JvdXBJZDogc3RyaW5nLCBmaWxlVG9VcGxvYWQ6IEZpbGUpOiBPYnNlcnZhYmxlPENoYXRNZXNzYWdlRmlsZTRBcHA+IHtcclxuICAgICAgY29uc3QgZW5kcG9pbnQgPSB0aGlzLmNoYXRVcmwgKyBcImNoYXRtZXNzYWdlL3NlbmRGaWxlR3JvdXAvXCIgKyBjaGF0SWQgKyBcIi9cIiArIGZyb21JZCArIFwiL1wiICsgZ3JvdXBJZDtcclxuICBcclxuICAgICAgY29uc3QgZm9ybURhdGE6IEZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XHJcbiAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIGZpbGVUb1VwbG9hZCk7XHJcbiAgXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHBcclxuICAgICAgICAucG9zdDxDaGF0TWVzc2FnZUZpbGU0QXBwPihlbmRwb2ludCwgZm9ybURhdGEsXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcclxuICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLypcclxuICAgIHRyYW5zbGF0ZU1lc3NhZ2UoY2hhdE1lc3NhZ2VJZDogc3RyaW5nLCBsYW5ndWFnZVRhcmdldDogc3RyaW5nKTogT2JzZXJ2YWJsZTxDaGF0NEFwcFRyYW5zbGF0ZT4ge1xyXG4gIFxyXG4gICAgICBsZXQgdXJsID0gdGhpcy5jaGF0VXJsICsgXCJjaGF0bWVzc2FnZS90cmFuc2xhdGUvXCIgKyBjaGF0TWVzc2FnZUlkICsgXCIvXCIgKyBsYW5ndWFnZVRhcmdldDtcclxuICBcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8Q2hhdDRBcHBUcmFuc2xhdGU+KHVybCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuICAgICovXHJcblxyXG4gICAgc3RhcnRUeXBpbmcoY2hhdElkOiBzdHJpbmcsZnJvbUlkOiBzdHJpbmcsIHRvSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8dm9pZD4ge1xyXG4gIFxyXG4gICAgICBsZXQgdXJsID0gdGhpcy5jaGF0VXJsICsgXCJjaGF0bWVzc2FnZS9zdGFydFR5cGluZy9cIiArIGNoYXRJZCArIFwiL1wiICsgZnJvbUlkICsgXCIvXCIgKyB0b0lkO1xyXG4gIFxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnB1dDx2b2lkPih1cmwsIG51bGwsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgc3RhcnRUeXBpbmdHcm91cChjaGF0SWQ6IHN0cmluZyxmcm9tSWQ6IHN0cmluZywgZ3JvdXBJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgXHJcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImNoYXRtZXNzYWdlL3N0YXJ0VHlwaW5nR3JvdXAvXCIgKyBjaGF0SWQgKyBcIi9cIiArIGZyb21JZCArIFwiL1wiICsgZ3JvdXBJZDtcclxuICBcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8dm9pZD4odXJsLCBudWxsLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG4gICAgc3RvcFR5cGluZyhjaGF0SWQ6IHN0cmluZyxmcm9tSWQ6IHN0cmluZywgdG9JZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgXHJcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImNoYXRtZXNzYWdlL3N0b3BUeXBpbmcvXCIgKyBjaGF0SWQgKyBcIi9cIiArIGZyb21JZCArIFwiL1wiICsgdG9JZDtcclxuICBcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8dm9pZD4odXJsLCBudWxsLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIHN0b3BUeXBpbmdHcm91cChjaGF0SWQ6IHN0cmluZyxmcm9tSWQ6IHN0cmluZywgZ3JvdXBJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgXHJcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImNoYXRtZXNzYWdlL3N0b3BUeXBpbmdHcm91cC9cIiArIGNoYXRJZCArIFwiL1wiICsgZnJvbUlkICsgXCIvXCIgKyBncm91cElkO1xyXG4gIFxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnB1dDx2b2lkPih1cmwsIG51bGwsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlR3JvdXAoZ3JvdXA6IENoYXRHcm91cEFwcCk6IE9ic2VydmFibGU8Q2hhdEdyb3VwQXBwPiB7XHJcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImdyb3VwXCI7XHJcbiAgXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxDaGF0R3JvdXBBcHA+KHVybCwgZ3JvdXAsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBnZXRHcm91cChjaGF0SWQ6IHN0cmluZywgZ3JvdXBJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxDaGF0R3JvdXBBcHA+IHtcclxuICBcclxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiZ3JvdXAvXCIgKyBncm91cElkICsgXCIvXCIgKyBjaGF0SWQ7XHJcbiAgXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PENoYXRHcm91cEFwcD4odXJsLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGxpc3RHcm91cHMoY2hhdElkPzogc3RyaW5nLCBleHRlcm5hbElkPzogc3RyaW5nKTogT2JzZXJ2YWJsZTxBcnJheTxDaGF0R3JvdXBBcHA+PiB7XHJcbiAgXHJcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImdyb3VwL1wiIDtcclxuXHJcbiAgICAgIGlmIChjaGF0SWQgJiYgY2hhdElkLmxlbmd0aD4wKSB7XHJcbiAgICAgICAgdXJsICs9IFwiJmNoYXRJZD1cIiArIGNoYXRJZDtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZXh0ZXJuYWxJZCAmJiBleHRlcm5hbElkLmxlbmd0aD4wKSB7XHJcbiAgICAgICAgdXJsICs9IFwiJmV4dGVybmFsSWQ9XCIgKyBleHRlcm5hbElkO1xyXG4gICAgICB9XHJcbiAgXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEFycmF5PENoYXRHcm91cEFwcD4+KHVybCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBsaXN0RmlsZXNHcm91cChjaGF0SWQ6IHN0cmluZywgZ3JvdXBJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxBcnJheTxDaGF0TWVzc2FnZUZpbGU0QXBwPj4ge1xyXG4gIFxyXG4gICAgICBsZXQgdXJsID0gdGhpcy5jaGF0VXJsICsgXCJncm91cC9cIiArIGNoYXRJZCA7XHJcblxyXG4gICAgICBpZiAoZ3JvdXBJZCAmJiBncm91cElkLmxlbmd0aD4wKSB7XHJcbiAgICAgICAgdXJsICs9IFwiJmdyb3VwSWQ9XCIgKyBjaGF0SWQ7XHJcbiAgICAgIH1cclxuICBcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8QXJyYXk8Q2hhdE1lc3NhZ2VGaWxlNEFwcD4+KHVybCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBldmVudChldmVudE5hbWU6IHN0cmluZywgY2hhdFVzZXJFeHRlcm5hbElkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICBcclxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiZXZlbnQvXCIgKyBldmVudE5hbWUgKyBcIj9jaGF0VXNlckV4dGVybmFsSWQ9XCIgKyBjaGF0VXNlckV4dGVybmFsSWQgO1xyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8dm9pZD4odXJsLCBudWxsLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcclxuICAgICAgICB9KSAgICAgIFxyXG5cclxuICAgIH1cclxuICBcclxuICAgIC8qIFRva2VuICovXHJcbiAgICBnZXRCZWFyZXJUb2tlbigpOiBzdHJpbmcge1xyXG4gIFxyXG4gICAgICBsZXQgcmV0ID0gXCJCZWFyZXIgXCIgKyB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShcImNoYXQ0QXBwU2Vzc2lvblRva2VuXCIpO1xyXG4gIFxyXG4gICAgICByZXR1cm4gcmV0O1xyXG4gICAgfVxyXG4gIFxyXG4gIFxyXG4gICAgc2V0VG9rZW5DaGF0NGFwcChjaGF0NEFwcFNlc3Npb25Ub2tlbjogc3RyaW5nKSB7XHJcbiAgXHJcbiAgXHJcbiAgICAgIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFwiY2hhdDRBcHBTZXNzaW9uVG9rZW5cIiwgY2hhdDRBcHBTZXNzaW9uVG9rZW4pO1xyXG4gICAgfVxyXG4gIFxyXG4gIFxyXG4gICAgLyogQ29ubmVjdGlvbiAqL1xyXG4gIFxyXG4gICAgb25NZXNzYWdlRmlyZWJhc2VSZWNlaXZlZChkYXRhOiBhbnksIGNoYXRDYWxsYmFjazogSUNoYXRDYWxsYmFjaykge1xyXG4gIFxyXG4gIFxyXG4gICAgICAvL2FsZXJ0KFwib25NZXNzYWdlUmVjZWl2ZWQgY29ubmVjdEZpcmViYXNlXCIpO1xyXG4gIFxyXG4gICAgICBpZiAoZGF0YS50eXBlID09IFwibXNnXCIpIHtcclxuICBcclxuICAgICAgICBsZXQgY2hhdDRhcHBNZXNzYWdlID0gbmV3IENoYXQ0QXBwTWVzc2FnZVJlY2VpdmUoKTtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5jaGF0SWQgPSBkYXRhLmNoYXRJZDtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5jaGF0TWVzc2FnZUlkID0gZGF0YS5jaGF0TWVzc2FnZUlkO1xyXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmV4dGVybmFsSWQgPSBkYXRhLmV4dGVybmFsSWQ7XHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZnJvbUlkID0gZGF0YS5mcm9tSWQ7XHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEudG9JZCA9IGRhdGEudG9JZDtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5ncm91cElkID0gZGF0YS5ncm91cElkO1xyXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmRhdGVIb3VyID0gZGF0YS5kYXRlSG91cjtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS50eXBlID0gZGF0YS50eXBlO1xyXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5ub3RpZmljYXRpb24uYm9keSA9IGRhdGEuYm9keTtcclxuICBcclxuICAgICAgICBpZiAoZGF0YS5maWxlSWQgJiYgZGF0YS5maWxlSWQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZmlsZUlkID0gZGF0YS5maWxlSWQ7XHJcbiAgICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5maWxlTmFtZSA9IGRhdGEuZmlsZU5hbWU7XHJcbiAgICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5maWxlU2l6ZSA9IGRhdGEuZmlsZVNpemU7XHJcbiAgICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5maWxlVHlwZSA9IGRhdGEuZmlsZVR5cGU7XHJcbiAgXHJcbiAgICAgICAgfVxyXG4gIFxyXG4gICAgICAgIGxldCBkYXRUbXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xyXG4gIFxyXG4gICAgICAgIGZvciAobGV0IGtleSBpbiBkYXRhKSB7XHJcbiAgICAgICAgICBkYXRUbXAuc2V0KGtleSwgZGF0YVtrZXldKTtcclxuICAgICAgICB9XHJcbiAgXHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuYWxsID0gZGF0VG1wO1xyXG4gIFxyXG4gICAgICAgIGNoYXRDYWxsYmFjay5vbk1lc3NhZ2UoY2hhdDRhcHBNZXNzYWdlKTtcclxuICBcclxuICAgICAgfSBlbHNlIGlmICgoZGF0YS50eXBlID09IFwib25cIiB8fCBkYXRhLnR5cGUgPT0gXCJvZmZcIikpIHtcclxuICAgICAgICBsZXQgY2hhdDRhcHBNZXNzYWdlID0gbmV3IENoYXQ0QXBwTWVzc2FnZVJlY2VpdmUoKTtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5jaGF0SWQgPSBkYXRhLmNoYXRJZDtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5jaGF0TWVzc2FnZUlkID0gZGF0YS5jaGF0TWVzc2FnZUlkO1xyXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmV4dGVybmFsSWQgPSBkYXRhLmV4dGVybmFsSWQ7XHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZnJvbUlkID0gZGF0YS5mcm9tSWQ7XHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEudG9JZCA9IGRhdGEudG9JZDtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5ncm91cElkID0gZGF0YS5ncm91cElkO1xyXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmRhdGVIb3VyID0gZGF0YS5kYXRlSG91cjtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS50eXBlID0gZGF0YS50eXBlO1xyXG5cclxuICAgICAgICBsZXQgZGF0VG1wID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcclxuICBcclxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gZGF0YSkge1xyXG4gICAgICAgICAgZGF0VG1wLnNldChrZXksIGRhdGFba2V5XSk7XHJcbiAgICAgICAgfVxyXG4gIFxyXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmFsbCA9IGRhdFRtcDtcclxuICBcclxuICAgICAgICBjaGF0Q2FsbGJhY2sub25PZmZsaW5lKGNoYXQ0YXBwTWVzc2FnZSk7XHJcblxyXG4gICAgICB9IGVsc2UgaWYgKGRhdGEudHlwZSA9PSBcInJlYWRcIiApIHtcclxuICAgICAgICBsZXQgY2hhdDRhcHBNZXNzYWdlID0gbmV3IENoYXQ0QXBwTWVzc2FnZVJlY2VpdmUoKTtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5jaGF0SWQgPSBkYXRhLmNoYXRJZDtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5jaGF0TWVzc2FnZUlkID0gZGF0YS5jaGF0TWVzc2FnZUlkO1xyXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmV4dGVybmFsSWQgPSBkYXRhLmV4dGVybmFsSWQ7XHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZnJvbUlkID0gZGF0YS5mcm9tSWQ7XHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEudG9JZCA9IGRhdGEudG9JZDtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5ncm91cElkID0gZGF0YS5ncm91cElkO1xyXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmRhdGVIb3VyID0gZGF0YS5kYXRlSG91cjtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS50eXBlID0gZGF0YS50eXBlO1xyXG5cclxuICAgICAgICBsZXQgZGF0VG1wID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcclxuICBcclxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gZGF0YSkge1xyXG4gICAgICAgICAgZGF0VG1wLnNldChrZXksIGRhdGFba2V5XSk7XHJcbiAgICAgICAgfVxyXG4gIFxyXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmFsbCA9IGRhdFRtcDtcclxuICBcclxuICAgICAgICBjaGF0Q2FsbGJhY2sub25SZWFkKGNoYXQ0YXBwTWVzc2FnZSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09IFwic3RhcnRUeXBpbmdcIiB8fCBkYXRhLnR5cGUgPT0gXCJzdG9wVHlwaW5nXCIgKSB7XHJcbiAgICAgICAgbGV0IGNoYXQ0YXBwTWVzc2FnZSA9IG5ldyBDaGF0NEFwcE1lc3NhZ2VSZWNlaXZlKCk7XHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuY2hhdElkID0gZGF0YS5jaGF0SWQ7XHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuY2hhdE1lc3NhZ2VJZCA9IGRhdGEuY2hhdE1lc3NhZ2VJZDtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5leHRlcm5hbElkID0gZGF0YS5leHRlcm5hbElkO1xyXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmZyb21JZCA9IGRhdGEuZnJvbUlkO1xyXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLnRvSWQgPSBkYXRhLnRvSWQ7XHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZ3JvdXBJZCA9IGRhdGEuZ3JvdXBJZDtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5kYXRlSG91ciA9IGRhdGEuZGF0ZUhvdXI7XHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEudHlwZSA9IGRhdGEudHlwZTtcclxuXHJcbiAgICAgICAgbGV0IGRhdFRtcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XHJcbiAgXHJcbiAgICAgICAgZm9yIChsZXQga2V5IGluIGRhdGEpIHtcclxuICAgICAgICAgIGRhdFRtcC5zZXQoa2V5LCBkYXRhW2tleV0pO1xyXG4gICAgICAgIH1cclxuICBcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5hbGwgPSBkYXRUbXA7XHJcbiAgXHJcbiAgICAgICAgY2hhdENhbGxiYWNrLm9uU3RhcnRTdG9wVHlwaW5nKGNoYXQ0YXBwTWVzc2FnZSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09IFwibmV3X3VzZXJcIiAgKSB7XHJcbiAgICAgICAgbGV0IGNoYXQ0YXBwTWVzc2FnZSA9IG5ldyBDaGF0NEFwcE1lc3NhZ2VSZWNlaXZlKCk7XHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuY2hhdElkID0gZGF0YS5jaGF0SWQ7XHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuY2hhdE1lc3NhZ2VJZCA9IGRhdGEuY2hhdE1lc3NhZ2VJZDtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5leHRlcm5hbElkID0gZGF0YS5leHRlcm5hbElkO1xyXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmZyb21JZCA9IGRhdGEuZnJvbUlkO1xyXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLnRvSWQgPSBkYXRhLnRvSWQ7XHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZ3JvdXBJZCA9IGRhdGEuZ3JvdXBJZDtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5kYXRlSG91ciA9IGRhdGEuZGF0ZUhvdXI7XHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEudHlwZSA9IGRhdGEudHlwZTtcclxuXHJcbiAgICAgICAgbGV0IGRhdFRtcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XHJcbiAgXHJcbiAgICAgICAgZm9yIChsZXQga2V5IGluIGRhdGEpIHtcclxuICAgICAgICAgIGRhdFRtcC5zZXQoa2V5LCBkYXRhW2tleV0pO1xyXG4gICAgICAgIH1cclxuICBcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5hbGwgPSBkYXRUbXA7XHJcbiAgXHJcbiAgICAgICAgY2hhdENhbGxiYWNrLm9uTmV3VXNlcihjaGF0NGFwcE1lc3NhZ2UpO1xyXG4gICAgICB9IGVsc2UgaWYgKGRhdGEudHlwZSA9PSBcInJlbW92ZV91c2VyXCIgICkge1xyXG4gICAgICAgIGxldCBjaGF0NGFwcE1lc3NhZ2UgPSBuZXcgQ2hhdDRBcHBNZXNzYWdlUmVjZWl2ZSgpO1xyXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmNoYXRJZCA9IGRhdGEuY2hhdElkO1xyXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmNoYXRNZXNzYWdlSWQgPSBkYXRhLmNoYXRNZXNzYWdlSWQ7XHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZXh0ZXJuYWxJZCA9IGRhdGEuZXh0ZXJuYWxJZDtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5mcm9tSWQgPSBkYXRhLmZyb21JZDtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS50b0lkID0gZGF0YS50b0lkO1xyXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmdyb3VwSWQgPSBkYXRhLmdyb3VwSWQ7XHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZGF0ZUhvdXIgPSBkYXRhLmRhdGVIb3VyO1xyXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLnR5cGUgPSBkYXRhLnR5cGU7XHJcblxyXG4gICAgICAgIGxldCBkYXRUbXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xyXG4gIFxyXG4gICAgICAgIGZvciAobGV0IGtleSBpbiBkYXRhKSB7XHJcbiAgICAgICAgICBkYXRUbXAuc2V0KGtleSwgZGF0YVtrZXldKTtcclxuICAgICAgICB9XHJcbiAgXHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuYWxsID0gZGF0VG1wO1xyXG4gIFxyXG4gICAgICAgIGNoYXRDYWxsYmFjay5vblJlbW92ZVVzZXIoY2hhdDRhcHBNZXNzYWdlKTtcclxuICAgICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT0gXCJjaGF0X2Nsb3NlZFwiICApIHtcclxuICAgICAgICBsZXQgY2hhdDRhcHBNZXNzYWdlID0gbmV3IENoYXQ0QXBwTWVzc2FnZVJlY2VpdmUoKTtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5jaGF0SWQgPSBkYXRhLmNoYXRJZDtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5jaGF0TWVzc2FnZUlkID0gZGF0YS5jaGF0TWVzc2FnZUlkO1xyXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmV4dGVybmFsSWQgPSBkYXRhLmV4dGVybmFsSWQ7XHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZnJvbUlkID0gZGF0YS5mcm9tSWQ7XHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEudG9JZCA9IGRhdGEudG9JZDtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5ncm91cElkID0gZGF0YS5ncm91cElkO1xyXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmRhdGVIb3VyID0gZGF0YS5kYXRlSG91cjtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS50eXBlID0gZGF0YS50eXBlO1xyXG5cclxuICAgICAgICBsZXQgZGF0VG1wID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcclxuICBcclxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gZGF0YSkge1xyXG4gICAgICAgICAgZGF0VG1wLnNldChrZXksIGRhdGFba2V5XSk7XHJcbiAgICAgICAgfVxyXG4gIFxyXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmFsbCA9IGRhdFRtcDtcclxuICBcclxuICAgICAgICBjaGF0Q2FsbGJhY2sub25DaGF0Q2xvc2VkKGNoYXQ0YXBwTWVzc2FnZSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09IFwiY291bnRfbm90cmVhZFwiICApIHtcclxuXHJcbiAgICAgICAgbGV0IGNoYXQ0YXBwTWVzc2FnZSA9IG5ldyBDaGF0NEFwcE1lc3NhZ2VSZWNlaXZlKCk7XHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuY2hhdElkID0gZGF0YS5jaGF0SWQ7XHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuY2hhdE1lc3NhZ2VJZCA9IGRhdGEuY2hhdE1lc3NhZ2VJZDtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5leHRlcm5hbElkID0gZGF0YS5leHRlcm5hbElkO1xyXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLmZyb21JZCA9IGRhdGEuZnJvbUlkO1xyXG4gICAgICAgIGNoYXQ0YXBwTWVzc2FnZS5kYXRhLnRvSWQgPSBkYXRhLnRvSWQ7XHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEuZ3JvdXBJZCA9IGRhdGEuZ3JvdXBJZDtcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5kYXRlSG91ciA9IGRhdGEuZGF0ZUhvdXI7XHJcbiAgICAgICAgY2hhdDRhcHBNZXNzYWdlLmRhdGEudHlwZSA9IGRhdGEudHlwZTtcclxuXHJcbiAgICAgICAgbGV0IGRhdFRtcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XHJcbiAgXHJcbiAgICAgICAgZm9yIChsZXQga2V5IGluIGRhdGEpIHtcclxuICAgICAgICAgIGRhdFRtcC5zZXQoa2V5LCBkYXRhW2tleV0pO1xyXG4gICAgICAgIH1cclxuICBcclxuICAgICAgICBjaGF0NGFwcE1lc3NhZ2UuZGF0YS5hbGwgPSBkYXRUbXA7XHJcbiAgXHJcbiAgICAgICAgY2hhdENhbGxiYWNrLm9uQ291bnROb3RSZWFkKGNoYXQ0YXBwTWVzc2FnZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZW5zdXJlQ29ubihjaGF0VXNlckV4dGVybmFsSWQ6IHN0cmluZywgZm9yY2VSZWNvbm5lY3ROYXRzPzogYm9vbGVhbikge1xyXG5cclxuICAgICAgaWYgKHRoaXMuZGVidWcpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhgY2hhdFNlcnZlcjogJHt0aGlzLmNoYXRTZXJ2ZXJ9YCk7XHJcbiAgICAgICAgY29uc29sZS5sb2coYHVzZXJJZDogJHtjaGF0VXNlckV4dGVybmFsSWR9YCk7XHJcbiAgICAgICAgY29uc29sZS5sb2coYGdldEJlYXJlclRva2VuOiAkeyB0aGlzLmdldEJlYXJlclRva2VuKCl9YCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xyXG5cclxuICAgICAgbGV0IHVyaVN0ZXAxOiBzdHJpbmcgPSB0aGlzLmNoYXRTZXJ2ZXIucmVwbGFjZSgvXmh0dHBzLywgJ3dzcycpO1xyXG5cclxuICAgICAgbGV0IHNlcnZlcjogc3RyaW5nID0gdXJpU3RlcDEucmVwbGFjZSgvKFxcL1xcLy4qPylcXC8vLCAnJDFcXC93cy8nKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLmRlYnVnKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coYHdzIHNlcnZlcjogJHtzZXJ2ZXJ9YCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChmb3JjZVJlY29ubmVjdE5hdHMgfHwgIXRoaXMubmMgfHwgKHRoaXMubmMuaXNDbG9zZSAmJiB0aGlzLm5jLmlzQ2xvc2UoKSkpIHtcclxuXHJcbiAgICAgICAgYXdhaXQgdGhhdC5kaXNjb25uZWN0SW50ZXJuYWwodHJ1ZSk7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhhdC5uYyA9IGF3YWl0IE5BVFMuY29ubmVjdCh7IHVybDogc2VydmVyLCB1c2VyOiBjaGF0VXNlckV4dGVybmFsSWQsIHBhc3M6IHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSwgcmVjb25uZWN0OiBmYWxzZX0pO1xyXG5cclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5jaGF0VXNlckV4dGVybmFsSWQgPSBjaGF0VXNlckV4dGVybmFsSWQ7XHJcblxyXG4gICAgICByZXR1cm4gdGhhdC5uYztcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkaXNjb25uZWN0KCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5kaXNjb25uZWN0SW50ZXJuYWwoZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRpc2Nvbm5lY3RJbnRlcm5hbChpZ25vcmVPZmZMaW5lOiBib29sZWFuKSB7XHJcblxyXG4gICAgICAvLyBDaGVjayBob3cgd2UgY2FuIGRpc2Nvbm5lY3RcclxuXHJcbiAgICAgIGlmICh0aGlzLmludGVydmFsKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIWlnbm9yZU9mZkxpbmUgJiYgdGhpcy5uYyAmJiB0aGlzLmNoYXRVc2VyRXh0ZXJuYWxJZCAmJiB0aGlzLmNoYXRVc2VyRXh0ZXJuYWxJZC5sZW5ndGggPiAwICYmIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSAmJiB0aGlzLmdldEJlYXJlclRva2VuKCkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBhd2FpdCBsYXN0VmFsdWVGcm9tKHRoaXMuc2V0T2ZmTGluZSh0aGlzLmNoYXRVc2VyRXh0ZXJuYWxJZCkpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuZGVidWcpIGNvbnNvbGUubG9nKFwiaGFkIHNldCBvZmZsaW5lXCIpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmVycm9yKFwiRXJybyBhbyBzZXRhciBvZmZsaW5lXCIsIGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLm5jKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGF3YWl0IHRoaXMubmMuY2xvc2UoKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5kZWJ1Zyl7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubmMgPSB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLmRlYnVnKXtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImRpc2NvbmVjdFwiKVxyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgfVxyXG5cclxuICAgIHByb2Nlc3NBbmRDYWxsYmFjayhtc2dPYmo6IGFueSwgY2hhdENhbGxiYWNrOiBJQ2hhdENhbGxiYWNrKSB7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmRlYnVnICYmIG1zZ09iaikge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJNc2cgUmVjZWl2ZWQ6IFwiICsgSlNPTi5zdHJpbmdpZnkobXNnT2JqKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vaWYgKCFjaGF0Q2FsbGJhY2suaXNUb2tlbkZpcmViYXNlQWN0aXZlKCkpIHtcclxuXHJcbiAgICAgICAgICBsZXQgZGF0VG1wID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcclxuXHJcbiAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gbXNnT2JqLmRhdGEpIHtcclxuICAgICAgICAgICAgZGF0VG1wLnNldChrZXksIG1zZ09iai5kYXRhW2tleV0pO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIG1zZ09iai5kYXRhLmFsbCA9IGRhdFRtcDtcclxuXHJcbiAgICAgICAgICBpZiAobXNnT2JqLmRhdGEudHlwZSA9PSBcIm1zZ1wiKSB7XHJcbiAgICAgICAgICAgIGNoYXRDYWxsYmFjay5vbk1lc3NhZ2UobXNnT2JqKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoKG1zZ09iai5kYXRhLnR5cGUgPT0gXCJvblwiIHx8IG1zZ09iai5kYXRhLnR5cGUgPT0gXCJvZmZcIikpIHtcclxuICAgICAgICAgICAgY2hhdENhbGxiYWNrLm9uT2ZmbGluZShtc2dPYmopO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChtc2dPYmouZGF0YS50eXBlID09IFwicmVhZFwiICkge1xyXG4gICAgICAgICAgICBjaGF0Q2FsbGJhY2sub25SZWFkKG1zZ09iaik7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKG1zZ09iai5kYXRhLnR5cGUgPT0gXCJzdGFydFR5cGluZ1wiIHx8ICBtc2dPYmouZGF0YS50eXBlID09IFwic3RvcFR5cGluZ1wiKSB7XHJcbiAgICAgICAgICAgIGNoYXRDYWxsYmFjay5vblN0YXJ0U3RvcFR5cGluZyhtc2dPYmopO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChtc2dPYmouZGF0YS50eXBlID09IFwibmV3X3VzZXJcIikge1xyXG4gICAgICAgICAgICBjaGF0Q2FsbGJhY2sub25OZXdVc2VyKG1zZ09iaik7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKG1zZ09iai5kYXRhLnR5cGUgPT0gXCJyZW1vdmVfdXNlclwiKSB7XHJcbiAgICAgICAgICAgIGNoYXRDYWxsYmFjay5vblJlbW92ZVVzZXIobXNnT2JqKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAobXNnT2JqLmRhdGEudHlwZSA9PSBcImNoYXRfY2xvc2VkXCIpIHtcclxuICAgICAgICAgICAgY2hhdENhbGxiYWNrLm9uQ2hhdENsb3NlZChtc2dPYmopO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChtc2dPYmouZGF0YS50eXBlID09IFwiY291bnRfbm90cmVhZFwiKSB7XHJcbiAgICAgICAgICAgIGNoYXRDYWxsYmFjay5vbkNvdW50Tm90UmVhZChtc2dPYmopO1xyXG5cclxuICAgICAgICAgIH1cclxuICAgICAgICAvL31cclxuXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgY29ubmVjdFdlYnNvY2tldChjaGF0Q2FsbGJhY2s6IElDaGF0Q2FsbGJhY2ssIHVzZXJJZDogc3RyaW5nKSB7XHJcbiAgICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xyXG4gICAgICB0aGlzLmRpc2Nvbm5lY3RJbnRlcm5hbCh0cnVlKTtcclxuICBcclxuICAgICAgbGV0IHNlY3VyaXR5VG9rZW4gPSB0aGlzLmdldEJlYXJlclRva2VuKCk7XHJcblxyXG4gICAgICBsZXQgdG9rZW5BdXRoID0gXCJcIjtcclxuXHJcbiAgICAgIGlmIChzZWN1cml0eVRva2VuICYmIHNlY3VyaXR5VG9rZW4uc3RhcnRzV2l0aChcIkJlYXJlciBcIikpe1xyXG4gICAgICAgIHRva2VuQXV0aCA9IHNlY3VyaXR5VG9rZW47XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdG9rZW5BdXRoID0gXCJCZWFyZXIgXCIgKyBzZWN1cml0eVRva2VuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBjb25maWdJZCA9IHRoaXMuY2hhdFNlcnZlci5zcGxpdChcIi9cIilbM107XHJcblxyXG4gICAgICBjb25zdCBuYyA9IGF3YWl0IHRoaXMuZW5zdXJlQ29ubih1c2VySWQpO1xyXG5cclxuICAgICAgLy9UT0RPIEdldCB0aGUgdXNlciBpZCBmcm9tIGp3dFxyXG4gICAgICBjb25zdCBzdWJqZWN0ID0gYGNoYXQ0YXBwLmNvbmZpZy4ke2NvbmZpZ0lkfS51c2VyLiR7dXNlcklkfWA7IFxyXG5cclxuICAgICAgY29uc3Qgc3ViID0gbmMuc3Vic2NyaWJlKHN1YmplY3QsIChtc2cpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xyXG4gICAgICAgICAgY29uc29sZS5sb2cobXNnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucHJvY2Vzc0FuZENhbGxiYWNrKEpTT04ucGFyc2UobXNnLmRhdGEpLCBjaGF0Q2FsbGJhY2spICA7XHJcbiAgICAgICAgXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgaWYgKHRoaXMuaW50ZXJ2YWwpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICBcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcblxyXG4gICAgICB0aGF0LmludGVydmFsID0gc2V0SW50ZXJ2YWwoKCk9PntcclxuICAgICAgICBpZiAodGhhdC5kZWJ1Zykge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coYHB1Ymxpc2ggY2hhdDRhcHAudXNlci5vbmxpbmUgJHt1c2VySWR9IGApO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgdGhhdC5uYy5wdWJsaXNoKGBjaGF0NGFwcC51c2VyLm9ubGluZWAsIHVzZXJJZCkgO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwidHJ5IHJlY29ubmVjdC4uLlwiKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuZW5zdXJlQ29ubih1c2VySWQsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgfSwxMDAwKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLmRlYnVnKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coYFN1YnNjcmliZSBvbmxpbmUgY2hhdDRhcHAudXNlci4ke3VzZXJJZH0ub25saW5lYCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8qXHJcbiAgICBkaXNjb25uZWN0KCkge1xyXG4vLyAgICAgIGNvbnNvbGUubG9nKFwiZGlzY29ubmVjdFwiKVxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGlmICh0aGlzLnN0b21wQ2xpZW50KSB7XHJcbiAgICAgICAgICB0aGlzLnN0b21wQ2xpZW50LmRpc2Nvbm5lY3QoKTtcclxuICAgICAgICB9XHJcbiAgXHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgKi9cclxuXHJcbiAgICBjb252ZXJ0Q2hhdDRBcHBNZXNzYWdlUmVjZWl2ZVRvQ2hhdE1lc3NhZ2U0QXBwKG1zZzogQ2hhdDRBcHBNZXNzYWdlUmVjZWl2ZSk6IENoYXRNZXNzYWdlNEFwcHtcclxuICAgICAgbGV0IG1lc3NhZ2UgPSBuZXcgQ2hhdE1lc3NhZ2U0QXBwKCk7XHJcbiAgICAgIG1lc3NhZ2UuYm9keSA9IG1zZz8ubm90aWZpY2F0aW9uPy5ib2R5O1xyXG4gICAgICBtZXNzYWdlLmNoYXRJZCA9IG1zZy5kYXRhLmNoYXRJZDtcclxuICAgICAgbWVzc2FnZS5mcm9tSWQgPSBtc2cuZGF0YS5mcm9tSWQ7XHJcbiAgICAgIG1lc3NhZ2UudG9JZCA9IG1zZy5kYXRhLnRvSWQ7XHJcbiAgICAgIG1lc3NhZ2UuZ3JvdXBJZCA9IG1zZy5kYXRhLmdyb3VwSWQ7XHJcbiAgICAgIG1lc3NhZ2UucmVwbHlGcm9tID0gbXNnLmRhdGEucmVwbHlGcm9tO1xyXG4gICAgICBpZiAobXNnLmRhdGEuZGF0ZUhvdXIgJiYgbXNnLmRhdGEuZGF0ZUhvdXIubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIG1lc3NhZ2UuZGF0ZUhvdXJJbmNsdWRlZCA9IG1zZy5kYXRhLmRhdGVIb3VyLnN1YnN0cmluZyg2LDEwKSArIFwiLVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1zZy5kYXRhLmRhdGVIb3VyLnN1YnN0cmluZygzLDUpICsgXCItXCIgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1zZy5kYXRhLmRhdGVIb3VyLnN1YnN0cmluZygwLDIpIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1zZy5kYXRhLmRhdGVIb3VyLnN1YnN0cmluZygxMCkgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDtcclxuICAgICAgfVxyXG4gICAgICBtZXNzYWdlLmlkID0gbXNnLmRhdGEuY2hhdE1lc3NhZ2VJZDtcclxuXHJcbiAgICAgIGlmIChtc2cuZGF0YS5maWxlSWQgJiYgbXNnLmRhdGEuZmlsZUlkLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBsZXQgbWVzc2FnZUZpbGUgPSBuZXcgQ2hhdE1lc3NhZ2VGaWxlNEFwcCgpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIG1lc3NhZ2VGaWxlLmlkID0gbXNnLmRhdGEuZmlsZUlkO1xyXG4gICAgICAgIG1lc3NhZ2VGaWxlLm5hbWUgPSBtc2cuZGF0YS5maWxlTmFtZTtcclxuICAgICAgICBtZXNzYWdlRmlsZS5zaXplID0gbXNnLmRhdGEuZmlsZVNpemU7XHJcbiAgICAgICAgbWVzc2FnZUZpbGUudHlwZSA9IG1zZy5kYXRhLmZpbGVUeXBlO1xyXG5cclxuICAgICAgICBtZXNzYWdlLmNoYXRNZXNzYWdlRmlsZSA9IG1lc3NhZ2VGaWxlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAobXNnLmRhdGEudkZpbGVJZCAmJiBtc2cuZGF0YS52RmlsZUlkLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBsZXQgbWVzc2FnZUZpbGUgPSBuZXcgQ2hhdE1lc3NhZ2VGaWxlNEFwcCgpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIG1lc3NhZ2VGaWxlLmlkID0gbXNnLmRhdGEudkZpbGVJZDtcclxuICAgICAgICBtZXNzYWdlRmlsZS5uYW1lID0gbXNnLmRhdGEudkZpbGVOYW1lO1xyXG4gICAgICAgIG1lc3NhZ2VGaWxlLnNpemUgPSBtc2cuZGF0YS52RmlsZVNpemU7XHJcbiAgICAgICAgbWVzc2FnZUZpbGUudHlwZSA9IG1zZy5kYXRhLnZGaWxlVHlwZTtcclxuXHJcbiAgICAgICAgbWVzc2FnZS5jaGF0Vm9pY2VGaWxlID0gbWVzc2FnZUZpbGU7XHJcbiAgICAgIH1cclxuXHJcblxyXG4gICAgICByZXR1cm4gbWVzc2FnZTtcclxuXHJcbiAgICB9XHJcbiAgXHJcbiAgfVxyXG4gIFxyXG4gIFxyXG4gIGV4cG9ydCBjbGFzcyBDaGF0NEFwcCB7XHJcbiAgICBpZDogc3RyaW5nO1xyXG4gICAgY29uZmlnSWQ6IHN0cmluZztcclxuICAgIGV4dGVybmFsSWQ6IHN0cmluZztcclxuICAgIHRpdGxlOiBzdHJpbmc7XHJcbiAgICBzdGF0dXM6IENoYXRTdGF0dXM0QXBwO1xyXG4gICAgdXNlcnM6IEFycmF5PENoYXRVc2VyNEFwcD47XHJcblxyXG4gICAgbWV0YTogQXJyYXk8Q2hhdE1lc3NhZ2VNZXRhNEFwcD47XHJcbiAgXHJcbiAgfVxyXG4gIGV4cG9ydCBjbGFzcyBDaGF0VXNlcjRBcHAge1xyXG4gICAgaWQ6IHN0cmluZztcclxuICAgIG5hbWU6IHN0cmluZztcclxuICAgIGNsaWVudFRva2VuOiBzdHJpbmc7XHJcbiAgICBwaWN0dXJlUGF0aDogc3RyaW5nO1xyXG4gICAgZW1haWw6IHN0cmluZztcclxuICAgIHBob25lTnVtYmVyOiBzdHJpbmc7XHJcbiAgICBleHRlcm5hbElkOiBzdHJpbmc7XHJcbiAgICBtZXRhOiBBcnJheTxDaGF0TWVzc2FnZU1ldGE0QXBwPjtcclxuICAgIHN0YXR1czogQ2hhdFVzZXJTdGF0dXM0QXBwO1xyXG4gIH1cclxuICBleHBvcnQgY2xhc3MgQ2hhdE1lc3NhZ2U0QXBwIHtcclxuICAgIGlkOiBzdHJpbmc7XHJcbiAgICBmcm9tSWQ6IHN0cmluZztcclxuICAgIHRvSWQ6IHN0cmluZztcclxuICAgIGNoYXRJZDogc3RyaW5nO1xyXG4gICAgdGl0bGU6IHN0cmluZztcclxuICAgIGJvZHk6IHN0cmluZztcclxuICAgIG1ldGE6IEFycmF5PENoYXRNZXNzYWdlTWV0YTRBcHA+O1xyXG4gICAgZ3JvdXBJZDogc3RyaW5nO1xyXG4gICAgcmVhZDogQm9vbGVhbjtcclxuICAgIHJlcGx5RnJvbTogc3RyaW5nO1xyXG4gICAgZGF0ZUhvdXJJbmNsdWRlZDogc3RyaW5nO1xyXG4gICAgZ1RvSWRSZWFkOiBzdHJpbmdbXTtcclxuICAgIGNoYXRNZXNzYWdlRmlsZTogQ2hhdE1lc3NhZ2VGaWxlNEFwcDtcclxuICAgIGNoYXRWb2ljZUZpbGU6IENoYXRNZXNzYWdlRmlsZTRBcHA7XHJcbiAgfVxyXG4gIGV4cG9ydCBjbGFzcyBDaGF0TWVzc2FnZUZpbGU0QXBwIHtcclxuICAgIGlkOiBzdHJpbmc7XHJcbiAgICBuYW1lOiBzdHJpbmc7XHJcbiAgICB0eXBlOiBzdHJpbmc7XHJcbiAgICBzaXplOiBudW1iZXI7XHJcbiAgICBmdWxsUGF0aDogc3RyaW5nO1xyXG4gIH1cclxuICBleHBvcnQgY2xhc3MgQ2hhdE1lc3NhZ2VNZXRhNEFwcCB7XHJcbiAgICBuYW1lOiBzdHJpbmc7XHJcbiAgICB2YWx1ZTogc3RyaW5nO1xyXG4gIH1cclxuICBleHBvcnQgY2xhc3MgQ2hhdDRBcHBNZXNzYWdlUmVjZWl2ZSB7XHJcbiAgICBkYXRhOiBDaGF0NEFwcE1lc3NhZ2VSZWNlaXZlRGF0YSA9IG5ldyBDaGF0NEFwcE1lc3NhZ2VSZWNlaXZlRGF0YSgpO1xyXG4gICAgbm90aWZpY2F0aW9uOiBDaGF0NEFwcE1lc3NhZ2VSZWNlaXZlTm90aWZpY2F0aW9uID0gbmV3IENoYXQ0QXBwTWVzc2FnZVJlY2VpdmVOb3RpZmljYXRpb24oKTtcclxuICAgIHRva2VuOiBzdHJpbmc7XHJcbiAgfVxyXG4gIGV4cG9ydCBjbGFzcyBDaGF0NEFwcE1lc3NhZ2VSZWNlaXZlRGF0YSB7XHJcbiAgICB0b0lkOiBzdHJpbmc7XHJcbiAgICBjaGF0SWQ6IHN0cmluZztcclxuICAgIGRhdGVIb3VyOiBzdHJpbmc7XHJcbiAgICBjaGF0TWVzc2FnZUlkOiBzdHJpbmc7XHJcbiAgICBleHRlcm5hbElkOiBzdHJpbmc7XHJcbiAgICB0eXBlOiBzdHJpbmc7XHJcbiAgICBmcm9tSWQ6IHN0cmluZztcclxuICAgIHJlcGx5RnJvbTogc3RyaW5nO1xyXG4gICAgZ3JvdXBJZDogc3RyaW5nO1xyXG4gICAgZmlsZUlkOiBzdHJpbmc7XHJcbiAgICBmaWxlTmFtZTogc3RyaW5nO1xyXG4gICAgZmlsZVNpemU6IG51bWJlcjtcclxuICAgIGZpbGVUeXBlOiBzdHJpbmc7XHJcbiAgICB2RmlsZUlkOiBzdHJpbmc7XHJcbiAgICB2RmlsZU5hbWU6IHN0cmluZztcclxuICAgIHZGaWxlU2l6ZTogbnVtYmVyO1xyXG4gICAgdkZpbGVUeXBlOiBzdHJpbmc7XHJcblxyXG4gICAgYWxsOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xyXG4gIH1cclxuICBleHBvcnQgY2xhc3MgQ2hhdDRBcHBNZXNzYWdlUmVjZWl2ZU5vdGlmaWNhdGlvbiB7XHJcbiAgICBib2R5OiBzdHJpbmc7XHJcbiAgfVxyXG4gIFxyXG4gIGV4cG9ydCBjbGFzcyBDaGF0VXNlclJlc3BvbnNlNEFwcCB7XHJcbiAgICB0b3RhbE1lc3NhZ2VzOiBudW1iZXI7XHJcbiAgICBjaGF0OiBDaGF0NEFwcDtcclxuICAgIGNoYXRNZXNzYWdlOiBDaGF0TWVzc2FnZTRBcHA7XHJcbiAgICBjaGF0czogQ2hhdFVzZXJSZXNwb25zZTRBcHBbXTtcclxuICB9XHJcbiAgZXhwb3J0IGNsYXNzIENoYXRGaWx0ZXJSZXF1ZXN0NEFwcCB7XHJcbiAgICB0eXBlOiBDaGF0RmlsdGVyVHlwZTtcclxuICAgIGNoYXRFeHRlcm5hbElkOiBzdHJpbmc7XHJcbiAgICBjaGF0VXNlckV4dGVybmFsSWQ6IHN0cmluZztcclxuICAgIGNoYXRVc2VyRXh0ZXJuYWxUb0lkOiBzdHJpbmc7XHJcbiAgICBncm91cElkOiBzdHJpbmc7XHJcbiAgICBmcm9tSWQ6IHN0cmluZztcclxuICB9XHJcbiAgZXhwb3J0IGNsYXNzIENoYXQ0QXBwQ29uZmlnIHtcclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBlbmRwb2ludDogc3RyaW5nLCBwdWJsaWMgZGVidWc/OiBib29sZWFuKSB7XHJcbiAgICAgIFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGNsYXNzIENoYXQ0QXBwVHJhbnNsYXRlIHtcclxuICAgIHRleHQ6IHN0cmluZztcclxuICAgIHRyYW5zbGF0ZWRUZXh0OiBzdHJpbmc7XHJcbiAgICBvcmlnaW5hbFNvdXJjZUxhbmd1YWdlQ29kZTogc3RyaW5nO1xyXG4gICAgc291cmNlTGFuZ3VhZ2VDb2RlOiBzdHJpbmc7XHJcbiAgICB0YXJnZXRMYW5ndWFnZUNvZGU6IHN0cmluZztcclxuICAgIG1lc3NhZ2VJZDogc3RyaW5nO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGNsYXNzIENoYXRHcm91cEFwcCB7XHJcbiAgICBpZDogc3RyaW5nO1xyXG4gICAgY2hhdElkOiBzdHJpbmc7XHJcbiAgICBleHRlcm5hbElkOiBzdHJpbmc7XHJcbiAgICB0aXRsZTogc3RyaW5nO1xyXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcclxuICAgIHVzZXJzOiBBcnJheTxzdHJpbmc+O1xyXG4gICAgZmlsZXM6IEFycmF5PENoYXRNZXNzYWdlRmlsZTRBcHA+O1xyXG4gICAgbWV0YTogQXJyYXk8Q2hhdE1lc3NhZ2VNZXRhNEFwcD47XHJcbiAgICBzdGF0dXM6IEdyb3VwU3RhdHVzNEFwcDtcclxuICB9XHJcblxyXG4gIFxyXG4gIGV4cG9ydCBlbnVtIENoYXRTdGF0dXM0QXBwIHtcclxuICAgIENSRUFURUQgPSBcIkNSRUFURURcIixcclxuICAgIENMT1NFRCA9IFwiQ0xPU0VEXCJcclxuICBcclxuICB9XHJcbiAgZXhwb3J0IGVudW0gQ2hhdFVzZXJTdGF0dXM0QXBwIHtcclxuICAgIFJFTU9WRUQgPSBcIlJFTU9WRURcIlxyXG4gIFxyXG4gIH1cclxuICBleHBvcnQgZW51bSBDaGF0RmlsdGVyVHlwZSB7XHJcbiAgICBDT1VOVF9OT1RfUkVBRCA9IDEsXHJcbiAgICBMQVNUX01FU1NBR0UgPSAyXHJcbiAgfVxyXG5cclxuICBleHBvcnQgZW51bSBHcm91cFN0YXR1czRBcHAge1xyXG4gICAgQ1JFQVRFRCA9IFwiQ1JFQVRFRFwiLFxyXG4gICAgQ0xPU0VEID0gXCJSRU1PVkVEXCJcclxuICB9XHJcblxyXG4gIFxyXG4gIGV4cG9ydCBpbnRlcmZhY2UgSUNoYXRDYWxsYmFjayB7XHJcbiAgICBpc1Rva2VuRmlyZWJhc2VBY3RpdmUoKTogQm9vbGVhbjtcclxuICAgIG9uTWVzc2FnZShtc2c6IENoYXQ0QXBwTWVzc2FnZVJlY2VpdmUpOiB2b2lkO1xyXG4gICAgb25PZmZsaW5lKG1zZzogQ2hhdDRBcHBNZXNzYWdlUmVjZWl2ZSk6IHZvaWQ7XHJcbiAgICBvblJlYWQobXNnOiBDaGF0NEFwcE1lc3NhZ2VSZWNlaXZlKTogdm9pZDtcclxuICAgIG9uU3RhcnRTdG9wVHlwaW5nKG1zZzogQ2hhdDRBcHBNZXNzYWdlUmVjZWl2ZSk6IHZvaWQ7XHJcbiAgICBvbk5ld1VzZXIobXNnOiBDaGF0NEFwcE1lc3NhZ2VSZWNlaXZlKTogdm9pZDtcclxuICAgIG9uUmVtb3ZlVXNlcihtc2c6IENoYXQ0QXBwTWVzc2FnZVJlY2VpdmUpOiB2b2lkO1xyXG4gICAgb25DaGF0Q2xvc2VkKG1zZzogQ2hhdDRBcHBNZXNzYWdlUmVjZWl2ZSk6IHZvaWQ7XHJcbiAgICBvbkNvdW50Tm90UmVhZChtc2c6IENoYXQ0QXBwTWVzc2FnZVJlY2VpdmUpOiB2b2lkO1xyXG4gIH1cclxuICAiXX0=
579
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdDRhcHAtY2xpZW50LWFuZ3VsYXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NoYXQ0YXBwLWNsaWVudC1hbmd1bGFyL3NyYy9saWIvY2hhdDRhcHAtY2xpZW50LWFuZ3VsYXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDL0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsQyxPQUFPLEtBQUssSUFBSSxNQUFNLGVBQWUsQ0FBQzs7O0FBR3RDLDRCQUE0QjtBQUs1QixNQUFNLE9BQU8sNEJBQTRCO0lBZ0JyQyxZQUFxQixJQUFnQjtRQUFoQixTQUFJLEdBQUosSUFBSSxDQUFZO1FBWnJDLGVBQVUsR0FBRyxFQUFFLENBQUM7UUFDaEIsWUFBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLFVBQUssR0FBRyxLQUFLLENBQUM7UUFDZCx1QkFBa0IsR0FBRyxFQUFFLENBQUM7UUFDeEIsYUFBUSxHQUFHLEVBQUUsQ0FBQztRQUlkLHFCQUFnQixHQUFHLEdBQUcsQ0FBQztJQU12QixDQUFDO0lBQ0QsUUFBUTtJQUNSLENBQUM7SUFFRCxNQUFNLENBQUMsY0FBOEI7UUFDbkMsSUFBSSxDQUFDLFVBQVUsR0FBRyxjQUFjLENBQUMsUUFBUSxDQUFDO1FBQzFDLElBQUksQ0FBQyxPQUFPLEdBQUcsY0FBYyxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUU7UUFDckQsSUFBSSxDQUFDLEtBQUssR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxJQUFJLENBQUMsaUJBQXlCLEVBQUUsWUFBNEIsRUFBRSxrQkFBMkI7UUFFdkYsT0FBTyxJQUFJLFVBQVUsQ0FBQyxDQUFDLFVBQVUs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TUFBTSxDQUFOLElBQVksY0FJWDtBQUpELFdBQVksY0FBYztJQUN4QixxQ0FBbUIsQ0FBQTtJQUNuQixtQ0FBaUIsQ0FBQTtBQUVuQixDQUFDLEVBSlcsY0FBYyxLQUFkLGNBQWMsUUFJekI7QUFDRCxNQUFNLENBQU4sSUFBWSxrQkFHWDtBQUhELFdBQVksa0JBQWtCO0lBQzVCLHlDQUFtQixDQUFBO0FBRXJCLENBQUMsRUFIVyxrQkFBa0IsS0FBbEIsa0JBQWtCLFFBRzdCO0FBQ0QsTUFBTSxDQUFOLElBQVksY0FHWDtBQUhELFdBQVksY0FBYztJQUN4Qix1RUFBa0IsQ0FBQTtJQUNsQixtRUFBZ0IsQ0FBQTtBQUNsQixDQUFDLEVBSFcsY0FBYyxLQUFkLGNBQWMsUUFHekI7QUFFRCxNQUFNLENBQU4sSUFBWSxlQUdYO0FBSEQsV0FBWSxlQUFlO0lBQ3pCLHNDQUFtQixDQUFBO0lBQ25CLHFDQUFrQixDQUFBO0FBQ3BCLENBQUMsRUFIVyxlQUFlLEtBQWYsZUFBZSxRQUcxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgKiBhcyBOQVRTIGZyb20gJy4vbmF0cy5taW4uanMnO1xyXG5cclxuXHJcbi8vZGVjbGFyZSBsZXQgbmF0c19taW46IGFueTtcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIENoYXQ0YXBwQ2xpZW50QW5ndWxhclNlcnZpY2UgaW1wbGVtZW50cyBPbkluaXQgIHtcclxuXHJcbiAgICBuYzogYW55O1xyXG5cclxuICAgIGNoYXRTZXJ2ZXIgPSBcIlwiO1xyXG4gICAgY2hhdFVybCA9IFwiXCI7XHJcbiAgICBkZWJ1ZyA9IGZhbHNlO1xyXG4gICAgY2hhdFVzZXJFeHRlcm5hbElkID0gXCJcIjtcclxuICAgIGNvbmZpZ0lkID0gXCJcIjtcclxuICAgIGNoYXRDYWxsYmFjazogSUNoYXRDYWxsYmFjaztcclxuXHJcbiAgICBcclxuICAgIHRpbWVvdXRSZWNvbm5lY3QgPSA1MDA7XHJcblxyXG4gICAgaW50ZXJ2YWw7XHJcblxyXG4gICAgY29uc3RydWN0b3IoIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCkge1xyXG4gIFxyXG4gICAgfVxyXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB9XHJcblxyXG4gICAgY29uZmlnKGNoYXQ0QXBwQ29uZmlnOiBDaGF0NEFwcENvbmZpZykge1xyXG4gICAgICB0aGlzLmNoYXRTZXJ2ZXIgPSBjaGF0NEFwcENvbmZpZy5lbmRwb2ludDtcclxuICAgICAgdGhpcy5jaGF0VXJsID0gY2hhdDRBcHBDb25maWcuZW5kcG9pbnQgKyBcIi9hcGkvdjEvXCIgO1xyXG4gICAgICB0aGlzLmRlYnVnID0gY2hhdDRBcHBDb25maWcuZGVidWc7XHJcbiAgICB9XHJcbiAgXHJcbiAgICBpbml0KHNlY3VyaXR5Q2hhdFRva2VuOiBzdHJpbmcsIGNoYXRDYWxsYmFjaz86IElDaGF0Q2FsbGJhY2ssIGNvbm5lY3Rpb25DbGllbnRJZD86IHN0cmluZyk6T2JzZXJ2YWJsZTxzdHJpbmc+IHtcclxuXHJcbiAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgoc3Vic2NyaWJlcikgPT4ge1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy8gMS4gVmFsaWRhw6fDtWVzIEluaWNpYWlzXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5jaGF0U2VydmVyIHx8IHRoaXMuY2hhdFNlcnZlci50cmltKCkubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihuZXcgRXJyb3IoXCJFbmRwb2ludCBpcyBlbXB0eVwiKSk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghc2VjdXJpdHlDaGF0VG9rZW4gfHwgc2VjdXJpdHlDaGF0VG9rZW4udHJpbSgpLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IobmV3IEVycm9yKFwiU2VjdXJpdHlDaGF0VG9rZW4gaXMgZW1wdHlcIikpO1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gMi4gTMOzZ2ljYSBkZSBOZWfDs2Npb1xyXG4gICAgICAgICAgICB0aGlzLnNldFRva2VuQ2hhdDRhcHAoc2VjdXJpdHlDaGF0VG9rZW4pO1xyXG5cclxuICAgICAgICAgICAgaWYgKGNoYXRDYWxsYmFjayAmJiBjb25uZWN0aW9uQ2xpZW50SWQpIHtcclxuICAgICAgICAgICAgICB0aGlzLmNoYXRVc2VyRXh0ZXJuYWxJZCA9IGNvbm5lY3Rpb25DbGllbnRJZDtcclxuICAgICAgICAgICAgICB0aGlzLmNoYXRDYWxsYmFjayA9IGNoYXRDYWxsYmFjaztcclxuICAgICAgICAgICAgICB0aGlzLmNvbm5lY3RXZWJzb2NrZXQoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gMy4gRW1pdGUgbyB0b2tlbiBlIGZpbmFsaXphIG8gZmx1eG9cclxuICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHNlY3VyaXR5Q2hhdFRva2VuKTtcclxuICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICAvLyBDYXB0dXJhIGVycm9zIGluZXNwZXJhZG9zIGUgZW52aWEgcGFyYSBvIGNhbmFsIGRlIGVycm8gZG8gT2JzZXJ2YWJsZVxyXG4gICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGVycik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7ICAgICAgXHJcblxyXG4gICAgfVxyXG4gIFxyXG4gICAgZ2V0Q2hhdFVybERvd25sb2FkKG1lc3NhZ2VGaWxlSWQ6IHN0cmluZykge1xyXG4gICAgICByZXR1cm4gdGhpcy5jaGF0VXJsICsgXCJjaGF0bWVzc2FnZS9nZXRGaWxlP21lc3NhZ2VGaWxlSWQ9XCIgKyBtZXNzYWdlRmlsZUlkICsgXCImdG9rZW49XCIgKyB0aGlzLmdldEJlYXJlclRva2VuKCk7XHJcbiAgICB9XHJcbiAgXHJcbiAgXHJcbiAgICBnZXRNZXNzYWdlQ2hhdChjaGF0SWQ6IHN0cmluZywgZnJvbUlkOiBzdHJpbmcsIHRvSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8QXJyYXk8Q2hhdE1lc3NhZ2U0QXBwPj4ge1xyXG4gICAgICBsZXQgdXJsID0gdGhpcy5jaGF0VXJsICsgXCJjaGF0bWVzc2FnZS9cIiArIGNoYXRJZCArIFwiL1wiICsgZnJvbUlkICsgXCIvXCIgKyB0b0lkO1xyXG4gIFxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcnJheTxDaGF0TWVzc2FnZTRBcHA+Pih1cmwsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxyXG4gICAgICAgIH0pXHJcbiAgXHJcbiAgICB9XHJcbiAgICBnZXRNZXNzYWdlQ2hhdEJ5R3JvcChjaGF0SWQ6IHN0cmluZywgZ3JvdXBJZDogc3RyaW5nLCBmcm9tSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8QXJyYXk8Q2hhdE1lc3NhZ2U0QXBwPj4ge1xyXG4gICAgICBsZXQgdXJsID0gdGhpcy5jaGF0VXJsICsgXCJjaGF0bWVzc2FnZS9ieUdyb3VwL1wiICsgY2hhdElkICsgXCIvXCIgKyBncm91cElkICsgXCIvXCIgKyBmcm9tSWQ7XHJcbiAgXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEFycmF5PENoYXRNZXNzYWdlNEFwcD4+KHVybCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXHJcbiAgICAgICAgfSlcclxuICBcclxuICAgIH1cclxuICBcclxuICBcclxuICAgIGFkZE1lc3NhZ2VDaGF0KGNoYXRNZXNzYWdlNEFwcDogQ2hhdE1lc3NhZ2U0QXBwKTogT2JzZXJ2YWJsZTxDaGF0TWVzc2FnZTRBcHA+IHtcclxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdG1lc3NhZ2UvXCIgKyBjaGF0TWVzc2FnZTRBcHAuY2hhdElkO1xyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PENoYXRNZXNzYWdlNEFwcD4odXJsLCBjaGF0TWVzc2FnZTRBcHAsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxyXG4gICAgICAgIH0pXHJcbiAgXHJcbiAgICB9XHJcbiAgICAvKlxyXG4gICAgcHJvcHMoY2hhdEZpbHRlclJlcXVlc3Q0QXBwOiBBcnJheTxDaGF0RmlsdGVyUmVxdWVzdDRBcHA+KTogT2JzZXJ2YWJsZTxDaGF0VXNlclJlc3BvbnNlNEFwcFtdPiB7XHJcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImNoYXRtZXNzYWdlL3Byb3BzXCI7XHJcbiAgXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxDaGF0VXNlclJlc3BvbnNlNEFwcFtdPih1cmwsIGNoYXRGaWx0ZXJSZXF1ZXN0NEFwcCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXHJcbiAgICAgICAgfSlcclxuICBcclxuICAgIH1cclxuICAgICovICAgIFxyXG4gIFxyXG4gIFxyXG4gICAgcmVtb3ZlVXNlcnNDaGF0KGNoYXRJZDogc3RyaW5nLCBjaGF0VXNlcnNJZD86IHN0cmluZ1tdLCBjaGF0VXNlcnNFeHRlcm5hbElkPzogc3RyaW5nW10pOiBPYnNlcnZhYmxlPENoYXRVc2VyNEFwcFtdPiB7XHJcbiAgICAgIGxldCBwYXJhbXMgPSBuZXcgQXJyYXkoKTtcclxuICAgICAgaWYgKGNoYXRVc2Vyc0lkICYmIGNoYXRVc2Vyc0lkLmxlbmd0aCA+IDApIHtcclxuICBcclxuICAgICAgICBjaGF0VXNlcnNJZC5mb3JFYWNoKGN1aSA9PiB7XHJcbiAgICAgICAgICBwYXJhbXMucHVzaChcImNoYXRVc2VySWQ9XCIgKyBjdWkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2UgaWYgKGNoYXRVc2Vyc0V4dGVybmFsSWQgJiYgY2hhdFVzZXJzRXh0ZXJuYWxJZC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgY2hhdFVzZXJzRXh0ZXJuYWxJZC5mb3JFYWNoKGN1ZWkgPT4ge1xyXG4gICAgICAgICAgcGFyYW1zLnB1c2goXCJjaGF0VXNlckV4dGVybmFsSWQ9XCIgKyBjdWVpKTtcclxuICAgICAgICB9KVxyXG4gIFxyXG4gICAgICB9XHJcbiAgXHJcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImNoYXR1c2VyL1wiICsgY2hhdElkICsgXCI/XCIgKyBwYXJhbXMuam9pbihcIiZcIik7XHJcbiAgXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZGVsZXRlPENoYXRVc2VyNEFwcFtdPih1cmwsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbiAgXHJcbiAgICByZW1vdmVVc2VyQ2hhdChjaGF0SWQ6IHN0cmluZywgY2hhdFVzZXJJZD86IHN0cmluZywgY2hhdFVzZXJFeHRlcm5hbElkPzogc3RyaW5nKTogT2JzZXJ2YWJsZTxDaGF0VXNlcjRBcHA+IHtcclxuICAgICAgbGV0IHBhcmFtID0gXCJcIjtcclxuICAgICAgaWYgKGNoYXRVc2VySWQpIHtcclxuICAgICAgICBwYXJhbSA9IFwiY2hhdFVzZXJJZD1cIiArIGNoYXRVc2VySWQ7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcGFyYW0gPSBcImNoYXRVc2VyRXh0ZXJuYWxJZD1cIiArIGNoYXRVc2VyRXh0ZXJuYWxJZDtcclxuICAgICAgfVxyXG4gIFxyXG4gICAgICBsZXQgdXJsID0gdGhpcy5jaGF0VXJsICsgXCJjaGF0dXNlci9cIiArIGNoYXRJZCArIFwiP1wiICsgcGFyYW07XHJcbiAgXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZGVsZXRlPENoYXRVc2VyNEFwcD4odXJsLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG4gIFxyXG4gICAgdXBkYXRlVXNlckNoYXQoY2hhdElkOiBzdHJpbmcsIGNoYXJVc2VyNEFwcFVwZGF0ZTogQ2hhdFVzZXI0QXBwKTogT2JzZXJ2YWJsZTxDaGF0VXNlcjRBcHA+IHtcclxuICBcclxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdHVzZXIvXCIgKyBjaGF0SWQ7XHJcbiAgXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucHV0PENoYXRVc2VyNEFwcD4odXJsLCBjaGFyVXNlcjRBcHBVcGRhdGUsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbiAgXHJcbiAgXHJcbiAgICBjcmVhdGVVc2VyQ2hhdChjaGF0SWQ6IHN0cmluZywgY2hhdFVzZXI0QXBwOiBDaGF0VXNlcjRBcHApOiBPYnNlcnZhYmxlPENoYXRVc2VyNEFwcD4ge1xyXG4gICAgICBsZXQgdXJsID0gdGhpcy5jaGF0VXJsICsgXCJjaGF0dXNlci9cIiArIGNoYXRJZDtcclxuICBcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PENoYXRVc2VyNEFwcD4odXJsLCBjaGF0VXNlcjRBcHAsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbiAgXHJcbiAgICBjcmVhdGVVc2Vyc0NoYXQoY2hhdElkOiBzdHJpbmcsIGNoYXRVc2VyNEFwcDogQ2hhdFVzZXI0QXBwW10pOiBPYnNlcnZhYmxlPENoYXRVc2VyNEFwcFtdPiB7XHJcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImNoYXR1c2VyL3VzZXJzL1wiICsgY2hhdElkO1xyXG4gIFxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8Q2hhdFVzZXI0QXBwW10+KHVybCwgY2hhdFVzZXI0QXBwLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG4gIFxyXG4gIFxyXG4gICAgY3JlYXRlQ2hhdChjaGF0NGFwcDogQ2hhdDRBcHApOiBPYnNlcnZhYmxlPENoYXQ0QXBwPiB7XHJcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImNoYXRcIjtcclxuICBcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PENoYXQ0QXBwPih1cmwsIGNoYXQ0YXBwLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG4gICAgY3JlYXRlVXBkYXRlQ2hhdChjaGF0NGFwcDogQ2hhdDRBcHApOiBPYnNlcnZhYmxlPENoYXQ0QXBwPiB7XHJcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImNoYXRcIjtcclxuICBcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8Q2hhdDRBcHA+KHVybCwgY2hhdDRhcHAsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbiAgXHJcbiAgICAvKlxyXG4gICAgZ2V0TGFzdE1lc3NhZ2VHcm91cChjaGF0RXh0ZXJuYWxJZDogc3RyaW5nLCBncm91cElkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPENoYXRVc2VyUmVzcG9uc2U0QXBwPiB7XHJcbiAgXHJcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImNoYXRtZXNzYWdlL2xhc3RNZXNzYWdlR3JvdXA/Y2hhdEV4dGVybmFsSWQ9XCIgKyBjaGF0RXh0ZXJuYWxJZCArIFwiJmdyb3VwSWQ9XCIgKyBncm91cElkO1xyXG4gIFxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxDaGF0VXNlclJlc3BvbnNlNEFwcD4odXJsLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG4gICAgZ2V0TGFzdE1lc3NhZ2UoY2hhdEV4dGVybmFsSWQ6IHN0cmluZywgY2hhdFVzZXJFeHRlcm5hbElkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPENoYXRVc2VyUmVzcG9uc2U0QXBwPiB7XHJcbiAgXHJcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImNoYXRtZXNzYWdlL2xhc3RNZXNzYWdlP2NoYXRFeHRlcm5hbElkPVwiICsgY2hhdEV4dGVybmFsSWQgKyBcIiZjaGF0VXNlckV4dGVybmFsSWQ9XCIgKyBjaGF0VXNlckV4dGVybmFsSWQ7XHJcbiAgXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PENoYXRVc2VyUmVzcG9uc2U0QXBwPih1cmwsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbiAgICAgICAgXHJcbiAgICBjb3VudE5vdFJlYWRNZXNzYWdlcyhjaGF0VXNlckV4dGVybmFsSWQ6IHN0cmluZywgY2hhdEV4dGVybmFsSWQ/OiBzdHJpbmcsIGdyb3VwSWQ/OiBzdHJpbmcsIGZyb21JZD86c3RyaW5nKTogT2JzZXJ2YWJsZTxDaGF0VXNlclJlc3BvbnNlNEFwcD4ge1xyXG4gIFxyXG4gICAgICBsZXQgdXJsID0gdGhpcy5jaGF0VXJsICsgXCJjaGF0bWVzc2FnZS9jb3VudE5vdFJlYWRNZXNzYWdlcz9jaGF0VXNlckV4dGVybmFsSWQ9XCIgKyBjaGF0VXNlckV4dGVybmFsSWQ7XHJcbiAgXHJcbiAgICAgIGlmIChjaGF0RXh0ZXJuYWxJZCAmJiBjaGF0RXh0ZXJuYWxJZC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdXJsICs9IFwiJmNoYXRFeHRlcm5hbElkPVwiICsgY2hhdEV4dGVybmFsSWQ7XHJcbiAgICAgIH1cclxuICBcclxuICAgICAgaWYgKGdyb3VwSWQgJiYgZ3JvdXBJZC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdXJsICs9IFwiJmdyb3VwSWQ9XCIgKyBncm91cElkO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZnJvbUlkICYmIGZyb21JZC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdXJsICs9IFwiJmZyb21JZD1cIiArIGdyb3VwSWQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PENoYXRVc2VyUmVzcG9uc2U0QXBwPih1cmwsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbiAgICAqL1xyXG4gIFxyXG4gICAgZ2V0Q2hhdEJ5RXh0ZXJuYWxJZChleHRlcm5hbElkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPENoYXQ0QXBwPiB7XHJcbiAgXHJcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImNoYXQ/ZXh0ZXJuYWxJZD1cIiArIGV4dGVybmFsSWQ7XHJcbiAgXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PENoYXQ0QXBwPih1cmwsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q2hhdEJ5SWQoaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8Q2hhdDRBcHA+IHtcclxuICBcclxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdD9jaGF0SWQ9XCIgKyBpZDtcclxuICBcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8Q2hhdDRBcHA+KHVybCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBsaXN0Q2hhdEJ5VXNlcihleHRlcm5hbFVzZXJJZDogc3RyaW5nLCB1c2VySWQ6IHN0cmluZywgY2hhdFN0YXR1czogQ2hhdFN0YXR1czRBcHAgKTogT2JzZXJ2YWJsZTxBcnJheTwgQ2hhdDRBcHA+PiB7XHJcbiAgXHJcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImNoYXQvbGlzdENoYXRCeVVzZXIvP2V4dGVybmFsVXNlcklkPVwiICsgZXh0ZXJuYWxVc2VySWQgXHJcbiAgICAgICsgXCImdXNlcklkPVwiICsgdXNlcklkXHJcbiAgICAgICsgXCImY2hhdFN0YXR1cz1cIiArIGNoYXRTdGF0dXM7XHJcbiAgXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEFycmF5PENoYXQ0QXBwPj4odXJsLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGNsb3NlQ2hhdChjaGF0SWQ6IHN0cmluZywgY2hhdEV4dGVybmFsSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8dm9pZD4ge1xyXG4gIFxyXG4gICAgICBsZXQgdXJsID0gdGhpcy5jaGF0VXJsIDtcclxuXHJcbiAgICAgIGlmIChjaGF0SWQgJiYgY2hhdElkLmxlbmd0aCA+IDApe1xyXG4gICAgICAgIHVybCs9IFwiY2hhdD9jaGF0SWQ9XCIgKyBjaGF0SWQ7IFxyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICBpZiAoY2hhdEV4dGVybmFsSWQgJiYgY2hhdEV4dGVybmFsSWQubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgdXJsKz0gXCJjaGF0P2V4dGVybmFsSWQ9XCIgKyBjaGF0RXh0ZXJuYWxJZDsgXHJcbiAgICAgIH1cclxuICBcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5kZWxldGU8dm9pZD4odXJsLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIHJlYWRNZXNzYWdlKGNoYXRNZXNzYWdlSWQ6IHN0cmluZywgdG9JZD86IHN0cmluZyk6IE9ic2VydmFibGU8dm9pZD4ge1xyXG4gIFxyXG4gICAgICBsZXQgdXJsID0gdGhpcy5jaGF0VXJsICsgXCJjaGF0bWVzc2FnZS9yZWFkL1wiICsgY2hhdE1lc3NhZ2VJZDtcclxuICBcclxuICAgICAgaWYgKHRvSWQgJiYgdG9JZC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdXJsICs9IFwiL1wiICsgdG9JZDtcclxuICAgICAgfVxyXG4gIFxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnB1dDx2b2lkPih1cmwsIG51bGwsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBvbmxpbmUoY2hhdElkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xyXG4gIFxyXG4gICAgICBsZXQgdXJsID0gdGhpcy5jaGF0VXJsICsgXCJjaGF0bWVzc2FnZS9vbmxpbmUvXCIgKyBjaGF0SWQgO1xyXG4gIFxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxudW1iZXI+KHVybCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuICAgIHNldE9mZkxpbmUoY2hhdFVzZXJFeHRlcm5hbElkSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8bnVtYmVyPiB7XHJcbiAgXHJcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImNoYXRtZXNzYWdlL3NldC1vZmZsaW5lL1wiICsgY2hhdFVzZXJFeHRlcm5hbElkSWQgO1xyXG4gIFxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxudW1iZXI+KHVybCwgbnVsbCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcblxyXG4gICAgc2VuZEZpbGUoY2hhdElkOiBzdHJpbmcsIGZyb21JZDogc3RyaW5nLCB0b0lkOiBzdHJpbmcsIGZpbGVUb1VwbG9hZDogRmlsZSk6IE9ic2VydmFibGU8Q2hhdE1lc3NhZ2VGaWxlNEFwcD4ge1xyXG4gICAgICBjb25zdCBlbmRwb2ludCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdG1lc3NhZ2Uvc2VuZEZpbGUvXCIgKyBjaGF0SWQgKyBcIi9cIiArIGZyb21JZCArIFwiL1wiICsgdG9JZDtcclxuICBcclxuICAgICAgY29uc3QgZm9ybURhdGE6IEZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XHJcbiAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIGZpbGVUb1VwbG9hZCk7XHJcbiAgXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHBcclxuICAgICAgICAucG9zdDxDaGF0TWVzc2FnZUZpbGU0QXBwPihlbmRwb2ludCwgZm9ybURhdGEsXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcclxuICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG4gIFxyXG4gICAgc2VuZEZpbGVHcm91cChjaGF0SWQ6IHN0cmluZywgZnJvbUlkOiBzdHJpbmcsIGdyb3VwSWQ6IHN0cmluZywgZmlsZVRvVXBsb2FkOiBGaWxlKTogT2JzZXJ2YWJsZTxDaGF0TWVzc2FnZUZpbGU0QXBwPiB7XHJcbiAgICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5jaGF0VXJsICsgXCJjaGF0bWVzc2FnZS9zZW5kRmlsZUdyb3VwL1wiICsgY2hhdElkICsgXCIvXCIgKyBmcm9tSWQgKyBcIi9cIiArIGdyb3VwSWQ7XHJcbiAgXHJcbiAgICAgIGNvbnN0IGZvcm1EYXRhOiBGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xyXG4gICAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCBmaWxlVG9VcGxvYWQpO1xyXG4gIFxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwXHJcbiAgICAgICAgLnBvc3Q8Q2hhdE1lc3NhZ2VGaWxlNEFwcD4oZW5kcG9pbnQsIGZvcm1EYXRhLFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXHJcbiAgICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIC8qXHJcbiAgICB0cmFuc2xhdGVNZXNzYWdlKGNoYXRNZXNzYWdlSWQ6IHN0cmluZywgbGFuZ3VhZ2VUYXJnZXQ6IHN0cmluZyk6IE9ic2VydmFibGU8Q2hhdDRBcHBUcmFuc2xhdGU+IHtcclxuICBcclxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdG1lc3NhZ2UvdHJhbnNsYXRlL1wiICsgY2hhdE1lc3NhZ2VJZCArIFwiL1wiICsgbGFuZ3VhZ2VUYXJnZXQ7XHJcbiAgXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PENoYXQ0QXBwVHJhbnNsYXRlPih1cmwsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbiAgICAqL1xyXG5cclxuICAgIHN0YXJ0VHlwaW5nKGNoYXRJZDogc3RyaW5nLGZyb21JZDogc3RyaW5nLCB0b0lkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICBcclxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiY2hhdG1lc3NhZ2Uvc3RhcnRUeXBpbmcvXCIgKyBjaGF0SWQgKyBcIi9cIiArIGZyb21JZCArIFwiL1wiICsgdG9JZDtcclxuICBcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8dm9pZD4odXJsLCBudWxsLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0VHlwaW5nR3JvdXAoY2hhdElkOiBzdHJpbmcsZnJvbUlkOiBzdHJpbmcsIGdyb3VwSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8dm9pZD4ge1xyXG4gIFxyXG4gICAgICBsZXQgdXJsID0gdGhpcy5jaGF0VXJsICsgXCJjaGF0bWVzc2FnZS9zdGFydFR5cGluZ0dyb3VwL1wiICsgY2hhdElkICsgXCIvXCIgKyBmcm9tSWQgKyBcIi9cIiArIGdyb3VwSWQ7XHJcbiAgXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucHV0PHZvaWQ+KHVybCwgbnVsbCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuICAgIHN0b3BUeXBpbmcoY2hhdElkOiBzdHJpbmcsZnJvbUlkOiBzdHJpbmcsIHRvSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8dm9pZD4ge1xyXG4gIFxyXG4gICAgICBsZXQgdXJsID0gdGhpcy5jaGF0VXJsICsgXCJjaGF0bWVzc2FnZS9zdG9wVHlwaW5nL1wiICsgY2hhdElkICsgXCIvXCIgKyBmcm9tSWQgKyBcIi9cIiArIHRvSWQ7XHJcbiAgXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucHV0PHZvaWQ+KHVybCwgbnVsbCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBzdG9wVHlwaW5nR3JvdXAoY2hhdElkOiBzdHJpbmcsZnJvbUlkOiBzdHJpbmcsIGdyb3VwSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8dm9pZD4ge1xyXG4gIFxyXG4gICAgICBsZXQgdXJsID0gdGhpcy5jaGF0VXJsICsgXCJjaGF0bWVzc2FnZS9zdG9wVHlwaW5nR3JvdXAvXCIgKyBjaGF0SWQgKyBcIi9cIiArIGZyb21JZCArIFwiL1wiICsgZ3JvdXBJZDtcclxuICBcclxuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8dm9pZD4odXJsLCBudWxsLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZUdyb3VwKGdyb3VwOiBDaGF0R3JvdXBBcHApOiBPYnNlcnZhYmxlPENoYXRHcm91cEFwcD4ge1xyXG4gICAgICBsZXQgdXJsID0gdGhpcy5jaGF0VXJsICsgXCJncm91cFwiO1xyXG4gIFxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8Q2hhdEdyb3VwQXBwPih1cmwsIGdyb3VwLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycygpLnNldCgnQXV0aG9yaXphdGlvbicsIHRoaXMuZ2V0QmVhcmVyVG9rZW4oKSlcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG4gICAgZ2V0R3JvdXAoY2hhdElkOiBzdHJpbmcsIGdyb3VwSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8Q2hhdEdyb3VwQXBwPiB7XHJcbiAgXHJcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImdyb3VwL1wiICsgZ3JvdXBJZCArIFwiL1wiICsgY2hhdElkO1xyXG4gIFxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxDaGF0R3JvdXBBcHA+KHVybCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBsaXN0R3JvdXBzKGNoYXRJZD86IHN0cmluZywgZXh0ZXJuYWxJZD86IHN0cmluZyk6IE9ic2VydmFibGU8QXJyYXk8Q2hhdEdyb3VwQXBwPj4ge1xyXG4gIFxyXG4gICAgICBsZXQgdXJsID0gdGhpcy5jaGF0VXJsICsgXCJncm91cC9cIiA7XHJcblxyXG4gICAgICBpZiAoY2hhdElkICYmIGNoYXRJZC5sZW5ndGg+MCkge1xyXG4gICAgICAgIHVybCArPSBcIiZjaGF0SWQ9XCIgKyBjaGF0SWQ7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGV4dGVybmFsSWQgJiYgZXh0ZXJuYWxJZC5sZW5ndGg+MCkge1xyXG4gICAgICAgIHVybCArPSBcIiZleHRlcm5hbElkPVwiICsgZXh0ZXJuYWxJZDtcclxuICAgICAgfVxyXG4gIFxyXG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxBcnJheTxDaGF0R3JvdXBBcHA+Pih1cmwsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgbGlzdEZpbGVzR3JvdXAoY2hhdElkOiBzdHJpbmcsIGdyb3VwSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8QXJyYXk8Q2hhdE1lc3NhZ2VGaWxlNEFwcD4+IHtcclxuICBcclxuICAgICAgbGV0IHVybCA9IHRoaXMuY2hhdFVybCArIFwiZ3JvdXAvXCIgKyBjaGF0SWQgO1xyXG5cclxuICAgICAgaWYgKGdyb3VwSWQgJiYgZ3JvdXBJZC5sZW5ndGg+MCkge1xyXG4gICAgICAgIHVybCArPSBcIiZncm91cElkPVwiICsgY2hhdElkO1xyXG4gICAgICB9XHJcbiAgXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PEFycmF5PENoYXRNZXNzYWdlRmlsZTRBcHA+Pih1cmwsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKCkuc2V0KCdBdXRob3JpemF0aW9uJywgdGhpcy5nZXRCZWFyZXJUb2tlbigpKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgZXZlbnQoZXZlbnROYW1lOiBzdHJpbmcsIGNoYXRVc2VyRXh0ZXJuYWxJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgXHJcbiAgICAgIGxldCB1cmwgPSB0aGlzLmNoYXRVcmwgKyBcImV2ZW50L1wiICsgZXZlbnROYW1lICsgXCI/Y2hhdFVzZXJFeHRlcm5hbElkPVwiICsgY2hhdFVzZXJFeHRlcm5hbElkIDtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLmh0dHAucHV0PHZvaWQ+KHVybCwgbnVsbCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoKS5zZXQoJ0F1dGhvcml6YXRpb24nLCB0aGlzLmdldEJlYXJlclRva2VuKCkpXHJcbiAgICAgICAgfSkgICAgICBcclxuXHJcbiAgICB9XHJcbiAgXHJcbiAgICAvKiBUb2tlbiAqL1xyXG4gICAgZ2V0QmVhcmVyVG9rZW4oKTogc3RyaW5nIHtcclxuICBcclxuICAgICAgbGV0IHJldCA9IFwiQmVhcmVyIFwiICsgd2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oXCJjaGF0NEFwcFNlc3Npb25Ub2tlblwiKTtcclxuICBcclxuICAgICAgcmV0dXJuIHJldDtcclxuICAgIH1cclxuICBcclxuICBcclxuICAgIHNldFRva2VuQ2hhdDRhcHAoY2hhdDRBcHBTZXNzaW9uVG9rZW46IHN0cmluZykge1xyXG4gIFxyXG4gIFxyXG4gICAgICB3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShcImNoYXQ0QXBwU2Vzc2lvblRva2VuXCIsIGNoYXQ0QXBwU2Vzc2lvblRva2VuKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGVuc3VyZUNvbm4oKSB7XHJcblxyXG4gICAgICBpZiAodGhpcy5kZWJ1Zykge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGBjaGF0U2VydmVyOiAke3RoaXMuY2hhdFNlcnZlcn1gKTtcclxuICAgICAgICBjb25zb2xlLmxvZyhgdXNlcklkOiAke3RoaXMuY2hhdFVzZXJFeHRlcm5hbElkfWApO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGBnZXRCZWFyZXJUb2tlbjogJHsgdGhpcy5nZXRCZWFyZXJUb2tlbigpfWApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCB0aGF0ID0gdGhpcztcclxuXHJcbiAgICAgIGxldCB1cmlTdGVwMTogc3RyaW5nID0gdGhpcy5jaGF0U2VydmVyLnJlcGxhY2UoL15odHRwcy8sICd3c3MnKTtcclxuXHJcbiAgICAgIGxldCBzZXJ2ZXI6IHN0cmluZyA9IHVyaVN0ZXAxLnJlcGxhY2UoLyhcXC9cXC8uKj8pXFwvLywgJyQxXFwvd3MvJyk7XHJcblxyXG4gICAgICBpZiAodGhpcy5kZWJ1Zykge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGB3cyBzZXJ2ZXI6ICR7c2VydmVyfWApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGF0LmRpc2Nvbm5lY3RJbnRlcm5hbCh0cnVlKTtcclxuICAgICAgICBcclxuICAgICAgTkFUUy5jb25uZWN0KHsgdXJsOiBzZXJ2ZXIsIHVzZXI6IHRoaXMuY2hhdFVzZXJFeHRlcm5hbElkLCBwYXNzOiB0aGlzLmdldEJlYXJlclRva2VuKCksIHJlY29ubmVjdDogZmFsc2V9KVxyXG4gICAgICAgIC50aGVuKChuYykgPT4ge1xyXG4gICAgICAgICAgdGhhdC5uYyA9IG5jO1xyXG5cclxuICAgICAgICAgIGNvbnN0IHN1YmplY3QgPSBgY2hhdDRhcHAuY29uZmlnLiR7dGhpcy5jb25maWdJZH0udXNlci4ke3RoaXMuY2hhdFVzZXJFeHRlcm5hbElkfWA7IFxyXG5cclxuICAgICAgICAgIGNvbnN0IHN1YiA9IHRoYXQubmMuc3Vic2NyaWJlKHN1YmplY3QsIChtc2cpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhtc2cpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NBbmRDYWxsYmFjayhKU09OLnBhcnNlKG1zZy5kYXRhKSkgIDtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5pbnRlcnZhbCkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbCk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoYXQuaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKT0+e1xyXG4gICAgICAgICAgICBpZiAodGhhdC5kZWJ1Zykge1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBwdWJsaXNoIGNoYXQ0YXBwLnVzZXIub25saW5lICR7dGhpcy5jaGF0VXNlckV4dGVybmFsSWR9IGApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgdGhhdC5uYy5wdWJsaXNoKGBjaGF0NGFwcC51c2VyLm9ubGluZWAsIHRoaXMuY2hhdFVzZXJFeHRlcm5hbElkKSA7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5kZWJ1Zykge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJ0cnkgcmVjb25uZWN0Li4uXCIpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB0aGlzLmVuc3VyZUNvbm4oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgIH0sMTAwMCk7XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYFN1YnNjcmliZSBvbmxpbmUgY2hhdDRhcHAudXNlci4ke3RoaXMuY2hhdFVzZXJFeHRlcm5hbElkfS5vbmxpbmVgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgXHJcbiAgICAgICAgfSlcclxuICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xyXG4gICAgICAgICAgLy8gTm90aWZpY2EgbyBjaGFtYWRvciBzb2JyZSBvIGVycm8gbmEgY29uZXjDo29cclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJOQVRTIEVycm9yOlwiLCBlcnIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGRpc2Nvbm5lY3QoKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmRpc2Nvbm5lY3RJbnRlcm5hbChmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBkaXNjb25uZWN0SW50ZXJuYWwoaWdub3JlT2ZmTGluZTogYm9vbGVhbikge1xyXG5cclxuICAgICAgLy8gQ2hlY2sgaG93IHdlIGNhbiBkaXNjb25uZWN0XHJcblxyXG4gICAgICBpZiAodGhpcy5pbnRlcnZhbCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWwpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgIFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFpZ25vcmVPZmZMaW5lICYmIHRoaXMubmMgJiYgdGhpcy5jaGF0VXNlckV4dGVybmFsSWQgJiYgdGhpcy5jaGF0VXNlckV4dGVybmFsSWQubGVuZ3RoID4gMCAmJiB0aGlzLmdldEJlYXJlclRva2VuKCkgJiYgdGhpcy5nZXRCZWFyZXJUb2tlbigpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgdGhpcy5zZXRPZmZMaW5lKHRoaXMuY2hhdFVzZXJFeHRlcm5hbElkKS50b1Byb21pc2UoKTtcclxuICAgICAgICAgIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmxvZyhcImhhZCBzZXQgb2ZmbGluZVwiKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5kZWJ1ZykgY29uc29sZS5lcnJvcihcIkVycm8gYW8gc2V0YXIgb2ZmbGluZVwiLCBlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5uYykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICB0aGlzLm5jLmNsb3NlKCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuZGVidWcpe1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm5jID0gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5kZWJ1Zyl7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJkaXNjb25lY3RcIilcclxuICAgICAgfVxyXG4gICAgICBcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHByb2Nlc3NBbmRDYWxsYmFjayhtc2dPYmo6IGFueSkge1xyXG5cclxuICAgICAgICBpZiAodGhpcy5kZWJ1ZyAmJiBtc2dPYmopIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiTXNnIFJlY2VpdmVkOiBcIiArIEpTT04uc3RyaW5naWZ5KG1zZ09iaikpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAvL2lmICghY2hhdENhbGxiYWNrLmlzVG9rZW5GaXJlYmFzZUFjdGl2ZSgpKSB7XHJcblxyXG4gICAgICAgICAgbGV0IGRhdFRtcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XHJcblxyXG4gICAgICAgICAgZm9yIChsZXQga2V5IGluIG1zZ09iai5kYXRhKSB7XHJcbiAgICAgICAgICAgIGRhdFRtcC5zZXQoa2V5LCBtc2dPYmouZGF0YVtrZXldKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBtc2dPYmouZGF0YS5hbGwgPSBkYXRUbXA7XHJcblxyXG4gICAgICAgICAgaWYgKG1zZ09iai5kYXRhLnR5cGUgPT0gXCJtc2dcIikge1xyXG4gICAgICAgICAgICB0aGlzLmNoYXRDYWxsYmFjay5vbk1lc3NhZ2UobXNnT2JqKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoKG1zZ09iai5kYXRhLnR5cGUgPT0gXCJvblwiIHx8IG1zZ09iai5kYXRhLnR5cGUgPT0gXCJvZmZcIikpIHtcclxuICAgICAgICAgICAgdGhpcy5jaGF0Q2FsbGJhY2sub25PZmZsaW5lKG1zZ09iaik7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKG1zZ09iai5kYXRhLnR5cGUgPT0gXCJyZWFkXCIgKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2hhdENhbGxiYWNrLm9uUmVhZChtc2dPYmopO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChtc2dPYmouZGF0YS50eXBlID09IFwic3RhcnRUeXBpbmdcIiB8fCAgbXNnT2JqLmRhdGEudHlwZSA9PSBcInN0b3BUeXBpbmdcIikge1xyXG4gICAgICAgICAgICB0aGlzLmNoYXRDYWxsYmFjay5vblN0YXJ0U3RvcFR5cGluZyhtc2dPYmopO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChtc2dPYmouZGF0YS50eXBlID09IFwibmV3X3VzZXJcIikge1xyXG4gICAgICAgICAgICB0aGlzLmNoYXRDYWxsYmFjay5vbk5ld1VzZXIobXNnT2JqKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAobXNnT2JqLmRhdGEudHlwZSA9PSBcInJlbW92ZV91c2VyXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5jaGF0Q2FsbGJhY2sub25SZW1vdmVVc2VyKG1zZ09iaik7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKG1zZ09iai5kYXRhLnR5cGUgPT0gXCJjaGF0X2Nsb3NlZFwiKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2hhdENhbGxiYWNrLm9uQ2hhdENsb3NlZChtc2dPYmopO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChtc2dPYmouZGF0YS50eXBlID09IFwiY291bnRfbm90cmVhZFwiKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2hhdENhbGxiYWNrLm9uQ291bnROb3RSZWFkKG1zZ09iaik7XHJcblxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIC8vfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNvbm5lY3RXZWJzb2NrZXQoKSB7XHJcbiAgICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xyXG4gICAgICB0aGlzLmRpc2Nvbm5lY3RJbnRlcm5hbCh0cnVlKTtcclxuICBcclxuICAgICAgbGV0IHNlY3VyaXR5VG9rZW4gPSB0aGlzLmdldEJlYXJlclRva2VuKCk7XHJcblxyXG4gICAgICBsZXQgdG9rZW5BdXRoID0gXCJcIjtcclxuXHJcbiAgICAgIGlmIChzZWN1cml0eVRva2VuICYmIHNlY3VyaXR5VG9rZW4uc3RhcnRzV2l0aChcIkJlYXJlciBcIikpe1xyXG4gICAgICAgIHRva2VuQXV0aCA9IHNlY3VyaXR5VG9rZW47XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdG9rZW5BdXRoID0gXCJCZWFyZXIgXCIgKyBzZWN1cml0eVRva2VuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmNvbmZpZ0lkID0gdGhpcy5jaGF0U2VydmVyLnNwbGl0KFwiL1wiKVszXTtcclxuXHJcbiAgICAgIHRoaXMuZW5zdXJlQ29ubigpO1xyXG4gICAgfVxyXG4gICAgY29udmVydENoYXQ0QXBwTWVzc2FnZVJlY2VpdmVUb0NoYXRNZXNzYWdlNEFwcChtc2c6IENoYXQ0QXBwTWVzc2FnZVJlY2VpdmUpOiBDaGF0TWVzc2FnZTRBcHB7XHJcbiAgICAgIGxldCBtZXNzYWdlID0gbmV3IENoYXRNZXNzYWdlNEFwcCgpO1xyXG4gICAgICBtZXNzYWdlLmJvZHkgPSBtc2c/Lm5vdGlmaWNhdGlvbj8uYm9keTtcclxuICAgICAgbWVzc2FnZS5jaGF0SWQgPSBtc2cuZGF0YS5jaGF0SWQ7XHJcbiAgICAgIG1lc3NhZ2UuZnJvbUlkID0gbXNnLmRhdGEuZnJvbUlkO1xyXG4gICAgICBtZXNzYWdlLnRvSWQgPSBtc2cuZGF0YS50b0lkO1xyXG4gICAgICBtZXNzYWdlLmdyb3VwSWQgPSBtc2cuZGF0YS5ncm91cElkO1xyXG4gICAgICBtZXNzYWdlLnJlcGx5RnJvbSA9IG1zZy5kYXRhLnJlcGx5RnJvbTtcclxuICAgICAgaWYgKG1zZy5kYXRhLmRhdGVIb3VyICYmIG1zZy5kYXRhLmRhdGVIb3VyLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBtZXNzYWdlLmRhdGVIb3VySW5jbHVkZWQgPSBtc2cuZGF0YS5kYXRlSG91ci5zdWJzdHJpbmcoNiwxMCkgKyBcIi1cIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtc2cuZGF0YS5kYXRlSG91ci5zdWJzdHJpbmcoMyw1KSArIFwiLVwiICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtc2cuZGF0YS5kYXRlSG91ci5zdWJzdHJpbmcoMCwyKSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtc2cuZGF0YS5kYXRlSG91ci5zdWJzdHJpbmcoMTApIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7XHJcbiAgICAgIH1cclxuICAgICAgbWVzc2FnZS5pZCA9IG1zZy5kYXRhLmNoYXRNZXNzYWdlSWQ7XHJcblxyXG4gICAgICBpZiAobXNnLmRhdGEuZmlsZUlkICYmIG1zZy5kYXRhLmZpbGVJZC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgbGV0IG1lc3NhZ2VGaWxlID0gbmV3IENoYXRNZXNzYWdlRmlsZTRBcHAoKTtcclxuICAgICAgICBcclxuICAgICAgICBtZXNzYWdlRmlsZS5pZCA9IG1zZy5kYXRhLmZpbGVJZDtcclxuICAgICAgICBtZXNzYWdlRmlsZS5uYW1lID0gbXNnLmRhdGEuZmlsZU5hbWU7XHJcbiAgICAgICAgbWVzc2FnZUZpbGUuc2l6ZSA9IG1zZy5kYXRhLmZpbGVTaXplO1xyXG4gICAgICAgIG1lc3NhZ2VGaWxlLnR5cGUgPSBtc2cuZGF0YS5maWxlVHlwZTtcclxuXHJcbiAgICAgICAgbWVzc2FnZS5jaGF0TWVzc2FnZUZpbGUgPSBtZXNzYWdlRmlsZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKG1zZy5kYXRhLnZGaWxlSWQgJiYgbXNnLmRhdGEudkZpbGVJZC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgbGV0IG1lc3NhZ2VGaWxlID0gbmV3IENoYXRNZXNzYWdlRmlsZTRBcHAoKTtcclxuICAgICAgICBcclxuICAgICAgICBtZXNzYWdlRmlsZS5pZCA9IG1zZy5kYXRhLnZGaWxlSWQ7XHJcbiAgICAgICAgbWVzc2FnZUZpbGUubmFtZSA9IG1zZy5kYXRhLnZGaWxlTmFtZTtcclxuICAgICAgICBtZXNzYWdlRmlsZS5zaXplID0gbXNnLmRhdGEudkZpbGVTaXplO1xyXG4gICAgICAgIG1lc3NhZ2VGaWxlLnR5cGUgPSBtc2cuZGF0YS52RmlsZVR5cGU7XHJcblxyXG4gICAgICAgIG1lc3NhZ2UuY2hhdFZvaWNlRmlsZSA9IG1lc3NhZ2VGaWxlO1xyXG4gICAgICB9XHJcblxyXG5cclxuICAgICAgcmV0dXJuIG1lc3NhZ2U7XHJcblxyXG4gICAgfVxyXG4gIFxyXG4gIH1cclxuICBcclxuICBcclxuICBleHBvcnQgY2xhc3MgQ2hhdDRBcHAge1xyXG4gICAgaWQ6IHN0cmluZztcclxuICAgIGNvbmZpZ0lkOiBzdHJpbmc7XHJcbiAgICBleHRlcm5hbElkOiBzdHJpbmc7XHJcbiAgICB0aXRsZTogc3RyaW5nO1xyXG4gICAgc3RhdHVzOiBDaGF0U3RhdHVzNEFwcDtcclxuICAgIHVzZXJzOiBBcnJheTxDaGF0VXNlcjRBcHA+O1xyXG5cclxuICAgIG1ldGE6IEFycmF5PENoYXRNZXNzYWdlTWV0YTRBcHA+O1xyXG4gIFxyXG4gIH1cclxuICBleHBvcnQgY2xhc3MgQ2hhdFVzZXI0QXBwIHtcclxuICAgIGlkOiBzdHJpbmc7XHJcbiAgICBuYW1lOiBzdHJpbmc7XHJcbiAgICBjbGllbnRUb2tlbjogc3RyaW5nO1xyXG4gICAgcGljdHVyZVBhdGg6IHN0cmluZztcclxuICAgIGVtYWlsOiBzdHJpbmc7XHJcbiAgICBwaG9uZU51bWJlcjogc3RyaW5nO1xyXG4gICAgZXh0ZXJuYWxJZDogc3RyaW5nO1xyXG4gICAgbWV0YTogQXJyYXk8Q2hhdE1lc3NhZ2VNZXRhNEFwcD47XHJcbiAgICBzdGF0dXM6IENoYXRVc2VyU3RhdHVzNEFwcDtcclxuICB9XHJcbiAgZXhwb3J0IGNsYXNzIENoYXRNZXNzYWdlNEFwcCB7XHJcbiAgICBpZDogc3RyaW5nO1xyXG4gICAgZnJvbUlkOiBzdHJpbmc7XHJcbiAgICB0b0lkOiBzdHJpbmc7XHJcbiAgICBjaGF0SWQ6IHN0cmluZztcclxuICAgIHRpdGxlOiBzdHJpbmc7XHJcbiAgICBib2R5OiBzdHJpbmc7XHJcbiAgICBtZXRhOiBBcnJheTxDaGF0TWVzc2FnZU1ldGE0QXBwPjtcclxuICAgIGdyb3VwSWQ6IHN0cmluZztcclxuICAgIHJlYWQ6IEJvb2xlYW47XHJcbiAgICByZXBseUZyb206IHN0cmluZztcclxuICAgIGRhdGVIb3VySW5jbHVkZWQ6IHN0cmluZztcclxuICAgIGdUb0lkUmVhZDogc3RyaW5nW107XHJcbiAgICBjaGF0TWVzc2FnZUZpbGU6IENoYXRNZXNzYWdlRmlsZTRBcHA7XHJcbiAgICBjaGF0Vm9pY2VGaWxlOiBDaGF0TWVzc2FnZUZpbGU0QXBwO1xyXG4gIH1cclxuICBleHBvcnQgY2xhc3MgQ2hhdE1lc3NhZ2VGaWxlNEFwcCB7XHJcbiAgICBpZDogc3RyaW5nO1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAgdHlwZTogc3RyaW5nO1xyXG4gICAgc2l6ZTogbnVtYmVyO1xyXG4gICAgZnVsbFBhdGg6IHN0cmluZztcclxuICB9XHJcbiAgZXhwb3J0IGNsYXNzIENoYXRNZXNzYWdlTWV0YTRBcHAge1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAgdmFsdWU6IHN0cmluZztcclxuICB9XHJcbiAgZXhwb3J0IGNsYXNzIENoYXQ0QXBwTWVzc2FnZVJlY2VpdmUge1xyXG4gICAgZGF0YTogQ2hhdDRBcHBNZXNzYWdlUmVjZWl2ZURhdGEgPSBuZXcgQ2hhdDRBcHBNZXNzYWdlUmVjZWl2ZURhdGEoKTtcclxuICAgIG5vdGlmaWNhdGlvbjogQ2hhdDRBcHBNZXNzYWdlUmVjZWl2ZU5vdGlmaWNhdGlvbiA9IG5ldyBDaGF0NEFwcE1lc3NhZ2VSZWNlaXZlTm90aWZpY2F0aW9uKCk7XHJcbiAgICB0b2tlbjogc3RyaW5nO1xyXG4gIH1cclxuICBleHBvcnQgY2xhc3MgQ2hhdDRBcHBNZXNzYWdlUmVjZWl2ZURhdGEge1xyXG4gICAgdG9JZDogc3RyaW5nO1xyXG4gICAgY2hhdElkOiBzdHJpbmc7XHJcbiAgICBkYXRlSG91cjogc3RyaW5nO1xyXG4gICAgY2hhdE1lc3NhZ2VJZDogc3RyaW5nO1xyXG4gICAgZXh0ZXJuYWxJZDogc3RyaW5nO1xyXG4gICAgdHlwZTogc3RyaW5nO1xyXG4gICAgZnJvbUlkOiBzdHJpbmc7XHJcbiAgICByZXBseUZyb206IHN0cmluZztcclxuICAgIGdyb3VwSWQ6IHN0cmluZztcclxuICAgIGZpbGVJZDogc3RyaW5nO1xyXG4gICAgZmlsZU5hbWU6IHN0cmluZztcclxuICAgIGZpbGVTaXplOiBudW1iZXI7XHJcbiAgICBmaWxlVHlwZTogc3RyaW5nO1xyXG4gICAgdkZpbGVJZDogc3RyaW5nO1xyXG4gICAgdkZpbGVOYW1lOiBzdHJpbmc7XHJcbiAgICB2RmlsZVNpemU6IG51bWJlcjtcclxuICAgIHZGaWxlVHlwZTogc3RyaW5nO1xyXG5cclxuICAgIGFsbDogTWFwPHN0cmluZywgc3RyaW5nPjtcclxuICB9XHJcbiAgZXhwb3J0IGNsYXNzIENoYXQ0QXBwTWVzc2FnZVJlY2VpdmVOb3RpZmljYXRpb24ge1xyXG4gICAgYm9keTogc3RyaW5nO1xyXG4gIH1cclxuICBcclxuICBleHBvcnQgY2xhc3MgQ2hhdFVzZXJSZXNwb25zZTRBcHAge1xyXG4gICAgdG90YWxNZXNzYWdlczogbnVtYmVyO1xyXG4gICAgY2hhdDogQ2hhdDRBcHA7XHJcbiAgICBjaGF0TWVzc2FnZTogQ2hhdE1lc3NhZ2U0QXBwO1xyXG4gICAgY2hhdHM6IENoYXRVc2VyUmVzcG9uc2U0QXBwW107XHJcbiAgfVxyXG4gIGV4cG9ydCBjbGFzcyBDaGF0RmlsdGVyUmVxdWVzdDRBcHAge1xyXG4gICAgdHlwZTogQ2hhdEZpbHRlclR5cGU7XHJcbiAgICBjaGF0RXh0ZXJuYWxJZDogc3RyaW5nO1xyXG4gICAgY2hhdFVzZXJFeHRlcm5hbElkOiBzdHJpbmc7XHJcbiAgICBjaGF0VXNlckV4dGVybmFsVG9JZDogc3RyaW5nO1xyXG4gICAgZ3JvdXBJZDogc3RyaW5nO1xyXG4gICAgZnJvbUlkOiBzdHJpbmc7XHJcbiAgfVxyXG4gIGV4cG9ydCBjbGFzcyBDaGF0NEFwcENvbmZpZyB7XHJcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgZW5kcG9pbnQ6IHN0cmluZywgcHVibGljIGRlYnVnPzogYm9vbGVhbikge1xyXG4gICAgICBcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGV4cG9ydCBjbGFzcyBDaGF0NEFwcFRyYW5zbGF0ZSB7XHJcbiAgICB0ZXh0OiBzdHJpbmc7XHJcbiAgICB0cmFuc2xhdGVkVGV4dDogc3RyaW5nO1xyXG4gICAgb3JpZ2luYWxTb3VyY2VMYW5ndWFnZUNvZGU6IHN0cmluZztcclxuICAgIHNvdXJjZUxhbmd1YWdlQ29kZTogc3RyaW5nO1xyXG4gICAgdGFyZ2V0TGFuZ3VhZ2VDb2RlOiBzdHJpbmc7XHJcbiAgICBtZXNzYWdlSWQ6IHN0cmluZztcclxuICB9XHJcblxyXG4gIGV4cG9ydCBjbGFzcyBDaGF0R3JvdXBBcHAge1xyXG4gICAgaWQ6IHN0cmluZztcclxuICAgIGNoYXRJZDogc3RyaW5nO1xyXG4gICAgZXh0ZXJuYWxJZDogc3RyaW5nO1xyXG4gICAgdGl0bGU6IHN0cmluZztcclxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XHJcbiAgICB1c2VyczogQXJyYXk8c3RyaW5nPjtcclxuICAgIGZpbGVzOiBBcnJheTxDaGF0TWVzc2FnZUZpbGU0QXBwPjtcclxuICAgIG1ldGE6IEFycmF5PENoYXRNZXNzYWdlTWV0YTRBcHA+O1xyXG4gICAgc3RhdHVzOiBHcm91cFN0YXR1czRBcHA7XHJcbiAgfVxyXG5cclxuICBcclxuICBleHBvcnQgZW51bSBDaGF0U3RhdHVzNEFwcCB7XHJcbiAgICBDUkVBVEVEID0gXCJDUkVBVEVEXCIsXHJcbiAgICBDTE9TRUQgPSBcIkNMT1NFRFwiXHJcbiAgXHJcbiAgfVxyXG4gIGV4cG9ydCBlbnVtIENoYXRVc2VyU3RhdHVzNEFwcCB7XHJcbiAgICBSRU1PVkVEID0gXCJSRU1PVkVEXCJcclxuICBcclxuICB9XHJcbiAgZXhwb3J0IGVudW0gQ2hhdEZpbHRlclR5cGUge1xyXG4gICAgQ09VTlRfTk9UX1JFQUQgPSAxLFxyXG4gICAgTEFTVF9NRVNTQUdFID0gMlxyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGVudW0gR3JvdXBTdGF0dXM0QXBwIHtcclxuICAgIENSRUFURUQgPSBcIkNSRUFURURcIixcclxuICAgIENMT1NFRCA9IFwiUkVNT1ZFRFwiXHJcbiAgfVxyXG5cclxuICBcclxuICBleHBvcnQgaW50ZXJmYWNlIElDaGF0Q2FsbGJhY2sge1xyXG4gICAgaXNUb2tlbkZpcmViYXNlQWN0aXZlKCk6IEJvb2xlYW47XHJcbiAgICBvbk1lc3NhZ2UobXNnOiBDaGF0NEFwcE1lc3NhZ2VSZWNlaXZlKTogdm9pZDtcclxuICAgIG9uT2ZmbGluZShtc2c6IENoYXQ0QXBwTWVzc2FnZVJlY2VpdmUpOiB2b2lkO1xyXG4gICAgb25SZWFkKG1zZzogQ2hhdDRBcHBNZXNzYWdlUmVjZWl2ZSk6IHZvaWQ7XHJcbiAgICBvblN0YXJ0U3RvcFR5cGluZyhtc2c6IENoYXQ0QXBwTWVzc2FnZVJlY2VpdmUpOiB2b2lkO1xyXG4gICAgb25OZXdVc2VyKG1zZzogQ2hhdDRBcHBNZXNzYWdlUmVjZWl2ZSk6IHZvaWQ7XHJcbiAgICBvblJlbW92ZVVzZXIobXNnOiBDaGF0NEFwcE1lc3NhZ2VSZWNlaXZlKTogdm9pZDtcclxuICAgIG9uQ2hhdENsb3NlZChtc2c6IENoYXQ0QXBwTWVzc2FnZVJlY2VpdmUpOiB2b2lkO1xyXG4gICAgb25Db3VudE5vdFJlYWQobXNnOiBDaGF0NEFwcE1lc3NhZ2VSZWNlaXZlKTogdm9pZDtcclxuICB9XHJcbiAgIl19