@sabstravtech/obtservices 0.0.22051001 → 0.1.6161600

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.
Files changed (166) hide show
  1. package/angular/components/basket-panel.d.ts +1 -0
  2. package/angular/fetchers.d.ts +5 -0
  3. package/angular/lib/vendor/fetchers/get-companies.fetcher.d.ts +7 -0
  4. package/angular/lib/vendor/fetchers/get-company.fetcher.d.ts +7 -0
  5. package/angular/lib/vendor/fetchers/get-office.fetcher.d.ts +7 -0
  6. package/angular/lib/vendor/fetchers/get-user-default-mi-value.fetcher.d.ts +7 -0
  7. package/angular/lib/vendor/fetchers/get-user-guests.fetcher.d.ts +7 -0
  8. package/angular/lib/vendor/services/enterprise-basket.service.d.ts +4 -3
  9. package/angular/lib/vendor/services/logon.service.d.ts +2 -1
  10. package/angular/lib/vendor/services/user.service.d.ts +9 -3
  11. package/angular/lib/vendor/types/graphql.angular.types.d.ts +614 -550
  12. package/angular/lib/vendor/updaters/create-guest-updater.d.ts +6 -0
  13. package/angular/sabstravtech-obtservices-angular.metadata.json +1 -1
  14. package/angular/updaters.d.ts +1 -0
  15. package/base/fetchers.d.ts +5 -0
  16. package/base/lib/vendor/classes/base-enterprise.d.ts +7 -1
  17. package/base/lib/vendor/classes/basket-info-mi-details.impl.d.ts +2 -0
  18. package/base/lib/vendor/classes/bookable-basket.d.ts +2 -0
  19. package/base/lib/vendor/classes/cabhire-enterprise-search.d.ts +9 -4
  20. package/base/lib/vendor/classes/carhire-enterprise-search.d.ts +12 -4
  21. package/base/lib/vendor/classes/eurostar-enterprise-search.d.ts +14 -7
  22. package/base/lib/vendor/classes/fast-track-enterprise-search.d.ts +5 -4
  23. package/base/lib/vendor/classes/flight-enterprise-search.d.ts +16 -5
  24. package/base/lib/vendor/classes/helpers.d.ts +6 -1
  25. package/base/lib/vendor/classes/hotel-enterprise-search.d.ts +10 -3
  26. package/base/lib/vendor/classes/irl-enterprise-search.d.ts +13 -8
  27. package/base/lib/vendor/classes/lounges-enterprise-search.d.ts +5 -4
  28. package/base/lib/vendor/classes/management-info-and-valid.d.ts +3 -3
  29. package/base/lib/vendor/classes/modal-types.enum.d.ts +1 -0
  30. package/base/lib/vendor/classes/parking-enterprise-search.d.ts +5 -4
  31. package/base/lib/vendor/classes/rail-enterprise-search.d.ts +10 -8
  32. package/base/lib/vendor/classes/supplementary-booking-info-impl.d.ts +5 -3
  33. package/base/lib/vendor/classes/user-favourite.enum.d.ts +1 -0
  34. package/base/lib/vendor/fetchers/eurostar-quote.fetcher.d.ts +3 -1
  35. package/base/lib/vendor/fetchers/flight-quote.fetcher.d.ts +1 -0
  36. package/base/lib/vendor/fetchers/get-companies.fetcher.d.ts +21 -0
  37. package/base/lib/vendor/fetchers/get-company.fetcher.d.ts +20 -0
  38. package/base/lib/vendor/fetchers/get-office.fetcher.d.ts +20 -0
  39. package/base/lib/vendor/fetchers/get-user-default-mi-value.fetcher.d.ts +21 -0
  40. package/base/lib/vendor/fetchers/get-user-guests.fetcher.d.ts +20 -0
  41. package/base/lib/vendor/fetchers/search-users-can-book-for-fetcher.d.ts +2 -2
  42. package/base/lib/vendor/interfaces/Icabhire-enterprise-search.d.ts +2 -0
  43. package/base/lib/vendor/interfaces/Icarhire-enterprise-search.d.ts +5 -2
  44. package/base/lib/vendor/interfaces/Ienterprise-basket.service.d.ts +8 -6
  45. package/base/lib/vendor/interfaces/Ieurostar-enterprise-search.d.ts +1 -0
  46. package/base/lib/vendor/interfaces/Ifast-track-enterprise-search.d.ts +7 -5
  47. package/base/lib/vendor/interfaces/Iflight-enterprise-search.d.ts +8 -1
  48. package/base/lib/vendor/interfaces/Ihotel-enterprise-search.d.ts +8 -2
  49. package/base/lib/vendor/interfaces/Iirl-enterprise-search.d.ts +8 -7
  50. package/base/lib/vendor/interfaces/Ilounges-enterprise-search.d.ts +1 -0
  51. package/base/lib/vendor/interfaces/Imybookings.service.d.ts +3 -2
  52. package/base/lib/vendor/interfaces/Iparking-enterprise-search.d.ts +1 -0
  53. package/base/lib/vendor/interfaces/Irail-enterprise-search.d.ts +5 -2
  54. package/base/lib/vendor/interfaces/Isearch.service.d.ts +5 -2
  55. package/base/lib/vendor/interfaces/Isupplementary-booking-info-impl.d.ts +3 -2
  56. package/base/lib/vendor/interfaces/Iuser.service.d.ts +11 -3
  57. package/base/lib/vendor/interfaces/car-hire-search-arg.interface.d.ts +2 -3
  58. package/base/lib/vendor/interfaces/rail-basket-item.interface.d.ts +2 -0
  59. package/base/lib/vendor/interfaces/summary-interface.d.ts +6 -0
  60. package/base/lib/vendor/interfaces/user.data.d.ts +1 -0
  61. package/base/lib/vendor/models/traveller.object.d.ts +12 -2
  62. package/base/lib/vendor/services/enterprise-basket.service.d.ts +22 -9
  63. package/base/lib/vendor/services/logon.service.d.ts +5 -1
  64. package/base/lib/vendor/services/my-bookings.service.d.ts +3 -2
  65. package/base/lib/vendor/services/search.service.d.ts +27 -23
  66. package/base/lib/vendor/services/url.service.d.ts +2 -0
  67. package/base/lib/vendor/services/user.service.d.ts +36 -5
  68. package/base/lib/vendor/services/webtoken.service.d.ts +6 -0
  69. package/base/lib/vendor/types/graphql.types.d.ts +581 -549
  70. package/base/lib/vendor/types/types.d.ts +48 -6
  71. package/base/lib/vendor/updaters/create-guest-updater.d.ts +19 -0
  72. package/base/sabstravtech-obtservices-base.d.ts +1 -1
  73. package/base/sabstravtech-obtservices-base.metadata.json +1 -1
  74. package/base/updaters.d.ts +1 -0
  75. package/bundles/sabstravtech-obtservices-angular.umd.js +541 -252
  76. package/bundles/sabstravtech-obtservices-angular.umd.js.map +1 -1
  77. package/bundles/sabstravtech-obtservices-angular.umd.min.js +1 -1
  78. package/bundles/sabstravtech-obtservices-angular.umd.min.js.map +1 -1
  79. package/bundles/sabstravtech-obtservices-base.umd.js +4080 -1471
  80. package/bundles/sabstravtech-obtservices-base.umd.js.map +1 -1
  81. package/bundles/sabstravtech-obtservices-base.umd.min.js +2 -2
  82. package/bundles/sabstravtech-obtservices-base.umd.min.js.map +1 -1
  83. package/esm2015/angular/components/basket-panel.js +16 -7
  84. package/esm2015/angular/fetchers.js +6 -1
  85. package/esm2015/angular/lib/vendor/fetchers/get-companies.fetcher.js +25 -0
  86. package/esm2015/angular/lib/vendor/fetchers/get-company.fetcher.js +25 -0
  87. package/esm2015/angular/lib/vendor/fetchers/get-office.fetcher.js +25 -0
  88. package/esm2015/angular/lib/vendor/fetchers/get-user-default-mi-value.fetcher.js +25 -0
  89. package/esm2015/angular/lib/vendor/fetchers/get-user-guests.fetcher.js +25 -0
  90. package/esm2015/angular/lib/vendor/services/enterprise-basket.service.js +24 -21
  91. package/esm2015/angular/lib/vendor/services/http-call.service.js +1 -1
  92. package/esm2015/angular/lib/vendor/services/logon.service.js +8 -5
  93. package/esm2015/angular/lib/vendor/services/search.service.js +1 -1
  94. package/esm2015/angular/lib/vendor/services/ticket-queue.service.js +4 -1
  95. package/esm2015/angular/lib/vendor/services/user.service.js +28 -10
  96. package/esm2015/angular/lib/vendor/services/webtoken.service.js +6 -2
  97. package/esm2015/angular/lib/vendor/types/graphql.angular.types.js +1023 -1220
  98. package/esm2015/angular/lib/vendor/updaters/create-guest-updater.js +22 -0
  99. package/esm2015/angular/updaters.js +2 -1
  100. package/esm2015/base/fetchers.js +6 -1
  101. package/esm2015/base/lib/vendor/classes/base-enterprise.js +12 -3
  102. package/esm2015/base/lib/vendor/classes/basket-info-mi-details.impl.js +14 -1
  103. package/esm2015/base/lib/vendor/classes/bookable-basket.js +27 -8
  104. package/esm2015/base/lib/vendor/classes/cabhire-enterprise-search.js +219 -18
  105. package/esm2015/base/lib/vendor/classes/carhire-enterprise-search.js +235 -67
  106. package/esm2015/base/lib/vendor/classes/eurostar-enterprise-search.js +462 -49
  107. package/esm2015/base/lib/vendor/classes/fast-track-enterprise-search.js +37 -13
  108. package/esm2015/base/lib/vendor/classes/flight-enterprise-search.js +281 -62
  109. package/esm2015/base/lib/vendor/classes/helpers.js +32 -3
  110. package/esm2015/base/lib/vendor/classes/hotel-enterprise-search.js +228 -54
  111. package/esm2015/base/lib/vendor/classes/irl-enterprise-search.js +221 -46
  112. package/esm2015/base/lib/vendor/classes/lounges-enterprise-search.js +101 -14
  113. package/esm2015/base/lib/vendor/classes/management-info-and-valid.js +67 -40
  114. package/esm2015/base/lib/vendor/classes/modal-types.enum.js +2 -1
  115. package/esm2015/base/lib/vendor/classes/parking-enterprise-search.js +146 -11
  116. package/esm2015/base/lib/vendor/classes/rail-enterprise-search.js +210 -25
  117. package/esm2015/base/lib/vendor/classes/supplementary-booking-info-impl.js +58 -4
  118. package/esm2015/base/lib/vendor/classes/user-favourite.enum.js +2 -1
  119. package/esm2015/base/lib/vendor/data/countries.json +484 -242
  120. package/esm2015/base/lib/vendor/fetchers/eurostar-quote.fetcher.js +3 -3
  121. package/esm2015/base/lib/vendor/fetchers/flight-quote.fetcher.js +3 -3
  122. package/esm2015/base/lib/vendor/fetchers/get-companies.fetcher.js +11 -0
  123. package/esm2015/base/lib/vendor/fetchers/get-company.fetcher.js +11 -0
  124. package/esm2015/base/lib/vendor/fetchers/get-office.fetcher.js +11 -0
  125. package/esm2015/base/lib/vendor/fetchers/get-user-default-mi-value.fetcher.js +10 -0
  126. package/esm2015/base/lib/vendor/fetchers/get-user-guests.fetcher.js +11 -0
  127. package/esm2015/base/lib/vendor/fetchers/search-users-can-book-for-fetcher.js +1 -1
  128. package/esm2015/base/lib/vendor/interfaces/Icabhire-enterprise-search.js +1 -1
  129. package/esm2015/base/lib/vendor/interfaces/Icarhire-enterprise-search.js +1 -1
  130. package/esm2015/base/lib/vendor/interfaces/Ienterprise-basket.service.js +1 -1
  131. package/esm2015/base/lib/vendor/interfaces/Ieurostar-enterprise-search.js +1 -1
  132. package/esm2015/base/lib/vendor/interfaces/Ifast-track-enterprise-search.js +1 -1
  133. package/esm2015/base/lib/vendor/interfaces/Iflight-enterprise-search.js +1 -1
  134. package/esm2015/base/lib/vendor/interfaces/Ihotel-enterprise-search.js +2 -1
  135. package/esm2015/base/lib/vendor/interfaces/Iirl-enterprise-search.js +1 -1
  136. package/esm2015/base/lib/vendor/interfaces/Ilounges-enterprise-search.js +1 -1
  137. package/esm2015/base/lib/vendor/interfaces/Imybookings.service.js +1 -1
  138. package/esm2015/base/lib/vendor/interfaces/Iparking-enterprise-search.js +1 -1
  139. package/esm2015/base/lib/vendor/interfaces/Irail-enterprise-search.js +1 -1
  140. package/esm2015/base/lib/vendor/interfaces/Isearch.service.js +1 -1
  141. package/esm2015/base/lib/vendor/interfaces/Isupplementary-booking-info-impl.js +1 -1
  142. package/esm2015/base/lib/vendor/interfaces/Iuser.service.js +1 -1
  143. package/esm2015/base/lib/vendor/interfaces/car-hire-search-arg.interface.js +1 -1
  144. package/esm2015/base/lib/vendor/interfaces/rail-basket-item.interface.js +1 -1
  145. package/esm2015/base/lib/vendor/interfaces/summary-interface.js +1 -1
  146. package/esm2015/base/lib/vendor/interfaces/user.data.js +1 -1
  147. package/esm2015/base/lib/vendor/models/traveller.object.js +21 -3
  148. package/esm2015/base/lib/vendor/services/enterprise-basket.service.js +129 -43
  149. package/esm2015/base/lib/vendor/services/http-call.service.js +1 -1
  150. package/esm2015/base/lib/vendor/services/logon.service.js +40 -3
  151. package/esm2015/base/lib/vendor/services/my-bookings.service.js +3 -2
  152. package/esm2015/base/lib/vendor/services/requires-reason.service.js +14 -10
  153. package/esm2015/base/lib/vendor/services/search.service.js +100 -117
  154. package/esm2015/base/lib/vendor/services/url.service.js +3 -1
  155. package/esm2015/base/lib/vendor/services/user.service.js +90 -12
  156. package/esm2015/base/lib/vendor/services/webtoken.service.js +14 -1
  157. package/esm2015/base/lib/vendor/types/graphql.types.js +21 -2
  158. package/esm2015/base/lib/vendor/types/types.js +32 -14
  159. package/esm2015/base/lib/vendor/updaters/create-guest-updater.js +11 -0
  160. package/esm2015/base/sabstravtech-obtservices-base.js +1 -1
  161. package/esm2015/base/updaters.js +2 -1
  162. package/fesm2015/sabstravtech-obtservices-angular.js +1254 -1332
  163. package/fesm2015/sabstravtech-obtservices-angular.js.map +1 -1
  164. package/fesm2015/sabstravtech-obtservices-base.js +3324 -839
  165. package/fesm2015/sabstravtech-obtservices-base.js.map +1 -1
  166. package/package.json +1 -1
@@ -1,13 +1,14 @@
1
1
  import { __awaiter } from "tslib";
2
2
  import moment from 'moment';
3
3
  import Ajv from 'ajv';
4
- import { BehaviorSubject, of, Subject } from 'rxjs';
5
- import { switchMap, take, tap, map } from 'rxjs/operators';
6
- import { BasketStatus, PassengerType, ServiceType } from '../types/graphql.types';
7
- import { MenuSlideEnum } from '../types/types';
4
+ import { BehaviorSubject, forkJoin, of, Subject } from 'rxjs';
5
+ import { switchMap, take, map } from 'rxjs/operators';
6
+ import { BasketStatus, LeadPassengerType, PassengerType, ServiceType } from '../types/graphql.types';
7
+ import { DifferentInvokdedUserReasons, MenuSlideEnum } from '../types/types';
8
8
  import { ModalTypes } from '../classes/modal-types.enum';
9
9
  import { SupplementaryBookingInfoImpl } from '../classes/supplementary-booking-info-impl';
10
10
  import { BasketInfoMiDetailsImpl } from '../classes/basket-info-mi-details.impl';
11
+ import { TravellerObject } from '../models/traveller.object';
11
12
  import { BaseRequiresReasonService } from './requires-reason.service';
12
13
  const TEMPID = 'TEMPID_';
