@sabstravtech/obtservices 0.0.22041208 → 0.0.22050309
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/angular/fetchers.d.ts +5 -0
- package/angular/lib/vendor/fetchers/email-basket.fetcher.d.ts +7 -0
- package/angular/lib/vendor/fetchers/fast-track-quote.fetcher.d.ts +7 -0
- package/angular/lib/vendor/fetchers/get-all-airlines.fetcher.d.ts +7 -0
- package/angular/lib/vendor/fetchers/get-car-hire-providers.fetcher.d.ts +7 -0
- package/angular/lib/vendor/fetchers/get-hotel-chains.fetcher.d.ts +7 -0
- package/angular/lib/vendor/fetchers/get-rail-providers.fetcher.d.ts +7 -0
- package/angular/lib/vendor/fetchers/send-offline-notification.fetcher.d.ts +7 -0
- package/angular/lib/vendor/services/search.service.d.ts +10 -3
- package/angular/lib/vendor/services/user.service.d.ts +6 -3
- package/angular/lib/vendor/types/graphql.angular.types.d.ts +852 -13
- package/angular/lib/vendor/updaters/edit-user.updater.d.ts +6 -0
- package/angular/lib/vendor/updaters/set-user-language-updater.d.ts +6 -0
- package/angular/sabstravtech-obtservices-angular.d.ts +17 -13
- package/angular/sabstravtech-obtservices-angular.metadata.json +1 -1
- package/base/fetchers.d.ts +7 -0
- package/base/lib/vendor/classes/eurostar-enterprise-search.d.ts +8 -2
- package/base/lib/vendor/classes/fast-track-enterprise-search.d.ts +52 -0
- package/base/lib/vendor/classes/hotel-enterprise-search.d.ts +2 -1
- package/base/lib/vendor/classes/irl-enterprise-search.d.ts +7 -1
- package/base/lib/vendor/classes/modal-types.enum.d.ts +2 -0
- package/base/lib/vendor/classes/rail-enterprise-search.d.ts +2 -0
- package/base/lib/vendor/classes/supplementary-booking-info-impl.d.ts +1 -1
- package/base/lib/vendor/classes/user-favourite.enum.d.ts +1 -0
- package/base/lib/vendor/fetchers/email-basket.fetcher.d.ts +20 -0
- package/base/lib/vendor/fetchers/fast-track-quote.fetcher.d.ts +23 -0
- package/base/lib/vendor/fetchers/get-all-airlines.fetcher.d.ts +20 -0
- package/base/lib/vendor/fetchers/get-car-hire-providers.fetcher.d.ts +20 -0
- package/base/lib/vendor/fetchers/get-hotel-chains.fetcher.d.ts +20 -0
- package/base/lib/vendor/fetchers/get-rail-providers.fetcher.d.ts +20 -0
- package/base/lib/vendor/fetchers/send-offline-notification.fetcher.d.ts +21 -0
- package/base/lib/vendor/fetchers/user-fetcher.d.ts +2 -3
- package/base/lib/vendor/interfaces/Ieurostar-enterprise-search.d.ts +2 -0
- package/base/lib/vendor/interfaces/Ifast-track-enterprise-search.d.ts +22 -0
- package/base/lib/vendor/interfaces/Ihotel-enterprise-search.d.ts +1 -1
- package/base/lib/vendor/interfaces/Iirl-enterprise-search.d.ts +3 -0
- package/base/lib/vendor/interfaces/Isearch.service.d.ts +10 -4
- package/base/lib/vendor/interfaces/Isupplementary-booking-info-impl.d.ts +1 -1
- package/base/lib/vendor/interfaces/eurostar-search-arg.interface.d.ts +2 -0
- package/base/lib/vendor/interfaces/user.data.d.ts +1 -0
- package/base/lib/vendor/models/traveller.object.d.ts +1 -0
- package/base/lib/vendor/services/search.service.d.ts +31 -6
- package/base/lib/vendor/services/url.service.d.ts +2 -1
- package/base/lib/vendor/services/user.service.d.ts +17 -4
- package/base/lib/vendor/types/graphql.types.d.ts +812 -13
- package/base/lib/vendor/types/types.d.ts +27 -3
- package/base/lib/vendor/updaters/edit-user-updater.d.ts +19 -0
- package/base/lib/vendor/updaters/set-user-language-updater.d.ts +19 -0
- package/base/sabstravtech-obtservices-base.d.ts +5 -5
- package/base/sabstravtech-obtservices-base.metadata.json +1 -1
- package/base/updaters.d.ts +2 -0
- package/bundles/sabstravtech-obtservices-angular.umd.js +461 -97
- package/bundles/sabstravtech-obtservices-angular.umd.js.map +1 -1
- package/bundles/sabstravtech-obtservices-angular.umd.min.js +1 -1
- package/bundles/sabstravtech-obtservices-angular.umd.min.js.map +1 -1
- package/bundles/sabstravtech-obtservices-base.umd.js +916 -99
- package/bundles/sabstravtech-obtservices-base.umd.js.map +1 -1
- package/bundles/sabstravtech-obtservices-base.umd.min.js +2 -2
- package/bundles/sabstravtech-obtservices-base.umd.min.js.map +1 -1
- package/esm2015/angular/fetchers.js +6 -1
- package/esm2015/angular/lib/vendor/fetchers/email-basket.fetcher.js +25 -0
- package/esm2015/angular/lib/vendor/fetchers/fast-track-quote.fetcher.js +25 -0
- package/esm2015/angular/lib/vendor/fetchers/get-all-airlines.fetcher.js +25 -0
- package/esm2015/angular/lib/vendor/fetchers/get-car-hire-providers.fetcher.js +25 -0
- package/esm2015/angular/lib/vendor/fetchers/get-hotel-chains.fetcher.js +25 -0
- package/esm2015/angular/lib/vendor/fetchers/get-rail-providers.fetcher.js +25 -0
- package/esm2015/angular/lib/vendor/fetchers/send-offline-notification.fetcher.js +25 -0
- package/esm2015/angular/lib/vendor/services/search.service.js +57 -36
- package/esm2015/angular/lib/vendor/services/user.service.js +19 -10
- package/esm2015/angular/lib/vendor/types/graphql.angular.types.js +1619 -92
- package/esm2015/angular/lib/vendor/updaters/edit-user.updater.js +22 -0
- package/esm2015/angular/lib/vendor/updaters/set-user-language-updater.js +22 -0
- package/esm2015/angular/sabstravtech-obtservices-angular.js +18 -14
- package/esm2015/base/fetchers.js +8 -1
- package/esm2015/base/lib/vendor/classes/carhire-enterprise-search.js +37 -12
- package/esm2015/base/lib/vendor/classes/eurostar-enterprise-search.js +62 -13
- package/esm2015/base/lib/vendor/classes/fast-track-enterprise-search.js +229 -0
- package/esm2015/base/lib/vendor/classes/flight-enterprise-search.js +6 -1
- package/esm2015/base/lib/vendor/classes/hotel-enterprise-search.js +42 -10
- package/esm2015/base/lib/vendor/classes/irl-enterprise-search.js +18 -3
- package/esm2015/base/lib/vendor/classes/lounges-enterprise-search.js +10 -2
- package/esm2015/base/lib/vendor/classes/modal-types.enum.js +3 -1
- package/esm2015/base/lib/vendor/classes/parking-enterprise-search.js +12 -2
- package/esm2015/base/lib/vendor/classes/rail-enterprise-search.js +35 -19
- package/esm2015/base/lib/vendor/classes/supplementary-booking-info-impl.js +3 -3
- package/esm2015/base/lib/vendor/classes/user-favourite.enum.js +2 -1
- package/esm2015/base/lib/vendor/data/euro-stations.json +8 -0
- package/esm2015/base/lib/vendor/fetchers/email-basket.fetcher.js +11 -0
- package/esm2015/base/lib/vendor/fetchers/fast-track-quote.fetcher.js +11 -0
- package/esm2015/base/lib/vendor/fetchers/get-all-airlines.fetcher.js +11 -0
- package/esm2015/base/lib/vendor/fetchers/get-car-hire-providers.fetcher.js +11 -0
- package/esm2015/base/lib/vendor/fetchers/get-hotel-chains.fetcher.js +11 -0
- package/esm2015/base/lib/vendor/fetchers/get-rail-providers.fetcher.js +11 -0
- package/esm2015/base/lib/vendor/fetchers/send-offline-notification.fetcher.js +11 -0
- package/esm2015/base/lib/vendor/fetchers/user-fetcher.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/Ieurostar-enterprise-search.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/Ifast-track-enterprise-search.js +2 -0
- package/esm2015/base/lib/vendor/interfaces/Ihotel-enterprise-search.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/Iirl-enterprise-search.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/Isearch.service.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/Isupplementary-booking-info-impl.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/eurostar-search-arg.interface.js +1 -1
- package/esm2015/base/lib/vendor/interfaces/user.data.js +1 -1
- package/esm2015/base/lib/vendor/models/traveller.object.js +3 -2
- package/esm2015/base/lib/vendor/services/hotel-avallibility.service.js +2 -1
- package/esm2015/base/lib/vendor/services/search.service.js +163 -18
- package/esm2015/base/lib/vendor/services/url.service.js +2 -1
- package/esm2015/base/lib/vendor/services/user.service.js +37 -3
- package/esm2015/base/lib/vendor/types/graphql.types.js +11 -1
- package/esm2015/base/lib/vendor/types/types.js +65 -3
- package/esm2015/base/lib/vendor/updaters/edit-user-updater.js +11 -0
- package/esm2015/base/lib/vendor/updaters/set-user-language-updater.js +11 -0
- package/esm2015/base/sabstravtech-obtservices-base.js +6 -5
- package/esm2015/base/updaters.js +3 -1
- package/fesm2015/sabstravtech-obtservices-angular.js +1705 -26
- package/fesm2015/sabstravtech-obtservices-angular.js.map +1 -1
- package/fesm2015/sabstravtech-obtservices-base.js +815 -80
- package/fesm2015/sabstravtech-obtservices-base.js.map +1 -1
- package/package.json +1 -1
|
@@ -2,7 +2,7 @@ import { __awaiter } from "tslib";
|
|
|
2
2
|
import { map, take, tap } from 'rxjs/operators';
|
|
3
3
|
import moment from 'moment';
|
|
4
4
|
import Countries from '../data/countries.json';
|
|
5
|
-
import { BehaviorSubject, forkJoin, of } from 'rxjs';
|
|
5
|
+
import { BehaviorSubject, forkJoin, of, Subscription } from 'rxjs';
|
|
6
6
|
import { ParkingEnterpriseSearch } from '../classes/parking-enterprise-search';
|
|
7
7
|
import { BookerType, FareType, RailClass, RailSearchJourneyType, ServiceType, CabHireVehicleType, FlightCabinClass, IrlJourneyType } from '../types/graphql.types';
|
|
8
8
|
import { LoungesEnterpriseSearch } from '../classes/lounges-enterprise-search';
|
|
@@ -12,7 +12,7 @@ import { FlightEnterpriseSearch, TimeWindow } from '../classes/flight-enterprise
|
|
|
12
12
|
import { CabHireEnterpriseSearch } from '../classes/cabhire-enterprise-search';
|
|
13
13
|
import { RailEnterpriseSearch, RailSearchCriteria } from '../classes/rail-enterprise-search';
|
|
14
14
|
import { TravellerObject } from '../models/traveller.object';
|
|
15
|
-
import { LocationTypes } from '../types/types';
|
|
15
|
+
import { LocationTypes, ServiceProvider } from '../types/types';
|
|
16
16
|
import { RegExps } from '../models/regexp.model';
|
|
17
17
|
import { TaxiFormMode } from '../interfaces/Icabhire-enterprise-search';
|
|
18
18
|
import { IRLEnterpriseSearch } from '../classes/irl-enterprise-search';
|
|
@@ -20,6 +20,8 @@ import { EurostarEnterpriseSearch } from '../classes/eurostar-enterprise-search'
|
|
|
20
20
|
import EuroStations from '../data/euro-stations.json';
|
|
21
21
|
import _ from 'lodash';
|
|
22
22
|
import { EurostarSearchType } from '../classes/eurostar-search-type.enum';
|
|
23
|
+
import { FastTrackEnterpriseSearch } from '../classes/fast-track-enterprise-search';
|
|
24
|
+
import { ModalTypes } from '../classes/modal-types.enum';
|
|
23
25
|
export const MAX_TRAVELLERS = 8;
|
|
24
26
|
export var TravellerSearchTypes;
|
|
25
27
|
(function (TravellerSearchTypes) {
|
|
@@ -28,7 +30,7 @@ export var TravellerSearchTypes;
|
|
|
28
30
|
TravellerSearchTypes["employeeNumber"] = "employeeNumber";
|
|
29
31
|
})(TravellerSearchTypes || (TravellerSearchTypes = {}));
|
|
30
32
|
export class BaseEnterpriseSearchService {
|
|
31
|
-
constructor(searchAirportsFetcher, searchAirlinesFetcher, storageService, userService, modalService, router, helpers, hotelAvalibilityService, citiesFetcher, confermaCitiesFetcher, postcodeFetcher, railStationFetcher, saveUserAddressUpdater, userAddressesFetcher, basketService, getUserCompanyOfficesFetcher, searchHotelChainsFetcher, getConfermaRoomImagesFetcher, baseValidateIsPostcodeValidTester, depotFetcher, confermaOfficeNamesFetcher, confermaOfficeFetcher, baseDeleteUserAddressUpdater, baseDeleteRecentSearchUpdater, baseSaveRecentSearchUpdater, getUserCurrentCarbonAllowanceFetcher, baseSaveFavouriteSearchUpdater, environment, loungeFetcher, parkingFetcher, httpCallService, flightFetcher, hotelFetcher, carhireFetcher, carHireAvailabilityDetailFetcher, cabhireFetcher, railFetcher, irlFetcher, getRailStationFetcher, baseWebTokenService, riskAlertsFetcher, quicklistFetcher, getUserRecentSearchesFetcher, getRailCardsFetcher, getCovidMicrositeTokenFetcher, eurostarFetcher, searchUsersCanBookForFetcher, searchIrlStationsFetcher, irlDiscountCardsFetcher, getFlightFareRulesFetcher, getFlightSeatMapFetcher, getRailLiveDeparturesFetcher, applyHotelRulesFetcher, applyFlightRules, getUserFavouriteSearchesFetcher, deleteFavouriteSearchUpdater) {
|
|
33
|
+
constructor(searchAirportsFetcher, searchAirlinesFetcher, storageService, userService, modalService, router, helpers, hotelAvalibilityService, citiesFetcher, confermaCitiesFetcher, postcodeFetcher, railStationFetcher, saveUserAddressUpdater, userAddressesFetcher, basketService, getUserCompanyOfficesFetcher, searchHotelChainsFetcher, getConfermaRoomImagesFetcher, baseValidateIsPostcodeValidTester, depotFetcher, confermaOfficeNamesFetcher, confermaOfficeFetcher, baseDeleteUserAddressUpdater, baseDeleteRecentSearchUpdater, baseSaveRecentSearchUpdater, getUserCurrentCarbonAllowanceFetcher, baseSaveFavouriteSearchUpdater, environment, loungeFetcher, parkingFetcher, httpCallService, flightFetcher, hotelFetcher, carhireFetcher, carHireAvailabilityDetailFetcher, cabhireFetcher, railFetcher, irlFetcher, getRailStationFetcher, baseWebTokenService, riskAlertsFetcher, quicklistFetcher, getUserRecentSearchesFetcher, getRailCardsFetcher, getCovidMicrositeTokenFetcher, eurostarFetcher, searchUsersCanBookForFetcher, searchIrlStationsFetcher, irlDiscountCardsFetcher, getFlightFareRulesFetcher, getFlightSeatMapFetcher, getRailLiveDeparturesFetcher, applyHotelRulesFetcher, applyFlightRules, getUserFavouriteSearchesFetcher, deleteFavouriteSearchUpdater, emailBasketFetcher, fasttrackFetcher, sendOfflineNotificationFetcher, getHotelChainsFetcher, getRailProvidersFetcher, getAllAirlinesFetcher, getCarHireProvidersFetcher) {
|
|
32
34
|
this.searchAirportsFetcher = searchAirportsFetcher;
|
|
33
35
|
this.searchAirlinesFetcher = searchAirlinesFetcher;
|
|
34
36
|
this.storageService = storageService;
|
|
@@ -69,6 +71,12 @@ export class BaseEnterpriseSearchService {
|
|
|
69
71
|
this.getRailLiveDeparturesFetcher = getRailLiveDeparturesFetcher;
|
|
70
72
|
this.getUserFavouriteSearchesFetcher = getUserFavouriteSearchesFetcher;
|
|
71
73
|
this.deleteFavouriteSearchUpdater = deleteFavouriteSearchUpdater;
|
|
74
|
+
this.emailBasketFetcher = emailBasketFetcher;
|
|
75
|
+
this.sendOfflineNotificationFetcher = sendOfflineNotificationFetcher;
|
|
76
|
+
this.getHotelChainsFetcher = getHotelChainsFetcher;
|
|
77
|
+
this.getRailProvidersFetcher = getRailProvidersFetcher;
|
|
78
|
+
this.getAllAirlinesFetcher = getAllAirlinesFetcher;
|
|
79
|
+
this.getCarHireProvidersFetcher = getCarHireProvidersFetcher;
|
|
72
80
|
this.traveller_error = false;
|
|
73
81
|
this.travellerInformation = new BehaviorSubject([]);
|
|
74
82
|
this.errors = new BehaviorSubject([]);
|
|
@@ -81,6 +89,8 @@ export class BaseEnterpriseSearchService {
|
|
|
81
89
|
this.travellerValidationMessages = [];
|
|
82
90
|
this.search_loading = false;
|
|
83
91
|
this.search_airport_loading = false;
|
|
92
|
+
this.allSubscription = new Subscription();
|
|
93
|
+
this.searchesSubscription = new Subscription();
|
|
84
94
|
this.selectedTravellers = [];
|
|
85
95
|
this.selectedPlaces = [];
|
|
86
96
|
this.countries = Countries;
|
|
@@ -94,10 +104,10 @@ export class BaseEnterpriseSearchService {
|
|
|
94
104
|
[ServiceType.Car]: new CarhireEnterpriseSearch(carhireFetcher, carHireAvailabilityDetailFetcher, helpers, basketService, storageService, this),
|
|
95
105
|
[ServiceType.Cab]: new CabHireEnterpriseSearch(cabhireFetcher, helpers, storageService, this, basketService),
|
|
96
106
|
[ServiceType.InternationalRail]: new IRLEnterpriseSearch(irlFetcher, irlDiscountCardsFetcher, helpers, basketService, storageService, this),
|
|
97
|
-
[ServiceType.FastTrack]:
|
|
107
|
+
[ServiceType.FastTrack]: new FastTrackEnterpriseSearch(fasttrackFetcher, helpers, basketService, storageService, this),
|
|
98
108
|
[ServiceType.Coach]: null,
|
|
99
109
|
[ServiceType.Rail]: new RailEnterpriseSearch(railFetcher, getRailStationFetcher, helpers, basketService, storageService, this, userService, modalService),
|
|
100
|
-
[ServiceType.Eurostar]: new EurostarEnterpriseSearch(eurostarFetcher, helpers, userService, basketService, storageService, this)
|
|
110
|
+
[ServiceType.Eurostar]: new EurostarEnterpriseSearch(eurostarFetcher, helpers, userService, basketService, storageService, this, modalService)
|
|
101
111
|
};
|
|
102
112
|
console.log('Newly created search objects: ', this.searches);
|
|
103
113
|
this.search_objects = this.helpers.clone(this.init_search_objects());
|
|
@@ -125,6 +135,11 @@ export class BaseEnterpriseSearchService {
|
|
|
125
135
|
}
|
|
126
136
|
baseWebTokenService.autoLogoutConfig = this.getAutoLogoutConfig();
|
|
127
137
|
}
|
|
138
|
+
ngOnDestroy() {
|
|
139
|
+
if (this.allSubscription) {
|
|
140
|
+
this.allSubscription.unsubscribe();
|
|
141
|
+
}
|
|
142
|
+
}
|
|
128
143
|
reset() {
|
|
129
144
|
this.resetAllSearchItems();
|
|
130
145
|
this.basketService.reset();
|
|
@@ -292,6 +307,10 @@ export class BaseEnterpriseSearchService {
|
|
|
292
307
|
}
|
|
293
308
|
const obs = this.confermaCitiesFetcher.fetchOne(query);
|
|
294
309
|
const func = (results) => {
|
|
310
|
+
isLoading === null || isLoading === void 0 ? void 0 : isLoading.next(false);
|
|
311
|
+
if (!(results === null || results === void 0 ? void 0 : results.suggestions)) {
|
|
312
|
+
return [];
|
|
313
|
+
}
|
|
295
314
|
const data = results.suggestions.map((result) => {
|
|
296
315
|
return {
|
|
297
316
|
name: result.name,
|
|
@@ -301,7 +320,6 @@ export class BaseEnterpriseSearchService {
|
|
|
301
320
|
countryCode: result.countryCode
|
|
302
321
|
};
|
|
303
322
|
});
|
|
304
|
-
isLoading === null || isLoading === void 0 ? void 0 : isLoading.next(false);
|
|
305
323
|
return data;
|
|
306
324
|
};
|
|
307
325
|
return obs.pipe(take(1), map(func));
|
|
@@ -403,13 +421,15 @@ export class BaseEnterpriseSearchService {
|
|
|
403
421
|
if (isLoading) {
|
|
404
422
|
isLoading.next(false);
|
|
405
423
|
}
|
|
406
|
-
return results
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
424
|
+
return results
|
|
425
|
+
? results.map((result) => {
|
|
426
|
+
return {
|
|
427
|
+
type: LocationTypes.TrainStation,
|
|
428
|
+
name: result.name,
|
|
429
|
+
railstation: result
|
|
430
|
+
};
|
|
431
|
+
})
|
|
432
|
+
: [];
|
|
413
433
|
}));
|
|
414
434
|
}
|
|
415
435
|
else {
|
|
@@ -461,7 +481,7 @@ export class BaseEnterpriseSearchService {
|
|
|
461
481
|
}
|
|
462
482
|
const subs = forkJoin([
|
|
463
483
|
this.getAirportLocations(term, countryCode, isLoading),
|
|
464
|
-
this.getCityLocations(term, countryCode, isLoading),
|
|
484
|
+
this.getCityLocations(term, countryCode, isLoading, this.userService.userHasServiceProvider(ServiceType.Hotel, ServiceProvider.Confirma)),
|
|
465
485
|
this.getStationLocations(term, isLoading),
|
|
466
486
|
this.getConfirmaOffices(term)
|
|
467
487
|
]).pipe(map((results) => {
|
|
@@ -767,7 +787,7 @@ export class BaseEnterpriseSearchService {
|
|
|
767
787
|
}
|
|
768
788
|
_findSearchObtect() {
|
|
769
789
|
return Object.values(this.search_objects).find((obj) => {
|
|
770
|
-
return !!obj && obj.priority === this.highest_search_priority && obj.chosen;
|
|
790
|
+
return (!!obj && obj.priority === this.highest_search_priority && obj.chosen);
|
|
771
791
|
});
|
|
772
792
|
}
|
|
773
793
|
startSearches(url) {
|
|
@@ -780,8 +800,12 @@ export class BaseEnterpriseSearchService {
|
|
|
780
800
|
}
|
|
781
801
|
if (url) {
|
|
782
802
|
this.router.navigate([url]);
|
|
803
|
+
if (this.searches.INTERNATIONAL_RAIL) {
|
|
804
|
+
this.submitIrlForm();
|
|
805
|
+
}
|
|
783
806
|
}
|
|
784
|
-
else if (searchObject &&
|
|
807
|
+
else if (searchObject &&
|
|
808
|
+
!this.router.url.includes(searchObject.resultUrl)) {
|
|
785
809
|
this.router.navigate([searchObject.resultUrl]);
|
|
786
810
|
}
|
|
787
811
|
/*If the search exceeds the timeout time, cancel search and tell OBT that it's timed out*/
|
|
@@ -909,15 +933,62 @@ export class BaseEnterpriseSearchService {
|
|
|
909
933
|
return of();
|
|
910
934
|
}
|
|
911
935
|
}
|
|
936
|
+
getAllHotelChains() {
|
|
937
|
+
const obs = this.getHotelChainsFetcher.fetchList();
|
|
938
|
+
const func = (results) => {
|
|
939
|
+
const data = results.map((result) => {
|
|
940
|
+
return {
|
|
941
|
+
name: result
|
|
942
|
+
};
|
|
943
|
+
});
|
|
944
|
+
return data;
|
|
945
|
+
};
|
|
946
|
+
return obs.pipe(take(1), map(func));
|
|
947
|
+
}
|
|
948
|
+
getAllRailProviders() {
|
|
949
|
+
const obs = this.getRailProvidersFetcher.fetchList();
|
|
950
|
+
const func = (results) => {
|
|
951
|
+
const data = results.map((result) => {
|
|
952
|
+
return {
|
|
953
|
+
name: result
|
|
954
|
+
};
|
|
955
|
+
});
|
|
956
|
+
return data;
|
|
957
|
+
};
|
|
958
|
+
return obs.pipe(take(1), map(func));
|
|
959
|
+
}
|
|
960
|
+
getCarHireProivders() {
|
|
961
|
+
const obs = this.getCarHireProvidersFetcher.fetchList();
|
|
962
|
+
const func = (results) => {
|
|
963
|
+
const data = results.map((result) => {
|
|
964
|
+
return {
|
|
965
|
+
name: result
|
|
966
|
+
};
|
|
967
|
+
});
|
|
968
|
+
return data;
|
|
969
|
+
};
|
|
970
|
+
return obs.pipe(take(1), map(func));
|
|
971
|
+
}
|
|
972
|
+
getAllAirlines() {
|
|
973
|
+
const obs = this.getAllAirlinesFetcher.fetchList();
|
|
974
|
+
const func = (results) => {
|
|
975
|
+
const data = results.map((result) => {
|
|
976
|
+
return result;
|
|
977
|
+
});
|
|
978
|
+
return data;
|
|
979
|
+
};
|
|
980
|
+
return obs.pipe(take(1), map(func));
|
|
981
|
+
}
|
|
912
982
|
getRailCards() {
|
|
913
983
|
return this.getRailCardsFetcher.fetchList().pipe(take(1), map((results) => {
|
|
914
984
|
if (results) {
|
|
915
|
-
|
|
985
|
+
const railCards = results.map((result) => {
|
|
916
986
|
return {
|
|
917
987
|
name: result.name,
|
|
918
988
|
code: result.code
|
|
919
989
|
};
|
|
920
990
|
});
|
|
991
|
+
return railCards.sort((a, b) => a.name.localeCompare(b.name));
|
|
921
992
|
}
|
|
922
993
|
}));
|
|
923
994
|
}
|
|
@@ -1247,6 +1318,20 @@ export class BaseEnterpriseSearchService {
|
|
|
1247
1318
|
};
|
|
1248
1319
|
return this.helpers.sanatizeReturns(defaultVal, Object.assign({}, ...args), ['outBoundDate', 'inboundDate']);
|
|
1249
1320
|
}
|
|
1321
|
+
/*
|
|
1322
|
+
* Creates a FastTrack search query with supplied params, auto fills with defaults if fields are empty.
|
|
1323
|
+
* @param {any} ...args Example - searchService.makeFastTrackQuery(data.query, { override: "property" })
|
|
1324
|
+
* @return {QuerySearchLoungesArgs} Returns QuerySearchLoungesArgs type
|
|
1325
|
+
*/
|
|
1326
|
+
makeFastTrackQuery(...args) {
|
|
1327
|
+
const defaultVal = {
|
|
1328
|
+
adults: 0,
|
|
1329
|
+
arrivalDatetime: moment(),
|
|
1330
|
+
children: 0,
|
|
1331
|
+
locationCode: null
|
|
1332
|
+
};
|
|
1333
|
+
return this.helpers.sanatizeReturns(defaultVal, Object.assign({}, ...args), ['arrivalDatetime']);
|
|
1334
|
+
}
|
|
1250
1335
|
/* Create Query Defaults End */
|
|
1251
1336
|
shouldAddTravellerSubscription() {
|
|
1252
1337
|
return false;
|
|
@@ -1395,6 +1480,66 @@ export class BaseEnterpriseSearchService {
|
|
|
1395
1480
|
return obs.pipe(take(1));
|
|
1396
1481
|
}
|
|
1397
1482
|
}
|
|
1483
|
+
emailBasket(id) {
|
|
1484
|
+
return this.emailBasketFetcher.fetchList({ id });
|
|
1485
|
+
}
|
|
1486
|
+
submitIrlForm() {
|
|
1487
|
+
const currentUserEmail = this.userService.getUserEmail();
|
|
1488
|
+
let searchParams = this.searches[ServiceType.InternationalRail];
|
|
1489
|
+
let onBehalfOf;
|
|
1490
|
+
let passengers;
|
|
1491
|
+
// get passengers
|
|
1492
|
+
this.allSubscription.add(this.travellerInformation.subscribe((travellers) => {
|
|
1493
|
+
passengers = travellers.map((traveller, index) => {
|
|
1494
|
+
let age;
|
|
1495
|
+
if (traveller.dob) {
|
|
1496
|
+
let timeDiff = Math.abs(new Date().getTime() - new Date(traveller.dob).getTime());
|
|
1497
|
+
age = Math.floor((timeDiff / (1000 * 3600 * 24)) / 365);
|
|
1498
|
+
}
|
|
1499
|
+
return {
|
|
1500
|
+
name: traveller.name,
|
|
1501
|
+
age: (age === null || age === void 0 ? void 0 : age.toString()) || 'Not specified',
|
|
1502
|
+
discountCard: `Discount Card ${index + 1}`,
|
|
1503
|
+
loyaltyCard: `Loyalty Card ${index + 1}`
|
|
1504
|
+
};
|
|
1505
|
+
});
|
|
1506
|
+
onBehalfOf = travellers[0].email ? travellers[0].email : currentUserEmail;
|
|
1507
|
+
}));
|
|
1508
|
+
// get jrfreference
|
|
1509
|
+
this.allSubscription.add(searchParams.results.subscribe((irlJourney) => {
|
|
1510
|
+
var _a, _b;
|
|
1511
|
+
if ((_a = irlJourney[0]) === null || _a === void 0 ? void 0 : _a.jrfreference) {
|
|
1512
|
+
this.jrfReference = (_b = irlJourney[0]) === null || _b === void 0 ? void 0 : _b.jrfreference;
|
|
1513
|
+
}
|
|
1514
|
+
}));
|
|
1515
|
+
if (this.jrfReference && passengers) {
|
|
1516
|
+
const payload = {
|
|
1517
|
+
trainNumber: searchParams.trainNumber || 'Any',
|
|
1518
|
+
departureStation: searchParams.travellingFrom.name,
|
|
1519
|
+
destinationStation: searchParams.travellingTo.name,
|
|
1520
|
+
outboundDate: searchParams.outboundDepartureDateTime,
|
|
1521
|
+
inboundDate: searchParams.returnDepartureDateTime,
|
|
1522
|
+
additionalInfo: searchParams.additionalInstructions || 'No additional instructions',
|
|
1523
|
+
serviceClass: searchParams.irlClass || 'Any',
|
|
1524
|
+
offlineReference: this.jrfReference,
|
|
1525
|
+
notifyEmail: currentUserEmail,
|
|
1526
|
+
onBehalfOf: onBehalfOf,
|
|
1527
|
+
passengers: passengers
|
|
1528
|
+
};
|
|
1529
|
+
console.log(payload);
|
|
1530
|
+
this.sendOfflineNotification(payload).subscribe((result) => {
|
|
1531
|
+
if (result.success) {
|
|
1532
|
+
this.modalService.open(ModalTypes.OfflineRequestDialogComponent, { centered: true, size: 'md' }, { jrfReference: this.jrfReference });
|
|
1533
|
+
}
|
|
1534
|
+
else {
|
|
1535
|
+
this.modalService.open(ModalTypes.ModalErrorComponent, { centered: true }, { error: 'Unable to send offline notification' });
|
|
1536
|
+
}
|
|
1537
|
+
});
|
|
1538
|
+
}
|
|
1539
|
+
}
|
|
1540
|
+
sendOfflineNotification(jrfReference) {
|
|
1541
|
+
return this.sendOfflineNotificationFetcher.fetchOne(jrfReference);
|
|
1542
|
+
}
|
|
1398
1543
|
}
|
|
1399
1544
|
BaseEnterpriseSearchService.SESSION_TRAVELLER = 'search_travellers';
|
|
1400
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vYnRzZXJ2aWNlcy9iYXNlL3NyYy9saWIvdmVuZG9yL3NlcnZpY2VzL3NlYXJjaC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRCxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxTQUFTLE1BQU0sd0JBQXdCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBR3JELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBSy9FLE9BQU8sRUFJTCxVQUFVLEVBQ1YsUUFBUSxFQUNSLFNBQVMsRUFDVCxxQkFBcUIsRUFFckIsV0FBVyxFQUVYLGtCQUFrQixFQVVsQixnQkFBZ0IsRUFLaEIsY0FBYyxFQU9mLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDL0UsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDM0UsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDL0UsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixVQUFVLEVBQ1gsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMvRSxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLGtCQUFrQixFQUNuQixNQUFNLG1DQUFtQyxDQUFDO0FBQzNDLE9BQU8sRUFBYSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQVN4RSxPQUFPLEVBTUwsYUFBYSxFQThC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IjpbImltcG9ydCB7IG1hcCwgdGFrZSwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XHJcbmltcG9ydCBDb3VudHJpZXMgZnJvbSAnLi4vZGF0YS9jb3VudHJpZXMuanNvbic7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZm9ya0pvaW4sIG9mIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEJhc2VFbnRlcnByaXNlU2VhcmNoIH0gZnJvbSAnLi4vY2xhc3Nlcy9iYXNlLWVudGVycHJpc2UnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFBhcmtpbmdFbnRlcnByaXNlU2VhcmNoIH0gZnJvbSAnLi4vY2xhc3Nlcy9wYXJraW5nLWVudGVycHJpc2Utc2VhcmNoJztcclxuaW1wb3J0IHtcclxuICBTZWFyY2hPYmplY3QsXHJcbiAgU2VhcmNoT2JqZWN0c1xyXG59IGZyb20gJy4uL2ludGVyZmFjZXMvc2VhcmNoLW9iamVjdHMuaW50ZXJmYWNlJztcclxuaW1wb3J0IHtcclxuICBBZGRyZXNzLFxyXG4gIEFpcnBvcnQsXHJcbiAgQmFza2V0SXRlbSxcclxuICBCb29rZXJUeXBlLFxyXG4gIEZhcmVUeXBlLFxyXG4gIFJhaWxDbGFzcyxcclxuICBSYWlsU2VhcmNoSm91cm5leVR5cGUsXHJcbiAgU2VhcmNoQWlycG9ydHMsXHJcbiAgU2VydmljZVR5cGUsXHJcbiAgU2F2ZVVzZXJBZGRyZXNzTXV0YXRpb25WYXJpYWJsZXMsXHJcbiAgQ2FiSGlyZVZlaGljbGVUeXBlLFxyXG4gIENvbmZlcm1hT2ZmaWNlTmFtZXMsXHJcbiAgQ29uZmVybWFPZmZpY2VJbmZvLFxyXG4gIENvbmZlcm1hT2ZmaWNlUmVzdWx0LFxyXG4gIENhcmJvbkFsbG93YW5jZSxcclxuICBSaXNrQWxlcnQsXHJcbiAgUmlza0xldmVsLFxyXG4gIEdldFJpc2tBbGVydHNRdWVyeVZhcmlhYmxlcyxcclxuICBTZWFyY2hBaXJsaW5lcyxcclxuICBBaXJsaW5lUmVzdWx0LFxyXG4gIEZsaWdodENhYmluQ2xhc3MsXHJcbiAgUmVmZXJlbmNlUmFpbENhcmRRdWFsaWZpZXIsXHJcbiAgU2VhcmNoVXNlckNhbkJvb2tGb3JRdWVyeVZhcmlhYmxlcyxcclxuICBTYXZlUmVjZW50U2VhcmNoTXV0YXRpb25WYXJpYWJsZXMsXHJcbiAgSXJsU3VwcGxpZXJTdGF0aW9uLFxyXG4gIElybEpvdXJuZXlUeXBlLFxyXG4gIEdldEZsaWdodEZhcmVSdWxlc1F1ZXJ5VmFyaWFibGVzLFxyXG4gIEdldEZsaWdodFNlYXRNYXBRdWVyeVZhcmlhYmxlcyxcclxuICBJbnB1dEZsaWdodEpvdXJuZXksXHJcbiAgRmxpZ2h0U2VhdE1hcFJlc3VsdCxcclxuICBGbGlnaHRTZWF0TWFwUmVzcG9uc2UsXHJcbiAgU2F2ZUZhdm91cml0ZVNlYXJjaE11dGF0aW9uVmFyaWFibGVzXHJcbn0gZnJvbSAnLi4vdHlwZXMvZ3JhcGhxbC50eXBlcyc7XHJcbmltcG9ydCB7IExvdW5nZXNFbnRlcnByaXNlU2VhcmNoIH0gZnJvbSAnLi4vY2xhc3Nlcy9sb3VuZ2VzLWVudGVycHJpc2Utc2VhcmNoJztcclxuaW1wb3J0IHsgSG90ZWxFbnRlcnByaXNlU2VhcmNoIH0gZnJvbSAnLi4vY2xhc3Nlcy9ob3RlbC1lbnRlcnByaXNlLXNlYXJjaCc7XHJcbmltcG9ydCB7IENhcmhpcmVFbnRlcnByaXNlU2VhcmNoIH0gZnJvbSAnLi4vY2xhc3Nlcy9jYXJoaXJlLWVudGVycHJpc2Utc2VhcmNoJztcclxuaW1wb3J0IHtcclxuICBGbGlnaHRFbnRlcnByaXNlU2VhcmNoLFxyXG4gIFRpbWVXaW5kb3dcclxufSBmcm9tICcuLi9jbGFzc2VzL2ZsaWdodC1lbnRlcnByaXNlLXNlYXJjaCc7XHJcbmltcG9ydCB7IENhYkhpcmVFbnRlcnByaXNlU2VhcmNoIH0gZnJvbSAnLi4vY2xhc3Nlcy9jYWJoaXJlLWVudGVycHJpc2Utc2VhcmNoJztcclxuaW1wb3J0IHtcclxuICBSYWlsRW50ZXJwcmlzZVNlYXJjaCxcclxuICBSYWlsU2VhcmNoQ3JpdGVyaWFcclxufSBmcm9tICcuLi9jbGFzc2VzL3JhaWwtZW50ZXJwcmlzZS1zZWFyY2gnO1xyXG5pbXBvcnQgeyBUcmF2ZWxsZXIsIFRyYXZlbGxlck9iamVjdCB9IGZyb20gJy4uL21vZGVscy90cmF2ZWxsZXIub2JqZWN0JztcclxuaW1wb3J0IHsgQmFzZVN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi9zdG9yYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCYXNlSGVscGVyUm91dGluZXMgfSBmcm9tICcuLi9jbGFzc2VzL2hlbHBlcnMnO1xyXG5pbXBvcnQgeyBCYXNlSG90ZWxBdmFsaWJpbGl0eVNlcnZpY2UgfSBmcm9tICcuL2hvdGVsLWF2YWxsaWJpbGl0eS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQmFzZUVudmlyb25tZW50IH0gZnJvbSAnLi4vY2xhc3Nlcy9lbnZpcm9tZW50JztcclxuaW1wb3J0IHtcclxuICBCYXNlU2VhcmNoUG9zdGNvZGVGZXRjaGVyLFxyXG4gIFNlYXJjaFBvc3Rjb2Rlc1F1b3RlRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9zZWFyY2gtcG9zdGNvZGVzLmZldGNoZXInO1xyXG5pbXBvcnQge1xyXG4gIEFkZHJlc3NGb3JtLFxyXG4gIEFpcnBvcnRTZWFyY2hSZXN1bHRzLFxyXG4gIENhckhpcmVEZXBvdFJlc3VsdEFycmF5LFxyXG4gIENvdW50cnlDb2RlLFxyXG4gIExvY2F0aW9uRGV0YWlscyxcclxuICBMb2NhdGlvblR5cGVzLFxyXG4gIE9CVEFpcnBvcnREZXRhaWxzLFxyXG4gIFJhaWxBaXJwb3J0LFxyXG4gIFJvdXRlcixcclxuICBTZWFyY2hDaXRpZXNSZXN1bHQsXHJcbiAgU2VhcmNoQ2l0aWVzUmVzdWx0QXJyYXksXHJcbiAgU2VhcmNoUG9zdGNvZGVzUmVzdWx0LFxyXG4gIFNlYXJjaFBvc3Rjb2Rlc1Jlc3VsdEFycmF5LFxyXG4gIFNlYXJjaFJhaWxTdGF0aW9uc1Jlc3VsdCxcclxuICBTZWFyY2hSYWlsU3RhdGlvbnNSZXN1bHRBcnJheSxcclxuICBUZXJtaW5hbHNUeXBlLFxyXG4gIEdldFVzZXJDb21wYW55T2ZmaWNlc1Jlc3VsdEFycmF5LFxyXG4gIEdldFVzZXJDb21wYW55T2ZmaWNlc1Jlc3VsdCxcclxuICBTZWFyY2hIb3RlbENoYWluc1Jlc3VsdEFycmF5LFxyXG4gIFNlYXJjaEhvdGVsQ2hhaW5zUmVzdWx0LFxyXG4gIEdldENvbmZlcm1hUm9vbUltYWdlc1Jlc3VsdEFycmF5LFxyXG4gIEdldENvbmZlcm1hUm9vbUltYWdlc1Jlc3VsdCxcclxuICBBaXJsaW5lc1NlYXJjaFJlc3VsdCxcclxuICBPQlRBaXJsaW5lc0RldGFpbHMsXHJcbiAgR2V0VXNlclJlY2VudFNlYXJjaGVzUmVzdWx0QXJyYXksXHJcbiAgR2V0VXNlclJlY2VudFNlYXJjaGVzUmVzdWx0LFxyXG4gIFJlY2VudFNlYXJjaCxcclxuICBTZWFyY2hDb25mZXJtYUNpdGllc1Jlc3VsdCxcclxuICBDb25mZXJtYU9mZmljZU5hbWVSZXN1bHQsXHJcbiAgR2V0RmxpZ2h0RmFyZVJ1bGVzUmVzdWx0QXJyYXksXHJcbiAgR2V0RmxpZ2h0U2VhdE1hcFJlc3VsdEFycmF5LFxyXG4gIFNlYXJjaFJhaWxMaXZlRGVwYXJ0dXJlc1Jlc3VsdCxcclxuICBTYXZlRmF2b3VyaXRlU2VhcmNoUmVzdWx0LFxyXG4gIEdldFVzZXJGYXZvdXJpdGVTZWFyY2hlc1Jlc3VsdEFycmF5LFxyXG4gIEdldFVzZXJGYXZvdXJpdGVTZWFyY2hlc1Jlc3VsdFxyXG59IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcclxuaW1wb3J0IHtcclxuICBCYXNlU2VhcmNoUmFpbFN0YXRpb25zRmV0Y2hlcixcclxuICBTZWFyY2hSYWlsU3RhdGlvbnNGZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL2ZldGNoZXJzL3NlYXJjaC1yYWlsLXN0YXRpb25zLmZldGNoZXInO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VMb3VuZ2VRdW90ZUZldGNoZXIsXHJcbiAgTG91bmdlUXVvdGVGZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL2ZldGNoZXJzL2xvdW5nZS1xdW90ZS5mZXRjaGVyJztcclxuaW1wb3J0IHtcclxuICBCYXNlUGFya2luZ1F1b3RlRmV0Y2hlcixcclxuICBQYXJraW5nUXVvdGVGZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL2ZldGNoZXJzL3BhcmtpbmctcXVvdGUtZmV0Y2hlcic7XHJcbmltcG9ydCB7XHJcbiAgQmFzZUZsaWdodFF1b3RlRmV0Y2hlcixcclxuICBGbGlnaHRRdW90ZUZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvZmxpZ2h0LXF1b3RlLmZldGNoZXInO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VIb3RlbFF1b3RlRmV0Y2hlcixcclxuICBIb3RlbFF1b3RlRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9ob3RlbC1xdW90ZS1mZXRjaGVyJztcclxuaW1wb3J0IHtcclxuICBCYXNlQ2FyaGlyZVF1b3RlRmV0Y2hlcixcclxuICBDYXJIaXJlRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9jYXJoaXJlLXF1b3RlLWZldGNoZXInO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VDYXJIaXJlQXZhaWxhYmlsaXR5RGV0YWlsRmV0Y2hlcixcclxuICBDYXJIaXJlQXZhaWxhYmlsaXR5RGV0YWlsRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9jYXJoaXJlLWF2YWlsYWJpbGl0eS1kZXRhaWwuZmV0Y2hlcic7XHJcbmltcG9ydCB7XHJcbiAgQmFzZUNhYmhpcmVRdW90ZUZldGNoZXIsXHJcbiAgQ2FiaGlyZVF1b3RlRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9jYWJoaXJlLXF1b3RlLWZldGNoZXInO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VSYWlsUXVvdGVGZXRjaGVyLFxyXG4gIFJhaWxRdW90ZUZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvcmFpbC1xdW90ZS1mZXRjaGVyJztcclxuaW1wb3J0IHtcclxuICBCYXNlSXJsUXVvdGVGZXRjaGVyLFxyXG4gIElybFF1b3RlRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9pcmwtcXVvdGUtZmV0Y2hlcic7XHJcbmltcG9ydCB7IFJlZ0V4cHMgfSBmcm9tICcuLi9tb2RlbHMvcmVnZXhwLm1vZGVsJztcclxuaW1wb3J0IHtcclxuICBFbnRlcnByaXNlU2VhcmNoU2VydmljZUludGVyZmFjZSxcclxuICBTZWFyY2hQYXJhbXNcclxufSBmcm9tICcuLi9pbnRlcmZhY2VzL0lzZWFyY2guc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgQmFzZVNlYXJjaEFpcnBvcnRzRmV0Y2hlcixcclxuICBTZWFyY2hBaXJwb3J0c1F1b3RlRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9zZWFyY2gtYWlycG9ydHMtZmV0Y2hlcic7XHJcbmltcG9ydCB7XHJcbiAgQmFzZVNlYXJjaEFpcmxpbmVzRmV0Y2hlcixcclxuICBTZWFyY2hBaXJsaW5lc1F1b3RlRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9zZWFyY2gtYWlybGluZXMuZmV0Y2hlcic7XHJcbmltcG9ydCB7XHJcbiAgVXNlclNlcnZpY2VJbnRlcmZhY2UsXHJcbiAgVXNlclNlcnZpY2VzXHJcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JdXNlci5zZXJ2aWNlJztcclxuaW1wb3J0IHtcclxuICBCYXNlU2VhcmNoQ2l0eUZldGNoZXIsXHJcbiAgU2VhcmNoQ2l0aWVzUXVvdGVGZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL2ZldGNoZXJzL3NlYXJjaC1jaXRpZXMuZmV0Y2hlcic7XHJcbmltcG9ydCB7XHJcbiAgQmFzZVNlYXJjaENvbmZlcm1hQ2l0eUZldGNoZXIsXHJcbiAgU2VhcmNoQ29uZmVybWFDaXRpZXNRdW90ZUZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvc2VhcmNoLWNvbmZlcm1hLWNpdGllcy5mZXRjaGVyJztcclxuaW1wb3J0IHsgQWJzdHJhY3RIdHRwQ2FsbFNlcnZpY2UgfSBmcm9tICcuL2h0dHAtY2FsbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRW50ZXJwcmlzZUJhc2tldFNlcnZpY2VJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0llbnRlcnByaXNlLWJhc2tldC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSG90ZWxBdmFsaW5pbGl0eUZldGNoZXJUeXBlIH0gZnJvbSAnLi4vZmV0Y2hlcnMvaG90ZWwtYXZhbGlhYmlsaXR5LWZldGNoZXInO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VTYXZlVXNlckFkZHJlc3NVcGRhdGVyLFxyXG4gIFNhdmVVc2VyQWRkcmVzc1VwZGF0ZXJUeXBlXHJcbn0gZnJvbSAnLi4vdXBkYXRlcnMvc2F2ZS11c2VyLWFkZHJlc3MudXBkYXRlcic7XHJcbmltcG9ydCB7XHJcbiAgQmFzZVVzZXJBZGRyZXNzZXNGZXRjaGVyLFxyXG4gIFVzZXJBZGRyZXNzRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy91c2VyLWFkZHJlc3Nlcy5mZXRjaGVyJztcclxuXHJcbmltcG9ydCB7XHJcbiAgQmFzZUNvbmZlcm1hT2ZmaWNlTmFtZXNGZXRjaGVyLFxyXG4gIENvbmZlcm1hT2ZmaWNlTmFtZUZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvY29uZmVybWEtb2ZmaWNlLW5hbWVzLmZldGNoZXInO1xyXG5cclxuaW1wb3J0IHtcclxuICBCYXNlQ29uZmVybWFPZmZpY2VGZXRjaGVyLFxyXG4gIENvbmZlcm1hT2ZmaWNlRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9jb25mZXJtYS1vZmZpY2UuZmV0Y2hlcic7XHJcblxyXG5pbXBvcnQge1xyXG4gIEJhc2VHZXRVc2VyQ29tcGFueU9mZmljZXNGZXRjaGVyLFxyXG4gIEdldFVzZXJDb21wYW55T2ZmaWNlc1F1b3RlRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9nZXQtdXNlci1jb21wYW55LW9mZmljZXMuZmV0Y2hlcic7XHJcbmltcG9ydCB7XHJcbiAgQmFzZVNlYXJjaEhvdGVsQ2hhaW5zRmV0Y2hlcixcclxuICBTZWFyY2hIb3RlbENoYWluc1F1b3RlRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9zZWFyY2gtaG90ZWwtY2hhaW5zLmZldGNoZXInO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VHZXRDb25mZXJtYVJvb21JbWFnZXNGZXRjaGVyLFxyXG4gIEdldENvbmZlcm1hUm9vbUltYWdlc1F1b3RlRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9nZXQtY29uZmVybWEtcm9vbS1pbWFnZXMuZmV0Y2hlcic7XHJcbmltcG9ydCB7XHJcbiAgQmFzZVZhbGlkYXRlSXNQb3N0Y29kZVZhbGlkVGVzdGVyLFxyXG4gIFZhbGlkYXRlSXNQb3N0Y29kZVZhbGlkVHlwZVxyXG59IGZyb20gJy4uL3Rlc3RlcnMvcG9zdGNvZGUtdmFsaWRhdGUudGVzdGVyJztcclxuXHJcbmltcG9ydCB7XHJcbiAgQmFzZVNlYXJjaERlcG90RmV0Y2hlcixcclxuICBTZWFyY2hEZXBvdFF1b3RlRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9zZWFyY2gtZGVwb3RzLmZldGNoZXInO1xyXG5cclxuaW1wb3J0IHtcclxuICBCYXNlR2V0UmFpbFN0YXRpb25GZXRjaGVyLFxyXG4gIEdldFJhaWxTdGF0aW9uRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9nZXQtcmFpbC1zdGF0aW9uLmZldGNoZXInO1xyXG5cclxuaW1wb3J0IHtcclxuICBCYXNlU2VhcmNoSXJsU3RhdGlvbnNGZXRjaGVyLFxyXG4gIFNlYXJjaElybFN0YXRpb25zRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9zZWFyY2gtaXJsLXN0YXRpb25zLmZldGNoZXInO1xyXG5cclxuaW1wb3J0IHtcclxuICBCYXNlU2VhcmNoQ29uZmVybWFRdWlja2xpc3RGZXRjaGVyLFxyXG4gIENvbmZlcm1hUXVpY2tsaXN0RmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9jb25mZXJtYS1xdWlja2xpc3QuZmV0Y2hlcic7XHJcblxyXG5pbXBvcnQge1xyXG4gIEJhc2VEZWxldGVVc2VyQWRkcmVzc1VwZGF0ZXIsXHJcbiAgRGVsZXRlVXNlckFkZHJlc3NGZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL3VwZGF0ZXJzL3JlbW92ZS11c2VyLWFkZHJlc3MtdXBkYXRlcic7XHJcblxyXG5pbXBvcnQge1xyXG4gIEJhc2VEZWxldGVSZWNlbnRTZWFyY2hVcGRhdGVyLFxyXG4gIERlbGV0ZVJlY2VudFNlYXJjaEZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vdXBkYXRlcnMvcmVtb3ZlLXJlY2VudC1zZWFyY2gtdXBkYXRlcic7XHJcblxyXG5pbXBvcnQge1xyXG4gIEJhc2VTYXZlUmVjZW50U2VhcmNoVXBkYXRlcixcclxuICBTYXZlUmVjZW50U2VhcmNoRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi91cGRhdGVycy9zYXZlLXJlY2VudC1zZWFyY2gtdXBkYXRlcic7XHJcblxyXG5pbXBvcnQge1xyXG4gIEJhc2VTYXZlRmF2b3VyaXRlU2VhcmNoVXBkYXRlcixcclxuICBTYXZlRmF2b3VyaXRlU2VhcmNoRmV0Y2hlclR5cGUgfSBmcm9tICcuLi91cGRhdGVycy9zYXZlLWZhdm91cml0ZS1zZWFyY2gtdXBkYXRlcic7XHJcblxyXG5pbXBvcnQge1xyXG4gIEJhc2VHZXRSYWlsTGl2ZURlcGFydHVyZXNGZXRjaGVyLFxyXG4gIEdldFJhaWxMaXZlRGVwYXJ0dXJlc0ZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvZ2V0LXJhaWwtbGl2ZS1kZXBhcnR1cmVzLmZldGNoZXInO1xyXG5cclxuaW1wb3J0IHsgSG90ZWxUZW1wUGFyYW1zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JaG90ZWwtZW50ZXJwcmlzZS1zZWFyY2gnO1xyXG5pbXBvcnQgeyBSYWlsVGVtcFBhcmFtcyB9IGZyb20gJy4uL2ludGVyZmFjZXMvSXJhaWwtZW50ZXJwcmlzZS1zZWFyY2gnO1xyXG5pbXBvcnQgeyBGbGlnaHRUZW1wUGFyYW1zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JZmxpZ2h0LWVudGVycHJpc2Utc2VhcmNoJztcclxuaW1wb3J0IHsgTG91bmdlc1RlbXBQYXJhbXMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lsb3VuZ2VzLWVudGVycHJpc2Utc2VhcmNoJztcclxuaW1wb3J0IHsgUGFya2luZ1RlbXBQYXJhbXMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lwYXJraW5nLWVudGVycHJpc2Utc2VhcmNoJztcclxuaW1wb3J0IHtcclxuICBDYWJIaXJlVGVtcFBhcmFtcyxcclxuICBUYXhpRm9ybU1vZGVcclxufSBmcm9tICcuLi9pbnRlcmZhY2VzL0ljYWJoaXJlLWVudGVycHJpc2Utc2VhcmNoJztcclxuaW1wb3J0IHsgQ2FySGlyZVRlbXBQYXJhbXMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0ljYXJoaXJlLWVudGVycHJpc2Utc2VhcmNoJztcclxuaW1wb3J0IHtcclxuICBCYXNlR2V0VXNlckN1cnJlbnRDYXJib25BbGxvd2FuY2VGZXRjaGVyLFxyXG4gIEdldFVzZXJDdXJyZW50Q2FyYm9uQWxsb3dhbmNlVHlwZVxyXG59IGZyb20gJy4uL2ZldGNoZXJzL2dldC11c2VyLWN1cnJlbnQtY2FyYm9uLWFsbG93YW5jZS5mZXRjaGVyJztcclxuaW1wb3J0IHsgQmFzZVdlYlRva2VuU2VydmljZSB9IGZyb20gJy4vd2VidG9rZW4uc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgQmFzZUdldFJpc2tBbGVydHNGZXRjaGVyLFxyXG4gIEdldFJpc2tBbGVydHNGZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL2ZldGNoZXJzL2dldC1yaXNrLWFsZXJ0cy5mZXRjaGVyJztcclxuaW1wb3J0IHsgSXJsVGVtcFBhcmFtcyB9IGZyb20gJy4uL2ludGVyZmFjZXMvSWlybC1lbnRlcnByaXNlLXNlYXJjaCc7XHJcbmltcG9ydCB7IElSTEVudGVycHJpc2VTZWFyY2ggfSBmcm9tICcuLi9jbGFzc2VzL2lybC1lbnRlcnByaXNlLXNlYXJjaCc7XHJcblxyXG5pbXBvcnQge1xyXG4gIEJhc2VHZXRVc2VyUmVjZW50U2VhcmNoZXNGZXRjaGVyLFxyXG4gIEdldFVzZXJSZWNlbnRTZWFyY2hlc0ZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvZ2V0LXVzZXItcmVjZW50LXNlYXJjaGVzLmZldGNoZXInO1xyXG5cclxuaW1wb3J0IHtcclxuICBCYXNlR2V0UmFpbGNhcmRzRmV0Y2hlcixcclxuICBHZXRSYWlsQ2FyZHNGZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL2ZldGNoZXJzL2dldC1yYWlsLWNhcmRzLmZldGNoZXInO1xyXG5cclxuaW1wb3J0IHtcclxuICBCYXNlR2V0Q292aWRNaWNyb3NpdGVUb2tlbkZldGNoZXIsXHJcbiAgR2V0Q292aWRNaWNyb3NpdGVUb2tlbkZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvZ2V0LWNvdmlkLW1pY3Jvc2l0ZS10b2tlbi5mZXRjaGVyJztcclxuXHJcbmltcG9ydCB7XHJcbiAgQmFzZUV1cm9zdGFyUXVvdGVGZXRjaGVyLFxyXG4gIEV1cm9zdGFyUXVvdGVGZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL2ZldGNoZXJzL2V1cm9zdGFyLXF1b3RlLmZldGNoZXInO1xyXG5pbXBvcnQgeyBFdXJvc3RhckVudGVycHJpc2VTZWFyY2ggfSBmcm9tICcuLi9jbGFzc2VzL2V1cm9zdGFyLWVudGVycHJpc2Utc2VhcmNoJztcclxuaW1wb3J0IHsgRXVyb3N0YXJUZW1wUGFyYW1zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JZXVyb3N0YXItZW50ZXJwcmlzZS1zZWFyY2gnO1xyXG5pbXBvcnQgRXVyb1N0YXRpb25zIGZyb20gJy4uL2RhdGEvZXVyby1zdGF0aW9ucy5qc29uJztcclxuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcclxuaW1wb3J0IHtcclxuICBCYXNlU2VhcmNoVXNlcnNDYW5Cb29rRm9yRmV0Y2hlcixcclxuICBTZWFyY2hVc2VyQ2FuQm9va0ZvckZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvc2VhcmNoLXVzZXJzLWNhbi1ib29rLWZvci1mZXRjaGVyJztcclxuaW1wb3J0IHsgRXVyb3N0YXJTZWFyY2hUeXBlIH0gZnJvbSAnLi4vY2xhc3Nlcy9ldXJvc3Rhci1zZWFyY2gtdHlwZS5lbnVtJztcclxuaW1wb3J0IHtcclxuICBCYXNlSXJsRGlzY291bnRDYXJkRmV0Y2hlcixcclxuICBJcmxEaXNjb3VudENhcmRGZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL2ZldGNoZXJzL2lybC1kaXNjb3VudC1jYXJkLWZldGNoZXInO1xyXG5cclxuaW1wb3J0IHtcclxuICBCYXNlR2V0RmxpZ2h0RmFyZVJ1bGVzRmV0Y2hlcixcclxuICBHZXRGbGlnaHRGYXJlUnVsZXNUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvZmxpZ2h0LWZhcmUtcnVsZXMuZmV0Y2hlcic7XHJcbmltcG9ydCB7XHJcbiAgQmFzZUdldEZsaWdodFNlYXRNYXBGZXRjaGVyLFxyXG4gIEdldEZsaWdodFNlYXRNYXBUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvZ2V0LWZsaWdodC1zZWF0LW1hcC1mZXRjaGVyJztcclxuaW1wb3J0IHtcclxuICBBcHBseUhvdGVsUnVsZXNGZXRjaGVyVHlwZSxcclxuICBCYXNlSG90ZWxSdWxlc0ZldGNoZXJcclxufSBmcm9tICcuLi9mZXRjaGVycy9hcHBseS1KSVQtaG90ZWwtcnVsZXMuZmV0Y2hlcic7XHJcbmltcG9ydCB7XHJcbiAgQXBwbHlKaXRGbGlnaHRSdWxlc1R5cGUsXHJcbiAgQmFzZUFwcGx5Sml0RmxpZ2h0UnVsZXNGZXRjaGVyXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvYXBwbHktaml0LWZsaWdodC1ydWxlcyc7XHJcbmltcG9ydCB7IEJhc2VNb2RhbE9wZW5lclNlcnZpY2UgfSBmcm9tICcuL21vZGFsLW9wZW5lci5zZXJ2aWNlJztcclxuaW1wb3J0IHtcclxuICBCYXNlR2V0VXNlckZhdm91cml0ZVNlYXJjaGVzRmV0Y2hlcixcclxuICBHZXRVc2VyRmF2b3VyaXRlU2VhcmNoZXNGZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL2ZldGNoZXJzL2dldC11c2VyLWZhdm91cml0ZS1zZWFyY2hlcy5mZXRjaGVyJztcclxuaW1wb3J0IHsgQmFzZURlbGV0ZUZhdm91cml0ZVNlYXJjaFVwZGF0ZXIsIERlbGV0ZUZhdm91cml0ZVNlYXJjaEZldGNoZXJUeXBlIH0gZnJvbSAnLi4vdXBkYXRlcnMvcmVtb3ZlLWZhdm91cml0ZS1zZWFyY2gtdXBkYXRlcic7XHJcblxyXG5leHBvcnQgY29uc3QgTUFYX1RSQVZFTExFUlMgPSA4O1xyXG5cclxuZXhwb3J0IGVudW0gVHJhdmVsbGVyU2VhcmNoVHlwZXMge1xyXG4gIGVtYWlsID0gJ2VtYWlsJyxcclxuICBuYW1lID0gJ25hbWUnLFxyXG4gIGVtcGxveWVlTnVtYmVyID0gJ2VtcGxveWVlTnVtYmVyJ1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSGlnaGVzdFNlYXJjaFByaW9yaXR5T2JqZWN0SW50ZXJmYWNlIHtcclxuICBoaWdoZXN0OiBudW1iZXI7XHJcbiAgY3VycmVudEl0ZW06IFNlYXJjaE9iamVjdDtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEJhc2VFbnRlcnByaXNlU2VhcmNoU2VydmljZTxcclxuICBTUF9RIGV4dGVuZHMgU2VhcmNoUG9zdGNvZGVzUXVvdGVGZXRjaGVyVHlwZSxcclxuICBTUl9RIGV4dGVuZHMgU2VhcmNoUmFpbFN0YXRpb25zRmV0Y2hlclR5cGUsXHJcbiAgU0xfUSBleHRlbmRzIExvdW5nZVF1b3RlRmV0Y2hlclR5cGUsXHJcbiAgU1BBX1EgZXh0ZW5kcyBQYXJraW5nUXVvdGVGZXRjaGVyVHlwZSxcclxuICBTRkxfUSBleHRlbmRzIEZsaWdodFF1b3RlRmV0Y2hlclR5cGUsXHJcbiAgU0hPX1EgZXh0ZW5kcyBIb3RlbFF1b3RlRmV0Y2hlclR5cGUsXHJcbiAgU0NIX1EgZXh0ZW5kcyBDYXJIaXJlRmV0Y2hlclR5cGUsXHJcbiAgQ0hBRF9RIGV4dGVuZHMgQ2FySGlyZUF2YWlsYWJpbGl0eURldGFpbEZldGNoZXJUeXBlLFxyXG4gIFNUSF9RIGV4dGVuZHMgQ2FiaGlyZVF1b3RlRmV0Y2hlclR5cGUsXHJcbiAgU0FfUSBleHRlbmRzIFNlYXJjaEFpcnBvcnRzUXVvdGVGZXRjaGVyVHlwZSxcclxuICBTQUxfUSBleHRlbmRzIFNlYXJjaEFpcmxpbmVzUXVvdGVGZXRjaGVyVHlwZSxcclxuICBIQV9RIGV4dGVuZHMgSG90ZWxBdmFsaW5pbGl0eUZldGNoZXJUeXBlLFxyXG4gIFNDX1EgZXh0ZW5kcyBTZWFyY2hDaXRpZXNRdW90ZUZldGNoZXJUeXBlLFxyXG4gIFNDQ19RIGV4dGVuZHMgU2VhcmNoQ29uZmVybWFDaXRpZXNRdW90ZUZldGNoZXJUeXBlLFxyXG4gIFNSQV9RIGV4dGVuZHMgUmFpbFF1b3RlRmV0Y2hlclR5cGUsXHJcbiAgU0lfUSBleHRlbmRzIElybFF1b3RlRmV0Y2hlclR5cGUsXHJcbiAgU1VBX1EgZXh0ZW5kcyBTYXZlVXNlckFkZHJlc3NVcGRhdGVyVHlwZSxcclxuICBTVV9RIGV4dGVuZHMgVXNlckFkZHJlc3NGZXRjaGVyVHlwZSxcclxuICBHVUNPX1EgZXh0ZW5kcyBHZXRVc2VyQ29tcGFueU9mZmljZXNRdW90ZUZldGNoZXJUeXBlLFxyXG4gIFNIQ19RIGV4dGVuZHMgU2VhcmNoSG90ZWxDaGFpbnNRdW90ZUZldGNoZXJUeXBlLFxyXG4gIEdDUklfUSBleHRlbmRzIEdldENvbmZlcm1hUm9vbUltYWdlc1F1b3RlRmV0Y2hlclR5cGUsXHJcbiAgSVBWX1EgZXh0ZW5kcyBWYWxpZGF0ZUlzUG9zdGNvZGVWYWxpZFR5cGUsXHJcbiAgU0RfUSBleHRlbmRzIFNlYXJjaERlcG90UXVvdGVGZXRjaGVyVHlwZSxcclxuICBHUlNfUSBleHRlbmRzIEdldFJhaWxTdGF0aW9uRmV0Y2hlclR5cGUsXHJcbiAgR09OX1EgZXh0ZW5kcyBDb25mZXJtYU9mZmljZU5hbWVGZXRjaGVyVHlwZSxcclxuICBDT19RIGV4dGVuZHMgQ29uZmVybWFPZmZpY2VGZXRjaGVyVHlwZSxcclxuICBEVUFfUSBleHRlbmRzIERlbGV0ZVVzZXJBZGRyZXNzRmV0Y2hlclR5cGUsXHJcbiAgRFJTX1EgZXh0ZW5kcyBEZWxldGVSZWNlbnRTZWFyY2hGZXRjaGVyVHlwZSxcclxuICBTUlNfUSBleHRlbmRzIFNhdmVSZWNlbnRTZWFyY2hGZXRjaGVyVHlwZSxcclxuICBVQ0FfUSBleHRlbmRzIEdldFVzZXJDdXJyZW50Q2FyYm9uQWxsb3dhbmNlVHlwZSxcclxuICBTRlNfUSBleHRlbmRzIFNhdmVGYXZvdXJpdGVTZWFyY2hGZXRjaGVyVHlwZSxcclxuICBHUkFfUSBleHRlbmRzIEdldFJpc2tBbGVydHNGZXRjaGVyVHlwZSxcclxuICBRTF9RIGV4dGVuZHMgQ29uZmVybWFRdWlja2xpc3RGZXRjaGVyVHlwZSxcclxuICBHVVJTRl9RIGV4dGVuZHMgR2V0VXNlclJlY2VudFNlYXJjaGVzRmV0Y2hlclR5cGUsXHJcbiAgR1JDRl9RIGV4dGVuZHMgR2V0UmFpbENhcmRzRmV0Y2hlclR5cGUsXHJcbiAgR0NNVEZfUSBleHRlbmRzIEdldENvdmlkTWljcm9zaXRlVG9rZW5GZXRjaGVyVHlwZSxcclxuICBTRV9RIGV4dGVuZHMgRXVyb3N0YXJRdW90ZUZldGNoZXJUeXBlLFxyXG4gIFNVQ0JGIGV4dGVuZHMgU2VhcmNoVXNlckNhbkJvb2tGb3JGZXRjaGVyVHlwZSxcclxuICBTSVNfUSBleHRlbmRzIFNlYXJjaElybFN0YXRpb25zRmV0Y2hlclR5cGUsXHJcbiAgR0lERl9RIGV4dGVuZHMgSXJsRGlzY291bnRDYXJkRmV0Y2hlclR5cGUsXHJcbiAgR0ZGUl9RIGV4dGVuZHMgR2V0RmxpZ2h0RmFyZVJ1bGVzVHlwZSxcclxuICBHRlNNX1EgZXh0ZW5kcyBHZXRGbGlnaHRTZWF0TWFwVHlwZSxcclxuICBHUkxEX0YgZXh0ZW5kcyBHZXRSYWlsTGl2ZURlcGFydHVyZXNGZXRjaGVyVHlwZSxcclxuICBBSFJfUSBleHRlbmRzIEFwcGx5SG90ZWxSdWxlc0ZldGNoZXJUeXBlLFxyXG4gIEFGUl9RIGV4dGVuZHMgQXBwbHlKaXRGbGlnaHRSdWxlc1R5cGUsXHJcbiAgR1VGU0ZfUSBleHRlbmRzIEdldFVzZXJGYXZvdXJpdGVTZWFyY2hlc0ZldGNoZXJUeXBlLFxyXG4gIERGU19RIGV4dGVuZHMgRGVsZXRlRmF2b3VyaXRlU2VhcmNoRmV0Y2hlclR5cGUsXHJcbj4gaW1wbGVtZW50cyBFbnRlcnByaXNlU2VhcmNoU2VydmljZUludGVyZmFjZVxyXG57XHJcbiAgc3RhdGljIFNFU1NJT05fVFJBVkVMTEVSOiBzdHJpbmcgPSAnc2VhcmNoX3RyYXZlbGxlcnMnO1xyXG5cclxuICBzZWFyY2hlczogU2VhcmNoUGFyYW1zO1xyXG4gIHRyYXZlbGxlcl9lcnJvciA9IGZhbHNlO1xyXG4gIHRyYXZlbGxlckluZm9ybWF0aW9uOiBCZWhhdmlvclN1YmplY3Q8VHJhdmVsbGVyW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcclxuICAgIFRyYXZlbGxlcltdXHJcbiAgPihbXSk7XHJcbiAgZXJyb3JzOiBCZWhhdmlvclN1YmplY3Q8c3RyaW5nW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmdbXT4oW10pO1xyXG4gIHNlYXJjaExvYWRpbmdEb25lOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KFxyXG4gICAgZmFsc2VcclxuICApO1xyXG4gIHNlYXJjaFRpbWVkT3V0OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KFxyXG4gICAgZmFsc2VcclxuICApO1xyXG4gIG5ld1NlYXJjaFN0YXJ0ZWQ6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oXHJcbiAgICBmYWxzZVxyXG4gICk7XHJcblxyXG4gIGZpcnN0TG9hZCA9IHRydWU7XHJcblxyXG4gIHNlYXJjaF9vYmplY3RzOiBTZWFyY2hPYmplY3RzO1xyXG4gIGhpZ2hlc3Rfc2VhcmNoX3ByaW9yaXR5ID0gODtcclxuICBzaG93X2Vycm9ycyA9IGZhbHNlO1xyXG4gIHRyYXZlbGxlclZhbGlkYXRpb25NZXNzYWdlczogc3RyaW5nW10gPSBbXTtcclxuICBzZWFyY2hfbG9hZGluZyA9IGZhbHNlO1xyXG4gIHNlYXJjaF9haXJwb3J0X2xvYWRpbmcgPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBzZWxlY3RlZFRyYXZlbGxlcnM6IFRyYXZlbGxlcltdID0gW107XHJcbiAgc2VsZWN0ZWRQbGFjZXM6IGFueSA9IFtdO1xyXG4gIGNvdW50cmllcyA9IENvdW50cmllcztcclxuICBldXJvc3RhdGlvbnM6IHsgZ2F0ZXdheTogc3RyaW5nOyBkZXN0aW5hdGlvbjogc3RyaW5nIH1bXSA9XHJcbiAgICBfLnRvQXJyYXkoRXVyb1N0YXRpb25zKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcm90ZWN0ZWQgc2VhcmNoQWlycG9ydHNGZXRjaGVyOiBCYXNlU2VhcmNoQWlycG9ydHNGZXRjaGVyPFNBX1E+LFxyXG4gICAgcHJvdGVjdGVkIHNlYXJjaEFpcmxpbmVzRmV0Y2hlcjogQmFzZVNlYXJjaEFpcmxpbmVzRmV0Y2hlcjxTQUxfUT4sXHJcbiAgICBwcm90ZWN0ZWQgc3RvcmFnZVNlcnZpY2U6IEJhc2VTdG9yYWdlU2VydmljZSxcclxuICAgIHByb3RlY3RlZCB1c2VyU2VydmljZTogVXNlclNlcnZpY2VJbnRlcmZhY2UsXHJcbiAgICBwcm90ZWN0ZWQgbW9kYWxTZXJ2aWNlOiBCYXNlTW9kYWxPcGVuZXJTZXJ2aWNlLFxyXG4gICAgcHJvdGVjdGVkIHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHJvdGVjdGVkIGhlbHBlcnM6IEJhc2VIZWxwZXJSb3V0aW5lcyxcclxuICAgIHByb3RlY3RlZCBob3RlbEF2YWxpYmlsaXR5U2VydmljZTogQmFzZUhvdGVsQXZhbGliaWxpdHlTZXJ2aWNlPEhBX1E+LFxyXG4gICAgcHJpdmF0ZSBjaXRpZXNGZXRjaGVyOiBCYXNlU2VhcmNoQ2l0eUZldGNoZXI8U0NfUT4sXHJcbiAgICBwcml2YXRlIGNvbmZlcm1hQ2l0aWVzRmV0Y2hlcjogQmFzZVNlYXJjaENvbmZlcm1hQ2l0eUZldGNoZXI8U0NDX1E+LFxyXG4gICAgcHJpdmF0ZSBwb3N0Y29kZUZldGNoZXI6IEJhc2VTZWFyY2hQb3N0Y29kZUZldGNoZXI8U1BfUT4sXHJcbiAgICBwcml2YXRlIHJhaWxTdGF0aW9uRmV0Y2hlcjogQmFzZVNlYXJjaFJhaWxTdGF0aW9uc0ZldGNoZXI8U1JfUT4sXHJcbiAgICBwcml2YXRlIHNhdmVVc2VyQWRkcmVzc1VwZGF0ZXI6IEJhc2VTYXZlVXNlckFkZHJlc3NVcGRhdGVyPFNVQV9RPixcclxuICAgIHByaXZhdGUgdXNlckFkZHJlc3Nlc0ZldGNoZXI6IEJhc2VVc2VyQWRkcmVzc2VzRmV0Y2hlcjxTVV9RPixcclxuICAgIHByaXZhdGUgYmFza2V0U2VydmljZTogRW50ZXJwcmlzZUJhc2tldFNlcnZpY2VJbnRlcmZhY2UsXHJcbiAgICBwcml2YXRlIGdldFVzZXJDb21wYW55T2ZmaWNlc0ZldGNoZXI6IEJhc2VHZXRVc2VyQ29tcGFueU9mZmljZXNGZXRjaGVyPEdVQ09fUT4sXHJcbiAgICBwcml2YXRlIHNlYXJjaEhvdGVsQ2hhaW5zRmV0Y2hlcjogQmFzZVNlYXJjaEhvdGVsQ2hhaW5zRmV0Y2hlcjxTSENfUT4sXHJcbiAgICBwcml2YXRlIGdldENvbmZlcm1hUm9vbUltYWdlc0ZldGNoZXI6IEJhc2VHZXRDb25mZXJtYVJvb21JbWFnZXNGZXRjaGVyPEdDUklfUT4sXHJcbiAgICBwcml2YXRlIGJhc2VWYWxpZGF0ZUlzUG9zdGNvZGVWYWxpZFRlc3RlcjogQmFzZVZhbGlkYXRlSXNQb3N0Y29kZVZhbGlkVGVzdGVyPElQVl9RPixcclxuICAgIHByaXZhdGUgZGVwb3RGZXRjaGVyOiBCYXNlU2VhcmNoRGVwb3RGZXRjaGVyPFNEX1E+LFxyXG4gICAgcHJpdmF0ZSBjb25mZXJtYU9mZmljZU5hbWVzRmV0Y2hlcjogQmFzZUNvbmZlcm1hT2ZmaWNlTmFtZXNGZXRjaGVyPEdPTl9RPixcclxuICAgIHByaXZhdGUgY29uZmVybWFPZmZpY2VGZXRjaGVyOiBCYXNlQ29uZmVybWFPZmZpY2VGZXRjaGVyPENPX1E+LFxyXG4gICAgcHJpdmF0ZSBiYXNlRGVsZXRlVXNlckFkZHJlc3NVcGRhdGVyOiBCYXNlRGVsZXRlVXNlckFkZHJlc3NVcGRhdGVyPERVQV9RPixcclxuICAgIHByaXZhdGUgYmFzZURlbGV0ZVJlY2VudFNlYXJjaFVwZGF0ZXI6IEJhc2VEZWxldGVSZWNlbnRTZWFyY2hVcGRhdGVyPERSU19RPixcclxuICAgIHByaXZhdGUgYmFzZVNhdmVSZWNlbnRTZWFyY2hVcGRhdGVyOiBCYXNlU2F2ZVJlY2VudFNlYXJjaFVwZGF0ZXI8U1JTX1E+LFxyXG4gICAgcHJpdmF0ZSBnZXRVc2VyQ3VycmVudENhcmJvbkFsbG93YW5jZUZldGNoZXI6IEJhc2VHZXRVc2VyQ3VycmVudENhcmJvbkFsbG93YW5jZUZldGNoZXI8VUNBX1E+LFxyXG4gICAgcHJpdmF0ZSBiYXNlU2F2ZUZhdm91cml0ZVNlYXJjaFVwZGF0ZXI6IEJhc2VTYXZlRmF2b3VyaXRlU2VhcmNoVXBkYXRlcjxTRlNfUT4sXHJcbiAgICBlbnZpcm9ubWVudDogQmFzZUVudmlyb25tZW50LFxyXG4gICAgbG91bmdlRmV0Y2hlcjogQmFzZUxvdW5nZVF1b3RlRmV0Y2hlcjxTTF9RPixcclxuICAgIHBhcmtpbmdGZXRjaGVyOiBCYXNlUGFya2luZ1F1b3RlRmV0Y2hlcjxTUEFfUT4sXHJcbiAgICBodHRwQ2FsbFNlcnZpY2U6IEFic3RyYWN0SHR0cENhbGxTZXJ2aWNlLFxyXG4gICAgZmxpZ2h0RmV0Y2hlcjogQmFzZUZsaWdodFF1b3RlRmV0Y2hlcjxTRkxfUT4sXHJcbiAgICBob3RlbEZldGNoZXI6IEJhc2VIb3RlbFF1b3RlRmV0Y2hlcjxTSE9fUT4sXHJcbiAgICBjYXJoaXJlRmV0Y2hlcjogQmFzZUNhcmhpcmVRdW90ZUZldGNoZXI8U0NIX1E+LFxyXG4gICAgY2FySGlyZUF2YWlsYWJpbGl0eURldGFpbEZldGNoZXI6IEJhc2VDYXJIaXJlQXZhaWxhYmlsaXR5RGV0YWlsRmV0Y2hlcjxDSEFEX1E+LFxyXG4gICAgY2FiaGlyZUZldGNoZXI6IEJhc2VDYWJoaXJlUXVvdGVGZXRjaGVyPFNUSF9RPixcclxuICAgIHJhaWxGZXRjaGVyOiBCYXNlUmFpbFF1b3RlRmV0Y2hlcjxTUkFfUT4sXHJcbiAgICBpcmxGZXRjaGVyOiBCYXNlSXJsUXVvdGVGZXRjaGVyPFNJX1E+LFxyXG4gICAgcHJvdGVjdGVkIGdldFJhaWxTdGF0aW9uRmV0Y2hlcjogQmFzZUdldFJhaWxTdGF0aW9uRmV0Y2hlcjxHUlNfUT4sXHJcbiAgICBiYXNlV2ViVG9rZW5TZXJ2aWNlOiBCYXNlV2ViVG9rZW5TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByaXNrQWxlcnRzRmV0Y2hlcjogQmFzZUdldFJpc2tBbGVydHNGZXRjaGVyPEdSQV9RPixcclxuICAgIHF1aWNrbGlzdEZldGNoZXI6IEJhc2VTZWFyY2hDb25mZXJtYVF1aWNrbGlzdEZldGNoZXI8UUxfUT4sXHJcbiAgICBwcml2YXRlIGdldFVzZXJSZWNlbnRTZWFyY2hlc0ZldGNoZXI6IEJhc2VHZXRVc2VyUmVjZW50U2VhcmNoZXNGZXRjaGVyPEdVUlNGX1E+LFxyXG4gICAgcHJvdGVjdGVkIGdldFJhaWxDYXJkc0ZldGNoZXI6IEJhc2VHZXRSYWlsY2FyZHNGZXRjaGVyPEdSQ0ZfUT4sXHJcbiAgICBwcm90ZWN0ZWQgZ2V0Q292aWRNaWNyb3NpdGVUb2tlbkZldGNoZXI6IEJhc2VHZXRDb3ZpZE1pY3Jvc2l0ZVRva2VuRmV0Y2hlcjxHQ01URl9RPixcclxuICAgIGV1cm9zdGFyRmV0Y2hlcjogQmFzZUV1cm9zdGFyUXVvdGVGZXRjaGVyPFNFX1E+LFxyXG4gICAgcHVibGljIHNlYXJjaFVzZXJzQ2FuQm9va0ZvckZldGNoZXI6IEJhc2VTZWFyY2hVc2Vyc0NhbkJvb2tGb3JGZXRjaGVyPFNVQ0JGPixcclxuICAgIHByb3RlY3RlZCBzZWFyY2hJcmxTdGF0aW9uc0ZldGNoZXI6IEJhc2VTZWFyY2hJcmxTdGF0aW9uc0ZldGNoZXI8U0lTX1E+LFxyXG4gICAgcHJvdGVjdGVkIGlybERpc2NvdW50Q2FyZHNGZXRjaGVyOiBCYXNlSXJsRGlzY291bnRDYXJkRmV0Y2hlcjxHSURGX1E+LFxyXG4gICAgcHJpdmF0ZSBnZXRGbGlnaHRGYXJlUnVsZXNGZXRjaGVyOiBCYXNlR2V0RmxpZ2h0RmFyZVJ1bGVzRmV0Y2hlcjxHRkZSX1E+LFxyXG4gICAgcHJpdmF0ZSBnZXRGbGlnaHRTZWF0TWFwRmV0Y2hlcjogQmFzZUdldEZsaWdodFNlYXRNYXBGZXRjaGVyPEdGU01fUT4sXHJcbiAgICBwcml2YXRlIGdldFJhaWxMaXZlRGVwYXJ0dXJlc0ZldGNoZXI6IEJhc2VHZXRSYWlsTGl2ZURlcGFydHVyZXNGZXRjaGVyPEdSTERfRj4sXHJcbiAgICBhcHBseUhvdGVsUnVsZXNGZXRjaGVyOiBCYXNlSG90ZWxSdWxlc0ZldGNoZXI8QUhSX1E+LFxyXG4gICAgYXBwbHlGbGlnaHRSdWxlczogQmFzZUFwcGx5Sml0RmxpZ2h0UnVsZXNGZXRjaGVyPEFGUl9RPixcclxuICAgIHByaXZhdGUgZ2V0VXNlckZhdm91cml0ZVNlYXJjaGVzRmV0Y2hlcjogQmFzZUdldFVzZXJGYXZvdXJpdGVTZWFyY2hlc0ZldGNoZXI8R1VGU0ZfUT4sXHJcbiAgICBwcml2YXRlIGRlbGV0ZUZhdm91cml0ZVNlYXJjaFVwZGF0ZXI6IEJhc2VEZWxldGVGYXZvdXJpdGVTZWFyY2hVcGRhdGVyPERGU19RPixcclxuXHJcbiAgKSB7XHJcbiAgICBjb25zb2xlLmxvZygnRW50ZXJwaXNlIHNlYXJjaCBzZXJ2aWNlIGJlaW5nIGluaXRlZCcpO1xyXG4gICAgdGhpcy5zZWFyY2hlcyA9IHtcclxuICAgICAgW1NlcnZpY2VUeXBlLkxvdW5nZV06IG5ldyBMb3VuZ2VzRW50ZXJwcmlzZVNlYXJjaChcclxuICAgICAgICBsb3VuZ2VGZXRjaGVyLFxyXG4gICAgICAgIGhlbHBlcnMsXHJcbiAgICAgICAgYmFza2V0U2VydmljZSxcclxuICAgICAgICBzdG9yYWdlU2VydmljZSxcclxuICAgICAgICB0aGlzXHJcbiAgICAgICksXHJcbiAgICAgIFtTZXJ2aWNlVHlwZS5QYXJraW5nXTogbmV3IFBhcmtpbmdFbnRlcnByaXNlU2VhcmNoKFxyXG4gICAgICAgIHBhcmtpbmdGZXRjaGVyLFxyXG4gICAgICAgIGhlbHBlcnMsXHJcbiAgICAgICAgYmFza2V0U2VydmljZSxcclxuICAgICAgICBzdG9yYWdlU2VydmljZSxcclxuICAgICAgICB0aGlzXHJcbiAgICAgICksXHJcbiAgICAgIFtTZXJ2aWNlVHlwZS5GbGlnaHRdOiBuZXcgRmxpZ2h0RW50ZXJwcmlzZVNlYXJjaChcclxuICAgICAgICBmbGlnaHRGZXRjaGVyLFxyXG4gICAgICAgIGhlbHBlcnMsXHJcbiAgICAgICAgdXNlclNlcnZpY2UsXHJcbiAgICAgICAgYmFza2V0U2VydmljZSxcclxuICAgICAgICBzdG9yYWdlU2VydmljZSxcclxuICAgICAgICB0aGlzLFxyXG4gICAgICAgIGFwcGx5RmxpZ2h0UnVsZXMsXHJcbiAgICAgICAgbW9kYWxTZXJ2aWNlXHJcbiAgICAgICksXHJcbiAgICAgIFtTZXJ2aWNlVHlwZS5Ib3RlbF06IG5ldyBIb3RlbEVudGVycHJpc2VTZWFyY2goXHJcbiAgICAgICAgaG90ZWxGZXRjaGVyLFxyXG4gICAgICAgIGhlbHBlcnMsXHJcbiAgICAgICAgdXNlclNlcnZpY2UsXHJcbiAgICAgICAgZW52aXJvbm1lbnQsXHJcbiAgICAgICAgaG90ZWxBdmFsaWJpbGl0eVNlcnZpY2UsXHJcbiAgICAgICAgYmFza2V0U2VydmljZSxcclxuICAgICAgICBzdG9yYWdlU2VydmljZSxcclxuICAgICAgICB0aGlzLFxyXG4gICAgICAgIGh0dHBDYWxsU2VydmljZSxcclxuICAgICAgICBxdWlja2xpc3RGZXRjaGVyLFxyXG4gICAgICAgIGdldFJhaWxTdGF0aW9uRmV0Y2hlcixcclxuICAgICAgICBhcHBseUhvdGVsUnVsZXNGZXRjaGVyXHJcbiAgICAgICksXHJcbiAgICAgIFtTZXJ2aWNlVHlwZS5DYXJdOiBuZXcgQ2FyaGlyZUVudGVycHJpc2VTZWFyY2goXHJcbiAgICAgICAgY2FyaGlyZUZldGNoZXIsXHJcbiAgICAgICAgY2FySGlyZUF2YWlsYWJpbGl0eURldGFpbEZldGNoZXIsXHJcbiAgICAgICAgaGVscGVycyxcclxuICAgICAgICBiYXNrZXRTZXJ2aWNlLFxyXG4gICAgICAgIHN0b3JhZ2VTZXJ2aWNlLFxyXG4gICAgICAgIHRoaXNcclxuICAgICAgKSxcclxuICAgICAgW1NlcnZpY2VUeXBlLkNhYl06IG5ldyBDYWJIaXJlRW50ZXJwcmlzZVNlYXJjaChcclxuICAgICAgICBjYWJoaXJlRmV0Y2hlcixcclxuICAgICAgICBoZWxwZXJzLFxyXG4gICAgICAgIHN0b3JhZ2VTZXJ2aWNlLFxyXG4gICAgICAgIHRoaXMsXHJcbiAgICAgICAgYmFza2V0U2VydmljZVxyXG4gICAgICApLFxyXG4gICAgICBbU2VydmljZVR5cGUuSW50ZXJuYXRpb25hbFJhaWxdOiBuZXcgSVJMRW50ZXJwcmlzZVNlYXJjaChcclxuICAgICAgICBpcmxGZXRjaGVyLFxyXG4gICAgICAgIGlybERpc2NvdW50Q2FyZHNGZXRjaGVyLFxyXG4gICAgICAgIGhlbHBlcnMsXHJcbiAgICAgICAgYmFza2V0U2VydmljZSxcclxuICAgICAgICBzdG9yYWdlU2VydmljZSxcclxuICAgICAgICB0aGlzXHJcbiAgICAgICksXHJcbiAgICAgIFtTZXJ2aWNlVHlwZS5GYXN0VHJhY2tdOiBudWxsLFxyXG4gICAgICBbU2VydmljZVR5cGUuQ29hY2hdOiBudWxsLFxyXG4gICAgICBbU2VydmljZVR5cGUuUmFpbF06IG5ldyBSYWlsRW50ZXJwcmlzZVNlYXJjaChcclxuICAgICAgICByYWlsRmV0Y2hlcixcclxuICAgICAgICBnZXRSYWlsU3RhdGlvbkZldGNoZXIsXHJcbiAgICAgICAgaGVscGVycyxcclxuICAgICAgICBiYXNrZXRTZXJ2aWNlLFxyXG4gICAgICAgIHN0b3JhZ2VTZXJ2aWNlLFxyXG4gICAgICAgIHRoaXMsXHJcbiAgICAgICAgdXNlclNlcnZpY2UsXHJcbiAgICAgICAgbW9kYWxTZXJ2aWNlXHJcbiAgICAgICksXHJcbiAgICAgIFtTZXJ2aWNlVHlwZS5FdXJvc3Rhcl06IG5ldyBFdXJvc3RhckVudGVycHJpc2VTZWFyY2goXHJcbiAgICAgICAgZXVyb3N0YXJGZXRjaGVyLFxyXG4gICAgICAgIGhlbHBlcnMsXHJcbiAgICAgICAgdXNlclNlcnZpY2UsXHJcbiAgICAgICAgYmFza2V0U2VydmljZSxcclxuICAgICAgICBzdG9yYWdlU2VydmljZSxcclxuICAgICAgICB0aGlzXHJcbiAgICAgIClcclxuICAgIH07XHJcbiAgICBjb25zb2xlLmxvZygnTmV3bHkgY3JlYXRlZCBzZWFyY2ggb2JqZWN0czogJywgdGhpcy5zZWFyY2hlcyk7XHJcbiAgICB0aGlzLnNlYXJjaF9vYmplY3RzID0gdGhpcy5oZWxwZXJzLmNsb25lKHRoaXMuaW5pdF9zZWFyY2hfb2JqZWN0cygpKTtcclxuICAgIHRoaXMuc2VsZWN0ZWRUcmF2ZWxsZXJzID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRTZXNzaW9uSXRlbUFzTGlzdDxcclxuICAgICAgVHJhdmVsbGVyW11cclxuICAgID4oQmFzZUVudGVycHJpc2VTZWFyY2hTZXJ2aWNlLlNFU1NJT05fVFJBVkVMTEVSKTtcclxuICAgIHRoaXMudHJhdmVsbGVySW5mb3JtYXRpb24ubmV4dCh0aGlzLnNlbGVjdGVkVHJhdmVsbGVycyk7XHJcbiAgICB1c2VyU2VydmljZS5mdWxsVXNlckRldGFpbHMudXNlclNlcnZpY2VzLnN1YnNjcmliZShcclxuICAgICAgKHNlcnZpY2VzOiBVc2VyU2VydmljZXMpID0+IHtcclxuICAgICAgICBpZiAoc2VydmljZXMpIHtcclxuICAgICAgICAgIHRoaXMuc2VhcmNoX29iamVjdHMgPSBPYmplY3Qua2V5cyh0aGlzLnNlYXJjaF9vYmplY3RzKS5yZWR1Y2UoXHJcbiAgICAgICAgICAgIChvYmplY3RzOiBTZWFyY2hPYmplY3RzLCBrZXk6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICAgIChvYmplY3RzIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW2tleV0uZW5hYmxlZCA9XHJcbiAgICAgICAgICAgICAgICAhIXNlcnZpY2VzICYmICEhc2VydmljZXNba2V5XTtcclxuICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0cztcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2hfb2JqZWN0c1xyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICk7XHJcblxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5jb3VudHJpZXMpKSB7XHJcbiAgICAgIHRoaXMuY291bnRyaWVzID0gdGhpcy5jb3VudHJpZXMuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgIGlmIChhLmNOYW1lIDwgYi5jTmFtZSkge1xyXG4gICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYS5jTmFtZSA+IGIuY05hbWUpIHtcclxuICAgICAgICAgIHJldHVybiAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gMDtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYmFzZVdlYlRva2VuU2VydmljZS5hdXRvTG9nb3V0Q29uZmlnID0gdGhpcy5nZXRBdXRvTG9nb3V0Q29uZmlnKCk7XHJcbiAgfVxyXG5cclxuICByZXNldCgpIHtcclxuICAgIHRoaXMucmVzZXRBbGxTZWFyY2hJdGVtcygpO1xyXG4gICAgdGhpcy5iYXNrZXRTZXJ2aWNlLnJlc2V0KCk7XHJcbiAgfVxyXG5cclxuICByZXNldEFsbFNlYXJjaEl0ZW1zKCkge1xyXG4gICAgT2JqZWN0LnZhbHVlcyh0aGlzLnNlYXJjaGVzKS5mb3JFYWNoKFxyXG4gICAgICAoaXRlbTogQmFzZUVudGVycHJpc2VTZWFyY2g8YW55LCBhbnksIGFueVtdPikgPT4ge1xyXG4gICAgICAgIGl0ZW0/LnJlc2V0KCk7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgICB0aGlzLnJlbW92ZUFsbFRyYXZlbGxlcnMoKTtcclxuICAgIHRoaXMucmVzZXRTZWFyY2hPYmplY3RzKCk7XHJcbiAgfVxyXG5cclxuICBnZXRVc2VyQ3VycmVudENhcmJvbkFsbG93YW5jZShcclxuICAgIHVzZXI/OiBzdHJpbmcsXHJcbiAgICBpc0xvYWRpbmc/OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj5cclxuICApOiBPYnNlcnZhYmxlPENhcmJvbkFsbG93YW5jZT4ge1xyXG4gICAgaWYgKGlzTG9hZGluZykge1xyXG4gICAgICBpc0xvYWRpbmcubmV4dCh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBxdWVyeSA9IHsgdXNlciB9O1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0VXNlckN1cnJlbnRDYXJib25BbGxvd2FuY2VGZXRjaGVyLmZldGNoTGlzdChxdWVyeSkucGlwZShcclxuICAgICAgdGFrZSgxKSxcclxuICAgICAgbWFwKChyZXN1bHRzOiBDYXJib25BbGxvd2FuY2UpID0+IHtcclxuICAgICAgICByZXR1cm4gcmVzdWx0cztcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBnZXRSaXNrQWxlcnRzKFxyXG4gICAgbWluTGV2ZWw6IFJpc2tMZXZlbCxcclxuICAgIG1heExldmVsOiBSaXNrTGV2ZWwsXHJcbiAgICBjb3VudHJ5SXNvQ29kZTogc3RyaW5nLFxyXG4gICAgaXNMb2FkaW5nPzogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+XHJcbiAgKTogT2JzZXJ2YWJsZTxSaXNrQWxlcnRbXT4ge1xyXG4gICAgaWYgKGlzTG9hZGluZykge1xyXG4gICAgICBpc0xvYWRpbmcubmV4dCh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBxdWVyeTogR2V0Umlza0FsZXJ0c1F1ZXJ5VmFyaWFibGVzID0ge1xyXG4gICAgICBtaW5MZXZlbCxcclxuICAgICAgbWF4TGV2ZWwsXHJcbiAgICAgIGNvdW50cnlJc29Db2RlXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB0aGlzLnJpc2tBbGVydHNGZXRjaGVyLmZldGNoTGlzdChxdWVyeSkucGlwZShcclxuICAgICAgdGFrZSgxKSxcclxuICAgICAgbWFwKChyZXN1bHQ6IFJpc2tBbGVydFtdKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzTG9hZGluZykge1xyXG4gICAgICAgICAgaXNMb2FkaW5nLm5leHQoZmFsc2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBnZXRBaXJwb3J0c0xpc3QoXHJcbiAgICB0ZXJtOiBzdHJpbmcsXHJcbiAgICBjb3VudHJ5Q29kZT86IENvdW50cnlDb2RlLFxyXG4gICAgaXNMb2FkaW5nPzogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+LFxyXG4gICAgaGFzTG91bmdlPzogYm9vbGVhbixcclxuICAgIGhhc1Bhcmtpbmc/OiBib29sZWFuLFxyXG4gICAgaGFzRmFzdFRyYWNrPzogYm9vbGVhblxyXG4gICk6IE9ic2VydmFibGU8T0JUQWlycG9ydERldGFpbHNbXT4ge1xyXG4gICAgaWYgKHRlcm0ubGVuZ3RoID4gMikge1xyXG4gICAgICBpZiAoaXNMb2FkaW5nKSB7XHJcbiAgICAgICAgaXNMb2FkaW5nLm5leHQodHJ1ZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHF1ZXJ5OiBTZWFyY2hBaXJwb3J0cy5WYXJpYWJsZXMgPSB7IHF1ZXJ5OiB0ZXJtIH07XHJcbiAgICAgIGlmICghIWNvdW50cnlDb2RlKSB7XHJcbiAgICAgICAgcXVlcnkuY291bnRyeUNvZGUgPSBjb3VudHJ5Q29kZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodHlwZW9mIGhhc0xvdW5nZSA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgICAgcXVlcnkuaGFzTG91bmdlID0gaGFzTG91bmdlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0eXBlb2YgaGFzUGFya2luZyA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgICAgcXVlcnkuaGFzUGFya2luZyA9IGhhc1Bhcmtpbmc7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHR5cGVvZiBoYXNGYXN0VHJhY2sgPT09ICdib29sZWFuJykge1xyXG4gICAgICAgIHF1ZXJ5Lmhhc0Zhc3RUcmFjayA9IGhhc0Zhc3RUcmFjaztcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGhpcy5zZWFyY2hBaXJwb3J0c0ZldGNoZXIuZmV0Y2hPbmUocXVlcnkpLnBpcGUoXHJcbiAgICAgICAgdGFrZSgxKSxcclxuICAgICAgICBtYXAoKHJlc3VsdHM6IEFpcnBvcnRTZWFyY2hSZXN1bHRzKSA9PiB7XHJcbiAgICAgICAgICBpZiAoaXNMb2FkaW5nKSB7XHJcbiAgICAgICAgICAgIGlzTG9hZGluZy5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAocmVzdWx0cyAmJiByZXN1bHRzLmdlbmVyYWxNYXRjaGVzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGdlbmVyYWxNYXRjaGVzID0gdGhpcy5oZWxwZXJzLmNsb25lKHJlc3VsdHMuZ2VuZXJhbE1hdGNoZXMpO1xyXG5cclxuICAgICAgICAgICAgLy8gUmVtb3ZpbmcgdGhpcyBhcyB0aGlzIGNyZWF0ZXMgZHVwbGljYXRlIGFpcnBvcnRzIGluIHRoZSBsaXN0XHJcbiAgICAgICAgICAgIC8vIGlmIChyZXN1bHRzLmlhdGFNYXRjaCkge1xyXG4gICAgICAgICAgICAvLyAgIGdlbmVyYWxNYXRjaGVzLnB1c2gocmVzdWx0cy5pYXRhTWF0Y2gpO1xyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgZ2VuZXJhbE1hdGNoZXNcclxuICAgICAgICAgICAgICAgIC8vIC5maWx0ZXIoKGFpcnBvcnQ6IEFpcnBvcnRSZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgICAgIC8vICAgcmV0dXJuICEhY291bnRyeUNvZGVcclxuICAgICAgICAgICAgICAgIC8vICAgICA/IGNvdW50cnlDb2RlID09PSBhaXJwb3J0LmRldGFpbHMuY291bnRyeUNvZGVcclxuICAgICAgICAgICAgICAgIC8vICAgICA6IGFpcnBvcnQ7XHJcbiAgICAgICAgICAgICAgICAvLyB9KVxyXG4gICAgICAgICAgICAgICAgLm1hcCgoYWlycG9ydDogQWlycG9ydCk6IE9CVEFpcnBvcnREZXRhaWxzID0+IHtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbjogYWlycG9ydC5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgIGdhdGV3YXk6IGFpcnBvcnQuaWF0YSxcclxuICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hbHM6IHRoaXMucHJvY2Vzc1Rlcm1pbmFscyhhaXJwb3J0LnRlcm1pbmFscyksXHJcbiAgICAgICAgICAgICAgICAgICAgY291bnRyeTogYWlycG9ydD8ubG9jYXRpb25EZXRhaWxzPy5jb3VudHJ5LFxyXG4gICAgICAgICAgICAgICAgICAgIHBvc3Rjb2RlOiBhaXJwb3J0Py5sb2NhdGlvbkRldGFpbHM/LnBvc3Rjb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvdW50cnlDb2RlOiBhaXJwb3J0Py5sb2NhdGlvbkRldGFpbHM/LmNvdW50cnlDb2RlXHJcbiAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gb2YoW10pO1xyXG4gICAgfVxyXG4gIH1cclxuICBnZXRBaXJsaW5lc0xpc3QoXHJcbiAgICB0ZXJtOiBzdHJpbmcsXHJcbiAgICBpc0xvYWRpbmc/OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj5cclxuICApOiBPYnNlcnZhYmxlPE9CVEFpcmxpbmVzRGV0YWlsc1tdPiB7XHJcbiAgICBpZiAodGVybS5sZW5ndGggPj0gMikge1xyXG4gICAgICBpZiAoaXNMb2FkaW5nKSB7XHJcbiAgICAgICAgaXNMb2FkaW5nLm5leHQodHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgcXVlcnk6IFNlYXJjaEFpcmxpbmVzLlZhcmlhYmxlcyA9IHsgcXVlcnk6IHRlcm0gfTtcclxuICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoQWlybGluZXNGZXRjaGVyLmZldGNoT25lKHF1ZXJ5KS5waXBlKFxyXG4gICAgICAgIHRha2UoMSksXHJcbiAgICAgICAgbWFwKChyZXN1bHRzOiBBaXJsaW5lc1NlYXJjaFJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgaWYgKGlzTG9hZGluZykge1xyXG4gICAgICAgICAgICBpc0xvYWRpbmcubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHJlc3VsdHMgJiYgcmVzdWx0cy5nZW5lcmFsTWF0Y2hlcykge1xyXG4gICAgICAgICAgICBjb25zdCBnZW5lcmFsTWF0Y2hlcyA9IHRoaXMuaGVscGVycy5jbG9uZShyZXN1bHRzLmdlbmVyYWxNYXRjaGVzKTtcclxuICAgICAgICAgICAgcmV0dXJuIGdlbmVyYWxNYXRjaGVzLm1hcChcclxuICAgICAgICAgICAgICAoYWlybGluZXM6IEFpcmxpbmVSZXN1bHQpOiBPQlRBaXJsaW5lc0RldGFpbHMgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgY29kZTogYWlybGluZXMuaWF0YSxcclxuICAgICAgICAgICAgICAgICAgbmFtZTogYWlybGluZXMubmFtZVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBvZihbXSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldEFpcnBvcnRMb2NhdGlvbnMoXHJcbiAgICB0ZXJtOiBzdHJpbmcsXHJcbiAgICBjb3VudHJ5Q29kZTogQ291bnRyeUNvZGUsXHJcbiAgICBpc0xvYWRpbmc/OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4sXHJcbiAgICBoYXNMb3VuZ2U/OiBib29sZWFuLFxyXG4gICAgaGFzUGFya2luZz86IGJvb2xlYW4sXHJcbiAgICBoYXNGYXN0VHJhY2s/OiBib29sZWFuXHJcbiAgKTogT2JzZXJ2YWJsZTxMb2NhdGlvbkRldGFpbHNbXT4ge1xyXG4gICAgY29uc3QgY29udmVydCA9IChyZXN1bHRzOiBPQlRBaXJwb3J0RGV0YWlsc1tdKTogTG9jYXRpb25EZXRhaWxzW10gPT4ge1xyXG4gICAgICByZXR1cm4gcmVzdWx0cy5tYXAoKHJlc3VsdDogT0JUQWlycG9ydERldGFpbHMpID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgbmFtZTogcmVzdWx0LmRlc3RpbmF0aW9uLFxyXG4gICAgICAgICAgdHlwZTogTG9jYXRpb25UeXBlcy5BaXJwb3J0LFxyXG4gICAgICAgICAgYWlycG9ydDogcmVzdWx0XHJcbiAgICAgICAgfTtcclxuICAgICAgfSk7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0QWlycG9ydHNMaXN0KFxyXG4gICAgICB0ZXJtLFxyXG4gICAgICBjb3VudHJ5Q29kZSxcclxuICAgICAgaXNMb2FkaW5nLFxyXG4gICAgICBoYXNMb3VuZ2UsXHJcbiAgICAgIGhhc1BhcmtpbmcsXHJcbiAgICAgIGhhc0Zhc3RUcmFja1xyXG4gICAgKS5waXBlKG1hcChjb252ZXJ0KSk7XHJcbiAgfVxyXG5cclxuICBnZXRDaXR5TG9jYXRpb25zKFxyXG4gICAgdGVybTogc3RyaW5nLFxyXG4gICAgY291bnRyeUNvZGU/OiBDb3VudHJ5Q29kZSxcclxuICAgIGlzTG9hZGluZz86IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPixcclxuICAgIGlzQ29uZmlybWE/OiBib29sZWFuXHJcbiAgKTogT2JzZXJ2YWJsZTxMb2NhdGlvbkRldGFpbHNbXT4ge1xyXG4gICAgaWYgKHRlcm0ubGVuZ3RoIDw9IDIpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKGlzQ29uZmlybWEpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29uZmVybWFDaXR5TG9jYXRpb25zKHRlcm0sIGNvdW50cnlDb2RlLCBpc0xvYWRpbmcpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2dldENpdHlMb2NhdGlvbnModGVybSwgY291bnRyeUNvZGUsIGlzTG9hZGluZyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBfZ2V0Q2l0eUxvY2F0aW9ucyhcclxuICAgIHRlcm06IHN0cmluZyxcclxuICAgIGNvdW50cnlDb2RlPzogQ291bnRyeUNvZGUsXHJcbiAgICBpc0xvYWRpbmc/OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj5cclxuICApOiBPYnNlcnZhYmxlPExvY2F0aW9uRGV0YWlsc1tdPiB7XHJcbiAgICBpc0xvYWRpbmc/Lm5leHQodHJ1ZSk7XHJcbiAgICBjb25zdCBxdWVyeTogYW55ID0geyBxdWVyeTogdGVybSB9O1xyXG4gICAgaWYgKGNvdW50cnlDb2RlKSB7XHJcbiAgICAgIHF1ZXJ5LmNvdW50cnlDb2RlID0gY291bnRyeUNvZGU7XHJcbiAgICB9XHJcbiAgICBjb25zdCBvYnM6IE9ic2VydmFibGU8U2VhcmNoQ2l0aWVzUmVzdWx0QXJyYXk+ID1cclxuICAgICAgdGhpcy5jaXRpZXNGZXRjaGVyLmZldGNoTGlzdChxdWVyeSk7XHJcbiAgICBjb25zdCBmdW5jID0gKHJlc3VsdHM6IFNlYXJjaENpdGllc1Jlc3VsdEFycmF5KTogTG9jYXRpb25EZXRhaWxzW10gPT4ge1xyXG4gICAgICBjb25zdCBkYXRhOiBMb2NhdGlvbkRldGFpbHNbXSA9IHJlc3VsdHMubWFwKFxyXG4gICAgICAgIChyZXN1bHQ6IFNlYXJjaENpdGllc1Jlc3VsdCk6IExvY2F0aW9uRGV0YWlscyA9PiB7XHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBuYW1lOiByZXN1bHQubmFtZSxcclxuICAgICAgICAgICAgbG9uZ2l0dWRlOiByZXN1bHQuY29vcmRpbmF0ZXMubG9uZ2l0dWRlLFxyXG4gICAgICAgICAgICBsYXRpdHVkZTogcmVzdWx0LmNvb3JkaW5hdGVzLmxhdGl0dWRlLFxyXG4gICAgICAgICAgICB0eXBlOiBMb2NhdGlvblR5cGVzLkNpdHksXHJcbiAgICAgICAgICAgIGNvdW50cnlDb2RlOiByZXN1bHQuY291bnRyeUNvZGUsXHJcbiAgICAgICAgICAgIGlkOiByZXN1bHQuaWRcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgICBpc0xvYWRpbmc/Lm5leHQoZmFsc2UpO1xyXG4gICAgICByZXR1cm4gZGF0YTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gb2JzLnBpcGUodGFrZSgxKSwgbWFwKGZ1bmMpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Q29uZmVybWFDaXR5TG9jYXRpb25zKFxyXG4gICAgdGVybTogc3RyaW5nLFxyXG4gICAgY291bnRyeUNvZGU/OiBDb3VudHJ5Q29kZSxcclxuICAgIGlzTG9hZGluZz86IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPlxyXG4gICk6IE9ic2VydmFibGU8TG9jYXRpb25EZXRhaWxzW10+IHtcclxuICAgIGlzTG9hZGluZz8ubmV4dCh0cnVlKTtcclxuICAgIGNvbnN0IHF1ZXJ5OiBhbnkgPSB7IGNpdHlOYW1lOiB0ZXJtIH07XHJcbiAgICBpZiAoY291bnRyeUNvZGUpIHtcclxuICAgICAgcXVlcnkuY291bnRyeUNvZGUgPSBjb3VudHJ5Q29kZTtcclxuICAgIH1cclxuICAgIGNvbnN0IG9iczogT2JzZXJ2YWJsZTxTZWFyY2hDb25mZXJtYUNpdGllc1Jlc3VsdD4gPVxyXG4gICAgICB0aGlzLmNvbmZlcm1hQ2l0aWVzRmV0Y2hlci5mZXRjaE9uZShxdWVyeSk7XHJcbiAgICBjb25zdCBmdW5jID0gKHJlc3VsdHM6IFNlYXJjaENvbmZlcm1hQ2l0aWVzUmVzdWx0KTogTG9jYXRpb25EZXRhaWxzW10gPT4ge1xyXG4gICAgICBjb25zdCBkYXRhOiBMb2NhdGlvbkRldGFpbHNbXSA9IHJlc3VsdHMuc3VnZ2VzdGlvbnMubWFwKFxyXG4gICAgICAgIChyZXN1bHQpOiBMb2NhdGlvbkRldGFpbHMgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgbmFtZTogcmVzdWx0Lm5hbWUsXHJcbiAgICAgICAgICAgIGxvbmdpdHVkZTogcmVzdWx0LmxvbmdpdHVkZSxcclxuICAgICAgICAgICAgbGF0aXR1ZGU6IHJlc3VsdC5sYXRpdHVkZSxcclxuICAgICAgICAgICAgdHlwZTogTG9jYXRpb25UeXBlcy5DaXR5LFxyXG4gICAgICAgICAgICBjb3VudHJ5Q29kZTogcmVzdWx0LmNvdW50cnlDb2RlXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgICAgaXNMb2FkaW5nPy5uZXh0KGZhbHNlKTtcclxuICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG9icy5waXBlKHRha2UoMSksIG1hcChmdW5jKSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gLSBnZXQgY2FyIGhpcmUgZGVwb3RzIGJhc2VkIG9uIGNpdHkgY29yZHNcclxuICAgKi9cclxuICBnZXRDYXJIaXJlRGVwb3RzKFxyXG4gICAgbGF0aXR1ZGU6IG51bWJlcixcclxuICAgIGxvbmdpdHVkZTogbnVtYmVyLFxyXG4gICAgcmFkaXVzPzogc3RyaW5nLFxyXG4gICAgaXNMb2FkaW5nPzogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+XHJcbiAgKTogT2JzZXJ2YWJsZTxDYXJIaXJlRGVwb3RSZXN1bHRBcnJheT4ge1xyXG4gICAgaXNMb2FkaW5nPy5uZXh0KHRydWUpO1xyXG4gICAgY29uc3QgcXVlcnk6IGFueSA9IHsgbGF0aXR1ZGUsIGxvbmdpdHVkZSB9O1xyXG4gICAgaWYgKHJhZGl1cykge1xyXG4gICAgICBxdWVyeS5yYWRpdXMgPSByYWRpdXM7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgb2JzOiBPYnNlcnZhYmxlPENhckhpcmVEZXBvdFJlc3VsdEFycmF5PiA9XHJcbiAgICAgIHRoaXMuZGVwb3RGZXRjaGVyLmZldGNoTGlzdChxdWVyeSk7XHJcblxyXG4gICAgcmV0dXJuIG9iczsgLy8gLnBpcGUodGFrZSgxKSwgbWFwKGZ1bmMpKTtcclxuXHJcbiAgICAvLyByZXR1cm4gb2YoW10pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIC0gZ2V0IHBvc3Rjb2RlIGxvY2F0aW9ucywgdGhlc2Ugd2lsbCB1c2UgcGFydGlhbCBwb3N0Y29kZSxcclxuICAgKiAgZnVsbCBhbmQgdGhlbiBncmFiYmluZyB0aGVtIHdpbGwgbGV0IHVzIGZpbGwgaW4gdGhlIGFkZHJlc3MgZm9ybVxyXG4gICAqIEB0b2RvIC0gZmlsbCB0aGlzIG91dCBmb3IgdGhlIG90aGVyIGxvY2F0aW9uIHR5cGVzLCBtYXkgbmVlZCB0byBtZXJnZU1hcCB0aGVtIG9yIHNvbWUgb3RoZXIgcnhqcyBtYWdpY1xyXG4gICAqIEBwYXJhbSB0ZXJtIC0gdGhlIHRlcm0gdG8gc2VhcmNoIGJ5IGUuZy4gJ3dhMTQnIHNob3VsZCBicmluZyBiYWNrLCBvdXIgb2ZmaWNlLCAnbTMzJyBzaG9pdWxkIGJyaW5nIGJhY2sgbXkgYWRkcnNcclxuICAgKi9cclxuICBnZXRQb3N0Y29kZUxpc3QodGVybTogc3RyaW5nKTogT2JzZXJ2YWJsZTxMb2NhdGlvbkRldGFpbHNbXT4ge1xyXG4gICAgaWYgKFJlZ0V4cHMuVUtfUE9TVENPREUudGVzdCh0ZXJtKSkge1xyXG4gICAgICBjb25zdCBzdWJzID0gdGhpcy5wb3N0Y29kZUZldGNoZXIuZmV0Y2hMaXN0KHsgcG9zdGNvZGU6IHRlcm0gfSkucGlwZShcclxuICAgICAgICBtYXAoKHJlc3VsdHM6IFNlYXJjaFBvc3Rjb2Rlc1Jlc3VsdEFycmF5KSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzdWx0cy5tYXAoXHJcbiAgICAgICAgICAgIChyZXN1bHQ6IFNlYXJjaFBvc3Rjb2Rlc1Jlc3VsdCk6IExvY2F0aW9uRGV0YWlscyA9PiB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IHJlc3VsdC5wb3N0Y29kZSxcclxuICAgICAgICAgICAgICAgIHR5cGU6IExvY2F0aW9uVHlwZXMuUG9zdGNvZGUsXHJcbiAgICAgICAgICAgICAgICBsYXRpdHVkZTogcmVzdWx0LmxhdGl0dWRlLFxyXG4gICAgICAgICAgICAgICAgbG9uZ2l0dWRlOiByZXN1bHQubG9uZ2l0dWRlXHJcbiAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9KVxyXG4gICAgICApOyAvLyBleHBhbmQgdGhpcyB3aXRoIHRoZSBvdGhlciBzZWFyY2hlcyB3aGVuIHRoZXkgYXJlIGRvbmVcclxuXHJcbiAgICAgIHJldHVybiBzdWJzO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIG9mKFtdKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZFRvU2VsZWN0ZWRQbGFjZXMoYWRkcmVzczogQWRkcmVzcyk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3RlZFBsYWNlcy5wdXNoKGFkZHJlc3MpO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2VsZWN0ZWRQbGFjZUJ5SWQocGxhY2VJZDogc3RyaW5nKTogQWRkcmVzcyB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFBsYWNlcy5maW5kKFxyXG4gICAgICAocGxhY2U6IHsgcGxhY2VfaWQ6IHN0cmluZyB9KSA9PiBwbGFjZS5wbGFjZV9pZCA9PT0gcGxhY2VJZFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGdldENvbmZpcm1hT2ZmaWNlcyh0ZXJtOiBzdHJpbmcpOiBPYnNlcnZhYmxlPExvY2F0aW9uRGV0YWlsc1tdPiB7XHJcbiAgICBpZiAodGVybT8ubGVuZ3RoID4gMikge1xyXG4gICAgICBjb25zdCBvYnM6IE9ic2VydmFibGU8Q29uZmVybWFPZmZpY2VOYW1lUmVzdWx0PiA9XHJcbiAgICAgICAgdGhpcy5jb25mZXJtYU9mZmljZU5hbWVzRmV0Y2hlci5mZXRjaExpc3QoKTtcclxuICAgICAgY29uc3QgZnVuYyA9IChyZXN1bHRzOiBDb25mZXJtYU9mZmljZU5hbWVSZXN1bHQpOiBMb2NhdGlvbkRldGFpbHNbXSA9PiB7XHJcbiAgICAgICAgaWYgKCFyZXN1bHRzPy5yZXN1bHRzKSB7XHJcbiAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBkYXRhOiBMb2NhdGlvbkRldGFpbHNbXSA9IHJlc3VsdHMucmVzdWx0cy5tYXAoXHJcbiAgICAgICAgICAocmVzdWx0OiBDb25mZXJtYU9mZmljZU5hbWVzKTogTG9jYXRpb25EZXRhaWxzID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICBuYW1lOiByZXN1bHQubmFtZSxcclxuICAgICAgICAgICAgICB0eXBlOiBMb2NhdGlvblR5cGVzLk9mZmljZSxcclxuICAgICAgICAgICAgICBpZDogcmVzdWx0LmlkXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgfTtcclxuICAgICAgcmV0dXJuIG9icy5waXBlKHRha2UoMSksIG1hcChmdW5jKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG9mKFtdKTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogQGRlc2NyaXB0aW9uIC0gZ2V0IHRoZSBsaXN0IG9mIE9mZmljZSBsb2NhdGlvbnMgYmFzZWQgb24gc2VhcmNoIHRlcm0gZ2l2ZW5cclxuICAgKiBAdG9kbyAtIGZpbGwgdGhpcyBvdXQgc28gdGhhdCBpdCBhY3R1YWxseSBwZXJmb3JtcyBhIGh0dHAgY2FsbFxyXG4gICAqIEBwYXJhbSB0ZXJtIC0gdGhlIHRlcm0gd2Ugd2FudCB0byBzZWFyY2ggYnlcclxuICAgKiBAcmV0dXJuc1xyXG4gICAqL1xyXG4gIGdldE9mZmljZUxvY2F0aW9ucyh0ZXJtOiBzdHJpbmcpOiBPYnNlcnZhYmxlPExvY2F0aW9uRGV0YWlsc1tdPiB7XHJcbiAgICBpZiAodGVybS5sZW5ndGggPiAyKSB7XHJcbiAgICAgIGNvbnN0IG9iczogT2JzZXJ2YWJsZTxHZXRVc2VyQ29tcGFueU9mZmljZXNSZXN1bHRBcnJheT4gPVxyXG4gICAgICAgIHRoaXMuZ2V0VXNlckNvbXBhbnlPZmZpY2VzRmV0Y2hlci5mZXRjaExpc3QoKTtcclxuICAgICAgY29uc3QgZnVuYyA9IChcclxuICAgICAgICByZXN1bHRzOiBHZXRVc2VyQ29tcGFueU9mZmljZXNSZXN1bHRBcnJheVxyXG4gICAgICApOiBMb2NhdGlvbkRldGFpbHNbXSA9PiB7XHJcbiAgICAgICAgY29uc3QgZGF0YTogTG9jYXRpb25EZXRhaWxzW10gPSByZXN1bHRzLm1hcChcclxuICAgICAgICAgIChyZXN1bHQ6IEdldFVzZXJDb21wYW55T2ZmaWNlc1Jlc3VsdCk6IExvY2F0aW9uRGV0YWlscyA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgbmFtZTogcmVzdWx0Lm5hbWUsXHJcbiAgICAgICAgICAgICAgb2ZmaWNlOiByZXN1bHQuYWRkcmVzc2VzWzBdLFxyXG4gICAgICAgICAgICAgIHR5cGU6IExvY2F0aW9uVHlwZXMuT2ZmaWNlXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgfTtcclxuICAgICAgcmV0dXJuIG9icy5waXBlKHRha2UoMSksIG1hcChmdW5jKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG9mKFtdKTtcclxuICB9XHJcblxyXG4gIGdldFN0YXRpb25Mb2NhdGlvbnMoXHJcbiAgICB0ZXJtOiBzdHJpbmcsXHJcbiAgICBpc0xvYWRpbmc/OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj5cclxuICApOiBPYnNlcnZhYmxlPExvY2F0aW9uRGV0YWlsc1tdPiB7XHJcbiAgICBpZiAodGVybS5sZW5ndGggPiAyKSB7XHJcbiAgICAgIGlzTG9hZGluZz8ubmV4dCh0cnVlKTtcclxuICAgICAgcmV0dXJuIHRoaXMucmFpbFN0YXRpb25GZXRjaGVyXHJcbiAgICAgICAgLmZldGNoTGlzdCh7XHJcbiAgICAgICAgICBxdWVyeTogdGVybVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICB0YWtlKDEpLFxyXG4gICAgICAgICAgbWFwKChyZXN1bHRzOiBTZWFyY2hSYWlsU3RhdGlvbnNSZXN1bHRBcnJheSk6IExvY2F0aW9uRGV0YWlsc1tdID0+IHtcclxuICAgICAgICAgICAgaWYgKGlzTG9hZGluZykge1xyXG4gICAgICAgICAgICAgIGlzTG9hZGluZy5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0cyA/IHJlc3VsdHMubWFwKChyZXN1bHQ6IFNlYXJjaFJhaWxTdGF0aW9uc1Jlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiBMb2NhdGlvblR5cGVzLlRyYWluU3RhdGlvbixcclxuICAgICAgICAgICAgICAgIG5hbWU6IHJlc3VsdC5uYW1lLFxyXG4gICAgICAgICAgICAgICAgcmFpbHN0YXRpb246IHJlc3VsdFxyXG4gICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH0pIDogW107XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gb2YoW10pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIC0gZ2V0IGlybCBzdGF0aW9uIGxvY2F0aW9uc1xyXG4gICAqIEBwYXJhbSB0ZXJtIC0gdGhlIHRlcm0gdG8gc2VhcmNoXHJcbiAgICogQHBhcmFtIGlzTG9hZGluZyAtIEJlaGF2aW9yU3ViamVjdCBzbyB3ZSBrbm93IHNvbWV0aGluZyBpcyBoYXBwZW5pbmdcclxuICAgKi9cclxuICBzZWFyY2hJcmxTdGF0aW9uc0xvY2F0aW9ucyhcclxuICAgIHRlcm06IHN0cmluZyxcclxuICAgIGlzTG9hZGluZz86IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPlxyXG4gICk6IE9ic2VydmFibGU8TG9jYXRpb25EZXRhaWxzW10+IHtcclxuICAgIGlmICh0ZXJtLmxlbmd0aCA+IDIpIHtcclxuICAgICAgaXNMb2FkaW5nPy5uZXh0KHRydWUpO1xyXG4gICAgICByZXR1cm4gdGhpcy5zZWFyY2hJcmxTdGF0aW9uc0ZldGNoZXJcclxuICAgICAgICAuZmV0Y2hMaXN0KHtcclxuICAgICAgICAgIHF1ZXJ5OiB0ZXJtXHJcbiAgICAgICAgfSlcclxuICAgICAgICAucGlwZShcclxuICAgICAgICAgIHRha2UoMSksXHJcbiAgICAgICAgICBtYXAoKHJlc3VsdHM6IElybFN1cHBsaWVyU3RhdGlvbltdKTogTG9jYXRpb25EZXRhaWxzW10gPT4ge1xyXG4gICAgICAgICAgICBpZiAoaXNMb2FkaW5nKSB7XHJcbiAgICAgICAgICAgICAgaXNMb2FkaW5nLm5leHQoZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHRzLm1hcCgocmVzdWx0OiBJcmxTdXBwbGllclN0YXRpb24pID0+IHtcclxuICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogTG9jYXRpb25UeXBlcy5UcmFpblN0YXRpb24sXHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtyZXN1bHQubmFtZX0gKCR7cmVzdWx0LnN1cHBsaWVyfSlgLFxyXG4gICAgICAgICAgICAgICAgcmFpbHN0YXRpb246IHJlc3VsdFxyXG4gICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIG9mKFtdKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiAtIGdldCBob3RlbCBsb2NhdGlvbnMsIHRoZXNlIHNob3VsZCBiZSBjaXR5LCBvZmZpY2UsIGFpcnBvcnQsIHJhaWxzdGF0aW9uXHJcbiAgICogQHRvZG8gLSBmaWxsIHRoaXMgb3V0IGZvciB0aGUgb3RoZXIgbG9jYXRpb24gdHlwZXMsIG1heSBuZWVkIHRvIG1lcmdlTWFwIHRoZW0gb3Igc29tZSBvdGhlciByeGpzIG1hZ2ljXHJcbiAgICogQHBhcmFtIHRlcm0gLSB0aGUgdGVybSB0byBzZWFyY2ggYnkgZS5nLiAnTWFuJyBzaG91bGQgYnJpbmcgYmFjaywgbWFuY2hlc3RlciwgbWFuY2hlc3RlciBhaXJwb3J0LCBtYW5jaGVzdGVyIHBpY2FkaWxseSwgZXRjXHJcbiAgICovXHJcbiAgZ2V0SG90ZWxMb2NhdGlvbnNMaXN0KFxyXG4gICAgdGVybTogc3RyaW5nLFxyXG4gICAgY291bnRyeUNvZGU6IENvdW50cnlDb2RlLFxyXG4gICAgaXNMb2FkaW5nPzogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+XHJcbiAgKTogT2JzZXJ2YWJsZTxMb2NhdGlvbkRldGFpbHNbXT4ge1xyXG4gICAgaWYgKHRlcm0ubGVuZ3RoID4gMikge1xyXG4gICAgICBpZiAoUmVnRXhwcy5VS19QT1NUQ09ERS50ZXN0KHRlcm0pKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UG9zdGNvZGVMaXN0KHRlcm0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICghaXNMb2FkaW5nPy52YWx1ZSkge1xyXG4gICAgICAgICAgaXNMb2FkaW5nLm5leHQodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHN1YnMgPSBmb3JrSm9pbihbXHJcbiAgICAgICAgICB0aGlzLmdldEFpcnBvcnRMb2NhdGlvbnModGVybSwgY291bnRyeUNvZGUsIGlzTG9hZGluZyksXHJcbiAgICAgICAgICB0aGlzLmdldENpdHlMb2NhdGlvbnModGVybSwgY291bnRyeUNvZGUsIGlzTG9hZGluZyksXHJcbiAgICAgICAgICB0aGlzLmdldFN0YXRpb25Mb2NhdGlvbnModGVybSwgaXNMb2FkaW5nKSxcclxuICAgICAgICAgIHRoaXMuZ2V0Q29uZmlybWFPZmZpY2VzKHRlcm0pXHJcbiAgICAgICAgXSkucGlwZShcclxuICAgICAgICAgIG1hcCgocmVzdWx0czogYW55W10pID0+IHtcclxuICAgICAgICAgICAgaWYgKGlzTG9hZGluZz8udmFsdWUpIHtcclxuICAgICAgICAgICAgICBpc0xvYWRpbmcubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHMucmVkdWNlKChhY2N1bTogTG9jYXRpb25EZXRhaWxzW10sIHJlc3VsdDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgYWNjdW0ucHVzaCguLi5yZXN1bHQpO1xyXG4gICAgICAgICAgICAgIHJldHVybiBhY2N1bTtcclxuICAgICAgICAgICAgfSwgW10pO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICApOyAvLyBleHBhbmQgdGhpcyB3aXRoIHRoZSBvdGhlciBzZWFyY2hlcyB3aGVuIHRoZXkgYXJlIGRvbmVcclxuICAgICAgICByZXR1cm4gc3VicztcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIG9mKFtdKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFN0YXRpb25zQW5kQWlycG9ydHNMaXN0KFxyXG4gICAgdGVybTogc3RyaW5nLFxyXG4gICAgY291bnRyeUNvZGU6IENvdW50cnlDb2RlLFxyXG4gICAgaXNMb2FkaW5nPzogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+XHJcbiAgKTogT2JzZXJ2YWJsZTxMb2NhdGlvbkRldGFpbHNbXT4ge1xyXG4gICAgaWYgKHRlcm0ubGVuZ3RoID4gMikge1xyXG4gICAgICBpZiAoIWlzTG9hZGluZz8udmFsdWUpIHtcclxuICAgICAgICBpc0xvYWRpbmcubmV4dCh0cnVlKTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBzdWJzID0gZm9ya0pvaW4oW1xyXG4gICAgICAgIHRoaXMuZ2V0QWlycG9ydExvY2F0aW9ucyh0ZXJtLCBjb3VudHJ5Q29kZSwgaXNMb2FkaW5nKSxcclxuICAgICAgICB0aGlzLmdldFN0YXRpb25Mb2NhdGlvbnModGVybSwgaXNMb2FkaW5nKVxyXG4gICAgICBdKS5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzdWx0czogYW55W10pID0+IHtcclxuICAgICAgICAgIGlmIChpc0xvYWRpbmc/LnZhbHVlKSB7XHJcbiAgICAgICAgICAgIGlzTG9hZGluZy5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByZXN1bHRzLnJlZHVjZSgoYWNjdW06IGFueVtdLCByZXN1bHQ6IGFueVtdKSA9PiB7XHJcbiAgICAgICAgICAgIGFjY3VtLnB1c2goLi4ucmVzdWx0KTtcclxuICAgICAgICAgICAgcmV0dXJuIGFjY3VtO1xyXG4gICAgICAgICAgfSwgW10pO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7IC8vIGV4cGFuZCB0aGlzIHdpdGggdGhlIG90aGVyIHNlYXJjaGVzIHdoZW4gdGhleSBhcmUgZG9uZVxyXG4gICAgICByZXR1cm4gc3VicztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBvZihbXSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gIEBkZXNjIC0gcmVtb3ZlIGEgc3BlY2lmaWVkIHRyYXZlbGxlciBmcm9tIHRoZSBzZWxlY3RlZCBhcnJheVxyXG4gICoqL1xyXG4gIHJlbW92ZVRyYXZlbGxlcih0cmF2ZWxsZXI6IFRyYXZlbGxlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fcmVtb3ZlVHJhdmVsbGVyKHRyYXZlbGxlcik7XHJcblxyXG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXRTZXNzaW9uSXRlbShcclxuICAgICAgQmFzZUVudGVycHJpc2VTZWFyY2hTZXJ2aWNlLlNFU1NJT05fVFJBVkVMTEVSLFxyXG4gICAgICB0aGlzLnNlbGVjdGVkVHJhdmVsbGVyc1xyXG4gICAgKTtcclxuICAgIHRoaXMudXBkYXRlVHJhdmVsbGVySW5mb3JtYXRpb24oKTtcclxuICB9XHJcblxyXG4gIF9yZW1vdmVUcmF2ZWxsZXIodHJhdmVsbGVyOiBUcmF2ZWxsZXIpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRUcmF2ZWxsZXJzID0gdGhpcy5zZWxlY3RlZFRyYXZlbGxlcnMuZmlsdGVyKFxyXG4gICAgICAodHJhdmVsbGVyVG9UZXN0OiBUcmF2ZWxsZXIpID0+IHtcclxuICAgICAgICByZXR1cm4gIVRyYXZlbGxlck9iamVjdC5lcXVhbHModHJhdmVsbGVyVG9UZXN0LCB0cmF2ZWxsZXIpO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlQWxsVHJhdmVsbGVycygpOiB2b2lkIHtcclxuICAgIGNvbnNvbGUubG9nKCdyZW1vdmUgYWxsIHRyYXZlbGxlcnMgY2FsbGVkIScpO1xyXG4gICAgY29uc29sZS5sb2codGhpcy5zZWxlY3RlZFRyYXZlbGxlcnMpO1xyXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkVHJhdmVsbGVycykge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkVHJhdmVsbGVycyA9IFtdO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZWxlY3RlZFRyYXZlbGxlcnMuZm9yRWFjaCgodHJhdmVsbGVyOiBUcmF2ZWxsZXIpID0+IHtcclxuICAgICAgdGhpcy5fcmVtb3ZlVHJhdmVsbGVyKHRyYXZlbGxlcik7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldFNlc3Npb25JdGVtKFxyXG4gICAgICBCYXNlRW50ZXJwcmlzZVNlYXJjaFNlcnZpY2UuU0VTU0lPTl9UUkFWRUxMRVIsXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRUcmF2ZWxsZXJzXHJcbiAgICApO1xyXG4gICAgdGhpcy51cGRhdGVUcmF2ZWxsZXJJbmZvcm1hdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgYWRkVHJhdmVsbGVyKHRyYXZlbGxlcjogVHJhdmVsbGVyKSB7XHJcbiAgICBpZiAoXHJcbiAgICAgICF0aGlzLnRyYXZlbGxlckFscmVhZHlBZGRlZCh0cmF2ZWxsZXIpICYmXHJcbiAgICAgICF0aGlzLmN1cnJlbnROb09mVHJhdmVsbGVyc0dyZWF0ZXJPckVxdWFsVG9NYXgoKVxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRUcmF2ZWxsZXJzLnB1c2godHJhdmVsbGVyKTtcclxuICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXRTZXNzaW9uSXRlbShcclxuICAgICAgICBCYXNlRW50ZXJwcmlzZVNlYXJjaFNlcnZpY2UuU0VTU0lPTl9UUkFWRUxMRVIsXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRyYXZlbGxlcnNcclxuICAgICAgKTtcclxuICAgICAgdGhpcy51cGRhdGVUcmF2ZWxsZXJJbmZvcm1hdGlvbigpO1xyXG4gICAgfVxyXG4gIH1cclxuICBjdXJyZW50Tm9PZlRyYXZlbGxlcnNHcmVhdGVyT3JFcXVhbFRvTWF4KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRUcmF2ZWxsZXJzLmxlbmd0aCA+PSB0aGlzLm1heFRyYXZlbGxlcnMoKTtcclxuICB9XHJcblxyXG4gIG1heFRyYXZlbGxlcnMoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiAvKnRoaXMudXNlclNlcnZpY2UudXNlVHJhdmVsbGVyUHJvZmlsZSAmJiovIHRoaXMuY2FuVXNlVHJhdmVsbGVyUHJvZmlsZSgpXHJcbiAgICAgID8gMVxyXG4gICAgICA6IE1BWF9UUkFWRUxMRVJTO1xyXG4gIH1cclxuICAvKlxyXG4gICAgQGRlc2MgLSBoZWxwZXIgZnVuY3Rpb24gLSBkZXRlcm1pbmVzIGlmIGEgc2VsZWN0ZWQgdHJhdmVsbGVyIGlzIGFscmVhZHkgYWRkZWQgLVxyXG4gICAgdXNlZCB0byBwcmV2ZW50IHNhbWUgdHJhdmVsbGVyIGJlaW5nIGFkZGVkIG1vcmUgdGhhbiBvbmNlXHJcbiAgKiovXHJcbiAgdHJhdmVsbGVyQWxyZWFkeUFkZGVkKHRyYXZlbGxlcjogVHJhdmVsbGVyKTogYm9vbGVhbiB7XHJcbiAgICAvLyBpdGVyYXRlIHRocm91Z2ggdGhlIHNlbGVjdGVkIHRyYXZlbGxlcnMgYW5kIHJldHVybiB0cnVlIGlmIGZvdW5kLCBmYWxzZSBvdGhlciB3aXNlXHJcbiAgICByZXR1cm4gISF0aGlzLnNlbGVjdGVkVHJhdmVsbGVycy5maW5kKCh0cmF2ZWxsZXJzOiBUcmF2ZWxsZXIpID0+XHJcbiAgICAgIFRyYXZlbGxlck9iamVjdC5lcXVhbHModHJhdmVsbGVycywgdHJhdmVsbGVyKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGNhblVzZVRyYXZlbGxlclByb2ZpbGUoKTogYm9vbGVhbiB7XHJcbiAgICAvKlxyXG4gICAgaWYgKHRoaXMudXNlclNlcnZpY2UuaXNVc2VyRmF2b3JpdGVTZXQoVXNlckZhdm9ydXJpdGUuRG9udFVzZVRyYXZlbGxlclBvbGljeSkpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdXNlciA9IHRoaXMudXNlclNlcnZpY2UuZ2V0VXNlckRldGFpbHMoKTtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRUcmF2ZWxsZXJzLmxlbmd0aCA9PT0gMSAmJlxyXG4gICAgICAhdGhpcy5zZWxlY3RlZFRyYXZlbGxlcnNbMF1cclxuICAgICAgICAuZ3Vlc3QgLyomJlxyXG4gICAgICB0aGlzLnNlbGVjdGVkVHJhdmVsbGVyc1swXS5wYXhfaWQgJiZcclxuICAgICAgdGhpcy5zZWxlY3RlZFRyYXZlbGxlcnNbMF0ucGF4X2lkICE9PSB1c2VyLlBheElkXHJcbiAgICApOyovXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBnZXRDdXJyZW50Tm9PZlRyYXZlbGxlcnMoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkVHJhdmVsbGVycy5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVUcmF2ZWxsZXJJbmZvcm1hdGlvbigpIHtcclxuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0U2Vzc2lvbkl0ZW0oXHJcbiAgICAgIEJhc2VFbnRlcnByaXNlU2VhcmNoU2VydmljZS5TRVNTSU9OX1RSQVZFTExFUixcclxuICAgICAgdGhpcy5zZWxlY3RlZFRyYXZlbGxlcnNcclxuICAgICk7XHJcbiAgICB0aGlzLnRyYXZlbGxlckluZm9ybWF0aW9uLm5leHQoWy4uLnRoaXMuc2VsZWN0ZWRUcmF2ZWxsZXJzXSk7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqICBAZGVzYyAtIGRldGVybWluZSBhbmQgcmV0dXJuIHRoZSBoaWdoZXN0IHByaW9yaXR5IHZhbHVlLFxyXG4gICAqICAgdGhlIGhpZ2hlc3QgaXMgYmFzZWQgb24gdGhlIHByaW9yaXR5IHZhbHVlIG9mIHRoZSBzZWFyY2ggdHlwZSxcclxuICAgKiAgICBpZiBpdCBpcyBjaG9zZW4gYW5kIGlmIHRoZSBib29raW5nIGhhcyBub3QgYmVlbiBjaG9zZW5cclxuICAgKiovXHJcbiAgZGV0ZXJtaW5lSGlnaGVzdFNlYXJjaFByaW9yaXR5KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gKHRoaXMuaGlnaGVzdF9zZWFyY2hfcHJpb3JpdHkgPVxyXG4gICAgICB0aGlzLl9nZXRIaWdoZXN0U2VhcmNoUHJpb3JpdHlPYmplY3QoKS5oaWdoZXN0KTtcclxuICB9XHJcblxyXG4gIGdldEhpZ2hlc3RTZWFyY2hQcmlvcml0eU9iamVjdChcclxuICAgIGJhc2tldEl0ZW1zOiBSZWNvcmQ8U2VydmljZVR5cGUsIEJhc2tldEl0ZW0+XHJcbiAgKTogU2VhcmNoT2JqZWN0IHtcclxuICAgIHJldHVybiB0aGlzLl9nZXRIaWdoZXN0U2VhcmNoUHJpb3JpdHlPYmplY3QoYmFza2V0SXRlbXMpLmN1cnJlbnRJdGVtO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0SGlnaGVzdFNlYXJjaFByaW9yaXR5T2JqZWN0KFxyXG4gICAgYmFza2V0SXRlbXM6IFJlY29yZDxTZXJ2aWNlVHlwZSwgQmFza2V0SXRlbT4gPSB7fSBhcyBSZWNvcmQ8XHJcbiAgICAgIFNlcnZpY2VUeXBlLFxyXG4gICAgICBCYXNrZXRJdGVtXHJcbiAgICA+XHJcbiAgKTogSGlnaGVzdFNlYXJjaFByaW9yaXR5T2JqZWN0SW50ZXJmYWNlIHtcclxuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuc2VhcmNoX29iamVjdHMpLnJlZHVjZShcclxuICAgICAgKHsgaGlnaGVzdCwgY3VycmVudEl0ZW0gfSwgaXRlbTogU2VhcmNoT2JqZWN0KSA9PiB7XHJcbiAgICAgICAgaWYgKGl0ZW0uY2hvc2VuICYmIGl0ZW0ucHJpb3JpdHkgPCBoaWdoZXN0KSB7XHJcbiAgICAgICAgICBpZiAoIWJhc2tldEl0ZW1zW2l0ZW0udHlwZSBhcyBTZXJ2aWNlVHlwZV0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHsgaGlnaGVzdDogaXRlbS5wcmlvcml0eSwgY3VycmVudEl0ZW06IGl0ZW0gfTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGl0ZW0uY2hvc2VuID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IGhpZ2hlc3QsIGN1cnJlbnRJdGVtIH07XHJcbiAgICAgIH0sXHJcbiAgICAgIHsgaGlnaGVzdDogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsIGN1cnJlbnRJdGVtOiBudWxsIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBnZXRTZWxlY3RlZE9wdGlvbnMoKTogU2VydmljZVR5cGVbXSB7XHJcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5zZWFyY2hfb2JqZWN0cykucmVkdWNlKChjdiwgaXRlbUluZGV4KSA9PiB7XHJcbiAgICAgIGlmICgodGhpcy5zZWFyY2hfb2JqZWN0cyBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtpdGVtSW5kZXhdLmNob3Nlbikge1xyXG4gICAgICAgIGN2LnB1c2goaXRlbUluZGV4IGFzIFNlcnZpY2VUeXBlKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gY3Y7XHJcbiAgICB9LCBbXSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVja3MgaWYgc2VsZWN0ZWQgdHJhdmVsbGVycyBjb250YWlucyBhbnkgZ3Vlc3RzIHdpdGhvdXQgYWxsIG9mIGRldGFpbHNcclxuICAgKi9cclxuICBoYXNTaW1wbGVHdWVzdHMoKTogYm9vbGVhbiB7XHJcbiAgICAvKnJldHVybiAhIXRoaXMuc2VsZWN0ZWRUcmF2ZWxsZXJzLmZpbmQoKHsgZ3Vlc3QsIHBob25lLCBuYXRpb25hbGl0eSwgZW1haWwgfSkgPT4ge1xyXG4gICAgICByZXR1cm4gZ3Vlc3QgJiYgISghIWVtYWlsICYmICEhcGhvbmUgJiYgISFuYXRpb25hbGl0eSk7XHJcbiAgICB9KTsqL1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIC0gc2V0IHRoZSBzZWFyY2ggb2JqZWN0cyB0byB0aGUgZ2V0IG1lIHRoZXJlIG9iamVjdHMgLSBjYWxsZWQgYmVmb3JlIHN0YXJ0aW5nIHRoZSBnZXQgbWUgdGhlcmUgc2VhcmNoZXNcclxuICAgKi9cclxuICBzZXRHZXRNZVRoZXJlU2VhcmNoT2JqZWN0cygpOiB2b2lkIHtcclxuICAgIGNvbnNvbGUubG9nKCcrKysgU2V0dGluZyBHZXRNZVRoZXJlIFNlYXJjaCBPYmplY3RzICsrKycpO1xyXG4gICAgdGhpcy5zZWFyY2hfb2JqZWN0cyA9IHRoaXMuaGVscGVycy5jbG9uZSh0aGlzLmdldE1lVGhlcmVTZWFyY2hPYmplY3RzKCkpO1xyXG4gIH1cclxuXHJcbiAgcmVzZXRTZWFyY2hQYXJhbXMoKTogdm9pZCB7XHJcbiAgICBjb25zb2xlLmxvZygnUmVzZXRpbmcgU2VhcmNoIFBhcmFtcyEnKTtcclxuICAgIHRoaXMuc2VhcmNoX29iamVjdHMgPSB0aGlzLmhlbHBlcnMuY2xvbmUodGhpcy5pbml0X3NlYXJjaF9vYmplY3RzKCkpO1xyXG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXRTZXNzaW9uSXRlbShcclxuICAgICAgQmFzZUVudGVycHJpc2VTZWFyY2hTZXJ2aWNlLlNFU1NJT05fVFJBVkVMTEVSLFxyXG4gICAgICB0aGlzLnNlYXJjaF9vYmplY3RzXHJcbiAgICApO1xyXG4gICAgT2JqZWN0LnZhbHVlcyh0aGlzLnNlYXJjaGVzKS5mb3JFYWNoKFxyXG4gICAgICAocHJvZHVjdFNlYXJjaFNlcnZpY2U6IEJhc2VFbnRlcnByaXNlU2VhcmNoPGFueSwgYW55LCBhbnlbXT4pID0+IHtcclxuICAgICAgICBwcm9kdWN0U2VhcmNoU2VydmljZS5yZXNldCgpO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgY2FuU2VhcmNoKHR5cGU6IFNlcnZpY2VUeXBlIHwgc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAvLyBjaGVjayB0aGF0IHRoZSBzZWxlY3RlZCB0eXBlIGlzIGNob3NlbiwgaGFzIGhpZ2hlc3QgcHJpb3JpdHkgYW5kIGhhcyBub3QgYWxyZWFkeSBoYWQgYSBib29raW5nIGNob3NlblxyXG5cclxuICAgIHRoaXMuZGV0ZXJtaW5lSGlnaGVzdFNlYXJjaFByaW9yaXR5KCk7XHJcbiAgICAvLyBmaXJzdGx5IGNoZWNrIHRoYXQgdGhlIHR5cGUgb2Ygc2VhcmNoIGV4aXN0c1xyXG4gICAgaWYgKCh0aGlzLnNlYXJjaF9vYmplY3RzIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW3R5cGVdKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdjYW4gc2VhcmNoIGhlcmUnKTtcclxuICAgICAgLy8gbm93IGNoZWNrIHRoYXQgdGhlIHR5cGUgaXMgY2hvc2VuIGhhcyBoaWdoZXN0IHByaW9yaXR5XHJcbiAgICAgIGlmIChcclxuICAgICAgICAodGhpcy5zZWFyY2hfb2JqZWN0cyBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVt0eXBlXS5jaG9zZW4gJiZcclxuICAgICAgICB0aGlzLmhhc0hpZ2hlc3RTZWFyY2hQcmlvcml0eShcclxuICAgICAgICAgICh0aGlzLnNlYXJjaF9vYmplY3RzIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW3R5cGVdLnByaW9yaXR5XHJcbiAgICAgICAgKVxyXG4gICAgICApIHtcclxuICAgICAgICBjb25zb2xlLmxvZyh0eXBlICsgJyBjYW4gYmUgc2VhcmNoZWQnKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgaGFzSGlnaGVzdFNlYXJjaFByaW9yaXR5KHByaW9yaXR5VmFsOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIHRoaXMuZGV0ZXJtaW5lSGlnaGVzdFNlYXJjaFByaW9yaXR5KCk7XHJcbiAgICByZXR1cm4gcHJpb3JpdHlWYWwgPD0gdGhpcy5oaWdoZXN0X3NlYXJjaF9wcmlvcml0eTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogIEBkZXNjIC0gY29uY2F0aW5hdHMgYWxsIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2VzIGFjcm9zcyBhbGwgc2VsZWN0ZWQgdHlwZXMgK1xyXG4gICAqICAgdHJhdmVsbGVycyAob3Igd2lsbCBkbyB3aGVuIGl0J3MgY29tcGxldGUpIFRPRE8gLSBhZGQgRmxpZ2h0LCBSYWlsIENhclxyXG4gICAqKi9cclxuICBnZXRBbGxFcnJvck1lc3NhZ2VzKCk6IHN0cmluZ1tdIHtcclxuICAgIGNvbnN0IGNvbmNhdHRlZEVycm9yczogc3RyaW5nW10gPSB0aGlzLnRyYXZlbGxlclZhbGlkYXRpb25NZXNzYWdlcztcclxuICAgIGlmIChcclxuICAgICAgdGhpcy5zZWFyY2hfb2JqZWN0c1tTZXJ2aWNlVHlwZS5Mb3VuZ2VdLmNob3NlbiAmJlxyXG4gICAgICB0aGlzLmNhblNlYXJjaChTZXJ2aWNlVHlwZS5Mb3VuZ2UpXHJcbiAgICApIHtcclxuICAgICAgY29uY2F0dGVkRXJyb3JzLnB1c2goXHJcbiAgICAgICAgLi4udGhpcy5zZWFyY2hlc1tTZXJ2aWNlVHlwZS5Mb3VuZ2VdLnZhbGlkYXRpb25NZXNzYWdlc1xyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChcclxuICAgICAgdGhpcy5zZWFyY2hfb2JqZWN0c1tTZXJ2aWNlVHlwZS5DYXJdLmNob3NlbiAmJlxyXG4gICAgICB0aGlzLmNhblNlYXJjaChTZXJ2aWNlVHlwZS5DYXIpXHJcbiAgICApIHtcclxuICAgICAgY29uY2F0dGVkRXJyb3JzLnB1c2goXHJcbiAgICAgICAgLi4udGhpcy5zZWFyY2hlc1tTZXJ2aWNlVHlwZS5DYXJdLnZhbGlkYXRpb25NZXNzYWdlc1xyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChcclxuICAgICAgdGhpcy5zZWFyY2hfb2JqZWN0c1tTZXJ2aWNlVHlwZS5SYWlsXS5jaG9zZW4gJiZcclxuICAgICAgdGhpcy5jYW5TZWFyY2goU2VydmljZVR5cGUuUmFpbClcclxuICAgICkge1xyXG4gICAgICBjb25jYXR0ZWRFcnJvcnMucHVzaChcclxuICAgICAgICAuLi50aGlzLnNlYXJjaGVzW1NlcnZpY2VUeXBlLlJhaWxdLnZhbGlkYXRpb25NZXNzYWdlc1xyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChcclxuICAgICAgdGhpcy5zZWFyY2hfb2JqZWN0c1tTZXJ2aWNlVHlwZS5QYXJraW5nXS5jaG9zZW4gJiZcclxuICAgICAgdGhpcy5jYW5TZWFyY2goU2VydmljZVR5cGUuUGFya2luZylcclxuICAgICkge1xyXG4gICAgICBjb25jYXR0ZWRFcnJvcnMucHVzaChcclxuICAgICAgICAuLi50aGlzLnNlYXJjaGVzW1NlcnZpY2VUeXBlLlBhcmtpbmddLnZhbGlkYXRpb25NZXNzYWdlc1xyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChcclxuICAgICAgdGhpcy5zZWFyY2hfb2JqZWN0c1tTZXJ2aWNlVHlwZS5DYWJdLmNob3NlbiAmJlxyXG4gICAgICB0aGlzLmNhblNlYXJjaChTZXJ2aWNlVHlwZS5DYWIpXHJcbiAgICApIHtcclxuICAgICAgY29uY2F0dGVkRXJyb3JzLnB1c2goXHJcbiAgICAgICAgLi4udGhpcy5zZWFyY2hlc1tTZXJ2aWNlVHlwZS5DYWJdLnZhbGlkYXRpb25NZXNzYWdlc1xyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChcclxuICAgICAgdGhpcy5zZWFyY2hfb2JqZWN0c1tTZXJ2aWNlVHlwZS5Ib3RlbF0uY2hvc2VuICYmXHJcbiAgICAgIHRoaXMuY2FuU2VhcmNoKFNlcnZpY2VUeXBlLkhvdGVsKVxyXG4gICAgKSB7XHJcbiAgICAgIGNvbmNhdHRlZEVycm9ycy5wdXNoKFxyXG4gICAgICAgIC4uLnRoaXMuc2VhcmNoZXNbU2VydmljZVR5cGUuSG90ZWxdLnZhbGlkYXRpb25NZXNzYWdlc1xyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qXHJcbiAgICBpZiAodGhpcy5zZWFyY2hfb2JqZWN0cy5ob3RlbC5jaG9zZW4gJiYgdGhpcy5jYW5TZWFyY2goVHJhdmVsVHlwZUVudW0uSE9URUwpKSB7XHJcbiAgICAgIGNvbmNhdHRlZEVycm9ycyA9IGNvbmNhdHRlZEVycm9ycy5jb25jYXQodGhpcy5ob3RlbC52YWxpZGF0aW9uTWVzc2FnZXMpO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgaWYgKHRoaXMuc2VhcmNoX29iamVjdHMuZmxpZ2h0LmNob3NlbiAmJiB0aGlzLmNhblNlYXJjaChUcmF2ZWxUeXBlRW51bS5GTElHSFQpKSB7XHJcbiAgICAgIGNvbmNhdHRlZEVycm9ycyA9IGNvbmNhdHRlZEVycm9ycy5jb25jYXQodGhpcy5mbGlnaHQudmFsaWRhdGlvbk1lc3NhZ2VzKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5zZWFyY2hfb2JqZWN0cy5wYXJraW5nLmNob3NlbiAmJiB0aGlzLmNhblNlYXJjaChUcmF2ZWxUeXBlRW51bS5BSVJfUEFSS0lORykpIHtcclxuICAgICAgY29uY2F0dGVkRXJyb3JzLnB1c2goLi4udGhpcy5wYXJraW5nLnZhbGlkYXRpb25NZXNzYWdlcyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc2VhcmNoX29iamVjdHMudGF4aS5jaG9zZW4gJiYgdGhpcy5jYW5TZWFyY2goVHJhdmVsVHlwZUVudW0uVEFYSSkpIHtcclxuICAgICAgY29uY2F0dGVkRXJyb3JzLnB1c2goLi4udGhpcy50YXhpLnZhbGlkYXRpb25NZXNzYWdlcyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc2VhcmNoX29iamVjdHMuZXVyb3N0YXIuY2hvc2VuICYmIHRoaXMuY2FuU2VhcmNoKFRyYXZlbFR5cGVFbnVtLkVVUk9TVEFSKSkge1xyXG4gICAgICBjb25jYXR0ZWRFcnJvcnMucHVzaCguLi50aGlzLmV1cm9zdGFyLnZhbGlkYXRpb25NZXNzYWdlcyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc2VhcmNoX29iamVjdHMuY29hY2guY2hvc2VuICYmIHRoaXMuY2FuU2VhcmNoKFRyYXZlbFR5cGVFbnVtLkNPQUNIKSkge1xyXG4gICAgICBjb25jYXR0ZWRFcnJvcnMucHVzaCguLi50aGlzLmNvYWNoLnZhbGlkYXRpb25NZXNzYWdlcyk7XHJcbiAgICB9Ki9cclxuICAgIHRoaXMuZXJyb3JzLm5leHQoY29uY2F0dGVkRXJyb3JzKTtcclxuICAgIHJldHVybiBjb25jYXR0ZWRFcnJvcnM7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgdHJhdmVsbGVyc0NvbnRhaW5Vc2VyKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICEhdGhpcy5zZWxlY3RlZFRyYXZlbGxlcnMuZmluZCgodHJhdmVsbGVyOiBUcmF2ZWxsZXIpID0+IHtcclxuICAgICAgcmV0dXJuIHRyYXZlbGxlci5pZCA9PT0gdGhpcy51c2VyU2VydmljZS5nZXRVc2VySWQoKS50b1N0cmluZygpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdmFsaWRhdGVUcmF2ZWxsZXJzKCk6IGJvb2xlYW4ge1xyXG4gICAgdGhpcy50cmF2ZWxsZXJWYWxpZGF0aW9uTWVzc2FnZXMgPSBbXTtcclxuXHJcbiAgICBzd2l0Y2ggKHRoaXMudXNlclNlcnZpY2UuZnVsbFVzZXJEZXRhaWxzLnVzZXJEYXRhLnZhbHVlLmJvb2tlcl90eXBlKSB7XHJcbiAgICAgIGNhc2UgQm9va2VyVHlwZS5TZWxmQm9vazpcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAhKFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkVHJhdmVsbGVycy5sZW5ndGggPT09IDEgJiYgdGhpcy50cmF2ZWxsZXJzQ29udGFpblVzZXIoKVxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgLy8gdGhpcyBzaG91bGQgbmV2ZXIgdHJpZ2dlciB1bmRlciBub3JtYWwgY29uZGl0aW9ucyBhcyB0aGUgdXNlciBzaG91bGQgYmUgbG9hZGVkIGluIGFzIGEgdHJhdmVsbGVyIG9uIGxvZ2luXHJcbiAgICAgICAgICB0aGlzLnRyYXZlbGxlclZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKFxyXG4gICAgICAgICAgICAnQ3VycmVudCB1c2VyIG11c3QgYmUgYSB0cmF2ZWxsZXInXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgQm9va2VyVHlwZS5Cb29rZXJXaXRoU2VsZjpcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAhKHRoaXMuc2VsZWN0ZWRUcmF2ZWxsZXJzLmxlbmd0aCA8IDEpIHx8XHJcbiAgICAgICAgICAhdGhpcy50cmF2ZWxsZXJzQ29udGFpblVzZXIoKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgdGhpcy50cmF2ZWxsZXJWYWxpZGF0aW9uTWVzc2FnZXMucHVzaCgnUGxlYXNlIGFkZCB5b3VyIHNlbGYuJyk7XHJcbiAgICAgICAgICB0aGlzLnRyYXZlbGxlcl9lcnJvciA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIEJvb2tlclR5cGUuQm9va2VyOlxyXG4gICAgICBjYXNlIEJvb2tlclR5cGUuQ29tcGFueTpcclxuICAgICAgY2FzZSBCb29rZXJUeXBlLkNvbXBhbnlHcm91cDpcclxuICAgICAgY2FzZSBCb29rZXJUeXBlLk9mZmljZTpcclxuICAgICAgY2FzZSBCb29rZXJUeXBlLlRtYzpcclxuICAgICAgY2FzZSBCb29rZXJUeXBlLlJvb3Q6XHJcbiAgICAgICAgaWYgKCEodGhpcy5zZWxlY3RlZFRyYXZlbGxlcnMubGVuZ3RoID49IDEpKSB7XHJcbiAgICAgICAgICB0aGlzLnRyYXZlbGxlclZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKFxyXG4gICAgICAgICAgICAnUGxlYXNlIHNlbGVjdCBhdCBsZWFzdCBvbmUgdHJhdmVsbGVyJ1xyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHRoaXMudHJhdmVsbGVyX2Vycm9yID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgdGhpcy50cmF2ZWxsZXJWYWxpZGF0aW9uTWVzc2FnZXMucHVzaChcclxuICAgICAgICAgICdVbnJlY29nbmlzZWQgdXNlciB0eXBlISAtIFBsZWFzZSBjb250YWN0IHN1cHBvcnQuJ1xyXG4gICAgICAgICk7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLy8gY29uc29sZS5sb2codGhpcy50cmF2ZWxsZXJWYWxpZGF0aW9uTWVzc2FnZXMpO1xyXG4gICAgcmV0dXJuIHRoaXMudHJhdmVsbGVyVmFsaWRhdGlvbk1lc3NhZ2VzLmxlbmd0aCA9PT0gMDtcclxuICB9XHJcblxyXG4gIGZpbmRQYXhJblRyYXZlbGxlcnModXNlcm5hbWU6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRUcmF2ZWxsZXJzLmZpbmQoKHRyYXZlbGxlcjogVHJhdmVsbGVyKSA9PiB7XHJcbiAgICAgIHJldHVybiB1c2VybmFtZSA9PT0gdHJhdmVsbGVyLmVtYWlsO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB2YWxpZGF0ZUZvcm1zKCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3Qgc2VhcmNoT2JqZWN0OiBTZWFyY2hPYmplY3QgPSB0aGlzLl9maW5kU2VhcmNoT2J0ZWN0KCk7XHJcbiAgICB0aGlzLmdldEFsbEVycm9yTWVzc2FnZXMoKTtcclxuICAgIGlmIChzZWFyY2hPYmplY3QpIHtcclxuICAgICAgdGhpcy5lcnJvcnMubmV4dChcclxuICAgICAgICB0aGlzLnNlYXJjaGVzW3NlYXJjaE9iamVjdC50eXBlIGFzIGtleW9mIFNlYXJjaFBhcmFtc10ubWVzc2FnZXMudmFsdWVcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICB0aGlzLnZhbGlkYXRlVHJhdmVsbGVycygpICYmXHJcbiAgICAgICAgdGhpcy5zZWFyY2hlc1tzZWFyY2hPYmplY3QudHlwZSBhcyBrZXlvZiBTZWFyY2hQYXJhbXNdLmlzVmFsaWQudmFsdWVcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2ZpbmRTZWFyY2hPYnRlY3QoKTogU2VhcmNoT2JqZWN0IHwgbnVsbCB7XHJcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLnNlYXJjaF9vYmplY3RzKS5maW5kKChvYmo6IFNlYXJjaE9iamVjdCkgPT4ge1xyXG4gICAgICByZXR1cm4gISFvYmogJiYgb2JqLnByaW9yaXR5ID09PSB0aGlzLmhpZ2hlc3Rfc2VhcmNoX3ByaW9yaXR5ICYmIG9iai5jaG9zZW47XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHN0YXJ0U2VhcmNoZXModXJsPzpzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMubmV3U2VhcmNoU3RhcnRlZC5uZXh0KHRydWUpO1xyXG4gICAgdGhpcy5zZWFyY2hfbG9hZGluZyA9IHRydWU7XHJcbiAgICBsZXQgc2VhcmNoT2JqZWN0OiBTZWFyY2hPYmplY3Q7XHJcbiAgICBzZWFyY2hPYmplY3QgPSB0aGlzLl9maW5kU2VhcmNoT2J0ZWN0KCk7XHJcbiAgICBpZiAoc2VhcmNoT2JqZWN0KSB7XHJcbiAgICAgIHNlYXJjaE9iamVjdC5jaG9zZW4gPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh1cmwpIHtcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3VybF0pO1xyXG4gICAgfSBlbHNlIGlmIChzZWFyY2hPYmplY3QgJiYgIXRoaXMucm91dGVyLnVybC5pbmNsdWRlcyhzZWFyY2hPYmplY3QucmVzdWx0VXJsKSkge1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbc2VhcmNoT2JqZWN0LnJlc3VsdFVybF0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qSWYgdGhlIHNlYXJjaCBleGNlZWRzIHRoZSB0aW1lb3V0IHRpbWUsIGNhbmNlbCBzZWFyY2ggYW5kIHRlbGwgT0JUIHRoYXQgaXQncyB0aW1lZCBvdXQqL1xyXG4gICAgLy8gY29uc3QgY29udGV4dCA9IHRoaXM7XHJcbiAgICAvLyBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgIC8vICAgaWYgKGNvbnRleHQuc2VhcmNoX2xvYWRpbmcpIHtcclxuICAgIC8vICAgICBjb250ZXh0LnNlYXJjaF9sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAvLyAgICAgY29udGV4dC5zZWFyY2hUaW1lZE91dC5uZXh0KHRydWUpO1xyXG4gICAgLy8gICAgIGNvbnRleHQuc2VhcmNoTG9hZGluZ0RvbmUubmV4dCh0cnVlKTtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfSwgdGhpcy5lbnZpcm9ubWVudC5zZWFyY2hUaW1lb3V0KTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBQcm9taXNlLmFsbChcclxuICAgICAgICBPYmplY3QudmFsdWVzKHRoaXMuc2VhcmNoZXMpLm1hcChcclxuICAgICAgICAgIChzZWFyY2g6IEJhc2VFbnRlcnByaXNlU2VhcmNoPGFueSwgYW55LCBhbnlbXT4pID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuICEhc2VhcmNoICYmXHJcbiAgICAgICAgICAgICAgdGhpcy5zZWFyY2hfb2JqZWN0c1tzZWFyY2gudHlwZV0gJiZcclxuICAgICAgICAgICAgICB0aGlzLnNlYXJjaF9vYmplY3RzW3NlYXJjaC50eXBlXS5jaG9zZW5cclxuICAgICAgICAgICAgICA/IHNlYXJjaC5zdGFydFNlYXJjaCgpXHJcbiAgICAgICAgICAgICAgOiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIClcclxuICAgICAgKS5maW5hbGx5KCgpID0+IHtcclxuICAgICAgICB0aGlzLnNlYXJjaF9sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zZWFyY2hMb2FkaW5nRG9uZS5uZXh0KHRydWUpO1xyXG4gICAgICB9KTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICB0aGlzLnNlYXJjaF9sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuc2VhcmNoTG9hZGluZ0RvbmUubmV4dCh0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFRheGlTdGF0aW9uTG9jYXRpb25zKFxyXG4gICAgdGVybTogc3RyaW5nLFxyXG4gICAgaXNMb2FkaW5nPzogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+XHJcbiAgKTogT2JzZXJ2YWJsZTxSYWlsQWlycG9ydFtdPiB7XHJcbiAgICByZXR1cm4gdGVybS5sZW5ndGggPCAzXHJcbiAgICAgID8gb2YoW10pXHJcbiAgICAgIDogb2YoW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkZXN0aW5hdGlvbjogJ01hbmNoZXN0ZXIgQWlycG90JyxcclxuICAgICAgICAgICAgaXNhaXJwb3J0OiB0cnVlLFxyXG4gICAgICAgICAgICBzdXBwbGllcl9jb2RlOiAnTUFOJyxcclxuICAgICAgICAgICAgYWRkcmVzczogJ01hbmNoZXN0ZXIgQWlycG9ydCcsXHJcbiAgICAgICAgICAgIHBvc3Rjb2RlOiAnTTkwIDFRWCdcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uOiAnTWFuY2hlc3RlciBQaWNjYWRpbGx5JyxcclxuICAgICAgICAgICAgaXNhaXJwb3J0OiBmYWxzZSxcclxuICAgICAgICAgICAgc3VwcGxpZXJfY29kZTogJ01NQU4nLFxyXG4gICAgICAgICAgICBhZGRyZXNzOiAnTWFuY2hlc3RlciBQaWNjYWRpbGx5JyxcclxuICAgICAgICAgICAgcG9zdGNvZGU6ICdNMSAyUFonXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkZXN0aW5hdGlvbjogJ0xvbmRvbiBIZWF0aHJvdycsXHJcbiAgICAgICAgICAgIGlzYWlycG9ydDogdHJ1ZSxcclxuICAgICAgICAgICAgc3VwcGxpZXJfY29kZTogJ0xIUicsXHJcbiAgICAgICAgICAgIGFkZHJlc3M6ICdMb25kb24gSGVhdGhyb3cgQWlycG9ydCcsXHJcbiAgICAgICAgICAgIHBvc3Rjb2RlOiAnVFc2IDFFVydcclxuICAgICAgICAgIH1cclxuICAgICAgICBdKTtcclxuICB9XHJcblxyXG4gIGdldEFkZHJlc3Nlcyhpc0xvYWRpbmc6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPik6IE9ic2VydmFibGU8QWRkcmVzc0Zvcm1bXT4ge1xyXG4gICAgcmV0dXJuIG9mKFtcclxuICAgICAge1xyXG4gICAgICAgIEhvdXNlOiAnQ2VjaWwgQ291cnQnLFxyXG4gICAgICAgIFN0cmVldDogJzI4LTM2IENlY2lsIFJvYWQnLFxyXG4gICAgICAgIFRvd246ICdIYWxlJyxcclxuICAgICAgICBQb3N0Q29kZTogJ1dBMTUgOVBCJyxcclxuICAgICAgICBDb3VudHJ5OiAnVUsnXHJcbiAgICAgIH1cclxuICAgIF0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0VXNlckFkZHJlc3NlcyhcclxuICAgIGlzTG9hZGluZz86IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPlxyXG4gICk6IE9ic2VydmFibGU8QWRkcmVzc0Zvcm1bXT4ge1xyXG4gICAgcmV0dXJuIHRoaXMudXNlckFkZHJlc3Nlc0ZldGNoZXIuZmV0Y2hMaXN0KCkucGlwZShcclxuICAgICAgdGFrZSgxKSxcclxuICAgICAgbWFwKChyZXN1bHRzOiBhbnkpOiBhbnkgPT4ge1xyXG4gICAgICAgIHJldHVybiByZXN1bHRzLm1hcCgocmVzdWx0OiBhbnkpID0+IHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIElEOiByZXN1bHQuaWQsXHJcbiAgICAgICAgICAgIEhvdXNlOiByZXN1bHQubnVtYmVyT3JOYW1lLFxyXG4gICAgICAgICAgICBTdHJlZXQ6IHJlc3VsdC5zdHJlZXQsXHJcbiAgICAgICAgICAgIFRvd246IHJlc3VsdC50b3duLFxyXG4gICAgICAgICAgICBQb3N0Q29kZTogcmVzdWx0LnBvc3Rjb2RlLFxyXG4gICAgICAgICAgICBDb3VudHJ5OiByZXN1bHQuY291bnRyeUNvZGVcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZGVsZXRlVXNlckFkZHJlc3NCeUlEKGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYmFzZURlbGV0ZVVzZXJBZGRyZXNzVXBkYXRlci51cGRhdGVPbmUoeyBpZDogaWQgfSk7XHJcbiAgfVxyXG5cclxuICBnZXRIb3RlbENoYWluKFxyXG4gICAgdGVybTogc3RyaW5nLFxyXG4gICAgaXNMb2FkaW5nPzogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+XHJcbiAgKTogT2JzZXJ2YWJsZTxhbnlbXT4ge1xyXG4gICAgaWYgKHRlcm0ubGVuZ3RoID4gMikge1xyXG4gICAgICBpc0xvYWRpbmc/Lm5leHQodHJ1ZSk7XHJcbiAgICAgIGNvbnN0IG9iczogT2JzZXJ2YWJsZTxTZWFyY2hIb3RlbENoYWluc1Jlc3VsdEFycmF5PiA9XHJcbiAgICAgICAgdGhpcy5zZWFyY2hIb3RlbENoYWluc0ZldGNoZXIuZmV0Y2hMaXN0KHsgcXVlcnk6IHRlcm0gfSk7XHJcbiAgICAgIGNvbnN0IGZ1bmMgPSAocmVzdWx0czogU2VhcmNoSG90ZWxDaGFpbnNSZXN1bHRBcnJheSk6IGFueVtdID0+IHtcclxuICAgICAgICBjb25zdCBkYXRhOiBhbnlbXSA9IHJlc3VsdHMubWFwKFxyXG4gICAgICAgICAgKHJlc3VsdDogU2VhcmNoSG90ZWxDaGFpbnNSZXN1bHQpOiBhbnkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgIG5hbWU6IHJlc3VsdFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaXNMb2FkaW5nPy5uZXh0KGZhbHNlKTtcclxuICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgfTtcclxuICAgICAgcmV0dXJuIG9icy5waXBlKHRha2UoMSksIG1hcChmdW5jKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG9mKFtdKTtcclxuICB9XHJcblxyXG4gIGdldE9mZmljZU5hbWVzKFxyXG4gICAgaXNMb2FkaW5nPzogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+XHJcbiAgKTogT2JzZXJ2YWJsZTxDb25mZXJtYU9mZmljZU5hbWVzW10+IHtcclxuICAgIHJldHVybiB0aGlzLmNvbmZlcm1hT2ZmaWNlTmFtZXNGZXRjaGVyLmZldGNoTGlzdCgpLnBpcGUoXHJcbiAgICAgIHRha2UoMSksXHJcbiAgICAgIG1hcCgocmVzdWx0cyk6IGFueSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3VsdHMpIHtcclxuICAgICAgICAgIHJldHVybiByZXN1bHRzPy5yZXN1bHRzPy5tYXAoKHJlc3VsdDogQ29uZmVybWFPZmZpY2VOYW1lcykgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgIGlkOiByZXN1bHQuaWQsXHJcbiAgICAgICAgICAgICAgbmFtZTogcmVzdWx0Lm5hbWVcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgICBpc0xvYWRpbmc/Lm5leHQoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgZ2V0T2ZmaWNlKG9mZmljZUlkOiBudW1iZXIpOiBPYnNlcnZhYmxlPENvbmZlcm1hT2ZmaWNlSW5mbz4ge1xyXG4gICAgaWYgKG9mZmljZUlkKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNvbmZlcm1hT2ZmaWNlRmV0Y2hlci5mZXRjaE9uZSh7IG9mZmljZUlkIH0pLnBpcGUoXHJcbiAgICAgICAgdGFrZSgxKSxcclxuICAgICAgICBtYXAoKHJlc3VsdHM6IENvbmZlcm1hT2ZmaWNlUmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzdWx0cykge1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0cy5yZXN1bHRzO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gb2YoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFJhaWxDYXJkcygpOiBPYnNlcnZhYmxlPFJlZmVyZW5jZVJhaWxDYXJkUXVhbGlmaWVyW10+IHtcclxuICAgIHJldHVybiB0aGlzLmdldFJhaWxDYXJkc0ZldGNoZXIuZmV0Y2hMaXN0KCkucGlwZShcclxuICAgICAgdGFrZSgxKSxcclxuICAgICAgbWFwKChyZXN1bHRzKTogYW55ID0+IHtcclxuICAgICAgICBpZiAocmVzdWx0cykge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdHM/Lm1hcCgocmVzdWx0OiBSZWZlcmVuY2VSYWlsQ2FyZFF1YWxpZmllcikgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgIG5hbWU6IHJlc3VsdC5uYW1lLFxyXG4gICAgICAgICAgICAgIGNvZGU6IHJlc3VsdC5jb2RlXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEFpcnBvcnRCeUNvZGUoY29kZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxBaXJwb3J0U2VhcmNoUmVzdWx0cz4ge1xyXG4gICAgaWYgKGNvZGUpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoQWlycG9ydHNGZXRjaGVyLmZldGNoT25lKHsgcXVlcnk6IGNvZGUgfSkucGlwZShcclxuICAgICAgICB0YWtlKDEpLFxyXG4gICAgICAgIG1hcCgocmVzdWx0OiBBaXJwb3J0U2VhcmNoUmVzdWx0cykgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIG9mKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBUTyBCRSBPVkVSIFJJRERFTiBCWSBPQlQgU1VCQ0xBU1NFU1xyXG4gIHB1YmxpYyBpbml0X3NlYXJjaF9vYmplY3RzKCk6IFNlYXJjaE9iamVjdHMge1xyXG4gICAgcmV0dXJuIHt9O1xyXG4gIH1cclxuXHJcbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAgICogU0VBUkNIIE9CSkVDVFMgRk9SIEdFVCBNRSBUSEVSRSBET09SIDIgRE9PUiAgICAgICAgICAqXHJcbiAgICogRGlmZmVyZW5jZShzKTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXHJcbiAgICogQWxsIG9iamVjdHMgaGF2ZSBhIHByaW9yaXR5IG9mIDEgc28gdGhhdCB0aGV5IGFyZSAgICAqXHJcbiAgICogc2VhcmNoZWQgYXQgdGhlIHNhbWUgdGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXHJcbiAgICogVXJscyBjaGFuZ2VkIHRvIGdldG1ldGhlcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAqXHJcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcbiAgcHJvdGVjdGVkIGdldE1lVGhlcmVTZWFyY2hPYmplY3RzKCk6IFNlYXJjaE9iamVjdHMge1xyXG4gICAgcmV0dXJuIHt9O1xyXG4gIH1cclxuICAvKlxyXG4gICAqICBAZGVzYyAtIGdldHMgYWxsIHNlbGVjdGVkIHRyYXZlbGxlcnNcclxuICAgKiAgIEltcGxlbWVudGVkIGZvciByYWlsIGNhcmQgcmVhc29ucyBpbiBMVVxyXG4gICAqKi9cclxuICBnZXRTZWxlY3RlZHRyYXZlbGxlcnMoKTogVHJhdmVsbGVyW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRUcmF2ZWxsZXJzO1xyXG4gIH1cclxuXHJcbiAgcmVzZXRTZWFyY2hPYmplY3RzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWFyY2hfb2JqZWN0cyA9IHRoaXMuaGVscGVycy5jbG9uZSh0aGlzLmluaXRfc2VhcmNoX29iamVjdHMoKSk7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICBUaGVzZSBhcmUgdGhlIHBvc3NpYmxlIGFycmF5IG9mIHZhbHVlcyBmcm9tIEFQSSBhcmUgZXhwdGVjdGVkIGFuZCBmdW5jdGlvbiBtYW5pcHVsYXRlIHRvIGNyZWF0ZSB0aGUgbGlzdFxyXG4gICAgW1wiTWFpblwiXVxyXG4gICAgW1wiMVwiXVxyXG4gICAgW1wiMVwiLCBcIjJcIl1cclxuICAgIFtcIjFcIiwgXCIyXCIsIFwiM1wiXVxyXG4gICAgW1wiMVwiLCBcIjJcIiwgXCIzXCIsIFwiNFwiXVxyXG4gICAgW1wiMVwiLCBcIjJcIiwgXCIzXCIsIFwiNFwiLCBcIjVcIl1cclxuICAgIFtcIlNvdXRoXCIsIFwiTm9ydGhcIl1cclxuICAqL1xyXG4gIHB1YmxpYyBwcm9jZXNzVGVybWluYWxzKHRlcm1pbmFsczogc3RyaW5nW10pOiBUZXJtaW5hbHNUeXBlW10ge1xyXG4gICAgY29uc3QgdGVtcFRlcm1pbmFsOiBUZXJtaW5hbHNUeXBlW10gPSBbXTtcclxuICAgIGlmIChcclxuICAgICAgdGVybWluYWxzLmluY2x1ZGVzKCcxJykgfHxcclxuICAgICAgdGVybWluYWxzLmluY2x1ZGVzKCcyJykgfHxcclxuICAgICAgdGVybWluYWxzLmluY2x1ZGVzKCczJykgfHxcclxuICAgICAgdGVybWluYWxzLmluY2x1ZGVzKCc0JykgfHxcclxuICAgICAgdGVybWluYWxzLmluY2x1ZGVzKCc1JylcclxuICAgICkge1xyXG4gICAgICB0ZW1wVGVybWluYWwucHVzaCh7IGtleTogJ0FueSBUZXJtaW5hbCcsIHZhbHVlOiAnQW55JyB9KTtcclxuICAgICAgdGVybWluYWxzLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICB0ZW1wVGVybWluYWwucHVzaCh7IGtleTogYFRlcm1pbmFsICR7aXRlbX1gLCB2YWx1ZTogYCR7aXRlbX1gIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0ZXJtaW5hbHMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgdGVtcFRlcm1pbmFsLnB1c2goeyBrZXk6IGAke3Rlcm1pbmFsc1swXX0gVGVybWluYWxgLCB2YWx1ZTogJ0FueScgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGVtcFRlcm1pbmFsLnB1c2goeyBrZXk6ICdBbnkgVGVybWluYWwnLCB2YWx1ZTogJ0FueScgfSk7XHJcbiAgICAgICAgdGVybWluYWxzLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICAgIHRlbXBUZXJtaW5hbC5wdXNoKHsga2V5OiBgJHtpdGVtfSBUZXJtaW5hbGAsIHZhbHVlOiBgJHtpdGVtfWAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0ZW1wVGVybWluYWw7XHJcbiAgfVxyXG5cclxuICBhc3luYyBzYXZlVXNlckFkZHJlc3MoXHJcbiAgICBhZGRyZXNzOiBTYXZlVXNlckFkZHJlc3NNdXRhdGlvblZhcmlhYmxlc1xyXG4gICk6IFByb21pc2U8YW55PiB7XHJcbiAgICBpZiAoYWRkcmVzcykge1xyXG4gICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHRoaXMuc2F2ZVVzZXJBZGRyZXNzVXBkYXRlclxyXG4gICAgICAgIC51cGRhdGVPbmUoYWRkcmVzcylcclxuICAgICAgICAudG9Qcm9taXNlKCk7XHJcbiAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBjYW5Cb29rKHNlcnZpY2U6IFNlcnZpY2VUeXBlKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy51c2VyU2VydmljZS5jYW5Cb29rKHNlcnZpY2UpID8gdHJ1ZSA6IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgaXNQb3N0Y29kZVZhaWxkKHBvc3Rjb2RlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiB0aGlzLmJhc2VWYWxpZGF0ZUlzUG9zdGNvZGVWYWxpZFRlc3Rlci50ZXN0KHsgcG9zdGNvZGUgfSk7XHJcbiAgfVxyXG5cclxuICAvKiBDcmVhdGUgUXVlcnkgRGVmYXVsdHMgU3RhcnQgKi9cclxuICAvKlxyXG4gICAqIENyZWF0ZSB0aGUgQ2FiIEhpcmUgc2VhcmNoIHF1ZXJ5IHdpdGggc3VwcGxpZWQgcGFyYW0sIGF1dG8gZmlsbCB3aXRoIGRlZmF1bHRzIGlmIGZpZWxkcyBhcmUgZW1wdHkuXHJcbiAgICogQHBhcmFtICB7YW55fSAgICAgICAgICAgLi4uYXJncyBleGFtcGxlIC0gc2VhcmNoU2VydmljZS5zZXRDYWJIaXJlUXVlcnkoZGF0YS5xdWVyeSwgeyBkZXBhcnRzOiBtb21lbnREYXRlVGltZSB9KVxyXG4gICAqIEByZXR1cm4ge1F1ZXJ5U2VhcmNoQ2FiSGlyZUFyZ3N9ICAgICAgICAgUmV0dXJucyBRdWVyeVNlYXJjaENhYkhpcmVBcmdzIHR5cGVcclxuICAgKi9cclxuICBwdWJsaWMgbWFrZUNhYkhpcmVRdWVyeSguLi5hcmdzOiBhbnkpOiBDYWJIaXJlVGVtcFBhcmFtcyB7XHJcbiAgICBjb25zdCBkZWZhdWx0VmFsOiBDYWJIaXJlVGVtcFBhcmFtcyA9IHtcclxuICAgICAgYWR1bHRzOiAwLFxyXG4gICAgICBhaXJwb3J0OiBudWxsLFxyXG4gICAgICBjaGlsZHJlbjogMCxcclxuICAgICAgY291bnRyeUNvZGU6IG51bGwsXHJcbiAgICAgIGRlcGFydHM6IHRoaXMuaGVscGVycy5tYWtlTW9tZW50RGF5VGltZSgpLFxyXG4gICAgICBmcm9tQWRkcmVzczogbnVsbCxcclxuICAgICAgZnJvbVN0YXRpb246IG51bGwsXHJcbiAgICAgIGZyb21Mb2NhdGlvblR5cGU6IFRheGlGb3JtTW9kZS5BRERSRVNTLFxyXG4gICAgICBpbmZhbnRzOiAwLFxyXG4gICAgICB0b0FkZHJlc3M6IG51bGwsXHJcbiAgICAgIHRvU3RhdGlvbjogbnVsbCxcclxuICAgICAgdG9Mb2NhdGlvblR5cGU6IFRheGlGb3JtTW9kZS5BRERSRVNTLFxyXG4gICAgICB2ZWhpY2xlVHlwZTogQ2FiSGlyZVZlaGljbGVUeXBlLkFueSxcclxuICAgICAgdmlhc0Zyb206IG51bGwsXHJcbiAgICAgIHZpYXNUbzogbnVsbFxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5oZWxwZXJzLnNhbmF0aXplUmV0dXJuczxDYWJIaXJlVGVtcFBhcmFtcz4oXHJcbiAgICAgIGRlZmF1bHRWYWwsXHJcbiAgICAgIE9iamVjdC5hc3NpZ24oe30sIC4uLmFyZ3MpLFxyXG4gICAgICBbJ2RlcGFydHMnXVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogQ3JlYXRlIHRoZSBDYXIgSGlyZSBzZWFyY2ggcXVlcnkgd2l0aCBzdXBwbGllZCBwYXJhbSwgYXV0byBmaWxsIHdpdGggZGVmYXVsdHMgaWYgZmllbGRzIGFyZSBlbXB0eS5cclxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgICAgICAuLi5hcmdzIGV4YW1wbGUgLSBzZWFyY2hTZXJ2aWNlLnNldENhckhpcmVRdWVyeShkYXRhLnF1ZXJ5LCB7IGRlcGFydHM6IG1vbWVudERhdGVUaW1lIH0pXHJcbiAgICogQHJldHVybiB7UXVlcnlTZWFyY2hDYXJIaXJlQXJnc30gICAgICAgICBSZXR1cm5zIFF1ZXJ5U2VhcmNoQ2FySGlyZUFyZ3MgdHlwZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBtYWtlQ2FySGlyZVF1ZXJ5KC4uLmFyZ3M6IGFueSk6IENhckhpcmVUZW1wUGFyYW1zIHtcclxuICAgIGNvbnN0IGRlZmF1bHRWYWw6IENhckhpcmVUZW1wUGFyYW1zID0ge1xyXG4gICAgICBhZHVsdHM6IDAsXHJcbiAgICAgIGFpckNvbjogbnVsbCxcclxuICAgICAgY2FyQ2xhc3M6IG51bGwsXHJcbiAgICAgIGNhclR5cGU6IG51bGwsXHJcbiAgICAgIGNoaWxkcmVuOiAwLFxyXG4gICAgICBjaG9zZW5WZW5kb3I6IG51bGwsXHJcbiAgICAgIGNob3NlbkRpc3RhbmNlOiAnNScsXHJcbiAgICAgIGNpdHlEcm9wb2ZmOiBudWxsLFxyXG4gICAgICBjaXR5RHJvcG9mZkRlcG90OiBudWxsLFxyXG4gICAgICBjaXR5UGlja3VwOiBudWxsLFxyXG4gICAgICBjaXR5UGlja3VwRGVwb3Q6IG51bGwsXHJcbiAgICAgIGRyb3BvZmZfY291bnRyeTogJ0dCJyxcclxuICAgICAgZHJvcG9mZl9kYXRldGltZTogbnVsbCxcclxuICAgICAgZHJvcG9mZl9sb2NhdGlvbjogbnVsbCxcclxuICAgICAgZXN0aW1hdGVkTWlsZWFnZTogbnVsbCxcclxuICAgICAgbG9jYXRpb25UeXBlOiBudWxsLFxyXG4gICAgICBwaWNrdXBfY291bnRyeTogbnVsbCxcclxuICAgICAgcGlja3VwX2RhdGV0aW1lOiBudWxsLFxyXG4gICAgICBwaWNrdXBfbG9jYXRpb246IG51bGwsXHJcbiAgICAgIHBvc3Rjb2RlRHJvcG9mZjogbnVsbCxcclxuICAgICAgcG9zdGNvZGVEcm9wb2ZmUmF3OiBudWxsLFxyXG4gICAgICBwb3N0Y29kZVBpY2t1cDogbnVsbCxcclxuICAgICAgcG9zdGNvZGVQaWNrdXBSYXc6IG51bGwsXHJcbiAgICAgIHJldHVybl90b19waWNrdXA6IHRydWUsXHJcbiAgICAgIHRyYW5zbWlzc2lvbjogbnVsbFxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5oZWxwZXJzLnNhbmF0aXplUmV0dXJuczxDYXJIaXJlVGVtcFBhcmFtcz4oXHJcbiAgICAgIGRlZmF1bHRWYWwsXHJcbiAgICAgIE9iamVjdC5hc3NpZ24oe30sIC4uLmFyZ3MpLFxyXG4gICAgICBbJ3BpY2t1cF9kYXRldGltZScsICdkcm9wb2ZmX2RhdGV0aW1lJ11cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIENyZWF0ZXMgYSBGbGlnaHQgc2VhcmNoIHF1ZXJ5IHdpdGggc3VwcGxpZWQgcGFyYW1zLCBhdXRvIGZpbGxzIHdpdGggZGVmYXVsdHMgaWYgZmllbGRzIGFyZSBlbXB0eS5cclxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgICAgICAgICAgICAgICAuLi5hcmdzIEV4YW1wbGUgLSBzZWFyY2hTZXJ2aWNlLm1ha2VGbGlnaHRRdWVyeShkYXRhLnF1ZXJ5LCB7IG92ZXJyaWRlOiBcInByb3BlcnR5XCIgfSlcclxuICAgKiBAcmV0dXJuIHtRdWVyeVNlYXJjaEZsaWdodHNBcmdzfSAgICAgICAgIFJldHVybnMgUXVlcnlTZWFyY2hGbGlnaHRzQXJncyB0eXBlXHJcbiAgICovXHJcbiAgcHVibGljIG1ha2VGbGlnaHRRdWVyeSguLi5hcmdzOiBhbnkpOiBGbGlnaHRUZW1wUGFyYW1zIHtcclxuICAgIGNvbnN0IG5vdyA9IHRoaXMuaGVscGVycy5tYWtlTW9tZW50RGF5VGltZSgpO1xyXG4gICAgY29uc3QgdG9tb3Jyb3cgPSB0aGlzLmhlbHBlcnMubWFrZU1vbWVudERheVRpbWUoMSk7XHJcbiAgICBjb25zdCBtb21lbnRPdXREYXRlVGltZSA9IHRoaXMuaGVscGVycy5tb21lbnRSb3VuZE1pbnV0ZXMobm93LCAzMCk7XHJcbiAgICBjb25zdCBtb21lbnRJbkRhdGVUaW1lID0gdGhpcy5oZWxwZXJzLm1vbWVudFJvdW5kTWludXRlcyh0b21vcnJvdywgMzApO1xyXG5cclxuICAgIGNvbnN0IGRlZmF1bHRWYWw6IEZsaWdodFRlbXBQYXJhbXMgPSB7XHJcbiAgICAgIGFkdWx0czogMCxcclxuICAgICAgYXJyaXZlTG9jYXRpb246IG51bGwsXHJcbiAgICAgIGNhYmluQ2xhc3M6IEZsaWdodENhYmluQ2xhc3MuQW55LFxyXG4gICAgICBjaGlsZHJlbjogMCxcclxuICAgICAgY2hvc2VuU2VhcmNoVHlwZTogbnVsbCxcclxuICAgICAgZGVwYXJ0TG9jYXRpb246IG51bGwsXHJcbiAgICAgIGZhcmVUeXBlOiBGYXJlVHlwZS5GbGV4aWJsZSxcclxuICAgICAgaW5ib3VuZERhdGU6IG1vbWVudE91dERhdGVUaW1lLFxyXG4gICAgICBpblRpbWVDcml0ZXJpYTogVGltZVdpbmRvdy5EZXBhcnQsXHJcbiAgICAgIG1heENvbm5lY3Rpb25zOiBudWxsLFxyXG4gICAgICBpbmNsdWRlTmVhcmJ5QWlycG9ydHM6IGZhbHNlLFxyXG4gICAgICBtdWx0aURlc3RpbmF0aW9uOiBbXSxcclxuICAgICAgb3V0Qm91bmREYXRlOiBtb21lbnRJbkRhdGVUaW1lLFxyXG4gICAgICBvdXRUaW1lQ3JpdGVyaWE6IFRpbWVXaW5kb3cuRGVwYXJ0LFxyXG4gICAgICBwcmVmZXJyZWRDYXJyaWVyczogW251bGwsIG51bGwsIG51bGwsIG51bGxdLFxyXG4gICAgICByZXR1cm5DYWJpbkNsYXNzOiBGbGlnaHRDYWJpbkNsYXNzLkFueVxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5oZWxwZXJzLnNhbmF0aXplUmV0dXJuczxGbGlnaHRUZW1wUGFyYW1zPihcclxuICAgICAgZGVmYXVsdFZhbCxcclxuICAgICAgT2JqZWN0LmFzc2lnbih7fSwgLi4uYXJncyksXHJcbiAgICAgIFsnb3V0Qm91bmREYXRlJywgJ2luYm91bmREYXRlJ11cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIENyZWF0ZXMgYSBIb3RlbCBzZWFyY2ggcXVlcnkgd2l0aCBzdXBwbGllZCBwYXJhbXMsIGF1dG8gZmlsbHMgd2l0aCBkZWZhdWx0cyBpZiBmaWVsZHMgYXJlIGVtcHR5LlxyXG4gICAqIEBwYXJhbSAge2FueX0gICAgICAgICAgICAgICAgICAgIC4uLmFyZ3MgRXhhbXBsZSAtIHNlYXJjaFNlcnZpY2UubWFrZUhvdGVsUXVlcnkoZGF0YS5xdWVyeSwgeyBvdmVycmlkZTogXCJwcm9wZXJ0eVwiIH0pXHJcbiAgICogQHJldHVybiB7UXVlcnlTZWFyY2hIb3RlbHNBcmdzfSAgICAgICAgIFJldHVybnMgUXVlcnlTZWFyY2hIb3RlbHNBcmdzIHR5cGVcclxuICAgKi9cclxuICBwdWJsaWMgbWFrZUhvdGVsUXVlcnkoLi4uYXJnczogYW55KTogSG90ZWxUZW1wUGFyYW1zIHtcclxuICAgIGNvbnN0IGRlZmF1bHRWYWwgPSB7XHJcbiAgICAgIGNoZWNraW5fZGF0ZTogbW9tZW50KCkuc2V0KCdob3VyJywgMjMpLnNldCgnbWludXRlJywgNTkpLFxyXG4gICAgICBjaGVja291dF9kYXRlOiBtb21lbnQoKS5hZGQoMSwgJ2RheScpLnNldCgnaG91cicsIDIzKS5zZXQoJ21pbnV0ZScsIDU5KSxcclxuICAgICAgY291bnRyeTogeyBjQ29kZTogJ0dCJywgY05hbWU6ICdVbml0ZWQgS2luZ2RvbScgfSxcclxuICAgICAgY3VycmVuY3k6ICdHQlAnLFxyXG4gICAgICBkaXN0YW5jZTogNSwgLy8gZGVmYXVsdCA1IG1pbGVzIHJhZGl1c1xyXG4gICAgICBob3RlbF9hdmFpbGFiaWxpdHk6IG51bGwsXHJcbiAgICAgIGhvdGVsX2NoYWluOiBudWxsLFxyXG4gICAgICBob3RlbF9uYW1lOiBudWxsLFxyXG4gICAgICBsb2NhdGlvbl90eXBlX3NlbGVjdDogTG9jYXRpb25UeXBlcy5BaXJwb3J0LFxyXG4gICAgICBsb2NhdGlvbjogbnVsbCwgLy8gbWlnaHQgd2FudCB0byBzcGxpdCB0aGlzIG91dCB0byBjaXR5LCBhaXJwb3J0LCBvZmZpY2UsIHJhaWxzdGF0aW9uIC0gdGhpcyB3aWxsIGRvIGZvciBub3dcclxuICAgICAgbm9fb2Zfb2NjdXBhbnRzOiAxLCAvLyBzaW1pbGFybHkgdGhpbmsgdGhpcyBpcyBhIG1heCBvZiAzXHJcbiAgICAgIG5vX29mX3Jvb21zOiAxLCAvLyBtYXggb2YgNCBpbiBvbGQgc2Ficywgbm90IHN1cmUgaGVyZVxyXG4gICAgICBvZmZpY2U6IG51bGwsXHJcbiAgICAgIHBvc3Rjb2RlOiBudWxsLFxyXG4gICAgICBwcmVmZXJlZF9ob3RlbHNfb25seTogZmFsc2UsXHJcbiAgICAgIHRyYWluc1N0YXRpb246IG51bGxcclxuICAgIH0gYXMgSG90ZWxUZW1wUGFyYW1zO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmhlbHBlcnMuc2FuYXRpemVSZXR1cm5zPEhvdGVsVGVtcFBhcmFtcz4oXHJcbiAgICAgIGRlZmF1bHRWYWwsXHJcbiAgICAgIE9iamVjdC5hc3NpZ24oe30sIC4uLmFyZ3MpLFxyXG4gICAgICBbJ2NoZWNraW5fZGF0ZScsICdjaGVja291dF9kYXRlJ11cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIENyZWF0ZXMgYSBMb3VuZ2VzIHNlYXJjaCBxdWVyeSB3aXRoIHN1cHBsaWVkIHBhcmFtcywgYXV0byBmaWxscyB3aXRoIGRlZmF1bHRzIGlmIGZpZWxkcyBhcmUgZW1wdHkuXHJcbiAgICogQHBhcmFtICB7YW55fSAgICAgICAgICAgICAgICAgICAgLi4uYXJncyBFeGFtcGxlIC0gc2VhcmNoU2VydmljZS5tYWtlTG91bmdlc1F1ZXJ5KGRhdGEucXVlcnksIHsgb3ZlcnJpZGU6IFwicHJvcGVydHlcIiB9KVxyXG4gICAqIEByZXR1cm4ge1F1ZXJ5U2VhcmNoTG91bmdlc0FyZ3N9ICAgICAgICAgUmV0dXJucyBRdWVyeVNlYXJjaExvdW5nZXNBcmdzIHR5cGVcclxuICAgKi9cclxuICBwdWJsaWMgbWFrZUxvdW5nZXNRdWVyeSguLi5hcmdzOiBhbnkpOiBMb3VuZ2VzVGVtcFBhcmFtcyB7XHJcbiAgICBjb25zdCBkZWZhdWx0VmFsID0ge1xyXG4gICAgICBhZHVsdHM6IDAsXHJcbiAgICAgIGFycml2YWxEYXRldGltZTogbW9tZW50KCksXHJcbiAgICAgIGNoaWxkcmVuOiAwLFxyXG4gICAgICBpbmZhbnRzOiAwLFxyXG4gICAgICBsb2NhdGlvbkNvZGU6IG51bGwsXHJcbiAgICAgIHRlcm1pbmFsOiBudWxsXHJcbiAgICB9IGFzIExvdW5nZXNUZW1wUGFyYW1zO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmhlbHBlcnMuc2FuYXRpemVSZXR1cm5zPExvdW5nZXNUZW1wUGFyYW1zPihcclxuICAgICAgZGVmYXVsdFZhbCxcclxuICAgICAgT2JqZWN0LmFzc2lnbih7fSwgLi4uYXJncyksXHJcbiAgICAgIFsnYXJyaXZhbERhdGV0aW1lJ11cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIENyZWF0ZXMgYSBQYXJraW5nIHNlYXJjaCBxdWVyeSB3aXRoIHN1cHBsaWVkIHBhcmFtcywgYXV0byBmaWxscyB3aXRoIGRlZmF1bHRzIGlmIGZpZWxkcyBhcmUgZW1wdHkuXHJcbiAgICogQHBhcmFtICB7YW55fSAgICAgICAgICAgICAgICAgICAgLi4uYXJncyBFeGFtcGxlIC0gc2VhcmNoU2VydmljZS5tYWtlUGFya2luZ1F1ZXJ5KGRhdGEucXVlcnksIHsgb3ZlcnJpZGU6IFwicHJvcGVydHlcIiB9KVxyXG4gICAqIEByZXR1cm4ge1F1ZXJ5U2VhcmNoUGFya2luZ0FyZ3N9ICAgICAgICAgUmV0dXJucyBRdWVyeVNlYXJjaFBhcmtpbmdBcmdzIHR5cGVcclxuICAgKi9cclxuICBwdWJsaWMgbWFrZVBhcmtpbmdRdWVyeSguLi5hcmdzOiBhbnkpOiBQYXJraW5nVGVtcFBhcmFtcyB7XHJcbiAgICBjb25zdCBub3cgPSB0aGlzLmhlbHBlcnMubWFrZU1vbWVudERheVRpbWUoKTtcclxuICAgIGNvbnN0IHRvbW9ycm93ID0gdGhpcy5oZWxwZXJzLm1ha2VNb21lbnREYXlUaW1lKDEpO1xyXG4gICAgY29uc3QgbW9tZW50T3V0RGF0ZVRpbWUgPSB0aGlzLmhlbHBlcnMubW9tZW50Um91bmRNaW51dGVzKG5vdywgMzApO1xyXG4gICAgY29uc3QgbW9tZW50SW5EYXRlVGltZSA9IHRoaXMuaGVscGVycy5tb21lbnRSb3VuZE1pbnV0ZXModG9tb3Jyb3csIDMwKTtcclxuXHJcbiAgICBjb25zdCBkZWZhdWx0VmFsID0ge1xyXG4gICAgICBhcnJpdmFsRGF0ZXRpbWU6IG1vbWVudE91dERhdGVUaW1lLFxyXG4gICAgICBjYXJQYXJrZWRGb3JZb3U6IG51bGwsXHJcbiAgICAgIGRlcGFydERhdGV0aW1lOiBtb21lbnRJbkRhdGVUaW1lLFxyXG4gICAgICBsb2NhdGlvbkNvZGU6IG51bGwsXHJcbiAgICAgIG1lZXRBbmRHcmVldDogbnVsbCxcclxuICAgICAgb25BaXJwb3J0OiBudWxsLFxyXG4gICAgICBvdXRGbGlnaHROdW1iZXI6IG51bGwsXHJcbiAgICAgIHBhcmtBbmRSaWRlOiBudWxsLFxyXG4gICAgICBwYXJrQW5kU3Ryb2xsOiBudWxsLFxyXG4gICAgICByZWNvbW1lbmRlZDogbnVsbCxcclxuICAgICAgdGVybWluYWw6IG51bGxcclxuICAgIH0gYXMgUGFya2luZ1RlbXBQYXJhbXM7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaGVscGVycy5zYW5hdGl6ZVJldHVybnM8UGFya2luZ1RlbXBQYXJhbXM+KFxyXG4gICAgICBkZWZhdWx0VmFsLFxyXG4gICAgICBPYmplY3QuYXNzaWduKHt9LCAuLi5hcmdzKSxcclxuICAgICAgWydhcnJpdmFsRGF0ZXRpbWUnLCAnZGVwYXJ0RGF0ZXRpbWUnXVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogQ3JlYXRlcyBhIFJhaWwgc2VhcmNoIHF1ZXJ5IHdpdGggc3VwcGxpZWQgcGFyYW1zLCBhdXRvIGZpbGxzIHdpdGggZGVmYXVsdHMgaWYgZmllbGRzIGFyZSBlbXB0eS5cclxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgICAgICAgICAgICAgICAuLi5hcmdzIEV4YW1wbGUgLSBzZWFyY2hTZXJ2aWNlLm1ha2VSYWlsUXVlcnkoZGF0YS5xdWVyeSwgeyBvdmVycmlkZTogXCJwcm9wZXJ0eVwiIH0pXHJcbiAgICogQHJldHVybiB7UXVlcnlTZWFyY2hSYWlsQXJnc30gICAgICAgICBSZXR1cm5zIFF1ZXJ5U2VhcmNoUmFpbEFyZ3MgdHlwZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBtYWtlUmFpbFF1ZXJ5KC4uLmFyZ3M6IGFueSk6IFJhaWxUZW1wUGFyYW1zIHtcclxuICAgIGNvbnN0IHRpbWUgPSB0aGlzLmhlbHBlcnMubW9tZW50Um91bmRNaW51dGVzKG1vbWVudCgpLCAzMCk7XHJcbiAgICBjb25zdCBkZWZhdWx0VmFsOiBSYWlsVGVtcFBhcmFtcyA9IHtcclxuICAgICAgYWlycG9ydEV4cHJlc3NTdGF0aW9uOiBudWxsLFxyXG4gICAgICBhcHBseVJhaWxjYXJkczogZmFsc2UsXHJcbiAgICAgIGNhcm5ldFRpY2tldDogZmFsc2UsXHJcbiAgICAgIGNob3NlblNlYXJjaENsYXNzOiBSYWlsQ2xhc3MuQWxsLFxyXG4gICAgICBjaG9zZW5TZWFyY2hUeXBlOiBSYWlsU2VhcmNoSm91cm5leVR5cGUuUmV0dXJuSm91cm5leSxcclxuICAgICAgZGlzYWJsZUF1dG9EaXNjb3VudHM6IGZhbHNlLFxyXG4gICAgICBleHRyYVRpbWU6IGZhbHNlLFxyXG4gICAgICBpbkJvdW5kRGF0ZVRpbWU6IHRpbWUsXHJcbiAgICAgIGlzQWlycG9ydEV4cHJlc3M6IGZhbHNlLFxyXG4gICAgICBub09mQWR1bHRzOiAwLFxyXG4gICAgICBub09mQ2hpbGRyZW46IDAsXHJcbiAgICAgIG91dGJvdW5kQ3JpdGVyaWE6IFJhaWxTZWFyY2hDcml0ZXJpYS5EZXBhcnQsXHJcbiAgICAgIG91dEJvdW5kRGF0ZVRpbWU6IHRpbWUsXHJcbiAgICAgIHByaW9yaXRpc2VCeVByaWNlOiBmYWxzZSxcclxuICAgICAgcmV0dXJuQ3JpdGVyaWE6IFJhaWxTZWFyY2hDcml0ZXJpYS5EZXBhcnQsXHJcbiAgICAgIHRyYXZlbGxpbmdGcm9tOiBudWxsLFxyXG4gICAgICB0cmF2ZWxsaW5nVG86IG51bGwsXHJcbiAgICAgIHZpYTogZmFsc2UsXHJcbiAgICAgIHZpYUxvY2F0aW9uOiBudWxsLFxyXG4gICAgICByYWlsQ2FyZHM6IG51bGxcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaGVscGVycy5zYW5hdGl6ZVJldHVybnM8UmFpbFRlbXBQYXJhbXM+KFxyXG4gICAgICBkZWZhdWx0VmFsLFxyXG4gICAgICBPYmplY3QuYXNzaWduKHt9LCAuLi5hcmdzKSxcclxuICAgICAgWydpbkJvdW5kRGF0ZVRpbWUnLCAnb3V0Qm91bmREYXRlVGltZSddXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBDcmVhdGVzIGEgUmFpbCBzZWFyY2ggcXVlcnkgd2l0aCBzdXBwbGllZCBwYXJhbXMsIGF1dG8gZmlsbHMgd2l0aCBkZWZhdWx0cyBpZiBmaWVsZHMgYXJlIGVtcHR5LlxyXG4gICAqIEBwYXJhbSAge2FueX0gICAgICAgICAgICAgICAgICAgIC4uLmFyZ3MgRXhhbXBsZSAtIHNlYXJjaFNlcnZpY2UubWFrZUlybFF1ZXJ5KGRhdGEucXVlcnksIHsgb3ZlcnJpZGU6IFwicHJvcGVydHlcIiB9KVxyXG4gICAqIEByZXR1cm4ge1F1ZXJ5U2VhcmNoUmFpbEFyZ3N9ICAgICAgICAgUmV0dXJucyBRdWVyeVNlYXJjaFJhaWxBcmdzIHR5cGVcclxuICAgKi9cclxuICBwdWJsaWMgbWFrZUlybFF1ZXJ5KC4uLmFyZ3M6IGFueSk6IElybFRlbXBQYXJhbXMge1xyXG4gICAgY29uc3QgdGltZSA9IHRoaXMuaGVscGVycy5tb21lbnRSb3VuZE1pbnV0ZXMobW9tZW50KCksIDMwKTtcclxuICAgIGNvbnN0IGRlZmF1bHRWYWw6IElybFRlbXBQYXJhbXMgPSB7XHJcbiAgICAgIHN1cHBsaWVyOiBudWxsLCAvLyBJUkxTdXBwbGllciFcclxuICAgICAgY291bnRyeUNvZGU6ICcnLFxyXG4gICAgICBqb3VybmV5VHlwZTogSXJsSm91cm5leVR5cGUuUmV0dXJuSm91cm5leSwgLy8gSVJMSm91cm5leVR5cGUhXHJcbiAgICAgIGNsYXNzOiBudWxsLCAvLyBJUkxDbGFzc1xyXG4gICAgICBvdXRib3VuZERlcGFydHVyZURhdGVUaW1lOiB0aW1lLFxyXG4gICAgICBkZXBhcnR1cmVMb2NhdGlvbklkOiBudWxsLFxyXG4gICAgICBhcnJpdmFsTG9jYXRpb25JZDogbnVsbCxcclxuICAgICAgYWR1bHRzOiAwLFxyXG4gICAgICBjaGlsZHJlbjogMCxcclxuICAgICAgcmV0dXJuRGVwYXJ0dXJlRGF0ZVRpbWU6IHRpbWUsXHJcbiAgICAgIGlybERpc2NvdW50Q2FyZHM6IG51bGxcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaGVscGVycy5zYW5hdGl6ZVJldHVybnM8SXJsVGVtcFBhcmFtcz4oXHJcbiAgICAgIGRlZmF1bHRWYWwsXHJcbiAgICAgIE9iamVjdC5hc3NpZ24oe30sIC4uLmFyZ3MpLFxyXG4gICAgICBbJ3JldHVybkRlcGFydHVyZURhdGVUaW1lJywgJ291dGJvdW5kRGVwYXJ0dXJlRGF0ZVRpbWUnXVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogQ3JlYXRlcyBhIEV1cm9zdGFyIHNlYXJjaCBxdWVyeSB3aXRoIHN1cHBsaWVkIHBhcmFtcywgYXV0byBmaWxscyB3aXRoIGRlZmF1bHRzIGlmIGZpZWxkcyBhcmUgZW1wdHkuXHJcbiAgICogQHBhcmFtICB7YW55fSAgICAgICAgICAgICAgICAgICAgLi4uYXJncyBFeGFtcGxlIC0gc2VhcmNoU2VydmljZS5tYWtlRXVyb3N0YXJRdWVyeShkYXRhLnF1ZXJ5LCB7IG92ZXJyaWRlOiBcInByb3BlcnR5XCIgfSlcclxuICAgKiBAcmV0dXJuIHtFdXJvc3RhclRlbXBQYXJhbXN9ICAgICAgICAgUmV0dXJucyBRdWVyeVNlYXJjaEV1cm9zdGFyQXJncyB0eXBlXHJcbiAgICovXHJcbiAgcHVibGljIG1ha2VFdXJvc3RhclF1ZXJ5KC4uLmFyZ3M6IGFueSk6IEV1cm9zdGFyVGVtcFBhcmFtcyB7XHJcbiAgICBjb25zdCBub3cgPSB0aGlzLmhlbHBlcnMubWFrZU1vbWVudERheVRpbWUoKTtcclxuICAgIGNvbnN0IHRvbW9ycm93ID0gdGhpcy5oZWxwZXJzLm1ha2VNb21lbnREYXlUaW1lKDEpO1xyXG4gICAgY29uc3QgbW9tZW50T3V0RGF0ZVRpbWUgPSB0aGlzLmhlbHBlcnMubW9tZW50Um91bmRNaW51dGVzKG5vdywgMzApO1xyXG4gICAgY29uc3QgbW9tZW50SW5EYXRlVGltZSA9IHRoaXMuaGVscGVycy5tb21lbnRSb3VuZE1pbnV0ZXModG9tb3Jyb3csIDMwKTtcclxuXHJcbiAgICBjb25zdCBkZWZhdWx0VmFsOiBFdXJvc3RhclRlbXBQYXJhbXMgPSB7XHJcbiAgICAgIGFkdWx0czogMCxcclxuICAgICAgYXJyaXZlTG9jYXRpb246IG51bGwsXHJcbiAgICAgIGNhYmluQ2xhc3M6IEZsaWdodENhYmluQ2xhc3MuQW55LFxyXG4gICAgICBjaGlsZHJlbjogMCxcclxuICAgICAgY2hvc2VuU2VhcmNoVHlwZTogRXVyb3N0YXJTZWFyY2hUeXBlLnJldHVybixcclxuICAgICAgZGVwYXJ0TG9jYXRpb246IG51bGwsXHJcbiAgICAgIGZhcmVUeXBlOiBGYXJlVHlwZS5GbGV4aWJsZSxcclxuICAgICAgaW5ib3VuZERhdGU6IG1vbWVudE91dERhdGVUaW1lLFxyXG4gICAgICBpblRpbWVDcml0ZXJpYTogVGltZVdpbmRvdy5EZXBhcnQsXHJcbiAgICAgIG1heENvbm5lY3Rpb25zOiBudWxsLFxyXG4gICAgICBpbmNsdWRlTmVhcmJ5QWlycG9ydHM6IGZhbHNlLFxyXG4gICAgICBtdWx0aURlc3RpbmF0aW9uOiBbXSxcclxuICAgICAgb3V0Qm91bmREYXRlOiBtb21lbnRJbkRhdGVUaW1lLFxyXG4gICAgICBvdXRUaW1lQ3JpdGVyaWE6IFRpbWVXaW5kb3cuRGVwYXJ0LFxyXG4gICAgICBwcmVmZXJyZWRDYXJyaWVyczogW251bGwsIG51bGwsIG51bGwsIG51bGxdLFxyXG4gICAgICByZXR1cm5DYWJpbkNsYXNzOiBGbGlnaHRDYWJpbkNsYXNzLkFueVxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5oZWxwZXJzLnNhbmF0aXplUmV0dXJuczxFdXJvc3RhclRlbXBQYXJhbXM+KFxyXG4gICAgICBkZWZhdWx0VmFsLFxyXG4gICAgICBPYmplY3QuYXNzaWduKHt9LCAuLi5hcmdzKSxcclxuICAgICAgWydvdXRCb3VuZERhdGUnLCAnaW5ib3VuZERhdGUnXVxyXG4gICAgKTtcclxuICB9XHJcbiAgLyogQ3JlYXRlIFF1ZXJ5IERlZmF1bHRzIEVuZCAqL1xyXG5cclxuICBzaG91bGRBZGRUcmF2ZWxsZXJTdWJzY3JpcHRpb24oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBnZXRBdXRvTG9nb3V0Q29uZmlnKCkge1xyXG4gICAgcmV0dXJuIHt9O1xyXG4gIH1cclxuICAvKipcclxuICAgKiBPdmVyd3JpdGUgaWYgdGhlIE9CVCBkaXNwbGF5cyBhIGxpc3Qgb2Ygb2ZmaWNlcyBpbnN0ZWFkIG9mIHNlYXJjaGluZyBvbiB0aGVtXHJcbiAgICovXHJcbiAgcHVibGljIHNob3VsZEZldGNoQWxsT2ZmaWNlcygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbiAgaXNGbGlnaHRzR3JvdXBlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbiAgZ2V0Q291bnRyeUZ1bGxOYW1lRnJvbUNvdW50cnlDb2RlKGNvZGU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBsZXQgZnVsbE5hbWUgPSAnVW5rbm93bic7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvdW50cmllcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBjb3VudHJ5ID0gdGhpcy5jb3VudHJpZXNbaV07XHJcblxyXG4gICAgICBpZiAoY291bnRyeS5jQ29kZSA9PT0gY29kZSkge1xyXG4gICAgICAgIHJldHVybiBjb3VudHJ5LmNOYW1lO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZ1bGxOYW1lO1xyXG4gIH1cclxuXHJcbiAgZ2V0VXNlclJlY2VudFNlYXJjaGVzKFxyXG4gICAgc2VydmljZVR5cGU/OiBTZXJ2aWNlVHlwZSxcclxuICAgIGlzTG9hZGluZz86IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPlxyXG4gICk6IE9ic2VydmFibGU8UmVjZW50U2VhcmNoW10+IHtcclxuICAgIGlzTG9hZGluZz8ubmV4dCh0cnVlKTtcclxuICAgIGNvbnN0IHF1ZXJ5ID0geyBzZXJ2aWNlVHlwZSB9O1xyXG4gICAgY29uc3Qgb2JzOiBPYnNlcnZhYmxlPEdldFVzZXJSZWNlbnRTZWFyY2hlc1Jlc3VsdEFycmF5PiA9XHJcbiAgICAgIHRoaXMuZ2V0VXNlclJlY2VudFNlYXJjaGVzRmV0Y2hlci5mZXRjaExpc3QocXVlcnkpO1xyXG5cclxuICAgIGNvbnN0IGZ1bmMgPSAoXHJcbiAgICAgIHJlc3VsdHM6IEdldFVzZXJSZWNlbnRTZWFyY2hlc1Jlc3VsdEFycmF5XHJcbiAgICApOiBSZWNlbnRTZWFyY2hbXSA9PiB7XHJcbiAgICAgIGNvbnN0IGRhdGE6IFJlY2VudFNlYXJjaFtdID0gcmVzdWx0cy5tYXAoXHJcbiAgICAgICAgKHJlc3VsdDogR2V0VXNlclJlY2VudFNlYXJjaGVzUmVzdWx0KTogUmVjZW50U2VhcmNoID0+IHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGlkOiByZXN1bHQuaWQsXHJcbiAgICAgICAgICAgIG5hbWU6IHJlc3VsdC5uYW1lLFxyXG4gICAgICAgICAgICBzZXJ2aWNlVHlwZTogcmVzdWx0LnNlcnZpY2VUeXBlLFxyXG4gICAgICAgICAgICBzZWFyY2hBcmdzOiByZXN1bHQuc2VhcmNoQXJncyxcclxuICAgICAgICAgICAgY3JlYXRlZEF0OiByZXN1bHQuY3JlYXRlZEF0LFxyXG4gICAgICAgICAgICB1cGRhdGVkQXQ6IHJlc3VsdC51cGRhdGVkQXQsXHJcbiAgICAgICAgICAgIHRyYXZlbERhdGU6IHJlc3VsdC50cmF2ZWxEYXRlLFxyXG4gICAgICAgICAgICB0cmF2ZWxsZXJzOiByZXN1bHQudHJhdmVsbGVyc1xyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICAgIGlzTG9hZGluZz8ubmV4dChmYWxzZSk7XHJcbiAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBvYnMucGlwZSh0YWtlKDEpLCBtYXAoZnVuYykpO1xyXG4gIH1cclxuXHJcbiAgZ2V0VXNlckZhdm91cml0ZVNlYXJjaGVzKFxyXG4gICAgc2VydmljZVR5cGU/OiBTZXJ2aWNlVHlwZSxcclxuICAgIGlzTG9hZGluZz86IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPlxyXG4gICk6IE9ic2VydmFibGU8R2V0VXNlckZhdm91cml0ZVNlYXJjaGVzUmVzdWx0QXJyYXk+IHtcclxuICAgIGlzTG9hZGluZz8ubmV4dCh0cnVlKTtcclxuICAgIGNvbnN0IHF1ZXJ5ID0geyBzZXJ2aWNlVHlwZSB9O1xyXG4gICAgY29uc3Qgb2JzOiBPYnNlcnZhYmxlPEdldFVzZXJGYXZvdXJpdGVTZWFyY2hlc1Jlc3VsdEFycmF5PiA9XHJcbiAgICAgIHRoaXMuZ2V0VXNlckZhdm91cml0ZVNlYXJjaGVzRmV0Y2hlci5mZXRjaExpc3QocXVlcnkpO1xyXG5cclxuICAgIGNvbnN0IGZ1bmMgPSAoXHJcbiAgICAgIHJlc3VsdHM6IEdldFVzZXJGYXZvdXJpdGVTZWFyY2hlc1Jlc3VsdEFycmF5XHJcbiAgICApID0+IHtcclxuICAgICAgaXNMb2FkaW5nPy5uZXh0KGZhbHNlKTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gb2JzLnBpcGUodGFrZSgxKSwgdGFwKGZ1bmMpKTtcclxuICB9XHJcblxyXG4gIGRlbGV0ZVJlY2VudFNlYXJjaEJ5SUQoaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5iYXNlRGVsZXRlUmVjZW50U2VhcmNoVXBkYXRlci51cGRhdGVPbmUoeyBpZDogaWQgfSk7XHJcbiAgfVxyXG4gIGRlbGV0ZUZhdm91cml0ZVNlYXJjaEJ5SUQoaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8dm9pZD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZGVsZXRlRmF2b3VyaXRlU2VhcmNoVXBkYXRlci51cGRhdGVPbmUoeyBpZDogaWQgfSk7XHJcbiAgfVxyXG5cclxuICBzYXZlUmVjZW50U2VhcmNoKHF1ZXJ5OiBTYXZlUmVjZW50U2VhcmNoTXV0YXRpb25WYXJpYWJsZXMpOiB2b2lkIHtcclxuICAgIGlmIChxdWVyeSkge1xyXG4gICAgICB0aGlzLmJhc2VTYXZlUmVjZW50U2VhcmNoVXBkYXRlclxyXG4gICAgICAgIC51cGRhdGVPbmUocXVlcnkpXHJcbiAgICAgICAgLnBpcGUodGFrZSgxKSlcclxuICAgICAgICAuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRDb3ZpZE1pY3Jvc2l0ZVRva2VuKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRDb3ZpZE1pY3Jvc2l0ZVRva2VuRmV0Y2hlci5mZXRjaExpc3QoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiAtIGdldCB0aGUgbGlzdCBvZiBldXJvc3RhciBzdGF0aW9uIGxvY2F0aW9ucyBiYXNlZCBvbiBzZWFyY2ggdGVybSBnaXZlblxyXG4gICAqIEB0b2RvIC0gZmlsbCB0aGlzIG91dCBzbyB0aGF0IGl0IGFjdHVhbGx5IHBlcmZvcm1zIGEgaHR0cCBjYWxsXHJcbiAgICogQHBhcmFtIHRlcm0gLSB0aGUgdGVybSB3ZSB3YW50IHRvIHNlYXJjaCBieVxyXG4gICAqIEByZXR1cm5zXHJcbiAgICovXHJcbiAgbG9va3VwRXVyb3N0YXJTdGF0aW9ucyh0ZXJtOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueVtdPiB7XHJcbiAgICBjb25zb2xlLmxvZygndGVybXwgJywgdGVybSk7XHJcbiAgICBpZiAodGVybSA9PT0gJycpIHtcclxuICAgICAgcmV0dXJuIG9mKHRoaXMuZXVyb3N0YXRpb25zKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBvZihcclxuICAgICAgICB0aGlzLmV1cm9zdGF0aW9ucy5maWx0ZXIoXHJcbiAgICAgICAgICAodikgPT4gdi5kZXN0aW5hdGlvbi50b0xvd2VyQ2FzZSgpLmluZGV4T2YodGVybS50b0xvd2VyQ2FzZSgpKSA+IC0xXHJcbiAgICAgICAgKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2VhcmNoVHJhdmVsbGVycyhcclxuICAgIGlucHV0OiBzdHJpbmcsXHJcbiAgICBzZWFyY2hUcmF2ZWxsZXJzQnk6IFRyYXZlbGxlclNlYXJjaFR5cGVzXHJcbiAgKTogT2JzZXJ2YWJsZTxUcmF2ZWxsZXJbXT4ge1xyXG4gICAgY29uc3QgdHlwZTogQm9va2VyVHlwZSA9IHRoaXMudXNlclNlcnZpY2UuZ2V0VXNlckJvb2tpbmdUeXBlKCk7XHJcbiAgICB0aGlzLnRyYXZlbGxlcl9lcnJvciA9IGZhbHNlO1xyXG4gICAgLyogVE9ET1xyXG4gICAgaWYgKHRoaXMudXNlclNlcnZpY2UudXNlQWdlbnRDYW5Cb29rRm9yKCkpIHtcclxuICAgICAgdHlwZSA9IHRoaXMudXNlclNlcnZpY2UuZ2V0VXNlckZhdm9yaXRlVmFsdWUoJ0FnZW50Q2FuQm9va0ZvcicpO1xyXG4gICAgfSovXHJcbiAgICBpZiAoXHJcbiAgICAgIHR5cGUgJiZcclxuICAgICAgdHlwZSAhPT0gQm9va2VyVHlwZS5TZWxmQm9vayAmJlxyXG4gICAgICB0eXBlICE9PSBCb29rZXJUeXBlLlRyYXZlbGxlciAmJlxyXG4gICAgICBpbnB1dC5sZW5ndGggPj0gMVxyXG4gICAgKSB7XHJcbiAgICAgIGNvbnN0IGlucHV0V29yZHMgPSBpbnB1dC50b0xvd2VyQ2FzZSgpLm1hdGNoKC8oW1xcd10pKy9nKTtcclxuICAgICAgY29uc3QgYXJnczogU2VhcmNoVXNlckNhbkJvb2tGb3JRdWVyeVZhcmlhYmxlcyA9IHt9O1xyXG4gICAgICBzd2l0Y2ggKHNlYXJjaFRyYXZlbGxlcnNCeSkge1xyXG4gICAgICAgIGNhc2UgVHJhdmVsbGVyU2VhcmNoVHlwZXMubmFtZTpcclxuICAgICAgICAgIGFyZ3MudXNlck5hbWUgPSBpbnB1dFdvcmRzLmxlbmd0aCA+IDEgPyBpbnB1dFdvcmRzWzBdIDogaW5wdXQ7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFRyYXZlbGxlclNlYXJjaFR5cGVzLmVtYWlsOlxyXG4gICAgICAgICAgYXJncy5lbWFpbCA9IGlucHV0O1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBUcmF2ZWxsZXJTZWFyY2hUeXBlcy5lbXBsb3llZU51bWJlcjpcclxuICAgICAgICAgIGFyZ3MuZW1wbG95ZWVJZCA9IGlucHV0O1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB0aGlzLnNlYXJjaFVzZXJzQ2FuQm9va0ZvckZldGNoZXIuZmV0Y2hMaXN0KGFyZ3MpLnBpcGUoXHJcbiAgICAgICAgbWFwKChkYXRhOiBUcmF2ZWxsZXJbXSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGRhdGEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGVscGVycy5jbG9uZShkYXRhKS5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGEuc3VybmFtZSA8IGIuc3VybmFtZSA/IC0xIDogYS5zdXJuYW1lID4gYi5zdXJuYW1lID8gMSA6IDA7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRGbGlnaHRGYXJlUnVsZXMoXHJcbiAgICBmbGlnaHQ6IElucHV0RmxpZ2h0Sm91cm5leVxyXG4gICk6IE9ic2VydmFibGU8R2V0RmxpZ2h0RmFyZVJ1bGVzUmVzdWx0QXJyYXk+IHtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5nZXRGbGlnaHRGYXJlUnVsZXNGZXRjaGVyLmZldGNoTGlzdCh7ZmxpZ2h0fSk7XHJcbiAgfVxyXG5cclxuICBnZXRSYWlsTGl2ZURlcGFydHVyZXMoXHJcbiAgICBzdGF0aW9uOiBzdHJpbmcsXHJcbiAgICBkYXRlVGltZT86IG1vbWVudC5Nb21lbnRcclxuICApOiBPYnNlcnZhYmxlPFNlYXJjaFJhaWxMaXZlRGVwYXJ0dXJlc1Jlc3VsdD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0UmFpbExpdmVEZXBhcnR1cmVzRmV0Y2hlci5mZXRjaExpc3Qoe1xyXG4gICAgICBzdGF0aW9uQ29kZTogc3RhdGlvbixcclxuICAgICAgZGVwYXJ0RGF0ZVRpbWU6IGRhdGVUaW1lXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldEZsaWdodFNlYXRNYXAoXHJcbiAgICBmbGlnaHQ6IElucHV0RmxpZ2h0Sm91cm5leVxyXG4gICk6IE9ic2VydmFibGU8RmxpZ2h0U2VhdE1hcFJlc3BvbnNlW10+IHtcclxuICAgIHJldHVybiB0aGlzLmdldEZsaWdodFNlYXRNYXBGZXRjaGVyLmZldGNoTGlzdCh7ZmxpZ2h0OiBmbGlnaHR9KS5waXBlKFxyXG4gICAgICBtYXAoKGRhdGE6IEZsaWdodFNlYXRNYXBSZXN1bHQpID0+IHtcclxuICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICByZXR1cm4gZGF0YS5yZXN1bHRzO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBzYXZlRmF2b3VyaXRlU2VhcmNoKHNlYXJjaDogU2F2ZUZhdm91cml0ZVNlYXJjaE11dGF0aW9uVmFyaWFibGVzKTogT2JzZXJ2YWJsZTxTYXZlRmF2b3VyaXRlU2VhcmNoUmVzdWx0PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmJhc2VTYXZlRmF2b3VyaXRlU2VhcmNoVXBkYXRlci51cGRhdGVPbmUoc2VhcmNoKTtcclxuICB9XHJcblxyXG4gIGdldENvbmZlcm1hUm9vbUltYWdlcyhob3RlbElkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFN0cmluZ1tdPiB7XHJcbiAgICBpZiAoaG90ZWxJZCkge1xyXG4gICAgICBjb25zdCBvYnM6IE9ic2VydmFibGU8U2VhcmNoSG90ZWxDaGFpbnNSZXN1bHRBcnJheT4gPVxyXG4gICAgICAgIHRoaXMuZ2V0Q29uZmVybWFSb29tSW1hZ2VzRmV0Y2hlci5mZXRjaExpc3QoeyBob3RlbElkIH0pO1xyXG4gICAgICByZXR1cm4gb2JzLnBpcGUodGFrZSgxKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxufVxyXG4iXX0=
|
|
1545
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vYnRzZXJ2aWNlcy9iYXNlL3NyYy9saWIvdmVuZG9yL3NlcnZpY2VzL3NlYXJjaC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRCxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxTQUFTLE1BQU0sd0JBQXdCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUduRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUsvRSxPQUFPLEVBSUwsVUFBVSxFQUNWLFFBQVEsRUFDUixTQUFTLEVBQ1QscUJBQXFCLEVBRXJCLFdBQVcsRUFFWCxrQkFBa0IsRUFVbEIsZ0JBQWdCLEVBS2hCLGNBQWMsRUFVZixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQy9FLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsVUFBVSxFQUNYLE1BQU0scUNBQXFDLENBQUM7QUFDN0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDL0UsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixrQkFBa0IsRUFDbkIsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzQyxPQUFPLEVBQWEsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFTeEUsT0FBTyxFQU1M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O2dCQUM3QixVQUFVLEVBQUUsVUFBVTtnQkFDdEIsVUFBVSxFQUFFLFVBQVU7YUFDdkIsQ0FBQztZQUNGLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFckIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FDN0MsQ0FBQyxNQUE4QixFQUFFLEVBQUU7Z0JBQ2pDLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRTtvQkFDbEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQ3BCLFVBQVUsQ0FBQyw2QkFBNkIsRUFDeEMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFDOUIsRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUNwQyxDQUFDO2lCQUNIO3FCQUFNO29CQUNMLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUNwQixVQUFVLENBQUMsbUJBQW1CLEVBQzlCLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxFQUNsQixFQUFFLEtBQUssRUFBRSxxQ0FBcUMsRUFBRSxDQUNqRCxDQUFDO2lCQUNIO1lBQ0gsQ0FBQyxDQUNGLENBQUM7U0FDSDtJQUNILENBQUM7SUFFRCx1QkFBdUIsQ0FDckIsWUFBaUI7UUFFakIsT0FBTyxJQUFJLENBQUMsOEJBQThCLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3BFLENBQUM7O0FBeGlFTSw2Q0FBaUIsR0FBVyxtQkFBbUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG1hcCwgdGFrZSwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XHJcbmltcG9ydCBDb3VudHJpZXMgZnJvbSAnLi4vZGF0YS9jb3VudHJpZXMuanNvbic7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZm9ya0pvaW4sIG9mLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQmFzZUVudGVycHJpc2VTZWFyY2ggfSBmcm9tICcuLi9jbGFzc2VzL2Jhc2UtZW50ZXJwcmlzZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgUGFya2luZ0VudGVycHJpc2VTZWFyY2ggfSBmcm9tICcuLi9jbGFzc2VzL3BhcmtpbmctZW50ZXJwcmlzZS1zZWFyY2gnO1xyXG5pbXBvcnQge1xyXG4gIFNlYXJjaE9iamVjdCxcclxuICBTZWFyY2hPYmplY3RzXHJcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9zZWFyY2gtb2JqZWN0cy5pbnRlcmZhY2UnO1xyXG5pbXBvcnQge1xyXG4gIEFkZHJlc3MsXHJcbiAgQWlycG9ydCxcclxuICBCYXNrZXRJdGVtLFxyXG4gIEJvb2tlclR5cGUsXHJcbiAgRmFyZVR5cGUsXHJcbiAgUmFpbENsYXNzLFxyXG4gIFJhaWxTZWFyY2hKb3VybmV5VHlwZSxcclxuICBTZWFyY2hBaXJwb3J0cyxcclxuICBTZXJ2aWNlVHlwZSxcclxuICBTYXZlVXNlckFkZHJlc3NNdXRhdGlvblZhcmlhYmxlcyxcclxuICBDYWJIaXJlVmVoaWNsZVR5cGUsXHJcbiAgQ29uZmVybWFPZmZpY2VOYW1lcyxcclxuICBDb25mZXJtYU9mZmljZUluZm8sXHJcbiAgQ29uZmVybWFPZmZpY2VSZXN1bHQsXHJcbiAgQ2FyYm9uQWxsb3dhbmNlLFxyXG4gIFJpc2tBbGVydCxcclxuICBSaXNrTGV2ZWwsXHJcbiAgR2V0Umlza0FsZXJ0c1F1ZXJ5VmFyaWFibGVzLFxyXG4gIFNlYXJjaEFpcmxpbmVzLFxyXG4gIEFpcmxpbmVSZXN1bHQsXHJcbiAgRmxpZ2h0Q2FiaW5DbGFzcyxcclxuICBSZWZlcmVuY2VSYWlsQ2FyZFF1YWxpZmllcixcclxuICBTZWFyY2hVc2VyQ2FuQm9va0ZvclF1ZXJ5VmFyaWFibGVzLFxyXG4gIFNhdmVSZWNlbnRTZWFyY2hNdXRhdGlvblZhcmlhYmxlcyxcclxuICBJcmxTdXBwbGllclN0YXRpb24sXHJcbiAgSXJsSm91cm5leVR5cGUsXHJcbiAgR2V0RmxpZ2h0RmFyZVJ1bGVzUXVlcnlWYXJpYWJsZXMsXHJcbiAgR2V0RmxpZ2h0U2VhdE1hcFF1ZXJ5VmFyaWFibGVzLFxyXG4gIElucHV0RmxpZ2h0Sm91cm5leSxcclxuICBGbGlnaHRTZWF0TWFwUmVzdWx0LFxyXG4gIEZsaWdodFNlYXRNYXBSZXNwb25zZSxcclxuICBTYXZlRmF2b3VyaXRlU2VhcmNoTXV0YXRpb25WYXJpYWJsZXMsXHJcbiAgQmFza2V0LFxyXG4gIElybEpvdXJuZXlPcHRpb25zLFxyXG4gIElybE9mZmxpbmVOb3RpZnlSZXN1bHRcclxufSBmcm9tICcuLi90eXBlcy9ncmFwaHFsLnR5cGVzJztcclxuaW1wb3J0IHsgTG91bmdlc0VudGVycHJpc2VTZWFyY2ggfSBmcm9tICcuLi9jbGFzc2VzL2xvdW5nZXMtZW50ZXJwcmlzZS1zZWFyY2gnO1xyXG5pbXBvcnQgeyBIb3RlbEVudGVycHJpc2VTZWFyY2ggfSBmcm9tICcuLi9jbGFzc2VzL2hvdGVsLWVudGVycHJpc2Utc2VhcmNoJztcclxuaW1wb3J0IHsgQ2FyaGlyZUVudGVycHJpc2VTZWFyY2ggfSBmcm9tICcuLi9jbGFzc2VzL2NhcmhpcmUtZW50ZXJwcmlzZS1zZWFyY2gnO1xyXG5pbXBvcnQge1xyXG4gIEZsaWdodEVudGVycHJpc2VTZWFyY2gsXHJcbiAgVGltZVdpbmRvd1xyXG59IGZyb20gJy4uL2NsYXNzZXMvZmxpZ2h0LWVudGVycHJpc2Utc2VhcmNoJztcclxuaW1wb3J0IHsgQ2FiSGlyZUVudGVycHJpc2VTZWFyY2ggfSBmcm9tICcuLi9jbGFzc2VzL2NhYmhpcmUtZW50ZXJwcmlzZS1zZWFyY2gnO1xyXG5pbXBvcnQge1xyXG4gIFJhaWxFbnRlcnByaXNlU2VhcmNoLFxyXG4gIFJhaWxTZWFyY2hDcml0ZXJpYVxyXG59IGZyb20gJy4uL2NsYXNzZXMvcmFpbC1lbnRlcnByaXNlLXNlYXJjaCc7XHJcbmltcG9ydCB7IFRyYXZlbGxlciwgVHJhdmVsbGVyT2JqZWN0IH0gZnJvbSAnLi4vbW9kZWxzL3RyYXZlbGxlci5vYmplY3QnO1xyXG5pbXBvcnQgeyBCYXNlU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuL3N0b3JhZ2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IEJhc2VIZWxwZXJSb3V0aW5lcyB9IGZyb20gJy4uL2NsYXNzZXMvaGVscGVycyc7XHJcbmltcG9ydCB7IEJhc2VIb3RlbEF2YWxpYmlsaXR5U2VydmljZSB9IGZyb20gJy4vaG90ZWwtYXZhbGxpYmlsaXR5LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCYXNlRW52aXJvbm1lbnQgfSBmcm9tICcuLi9jbGFzc2VzL2Vudmlyb21lbnQnO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VTZWFyY2hQb3N0Y29kZUZldGNoZXIsXHJcbiAgU2VhcmNoUG9zdGNvZGVzUXVvdGVGZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL2ZldGNoZXJzL3NlYXJjaC1wb3N0Y29kZXMuZmV0Y2hlcic7XHJcbmltcG9ydCB7XHJcbiAgQWRkcmVzc0Zvcm0sXHJcbiAgQWlycG9ydFNlYXJjaFJlc3VsdHMsXHJcbiAgQ2FySGlyZURlcG90UmVzdWx0QXJyYXksXHJcbiAgQ291bnRyeUNvZGUsXHJcbiAgTG9jYXRpb25EZXRhaWxzLFxyXG4gIExvY2F0aW9uVHlwZXMsXHJcbiAgT0JUQWlycG9ydERldGFpbHMsXHJcbiAgUmFpbEFpcnBvcnQsXHJcbiAgUm91dGVyLFxyXG4gIFNlYXJjaENpdGllc1Jlc3VsdCxcclxuICBTZWFyY2hDaXRpZXNSZXN1bHRBcnJheSxcclxuICBTZWFyY2hQb3N0Y29kZXNSZXN1bHQsXHJcbiAgU2VhcmNoUG9zdGNvZGVzUmVzdWx0QXJyYXksXHJcbiAgU2VhcmNoUmFpbFN0YXRpb25zUmVzdWx0LFxyXG4gIFNlYXJjaFJhaWxTdGF0aW9uc1Jlc3VsdEFycmF5LFxyXG4gIFRlcm1pbmFsc1R5cGUsXHJcbiAgR2V0VXNlckNvbXBhbnlPZmZpY2VzUmVzdWx0QXJyYXksXHJcbiAgR2V0VXNlckNvbXBhbnlPZmZpY2VzUmVzdWx0LFxyXG4gIFNlYXJjaEhvdGVsQ2hhaW5zUmVzdWx0QXJyYXksXHJcbiAgU2VhcmNoSG90ZWxDaGFpbnNSZXN1bHQsXHJcbiAgQWlybGluZXNTZWFyY2hSZXN1bHQsXHJcbiAgT0JUQWlybGluZXNEZXRhaWxzLFxyXG4gIEdldFVzZXJSZWNlbnRTZWFyY2hlc1Jlc3VsdEFycmF5LFxyXG4gIEdldFVzZXJSZWNlbnRTZWFyY2hlc1Jlc3VsdCxcclxuICBSZWNlbnRTZWFyY2gsXHJcbiAgU2VhcmNoQ29uZmVybWFDaXRpZXNSZXN1bHQsXHJcbiAgQ29uZmVybWFPZmZpY2VOYW1lUmVzdWx0LFxyXG4gIEdldEZsaWdodEZhcmVSdWxlc1Jlc3VsdEFycmF5LFxyXG4gIFNlYXJjaFJhaWxMaXZlRGVwYXJ0dXJlc1Jlc3VsdCxcclxuICBTYXZlRmF2b3VyaXRlU2VhcmNoUmVzdWx0LFxyXG4gIEdldFVzZXJGYXZvdXJpdGVTZWFyY2hlc1Jlc3VsdEFycmF5LFxyXG4gIEdldEhvdGVsQ2hhaW5zUmVzdWx0QXJyYXksXHJcbiAgR2V0SG90ZWxDaGFpbnNSZXN1bHQsXHJcbiAgZ2V0UmFpbFByb3ZpZGVyc1Jlc3VsdCxcclxuICBnZXRSYWlsUHJvdmlkZXJzUmVzdWx0QXJyYXksXHJcbiAgR2V0QWxsQWlybGluZXNSZXN1bHQsXHJcbiAgR2V0QWxsQWlybGluZXNSZXN1bHRBcnJheSxcclxuICBHZXRDYXJIaXJlUHJvdmlkZXJzUmVzdWx0LFxyXG4gIEdldENhckhpcmVQcm92aWRlcnNSZXN1bHRBcnJheSxcclxuICBTZXJ2aWNlUHJvdmlkZXJcclxufSBmcm9tICcuLi90eXBlcy90eXBlcyc7XHJcbmltcG9ydCB7XHJcbiAgQmFzZVNlYXJjaFJhaWxTdGF0aW9uc0ZldGNoZXIsXHJcbiAgU2VhcmNoUmFpbFN0YXRpb25zRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9zZWFyY2gtcmFpbC1zdGF0aW9ucy5mZXRjaGVyJztcclxuaW1wb3J0IHtcclxuICBCYXNlTG91bmdlUXVvdGVGZXRjaGVyLFxyXG4gIExvdW5nZVF1b3RlRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9sb3VuZ2UtcXVvdGUuZmV0Y2hlcic7XHJcbmltcG9ydCB7XHJcbiAgQmFzZVBhcmtpbmdRdW90ZUZldGNoZXIsXHJcbiAgUGFya2luZ1F1b3RlRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9wYXJraW5nLXF1b3RlLWZldGNoZXInO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VGbGlnaHRRdW90ZUZldGNoZXIsXHJcbiAgRmxpZ2h0UXVvdGVGZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL2ZldGNoZXJzL2ZsaWdodC1xdW90ZS5mZXRjaGVyJztcclxuaW1wb3J0IHtcclxuICBCYXNlSG90ZWxRdW90ZUZldGNoZXIsXHJcbiAgSG90ZWxRdW90ZUZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvaG90ZWwtcXVvdGUtZmV0Y2hlcic7XHJcbmltcG9ydCB7XHJcbiAgQmFzZUNhcmhpcmVRdW90ZUZldGNoZXIsXHJcbiAgQ2FySGlyZUZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvY2FyaGlyZS1xdW90ZS1mZXRjaGVyJztcclxuaW1wb3J0IHtcclxuICBCYXNlQ2FySGlyZUF2YWlsYWJpbGl0eURldGFpbEZldGNoZXIsXHJcbiAgQ2FySGlyZUF2YWlsYWJpbGl0eURldGFpbEZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvY2FyaGlyZS1hdmFpbGFiaWxpdHktZGV0YWlsLmZldGNoZXInO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VDYWJoaXJlUXVvdGVGZXRjaGVyLFxyXG4gIENhYmhpcmVRdW90ZUZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvY2FiaGlyZS1xdW90ZS1mZXRjaGVyJztcclxuaW1wb3J0IHtcclxuICBCYXNlUmFpbFF1b3RlRmV0Y2hlcixcclxuICBSYWlsUXVvdGVGZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL2ZldGNoZXJzL3JhaWwtcXVvdGUtZmV0Y2hlcic7XHJcbmltcG9ydCB7XHJcbiAgQmFzZUlybFF1b3RlRmV0Y2hlcixcclxuICBJcmxRdW90ZUZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvaXJsLXF1b3RlLWZldGNoZXInO1xyXG5pbXBvcnQgeyBSZWdFeHBzIH0gZnJvbSAnLi4vbW9kZWxzL3JlZ2V4cC5tb2RlbCc7XHJcbmltcG9ydCB7XHJcbiAgRW50ZXJwcmlzZVNlYXJjaFNlcnZpY2VJbnRlcmZhY2UsXHJcbiAgU2VhcmNoUGFyYW1zXHJcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9Jc2VhcmNoLnNlcnZpY2UnO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VTZWFyY2hBaXJwb3J0c0ZldGNoZXIsXHJcbiAgU2VhcmNoQWlycG9ydHNRdW90ZUZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvc2VhcmNoLWFpcnBvcnRzLWZldGNoZXInO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VTZWFyY2hBaXJsaW5lc0ZldGNoZXIsXHJcbiAgU2VhcmNoQWlybGluZXNRdW90ZUZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvc2VhcmNoLWFpcmxpbmVzLmZldGNoZXInO1xyXG5pbXBvcnQge1xyXG4gIFVzZXJTZXJ2aWNlSW50ZXJmYWNlLFxyXG4gIFVzZXJTZXJ2aWNlc1xyXG59IGZyb20gJy4uL2ludGVyZmFjZXMvSXVzZXIuc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgQmFzZVNlYXJjaENpdHlGZXRjaGVyLFxyXG4gIFNlYXJjaENpdGllc1F1b3RlRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9zZWFyY2gtY2l0aWVzLmZldGNoZXInO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VTZWFyY2hDb25mZXJtYUNpdHlGZXRjaGVyLFxyXG4gIFNlYXJjaENvbmZlcm1hQ2l0aWVzUXVvdGVGZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL2ZldGNoZXJzL3NlYXJjaC1jb25mZXJtYS1jaXRpZXMuZmV0Y2hlcic7XHJcbmltcG9ydCB7IEFic3RyYWN0SHR0cENhbGxTZXJ2aWNlIH0gZnJvbSAnLi9odHRwLWNhbGwuc2VydmljZSc7XHJcbmltcG9ydCB7IEVudGVycHJpc2VCYXNrZXRTZXJ2aWNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JZW50ZXJwcmlzZS1iYXNrZXQuc2VydmljZSc7XHJcbmltcG9ydCB7IEhvdGVsQXZhbGluaWxpdHlGZXRjaGVyVHlwZSB9IGZyb20gJy4uL2ZldGNoZXJzL2hvdGVsLWF2YWxpYWJpbGl0eS1mZXRjaGVyJztcclxuaW1wb3J0IHtcclxuICBCYXNlU2F2ZVVzZXJBZGRyZXNzVXBkYXRlcixcclxuICBTYXZlVXNlckFkZHJlc3NVcGRhdGVyVHlwZVxyXG59IGZyb20gJy4uL3VwZGF0ZXJzL3NhdmUtdXNlci1hZGRyZXNzLnVwZGF0ZXInO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VVc2VyQWRkcmVzc2VzRmV0Y2hlcixcclxuICBVc2VyQWRkcmVzc0ZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvdXNlci1hZGRyZXNzZXMuZmV0Y2hlcic7XHJcblxyXG5pbXBvcnQge1xyXG4gIEJhc2VDb25mZXJtYU9mZmljZU5hbWVzRmV0Y2hlcixcclxuICBDb25mZXJtYU9mZmljZU5hbWVGZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL2ZldGNoZXJzL2NvbmZlcm1hLW9mZmljZS1uYW1lcy5mZXRjaGVyJztcclxuXHJcbmltcG9ydCB7XHJcbiAgQmFzZUNvbmZlcm1hT2ZmaWNlRmV0Y2hlcixcclxuICBDb25mZXJtYU9mZmljZUZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvY29uZmVybWEtb2ZmaWNlLmZldGNoZXInO1xyXG5cclxuaW1wb3J0IHtcclxuICBCYXNlR2V0VXNlckNvbXBhbnlPZmZpY2VzRmV0Y2hlcixcclxuICBHZXRVc2VyQ29tcGFueU9mZmljZXNRdW90ZUZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvZ2V0LXVzZXItY29tcGFueS1vZmZpY2VzLmZldGNoZXInO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VTZWFyY2hIb3RlbENoYWluc0ZldGNoZXIsXHJcbiAgU2VhcmNoSG90ZWxDaGFpbnNRdW90ZUZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvc2VhcmNoLWhvdGVsLWNoYWlucy5mZXRjaGVyJztcclxuaW1wb3J0IHtcclxuICBCYXNlR2V0Q29uZmVybWFSb29tSW1hZ2VzRmV0Y2hlcixcclxuICBHZXRDb25mZXJtYVJvb21JbWFnZXNRdW90ZUZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvZ2V0LWNvbmZlcm1hLXJvb20taW1hZ2VzLmZldGNoZXInO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VWYWxpZGF0ZUlzUG9zdGNvZGVWYWxpZFRlc3RlcixcclxuICBWYWxpZGF0ZUlzUG9zdGNvZGVWYWxpZFR5cGVcclxufSBmcm9tICcuLi90ZXN0ZXJzL3Bvc3Rjb2RlLXZhbGlkYXRlLnRlc3Rlcic7XHJcblxyXG5pbXBvcnQge1xyXG4gIEJhc2VTZWFyY2hEZXBvdEZldGNoZXIsXHJcbiAgU2VhcmNoRGVwb3RRdW90ZUZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvc2VhcmNoLWRlcG90cy5mZXRjaGVyJztcclxuXHJcbmltcG9ydCB7XHJcbiAgQmFzZUdldFJhaWxTdGF0aW9uRmV0Y2hlcixcclxuICBHZXRSYWlsU3RhdGlvbkZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvZ2V0LXJhaWwtc3RhdGlvbi5mZXRjaGVyJztcclxuXHJcbmltcG9ydCB7XHJcbiAgQmFzZVNlYXJjaElybFN0YXRpb25zRmV0Y2hlcixcclxuICBTZWFyY2hJcmxTdGF0aW9uc0ZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvc2VhcmNoLWlybC1zdGF0aW9ucy5mZXRjaGVyJztcclxuXHJcbmltcG9ydCB7XHJcbiAgQmFzZVNlYXJjaENvbmZlcm1hUXVpY2tsaXN0RmV0Y2hlcixcclxuICBDb25mZXJtYVF1aWNrbGlzdEZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvY29uZmVybWEtcXVpY2tsaXN0LmZldGNoZXInO1xyXG5cclxuaW1wb3J0IHtcclxuICBCYXNlRGVsZXRlVXNlckFkZHJlc3NVcGRhdGVyLFxyXG4gIERlbGV0ZVVzZXJBZGRyZXNzRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi91cGRhdGVycy9yZW1vdmUtdXNlci1hZGRyZXNzLXVwZGF0ZXInO1xyXG5cclxuaW1wb3J0IHtcclxuICBCYXNlRGVsZXRlUmVjZW50U2VhcmNoVXBkYXRlcixcclxuICBEZWxldGVSZWNlbnRTZWFyY2hGZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL3VwZGF0ZXJzL3JlbW92ZS1yZWNlbnQtc2VhcmNoLXVwZGF0ZXInO1xyXG5cclxuaW1wb3J0IHtcclxuICBCYXNlU2F2ZVJlY2VudFNlYXJjaFVwZGF0ZXIsXHJcbiAgU2F2ZVJlY2VudFNlYXJjaEZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vdXBkYXRlcnMvc2F2ZS1yZWNlbnQtc2VhcmNoLXVwZGF0ZXInO1xyXG5cclxuaW1wb3J0IHtcclxuICBCYXNlU2F2ZUZhdm91cml0ZVNlYXJjaFVwZGF0ZXIsXHJcbiAgU2F2ZUZhdm91cml0ZVNlYXJjaEZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vdXBkYXRlcnMvc2F2ZS1mYXZvdXJpdGUtc2VhcmNoLXVwZGF0ZXInO1xyXG5cclxuaW1wb3J0IHtcclxuICBCYXNlR2V0UmFpbExpdmVEZXBhcnR1cmVzRmV0Y2hlcixcclxuICBHZXRSYWlsTGl2ZURlcGFydHVyZXNGZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL2ZldGNoZXJzL2dldC1yYWlsLWxpdmUtZGVwYXJ0dXJlcy5mZXRjaGVyJztcclxuXHJcbmltcG9ydCB7IEhvdGVsVGVtcFBhcmFtcyB9IGZyb20gJy4uL2ludGVyZmFjZXMvSWhvdGVsLWVudGVycHJpc2Utc2VhcmNoJztcclxuaW1wb3J0IHsgUmFpbFRlbXBQYXJhbXMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lyYWlsLWVudGVycHJpc2Utc2VhcmNoJztcclxuaW1wb3J0IHsgRmxpZ2h0VGVtcFBhcmFtcyB9IGZyb20gJy4uL2ludGVyZmFjZXMvSWZsaWdodC1lbnRlcnByaXNlLXNlYXJjaCc7XHJcbmltcG9ydCB7IExvdW5nZXNUZW1wUGFyYW1zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JbG91bmdlcy1lbnRlcnByaXNlLXNlYXJjaCc7XHJcbmltcG9ydCB7IFBhcmtpbmdUZW1wUGFyYW1zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JcGFya2luZy1lbnRlcnByaXNlLXNlYXJjaCc7XHJcbmltcG9ydCB7XHJcbiAgQ2FiSGlyZVRlbXBQYXJhbXMsXHJcbiAgVGF4aUZvcm1Nb2RlXHJcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JY2FiaGlyZS1lbnRlcnByaXNlLXNlYXJjaCc7XHJcbmltcG9ydCB7IENhckhpcmVUZW1wUGFyYW1zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JY2FyaGlyZS1lbnRlcnByaXNlLXNlYXJjaCc7XHJcbmltcG9ydCB7XHJcbiAgQmFzZUdldFVzZXJDdXJyZW50Q2FyYm9uQWxsb3dhbmNlRmV0Y2hlcixcclxuICBHZXRVc2VyQ3VycmVudENhcmJvbkFsbG93YW5jZVR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9nZXQtdXNlci1jdXJyZW50LWNhcmJvbi1hbGxvd2FuY2UuZmV0Y2hlcic7XHJcbmltcG9ydCB7IEJhc2VXZWJUb2tlblNlcnZpY2UgfSBmcm9tICcuL3dlYnRva2VuLnNlcnZpY2UnO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VHZXRSaXNrQWxlcnRzRmV0Y2hlcixcclxuICBHZXRSaXNrQWxlcnRzRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9nZXQtcmlzay1hbGVydHMuZmV0Y2hlcic7XHJcbmltcG9ydCB7IElybFRlbXBQYXJhbXMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lpcmwtZW50ZXJwcmlzZS1zZWFyY2gnO1xyXG5pbXBvcnQgeyBJUkxFbnRlcnByaXNlU2VhcmNoIH0gZnJvbSAnLi4vY2xhc3Nlcy9pcmwtZW50ZXJwcmlzZS1zZWFyY2gnO1xyXG5cclxuaW1wb3J0IHtcclxuICBCYXNlR2V0VXNlclJlY2VudFNlYXJjaGVzRmV0Y2hlcixcclxuICBHZXRVc2VyUmVjZW50U2VhcmNoZXNGZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL2ZldGNoZXJzL2dldC11c2VyLXJlY2VudC1zZWFyY2hlcy5mZXRjaGVyJztcclxuXHJcbmltcG9ydCB7XHJcbiAgQmFzZUdldFJhaWxjYXJkc0ZldGNoZXIsXHJcbiAgR2V0UmFpbENhcmRzRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9nZXQtcmFpbC1jYXJkcy5mZXRjaGVyJztcclxuXHJcbmltcG9ydCB7XHJcbiAgQmFzZUdldENvdmlkTWljcm9zaXRlVG9rZW5GZXRjaGVyLFxyXG4gIEdldENvdmlkTWljcm9zaXRlVG9rZW5GZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL2ZldGNoZXJzL2dldC1jb3ZpZC1taWNyb3NpdGUtdG9rZW4uZmV0Y2hlcic7XHJcblxyXG5pbXBvcnQge1xyXG4gIEJhc2VFdXJvc3RhclF1b3RlRmV0Y2hlcixcclxuICBFdXJvc3RhclF1b3RlRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9ldXJvc3Rhci1xdW90ZS5mZXRjaGVyJztcclxuaW1wb3J0IHsgRXVyb3N0YXJFbnRlcnByaXNlU2VhcmNoIH0gZnJvbSAnLi4vY2xhc3Nlcy9ldXJvc3Rhci1lbnRlcnByaXNlLXNlYXJjaCc7XHJcbmltcG9ydCB7IEV1cm9zdGFyVGVtcFBhcmFtcyB9IGZyb20gJy4uL2ludGVyZmFjZXMvSWV1cm9zdGFyLWVudGVycHJpc2Utc2VhcmNoJztcclxuaW1wb3J0IEV1cm9TdGF0aW9ucyBmcm9tICcuLi9kYXRhL2V1cm8tc3RhdGlvbnMuanNvbic7XHJcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XHJcbmltcG9ydCB7XHJcbiAgQmFzZVNlYXJjaFVzZXJzQ2FuQm9va0ZvckZldGNoZXIsXHJcbiAgU2VhcmNoVXNlckNhbkJvb2tGb3JGZXRjaGVyVHlwZVxyXG59IGZyb20gJy4uL2ZldGNoZXJzL3NlYXJjaC11c2Vycy1jYW4tYm9vay1mb3ItZmV0Y2hlcic7XHJcbmltcG9ydCB7IEV1cm9zdGFyU2VhcmNoVHlwZSB9IGZyb20gJy4uL2NsYXNzZXMvZXVyb3N0YXItc2VhcmNoLXR5cGUuZW51bSc7XHJcbmltcG9ydCB7XHJcbiAgQmFzZUlybERpc2NvdW50Q2FyZEZldGNoZXIsXHJcbiAgSXJsRGlzY291bnRDYXJkRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9pcmwtZGlzY291bnQtY2FyZC1mZXRjaGVyJztcclxuXHJcbmltcG9ydCB7XHJcbiAgQmFzZUdldEZsaWdodEZhcmVSdWxlc0ZldGNoZXIsXHJcbiAgR2V0RmxpZ2h0RmFyZVJ1bGVzVHlwZVxyXG59IGZyb20gJy4uL2ZldGNoZXJzL2ZsaWdodC1mYXJlLXJ1bGVzLmZldGNoZXInO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VHZXRGbGlnaHRTZWF0TWFwRmV0Y2hlcixcclxuICBHZXRGbGlnaHRTZWF0TWFwVHlwZVxyXG59IGZyb20gJy4uL2ZldGNoZXJzL2dldC1mbGlnaHQtc2VhdC1tYXAtZmV0Y2hlcic7XHJcbmltcG9ydCB7XHJcbiAgQXBwbHlIb3RlbFJ1bGVzRmV0Y2hlclR5cGUsXHJcbiAgQmFzZUhvdGVsUnVsZXNGZXRjaGVyXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvYXBwbHktSklULWhvdGVsLXJ1bGVzLmZldGNoZXInO1xyXG5pbXBvcnQge1xyXG4gIEFwcGx5Sml0RmxpZ2h0UnVsZXNUeXBlLFxyXG4gIEJhc2VBcHBseUppdEZsaWdodFJ1bGVzRmV0Y2hlclxyXG59IGZyb20gJy4uL2ZldGNoZXJzL2FwcGx5LWppdC1mbGlnaHQtcnVsZXMnO1xyXG5pbXBvcnQgeyBCYXNlTW9kYWxPcGVuZXJTZXJ2aWNlIH0gZnJvbSAnLi9tb2RhbC1vcGVuZXIuc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgQmFzZUdldFVzZXJGYXZvdXJpdGVTZWFyY2hlc0ZldGNoZXIsXHJcbiAgR2V0VXNlckZhdm91cml0ZVNlYXJjaGVzRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9nZXQtdXNlci1mYXZvdXJpdGUtc2VhcmNoZXMuZmV0Y2hlcic7XHJcbmltcG9ydCB7XHJcbiAgQmFzZURlbGV0ZUZhdm91cml0ZVNlYXJjaFVwZGF0ZXIsXHJcbiAgRGVsZXRlRmF2b3VyaXRlU2VhcmNoRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi91cGRhdGVycy9yZW1vdmUtZmF2b3VyaXRlLXNlYXJjaC11cGRhdGVyJztcclxuaW1wb3J0IHtcclxuICBCYXNlRW1haWxCYXNrZXRGZXRjaGVyLFxyXG4gIEVtYWlsQmFza2V0RmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9lbWFpbC1iYXNrZXQuZmV0Y2hlcic7XHJcbmltcG9ydCB7IEZhc3RUcmFja1RlbXBQYXJhbXMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0lmYXN0LXRyYWNrLWVudGVycHJpc2Utc2VhcmNoJztcclxuaW1wb3J0IHsgRmFzdFRyYWNrRW50ZXJwcmlzZVNlYXJjaCB9IGZyb20gJy4uL2NsYXNzZXMvZmFzdC10cmFjay1lbnRlcnByaXNlLXNlYXJjaCc7XHJcbmltcG9ydCB7XHJcbiAgQmFzZUZhc3RUcmFja1F1b3RlRmV0Y2hlcixcclxuICBGYXN0VHJhY2tRdW90ZUZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvZmFzdC10cmFjay1xdW90ZS5mZXRjaGVyJztcclxuaW1wb3J0IHsgTW9kYWxUeXBlcyB9IGZyb20gJy4uL2NsYXNzZXMvbW9kYWwtdHlwZXMuZW51bSc7XHJcbmltcG9ydCB7XHJcbiAgQmFzZVNlbmRPZmZsaW5lTm90aWZpY2F0aW9uRmV0Y2hlcixcclxuICBTZW5kT2ZmbGluZU5vdGlmaWNhdGlvbkZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvc2VuZC1vZmZsaW5lLW5vdGlmaWNhdGlvbi5mZXRjaGVyJztcclxuaW1wb3J0IHtcclxuICBCYXNlR2V0SG90ZWxDaGFpbnNGZXRjaGVyLFxyXG4gIEdldEhvdGVsQ2hhaW5zRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9nZXQtaG90ZWwtY2hhaW5zLmZldGNoZXInO1xyXG5pbXBvcnQge1xyXG4gIEJhc2VHZXRSYWlsUHJvdmlkZXJzRmV0Y2hlcixcclxuICBHZXRSYWlsUHJvdmlkZXJzRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9nZXQtcmFpbC1wcm92aWRlcnMuZmV0Y2hlcic7XHJcbmltcG9ydCB7XHJcbiAgQmFzZUdldEFsbEFpcmxpbmVzRmV0Y2hlcixcclxuICBHZXRBbGxBaXJsaW5lc0ZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvZ2V0LWFsbC1haXJsaW5lcy5mZXRjaGVyJztcclxuaW1wb3J0IHtcclxuICBCYXNlR2V0Q2FySGlyZVByb3ZpZGVyc0ZldGNoZXIsXHJcbiAgR2V0Q2FySGlyZVByb3ZpZGVyc0ZldGNoZXJUeXBlXHJcbn0gZnJvbSAnLi4vZmV0Y2hlcnMvZ2V0LWNhci1oaXJlLXByb3ZpZGVycy5mZXRjaGVyJztcclxuXHJcbmV4cG9ydCBjb25zdCBNQVhfVFJBVkVMTEVSUyA9IDg7XHJcblxyXG5leHBvcnQgZW51bSBUcmF2ZWxsZXJTZWFyY2hUeXBlcyB7XHJcbiAgZW1haWwgPSAnZW1haWwnLFxyXG4gIG5hbWUgPSAnbmFtZScsXHJcbiAgZW1wbG95ZWVOdW1iZXIgPSAnZW1wbG95ZWVOdW1iZXInXHJcbn1cclxuXHJcbmludGVyZmFjZSBIaWdoZXN0U2VhcmNoUHJpb3JpdHlPYmplY3RJbnRlcmZhY2Uge1xyXG4gIGhpZ2hlc3Q6IG51bWJlcjtcclxuICBjdXJyZW50SXRlbTogU2VhcmNoT2JqZWN0O1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQmFzZUVudGVycHJpc2VTZWFyY2hTZXJ2aWNlPFxyXG4gIFNQX1EgZXh0ZW5kcyBTZWFyY2hQb3N0Y29kZXNRdW90ZUZldGNoZXJUeXBlLFxyXG4gIFNSX1EgZXh0ZW5kcyBTZWFyY2hSYWlsU3RhdGlvbnNGZXRjaGVyVHlwZSxcclxuICBTTF9RIGV4dGVuZHMgTG91bmdlUXVvdGVGZXRjaGVyVHlwZSxcclxuICBTUEFfUSBleHRlbmRzIFBhcmtpbmdRdW90ZUZldGNoZXJUeXBlLFxyXG4gIFNGTF9RIGV4dGVuZHMgRmxpZ2h0UXVvdGVGZXRjaGVyVHlwZSxcclxuICBTSE9fUSBleHRlbmRzIEhvdGVsUXVvdGVGZXRjaGVyVHlwZSxcclxuICBTQ0hfUSBleHRlbmRzIENhckhpcmVGZXRjaGVyVHlwZSxcclxuICBDSEFEX1EgZXh0ZW5kcyBDYXJIaXJlQXZhaWxhYmlsaXR5RGV0YWlsRmV0Y2hlclR5cGUsXHJcbiAgU1RIX1EgZXh0ZW5kcyBDYWJoaXJlUXVvdGVGZXRjaGVyVHlwZSxcclxuICBTQV9RIGV4dGVuZHMgU2VhcmNoQWlycG9ydHNRdW90ZUZldGNoZXJUeXBlLFxyXG4gIFNBTF9RIGV4dGVuZHMgU2VhcmNoQWlybGluZXNRdW90ZUZldGNoZXJUeXBlLFxyXG4gIEhBX1EgZXh0ZW5kcyBIb3RlbEF2YWxpbmlsaXR5RmV0Y2hlclR5cGUsXHJcbiAgU0NfUSBleHRlbmRzIFNlYXJjaENpdGllc1F1b3RlRmV0Y2hlclR5cGUsXHJcbiAgU0NDX1EgZXh0ZW5kcyBTZWFyY2hDb25mZXJtYUNpdGllc1F1b3RlRmV0Y2hlclR5cGUsXHJcbiAgU1JBX1EgZXh0ZW5kcyBSYWlsUXVvdGVGZXRjaGVyVHlwZSxcclxuICBTSV9RIGV4dGVuZHMgSXJsUXVvdGVGZXRjaGVyVHlwZSxcclxuICBTVUFfUSBleHRlbmRzIFNhdmVVc2VyQWRkcmVzc1VwZGF0ZXJUeXBlLFxyXG4gIFNVX1EgZXh0ZW5kcyBVc2VyQWRkcmVzc0ZldGNoZXJUeXBlLFxyXG4gIEdVQ09fUSBleHRlbmRzIEdldFVzZXJDb21wYW55T2ZmaWNlc1F1b3RlRmV0Y2hlclR5cGUsXHJcbiAgU0hDX1EgZXh0ZW5kcyBTZWFyY2hIb3RlbENoYWluc1F1b3RlRmV0Y2hlclR5cGUsXHJcbiAgR0NSSV9RIGV4dGVuZHMgR2V0Q29uZmVybWFSb29tSW1hZ2VzUXVvdGVGZXRjaGVyVHlwZSxcclxuICBJUFZfUSBleHRlbmRzIFZhbGlkYXRlSXNQb3N0Y29kZVZhbGlkVHlwZSxcclxuICBTRF9RIGV4dGVuZHMgU2VhcmNoRGVwb3RRdW90ZUZldGNoZXJUeXBlLFxyXG4gIEdSU19RIGV4dGVuZHMgR2V0UmFpbFN0YXRpb25GZXRjaGVyVHlwZSxcclxuICBHT05fUSBleHRlbmRzIENvbmZlcm1hT2ZmaWNlTmFtZUZldGNoZXJUeXBlLFxyXG4gIENPX1EgZXh0ZW5kcyBDb25mZXJtYU9mZmljZUZldGNoZXJUeXBlLFxyXG4gIERVQV9RIGV4dGVuZHMgRGVsZXRlVXNlckFkZHJlc3NGZXRjaGVyVHlwZSxcclxuICBEUlNfUSBleHRlbmRzIERlbGV0ZVJlY2VudFNlYXJjaEZldGNoZXJUeXBlLFxyXG4gIFNSU19RIGV4dGVuZHMgU2F2ZVJlY2VudFNlYXJjaEZldGNoZXJUeXBlLFxyXG4gIFVDQV9RIGV4dGVuZHMgR2V0VXNlckN1cnJlbnRDYXJib25BbGxvd2FuY2VUeXBlLFxyXG4gIFNGU19RIGV4dGVuZHMgU2F2ZUZhdm91cml0ZVNlYXJjaEZldGNoZXJUeXBlLFxyXG4gIEdSQV9RIGV4dGVuZHMgR2V0Umlza0FsZXJ0c0ZldGNoZXJUeXBlLFxyXG4gIFFMX1EgZXh0ZW5kcyBDb25mZXJtYVF1aWNrbGlzdEZldGNoZXJUeXBlLFxyXG4gIEdVUlNGX1EgZXh0ZW5kcyBHZXRVc2VyUmVjZW50U2VhcmNoZXNGZXRjaGVyVHlwZSxcclxuICBHUkNGX1EgZXh0ZW5kcyBHZXRSYWlsQ2FyZHNGZXRjaGVyVHlwZSxcclxuICBHQ01URl9RIGV4dGVuZHMgR2V0Q292aWRNaWNyb3NpdGVUb2tlbkZldGNoZXJUeXBlLFxyXG4gIFNFX1EgZXh0ZW5kcyBFdXJvc3RhclF1b3RlRmV0Y2hlclR5cGUsXHJcbiAgU1VDQkYgZXh0ZW5kcyBTZWFyY2hVc2VyQ2FuQm9va0ZvckZldGNoZXJUeXBlLFxyXG4gIFNJU19RIGV4dGVuZHMgU2VhcmNoSXJsU3RhdGlvbnNGZXRjaGVyVHlwZSxcclxuICBHSURGX1EgZXh0ZW5kcyBJcmxEaXNjb3VudENhcmRGZXRjaGVyVHlwZSxcclxuICBHRkZSX1EgZXh0ZW5kcyBHZXRGbGlnaHRGYXJlUnVsZXNUeXBlLFxyXG4gIEdGU01fUSBleHRlbmRzIEdldEZsaWdodFNlYXRNYXBUeXBlLFxyXG4gIEdSTERfRiBleHRlbmRzIEdldFJhaWxMaXZlRGVwYXJ0dXJlc0ZldGNoZXJUeXBlLFxyXG4gIEFIUl9RIGV4dGVuZHMgQXBwbHlIb3RlbFJ1bGVzRmV0Y2hlclR5cGUsXHJcbiAgQUZSX1EgZXh0ZW5kcyBBcHBseUppdEZsaWdodFJ1bGVzVHlwZSxcclxuICBHVUZTRl9RIGV4dGVuZHMgR2V0VXNlckZhdm91cml0ZVNlYXJjaGVzRmV0Y2hlclR5cGUsXHJcbiAgREZTX1EgZXh0ZW5kcyBEZWxldGVGYXZvdXJpdGVTZWFyY2hGZXRjaGVyVHlwZSxcclxuICBFQl9GIGV4dGVuZHMgRW1haWxCYXNrZXRGZXRjaGVyVHlwZSxcclxuICBGVFFfUSBleHRlbmRzIEZhc3RUcmFja1F1b3RlRmV0Y2hlclR5cGUsXHJcbiAgU09OX1EgZXh0ZW5kcyBTZW5kT2ZmbGluZU5vdGlmaWNhdGlvbkZldGNoZXJUeXBlLFxyXG4gIEdIVF9RIGV4dGVuZHMgR2V0SG90ZWxDaGFpbnNGZXRjaGVyVHlwZSxcclxuICBHUlBfUSBleHRlbmRzIEdldFJhaWxQcm92aWRlcnNGZXRjaGVyVHlwZSxcclxuICBHQUFfUSBleHRlbmRzIEdldEFsbEFpcmxpbmVzRmV0Y2hlclR5cGUsXHJcbiAgR0NIUF9RIGV4dGVuZHMgR2V0Q2FySGlyZVByb3ZpZGVyc0ZldGNoZXJUeXBlXHJcbj4gaW1wbGVtZW50cyBFbnRlcnByaXNlU2VhcmNoU2VydmljZUludGVyZmFjZVxyXG57XHJcbiAgc3RhdGljIFNFU1NJT05fVFJBVkVMTEVSOiBzdHJpbmcgPSAnc2VhcmNoX3RyYXZlbGxlcnMnO1xyXG5cclxuICBzZWFyY2hlczogU2VhcmNoUGFyYW1zO1xyXG4gIHRyYXZlbGxlcl9lcnJvciA9IGZhbHNlO1xyXG4gIHRyYXZlbGxlckluZm9ybWF0aW9uOiBCZWhhdmlvclN1YmplY3Q8VHJhdmVsbGVyW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcclxuICAgIFRyYXZlbGxlcltdXHJcbiAgPihbXSk7XHJcbiAgZXJyb3JzOiBCZWhhdmlvclN1YmplY3Q8c3RyaW5nW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmdbXT4oW10pO1xyXG4gIHNlYXJjaExvYWRpbmdEb25lOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KFxyXG4gICAgZmFsc2VcclxuICApO1xyXG4gIHNlYXJjaFRpbWVkT3V0OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KFxyXG4gICAgZmFsc2VcclxuICApO1xyXG4gIG5ld1NlYXJjaFN0YXJ0ZWQ6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oXHJcbiAgICBmYWxzZVxyXG4gICk7XHJcblxyXG4gIGZpcnN0TG9hZCA9IHRydWU7XHJcblxyXG4gIHNlYXJjaF9vYmplY3RzOiBTZWFyY2hPYmplY3RzO1xyXG4gIGhpZ2hlc3Rfc2VhcmNoX3ByaW9yaXR5ID0gODtcclxuICBzaG93X2Vycm9ycyA9IGZhbHNlO1xyXG4gIHRyYXZlbGxlclZhbGlkYXRpb25NZXNzYWdlczogc3RyaW5nW10gPSBbXTtcclxuICBzZWFyY2hfbG9hZGluZyA9IGZhbHNlO1xyXG4gIHNlYXJjaF9haXJwb3J0X2xvYWRpbmcgPSBmYWxzZTtcclxuICBhbGxTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XHJcbiAgc2VhcmNoZXNTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XHJcbiAganJmUmVmZXJlbmNlOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBzZWxlY3RlZFRyYXZlbGxlcnM6IFRyYXZlbGxlcltdID0gW107XHJcbiAgc2VsZWN0ZWRQbGFjZXM6IGFueSA9IFtdO1xyXG4gIGNvdW50cmllcyA9IENvdW50cmllcztcclxuICBldXJvc3RhdGlvbnM6IHsgZ2F0ZXdheTogc3RyaW5nOyBkZXN0aW5hdGlvbjogc3RyaW5nIH1bXSA9XHJcbiAgICBfLnRvQXJyYXkoRXVyb1N0YXRpb25zKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcm90ZWN0ZWQgc2VhcmNoQWlycG9ydHNGZXRjaGVyOiBCYXNlU2VhcmNoQWlycG9ydHNGZXRjaGVyPFNBX1E+LFxyXG4gICAgcHJvdGVjdGVkIHNlYXJjaEFpcmxpbmVzRmV0Y2hlcjogQmFzZVNlYXJjaEFpcmxpbmVzRmV0Y2hlcjxTQUxfUT4sXHJcbiAgICBwcm90ZWN0ZWQgc3RvcmFnZVNlcnZpY2U6IEJhc2VTdG9yYWdlU2VydmljZSxcclxuICAgIHByb3RlY3RlZCB1c2VyU2VydmljZTogVXNlclNlcnZpY2VJbnRlcmZhY2UsXHJcbiAgICBwcm90ZWN0ZWQgbW9kYWxTZXJ2aWNlOiBCYXNlTW9kYWxPcGVuZXJTZXJ2aWNlLFxyXG4gICAgcHJvdGVjdGVkIHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHJvdGVjdGVkIGhlbHBlcnM6IEJhc2VIZWxwZXJSb3V0aW5lcyxcclxuICAgIHByb3RlY3RlZCBob3RlbEF2YWxpYmlsaXR5U2VydmljZTogQmFzZUhvdGVsQXZhbGliaWxpdHlTZXJ2aWNlPEhBX1E+LFxyXG4gICAgcHJpdmF0ZSBjaXRpZXNGZXRjaGVyOiBCYXNlU2VhcmNoQ2l0eUZldGNoZXI8U0NfUT4sXHJcbiAgICBwcml2YXRlIGNvbmZlcm1hQ2l0aWVzRmV0Y2hlcjogQmFzZVNlYXJjaENvbmZlcm1hQ2l0eUZldGNoZXI8U0NDX1E+LFxyXG4gICAgcHJpdmF0ZSBwb3N0Y29kZUZldGNoZXI6IEJhc2VTZWFyY2hQb3N0Y29kZUZldGNoZXI8U1BfUT4sXHJcbiAgICBwcml2YXRlIHJhaWxTdGF0aW9uRmV0Y2hlcjogQmFzZVNlYXJjaFJhaWxTdGF0aW9uc0ZldGNoZXI8U1JfUT4sXHJcbiAgICBwcml2YXRlIHNhdmVVc2VyQWRkcmVzc1VwZGF0ZXI6IEJhc2VTYXZlVXNlckFkZHJlc3NVcGRhdGVyPFNVQV9RPixcclxuICAgIHByaXZhdGUgdXNlckFkZHJlc3Nlc0ZldGNoZXI6IEJhc2VVc2VyQWRkcmVzc2VzRmV0Y2hlcjxTVV9RPixcclxuICAgIHByaXZhdGUgYmFza2V0U2VydmljZTogRW50ZXJwcmlzZUJhc2tldFNlcnZpY2VJbnRlcmZhY2UsXHJcbiAgICBwcml2YXRlIGdldFVzZXJDb21wYW55T2ZmaWNlc0ZldGNoZXI6IEJhc2VHZXRVc2VyQ29tcGFueU9mZmljZXNGZXRjaGVyPEdVQ09fUT4sXHJcbiAgICBwcml2YXRlIHNlYXJjaEhvdGVsQ2hhaW5zRmV0Y2hlcjogQmFzZVNlYXJjaEhvdGVsQ2hhaW5zRmV0Y2hlcjxTSENfUT4sXHJcbiAgICBwcml2YXRlIGdldENvbmZlcm1hUm9vbUltYWdlc0ZldGNoZXI6IEJhc2VHZXRDb25mZXJtYVJvb21JbWFnZXNGZXRjaGVyPEdDUklfUT4sXHJcbiAgICBwcml2YXRlIGJhc2VWYWxpZGF0ZUlzUG9zdGNvZGVWYWxpZFRlc3RlcjogQmFzZVZhbGlkYXRlSXNQb3N0Y29kZVZhbGlkVGVzdGVyPElQVl9RPixcclxuICAgIHByaXZhdGUgZGVwb3RGZXRjaGVyOiBCYXNlU2VhcmNoRGVwb3RGZXRjaGVyPFNEX1E+LFxyXG4gICAgcHJpdmF0ZSBjb25mZXJtYU9mZmljZU5hbWVzRmV0Y2hlcjogQmFzZUNvbmZlcm1hT2ZmaWNlTmFtZXNGZXRjaGVyPEdPTl9RPixcclxuICAgIHByaXZhdGUgY29uZmVybWFPZmZpY2VGZXRjaGVyOiBCYXNlQ29uZmVybWFPZmZpY2VGZXRjaGVyPENPX1E+LFxyXG4gICAgcHJpdmF0ZSBiYXNlRGVsZXRlVXNlckFkZHJlc3NVcGRhdGVyOiBCYXNlRGVsZXRlVXNlckFkZHJlc3NVcGRhdGVyPERVQV9RPixcclxuICAgIHByaXZhdGUgYmFzZURlbGV0ZVJlY2VudFNlYXJjaFVwZGF0ZXI6IEJhc2VEZWxldGVSZWNlbnRTZWFyY2hVcGRhdGVyPERSU19RPixcclxuICAgIHByaXZhdGUgYmFzZVNhdmVSZWNlbnRTZWFyY2hVcGRhdGVyOiBCYXNlU2F2ZVJlY2VudFNlYXJjaFVwZGF0ZXI8U1JTX1E+LFxyXG4gICAgcHJpdmF0ZSBnZXRVc2VyQ3VycmVudENhcmJvbkFsbG93YW5jZUZldGNoZXI6IEJhc2VHZXRVc2VyQ3VycmVudENhcmJvbkFsbG93YW5jZUZldGNoZXI8VUNBX1E+LFxyXG4gICAgcHJpdmF0ZSBiYXNlU2F2ZUZhdm91cml0ZVNlYXJjaFVwZGF0ZXI6IEJhc2VTYXZlRmF2b3VyaXRlU2VhcmNoVXBkYXRlcjxTRlNfUT4sXHJcbiAgICBlbnZpcm9ubWVudDogQmFzZUVudmlyb25tZW50LFxyXG4gICAgbG91bmdlRmV0Y2hlcjogQmFzZUxvdW5nZVF1b3RlRmV0Y2hlcjxTTF9RPixcclxuICAgIHBhcmtpbmdGZXRjaGVyOiBCYXNlUGFya2luZ1F1b3RlRmV0Y2hlcjxTUEFfUT4sXHJcbiAgICBodHRwQ2FsbFNlcnZpY2U6IEFic3RyYWN0SHR0cENhbGxTZXJ2aWNlLFxyXG4gICAgZmxpZ2h0RmV0Y2hlcjogQmFzZUZsaWdodFF1b3RlRmV0Y2hlcjxTRkxfUT4sXHJcbiAgICBob3RlbEZldGNoZXI6IEJhc2VIb3RlbFF1b3RlRmV0Y2hlcjxTSE9fUT4sXHJcbiAgICBjYXJoaXJlRmV0Y2hlcjogQmFzZUNhcmhpcmVRdW90ZUZldGNoZXI8U0NIX1E+LFxyXG4gICAgY2FySGlyZUF2YWlsYWJpbGl0eURldGFpbEZldGNoZXI6IEJhc2VDYXJIaXJlQXZhaWxhYmlsaXR5RGV0YWlsRmV0Y2hlcjxDSEFEX1E+LFxyXG4gICAgY2FiaGlyZUZldGNoZXI6IEJhc2VDYWJoaXJlUXVvdGVGZXRjaGVyPFNUSF9RPixcclxuICAgIHJhaWxGZXRjaGVyOiBCYXNlUmFpbFF1b3RlRmV0Y2hlcjxTUkFfUT4sXHJcbiAgICBpcmxGZXRjaGVyOiBCYXNlSXJsUXVvdGVGZXRjaGVyPFNJX1E+LFxyXG4gICAgcHJvdGVjdGVkIGdldFJhaWxTdGF0aW9uRmV0Y2hlcjogQmFzZUdldFJhaWxTdGF0aW9uRmV0Y2hlcjxHUlNfUT4sXHJcbiAgICBiYXNlV2ViVG9rZW5TZXJ2aWNlOiBCYXNlV2ViVG9rZW5TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByaXNrQWxlcnRzRmV0Y2hlcjogQmFzZUdldFJpc2tBbGVydHNGZXRjaGVyPEdSQV9RPixcclxuICAgIHF1aWNrbGlzdEZldGNoZXI6IEJhc2VTZWFyY2hDb25mZXJtYVF1aWNrbGlzdEZldGNoZXI8UUxfUT4sXHJcbiAgICBwcml2YXRlIGdldFVzZXJSZWNlbnRTZWFyY2hlc0ZldGNoZXI6IEJhc2VHZXRVc2VyUmVjZW50U2VhcmNoZXNGZXRjaGVyPEdVUlNGX1E+LFxyXG4gICAgcHJvdGVjdGVkIGdldFJhaWxDYXJkc0ZldGNoZXI6IEJhc2VHZXRSYWlsY2FyZHNGZXRjaGVyPEdSQ0ZfUT4sXHJcbiAgICBwcm90ZWN0ZWQgZ2V0Q292aWRNaWNyb3NpdGVUb2tlbkZldGNoZXI6IEJhc2VHZXRDb3ZpZE1pY3Jvc2l0ZVRva2VuRmV0Y2hlcjxHQ01URl9RPixcclxuICAgIGV1cm9zdGFyRmV0Y2hlcjogQmFzZUV1cm9zdGFyUXVvdGVGZXRjaGVyPFNFX1E+LFxyXG4gICAgcHVibGljIHNlYXJjaFVzZXJzQ2FuQm9va0ZvckZldGNoZXI6IEJhc2VTZWFyY2hVc2Vyc0NhbkJvb2tGb3JGZXRjaGVyPFNVQ0JGPixcclxuICAgIHByb3RlY3RlZCBzZWFyY2hJcmxTdGF0aW9uc0ZldGNoZXI6IEJhc2VTZWFyY2hJcmxTdGF0aW9uc0ZldGNoZXI8U0lTX1E+LFxyXG4gICAgcHJvdGVjdGVkIGlybERpc2NvdW50Q2FyZHNGZXRjaGVyOiBCYXNlSXJsRGlzY291bnRDYXJkRmV0Y2hlcjxHSURGX1E+LFxyXG4gICAgcHJpdmF0ZSBnZXRGbGlnaHRGYXJlUnVsZXNGZXRjaGVyOiBCYXNlR2V0RmxpZ2h0RmFyZVJ1bGVzRmV0Y2hlcjxHRkZSX1E+LFxyXG4gICAgcHJpdmF0ZSBnZXRGbGlnaHRTZWF0TWFwRmV0Y2hlcjogQmFzZUdldEZsaWdodFNlYXRNYXBGZXRjaGVyPEdGU01fUT4sXHJcbiAgICBwcml2YXRlIGdldFJhaWxMaXZlRGVwYXJ0dXJlc0ZldGNoZXI6IEJhc2VHZXRSYWlsTGl2ZURlcGFydHVyZXNGZXRjaGVyPEdSTERfRj4sXHJcbiAgICBhcHBseUhvdGVsUnVsZXNGZXRjaGVyOiBCYXNlSG90ZWxSdWxlc0ZldGNoZXI8QUhSX1E+LFxyXG4gICAgYXBwbHlGbGlnaHRSdWxlczogQmFzZUFwcGx5Sml0RmxpZ2h0UnVsZXNGZXRjaGVyPEFGUl9RPixcclxuICAgIHByaXZhdGUgZ2V0VXNlckZhdm91cml0ZVNlYXJjaGVzRmV0Y2hlcjogQmFzZUdldFVzZXJGYXZvdXJpdGVTZWFyY2hlc0ZldGNoZXI8R1VGU0ZfUT4sXHJcbiAgICBwcml2YXRlIGRlbGV0ZUZhdm91cml0ZVNlYXJjaFVwZGF0ZXI6IEJhc2VEZWxldGVGYXZvdXJpdGVTZWFyY2hVcGRhdGVyPERGU19RPixcclxuICAgIHByaXZhdGUgZW1haWxCYXNrZXRGZXRjaGVyOiBCYXNlRW1haWxCYXNrZXRGZXRjaGVyPEVCX0Y+LFxyXG4gICAgZmFzdHRyYWNrRmV0Y2hlcjogQmFzZUZhc3RUcmFja1F1b3RlRmV0Y2hlcjxGVFFfUT4sXHJcbiAgICBwcml2YXRlIHNlbmRPZmZsaW5lTm90aWZpY2F0aW9uRmV0Y2hlcjogQmFzZVNlbmRPZmZsaW5lTm90aWZpY2F0aW9uRmV0Y2hlcjxTT05fUT4sXHJcbiAgICBwcml2YXRlIGdldEhvdGVsQ2hhaW5zRmV0Y2hlcjogQmFzZUdldEhvdGVsQ2hhaW5zRmV0Y2hlcjxHSFRfUT4sXHJcbiAgICBwcml2YXRlIGdldFJhaWxQcm92aWRlcnNGZXRjaGVyOiBCYXNlR2V0UmFpbFByb3ZpZGVyc0ZldGNoZXI8R1JQX1E+LFxyXG4gICAgcHJpdmF0ZSBnZXRBbGxBaXJsaW5lc0ZldGNoZXI6IEJhc2VHZXRBbGxBaXJsaW5lc0ZldGNoZXI8R0FBX1E+LFxyXG4gICAgcHJpdmF0ZSBnZXRDYXJIaXJlUHJvdmlkZXJzRmV0Y2hlcjogQmFzZUdldENhckhpcmVQcm92aWRlcnNGZXRjaGVyPEdDSFBfUT5cclxuICApIHtcclxuICAgIGNvbnNvbGUubG9nKCdFbnRlcnBpc2Ugc2VhcmNoIHNlcnZpY2UgYmVpbmcgaW5pdGVkJyk7XHJcbiAgICB0aGlzLnNlYXJjaGVzID0ge1xyXG4gICAgICBbU2VydmljZVR5cGUuTG91bmdlXTogbmV3IExvdW5nZXNFbnRlcnByaXNlU2VhcmNoKFxyXG4gICAgICAgIGxvdW5nZUZldGNoZXIsXHJcbiAgICAgICAgaGVscGVycyxcclxuICAgICAgICBiYXNrZXRTZXJ2aWNlLFxyXG4gICAgICAgIHN0b3JhZ2VTZXJ2aWNlLFxyXG4gICAgICAgIHRoaXNcclxuICAgICAgKSxcclxuICAgICAgW1NlcnZpY2VUeXBlLlBhcmtpbmddOiBuZXcgUGFya2luZ0VudGVycHJpc2VTZWFyY2goXHJcbiAgICAgICAgcGFya2luZ0ZldGNoZXIsXHJcbiAgICAgICAgaGVscGVycyxcclxuICAgICAgICBiYXNrZXRTZXJ2aWNlLFxyXG4gICAgICAgIHN0b3JhZ2VTZXJ2aWNlLFxyXG4gICAgICAgIHRoaXNcclxuICAgICAgKSxcclxuICAgICAgW1NlcnZpY2VUeXBlLkZsaWdodF06IG5ldyBGbGlnaHRFbnRlcnByaXNlU2VhcmNoKFxyXG4gICAgICAgIGZsaWdodEZldGNoZXIsXHJcbiAgICAgICAgaGVscGVycyxcclxuICAgICAgICB1c2VyU2VydmljZSxcclxuICAgICAgICBiYXNrZXRTZXJ2aWNlLFxyXG4gICAgICAgIHN0b3JhZ2VTZXJ2aWNlLFxyXG4gICAgICAgIHRoaXMsXHJcbiAgICAgICAgYXBwbHlGbGlnaHRSdWxlcyxcclxuICAgICAgICBtb2RhbFNlcnZpY2VcclxuICAgICAgKSxcclxuICAgICAgW1NlcnZpY2VUeXBlLkhvdGVsXTogbmV3IEhvdGVsRW50ZXJwcmlzZVNlYXJjaChcclxuICAgICAgICBob3RlbEZldGNoZXIsXHJcbiAgICAgICAgaGVscGVycyxcclxuICAgICAgICB1c2VyU2VydmljZSxcclxuICAgICAgICBlbnZpcm9ubWVudCxcclxuICAgICAgICBob3RlbEF2YWxpYmlsaXR5U2VydmljZSxcclxuICAgICAgICBiYXNrZXRTZXJ2aWNlLFxyXG4gICAgICAgIHN0b3JhZ2VTZXJ2aWNlLFxyXG4gICAgICAgIHRoaXMsXHJcbiAgICAgICAgaHR0cENhbGxTZXJ2aWNlLFxyXG4gICAgICAgIHF1aWNrbGlzdEZldGNoZXIsXHJcbiAgICAgICAgZ2V0UmFpbFN0YXRpb25GZXRjaGVyLFxyXG4gICAgICAgIGFwcGx5SG90ZWxSdWxlc0ZldGNoZXJcclxuICAgICAgKSxcclxuICAgICAgW1NlcnZpY2VUeXBlLkNhcl06IG5ldyBDYXJoaXJlRW50ZXJwcmlzZVNlYXJjaChcclxuICAgICAgICBjYXJoaXJlRmV0Y2hlcixcclxuICAgICAgICBjYXJIaXJlQXZhaWxhYmlsaXR5RGV0YWlsRmV0Y2hlcixcclxuICAgICAgICBoZWxwZXJzLFxyXG4gICAgICAgIGJhc2tldFNlcnZpY2UsXHJcbiAgICAgICAgc3RvcmFnZVNlcnZpY2UsXHJcbiAgICAgICAgdGhpc1xyXG4gICAgICApLFxyXG4gICAgICBbU2VydmljZVR5cGUuQ2FiXTogbmV3IENhYkhpcmVFbnRlcnByaXNlU2VhcmNoKFxyXG4gICAgICAgIGNhYmhpcmVGZXRjaGVyLFxyXG4gICAgICAgIGhlbHBlcnMsXHJcbiAgICAgICAgc3RvcmFnZVNlcnZpY2UsXHJcbiAgICAgICAgdGhpcyxcclxuICAgICAgICBiYXNrZXRTZXJ2aWNlXHJcbiAgICAgICksXHJcbiAgICAgIFtTZXJ2aWNlVHlwZS5JbnRlcm5hdGlvbmFsUmFpbF06IG5ldyBJUkxFbnRlcnByaXNlU2VhcmNoKFxyXG4gICAgICAgIGlybEZldGNoZXIsXHJcbiAgICAgICAgaXJsRGlzY291bnRDYXJkc0ZldGNoZXIsXHJcbiAgICAgICAgaGVscGVycyxcclxuICAgICAgICBiYXNrZXRTZXJ2aWNlLFxyXG4gICAgICAgIHN0b3JhZ2VTZXJ2aWNlLFxyXG4gICAgICAgIHRoaXNcclxuICAgICAgKSxcclxuICAgICAgW1NlcnZpY2VUeXBlLkZhc3RUcmFja106IG5ldyBGYXN0VHJhY2tFbnRlcnByaXNlU2VhcmNoKFxyXG4gICAgICAgIGZhc3R0cmFja0ZldGNoZXIsXHJcbiAgICAgICAgaGVscGVycyxcclxuICAgICAgICBiYXNrZXRTZXJ2aWNlLFxyXG4gICAgICAgIHN0b3JhZ2VTZXJ2aWNlLFxyXG4gICAgICAgIHRoaXNcclxuICAgICAgKSxcclxuICAgICAgW1NlcnZpY2VUeXBlLkNvYWNoXTogbnVsbCxcclxuICAgICAgW1NlcnZpY2VUeXBlLlJhaWxdOiBuZXcgUmFpbEVudGVycHJpc2VTZWFyY2goXHJcbiAgICAgICAgcmFpbEZldGNoZXIsXHJcbiAgICAgICAgZ2V0UmFpbFN0YXRpb25GZXRjaGVyLFxyXG4gICAgICAgIGhlbHBlcnMsXHJcbiAgICAgICAgYmFza2V0U2VydmljZSxcclxuICAgICAgICBzdG9yYWdlU2VydmljZSxcclxuICAgICAgICB0aGlzLFxyXG4gICAgICAgIHVzZXJTZXJ2aWNlLFxyXG4gICAgICAgIG1vZGFsU2VydmljZVxyXG4gICAgICApLFxyXG4gICAgICBbU2VydmljZVR5cGUuRXVyb3N0YXJdOiBuZXcgRXVyb3N0YXJFbnRlcnByaXNlU2VhcmNoKFxyXG4gICAgICAgIGV1cm9zdGFyRmV0Y2hlcixcclxuICAgICAgICBoZWxwZXJzLFxyXG4gICAgICAgIHVzZXJTZXJ2aWNlLFxyXG4gICAgICAgIGJhc2tldFNlcnZpY2UsXHJcbiAgICAgICAgc3RvcmFnZVNlcnZpY2UsXHJcbiAgICAgICAgdGhpcyxcclxuICAgICAgICBtb2RhbFNlcnZpY2VcclxuICAgICAgKVxyXG4gICAgfTtcclxuICAgIGNvbnNvbGUubG9nKCdOZXdseSBjcmVhdGVkIHNlYXJjaCBvYmplY3RzOiAnLCB0aGlzLnNlYXJjaGVzKTtcclxuICAgIHRoaXMuc2VhcmNoX29iamVjdHMgPSB0aGlzLmhlbHBlcnMuY2xvbmUodGhpcy5pbml0X3NlYXJjaF9vYmplY3RzKCkpO1xyXG4gICAgdGhpcy5zZWxlY3RlZFRyYXZlbGxlcnMgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFNlc3Npb25JdGVtQXNMaXN0PFxyXG4gICAgICBUcmF2ZWxsZXJbXVxyXG4gICAgPihCYXNlRW50ZXJwcmlzZVNlYXJjaFNlcnZpY2UuU0VTU0lPTl9UUkFWRUxMRVIpO1xyXG4gICAgdGhpcy50cmF2ZWxsZXJJbmZvcm1hdGlvbi5uZXh0KHRoaXMuc2VsZWN0ZWRUcmF2ZWxsZXJzKTtcclxuICAgIHVzZXJTZXJ2aWNlLmZ1bGxVc2VyRGV0YWlscy51c2VyU2VydmljZXMuc3Vic2NyaWJlKFxyXG4gICAgICAoc2VydmljZXM6IFVzZXJTZXJ2aWNlcykgPT4ge1xyXG4gICAgICAgIGlmIChzZXJ2aWNlcykge1xyXG4gICAgICAgICAgdGhpcy5zZWFyY2hfb2JqZWN0cyA9IE9iamVjdC5rZXlzKHRoaXMuc2VhcmNoX29iamVjdHMpLnJlZHVjZShcclxuICAgICAgICAgICAgKG9iamVjdHM6IFNlYXJjaE9iamVjdHMsIGtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgICAgKG9iamVjdHMgYXMgUmVjb3JkPHN0cmluZywgYW55Pilba2V5XS5lbmFibGVkID1cclxuICAgICAgICAgICAgICAgICEhc2VydmljZXMgJiYgISFzZXJ2aWNlc1trZXldO1xyXG4gICAgICAgICAgICAgIHJldHVybiBvYmplY3RzO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaF9vYmplY3RzXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmNvdW50cmllcykpIHtcclxuICAgICAgdGhpcy5jb3VudHJpZXMgPSB0aGlzLmNvdW50cmllcy5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgICAgaWYgKGEuY05hbWUgPCBiLmNOYW1lKSB7XHJcbiAgICAgICAgICByZXR1cm4gLTE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhLmNOYW1lID4gYi5jTmFtZSkge1xyXG4gICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBiYXNlV2ViVG9rZW5TZXJ2aWNlLmF1dG9Mb2dvdXRDb25maWcgPSB0aGlzLmdldEF1dG9Mb2dvdXRDb25maWcoKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgaWYgKHRoaXMuYWxsU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMuYWxsU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXNldCgpIHtcclxuICAgIHRoaXMucmVzZXRBbGxTZWFyY2hJdGVtcygpO1xyXG4gICAgdGhpcy5iYXNrZXRTZXJ2aWNlLnJlc2V0KCk7XHJcbiAgfVxyXG5cclxuICByZXNldEFsbFNlYXJjaEl0ZW1zKCkge1xyXG4gICAgT2JqZWN0LnZhbHVlcyh0aGlzLnNlYXJjaGVzKS5mb3JFYWNoKFxyXG4gICAgICAoaXRlbTogQmFzZUVudGVycHJpc2VTZWFyY2g8YW55LCBhbnksIGFueVtdPikgPT4ge1xyXG4gICAgICAgIGl0ZW0/LnJlc2V0KCk7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgICB0aGlzLnJlbW92ZUFsbFRyYXZlbGxlcnMoKTtcclxuICAgIHRoaXMucmVzZXRTZWFyY2hPYmplY3RzKCk7XHJcbiAgfVxyXG5cclxuICBnZXRVc2VyQ3VycmVudENhcmJvbkFsbG93YW5jZShcclxuICAgIHVzZXI/OiBzdHJpbmcsXHJcbiAgICBpc0xvYWRpbmc/OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj5cclxuICApOiBPYnNlcnZhYmxlPENhcmJvbkFsbG93YW5jZT4ge1xyXG4gICAgaWYgKGlzTG9hZGluZykge1xyXG4gICAgICBpc0xvYWRpbmcubmV4dCh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBxdWVyeSA9IHsgdXNlciB9O1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0VXNlckN1cnJlbnRDYXJib25BbGxvd2FuY2VGZXRjaGVyLmZldGNoTGlzdChxdWVyeSkucGlwZShcclxuICAgICAgdGFrZSgxKSxcclxuICAgICAgbWFwKChyZXN1bHRzOiBDYXJib25BbGxvd2FuY2UpID0+IHtcclxuICAgICAgICByZXR1cm4gcmVzdWx0cztcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBnZXRSaXNrQWxlcnRzKFxyXG4gICAgbWluTGV2ZWw6IFJpc2tMZXZlbCxcclxuICAgIG1heExldmVsOiBSaXNrTGV2ZWwsXHJcbiAgICBjb3VudHJ5SXNvQ29kZTogc3RyaW5nLFxyXG4gICAgaXNMb2FkaW5nPzogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+XHJcbiAgKTogT2JzZXJ2YWJsZTxSaXNrQWxlcnRbXT4ge1xyXG4gICAgaWYgKGlzTG9hZGluZykge1xyXG4gICAgICBpc0xvYWRpbmcubmV4dCh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBxdWVyeTogR2V0Umlza0FsZXJ0c1F1ZXJ5VmFyaWFibGVzID0ge1xyXG4gICAgICBtaW5MZXZlbCxcclxuICAgICAgbWF4TGV2ZWwsXHJcbiAgICAgIGNvdW50cnlJc29Db2RlXHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB0aGlzLnJpc2tBbGVydHNGZXRjaGVyLmZldGNoTGlzdChxdWVyeSkucGlwZShcclxuICAgICAgdGFrZSgxKSxcclxuICAgICAgbWFwKChyZXN1bHQ6IFJpc2tBbGVydFtdKSA9PiB7XHJcbiAgICAgICAgaWYgKGlzTG9hZGluZykge1xyXG4gICAgICAgICAgaXNMb2FkaW5nLm5leHQoZmFsc2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBnZXRBaXJwb3J0c0xpc3QoXHJcbiAgICB0ZXJtOiBzdHJpbmcsXHJcbiAgICBjb3VudHJ5Q29kZT86IENvdW50cnlDb2RlLFxyXG4gICAgaXNMb2FkaW5nPzogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+LFxyXG4gICAgaGFzTG91bmdlPzogYm9vbGVhbixcclxuICAgIGhhc1Bhcmtpbmc/OiBib29sZWFuLFxyXG4gICAgaGFzRmFzdFRyYWNrPzogYm9vbGVhblxyXG4gICk6IE9ic2VydmFibGU8T0JUQWlycG9ydERldGFpbHNbXT4ge1xyXG4gICAgaWYgKHRlcm0ubGVuZ3RoID4gMikge1xyXG4gICAgICBpZiAoaXNMb2FkaW5nKSB7XHJcbiAgICAgICAgaXNMb2FkaW5nLm5leHQodHJ1ZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHF1ZXJ5OiBTZWFyY2hBaXJwb3J0cy5WYXJpYWJsZXMgPSB7IHF1ZXJ5OiB0ZXJtIH07XHJcbiAgICAgIGlmICghIWNvdW50cnlDb2RlKSB7XHJcbiAgICAgICAgcXVlcnkuY291bnRyeUNvZGUgPSBjb3VudHJ5Q29kZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodHlwZW9mIGhhc0xvdW5nZSA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgICAgcXVlcnkuaGFzTG91bmdlID0gaGFzTG91bmdlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0eXBlb2YgaGFzUGFya2luZyA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgICAgcXVlcnkuaGFzUGFya2luZyA9IGhhc1Bhcmtpbmc7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHR5cGVvZiBoYXNGYXN0VHJhY2sgPT09ICdib29sZWFuJykge1xyXG4gICAgICAgIHF1ZXJ5Lmhhc0Zhc3RUcmFjayA9IGhhc0Zhc3RUcmFjaztcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdGhpcy5zZWFyY2hBaXJwb3J0c0ZldGNoZXIuZmV0Y2hPbmUocXVlcnkpLnBpcGUoXHJcbiAgICAgICAgdGFrZSgxKSxcclxuICAgICAgICBtYXAoKHJlc3VsdHM6IEFpcnBvcnRTZWFyY2hSZXN1bHRzKSA9PiB7XHJcbiAgICAgICAgICBpZiAoaXNMb2FkaW5nKSB7XHJcbiAgICAgICAgICAgIGlzTG9hZGluZy5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAocmVzdWx0cyAmJiByZXN1bHRzLmdlbmVyYWxNYXRjaGVzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGdlbmVyYWxNYXRjaGVzID0gdGhpcy5oZWxwZXJzLmNsb25lKHJlc3VsdHMuZ2VuZXJhbE1hdGNoZXMpO1xyXG5cclxuICAgICAgICAgICAgLy8gUmVtb3ZpbmcgdGhpcyBhcyB0aGlzIGNyZWF0ZXMgZHVwbGljYXRlIGFpcnBvcnRzIGluIHRoZSBsaXN0XHJcbiAgICAgICAgICAgIC8vIGlmIChyZXN1bHRzLmlhdGFNYXRjaCkge1xyXG4gICAgICAgICAgICAvLyAgIGdlbmVyYWxNYXRjaGVzLnB1c2gocmVzdWx0cy5pYXRhTWF0Y2gpO1xyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgZ2VuZXJhbE1hdGNoZXNcclxuICAgICAgICAgICAgICAgIC8vIC5maWx0ZXIoKGFpcnBvcnQ6IEFpcnBvcnRSZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgICAgIC8vICAgcmV0dXJuICEhY291bnRyeUNvZGVcclxuICAgICAgICAgICAgICAgIC8vICAgICA/IGNvdW50cnlDb2RlID09PSBhaXJwb3J0LmRldGFpbHMuY291bnRyeUNvZGVcclxuICAgICAgICAgICAgICAgIC8vICAgICA6IGFpcnBvcnQ7XHJcbiAgICAgICAgICAgICAgICAvLyB9KVxyXG4gICAgICAgICAgICAgICAgLm1hcCgoYWlycG9ydDogQWlycG9ydCk6IE9CVEFpcnBvcnREZXRhaWxzID0+IHtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbjogYWlycG9ydC5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgIGdhdGV3YXk6IGFpcnBvcnQuaWF0YSxcclxuICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hbHM6IHRoaXMucHJvY2Vzc1Rlcm1pbmFscyhhaXJwb3J0LnRlcm1pbmFscyksXHJcbiAgICAgICAgICAgICAgICAgICAgY291bnRyeTogYWlycG9ydD8ubG9jYXRpb25EZXRhaWxzPy5jb3VudHJ5LFxyXG4gICAgICAgICAgICAgICAgICAgIHBvc3Rjb2RlOiBhaXJwb3J0Py5sb2NhdGlvbkRldGFpbHM/LnBvc3Rjb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvdW50cnlDb2RlOiBhaXJwb3J0Py5sb2NhdGlvbkRldGFpbHM/LmNvdW50cnlDb2RlXHJcbiAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gb2YoW10pO1xyXG4gICAgfVxyXG4gIH1cclxuICBnZXRBaXJsaW5lc0xpc3QoXHJcbiAgICB0ZXJtOiBzdHJpbmcsXHJcbiAgICBpc0xvYWRpbmc/OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj5cclxuICApOiBPYnNlcnZhYmxlPE9CVEFpcmxpbmVzRGV0YWlsc1tdPiB7XHJcbiAgICBpZiAodGVybS5sZW5ndGggPj0gMikge1xyXG4gICAgICBpZiAoaXNMb2FkaW5nKSB7XHJcbiAgICAgICAgaXNMb2FkaW5nLm5leHQodHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgcXVlcnk6IFNlYXJjaEFpcmxpbmVzLlZhcmlhYmxlcyA9IHsgcXVlcnk6IHRlcm0gfTtcclxuICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoQWlybGluZXNGZXRjaGVyLmZldGNoT25lKHF1ZXJ5KS5waXBlKFxyXG4gICAgICAgIHRha2UoMSksXHJcbiAgICAgICAgbWFwKChyZXN1bHRzOiBBaXJsaW5lc1NlYXJjaFJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgaWYgKGlzTG9hZGluZykge1xyXG4gICAgICAgICAgICBpc0xvYWRpbmcubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHJlc3VsdHMgJiYgcmVzdWx0cy5nZW5lcmFsTWF0Y2hlcykge1xyXG4gICAgICAgICAgICBjb25zdCBnZW5lcmFsTWF0Y2hlcyA9IHRoaXMuaGVscGVycy5jbG9uZShyZXN1bHRzLmdlbmVyYWxNYXRjaGVzKTtcclxuICAgICAgICAgICAgcmV0dXJuIGdlbmVyYWxNYXRjaGVzLm1hcChcclxuICAgICAgICAgICAgICAoYWlybGluZXM6IEFpcmxpbmVSZXN1bHQpOiBPQlRBaXJsaW5lc0RldGFpbHMgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgY29kZTogYWlybGluZXMuaWF0YSxcclxuICAgICAgICAgICAgICAgICAgbmFtZTogYWlybGluZXMubmFtZVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBvZihbXSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldEFpcnBvcnRMb2NhdGlvbnMoXHJcbiAgICB0ZXJtOiBzdHJpbmcsXHJcbiAgICBjb3VudHJ5Q29kZTogQ291bnRyeUNvZGUsXHJcbiAgICBpc0xvYWRpbmc/OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4sXHJcbiAgICBoYXNMb3VuZ2U/OiBib29sZWFuLFxyXG4gICAgaGFzUGFya2luZz86IGJvb2xlYW4sXHJcbiAgICBoYXNGYXN0VHJhY2s/OiBib29sZWFuXHJcbiAgKTogT2JzZXJ2YWJsZTxMb2NhdGlvbkRldGFpbHNbXT4ge1xyXG4gICAgY29uc3QgY29udmVydCA9IChyZXN1bHRzOiBPQlRBaXJwb3J0RGV0YWlsc1tdKTogTG9jYXRpb25EZXRhaWxzW10gPT4ge1xyXG4gICAgICByZXR1cm4gcmVzdWx0cy5tYXAoKHJlc3VsdDogT0JUQWlycG9ydERldGFpbHMpID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgbmFtZTogcmVzdWx0LmRlc3RpbmF0aW9uLFxyXG4gICAgICAgICAgdHlwZTogTG9jYXRpb25UeXBlcy5BaXJwb3J0LFxyXG4gICAgICAgICAgYWlycG9ydDogcmVzdWx0XHJcbiAgICAgICAgfTtcclxuICAgICAgfSk7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0QWlycG9ydHNMaXN0KFxyXG4gICAgICB0ZXJtLFxyXG4gICAgICBjb3VudHJ5Q29kZSxcclxuICAgICAgaXNMb2FkaW5nLFxyXG4gICAgICBoYXNMb3VuZ2UsXHJcbiAgICAgIGhhc1BhcmtpbmcsXHJcbiAgICAgIGhhc0Zhc3RUcmFja1xyXG4gICAgKS5waXBlKG1hcChjb252ZXJ0KSk7XHJcbiAgfVxyXG5cclxuICBnZXRDaXR5TG9jYXRpb25zKFxyXG4gICAgdGVybTogc3RyaW5nLFxyXG4gICAgY291bnRyeUNvZGU/OiBDb3VudHJ5Q29kZSxcclxuICAgIGlzTG9hZGluZz86IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPixcclxuICAgIGlzQ29uZmlybWE/OiBib29sZWFuXHJcbiAgKTogT2JzZXJ2YWJsZTxMb2NhdGlvbkRldGFpbHNbXT4ge1xyXG4gICAgaWYgKHRlcm0ubGVuZ3RoIDw9IDIpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKGlzQ29uZmlybWEpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29uZmVybWFDaXR5TG9jYXRpb25zKHRlcm0sIGNvdW50cnlDb2RlLCBpc0xvYWRpbmcpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2dldENpdHlMb2NhdGlvbnModGVybSwgY291bnRyeUNvZGUsIGlzTG9hZGluZyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBfZ2V0Q2l0eUxvY2F0aW9ucyhcclxuICAgIHRlcm06IHN0cmluZyxcclxuICAgIGNvdW50cnlDb2RlPzogQ291bnRyeUNvZGUsXHJcbiAgICBpc0xvYWRpbmc/OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj5cclxuICApOiBPYnNlcnZhYmxlPExvY2F0aW9uRGV0YWlsc1tdPiB7XHJcbiAgICBpc0xvYWRpbmc/Lm5leHQodHJ1ZSk7XHJcbiAgICBjb25zdCBxdWVyeTogYW55ID0geyBxdWVyeTogdGVybSB9O1xyXG4gICAgaWYgKGNvdW50cnlDb2RlKSB7XHJcbiAgICAgIHF1ZXJ5LmNvdW50cnlDb2RlID0gY291bnRyeUNvZGU7XHJcbiAgICB9XHJcbiAgICBjb25zdCBvYnM6IE9ic2VydmFibGU8U2VhcmNoQ2l0aWVzUmVzdWx0QXJyYXk+ID1cclxuICAgICAgdGhpcy5jaXRpZXNGZXRjaGVyLmZldGNoTGlzdChxdWVyeSk7XHJcbiAgICBjb25zdCBmdW5jID0gKHJlc3VsdHM6IFNlYXJjaENpdGllc1Jlc3VsdEFycmF5KTogTG9jYXRpb25EZXRhaWxzW10gPT4ge1xyXG4gICAgICBjb25zdCBkYXRhOiBMb2NhdGlvbkRldGFpbHNbXSA9IHJlc3VsdHMubWFwKFxyXG4gICAgICAgIChyZXN1bHQ6IFNlYXJjaENpdGllc1Jlc3VsdCk6IExvY2F0aW9uRGV0YWlscyA9PiB7XHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBuYW1lOiByZXN1bHQubmFtZSxcclxuICAgICAgICAgICAgbG9uZ2l0dWRlOiByZXN1bHQuY29vcmRpbmF0ZXMubG9uZ2l0dWRlLFxyXG4gICAgICAgICAgICBsYXRpdHVkZTogcmVzdWx0LmNvb3JkaW5hdGVzLmxhdGl0dWRlLFxyXG4gICAgICAgICAgICB0eXBlOiBMb2NhdGlvblR5cGVzLkNpdHksXHJcbiAgICAgICAgICAgIGNvdW50cnlDb2RlOiByZXN1bHQuY291bnRyeUNvZGUsXHJcbiAgICAgICAgICAgIGlkOiByZXN1bHQuaWRcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgICBpc0xvYWRpbmc/Lm5leHQoZmFsc2UpO1xyXG4gICAgICByZXR1cm4gZGF0YTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gb2JzLnBpcGUodGFrZSgxKSwgbWFwKGZ1bmMpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Q29uZmVybWFDaXR5TG9jYXRpb25zKFxyXG4gICAgdGVybTogc3RyaW5nLFxyXG4gICAgY291bnRyeUNvZGU/OiBDb3VudHJ5Q29kZSxcclxuICAgIGlzTG9hZGluZz86IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPlxyXG4gICk6IE9ic2VydmFibGU8TG9jYXRpb25EZXRhaWxzW10+IHtcclxuICAgIGlzTG9hZGluZz8ubmV4dCh0cnVlKTtcclxuICAgIGNvbnN0IHF1ZXJ5OiBhbnkgPSB7IGNpdHlOYW1lOiB0ZXJtIH07XHJcbiAgICBpZiAoY291bnRyeUNvZGUpIHtcclxuICAgICAgcXVlcnkuY291bnRyeUNvZGUgPSBjb3VudHJ5Q29kZTtcclxuICAgIH1cclxuICAgIGNvbnN0IG9iczogT2JzZXJ2YWJsZTxTZWFyY2hDb25mZXJtYUNpdGllc1Jlc3VsdD4gPVxyXG4gICAgICB0aGlzLmNvbmZlcm1hQ2l0aWVzRmV0Y2hlci5mZXRjaE9uZShxdWVyeSk7XHJcbiAgICBjb25zdCBmdW5jID0gKHJlc3VsdHM6IFNlYXJjaENvbmZlcm1hQ2l0aWVzUmVzdWx0KTogTG9jYXRpb25EZXRhaWxzW10gPT4ge1xyXG4gICAgICBpc0xvYWRpbmc/Lm5leHQoZmFsc2UpO1xyXG5cclxuICAgICAgaWYgKCFyZXN1bHRzPy5zdWdnZXN0aW9ucykge1xyXG4gICAgICAgIHJldHVybiBbXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgZGF0YTogTG9jYXRpb25EZXRhaWxzW10gPSByZXN1bHRzLnN1Z2dlc3Rpb25zLm1hcChcclxuICAgICAgICAocmVzdWx0KTogTG9jYXRpb25EZXRhaWxzID0+IHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIG5hbWU6IHJlc3VsdC5uYW1lLFxyXG4gICAgICAgICAgICBsb25naXR1ZGU6IHJlc3VsdC5sb25naXR1ZGUsXHJcbiAgICAgICAgICAgIGxhdGl0dWRlOiByZXN1bHQubGF0aXR1ZGUsXHJcbiAgICAgICAgICAgIHR5cGU6IExvY2F0aW9uVHlwZXMuQ2l0eSxcclxuICAgICAgICAgICAgY291bnRyeUNvZGU6IHJlc3VsdC5jb3VudHJ5Q29kZVxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcblxyXG4gICAgICByZXR1cm4gZGF0YTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gb2JzLnBpcGUodGFrZSgxKSwgbWFwKGZ1bmMpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiAtIGdldCBjYXIgaGlyZSBkZXBvdHMgYmFzZWQgb24gY2l0eSBjb3Jkc1xyXG4gICAqL1xyXG4gIGdldENhckhpcmVEZXBvdHMoXHJcbiAgICBsYXRpdHVkZTogbnVtYmVyLFxyXG4gICAgbG9uZ2l0dWRlOiBudW1iZXIsXHJcbiAgICByYWRpdXM/OiBzdHJpbmcsXHJcbiAgICBpc0xvYWRpbmc/OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj5cclxuICApOiBPYnNlcnZhYmxlPENhckhpcmVEZXBvdFJlc3VsdEFycmF5PiB7XHJcbiAgICBpc0xvYWRpbmc/Lm5leHQodHJ1ZSk7XHJcbiAgICBjb25zdCBxdWVyeTogYW55ID0geyBsYXRpdHVkZSwgbG9uZ2l0dWRlIH07XHJcbiAgICBpZiAocmFkaXVzKSB7XHJcbiAgICAgIHF1ZXJ5LnJhZGl1cyA9IHJhZGl1cztcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBvYnM6IE9ic2VydmFibGU8Q2FySGlyZURlcG90UmVzdWx0QXJyYXk+ID1cclxuICAgICAgdGhpcy5kZXBvdEZldGNoZXIuZmV0Y2hMaXN0KHF1ZXJ5KTtcclxuXHJcbiAgICByZXR1cm4gb2JzOyAvLyAucGlwZSh0YWtlKDEpLCBtYXAoZnVuYykpO1xyXG5cclxuICAgIC8vIHJldHVybiBvZihbXSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gLSBnZXQgcG9zdGNvZGUgbG9jYXRpb25zLCB0aGVzZSB3aWxsIHVzZSBwYXJ0aWFsIHBvc3Rjb2RlLFxyXG4gICAqICBmdWxsIGFuZCB0aGVuIGdyYWJiaW5nIHRoZW0gd2lsbCBsZXQgdXMgZmlsbCBpbiB0aGUgYWRkcmVzcyBmb3JtXHJcbiAgICogQHRvZG8gLSBmaWxsIHRoaXMgb3V0IGZvciB0aGUgb3RoZXIgbG9jYXRpb24gdHlwZXMsIG1heSBuZWVkIHRvIG1lcmdlTWFwIHRoZW0gb3Igc29tZSBvdGhlciByeGpzIG1hZ2ljXHJcbiAgICogQHBhcmFtIHRlcm0gLSB0aGUgdGVybSB0byBzZWFyY2ggYnkgZS5nLiAnd2ExNCcgc2hvdWxkIGJyaW5nIGJhY2ssIG91ciBvZmZpY2UsICdtMzMnIHNob2l1bGQgYnJpbmcgYmFjayBteSBhZGRyc1xyXG4gICAqL1xyXG4gIGdldFBvc3Rjb2RlTGlzdCh0ZXJtOiBzdHJpbmcpOiBPYnNlcnZhYmxlPExvY2F0aW9uRGV0YWlsc1tdPiB7XHJcbiAgICBpZiAoUmVnRXhwcy5VS19QT1NUQ09ERS50ZXN0KHRlcm0pKSB7XHJcbiAgICAgIGNvbnN0IHN1YnMgPSB0aGlzLnBvc3Rjb2RlRmV0Y2hlci5mZXRjaExpc3QoeyBwb3N0Y29kZTogdGVybSB9KS5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzdWx0czogU2VhcmNoUG9zdGNvZGVzUmVzdWx0QXJyYXkpID0+IHtcclxuICAgICAgICAgIHJldHVybiByZXN1bHRzLm1hcChcclxuICAgICAgICAgICAgKHJlc3VsdDogU2VhcmNoUG9zdGNvZGVzUmVzdWx0KTogTG9jYXRpb25EZXRhaWxzID0+IHtcclxuICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogcmVzdWx0LnBvc3Rjb2RlLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogTG9jYXRpb25UeXBlcy5Qb3N0Y29kZSxcclxuICAgICAgICAgICAgICAgIGxhdGl0dWRlOiByZXN1bHQubGF0aXR1ZGUsXHJcbiAgICAgICAgICAgICAgICBsb25naXR1ZGU6IHJlc3VsdC5sb25naXR1ZGVcclxuICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7IC8vIGV4cGFuZCB0aGlzIHdpdGggdGhlIG90aGVyIHNlYXJjaGVzIHdoZW4gdGhleSBhcmUgZG9uZVxyXG5cclxuICAgICAgcmV0dXJuIHN1YnM7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gb2YoW10pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkVG9TZWxlY3RlZFBsYWNlcyhhZGRyZXNzOiBBZGRyZXNzKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdGVkUGxhY2VzLnB1c2goYWRkcmVzcyk7XHJcbiAgfVxyXG5cclxuICBnZXRTZWxlY3RlZFBsYWNlQnlJZChwbGFjZUlkOiBzdHJpbmcpOiBBZGRyZXNzIHtcclxuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkUGxhY2VzLmZpbmQoXHJcbiAgICAgIChwbGFjZTogeyBwbGFjZV9pZDogc3RyaW5nIH0pID0+IHBsYWNlLnBsYWNlX2lkID09PSBwbGFjZUlkXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q29uZmlybWFPZmZpY2VzKHRlcm06IHN0cmluZyk6IE9ic2VydmFibGU8TG9jYXRpb25EZXRhaWxzW10+IHtcclxuICAgIGlmICh0ZXJtPy5sZW5ndGggPiAyKSB7XHJcbiAgICAgIGNvbnN0IG9iczogT2JzZXJ2YWJsZTxDb25mZXJtYU9mZmljZU5hbWVSZXN1bHQ+ID1cclxuICAgICAgICB0aGlzLmNvbmZlcm1hT2ZmaWNlTmFtZXNGZXRjaGVyLmZldGNoTGlzdCgpO1xyXG4gICAgICBjb25zdCBmdW5jID0gKHJlc3VsdHM6IENvbmZlcm1hT2ZmaWNlTmFtZVJlc3VsdCk6IExvY2F0aW9uRGV0YWlsc1tdID0+IHtcclxuICAgICAgICBpZiAoIXJlc3VsdHM/LnJlc3VsdHMpIHtcclxuICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGRhdGE6IExvY2F0aW9uRGV0YWlsc1tdID0gcmVzdWx0cy5yZXN1bHRzLm1hcChcclxuICAgICAgICAgIChyZXN1bHQ6IENvbmZlcm1hT2ZmaWNlTmFtZXMpOiBMb2NhdGlvbkRldGFpbHMgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgIG5hbWU6IHJlc3VsdC5uYW1lLFxyXG4gICAgICAgICAgICAgIHR5cGU6IExvY2F0aW9uVHlwZXMuT2ZmaWNlLFxyXG4gICAgICAgICAgICAgIGlkOiByZXN1bHQuaWRcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gb2JzLnBpcGUodGFrZSgxKSwgbWFwKGZ1bmMpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb2YoW10pO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBAZGVzY3JpcHRpb24gLSBnZXQgdGhlIGxpc3Qgb2YgT2ZmaWNlIGxvY2F0aW9ucyBiYXNlZCBvbiBzZWFyY2ggdGVybSBnaXZlblxyXG4gICAqIEB0b2RvIC0gZmlsbCB0aGlzIG91dCBzbyB0aGF0IGl0IGFjdHVhbGx5IHBlcmZvcm1zIGEgaHR0cCBjYWxsXHJcbiAgICogQHBhcmFtIHRlcm0gLSB0aGUgdGVybSB3ZSB3YW50IHRvIHNlYXJjaCBieVxyXG4gICAqIEByZXR1cm5zXHJcbiAgICovXHJcbiAgZ2V0T2ZmaWNlTG9jYXRpb25zKHRlcm06IHN0cmluZyk6IE9ic2VydmFibGU8TG9jYXRpb25EZXRhaWxzW10+IHtcclxuICAgIGlmICh0ZXJtLmxlbmd0aCA+IDIpIHtcclxuICAgICAgY29uc3Qgb2JzOiBPYnNlcnZhYmxlPEdldFVzZXJDb21wYW55T2ZmaWNlc1Jlc3VsdEFycmF5PiA9XHJcbiAgICAgICAgdGhpcy5nZXRVc2VyQ29tcGFueU9mZmljZXNGZXRjaGVyLmZldGNoTGlzdCgpO1xyXG4gICAgICBjb25zdCBmdW5jID0gKFxyXG4gICAgICAgIHJlc3VsdHM6IEdldFVzZXJDb21wYW55T2ZmaWNlc1Jlc3VsdEFycmF5XHJcbiAgICAgICk6IExvY2F0aW9uRGV0YWlsc1tdID0+IHtcclxuICAgICAgICBjb25zdCBkYXRhOiBMb2NhdGlvbkRldGFpbHNbXSA9IHJlc3VsdHMubWFwKFxyXG4gICAgICAgICAgKHJlc3VsdDogR2V0VXNlckNvbXBhbnlPZmZpY2VzUmVzdWx0KTogTG9jYXRpb25EZXRhaWxzID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICBuYW1lOiByZXN1bHQubmFtZSxcclxuICAgICAgICAgICAgICBvZmZpY2U6IHJlc3VsdC5hZGRyZXNzZXNbMF0sXHJcbiAgICAgICAgICAgICAgdHlwZTogTG9jYXRpb25UeXBlcy5PZmZpY2VcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICB9O1xyXG4gICAgICByZXR1cm4gb2JzLnBpcGUodGFrZSgxKSwgbWFwKGZ1bmMpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb2YoW10pO1xyXG4gIH1cclxuXHJcbiAgZ2V0U3RhdGlvbkxvY2F0aW9ucyhcclxuICAgIHRlcm06IHN0cmluZyxcclxuICAgIGlzTG9hZGluZz86IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPlxyXG4gICk6IE9ic2VydmFibGU8TG9jYXRpb25EZXRhaWxzW10+IHtcclxuICAgIGlmICh0ZXJtLmxlbmd0aCA+IDIpIHtcclxuICAgICAgaXNMb2FkaW5nPy5uZXh0KHRydWUpO1xyXG4gICAgICByZXR1cm4gdGhpcy5yYWlsU3RhdGlvbkZldGNoZXJcclxuICAgICAgICAuZmV0Y2hMaXN0KHtcclxuICAgICAgICAgIHF1ZXJ5OiB0ZXJtXHJcbiAgICAgICAgfSlcclxuICAgICAgICAucGlwZShcclxuICAgICAgICAgIHRha2UoMSksXHJcbiAgICAgICAgICBtYXAoKHJlc3VsdHM6IFNlYXJjaFJhaWxTdGF0aW9uc1Jlc3VsdEFycmF5KTogTG9jYXRpb25EZXRhaWxzW10gPT4ge1xyXG4gICAgICAgICAgICBpZiAoaXNMb2FkaW5nKSB7XHJcbiAgICAgICAgICAgICAgaXNMb2FkaW5nLm5leHQoZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHRzXHJcbiAgICAgICAgICAgICAgPyByZXN1bHRzLm1hcCgocmVzdWx0OiBTZWFyY2hSYWlsU3RhdGlvbnNSZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBMb2NhdGlvblR5cGVzLlRyYWluU3RhdGlvbixcclxuICAgICAgICAgICAgICAgICAgICBuYW1lOiByZXN1bHQubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICByYWlsc3RhdGlvbjogcmVzdWx0XHJcbiAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgIDogW107XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gb2YoW10pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIC0gZ2V0IGlybCBzdGF0aW9uIGxvY2F0aW9uc1xyXG4gICAqIEBwYXJhbSB0ZXJtIC0gdGhlIHRlcm0gdG8gc2VhcmNoXHJcbiAgICogQHBhcmFtIGlzTG9hZGluZyAtIEJlaGF2aW9yU3ViamVjdCBzbyB3ZSBrbm93IHNvbWV0aGluZyBpcyBoYXBwZW5pbmdcclxuICAgKi9cclxuICBzZWFyY2hJcmxTdGF0aW9uc0xvY2F0aW9ucyhcclxuICAgIHRlcm06IHN0cmluZyxcclxuICAgIGlzTG9hZGluZz86IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPlxyXG4gICk6IE9ic2VydmFibGU8TG9jYXRpb25EZXRhaWxzW10+IHtcclxuICAgIGlmICh0ZXJtLmxlbmd0aCA+IDIpIHtcclxuICAgICAgaXNMb2FkaW5nPy5uZXh0KHRydWUpO1xyXG4gICAgICByZXR1cm4gdGhpcy5zZWFyY2hJcmxTdGF0aW9uc0ZldGNoZXJcclxuICAgICAgICAuZmV0Y2hMaXN0KHtcclxuICAgICAgICAgIHF1ZXJ5OiB0ZXJtXHJcbiAgICAgICAgfSlcclxuICAgICAgICAucGlwZShcclxuICAgICAgICAgIHRha2UoMSksXHJcbiAgICAgICAgICBtYXAoKHJlc3VsdHM6IElybFN1cHBsaWVyU3RhdGlvbltdKTogTG9jYXRpb25EZXRhaWxzW10gPT4ge1xyXG4gICAgICAgICAgICBpZiAoaXNMb2FkaW5nKSB7XHJcbiAgICAgICAgICAgICAgaXNMb2FkaW5nLm5leHQoZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHRzLm1hcCgocmVzdWx0OiBJcmxTdXBwbGllclN0YXRpb24pID0+IHtcclxuICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogTG9jYXRpb25UeXBlcy5UcmFpblN0YXRpb24sXHJcbiAgICAgICAgICAgICAgICBuYW1lOiBgJHtyZXN1bHQubmFtZX0gKCR7cmVzdWx0LnN1cHBsaWVyfSlgLFxyXG4gICAgICAgICAgICAgICAgcmFpbHN0YXRpb246IHJlc3VsdFxyXG4gICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIG9mKFtdKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvbiAtIGdldCBob3RlbCBsb2NhdGlvbnMsIHRoZXNlIHNob3VsZCBiZSBjaXR5LCBvZmZpY2UsIGFpcnBvcnQsIHJhaWxzdGF0aW9uXHJcbiAgICogQHRvZG8gLSBmaWxsIHRoaXMgb3V0IGZvciB0aGUgb3RoZXIgbG9jYXRpb24gdHlwZXMsIG1heSBuZWVkIHRvIG1lcmdlTWFwIHRoZW0gb3Igc29tZSBvdGhlciByeGpzIG1hZ2ljXHJcbiAgICogQHBhcmFtIHRlcm0gLSB0aGUgdGVybSB0byBzZWFyY2ggYnkgZS5nLiAnTWFuJyBzaG91bGQgYnJpbmcgYmFjaywgbWFuY2hlc3RlciwgbWFuY2hlc3RlciBhaXJwb3J0LCBtYW5jaGVzdGVyIHBpY2FkaWxseSwgZXRjXHJcbiAgICovXHJcbiAgZ2V0SG90ZWxMb2NhdGlvbnNMaXN0KFxyXG4gICAgdGVybTogc3RyaW5nLFxyXG4gICAgY291bnRyeUNvZGU6IENvdW50cnlDb2RlLFxyXG4gICAgaXNMb2FkaW5nPzogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+XHJcbiAgKTogT2JzZXJ2YWJsZTxMb2NhdGlvbkRldGFpbHNbXT4ge1xyXG4gICAgaWYgKHRlcm0ubGVuZ3RoID4gMikge1xyXG4gICAgICBpZiAoUmVnRXhwcy5VS19QT1NUQ09ERS50ZXN0KHRlcm0pKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UG9zdGNvZGVMaXN0KHRlcm0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICghaXNMb2FkaW5nPy52YWx1ZSkge1xyXG4gICAgICAgICAgaXNMb2FkaW5nLm5leHQodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHN1YnMgPSBmb3JrSm9pbihbXHJcbiAgICAgICAgICB0aGlzLmdldEFpcnBvcnRMb2NhdGlvbnModGVybSwgY291bnRyeUNvZGUsIGlzTG9hZGluZyksXHJcbiAgICAgICAgICB0aGlzLmdldENpdHlMb2NhdGlvbnMoXHJcbiAgICAgICAgICAgIHRlcm0sXHJcbiAgICAgICAgICAgIGNvdW50cnlDb2RlLFxyXG4gICAgICAgICAgICBpc0xvYWRpbmcsXHJcbiAgICAgICAgICAgIHRoaXMudXNlclNlcnZpY2UudXNlckhhc1NlcnZpY2VQcm92aWRlcihcclxuICAgICAgICAgICAgICBTZXJ2aWNlVHlwZS5Ib3RlbCxcclxuICAgICAgICAgICAgICBTZXJ2aWNlUHJvdmlkZXIuQ29uZmlybWFcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgKSxcclxuICAgICAgICAgIHRoaXMuZ2V0U3RhdGlvbkxvY2F0aW9ucyh0ZXJtLCBpc0xvYWRpbmcpLFxyXG4gICAgICAgICAgdGhpcy5nZXRDb25maXJtYU9mZmljZXModGVybSlcclxuICAgICAgICBdKS5waXBlKFxyXG4gICAgICAgICAgbWFwKChyZXN1bHRzOiBhbnlbXSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoaXNMb2FkaW5nPy52YWx1ZSkge1xyXG4gICAgICAgICAgICAgIGlzTG9hZGluZy5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0cy5yZWR1Y2UoKGFjY3VtOiBMb2NhdGlvbkRldGFpbHNbXSwgcmVzdWx0OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICBhY2N1bS5wdXNoKC4uLnJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGFjY3VtO1xyXG4gICAgICAgICAgICB9LCBbXSk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICk7IC8vIGV4cGFuZCB0aGlzIHdpdGggdGhlIG90aGVyIHNlYXJjaGVzIHdoZW4gdGhleSBhcmUgZG9uZVxyXG4gICAgICAgIHJldHVybiBzdWJzO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gb2YoW10pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0U3RhdGlvbnNBbmRBaXJwb3J0c0xpc3QoXHJcbiAgICB0ZXJtOiBzdHJpbmcsXHJcbiAgICBjb3VudHJ5Q29kZTogQ291bnRyeUNvZGUsXHJcbiAgICBpc0xvYWRpbmc/OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj5cclxuICApOiBPYnNlcnZhYmxlPExvY2F0aW9uRGV0YWlsc1tdPiB7XHJcbiAgICBpZiAodGVybS5sZW5ndGggPiAyKSB7XHJcbiAgICAgIGlmICghaXNMb2FkaW5nPy52YWx1ZSkge1xyXG4gICAgICAgIGlzTG9hZGluZy5uZXh0KHRydWUpO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHN1YnMgPSBmb3JrSm9pbihbXHJcbiAgICAgICAgdGhpcy5nZXRBaXJwb3J0TG9jYXRpb25zKHRlcm0sIGNvdW50cnlDb2RlLCBpc0xvYWRpbmcpLFxyXG4gICAgICAgIHRoaXMuZ2V0U3RhdGlvbkxvY2F0aW9ucyh0ZXJtLCBpc0xvYWRpbmcpXHJcbiAgICAgIF0pLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXN1bHRzOiBhbnlbXSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGlzTG9hZGluZz8udmFsdWUpIHtcclxuICAgICAgICAgICAgaXNMb2FkaW5nLm5leHQoZmFsc2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdHMucmVkdWNlKChhY2N1bTogYW55W10sIHJlc3VsdDogYW55W10pID0+IHtcclxuICAgICAgICAgICAgYWNjdW0ucHVzaCguLi5yZXN1bHQpO1xyXG4gICAgICAgICAgICByZXR1cm4gYWNjdW07XHJcbiAgICAgICAgICB9LCBbXSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTsgLy8gZXhwYW5kIHRoaXMgd2l0aCB0aGUgb3RoZXIgc2VhcmNoZXMgd2hlbiB0aGV5IGFyZSBkb25lXHJcbiAgICAgIHJldHVybiBzdWJzO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIG9mKFtdKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qXHJcbiAgQGRlc2MgLSByZW1vdmUgYSBzcGVjaWZpZWQgdHJhdmVsbGVyIGZyb20gdGhlIHNlbGVjdGVkIGFycmF5XHJcbiAgKiovXHJcbiAgcmVtb3ZlVHJhdmVsbGVyKHRyYXZlbGxlcjogVHJhdmVsbGVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9yZW1vdmVUcmF2ZWxsZXIodHJhdmVsbGVyKTtcclxuXHJcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldFNlc3Npb25JdGVtKFxyXG4gICAgICBCYXNlRW50ZXJwcmlzZVNlYXJjaFNlcnZpY2UuU0VTU0lPTl9UUkFWRUxMRVIsXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRUcmF2ZWxsZXJzXHJcbiAgICApO1xyXG4gICAgdGhpcy51cGRhdGVUcmF2ZWxsZXJJbmZvcm1hdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgX3JlbW92ZVRyYXZlbGxlcih0cmF2ZWxsZXI6IFRyYXZlbGxlcikge1xyXG4gICAgdGhpcy5zZWxlY3RlZFRyYXZlbGxlcnMgPSB0aGlzLnNlbGVjdGVkVHJhdmVsbGVycy5maWx0ZXIoXHJcbiAgICAgICh0cmF2ZWxsZXJUb1Rlc3Q6IFRyYXZlbGxlcikgPT4ge1xyXG4gICAgICAgIHJldHVybiAhVHJhdmVsbGVyT2JqZWN0LmVxdWFscyh0cmF2ZWxsZXJUb1Rlc3QsIHRyYXZlbGxlcik7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVBbGxUcmF2ZWxsZXJzKCk6IHZvaWQge1xyXG4gICAgY29uc29sZS5sb2coJ3JlbW92ZSBhbGwgdHJhdmVsbGVycyBjYWxsZWQhJyk7XHJcbiAgICBjb25zb2xlLmxvZyh0aGlzLnNlbGVjdGVkVHJhdmVsbGVycyk7XHJcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRUcmF2ZWxsZXJzKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRUcmF2ZWxsZXJzID0gW107XHJcbiAgICB9XHJcbiAgICB0aGlzLnNlbGVjdGVkVHJhdmVsbGVycy5mb3JFYWNoKCh0cmF2ZWxsZXI6IFRyYXZlbGxlcikgPT4ge1xyXG4gICAgICB0aGlzLl9yZW1vdmVUcmF2ZWxsZXIodHJhdmVsbGVyKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0U2Vzc2lvbkl0ZW0oXHJcbiAgICAgIEJhc2VFbnRlcnByaXNlU2VhcmNoU2VydmljZS5TRVNTSU9OX1RSQVZFTExFUixcclxuICAgICAgdGhpcy5zZWxlY3RlZFRyYXZlbGxlcnNcclxuICAgICk7XHJcbiAgICB0aGlzLnVwZGF0ZVRyYXZlbGxlckluZm9ybWF0aW9uKCk7XHJcbiAgfVxyXG5cclxuICBhZGRUcmF2ZWxsZXIodHJhdmVsbGVyOiBUcmF2ZWxsZXIpIHtcclxuICAgIGlmIChcclxuICAgICAgIXRoaXMudHJhdmVsbGVyQWxyZWFkeUFkZGVkKHRyYXZlbGxlcikgJiZcclxuICAgICAgIXRoaXMuY3VycmVudE5vT2ZUcmF2ZWxsZXJzR3JlYXRlck9yRXF1YWxUb01heCgpXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZFRyYXZlbGxlcnMucHVzaCh0cmF2ZWxsZXIpO1xyXG4gICAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldFNlc3Npb25JdGVtKFxyXG4gICAgICAgIEJhc2VFbnRlcnByaXNlU2VhcmNoU2VydmljZS5TRVNTSU9OX1RSQVZFTExFUixcclxuICAgICAgICB0aGlzLnNlbGVjdGVkVHJhdmVsbGVyc1xyXG4gICAgICApO1xyXG4gICAgICB0aGlzLnVwZGF0ZVRyYXZlbGxlckluZm9ybWF0aW9uKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGN1cnJlbnROb09mVHJhdmVsbGVyc0dyZWF0ZXJPckVxdWFsVG9NYXgoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFRyYXZlbGxlcnMubGVuZ3RoID49IHRoaXMubWF4VHJhdmVsbGVycygpO1xyXG4gIH1cclxuXHJcbiAgbWF4VHJhdmVsbGVycygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIC8qdGhpcy51c2VyU2VydmljZS51c2VUcmF2ZWxsZXJQcm9maWxlICYmKi8gdGhpcy5jYW5Vc2VUcmF2ZWxsZXJQcm9maWxlKClcclxuICAgICAgPyAxXHJcbiAgICAgIDogTUFYX1RSQVZFTExFUlM7XHJcbiAgfVxyXG4gIC8qXHJcbiAgICBAZGVzYyAtIGhlbHBlciBmdW5jdGlvbiAtIGRldGVybWluZXMgaWYgYSBzZWxlY3RlZCB0cmF2ZWxsZXIgaXMgYWxyZWFkeSBhZGRlZCAtXHJcbiAgICB1c2VkIHRvIHByZXZlbnQgc2FtZSB0cmF2ZWxsZXIgYmVpbmcgYWRkZWQgbW9yZSB0aGFuIG9uY2VcclxuICAqKi9cclxuICB0cmF2ZWxsZXJBbHJlYWR5QWRkZWQodHJhdmVsbGVyOiBUcmF2ZWxsZXIpOiBib29sZWFuIHtcclxuICAgIC8vIGl0ZXJhdGUgdGhyb3VnaCB0aGUgc2VsZWN0ZWQgdHJhdmVsbGVycyBhbmQgcmV0dXJuIHRydWUgaWYgZm91bmQsIGZhbHNlIG90aGVyIHdpc2VcclxuICAgIHJldHVybiAhIXRoaXMuc2VsZWN0ZWRUcmF2ZWxsZXJzLmZpbmQoKHRyYXZlbGxlcnM6IFRyYXZlbGxlcikgPT5cclxuICAgICAgVHJhdmVsbGVyT2JqZWN0LmVxdWFscyh0cmF2ZWxsZXJzLCB0cmF2ZWxsZXIpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgY2FuVXNlVHJhdmVsbGVyUHJvZmlsZSgpOiBib29sZWFuIHtcclxuICAgIC8qXHJcbiAgICBpZiAodGhpcy51c2VyU2VydmljZS5pc1VzZXJGYXZvcml0ZVNldChVc2VyRmF2b3J1cml0ZS5Eb250VXNlVHJhdmVsbGVyUG9saWN5KSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBjb25zdCB1c2VyID0gdGhpcy51c2VyU2VydmljZS5nZXRVc2VyRGV0YWlscygpO1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGhpcy5zZWxlY3RlZFRyYXZlbGxlcnMubGVuZ3RoID09PSAxICYmXHJcbiAgICAgICF0aGlzLnNlbGVjdGVkVHJhdmVsbGVyc1swXVxyXG4gICAgICAgIC5ndWVzdCAvKiYmXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRUcmF2ZWxsZXJzWzBdLnBheF9pZCAmJlxyXG4gICAgICB0aGlzLnNlbGVjdGVkVHJhdmVsbGVyc1swXS5wYXhfaWQgIT09IHVzZXIuUGF4SWRcclxuICAgICk7Ki9cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIGdldEN1cnJlbnROb09mVHJhdmVsbGVycygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRUcmF2ZWxsZXJzLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIHVwZGF0ZVRyYXZlbGxlckluZm9ybWF0aW9uKCkge1xyXG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXRTZXNzaW9uSXRlbShcclxuICAgICAgQmFzZUVudGVycHJpc2VTZWFyY2hTZXJ2aWNlLlNFU1NJT05fVFJBVkVMTEVSLFxyXG4gICAgICB0aGlzLnNlbGVjdGVkVHJhdmVsbGVyc1xyXG4gICAgKTtcclxuICAgIHRoaXMudHJhdmVsbGVySW5mb3JtYXRpb24ubmV4dChbLi4udGhpcy5zZWxlY3RlZFRyYXZlbGxlcnNdKTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogIEBkZXNjIC0gZGV0ZXJtaW5lIGFuZCByZXR1cm4gdGhlIGhpZ2hlc3QgcHJpb3JpdHkgdmFsdWUsXHJcbiAgICogICB0aGUgaGlnaGVzdCBpcyBiYXNlZCBvbiB0aGUgcHJpb3JpdHkgdmFsdWUgb2YgdGhlIHNlYXJjaCB0eXBlLFxyXG4gICAqICAgIGlmIGl0IGlzIGNob3NlbiBhbmQgaWYgdGhlIGJvb2tpbmcgaGFzIG5vdCBiZWVuIGNob3NlblxyXG4gICAqKi9cclxuICBkZXRlcm1pbmVIaWdoZXN0U2VhcmNoUHJpb3JpdHkoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiAodGhpcy5oaWdoZXN0X3NlYXJjaF9wcmlvcml0eSA9XHJcbiAgICAgIHRoaXMuX2dldEhpZ2hlc3RTZWFyY2hQcmlvcml0eU9iamVjdCgpLmhpZ2hlc3QpO1xyXG4gIH1cclxuXHJcbiAgZ2V0SGlnaGVzdFNlYXJjaFByaW9yaXR5T2JqZWN0KFxyXG4gICAgYmFza2V0SXRlbXM6IFJlY29yZDxTZXJ2aWNlVHlwZSwgQmFza2V0SXRlbT5cclxuICApOiBTZWFyY2hPYmplY3Qge1xyXG4gICAgcmV0dXJuIHRoaXMuX2dldEhpZ2hlc3RTZWFyY2hQcmlvcml0eU9iamVjdChiYXNrZXRJdGVtcykuY3VycmVudEl0ZW07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXRIaWdoZXN0U2VhcmNoUHJpb3JpdHlPYmplY3QoXHJcbiAgICBiYXNrZXRJdGVtczogUmVjb3JkPFNlcnZpY2VUeXBlLCBCYXNrZXRJdGVtPiA9IHt9IGFzIFJlY29yZDxcclxuICAgICAgU2VydmljZVR5cGUsXHJcbiAgICAgIEJhc2tldEl0ZW1cclxuICAgID5cclxuICApOiBIaWdoZXN0U2VhcmNoUHJpb3JpdHlPYmplY3RJbnRlcmZhY2Uge1xyXG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5zZWFyY2hfb2JqZWN0cykucmVkdWNlKFxyXG4gICAgICAoeyBoaWdoZXN0LCBjdXJyZW50SXRlbSB9LCBpdGVtOiBTZWFyY2hPYmplY3QpID0+IHtcclxuICAgICAgICBpZiAoaXRlbS5jaG9zZW4gJiYgaXRlbS5wcmlvcml0eSA8IGhpZ2hlc3QpIHtcclxuICAgICAgICAgIGlmICghYmFza2V0SXRlbXNbaXRlbS50eXBlIGFzIFNlcnZpY2VUeXBlXSkge1xyXG4gICAgICAgICAgICByZXR1cm4geyBoaWdoZXN0OiBpdGVtLnByaW9yaXR5LCBjdXJyZW50SXRlbTogaXRlbSB9O1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaXRlbS5jaG9zZW4gPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHsgaGlnaGVzdCwgY3VycmVudEl0ZW0gfTtcclxuICAgICAgfSxcclxuICAgICAgeyBoaWdoZXN0OiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiwgY3VycmVudEl0ZW06IG51bGwgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGdldFNlbGVjdGVkT3B0aW9ucygpOiBTZXJ2aWNlVHlwZVtdIHtcclxuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLnNlYXJjaF9vYmplY3RzKS5yZWR1Y2UoKGN2LCBpdGVtSW5kZXgpID0+IHtcclxuICAgICAgaWYgKCh0aGlzLnNlYXJjaF9vYmplY3RzIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW2l0ZW1JbmRleF0uY2hvc2VuKSB7XHJcbiAgICAgICAgY3YucHVzaChpdGVtSW5kZXggYXMgU2VydmljZVR5cGUpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBjdjtcclxuICAgIH0sIFtdKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrcyBpZiBzZWxlY3RlZCB0cmF2ZWxsZXJzIGNvbnRhaW5zIGFueSBndWVzdHMgd2l0aG91dCBhbGwgb2YgZGV0YWlsc1xyXG4gICAqL1xyXG4gIGhhc1NpbXBsZUd1ZXN0cygpOiBib29sZWFuIHtcclxuICAgIC8qcmV0dXJuICEhdGhpcy5zZWxlY3RlZFRyYXZlbGxlcnMuZmluZCgoeyBndWVzdCwgcGhvbmUsIG5hdGlvbmFsaXR5LCBlbWFpbCB9KSA9PiB7XHJcbiAgICAgIHJldHVybiBndWVzdCAmJiAhKCEhZW1haWwgJiYgISFwaG9uZSAmJiAhIW5hdGlvbmFsaXR5KTtcclxuICAgIH0pOyovXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb24gLSBzZXQgdGhlIHNlYXJjaCBvYmplY3RzIHRvIHRoZSBnZXQgbWUgdGhlcmUgb2JqZWN0cyAtIGNhbGxlZCBiZWZvcmUgc3RhcnRpbmcgdGhlIGdldCBtZSB0aGVyZSBzZWFyY2hlc1xyXG4gICAqL1xyXG4gIHNldEdldE1lVGhlcmVTZWFyY2hPYmplY3RzKCk6IHZvaWQge1xyXG4gICAgY29uc29sZS5sb2coJysrKyBTZXR0aW5nIEdldE1lVGhlcmUgU2VhcmNoIE9iamVjdHMgKysrJyk7XHJcbiAgICB0aGlzLnNlYXJjaF9vYmplY3RzID0gdGhpcy5oZWxwZXJzLmNsb25lKHRoaXMuZ2V0TWVUaGVyZVNlYXJjaE9iamVjdHMoKSk7XHJcbiAgfVxyXG5cclxuICByZXNldFNlYXJjaFBhcmFtcygpOiB2b2lkIHtcclxuICAgIGNvbnNvbGUubG9nKCdSZXNldGluZyBTZWFyY2ggUGFyYW1zIScpO1xyXG4gICAgdGhpcy5zZWFyY2hfb2JqZWN0cyA9IHRoaXMuaGVscGVycy5jbG9uZSh0aGlzLmluaXRfc2VhcmNoX29iamVjdHMoKSk7XHJcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldFNlc3Npb25JdGVtKFxyXG4gICAgICBCYXNlRW50ZXJwcmlzZVNlYXJjaFNlcnZpY2UuU0VTU0lPTl9UUkFWRUxMRVIsXHJcbiAgICAgIHRoaXMuc2VhcmNoX29iamVjdHNcclxuICAgICk7XHJcbiAgICBPYmplY3QudmFsdWVzKHRoaXMuc2VhcmNoZXMpLmZvckVhY2goXHJcbiAgICAgIChwcm9kdWN0U2VhcmNoU2VydmljZTogQmFzZUVudGVycHJpc2VTZWFyY2g8YW55LCBhbnksIGFueVtdPikgPT4ge1xyXG4gICAgICAgIHByb2R1Y3RTZWFyY2hTZXJ2aWNlLnJlc2V0KCk7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBjYW5TZWFyY2godHlwZTogU2VydmljZVR5cGUgfCBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIC8vIGNoZWNrIHRoYXQgdGhlIHNlbGVjdGVkIHR5cGUgaXMgY2hvc2VuLCBoYXMgaGlnaGVzdCBwcmlvcml0eSBhbmQgaGFzIG5vdCBhbHJlYWR5IGhhZCBhIGJvb2tpbmcgY2hvc2VuXHJcblxyXG4gICAgdGhpcy5kZXRlcm1pbmVIaWdoZXN0U2VhcmNoUHJpb3JpdHkoKTtcclxuICAgIC8vIGZpcnN0bHkgY2hlY2sgdGhhdCB0aGUgdHlwZSBvZiBzZWFyY2ggZXhpc3RzXHJcbiAgICBpZiAoKHRoaXMuc2VhcmNoX29iamVjdHMgYXMgUmVjb3JkPHN0cmluZywgYW55PilbdHlwZV0pIHtcclxuICAgICAgY29uc29sZS5sb2coJ2NhbiBzZWFyY2ggaGVyZScpO1xyXG4gICAgICAvLyBub3cgY2hlY2sgdGhhdCB0aGUgdHlwZSBpcyBjaG9zZW4gaGFzIGhpZ2hlc3QgcHJpb3JpdHlcclxuICAgICAgaWYgKFxyXG4gICAgICAgICh0aGlzLnNlYXJjaF9vYmplY3RzIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW3R5cGVdLmNob3NlbiAmJlxyXG4gICAgICAgIHRoaXMuaGFzSGlnaGVzdFNlYXJjaFByaW9yaXR5KFxyXG4gICAgICAgICAgKHRoaXMuc2VhcmNoX29iamVjdHMgYXMgUmVjb3JkPHN0cmluZywgYW55PilbdHlwZV0ucHJpb3JpdHlcclxuICAgICAgICApXHJcbiAgICAgICkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKHR5cGUgKyAnIGNhbiBiZSBzZWFyY2hlZCcpO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBoYXNIaWdoZXN0U2VhcmNoUHJpb3JpdHkocHJpb3JpdHlWYWw6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgdGhpcy5kZXRlcm1pbmVIaWdoZXN0U2VhcmNoUHJpb3JpdHkoKTtcclxuICAgIHJldHVybiBwcmlvcml0eVZhbCA8PSB0aGlzLmhpZ2hlc3Rfc2VhcmNoX3ByaW9yaXR5O1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiAgQGRlc2MgLSBjb25jYXRpbmF0cyBhbGwgdGhlIHZhbGlkYXRpb24gbWVzc2FnZXMgYWNyb3NzIGFsbCBzZWxlY3RlZCB0eXBlcyArXHJcbiAgICogICB0cmF2ZWxsZXJzIChvciB3aWxsIGRvIHdoZW4gaXQncyBjb21wbGV0ZSkgVE9ETyAtIGFkZCBGbGlnaHQsIFJhaWwgQ2FyXHJcbiAgICoqL1xyXG4gIGdldEFsbEVycm9yTWVzc2FnZXMoKTogc3RyaW5nW10ge1xyXG4gICAgY29uc3QgY29uY2F0dGVkRXJyb3JzOiBzdHJpbmdbXSA9IHRoaXMudHJhdmVsbGVyVmFsaWRhdGlvbk1lc3NhZ2VzO1xyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLnNlYXJjaF9vYmplY3RzW1NlcnZpY2VUeXBlLkxvdW5nZV0uY2hvc2VuICYmXHJcbiAgICAgIHRoaXMuY2FuU2VhcmNoKFNlcnZpY2VUeXBlLkxvdW5nZSlcclxuICAgICkge1xyXG4gICAgICBjb25jYXR0ZWRFcnJvcnMucHVzaChcclxuICAgICAgICAuLi50aGlzLnNlYXJjaGVzW1NlcnZpY2VUeXBlLkxvdW5nZV0udmFsaWRhdGlvbk1lc3NhZ2VzXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLnNlYXJjaF9vYmplY3RzW1NlcnZpY2VUeXBlLkNhcl0uY2hvc2VuICYmXHJcbiAgICAgIHRoaXMuY2FuU2VhcmNoKFNlcnZpY2VUeXBlLkNhcilcclxuICAgICkge1xyXG4gICAgICBjb25jYXR0ZWRFcnJvcnMucHVzaChcclxuICAgICAgICAuLi50aGlzLnNlYXJjaGVzW1NlcnZpY2VUeXBlLkNhcl0udmFsaWRhdGlvbk1lc3NhZ2VzXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLnNlYXJjaF9vYmplY3RzW1NlcnZpY2VUeXBlLlJhaWxdLmNob3NlbiAmJlxyXG4gICAgICB0aGlzLmNhblNlYXJjaChTZXJ2aWNlVHlwZS5SYWlsKVxyXG4gICAgKSB7XHJcbiAgICAgIGNvbmNhdHRlZEVycm9ycy5wdXNoKFxyXG4gICAgICAgIC4uLnRoaXMuc2VhcmNoZXNbU2VydmljZVR5cGUuUmFpbF0udmFsaWRhdGlvbk1lc3NhZ2VzXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLnNlYXJjaF9vYmplY3RzW1NlcnZpY2VUeXBlLlBhcmtpbmddLmNob3NlbiAmJlxyXG4gICAgICB0aGlzLmNhblNlYXJjaChTZXJ2aWNlVHlwZS5QYXJraW5nKVxyXG4gICAgKSB7XHJcbiAgICAgIGNvbmNhdHRlZEVycm9ycy5wdXNoKFxyXG4gICAgICAgIC4uLnRoaXMuc2VhcmNoZXNbU2VydmljZVR5cGUuUGFya2luZ10udmFsaWRhdGlvbk1lc3NhZ2VzXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLnNlYXJjaF9vYmplY3RzW1NlcnZpY2VUeXBlLkNhYl0uY2hvc2VuICYmXHJcbiAgICAgIHRoaXMuY2FuU2VhcmNoKFNlcnZpY2VUeXBlLkNhYilcclxuICAgICkge1xyXG4gICAgICBjb25jYXR0ZWRFcnJvcnMucHVzaChcclxuICAgICAgICAuLi50aGlzLnNlYXJjaGVzW1NlcnZpY2VUeXBlLkNhYl0udmFsaWRhdGlvbk1lc3NhZ2VzXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLnNlYXJjaF9vYmplY3RzW1NlcnZpY2VUeXBlLkhvdGVsXS5jaG9zZW4gJiZcclxuICAgICAgdGhpcy5jYW5TZWFyY2goU2VydmljZVR5cGUuSG90ZWwpXHJcbiAgICApIHtcclxuICAgICAgY29uY2F0dGVkRXJyb3JzLnB1c2goXHJcbiAgICAgICAgLi4udGhpcy5zZWFyY2hlc1tTZXJ2aWNlVHlwZS5Ib3RlbF0udmFsaWRhdGlvbk1lc3NhZ2VzXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLypcclxuICAgIGlmICh0aGlzLnNlYXJjaF9vYmplY3RzLmhvdGVsLmNob3NlbiAmJiB0aGlzLmNhblNlYXJjaChUcmF2ZWxUeXBlRW51bS5IT1RFTCkpIHtcclxuICAgICAgY29uY2F0dGVkRXJyb3JzID0gY29uY2F0dGVkRXJyb3JzLmNvbmNhdCh0aGlzLmhvdGVsLnZhbGlkYXRpb25NZXNzYWdlcyk7XHJcbiAgICB9XHJcblxyXG5cclxuXHJcbiAgICBpZiAodGhpcy5zZWFyY2hfb2JqZWN0cy5mbGlnaHQuY2hvc2VuICYmIHRoaXMuY2FuU2VhcmNoKFRyYXZlbFR5cGVFbnVtLkZMSUdIVCkpIHtcclxuICAgICAgY29uY2F0dGVkRXJyb3JzID0gY29uY2F0dGVkRXJyb3JzLmNvbmNhdCh0aGlzLmZsaWdodC52YWxpZGF0aW9uTWVzc2FnZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnNlYXJjaF9vYmplY3RzLnBhcmtpbmcuY2hvc2VuICYmIHRoaXMuY2FuU2VhcmNoKFRyYXZlbFR5cGVFbnVtLkFJUl9QQVJLSU5HKSkge1xyXG4gICAgICBjb25jYXR0ZWRFcnJvcnMucHVzaCguLi50aGlzLnBhcmtpbmcudmFsaWRhdGlvbk1lc3NhZ2VzKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5zZWFyY2hfb2JqZWN0cy50YXhpLmNob3NlbiAmJiB0aGlzLmNhblNlYXJjaChUcmF2ZWxUeXBlRW51bS5UQVhJKSkge1xyXG4gICAgICBjb25jYXR0ZWRFcnJvcnMucHVzaCguLi50aGlzLnRheGkudmFsaWRhdGlvbk1lc3NhZ2VzKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5zZWFyY2hfb2JqZWN0cy5ldXJvc3Rhci5jaG9zZW4gJiYgdGhpcy5jYW5TZWFyY2goVHJhdmVsVHlwZUVudW0uRVVST1NUQVIpKSB7XHJcbiAgICAgIGNvbmNhdHRlZEVycm9ycy5wdXNoKC4uLnRoaXMuZXVyb3N0YXIudmFsaWRhdGlvbk1lc3NhZ2VzKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5zZWFyY2hfb2JqZWN0cy5jb2FjaC5jaG9zZW4gJiYgdGhpcy5jYW5TZWFyY2goVHJhdmVsVHlwZUVudW0uQ09BQ0gpKSB7XHJcbiAgICAgIGNvbmNhdHRlZEVycm9ycy5wdXNoKC4uLnRoaXMuY29hY2gudmFsaWRhdGlvbk1lc3NhZ2VzKTtcclxuICAgIH0qL1xyXG4gICAgdGhpcy5lcnJvcnMubmV4dChjb25jYXR0ZWRFcnJvcnMpO1xyXG4gICAgcmV0dXJuIGNvbmNhdHRlZEVycm9ycztcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCB0cmF2ZWxsZXJzQ29udGFpblVzZXIoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISF0aGlzLnNlbGVjdGVkVHJhdmVsbGVycy5maW5kKCh0cmF2ZWxsZXI6IFRyYXZlbGxlcikgPT4ge1xyXG4gICAgICByZXR1cm4gdHJhdmVsbGVyLmlkID09PSB0aGlzLnVzZXJTZXJ2aWNlLmdldFVzZXJJZCgpLnRvU3RyaW5nKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB2YWxpZGF0ZVRyYXZlbGxlcnMoKTogYm9vbGVhbiB7XHJcbiAgICB0aGlzLnRyYXZlbGxlclZhbGlkYXRpb25NZXNzYWdlcyA9IFtdO1xyXG5cclxuICAgIHN3aXRjaCAodGhpcy51c2VyU2VydmljZS5mdWxsVXNlckRldGFpbHMudXNlckRhdGEudmFsdWUuYm9va2VyX3R5cGUpIHtcclxuICAgICAgY2FzZSBCb29rZXJUeXBlLlNlbGZCb29rOlxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICEoXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUcmF2ZWxsZXJzLmxlbmd0aCA9PT0gMSAmJiB0aGlzLnRyYXZlbGxlcnNDb250YWluVXNlcigpXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAvLyB0aGlzIHNob3VsZCBuZXZlciB0cmlnZ2VyIHVuZGVyIG5vcm1hbCBjb25kaXRpb25zIGFzIHRoZSB1c2VyIHNob3VsZCBiZSBsb2FkZWQgaW4gYXMgYSB0cmF2ZWxsZXIgb24gbG9naW5cclxuICAgICAgICAgIHRoaXMudHJhdmVsbGVyVmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goXHJcbiAgICAgICAgICAgICdDdXJyZW50IHVzZXIgbXVzdCBiZSBhIHRyYXZlbGxlcidcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBCb29rZXJUeXBlLkJvb2tlcldpdGhTZWxmOlxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICEodGhpcy5zZWxlY3RlZFRyYXZlbGxlcnMubGVuZ3RoIDwgMSkgfHxcclxuICAgICAgICAgICF0aGlzLnRyYXZlbGxlcnNDb250YWluVXNlcigpXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICB0aGlzLnRyYXZlbGxlclZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKCdQbGVhc2UgYWRkIHlvdXIgc2VsZi4nKTtcclxuICAgICAgICAgIHRoaXMudHJhdmVsbGVyX2Vycm9yID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQm9va2VyVHlwZS5Cb29rZXI6XHJcbiAgICAgIGNhc2UgQm9va2VyVHlwZS5Db21wYW55OlxyXG4gICAgICBjYXNlIEJvb2tlclR5cGUuQ29tcGFueUdyb3VwOlxyXG4gICAgICBjYXNlIEJvb2tlclR5cGUuT2ZmaWNlOlxyXG4gICAgICBjYXNlIEJvb2tlclR5cGUuVG1jOlxyXG4gICAgICBjYXNlIEJvb2tlclR5cGUuUm9vdDpcclxuICAgICAgICBpZiAoISh0aGlzLnNlbGVjdGVkVHJhdmVsbGVycy5sZW5ndGggPj0gMSkpIHtcclxuICAgICAgICAgIHRoaXMudHJhdmVsbGVyVmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goXHJcbiAgICAgICAgICAgICdQbGVhc2Ugc2VsZWN0IGF0IGxlYXN0IG9uZSB0cmF2ZWxsZXInXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgdGhpcy50cmF2ZWxsZXJfZXJyb3IgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICB0aGlzLnRyYXZlbGxlclZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKFxyXG4gICAgICAgICAgJ1VucmVjb2duaXNlZCB1c2VyIHR5cGUhIC0gUGxlYXNlIGNvbnRhY3Qgc3VwcG9ydC4nXHJcbiAgICAgICAgKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLnRyYXZlbGxlclZhbGlkYXRpb25NZXNzYWdlcyk7XHJcbiAgICByZXR1cm4gdGhpcy50cmF2ZWxsZXJWYWxpZGF0aW9uTWVzc2FnZXMubGVuZ3RoID09PSAwO1xyXG4gIH1cclxuXHJcbiAgZmluZFBheEluVHJhdmVsbGVycyh1c2VybmFtZTogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFRyYXZlbGxlcnMuZmluZCgodHJhdmVsbGVyOiBUcmF2ZWxsZXIpID0+IHtcclxuICAgICAgcmV0dXJuIHVzZXJuYW1lID09PSB0cmF2ZWxsZXIuZW1haWw7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHZhbGlkYXRlRm9ybXMoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBzZWFyY2hPYmplY3Q6IFNlYXJjaE9iamVjdCA9IHRoaXMuX2ZpbmRTZWFyY2hPYnRlY3QoKTtcclxuICAgIHRoaXMuZ2V0QWxsRXJyb3JNZXNzYWdlcygpO1xyXG4gICAgaWYgKHNlYXJjaE9iamVjdCkge1xyXG4gICAgICB0aGlzLmVycm9ycy5uZXh0KFxyXG4gICAgICAgIHRoaXMuc2VhcmNoZXNbc2VhcmNoT2JqZWN0LnR5cGUgYXMga2V5b2YgU2VhcmNoUGFyYW1zXS5tZXNzYWdlcy52YWx1ZVxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm4gKFxyXG4gICAgICAgIHRoaXMudmFsaWRhdGVUcmF2ZWxsZXJzKCkgJiZcclxuICAgICAgICB0aGlzLnNlYXJjaGVzW3NlYXJjaE9iamVjdC50eXBlIGFzIGtleW9mIFNlYXJjaFBhcmFtc10uaXNWYWxpZC52YWx1ZVxyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZmluZFNlYXJjaE9idGVjdCgpOiBTZWFyY2hPYmplY3QgfCBudWxsIHtcclxuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuc2VhcmNoX29iamVjdHMpLmZpbmQoKG9iajogU2VhcmNoT2JqZWN0KSA9PiB7XHJcbiAgICAgIHJldHVybiAoXHJcbiAgICAgICAgISFvYmogJiYgb2JqLnByaW9yaXR5ID09PSB0aGlzLmhpZ2hlc3Rfc2VhcmNoX3ByaW9yaXR5ICYmIG9iai5jaG9zZW5cclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc3RhcnRTZWFyY2hlcyh1cmw/OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMubmV3U2VhcmNoU3RhcnRlZC5uZXh0KHRydWUpO1xyXG4gICAgdGhpcy5zZWFyY2hfbG9hZGluZyA9IHRydWU7XHJcbiAgICBsZXQgc2VhcmNoT2JqZWN0OiBTZWFyY2hPYmplY3Q7XHJcbiAgICBzZWFyY2hPYmplY3QgPSB0aGlzLl9maW5kU2VhcmNoT2J0ZWN0KCk7XHJcbiAgICBpZiAoc2VhcmNoT2JqZWN0KSB7XHJcbiAgICAgIHNlYXJjaE9iamVjdC5jaG9zZW4gPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh1cmwpIHtcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3VybF0pO1xyXG4gICAgICBpZiAodGhpcy5zZWFyY2hlcy5JTlRFUk5BVElPTkFMX1JBSUwpIHtcclxuICAgICAgICB0aGlzLnN1Ym1pdElybEZvcm0oKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChcclxuICAgICAgc2VhcmNoT2JqZWN0ICYmXHJcbiAgICAgICF0aGlzLnJvdXRlci51cmwuaW5jbHVkZXMoc2VhcmNoT2JqZWN0LnJlc3VsdFVybClcclxuICAgICkge1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbc2VhcmNoT2JqZWN0LnJlc3VsdFVybF0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qSWYgdGhlIHNlYXJjaCBleGNlZWRzIHRoZSB0aW1lb3V0IHRpbWUsIGNhbmNlbCBzZWFyY2ggYW5kIHRlbGwgT0JUIHRoYXQgaXQncyB0aW1lZCBvdXQqL1xyXG4gICAgLy8gY29uc3QgY29udGV4dCA9IHRoaXM7XHJcbiAgICAvLyBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgIC8vICAgaWYgKGNvbnRleHQuc2VhcmNoX2xvYWRpbmcpIHtcclxuICAgIC8vICAgICBjb250ZXh0LnNlYXJjaF9sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAvLyAgICAgY29udGV4dC5zZWFyY2hUaW1lZE91dC5uZXh0KHRydWUpO1xyXG4gICAgLy8gICAgIGNvbnRleHQuc2VhcmNoTG9hZGluZ0RvbmUubmV4dCh0cnVlKTtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfSwgdGhpcy5lbnZpcm9ubWVudC5zZWFyY2hUaW1lb3V0KTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBQcm9taXNlLmFsbChcclxuICAgICAgICBPYmplY3QudmFsdWVzKHRoaXMuc2VhcmNoZXMpLm1hcChcclxuICAgICAgICAgIChzZWFyY2g6IEJhc2VFbnRlcnByaXNlU2VhcmNoPGFueSwgYW55LCBhbnlbXT4pID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuICEhc2VhcmNoICYmXHJcbiAgICAgICAgICAgICAgdGhpcy5zZWFyY2hfb2JqZWN0c1tzZWFyY2gudHlwZV0gJiZcclxuICAgICAgICAgICAgICB0aGlzLnNlYXJjaF9vYmplY3RzW3NlYXJjaC50eXBlXS5jaG9zZW5cclxuICAgICAgICAgICAgICA/IHNlYXJjaC5zdGFydFNlYXJjaCgpXHJcbiAgICAgICAgICAgICAgOiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIClcclxuICAgICAgKS5maW5hbGx5KCgpID0+IHtcclxuICAgICAgICB0aGlzLnNlYXJjaF9sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zZWFyY2hMb2FkaW5nRG9uZS5uZXh0KHRydWUpO1xyXG4gICAgICB9KTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICB0aGlzLnNlYXJjaF9sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuc2VhcmNoTG9hZGluZ0RvbmUubmV4dCh0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFRheGlTdGF0aW9uTG9jYXRpb25zKFxyXG4gICAgdGVybTogc3RyaW5nLFxyXG4gICAgaXNMb2FkaW5nPzogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+XHJcbiAgKTogT2JzZXJ2YWJsZTxSYWlsQWlycG9ydFtdPiB7XHJcbiAgICByZXR1cm4gdGVybS5sZW5ndGggPCAzXHJcbiAgICAgID8gb2YoW10pXHJcbiAgICAgIDogb2YoW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkZXN0aW5hdGlvbjogJ01hbmNoZXN0ZXIgQWlycG90JyxcclxuICAgICAgICAgICAgaXNhaXJwb3J0OiB0cnVlLFxyXG4gICAgICAgICAgICBzdXBwbGllcl9jb2RlOiAnTUFOJyxcclxuICAgICAgICAgICAgYWRkcmVzczogJ01hbmNoZXN0ZXIgQWlycG9ydCcsXHJcbiAgICAgICAgICAgIHBvc3Rjb2RlOiAnTTkwIDFRWCdcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uOiAnTWFuY2hlc3RlciBQaWNjYWRpbGx5JyxcclxuICAgICAgICAgICAgaXNhaXJwb3J0OiBmYWxzZSxcclxuICAgICAgICAgICAgc3VwcGxpZXJfY29kZTogJ01NQU4nLFxyXG4gICAgICAgICAgICBhZGRyZXNzOiAnTWFuY2hlc3RlciBQaWNjYWRpbGx5JyxcclxuICAgICAgICAgICAgcG9zdGNvZGU6ICdNMSAyUFonXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBkZXN0aW5hdGlvbjogJ0xvbmRvbiBIZWF0aHJvdycsXHJcbiAgICAgICAgICAgIGlzYWlycG9ydDogdHJ1ZSxcclxuICAgICAgICAgICAgc3VwcGxpZXJfY29kZTogJ0xIUicsXHJcbiAgICAgICAgICAgIGFkZHJlc3M6ICdMb25kb24gSGVhdGhyb3cgQWlycG9ydCcsXHJcbiAgICAgICAgICAgIHBvc3Rjb2RlOiAnVFc2IDFFVydcclxuICAgICAgICAgIH1cclxuICAgICAgICBdKTtcclxuICB9XHJcblxyXG4gIGdldEFkZHJlc3Nlcyhpc0xvYWRpbmc6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPik6IE9ic2VydmFibGU8QWRkcmVzc0Zvcm1bXT4ge1xyXG4gICAgcmV0dXJuIG9mKFtcclxuICAgICAge1xyXG4gICAgICAgIEhvdXNlOiAnQ2VjaWwgQ291cnQnLFxyXG4gICAgICAgIFN0cmVldDogJzI4LTM2IENlY2lsIFJvYWQnLFxyXG4gICAgICAgIFRvd246ICdIYWxlJyxcclxuICAgICAgICBQb3N0Q29kZTogJ1dBMTUgOVBCJyxcclxuICAgICAgICBDb3VudHJ5OiAnVUsnXHJcbiAgICAgIH1cclxuICAgIF0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0VXNlckFkZHJlc3NlcyhcclxuICAgIGlzTG9hZGluZz86IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPlxyXG4gICk6IE9ic2VydmFibGU8QWRkcmVzc0Zvcm1bXT4ge1xyXG4gICAgcmV0dXJuIHRoaXMudXNlckFkZHJlc3Nlc0ZldGNoZXIuZmV0Y2hMaXN0KCkucGlwZShcclxuICAgICAgdGFrZSgxKSxcclxuICAgICAgbWFwKChyZXN1bHRzOiBhbnkpOiBhbnkgPT4ge1xyXG4gICAgICAgIHJldHVybiByZXN1bHRzLm1hcCgocmVzdWx0OiBhbnkpID0+IHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIElEOiByZXN1bHQuaWQsXHJcbiAgICAgICAgICAgIEhvdXNlOiByZXN1bHQubnVtYmVyT3JOYW1lLFxyXG4gICAgICAgICAgICBTdHJlZXQ6IHJlc3VsdC5zdHJlZXQsXHJcbiAgICAgICAgICAgIFRvd246IHJlc3VsdC50b3duLFxyXG4gICAgICAgICAgICBQb3N0Q29kZTogcmVzdWx0LnBvc3Rjb2RlLFxyXG4gICAgICAgICAgICBDb3VudHJ5OiByZXN1bHQuY291bnRyeUNvZGVcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZGVsZXRlVXNlckFkZHJlc3NCeUlEKGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYmFzZURlbGV0ZVVzZXJBZGRyZXNzVXBkYXRlci51cGRhdGVPbmUoeyBpZDogaWQgfSk7XHJcbiAgfVxyXG5cclxuICBnZXRIb3RlbENoYWluKFxyXG4gICAgdGVybTogc3RyaW5nLFxyXG4gICAgaXNMb2FkaW5nPzogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+XHJcbiAgKTogT2JzZXJ2YWJsZTxhbnlbXT4ge1xyXG4gICAgaWYgKHRlcm0ubGVuZ3RoID4gMikge1xyXG4gICAgICBpc0xvYWRpbmc/Lm5leHQodHJ1ZSk7XHJcbiAgICAgIGNvbnN0IG9iczogT2JzZXJ2YWJsZTxTZWFyY2hIb3RlbENoYWluc1Jlc3VsdEFycmF5PiA9XHJcbiAgICAgICAgdGhpcy5zZWFyY2hIb3RlbENoYWluc0ZldGNoZXIuZmV0Y2hMaXN0KHsgcXVlcnk6IHRlcm0gfSk7XHJcbiAgICAgIGNvbnN0IGZ1bmMgPSAocmVzdWx0czogU2VhcmNoSG90ZWxDaGFpbnNSZXN1bHRBcnJheSk6IGFueVtdID0+IHtcclxuICAgICAgICBjb25zdCBkYXRhOiBhbnlbXSA9IHJlc3VsdHMubWFwKFxyXG4gICAgICAgICAgKHJlc3VsdDogU2VhcmNoSG90ZWxDaGFpbnNSZXN1bHQpOiBhbnkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgIG5hbWU6IHJlc3VsdFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaXNMb2FkaW5nPy5uZXh0KGZhbHNlKTtcclxuICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgfTtcclxuICAgICAgcmV0dXJuIG9icy5waXBlKHRha2UoMSksIG1hcChmdW5jKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG9mKFtdKTtcclxuICB9XHJcblxyXG4gIGdldE9mZmljZU5hbWVzKFxyXG4gICAgaXNMb2FkaW5nPzogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+XHJcbiAgKTogT2JzZXJ2YWJsZTxDb25mZXJtYU9mZmljZU5hbWVzW10+IHtcclxuICAgIHJldHVybiB0aGlzLmNvbmZlcm1hT2ZmaWNlTmFtZXNGZXRjaGVyLmZldGNoTGlzdCgpLnBpcGUoXHJcbiAgICAgIHRha2UoMSksXHJcbiAgICAgIG1hcCgocmVzdWx0cyk6IGFueSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3VsdHMpIHtcclxuICAgICAgICAgIHJldHVybiByZXN1bHRzPy5yZXN1bHRzPy5tYXAoKHJlc3VsdDogQ29uZmVybWFPZmZpY2VOYW1lcykgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgIGlkOiByZXN1bHQuaWQsXHJcbiAgICAgICAgICAgICAgbmFtZTogcmVzdWx0Lm5hbWVcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgICBpc0xvYWRpbmc/Lm5leHQoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgZ2V0T2ZmaWNlKG9mZmljZUlkOiBudW1iZXIpOiBPYnNlcnZhYmxlPENvbmZlcm1hT2ZmaWNlSW5mbz4ge1xyXG4gICAgaWYgKG9mZmljZUlkKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNvbmZlcm1hT2ZmaWNlRmV0Y2hlci5mZXRjaE9uZSh7IG9mZmljZUlkIH0pLnBpcGUoXHJcbiAgICAgICAgdGFrZSgxKSxcclxuICAgICAgICBtYXAoKHJlc3VsdHM6IENvbmZlcm1hT2ZmaWNlUmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzdWx0cykge1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0cy5yZXN1bHRzO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gb2YoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEFsbEhvdGVsQ2hhaW5zKCk6IE9ic2VydmFibGU8YW55W10+IHtcclxuICAgIGNvbnN0IG9iczogT2JzZXJ2YWJsZTxHZXRIb3RlbENoYWluc1Jlc3VsdEFycmF5PiA9XHJcbiAgICAgIHRoaXMuZ2V0SG90ZWxDaGFpbnNGZXRjaGVyLmZldGNoTGlzdCgpO1xyXG4gICAgY29uc3QgZnVuYyA9IChyZXN1bHRzOiBHZXRIb3RlbENoYWluc1Jlc3VsdEFycmF5KTogYW55W10gPT4ge1xyXG4gICAgICBjb25zdCBkYXRhOiBhbnlbXSA9IHJlc3VsdHMubWFwKChyZXN1bHQ6IEdldEhvdGVsQ2hhaW5zUmVzdWx0KTogYW55ID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgbmFtZTogcmVzdWx0XHJcbiAgICAgICAgfTtcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBvYnMucGlwZSh0YWtlKDEpLCBtYXAoZnVuYykpO1xyXG4gIH1cclxuXHJcbiAgZ2V0QWxsUmFpbFByb3ZpZGVycygpOiBPYnNlcnZhYmxlPGFueVtdPiB7XHJcbiAgICBjb25zdCBvYnM6IE9ic2VydmFibGU8Z2V0UmFpbFByb3ZpZGVyc1Jlc3VsdEFycmF5PiA9XHJcbiAgICAgIHRoaXMuZ2V0UmFpbFByb3ZpZGVyc0ZldGNoZXIuZmV0Y2hMaXN0KCk7XHJcbiAgICBjb25zdCBmdW5jID0gKHJlc3VsdHM6IGdldFJhaWxQcm92aWRlcnNSZXN1bHRBcnJheSk6IGFueVtdID0+IHtcclxuICAgICAgY29uc3QgZGF0YTogYW55W10gPSByZXN1bHRzLm1hcCgocmVzdWx0OiBnZXRSYWlsUHJvdmlkZXJzUmVzdWx0KTogYW55ID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgbmFtZTogcmVzdWx0XHJcbiAgICAgICAgfTtcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBvYnMucGlwZSh0YWtlKDEpLCBtYXAoZnVuYykpO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q2FySGlyZVByb2l2ZGVycygpOiBPYnNlcnZhYmxlPGFueVtdPiB7XHJcbiAgICBjb25zdCBvYnM6IE9ic2VydmFibGU8R2V0Q2FySGlyZVByb3ZpZGVyc1Jlc3VsdEFycmF5PiA9XHJcbiAgICAgIHRoaXMuZ2V0Q2FySGlyZVByb3ZpZGVyc0ZldGNoZXIuZmV0Y2hMaXN0KCk7XHJcbiAgICBjb25zdCBmdW5jID0gKHJlc3VsdHM6IEdldENhckhpcmVQcm92aWRlcnNSZXN1bHRBcnJheSk6IGFueVtdID0+IHtcclxuICAgICAgY29uc3QgZGF0YTogYW55W10gPSByZXN1bHRzLm1hcChcclxuICAgICAgICAocmVzdWx0OiBHZXRDYXJIaXJlUHJvdmlkZXJzUmVzdWx0KTogYW55ID0+IHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIG5hbWU6IHJlc3VsdFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBvYnMucGlwZSh0YWtlKDEpLCBtYXAoZnVuYykpO1xyXG4gIH1cclxuXHJcbiAgZ2V0QWxsQWlybGluZXMoKTogT2JzZXJ2YWJsZTxhbnlbXT4ge1xyXG4gICAgY29uc3Qgb2JzOiBPYnNlcnZhYmxlPEdldEFsbEFpcmxpbmVzUmVzdWx0QXJyYXk+ID1cclxuICAgICAgdGhpcy5nZXRBbGxBaXJsaW5lc0ZldGNoZXIuZmV0Y2hMaXN0KCk7XHJcbiAgICBjb25zdCBmdW5jID0gKHJlc3VsdHM6IEdldEFsbEFpcmxpbmVzUmVzdWx0QXJyYXkpOiBhbnlbXSA9PiB7XHJcbiAgICAgIGNvbnN0IGRhdGE6IGFueVtdID0gcmVzdWx0cy5tYXAoKHJlc3VsdDogR2V0QWxsQWlybGluZXNSZXN1bHQpOiBhbnkgPT4ge1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm4gZGF0YTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gb2JzLnBpcGUodGFrZSgxKSwgbWFwKGZ1bmMpKTtcclxuICB9XHJcblxyXG4gIGdldFJhaWxDYXJkcygpOiBPYnNlcnZhYmxlPFJlZmVyZW5jZVJhaWxDYXJkUXVhbGlmaWVyW10+IHtcclxuICAgIHJldHVybiB0aGlzLmdldFJhaWxDYXJkc0ZldGNoZXIuZmV0Y2hMaXN0KCkucGlwZShcclxuICAgICAgdGFrZSgxKSxcclxuICAgICAgbWFwKChyZXN1bHRzKTogYW55ID0+IHtcclxuICAgICAgICBpZiAocmVzdWx0cykge1xyXG4gICAgICAgICAgY29uc3QgcmFpbENhcmRzID0gcmVzdWx0cy5tYXAoXHJcbiAgICAgICAgICAgIChyZXN1bHQ6IFJlZmVyZW5jZVJhaWxDYXJkUXVhbGlmaWVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IHJlc3VsdC5uYW1lLFxyXG4gICAgICAgICAgICAgICAgY29kZTogcmVzdWx0LmNvZGVcclxuICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgcmV0dXJuIHJhaWxDYXJkcy5zb3J0KChhLCBiKSA9PiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEFpcnBvcnRCeUNvZGUoY29kZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxBaXJwb3J0U2VhcmNoUmVzdWx0cz4ge1xyXG4gICAgaWYgKGNvZGUpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoQWlycG9ydHNGZXRjaGVyLmZldGNoT25lKHsgcXVlcnk6IGNvZGUgfSkucGlwZShcclxuICAgICAgICB0YWtlKDEpLFxyXG4gICAgICAgIG1hcCgocmVzdWx0OiBBaXJwb3J0U2VhcmNoUmVzdWx0cykgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIG9mKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBUTyBCRSBPVkVSIFJJRERFTiBCWSBPQlQgU1VCQ0xBU1NFU1xyXG4gIHB1YmxpYyBpbml0X3NlYXJjaF9vYmplY3RzKCk6IFNlYXJjaE9iamVjdHMge1xyXG4gICAgcmV0dXJuIHt9O1xyXG4gIH1cclxuXHJcbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAgICogU0VBUkNIIE9CSkVDVFMgRk9SIEdFVCBNRSBUSEVSRSBET09SIDIgRE9PUiAgICAgICAgICAqXHJcbiAgICogRGlmZmVyZW5jZShzKTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXHJcbiAgICogQWxsIG9iamVjdHMgaGF2ZSBhIHByaW9yaXR5IG9mIDEgc28gdGhhdCB0aGV5IGFyZSAgICAqXHJcbiAgICogc2VhcmNoZWQgYXQgdGhlIHNhbWUgdGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXHJcbiAgICogVXJscyBjaGFuZ2VkIHRvIGdldG1ldGhlcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAqXHJcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcbiAgcHJvdGVjdGVkIGdldE1lVGhlcmVTZWFyY2hPYmplY3RzKCk6IFNlYXJjaE9iamVjdHMge1xyXG4gICAgcmV0dXJuIHt9O1xyXG4gIH1cclxuICAvKlxyXG4gICAqICBAZGVzYyAtIGdldHMgYWxsIHNlbGVjdGVkIHRyYXZlbGxlcnNcclxuICAgKiAgIEltcGxlbWVudGVkIGZvciByYWlsIGNhcmQgcmVhc29ucyBpbiBMVVxyXG4gICAqKi9cclxuICBnZXRTZWxlY3RlZHRyYXZlbGxlcnMoKTogVHJhdmVsbGVyW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRUcmF2ZWxsZXJzO1xyXG4gIH1cclxuXHJcbiAgcmVzZXRTZWFyY2hPYmplY3RzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWFyY2hfb2JqZWN0cyA9IHRoaXMuaGVscGVycy5jbG9uZSh0aGlzLmluaXRfc2VhcmNoX29iamVjdHMoKSk7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICBUaGVzZSBhcmUgdGhlIHBvc3NpYmxlIGFycmF5IG9mIHZhbHVlcyBmcm9tIEFQSSBhcmUgZXhwdGVjdGVkIGFuZCBmdW5jdGlvbiBtYW5pcHVsYXRlIHRvIGNyZWF0ZSB0aGUgbGlzdFxyXG4gICAgW1wiTWFpblwiXVxyXG4gICAgW1wiMVwiXVxyXG4gICAgW1wiMVwiLCBcIjJcIl1cclxuICAgIFtcIjFcIiwgXCIyXCIsIFwiM1wiXVxyXG4gICAgW1wiMVwiLCBcIjJcIiwgXCIzXCIsIFwiNFwiXVxyXG4gICAgW1wiMVwiLCBcIjJcIiwgXCIzXCIsIFwiNFwiLCBcIjVcIl1cclxuICAgIFtcIlNvdXRoXCIsIFwiTm9ydGhcIl1cclxuICAqL1xyXG4gIHB1YmxpYyBwcm9jZXNzVGVybWluYWxzKHRlcm1pbmFsczogc3RyaW5nW10pOiBUZXJtaW5hbHNUeXBlW10ge1xyXG4gICAgY29uc3QgdGVtcFRlcm1pbmFsOiBUZXJtaW5hbHNUeXBlW10gPSBbXTtcclxuICAgIGlmIChcclxuICAgICAgdGVybWluYWxzLmluY2x1ZGVzKCcxJykgfHxcclxuICAgICAgdGVybWluYWxzLmluY2x1ZGVzKCcyJykgfHxcclxuICAgICAgdGVybWluYWxzLmluY2x1ZGVzKCczJykgfHxcclxuICAgICAgdGVybWluYWxzLmluY2x1ZGVzKCc0JykgfHxcclxuICAgICAgdGVybWluYWxzLmluY2x1ZGVzKCc1JylcclxuICAgICkge1xyXG4gICAgICB0ZW1wVGVybWluYWwucHVzaCh7IGtleTogJ0FueSBUZXJtaW5hbCcsIHZhbHVlOiAnQW55JyB9KTtcclxuICAgICAgdGVybWluYWxzLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICB0ZW1wVGVybWluYWwucHVzaCh7IGtleTogYFRlcm1pbmFsICR7aXRlbX1gLCB2YWx1ZTogYCR7aXRlbX1gIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0ZXJtaW5hbHMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgdGVtcFRlcm1pbmFsLnB1c2goeyBrZXk6IGAke3Rlcm1pbmFsc1swXX0gVGVybWluYWxgLCB2YWx1ZTogJ0FueScgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGVtcFRlcm1pbmFsLnB1c2goeyBrZXk6ICdBbnkgVGVybWluYWwnLCB2YWx1ZTogJ0FueScgfSk7XHJcbiAgICAgICAgdGVybWluYWxzLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICAgIHRlbXBUZXJtaW5hbC5wdXNoKHsga2V5OiBgJHtpdGVtfSBUZXJtaW5hbGAsIHZhbHVlOiBgJHtpdGVtfWAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0ZW1wVGVybWluYWw7XHJcbiAgfVxyXG5cclxuICBhc3luYyBzYXZlVXNlckFkZHJlc3MoXHJcbiAgICBhZGRyZXNzOiBTYXZlVXNlckFkZHJlc3NNdXRhdGlvblZhcmlhYmxlc1xyXG4gICk6IFByb21pc2U8YW55PiB7XHJcbiAgICBpZiAoYWRkcmVzcykge1xyXG4gICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHRoaXMuc2F2ZVVzZXJBZGRyZXNzVXBkYXRlclxyXG4gICAgICAgIC51cGRhdGVPbmUoYWRkcmVzcylcclxuICAgICAgICAudG9Qcm9taXNlKCk7XHJcbiAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBjYW5Cb29rKHNlcnZpY2U6IFNlcnZpY2VUeXBlKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy51c2VyU2VydmljZS5jYW5Cb29rKHNlcnZpY2UpID8gdHJ1ZSA6IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgaXNQb3N0Y29kZVZhaWxkKHBvc3Rjb2RlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcclxuICAgIHJldHVybiB0aGlzLmJhc2VWYWxpZGF0ZUlzUG9zdGNvZGVWYWxpZFRlc3Rlci50ZXN0KHsgcG9zdGNvZGUgfSk7XHJcbiAgfVxyXG5cclxuICAvKiBDcmVhdGUgUXVlcnkgRGVmYXVsdHMgU3RhcnQgKi9cclxuICAvKlxyXG4gICAqIENyZWF0ZSB0aGUgQ2FiIEhpcmUgc2VhcmNoIHF1ZXJ5IHdpdGggc3VwcGxpZWQgcGFyYW0sIGF1dG8gZmlsbCB3aXRoIGRlZmF1bHRzIGlmIGZpZWxkcyBhcmUgZW1wdHkuXHJcbiAgICogQHBhcmFtICB7YW55fSAgICAgICAgICAgLi4uYXJncyBleGFtcGxlIC0gc2VhcmNoU2VydmljZS5zZXRDYWJIaXJlUXVlcnkoZGF0YS5xdWVyeSwgeyBkZXBhcnRzOiBtb21lbnREYXRlVGltZSB9KVxyXG4gICAqIEByZXR1cm4ge1F1ZXJ5U2VhcmNoQ2FiSGlyZUFyZ3N9ICAgICAgICAgUmV0dXJucyBRdWVyeVNlYXJjaENhYkhpcmVBcmdzIHR5cGVcclxuICAgKi9cclxuICBwdWJsaWMgbWFrZUNhYkhpcmVRdWVyeSguLi5hcmdzOiBhbnkpOiBDYWJIaXJlVGVtcFBhcmFtcyB7XHJcbiAgICBjb25zdCBkZWZhdWx0VmFsOiBDYWJIaXJlVGVtcFBhcmFtcyA9IHtcclxuICAgICAgYWR1bHRzOiAwLFxyXG4gICAgICBhaXJwb3J0OiBudWxsLFxyXG4gICAgICBjaGlsZHJlbjogMCxcclxuICAgICAgY291bnRyeUNvZGU6IG51bGwsXHJcbiAgICAgIGRlcGFydHM6IHRoaXMuaGVscGVycy5tYWtlTW9tZW50RGF5VGltZSgpLFxyXG4gICAgICBmcm9tQWRkcmVzczogbnVsbCxcclxuICAgICAgZnJvbVN0YXRpb246IG51bGwsXHJcbiAgICAgIGZyb21Mb2NhdGlvblR5cGU6IFRheGlGb3JtTW9kZS5BRERSRVNTLFxyXG4gICAgICBpbmZhbnRzOiAwLFxyXG4gICAgICB0b0FkZHJlc3M6IG51bGwsXHJcbiAgICAgIHRvU3RhdGlvbjogbnVsbCxcclxuICAgICAgdG9Mb2NhdGlvblR5cGU6IFRheGlGb3JtTW9kZS5BRERSRVNTLFxyXG4gICAgICB2ZWhpY2xlVHlwZTogQ2FiSGlyZVZlaGljbGVUeXBlLkFueSxcclxuICAgICAgdmlhc0Zyb206IG51bGwsXHJcbiAgICAgIHZpYXNUbzogbnVsbFxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5oZWxwZXJzLnNhbmF0aXplUmV0dXJuczxDYWJIaXJlVGVtcFBhcmFtcz4oXHJcbiAgICAgIGRlZmF1bHRWYWwsXHJcbiAgICAgIE9iamVjdC5hc3NpZ24oe30sIC4uLmFyZ3MpLFxyXG4gICAgICBbJ2RlcGFydHMnXVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogQ3JlYXRlIHRoZSBDYXIgSGlyZSBzZWFyY2ggcXVlcnkgd2l0aCBzdXBwbGllZCBwYXJhbSwgYXV0byBmaWxsIHdpdGggZGVmYXVsdHMgaWYgZmllbGRzIGFyZSBlbXB0eS5cclxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgICAgICAuLi5hcmdzIGV4YW1wbGUgLSBzZWFyY2hTZXJ2aWNlLnNldENhckhpcmVRdWVyeShkYXRhLnF1ZXJ5LCB7IGRlcGFydHM6IG1vbWVudERhdGVUaW1lIH0pXHJcbiAgICogQHJldHVybiB7UXVlcnlTZWFyY2hDYXJIaXJlQXJnc30gICAgICAgICBSZXR1cm5zIFF1ZXJ5U2VhcmNoQ2FySGlyZUFyZ3MgdHlwZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBtYWtlQ2FySGlyZVF1ZXJ5KC4uLmFyZ3M6IGFueSk6IENhckhpcmVUZW1wUGFyYW1zIHtcclxuICAgIGNvbnN0IGRlZmF1bHRWYWw6IENhckhpcmVUZW1wUGFyYW1zID0ge1xyXG4gICAgICBhZHVsdHM6IDAsXHJcbiAgICAgIGFpckNvbjogbnVsbCxcclxuICAgICAgY2FyQ2xhc3M6IG51bGwsXHJcbiAgICAgIGNhclR5cGU6IG51bGwsXHJcbiAgICAgIGNoaWxkcmVuOiAwLFxyXG4gICAgICBjaG9zZW5WZW5kb3I6IG51bGwsXHJcbiAgICAgIGNob3NlbkRpc3RhbmNlOiAnNScsXHJcbiAgICAgIGNpdHlEcm9wb2ZmOiBudWxsLFxyXG4gICAgICBjaXR5RHJvcG9mZkRlcG90OiBudWxsLFxyXG4gICAgICBjaXR5UGlja3VwOiBudWxsLFxyXG4gICAgICBjaXR5UGlja3VwRGVwb3Q6IG51bGwsXHJcbiAgICAgIGRyb3BvZmZfY291bnRyeTogJ0dCJyxcclxuICAgICAgZHJvcG9mZl9kYXRldGltZTogbnVsbCxcclxuICAgICAgZHJvcG9mZl9sb2NhdGlvbjogbnVsbCxcclxuICAgICAgZXN0aW1hdGVkTWlsZWFnZTogbnVsbCxcclxuICAgICAgbG9jYXRpb25UeXBlOiBudWxsLFxyXG4gICAgICBwaWNrdXBfY291bnRyeTogbnVsbCxcclxuICAgICAgcGlja3VwX2RhdGV0aW1lOiBudWxsLFxyXG4gICAgICBwaWNrdXBfbG9jYXRpb246IG51bGwsXHJcbiAgICAgIHBvc3Rjb2RlRHJvcG9mZjogbnVsbCxcclxuICAgICAgcG9zdGNvZGVEcm9wb2ZmUmF3OiBudWxsLFxyXG4gICAgICBwb3N0Y29kZVBpY2t1cDogbnVsbCxcclxuICAgICAgcG9zdGNvZGVQaWNrdXBSYXc6IG51bGwsXHJcbiAgICAgIHJldHVybl90b19waWNrdXA6IHRydWUsXHJcbiAgICAgIHRyYW5zbWlzc2lvbjogbnVsbFxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5oZWxwZXJzLnNhbmF0aXplUmV0dXJuczxDYXJIaXJlVGVtcFBhcmFtcz4oXHJcbiAgICAgIGRlZmF1bHRWYWwsXHJcbiAgICAgIE9iamVjdC5hc3NpZ24oe30sIC4uLmFyZ3MpLFxyXG4gICAgICBbJ3BpY2t1cF9kYXRldGltZScsICdkcm9wb2ZmX2RhdGV0aW1lJ11cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIENyZWF0ZXMgYSBGbGlnaHQgc2VhcmNoIHF1ZXJ5IHdpdGggc3VwcGxpZWQgcGFyYW1zLCBhdXRvIGZpbGxzIHdpdGggZGVmYXVsdHMgaWYgZmllbGRzIGFyZSBlbXB0eS5cclxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgICAgICAgICAgICAgICAuLi5hcmdzIEV4YW1wbGUgLSBzZWFyY2hTZXJ2aWNlLm1ha2VGbGlnaHRRdWVyeShkYXRhLnF1ZXJ5LCB7IG92ZXJyaWRlOiBcInByb3BlcnR5XCIgfSlcclxuICAgKiBAcmV0dXJuIHtRdWVyeVNlYXJjaEZsaWdodHNBcmdzfSAgICAgICAgIFJldHVybnMgUXVlcnlTZWFyY2hGbGlnaHRzQXJncyB0eXBlXHJcbiAgICovXHJcbiAgcHVibGljIG1ha2VGbGlnaHRRdWVyeSguLi5hcmdzOiBhbnkpOiBGbGlnaHRUZW1wUGFyYW1zIHtcclxuICAgIGNvbnN0IG5vdyA9IHRoaXMuaGVscGVycy5tYWtlTW9tZW50RGF5VGltZSgpO1xyXG4gICAgY29uc3QgdG9tb3Jyb3cgPSB0aGlzLmhlbHBlcnMubWFrZU1vbWVudERheVRpbWUoMSk7XHJcbiAgICBjb25zdCBtb21lbnRPdXREYXRlVGltZSA9IHRoaXMuaGVscGVycy5tb21lbnRSb3VuZE1pbnV0ZXMobm93LCAzMCk7XHJcbiAgICBjb25zdCBtb21lbnRJbkRhdGVUaW1lID0gdGhpcy5oZWxwZXJzLm1vbWVudFJvdW5kTWludXRlcyh0b21vcnJvdywgMzApO1xyXG5cclxuICAgIGNvbnN0IGRlZmF1bHRWYWw6IEZsaWdodFRlbXBQYXJhbXMgPSB7XHJcbiAgICAgIGFkdWx0czogMCxcclxuICAgICAgYXJyaXZlTG9jYXRpb246IG51bGwsXHJcbiAgICAgIGNhYmluQ2xhc3M6IEZsaWdodENhYmluQ2xhc3MuQW55LFxyXG4gICAgICBjaGlsZHJlbjogMCxcclxuICAgICAgY2hvc2VuU2VhcmNoVHlwZTogbnVsbCxcclxuICAgICAgZGVwYXJ0TG9jYXRpb246IG51bGwsXHJcbiAgICAgIGZhcmVUeXBlOiBGYXJlVHlwZS5GbGV4aWJsZSxcclxuICAgICAgaW5ib3VuZERhdGU6IG1vbWVudE91dERhdGVUaW1lLFxyXG4gICAgICBpblRpbWVDcml0ZXJpYTogVGltZVdpbmRvdy5EZXBhcnQsXHJcbiAgICAgIG1heENvbm5lY3Rpb25zOiBudWxsLFxyXG4gICAgICBpbmNsdWRlTmVhcmJ5QWlycG9ydHM6IGZhbHNlLFxyXG4gICAgICBtdWx0aURlc3RpbmF0aW9uOiBbXSxcclxuICAgICAgb3V0Qm91bmREYXRlOiBtb21lbnRJbkRhdGVUaW1lLFxyXG4gICAgICBvdXRUaW1lQ3JpdGVyaWE6IFRpbWVXaW5kb3cuRGVwYXJ0LFxyXG4gICAgICBwcmVmZXJyZWRDYXJyaWVyczogW251bGwsIG51bGwsIG51bGwsIG51bGxdLFxyXG4gICAgICByZXR1cm5DYWJpbkNsYXNzOiBGbGlnaHRDYWJpbkNsYXNzLkFueVxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5oZWxwZXJzLnNhbmF0aXplUmV0dXJuczxGbGlnaHRUZW1wUGFyYW1zPihcclxuICAgICAgZGVmYXVsdFZhbCxcclxuICAgICAgT2JqZWN0LmFzc2lnbih7fSwgLi4uYXJncyksXHJcbiAgICAgIFsnb3V0Qm91bmREYXRlJywgJ2luYm91bmREYXRlJ11cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIENyZWF0ZXMgYSBIb3RlbCBzZWFyY2ggcXVlcnkgd2l0aCBzdXBwbGllZCBwYXJhbXMsIGF1dG8gZmlsbHMgd2l0aCBkZWZhdWx0cyBpZiBmaWVsZHMgYXJlIGVtcHR5LlxyXG4gICAqIEBwYXJhbSAge2FueX0gICAgICAgICAgICAgICAgICAgIC4uLmFyZ3MgRXhhbXBsZSAtIHNlYXJjaFNlcnZpY2UubWFrZUhvdGVsUXVlcnkoZGF0YS5xdWVyeSwgeyBvdmVycmlkZTogXCJwcm9wZXJ0eVwiIH0pXHJcbiAgICogQHJldHVybiB7UXVlcnlTZWFyY2hIb3RlbHNBcmdzfSAgICAgICAgIFJldHVybnMgUXVlcnlTZWFyY2hIb3RlbHNBcmdzIHR5cGVcclxuICAgKi9cclxuICBwdWJsaWMgbWFrZUhvdGVsUXVlcnkoLi4uYXJnczogYW55KTogSG90ZWxUZW1wUGFyYW1zIHtcclxuICAgIGNvbnN0IGRlZmF1bHRWYWwgPSB7XHJcbiAgICAgIGNoZWNraW5fZGF0ZTogbW9tZW50KCkuc2V0KCdob3VyJywgMjMpLnNldCgnbWludXRlJywgNTkpLFxyXG4gICAgICBjaGVja291dF9kYXRlOiBtb21lbnQoKS5hZGQoMSwgJ2RheScpLnNldCgnaG91cicsIDIzKS5zZXQoJ21pbnV0ZScsIDU5KSxcclxuICAgICAgY291bnRyeTogeyBjQ29kZTogJ0dCJywgY05hbWU6ICdVbml0ZWQgS2luZ2RvbScgfSxcclxuICAgICAgY3VycmVuY3k6ICdHQlAnLFxyXG4gICAgICBkaXN0YW5jZTogNSwgLy8gZGVmYXVsdCA1IG1pbGVzIHJhZGl1c1xyXG4gICAgICBob3RlbF9hdmFpbGFiaWxpdHk6IG51bGwsXHJcbiAgICAgIGhvdGVsX2NoYWluOiBudWxsLFxyXG4gICAgICBob3RlbF9uYW1lOiBudWxsLFxyXG4gICAgICBsb2NhdGlvbl90eXBlX3NlbGVjdDogTG9jYXRpb25UeXBlcy5BaXJwb3J0LFxyXG4gICAgICBsb2NhdGlvbjogbnVsbCwgLy8gbWlnaHQgd2FudCB0byBzcGxpdCB0aGlzIG91dCB0byBjaXR5LCBhaXJwb3J0LCBvZmZpY2UsIHJhaWxzdGF0aW9uIC0gdGhpcyB3aWxsIGRvIGZvciBub3dcclxuICAgICAgbm9fb2Zfb2NjdXBhbnRzOiAxLCAvLyBzaW1pbGFybHkgdGhpbmsgdGhpcyBpcyBhIG1heCBvZiAzXHJcbiAgICAgIG5vX29mX3Jvb21zOiAxLCAvLyBtYXggb2YgNCBpbiBvbGQgc2Ficywgbm90IHN1cmUgaGVyZVxyXG4gICAgICBvZmZpY2U6IG51bGwsXHJcbiAgICAgIHBvc3Rjb2RlOiBudWxsLFxyXG4gICAgICBwcmVmZXJlZF9ob3RlbHNfb25seTogZmFsc2UsXHJcbiAgICAgIHRyYWluc1N0YXRpb246IG51bGxcclxuICAgIH0gYXMgSG90ZWxUZW1wUGFyYW1zO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmhlbHBlcnMuc2FuYXRpemVSZXR1cm5zPEhvdGVsVGVtcFBhcmFtcz4oXHJcbiAgICAgIGRlZmF1bHRWYWwsXHJcbiAgICAgIE9iamVjdC5hc3NpZ24oe30sIC4uLmFyZ3MpLFxyXG4gICAgICBbJ2NoZWNraW5fZGF0ZScsICdjaGVja291dF9kYXRlJ11cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIENyZWF0ZXMgYSBMb3VuZ2VzIHNlYXJjaCBxdWVyeSB3aXRoIHN1cHBsaWVkIHBhcmFtcywgYXV0byBmaWxscyB3aXRoIGRlZmF1bHRzIGlmIGZpZWxkcyBhcmUgZW1wdHkuXHJcbiAgICogQHBhcmFtICB7YW55fSAgICAgICAgICAgICAgICAgICAgLi4uYXJncyBFeGFtcGxlIC0gc2VhcmNoU2VydmljZS5tYWtlTG91bmdlc1F1ZXJ5KGRhdGEucXVlcnksIHsgb3ZlcnJpZGU6IFwicHJvcGVydHlcIiB9KVxyXG4gICAqIEByZXR1cm4ge1F1ZXJ5U2VhcmNoTG91bmdlc0FyZ3N9ICAgICAgICAgUmV0dXJucyBRdWVyeVNlYXJjaExvdW5nZXNBcmdzIHR5cGVcclxuICAgKi9cclxuICBwdWJsaWMgbWFrZUxvdW5nZXNRdWVyeSguLi5hcmdzOiBhbnkpOiBMb3VuZ2VzVGVtcFBhcmFtcyB7XHJcbiAgICBjb25zdCBkZWZhdWx0VmFsID0ge1xyXG4gICAgICBhZHVsdHM6IDAsXHJcbiAgICAgIGFycml2YWxEYXRldGltZTogbW9tZW50KCksXHJcbiAgICAgIGNoaWxkcmVuOiAwLFxyXG4gICAgICBpbmZhbnRzOiAwLFxyXG4gICAgICBsb2NhdGlvbkNvZGU6IG51bGwsXHJcbiAgICAgIHRlcm1pbmFsOiBudWxsXHJcbiAgICB9IGFzIExvdW5nZXNUZW1wUGFyYW1zO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmhlbHBlcnMuc2FuYXRpemVSZXR1cm5zPExvdW5nZXNUZW1wUGFyYW1zPihcclxuICAgICAgZGVmYXVsdFZhbCxcclxuICAgICAgT2JqZWN0LmFzc2lnbih7fSwgLi4uYXJncyksXHJcbiAgICAgIFsnYXJyaXZhbERhdGV0aW1lJ11cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIENyZWF0ZXMgYSBQYXJraW5nIHNlYXJjaCBxdWVyeSB3aXRoIHN1cHBsaWVkIHBhcmFtcywgYXV0byBmaWxscyB3aXRoIGRlZmF1bHRzIGlmIGZpZWxkcyBhcmUgZW1wdHkuXHJcbiAgICogQHBhcmFtICB7YW55fSAgICAgICAgICAgICAgICAgICAgLi4uYXJncyBFeGFtcGxlIC0gc2VhcmNoU2VydmljZS5tYWtlUGFya2luZ1F1ZXJ5KGRhdGEucXVlcnksIHsgb3ZlcnJpZGU6IFwicHJvcGVydHlcIiB9KVxyXG4gICAqIEByZXR1cm4ge1F1ZXJ5U2VhcmNoUGFya2luZ0FyZ3N9ICAgICAgICAgUmV0dXJucyBRdWVyeVNlYXJjaFBhcmtpbmdBcmdzIHR5cGVcclxuICAgKi9cclxuICBwdWJsaWMgbWFrZVBhcmtpbmdRdWVyeSguLi5hcmdzOiBhbnkpOiBQYXJraW5nVGVtcFBhcmFtcyB7XHJcbiAgICBjb25zdCBub3cgPSB0aGlzLmhlbHBlcnMubWFrZU1vbWVudERheVRpbWUoKTtcclxuICAgIGNvbnN0IHRvbW9ycm93ID0gdGhpcy5oZWxwZXJzLm1ha2VNb21lbnREYXlUaW1lKDEpO1xyXG4gICAgY29uc3QgbW9tZW50T3V0RGF0ZVRpbWUgPSB0aGlzLmhlbHBlcnMubW9tZW50Um91bmRNaW51dGVzKG5vdywgMzApO1xyXG4gICAgY29uc3QgbW9tZW50SW5EYXRlVGltZSA9IHRoaXMuaGVscGVycy5tb21lbnRSb3VuZE1pbnV0ZXModG9tb3Jyb3csIDMwKTtcclxuXHJcbiAgICBjb25zdCBkZWZhdWx0VmFsID0ge1xyXG4gICAgICBhcnJpdmFsRGF0ZXRpbWU6IG1vbWVudE91dERhdGVUaW1lLFxyXG4gICAgICBjYXJQYXJrZWRGb3JZb3U6IG51bGwsXHJcbiAgICAgIGRlcGFydERhdGV0aW1lOiBtb21lbnRJbkRhdGVUaW1lLFxyXG4gICAgICBsb2NhdGlvbkNvZGU6IG51bGwsXHJcbiAgICAgIG1lZXRBbmRHcmVldDogbnVsbCxcclxuICAgICAgb25BaXJwb3J0OiBudWxsLFxyXG4gICAgICBvdXRGbGlnaHROdW1iZXI6IG51bGwsXHJcbiAgICAgIHBhcmtBbmRSaWRlOiBudWxsLFxyXG4gICAgICBwYXJrQW5kU3Ryb2xsOiBudWxsLFxyXG4gICAgICByZWNvbW1lbmRlZDogbnVsbCxcclxuICAgICAgdGVybWluYWw6IG51bGxcclxuICAgIH0gYXMgUGFya2luZ1RlbXBQYXJhbXM7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaGVscGVycy5zYW5hdGl6ZVJldHVybnM8UGFya2luZ1RlbXBQYXJhbXM+KFxyXG4gICAgICBkZWZhdWx0VmFsLFxyXG4gICAgICBPYmplY3QuYXNzaWduKHt9LCAuLi5hcmdzKSxcclxuICAgICAgWydhcnJpdmFsRGF0ZXRpbWUnLCAnZGVwYXJ0RGF0ZXRpbWUnXVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogQ3JlYXRlcyBhIFJhaWwgc2VhcmNoIHF1ZXJ5IHdpdGggc3VwcGxpZWQgcGFyYW1zLCBhdXRvIGZpbGxzIHdpdGggZGVmYXVsdHMgaWYgZmllbGRzIGFyZSBlbXB0eS5cclxuICAgKiBAcGFyYW0gIHthbnl9ICAgICAgICAgICAgICAgICAgICAuLi5hcmdzIEV4YW1wbGUgLSBzZWFyY2hTZXJ2aWNlLm1ha2VSYWlsUXVlcnkoZGF0YS5xdWVyeSwgeyBvdmVycmlkZTogXCJwcm9wZXJ0eVwiIH0pXHJcbiAgICogQHJldHVybiB7UXVlcnlTZWFyY2hSYWlsQXJnc30gICAgICAgICBSZXR1cm5zIFF1ZXJ5U2VhcmNoUmFpbEFyZ3MgdHlwZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBtYWtlUmFpbFF1ZXJ5KC4uLmFyZ3M6IGFueSk6IFJhaWxUZW1wUGFyYW1zIHtcclxuICAgIGNvbnN0IHRpbWUgPSB0aGlzLmhlbHBlcnMubW9tZW50Um91bmRNaW51dGVzKG1vbWVudCgpLCAzMCk7XHJcbiAgICBjb25zdCBkZWZhdWx0VmFsOiBSYWlsVGVtcFBhcmFtcyA9IHtcclxuICAgICAgYWlycG9ydEV4cHJlc3NTdGF0aW9uOiBudWxsLFxyXG4gICAgICBhcHBseVJhaWxjYXJkczogZmFsc2UsXHJcbiAgICAgIGNhcm5ldFRpY2tldDogZmFsc2UsXHJcbiAgICAgIGNob3NlblNlYXJjaENsYXNzOiBSYWlsQ2xhc3MuQWxsLFxyXG4gICAgICBjaG9zZW5TZWFyY2hUeXBlOiBSYWlsU2VhcmNoSm91cm5leVR5cGUuUmV0dXJuSm91cm5leSxcclxuICAgICAgZGlzYWJsZUF1dG9EaXNjb3VudHM6IGZhbHNlLFxyXG4gICAgICBleHRyYVRpbWU6IGZhbHNlLFxyXG4gICAgICBpbkJvdW5kRGF0ZVRpbWU6IHRpbWUsXHJcbiAgICAgIGlzQWlycG9ydEV4cHJlc3M6IGZhbHNlLFxyXG4gICAgICBub09mQWR1bHRzOiAwLFxyXG4gICAgICBub09mQ2hpbGRyZW46IDAsXHJcbiAgICAgIG91dGJvdW5kQ3JpdGVyaWE6IFJhaWxTZWFyY2hDcml0ZXJpYS5EZXBhcnQsXHJcbiAgICAgIG91dEJvdW5kRGF0ZVRpbWU6IHRpbWUsXHJcbiAgICAgIHByaW9yaXRpc2VCeVByaWNlOiBmYWxzZSxcclxuICAgICAgcmV0dXJuQ3JpdGVyaWE6IFJhaWxTZWFyY2hDcml0ZXJpYS5EZXBhcnQsXHJcbiAgICAgIHRyYXZlbGxpbmdGcm9tOiBudWxsLFxyXG4gICAgICB0cmF2ZWxsaW5nVG86IG51bGwsXHJcbiAgICAgIHZpYTogZmFsc2UsXHJcbiAgICAgIHZpYUxvY2F0aW9uOiBudWxsLFxyXG4gICAgICByYWlsQ2FyZHM6IG51bGxcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaGVscGVycy5zYW5hdGl6ZVJldHVybnM8UmFpbFRlbXBQYXJhbXM+KFxyXG4gICAgICBkZWZhdWx0VmFsLFxyXG4gICAgICBPYmplY3QuYXNzaWduKHt9LCAuLi5hcmdzKSxcclxuICAgICAgWydpbkJvdW5kRGF0ZVRpbWUnLCAnb3V0Qm91bmREYXRlVGltZSddXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBDcmVhdGVzIGEgUmFpbCBzZWFyY2ggcXVlcnkgd2l0aCBzdXBwbGllZCBwYXJhbXMsIGF1dG8gZmlsbHMgd2l0aCBkZWZhdWx0cyBpZiBmaWVsZHMgYXJlIGVtcHR5LlxyXG4gICAqIEBwYXJhbSAge2FueX0gICAgICAgICAgICAgICAgICAgIC4uLmFyZ3MgRXhhbXBsZSAtIHNlYXJjaFNlcnZpY2UubWFrZUlybFF1ZXJ5KGRhdGEucXVlcnksIHsgb3ZlcnJpZGU6IFwicHJvcGVydHlcIiB9KVxyXG4gICAqIEByZXR1cm4ge1F1ZXJ5U2VhcmNoUmFpbEFyZ3N9ICAgICAgICAgUmV0dXJucyBRdWVyeVNlYXJjaFJhaWxBcmdzIHR5cGVcclxuICAgKi9cclxuICBwdWJsaWMgbWFrZUlybFF1ZXJ5KC4uLmFyZ3M6IGFueSk6IElybFRlbXBQYXJhbXMge1xyXG4gICAgY29uc3QgdGltZSA9IHRoaXMuaGVscGVycy5tb21lbnRSb3VuZE1pbnV0ZXMobW9tZW50KCksIDMwKTtcclxuICAgIGNvbnN0IGRlZmF1bHRWYWw6IElybFRlbXBQYXJhbXMgPSB7XHJcbiAgICAgIHN1cHBsaWVyOiBudWxsLCAvLyBJUkxTdXBwbGllciFcclxuICAgICAgY291bnRyeUNvZGU6ICcnLFxyXG4gICAgICBqb3VybmV5VHlwZTogSXJsSm91cm5leVR5cGUuUmV0dXJuSm91cm5leSwgLy8gSVJMSm91cm5leVR5cGUhXHJcbiAgICAgIGNsYXNzOiBudWxsLCAvLyBJUkxDbGFzc1xyXG4gICAgICBvdXRib3VuZERlcGFydHVyZURhdGVUaW1lOiB0aW1lLFxyXG4gICAgICBkZXBhcnR1cmVMb2NhdGlvbklkOiBudWxsLFxyXG4gICAgICBhcnJpdmFsTG9jYXRpb25JZDogbnVsbCxcclxuICAgICAgYWR1bHRzOiAwLFxyXG4gICAgICBjaGlsZHJlbjogMCxcclxuICAgICAgcmV0dXJuRGVwYXJ0dXJlRGF0ZVRpbWU6IHRpbWUsXHJcbiAgICAgIGlybERpc2NvdW50Q2FyZHM6IG51bGxcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaGVscGVycy5zYW5hdGl6ZVJldHVybnM8SXJsVGVtcFBhcmFtcz4oXHJcbiAgICAgIGRlZmF1bHRWYWwsXHJcbiAgICAgIE9iamVjdC5hc3NpZ24oe30sIC4uLmFyZ3MpLFxyXG4gICAgICBbJ3JldHVybkRlcGFydHVyZURhdGVUaW1lJywgJ291dGJvdW5kRGVwYXJ0dXJlRGF0ZVRpbWUnXVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogQ3JlYXRlcyBhIEV1cm9zdGFyIHNlYXJjaCBxdWVyeSB3aXRoIHN1cHBsaWVkIHBhcmFtcywgYXV0byBmaWxscyB3aXRoIGRlZmF1bHRzIGlmIGZpZWxkcyBhcmUgZW1wdHkuXHJcbiAgICogQHBhcmFtICB7YW55fSAgICAgICAgICAgICAgICAgICAgLi4uYXJncyBFeGFtcGxlIC0gc2VhcmNoU2VydmljZS5tYWtlRXVyb3N0YXJRdWVyeShkYXRhLnF1ZXJ5LCB7IG92ZXJyaWRlOiBcInByb3BlcnR5XCIgfSlcclxuICAgKiBAcmV0dXJuIHtFdXJvc3RhclRlbXBQYXJhbXN9ICAgICAgICAgUmV0dXJucyBRdWVyeVNlYXJjaEV1cm9zdGFyQXJncyB0eXBlXHJcbiAgICovXHJcbiAgcHVibGljIG1ha2VFdXJvc3RhclF1ZXJ5KC4uLmFyZ3M6IGFueSk6IEV1cm9zdGFyVGVtcFBhcmFtcyB7XHJcbiAgICBjb25zdCBub3cgPSB0aGlzLmhlbHBlcnMubWFrZU1vbWVudERheVRpbWUoKTtcclxuICAgIGNvbnN0IHRvbW9ycm93ID0gdGhpcy5oZWxwZXJzLm1ha2VNb21lbnREYXlUaW1lKDEpO1xyXG4gICAgY29uc3QgbW9tZW50T3V0RGF0ZVRpbWUgPSB0aGlzLmhlbHBlcnMubW9tZW50Um91bmRNaW51dGVzKG5vdywgMzApO1xyXG4gICAgY29uc3QgbW9tZW50SW5EYXRlVGltZSA9IHRoaXMuaGVscGVycy5tb21lbnRSb3VuZE1pbnV0ZXModG9tb3Jyb3csIDMwKTtcclxuXHJcbiAgICBjb25zdCBkZWZhdWx0VmFsOiBFdXJvc3RhclRlbXBQYXJhbXMgPSB7XHJcbiAgICAgIGFkdWx0czogMCxcclxuICAgICAgYXJyaXZlTG9jYXRpb246IG51bGwsXHJcbiAgICAgIGNhYmluQ2xhc3M6IEZsaWdodENhYmluQ2xhc3MuQW55LFxyXG4gICAgICBjaGlsZHJlbjogMCxcclxuICAgICAgY2hvc2VuU2VhcmNoVHlwZTogRXVyb3N0YXJTZWFyY2hUeXBlLnJldHVybixcclxuICAgICAgZGVwYXJ0TG9jYXRpb246IG51bGwsXHJcbiAgICAgIGZhcmVUeXBlOiBGYXJlVHlwZS5GbGV4aWJsZSxcclxuICAgICAgaW5ib3VuZERhdGU6IG1vbWVudE91dERhdGVUaW1lLFxyXG4gICAgICBpblRpbWVDcml0ZXJpYTogVGltZVdpbmRvdy5EZXBhcnQsXHJcbiAgICAgIG1heENvbm5lY3Rpb25zOiBudWxsLFxyXG4gICAgICBpbmNsdWRlTmVhcmJ5QWlycG9ydHM6IGZhbHNlLFxyXG4gICAgICBtdWx0aURlc3RpbmF0aW9uOiBbXSxcclxuICAgICAgb3V0Qm91bmREYXRlOiBtb21lbnRJbkRhdGVUaW1lLFxyXG4gICAgICBvdXRUaW1lQ3JpdGVyaWE6IFRpbWVXaW5kb3cuRGVwYXJ0LFxyXG4gICAgICBwcmVmZXJyZWRDYXJyaWVyczogW251bGwsIG51bGwsIG51bGwsIG51bGxdLFxyXG4gICAgICByZXR1cm5DYWJpbkNsYXNzOiBGbGlnaHRDYWJpbkNsYXNzLkFueVxyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5oZWxwZXJzLnNhbmF0aXplUmV0dXJuczxFdXJvc3RhclRlbXBQYXJhbXM+KFxyXG4gICAgICBkZWZhdWx0VmFsLFxyXG4gICAgICBPYmplY3QuYXNzaWduKHt9LCAuLi5hcmdzKSxcclxuICAgICAgWydvdXRCb3VuZERhdGUnLCAnaW5ib3VuZERhdGUnXVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogQ3JlYXRlcyBhIEZhc3RUcmFjayBzZWFyY2ggcXVlcnkgd2l0aCBzdXBwbGllZCBwYXJhbXMsIGF1dG8gZmlsbHMgd2l0aCBkZWZhdWx0cyBpZiBmaWVsZHMgYXJlIGVtcHR5LlxyXG4gICAqIEBwYXJhbSAge2FueX0gICAgICAgICAgICAgICAgICAgIC4uLmFyZ3MgRXhhbXBsZSAtIHNlYXJjaFNlcnZpY2UubWFrZUZhc3RUcmFja1F1ZXJ5KGRhdGEucXVlcnksIHsgb3ZlcnJpZGU6IFwicHJvcGVydHlcIiB9KVxyXG4gICAqIEByZXR1cm4ge1F1ZXJ5U2VhcmNoTG91bmdlc0FyZ3N9ICAgICAgICAgUmV0dXJucyBRdWVyeVNlYXJjaExvdW5nZXNBcmdzIHR5cGVcclxuICAgKi9cclxuICBwdWJsaWMgbWFrZUZhc3RUcmFja1F1ZXJ5KC4uLmFyZ3M6IGFueSk6IEZhc3RUcmFja1RlbXBQYXJhbXMge1xyXG4gICAgY29uc3QgZGVmYXVsdFZhbCA9IHtcclxuICAgICAgYWR1bHRzOiAwLFxyXG4gICAgICBhcnJpdmFsRGF0ZXRpbWU6IG1vbWVudCgpLFxyXG4gICAgICBjaGlsZHJlbjogMCxcclxuICAgICAgbG9jYXRpb25Db2RlOiBudWxsXHJcbiAgICB9IGFzIEZhc3RUcmFja1RlbXBQYXJhbXM7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaGVscGVycy5zYW5hdGl6ZVJldHVybnM8RmFzdFRyYWNrVGVtcFBhcmFtcz4oXHJcbiAgICAgIGRlZmF1bHRWYWwsXHJcbiAgICAgIE9iamVjdC5hc3NpZ24oe30sIC4uLmFyZ3MpLFxyXG4gICAgICBbJ2Fycml2YWxEYXRldGltZSddXHJcbiAgICApO1xyXG4gIH1cclxuICAvKiBDcmVhdGUgUXVlcnkgRGVmYXVsdHMgRW5kICovXHJcblxyXG4gIHNob3VsZEFkZFRyYXZlbGxlclN1YnNjcmlwdGlvbigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIGdldEF1dG9Mb2dvdXRDb25maWcoKSB7XHJcbiAgICByZXR1cm4ge307XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIE92ZXJ3cml0ZSBpZiB0aGUgT0JUIGRpc3BsYXlzIGEgbGlzdCBvZiBvZmZpY2VzIGluc3RlYWQgb2Ygc2VhcmNoaW5nIG9uIHRoZW1cclxuICAgKi9cclxuICBwdWJsaWMgc2hvdWxkRmV0Y2hBbGxPZmZpY2VzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICBpc0ZsaWdodHNHcm91cGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICBnZXRDb3VudHJ5RnVsbE5hbWVGcm9tQ291bnRyeUNvZGUoY29kZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGxldCBmdWxsTmFtZSA9ICdVbmtub3duJztcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY291bnRyaWVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGNvdW50cnkgPSB0aGlzLmNvdW50cmllc1tpXTtcclxuXHJcbiAgICAgIGlmIChjb3VudHJ5LmNDb2RlID09PSBjb2RlKSB7XHJcbiAgICAgICAgcmV0dXJuIGNvdW50cnkuY05hbWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZnVsbE5hbWU7XHJcbiAgfVxyXG5cclxuICBnZXRVc2VyUmVjZW50U2VhcmNoZXMoXHJcbiAgICBzZXJ2aWNlVHlwZT86IFNlcnZpY2VUeXBlLFxyXG4gICAgaXNMb2FkaW5nPzogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+XHJcbiAgKTogT2JzZXJ2YWJsZTxSZWNlbnRTZWFyY2hbXT4ge1xyXG4gICAgaXNMb2FkaW5nPy5uZXh0KHRydWUpO1xyXG4gICAgY29uc3QgcXVlcnkgPSB7IHNlcnZpY2VUeXBlIH07XHJcbiAgICBjb25zdCBvYnM6IE9ic2VydmFibGU8R2V0VXNlclJlY2VudFNlYXJjaGVzUmVzdWx0QXJyYXk+ID1cclxuICAgICAgdGhpcy5nZXRVc2VyUmVjZW50U2VhcmNoZXNGZXRjaGVyLmZldGNoTGlzdChxdWVyeSk7XHJcblxyXG4gICAgY29uc3QgZnVuYyA9IChcclxuICAgICAgcmVzdWx0czogR2V0VXNlclJlY2VudFNlYXJjaGVzUmVzdWx0QXJyYXlcclxuICAgICk6IFJlY2VudFNlYXJjaFtdID0+IHtcclxuICAgICAgY29uc3QgZGF0YTogUmVjZW50U2VhcmNoW10gPSByZXN1bHRzLm1hcChcclxuICAgICAgICAocmVzdWx0OiBHZXRVc2VyUmVjZW50U2VhcmNoZXNSZXN1bHQpOiBSZWNlbnRTZWFyY2ggPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgaWQ6IHJlc3VsdC5pZCxcclxuICAgICAgICAgICAgbmFtZTogcmVzdWx0Lm5hbWUsXHJcbiAgICAgICAgICAgIHNlcnZpY2VUeXBlOiByZXN1bHQuc2VydmljZVR5cGUsXHJcbiAgICAgICAgICAgIHNlYXJjaEFyZ3M6IHJlc3VsdC5zZWFyY2hBcmdzLFxyXG4gICAgICAgICAgICBjcmVhdGVkQXQ6IHJlc3VsdC5jcmVhdGVkQXQsXHJcbiAgICAgICAgICAgIHVwZGF0ZWRBdDogcmVzdWx0LnVwZGF0ZWRBdCxcclxuICAgICAgICAgICAgdHJhdmVsRGF0ZTogcmVzdWx0LnRyYXZlbERhdGUsXHJcbiAgICAgICAgICAgIHRyYXZlbGxlcnM6IHJlc3VsdC50cmF2ZWxsZXJzXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgICAgaXNMb2FkaW5nPy5uZXh0KGZhbHNlKTtcclxuICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG9icy5waXBlKHRha2UoMSksIG1hcChmdW5jKSk7XHJcbiAgfVxyXG5cclxuICBnZXRVc2VyRmF2b3VyaXRlU2VhcmNoZXMoXHJcbiAgICBzZXJ2aWNlVHlwZT86IFNlcnZpY2VUeXBlLFxyXG4gICAgaXNMb2FkaW5nPzogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+XHJcbiAgKTogT2JzZXJ2YWJsZTxHZXRVc2VyRmF2b3VyaXRlU2VhcmNoZXNSZXN1bHRBcnJheT4ge1xyXG4gICAgaXNMb2FkaW5nPy5uZXh0KHRydWUpO1xyXG4gICAgY29uc3QgcXVlcnkgPSB7IHNlcnZpY2VUeXBlIH07XHJcbiAgICBjb25zdCBvYnM6IE9ic2VydmFibGU8R2V0VXNlckZhdm91cml0ZVNlYXJjaGVzUmVzdWx0QXJyYXk+ID1cclxuICAgICAgdGhpcy5nZXRVc2VyRmF2b3VyaXRlU2VhcmNoZXNGZXRjaGVyLmZldGNoTGlzdChxdWVyeSk7XHJcblxyXG4gICAgY29uc3QgZnVuYyA9IChyZXN1bHRzOiBHZXRVc2VyRmF2b3VyaXRlU2VhcmNoZXNSZXN1bHRBcnJheSkgPT4ge1xyXG4gICAgICBpc0xvYWRpbmc/Lm5leHQoZmFsc2UpO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBvYnMucGlwZSh0YWtlKDEpLCB0YXAoZnVuYykpO1xyXG4gIH1cclxuXHJcbiAgZGVsZXRlUmVjZW50U2VhcmNoQnlJRChpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLmJhc2VEZWxldGVSZWNlbnRTZWFyY2hVcGRhdGVyLnVwZGF0ZU9uZSh7IGlkOiBpZCB9KTtcclxuICB9XHJcbiAgZGVsZXRlRmF2b3VyaXRlU2VhcmNoQnlJRChpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gdGhpcy5kZWxldGVGYXZvdXJpdGVTZWFyY2hVcGRhdGVyLnVwZGF0ZU9uZSh7IGlkOiBpZCB9KTtcclxuICB9XHJcblxyXG4gIHNhdmVSZWNlbnRTZWFyY2gocXVlcnk6IFNhdmVSZWNlbnRTZWFyY2hNdXRhdGlvblZhcmlhYmxlcyk6IHZvaWQge1xyXG4gICAgaWYgKHF1ZXJ5KSB7XHJcbiAgICAgIHRoaXMuYmFzZVNhdmVSZWNlbnRTZWFyY2hVcGRhdGVyXHJcbiAgICAgICAgLnVwZGF0ZU9uZShxdWVyeSlcclxuICAgICAgICAucGlwZSh0YWtlKDEpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldENvdmlkTWljcm9zaXRlVG9rZW4oKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiB0aGlzLmdldENvdmlkTWljcm9zaXRlVG9rZW5GZXRjaGVyLmZldGNoTGlzdCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIC0gZ2V0IHRoZSBsaXN0IG9mIGV1cm9zdGFyIHN0YXRpb24gbG9jYXRpb25zIGJhc2VkIG9uIHNlYXJjaCB0ZXJtIGdpdmVuXHJcbiAgICogQHRvZG8gLSBmaWxsIHRoaXMgb3V0IHNvIHRoYXQgaXQgYWN0dWFsbHkgcGVyZm9ybXMgYSBodHRwIGNhbGxcclxuICAgKiBAcGFyYW0gdGVybSAtIHRoZSB0ZXJtIHdlIHdhbnQgdG8gc2VhcmNoIGJ5XHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBsb29rdXBFdXJvc3RhclN0YXRpb25zKHRlcm06IHN0cmluZyk6IE9ic2VydmFibGU8YW55W10+IHtcclxuICAgIGNvbnNvbGUubG9nKCd0ZXJtfCAnLCB0ZXJtKTtcclxuICAgIGlmICh0ZXJtID09PSAnJykge1xyXG4gICAgICByZXR1cm4gb2YodGhpcy5ldXJvc3RhdGlvbnMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIG9mKFxyXG4gICAgICAgIHRoaXMuZXVyb3N0YXRpb25zLmZpbHRlcihcclxuICAgICAgICAgICh2KSA9PiB2LmRlc3RpbmF0aW9uLnRvTG93ZXJDYXNlKCkuaW5kZXhPZih0ZXJtLnRvTG93ZXJDYXNlKCkpID4gLTFcclxuICAgICAgICApXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZWFyY2hUcmF2ZWxsZXJzKFxyXG4gICAgaW5wdXQ6IHN0cmluZyxcclxuICAgIHNlYXJjaFRyYXZlbGxlcnNCeTogVHJhdmVsbGVyU2VhcmNoVHlwZXNcclxuICApOiBPYnNlcnZhYmxlPFRyYXZlbGxlcltdPiB7XHJcbiAgICBjb25zdCB0eXBlOiBCb29rZXJUeXBlID0gdGhpcy51c2VyU2VydmljZS5nZXRVc2VyQm9va2luZ1R5cGUoKTtcclxuICAgIHRoaXMudHJhdmVsbGVyX2Vycm9yID0gZmFsc2U7XHJcbiAgICAvKiBUT0RPXHJcbiAgICBpZiAodGhpcy51c2VyU2VydmljZS51c2VBZ2VudENhbkJvb2tGb3IoKSkge1xyXG4gICAgICB0eXBlID0gdGhpcy51c2VyU2VydmljZS5nZXRVc2VyRmF2b3JpdGVWYWx1ZSgnQWdlbnRDYW5Cb29rRm9yJyk7XHJcbiAgICB9Ki9cclxuICAgIGlmIChcclxuICAgICAgdHlwZSAmJlxyXG4gICAgICB0eXBlICE9PSBCb29rZXJUeXBlLlNlbGZCb29rICYmXHJcbiAgICAgIHR5cGUgIT09IEJvb2tlclR5cGUuVHJhdmVsbGVyICYmXHJcbiAgICAgIGlucHV0Lmxlbmd0aCA+PSAxXHJcbiAgICApIHtcclxuICAgICAgY29uc3QgaW5wdXRXb3JkcyA9IGlucHV0LnRvTG93ZXJDYXNlKCkubWF0Y2goLyhbXFx3XSkrL2cpO1xyXG4gICAgICBjb25zdCBhcmdzOiBTZWFyY2hVc2VyQ2FuQm9va0ZvclF1ZXJ5VmFyaWFibGVzID0ge307XHJcbiAgICAgIHN3aXRjaCAoc2VhcmNoVHJhdmVsbGVyc0J5KSB7XHJcbiAgICAgICAgY2FzZSBUcmF2ZWxsZXJTZWFyY2hUeXBlcy5uYW1lOlxyXG4gICAgICAgICAgYXJncy51c2VyTmFtZSA9IGlucHV0V29yZHMubGVuZ3RoID4gMSA/IGlucHV0V29yZHNbMF0gOiBpbnB1dDtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgVHJhdmVsbGVyU2VhcmNoVHlwZXMuZW1haWw6XHJcbiAgICAgICAgICBhcmdzLmVtYWlsID0gaW5wdXQ7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFRyYXZlbGxlclNlYXJjaFR5cGVzLmVtcGxveWVlTnVtYmVyOlxyXG4gICAgICAgICAgYXJncy5lbXBsb3llZUlkID0gaW5wdXQ7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoVXNlcnNDYW5Cb29rRm9yRmV0Y2hlci5mZXRjaExpc3QoYXJncykucGlwZShcclxuICAgICAgICBtYXAoKGRhdGE6IFRyYXZlbGxlcltdKSA9PiB7XHJcbiAgICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5oZWxwZXJzLmNsb25lKGRhdGEpLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgICAgICAgICByZXR1cm4gYS5zdXJuYW1lIDwgYi5zdXJuYW1lID8gLTEgOiBhLnN1cm5hbWUgPiBiLnN1cm5hbWUgPyAxIDogMDtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEZsaWdodEZhcmVSdWxlcyhcclxuICAgIGZsaWdodDogSW5wdXRGbGlnaHRKb3VybmV5XHJcbiAgKTogT2JzZXJ2YWJsZTxHZXRGbGlnaHRGYXJlUnVsZXNSZXN1bHRBcnJheT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0RmxpZ2h0RmFyZVJ1bGVzRmV0Y2hlci5mZXRjaExpc3QoeyBmbGlnaHQgfSk7XHJcbiAgfVxyXG5cclxuICBnZXRSYWlsTGl2ZURlcGFydHVyZXMoXHJcbiAgICBzdGF0aW9uOiBzdHJpbmcsXHJcbiAgICBkYXRlVGltZT86IHN0cmluZ1xyXG4gICk6IE9ic2VydmFibGU8U2VhcmNoUmFpbExpdmVEZXBhcnR1cmVzUmVzdWx0PiB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRSYWlsTGl2ZURlcGFydHVyZXNGZXRjaGVyLmZldGNoTGlzdCh7XHJcbiAgICAgIHN0YXRpb25Db2RlOiBzdGF0aW9uLFxyXG4gICAgICBkZXBhcnREYXRlVGltZTogZGF0ZVRpbWVcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0RmxpZ2h0U2VhdE1hcChcclxuICAgIGZsaWdodDogSW5wdXRGbGlnaHRKb3VybmV5XHJcbiAgKTogT2JzZXJ2YWJsZTxGbGlnaHRTZWF0TWFwUmVzcG9uc2VbXT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0RmxpZ2h0U2VhdE1hcEZldGNoZXIuZmV0Y2hMaXN0KHsgZmxpZ2h0OiBmbGlnaHQgfSkucGlwZShcclxuICAgICAgbWFwKChkYXRhOiBGbGlnaHRTZWF0TWFwUmVzdWx0KSA9PiB7XHJcbiAgICAgICAgaWYgKGRhdGEpIHtcclxuICAgICAgICAgIHJldHVybiBkYXRhLnJlc3VsdHM7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHNhdmVGYXZvdXJpdGVTZWFyY2goXHJcbiAgICBzZWFyY2g6IFNhdmVGYXZvdXJpdGVTZWFyY2hNdXRhdGlvblZhcmlhYmxlc1xyXG4gICk6IE9ic2VydmFibGU8U2F2ZUZhdm91cml0ZVNlYXJjaFJlc3VsdD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYmFzZVNhdmVGYXZvdXJpdGVTZWFyY2hVcGRhdGVyLnVwZGF0ZU9uZShzZWFyY2gpO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q29uZmVybWFSb29tSW1hZ2VzKGhvdGVsSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8U3RyaW5nW10+IHtcclxuICAgIGlmIChob3RlbElkKSB7XHJcbiAgICAgIGNvbnN0IG9iczogT2JzZXJ2YWJsZTxTZWFyY2hIb3RlbENoYWluc1Jlc3VsdEFycmF5PiA9XHJcbiAgICAgICAgdGhpcy5nZXRDb25mZXJtYVJvb21JbWFnZXNGZXRjaGVyLmZldGNoTGlzdCh7IGhvdGVsSWQgfSk7XHJcbiAgICAgIHJldHVybiBvYnMucGlwZSh0YWtlKDEpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGVtYWlsQmFza2V0KGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPEJhc2tldD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZW1haWxCYXNrZXRGZXRjaGVyLmZldGNoTGlzdCh7IGlkIH0pO1xyXG4gIH1cclxuXHJcbiAgc3VibWl0SXJsRm9ybSgpIHtcclxuICAgIGNvbnN0IGN1cnJlbnRVc2VyRW1haWwgPSB0aGlzLnVzZXJTZXJ2aWNlLmdldFVzZXJFbWFpbCgpO1xyXG4gICAgbGV0IHNlYXJjaFBhcmFtcyA9IHRoaXMuc2VhcmNoZXNbU2VydmljZVR5cGUuSW50ZXJuYXRpb25hbFJhaWxdO1xyXG4gICAgbGV0IG9uQmVoYWxmT2Y6IHN0cmluZztcclxuICAgIGxldCBwYXNzZW5nZXJzOiB7fTtcclxuXHJcbiAgICAvLyBnZXQgcGFzc2VuZ2Vyc1xyXG4gICAgdGhpcy5hbGxTdWJzY3JpcHRpb24uYWRkKHRoaXMudHJhdmVsbGVySW5mb3JtYXRpb24uc3Vic2NyaWJlKCh0cmF2ZWxsZXJzOiBUcmF2ZWxsZXJbXSkgPT4ge1xyXG4gICAgICBwYXNzZW5nZXJzID0gdHJhdmVsbGVycy5tYXAoKHRyYXZlbGxlcjogVHJhdmVsbGVyLCBpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgbGV0IGFnZTogbnVtYmVyO1xyXG4gICAgICAgIGlmICh0cmF2ZWxsZXIuZG9iKXtcclxuICAgICAgICAgIGxldCB0aW1lRGlmZiA9IE1hdGguYWJzKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gbmV3IERhdGUodHJhdmVsbGVyLmRvYikuZ2V0VGltZSgpKTtcclxuICAgICAgICAgIGFnZSA9IE1hdGguZmxvb3IoKHRpbWVEaWZmIC8gKDEwMDAgKiAzNjAwICogMjQpKS8zNjUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgbmFtZTogdHJhdmVsbGVyLm5hbWUsXHJcbiAgICAgICAgICBhZ2U6IGFnZT8udG9TdHJpbmcoKSB8fCAnTm90IHNwZWNpZmllZCcsXHJcbiAgICAgICAgICBkaXNjb3VudENhcmQ6IGBEaXNjb3VudCBDYXJkICR7aW5kZXgrMX1gLFxyXG4gICAgICAgICAgbG95YWx0eUNhcmQ6IGBMb3lhbHR5IENhcmQgJHtpbmRleCsxfWBcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIG9uQmVoYWxmT2YgPSB0cmF2ZWxsZXJzWzBdLmVtYWlsID8gdHJhdmVsbGVyc1swXS5lbWFpbCA6IGN1cnJlbnRVc2VyRW1haWw7XHJcbiAgICB9KSk7XHJcblxyXG4gICAgLy8gZ2V0IGpyZnJlZmVyZW5jZVxyXG4gICAgdGhpcy5hbGxTdWJzY3JpcHRpb24uYWRkKFxyXG4gICAgICBzZWFyY2hQYXJhbXMucmVzdWx0cy5zdWJzY3JpYmUoKGlybEpvdXJuZXk6IElybEpvdXJuZXlPcHRpb25zW10pID0+IHtcclxuICAgICAgICBpZiAoaXJsSm91cm5leVswXT8uanJmcmVmZXJlbmNlKSB7XHJcbiAgICAgICAgICB0aGlzLmpyZlJlZmVyZW5jZSA9IGlybEpvdXJuZXlbMF0/LmpyZnJlZmVyZW5jZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAgIGlmICh0aGlzLmpyZlJlZmVyZW5jZSAmJiBwYXNzZW5nZXJzKSB7XHJcbiAgICAgIGNvbnN0IHBheWxvYWQgPSB7XHJcbiAgICAgICAgdHJhaW5OdW1iZXI6IHNlYXJjaFBhcmFtcy50cmFpbk51bWJlciB8fCAnQW55JyxcclxuICAgICAgICBkZXBhcnR1cmVTdGF0aW9uOiBzZWFyY2hQYXJhbXMudHJhdmVsbGluZ0Zyb20ubmFtZSxcclxuICAgICAgICBkZXN0aW5hdGlvblN0YXRpb246IHNlYXJjaFBhcmFtcy50cmF2ZWxsaW5nVG8ubmFtZSxcclxuICAgICAgICBvdXRib3VuZERhdGU6IHNlYXJjaFBhcmFtcy5vdXRib3VuZERlcGFydHVyZURhdGVUaW1lLFxyXG4gICAgICAgIGluYm91bmREYXRlOiBzZWFyY2hQYXJhbXMucmV0dXJuRGVwYXJ0dXJlRGF0ZVRpbWUsXHJcbiAgICAgICAgYWRkaXRpb25hbEluZm86XHJcbiAgICAgICAgICBzZWFyY2hQYXJhbXMuYWRkaXRpb25hbEluc3RydWN0aW9ucyB8fCAnTm8gYWRkaXRpb25hbCBpbnN0cnVjdGlvbnMnLFxyXG4gICAgICAgIHNlcnZpY2VDbGFzczogc2VhcmNoUGFyYW1zLmlybENsYXNzIHx8ICdBbnknLFxyXG4gICAgICAgIG9mZmxpbmVSZWZlcmVuY2U6IHRoaXMuanJmUmVmZXJlbmNlLFxyXG4gICAgICAgIG5vdGlmeUVtYWlsOiBjdXJyZW50VXNlckVtYWlsLCBcclxuICAgICAgICBvbkJlaGFsZk9mOiBvbkJlaGFsZk9mLFxyXG4gICAgICAgIHBhc3NlbmdlcnM6IHBhc3NlbmdlcnNcclxuICAgICAgfTtcclxuICAgICAgY29uc29sZS5sb2cocGF5bG9hZCk7XHJcblxyXG4gICAgICB0aGlzLnNlbmRPZmZsaW5lTm90aWZpY2F0aW9uKHBheWxvYWQpLnN1YnNjcmliZShcclxuICAgICAgICAocmVzdWx0OiBJcmxPZmZsaW5lTm90aWZ5UmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihcclxuICAgICAgICAgICAgICBNb2RhbFR5cGVzLk9mZmxpbmVSZXF1ZXN0RGlhbG9nQ29tcG9uZW50LFxyXG4gICAgICAgICAgICAgIHsgY2VudGVyZWQ6IHRydWUsIHNpemU6ICdtZCcgfSxcclxuICAgICAgICAgICAgICB7IGpyZlJlZmVyZW5jZTogdGhpcy5qcmZSZWZlcmVuY2UgfVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihcclxuICAgICAgICAgICAgICBNb2RhbFR5cGVzLk1vZGFsRXJyb3JDb21wb25lbnQsXHJcbiAgICAgICAgICAgICAgeyBjZW50ZXJlZDogdHJ1ZSB9LFxyXG4gICAgICAgICAgICAgIHsgZXJyb3I6ICdVbmFibGUgdG8gc2VuZCBvZmZsaW5lIG5vdGlmaWNhdGlvbicgfVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNlbmRPZmZsaW5lTm90aWZpY2F0aW9uKFxyXG4gICAganJmUmVmZXJlbmNlOiBhbnlcclxuICApOiBPYnNlcnZhYmxlPElybE9mZmxpbmVOb3RpZnlSZXN1bHQ+IHtcclxuICAgIHJldHVybiB0aGlzLnNlbmRPZmZsaW5lTm90aWZpY2F0aW9uRmV0Y2hlci5mZXRjaE9uZShqcmZSZWZlcmVuY2UpO1xyXG4gIH1cclxufVxyXG4iXX0=
|