13
14
  export class InternalBasket {
@@ -52,8 +53,8 @@ export class InternalBasket {
52
53
  }
53
54
  this.id = basket.id;
54
55
  this.title = basket.title;
55
- const toSend = Object.assign(Object.assign({}, basket), (basket.basketItems || []).reduce((accum, item, index) => {
56
- var _a, _b;
56
+ const toSend = Object.assign(Object.assign({}, basket), (basket.basketItems || []).reduce((accum, item) => {
57
+ var _a, _b, _c;
57
58
  if (!accum.prices[item.currency]) {
58
59
  accum.prices[item.currency] = 0;
59
60
  }
@@ -67,7 +68,8 @@ export class InternalBasket {
67
68
  value: item.miGroupSelected || ''
68
69
  });
69
70
  }
70
- if (((_a = item.managementInfo) === null || _a === void 0 ? void 0 : _a.length) > 0 && ((_b = item.users) === null || _b === void 0 ? void 0 : _b.length) > 0) {
71
+ if (((_a = item.managementInfo) === null || _a === void 0 ? void 0 : _a.length) > 0 &&
72
+ (((_b = item.users) === null || _b === void 0 ? void 0 : _b.length) > 0 || ((_c = item.guests) === null || _c === void 0 ? void 0 : _c.length))) {
71
73
  accum.basketInfoMiDetails.push(new BasketInfoMiDetailsImpl(item, this.basketService, this.helpers));
72
74
  }
73
75
  return accum;
@@ -85,7 +87,7 @@ export class InternalBasket {
85
87
  }
86
88
  }
87
89
  export class BaseEnterpriseBasketService {
88
- constructor(acceptNewPriceUpdater, addItemToBasketUpdater, addUserToBasketItem, basketCreator, basketFetcher, bookBasketUpdater, deleteBasketUpdater, getMiAutoSugestionFetcher, helpers, removeItemFromBasketUpdater, revalidateBasketUpdater, setBasketItemMiGroupUpdater, setBasketItemMiValueUpdater, validateMiFreeValue, sendBasketForApprovalUpdater, getUserFetcher, getUserBasketsFetcher, SetBasketItemLeadPassenger, moveItemToADifferentBasket, updateBasketNotesUpdater, updateBasketTitleUpdater, setPaymentMethodUpdater, getCancellationInfoFetcher, userService, modalService) {
90
+ constructor(acceptNewPriceUpdater, addItemToBasketUpdater, addUserToBasketItem, basketCreator, basketFetcher, bookBasketUpdater, deleteBasketUpdater, getMiAutoSugestionFetcher, getUserDefaultMIValueFetcher, helpers, removeItemFromBasketUpdater, revalidateBasketUpdater, setBasketItemMiGroupUpdater, setBasketItemMiValueUpdater, validateMiFreeValue, sendBasketForApprovalUpdater, getUserFetcher, getUserBasketsFetcher, SetBasketItemLeadPassenger, moveItemToADifferentBasket, updateBasketNotesUpdater, updateBasketTitleUpdater, setPaymentMethodUpdater, getCancellationInfoFetcher, userService, modalService) {
89
91
  this.acceptNewPriceUpdater = acceptNewPriceUpdater;
90
92
  this.addItemToBasketUpdater = addItemToBasketUpdater;
91
93
  this.addUserToBasketItem = addUserToBasketItem;
@@ -94,6 +96,7 @@ export class BaseEnterpriseBasketService {
94
96
  this.bookBasketUpdater = bookBasketUpdater;
95
97
  this.deleteBasketUpdater = deleteBasketUpdater;
96
98
  this.getMiAutoSugestionFetcher = getMiAutoSugestionFetcher;
99
+ this.getUserDefaultMIValueFetcher = getUserDefaultMIValueFetcher;
97
100
  this.helpers = helpers;
98
101
  this.removeItemFromBasketUpdater = removeItemFromBasketUpdater;
99
102
  this.revalidateBasketUpdater = revalidateBasketUpdater;
@@ -172,11 +175,14 @@ export class BaseEnterpriseBasketService {
172
175
  price: 0
173
176
  }
174
177
  ];
175
- this.basketPrices = new BehaviorSubject({ total: null, list: this.basketList });
178
+ this.basketPrices = new BehaviorSubject({
179
+ total: null,
180
+ list: this.basketList
181
+ });
176
182
  this.menuState = MenuSlideEnum.OUT;
177
183
  this.requiresService = new BaseRequiresReasonService(modalService, this);
178
184
  this.userService.changeUser.subscribe({
179
- next: (userDetails) => {
185
+ next: () => {
180
186
  this.reset();
181
187
  }
182
188
  });
@@ -221,7 +227,6 @@ export class BaseEnterpriseBasketService {
221
227
  else {
222
228
  this.currentBasketID = null;
223
229
  }
224
- this.basketChangeEmitter.next(this.currentBasketID);
225
230
  }, (error) => {
226
231
  console.error(error);
227
232
  });
@@ -231,7 +236,6 @@ export class BaseEnterpriseBasketService {
231
236
  this.currentBaskets = [];
232
237
  this.currentBasketID = null;
233
238
  this.baskets.next(this.currentBaskets);
234
- this.basketChangeEmitter.next(this.currentBasketID);
235
239
  }
236
240
  }
237
241
  getAllOpenBaskets(user_id) {
@@ -254,10 +258,28 @@ export class BaseEnterpriseBasketService {
254
258
  }
255
259
  addToBasket(item, intBasket, searchService, travellers = [], requiresReason) {
256
260
  return __awaiter(this, void 0, void 0, function* () {
261
+ switch (yield this.checkBasketForInvoked(intBasket, this.userService.bobo)) {
262
+ case DifferentInvokdedUserReasons.continue:
263
+ break;
264
+ case DifferentInvokdedUserReasons.cancel:
265
+ return DifferentInvokdedUserReasons.cancel;
266
+ case DifferentInvokdedUserReasons.newBasket:
267
+ intBasket = yield this.createBasket();
268
+ this.currentBasketID = intBasket.id;
269
+ break;
270
+ case DifferentInvokdedUserReasons.research:
271
+ this.userService.setBobo(TravellerObject.makeTravellerObjectFromUser(intBasket.subject.value.invokedUser));
272
+ return DifferentInvokdedUserReasons.research;
273
+ }
274
+ item.basket = intBasket.id;
257
275
  item.convertCurrencyTo = 'GBP';
258
276
  if ((travellers === null || travellers === void 0 ? void 0 : travellers.length) > 0) {
259
- item.users = this.helpers.makeUsers(travellers);
260
- item.leadPassenger = item.users[0].id;
277
+ item.users = this.helpers.makeUsers(travellers.filter((trav) => !trav.guest));
278
+ item.guests = this.helpers.makeUsers(travellers.filter((trav) => trav.guest));
279
+ item.leadPassenger = travellers[0].id;
280
+ item.leadPassengerType = travellers[0].guest
281
+ ? LeadPassengerType.Guest
282
+ : LeadPassengerType.User;
261
283
  }
262
284
  item.outboundDate = item.outboundDate
263
285
  ? new Date(this.helpers.formatIsoDateTime(item.outboundDate))
@@ -267,26 +289,50 @@ export class BaseEnterpriseBasketService {
267
289
  : item.inboundDate;
268
290
  item.requiresReason = requiresReason;
269
291
  item = this.checkDetails(item);
292
+ const service = this.userService.findService(item.service).type;
293
+ // let cheapestPrice: number
294
+ // if (searchService.searches[service].cheapestPrice) cheapestPrice = searchService.searches[service].cheapestPrice.amount
295
+ // else if (service == ServiceType.Flight) {
296
+ // const cheapestPriceObject = searchService.searches[service].cheapestPriceObject
297
+ // cheapestPrice = cheapestPriceObject.dualInbound.amount + cheapestPriceObject.dualOutbound.amount < cheapestPriceObject.returns.amount
298
+ // ? cheapestPriceObject.dualInbound.amount + cheapestPriceObject.dualOutbound.amount : cheapestPriceObject.returns.amount
299
+ // }
300
+ // else if (service == ServiceType.Rail) {
301
+ // searchService.searches[service].cheapest.subscribe(a =>{
302
+ // console.log(a)
303
+ // })
304
+ // // cheapestPrice = cheapestPriceObject.dualInbound.amount + cheapestPriceObject.dualOutbound.amount < cheapestPriceObject.returns.amount
305
+ // // ? cheapestPriceObject.dualInbound.amount + cheapestPriceObject.dualOutbound.amount : cheapestPriceObject.returns.amount
306
+ // }
307
+ this.removeBookedBasket();
270
308
  if (item && intBasket) {
271
309
  this.addItemToBasketUpdater
272
310
  .updateOne(item)
273
311
  .pipe(take(1))
274
312
  .subscribe((newBasket) => {
275
313
  intBasket.next(Object.assign(Object.assign({}, intBasket.subject.value), newBasket));
276
- const service = this.userService.findService(item.service).type;
277
314
  searchService.search_objects[service].booking_chosen = true;
278
315
  searchService.search_objects[service].chosen = false;
279
316
  const bi = newBasket.basketItems;
280
317
  this.highlightBasketItemsEmitter.next(bi);
281
- this.basketChangeEmitter.next(this.currentBasketID);
282
318
  }, (error) => {
283
319
  console.error(error);
284
320
  intBasket.subject.next(intBasket.subject.value);
285
321
  });
286
322
  }
287
- return false;
323
+ return DifferentInvokdedUserReasons.continue;
288
324
  });
289
325
  }
326
+ checkBasketForInvoked(intBasket, bobo) {
327
+ var _a;
328
+ if (((_a = intBasket.subject.value.invokedUser) === null || _a === void 0 ? void 0 : _a.id) !== (bobo === null || bobo === void 0 ? void 0 : bobo.id)) {
329
+ return this.modalService.open(ModalTypes.DifferentInvokdedUserComponent, {}, {
330
+ basketBobo: intBasket.subject.value.invokedUser,
331
+ currentBobo: bobo
332
+ });
333
+ }
334
+ return Promise.resolve(DifferentInvokdedUserReasons.continue);
335
+ }
290
336
  loadBasket(id) {
291
337
  let intBasket = this.findBasket(id);
292
338
  if (!intBasket) {
@@ -364,7 +410,6 @@ export class BaseEnterpriseBasketService {
364
410
  }
365
411
  getDefaultBasket(getBookedBasket = false) {
366
412
  return __awaiter(this, void 0, void 0, function* () {
367
- const internalBasket = null;
368
413
  // console.log(this.currentBasketID);
369
414
  return yield this.findOrCreateBasket(this.currentBasketID, getBookedBasket).then((data) => {
370
415
  return data;
@@ -431,9 +476,12 @@ export class BaseEnterpriseBasketService {
431
476
  });
432
477
  }
433
478
  createBasketOnDB(intBasket) {
479
+ var _a, _b;
480
+ const mutation = ((_a = this.userService.bobo) === null || _a === void 0 ? void 0 : _a.id) ? { invokedUser: (_b = this.userService.bobo) === null || _b === void 0 ? void 0 : _b.id }
481
+ : {};
434
482
  return new Promise((resolve, reject) => {
435
483
  this.basketCreator
436
- .updateOne({})
484
+ .updateOne(mutation)
437
485
  .pipe(take(1))
438
486
  .subscribe((basket) => {
439
487
  intBasket.id = basket.id;
@@ -478,13 +526,13 @@ export class BaseEnterpriseBasketService {
478
526
  }
479
527
  return !isNaN(Date.parse(dateTimeString)); // any test that returns true/false
480
528
  });
481
- ajv.addFormat('railSeating', (railseating) => {
529
+ ajv.addFormat('railSeating', () => {
482
530
  return true;
483
531
  });
484
- ajv.addFormat('passport', (passport) => {
532
+ ajv.addFormat('passport', () => {
485
533
  return true;
486
534
  });
487
- ajv.addFormat('specialRequest', (passport) => {
535
+ ajv.addFormat('specialRequest', () => {
488
536
  return true;
489
537
  });
490
538
  const validateDetailSchema = ajv.compile(serviceToCheck.detailSchema);
@@ -523,7 +571,6 @@ export class BaseEnterpriseBasketService {
523
571
  this.baskets.next(this.currentBaskets);
524
572
  if (basketid === this.currentBasketID) {
525
573
  this.currentBasketID = ((_b = this.currentBaskets[0]) === null || _b === void 0 ? void 0 : _b.id) || null;
526
- this.basketChangeEmitter.next(this.currentBasketID);
527
574
  }
528
575
  return of(data);
529
576
  }));
@@ -575,14 +622,15 @@ export class BaseEnterpriseBasketService {
575
622
  });
576
623
  }
577
624
  }
578
- setLeadPassenger(basketid, basketItem, travellers, index = 0) {
625
+ setLeadPassenger(basketid, basketItem, travellers, index = 0, leadPassengerType = LeadPassengerType.User) {
579
626
  const basket = this.findBasket(basketid);
580
627
  if (index < 1) {
581
628
  this.SetBasketItemLeadPassenger.updateOne({
582
629
  convertCurrencyTo: 'GBP',
583
630
  id: basketItem.id,
584
- user: travellers.id,
585
- withSupplemental: false
631
+ userOrGuest: travellers.id,
632
+ withSupplemental: false,
633
+ leadPassengerType: leadPassengerType
586
634
  }).subscribe(() => { }, () => { }, () => {
587
635
  this.setLeadPassenger(basket.id, basketItem, travellers, index + 1);
588
636
  });
@@ -637,7 +685,7 @@ export class BaseEnterpriseBasketService {
637
685
  .subscribe(resolve, reject);
638
686
  });
639
687
  }
640
- setMiFreeValue(basketid, miItem, freeValue, userId = null) {
688
+ setMiFreeValue(basketid, miItem, freeValue, userId = null, guest) {
641
689
  const intBasket = this.findBasket(basketid);
642
690
  const args = {
643
691
  convertCurrencyTo: 'GBP',
@@ -645,36 +693,60 @@ export class BaseEnterpriseBasketService {
645
693
  miFreeValue: freeValue
646
694
  };
647
695
  if (!!userId) {
648
- args.user = userId;
696
+ if (guest) {
697
+ args.guest = userId;
698
+ }
699
+ else {
700
+ args.user = userId;
701
+ }
649
702
  }
650
- this.setBasketItemMiValueUpdater
651
- .updateOne(args)
652
- .pipe(take(1))
653
- .subscribe((basket) => {
654
- intBasket.next(basket);
655
- }, (_) => { }, () => {
656
- intBasket.next(intBasket.subject.value);
703
+ return new Promise((resolve, reject) => {
704
+ this.setBasketItemMiValueUpdater
705
+ .updateOne(args)
706
+ .pipe(take(1))
707
+ .subscribe((basket) => {
708
+ intBasket.next(basket);
709
+ }, (error) => {
710
+ reject(error);
711
+ }, () => {
712
+ intBasket.next(intBasket.subject.value);
713
+ resolve();
714
+ });
657
715
  });
658
716
  }
659
- setMiSelectedValue(basketid, miItem, selectedValue, userId = null) {
717
+ setMiSelectedValue(basketid, miItem, selectedValue, userId = null, guest) {
660
718
  const args = {
661
719
  convertCurrencyTo: 'GBP',
662
720
  mi: miItem.id,
663
721
  miValue: selectedValue
664
722
  };
665
723
  if (!!userId) {
666
- args.user = userId;
724
+ if (guest) {
725
+ args.guest = userId;
726
+ }
727
+ else {
728
+ args.user = userId;
729
+ }
667
730
  }
668
- this.updateBasket(basketid, this.setBasketItemMiValueUpdater.updateOne(args));
731
+ return this.updateBasket(basketid, this.setBasketItemMiValueUpdater.updateOne(args));
669
732
  }
670
- getMiAutoSugestions(miId, partialLabel, isLoading) {
733
+ getMiAutoSugestions(miId, term, isLoading) {
671
734
  isLoading === null || isLoading === void 0 ? void 0 : isLoading.next(true);
672
- return this.getMiAutoSugestionFetcher
673
- .fetchList({ mi: miId, partialLabel })
674
- .pipe(tap((_) => {
735
+ const getMiAutoByValue = this.getMiAutoSugestionFetcher.fetchList({ mi: miId, partialValue: term });
736
+ const getMiAutoByLabel = this.getMiAutoSugestionFetcher.fetchList({ mi: miId, partialLabel: term });
737
+ return forkJoin([getMiAutoByValue, getMiAutoByLabel]).pipe(map(([miByValue, miByLabel]) => {
738
+ let miByValueLabel = [...miByValue, ...miByLabel];
739
+ miByValueLabel = miByValueLabel.filter((miItem, index) => miByValueLabel.findIndex(item => item.id == miItem.id) === index);
740
+ console.log(miByValueLabel);
675
741
  isLoading === null || isLoading === void 0 ? void 0 : isLoading.next(false);
742
+ return miByValueLabel;
676
743
  }));
677
744
  }
745
+ getUserDefaultMIValue(mi, user, isLoading) {
746
+ isLoading === null || isLoading === void 0 ? void 0 : isLoading.next(true);
747
+ return this.getUserDefaultMIValueFetcher
748
+ .fetchOne({ mi: mi, user: user }).pipe(take(1));
749
+ }
678
750
  saveMiData(basketId, bmiArray) {
679
751
  bmiArray.forEach((bmi) => {
680
752
  bmi.miPerItem.forEach((item) => {
@@ -685,6 +757,11 @@ export class BaseEnterpriseBasketService {
685
757
  item.save(basketId, user);
686
758
  });
687
759
  });
760
+ bmi.guests.forEach((user) => {
761
+ bmi.miPerGuest[user].managementInfo.forEach((item) => {
762
+ item.save(basketId, user, true);
763
+ });
764
+ });
688
765
  });
689
766
  }
690
767
  sendBasketForApproval(basketid) {
@@ -762,5 +839,14 @@ export class BaseEnterpriseBasketService {
762
839
  basketItem: basketItem.id
763
840
  });
764
841
  }
842
+ removeBookedBasket() {
843
+ this.currentBaskets = this.currentBaskets.reduce((acc, basket) => {
844
+ if (basket.subject.value.status !== BasketStatus.Booked) {
845
+ acc.push(basket);
846
+ }
847
+ return acc;
848
+ }, []);
849
+ this.baskets.next(this.currentBaskets);
850
+ }
765
851
  }
766
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50ZXJwcmlzZS1iYXNrZXQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29idHNlcnZpY2VzL2Jhc2Uvc3JjL2xpYi92ZW5kb3Ivc2VydmljZXMvZW50ZXJwcmlzZS1iYXNrZXQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sR0FBRyxNQUFNLEtBQUssQ0FBQztBQUN0QixPQUFPLEVBQUUsZUFBZSxFQUF3QixFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzRCxPQUFPLEVBSUwsWUFBWSxFQUdaLGFBQWEsRUFFYixXQUFXLEVBR1osTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBSUwsYUFBYSxFQUdkLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3pELE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzFGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBdUdqRixPQUFPLEVBQ0wseUJBQXlCLEVBRTFCLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDO0FBZ0R6QixNQUFNLE9BQU8sY0FBYztJQWN6QixZQUNFLE1BQXdCLEVBQ2hCLE9BQTJCLEVBQzNCLGFBQStDLEVBQy9DLGNBQXFDLEVBQ3JDLGVBQTBDO1FBSDFDLFlBQU8sR0FBUCxPQUFPLENBQW9CO1FBQzNCLGtCQUFhLEdBQWIsYUFBYSxDQUFrQztRQUMvQyxtQkFBYyxHQUFkLGNBQWMsQ0FBdUI7UUFDckMsb0JBQWUs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QVksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLGVBQWUsQ0FBQztZQUNuRCxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxLQUFLO2dCQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztTQUNuRTthQUFNO1lBQ0wsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztTQUNuQztRQUVELElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTs7WUFDNUMsSUFBSSxDQUFDLEtBQUsscUJBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLDBDQUFFLE9BQU8sMENBQUUsS0FBSywwQ0FBRSxXQUFXLENBQ2hFLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksRUFDaEQsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEQsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDM0IsQ0FBQztJQUVELFNBQVMsQ0FBQyxVQUFzQjtRQUM5QixPQUFPLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxRQUFRLENBQUM7WUFDOUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxFQUFFO1NBQzFCLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcclxuaW1wb3J0IEFqdiBmcm9tICdhanYnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIE9ic2VydmVyLCBvZiwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBzd2l0Y2hNYXAsIHRha2UsIHRhcCwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuaW1wb3J0IHtcclxuICBBZGRJdGVtVG9CYXNrZXQsXHJcbiAgQmFza2V0LFxyXG4gIEJhc2tldEl0ZW0sXHJcbiAgQmFza2V0U3RhdHVzLFxyXG4gIEJlZm9yZUNhbmNlbGxhdGlvbkluZm8sXHJcbiAgTWFuYWdlbWVudEluZm8sXHJcbiAgUGFzc2VuZ2VyVHlwZSxcclxuICBTZXJ2aWNlLFxyXG4gIFNlcnZpY2VUeXBlLFxyXG4gIFNldEJhc2tldEl0ZW1NaVZhbHVlLFxyXG4gIFN1cHBsZW1lbnRhcnlCb29raW5nSW5mb1xyXG59IGZyb20gJy4uL3R5cGVzL2dyYXBocWwudHlwZXMnO1xyXG5pbXBvcnQge1xyXG4gIEdldE1pQXV0b1N1Z2VzdGlvbkFycmF5LFxyXG4gIEdldFVzZXJCYXNrZXRJdGVtUmVzdWx0LFxyXG4gIEdldFVzZXJCYXNrZXRSZXN1bHQsXHJcbiAgTWVudVNsaWRlRW51bSxcclxuICBSdWxlQWN0aW9uU3VtbWFyeUludGVyZmFjZSxcclxuICBVc2VyQmFza2V0UmVzdWx0XHJcbn0gZnJvbSAnLi4vdHlwZXMvdHlwZXMnO1xyXG5pbXBvcnQgeyBNYW5hZ2VtZW50SW5mb0FuZElzVmFsaWQgfSBmcm9tICcuLi9jbGFzc2VzL21hbmFnZW1lbnQtaW5mby1hbmQtdmFsaWQnO1xyXG5pbXBvcnQgeyBNb2RhbFR5cGVzIH0gZnJvbSAnLi4vY2xhc3Nlcy9tb2RhbC10eXBlcy5lbnVtJztcclxuaW1wb3J0IHsgU3VwcGxlbWVudGFyeUJvb2tpbmdJbmZvSW1wbCB9IGZyb20gJy4uL2NsYXNzZXMvc3VwcGxlbWVudGFyeS1ib29raW5nLWluZm8taW1wbCc7XHJcbmltcG9ydCB7IEJhc2tldEluZm9NaURldGFpbHNJbXBsIH0gZnJvbSAnLi4vY2xhc3Nlcy9iYXNrZXQtaW5mby1taS1kZXRhaWxzLmltcGwnO1xyXG5pbXBvcnQgeyBCYXNlSGVscGVyUm91dGluZXMgfSBmcm9tICcuLi9jbGFzc2VzL2hlbHBlcnMnO1xyXG5pbXBvcnQgeyBCYXNlTW9kYWxPcGVuZXJTZXJ2aWNlIH0gZnJvbSAnLi9tb2RhbC1vcGVuZXIuc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgQmFzZUdldFVzZXJGZXRjaGVyLFxyXG4gIFNlYXJjaEdldFVzZXJGZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL2ZldGNoZXJzL3VzZXItZmV0Y2hlcic7XHJcbmltcG9ydCB7XHJcbiAgQWNjZXB0TmV3UHJpY2VGZXRjaGVyVHlwZSxcclxuICBCYXNlQWNjZXB0TmV3UHJpY2VVcGRhdGVyXHJcbn0gZnJvbSAnLi4vdXBkYXRlcnMvYWNjZXB0LW5ldy1wcmljZS51cGRhdGVyJztcclxuaW1wb3J0IHtcclxuICBCYXNlR2V0QmFza2V0RmV0Y2hlcixcclxuICBHZXRCYXNrZXRGZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL2ZldGNoZXJzL2Jhc2tldC1mZXRjaGVyJztcclxuaW1wb3J0IHtcclxuICBCYXNlR2V0VXNlckJhc2tldHNGZXRjaGVyLFxyXG4gIEdldFVzZXJCYXNrZXRzRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9nZXQtdXNlcnMtYmFza2V0cy1mZXRjaGVyJztcclxuaW1wb3J0IHtcclxuICBCYXNlR2V0TWlBdXRvU3VnZXN0aW9uRmV0Y2hlcixcclxuICBNaUF1dG9TdWdnZXN0RmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9nZXRNaUF1dG9TdWdlc3Rpb25zLmZldGNoZXInO1xyXG5pbXBvcnQge1xyXG4gIEFkZEl0ZW1Ub0Jhc2tldEZldGNoZXJUeXBlLFxyXG4gIEJhc2VBZGRJdGVtVG9CYXNrZXRVcGRhdGVyXHJcbn0gZnJvbSAnLi4vdXBkYXRlcnMvYWRkLWl0ZW0tdG8tYmFza2V0LnVwZGF0ZXInO1xyXG5pbXBvcnQge1xyXG4gIEFkZFVzZXJCYXNrZXRGZXRjaGVyVHlwZSxcclxuICBCYXNlQWRkVXNlclRvQmFza2V0SXRlbVVwZGF0ZXJcclxufSBmcm9tICcuLi91cGRhdGVycy9hZGRVc2VyVG9CYXNrZXRJdGVtJztcclxuaW1wb3J0IHtcclxuICBTZXRCYXNrZXRJdGVtTGVhZFBhc3NlbmdlckZldGNoZXJUeXBlLFxyXG4gIEJhc2VTZXRCYXNrZXRJdGVtTGVhZFBhc3NlbmdlclVwZGF0ZXJcclxufSBmcm9tICcuLi91cGRhdGVycy9zZXQtYmFza2V0LWl0ZW0tbGVhZC1wYXNzZW5nZXIudXBkYXRlcic7XHJcbmltcG9ydCB7XHJcbiAgQmFzZUJvb2tCYXNrZXRVcGRhdGVyLFxyXG4gIEJvb2tCYXNrZXRGZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL3VwZGF0ZXJzL2Jvb2stYmFza2V0LXVwZGF0ZXInO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VDcmVhdGVCYXNrZXRVcGRhdGVyLFxyXG4gIENyZWF0ZUJhc2tldEZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vdXBkYXRlcnMvY3JlYXRlLWJhc2tldC11cGRhdGVyJztcclxuaW1wb3J0IHtcclxuICBCYXNlRGVsZXRlQmFza2V0VXBkYXRlcixcclxuICBEZWxldGVCYXNrZXRGZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL3VwZGF0ZXJzL3JlbW92ZS1iYXNrZXQtdXBkYXRlcic7XHJcbmltcG9ydCB7XHJcbiAgQmFzZVJlbW92ZUl0ZW1Gcm9tQmFza2V0VXBkYXRlcixcclxuICBEZWxldGVCYXNrZXRJdGVtRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi91cGRhdGVycy9yZW1vdmUtaXRlbS1mcm9tLWJhc2tldC51cGRhdGVyJztcclxuaW1wb3J0IHtcclxuICBCYXNlUmV2YWxpZGF0ZUJhc2tldFVwZGF0ZXIsXHJcbiAgUmV2YWxpZGF0ZUJhc2tldEZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vdXBkYXRlcnMvcmV2YWxpZGF0ZS1iYXNrZXQtdXBkYXRlcic7XHJcbmltcG9ydCB7XHJcbiAgQmFzZVNlbmRCYXNrZXRGb3JBcHByb3ZhbFVwZGF0ZXIsXHJcbiAgU2VuZEJhc2tldEFwcHJvdmFsRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi91cGRhdGVycy9zZW5kLWJhc2tldC1mb3ItYXBwcm92YWwudXBkYXRlcic7XHJcbmltcG9ydCB7XHJcbiAgQmFzZVNldEJhc2tldEl0ZW1NaUdyb3VwVXBkYXRlcixcclxuICBTZXRCYXNrZXRJdE1pR3JvdXBGZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL3VwZGF0ZXJzL3NldC1iYXNrZXQtaXRlbS1taS1ncm91cCc7XHJcbmltcG9ydCB7IFRyYXZlbGxlciB9IGZyb20gJy4uL21vZGVscy90cmF2ZWxsZXIub2JqZWN0JztcclxuaW1wb3J0IHsgU2VhcmNoT2JqZWN0IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9zZWFyY2gtb2JqZWN0cy5pbnRlcmZhY2UnO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VTZXRCYXNrZXRJdGVtTWlWYWx1ZVVwZGF0ZXIsXHJcbiAgU2V0QmFza2V0SXRNaUZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vdXBkYXRlcnMvc2V0LWJhc2tldC1pdGVtLW1pLXZhbHVlLXVwZGF0ZXInO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VWYWxpZGF0ZU1pRnJlZVZhbHVlVGVzdGVyLFxyXG4gIFZhbGlkYXRlTWlGZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL3Rlc3RlcnMvdmFsaWRhdGUtbWktZnJlZS12YWx1ZS50ZXN0ZXInO1xyXG5pbXBvcnQgeyBFbnRlcnByaXNlU2VhcmNoU2VydmljZUludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvSXNlYXJjaC5zZXJ2aWNlJztcclxuaW1wb3J0IHtcclxuICBGdWxsVXNlckRldGFpbHMsXHJcbiAgVXNlclNlcnZpY2VJbnRlcmZhY2VcclxufSBmcm9tICcuLi9pbnRlcmZhY2VzL0l1c2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQge1xyXG4gIEVudGVycHJpc2VCYXNrZXRTZXJ2aWNlSW50ZXJmYWNlLFxyXG4gIEludGVybmFsQmFza2V0SW50ZXJmYWNlXHJcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JZW50ZXJwcmlzZS1iYXNrZXQuc2VydmljZSc7XHJcbmltcG9ydCB7IFN1cHBsZW1lbnRhcnlCb29raW5nSW5mb0ludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvSXN1cHBsZW1lbnRhcnktYm9va2luZy1pbmZvLWltcGwnO1xyXG5pbXBvcnQge1xyXG4gIEJhc2Vtb3ZlQmFza2V0SXRlbVRvQmFza2V0LFxyXG4gIE1vdmVJdGVtVG9BRGlmZmVyZW50QmFza2V0VHlwZVxyXG59IGZyb20gJy4uL3VwZGF0ZXJzL21vdmUtYmFza2V0LWl0ZW0tdG8tYmFza2V0JztcclxuaW1wb3J0IHtcclxuICBCYXNlVXBkYXRlQmFza2V0Tm90ZXNUeXBlLFxyXG4gIEJhc2VVcGRhdGVCYXNrZXROb3RlVXBkYXRlclxyXG59IGZyb20gJy4uL3VwZGF0ZXJzL3VwZGF0ZS1iYXNrZXQtbm90ZXMtdXBkYXRlcic7XHJcbmltcG9ydCB7XHJcbiAgQmFzZVVwZGF0ZUJhc2tldFRpdGxlVHlwZSxcclxuICBCYXNlVXBkYXRlQmFza2V0VGl0bGVVcGRhdGVyXHJcbn0gZnJvbSAnLi4vdXBkYXRlcnMvdXBkYXRlLWJhc2tldC10aXRsZS11cGRhdGVyJztcclxuaW1wb3J0IHtcclxuICBCYXNlU2V0UGF5bWVudE9wdGlvblVwZGF0ZXIsXHJcbiAgU2V0QmFza2V0SXRlbVBheW1lbnRNZXRob2RUeXBlXHJcbn0gZnJvbSAnLi4vdXBkYXRlcnMvc2V0LWJhc2tldC1pdGVtLXBheW1lbnItb3B0aW9uLnVwZGF0ZXInO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VHZXRDYW5jZWxsYXRpb25JbmZvRmV0Y2hlcixcclxuICBHZXRDYW5jZWxsYXRpb25JbmZvVHlwZVxyXG59IGZyb20gJy4uL2ZldGNoZXJzL2dldC1jYW5jZWxsYXRpb24taW5mby5mZXRjaGVyJztcclxuaW1wb3J0IHtcclxuICBCYXNlUmVxdWlyZXNSZWFzb25TZXJ2aWNlLFxyXG4gIFJlcXVpcmVzUmVhc29uU2VydmljZUludGVyZmFjZVxyXG59IGZyb20gJy4vcmVxdWlyZXMtcmVhc29uLnNlcnZpY2UnO1xyXG5jb25zdCBURU1QSUQgPSAnVEVNUElEXyc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEJhc2tldEFuZEl0ZW0ge1xyXG4gIGJhc2tldElkOiBzdHJpbmc7XHJcbiAgaXRlbTogQmFza2V0SXRlbTtcclxufVxyXG5leHBvcnQgaW50ZXJmYWNlIE1pR3JvdXBEZXRhaWwge1xyXG4gIHR5cGU6IFNlcnZpY2VUeXBlO1xyXG4gIG9wdGlvbnM6IHN0cmluZ1tdO1xyXG4gIGJhc2tldEl0ZW06IEJhc2tldEl0ZW07XHJcbiAgdmFsdWU6IHN0cmluZztcclxufVxyXG5leHBvcnQgaW50ZXJmYWNlIEJhc2tldEl0ZW1NYW5hZ2VtZW50SW5mbyB7XHJcbiAgbWlQZXJJdGVtOiBNYW5hZ2VtZW50SW5mb0FuZElzVmFsaWRbXTtcclxuICBtaVBlclVzZXI6IHtcclxuICAgIFtrZXk6IHN0cmluZ106IHtcclxuICAgICAgbWFuYWdlbWVudEluZm86IE1hbmFnZW1lbnRJbmZvQW5kSXNWYWxpZFtdO1xyXG4gICAgICBzdXBwbGVtZW50YXJ5Qm9va2luZ0luZm8/OiBTdXBwbGVtZW50YXJ5Qm9va2luZ0luZm9JbnRlcmZhY2U7XHJcbiAgICB9O1xyXG4gIH07XHJcbiAgdXNlcnM6IHN0cmluZ1tdO1xyXG4gIGJhc2tldEl0ZW06IEJhc2tldEl0ZW07XHJcbiAgaGlkZUZvclNhbWVTZXJ2aWNlPzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBCYXNrZXRJbmZvcm1hdGlvbiB7XHJcbiAgcHJpY2VzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9O1xyXG4gIG1peGVkQ3VycmVuY3k6IGJvb2xlYW47XHJcbiAgY291bnQ6IG51bWJlcjtcclxuICBtaUdyb3VwczogTWlHcm91cERldGFpbFtdO1xyXG4gIGJhc2tldEluZm9NaURldGFpbHM6IEJhc2tldEluZm9NaURldGFpbHNJbXBsW107XHJcbiAgc3VwcEluZm86IFN1cHBsZW1lbnRhcnlCb29raW5nSW5mb0ludGVyZmFjZVtdO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEJhc2tldFByaWNlc0xpc3Qge1xyXG4gIHR5cGU6IFNlcnZpY2VUeXBlO1xyXG4gIHByaWNlOiBudW1iZXI7XHJcbiAgY3VycmVuY3k/OiBzdHJpbmc7XHJcbiAgdGV4dDogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEJhc2tldFByaWNlcyB7XHJcbiAgdG90YWw6IG51bWJlcjtcclxuICBjdXJyZW5jeT86IHN0cmluZztcclxuICBsaXN0OiBCYXNrZXRQcmljZXNMaXN0W107XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIEJhc2tldERldGFpbHMgPSBVc2VyQmFza2V0UmVzdWx0ICYgQmFza2V0SW5mb3JtYXRpb247XHJcbmV4cG9ydCBjbGFzcyBJbnRlcm5hbEJhc2tldDxRIGV4dGVuZHMgU2VhcmNoR2V0VXNlckZldGNoZXJUeXBlPlxyXG4gIGltcGxlbWVudHMgQmFza2V0SW5mb3JtYXRpb24sIEludGVybmFsQmFza2V0SW50ZXJmYWNlXHJcbntcclxuICBzdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8QmFza2V0RGV0YWlscz47XHJcbiAgaWQ/OiBzdHJpbmc7XHJcbiAgdGVtcGlkPzogc3RyaW5nO1xyXG4gIHRpdGxlOiBzdHJpbmc7XHJcbiAgcHJpY2VzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9O1xyXG4gIG1peGVkQ3VycmVuY3k6IGJvb2xlYW47XHJcbiAgY291bnQ6IG51bWJlcjtcclxuICBtaUdyb3VwczogTWlHcm91cERldGFpbFtdO1xyXG4gIGJhc2tldEluZm9NaURldGFpbHM6IEJhc2tldEluZm9NaURldGFpbHNJbXBsW107XHJcbiAgc3VwcEluZm86IFN1cHBsZW1lbnRhcnlCb29raW5nSW5mb0ludGVyZmFjZVtdO1xyXG4gIGdyYW5kVG90YWw6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH07XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBiYXNrZXQ6IFVzZXJCYXNrZXRSZXN1bHQsXHJcbiAgICBwcml2YXRlIGhlbHBlcnM6IEJhc2VIZWxwZXJSb3V0aW5lcyxcclxuICAgIHByaXZhdGUgYmFza2V0U2VydmljZTogRW50ZXJwcmlzZUJhc2tldFNlcnZpY2VJbnRlcmZhY2UsXHJcbiAgICBwcml2YXRlIGdldFVzZXJGZXRjaGVyOiBCYXNlR2V0VXNlckZldGNoZXI8UT4sXHJcbiAgICBwcml2YXRlIHJlcXVpcmVzU2VydmljZTogQmFzZVJlcXVpcmVzUmVhc29uU2VydmljZVxyXG4gICkge1xyXG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLCB7XHJcbiAgICAgIHN1YmplY3Q6IG5ldyBCZWhhdmlvclN1YmplY3Q8QmFza2V0RGV0YWlscz4oe1xyXG4gICAgICAgIC4uLmJhc2tldCxcclxuICAgICAgICBwcmljZXM6IHt9LFxyXG4gICAgICAgIG1peGVkQ3VycmVuY3k6IGZhbHNlLFxyXG4gICAgICAgIGNvdW50OiAwLFxyXG4gICAgICAgIG1pR3JvdXBzOiBbXSxcclxuICAgICAgICBiYXNrZXRJbmZvTWlEZXRhaWxzOiBbXSxcclxuICAgICAgICBzdXBwSW5mbzogW11cclxuICAgICAgfSksXHJcbiAgICAgIHRlbXBpZDogYmFza2V0LmlkLFxyXG4gICAgICBpZDogYmFza2V0LmlkLFxyXG4gICAgICB0aXRsZTogYmFza2V0LnRpdGxlLFxyXG4gICAgICBwcmljZXM6IHt9LFxyXG4gICAgICBtaXhlZEN1cnJlbmN5OiBmYWxzZSxcclxuICAgICAgY291bnQ6IDAsXHJcbiAgICAgIG1pR3JvdXBzOiBbXSxcclxuICAgICAgYmFza2V0SW5mb01pRGV0YWlsczogW10sXHJcbiAgICAgIHN1cHBJbmZvOiBbXVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLm5leHQoYmFza2V0KTtcclxuICB9XHJcblxyXG4gIGRlc3RydWN0b3IoKSB7XHJcbiAgICB0aGlzLnN1YmplY3QuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIG5leHQoYmFza2V0OiBVc2VyQmFza2V0UmVzdWx0KSB7XHJcbiAgICBiYXNrZXQgPSB0aGlzLmhlbHBlcnMuY2xvbmUoYmFza2V0KTtcclxuICAgIGlmIChcclxuICAgICAgYmFza2V0LnN0YXR1cyA9PT0gQmFza2V0U3RhdHVzLkFwcHJvdmVkICYmXHJcbiAgICAgIGJhc2tldC5iYXNrZXRJdGVtc1swXS5wZXJJdGVtUGhvbmVOdW1iZXIgPT09IHVuZGVmaW5lZFxyXG4gICAgKSB7XHJcbiAgICAgIC8vIFdlJ3JlIGluIGFwcHJvdmVkIHN0YXRlIHNvIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHdlIGhhdmUgdGhlIHN1cHBsZW1lbnQgc3R1ZmZcclxuICAgICAgdGhpcy5iYXNrZXRTZXJ2aWNlXHJcbiAgICAgICAgLmdldEJhc2tldCh7XHJcbiAgICAgICAgICBjb252ZXJ0Q3VycmVuY3lUbzogJ0dCUCcsXHJcbiAgICAgICAgICBpZDogYmFza2V0LmlkLFxyXG4gICAgICAgICAgd2l0aFN1cHBsZW1lbnRhbDogdHJ1ZVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLnN1YnNjcmliZSgobmV3QmFza2V0OiBVc2VyQmFza2V0UmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm5leHQobmV3QmFza2V0KTtcclxuICAgICAgICB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pZCA9IGJhc2tldC5pZDtcclxuICAgIHRoaXMudGl0bGUgPSBiYXNrZXQudGl0bGU7XHJcbiAgICBjb25zdCB0b1NlbmQ6IEJhc2tldERldGFpbHMgPSB7XHJcbiAgICAgIC4uLmJhc2tldCxcclxuICAgICAgLi4uKGJhc2tldC5iYXNrZXRJdGVtcyB8fCBbXSkucmVkdWNlKFxyXG4gICAgICAgIChhY2N1bTogQmFza2V0SW5mb3JtYXRpb24sIGl0ZW06IEJhc2tldEl0ZW0sIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgICAgIGlmICghYWNjdW0ucHJpY2VzW2l0ZW0uY3VycmVuY3ldKSB7XHJcbiAgICAgICAgICAgIGFjY3VtLnByaWNlc1tpdGVtLmN1cnJlbmN5XSA9IDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBhY2N1bS5wcmljZXNbaXRlbS5jdXJyZW5jeV0gKz0gaXRlbS5wcmljZTtcclxuXHJcbiAgICAgICAgICBhY2N1bS5zdXBwSW5mby5wdXNoKFxyXG4gICAgICAgICAgICBuZXcgU3VwcGxlbWVudGFyeUJvb2tpbmdJbmZvSW1wbChcclxuICAgICAgICAgICAgICBpdGVtLFxyXG4gICAgICAgICAgICAgIHRoaXMuaGVscGVycyxcclxuICAgICAgICAgICAgICB0aGlzLmdldFVzZXJGZXRjaGVyXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICBpZiAoaXRlbS5taUdyb3Vwc0F2YWlsYWJsZSAmJiBpdGVtLm1pR3JvdXBzQXZhaWxhYmxlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgYWNjdW0ubWlHcm91cHMucHVzaCh7XHJcbiAgICAgICAgICAgICAgdHlwZTogaXRlbS5zZXJ2aWNlLnR5cGUsXHJcbiAgICAgICAgICAgICAgb3B0aW9uczogaXRlbS5taUdyb3Vwc0F2YWlsYWJsZSxcclxuICAgICAgICAgICAgICBiYXNrZXRJdGVtOiBpdGVtLFxyXG4gICAgICAgICAgICAgIHZhbHVlOiBpdGVtLm1pR3JvdXBTZWxlY3RlZCB8fCAnJ1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChpdGVtLm1hbmFnZW1lbnRJbmZvPy5sZW5ndGggPiAwICYmIGl0ZW0udXNlcnM/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgYWNjdW0uYmFza2V0SW5mb01pRGV0YWlscy5wdXNoKFxyXG4gICAgICAgICAgICAgIG5ldyBCYXNrZXRJbmZvTWlEZXRhaWxzSW1wbChcclxuICAgICAgICAgICAgICAgIGl0ZW0sXHJcbiAgICAgICAgICAgICAgICB0aGlzLmJhc2tldFNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgICB0aGlzLmhlbHBlcnNcclxuICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gYWNjdW07XHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBwcmljZXM6IHt9LFxyXG4gICAgICAgICAgbWl4ZWRDdXJyZW5jeTogZmFsc2UsXHJcbiAgICAgICAgICBjb3VudDogYmFza2V0LmJhc2tldEl0ZW1zPy5sZW5ndGggfHwgMCxcclxuICAgICAgICAgIG1pR3JvdXBzOiBbXSxcclxuICAgICAgICAgIGJhc2tldEluZm9NaURldGFpbHM6IFtdLFxyXG4gICAgICAgICAgc3VwcEluZm86IFtdXHJcbiAgICAgICAgfVxyXG4gICAgICApXHJcbiAgICB9O1xyXG4gICAgdG9TZW5kLm1peGVkQ3VycmVuY3kgPSBPYmplY3Qua2V5cyh0b1NlbmQucHJpY2VzKS5sZW5ndGggPiAxO1xyXG4gICAgdGhpcy5zdWJqZWN0Lm5leHQodG9TZW5kKTtcclxuXHJcbiAgICB0aGlzLnJlcXVpcmVzU2VydmljZS5hZGRCYXNrZXRJdGVtKGJhc2tldCk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUVudGVycHJpc2VCYXNrZXRTZXJ2aWNlPFxyXG4gIEFOUFVfUSBleHRlbmRzIEFjY2VwdE5ld1ByaWNlRmV0Y2hlclR5cGUsXHJcbiAgQUlUQl9RIGV4dGVuZHMgQWRkSXRlbVRvQmFza2V0RmV0Y2hlclR5cGUsXHJcbiAgQVVUQl9RIGV4dGVuZHMgQWRkVXNlckJhc2tldEZldGNoZXJUeXBlLFxyXG4gIENCX1EgZXh0ZW5kcyBDcmVhdGVCYXNrZXRGZXRjaGVyVHlwZSxcclxuICBHQl9RIGV4dGVuZHMgR2V0QmFza2V0RmV0Y2hlclR5cGUsXHJcbiAgQkJfUSBleHRlbmRzIEJvb2tCYXNrZXRGZXRjaGVyVHlwZSxcclxuICBEQl9RIGV4dGVuZHMgRGVsZXRlQmFza2V0RmV0Y2hlclR5cGUsXHJcbiAgR0FTX1EgZXh0ZW5kcyBNaUF1dG9TdWdnZXN0RmV0Y2hlclR5cGUsXHJcbiAgUklCX1EgZXh0ZW5kcyBEZWxldGVCYXNrZXRJdGVtRmV0Y2hlclR5cGUsXHJcbiAgUlZCX1EgZXh0ZW5kcyBSZXZhbGlkYXRlQmFza2V0RmV0Y2hlclR5cGUsXHJcbiAgU0JNSV9RIGV4dGVuZHMgU2V0QmFza2V0SXRNaUdyb3VwRmV0Y2hlclR5cGUsXHJcbiAgU1ZNSV9RIGV4dGVuZHMgU2V0QmFza2V0SXRNaUZldGNoZXJUeXBlLFxyXG4gIFZNSV9RIGV4dGVuZHMgVmFsaWRhdGVNaUZldGNoZXJUeXBlLFxyXG4gIFNCQV9RIGV4dGVuZHMgU2VuZEJhc2tldEFwcHJvdmFsRmV0Y2hlclR5cGUsXHJcbiAgR1VfUSBleHRlbmRzIFNlYXJjaEdldFVzZXJGZXRjaGVyVHlwZSxcclxuICBHVUJfUSBleHRlbmRzIEdldFVzZXJCYXNrZXRzRmV0Y2hlclR5cGUsXHJcbiAgU0JMUF9RIGV4dGVuZHMgU2V0QmFza2V0SXRlbUxlYWRQYXNzZW5nZXJGZXRjaGVyVHlwZSxcclxuICBNSVREQl9RIGV4dGVuZHMgTW92ZUl0ZW1Ub0FEaWZmZXJlbnRCYXNrZXRUeXBlLFxyXG4gIFVCTl9RIGV4dGVuZHMgQmFzZVVwZGF0ZUJhc2tldE5vdGVzVHlwZSxcclxuICBVQlRfUSBleHRlbmRzIEJhc2VVcGRhdGVCYXNrZXRUaXRsZVR5cGUsXHJcbiAgU0JNX1EgZXh0ZW5kcyBTZXRCYXNrZXRJdGVtUGF5bWVudE1ldGhvZFR5cGUsXHJcbiAgR0NJX1EgZXh0ZW5kcyBHZXRDYW5jZWxsYXRpb25JbmZvVHlwZVxyXG4+IGltcGxlbWVudHMgRW50ZXJwcmlzZUJhc2tldFNlcnZpY2VJbnRlcmZhY2Vcclxue1xyXG4gIHByaXZhdGUgY3VycmVudEJhc2tldHM6IEludGVybmFsQmFza2V0PEdVX1E+W10gPSBbXTtcclxuXHJcbiAgaGlnaGxpZ2h0QmFza2V0SXRlbXNFbWl0dGVyOiBTdWJqZWN0PEdldFVzZXJCYXNrZXRJdGVtUmVzdWx0W10+ID0gbmV3IFN1YmplY3Q8XHJcbiAgICBHZXRVc2VyQmFza2V0SXRlbVJlc3VsdFtdXHJcbiAgPigpO1xyXG5cclxuICBiYXNrZXRDaGFuZ2VFbWl0dGVyOiBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPihcclxuICAgICcnXHJcbiAgKTtcclxuXHJcbiAgcHJpdmF0ZSBnZXQgY3VycmVudEJhc2tldElEKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5iYXNrZXRDaGFuZ2VFbWl0dGVyLnZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXQgY3VycmVudEJhc2tldElEKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIGlmICh2YWx1ZSAhPT0gdGhpcy5jdXJyZW50QmFza2V0SUQpIHtcclxuICAgICAgLy8gdGhpcyBwcmV2ZW50cyB0aGUgZW1pdHRlciBnZXR0aW5nIHN0dWNrIGluIGEgbG9vcCAgLSBjYXN1aW5nIGJyb3dzZXIgb3ZlcmxvYWRzXHJcbiAgICAgIHRoaXMuYmFza2V0Q2hhbmdlRW1pdHRlci5uZXh0KHZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGJhc2tldHMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEludGVybmFsQmFza2V0PEdVX1E+W10+KFtdKTtcclxuXHJcbiAgYmFza2V0TGlzdDogQmFza2V0UHJpY2VzTGlzdFtdID0gW1xyXG4gICAge1xyXG4gICAgICB0eXBlOiBTZXJ2aWNlVHlwZS5GbGlnaHQsXHJcbiAgICAgIHRleHQ6ICdGTElHSFRTJyxcclxuICAgICAgcHJpY2U6IDBcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHR5cGU6IFNlcnZpY2VUeXBlLlJhaWwsXHJcbiAgICAgIHRleHQ6ICdSQUlMJyxcclxuICAgICAgcHJpY2U6IDBcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHR5cGU6IFNlcnZpY2VUeXBlLkhvdGVsLFxyXG4gICAgICB0ZXh0OiAnSE9URUxTJyxcclxuICAgICAgcHJpY2U6IDBcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHR5cGU6IFNlcnZpY2VUeXBlLkNhYixcclxuICAgICAgdGV4dDogJ1RBWElTJyxcclxuICAgICAgcHJpY2U6IDBcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHR5cGU6IFNlcnZpY2VUeXBlLkNhcixcclxuICAgICAgdGV4dDogJ0NBUlMnLFxyXG4gICAgICBwcmljZTogMFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgdHlwZTogU2VydmljZVR5cGUuRXVyb3N0YXIsXHJcbiAgICAgIHRleHQ6ICdFVVJPU1RBUicsXHJcbiAgICAgIHByaWNlOiAwXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0eXBlOiBTZXJ2aWNlVHlwZS5JbnRlcm5hdGlvbmFsUmFpbCxcclxuICAgICAgdGV4dDogJ0lOVEVSTkFUSU9OQUwgUkFJTCcsXHJcbiAgICAgIHByaWNlOiAwXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0eXBlOiBTZXJ2aWNlVHlwZS5QYXJraW5nLFxyXG4gICAgICB0ZXh0OiAnUEFSS0lORycsXHJcbiAgICAgIHByaWNlOiAwXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0eXBlOiBTZXJ2aWNlVHlwZS5Mb3VuZ2UsXHJcbiAgICAgIHRleHQ6ICdMT1VOR0VTJyxcclxuICAgICAgcHJpY2U6IDBcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHR5cGU6IFNlcnZpY2VUeXBlLkNvYWNoLFxyXG4gICAgICB0ZXh0OiAnQ09BQ0gnLFxyXG4gICAgICBwcmljZTogMFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgdHlwZTogU2VydmljZVR5cGUuRmFzdFRyYWNrLFxyXG4gICAgICB0ZXh0OiAnRkFTVF9UUkFDSycsXHJcbiAgICAgIHByaWNlOiAwXHJcbiAgICB9XHJcbiAgXTtcclxuXHJcbiAgYmFza2V0UHJpY2VzOiBCZWhhdmlvclN1YmplY3Q8QmFza2V0UHJpY2VzPiA9XHJcbiAgICBuZXcgQmVoYXZpb3JTdWJqZWN0PEJhc2tldFByaWNlcz4oeyB0b3RhbDogbnVsbCwgbGlzdDogdGhpcy5iYXNrZXRMaXN0IH0pO1xyXG5cclxuICBtZW51U3RhdGUgPSBNZW51U2xpZGVFbnVtLk9VVDtcclxuICBwcml2YXRlIHJlcXVpcmVzU2VydmljZTogQmFzZVJlcXVpcmVzUmVhc29uU2VydmljZTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGFjY2VwdE5ld1ByaWNlVXBkYXRlcjogQmFzZUFjY2VwdE5ld1ByaWNlVXBkYXRlcjxBTlBVX1E+LFxyXG4gICAgcHJpdmF0ZSBhZGRJdGVtVG9CYXNrZXRVcGRhdGVyOiBCYXNlQWRkSXRlbVRvQmFza2V0VXBkYXRlcjxBSVRCX1E+LFxyXG4gICAgcHJpdmF0ZSBhZGRVc2VyVG9CYXNrZXRJdGVtOiBCYXNlQWRkVXNlclRvQmFza2V0SXRlbVVwZGF0ZXI8QVVUQl9RPixcclxuICAgIHByaXZhdGUgYmFza2V0Q3JlYXRvcjogQmFzZUNyZWF0ZUJhc2tldFVwZGF0ZXI8Q0JfUT4sXHJcbiAgICBwdWJsaWMgYmFza2V0RmV0Y2hlcjogQmFzZUdldEJhc2tldEZldGNoZXI8R0JfUT4sXHJcbiAgICBwcml2YXRlIGJvb2tCYXNrZXRVcGRhdGVyOiBCYXNlQm9va0Jhc2tldFVwZGF0ZXI8QkJfUT4sXHJcbiAgICBwcml2YXRlIGRlbGV0ZUJhc2tldFVwZGF0ZXI6IEJhc2VEZWxldGVCYXNrZXRVcGRhdGVyPERCX1E+LFxyXG4gICAgcHJpdmF0ZSBnZXRNaUF1dG9TdWdlc3Rpb25GZXRjaGVyOiBCYXNlR2V0TWlBdXRvU3VnZXN0aW9uRmV0Y2hlcjxHQVNfUT4sXHJcbiAgICBwcml2YXRlIGhlbHBlcnM6IEJhc2VIZWxwZXJSb3V0aW5lcyxcclxuICAgIHByaXZhdGUgcmVtb3ZlSXRlbUZyb21CYXNrZXRVcGRhdGVyOiBCYXNlUmVtb3ZlSXRlbUZyb21CYXNrZXRVcGRhdGVyPFJJQl9RPixcclxuICAgIHByaXZhdGUgcmV2YWxpZGF0ZUJhc2tldFVwZGF0ZXI6IEJhc2VSZXZhbGlkYXRlQmFza2V0VXBkYXRlcjxSVkJfUT4sXHJcbiAgICBwcml2YXRlIHNldEJhc2tldEl0ZW1NaUdyb3VwVXBkYXRlcjogQmFzZVNldEJhc2tldEl0ZW1NaUdyb3VwVXBkYXRlcjxTQk1JX1E+LFxyXG4gICAgcHJpdmF0ZSBzZXRCYXNrZXRJdGVtTWlWYWx1ZVVwZGF0ZXI6IEJhc2VTZXRCYXNrZXRJdGVtTWlWYWx1ZVVwZGF0ZXI8U1ZNSV9RPixcclxuICAgIHByaXZhdGUgdmFsaWRhdGVNaUZyZWVWYWx1ZTogQmFzZVZhbGlkYXRlTWlGcmVlVmFsdWVUZXN0ZXI8Vk1JX1E+LFxyXG4gICAgcHJpdmF0ZSBzZW5kQmFza2V0Rm9yQXBwcm92YWxVcGRhdGVyOiBCYXNlU2VuZEJhc2tldEZvckFwcHJvdmFsVXBkYXRlcjxTQkFfUT4sXHJcbiAgICBwcml2YXRlIGdldFVzZXJGZXRjaGVyOiBCYXNlR2V0VXNlckZldGNoZXI8R1VfUT4sXHJcbiAgICBwcml2YXRlIGdldFVzZXJCYXNrZXRzRmV0Y2hlcjogQmFzZUdldFVzZXJCYXNrZXRzRmV0Y2hlcjxHVUJfUT4sXHJcbiAgICBwcml2YXRlIFNldEJhc2tldEl0ZW1MZWFkUGFzc2VuZ2VyOiBCYXNlU2V0QmFza2V0SXRlbUxlYWRQYXNzZW5nZXJVcGRhdGVyPFNCTFBfUT4sXHJcbiAgICBwcml2YXRlIG1vdmVJdGVtVG9BRGlmZmVyZW50QmFza2V0OiBCYXNlbW92ZUJhc2tldEl0ZW1Ub0Jhc2tldDxNSVREQl9RPixcclxuICAgIHByaXZhdGUgdXBkYXRlQmFza2V0Tm90ZXNVcGRhdGVyOiBCYXNlVXBkYXRlQmFza2V0Tm90ZVVwZGF0ZXI8VUJOX1E+LFxyXG4gICAgcHJpdmF0ZSB1cGRhdGVCYXNrZXRUaXRsZVVwZGF0ZXI6IEJhc2VVcGRhdGVCYXNrZXRUaXRsZVVwZGF0ZXI8VUJUX1E+LFxyXG4gICAgcHJpdmF0ZSBzZXRQYXltZW50TWV0aG9kVXBkYXRlcjogQmFzZVNldFBheW1lbnRPcHRpb25VcGRhdGVyPFNCTV9RPixcclxuICAgIHByaXZhdGUgZ2V0Q2FuY2VsbGF0aW9uSW5mb0ZldGNoZXI6IEJhc2VHZXRDYW5jZWxsYXRpb25JbmZvRmV0Y2hlcjxHQ0lfUT4sXHJcbiAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBVc2VyU2VydmljZUludGVyZmFjZSxcclxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBCYXNlTW9kYWxPcGVuZXJTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICB0aGlzLnJlcXVpcmVzU2VydmljZSA9IG5ldyBCYXNlUmVxdWlyZXNSZWFzb25TZXJ2aWNlKG1vZGFsU2VydmljZSwgdGhpcyk7XHJcbiAgICB0aGlzLnVzZXJTZXJ2aWNlLmNoYW5nZVVzZXIuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHVzZXJEZXRhaWxzOiBGdWxsVXNlckRldGFpbHMpID0+IHtcclxuICAgICAgICB0aGlzLnJlc2V0KCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0UmVxdWlyZXNSZWFzb25TZXJ2aWNlKCk6IFJlcXVpcmVzUmVhc29uU2VydmljZUludGVyZmFjZSB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXF1aXJlc1NlcnZpY2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVzZXQoKSB7XHJcbiAgICBpZiAodGhpcy51c2VyU2VydmljZS5nZXRmdWxsVXNlckRldGFpbHMoZmFsc2UpLnVzZXJEYXRhLnZhbHVlKSB7XHJcbiAgICAgIHRoaXMuZ2V0VXNlckJhc2tldHNGZXRjaGVyXHJcbiAgICAgICAgLmZldGNoTGlzdCh7XHJcbiAgICAgICAgICBiYXNrZXRTdGF0dXM6IEJhc2tldFN0YXR1cy5PcGVuLFxyXG4gICAgICAgICAgdXNlcjogdGhpcy51c2VyU2VydmljZVxyXG4gICAgICAgICAgICAuZ2V0ZnVsbFVzZXJEZXRhaWxzKHRydWUpXHJcbiAgICAgICAgICAgIC51c2VyRGF0YS52YWx1ZS51c2VyX2lkLnRvU3RyaW5nKClcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5waXBlKHRha2UoMSkpXHJcbiAgICAgICAgLnN1YnNjcmliZShcclxuICAgICAgICAgIChiYXNrZXRzOiBVc2VyQmFza2V0UmVzdWx0W10pID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudEJhc2tldHMgPSBiYXNrZXRzLm1hcCgoYmFza2V0OiBVc2VyQmFza2V0UmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKGJhc2tldCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGludEJhc2tldCA9IHRoaXMuZmluZEJhc2tldChiYXNrZXQuaWQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFpbnRCYXNrZXQpIHtcclxuICAgICAgICAgICAgICAgICAgaW50QmFza2V0ID0gbmV3IEludGVybmFsQmFza2V0KFxyXG4gICAgICAgICAgICAgICAgICAgIGJhc2tldCxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhlbHBlcnMsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcyxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFVzZXJGZXRjaGVyLFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVxdWlyZXNTZXJ2aWNlXHJcbiAgICAgICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRCYXNrZXRzLnB1c2goaW50QmFza2V0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBpbnRCYXNrZXQ7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuYmFza2V0cy5uZXh0KGN1cnJlbnRCYXNrZXRzKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50QmFza2V0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5jdXJyZW50QmFza2V0SUQgPSBjdXJyZW50QmFza2V0c1swXS5pZDtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRCYXNrZXRJRCA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuYmFza2V0Q2hhbmdlRW1pdHRlci5uZXh0KHRoaXMuY3VycmVudEJhc2tldElEKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICAoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jdXJyZW50QmFza2V0cy5mb3JFYWNoKChiYXNrZXQ6IEludGVybmFsQmFza2V0SW50ZXJmYWNlKSA9PlxyXG4gICAgICAgIGJhc2tldC5zdWJqZWN0LnVuc3Vic2NyaWJlKClcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5jdXJyZW50QmFza2V0cyA9IFtdO1xyXG4gICAgICB0aGlzLmN1cnJlbnRCYXNrZXRJRCA9IG51bGw7XHJcbiAgICAgIHRoaXMuYmFza2V0cy5uZXh0KHRoaXMuY3VycmVudEJhc2tldHMpO1xyXG4gICAgICB0aGlzLmJhc2tldENoYW5nZUVtaXR0ZXIubmV4dCh0aGlzLmN1cnJlbnRCYXNrZXRJRCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0QWxsT3BlbkJhc2tldHModXNlcl9pZDogc3RyaW5nKTogUHJvbWlzZTxVc2VyQmFza2V0UmVzdWx0W10+IHtcclxuICAgIHJldHVybiB0aGlzLmdldFVzZXJCYXNrZXRzRmV0Y2hlclxyXG4gICAgICAuZmV0Y2hMaXN0KHsgYmFza2V0U3RhdHVzOiBCYXNrZXRTdGF0dXMuT3BlbiwgdXNlcjogdXNlcl9pZCB9KVxyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YWtlKDEpLFxyXG4gICAgICAgIG1hcCgocmVzdWx0czogVXNlckJhc2tldFJlc3VsdFtdKSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmVzdWx0cy5mb3JFYWNoKChyZXN1bHQ6IFVzZXJCYXNrZXRSZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoIXRoaXMuZmluZEJhc2tldChyZXN1bHQuaWQpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbnRCYXNrZXQgPSBuZXcgSW50ZXJuYWxCYXNrZXQoXHJcbiAgICAgICAgICAgICAgICAgIHJlc3VsdCxcclxuICAgICAgICAgICAgICAgICAgdGhpcy5oZWxwZXJzLFxyXG4gICAgICAgICAgICAgICAgICB0aGlzLFxyXG4gICAgICAgICAgICAgICAgICB0aGlzLmdldFVzZXJGZXRjaGVyLFxyXG4gICAgICAgICAgICAgICAgICB0aGlzLnJlcXVpcmVzU2VydmljZVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEJhc2tldHMucHVzaChpbnRCYXNrZXQpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdHM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKVxyXG4gICAgICAudG9Qcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgYWRkVG9CYXNrZXQoXHJcbiAgICBpdGVtOiBBZGRJdGVtVG9CYXNrZXQuVmFyaWFibGVzLFxyXG4gICAgaW50QmFza2V0OiBJbnRlcm5hbEJhc2tldDxHVV9RPixcclxuICAgIHNlYXJjaFNlcnZpY2U6IEVudGVycHJpc2VTZWFyY2hTZXJ2aWNlSW50ZXJmYWNlLFxyXG4gICAgdHJhdmVsbGVyczogVHJhdmVsbGVyW10gPSBbXSxcclxuICAgIHJlcXVpcmVzUmVhc29uOiBib29sZWFuXHJcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpdGVtLmNvbnZlcnRDdXJyZW5jeVRvID0gJ0dCUCc7XHJcbiAgICBpZiAodHJhdmVsbGVycz8ubGVuZ3RoID4gMCkge1xyXG4gICAgICBpdGVtLnVzZXJzID0gdGhpcy5oZWxwZXJzLm1ha2VVc2Vycyh0cmF2ZWxsZXJzKTtcclxuICAgICAgaXRlbS5sZWFkUGFzc2VuZ2VyID0gaXRlbS51c2Vyc1swXS5pZDtcclxuICAgIH1cclxuICAgIGl0ZW0ub3V0Ym91bmREYXRlID0gaXRlbS5vdXRib3VuZERhdGVcclxuICAgICAgPyBuZXcgRGF0ZSh0aGlzLmhlbHBlcnMuZm9ybWF0SXNvRGF0ZVRpbWUoaXRlbS5vdXRib3VuZERhdGUpKVxyXG4gICAgICA6IGl0ZW0ub3V0Ym91bmREYXRlO1xyXG4gICAgaXRlbS5pbmJvdW5kRGF0ZSA9IGl0ZW0uaW5ib3VuZERhdGVcclxuICAgICAgPyBuZXcgRGF0ZSh0aGlzLmhlbHBlcnMuZm9ybWF0SXNvRGF0ZVRpbWUoaXRlbS5pbmJvdW5kRGF0ZSkpXHJcbiAgICAgIDogaXRlbS5pbmJvdW5kRGF0ZTtcclxuXHJcbiAgICBpdGVtLnJlcXVpcmVzUmVhc29uID0gcmVxdWlyZXNSZWFzb247XHJcbiAgICBpdGVtID0gdGhpcy5jaGVja0RldGFpbHMoaXRlbSk7XHJcbiAgICBpZiAoaXRlbSAmJiBpbnRCYXNrZXQpIHtcclxuICAgICAgdGhpcy5hZGRJdGVtVG9CYXNrZXRVcGRhdGVyXHJcbiAgICAgICAgLnVwZGF0ZU9uZShpdGVtKVxyXG4gICAgICAgIC5waXBlKHRha2UoMSkpXHJcbiAgICAgICAgLnN1YnNjcmliZShcclxuICAgICAgICAgIChuZXdCYXNrZXQ6IFBhcnRpYWw8VXNlckJhc2tldFJlc3VsdD4pID0+IHtcclxuICAgICAgICAgICAgaW50QmFza2V0Lm5leHQoe1xyXG4gICAgICAgICAgICAgIC4uLmludEJhc2tldC5zdWJqZWN0LnZhbHVlLFxyXG4gICAgICAgICAgICAgIC4uLm5ld0Jhc2tldFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3Qgc2VydmljZSA9IHRoaXMudXNlclNlcnZpY2UuZmluZFNlcnZpY2UoaXRlbS5zZXJ2aWNlKS50eXBlO1xyXG4gICAgICAgICAgICBzZWFyY2hTZXJ2aWNlLnNlYXJjaF9vYmplY3RzW3NlcnZpY2VdLmJvb2tpbmdfY2hvc2VuID0gdHJ1ZTtcclxuICAgICAgICAgICAgc2VhcmNoU2VydmljZS5zZWFyY2hfb2JqZWN0c1tzZXJ2aWNlXS5jaG9zZW4gPSBmYWxzZTtcclxuICAgICAgICAgICAgY29uc3QgYmk6IEdldFVzZXJCYXNrZXRJdGVtUmVzdWx0W10gPSBuZXdCYXNrZXQuYmFza2V0SXRlbXM7XHJcbiAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0QmFza2V0SXRlbXNFbWl0dGVyLm5leHQoYmkpO1xyXG4gICAgICAgICAgICB0aGlzLmJhc2tldENoYW5nZUVtaXR0ZXIubmV4dCh0aGlzLmN1cnJlbnRCYXNrZXRJRCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgKGVycm9yOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgICAgIGludEJhc2tldC5zdWJqZWN0Lm5leHQoaW50QmFza2V0LnN1YmplY3QudmFsdWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBsb2FkQmFza2V0KGlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCBpbnRCYXNrZXQgPSB0aGlzLmZpbmRCYXNrZXQoaWQpO1xyXG4gICAgaWYgKCFpbnRCYXNrZXQpIHtcclxuICAgICAgaW50QmFza2V0ID0gbmV3IEludGVybmFsQmFza2V0KFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGlkLFxyXG4gICAgICAgICAgYmFza2V0SXRlbXM6IFtdXHJcbiAgICAgICAgfSBhcyBCYXNrZXREZXRhaWxzLFxyXG4gICAgICAgIHRoaXMuaGVscGVycyxcclxuICAgICAgICB0aGlzLFxyXG4gICAgICAgIHRoaXMuZ2V0VXNlckZldGNoZXIsXHJcbiAgICAgICAgdGhpcy5yZXF1aXJlc1NlcnZpY2VcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5jdXJyZW50QmFza2V0cy5wdXNoKGludEJhc2tldCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmJhc2tldEZldGNoZXJcclxuICAgICAgLmZldGNoT25lKHsgY29udmVydEN1cnJlbmN5VG86ICdHQlAnLCBpZCB9KVxyXG4gICAgICAuc3Vic2NyaWJlKChuZXdCYXNrZXQ6IFVzZXJCYXNrZXRSZXN1bHQpID0+IHtcclxuICAgICAgICBpbnRCYXNrZXQubmV4dChuZXdCYXNrZXQpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHN1YnNyaWJlVG9CYXNrZXQoaWQ6IHN0cmluZywgb2JzZXJ2ZXI6IE9ic2VydmVyPEJhc2tldERldGFpbHM+KTogdm9pZCB7XHJcbiAgICBjb25zdCBpbnRCYXNrZXQgPSB0aGlzLmZpbmRCYXNrZXQoaWQpO1xyXG4gICAgaWYgKGludEJhc2tldCkge1xyXG4gICAgICBpbnRCYXNrZXQuc3ViamVjdC5zdWJzY3JpYmUob2JzZXJ2ZXIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVtb3ZlRXhwaXJlZEl0ZW1zKGlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IGludEJhc2tldCA9IHRoaXMuZmluZEJhc2tldChpZCk7XHJcbiAgICBpbnRCYXNrZXQuc3ViamVjdC52YWx1ZS5iYXNrZXRJdGVtc1xyXG4gICAgICAuZmlsdGVyKChiYXNrZXRJdGVtOiBCYXNrZXRJdGVtKTogYm9vbGVhbiA9PiB7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgIGJhc2tldEl0ZW0ubGF0ZXN0VmFsaWRhdGlvblByaWNlRGlmZmVyZW5jZSAhPT0gMCB8fCBiYXNrZXRJdGVtLmV4cGlyZWRcclxuICAgICAgICApO1xyXG4gICAgICB9KVxyXG4gICAgICAuZm9yRWFjaCgoYmFza2V0SXRlbTogQmFza2V0SXRlbSkgPT4ge1xyXG4gICAgICAgIHRoaXMucmVtb3ZlQmFza2V0SXRlbShpZCwgYmFza2V0SXRlbSk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgcmVtb3ZlQmFza2V0SXRlbShcclxuICAgIGJhc2tldElkOiBzdHJpbmcsXHJcbiAgICBpdGVtOiBHZXRVc2VyQmFza2V0SXRlbVJlc3VsdFxyXG4gICk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgaW50QmFza2V0OiBJbnRlcm5hbEJhc2tldDxHVV9RPiA9IHRoaXMuZmluZEJhc2tldChiYXNrZXRJZCk7XHJcbiAgICAvLyBpZiBpdCdzIGEgaG90ZWwgcmVtb3ZlIGFsbCBsaW5rZWQgaXRlbXNcclxuICAgIGlmIChpdGVtLnNlcnZpY2UudHlwZSA9PT0gU2VydmljZVR5cGUuSG90ZWwpIHtcclxuICAgICAgY29uc3QgaG90ZWxJdGVtcyA9IGludEJhc2tldC5zdWJqZWN0LnZhbHVlLmJhc2tldEl0ZW1zLmZpbHRlcihcclxuICAgICAgICAoYmFza2V0SXRlbSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgaXRlbS5kZXRhaWwuaG90ZWxJZCA9PT0gYmFza2V0SXRlbS5kZXRhaWwuaG90ZWxJZCAmJlxyXG4gICAgICAgICAgICBpdGVtLmRldGFpbC5yb29tc1swXS5pZCA9PT0gYmFza2V0SXRlbS5kZXRhaWwucm9vbXNbMF0uaWQgJiZcclxuICAgICAgICAgICAgaXRlbS5kZXRhaWwucm9vbXNbMF0uY2hlY2tJbiA9PT1cclxuICAgICAgICAgICAgICBiYXNrZXRJdGVtLmRldGFpbC5yb29tc1swXS5jaGVja0luICYmXHJcbiAgICAgICAgICAgIGl0ZW0uZGV0YWlsLnJvb21zWzBdLmNoZWNrT3V0ID09PVxyXG4gICAgICAgICAgICAgIGJhc2tldEl0ZW0uZGV0YWlsLnJvb21zWzBdLmNoZWNrT3V0XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgICAgaWYgKGhvdGVsSXRlbXMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgIC8vIEVOVC0yNDQ3IG5ldyBtb2RhbCBtYWRlIGluIExVLCBuZWVkcyB0byBiZSBtYWRlIGluIGFsbCBvYnRzIGFuZCBhcHAgb3Igd2lsbCBnZXQgZXJyb3JcclxuICAgICAgICBhd2FpdCB0aGlzLm1vZGFsU2VydmljZS5vcGVuKE1vZGFsVHlwZXMuV2FybmluZ1JlbW92ZU1vZGFsQ29tcG9uZW50KTtcclxuICAgICAgICBob3RlbEl0ZW1zLmZvckVhY2goKGl0ZW06IEJhc2tldEl0ZW0pID0+IHtcclxuICAgICAgICAgIHRoaXMucmVtb3ZlSXRlbUZyb21CYXNrZXRVcGRhdGVyXHJcbiAgICAgICAgICAgIC51cGRhdGVPbmUoeyBjb252ZXJ0Q3VycmVuY3lUbzogJ0dCUCcsIGJhc2tldEl0ZW06IGl0ZW0uaWQgfSlcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgobmV3QmFza2V0OiBCYXNrZXQpID0+IHtcclxuICAgICAgICAgICAgICBpbnRCYXNrZXQubmV4dCh7XHJcbiAgICAgICAgICAgICAgICAuLi5pbnRCYXNrZXQuc3ViamVjdC52YWx1ZSxcclxuICAgICAgICAgICAgICAgIC4uLm5ld0Jhc2tldFxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIHRoaXMuYmFza2V0Q2hhbmdlRW1pdHRlci5uZXh0KGJhc2tldElkKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVJdGVtRnJvbUJhc2tldFVwZGF0ZXJcclxuICAgICAgICAgIC51cGRhdGVPbmUoeyBjb252ZXJ0Q3VycmVuY3lUbzogJ0dCUCcsIGJhc2tldEl0ZW06IGl0ZW0uaWQgfSlcclxuICAgICAgICAgIC5zdWJzY3JpYmUoKG5ld0Jhc2tldDogQmFza2V0KSA9PiB7XHJcbiAgICAgICAgICAgIGludEJhc2tldC5uZXh0KHtcclxuICAgICAgICAgICAgICAuLi5pbnRCYXNrZXQuc3ViamVjdC52YWx1ZSxcclxuICAgICAgICAgICAgICAuLi5uZXdCYXNrZXRcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuYmFza2V0Q2hhbmdlRW1pdHRlci5uZXh0KGJhc2tldElkKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJlbW92ZUl0ZW1Gcm9tQmFza2V0VXBkYXRlclxyXG4gICAgICAgIC51cGRhdGVPbmUoeyBjb252ZXJ0Q3VycmVuY3lUbzogJ0dCUCcsIGJhc2tldEl0ZW06IGl0ZW0uaWQgfSlcclxuICAgICAgICAuc3Vic2NyaWJlKChuZXdCYXNrZXQ6IEJhc2tldCkgPT4ge1xyXG4gICAgICAgICAgaW50QmFza2V0Lm5leHQoe1xyXG4gICAgICAgICAgICAuLi5pbnRCYXNrZXQuc3ViamVjdC52YWx1ZSxcclxuICAgICAgICAgICAgLi4ubmV3QmFza2V0XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIHRoaXMuYmFza2V0Q2hhbmdlRW1pdHRlci5uZXh0KGJhc2tldElkKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXREZWZhdWx0QmFza2V0KFxyXG4gICAgZ2V0Qm9va2VkQmFza2V0OiBib29sZWFuID0gZmFsc2VcclxuICApOiBQcm9taXNlPEludGVybmFsQmFza2V0PEdVX1E+PiB7XHJcbiAgICBjb25zdCBpbnRlcm5hbEJhc2tldDogSW50ZXJuYWxCYXNrZXQ8R1VfUT4gPSBudWxsO1xyXG4gICAgLy8gY29uc29sZS5sb2codGhpcy5jdXJyZW50QmFza2V0SUQpO1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluZE9yQ3JlYXRlQmFza2V0KFxyXG4gICAgICB0aGlzLmN1cnJlbnRCYXNrZXRJRCxcclxuICAgICAgZ2V0Qm9va2VkQmFza2V0XHJcbiAgICApLnRoZW4oKGRhdGEpID0+IHtcclxuICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmluZEJhc2tldChpZDogc3RyaW5nKTogSW50ZXJuYWxCYXNrZXQ8R1VfUT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuY3VycmVudEJhc2tldHMuZmluZCgoYmFza2V0OiBJbnRlcm5hbEJhc2tldDxHVV9RPikgPT4ge1xyXG4gICAgICByZXR1cm4gYmFza2V0LmlkID09PSBpZCB8fCBiYXNrZXQudGVtcGlkID09PSBpZDtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBmaW5kT3JDcmVhdGVCYXNrZXQoXHJcbiAgICBpZD86IHN0cmluZyxcclxuICAgIGdldEJvb2tlZEJhc2tldDogYm9vbGVhbiA9IGZhbHNlXHJcbiAgKTogUHJvbWlzZTxJbnRlcm5hbEJhc2tldDxHVV9RPj4ge1xyXG4gICAgbGV0IGJhc2tldDogSW50ZXJuYWxCYXNrZXQ8R1VfUT4gPSBudWxsO1xyXG4gICAgaWYgKCFpZCkge1xyXG4gICAgICBjb25zdCBhbGxPcGVuQmFza2V0cyA9IGF3YWl0IHRoaXMuZ2V0QWxsT3BlbkJhc2tldHMoXHJcbiAgICAgICAgdGhpcy51c2VyU2VydmljZVxyXG4gICAgICAgICAgLmdldGZ1bGxVc2VyRGV0YWlscyh0cnVlKVxyXG4gICAgICAgICAgLnVzZXJEYXRhLnZhbHVlLnVzZXJfaWQudG9TdHJpbmcoKVxyXG4gICAgICApO1xyXG5cclxuICAgICAgLy8gZmluZCB0aGUgbGFzdCB1cGRhdGVkIGJhc2tldFxyXG4gICAgICBpZiAoIWFsbE9wZW5CYXNrZXRzPy5sZW5ndGgpIHtcclxuICAgICAgICAvLyBFTlQtMjYxNiByZW1vdmVkIGFkZGluZyB0byBjdXJyZW50IGJhc2tldCBhcyB0aGlzIHdhcyBhIGR1cGVcclxuICAgICAgICBiYXNrZXQgPSBhd2FpdCB0aGlzLmNyZWF0ZUJhc2tldCgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIGJhc2tldHMgYXJlIGFscmVhZHkgc29ydGVkIGJ5IGxhc3QgdXBkYXRlZCAtIHJldHVybiB0aGUgbGFzdCB1cGRhdGVkIGJhc2tldFxyXG4gICAgICAgIGJhc2tldCA9IHRoaXMuZmluZEJhc2tldChhbGxPcGVuQmFza2V0c1swXS5pZCk7XHJcblxyXG4gICAgICAgIGlmIChiYXNrZXQuc3ViamVjdC52YWx1ZS5zdGF0dXMgPT09ICdCT09LRUQnICYmICFnZXRCb29rZWRCYXNrZXQpIHtcclxuICAgICAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICAgICAgJysrKyBSZXRyaWV2ZWQgYmFza2V0IGlzIGluIGJvb2tlZCBzdGF0dXMgLSBjcmVhdGluZyBhIG5ldyBvbmUgKysrJ1xyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGJhc2tldCA9IGF3YWl0IHRoaXMuY3JlYXRlQmFza2V0KCk7XHJcbiAgICAgICAgICB0aGlzLmN1cnJlbnRCYXNrZXRzLnB1c2goYmFza2V0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5iYXNrZXRzLm5leHQodGhpcy5jdXJyZW50QmFza2V0cyk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGJhc2tldCA9IHRoaXMuZmluZEJhc2tldChpZCk7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKCcrKysgRm91bmQgQmFza2V0OiAnLCBiYXNrZXQsICcgKysrJyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGJhc2tldDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVCYXNrZXQoKTogUHJvbWlzZTxJbnRlcm5hbEJhc2tldDxHVV9RPj4ge1xyXG4gICAgY29uc3QgYmFza2V0OiBVc2VyQmFza2V0UmVzdWx0ID0ge1xyXG4gICAgICBpZDogVEVNUElEICsgbW9tZW50KCkudW5peCgpLnRvU3RyaW5nKCksXHJcbiAgICAgIG93bmVyOiBudWxsLFxyXG4gICAgICByZWZlcmVuY2U6IG51bGwsXHJcbiAgICAgIHRpdGxlOiBudWxsLFxyXG4gICAgICBub3RlczogbnVsbCxcclxuICAgICAgY3JlYXRlZEF0OiBudWxsLFxyXG4gICAgICB1cGRhdGVkQXQ6IG51bGwsXHJcbiAgICAgIGJhc2tldEl0ZW1zOiBbXSxcclxuICAgICAgc3RhdHVzOiBudWxsLFxyXG4gICAgICB2YWxpZGF0ZWQ6IGZhbHNlXHJcbiAgICB9O1xyXG5cclxuICAgIGNvbnN0IGludEJhc2tldCA9IG5ldyBJbnRlcm5hbEJhc2tldDxHVV9RPihcclxuICAgICAgYmFza2V0LFxyXG4gICAgICB0aGlzLmhlbHBlcnMsXHJcbiAgICAgIHRoaXMsXHJcbiAgICAgIHRoaXMuZ2V0VXNlckZldGNoZXIsXHJcbiAgICAgIHRoaXMucmVxdWlyZXNTZXJ2aWNlXHJcbiAgICApO1xyXG4gICAgLy8geyBzdWJqZWN0OiBuZXcgQmVoYXZpb3JTdWJqZWN0PEJhc2tldD4oYmFza2V0KSwgdGVtcGlkOiBiYXNrZXQuaWQsIGlkOiBiYXNrZXQuaWQsIHRpdGxlOiBiYXNrZXQuaWQgfTtcclxuXHJcbiAgICAvLyBlbnQtMjYxNiBvbmx5IHBsYWNlIHdlIG5lZWQgdG8gYWRkIGEgYmFza2V0IHRvIGN1cnJlbnQgYmFza2V0c1xyXG4gICAgY29uc3QgdG9SZXR1cm4gPSBhd2FpdCB0aGlzLmNyZWF0ZUJhc2tldE9uREIoaW50QmFza2V0KTtcclxuICAgIHRoaXMuY3VycmVudEJhc2tldHMucHVzaCh0b1JldHVybik7XHJcbiAgICB0aGlzLmJhc2tldHMubmV4dCh0aGlzLmN1cnJlbnRCYXNrZXRzKTtcclxuICAgIHRoaXMuYmFza2V0Q2hhbmdlRW1pdHRlci5uZXh0KHRvUmV0dXJuLmlkKTtcclxuICAgIHJldHVybiB0b1JldHVybjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlQmFza2V0T25EQihcclxuICAgIGludEJhc2tldDogSW50ZXJuYWxCYXNrZXQ8R1VfUT5cclxuICApOiBQcm9taXNlPEludGVybmFsQmFza2V0PEdVX1E+PiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICB0aGlzLmJhc2tldENyZWF0b3JcclxuICAgICAgICAudXBkYXRlT25lKHt9KVxyXG4gICAgICAgIC5waXBlKHRha2UoMSkpXHJcbiAgICAgICAgLnN1YnNjcmliZShcclxuICAgICAgICAgIChiYXNrZXQ6IFVzZXJCYXNrZXRSZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgaW50QmFza2V0LmlkID0gYmFza2V0LmlkO1xyXG4gICAgICAgICAgICBpbnRCYXNrZXQubmV4dChiYXNrZXQpO1xyXG4gICAgICAgICAgICByZXNvbHZlKGludEJhc2tldCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgKGVycm9yOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICAoKSA9PiB7fVxyXG4gICAgICAgICk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZU1lbnUoKTogdm9pZCB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMubWVudVN0YXRlID09PSBNZW51U2xpZGVFbnVtLklOIHx8XHJcbiAgICAgIHRoaXMubWVudVN0YXRlID09PSBNZW51U2xpZGVFbnVtLkZMQVRcclxuICAgICkge1xyXG4gICAgICB0aGlzLm1lbnVTdGF0ZSA9IE1lbnVTbGlkZUVudW0uT1VUO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5tZW51U3RhdGUgPSBNZW51U2xpZGVFbnVtLklOO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2xvc2VNZW51KCk6IHZvaWQge1xyXG4gICAgdGhpcy5tZW51U3RhdGUgPSBNZW51U2xpZGVFbnVtLklOO1xyXG4gIH1cclxuXHJcbiAgZ2V0TGF0ZXN0QmFza2V0SXRlbUZvclR5cGVzKFxyXG4gICAgYmFza2V0SXRlbXM6IEJhc2tldEl0ZW1bXVxyXG4gICk6IFJlY29yZDxTZXJ2aWNlVHlwZSwgQmFza2V0SXRlbT4ge1xyXG4gICAgcmV0dXJuIChiYXNrZXRJdGVtcyB8fCBbXSkucmVkdWNlKFxyXG4gICAgICAoXHJcbiAgICAgICAgbGF0ZXN0SXRlbXM6IFJlY29yZDxTZXJ2aWNlVHlwZSwgQmFza2V0SXRlbT4sXHJcbiAgICAgICAgYmFza2V0SXRlbTogQmFza2V0SXRlbVxyXG4gICAgICApID0+IHtcclxuICAgICAgICBsYXRlc3RJdGVtc1tiYXNrZXRJdGVtLnNlcnZpY2UudHlwZV0gPSBiYXNrZXRJdGVtO1xyXG4gICAgICAgIHJldHVybiBsYXRlc3RJdGVtcztcclxuICAgICAgfSxcclxuICAgICAge30gYXMgUmVjb3JkPFNlcnZpY2VUeXBlLCBCYXNrZXRJdGVtPlxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2hlY2tEZXRhaWxzKFxyXG4gICAgaXRlbTogQWRkSXRlbVRvQmFza2V0LlZhcmlhYmxlc1xyXG4gICk6IEFkZEl0ZW1Ub0Jhc2tldC5WYXJpYWJsZXMge1xyXG4gICAgY29uc3Qgc2VydmljZVRvQ2hlY2s6IFNlcnZpY2UgPSB0aGlzLnVzZXJTZXJ2aWNlLmZpbmRTZXJ2aWNlKGl0ZW0uc2VydmljZSk7XHJcbiAgICBpZiAoIXNlcnZpY2VUb0NoZWNrKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuYWJsZSB0byBmaW5kIHNlcnZpY2UgZm9yIGJhc2tldCBpdGVtIDogJyArIGl0ZW0uc2VydmljZSk7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGNoZWNrIHRoZSBpdGVtLmRldGFpbCBvYmplY3QgYWdhaW5zdCB0aGUgcmVsZXZhbnQgc2VydmljZSBkZXRhaWxTY2hlbWEgdXNpbmcgQWp2XHJcbiAgICBjb25zdCBhanYgPSBuZXcgQWp2KCk7XHJcblxyXG4gICAgLy8gQ3VzdG9tIEphdmFzY3JpcHQgSVNPIERhdGUgVGltZSBmb3JtYXRcclxuICAgIGFqdi5hZGRGb3JtYXQoJ2pzLWRhdGUtdGltZScsIChkYXRlVGltZVN0cmluZzogYW55KSA9PiB7XHJcbiAgICAgIGlmIChcclxuICAgICAgICB0eXBlb2YgZGF0ZVRpbWVTdHJpbmcgPT09ICdvYmplY3QnICYmXHJcbiAgICAgICAgZGF0ZVRpbWVTdHJpbmcuaGFzT3duUHJvcGVydHkoJ3RvSVNPU3RyaW5nJylcclxuICAgICAgKSB7XHJcbiAgICAgICAgZGF0ZVRpbWVTdHJpbmcgPSBkYXRlVGltZVN0cmluZy50b0lTT1N0cmluZygpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gIWlzTmFOKERhdGUucGFyc2UoZGF0ZVRpbWVTdHJpbmcpKTsgLy8gYW55IHRlc3QgdGhhdCByZXR1cm5zIHRydWUvZmFsc2VcclxuICAgIH0pO1xyXG5cclxuICAgIGFqdi5hZGRGb3JtYXQoJ3JhaWxTZWF0aW5nJywgKHJhaWxzZWF0aW5nOiBhbnkpID0+IHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9KTtcclxuXHJcbiAgICBhanYuYWRkRm9ybWF0KCdwYXNzcG9ydCcsIChwYXNzcG9ydDogYW55KSA9PiB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSk7XHJcblxyXG4gICAgYWp2LmFkZEZvcm1hdCgnc3BlY2lhbFJlcXVlc3QnLCAocGFzc3BvcnQ6IGFueSkgPT4ge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IHZhbGlkYXRlRGV0YWlsU2NoZW1hID0gYWp2LmNvbXBpbGUoc2VydmljZVRvQ2hlY2suZGV0YWlsU2NoZW1hKTtcclxuICAgIGNvbnN0IHZhbGlkYXRlU2VhcmNoU2NoZW1hID0gYWp2LmNvbXBpbGUoc2VydmljZVRvQ2hlY2suc2VhcmNoUXVlcnlTY2hlbWEpO1xyXG5cclxuICAgIC8vIGlmIHRoZXJlIGFyZSBhbnkgbW9tZW50IGRhdGUgb2JqZWN0cyBpbiB0aGUgc2VhcmNoUXVlcnkgb2JqZWN0IGNvbnZlcnQgdGhlc2UgdG8gZGF0ZS10aW1lIHN0cmluZ3NcclxuICAgIGl0ZW0uc2VhcmNoUXVlcnkgPSB0aGlzLmhlbHBlcnMuc2FuaXRpemVNb21lbnREYXRlcyhpdGVtLnNlYXJjaFF1ZXJ5KTtcclxuICAgIGl0ZW0uZGV0YWlsID0gdGhpcy5oZWxwZXJzLnJlbW92ZU51bGxzKGl0ZW0uZGV0YWlsKTtcclxuXHJcbiAgICBpZiAoIXZhbGlkYXRlU2VhcmNoU2NoZW1hKGl0ZW0uc2VhcmNoUXVlcnkpKSB7XHJcbiAgICAgIGNvbnN0IGVycm9yID0gYEl0ZW0gc2VhcmNoUXVlcnkgaXMgbm90IHZhbGlkIGZvciAke3NlcnZpY2VUb0NoZWNrLm5hbWV9IHNlYXJjaCBzY2hlbWEuYDtcclxuICAgICAgY29uc29sZS53YXJuKCdzZWFyY2hTY2hlbWEnLCBzZXJ2aWNlVG9DaGVjay5zZWFyY2hRdWVyeVNjaGVtYSk7XHJcbiAgICAgIGNvbnNvbGUud2FybignaXRlbS5zZWFyY2hRdWVyeScsIGl0ZW0uc2VhcmNoUXVlcnkpO1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgJ1NlYXJjaCBRdWVyeSBWYWxpZGF0aW9uIGVycm9ycycsXHJcbiAgICAgICAgdmFsaWRhdGVTZWFyY2hTY2hlbWEuZXJyb3JzXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oTW9kYWxUeXBlcy5Nb2RhbEVycm9yQ29tcG9uZW50LCB7fSwgeyBlcnJvciB9KTtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF2YWxpZGF0ZURldGFpbFNjaGVtYShpdGVtLmRldGFpbCkpIHtcclxuICAgICAgY29uc3QgZXJyb3IgPSBgSXRlbSBkZXRhaWwgaXMgbm90IHZhbGlkIGZvciAke3NlcnZpY2VUb0NoZWNrLm5hbWV9IGRldGFpbCBzY2hlbWEuYDtcclxuICAgICAgY29uc29sZS53YXJuKCdkZXRhaWxTY2hlbWEnLCBzZXJ2aWNlVG9DaGVjay5kZXRhaWxTY2hlbWEpO1xyXG4gICAgICBjb25zb2xlLndhcm4oJ2l0ZW0uZGV0YWlsJywgaXRlbS5kZXRhaWwpO1xyXG4gICAgICBjb25zb2xlLndhcm4oJ0RldGFpbCBlcnJvcnMnLCB2YWxpZGF0ZURldGFpbFNjaGVtYS5lcnJvcnMpO1xyXG4gICAgICB0aGlzLm1vZGFsU2VydmljZS5vcGVuKE1vZGFsVHlwZXMuTW9kYWxFcnJvckNvbXBvbmVudCwge30sIHsgZXJyb3IgfSk7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGl0ZW07XHJcbiAgfVxyXG5cclxuICBnZXROdW1iZXJJdGVtc0ZvckJhc2tldChiYXNrZXQ6IEludGVybmFsQmFza2V0PEdVX1E+ID0gbnVsbCk6IG51bWJlciB7XHJcbiAgICBiYXNrZXQgPSBiYXNrZXQgfHwgdGhpcy5maW5kQmFza2V0KHRoaXMuY3VycmVudEJhc2tldElEKTtcclxuICAgIHJldHVybiBiYXNrZXQ/LnN1YmplY3QudmFsdWUuYmFza2V0SXRlbXMubGVuZ3RoIHx8IDA7XHJcbiAgfVxyXG5cclxuICByZW1vdmVCYXNrZXQoYmFza2V0aWQ6IHN0cmluZyk6IE9ic2VydmFibGU8dW5rbm93bj4ge1xyXG4gICAgaWYgKGJhc2tldGlkKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmRlbGV0ZUJhc2tldFVwZGF0ZXIudXBkYXRlT25lKHsgaWQ6IGJhc2tldGlkIH0pLnBpcGUoXHJcbiAgICAgICAgdGFrZSgxKSxcclxuICAgICAgICBzd2l0Y2hNYXAoKGRhdGE6IGFueSk6IGFueSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmZpbmRCYXNrZXQoYmFza2V0aWQpPy5kZXN0cnVjdG9yKCk7XHJcbiAgICAgICAgICB0aGlzLmN1cnJlbnRCYXNrZXRzID0gdGhpcy5jdXJyZW50QmFza2V0cy5maWx0ZXIoXHJcbiAgICAgICAgICAgIChpbnRCYSkgPT4gaW50QmEuaWQgIT09IGJhc2tldGlkXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgdGhpcy5iYXNrZXRzLm5leHQodGhpcy5jdXJyZW50QmFza2V0cyk7XHJcbiAgICAgICAgICBpZiAoYmFza2V0aWQgPT09IHRoaXMuY3VycmVudEJhc2tldElEKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEJhc2tldElEID0gdGhpcy5jdXJyZW50QmFza2V0c1swXT8uaWQgfHwgbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5iYXNrZXRDaGFuZ2VFbWl0dGVyLm5leHQodGhpcy5jdXJyZW50QmFza2V0SUQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIG9mKGRhdGEpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb250aW51ZVNlYXJjaEFuZEJvb2soXHJcbiAgICBiYXNrZXRJdGVtczogYW55W10sXHJcbiAgICBpdGluaWFyeVVybDogc3RyaW5nW10sXHJcbiAgICBzZWFyY2hTZXJ2aWNlOiBFbnRlcnByaXNlU2VhcmNoU2VydmljZUludGVyZmFjZVxyXG4gICk6IHN0cmluZ1tdIHtcclxuICAgIGNvbnN0IGxhdGVzdEJhc2tldEl0ZW1zID0gdGhpcy5nZXRMYXRlc3RCYXNrZXRJdGVtRm9yVHlwZXMoYmFza2V0SXRlbXMpO1xyXG4gICAgY29uc3QgbmV4dFNlYXJjaDogU2VhcmNoT2JqZWN0ID1cclxuICAgICAgc2VhcmNoU2VydmljZS5nZXRIaWdoZXN0U2VhcmNoUHJpb3JpdHlPYmplY3QobGF0ZXN0QmFza2V0SXRlbXMpO1xyXG4gICAgaWYgKG5leHRTZWFyY2gpIHtcclxuICAgICAgKHNlYXJjaFNlcnZpY2Uuc2VhcmNoZXMgYXMgYW55KVtcclxuICAgICAgICBuZXh0U2VhcmNoLnR5cGVcclxuICAgICAgXS51cGRhdGVGcm9tUHJldmlvdXNTZWFyY2hlcyhsYXRlc3RCYXNrZXRJdGVtcyk7XHJcbiAgICAgIHJldHVybiBbbmV4dFNlYXJjaC5zZWFyY2hVcmxdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGl0aW5pYXJ5VXJsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkVHJhdmVsbGVycyhcclxuICAgIGJhc2tldGlkOiBzdHJpbmcsXHJcbiAgICBiYXNrZXRJdGVtOiBCYXNrZXRJdGVtLFxyXG4gICAgdHJhdmVsbGVyczogVHJhdmVsbGVyW10sXHJcbiAgICBpbmRleDogbnVtYmVyID0gMFxyXG4gICk6IHZvaWQge1xyXG4gICAgY29uc3QgYmFza2V0ID0gdGhpcy5maW5kQmFza2V0KGJhc2tldGlkKTtcclxuICAgIGlmIChpbmRleCA8IHRyYXZlbGxlcnMubGVuZ3RoKSB7XHJcbiAgICAgIGNvbnN0IHRyYXZlbGxlciA9IHRyYXZlbGxlcnNbaW5kZXhdO1xyXG4gICAgICBjb25zdCBwYXNzZW5nZXJUeXBlOiBQYXNzZW5nZXJUeXBlID0gdHJhdmVsbGVyLmlzQ2hpbGRcclxuICAgICAgICA/IFBhc3NlbmdlclR5cGUuQ2hpbGRcclxuICAgICAgICA6IHRyYXZlbGxlci5pc0luZmFudFxyXG4gICAgICAgID8gUGFzc2VuZ2VyVHlwZS5JbmZhbnRcclxuICAgICAgICA6IFBhc3NlbmdlclR5cGUuQWR1bHQ7XHJcblxyXG4gICAgICB0aGlzLmFkZFVzZXJUb0Jhc2tldEl0ZW1cclxuICAgICAgICAudXBkYXRlT25lKHtcclxuICAgICAgICAgIGNvbnZlcnRDdXJyZW5jeVRvOiAnR0JQJyxcclxuICAgICAgICAgIGJhc2tldEl0ZW06IGJhc2tldEl0ZW0uaWQsXHJcbiAgICAgICAgICB1c2VyczogW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgaWQ6IHRyYXZlbGxlci5pZCxcclxuICAgICAgICAgICAgICBwYXNzZW5nZXJUeXBlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIF0sXHJcbiAgICAgICAgICB3aXRoU3VwcGxlbWVudGFsOiBmYWxzZVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLnN1YnNjcmliZShcclxuICAgICAgICAgICgpID0+IHt9LFxyXG4gICAgICAgICAgKCkgPT4ge30sXHJcbiAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkVHJhdmVsbGVycyhiYXNrZXQuaWQsIGJhc2tldEl0ZW0sIHRyYXZlbGxlcnMsIGluZGV4ICsgMSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYmFza2V0RmV0Y2hlclxyXG4gICAgICAgIC5mZXRjaE9uZSh7IGNvbnZlcnRDdXJyZW5jeVRvOiAnR0JQJywgaWQ6IGJhc2tldC5pZCB9KVxyXG4gICAgICAgIC5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAoYmFza2V0MTogR2V0VXNlckJhc2tldFJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICBiYXNrZXQuc3ViamVjdC5uZXh0KHsgLi4uYmFza2V0LnN1YmplY3QudmFsdWUsIC4uLmJhc2tldDEgfSk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgKF8pID0+IHt9LFxyXG4gICAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgICBiYXNrZXQubmV4dChiYXNrZXQuc3ViamVjdC52YWx1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldExlYWRQYXNzZW5nZXIoXHJcbiAgICBiYXNrZXRpZDogc3RyaW5nLFxyXG4gICAgYmFza2V0SXRlbTogQmFza2V0SXRlbSxcclxuICAgIHRyYXZlbGxlcnM6IFRyYXZlbGxlcixcclxuICAgIGluZGV4OiBudW1iZXIgPSAwXHJcbiAgKTogdm9pZCB7XHJcbiAgICBjb25zdCBiYXNrZXQgPSB0aGlzLmZpbmRCYXNrZXQoYmFza2V0aWQpO1xyXG4gICAgaWYgKGluZGV4IDwgMSkge1xyXG4gICAgICB0aGlzLlNldEJhc2tldEl0ZW1MZWFkUGFzc2VuZ2VyLnVwZGF0ZU9uZSh7XHJcbiAgICAgICAgY29udmVydEN1cnJlbmN5VG86ICdHQlAnLFxyXG4gICAgICAgIGlkOiBiYXNrZXRJdGVtLmlkLFxyXG4gICAgICAgIHVzZXI6IHRyYXZlbGxlcnMuaWQsXHJcbiAgICAgICAgd2l0aFN1cHBsZW1lbnRhbDogZmFsc2VcclxuICAgICAgfSkuc3Vic2NyaWJlKFxyXG4gICAgICAgICgpID0+IHt9LFxyXG4gICAgICAgICgpID0+IHt9LFxyXG4gICAgICAgICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuc2V0TGVhZFBhc3NlbmdlcihiYXNrZXQuaWQsIGJhc2tldEl0ZW0sIHRyYXZlbGxlcnMsIGluZGV4ICsgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5iYXNrZXRGZXRjaGVyXHJcbiAgICAgICAgLmZldGNoT25lKHsgY29udmVydEN1cnJlbmN5VG86ICdHQlAnLCBpZDogYmFza2V0LmlkIH0pXHJcbiAgICAgICAgLnN1YnNjcmliZShcclxuICAgICAgICAgIChiYXNrZXQxOiBHZXRVc2VyQmFza2V0UmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgIGJhc2tldC5zdWJqZWN0Lm5leHQoeyAuLi5iYXNrZXQuc3ViamVjdC52YWx1ZSwgLi4uYmFza2V0MSB9KTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICAoXykgPT4ge30sXHJcbiAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgIGJhc2tldC5uZXh0KGJhc2tldC5zdWJqZWN0LnZhbHVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdXBkYXRlQmFza2V0KFxyXG4gICAgYmFza2V0aWQ6IHN0cmluZyxcclxuICAgIG9iczogT2JzZXJ2YWJsZTxCYXNrZXREZXRhaWxzPlxyXG4gICk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgb2JzLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKFxyXG4gICAgICAgIChiYXNrZXQ6IEJhc2tldERldGFpbHMpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGludEJhc2tldCA9IHRoaXMuZmluZEJhc2tldChiYXNrZXRpZCk7XHJcbiAgICAgICAgICBpbnRCYXNrZXQubmV4dChiYXNrZXQpO1xyXG4gICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgKGVycm9yOiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgY29uc3QgaW50QmFza2V0ID0gdGhpcy5maW5kQmFza2V0KGJhc2tldGlkKTtcclxuICAgICAgICAgIGludEJhc2tldC5uZXh0KGludEJhc2tldC5zdWJqZWN0LnZhbHVlKTtcclxuICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAoKSA9PiB7fVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICByZXZhbGlkYXRlKGJhc2tldGlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMudXBkYXRlQmFza2V0KFxyXG4gICAgICBiYXNrZXRpZCxcclxuICAgICAgdGhpcy5yZXZhbGlkYXRlQmFza2V0VXBkYXRlci51cGRhdGVPbmUoe1xyXG4gICAgICAgIGNvbnZlcnRDdXJyZW5jeVRvOiAnR0JQJyxcclxuICAgICAgICBpZDogYmFza2V0aWRcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBzZXRCYXNrZXRJdGVtTWlHcm91cChcclxuICAgIGJhc2tldGlkOiBzdHJpbmcsXHJcbiAgICBiYXNrZXRJdGVtaWQ6IHN0cmluZyxcclxuICAgIGdyb3VwOiBzdHJpbmdcclxuICApOiB2b2lkIHtcclxuICAgIHRoaXMudXBkYXRlQmFza2V0KFxyXG4gICAgICBiYXNrZXRpZCxcclxuICAgICAgdGhpcy5zZXRCYXNrZXRJdGVtTWlHcm91cFVwZGF0ZXIudXBkYXRlT25lKHtcclxuICAgICAgICBjb252ZXJ0Q3VycmVuY3lUbzogJ0dCUCcsXHJcbiAgICAgICAgYmFza2V0SXRlbTogYmFza2V0SXRlbWlkLFxyXG4gICAgICAgIGdyb3VwXHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgYWNjZXB0TmV3UHJpY2UoYmFza2V0aWQ6IHN0cmluZywgaXRlbTogQmFza2V0SXRlbSk6IHZvaWQge1xyXG4gICAgdGhpcy51cGRhdGVCYXNrZXQoXHJcbiAgICAgIGJhc2tldGlkLFxyXG4gICAgICB0aGlzLmFjY2VwdE5ld1ByaWNlVXBkYXRlci51cGRhdGVPbmUoe1xyXG4gICAgICAgIGNvbnZlcnRDdXJyZW5jeVRvOiAnR0JQJyxcclxuICAgICAgICBpZDogaXRlbS5pZFxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHZhbGlkYXRlRnJlZVZhbGVNaShcclxuICAgIG1pSXRlbTogTWFuYWdlbWVudEluZm8sXHJcbiAgICBmcmVlVmFsdWU6IHN0cmluZ1xyXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGhpcy52YWxpZGF0ZU1pRnJlZVZhbHVlXHJcbiAgICAgICAgLnRlc3QoeyBtaTogbWlJdGVtLmlkLCBmcmVlVmFsdWUgfSlcclxuICAgICAgICAuc3Vic2NyaWJlKHJlc29sdmUsIHJlamVjdCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNldE1pRnJlZVZhbHVlKFxyXG4gICAgYmFza2V0aWQ6IHN0cmluZyxcclxuICAgIG1pSXRlbTogTWFuYWdlbWVudEluZm8sXHJcbiAgICBmcmVlVmFsdWU6IHN0cmluZyxcclxuICAgIHVzZXJJZDogc3RyaW5nID0gbnVsbFxyXG4gICkge1xyXG4gICAgY29uc3QgaW50QmFza2V0ID0gdGhpcy5maW5kQmFza2V0KGJhc2tldGlkKTtcclxuICAgIGNvbnN0IGFyZ3M6IFNldEJhc2tldEl0ZW1NaVZhbHVlLlZhcmlhYmxlcyA9IHtcclxuICAgICAgY29udmVydEN1cnJlbmN5VG86ICdHQlAnLFxyXG4gICAgICBtaTogbWlJdGVtLmlkLFxyXG4gICAgICBtaUZyZWVWYWx1ZTogZnJlZVZhbHVlXHJcbiAgICB9O1xyXG4gICAgaWYgKCEhdXNlcklkKSB7XHJcbiAgICAgIGFyZ3MudXNlciA9IHVzZXJJZDtcclxuICAgIH1cclxuICAgIHRoaXMuc2V0QmFza2V0SXRlbU1pVmFsdWVVcGRhdGVyXHJcbiAgICAgIC51cGRhdGVPbmUoYXJncylcclxuICAgICAgLnBpcGUodGFrZSgxKSlcclxuICAgICAgLnN1YnNjcmliZShcclxuICAgICAgICAoYmFza2V0OiBCYXNrZXREZXRhaWxzKSA9PiB7XHJcbiAgICAgICAgICBpbnRCYXNrZXQubmV4dChiYXNrZXQpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgKF8pID0+IHt9LFxyXG4gICAgICAgICgpID0+IHtcclxuICAgICAgICAgIGludEJhc2tldC5uZXh0KGludEJhc2tldC5zdWJqZWN0LnZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICBzZXRNaVNlbGVjdGVkVmFsdWUoXHJcbiAgICBiYXNrZXRpZDogc3RyaW5nLFxyXG4gICAgbWlJdGVtOiBNYW5hZ2VtZW50SW5mbyxcclxuICAgIHNlbGVjdGVkVmFsdWU6IHN0cmluZyxcclxuICAgIHVzZXJJZDogc3RyaW5nID0gbnVsbFxyXG4gICkge1xyXG4gICAgY29uc3QgYXJnczogU2V0QmFza2V0SXRlbU1pVmFsdWUuVmFyaWFibGVzID0ge1xyXG4gICAgICBjb252ZXJ0Q3VycmVuY3lUbzogJ0dCUCcsXHJcbiAgICAgIG1pOiBtaUl0ZW0uaWQsXHJcbiAgICAgIG1pVmFsdWU6IHNlbGVjdGVkVmFsdWVcclxuICAgIH07XHJcbiAgICBpZiAoISF1c2VySWQpIHtcclxuICAgICAgYXJncy51c2VyID0gdXNlcklkO1xyXG4gICAgfVxyXG4gICAgdGhpcy51cGRhdGVCYXNrZXQoXHJcbiAgICAgIGJhc2tldGlkLFxyXG4gICAgICB0aGlzLnNldEJhc2tldEl0ZW1NaVZhbHVlVXBkYXRlci51cGRhdGVPbmUoYXJncylcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBnZXRNaUF1dG9TdWdlc3Rpb25zKFxyXG4gICAgbWlJZDogc3RyaW5nLFxyXG4gICAgcGFydGlhbExhYmVsOiBzdHJpbmcsXHJcbiAgICBpc0xvYWRpbmc6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPlxyXG4gICk6IE9ic2VydmFibGU8R2V0TWlBdXRvU3VnZXN0aW9uQXJyYXk+IHtcclxuICAgIGlzTG9hZGluZz8ubmV4dCh0cnVlKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5nZXRNaUF1dG9TdWdlc3Rpb25GZXRjaGVyXHJcbiAgICAgIC5mZXRjaExpc3QoeyBtaTogbWlJZCwgcGFydGlhbExhYmVsIH0pXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRhcCgoXykgPT4ge1xyXG4gICAgICAgICAgaXNMb2FkaW5nPy5uZXh0KGZhbHNlKTtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgc2F2ZU1pRGF0YShiYXNrZXRJZDogc3RyaW5nLCBibWlBcnJheTogQmFza2V0SXRlbU1hbmFnZW1lbnRJbmZvW10pIHtcclxuICAgIGJtaUFycmF5LmZvckVhY2goKGJtaTogQmFza2V0SXRlbU1hbmFnZW1lbnRJbmZvKSA9PiB7XHJcbiAgICAgIGJtaS5taVBlckl0ZW0uZm9yRWFjaCgoaXRlbTogTWFuYWdlbWVudEluZm9BbmRJc1ZhbGlkKSA9PiB7XHJcbiAgICAgICAgaXRlbS5zYXZlKGJhc2tldElkLCBudWxsKTtcclxuICAgICAgfSk7XHJcbiAgICAgIGJtaS51c2Vycy5mb3JFYWNoKCh1c2VyOiBzdHJpbmcpID0+IHtcclxuICAgICAgICBibWkubWlQZXJVc2VyW3VzZXJdLm1hbmFnZW1lbnRJbmZvLmZvckVhY2goXHJcbiAgICAgICAgICAoaXRlbTogTWFuYWdlbWVudEluZm9BbmRJc1ZhbGlkKSA9PiB7XHJcbiAgICAgICAgICAgIGl0ZW0uc2F2ZShiYXNrZXRJZCwgdXNlcik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNlbmRCYXNrZXRGb3JBcHByb3ZhbChiYXNrZXRpZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gdGhpcy51cGRhdGVCYXNrZXQoXHJcbiAgICAgIGJhc2tldGlkLFxyXG4gICAgICB0aGlzLnNlbmRCYXNrZXRGb3JBcHByb3ZhbFVwZGF0ZXJcclxuICAgICAgICAudXBkYXRlT25lKHsgY29udmVydEN1cnJlbmN5VG86ICdHQlAnLCBiYXNrZXQ6IGJhc2tldGlkIH0pXHJcbiAgICAgICAgLnBpcGUodGFrZSgxKSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBzZXRCYXNrZXRJdGVtUGF5bWVudE9wdGlvbihcclxuICAgIGJhc2tldDogQmFza2V0RGV0YWlscyxcclxuICAgIGJhc2tldEl0ZW06IEJhc2tldEl0ZW0sXHJcbiAgICBwYXltZW50TWV0aG9kOiBzdHJpbmdcclxuICApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiB0aGlzLnVwZGF0ZUJhc2tldChcclxuICAgICAgYmFza2V0LmlkLFxyXG4gICAgICB0aGlzLnNldFBheW1lbnRNZXRob2RVcGRhdGVyLnVwZGF0ZU9uZSh7XHJcbiAgICAgICAgY29udmVydEN1cnJlbmN5VG86ICdHQlAnLFxyXG4gICAgICAgIGJhc2tldEl0ZW06IGJhc2tldEl0ZW0uaWQsXHJcbiAgICAgICAgcGF5bWVudE1ldGhvZFxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGJvb2tCYXNrZXQoXHJcbiAgICBiYXNrZXRpZDogc3RyaW5nLFxyXG4gICAgc3VwcGxlbWVudGFyeUluZm86IFN1cHBsZW1lbnRhcnlCb29raW5nSW5mb1tdXHJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gdGhpcy51cGRhdGVCYXNrZXQoXHJcbiAgICAgIGJhc2tldGlkLFxyXG4gICAgICB0aGlzLmJvb2tCYXNrZXRVcGRhdGVyLnVwZGF0ZU9uZSh7XHJcbiAgICAgICAgY29udmVydEN1cnJlbmN5VG86ICdHQlAnLFxyXG4gICAgICAgIGlkOiBiYXNrZXRpZCxcclxuICAgICAgICBzdXBwbGVtZW50YXJ5SW5mb1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIG1vdmVCYXNrZXRJdGVtKFxyXG4gICAgb3JpZ2luYWxCYXNrZXRJZDogc3RyaW5nLFxyXG4gICAgYmFza2V0SXRlbTogQmFza2V0SXRlbSxcclxuICAgIGJhc2tldElkVG9Nb3ZlVG86IHN0cmluZ1xyXG4gICk6IHZvaWQge1xyXG4gICAgdGhpcy5tb3ZlSXRlbVRvQURpZmZlcmVudEJhc2tldFxyXG4gICAgICAudXBkYXRlT25lKHtcclxuICAgICAgICBjb252ZXJ0Q3VycmVuY3lUbzogJ0dCUCcsXHJcbiAgICAgICAgYmFza2V0SXRlbTogYmFza2V0SXRlbS5pZCxcclxuICAgICAgICBuZXdCYXNrZXQ6IGJhc2tldElkVG9Nb3ZlVG9cclxuICAgICAgfSlcclxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5sb2FkQmFza2V0KG9yaWdpbmFsQmFza2V0SWQpO1xyXG4gICAgICAgIHRoaXMubG9hZEJhc2tldChiYXNrZXRJZFRvTW92ZVRvKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVCYXNrZXROb3RlcyhiYXNrZXRJZDogc3RyaW5nLCBub3Rlczogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLnVwZGF0ZUJhc2tldChcclxuICAgICAgYmFza2V0SWQsXHJcbiAgICAgIHRoaXMudXBkYXRlQmFza2V0Tm90ZXNVcGRhdGVyLnVwZGF0ZU9uZSh7XHJcbiAgICAgICAgY29udmVydEN1cnJlbmN5VG86ICdHQlAnLFxyXG4gICAgICAgIGlkOiBiYXNrZXRJZCxcclxuICAgICAgICBub3Rlc1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZUJhc2tldFRpdGxlKGJhc2tldElkOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMudXBkYXRlQmFza2V0KFxyXG4gICAgICBiYXNrZXRJZCxcclxuICAgICAgdGhpcy51cGRhdGVCYXNrZXRUaXRsZVVwZGF0ZXIudXBkYXRlT25lKHtcclxuICAgICAgICBjb252ZXJ0Q3VycmVuY3lUbzogJ0dCUCcsXHJcbiAgICAgICAgaWQ6IGJhc2tldElkLFxyXG4gICAgICAgIG5ld1RpdGxlOiB0aXRsZVxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcbiAgZ2V0QmFza2V0KHF1ZXJ5OiB7XHJcbiAgICBjb252ZXJ0Q3VycmVuY3lUbzogJ0dCUCc7XHJcbiAgICBpZDogc3RyaW5nO1xyXG4gICAgd2l0aFN1cHBsZW1lbnRhbDogdHJ1ZTtcclxuICB9KTogT2JzZXJ2YWJsZTxHZXRVc2VyQmFza2V0UmVzdWx0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5iYXNrZXRGZXRjaGVyLmZldGNoT25lKHF1ZXJ5KTtcclxuICB9XHJcblxyXG4gIGF0TGVhc3RPbmVTZWFyY2hDaG9zZW4oKTogYm9vbGVhbiB7XHJcbiAgICAvLyBpZiB3ZSBoYXZlIGFueSBpdGVtIG9uIGFueSBiYXNrZXQgd2Ugc2hvdyBiYXNrZXRzIGluIHNlYXJjaCBzY3JlZW5cclxuICAgIHJldHVybiAhIXRoaXMuY3VycmVudEJhc2tldHMuZmlsdGVyKFxyXG4gICAgICAoYmFza2V0KSA9PiBiYXNrZXQuc3ViamVjdC52YWx1ZS5iYXNrZXRJdGVtcy5sZW5ndGhcclxuICAgICkubGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEJhc2tldFN0YXRzKGluZGV4OiBudW1iZXIpOiBCZWhhdmlvclN1YmplY3Q8QmFza2V0UHJpY2VzPiB7XHJcbiAgICBjb25zdCBiYXNrZXRQcmljZXNPYmogPVxyXG4gICAgICB0aGlzLmJhc2tldHMudmFsdWVbaW5kZXhdPy5zdWJqZWN0Py52YWx1ZT8ucHJpY2VzIHx8IHt9O1xyXG4gICAgY29uc3QgYmFza2V0UHJpY2VzS2V5ID0gT2JqZWN0LmtleXMoYmFza2V0UHJpY2VzT2JqKVswXTtcclxuICAgIGlmIChiYXNrZXRQcmljZXNLZXkpIHtcclxuICAgICAgdGhpcy5iYXNrZXRQcmljZXMudmFsdWUuY3VycmVuY3kgPSBiYXNrZXRQcmljZXNLZXk7XHJcbiAgICAgIHRoaXMuYmFza2V0UHJpY2VzLnZhbHVlLnRvdGFsID1cclxuICAgICAgICB0aGlzLmJhc2tldHMudmFsdWVbaW5kZXhdLnN1YmplY3QudmFsdWUucHJpY2VzW2Jhc2tldFByaWNlc0tleV07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmJhc2tldFByaWNlcy52YWx1ZS50b3RhbCA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5iYXNrZXRQcmljZXMudmFsdWUubGlzdC5mb3JFYWNoKChrZXlzKSA9PiB7XHJcbiAgICAgIGtleXMucHJpY2UgPSB0aGlzLmJhc2tldHMudmFsdWVbaW5kZXhdPy5zdWJqZWN0Py52YWx1ZT8uYmFza2V0SXRlbXNcclxuICAgICAgICAuZmlsdGVyKChpdGVtKSA9PiBpdGVtLnNlcnZpY2UudHlwZSA9PT0ga2V5cy50eXBlKVxyXG4gICAgICAgIC5yZWR1Y2UoKHN1bSwgY3VycmVudCkgPT4gc3VtICsgY3VycmVudC5wcmljZSwgMCk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB0aGlzLmJhc2tldFByaWNlcztcclxuICB9XHJcblxyXG4gIGNhbkNhbmNlbChiYXNrZXRJdGVtOiBCYXNrZXRJdGVtKTogT2JzZXJ2YWJsZTxCZWZvcmVDYW5jZWxsYXRpb25JbmZvPiB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRDYW5jZWxsYXRpb25JbmZvRmV0Y2hlci5mZXRjaE9uZSh7XHJcbiAgICAgIGJhc2tldEl0ZW06IGJhc2tldEl0ZW0uaWRcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG5cclxuaW50ZXJmYWNlIERldGFpbFNjaGVtYVByb3BlcnRpZXMge1xyXG4gIHR5cGU/OiAnc3RyaW5nJyB8ICdudW1iZXInIHwgJ2ludGVnZXInIHwgJ2FycmF5JztcclxuICAkcmVmPzogc3RyaW5nO1xyXG4gIGZvcm1hdD86IHN0cmluZztcclxufVxyXG5pbnRlcmZhY2UgRGV0YWlsU2NoZW1hIHtcclxuICAkZGVmcz86IHsgW2tleTogc3RyaW5nXTogRGV0YWlsU2NoZW1hIH07XHJcbiAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGJvb2xlYW47XHJcbiAgcHJvcGVydGllczogeyBba2V5OiBzdHJpbmddOiBEZXRhaWxTY2hlbWFQcm9wZXJ0aWVzIH07XHJcbiAgcmVxdWlyZWQ6IHN0cmluZ1tdO1xyXG59XHJcbiJdfQ==
852
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50ZXJwcmlzZS1iYXNrZXQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29idHNlcnZpY2VzL2Jhc2Uvc3JjL2xpYi92ZW5kb3Ivc2VydmljZXMvZW50ZXJwcmlzZS1iYXNrZXQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sR0FBRyxNQUFNLEtBQUssQ0FBQztBQUN0QixPQUFPLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBd0IsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwRixPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBTyxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzRCxPQUFPLEVBSUwsWUFBWSxFQUdaLGlCQUFpQixFQUdqQixhQUFhLEVBRWIsV0FBVyxFQUdaLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUNMLDRCQUE0QixFQUs1QixhQUFhLEVBRWQsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDekQsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDMUYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFtRWpGLE9BQU8sRUFBYSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQXdDeEUsT0FBTyxFQUNMLHlCQUF5QixFQUUxQixNQUFNLDJCQUEyQixDQUFDO0FBRW5DLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQztBQXVEekIsTUFBTSxPQUFPLGNBQWM7SUFlekIsWUFDRSxNQUF3QixFQUNoQixPQUEyQixFQUMzQixhQUErQyxFQUMvQyxjQUFxQyxFQUNyQyxlQUEwQztRQUgxQyxZQUFPLEdBQVAsT0FBTyxDQUFv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Q0wsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQy9ELElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLFlBQVksQ0FBQyxNQUFNLEVBQUU7Z0JBQ3ZELEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDbEI7WUFDRCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNQLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUN6QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XHJcbmltcG9ydCBBanYgZnJvbSAnYWp2JztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBmb3JrSm9pbiwgT2JzZXJ2YWJsZSwgT2JzZXJ2ZXIsIG9mLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHN3aXRjaE1hcCwgdGFrZSwgdGFwLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5pbXBvcnQge1xyXG4gIEFkZEl0ZW1Ub0Jhc2tldCxcclxuICBCYXNrZXQsXHJcbiAgQmFza2V0SXRlbSxcclxuICBCYXNrZXRTdGF0dXMsXHJcbiAgQmVmb3JlQ2FuY2VsbGF0aW9uSW5mbyxcclxuICBDcmVhdGVCYXNrZXRNdXRhdGlvblZhcmlhYmxlcyxcclxuICBMZWFkUGFzc2VuZ2VyVHlwZSxcclxuICBNYW5hZ2VtZW50SW5mbyxcclxuICBNYW5hZ2VtZW50SW5mb1ZhbHVlLFxyXG4gIFBhc3NlbmdlclR5cGUsXHJcbiAgU2VydmljZSxcclxuICBTZXJ2aWNlVHlwZSxcclxuICBTZXRCYXNrZXRJdGVtTWlWYWx1ZSxcclxuICBTdXBwbGVtZW50YXJ5Qm9va2luZ0luZm9cclxufSBmcm9tICcuLi90eXBlcy9ncmFwaHFsLnR5cGVzJztcclxuaW1wb3J0IHtcclxuICBEaWZmZXJlbnRJbnZva2RlZFVzZXJSZWFzb25zLFxyXG4gIEdldE1pQXV0b1N1Z2VzdGlvbkFycmF5LFxyXG4gIEdldFVzZXJCYXNrZXRJdGVtUmVzdWx0LFxyXG4gIEdldFVzZXJCYXNrZXRSZXN1bHQsXHJcbiAgTWFuYWdlbWVudEluZm9WYWx1ZVJlc3VsdCxcclxuICBNZW51U2xpZGVFbnVtLFxyXG4gIFVzZXJCYXNrZXRSZXN1bHRcclxufSBmcm9tICcuLi90eXBlcy90eXBlcyc7XHJcbmltcG9ydCB7IE1hbmFnZW1lbnRJbmZvQW5kSXNWYWxpZCB9IGZyb20gJy4uL2NsYXNzZXMvbWFuYWdlbWVudC1pbmZvLWFuZC12YWxpZCc7XHJcbmltcG9ydCB7IE1vZGFsVHlwZXMgfSBmcm9tICcuLi9jbGFzc2VzL21vZGFsLXR5cGVzLmVudW0nO1xyXG5pbXBvcnQgeyBTdXBwbGVtZW50YXJ5Qm9va2luZ0luZm9JbXBsIH0gZnJvbSAnLi4vY2xhc3Nlcy9zdXBwbGVtZW50YXJ5LWJvb2tpbmctaW5mby1pbXBsJztcclxuaW1wb3J0IHsgQmFza2V0SW5mb01pRGV0YWlsc0ltcGwgfSBmcm9tICcuLi9jbGFzc2VzL2Jhc2tldC1pbmZvLW1pLWRldGFpbHMuaW1wbCc7XHJcbmltcG9ydCB7IEJhc2VIZWxwZXJSb3V0aW5lcyB9IGZyb20gJy4uL2NsYXNzZXMvaGVscGVycyc7XHJcbmltcG9ydCB7IEJhc2VNb2RhbE9wZW5lclNlcnZpY2UgfSBmcm9tICcuL21vZGFsLW9wZW5lci5zZXJ2aWNlJztcclxuaW1wb3J0IHtcclxuICBCYXNlR2V0VXNlckZldGNoZXIsXHJcbiAgU2VhcmNoR2V0VXNlckZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvdXNlci1mZXRjaGVyJztcclxuaW1wb3J0IHtcclxuICBBY2NlcHROZXdQcmljZUZldGNoZXJUeXBlLFxyXG4gIEJhc2VBY2NlcHROZXdQcmljZVVwZGF0ZXJcclxufSBmcm9tICcuLi91cGRhdGVycy9hY2NlcHQtbmV3LXByaWNlLnVwZGF0ZXInO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VHZXRCYXNrZXRGZXRjaGVyLFxyXG4gIEdldEJhc2tldEZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvYmFza2V0LWZldGNoZXInO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VHZXRVc2VyQmFza2V0c0ZldGNoZXIsXHJcbiAgR2V0VXNlckJhc2tldHNGZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL2ZldGNoZXJzL2dldC11c2Vycy1iYXNrZXRzLWZldGNoZXInO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VHZXRNaUF1dG9TdWdlc3Rpb25GZXRjaGVyLFxyXG4gIE1pQXV0b1N1Z2dlc3RGZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL2ZldGNoZXJzL2dldE1pQXV0b1N1Z2VzdGlvbnMuZmV0Y2hlcic7XHJcbmltcG9ydCB7XHJcbiAgQmFzZUdldFVzZXJEZWZhdWx0TUlWYWx1ZUZldGNoZXIsXHJcbiAgR2V0VXNlckRlZmF1bHRNSVZhbHVlVHlwZVxyXG59IGZyb20gJy4uL2ZldGNoZXJzL2dldC11c2VyLWRlZmF1bHQtbWktdmFsdWUuZmV0Y2hlcic7XHJcbmltcG9ydCB7XHJcbiAgQWRkSXRlbVRvQmFza2V0RmV0Y2hlclR5cGUsXHJcbiAgQmFzZUFkZEl0ZW1Ub0Jhc2tldFVwZGF0ZXJcclxufSBmcm9tICcuLi91cGRhdGVycy9hZGQtaXRlbS10by1iYXNrZXQudXBkYXRlcic7XHJcbmltcG9ydCB7XHJcbiAgQWRkVXNlckJhc2tldEZldGNoZXJUeXBlLFxyXG4gIEJhc2VBZGRVc2VyVG9CYXNrZXRJdGVtVXBkYXRlclxyXG59IGZyb20gJy4uL3VwZGF0ZXJzL2FkZFVzZXJUb0Jhc2tldEl0ZW0nO1xyXG5pbXBvcnQge1xyXG4gIFNldEJhc2tldEl0ZW1MZWFkUGFzc2VuZ2VyRmV0Y2hlclR5cGUsXHJcbiAgQmFzZVNldEJhc2tldEl0ZW1MZWFkUGFzc2VuZ2VyVXBkYXRlclxyXG59IGZyb20gJy4uL3VwZGF0ZXJzL3NldC1iYXNrZXQtaXRlbS1sZWFkLXBhc3Nlbmdlci51cGRhdGVyJztcclxuaW1wb3J0IHtcclxuICBCYXNlQm9va0Jhc2tldFVwZGF0ZXIsXHJcbiAgQm9va0Jhc2tldEZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vdXBkYXRlcnMvYm9vay1iYXNrZXQtdXBkYXRlcic7XHJcbmltcG9ydCB7XHJcbiAgQmFzZUNyZWF0ZUJhc2tldFVwZGF0ZXIsXHJcbiAgQ3JlYXRlQmFza2V0RmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi91cGRhdGVycy9jcmVhdGUtYmFza2V0LXVwZGF0ZXInO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VEZWxldGVCYXNrZXRVcGRhdGVyLFxyXG4gIERlbGV0ZUJhc2tldEZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vdXBkYXRlcnMvcmVtb3ZlLWJhc2tldC11cGRhdGVyJztcclxuaW1wb3J0IHtcclxuICBCYXNlUmVtb3ZlSXRlbUZyb21CYXNrZXRVcGRhdGVyLFxyXG4gIERlbGV0ZUJhc2tldEl0ZW1GZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL3VwZGF0ZXJzL3JlbW92ZS1pdGVtLWZyb20tYmFza2V0LnVwZGF0ZXInO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VSZXZhbGlkYXRlQmFza2V0VXBkYXRlcixcclxuICBSZXZhbGlkYXRlQmFza2V0RmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi91cGRhdGVycy9yZXZhbGlkYXRlLWJhc2tldC11cGRhdGVyJztcclxuaW1wb3J0IHtcclxuICBCYXNlU2VuZEJhc2tldEZvckFwcHJvdmFsVXBkYXRlcixcclxuICBTZW5kQmFza2V0QXBwcm92YWxGZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL3VwZGF0ZXJzL3NlbmQtYmFza2V0LWZvci1hcHByb3ZhbC51cGRhdGVyJztcclxuaW1wb3J0IHtcclxuICBCYXNlU2V0QmFza2V0SXRlbU1pR3JvdXBVcGRhdGVyLFxyXG4gIFNldEJhc2tldEl0TWlHcm91cEZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vdXBkYXRlcnMvc2V0LWJhc2tldC1pdGVtLW1pLWdyb3VwJztcclxuaW1wb3J0IHsgVHJhdmVsbGVyLCBUcmF2ZWxsZXJPYmplY3QgfSBmcm9tICcuLi9tb2RlbHMvdHJhdmVsbGVyLm9iamVjdCc7XHJcbmltcG9ydCB7IFNlYXJjaE9iamVjdCB9IGZyb20gJy4uL2ludGVyZmFjZXMvc2VhcmNoLW9iamVjdHMuaW50ZXJmYWNlJztcclxuaW1wb3J0IHtcclxuICBCYXNlU2V0QmFza2V0SXRlbU1pVmFsdWVVcGRhdGVyLFxyXG4gIFNldEJhc2tldEl0TWlGZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL3VwZGF0ZXJzL3NldC1iYXNrZXQtaXRlbS1taS12YWx1ZS11cGRhdGVyJztcclxuaW1wb3J0IHtcclxuICBCYXNlVmFsaWRhdGVNaUZyZWVWYWx1ZVRlc3RlcixcclxuICBWYWxpZGF0ZU1pRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi90ZXN0ZXJzL3ZhbGlkYXRlLW1pLWZyZWUtdmFsdWUudGVzdGVyJztcclxuaW1wb3J0IHsgRW50ZXJwcmlzZVNlYXJjaFNlcnZpY2VJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lzZWFyY2guc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgRnVsbFVzZXJEZXRhaWxzLFxyXG4gIFVzZXJTZXJ2aWNlSW50ZXJmYWNlXHJcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JdXNlci5zZXJ2aWNlJztcclxuaW1wb3J0IHtcclxuICBFbnRlcnByaXNlQmFza2V0U2VydmljZUludGVyZmFjZSxcclxuICBJbnRlcm5hbEJhc2tldEludGVyZmFjZVxyXG59IGZyb20gJy4uL2ludGVyZmFjZXMvSWVudGVycHJpc2UtYmFza2V0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTdXBwbGVtZW50YXJ5Qm9va2luZ0luZm9JbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lzdXBwbGVtZW50YXJ5LWJvb2tpbmctaW5mby1pbXBsJztcclxuaW1wb3J0IHtcclxuICBCYXNlbW92ZUJhc2tldEl0ZW1Ub0Jhc2tldCxcclxuICBNb3ZlSXRlbVRvQURpZmZlcmVudEJhc2tldFR5cGVcclxufSBmcm9tICcuLi91cGRhdGVycy9tb3ZlLWJhc2tldC1pdGVtLXRvLWJhc2tldCc7XHJcbmltcG9ydCB7XHJcbiAgQmFzZVVwZGF0ZUJhc2tldE5vdGVzVHlwZSxcclxuICBCYXNlVXBkYXRlQmFza2V0Tm90ZVVwZGF0ZXJcclxufSBmcm9tICcuLi91cGRhdGVycy91cGRhdGUtYmFza2V0LW5vdGVzLXVwZGF0ZXInO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VVcGRhdGVCYXNrZXRUaXRsZVR5cGUsXHJcbiAgQmFzZVVwZGF0ZUJhc2tldFRpdGxlVXBkYXRlclxyXG59IGZyb20gJy4uL3VwZGF0ZXJzL3VwZGF0ZS1iYXNrZXQtdGl0bGUtdXBkYXRlcic7XHJcbmltcG9ydCB7XHJcbiAgQmFzZVNldFBheW1lbnRPcHRpb25VcGRhdGVyLFxyXG4gIFNldEJhc2tldEl0ZW1QYXltZW50TWV0aG9kVHlwZVxyXG59IGZyb20gJy4uL3VwZGF0ZXJzL3NldC1iYXNrZXQtaXRlbS1wYXltZW5yLW9wdGlvbi51cGRhdGVyJztcclxuaW1wb3J0IHtcclxuICBCYXNlR2V0Q2FuY2VsbGF0aW9uSW5mb0ZldGNoZXIsXHJcbiAgR2V0Q2FuY2VsbGF0aW9uSW5mb1R5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9nZXQtY2FuY2VsbGF0aW9uLWluZm8uZmV0Y2hlcic7XHJcbmltcG9ydCB7XHJcbiAgQmFzZVJlcXVpcmVzUmVhc29uU2VydmljZSxcclxuICBSZXF1aXJlc1JlYXNvblNlcnZpY2VJbnRlcmZhY2VcclxufSBmcm9tICcuL3JlcXVpcmVzLXJlYXNvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQmFzZVdlYlRva2VuU2VydmljZSB9IGZyb20gJy4vd2VidG9rZW4uc2VydmljZSc7XHJcbmNvbnN0IFRFTVBJRCA9ICdURU1QSURfJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQmFza2V0QW5kSXRlbSB7XHJcbiAgYmFza2V0SWQ6IHN0cmluZztcclxuICBpdGVtOiBCYXNrZXRJdGVtO1xyXG59XHJcbmV4cG9ydCBpbnRlcmZhY2UgTWlHcm91cERldGFpbCB7XHJcbiAgdHlwZTogU2VydmljZVR5cGU7XHJcbiAgb3B0aW9uczogc3RyaW5nW107XHJcbiAgYmFza2V0SXRlbTogQmFza2V0SXRlbTtcclxuICB2YWx1ZTogc3RyaW5nO1xyXG59XHJcbmV4cG9ydCBpbnRlcmZhY2UgQmFza2V0SXRlbU1hbmFnZW1lbnRJbmZvIHtcclxuICBtaVBlckl0ZW06IE1hbmFnZW1lbnRJbmZvQW5kSXNWYWxpZFtdO1xyXG4gIG1pUGVyVXNlcjoge1xyXG4gICAgW2tleTogc3RyaW5nXToge1xyXG4gICAgICBtYW5hZ2VtZW50SW5mbzogTWFuYWdlbWVudEluZm9BbmRJc1ZhbGlkW107XHJcbiAgICAgIHN1cHBsZW1lbnRhcnlCb29raW5nSW5mbz86IFN1cHBsZW1lbnRhcnlCb29raW5nSW5mb0ludGVyZmFjZTtcclxuICAgIH07XHJcbiAgfTtcclxuICBtaVBlckd1ZXN0OiB7XHJcbiAgICBba2V5OiBzdHJpbmddOiB7XHJcbiAgICAgIG1hbmFnZW1lbnRJbmZvOiBNYW5hZ2VtZW50SW5mb0FuZElzVmFsaWRbXTtcclxuICAgICAgc3VwcGxlbWVudGFyeUJvb2tpbmdJbmZvPzogU3VwcGxlbWVudGFyeUJvb2tpbmdJbmZvSW50ZXJmYWNlO1xyXG4gICAgfTtcclxuICB9O1xyXG4gIHVzZXJzOiBzdHJpbmdbXTtcclxuICBiYXNrZXRJdGVtOiBCYXNrZXRJdGVtO1xyXG4gIGhpZGVGb3JTYW1lU2VydmljZT86IGJvb2xlYW47XHJcbiAgZ3Vlc3RzOiBzdHJpbmdbXTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBCYXNrZXRJbmZvcm1hdGlvbiB7XHJcbiAgcHJpY2VzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9O1xyXG4gIG1peGVkQ3VycmVuY3k6IGJvb2xlYW47XHJcbiAgY291bnQ6IG51bWJlcjtcclxuICBtaUdyb3VwczogTWlHcm91cERldGFpbFtdO1xyXG4gIGJhc2tldEluZm9NaURldGFpbHM6IEJhc2tldEluZm9NaURldGFpbHNJbXBsW107XHJcbiAgc3VwcEluZm86IFN1cHBsZW1lbnRhcnlCb29raW5nSW5mb0ludGVyZmFjZVtdO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEJhc2tldFByaWNlc0xpc3Qge1xyXG4gIHR5cGU6IFNlcnZpY2VUeXBlO1xyXG4gIHByaWNlOiBudW1iZXI7XHJcbiAgY3VycmVuY3k/OiBzdHJpbmc7XHJcbiAgdGV4dDogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEJhc2tldFByaWNlcyB7XHJcbiAgdG90YWw6IG51bWJlcjtcclxuICBjdXJyZW5jeT86IHN0cmluZztcclxuICBsaXN0OiBCYXNrZXRQcmljZXNMaXN0W107XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIEJhc2tldERldGFpbHMgPSBVc2VyQmFza2V0UmVzdWx0ICYgQmFza2V0SW5mb3JtYXRpb247XHJcbmV4cG9ydCBjbGFzcyBJbnRlcm5hbEJhc2tldDxRIGV4dGVuZHMgU2VhcmNoR2V0VXNlckZldGNoZXJUeXBlPlxyXG4gIGltcGxlbWVudHMgQmFza2V0SW5mb3JtYXRpb24sIEludGVybmFsQmFza2V0SW50ZXJmYWNlXHJcbntcclxuICBzdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8QmFza2V0RGV0YWlscz47XHJcbiAgaWQ/OiBzdHJpbmc7XHJcbiAgdGVtcGlkPzogc3RyaW5nO1xyXG4gIHRpdGxlOiBzdHJpbmc7XHJcbiAgcHJpY2VzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9O1xyXG4gIG1peGVkQ3VycmVuY3k6IGJvb2xlYW47XHJcbiAgbG93ZXN0UHJpY2U6IG51bWJlcjtcclxuICBjb3VudDogbnVtYmVyO1xyXG4gIG1pR3JvdXBzOiBNaUdyb3VwRGV0YWlsW107XHJcbiAgYmFza2V0SW5mb01pRGV0YWlsczogQmFza2V0SW5mb01pRGV0YWlsc0ltcGxbXTtcclxuICBzdXBwSW5mbzogU3VwcGxlbWVudGFyeUJvb2tpbmdJbmZvSW50ZXJmYWNlW107XHJcbiAgZ3JhbmRUb3RhbDogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfTtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIGJhc2tldDogVXNlckJhc2tldFJlc3VsdCxcclxuICAgIHByaXZhdGUgaGVscGVyczogQmFzZUhlbHBlclJvdXRpbmVzLFxyXG4gICAgcHJpdmF0ZSBiYXNrZXRTZXJ2aWNlOiBFbnRlcnByaXNlQmFza2V0U2VydmljZUludGVyZmFjZSxcclxuICAgIHByaXZhdGUgZ2V0VXNlckZldGNoZXI6IEJhc2VHZXRVc2VyRmV0Y2hlcjxRPixcclxuICAgIHByaXZhdGUgcmVxdWlyZXNTZXJ2aWNlOiBCYXNlUmVxdWlyZXNSZWFzb25TZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICBPYmplY3QuYXNzaWduKHRoaXMsIHtcclxuICAgICAgc3ViamVjdDogbmV3IEJlaGF2aW9yU3ViamVjdDxCYXNrZXREZXRhaWxzPih7XHJcbiAgICAgICAgLi4uYmFza2V0LFxyXG4gICAgICAgIHByaWNlczoge30sXHJcbiAgICAgICAgbWl4ZWRDdXJyZW5jeTogZmFsc2UsXHJcbiAgICAgICAgY291bnQ6IDAsXHJcbiAgICAgICAgbWlHcm91cHM6IFtdLFxyXG4gICAgICAgIGJhc2tldEluZm9NaURldGFpbHM6IFtdLFxyXG4gICAgICAgIHN1cHBJbmZvOiBbXVxyXG4gICAgICB9KSxcclxuICAgICAgdGVtcGlkOiBiYXNrZXQuaWQsXHJcbiAgICAgIGlkOiBiYXNrZXQuaWQsXHJcbiAgICAgIHRpdGxlOiBiYXNrZXQudGl0bGUsXHJcbiAgICAgIHByaWNlczoge30sXHJcbiAgICAgIG1peGVkQ3VycmVuY3k6IGZhbHNlLFxyXG4gICAgICBjb3VudDogMCxcclxuICAgICAgbWlHcm91cHM6IFtdLFxyXG4gICAgICBiYXNrZXRJbmZvTWlEZXRhaWxzOiBbXSxcclxuICAgICAgc3VwcEluZm86IFtdXHJcbiAgICB9KTtcclxuICAgIHRoaXMubmV4dChiYXNrZXQpO1xyXG4gIH1cclxuXHJcbiAgZGVzdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMuc3ViamVjdC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgbmV4dChiYXNrZXQ6IFVzZXJCYXNrZXRSZXN1bHQpIHtcclxuICAgIGJhc2tldCA9IHRoaXMuaGVscGVycy5jbG9uZShiYXNrZXQpO1xyXG4gICAgaWYgKFxyXG4gICAgICBiYXNrZXQuc3RhdHVzID09PSBCYXNrZXRTdGF0dXMuQXBwcm92ZWQgJiZcclxuICAgICAgYmFza2V0LmJhc2tldEl0ZW1zWzBdLnBlckl0ZW1QaG9uZU51bWJlciA9PT0gdW5kZWZpbmVkXHJcbiAgICApIHtcclxuICAgICAgLy8gV2UncmUgaW4gYXBwcm92ZWQgc3RhdGUgc28gd2UgbmVlZCB0byBtYWtlIHN1cmUgd2UgaGF2ZSB0aGUgc3VwcGxlbWVudCBzdHVmZlxyXG4gICAgICB0aGlzLmJhc2tldFNlcnZpY2VcclxuICAgICAgICAuZ2V0QmFza2V0KHtcclxuICAgICAgICAgIGNvbnZlcnRDdXJyZW5jeVRvOiAnR0JQJyxcclxuICAgICAgICAgIGlkOiBiYXNrZXQuaWQsXHJcbiAgICAgICAgICB3aXRoU3VwcGxlbWVudGFsOiB0cnVlXHJcbiAgICAgICAgfSlcclxuICAgICAgICAuc3Vic2NyaWJlKChuZXdCYXNrZXQ6IFVzZXJCYXNrZXRSZXN1bHQpID0+IHtcclxuICAgICAgICAgIHRoaXMubmV4dChuZXdCYXNrZXQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmlkID0gYmFza2V0LmlkO1xyXG4gICAgdGhpcy50aXRsZSA9IGJhc2tldC50aXRsZTtcclxuICAgIGNvbnN0IHRvU2VuZDogQmFza2V0RGV0YWlscyA9IHtcclxuICAgICAgLi4uYmFza2V0LFxyXG4gICAgICAuLi4oYmFza2V0LmJhc2tldEl0ZW1zIHx8IFtdKS5yZWR1Y2UoXHJcbiAgICAgICAgKGFjY3VtOiBCYXNrZXRJbmZvcm1hdGlvbiwgaXRlbTogQmFza2V0SXRlbSkgPT4ge1xyXG4gICAgICAgICAgaWYgKCFhY2N1bS5wcmljZXNbaXRlbS5jdXJyZW5jeV0pIHtcclxuICAgICAgICAgICAgYWNjdW0ucHJpY2VzW2l0ZW0uY3VycmVuY3ldID0gMDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGFjY3VtLnByaWNlc1tpdGVtLmN1cnJlbmN5XSArPSBpdGVtLnByaWNlO1xyXG5cclxuICAgICAgICAgIGFjY3VtLnN1cHBJbmZvLnB1c2goXHJcbiAgICAgICAgICAgIG5ldyBTdXBwbGVtZW50YXJ5Qm9va2luZ0luZm9JbXBsKFxyXG4gICAgICAgICAgICAgIGl0ZW0sXHJcbiAgICAgICAgICAgICAgdGhpcy5oZWxwZXJzLFxyXG4gICAgICAgICAgICAgIHRoaXMuZ2V0VXNlckZldGNoZXJcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGlmIChpdGVtLm1pR3JvdXBzQXZhaWxhYmxlICYmIGl0ZW0ubWlHcm91cHNBdmFpbGFibGUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBhY2N1bS5taUdyb3Vwcy5wdXNoKHtcclxuICAgICAgICAgICAgICB0eXBlOiBpdGVtLnNlcnZpY2UudHlwZSxcclxuICAgICAgICAgICAgICBvcHRpb25zOiBpdGVtLm1pR3JvdXBzQXZhaWxhYmxlLFxyXG4gICAgICAgICAgICAgIGJhc2tldEl0ZW06IGl0ZW0sXHJcbiAgICAgICAgICAgICAgdmFsdWU6IGl0ZW0ubWlHcm91cFNlbGVjdGVkIHx8ICcnXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgaXRlbS5tYW5hZ2VtZW50SW5mbz8ubGVuZ3RoID4gMCAmJlxyXG4gICAgICAgICAgICAoaXRlbS51c2Vycz8ubGVuZ3RoID4gMCB8fCBpdGVtLmd1ZXN0cz8ubGVuZ3RoKVxyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGFjY3VtLmJhc2tldEluZm9NaURldGFpbHMucHVzaChcclxuICAgICAgICAgICAgICBuZXcgQmFza2V0SW5mb01pRGV0YWlsc0ltcGwoXHJcbiAgICAgICAgICAgICAgICBpdGVtLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5iYXNrZXRTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5oZWxwZXJzXHJcbiAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIGFjY3VtO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcHJpY2VzOiB7fSxcclxuICAgICAgICAgIG1peGVkQ3VycmVuY3k6IGZhbHNlLFxyXG4gICAgICAgICAgY291bnQ6IGJhc2tldC5iYXNrZXRJdGVtcz8ubGVuZ3RoIHx8IDAsXHJcbiAgICAgICAgICBtaUdyb3VwczogW10sXHJcbiAgICAgICAgICBiYXNrZXRJbmZvTWlEZXRhaWxzOiBbXSxcclxuICAgICAgICAgIHN1cHBJbmZvOiBbXVxyXG4gICAgICAgIH1cclxuICAgICAgKVxyXG4gICAgfTtcclxuICAgIHRvU2VuZC5taXhlZEN1cnJlbmN5ID0gT2JqZWN0LmtleXModG9TZW5kLnByaWNlcykubGVuZ3RoID4gMTtcclxuICAgIHRoaXMuc3ViamVjdC5uZXh0KHRvU2VuZCk7XHJcblxyXG4gICAgdGhpcy5yZXF1aXJlc1NlcnZpY2UuYWRkQmFza2V0SXRlbShiYXNrZXQpO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VFbnRlcnByaXNlQmFza2V0U2VydmljZTxcclxuICBBTlBVX1EgZXh0ZW5kcyBBY2NlcHROZXdQcmljZUZldGNoZXJUeXBlLFxyXG4gIEFJVEJfUSBleHRlbmRzIEFkZEl0ZW1Ub0Jhc2tldEZldGNoZXJUeXBlLFxyXG4gIEFVVEJfUSBleHRlbmRzIEFkZFVzZXJCYXNrZXRGZXRjaGVyVHlwZSxcclxuICBDQl9RIGV4dGVuZHMgQ3JlYXRlQmFza2V0RmV0Y2hlclR5cGUsXHJcbiAgR0JfUSBleHRlbmRzIEdldEJhc2tldEZldGNoZXJUeXBlLFxyXG4gIEJCX1EgZXh0ZW5kcyBCb29rQmFza2V0RmV0Y2hlclR5cGUsXHJcbiAgREJfUSBleHRlbmRzIERlbGV0ZUJhc2tldEZldGNoZXJUeXBlLFxyXG4gIEdBU19RIGV4dGVuZHMgTWlBdXRvU3VnZ2VzdEZldGNoZXJUeXBlLFxyXG4gIEdVRE1WX1EgZXh0ZW5kcyBHZXRVc2VyRGVmYXVsdE1JVmFsdWVUeXBlLFxyXG4gIFJJQl9RIGV4dGVuZHMgRGVsZXRlQmFza2V0SXRlbUZldGNoZXJUeXBlLFxyXG4gIFJWQl9RIGV4dGVuZHMgUmV2YWxpZGF0ZUJhc2tldEZldGNoZXJUeXBlLFxyXG4gIFNCTUlfUSBleHRlbmRzIFNldEJhc2tldEl0TWlHcm91cEZldGNoZXJUeXBlLFxyXG4gIFNWTUlfUSBleHRlbmRzIFNldEJhc2tldEl0TWlGZXRjaGVyVHlwZSxcclxuICBWTUlfUSBleHRlbmRzIFZhbGlkYXRlTWlGZXRjaGVyVHlwZSxcclxuICBTQkFfUSBleHRlbmRzIFNlbmRCYXNrZXRBcHByb3ZhbEZldGNoZXJUeXBlLFxyXG4gIEdVX1EgZXh0ZW5kcyBTZWFyY2hHZXRVc2VyRmV0Y2hlclR5cGUsXHJcbiAgR1VCX1EgZXh0ZW5kcyBHZXRVc2VyQmFza2V0c0ZldGNoZXJUeXBlLFxyXG4gIFNCTFBfUSBleHRlbmRzIFNldEJhc2tldEl0ZW1MZWFkUGFzc2VuZ2VyRmV0Y2hlclR5cGUsXHJcbiAgTUlUREJfUSBleHRlbmRzIE1vdmVJdGVtVG9BRGlmZmVyZW50QmFza2V0VHlwZSxcclxuICBVQk5fUSBleHRlbmRzIEJhc2VVcGRhdGVCYXNrZXROb3Rlc1R5cGUsXHJcbiAgVUJUX1EgZXh0ZW5kcyBCYXNlVXBkYXRlQmFza2V0VGl0bGVUeXBlLFxyXG4gIFNCTV9RIGV4dGVuZHMgU2V0QmFza2V0SXRlbVBheW1lbnRNZXRob2RUeXBlLFxyXG4gIEdDSV9RIGV4dGVuZHMgR2V0Q2FuY2VsbGF0aW9uSW5mb1R5cGVcclxuPiBpbXBsZW1lbnRzIEVudGVycHJpc2VCYXNrZXRTZXJ2aWNlSW50ZXJmYWNlXHJcbntcclxuICBwcml2YXRlIGN1cnJlbnRCYXNrZXRzOiBJbnRlcm5hbEJhc2tldDxHVV9RPltdID0gW107XHJcblxyXG4gIGhpZ2hsaWdodEJhc2tldEl0ZW1zRW1pdHRlcjogU3ViamVjdDxHZXRVc2VyQmFza2V0SXRlbVJlc3VsdFtdPiA9IG5ldyBTdWJqZWN0PFxyXG4gICAgR2V0VXNlckJhc2tldEl0ZW1SZXN1bHRbXVxyXG4gID4oKTtcclxuXHJcbiAgYmFza2V0Q2hhbmdlRW1pdHRlcjogQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oXHJcbiAgICAnJ1xyXG4gICk7XHJcblxyXG4gIHByaXZhdGUgZ2V0IGN1cnJlbnRCYXNrZXRJRCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuYmFza2V0Q2hhbmdlRW1pdHRlci52YWx1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0IGN1cnJlbnRCYXNrZXRJRCh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICBpZiAodmFsdWUgIT09IHRoaXMuY3VycmVudEJhc2tldElEKSB7XHJcbiAgICAgIC8vIHRoaXMgcHJldmVudHMgdGhlIGVtaXR0ZXIgZ2V0dGluZyBzdHVjayBpbiBhIGxvb3AgIC0gY2FzdWluZyBicm93c2VyIG92ZXJsb2Fkc1xyXG4gICAgICB0aGlzLmJhc2tldENoYW5nZUVtaXR0ZXIubmV4dCh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBiYXNrZXRzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJbnRlcm5hbEJhc2tldDxHVV9RPltdPihbXSk7XHJcblxyXG4gIGJhc2tldExpc3Q6IEJhc2tldFByaWNlc0xpc3RbXSA9IFtcclxuICAgIHtcclxuICAgICAgdHlwZTogU2VydmljZVR5cGUuRmxpZ2h0LFxyXG4gICAgICB0ZXh0OiAnRkxJR0hUUycsXHJcbiAgICAgIHByaWNlOiAwXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0eXBlOiBTZXJ2aWNlVHlwZS5SYWlsLFxyXG4gICAgICB0ZXh0OiAnUkFJTCcsXHJcbiAgICAgIHByaWNlOiAwXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0eXBlOiBTZXJ2aWNlVHlwZS5Ib3RlbCxcclxuICAgICAgdGV4dDogJ0hPVEVMUycsXHJcbiAgICAgIHByaWNlOiAwXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0eXBlOiBTZXJ2aWNlVHlwZS5DYWIsXHJcbiAgICAgIHRleHQ6ICdUQVhJUycsXHJcbiAgICAgIHByaWNlOiAwXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0eXBlOiBTZXJ2aWNlVHlwZS5DYXIsXHJcbiAgICAgIHRleHQ6ICdDQVJTJyxcclxuICAgICAgcHJpY2U6IDBcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHR5cGU6IFNlcnZpY2VUeXBlLkV1cm9zdGFyLFxyXG4gICAgICB0ZXh0OiAnRVVST1NUQVInLFxyXG4gICAgICBwcmljZTogMFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgdHlwZTogU2VydmljZVR5cGUuSW50ZXJuYXRpb25hbFJhaWwsXHJcbiAgICAgIHRleHQ6ICdJTlRFUk5BVElPTkFMIFJBSUwnLFxyXG4gICAgICBwcmljZTogMFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgdHlwZTogU2VydmljZVR5cGUuUGFya2luZyxcclxuICAgICAgdGV4dDogJ1BBUktJTkcnLFxyXG4gICAgICBwcmljZTogMFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgdHlwZTogU2VydmljZVR5cGUuTG91bmdlLFxyXG4gICAgICB0ZXh0OiAnTE9VTkdFUycsXHJcbiAgICAgIHByaWNlOiAwXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICB0eXBlOiBTZXJ2aWNlVHlwZS5Db2FjaCxcclxuICAgICAgdGV4dDogJ0NPQUNIJyxcclxuICAgICAgcHJpY2U6IDBcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIHR5cGU6IFNlcnZpY2VUeXBlLkZhc3RUcmFjayxcclxuICAgICAgdGV4dDogJ0ZBU1RfVFJBQ0snLFxyXG4gICAgICBwcmljZTogMFxyXG4gICAgfVxyXG4gIF07XHJcblxyXG4gIGJhc2tldFByaWNlczogQmVoYXZpb3JTdWJqZWN0PEJhc2tldFByaWNlcz4gPVxyXG4gICAgbmV3IEJlaGF2aW9yU3ViamVjdDxCYXNrZXRQcmljZXM+KHtcclxuICAgICAgdG90YWw6IG51bGwsXHJcbiAgICAgIGxpc3Q6IHRoaXMuYmFza2V0TGlzdFxyXG4gICAgfSk7XHJcblxyXG4gIG1lbnVTdGF0ZSA9IE1lbnVTbGlkZUVudW0uT1VUO1xyXG4gIHByaXZhdGUgcmVxdWlyZXNTZXJ2aWNlOiBCYXNlUmVxdWlyZXNSZWFzb25TZXJ2aWNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgYWNjZXB0TmV3UHJpY2VVcGRhdGVyOiBCYXNlQWNjZXB0TmV3UHJpY2VVcGRhdGVyPEFOUFVfUT4sXHJcbiAgICBwcml2YXRlIGFkZEl0ZW1Ub0Jhc2tldFVwZGF0ZXI6IEJhc2VBZGRJdGVtVG9CYXNrZXRVcGRhdGVyPEFJVEJfUT4sXHJcbiAgICBwcml2YXRlIGFkZFVzZXJUb0Jhc2tldEl0ZW06IEJhc2VBZGRVc2VyVG9CYXNrZXRJdGVtVXBkYXRlcjxBVVRCX1E+LFxyXG4gICAgcHJpdmF0ZSBiYXNrZXRDcmVhdG9yOiBCYXNlQ3JlYXRlQmFza2V0VXBkYXRlcjxDQl9RPixcclxuICAgIHB1YmxpYyBiYXNrZXRGZXRjaGVyOiBCYXNlR2V0QmFza2V0RmV0Y2hlcjxHQl9RPixcclxuICAgIHByaXZhdGUgYm9va0Jhc2tldFVwZGF0ZXI6IEJhc2VCb29rQmFza2V0VXBkYXRlcjxCQl9RPixcclxuICAgIHByaXZhdGUgZGVsZXRlQmFza2V0VXBkYXRlcjogQmFzZURlbGV0ZUJhc2tldFVwZGF0ZXI8REJfUT4sXHJcbiAgICBwcml2YXRlIGdldE1pQXV0b1N1Z2VzdGlvbkZldGNoZXI6IEJhc2VHZXRNaUF1dG9TdWdlc3Rpb25GZXRjaGVyPEdBU19RPixcclxuICAgIHByaXZhdGUgZ2V0VXNlckRlZmF1bHRNSVZhbHVlRmV0Y2hlcjogQmFzZUdldFVzZXJEZWZhdWx0TUlWYWx1ZUZldGNoZXI8R1VETVZfUT4sXHJcbiAgICBwcml2YXRlIGhlbHBlcnM6IEJhc2VIZWxwZXJSb3V0aW5lcyxcclxuICAgIHByaXZhdGUgcmVtb3ZlSXRlbUZyb21CYXNrZXRVcGRhdGVyOiBCYXNlUmVtb3ZlSXRlbUZyb21CYXNrZXRVcGRhdGVyPFJJQl9RPixcclxuICAgIHByaXZhdGUgcmV2YWxpZGF0ZUJhc2tldFVwZGF0ZXI6IEJhc2VSZXZhbGlkYXRlQmFza2V0VXBkYXRlcjxSVkJfUT4sXHJcbiAgICBwcml2YXRlIHNldEJhc2tldEl0ZW1NaUdyb3VwVXBkYXRlcjogQmFzZVNldEJhc2tldEl0ZW1NaUdyb3VwVXBkYXRlcjxTQk1JX1E+LFxyXG4gICAgcHJpdmF0ZSBzZXRCYXNrZXRJdGVtTWlWYWx1ZVVwZGF0ZXI6IEJhc2VTZXRCYXNrZXRJdGVtTWlWYWx1ZVVwZGF0ZXI8U1ZNSV9RPixcclxuICAgIHByaXZhdGUgdmFsaWRhdGVNaUZyZWVWYWx1ZTogQmFzZVZhbGlkYXRlTWlGcmVlVmFsdWVUZXN0ZXI8Vk1JX1E+LFxyXG4gICAgcHJpdmF0ZSBzZW5kQmFza2V0Rm9yQXBwcm92YWxVcGRhdGVyOiBCYXNlU2VuZEJhc2tldEZvckFwcHJvdmFsVXBkYXRlcjxTQkFfUT4sXHJcbiAgICBwcml2YXRlIGdldFVzZXJGZXRjaGVyOiBCYXNlR2V0VXNlckZldGNoZXI8R1VfUT4sXHJcbiAgICBwcml2YXRlIGdldFVzZXJCYXNrZXRzRmV0Y2hlcjogQmFzZUdldFVzZXJCYXNrZXRzRmV0Y2hlcjxHVUJfUT4sXHJcbiAgICBwcml2YXRlIFNldEJhc2tldEl0ZW1MZWFkUGFzc2VuZ2VyOiBCYXNlU2V0QmFza2V0SXRlbUxlYWRQYXNzZW5nZXJVcGRhdGVyPFNCTFBfUT4sXHJcbiAgICBwcml2YXRlIG1vdmVJdGVtVG9BRGlmZmVyZW50QmFza2V0OiBCYXNlbW92ZUJhc2tldEl0ZW1Ub0Jhc2tldDxNSVREQl9RPixcclxuICAgIHByaXZhdGUgdXBkYXRlQmFza2V0Tm90ZXNVcGRhdGVyOiBCYXNlVXBkYXRlQmFza2V0Tm90ZVVwZGF0ZXI8VUJOX1E+LFxyXG4gICAgcHJpdmF0ZSB1cGRhdGVCYXNrZXRUaXRsZVVwZGF0ZXI6IEJhc2VVcGRhdGVCYXNrZXRUaXRsZVVwZGF0ZXI8VUJUX1E+LFxyXG4gICAgcHJpdmF0ZSBzZXRQYXltZW50TWV0aG9kVXBkYXRlcjogQmFzZVNldFBheW1lbnRPcHRpb25VcGRhdGVyPFNCTV9RPixcclxuICAgIHByaXZhdGUgZ2V0Q2FuY2VsbGF0aW9uSW5mb0ZldGNoZXI6IEJhc2VHZXRDYW5jZWxsYXRpb25JbmZvRmV0Y2hlcjxHQ0lfUT4sXHJcbiAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBVc2VyU2VydmljZUludGVyZmFjZSxcclxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBCYXNlTW9kYWxPcGVuZXJTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICB0aGlzLnJlcXVpcmVzU2VydmljZSA9IG5ldyBCYXNlUmVxdWlyZXNSZWFzb25TZXJ2aWNlKG1vZGFsU2VydmljZSwgdGhpcyk7XHJcbiAgICB0aGlzLnVzZXJTZXJ2aWNlLmNoYW5nZVVzZXIuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMucmVzZXQoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXRSZXF1aXJlc1JlYXNvblNlcnZpY2UoKTogUmVxdWlyZXNSZWFzb25TZXJ2aWNlSW50ZXJmYWNlIHtcclxuICAgIHJldHVybiB0aGlzLnJlcXVpcmVzU2VydmljZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZXNldCgpIHtcclxuICAgIGlmICh0aGlzLnVzZXJTZXJ2aWNlLmdldGZ1bGxVc2VyRGV0YWlscyhmYWxzZSkudXNlckRhdGEudmFsdWUpIHtcclxuICAgICAgdGhpcy5nZXRVc2VyQmFza2V0c0ZldGNoZXJcclxuICAgICAgICAuZmV0Y2hMaXN0KHtcclxuICAgICAgICAgIGJhc2tldFN0YXR1czogQmFza2V0U3RhdHVzLk9wZW4sXHJcbiAgICAgICAgICB1c2VyOiB0aGlzLnVzZXJTZXJ2aWNlXHJcbiAgICAgICAgICAgIC5nZXRmdWxsVXNlckRldGFpbHModHJ1ZSlcclxuICAgICAgICAgICAgLnVzZXJEYXRhLnZhbHVlLnVzZXJfaWQudG9TdHJpbmcoKVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLnBpcGUodGFrZSgxKSlcclxuICAgICAgICAuc3Vic2NyaWJlKFxyXG4gICAgICAgICAgKGJhc2tldHM6IFVzZXJCYXNrZXRSZXN1bHRbXSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50QmFza2V0cyA9IGJhc2tldHMubWFwKChiYXNrZXQ6IFVzZXJCYXNrZXRSZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoYmFza2V0KSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaW50QmFza2V0ID0gdGhpcy5maW5kQmFza2V0KGJhc2tldC5pZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWludEJhc2tldCkge1xyXG4gICAgICAgICAgICAgICAgICBpbnRCYXNrZXQgPSBuZXcgSW50ZXJuYWxCYXNrZXQoXHJcbiAgICAgICAgICAgICAgICAgICAgYmFza2V0LFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGVscGVycyxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0VXNlckZldGNoZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXF1aXJlc1NlcnZpY2VcclxuICAgICAgICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEJhc2tldHMucHVzaChpbnRCYXNrZXQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGludEJhc2tldDtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5iYXNrZXRzLm5leHQoY3VycmVudEJhc2tldHMpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGN1cnJlbnRCYXNrZXRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRCYXNrZXRJRCA9IGN1cnJlbnRCYXNrZXRzWzBdLmlkO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMuY3VycmVudEJhc2tldElEID0gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIChlcnJvcjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmN1cnJlbnRCYXNrZXRzLmZvckVhY2goKGJhc2tldDogSW50ZXJuYWxCYXNrZXRJbnRlcmZhY2UpID0+XHJcbiAgICAgICAgYmFza2V0LnN1YmplY3QudW5zdWJzY3JpYmUoKVxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLmN1cnJlbnRCYXNrZXRzID0gW107XHJcbiAgICAgIHRoaXMuY3VycmVudEJhc2tldElEID0gbnVsbDtcclxuICAgICAgdGhpcy5iYXNrZXRzLm5leHQodGhpcy5jdXJyZW50QmFza2V0cyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0QWxsT3BlbkJhc2tldHModXNlcl9pZDogc3RyaW5nKTogUHJvbWlzZTxVc2VyQmFza2V0UmVzdWx0W10+IHtcclxuICAgIHJldHVybiB0aGlzLmdldFVzZXJCYXNrZXRzRmV0Y2hlclxyXG4gICAgICAuZmV0Y2hMaXN0KHsgYmFza2V0U3RhdHVzOiBCYXNrZXRTdGF0dXMuT3BlbiwgdXNlcjogdXNlcl9pZCB9KVxyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YWtlKDEpLFxyXG4gICAgICAgIG1hcCgocmVzdWx0czogVXNlckJhc2tldFJlc3VsdFtdKSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmVzdWx0cy5mb3JFYWNoKChyZXN1bHQ6IFVzZXJCYXNrZXRSZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoIXRoaXMuZmluZEJhc2tldChyZXN1bHQuaWQpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbnRCYXNrZXQgPSBuZXcgSW50ZXJuYWxCYXNrZXQoXHJcbiAgICAgICAgICAgICAgICAgIHJlc3VsdCxcclxuICAgICAgICAgICAgICAgICAgdGhpcy5oZWxwZXJzLFxyXG4gICAgICAgICAgICAgICAgICB0aGlzLFxyXG4gICAgICAgICAgICAgICAgICB0aGlzLmdldFVzZXJGZXRjaGVyLFxyXG4gICAgICAgICAgICAgICAgICB0aGlzLnJlcXVpcmVzU2VydmljZVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEJhc2tldHMucHVzaChpbnRCYXNrZXQpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdHM7XHJcbiAgICAgICAgfSlcclxuICAgICAgKVxyXG4gICAgICAudG9Qcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgYWRkVG9CYXNrZXQoXHJcbiAgICBpdGVtOiBBZGRJdGVtVG9CYXNrZXQuVmFyaWFibGVzLFxyXG4gICAgaW50QmFza2V0OiBJbnRlcm5hbEJhc2tldDxHVV9RPixcclxuICAgIHNlYXJjaFNlcnZpY2U6IEVudGVycHJpc2VTZWFyY2hTZXJ2aWNlSW50ZXJmYWNlLFxyXG4gICAgdHJhdmVsbGVyczogVHJhdmVsbGVyW10gPSBbXSxcclxuICAgIHJlcXVpcmVzUmVhc29uOiBib29sZWFuXHJcbiAgKTogUHJvbWlzZTxEaWZmZXJlbnRJbnZva2RlZFVzZXJSZWFzb25zPiB7XHJcbiAgICBzd2l0Y2ggKFxyXG4gICAgICBhd2FpdCB0aGlzLmNoZWNrQmFza2V0Rm9ySW52b2tlZChpbnRCYXNrZXQsIHRoaXMudXNlclNlcnZpY2UuYm9ibylcclxuICAgICkge1xyXG4gICAgICBjYXNlIERpZmZlcmVudEludm9rZGVkVXNlclJlYXNvbnMuY29udGludWU6XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgRGlmZmVyZW50SW52b2tkZWRVc2VyUmVhc29ucy5jYW5jZWw6XHJcbiAgICAgICAgcmV0dXJuIERpZmZlcmVudEludm9rZGVkVXNlclJlYXNvbnMuY2FuY2VsO1xyXG4gICAgICBjYXNlIERpZmZlcmVudEludm9rZGVkVXNlclJlYXNvbnMubmV3QmFza2V0OlxyXG4gICAgICAgIGludEJhc2tldCA9IGF3YWl0IHRoaXMuY3JlYXRlQmFza2V0KCk7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50QmFza2V0SUQgPSBpbnRCYXNrZXQuaWQ7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgRGlmZmVyZW50SW52b2tkZWRVc2VyUmVhc29ucy5yZXNlYXJjaDpcclxuICAgICAgICB0aGlzLnVzZXJTZXJ2aWNlLnNldEJvYm8oXHJcbiAgICAgICAgICBUcmF2ZWxsZXJPYmplY3QubWFrZVRyYXZlbGxlck9iamVjdEZyb21Vc2VyKFxyXG4gICAgICAgICAgICBpbnRCYXNrZXQuc3ViamVjdC52YWx1ZS5pbnZva2VkVXNlclxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgcmV0dXJuIERpZmZlcmVudEludm9rZGVkVXNlclJlYXNvbnMucmVzZWFyY2g7XHJcbiAgICB9XHJcbiAgICBpdGVtLmJhc2tldCA9IGludEJhc2tldC5pZDtcclxuICAgIGl0ZW0uY29udmVydEN1cnJlbmN5VG8gPSAnR0JQJztcclxuICAgIGlmICh0cmF2ZWxsZXJzPy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGl0ZW0udXNlcnMgPSB0aGlzLmhlbHBlcnMubWFrZVVzZXJzKFxyXG4gICAgICAgIHRyYXZlbGxlcnMuZmlsdGVyKCh0cmF2KSA9PiAhdHJhdi5ndWVzdClcclxuICAgICAgKTtcclxuICAgICAgaXRlbS5ndWVzdHMgPSB0aGlzLmhlbHBlcnMubWFrZVVzZXJzKFxyXG4gICAgICAgIHRyYXZlbGxlcnMuZmlsdGVyKCh0cmF2KSA9PiB0cmF2Lmd1ZXN0KVxyXG4gICAgICApO1xyXG4gICAgICBpdGVtLmxlYWRQYXNzZW5nZXIgPSB0cmF2ZWxsZXJzWzBdLmlkO1xyXG4gICAgICBpdGVtLmxlYWRQYXNzZW5nZXJUeXBlID0gdHJhdmVsbGVyc1swXS5ndWVzdFxyXG4gICAgICAgID8gTGVhZFBhc3NlbmdlclR5cGUuR3Vlc3RcclxuICAgICAgICA6IExlYWRQYXNzZW5nZXJUeXBlLlVzZXI7XHJcbiAgICB9XHJcbiAgICBpdGVtLm91dGJvdW5kRGF0ZSA9IGl0ZW0ub3V0Ym91bmREYXRlXHJcbiAgICAgID8gbmV3IERhdGUodGhpcy5oZWxwZXJzLmZvcm1hdElzb0RhdGVUaW1lKGl0ZW0ub3V0Ym91bmREYXRlKSlcclxuICAgICAgOiBpdGVtLm91dGJvdW5kRGF0ZTtcclxuICAgIGl0ZW0uaW5ib3VuZERhdGUgPSBpdGVtLmluYm91bmREYXRlXHJcbiAgICAgID8gbmV3IERhdGUodGhpcy5oZWxwZXJzLmZvcm1hdElzb0RhdGVUaW1lKGl0ZW0uaW5ib3VuZERhdGUpKVxyXG4gICAgICA6IGl0ZW0uaW5ib3VuZERhdGU7XHJcblxyXG4gICAgaXRlbS5yZXF1aXJlc1JlYXNvbiA9IHJlcXVpcmVzUmVhc29uO1xyXG4gICAgaXRlbSA9IHRoaXMuY2hlY2tEZXRhaWxzKGl0ZW0pO1xyXG5cclxuICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLnVzZXJTZXJ2aWNlLmZpbmRTZXJ2aWNlKGl0ZW0uc2VydmljZSkudHlwZTtcclxuICAgIC8vIGxldCBjaGVhcGVzdFByaWNlOiBudW1iZXJcclxuICAgIC8vIGlmIChzZWFyY2hTZXJ2aWNlLnNlYXJjaGVzW3NlcnZpY2VdLmNoZWFwZXN0UHJpY2UpIGNoZWFwZXN0UHJpY2UgPSBzZWFyY2hTZXJ2aWNlLnNlYXJjaGVzW3NlcnZpY2VdLmNoZWFwZXN0UHJpY2UuYW1vdW50XHJcbiAgICAvLyBlbHNlIGlmIChzZXJ2aWNlID09IFNlcnZpY2VUeXBlLkZsaWdodCkge1xyXG4gICAgLy8gICBjb25zdCBjaGVhcGVzdFByaWNlT2JqZWN0ID0gc2VhcmNoU2VydmljZS5zZWFyY2hlc1tzZXJ2aWNlXS5jaGVhcGVzdFByaWNlT2JqZWN0XHJcbiAgICAvLyAgIGNoZWFwZXN0UHJpY2UgPSBjaGVhcGVzdFByaWNlT2JqZWN0LmR1YWxJbmJvdW5kLmFtb3VudCArIGNoZWFwZXN0UHJpY2VPYmplY3QuZHVhbE91dGJvdW5kLmFtb3VudCA8IGNoZWFwZXN0UHJpY2VPYmplY3QucmV0dXJucy5hbW91bnQgXHJcbiAgICAvLyAgICAgPyBjaGVhcGVzdFByaWNlT2JqZWN0LmR1YWxJbmJvdW5kLmFtb3VudCArIGNoZWFwZXN0UHJpY2VPYmplY3QuZHVhbE91dGJvdW5kLmFtb3VudCA6IGNoZWFwZXN0UHJpY2VPYmplY3QucmV0dXJucy5hbW91bnRcclxuICAgIC8vIH1cclxuICAgIC8vIGVsc2UgaWYgKHNlcnZpY2UgPT0gU2VydmljZVR5cGUuUmFpbCkge1xyXG4gICAgLy8gICBzZWFyY2hTZXJ2aWNlLnNlYXJjaGVzW3NlcnZpY2VdLmNoZWFwZXN0LnN1YnNjcmliZShhID0+e1xyXG4gICAgLy8gICAgIGNvbnNvbGUubG9nKGEpXHJcbiAgICAvLyAgIH0pXHJcbiAgICAvLyAgIC8vIGNoZWFwZXN0UHJpY2UgPSBjaGVhcGVzdFByaWNlT2JqZWN0LmR1YWxJbmJvdW5kLmFtb3VudCArIGNoZWFwZXN0UHJpY2VPYmplY3QuZHVhbE91dGJvdW5kLmFtb3VudCA8IGNoZWFwZXN0UHJpY2VPYmplY3QucmV0dXJucy5hbW91bnQgXHJcbiAgICAvLyAgIC8vICAgPyBjaGVhcGVzdFByaWNlT2JqZWN0LmR1YWxJbmJvdW5kLmFtb3VudCArIGNoZWFwZXN0UHJpY2VPYmplY3QuZHVhbE91dGJvdW5kLmFtb3VudCA6IGNoZWFwZXN0UHJpY2VPYmplY3QucmV0dXJucy5hbW91bnRcclxuICAgIC8vIH1cclxuICAgIFxyXG4gICAgdGhpcy5yZW1vdmVCb29rZWRCYXNrZXQoKTtcclxuXHJcbiAgICBpZiAoaXRlbSAmJiBpbnRCYXNrZXQpIHtcclxuICAgICAgdGhpcy5hZGRJdGVtVG9CYXNrZXRVcGRhdGVyXHJcbiAgICAgICAgLnVwZGF0ZU9uZShpdGVtKVxyXG4gICAgICAgIC5waXBlKHRha2UoMSkpXHJcbiAgICAgICAgLnN1YnNjcmliZShcclxuICAgICAgICAgIChuZXdCYXNrZXQ6IFBhcnRpYWw8VXNlckJhc2tldFJlc3VsdD4pID0+IHtcclxuICAgICAgICAgICAgaW50QmFza2V0Lm5leHQoe1xyXG4gICAgICAgICAgICAgIC4uLmludEJhc2tldC5zdWJqZWN0LnZhbHVlLFxyXG4gICAgICAgICAgICAgIC4uLm5ld0Jhc2tldFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgc2VhcmNoU2VydmljZS5zZWFyY2hfb2JqZWN0c1tzZXJ2aWNlXS5ib29raW5nX2Nob3NlbiA9IHRydWU7XHJcbiAgICAgICAgICAgIHNlYXJjaFNlcnZpY2Uuc2VhcmNoX29iamVjdHNbc2VydmljZV0uY2hvc2VuID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGNvbnN0IGJpOiBHZXRVc2VyQmFza2V0SXRlbVJlc3VsdFtdID0gbmV3QmFza2V0LmJhc2tldEl0ZW1zO1xyXG4gICAgICAgICAgICB0aGlzLmhpZ2hsaWdodEJhc2tldEl0ZW1zRW1pdHRlci5uZXh0KGJpKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICAoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgaW50QmFza2V0LnN1YmplY3QubmV4dChpbnRCYXNrZXQuc3ViamVjdC52YWx1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuICAgIHJldHVybiBEaWZmZXJlbnRJbnZva2RlZFVzZXJSZWFzb25zLmNvbnRpbnVlO1xyXG4gIH1cclxuXHJcbiAgY2hlY2tCYXNrZXRGb3JJbnZva2VkKFxyXG4gICAgaW50QmFza2V0OiBJbnRlcm5hbEJhc2tldDxHVV9RPixcclxuICAgIGJvYm86IFRyYXZlbGxlclxyXG4gICk6IFByb21pc2U8RGlmZmVyZW50SW52b2tkZWRVc2VyUmVhc29ucz4ge1xyXG4gICAgaWYgKGludEJhc2tldC5zdWJqZWN0LnZhbHVlLmludm9rZWRVc2VyPy5pZCAhPT0gYm9ibz8uaWQpIHtcclxuICAgICAgcmV0dXJuIHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oXHJcbiAgICAgICAgTW9kYWxUeXBlcy5EaWZmZXJlbnRJbnZva2RlZFVzZXJDb21wb25lbnQsXHJcbiAgICAgICAge30sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgYmFza2V0Qm9ibzogaW50QmFza2V0LnN1YmplY3QudmFsdWUuaW52b2tlZFVzZXIsXHJcbiAgICAgICAgICBjdXJyZW50Qm9ibzogYm9ib1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoRGlmZmVyZW50SW52b2tkZWRVc2VyUmVhc29ucy5jb250aW51ZSk7XHJcbiAgfVxyXG5cclxuICBsb2FkQmFza2V0KGlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCBpbnRCYXNrZXQgPSB0aGlzLmZpbmRCYXNrZXQoaWQpO1xyXG4gICAgaWYgKCFpbnRCYXNrZXQpIHtcclxuICAgICAgaW50QmFza2V0ID0gbmV3IEludGVybmFsQmFza2V0KFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGlkLFxyXG4gICAgICAgICAgYmFza2V0SXRlbXM6IFtdXHJcbiAgICAgICAgfSBhcyBCYXNrZXREZXRhaWxzLFxyXG4gICAgICAgIHRoaXMuaGVscGVycyxcclxuICAgICAgICB0aGlzLFxyXG4gICAgICAgIHRoaXMuZ2V0VXNlckZldGNoZXIsXHJcbiAgICAgICAgdGhpcy5yZXF1aXJlc1NlcnZpY2VcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5jdXJyZW50QmFza2V0cy5wdXNoKGludEJhc2tldCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmJhc2tldEZldGNoZXJcclxuICAgICAgLmZldGNoT25lKHsgY29udmVydEN1cnJlbmN5VG86ICdHQlAnLCBpZCB9KVxyXG4gICAgICAuc3Vic2NyaWJlKChuZXdCYXNrZXQ6IFVzZXJCYXNrZXRSZXN1bHQpID0+IHtcclxuICAgICAgICBpbnRCYXNrZXQubmV4dChuZXdCYXNrZXQpO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHN1YnNyaWJlVG9CYXNrZXQoaWQ6IHN0cmluZywgb2JzZXJ2ZXI6IE9ic2VydmVyPEJhc2tldERldGFpbHM+KTogdm9pZCB7XHJcbiAgICBjb25zdCBpbnRCYXNrZXQgPSB0aGlzLmZpbmRCYXNrZXQoaWQpO1xyXG4gICAgaWYgKGludEJhc2tldCkge1xyXG4gICAgICBpbnRCYXNrZXQuc3ViamVjdC5zdWJzY3JpYmUob2JzZXJ2ZXIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVtb3ZlRXhwaXJlZEl0ZW1zKGlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IGludEJhc2tldCA9IHRoaXMuZmluZEJhc2tldChpZCk7XHJcbiAgICBpbnRCYXNrZXQuc3ViamVjdC52YWx1ZS5iYXNrZXRJdGVtc1xyXG4gICAgICAuZmlsdGVyKChiYXNrZXRJdGVtOiBCYXNrZXRJdGVtKTogYm9vbGVhbiA9PiB7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgIGJhc2tldEl0ZW0ubGF0ZXN0VmFsaWRhdGlvblByaWNlRGlmZmVyZW5jZSAhPT0gMCB8fCBiYXNrZXRJdGVtLmV4cGlyZWRcclxuICAgICAgICApO1xyXG4gICAgICB9KVxyXG4gICAgICAuZm9yRWFjaCgoYmFza2V0SXRlbTogQmFza2V0SXRlbSkgPT4ge1xyXG4gICAgICAgIHRoaXMucmVtb3ZlQmFza2V0SXRlbShpZCwgYmFza2V0SXRlbSk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgcmVtb3ZlQmFza2V0SXRlbShcclxuICAgIGJhc2tldElkOiBzdHJpbmcsXHJcbiAgICBpdGVtOiBHZXRVc2VyQmFza2V0SXRlbVJlc3VsdFxyXG4gICk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgaW50QmFza2V0OiBJbnRlcm5hbEJhc2tldDxHVV9RPiA9IHRoaXMuZmluZEJhc2tldChiYXNrZXRJZCk7XHJcbiAgICAvLyBpZiBpdCdzIGEgaG90ZWwgcmVtb3ZlIGFsbCBsaW5rZWQgaXRlbXNcclxuICAgIGlmIChpdGVtLnNlcnZpY2UudHlwZSA9PT0gU2VydmljZVR5cGUuSG90ZWwpIHtcclxuICAgICAgY29uc3QgaG90ZWxJdGVtcyA9IGludEJhc2tldC5zdWJqZWN0LnZhbHVlLmJhc2tldEl0ZW1zLmZpbHRlcihcclxuICAgICAgICAoYmFza2V0SXRlbSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgaXRlbS5kZXRhaWwuaG90ZWxJZCA9PT0gYmFza2V0SXRlbS5kZXRhaWwuaG90ZWxJZCAmJlxyXG4gICAgICAgICAgICBpdGVtLmRldGFpbC5yb29tc1swXS5pZCA9PT0gYmFza2V0SXRlbS5kZXRhaWwucm9vbXNbMF0uaWQgJiZcclxuICAgICAgICAgICAgaXRlbS5kZXRhaWwucm9vbXNbMF0uY2hlY2tJbiA9PT1cclxuICAgICAgICAgICAgICBiYXNrZXRJdGVtLmRldGFpbC5yb29tc1swXS5jaGVja0luICYmXHJcbiAgICAgICAgICAgIGl0ZW0uZGV0YWlsLnJvb21zWzBdLmNoZWNrT3V0ID09PVxyXG4gICAgICAgICAgICAgIGJhc2tldEl0ZW0uZGV0YWlsLnJvb21zWzBdLmNoZWNrT3V0XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgICAgaWYgKGhvdGVsSXRlbXMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgIC8vIEVOVC0yNDQ3IG5ldyBtb2RhbCBtYWRlIGluIExVLCBuZWVkcyB0byBiZSBtYWRlIGluIGFsbCBvYnRzIGFuZCBhcHAgb3Igd2lsbCBnZXQgZXJyb3JcclxuICAgICAgICBhd2FpdCB0aGlzLm1vZGFsU2VydmljZS5vcGVuKE1vZGFsVHlwZXMuV2FybmluZ1JlbW92ZU1vZGFsQ29tcG9uZW50KTtcclxuICAgICAgICBob3RlbEl0ZW1zLmZvckVhY2goKGl0ZW06IEJhc2tldEl0ZW0pID0+IHtcclxuICAgICAgICAgIHRoaXMucmVtb3ZlSXRlbUZyb21CYXNrZXRVcGRhdGVyXHJcbiAgICAgICAgICAgIC51cGRhdGVPbmUoeyBjb252ZXJ0Q3VycmVuY3lUbzogJ0dCUCcsIGJhc2tldEl0ZW06IGl0ZW0uaWQgfSlcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgobmV3QmFza2V0OiBCYXNrZXQpID0+IHtcclxuICAgICAgICAgICAgICBpbnRCYXNrZXQubmV4dCh7XHJcbiAgICAgICAgICAgICAgICAuLi5pbnRCYXNrZXQuc3ViamVjdC52YWx1ZSxcclxuICAgICAgICAgICAgICAgIC4uLm5ld0Jhc2tldFxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIHRoaXMuYmFza2V0Q2hhbmdlRW1pdHRlci5uZXh0KGJhc2tldElkKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVJdGVtRnJvbUJhc2tldFVwZGF0ZXJcclxuICAgICAgICAgIC51cGRhdGVPbmUoeyBjb252ZXJ0Q3VycmVuY3lUbzogJ0dCUCcsIGJhc2tldEl0ZW06IGl0ZW0uaWQgfSlcclxuICAgICAgICAgIC5zdWJzY3JpYmUoKG5ld0Jhc2tldDogQmFza2V0KSA9PiB7XHJcbiAgICAgICAgICAgIGludEJhc2tldC5uZXh0KHtcclxuICAgICAgICAgICAgICAuLi5pbnRCYXNrZXQuc3ViamVjdC52YWx1ZSxcclxuICAgICAgICAgICAgICAuLi5uZXdCYXNrZXRcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuYmFza2V0Q2hhbmdlRW1pdHRlci5uZXh0KGJhc2tldElkKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJlbW92ZUl0ZW1Gcm9tQmFza2V0VXBkYXRlclxyXG4gICAgICAgIC51cGRhdGVPbmUoeyBjb252ZXJ0Q3VycmVuY3lUbzogJ0dCUCcsIGJhc2tldEl0ZW06IGl0ZW0uaWQgfSlcclxuICAgICAgICAuc3Vic2NyaWJlKChuZXdCYXNrZXQ6IEJhc2tldCkgPT4ge1xyXG4gICAgICAgICAgaW50QmFza2V0Lm5leHQoe1xyXG4gICAgICAgICAgICAuLi5pbnRCYXNrZXQuc3ViamVjdC52YWx1ZSxcclxuICAgICAgICAgICAgLi4ubmV3QmFza2V0XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIHRoaXMuYmFza2V0Q2hhbmdlRW1pdHRlci5uZXh0KGJhc2tldElkKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXREZWZhdWx0QmFza2V0KFxyXG4gICAgZ2V0Qm9va2VkQmFza2V0OiBib29sZWFuID0gZmFsc2VcclxuICApOiBQcm9taXNlPEludGVybmFsQmFza2V0PEdVX1E+PiB7XHJcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmN1cnJlbnRCYXNrZXRJRCk7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5maW5kT3JDcmVhdGVCYXNrZXQoXHJcbiAgICAgIHRoaXMuY3VycmVudEJhc2tldElELFxyXG4gICAgICBnZXRCb29rZWRCYXNrZXRcclxuICAgICkudGhlbigoZGF0YSkgPT4ge1xyXG4gICAgICByZXR1cm4gZGF0YTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmaW5kQmFza2V0KGlkOiBzdHJpbmcpOiBJbnRlcm5hbEJhc2tldDxHVV9RPiB7XHJcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50QmFza2V0cy5maW5kKChiYXNrZXQ6IEludGVybmFsQmFza2V0PEdVX1E+KSA9PiB7XHJcbiAgICAgIHJldHVybiBiYXNrZXQuaWQgPT09IGlkIHx8IGJhc2tldC50ZW1waWQgPT09IGlkO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGZpbmRPckNyZWF0ZUJhc2tldChcclxuICAgIGlkPzogc3RyaW5nLFxyXG4gICAgZ2V0Qm9va2VkQmFza2V0OiBib29sZWFuID0gZmFsc2VcclxuICApOiBQcm9taXNlPEludGVybmFsQmFza2V0PEdVX1E+PiB7XHJcbiAgICBsZXQgYmFza2V0OiBJbnRlcm5hbEJhc2tldDxHVV9RPiA9IG51bGw7XHJcbiAgICBpZiAoIWlkKSB7XHJcbiAgICAgIGNvbnN0IGFsbE9wZW5CYXNrZXRzID0gYXdhaXQgdGhpcy5nZXRBbGxPcGVuQmFza2V0cyhcclxuICAgICAgICB0aGlzLnVzZXJTZXJ2aWNlXHJcbiAgICAgICAgICAuZ2V0ZnVsbFVzZXJEZXRhaWxzKHRydWUpXHJcbiAgICAgICAgICAudXNlckRhdGEudmFsdWUudXNlcl9pZC50b1N0cmluZygpXHJcbiAgICAgICk7XHJcblxyXG4gICAgICAvLyBmaW5kIHRoZSBsYXN0IHVwZGF0ZWQgYmFza2V0XHJcbiAgICAgIGlmICghYWxsT3BlbkJhc2tldHM/Lmxlbmd0aCkge1xyXG4gICAgICAgIC8vIEVOVC0yNjE2IHJlbW92ZWQgYWRkaW5nIHRvIGN1cnJlbnQgYmFza2V0IGFzIHRoaXMgd2FzIGEgZHVwZVxyXG4gICAgICAgIGJhc2tldCA9IGF3YWl0IHRoaXMuY3JlYXRlQmFza2V0KCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gYmFza2V0cyBhcmUgYWxyZWFkeSBzb3J0ZWQgYnkgbGFzdCB1cGRhdGVkIC0gcmV0dXJuIHRoZSBsYXN0IHVwZGF0ZWQgYmFza2V0XHJcbiAgICAgICAgYmFza2V0ID0gdGhpcy5maW5kQmFza2V0KGFsbE9wZW5CYXNrZXRzWzBdLmlkKTtcclxuXHJcbiAgICAgICAgaWYgKGJhc2tldC5zdWJqZWN0LnZhbHVlLnN0YXR1cyA9PT0gJ0JPT0tFRCcgJiYgIWdldEJvb2tlZEJhc2tldCkge1xyXG4gICAgICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgICAgICAnKysrIFJldHJpZXZlZCBiYXNrZXQgaXMgaW4gYm9va2VkIHN0YXR1cyAtIGNyZWF0aW5nIGEgbmV3IG9uZSArKysnXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgYmFza2V0ID0gYXdhaXQgdGhpcy5jcmVhdGVCYXNrZXQoKTtcclxuICAgICAgICAgIHRoaXMuY3VycmVudEJhc2tldHMucHVzaChiYXNrZXQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmJhc2tldHMubmV4dCh0aGlzLmN1cnJlbnRCYXNrZXRzKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgYmFza2V0ID0gdGhpcy5maW5kQmFza2V0KGlkKTtcclxuICAgICAgLy8gY29uc29sZS5sb2coJysrKyBGb3VuZCBCYXNrZXQ6ICcsIGJhc2tldCwgJyArKysnKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYmFza2V0O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGNyZWF0ZUJhc2tldCgpOiBQcm9taXNlPEludGVybmFsQmFza2V0PEdVX1E+PiB7XHJcbiAgICBjb25zdCBiYXNrZXQ6IFVzZXJCYXNrZXRSZXN1bHQgPSB7XHJcbiAgICAgIGlkOiBURU1QSUQgKyBtb21lbnQoKS51bml4KCkudG9TdHJpbmcoKSxcclxuICAgICAgb3duZXI6IG51bGwsXHJcbiAgICAgIHJlZmVyZW5jZTogbnVsbCxcclxuICAgICAgdGl0bGU6IG51bGwsXHJcbiAgICAgIG5vdGVzOiBudWxsLFxyXG4gICAgICBjcmVhdGVkQXQ6IG51bGwsXHJcbiAgICAgIHVwZGF0ZWRBdDogbnVsbCxcclxuICAgICAgYmFza2V0SXRlbXM6IFtdLFxyXG4gICAgICBzdGF0dXM6IG51bGwsXHJcbiAgICAgIHZhbGlkYXRlZDogZmFsc2VcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgaW50QmFza2V0ID0gbmV3IEludGVybmFsQmFza2V0PEdVX1E+KFxyXG4gICAgICBiYXNrZXQsXHJcbiAgICAgIHRoaXMuaGVscGVycyxcclxuICAgICAgdGhpcyxcclxuICAgICAgdGhpcy5nZXRVc2VyRmV0Y2hlcixcclxuICAgICAgdGhpcy5yZXF1aXJlc1NlcnZpY2VcclxuICAgICk7XHJcbiAgICAvLyB7IHN1YmplY3Q6IG5ldyBCZWhhdmlvclN1YmplY3Q8QmFza2V0PihiYXNrZXQpLCB0ZW1waWQ6IGJhc2tldC5pZCwgaWQ6IGJhc2tldC5pZCwgdGl0bGU6IGJhc2tldC5pZCB9O1xyXG5cclxuICAgIC8vIGVudC0yNjE2IG9ubHkgcGxhY2Ugd2UgbmVlZCB0byBhZGQgYSBiYXNrZXQgdG8gY3VycmVudCBiYXNrZXRzXHJcbiAgICBjb25zdCB0b1JldHVybiA9IGF3YWl0IHRoaXMuY3JlYXRlQmFza2V0T25EQihpbnRCYXNrZXQpO1xyXG4gICAgdGhpcy5jdXJyZW50QmFza2V0cy5wdXNoKHRvUmV0dXJuKTtcclxuICAgIHRoaXMuYmFza2V0cy5uZXh0KHRoaXMuY3VycmVudEJhc2tldHMpO1xyXG4gICAgdGhpcy5iYXNrZXRDaGFuZ2VFbWl0dGVyLm5leHQodG9SZXR1cm4uaWQpO1xyXG4gICAgcmV0dXJuIHRvUmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVCYXNrZXRPbkRCKFxyXG4gICAgaW50QmFza2V0OiBJbnRlcm5hbEJhc2tldDxHVV9RPlxyXG4gICk6IFByb21pc2U8SW50ZXJuYWxCYXNrZXQ8R1VfUT4+IHtcclxuICAgIGNvbnN0IG11dGF0aW9uOiBDcmVhdGVCYXNrZXRNdXRhdGlvblZhcmlhYmxlcyA9IHRoaXMudXNlclNlcnZpY2UuYm9ibz8uaWRcclxuICAgICAgPyB7IGludm9rZWRVc2VyOiB0aGlzLnVzZXJTZXJ2aWNlLmJvYm8/LmlkIH1cclxuICAgICAgOiB7fTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICB0aGlzLmJhc2tldENyZWF0b3JcclxuICAgICAgICAudXBkYXRlT25lKG11dGF0aW9uKVxyXG4gICAgICAgIC5waXBlKHRha2UoMSkpXHJcbiAgICAgICAgLnN1YnNjcmliZShcclxuICAgICAgICAgIChiYXNrZXQ6IFVzZXJCYXNrZXRSZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgaW50QmFza2V0LmlkID0gYmFza2V0LmlkO1xyXG4gICAgICAgICAgICBpbnRCYXNrZXQubmV4dChiYXNrZXQpO1xyXG4gICAgICAgICAgICByZXNvbHZlKGludEJhc2tldCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgKGVycm9yOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICAoKSA9PiB7fVxyXG4gICAgICAgICk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZU1lbnUoKTogdm9pZCB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMubWVudVN0YXRlID09PSBNZW51U2xpZGVFbnVtLklOIHx8XHJcbiAgICAgIHRoaXMubWVudVN0YXRlID09PSBNZW51U2xpZGVFbnVtLkZMQVRcclxuICAgICkge1xyXG4gICAgICB0aGlzLm1lbnVTdGF0ZSA9IE1lbnVTbGlkZUVudW0uT1VUO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5tZW51U3RhdGUgPSBNZW51U2xpZGVFbnVtLklOO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2xvc2VNZW51KCk6IHZvaWQge1xyXG4gICAgdGhpcy5tZW51U3RhdGUgPSBNZW51U2xpZGVFbnVtLklOO1xyXG4gIH1cclxuXHJcbiAgZ2V0TGF0ZXN0QmFza2V0SXRlbUZvclR5cGVzKFxyXG4gICAgYmFza2V0SXRlbXM6IEJhc2tldEl0ZW1bXVxyXG4gICk6IFJlY29yZDxTZXJ2aWNlVHlwZSwgQmFza2V0SXRlbT4ge1xyXG4gICAgcmV0dXJuIChiYXNrZXRJdGVtcyB8fCBbXSkucmVkdWNlKFxyXG4gICAgICAoXHJcbiAgICAgICAgbGF0ZXN0SXRlbXM6IFJlY29yZDxTZXJ2aWNlVHlwZSwgQmFza2V0SXRlbT4sXHJcbiAgICAgICAgYmFza2V0SXRlbTogQmFza2V0SXRlbVxyXG4gICAgICApID0+IHtcclxuICAgICAgICBsYXRlc3RJdGVtc1tiYXNrZXRJdGVtLnNlcnZpY2UudHlwZV0gPSBiYXNrZXRJdGVtO1xyXG4gICAgICAgIHJldHVybiBsYXRlc3RJdGVtcztcclxuICAgICAgfSxcclxuICAgICAge30gYXMgUmVjb3JkPFNlcnZpY2VUeXBlLCBCYXNrZXRJdGVtPlxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2hlY2tEZXRhaWxzKFxyXG4gICAgaXRlbTogQWRkSXRlbVRvQmFza2V0LlZhcmlhYmxlc1xyXG4gICk6IEFkZEl0ZW1Ub0Jhc2tldC5WYXJpYWJsZXMge1xyXG4gICAgY29uc3Qgc2VydmljZVRvQ2hlY2s6IFNlcnZpY2UgPSB0aGlzLnVzZXJTZXJ2aWNlLmZpbmRTZXJ2aWNlKGl0ZW0uc2VydmljZSk7XHJcbiAgICBpZiAoIXNlcnZpY2VUb0NoZWNrKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuYWJsZSB0byBmaW5kIHNlcnZpY2UgZm9yIGJhc2tldCBpdGVtIDogJyArIGl0ZW0uc2VydmljZSk7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGNoZWNrIHRoZSBpdGVtLmRldGFpbCBvYmplY3QgYWdhaW5zdCB0aGUgcmVsZXZhbnQgc2VydmljZSBkZXRhaWxTY2hlbWEgdXNpbmcgQWp2XHJcbiAgICBjb25zdCBhanYgPSBuZXcgQWp2KCk7XHJcblxyXG4gICAgLy8gQ3VzdG9tIEphdmFzY3JpcHQgSVNPIERhdGUgVGltZSBmb3JtYXRcclxuICAgIGFqdi5hZGRGb3JtYXQoJ2pzLWRhdGUtdGltZScsIChkYXRlVGltZVN0cmluZzogYW55KSA9PiB7XHJcbiAgICAgIGlmIChcclxuICAgICAgICB0eXBlb2YgZGF0ZVRpbWVTdHJpbmcgPT09ICdvYmplY3QnICYmXHJcbiAgICAgICAgZGF0ZVRpbWVTdHJpbmcuaGFzT3duUHJvcGVydHkoJ3RvSVNPU3RyaW5nJylcclxuICAgICAgKSB7XHJcbiAgICAgICAgZGF0ZVRpbWVTdHJpbmcgPSBkYXRlVGltZVN0cmluZy50b0lTT1N0cmluZygpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gIWlzTmFOKERhdGUucGFyc2UoZGF0ZVRpbWVTdHJpbmcpKTsgLy8gYW55IHRlc3QgdGhhdCByZXR1cm5zIHRydWUvZmFsc2VcclxuICAgIH0pO1xyXG5cclxuICAgIGFqdi5hZGRGb3JtYXQoJ3JhaWxTZWF0aW5nJywgKCkgPT4ge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0pO1xyXG5cclxuICAgIGFqdi5hZGRGb3JtYXQoJ3Bhc3Nwb3J0JywgKCkgPT4ge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0pO1xyXG5cclxuICAgIGFqdi5hZGRGb3JtYXQoJ3NwZWNpYWxSZXF1ZXN0JywgKCkgPT4ge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IHZhbGlkYXRlRGV0YWlsU2NoZW1hID0gYWp2LmNvbXBpbGUoc2VydmljZVRvQ2hlY2suZGV0YWlsU2NoZW1hKTtcclxuICAgIGNvbnN0IHZhbGlkYXRlU2VhcmNoU2NoZW1hID0gYWp2LmNvbXBpbGUoc2VydmljZVRvQ2hlY2suc2VhcmNoUXVlcnlTY2hlbWEpO1xyXG5cclxuICAgIC8vIGlmIHRoZXJlIGFyZSBhbnkgbW9tZW50IGRhdGUgb2JqZWN0cyBpbiB0aGUgc2VhcmNoUXVlcnkgb2JqZWN0IGNvbnZlcnQgdGhlc2UgdG8gZGF0ZS10aW1lIHN0cmluZ3NcclxuICAgIGl0ZW0uc2VhcmNoUXVlcnkgPSB0aGlzLmhlbHBlcnMuc2FuaXRpemVNb21lbnREYXRlcyhpdGVtLnNlYXJjaFF1ZXJ5KTtcclxuICAgIGl0ZW0uZGV0YWlsID0gdGhpcy5oZWxwZXJzLnJlbW92ZU51bGxzKGl0ZW0uZGV0YWlsKTtcclxuXHJcbiAgICBpZiAoIXZhbGlkYXRlU2VhcmNoU2NoZW1hKGl0ZW0uc2VhcmNoUXVlcnkpKSB7XHJcbiAgICAgIGNvbnN0IGVycm9yID0gYEl0ZW0gc2VhcmNoUXVlcnkgaXMgbm90IHZhbGlkIGZvciAke3NlcnZpY2VUb0NoZWNrLm5hbWV9IHNlYXJjaCBzY2hlbWEuYDtcclxuICAgICAgY29uc29sZS53YXJuKCdzZWFyY2hTY2hlbWEnLCBzZXJ2aWNlVG9DaGVjay5zZWFyY2hRdWVyeVNjaGVtYSk7XHJcbiAgICAgIGNvbnNvbGUud2FybignaXRlbS5zZWFyY2hRdWVyeScsIGl0ZW0uc2VhcmNoUXVlcnkpO1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgJ1NlYXJjaCBRdWVyeSBWYWxpZGF0aW9uIGVycm9ycycsXHJcbiAgICAgICAgdmFsaWRhdGVTZWFyY2hTY2hlbWEuZXJyb3JzXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oTW9kYWxUeXBlcy5Nb2RhbEVycm9yQ29tcG9uZW50LCB7fSwgeyBlcnJvciB9KTtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF2YWxpZGF0ZURldGFpbFNjaGVtYShpdGVtLmRldGFpbCkpIHtcclxuICAgICAgY29uc3QgZXJyb3IgPSBgSXRlbSBkZXRhaWwgaXMgbm90IHZhbGlkIGZvciAke3NlcnZpY2VUb0NoZWNrLm5hbWV9IGRldGFpbCBzY2hlbWEuYDtcclxuICAgICAgY29uc29sZS53YXJuKCdkZXRhaWxTY2hlbWEnLCBzZXJ2aWNlVG9DaGVjay5kZXRhaWxTY2hlbWEpO1xyXG4gICAgICBjb25zb2xlLndhcm4oJ2l0ZW0uZGV0YWlsJywgaXRlbS5kZXRhaWwpO1xyXG4gICAgICBjb25zb2xlLndhcm4oJ0RldGFpbCBlcnJvcnMnLCB2YWxpZGF0ZURldGFpbFNjaGVtYS5lcnJvcnMpO1xyXG4gICAgICB0aGlzLm1vZGFsU2VydmljZS5vcGVuKE1vZGFsVHlwZXMuTW9kYWxFcnJvckNvbXBvbmVudCwge30sIHsgZXJyb3IgfSk7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGl0ZW07XHJcbiAgfVxyXG5cclxuICBnZXROdW1iZXJJdGVtc0ZvckJhc2tldChiYXNrZXQ6IEludGVybmFsQmFza2V0PEdVX1E+ID0gbnVsbCk6IG51bWJlciB7XHJcbiAgICBiYXNrZXQgPSBiYXNrZXQgfHwgdGhpcy5maW5kQmFza2V0KHRoaXMuY3VycmVudEJhc2tldElEKTtcclxuICAgIHJldHVybiBiYXNrZXQ/LnN1YmplY3QudmFsdWUuYmFza2V0SXRlbXMubGVuZ3RoIHx8IDA7XHJcbiAgfVxyXG5cclxuICByZW1vdmVCYXNrZXQoYmFza2V0aWQ6IHN0cmluZyk6IE9ic2VydmFibGU8dW5rbm93bj4ge1xyXG4gICAgaWYgKGJhc2tldGlkKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmRlbGV0ZUJhc2tldFVwZGF0ZXIudXBkYXRlT25lKHsgaWQ6IGJhc2tldGlkIH0pLnBpcGUoXHJcbiAgICAgICAgdGFrZSgxKSxcclxuICAgICAgICBzd2l0Y2hNYXAoKGRhdGE6IGFueSk6IGFueSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmZpbmRCYXNrZXQoYmFza2V0aWQpPy5kZXN0cnVjdG9yKCk7XHJcbiAgICAgICAgICB0aGlzLmN1cnJlbnRCYXNrZXRzID0gdGhpcy5jdXJyZW50QmFza2V0cy5maWx0ZXIoXHJcbiAgICAgICAgICAgIChpbnRCYSkgPT4gaW50QmEuaWQgIT09IGJhc2tldGlkXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgdGhpcy5iYXNrZXRzLm5leHQodGhpcy5jdXJyZW50QmFza2V0cyk7XHJcbiAgICAgICAgICBpZiAoYmFza2V0aWQgPT09IHRoaXMuY3VycmVudEJhc2tldElEKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEJhc2tldElEID0gdGhpcy5jdXJyZW50QmFza2V0c1swXT8uaWQgfHwgbnVsbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBvZihkYXRhKTtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29udGludWVTZWFyY2hBbmRCb29rKFxyXG4gICAgYmFza2V0SXRlbXM6IGFueVtdLFxyXG4gICAgaXRpbmlhcnlVcmw6IHN0cmluZ1tdLFxyXG4gICAgc2VhcmNoU2VydmljZTogRW50ZXJwcmlzZVNlYXJjaFNlcnZpY2VJbnRlcmZhY2VcclxuICApOiBzdHJpbmdbXSB7XHJcbiAgICBjb25zdCBsYXRlc3RCYXNrZXRJdGVtcyA9IHRoaXMuZ2V0TGF0ZXN0QmFza2V0SXRlbUZvclR5cGVzKGJhc2tldEl0ZW1zKTtcclxuICAgIGNvbnN0IG5leHRTZWFyY2g6IFNlYXJjaE9iamVjdCA9XHJcbiAgICAgIHNlYXJjaFNlcnZpY2UuZ2V0SGlnaGVzdFNlYXJjaFByaW9yaXR5T2JqZWN0KGxhdGVzdEJhc2tldEl0ZW1zKTtcclxuICAgIGlmIChuZXh0U2VhcmNoKSB7XHJcbiAgICAgIChzZWFyY2hTZXJ2aWNlLnNlYXJjaGVzIGFzIGFueSlbXHJcbiAgICAgICAgbmV4dFNlYXJjaC50eXBlXHJcbiAgICAgIF0udXBkYXRlRnJvbVByZXZpb3VzU2VhcmNoZXMobGF0ZXN0QmFza2V0SXRlbXMpO1xyXG4gICAgICByZXR1cm4gW25leHRTZWFyY2guc2VhcmNoVXJsXTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBpdGluaWFyeVVybDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZFRyYXZlbGxlcnMoXHJcbiAgICBiYXNrZXRpZDogc3RyaW5nLFxyXG4gICAgYmFza2V0SXRlbTogQmFza2V0SXRlbSxcclxuICAgIHRyYXZlbGxlcnM6IFRyYXZlbGxlcltdLFxyXG4gICAgaW5kZXg6IG51bWJlciA9IDBcclxuICApOiB2b2lkIHtcclxuICAgIGNvbnN0IGJhc2tldCA9IHRoaXMuZmluZEJhc2tldChiYXNrZXRpZCk7XHJcbiAgICBpZiAoaW5kZXggPCB0cmF2ZWxsZXJzLmxlbmd0aCkge1xyXG4gICAgICBjb25zdCB0cmF2ZWxsZXIgPSB0cmF2ZWxsZXJzW2luZGV4XTtcclxuICAgICAgY29uc3QgcGFzc2VuZ2VyVHlwZTogUGFzc2VuZ2VyVHlwZSA9IHRyYXZlbGxlci5pc0NoaWxkXHJcbiAgICAgICAgPyBQYXNzZW5nZXJUeXBlLkNoaWxkXHJcbiAgICAgICAgOiB0cmF2ZWxsZXIuaXNJbmZhbnRcclxuICAgICAgICA/IFBhc3NlbmdlclR5cGUuSW5mYW50XHJcbiAgICAgICAgOiBQYXNzZW5nZXJUeXBlLkFkdWx0O1xyXG5cclxuICAgICAgdGhpcy5hZGRVc2VyVG9CYXNrZXRJdGVtXHJcbiAgICAgICAgLnVwZGF0ZU9uZSh7XHJcbiAgICAgICAgICBjb252ZXJ0Q3VycmVuY3lUbzogJ0dCUCcsXHJcbiAgICAgICAgICBiYXNrZXRJdGVtOiBiYXNrZXRJdGVtLmlkLFxyXG4gICAgICAgICAgdXNlcnM6IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGlkOiB0cmF2ZWxsZXIuaWQsXHJcbiAgICAgICAgICAgICAgcGFzc2VuZ2VyVHlwZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICBdLFxyXG4gICAgICAgICAgd2l0aFN1cHBsZW1lbnRhbDogZmFsc2VcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAoKSA9PiB7fSxcclxuICAgICAgICAgICgpID0+IHt9LFxyXG4gICAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmFkZFRyYXZlbGxlcnMoYmFza2V0LmlkLCBiYXNrZXRJdGVtLCB0cmF2ZWxsZXJzLCBpbmRleCArIDEpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmJhc2tldEZldGNoZXJcclxuICAgICAgICAuZmV0Y2hPbmUoeyBjb252ZXJ0Q3VycmVuY3lUbzogJ0dCUCcsIGlkOiBiYXNrZXQuaWQgfSlcclxuICAgICAgICAuc3Vic2NyaWJlKFxyXG4gICAgICAgICAgKGJhc2tldDE6IEdldFVzZXJCYXNrZXRSZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgYmFza2V0LnN1YmplY3QubmV4dCh7IC4uLmJhc2tldC5zdWJqZWN0LnZhbHVlLCAuLi5iYXNrZXQxIH0pO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIChfKSA9PiB7fSxcclxuICAgICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgYmFza2V0Lm5leHQoYmFza2V0LnN1YmplY3QudmFsdWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRMZWFkUGFzc2VuZ2VyKFxyXG4gICAgYmFza2V0aWQ6IHN0cmluZyxcclxuICAgIGJhc2tldEl0ZW06IEJhc2tldEl0ZW0sXHJcbiAgICB0cmF2ZWxsZXJzOiBUcmF2ZWxsZXIsXHJcbiAgICBpbmRleDogbnVtYmVyID0gMCxcclxuICAgIGxlYWRQYXNzZW5nZXJUeXBlOiBMZWFkUGFzc2VuZ2VyVHlwZSA9IExlYWRQYXNzZW5nZXJUeXBlLlVzZXJcclxuICApOiB2b2lkIHtcclxuICAgIGNvbnN0IGJhc2tldCA9IHRoaXMuZmluZEJhc2tldChiYXNrZXRpZCk7XHJcbiAgICBpZiAoaW5kZXggPCAxKSB7XHJcbiAgICAgIHRoaXMuU2V0QmFza2V0SXRlbUxlYWRQYXNzZW5nZXIudXBkYXRlT25lKHtcclxuICAgICAgICBjb252ZXJ0Q3VycmVuY3lUbzogJ0dCUCcsXHJcbiAgICAgICAgaWQ6IGJhc2tldEl0ZW0uaWQsXHJcbiAgICAgICAgdXNlck9yR3Vlc3Q6IHRyYXZlbGxlcnMuaWQsXHJcbiAgICAgICAgd2l0aFN1cHBsZW1lbnRhbDogZmFsc2UsXHJcbiAgICAgICAgbGVhZFBhc3NlbmdlclR5cGU6IGxlYWRQYXNzZW5nZXJUeXBlXHJcbiAgICAgIH0pLnN1YnNjcmliZShcclxuICAgICAgICAoKSA9PiB7fSxcclxuICAgICAgICAoKSA9PiB7fSxcclxuICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnNldExlYWRQYXNzZW5nZXIoYmFza2V0LmlkLCBiYXNrZXRJdGVtLCB0cmF2ZWxsZXJzLCBpbmRleCArIDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYmFza2V0RmV0Y2hlclxyXG4gICAgICAgIC5mZXRjaE9uZSh7IGNvbnZlcnRDdXJyZW5jeVRvOiAnR0JQJywgaWQ6IGJhc2tldC5pZCB9KVxyXG4gICAgICAgIC5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAoYmFza2V0MTogR2V0VXNlckJhc2tldFJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICBiYXNrZXQuc3ViamVjdC5uZXh0KHsgLi4uYmFza2V0LnN1YmplY3QudmFsdWUsIC4uLmJhc2tldDEgfSk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgKF8pID0+IHt9LFxyXG4gICAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgICBiYXNrZXQubmV4dChiYXNrZXQuc3ViamVjdC52YWx1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVwZGF0ZUJhc2tldChcclxuICAgIGJhc2tldGlkOiBzdHJpbmcsXHJcbiAgICBvYnM6IE9ic2VydmFibGU8QmFza2V0RGV0YWlscz5cclxuICApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIG9icy5waXBlKHRha2UoMSkpLnN1YnNjcmliZShcclxuICAgICAgICAoYmFza2V0OiBCYXNrZXREZXRhaWxzKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBpbnRCYXNrZXQgPSB0aGlzLmZpbmRCYXNrZXQoYmFza2V0aWQpO1xyXG4gICAgICAgICAgaW50QmFza2V0Lm5leHQoYmFza2V0KTtcclxuICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIChlcnJvcjogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgIGNvbnN0IGludEJhc2tldCA9IHRoaXMuZmluZEJhc2tldChiYXNrZXRpZCk7XHJcbiAgICAgICAgICBpbnRCYXNrZXQubmV4dChpbnRCYXNrZXQuc3ViamVjdC52YWx1ZSk7XHJcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgKCkgPT4ge31cclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcmV2YWxpZGF0ZShiYXNrZXRpZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLnVwZGF0ZUJhc2tldChcclxuICAgICAgYmFza2V0aWQsXHJcbiAgICAgIHRoaXMucmV2YWxpZGF0ZUJhc2tldFVwZGF0ZXIudXBkYXRlT25lKHtcclxuICAgICAgICBjb252ZXJ0Q3VycmVuY3lUbzogJ0dCUCcsXHJcbiAgICAgICAgaWQ6IGJhc2tldGlkXHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgc2V0QmFza2V0SXRlbU1pR3JvdXAoXHJcbiAgICBiYXNrZXRpZDogc3RyaW5nLFxyXG4gICAgYmFza2V0SXRlbWlkOiBzdHJpbmcsXHJcbiAgICBncm91cDogc3RyaW5nXHJcbiAgKTogdm9pZCB7XHJcbiAgICB0aGlzLnVwZGF0ZUJhc2tldChcclxuICAgICAgYmFza2V0aWQsXHJcbiAgICAgIHRoaXMuc2V0QmFza2V0SXRlbU1pR3JvdXBVcGRhdGVyLnVwZGF0ZU9uZSh7XHJcbiAgICAgICAgY29udmVydEN1cnJlbmN5VG86ICdHQlAnLFxyXG4gICAgICAgIGJhc2tldEl0ZW06IGJhc2tldEl0ZW1pZCxcclxuICAgICAgICBncm91cFxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGFjY2VwdE5ld1ByaWNlKGJhc2tldGlkOiBzdHJpbmcsIGl0ZW06IEJhc2tldEl0ZW0pOiB2b2lkIHtcclxuICAgIHRoaXMudXBkYXRlQmFza2V0KFxyXG4gICAgICBiYXNrZXRpZCxcclxuICAgICAgdGhpcy5hY2NlcHROZXdQcmljZVVwZGF0ZXIudXBkYXRlT25lKHtcclxuICAgICAgICBjb252ZXJ0Q3VycmVuY3lUbzogJ0dCUCcsXHJcbiAgICAgICAgaWQ6IGl0ZW0uaWRcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICB2YWxpZGF0ZUZyZWVWYWxlTWkoXHJcbiAgICBtaUl0ZW06IE1hbmFnZW1lbnRJbmZvLFxyXG4gICAgZnJlZVZhbHVlOiBzdHJpbmdcclxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGVNaUZyZWVWYWx1ZVxyXG4gICAgICAgIC50ZXN0KHsgbWk6IG1pSXRlbS5pZCwgZnJlZVZhbHVlIH0pXHJcbiAgICAgICAgLnN1YnNjcmliZShyZXNvbHZlLCByZWplY3QpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZXRNaUZyZWVWYWx1ZShcclxuICAgIGJhc2tldGlkOiBzdHJpbmcsXHJcbiAgICBtaUl0ZW06IE1hbmFnZW1lbnRJbmZvLFxyXG4gICAgZnJlZVZhbHVlOiBzdHJpbmcsXHJcbiAgICB1c2VySWQ6IHN0cmluZyA9IG51bGwsXHJcbiAgICBndWVzdD86IGJvb2xlYW5cclxuICApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IGludEJhc2tldCA9IHRoaXMuZmluZEJhc2tldChiYXNrZXRpZCk7XHJcbiAgICBjb25zdCBhcmdzOiBTZXRCYXNrZXRJdGVtTWlWYWx1ZS5WYXJpYWJsZXMgPSB7XHJcbiAgICAgIGNvbnZlcnRDdXJyZW5jeVRvOiAnR0JQJyxcclxuICAgICAgbWk6IG1pSXRlbS5pZCxcclxuICAgICAgbWlGcmVlVmFsdWU6IGZyZWVWYWx1ZVxyXG4gICAgfTtcclxuICAgIGlmICghIXVzZXJJZCkge1xyXG4gICAgICBpZiAoZ3Vlc3QpIHtcclxuICAgICAgICBhcmdzLmd1ZXN0ID0gdXNlcklkO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGFyZ3MudXNlciA9IHVzZXJJZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgdGhpcy5zZXRCYXNrZXRJdGVtTWlWYWx1ZVVwZGF0ZXJcclxuICAgICAgICAudXBkYXRlT25lKGFyZ3MpXHJcbiAgICAgICAgLnBpcGUodGFrZSgxKSlcclxuICAgICAgICAuc3Vic2NyaWJlKFxyXG4gICAgICAgICAgKGJhc2tldDogQmFza2V0RGV0YWlscykgPT4ge1xyXG4gICAgICAgICAgICBpbnRCYXNrZXQubmV4dChiYXNrZXQpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgaW50QmFza2V0Lm5leHQoaW50QmFza2V0LnN1YmplY3QudmFsdWUpO1xyXG4gICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0TWlTZWxlY3RlZFZhbHVlKFxyXG4gICAgYmFza2V0aWQ6IHN0cmluZyxcclxuICAgIG1pSXRlbTogTWFuYWdlbWVudEluZm8sXHJcbiAgICBzZWxlY3RlZFZhbHVlOiBzdHJpbmcsXHJcbiAgICB1c2VySWQ6IHN0cmluZyA9IG51bGwsXHJcbiAgICBndWVzdD86IGJvb2xlYW5cclxuICApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IGFyZ3M6IFNldEJhc2tldEl0ZW1NaVZhbHVlLlZhcmlhYmxlcyA9IHtcclxuICAgICAgY29udmVydEN1cnJlbmN5VG86ICdHQlAnLFxyXG4gICAgICBtaTogbWlJdGVtLmlkLFxyXG4gICAgICBtaVZhbHVlOiBzZWxlY3RlZFZhbHVlXHJcbiAgICB9O1xyXG4gICAgaWYgKCEhdXNlcklkKSB7XHJcbiAgICAgIGlmIChndWVzdCkge1xyXG4gICAgICAgIGFyZ3MuZ3Vlc3QgPSB1c2VySWQ7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgYXJncy51c2VyID0gdXNlcklkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy51cGRhdGVCYXNrZXQoXHJcbiAgICAgIGJhc2tldGlkLFxyXG4gICAgICB0aGlzLnNldEJhc2tldEl0ZW1NaVZhbHVlVXBkYXRlci51cGRhdGVPbmUoYXJncylcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBnZXRNaUF1dG9TdWdlc3Rpb25zKFxyXG4gICAgbWlJZDogc3RyaW5nLFxyXG4gICAgdGVybTogc3RyaW5nLFxyXG4gICAgaXNMb2FkaW5nOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj5cclxuICApOiBPYnNlcnZhYmxlPEdldE1pQXV0b1N1Z2VzdGlvbkFycmF5PiB7XHJcbiAgICBpc0xvYWRpbmc/Lm5leHQodHJ1ZSk7XHJcblxyXG4gICAgY29uc3QgZ2V0TWlBdXRvQnlWYWx1ZTogT2JzZXJ2YWJsZTxHZXRNaUF1dG9TdWdlc3Rpb25BcnJheT4gPSB0aGlzLmdldE1pQXV0b1N1Z2VzdGlvbkZldGNoZXIuZmV0Y2hMaXN0KHsgbWk6IG1pSWQsIHBhcnRpYWxWYWx1ZTogdGVybSB9KTtcclxuICAgIGNvbnN0IGdldE1pQXV0b0J5TGFiZWw6IE9ic2VydmFibGU8R2V0TWlBdXRvU3VnZXN0aW9uQXJyYXk+ID0gdGhpcy5nZXRNaUF1dG9TdWdlc3Rpb25GZXRjaGVyLmZldGNoTGlzdCh7IG1pOiBtaUlkLCBwYXJ0aWFsTGFiZWw6IHRlcm0gfSk7XHJcblxyXG4gICAgcmV0dXJuIGZvcmtKb2luKFtnZXRNaUF1dG9CeVZhbHVlLCBnZXRNaUF1dG9CeUxhYmVsXSkucGlwZShcclxuICAgICAgbWFwKChbbWlCeVZhbHVlLCBtaUJ5TGFiZWxdKSA9PiB7XHJcbiAgICAgICAgbGV0IG1pQnlWYWx1ZUxhYmVsID0gWy4uLm1pQnlWYWx1ZSwgLi4ubWlCeUxhYmVsXTtcclxuICAgICAgICBtaUJ5VmFsdWVMYWJlbCA9IG1pQnlWYWx1ZUxhYmVsLmZpbHRlcigobWlJdGVtLCBpbmRleCkgPT4gbWlCeVZhbHVlTGFiZWwuZmluZEluZGV4KGl0ZW0gPT4gaXRlbS5pZCA9PSBtaUl0ZW0uaWQpID09PSBpbmRleCk7XHJcbiAgICAgICAgY29uc29sZS5sb2cobWlCeVZhbHVlTGFiZWwpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlzTG9hZGluZz8ubmV4dChmYWxzZSk7XHJcbiAgICAgICByZXR1cm4gbWlCeVZhbHVlTGFiZWxcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBnZXRVc2VyRGVmYXVsdE1JVmFsdWUoXHJcbiAgICBtaTogc3RyaW5nLFxyXG4gICAgdXNlcjogc3RyaW5nLFxyXG4gICAgaXNMb2FkaW5nOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj5cclxuICApOiBPYnNlcnZhYmxlPE1hbmFnZW1lbnRJbmZvVmFsdWVSZXN1bHQ+IHtcclxuICAgIGlzTG9hZGluZz8ubmV4dCh0cnVlKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5nZXRVc2VyRGVmYXVsdE1JVmFsdWVGZXRjaGVyXHJcbiAgICAgIC5mZXRjaE9uZSh7IG1pOiBtaSwgdXNlcjogdXNlciB9KS5waXBlKHRha2UoMSkpO1xyXG4gIH1cclxuXHJcbiAgc2F2ZU1pRGF0YShiYXNrZXRJZDogc3RyaW5nLCBibWlBcnJheTogQmFza2V0SXRlbU1hbmFnZW1lbnRJbmZvW10pIHtcclxuICAgIGJtaUFycmF5LmZvckVhY2goKGJtaTogQmFza2V0SXRlbU1hbmFnZW1lbnRJbmZvKSA9PiB7XHJcbiAgICAgIGJtaS5taVBlckl0ZW0uZm9yRWFjaCgoaXRlbTogTWFuYWdlbWVudEluZm9BbmRJc1ZhbGlkKSA9PiB7XHJcbiAgICAgICAgaXRlbS5zYXZlKGJhc2tldElkLCBudWxsKTtcclxuICAgICAgfSk7XHJcbiAgICAgIGJtaS51c2Vycy5mb3JFYWNoKCh1c2VyOiBzdHJpbmcpID0+IHtcclxuICAgICAgICBibWkubWlQZXJVc2VyW3VzZXJdLm1hbmFnZW1lbnRJbmZvLmZvckVhY2goXHJcbiAgICAgICAgICAoaXRlbTogTWFuYWdlbWVudEluZm9BbmRJc1ZhbGlkKSA9PiB7XHJcbiAgICAgICAgICAgIGl0ZW0uc2F2ZShiYXNrZXRJZCwgdXNlcik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgICAgfSk7XHJcbiAgICAgIGJtaS5ndWVzdHMuZm9yRWFjaCgodXNlcjogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgYm1pLm1pUGVyR3Vlc3RbdXNlcl0ubWFuYWdlbWVudEluZm8uZm9yRWFjaChcclxuICAgICAgICAgIChpdGVtOiBNYW5hZ2VtZW50SW5mb0FuZElzVmFsaWQpID0+IHtcclxuICAgICAgICAgICAgaXRlbS5zYXZlKGJhc2tldElkLCB1c2VyLCB0cnVlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2VuZEJhc2tldEZvckFwcHJvdmFsKGJhc2tldGlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiB0aGlzLnVwZGF0ZUJhc2tldChcclxuICAgICAgYmFza2V0aWQsXHJcbiAgICAgIHRoaXMuc2VuZEJhc2tldEZvckFwcHJvdmFsVXBkYXRlclxyXG4gICAgICAgIC51cGRhdGVPbmUoeyBjb252ZXJ0Q3VycmVuY3lUbzogJ0dCUCcsIGJhc2tldDogYmFza2V0aWQgfSlcclxuICAgICAgICAucGlwZSh0YWtlKDEpKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHNldEJhc2tldEl0ZW1QYXltZW50T3B0aW9uKFxyXG4gICAgYmFza2V0OiBCYXNrZXREZXRhaWxzLFxyXG4gICAgYmFza2V0SXRlbTogQmFza2V0SXRlbSxcclxuICAgIHBheW1lbnRNZXRob2Q6IHN0cmluZ1xyXG4gICk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIHRoaXMudXBkYXRlQmFza2V0KFxyXG4gICAgICBiYXNrZXQuaWQsXHJcbiAgICAgIHRoaXMuc2V0UGF5bWVudE1ldGhvZFVwZGF0ZXIudXBkYXRlT25lKHtcclxuICAgICAgICBjb252ZXJ0Q3VycmVuY3lUbzogJ0dCUCcsXHJcbiAgICAgICAgYmFza2V0SXRlbTogYmFza2V0SXRlbS5pZCxcclxuICAgICAgICBwYXltZW50TWV0aG9kXHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgYm9va0Jhc2tldChcclxuICAgIGJhc2tldGlkOiBzdHJpbmcsXHJcbiAgICBzdXBwbGVtZW50YXJ5SW5mbzogU3VwcGxlbWVudGFyeUJvb2tpbmdJbmZvW11cclxuICApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiB0aGlzLnVwZGF0ZUJhc2tldChcclxuICAgICAgYmFza2V0aWQsXHJcbiAgICAgIHRoaXMuYm9va0Jhc2tldFVwZGF0ZXIudXBkYXRlT25lKHtcclxuICAgICAgICBjb252ZXJ0Q3VycmVuY3lUbzogJ0dCUCcsXHJcbiAgICAgICAgaWQ6IGJhc2tldGlkLFxyXG4gICAgICAgIHN1cHBsZW1lbnRhcnlJbmZvXHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgbW92ZUJhc2tldEl0ZW0oXHJcbiAgICBvcmlnaW5hbEJhc2tldElkOiBzdHJpbmcsXHJcbiAgICBiYXNrZXRJdGVtOiBCYXNrZXRJdGVtLFxyXG4gICAgYmFza2V0SWRUb01vdmVUbzogc3RyaW5nXHJcbiAgKTogdm9pZCB7XHJcbiAgICB0aGlzLm1vdmVJdGVtVG9BRGlmZmVyZW50QmFza2V0XHJcbiAgICAgIC51cGRhdGVPbmUoe1xyXG4gICAgICAgIGNvbnZlcnRDdXJyZW5jeVRvOiAnR0JQJyxcclxuICAgICAgICBiYXNrZXRJdGVtOiBiYXNrZXRJdGVtLmlkLFxyXG4gICAgICAgIG5ld0Jhc2tldDogYmFza2V0SWRUb01vdmVUb1xyXG4gICAgICB9KVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB0aGlzLmxvYWRCYXNrZXQob3JpZ2luYWxCYXNrZXRJZCk7XHJcbiAgICAgICAgdGhpcy5sb2FkQmFza2V0KGJhc2tldElkVG9Nb3ZlVG8pO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZUJhc2tldE5vdGVzKGJhc2tldElkOiBzdHJpbmcsIG5vdGVzOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMudXBkYXRlQmFza2V0KFxyXG4gICAgICBiYXNrZXRJZCxcclxuICAgICAgdGhpcy51cGRhdGVCYXNrZXROb3Rlc1VwZGF0ZXIudXBkYXRlT25lKHtcclxuICAgICAgICBjb252ZXJ0Q3VycmVuY3lUbzogJ0dCUCcsXHJcbiAgICAgICAgaWQ6IGJhc2tldElkLFxyXG4gICAgICAgIG5vdGVzXHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlQmFza2V0VGl0bGUoYmFza2V0SWQ6IHN0cmluZywgdGl0bGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy51cGRhdGVCYXNrZXQoXHJcbiAgICAgIGJhc2tldElkLFxyXG4gICAgICB0aGlzLnVwZGF0ZUJhc2tldFRpdGxlVXBkYXRlci51cGRhdGVPbmUoe1xyXG4gICAgICAgIGNvbnZlcnRDdXJyZW5jeVRvOiAnR0JQJyxcclxuICAgICAgICBpZDogYmFza2V0SWQsXHJcbiAgICAgICAgbmV3VGl0bGU6IHRpdGxlXHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuICBnZXRCYXNrZXQocXVlcnk6IHtcclxuICAgIGNvbnZlcnRDdXJyZW5jeVRvOiAnR0JQJztcclxuICAgIGlkOiBzdHJpbmc7XHJcbiAgICB3aXRoU3VwcGxlbWVudGFsOiB0cnVlO1xyXG4gIH0pOiBPYnNlcnZhYmxlPEdldFVzZXJCYXNrZXRSZXN1bHQ+IHtcclxuICAgIHJldHVybiB0aGlzLmJhc2tldEZldGNoZXIuZmV0Y2hPbmUocXVlcnkpO1xyXG4gIH1cclxuXHJcbiAgYXRMZWFzdE9uZVNlYXJjaENob3NlbigpOiBib29sZWFuIHtcclxuICAgIC8vIGlmIHdlIGhhdmUgYW55IGl0ZW0gb24gYW55IGJhc2tldCB3ZSBzaG93IGJhc2tldHMgaW4gc2VhcmNoIHNjcmVlblxyXG4gICAgcmV0dXJuICEhdGhpcy5jdXJyZW50QmFza2V0cy5maWx0ZXIoXHJcbiAgICAgIChiYXNrZXQpID0+IGJhc2tldC5zdWJqZWN0LnZhbHVlLmJhc2tldEl0ZW1zLmxlbmd0aFxyXG4gICAgKS5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0QmFza2V0U3RhdHMoaW5kZXg6IG51bWJlcik6IEJlaGF2aW9yU3ViamVjdDxCYXNrZXRQcmljZXM+IHtcclxuICAgIGNvbnN0IGJhc2tldFByaWNlc09iaiA9XHJcbiAgICAgIHRoaXMuYmFza2V0cy52YWx1ZVtpbmRleF0/LnN1YmplY3Q/LnZhbHVlPy5wcmljZXMgfHwge307XHJcbiAgICBjb25zdCBiYXNrZXRQcmljZXNLZXkgPSBPYmplY3Qua2V5cyhiYXNrZXRQcmljZXNPYmopWzBdO1xyXG4gICAgaWYgKGJhc2tldFByaWNlc0tleSkge1xyXG4gICAgICB0aGlzLmJhc2tldFByaWNlcy52YWx1ZS5jdXJyZW5jeSA9IGJhc2tldFByaWNlc0tleTtcclxuICAgICAgdGhpcy5iYXNrZXRQcmljZXMudmFsdWUudG90YWwgPVxyXG4gICAgICAgIHRoaXMuYmFza2V0cy52YWx1ZVtpbmRleF0uc3ViamVjdC52YWx1ZS5wcmljZXNbYmFza2V0UHJpY2VzS2V5XTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYmFza2V0UHJpY2VzLnZhbHVlLnRvdGFsID0gMDtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmJhc2tldFByaWNlcy52YWx1ZS5saXN0LmZvckVhY2goKGtleXMpID0+IHtcclxuICAgICAga2V5cy5wcmljZSA9IHRoaXMuYmFza2V0cy52YWx1ZVtpbmRleF0/LnN1YmplY3Q/LnZhbHVlPy5iYXNrZXRJdGVtc1xyXG4gICAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uc2VydmljZS50eXBlID09PSBrZXlzLnR5cGUpXHJcbiAgICAgICAgLnJlZHVjZSgoc3VtLCBjdXJyZW50KSA9PiBzdW0gKyBjdXJyZW50LnByaWNlLCAwKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHRoaXMuYmFza2V0UHJpY2VzO1xyXG4gIH1cclxuXHJcbiAgY2FuQ2FuY2VsKGJhc2tldEl0ZW06IEJhc2tldEl0ZW0pOiBPYnNlcnZhYmxlPEJlZm9yZUNhbmNlbGxhdGlvbkluZm8+IHtcclxuICAgIHJldHVybiB0aGlzLmdldENhbmNlbGxhdGlvbkluZm9GZXRjaGVyLmZldGNoT25lKHtcclxuICAgICAgYmFza2V0SXRlbTogYmFza2V0SXRlbS5pZFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVCb29rZWRCYXNrZXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmN1cnJlbnRCYXNrZXRzID0gdGhpcy5jdXJyZW50QmFza2V0cy5yZWR1Y2UoKGFjYywgYmFza2V0KSA9PiB7XHJcbiAgICAgIGlmIChiYXNrZXQuc3ViamVjdC52YWx1ZS5zdGF0dXMgIT09IEJhc2tldFN0YXR1cy5Cb29rZWQpIHtcclxuICAgICAgICBhY2MucHVzaChiYXNrZXQpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBhY2M7XHJcbiAgICB9LCBbXSk7XHJcbiAgICB0aGlzLmJhc2tldHMubmV4dCh0aGlzLmN1cnJlbnRCYXNrZXRzKTtcclxuICB9XHJcbn1cclxuXHJcbmludGVyZmFjZSBEZXRhaWxTY2hlbWFQcm9wZXJ0aWVzIHtcclxuICB0eXBlPzogJ3N0cmluZycgfCAnbnVtYmVyJyB8ICdpbnRlZ2VyJyB8ICdhcnJheSc7XHJcbiAgJHJlZj86IHN0cmluZztcclxuICBmb3JtYXQ/OiBzdHJpbmc7XHJcbn1cclxuIl19