@tiba-spark/client-shared-lib 10.4.0-319 → 10.4.0-331
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/esm2022/libraries/enums/localization.enum.mjs +5 -1
- package/esm2022/libraries/modules/guest/guest.actions.mjs +195 -0
- package/esm2022/libraries/modules/guest/guest.module.mjs +22 -0
- package/esm2022/libraries/modules/guest/guest.state.mjs +602 -0
- package/esm2022/libraries/modules/guest/index.mjs +7 -0
- package/esm2022/libraries/modules/index.mjs +2 -1
- package/fesm2022/tiba-spark-client-shared-lib.mjs +809 -21
- package/fesm2022/tiba-spark-client-shared-lib.mjs.map +1 -1
- package/libraries/enums/localization.enum.d.ts +5 -1
- package/libraries/enums/localization.enum.d.ts.map +1 -1
- package/libraries/modules/guest/guest.actions.d.ts +160 -0
- package/libraries/modules/guest/guest.actions.d.ts.map +1 -0
- package/libraries/modules/guest/guest.module.d.ts +8 -0
- package/libraries/modules/guest/guest.module.d.ts.map +1 -0
- package/libraries/modules/guest/guest.state.d.ts +91 -0
- package/libraries/modules/guest/guest.state.d.ts.map +1 -0
- package/libraries/modules/guest/index.d.ts +4 -0
- package/libraries/modules/guest/index.d.ts.map +1 -0
- package/libraries/modules/index.d.ts +1 -0
- package/libraries/modules/index.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,602 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { DatePipe } from '@angular/common';
|
|
3
|
+
import { Injectable } from '@angular/core';
|
|
4
|
+
import { Action, Selector, State } from '@ngxs/store';
|
|
5
|
+
import { tap } from 'rxjs/operators';
|
|
6
|
+
import { NotificationClass } from '../../components/notification/notification-config';
|
|
7
|
+
import { Localization, ProfileTypeText } from '../../enums';
|
|
8
|
+
import { Cloud, Edge } from '../../service-proxy';
|
|
9
|
+
import { createMessageText, getAddress, lowerCaseFirstLetter, markEntitiesAsChanged, markEntityAsUnchanged, RowOperation } from '../../utils';
|
|
10
|
+
import { SendEmailFromEntityAction } from '../email-server/email-server.actions';
|
|
11
|
+
import { FacilityState } from '../facility/facility.state';
|
|
12
|
+
import { ClearGuestAction, ClearGuestProfilesAction, ClearGuestsListAction, CollapsedGuestsByBatchIdAction, CreateBasicBatchAction, CreateBasicGuestAction, CreateBatchAction, CreateGuestAction, DeleteGuestAction, ExpandGuestsByBatchIdAction, ExportGuestsAction, LoadGuestByIdAction, LoadGuestProfilesAction, LoadGuestsAction, LoadGuestsByBatchIdAction, LoadGuestsByBatchIdCancelledAction, SendEmailToGuest, SendGuestPassesToEmailAction, SetGuestsAction, UpdateBasicGuestAction, UpdateBasicGuestTempAction, UpdateGuestAction, UpdateGuestLocationAction } from './guest.actions';
|
|
13
|
+
var GuestEntityParams = Edge.GuestEntityParams;
|
|
14
|
+
var ProfileType = Edge.ProfileType;
|
|
15
|
+
var VGuestWithBatchDto = Edge.VGuestWithBatchDto;
|
|
16
|
+
var SendEmailRequestDto = Cloud.SendEmailRequestDto;
|
|
17
|
+
var TemplateType = Cloud.TemplateType;
|
|
18
|
+
import * as i0 from "@angular/core";
|
|
19
|
+
import * as i1 from "@ngxs/store";
|
|
20
|
+
import * as i2 from "../../service-proxy";
|
|
21
|
+
import * as i3 from "@ngx-translate/core";
|
|
22
|
+
import * as i4 from "../../components/message-bar/message-bar.service";
|
|
23
|
+
import * as i5 from "../../components/notification/command-notification/command-notification.service";
|
|
24
|
+
import * as i6 from "../../services/tenant.service";
|
|
25
|
+
import * as i7 from "../../services/export-file.service";
|
|
26
|
+
import * as i8 from "../parker/parker.service";
|
|
27
|
+
export class VGuestWithBatchTableData extends VGuestWithBatchDto {
|
|
28
|
+
}
|
|
29
|
+
;
|
|
30
|
+
let GuestState = class GuestState {
|
|
31
|
+
constructor(store, guestServiceProxy, translate, batchServiceProxy, messageBarService, commandNotificationService, translateService, tenantService, exportFileService, parkerService) {
|
|
32
|
+
this.store = store;
|
|
33
|
+
this.guestServiceProxy = guestServiceProxy;
|
|
34
|
+
this.translate = translate;
|
|
35
|
+
this.batchServiceProxy = batchServiceProxy;
|
|
36
|
+
this.messageBarService = messageBarService;
|
|
37
|
+
this.commandNotificationService = commandNotificationService;
|
|
38
|
+
this.translateService = translateService;
|
|
39
|
+
this.tenantService = tenantService;
|
|
40
|
+
this.exportFileService = exportFileService;
|
|
41
|
+
this.parkerService = parkerService;
|
|
42
|
+
this.datePipe = new DatePipe('en-US');
|
|
43
|
+
this.L = Localization;
|
|
44
|
+
this.toDateString = (value) => this.datePipe.transform(value.toDate(), this.tenantService.secondaryDateTimeFormat) || '-';
|
|
45
|
+
this.isGuestChild = (guest) => guest.guestID !== null && guest.batchID > 0;
|
|
46
|
+
}
|
|
47
|
+
static guestCounter(state) {
|
|
48
|
+
return state.counter;
|
|
49
|
+
}
|
|
50
|
+
static archivedGuests(state) {
|
|
51
|
+
return state.archived;
|
|
52
|
+
}
|
|
53
|
+
static displayedGuests(state) {
|
|
54
|
+
return state.displayed;
|
|
55
|
+
}
|
|
56
|
+
static profiles(state) {
|
|
57
|
+
return state.profiles;
|
|
58
|
+
}
|
|
59
|
+
static selected(state) {
|
|
60
|
+
return state.selected;
|
|
61
|
+
}
|
|
62
|
+
onLoadGuestByIdAction(ctx, action) {
|
|
63
|
+
const getGuest$ = this.guestServiceProxy.getGuestById(action.guestId, action.parkId, action.guid);
|
|
64
|
+
return getGuest$.pipe(tap(guest => {
|
|
65
|
+
ctx.patchState({
|
|
66
|
+
selected: guest.data
|
|
67
|
+
});
|
|
68
|
+
}));
|
|
69
|
+
}
|
|
70
|
+
onClearGuestAction(ctx) {
|
|
71
|
+
ctx.patchState({
|
|
72
|
+
selected: null
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
onLoadGuestsAction(ctx, action) {
|
|
76
|
+
const getGuests$ = this.guestServiceProxy.getGuests(action.parkId, action.guid, action.guestsFilterDto);
|
|
77
|
+
return getGuests$.pipe(tap((guestsWrapper) => {
|
|
78
|
+
ctx.patchState({
|
|
79
|
+
archived: guestsWrapper.data.entities,
|
|
80
|
+
counter: guestsWrapper.data.counter,
|
|
81
|
+
});
|
|
82
|
+
}));
|
|
83
|
+
}
|
|
84
|
+
onSetGuestsAction(ctx, action) {
|
|
85
|
+
ctx.patchState({
|
|
86
|
+
displayed: action.guests || [],
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
onClearGuestListAction(ctx) {
|
|
90
|
+
ctx.patchState({
|
|
91
|
+
archived: [],
|
|
92
|
+
displayed: [],
|
|
93
|
+
counter: 0,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
onCreateGuestAction(ctx, action) {
|
|
97
|
+
const messageBarPayload = {
|
|
98
|
+
entity: this.translate.instant(Localization.guest),
|
|
99
|
+
entityName: `${action.guest.firstName} ${action.guest.lastName}`,
|
|
100
|
+
action: lowerCaseFirstLetter(this.translate.instant(Localization.created)),
|
|
101
|
+
};
|
|
102
|
+
this.messageBarService.info(Localization.entity_in_progress, createMessageText(messageBarPayload));
|
|
103
|
+
return this.guestServiceProxy.createGuest(action.guid, action.guest).pipe(tap({
|
|
104
|
+
next: (handled) => {
|
|
105
|
+
const displayNewGuestInTable = this.isGuestCreatedFromSelectedFacility(handled.data, action.guid);
|
|
106
|
+
this.addGuestToStore(ctx, handled.data, displayNewGuestInTable);
|
|
107
|
+
this.messageBarService.success(displayNewGuestInTable ? Localization.entity_success : Localization.entity_success_not_currently_visible, createMessageText(messageBarPayload));
|
|
108
|
+
},
|
|
109
|
+
error: () => {
|
|
110
|
+
messageBarPayload.entity = lowerCaseFirstLetter(messageBarPayload.entity);
|
|
111
|
+
messageBarPayload.action = lowerCaseFirstLetter(this.translate.instant(Localization.create));
|
|
112
|
+
this.messageBarService.error(Localization.entity_failed, createMessageText(messageBarPayload));
|
|
113
|
+
}
|
|
114
|
+
}));
|
|
115
|
+
}
|
|
116
|
+
onCreateBatchAction(ctx, action) {
|
|
117
|
+
const messageBarPayload = {
|
|
118
|
+
entity: this.translate.instant(Localization.guest_group),
|
|
119
|
+
entityName: action.batchCommand.name,
|
|
120
|
+
action: lowerCaseFirstLetter(this.translate.instant(Localization.created)),
|
|
121
|
+
};
|
|
122
|
+
this.messageBarService.info(Localization.entity_in_progress, createMessageText(messageBarPayload));
|
|
123
|
+
return this.batchServiceProxy.createBatch(action.facilityWithGuid.guid, action.batchCommand).pipe(tap({
|
|
124
|
+
next: (newGuests) => {
|
|
125
|
+
const displayNewGuestInTable = this.isGuestCreatedFromSelectedFacility(newGuests.data[0], action.facilityWithGuid.guid);
|
|
126
|
+
this.messageBarService.success(displayNewGuestInTable ? Localization.entity_success : Localization.entity_success_not_currently_visible, createMessageText(messageBarPayload));
|
|
127
|
+
if (displayNewGuestInTable) {
|
|
128
|
+
const newBatch = this.convertGuestsToTableData(newGuests.data);
|
|
129
|
+
markEntitiesAsChanged([newBatch], RowOperation.Insert);
|
|
130
|
+
markEntitiesAsChanged(newBatch.entities, RowOperation.Insert);
|
|
131
|
+
const displayedGuests = ctx.getState().displayed;
|
|
132
|
+
displayedGuests.unshift(...newBatch.entities);
|
|
133
|
+
displayedGuests.unshift(newBatch);
|
|
134
|
+
ctx.patchState({
|
|
135
|
+
displayed: [...displayedGuests],
|
|
136
|
+
counter: ctx.getState().counter + 1,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
},
|
|
140
|
+
error: (e) => {
|
|
141
|
+
action.errorMessage = e.data.detail;
|
|
142
|
+
}
|
|
143
|
+
}));
|
|
144
|
+
}
|
|
145
|
+
onCreateBasicBatchAction(ctx, action) {
|
|
146
|
+
const messageBarPayload = {
|
|
147
|
+
entity: this.translate.instant(Localization.guest_group),
|
|
148
|
+
entityName: action.batchCommand.name,
|
|
149
|
+
action: lowerCaseFirstLetter(this.translate.instant(Localization.created)),
|
|
150
|
+
};
|
|
151
|
+
this.messageBarService.info(Localization.entity_in_progress, createMessageText(messageBarPayload));
|
|
152
|
+
return this.batchServiceProxy.createBasicBatch(action.facilityWithGuid.guid, action.batchCommand).pipe(tap({
|
|
153
|
+
next: (newGuests) => {
|
|
154
|
+
const displayNewGuestInTable = this.isGuestCreatedFromSelectedFacility(newGuests.data[0], action.facilityWithGuid.guid);
|
|
155
|
+
this.messageBarService.success(displayNewGuestInTable ? Localization.entity_success : Localization.entity_success_not_currently_visible, createMessageText(messageBarPayload));
|
|
156
|
+
if (displayNewGuestInTable) {
|
|
157
|
+
const newBatch = this.convertGuestsToTableData(newGuests.data);
|
|
158
|
+
markEntitiesAsChanged([newBatch], RowOperation.Insert);
|
|
159
|
+
markEntitiesAsChanged(newBatch.entities, RowOperation.Insert);
|
|
160
|
+
const displayedGuests = ctx.getState().displayed;
|
|
161
|
+
displayedGuests.unshift(...newBatch.entities);
|
|
162
|
+
displayedGuests.unshift(newBatch);
|
|
163
|
+
ctx.patchState({
|
|
164
|
+
displayed: [...displayedGuests],
|
|
165
|
+
counter: ctx.getState().counter + 1,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
},
|
|
169
|
+
error: (e) => {
|
|
170
|
+
action.errorMessage = e.data.detail;
|
|
171
|
+
}
|
|
172
|
+
}));
|
|
173
|
+
}
|
|
174
|
+
onUpdateGuestAction(ctx, action) {
|
|
175
|
+
const messageBarPayload = {
|
|
176
|
+
entity: this.translate.instant(Localization.guest),
|
|
177
|
+
entityName: `${action.guest.firstName} ${action.guest.lastName}`,
|
|
178
|
+
action: this.translate.instant(Localization.updated),
|
|
179
|
+
};
|
|
180
|
+
this.messageBarService.info(Localization.entity_in_progress, createMessageText(messageBarPayload));
|
|
181
|
+
return this.guestServiceProxy.updateGuest(action.guid, action.guest).pipe(tap({
|
|
182
|
+
next: (handled) => {
|
|
183
|
+
this.updateGuestInStore(ctx, handled.data, action.guid);
|
|
184
|
+
this.messageBarService.success(Localization.entity_success, createMessageText(messageBarPayload));
|
|
185
|
+
},
|
|
186
|
+
error: () => {
|
|
187
|
+
messageBarPayload.entity = lowerCaseFirstLetter(messageBarPayload.entity);
|
|
188
|
+
messageBarPayload.action = lowerCaseFirstLetter(this.translate.instant(Localization.update));
|
|
189
|
+
this.messageBarService.error(Localization.entity_failed, createMessageText(messageBarPayload));
|
|
190
|
+
}
|
|
191
|
+
}));
|
|
192
|
+
}
|
|
193
|
+
onUpdateGuestLocationAction(ctx, action) {
|
|
194
|
+
debugger;
|
|
195
|
+
const config = {
|
|
196
|
+
messages: [{ value: action.updateGuestLocationCommand.name, class: NotificationClass.body }],
|
|
197
|
+
command: this.translateService.instant(Localization.update_location)
|
|
198
|
+
};
|
|
199
|
+
const guest$ = this.guestServiceProxy.updateGuestLocation(action.guid, action.updateGuestLocationCommand);
|
|
200
|
+
return guest$.pipe(this.commandNotificationService.display(config));
|
|
201
|
+
}
|
|
202
|
+
onDeleteGuestAction(ctx, action) {
|
|
203
|
+
const interpolatedGuestName = action.guest.name.trim() === Localization.card_holder ?
|
|
204
|
+
this.translateService.instant(Localization.card_holder) : action.guest.name;
|
|
205
|
+
const messageBarPayload = {
|
|
206
|
+
entity: this.translate.instant(Localization.guest),
|
|
207
|
+
entityName: interpolatedGuestName,
|
|
208
|
+
action: this.translate.instant(Localization.deleted),
|
|
209
|
+
};
|
|
210
|
+
this.messageBarService.info(Localization.entity_in_progress, createMessageText(messageBarPayload));
|
|
211
|
+
return this.guestServiceProxy.deleteGuest(action.guest.guestID, action.guest.parkID, action.guid).pipe(tap(() => {
|
|
212
|
+
this.messageBarService.success(Localization.entity_success, createMessageText(messageBarPayload));
|
|
213
|
+
action.guest.deleted = 1;
|
|
214
|
+
this.deleteGuestFromStore(ctx, action.guest, action.guid);
|
|
215
|
+
}, () => {
|
|
216
|
+
messageBarPayload.entity = lowerCaseFirstLetter(messageBarPayload.entity);
|
|
217
|
+
messageBarPayload.action = lowerCaseFirstLetter(this.translate.instant(Localization.delete));
|
|
218
|
+
this.messageBarService.error(Localization.entity_failed, createMessageText(messageBarPayload));
|
|
219
|
+
}));
|
|
220
|
+
}
|
|
221
|
+
onCreateBasicGuestAction(ctx, action) {
|
|
222
|
+
const messageBarPayload = {
|
|
223
|
+
entity: this.translate.instant(Localization.guest),
|
|
224
|
+
entityName: `${action.guest.firstName} ${action.guest.lastName}`,
|
|
225
|
+
action: lowerCaseFirstLetter(this.translate.instant(Localization.created)),
|
|
226
|
+
};
|
|
227
|
+
this.messageBarService.info(Localization.entity_in_progress, createMessageText(messageBarPayload));
|
|
228
|
+
return this.guestServiceProxy.createBasicGuest(action.guid, action.guest).pipe(tap({
|
|
229
|
+
next: (handled) => {
|
|
230
|
+
const displayNewGuestInTable = this.isGuestCreatedFromSelectedFacility(handled.data, action.guid);
|
|
231
|
+
this.addGuestToStore(ctx, handled.data, displayNewGuestInTable);
|
|
232
|
+
this.messageBarService.success(displayNewGuestInTable ? Localization.entity_success : Localization.entity_success_not_currently_visible, createMessageText(messageBarPayload));
|
|
233
|
+
},
|
|
234
|
+
error: () => {
|
|
235
|
+
messageBarPayload.entity = lowerCaseFirstLetter(messageBarPayload.entity);
|
|
236
|
+
messageBarPayload.action = lowerCaseFirstLetter(this.translate.instant(Localization.create));
|
|
237
|
+
this.messageBarService.error(Localization.entity_failed, createMessageText(messageBarPayload));
|
|
238
|
+
}
|
|
239
|
+
}));
|
|
240
|
+
}
|
|
241
|
+
onUpdateBasicGuestAction(ctx, action) {
|
|
242
|
+
const messageBarPayload = {
|
|
243
|
+
entity: this.translate.instant(Localization.guest),
|
|
244
|
+
entityName: `${action.guest.firstName} ${action.guest.lastName}`,
|
|
245
|
+
action: this.translate.instant(Localization.updated),
|
|
246
|
+
};
|
|
247
|
+
this.messageBarService.info(Localization.entity_in_progress, createMessageText(messageBarPayload));
|
|
248
|
+
return this.guestServiceProxy.updateBasicGuest(action.guid, action.guest).pipe(tap({
|
|
249
|
+
next: (handled) => this.onUpdateBasicGuestNext(ctx, action, handled, messageBarPayload),
|
|
250
|
+
error: () => this.onUpdateBasicGuestError(messageBarPayload)
|
|
251
|
+
}));
|
|
252
|
+
}
|
|
253
|
+
onUpdateBasicGuestTempAction(ctx, action) {
|
|
254
|
+
const messageBarPayload = {
|
|
255
|
+
entity: this.translate.instant(Localization.guest),
|
|
256
|
+
entityName: `${action.guest.firstName} ${action.guest.lastName}`,
|
|
257
|
+
action: this.translate.instant(Localization.updated),
|
|
258
|
+
};
|
|
259
|
+
this.messageBarService.info(Localization.entity_in_progress, createMessageText(messageBarPayload));
|
|
260
|
+
return this.guestServiceProxy.updateBasicGuestTemp(action.guid, action.guest).pipe(tap({
|
|
261
|
+
next: (handled) => this.onUpdateBasicGuestNext(ctx, action, handled, messageBarPayload),
|
|
262
|
+
error: () => this.onUpdateBasicGuestError(messageBarPayload)
|
|
263
|
+
}));
|
|
264
|
+
}
|
|
265
|
+
onSendEmailToGuestAction(ctx, action) {
|
|
266
|
+
return this.guestServiceProxy.sendGuestEmail(action.guid, action.sendEmailCommand).pipe(tap({
|
|
267
|
+
next: () => this.messageBarService.success(Localization.email_sent_successfully),
|
|
268
|
+
error: () => this.messageBarService.error(Localization.email_sending_failed),
|
|
269
|
+
}));
|
|
270
|
+
}
|
|
271
|
+
onLoadGuestsByBatchId(ctx, action) {
|
|
272
|
+
const results$ = this.guestServiceProxy.getGuestsByBatchID(action.parkId, action.batchID, action.guid, action.guestsFilterDto);
|
|
273
|
+
return results$.pipe(tap((guests) => {
|
|
274
|
+
this.addGuestsByBatchIdToStore(ctx, action.batchID, guests.data);
|
|
275
|
+
}));
|
|
276
|
+
}
|
|
277
|
+
onLoadGuestsByBatchIdCancelledAction(ctx, action) {
|
|
278
|
+
const displayedGuestsBatches = ctx.getState().displayed;
|
|
279
|
+
const guestBatchIndex = displayedGuestsBatches.findIndex(guest => guest instanceof VGuestWithBatchDto && guest.batchID === action.batchId);
|
|
280
|
+
if (guestBatchIndex !== -1) {
|
|
281
|
+
const guestBatch = markEntityAsUnchanged(displayedGuestsBatches[guestBatchIndex]);
|
|
282
|
+
displayedGuestsBatches[guestBatchIndex] = Object.assign(new VGuestWithBatchDto(), guestBatch);
|
|
283
|
+
ctx.patchState({
|
|
284
|
+
displayed: [...displayedGuestsBatches]
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
onExpandGuestsByBatchIdAction(ctx, action) {
|
|
289
|
+
this.addGuestsByBatchIdToStore(ctx, action.batchID, action.guests);
|
|
290
|
+
}
|
|
291
|
+
onCollapsedGuestsByBatchIdAction(ctx, action) {
|
|
292
|
+
let displayedGusetBatches = ctx.getState().displayed;
|
|
293
|
+
const guestBatchIndex = displayedGusetBatches.findIndex(gb => gb.batchID === action.batchID);
|
|
294
|
+
if (guestBatchIndex !== -1) {
|
|
295
|
+
displayedGusetBatches = displayedGusetBatches.filter(entity => entity.batchID !== action.batchID || !entity.guestID);
|
|
296
|
+
ctx.patchState({
|
|
297
|
+
displayed: [...displayedGusetBatches],
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
onLoadGuestProfilesAction(ctx, action) {
|
|
302
|
+
const guestProfiles$ = this.guestServiceProxy.getProfiles(action.parkId, action.searchParamsDto?.maxResults, action.searchParamsDto?.searchTerm, action.searchParamsDto?.orderBy.column, action.searchParamsDto?.orderBy.orderDirection, action.guid);
|
|
303
|
+
return guestProfiles$.pipe(tap(profiles => {
|
|
304
|
+
ctx.patchState({
|
|
305
|
+
profiles: profiles.data,
|
|
306
|
+
});
|
|
307
|
+
}));
|
|
308
|
+
}
|
|
309
|
+
onClearGuestProfilesAction(ctx) {
|
|
310
|
+
ctx.patchState({
|
|
311
|
+
profiles: [],
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
async onSendGuestPassesToEmail(ctx, action) {
|
|
315
|
+
const data = {
|
|
316
|
+
modalTitle: this.translate.instant(Localization.send_stickers_to_email),
|
|
317
|
+
sendEmail: false,
|
|
318
|
+
sendEmailReqeust: await this.populateSendEmailRequest(action) // only version >= 8.1 support this feature
|
|
319
|
+
};
|
|
320
|
+
data.sendEmailReqeust.to = action.email;
|
|
321
|
+
ctx.dispatch(new SendEmailFromEntityAction(data.sendEmailReqeust));
|
|
322
|
+
}
|
|
323
|
+
onExportGuestsAction(ctx, action) {
|
|
324
|
+
const getGuests$ = this.guestServiceProxy.getGuests(action.parkId, action.guid, action.guestsFilterDto);
|
|
325
|
+
return getGuests$.pipe(tap({
|
|
326
|
+
next: (guestsWrapper) => {
|
|
327
|
+
const tableRows = [];
|
|
328
|
+
const guestWithBatchDtoList = guestsWrapper.data.entities;
|
|
329
|
+
guestWithBatchDtoList.forEach((guest) => {
|
|
330
|
+
tableRows.push([guest.name,
|
|
331
|
+
this.translate.instant(ProfileTypeText[ProfileType[guest.mType]]),
|
|
332
|
+
guest.mobile,
|
|
333
|
+
guest.carPlate,
|
|
334
|
+
this.exportFileService.getDateFieldValue(action.fileType, guest, 'validFromDate'),
|
|
335
|
+
this.exportFileService.getDateFieldValue(action.fileType, guest, 'validToDate'),
|
|
336
|
+
guest.companyName,
|
|
337
|
+
guest.subCompanyName,
|
|
338
|
+
this.parkerService.getHistoryItemAction(guest.location, null),
|
|
339
|
+
this.exportFileService.getDateFieldValue(action.fileType, guest, 'producedDate')]);
|
|
340
|
+
});
|
|
341
|
+
this.exportFileService.export(action.fileType, tableRows, action.columnsHeader, Localization.guests);
|
|
342
|
+
},
|
|
343
|
+
error: () => {
|
|
344
|
+
this.messageBarService.error(this.translateService.instant(this.L.failed_export_file));
|
|
345
|
+
}
|
|
346
|
+
}));
|
|
347
|
+
}
|
|
348
|
+
addGuestsByBatchIdToStore(ctx, batchID, guests) {
|
|
349
|
+
const displayedGusetBatches = ctx.getState().displayed;
|
|
350
|
+
const guestBatchIndex = displayedGusetBatches.findIndex(gb => gb.batchID === batchID);
|
|
351
|
+
if (guestBatchIndex !== -1) {
|
|
352
|
+
displayedGusetBatches[guestBatchIndex].entities = guests;
|
|
353
|
+
displayedGusetBatches.splice(guestBatchIndex + 1, 0, ...guests);
|
|
354
|
+
ctx.patchState({
|
|
355
|
+
displayed: [...displayedGusetBatches],
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
convertGuestsToTableData(guests) {
|
|
360
|
+
const batch = guests.find(g => g.batchID > 0 && g.guestID === null);
|
|
361
|
+
batch.isRowExpandable = true;
|
|
362
|
+
batch.entities = guests.filter(g => g.batchID !== null && g.guestID !== null);
|
|
363
|
+
return batch;
|
|
364
|
+
}
|
|
365
|
+
addGuestToStore(ctx, guest, displayNewGuestInTable) {
|
|
366
|
+
if (displayNewGuestInTable) {
|
|
367
|
+
const displayedGuests = ctx.getState().displayed;
|
|
368
|
+
markEntitiesAsChanged([guest], RowOperation.Insert);
|
|
369
|
+
displayedGuests.unshift(guest);
|
|
370
|
+
ctx.patchState({
|
|
371
|
+
displayed: [...displayedGuests],
|
|
372
|
+
counter: ctx.getState().counter + 1,
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
isGuestCreatedFromSelectedFacility(guest, guid) {
|
|
377
|
+
const selectedParkID = this.store.selectSnapshot(FacilityState.parkId);
|
|
378
|
+
const selectedGuid = this.store.selectSnapshot(FacilityState.guid);
|
|
379
|
+
return selectedParkID === guest.parkID && selectedGuid === guid;
|
|
380
|
+
}
|
|
381
|
+
getParantAndChildIndex(ctx, guestDto) {
|
|
382
|
+
const displayedGuests = ctx.getState().displayed;
|
|
383
|
+
// if I am children find my parent, after that find me
|
|
384
|
+
const parent = displayedGuests.findIndex(guest => guest.batchID === guestDto.batchID && guest.guestID === null);
|
|
385
|
+
const child = (displayedGuests[parent].entities || []).findIndex(guest => guest.guestID === guestDto.guestID);
|
|
386
|
+
return { parent, child };
|
|
387
|
+
}
|
|
388
|
+
updateGuestInStore(ctx, guest, guid) {
|
|
389
|
+
const displayedGuests = ctx.getState().displayed;
|
|
390
|
+
const guestIndex = this.getGuestIndex(displayedGuests, guest.guestID);
|
|
391
|
+
if (guestIndex !== -1) {
|
|
392
|
+
displayedGuests[guestIndex] = guest;
|
|
393
|
+
markEntitiesAsChanged([guest], RowOperation.Update);
|
|
394
|
+
}
|
|
395
|
+
if (this.isGuestChild(guest)) {
|
|
396
|
+
const { child, parent } = this.getParantAndChildIndex(ctx, guest);
|
|
397
|
+
if (parent !== -1) {
|
|
398
|
+
if (child !== -1) {
|
|
399
|
+
displayedGuests[parent].entities[child] = guest;
|
|
400
|
+
}
|
|
401
|
+
markEntitiesAsChanged([displayedGuests[parent]]);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
ctx.patchState({
|
|
405
|
+
displayed: [...displayedGuests],
|
|
406
|
+
});
|
|
407
|
+
}
|
|
408
|
+
deleteGuestFromStore(ctx, guest, guid) {
|
|
409
|
+
let counter = ctx.getState().counter;
|
|
410
|
+
const displayedGuests = ctx.getState().displayed;
|
|
411
|
+
const guestIndex = this.getGuestIndex(displayedGuests, guest.guestID);
|
|
412
|
+
if (guestIndex !== -1) {
|
|
413
|
+
displayedGuests.splice(guestIndex, 1);
|
|
414
|
+
markEntitiesAsChanged([guest], RowOperation.Delete);
|
|
415
|
+
}
|
|
416
|
+
if (this.isGuestChild(guest)) {
|
|
417
|
+
const { child, parent } = this.getParantAndChildIndex(ctx, guest);
|
|
418
|
+
if (parent !== -1) {
|
|
419
|
+
if (child !== -1) {
|
|
420
|
+
displayedGuests[parent].entities.splice(child, 1);
|
|
421
|
+
}
|
|
422
|
+
markEntitiesAsChanged([displayedGuests[parent]]);
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
else {
|
|
426
|
+
counter--;
|
|
427
|
+
}
|
|
428
|
+
ctx.patchState({
|
|
429
|
+
displayed: [...displayedGuests],
|
|
430
|
+
counter: counter,
|
|
431
|
+
});
|
|
432
|
+
}
|
|
433
|
+
async populateSendEmailRequest(action) {
|
|
434
|
+
let pdfPagesParametersList = [];
|
|
435
|
+
let guestEmailTemplate = '';
|
|
436
|
+
if (action.guest.entities && action.guest.entities.length > 0) {
|
|
437
|
+
pdfPagesParametersList = [];
|
|
438
|
+
action.guest.entities.forEach(guest => {
|
|
439
|
+
const paramList = this.getParameters(guest, action.facility);
|
|
440
|
+
pdfPagesParametersList.push(paramList);
|
|
441
|
+
});
|
|
442
|
+
guestEmailTemplate = action.guest.batchName;
|
|
443
|
+
}
|
|
444
|
+
else {
|
|
445
|
+
pdfPagesParametersList.push(this.getParameters(action.guest, action.facility));
|
|
446
|
+
guestEmailTemplate = action.guest.name;
|
|
447
|
+
}
|
|
448
|
+
const sendEmailRequest = new SendEmailRequestDto({
|
|
449
|
+
entity: new GuestEntityParams({
|
|
450
|
+
qrPlainText: action.guest.qrPlainText,
|
|
451
|
+
id: action.guest.guestID || action.guest.batchID,
|
|
452
|
+
qrCode: action.guest.qrCode
|
|
453
|
+
}),
|
|
454
|
+
to: action.email,
|
|
455
|
+
templateType: TemplateType.Guest,
|
|
456
|
+
pdfPagesParametersList,
|
|
457
|
+
pdfPagesParameters: null,
|
|
458
|
+
parameters: {
|
|
459
|
+
guestEmailTemplate,
|
|
460
|
+
}
|
|
461
|
+
});
|
|
462
|
+
return sendEmailRequest;
|
|
463
|
+
}
|
|
464
|
+
getParameters(guest, facility) {
|
|
465
|
+
const parameters = {
|
|
466
|
+
validFromDateTime: this.toDateString(guest.validFromDate),
|
|
467
|
+
validToDateTime: this.toDateString(guest.validToDate),
|
|
468
|
+
companyName: guest.companyName,
|
|
469
|
+
subCompanyName: guest.subCompanyName,
|
|
470
|
+
parkName: facility?.data?.name,
|
|
471
|
+
producedDateTime: this.toDateString(guest.producedDate),
|
|
472
|
+
id: guest.guestID,
|
|
473
|
+
firstName: guest.firstName,
|
|
474
|
+
lastName: guest.lastName,
|
|
475
|
+
plateId: guest.carPlate,
|
|
476
|
+
name: guest.name,
|
|
477
|
+
card: guest.credit,
|
|
478
|
+
address: getAddress(guest.city, guest.street),
|
|
479
|
+
qrCode: guest.qrCode,
|
|
480
|
+
guid: facility.guid,
|
|
481
|
+
parkId: facility.data.id,
|
|
482
|
+
qrPlainText: guest.qrPlainText
|
|
483
|
+
};
|
|
484
|
+
return parameters;
|
|
485
|
+
}
|
|
486
|
+
getGuestIndex(displayedGuests, guestId) {
|
|
487
|
+
return displayedGuests.findIndex(guest => guest.guestID === guestId);
|
|
488
|
+
}
|
|
489
|
+
onUpdateBasicGuestNext(ctx, action, handled, messageBarPayload) {
|
|
490
|
+
this.updateGuestInStore(ctx, handled.data, action.guid);
|
|
491
|
+
this.messageBarService.success(Localization.entity_success, createMessageText(messageBarPayload));
|
|
492
|
+
}
|
|
493
|
+
onUpdateBasicGuestError(messageBarPayload) {
|
|
494
|
+
messageBarPayload.entity = lowerCaseFirstLetter(messageBarPayload.entity);
|
|
495
|
+
messageBarPayload.action = lowerCaseFirstLetter(this.translate.instant(Localization.update));
|
|
496
|
+
this.messageBarService.error(Localization.entity_failed, createMessageText(messageBarPayload));
|
|
497
|
+
}
|
|
498
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GuestState, deps: [{ token: i1.Store }, { token: i2.Edge.GuestServiceProxy }, { token: i3.TranslateService }, { token: i2.Edge.BatchServiceProxy }, { token: i4.MessageBarService }, { token: i5.CommandNotificationService }, { token: i3.TranslateService }, { token: i6.TenantService }, { token: i7.ExportFileService }, { token: i8.ParkerService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
499
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GuestState }); }
|
|
500
|
+
};
|
|
501
|
+
__decorate([
|
|
502
|
+
Action(LoadGuestByIdAction, { cancelUncompleted: true })
|
|
503
|
+
], GuestState.prototype, "onLoadGuestByIdAction", null);
|
|
504
|
+
__decorate([
|
|
505
|
+
Action(ClearGuestAction, { cancelUncompleted: true })
|
|
506
|
+
], GuestState.prototype, "onClearGuestAction", null);
|
|
507
|
+
__decorate([
|
|
508
|
+
Action(LoadGuestsAction, { cancelUncompleted: true })
|
|
509
|
+
], GuestState.prototype, "onLoadGuestsAction", null);
|
|
510
|
+
__decorate([
|
|
511
|
+
Action(SetGuestsAction)
|
|
512
|
+
], GuestState.prototype, "onSetGuestsAction", null);
|
|
513
|
+
__decorate([
|
|
514
|
+
Action(ClearGuestsListAction)
|
|
515
|
+
], GuestState.prototype, "onClearGuestListAction", null);
|
|
516
|
+
__decorate([
|
|
517
|
+
Action(CreateGuestAction)
|
|
518
|
+
], GuestState.prototype, "onCreateGuestAction", null);
|
|
519
|
+
__decorate([
|
|
520
|
+
Action(CreateBatchAction)
|
|
521
|
+
], GuestState.prototype, "onCreateBatchAction", null);
|
|
522
|
+
__decorate([
|
|
523
|
+
Action(CreateBasicBatchAction)
|
|
524
|
+
], GuestState.prototype, "onCreateBasicBatchAction", null);
|
|
525
|
+
__decorate([
|
|
526
|
+
Action(UpdateGuestAction)
|
|
527
|
+
], GuestState.prototype, "onUpdateGuestAction", null);
|
|
528
|
+
__decorate([
|
|
529
|
+
Action(UpdateGuestLocationAction)
|
|
530
|
+
], GuestState.prototype, "onUpdateGuestLocationAction", null);
|
|
531
|
+
__decorate([
|
|
532
|
+
Action(DeleteGuestAction)
|
|
533
|
+
], GuestState.prototype, "onDeleteGuestAction", null);
|
|
534
|
+
__decorate([
|
|
535
|
+
Action(CreateBasicGuestAction)
|
|
536
|
+
], GuestState.prototype, "onCreateBasicGuestAction", null);
|
|
537
|
+
__decorate([
|
|
538
|
+
Action(UpdateBasicGuestAction)
|
|
539
|
+
], GuestState.prototype, "onUpdateBasicGuestAction", null);
|
|
540
|
+
__decorate([
|
|
541
|
+
Action(UpdateBasicGuestTempAction)
|
|
542
|
+
], GuestState.prototype, "onUpdateBasicGuestTempAction", null);
|
|
543
|
+
__decorate([
|
|
544
|
+
Action(SendEmailToGuest)
|
|
545
|
+
], GuestState.prototype, "onSendEmailToGuestAction", null);
|
|
546
|
+
__decorate([
|
|
547
|
+
Action(LoadGuestsByBatchIdAction, { cancelUncompleted: true })
|
|
548
|
+
], GuestState.prototype, "onLoadGuestsByBatchId", null);
|
|
549
|
+
__decorate([
|
|
550
|
+
Action(LoadGuestsByBatchIdCancelledAction, { cancelUncompleted: false })
|
|
551
|
+
], GuestState.prototype, "onLoadGuestsByBatchIdCancelledAction", null);
|
|
552
|
+
__decorate([
|
|
553
|
+
Action(ExpandGuestsByBatchIdAction)
|
|
554
|
+
], GuestState.prototype, "onExpandGuestsByBatchIdAction", null);
|
|
555
|
+
__decorate([
|
|
556
|
+
Action(CollapsedGuestsByBatchIdAction)
|
|
557
|
+
], GuestState.prototype, "onCollapsedGuestsByBatchIdAction", null);
|
|
558
|
+
__decorate([
|
|
559
|
+
Action(LoadGuestProfilesAction, { cancelUncompleted: true })
|
|
560
|
+
], GuestState.prototype, "onLoadGuestProfilesAction", null);
|
|
561
|
+
__decorate([
|
|
562
|
+
Action(ClearGuestProfilesAction)
|
|
563
|
+
], GuestState.prototype, "onClearGuestProfilesAction", null);
|
|
564
|
+
__decorate([
|
|
565
|
+
Action(SendGuestPassesToEmailAction)
|
|
566
|
+
], GuestState.prototype, "onSendGuestPassesToEmail", null);
|
|
567
|
+
__decorate([
|
|
568
|
+
Action(ExportGuestsAction, { cancelUncompleted: true })
|
|
569
|
+
], GuestState.prototype, "onExportGuestsAction", null);
|
|
570
|
+
__decorate([
|
|
571
|
+
Selector()
|
|
572
|
+
], GuestState, "guestCounter", null);
|
|
573
|
+
__decorate([
|
|
574
|
+
Selector()
|
|
575
|
+
], GuestState, "archivedGuests", null);
|
|
576
|
+
__decorate([
|
|
577
|
+
Selector()
|
|
578
|
+
], GuestState, "displayedGuests", null);
|
|
579
|
+
__decorate([
|
|
580
|
+
Selector()
|
|
581
|
+
], GuestState, "profiles", null);
|
|
582
|
+
__decorate([
|
|
583
|
+
Selector()
|
|
584
|
+
], GuestState, "selected", null);
|
|
585
|
+
GuestState = __decorate([
|
|
586
|
+
State({
|
|
587
|
+
name: 'guest',
|
|
588
|
+
defaults: {
|
|
589
|
+
archived: [],
|
|
590
|
+
displayed: [],
|
|
591
|
+
counter: 0,
|
|
592
|
+
guest: null,
|
|
593
|
+
profiles: [],
|
|
594
|
+
selected: null,
|
|
595
|
+
},
|
|
596
|
+
})
|
|
597
|
+
], GuestState);
|
|
598
|
+
export { GuestState };
|
|
599
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GuestState, decorators: [{
|
|
600
|
+
type: Injectable
|
|
601
|
+
}], ctorParameters: function () { return [{ type: i1.Store }, { type: i2.Edge.GuestServiceProxy }, { type: i3.TranslateService }, { type: i2.Edge.BatchServiceProxy }, { type: i4.MessageBarService }, { type: i5.CommandNotificationService }, { type: i3.TranslateService }, { type: i6.TenantService }, { type: i7.ExportFileService }, { type: i8.ParkerService }]; }, propDecorators: { onLoadGuestByIdAction: [], onClearGuestAction: [], onLoadGuestsAction: [], onSetGuestsAction: [], onClearGuestListAction: [], onCreateGuestAction: [], onCreateBatchAction: [], onCreateBasicBatchAction: [], onUpdateGuestAction: [], onUpdateGuestLocationAction: [], onDeleteGuestAction: [], onCreateBasicGuestAction: [], onUpdateBasicGuestAction: [], onUpdateBasicGuestTempAction: [], onSendEmailToGuestAction: [], onLoadGuestsByBatchId: [], onLoadGuestsByBatchIdCancelledAction: [], onExpandGuestsByBatchIdAction: [], onCollapsedGuestsByBatchIdAction: [], onLoadGuestProfilesAction: [], onClearGuestProfilesAction: [], onSendGuestPassesToEmail: [], onExportGuestsAction: [] } });
|
|
602
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3Vlc3Quc3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtc2hhcmVkLWxpYi9zcmMvbGlicmFyaWVzL21vZHVsZXMvZ3Vlc3QvZ3Vlc3Quc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBdUIsTUFBTSxhQUFhLENBQUM7QUFHM0UsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBS3JDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVELE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFHbEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxvQkFBb0IsRUFBRSxxQkFBcUIsRUFBRSxxQkFBcUIsRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDOUksT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFFakYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTNELE9BQU8sRUFDTCxnQkFBZ0IsRUFBRSx3QkFBd0IsRUFBRSxxQkFBcUIsRUFBRSw4QkFBOEIsRUFDakcsc0JBQXNCLEVBQUUsc0JBQXNCLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQ3ZHLDJCQUEyQixFQUFFLGtCQUFrQixFQUFFLG1CQUFtQixFQUFFLHVCQUF1QixFQUFFLGdCQUFnQixFQUMvRyx5QkFBeUIsRUFB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LENBQUM7R0FDVyxVQUFVLENBb21CdEI7U0FwbUJZLFVBQVU7NEZBQVYsVUFBVTtrQkFadEIsVUFBVTtxWUF1RFQscUJBQXFCLE1BVXJCLGtCQUFrQixNQU9sQixrQkFBa0IsTUFXbEIsaUJBQWlCLE1BT2pCLHNCQUFzQixNQVN0QixtQkFBbUIsTUFnQ25CLG1CQUFtQixNQW1DbkIsd0JBQXdCLE1BbUN4QixtQkFBbUIsTUErQm5CLDJCQUEyQixNQVkzQixtQkFBbUIsTUErQm5CLHdCQUF3QixNQWdDeEIsd0JBQXdCLE1BY3hCLDRCQUE0QixNQWM1Qix3QkFBd0IsTUFReEIscUJBQXFCLE1BUXJCLG9DQUFvQyxNQWdCcEMsNkJBQTZCLE1BSzdCLGdDQUFnQyxNQVloQyx5QkFBeUIsTUFZekIsMEJBQTBCLE1BT3BCLHdCQUF3QixNQVc5QixvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRlUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBBY3Rpb24sIFNlbGVjdG9yLCBTdGF0ZSwgU3RhdGVDb250ZXh0LCBTdG9yZSB9IGZyb20gJ0BuZ3hzL3N0b3JlJztcbmltcG9ydCB7IE1vbWVudCB9IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBNZXNzYWdlQmFyUGF5bG9hZCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvbWVzc2FnZS1iYXIvbWVzc2FnZS1iYXItdGV4dC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTWVzc2FnZUJhclNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL21lc3NhZ2UtYmFyL21lc3NhZ2UtYmFyLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29tbWFuZE5vdGlmaWNhdGlvbkNvbmZpZyB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvbm90aWZpY2F0aW9uL2NvbW1hbmQtbm90aWZpY2F0aW9uL2NvbW1hbmQtbm90aWZpY2F0aW9uLWNvbmZpZyc7XG5pbXBvcnQgeyBDb21tYW5kTm90aWZpY2F0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvbm90aWZpY2F0aW9uL2NvbW1hbmQtbm90aWZpY2F0aW9uL2NvbW1hbmQtbm90aWZpY2F0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uQ2xhc3MgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL25vdGlmaWNhdGlvbi9ub3RpZmljYXRpb24tY29uZmlnJztcbmltcG9ydCB7IExvY2FsaXphdGlvbiwgUHJvZmlsZVR5cGVUZXh0IH0gZnJvbSAnLi4vLi4vZW51bXMnO1xuaW1wb3J0IHsgQ2xvdWQsIEVkZ2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlLXByb3h5JztcbmltcG9ydCB7IEV4cG9ydEZpbGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZXhwb3J0LWZpbGUuc2VydmljZSc7XG5pbXBvcnQgeyBUZW5hbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdGVuYW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgY3JlYXRlTWVzc2FnZVRleHQsIGdldEFkZHJlc3MsIGxvd2VyQ2FzZUZpcnN0TGV0dGVyLCBtYXJrRW50aXRpZXNBc0NoYW5nZWQsIG1hcmtFbnRpdHlBc1VuY2hhbmdlZCwgUm93T3BlcmF0aW9uIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgU2VuZEVtYWlsRnJvbUVudGl0eUFjdGlvbiB9IGZyb20gJy4uL2VtYWlsLXNlcnZlci9lbWFpbC1zZXJ2ZXIuYWN0aW9ucyc7XG5pbXBvcnQgeyBGYWNpbGl0eVdpdGhHdWlkIH0gZnJvbSAnLi4vZmFjaWxpdHkvZmFjaWxpdHktd2l0aC1ndWlkLmludGVyZmFjZSc7XG5pbXBvcnQgeyBGYWNpbGl0eVN0YXRlIH0gZnJvbSAnLi4vZmFjaWxpdHkvZmFjaWxpdHkuc3RhdGUnO1xuaW1wb3J0IHsgUGFya2VyU2VydmljZSB9IGZyb20gJy4uL3Bhcmtlci9wYXJrZXIuc2VydmljZSc7XG5pbXBvcnQge1xuICBDbGVhckd1ZXN0QWN0aW9uLCBDbGVhckd1ZXN0UHJvZmlsZXNBY3Rpb24sIENsZWFyR3Vlc3RzTGlzdEFjdGlvbiwgQ29sbGFwc2VkR3Vlc3RzQnlCYXRjaElkQWN0aW9uLFxuICBDcmVhdGVCYXNpY0JhdGNoQWN0aW9uLCBDcmVhdGVCYXNpY0d1ZXN0QWN0aW9uLCBDcmVhdGVCYXRjaEFjdGlvbiwgQ3JlYXRlR3Vlc3RBY3Rpb24sIERlbGV0ZUd1ZXN0QWN0aW9uLFxuICBFeHBhbmRHdWVzdHNCeUJhdGNoSWRBY3Rpb24sIEV4cG9ydEd1ZXN0c0FjdGlvbiwgTG9hZEd1ZXN0QnlJZEFjdGlvbiwgTG9hZEd1ZXN0UHJvZmlsZXNBY3Rpb24sIExvYWRHdWVzdHNBY3Rpb24sXG4gIExvYWRHdWVzdHNCeUJhdGNoSWRBY3Rpb24sIExvYWRHdWVzdHNCeUJhdGNoSWRDYW5jZWxsZWRBY3Rpb24sIFNlbmRFbWFpbFRvR3Vlc3QsIFNlbmRHdWVzdFBhc3Nlc1RvRW1haWxBY3Rpb24sXG4gIFNldEd1ZXN0c0FjdGlvbiwgVXBkYXRlQmFzaWNHdWVzdEFjdGlvbiwgVXBkYXRlQmFzaWNHdWVzdFRlbXBBY3Rpb24sIFVwZGF0ZUd1ZXN0QWN0aW9uLCBVcGRhdGVHdWVzdExvY2F0aW9uQWN0aW9uXG59IGZyb20gJy4vZ3Vlc3QuYWN0aW9ucyc7XG5cbmltcG9ydCBHdWVzdEVudGl0eVBhcmFtcyA9IEVkZ2UuR3Vlc3RFbnRpdHlQYXJhbXM7XG5pbXBvcnQgR3Vlc3RQcm9maWxlRHRvID0gRWRnZS5HdWVzdFByb2ZpbGVEdG87XG5pbXBvcnQgSW50MzJIdHRwUmVzcG9uc2VEYXRhID0gRWRnZS5JbnQzMkh0dHBSZXNwb25zZURhdGE7XG5pbXBvcnQgUHJvYmxlbURldGFpbHNIdHRwUmVzcG9uc2VEYXRhID0gRWRnZS5Qcm9ibGVtRGV0YWlsc0h0dHBSZXNwb25zZURhdGE7XG5pbXBvcnQgUHJvZmlsZVR5cGUgPSBFZGdlLlByb2ZpbGVUeXBlO1xuaW1wb3J0IFZHdWVzdFdpdGhCYXRjaER0byA9IEVkZ2UuVkd1ZXN0V2l0aEJhdGNoRHRvO1xuaW1wb3J0IFZHdWVzdFdpdGhCYXRjaER0b0VudGl0eVdyYXBwZXJEdG9IdHRwUmVzcG9uc2VEYXRhID0gRWRnZS5WR3Vlc3RXaXRoQmF0Y2hEdG9FbnRpdHlXcmFwcGVyRHRvSHR0cFJlc3BvbnNlRGF0YTtcbmltcG9ydCBWR3Vlc3RXaXRoQmF0Y2hEdG9IdHRwUmVzcG9uc2VEYXRhID0gRWRnZS5WR3Vlc3RXaXRoQmF0Y2hEdG9IdHRwUmVzcG9uc2VEYXRhO1xuaW1wb3J0IFZHdWVzdFdpdGhCYXRjaER0b0lFbnVtZXJhYmxlSHR0cFJlc3BvbnNlRGF0YSA9IEVkZ2UuVkd1ZXN0V2l0aEJhdGNoRHRvSUVudW1lcmFibGVIdHRwUmVzcG9uc2VEYXRhO1xuaW1wb3J0IFNlbmRFbWFpbFJlcXVlc3REdG8gPSBDbG91ZC5TZW5kRW1haWxSZXF1ZXN0RHRvO1xuaW1wb3J0IFRlbXBsYXRlVHlwZSA9IENsb3VkLlRlbXBsYXRlVHlwZTtcblxuZXhwb3J0IGNsYXNzIFZHdWVzdFdpdGhCYXRjaFRhYmxlRGF0YSBleHRlbmRzIFZHdWVzdFdpdGhCYXRjaER0byB7XG4gIGVudGl0aWVzOiBWR3Vlc3RXaXRoQmF0Y2hEdG9bXVxufTtcblxuZXhwb3J0IGludGVyZmFjZSBHdWVzdFN0YXRlTW9kZWwge1xuICBhcmNoaXZlZDogVkd1ZXN0V2l0aEJhdGNoRHRvW107XG4gIGRpc3BsYXllZDogVkd1ZXN0V2l0aEJhdGNoRHRvW107XG4gIGNvdW50ZXI6IG51bWJlcjtcbiAgZ3Vlc3Q6IFZHdWVzdFdpdGhCYXRjaER0bztcbiAgcHJvZmlsZXM6IEd1ZXN0UHJvZmlsZUR0b1tdO1xuICBzZWxlY3RlZDogVkd1ZXN0V2l0aEJhdGNoRHRvO1xufVxuXG5ASW5qZWN0YWJsZSgpXG5AU3RhdGU8R3Vlc3RTdGF0ZU1vZGVsPih7XG4gIG5hbWU6ICdndWVzdCcsXG4gIGRlZmF1bHRzOiB7XG4gICAgYXJjaGl2ZWQ6IFtdLFxuICAgIGRpc3BsYXllZDogW10sXG4gICAgY291bnRlcjogMCxcbiAgICBndWVzdDogbnVsbCxcbiAgICBwcm9maWxlczogW10sXG4gICAgc2VsZWN0ZWQ6IG51bGwsXG4gIH0sXG59KVxuZXhwb3J0IGNsYXNzIEd1ZXN0U3RhdGUge1xuICBkYXRlUGlwZSA9IG5ldyBEYXRlUGlwZSgnZW4tVVMnKTtcbiAgTCA9IExvY2FsaXphdGlvbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHN0b3JlOiBTdG9yZSxcbiAgICBwcml2YXRlIGd1ZXN0U2VydmljZVByb3h5OiBFZGdlLkd1ZXN0U2VydmljZVByb3h5LFxuICAgIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgYmF0Y2hTZXJ2aWNlUHJveHk6IEVkZ2UuQmF0Y2hTZXJ2aWNlUHJveHksXG4gICAgcHJpdmF0ZSBtZXNzYWdlQmFyU2VydmljZTogTWVzc2FnZUJhclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb21tYW5kTm90aWZpY2F0aW9uU2VydmljZTogQ29tbWFuZE5vdGlmaWNhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgdGVuYW50U2VydmljZTogVGVuYW50U2VydmljZSxcbiAgICBwcml2YXRlIGV4cG9ydEZpbGVTZXJ2aWNlOiBFeHBvcnRGaWxlU2VydmljZSxcbiAgICBwcml2YXRlIHBhcmtlclNlcnZpY2U6IFBhcmtlclNlcnZpY2UpIHtcbiAgfVxuXG4gIEBTZWxlY3RvcigpXG4gIHB1YmxpYyBzdGF0aWMgZ3Vlc3RDb3VudGVyKHN0YXRlOiBHdWVzdFN0YXRlTW9kZWwpOiBudW1iZXIge1xuICAgIHJldHVybiBzdGF0ZS5jb3VudGVyO1xuICB9XG5cbiAgQFNlbGVjdG9yKClcbiAgcHVibGljIHN0YXRpYyBhcmNoaXZlZEd1ZXN0cyhzdGF0ZTogR3Vlc3RTdGF0ZU1vZGVsKTogVkd1ZXN0V2l0aEJhdGNoRHRvW10ge1xuICAgIHJldHVybiBzdGF0ZS5hcmNoaXZlZDtcbiAgfVxuXG4gIEBTZWxlY3RvcigpXG4gIHB1YmxpYyBzdGF0aWMgZGlzcGxheWVkR3Vlc3RzKHN0YXRlOiBHdWVzdFN0YXRlTW9kZWwpOiBWR3Vlc3RXaXRoQmF0Y2hEdG9bXSB7XG4gICAgcmV0dXJuIHN0YXRlLmRpc3BsYXllZDtcbiAgfVxuXG4gIEBTZWxlY3RvcigpXG4gIHB1YmxpYyBzdGF0aWMgcHJvZmlsZXMoc3RhdGU6IEd1ZXN0U3RhdGVNb2RlbCk6IEd1ZXN0UHJvZmlsZUR0b1tdIHtcbiAgICByZXR1cm4gc3RhdGUucHJvZmlsZXM7XG4gIH1cblxuICBAU2VsZWN0b3IoKVxuICBwdWJsaWMgc3RhdGljIHNlbGVjdGVkKHN0YXRlOiBHdWVzdFN0YXRlTW9kZWwpOiBWR3Vlc3RXaXRoQmF0Y2hEdG8ge1xuICAgIHJldHVybiBzdGF0ZS5zZWxlY3RlZDtcbiAgfVxuXG4gIEBBY3Rpb24oTG9hZEd1ZXN0QnlJZEFjdGlvbiwgeyBjYW5jZWxVbmNvbXBsZXRlZDogdHJ1ZSB9KVxuICBvbkxvYWRHdWVzdEJ5SWRBY3Rpb24oY3R4OiBTdGF0ZUNvbnRleHQ8R3Vlc3RTdGF0ZU1vZGVsPiwgYWN0aW9uOiBMb2FkR3Vlc3RCeUlkQWN0aW9uKTogT2JzZXJ2YWJsZTxWR3Vlc3RXaXRoQmF0Y2hEdG9IdHRwUmVzcG9uc2VEYXRhPiB7XG4gICAgY29uc3QgZ2V0R3Vlc3QkID0gdGhpcy5ndWVzdFNlcnZpY2VQcm94eS5nZXRHdWVzdEJ5SWQoYWN0aW9uLmd1ZXN0SWQsIGFjdGlvbi5wYXJrSWQsIGFjdGlvbi5ndWlkKTtcbiAgICByZXR1cm4gZ2V0R3Vlc3QkLnBpcGUodGFwKGd1ZXN0ID0+IHtcbiAgICAgIGN0eC5wYXRjaFN0YXRlKHtcbiAgICAgICAgc2VsZWN0ZWQ6IGd1ZXN0LmRhdGFcbiAgICAgIH0pO1xuICAgIH0pKTtcbiAgfVxuXG4gIEBBY3Rpb24oQ2xlYXJHdWVzdEFjdGlvbiwgeyBjYW5jZWxVbmNvbXBsZXRlZDogdHJ1ZSB9KVxuICBvbkNsZWFyR3Vlc3RBY3Rpb24oY3R4OiBTdGF0ZUNvbnRleHQ8Q2xlYXJHdWVzdEFjdGlvbj4pOiB2b2lkIHtcbiAgICBjdHgucGF0Y2hTdGF0ZSh7XG4gICAgICBzZWxlY3RlZDogbnVsbFxuICAgIH0pO1xuICB9XG5cbiAgQEFjdGlvbihMb2FkR3Vlc3RzQWN0aW9uLCB7IGNhbmNlbFVuY29tcGxldGVkOiB0cnVlIH0pXG4gIG9uTG9hZEd1ZXN0c0FjdGlvbihjdHg6IFN0YXRlQ29udGV4dDxHdWVzdFN0YXRlTW9kZWw+LCBhY3Rpb246IExvYWRHdWVzdHNBY3Rpb24pOiBPYnNlcnZhYmxlPFZHdWVzdFdpdGhCYXRjaER0b0VudGl0eVdyYXBwZXJEdG9IdHRwUmVzcG9uc2VEYXRhPiB7XG4gICAgY29uc3QgZ2V0R3Vlc3RzJCA9IHRoaXMuZ3Vlc3RTZXJ2aWNlUHJveHkuZ2V0R3Vlc3RzKGFjdGlvbi5wYXJrSWQsIGFjdGlvbi5ndWlkLCBhY3Rpb24uZ3Vlc3RzRmlsdGVyRHRvKTtcbiAgICByZXR1cm4gZ2V0R3Vlc3RzJC5waXBlKHRhcCgoZ3Vlc3RzV3JhcHBlcjogVkd1ZXN0V2l0aEJhdGNoRHRvRW50aXR5V3JhcHBlckR0b0h0dHBSZXNwb25zZURhdGEpID0+IHtcbiAgICAgIGN0eC5wYXRjaFN0YXRlKHtcbiAgICAgICAgYXJjaGl2ZWQ6IGd1ZXN0c1dyYXBwZXIuZGF0YS5lbnRpdGllcyxcbiAgICAgICAgY291bnRlcjogZ3Vlc3RzV3JhcHBlci5kYXRhLmNvdW50ZXIsXG4gICAgICB9KTtcbiAgICB9KSk7XG4gIH1cblxuICBAQWN0aW9uKFNldEd1ZXN0c0FjdGlvbilcbiAgb25TZXRHdWVzdHNBY3Rpb24oY3R4OiBTdGF0ZUNvbnRleHQ8R3Vlc3RTdGF0ZU1vZGVsPiwgYWN0aW9uOiBTZXRHdWVzdHNBY3Rpb24pIHtcbiAgICBjdHgucGF0Y2hTdGF0ZSh7XG4gICAgICBkaXNwbGF5ZWQ6IGFjdGlvbi5ndWVzdHMgfHwgW10sXG4gICAgfSk7XG4gIH1cblxuICBAQWN0aW9uKENsZWFyR3Vlc3RzTGlzdEFjdGlvbilcbiAgb25DbGVhckd1ZXN0TGlzdEFjdGlvbihjdHg6IFN0YXRlQ29udGV4dDxHdWVzdFN0YXRlTW9kZWw+KSB7XG4gICAgY3R4LnBhdGNoU3RhdGUoe1xuICAgICAgYXJjaGl2ZWQ6IFtdLFxuICAgICAgZGlzcGxheWVkOiBbXSxcbiAgICAgIGNvdW50ZXI6IDAsXG4gICAgfSk7XG4gIH1cblxuICBAQWN0aW9uKENyZWF0ZUd1ZXN0QWN0aW9uKVxuICBvbkNyZWF0ZUd1ZXN0QWN0aW9uKGN0eDogU3RhdGVDb250ZXh0PEd1ZXN0U3RhdGVNb2RlbD4sIGFjdGlvbjogQ3JlYXRlR3Vlc3RBY3Rpb24pOiBPYnNlcnZhYmxlPFZHdWVzdFdpdGhCYXRjaER0b0h0dHBSZXNwb25zZURhdGE+IHtcbiAgICBjb25zdCBtZXNzYWdlQmFyUGF5bG9hZDogTWVzc2FnZUJhclBheWxvYWQgPSB7XG4gICAgICBlbnRpdHk6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoTG9jYWxpemF0aW9uLmd1ZXN0KSxcbiAgICAgIGVudGl0eU5hbWU6IGAke2FjdGlvbi5ndWVzdC5maXJzdE5hbWV9ICR7YWN0aW9uLmd1ZXN0Lmxhc3ROYW1lfWAsXG4gICAgICBhY3Rpb246IGxvd2VyQ2FzZUZpcnN0TGV0dGVyKHRoaXMudHJhbnNsYXRlLmluc3RhbnQoTG9jYWxpemF0aW9uLmNyZWF0ZWQpKSxcbiAgICB9O1xuICAgIHRoaXMubWVzc2FnZUJhclNlcnZpY2UuaW5mbyhMb2NhbGl6YXRpb24uZW50aXR5X2luX3Byb2dyZXNzLCBjcmVhdGVNZXNzYWdlVGV4dChtZXNzYWdlQmFyUGF5bG9hZCkpO1xuICAgIHJldHVybiB0aGlzLmd1ZXN0U2VydmljZVByb3h5LmNyZWF0ZUd1ZXN0KGFjdGlvbi5ndWlkLCBhY3Rpb24uZ3Vlc3QpLnBpcGUodGFwKHtcbiAgICAgIG5leHQ6IChoYW5kbGVkOiBWR3Vlc3RXaXRoQmF0Y2hEdG9IdHRwUmVzcG9uc2VEYXRhKSA9PiB7XG4gICAgICAgIGNvbnN0IGRpc3BsYXlOZXdHdWVzdEluVGFibGUgPSB0aGlzLmlzR3Vlc3RDcmVhdGVkRnJvbVNlbGVjdGVkRmFjaWxpdHkoaGFuZGxlZC5kYXRhLCBhY3Rpb24uZ3VpZCk7XG4gICAgICAgIHRoaXMuYWRkR3Vlc3RUb1N0b3JlKGN0eCwgaGFuZGxlZC5kYXRhLCBkaXNwbGF5TmV3R3Vlc3RJblRhYmxlKTtcbiAgICAgICAgdGhpcy5tZXNzYWdlQmFyU2VydmljZS5zdWNjZXNzKFxuICAgICAgICAgIGRpc3BsYXlOZXdHdWVzdEluVGFibGUgPyBMb2NhbGl6YXRpb24uZW50aXR5X3N1Y2Nlc3MgOiBMb2NhbGl6YXRpb24uZW50aXR5X3N1Y2Nlc3Nfbm90X2N1cnJlbnRseV92aXNpYmxlLFxuICAgICAgICAgIGNyZWF0ZU1lc3NhZ2VUZXh0KG1lc3NhZ2VCYXJQYXlsb2FkKVxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIG1lc3NhZ2VCYXJQYXlsb2FkLmVudGl0eSA9IGxvd2VyQ2FzZUZpcnN0TGV0dGVyKFxuICAgICAgICAgIG1lc3NhZ2VCYXJQYXlsb2FkLmVudGl0eVxuICAgICAgICApO1xuICAgICAgICBtZXNzYWdlQmFyUGF5bG9hZC5hY3Rpb24gPSBsb3dlckNhc2VGaXJzdExldHRlcihcbiAgICAgICAgICB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KExvY2FsaXphdGlvbi5jcmVhdGUpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubWVzc2FnZUJhclNlcnZpY2UuZXJyb3IoXG4gICAgICAgICAgTG9jYWxpemF0aW9uLmVudGl0eV9mYWlsZWQsXG4gICAgICAgICAgY3JlYXRlTWVzc2FnZVRleHQobWVzc2FnZUJhclBheWxvYWQpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSkpO1xuICB9XG5cbiAgQEFjdGlvbihDcmVhdGVCYXRjaEFjdGlvbilcbiAgb25DcmVhdGVCYXRjaEFjdGlvbihjdHg6IFN0YXRlQ29udGV4dDxHdWVzdFN0YXRlTW9kZWw+LCBhY3Rpb246IENyZWF0ZUJhdGNoQWN0aW9uKTogT2JzZXJ2YWJsZTxWR3Vlc3RXaXRoQmF0Y2hEdG9JRW51bWVyYWJsZUh0dHBSZXNwb25zZURhdGE+IHtcbiAgICBjb25zdCBtZXNzYWdlQmFyUGF5bG9hZDogTWVzc2FnZUJhclBheWxvYWQgPSB7XG4gICAgICBlbnRpdHk6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoTG9jYWxpemF0aW9uLmd1ZXN0X2dyb3VwKSxcbiAgICAgIGVudGl0eU5hbWU6IGFjdGlvbi5iYXRjaENvbW1hbmQubmFtZSxcbiAgICAgIGFjdGlvbjogbG93ZXJDYXNlRmlyc3RMZXR0ZXIodGhpcy50cmFuc2xhdGUuaW5zdGFudChMb2NhbGl6YXRpb24uY3JlYXRlZCkpLFxuICAgIH07XG4gICAgdGhpcy5tZXNzYWdlQmFyU2VydmljZS5pbmZvKExvY2FsaXphdGlvbi5lbnRpdHlfaW5fcHJvZ3Jlc3MsIGNyZWF0ZU1lc3NhZ2VUZXh0KG1lc3NhZ2VCYXJQYXlsb2FkKSk7XG4gICAgcmV0dXJuIHRoaXMuYmF0Y2hTZXJ2aWNlUHJveHkuY3JlYXRlQmF0Y2goYWN0aW9uLmZhY2lsaXR5V2l0aEd1aWQuZ3VpZCwgYWN0aW9uLmJhdGNoQ29tbWFuZCkucGlwZSh0YXAoe1xuICAgICAgbmV4dDogKG5ld0d1ZXN0czogVkd1ZXN0V2l0aEJhdGNoRHRvSUVudW1lcmFibGVIdHRwUmVzcG9uc2VEYXRhKSA9PiB7XG4gICAgICAgIGNvbnN0IGRpc3BsYXlOZXdHdWVzdEluVGFibGUgPSB0aGlzLmlzR3Vlc3RDcmVhdGVkRnJvbVNlbGVjdGVkRmFjaWxpdHkobmV3R3Vlc3RzLmRhdGFbMF0sIGFjdGlvbi5mYWNpbGl0eVdpdGhHdWlkLmd1aWQpO1xuICAgICAgICB0aGlzLm1lc3NhZ2VCYXJTZXJ2aWNlLnN1Y2Nlc3MoXG4gICAgICAgICAgZGlzcGxheU5ld0d1ZXN0SW5UYWJsZSA/IExvY2FsaXphdGlvbi5lbnRpdHlfc3VjY2VzcyA6IExvY2FsaXphdGlvbi5lbnRpdHlfc3VjY2Vzc19ub3RfY3VycmVudGx5X3Zpc2libGUsXG4gICAgICAgICAgY3JlYXRlTWVzc2FnZVRleHQobWVzc2FnZUJhclBheWxvYWQpXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGRpc3BsYXlOZXdHdWVzdEluVGFibGUpIHtcbiAgICAgICAgICBjb25zdCBuZXdCYXRjaCA9IHRoaXMuY29udmVydEd1ZXN0c1RvVGFibGVEYXRhKG5ld0d1ZXN0cy5kYXRhKTtcbiAgICAgICAgICBtYXJrRW50aXRpZXNBc0NoYW5nZWQoW25ld0JhdGNoXSwgUm93T3BlcmF0aW9uLkluc2VydCk7XG4gICAgICAgICAgbWFya0VudGl0aWVzQXNDaGFuZ2VkKG5ld0JhdGNoLmVudGl0aWVzLCBSb3dPcGVyYXRpb24uSW5zZXJ0KTtcbiAgICAgICAgICBjb25zdCBkaXNwbGF5ZWRHdWVzdHMgPSBjdHguZ2V0U3RhdGUoKS5kaXNwbGF5ZWQ7XG4gICAgICAgICAgZGlzcGxheWVkR3Vlc3RzLnVuc2hpZnQoLi4ubmV3QmF0Y2guZW50aXRpZXMpO1xuICAgICAgICAgIGRpc3BsYXllZEd1ZXN0cy51bnNoaWZ0KG5ld0JhdGNoKTtcbiAgICAgICAgICBjdHgucGF0Y2hTdGF0ZSh7XG4gICAgICAgICAgICBkaXNwbGF5ZWQ6IFsuLi5kaXNwbGF5ZWRHdWVzdHNdLFxuICAgICAgICAgICAgY291bnRlcjogY3R4LmdldFN0YXRlKCkuY291bnRlciArIDEsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGU6IFByb2JsZW1EZXRhaWxzSHR0cFJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICBhY3Rpb24uZXJyb3JNZXNzYWdlID0gZS5kYXRhLmRldGFpbDtcbiAgICAgIH1cbiAgICB9KSk7XG4gIH1cblxuICBAQWN0aW9uKENyZWF0ZUJhc2ljQmF0Y2hBY3Rpb24pXG4gIG9uQ3JlYXRlQmFzaWNCYXRjaEFjdGlvbihjdHg6IFN0YXRlQ29udGV4dDxHdWVzdFN0YXRlTW9kZWw+LCBhY3Rpb246IENyZWF0ZUJhc2ljQmF0Y2hBY3Rpb24pOiBPYnNlcnZhYmxlPFZHdWVzdFdpdGhCYXRjaER0b0lFbnVtZXJhYmxlSHR0cFJlc3BvbnNlRGF0YT4ge1xuICAgIGNvbnN0IG1lc3NhZ2VCYXJQYXlsb2FkOiBNZXNzYWdlQmFyUGF5bG9hZCA9IHtcbiAgICAgIGVudGl0eTogdGhpcy50cmFuc2xhdGUuaW5zdGFudChMb2NhbGl6YXRpb24uZ3Vlc3RfZ3JvdXApLFxuICAgICAgZW50aXR5TmFtZTogYWN0aW9uLmJhdGNoQ29tbWFuZC5uYW1lLFxuICAgICAgYWN0aW9uOiBsb3dlckNhc2VGaXJzdExldHRlcih0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KExvY2FsaXphdGlvbi5jcmVhdGVkKSksXG4gICAgfTtcbiAgICB0aGlzLm1lc3NhZ2VCYXJTZXJ2aWNlLmluZm8oTG9jYWxpemF0aW9uLmVudGl0eV9pbl9wcm9ncmVzcywgY3JlYXRlTWVzc2FnZVRleHQobWVzc2FnZUJhclBheWxvYWQpKTtcbiAgICByZXR1cm4gdGhpcy5iYXRjaFNlcnZpY2VQcm94eS5jcmVhdGVCYXNpY0JhdGNoKGFjdGlvbi5mYWNpbGl0eVdpdGhHdWlkLmd1aWQsIGFjdGlvbi5iYXRjaENvbW1hbmQpLnBpcGUodGFwKHtcbiAgICAgIG5leHQ6IChuZXdHdWVzdHM6IFZHdWVzdFdpdGhCYXRjaER0b0lFbnVtZXJhYmxlSHR0cFJlc3BvbnNlRGF0YSkgPT4ge1xuICAgICAgICBjb25zdCBkaXNwbGF5TmV3R3Vlc3RJblRhYmxlID0gdGhpcy5pc0d1ZXN0Q3JlYXRlZEZyb21TZWxlY3RlZEZhY2lsaXR5KG5ld0d1ZXN0cy5kYXRhWzBdLCBhY3Rpb24uZmFjaWxpdHlXaXRoR3VpZC5ndWlkKTtcbiAgICAgICAgdGhpcy5tZXNzYWdlQmFyU2VydmljZS5zdWNjZXNzKFxuICAgICAgICAgIGRpc3BsYXlOZXdHdWVzdEluVGFibGUgPyBMb2NhbGl6YXRpb24uZW50aXR5X3N1Y2Nlc3MgOiBMb2NhbGl6YXRpb24uZW50aXR5X3N1Y2Nlc3Nfbm90X2N1cnJlbnRseV92aXNpYmxlLFxuICAgICAgICAgIGNyZWF0ZU1lc3NhZ2VUZXh0KG1lc3NhZ2VCYXJQYXlsb2FkKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChkaXNwbGF5TmV3R3Vlc3RJblRhYmxlKSB7XG4gICAgICAgICAgY29uc3QgbmV3QmF0Y2ggPSB0aGlzLmNvbnZlcnRHdWVzdHNUb1RhYmxlRGF0YShuZXdHdWVzdHMuZGF0YSk7XG4gICAgICAgICAgbWFya0VudGl0aWVzQXNDaGFuZ2VkKFtuZXdCYXRjaF0sIFJvd09wZXJhdGlvbi5JbnNlcnQpO1xuICAgICAgICAgIG1hcmtFbnRpdGllc0FzQ2hhbmdlZChuZXdCYXRjaC5lbnRpdGllcywgUm93T3BlcmF0aW9uLkluc2VydCk7XG4gICAgICAgICAgY29uc3QgZGlzcGxheWVkR3Vlc3RzID0gY3R4LmdldFN0YXRlKCkuZGlzcGxheWVkO1xuICAgICAgICAgIGRpc3BsYXllZEd1ZXN0cy51bnNoaWZ0KC4uLm5ld0JhdGNoLmVudGl0aWVzKTtcbiAgICAgICAgICBkaXNwbGF5ZWRHdWVzdHMudW5zaGlmdChuZXdCYXRjaCk7XG4gICAgICAgICAgY3R4LnBhdGNoU3RhdGUoe1xuICAgICAgICAgICAgZGlzcGxheWVkOiBbLi4uZGlzcGxheWVkR3Vlc3RzXSxcbiAgICAgICAgICAgIGNvdW50ZXI6IGN0eC5nZXRTdGF0ZSgpLmNvdW50ZXIgKyAxLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlOiBQcm9ibGVtRGV0YWlsc0h0dHBSZXNwb25zZURhdGEpID0+IHtcbiAgICAgICAgYWN0aW9uLmVycm9yTWVzc2FnZSA9IGUuZGF0YS5kZXRhaWw7XG4gICAgICB9XG4gICAgfSkpO1xuICB9XG5cbiAgQEFjdGlvbihVcGRhdGVHdWVzdEFjdGlvbilcbiAgb25VcGRhdGVHdWVzdEFjdGlvbihjdHg6IFN0YXRlQ29udGV4dDxHdWVzdFN0YXRlTW9kZWw+LCBhY3Rpb246IFVwZGF0ZUd1ZXN0QWN0aW9uKTogT2JzZXJ2YWJsZTxWR3Vlc3RXaXRoQmF0Y2hEdG9IdHRwUmVzcG9uc2VEYXRhPiB7XG4gICAgY29uc3QgbWVzc2FnZUJhclBheWxvYWQ6IE1lc3NhZ2VCYXJQYXlsb2FkID0ge1xuICAgICAgZW50aXR5OiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KExvY2FsaXphdGlvbi5ndWVzdCksXG4gICAgICBlbnRpdHlOYW1lOiBgJHthY3Rpb24uZ3Vlc3QuZmlyc3ROYW1lfSAke2FjdGlvbi5ndWVzdC5sYXN0TmFtZX1gLFxuICAgICAgYWN0aW9uOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KExvY2FsaXphdGlvbi51cGRhdGVkKSxcbiAgICB9O1xuICAgIHRoaXMubWVzc2FnZUJhclNlcnZpY2UuaW5mbyhMb2NhbGl6YXRpb24uZW50aXR5X2luX3Byb2dyZXNzLCBjcmVhdGVNZXNzYWdlVGV4dChtZXNzYWdlQmFyUGF5bG9hZCkpO1xuICAgIHJldHVybiB0aGlzLmd1ZXN0U2VydmljZVByb3h5LnVwZGF0ZUd1ZXN0KGFjdGlvbi5ndWlkLCBhY3Rpb24uZ3Vlc3QpLnBpcGUodGFwKHtcbiAgICAgIG5leHQ6IChoYW5kbGVkOiBWR3Vlc3RXaXRoQmF0Y2hEdG9IdHRwUmVzcG9uc2VEYXRhKSA9PiB7XG4gICAgICAgIHRoaXMudXBkYXRlR3Vlc3RJblN0b3JlKGN0eCwgaGFuZGxlZC5kYXRhLCBhY3Rpb24uZ3VpZCk7XG4gICAgICAgIHRoaXMubWVzc2FnZUJhclNlcnZpY2Uuc3VjY2VzcyhcbiAgICAgICAgICBMb2NhbGl6YXRpb24uZW50aXR5X3N1Y2Nlc3MsXG4gICAgICAgICAgY3JlYXRlTWVzc2FnZVRleHQobWVzc2FnZUJhclBheWxvYWQpXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgbWVzc2FnZUJhclBheWxvYWQuZW50aXR5ID0gbG93ZXJDYXNlRmlyc3RMZXR0ZXIoXG4gICAgICAgICAgbWVzc2FnZUJhclBheWxvYWQuZW50aXR5XG4gICAgICAgICk7XG4gICAgICAgIG1lc3NhZ2VCYXJQYXlsb2FkLmFjdGlvbiA9IGxvd2VyQ2FzZUZpcnN0TGV0dGVyKFxuICAgICAgICAgIHRoaXMudHJhbnNsYXRlLmluc3RhbnQoTG9jYWxpemF0aW9uLnVwZGF0ZSlcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5tZXNzYWdlQmFyU2VydmljZS5lcnJvcihcbiAgICAgICAgICBMb2NhbGl6YXRpb24uZW50aXR5X2ZhaWxlZCxcbiAgICAgICAgICBjcmVhdGVNZXNzYWdlVGV4dChtZXNzYWdlQmFyUGF5bG9hZClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KSk7XG4gIH1cblxuICBAQWN0aW9uKFVwZGF0ZUd1ZXN0TG9jYXRpb25BY3Rpb24pXG4gIG9uVXBkYXRlR3Vlc3RMb2NhdGlvbkFjdGlvbihjdHg6IFN0YXRlQ29udGV4dDxHdWVzdFN0YXRlTW9kZWw+LCBhY3Rpb246IFVwZGF0ZUd1ZXN0TG9jYXRpb25BY3Rpb24pOiBPYnNlcnZhYmxlPFZHdWVzdFdpdGhCYXRjaER0b0h0dHBSZXNwb25zZURhdGE+IHtcbiAgICBkZWJ1Z2dlcjtcbiAgICBjb25zdCBjb25maWc6IENvbW1hbmROb3RpZmljYXRpb25Db25maWcgPSB7XG4gICAgICBtZXNzYWdlczogW3sgdmFsdWU6IGFjdGlvbi51cGRhdGVHdWVzdExvY2F0aW9uQ29tbWFuZC5uYW1lLCBjbGFzczogTm90aWZpY2F0aW9uQ2xhc3MuYm9keSB9XSxcbiAgICAgIGNvbW1hbmQ6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KExvY2FsaXphdGlvbi51cGRhdGVfbG9jYXRpb24pXG4gICAgfTtcblxuICAgIGNvbnN0IGd1ZXN0JCA9IHRoaXMuZ3Vlc3RTZXJ2aWNlUHJveHkudXBkYXRlR3Vlc3RMb2NhdGlvbihhY3Rpb24uZ3VpZCwgYWN0aW9uLnVwZGF0ZUd1ZXN0TG9jYXRpb25Db21tYW5kKTtcbiAgICByZXR1cm4gZ3Vlc3QkLnBpcGUodGhpcy5jb21tYW5kTm90aWZpY2F0aW9uU2VydmljZS5kaXNwbGF5KGNvbmZpZykpO1xuICB9XG5cbiAgQEFjdGlvbihEZWxldGVHdWVzdEFjdGlvbilcbiAgb25EZWxldGVHdWVzdEFjdGlvbihjdHg6IFN0YXRlQ29udGV4dDxHdWVzdFN0YXRlTW9kZWw+LCBhY3Rpb246IERlbGV0ZUd1ZXN0QWN0aW9uKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBjb25zdCBpbnRlcnBvbGF0ZWRHdWVzdE5hbWUgPSBhY3Rpb24uZ3Vlc3QubmFtZS50cmltKCkgPT09IExvY2FsaXphdGlvbi5jYXJkX2hvbGRlciA/XG4gICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChMb2NhbGl6YXRpb24uY2FyZF9ob2xkZXIpIDogYWN0aW9uLmd1ZXN0Lm5hbWU7XG4gICAgY29uc3QgbWVzc2FnZUJhclBheWxvYWQ6IE1lc3NhZ2VCYXJQYXlsb2FkID0ge1xuICAgICAgZW50aXR5OiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KExvY2FsaXphdGlvbi5ndWVzdCksXG4gICAgICBlbnRpdHlOYW1lOiBpbnRlcnBvbGF0ZWRHdWVzdE5hbWUsXG4gICAgICBhY3Rpb246IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoTG9jYWxpemF0aW9uLmRlbGV0ZWQpLFxuICAgIH07XG4gICAgdGhpcy5tZXNzYWdlQmFyU2VydmljZS5pbmZvKExvY2FsaXphdGlvbi5lbnRpdHlfaW5fcHJvZ3Jlc3MsIGNyZWF0ZU1lc3NhZ2VUZXh0KG1lc3NhZ2VCYXJQYXlsb2FkKSk7XG4gICAgcmV0dXJuIHRoaXMuZ3Vlc3RTZXJ2aWNlUHJveHkuZGVsZXRlR3Vlc3QoYWN0aW9uLmd1ZXN0Lmd1ZXN0SUQsIGFjdGlvbi5ndWVzdC5wYXJrSUQsIGFjdGlvbi5ndWlkKS5waXBlKHRhcCgoKSA9PiB7XG4gICAgICB0aGlzLm1lc3NhZ2VCYXJTZXJ2aWNlLnN1Y2Nlc3MoXG4gICAgICAgIExvY2FsaXphdGlvbi5lbnRpdHlfc3VjY2VzcyxcbiAgICAgICAgY3JlYXRlTWVzc2FnZVRleHQobWVzc2FnZUJhclBheWxvYWQpXG4gICAgICApO1xuICAgICAgKGFjdGlvbi5ndWVzdCBhcyBWR3Vlc3RXaXRoQmF0Y2hEdG8pLmRlbGV0ZWQgPSAxO1xuICAgICAgdGhpcy5kZWxldGVHdWVzdEZyb21TdG9yZShjdHgsIGFjdGlvbi5ndWVzdCwgYWN0aW9uLmd1aWQpO1xuICAgIH0sICgpID0+IHtcbiAgICAgIG1lc3NhZ2VCYXJQYXlsb2FkLmVudGl0eSA9IGxvd2VyQ2FzZUZpcnN0TGV0dGVyKFxuICAgICAgICBtZXNzYWdlQmFyUGF5bG9hZC5lbnRpdHlcbiAgICAgICk7XG4gICAgICBtZXNzYWdlQmFyUGF5bG9hZC5hY3Rpb24gPSBsb3dlckNhc2VGaXJzdExldHRlcihcbiAgICAgICAgdGhpcy50cmFuc2xhdGUuaW5zdGFudChMb2NhbGl6YXRpb24uZGVsZXRlKVxuICAgICAgKTtcbiAgICAgIHRoaXMubWVzc2FnZUJhclNlcnZpY2UuZXJyb3IoXG4gICAgICAgIExvY2FsaXphdGlvbi5lbnRpdHlfZmFpbGVkLFxuICAgICAgICBjcmVhdGVNZXNzYWdlVGV4dChtZXNzYWdlQmFyUGF5bG9hZClcbiAgICAgICk7XG4gICAgfSkpO1xuICB9XG5cbiAgQEFjdGlvbihDcmVhdGVCYXNpY0d1ZXN0QWN0aW9uKVxuICBvbkNyZWF0ZUJhc2ljR3Vlc3RBY3Rpb24oY3R4OiBTdGF0ZUNvbnRleHQ8R3Vlc3RTdGF0ZU1vZGVsPiwgYWN0aW9uOiBDcmVhdGVCYXNpY0d1ZXN0QWN0aW9uKTogT2JzZXJ2YWJsZTxWR3Vlc3RXaXRoQmF0Y2hEdG9IdHRwUmVzcG9uc2VEYXRhPiB7XG4gICAgY29uc3QgbWVzc2FnZUJhclBheWxvYWQ6IE1lc3NhZ2VCYXJQYXlsb2FkID0ge1xuICAgICAgZW50aXR5OiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KExvY2FsaXphdGlvbi5ndWVzdCksXG4gICAgICBlbnRpdHlOYW1lOiBgJHthY3Rpb24uZ3Vlc3QuZmlyc3ROYW1lfSAke2FjdGlvbi5ndWVzdC5sYXN0TmFtZX1gLFxuICAgICAgYWN0aW9uOiBsb3dlckNhc2VGaXJzdExldHRlcih0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KExvY2FsaXphdGlvbi5jcmVhdGVkKSksXG4gICAgfTtcbiAgICB0aGlzLm1lc3NhZ2VCYXJTZXJ2aWNlLmluZm8oTG9jYWxpemF0aW9uLmVudGl0eV9pbl9wcm9ncmVzcywgY3JlYXRlTWVzc2FnZVRleHQobWVzc2FnZUJhclBheWxvYWQpKTtcbiAgICByZXR1cm4gdGhpcy5ndWVzdFNlcnZpY2VQcm94eS5jcmVhdGVCYXNpY0d1ZXN0KGFjdGlvbi5ndWlkLCBhY3Rpb24uZ3Vlc3QpLnBpcGUodGFwKHtcbiAgICAgIG5leHQ6IChoYW5kbGVkOiBWR3Vlc3RXaXRoQmF0Y2hEdG9IdHRwUmVzcG9uc2VEYXRhKSA9PiB7XG4gICAgICAgIGNvbnN0IGRpc3BsYXlOZXdHdWVzdEluVGFibGUgPSB0aGlzLmlzR3Vlc3RDcmVhdGVkRnJvbVNlbGVjdGVkRmFjaWxpdHkoaGFuZGxlZC5kYXRhLCBhY3Rpb24uZ3VpZCk7XG4gICAgICAgIHRoaXMuYWRkR3Vlc3RUb1N0b3JlKGN0eCwgaGFuZGxlZC5kYXRhLCBkaXNwbGF5TmV3R3Vlc3RJblRhYmxlKTtcbiAgICAgICAgdGhpcy5tZXNzYWdlQmFyU2VydmljZS5zdWNjZXNzKFxuICAgICAgICAgIGRpc3BsYXlOZXdHdWVzdEluVGFibGUgPyBMb2NhbGl6YXRpb24uZW50aXR5X3N1Y2Nlc3MgOiBMb2NhbGl6YXRpb24uZW50aXR5X3N1Y2Nlc3Nfbm90X2N1cnJlbnRseV92aXNpYmxlLFxuICAgICAgICAgIGNyZWF0ZU1lc3NhZ2VUZXh0KG1lc3NhZ2VCYXJQYXlsb2FkKVxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIG1lc3NhZ2VCYXJQYXlsb2FkLmVudGl0eSA9IGxvd2VyQ2FzZUZpcnN0TGV0dGVyKFxuICAgICAgICAgIG1lc3NhZ2VCYXJQYXlsb2FkLmVudGl0eVxuICAgICAgICApO1xuICAgICAgICBtZXNzYWdlQmFyUGF5bG9hZC5hY3Rpb24gPSBsb3dlckNhc2VGaXJzdExldHRlcihcbiAgICAgICAgICB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KExvY2FsaXphdGlvbi5jcmVhdGUpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubWVzc2FnZUJhclNlcnZpY2UuZXJyb3IoXG4gICAgICAgICAgTG9jYWxpemF0aW9uLmVudGl0eV9mYWlsZWQsXG4gICAgICAgICAgY3JlYXRlTWVzc2FnZVRleHQobWVzc2FnZUJhclBheWxvYWQpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSkpO1xuICB9XG5cbiAgQEFjdGlvbihVcGRhdGVCYXNpY0d1ZXN0QWN0aW9uKVxuICBvblVwZGF0ZUJhc2ljR3Vlc3RBY3Rpb24oY3R4OiBTdGF0ZUNvbnRleHQ8R3Vlc3RTdGF0ZU1vZGVsPiwgYWN0aW9uOiBVcGRhdGVCYXNpY0d1ZXN0QWN0aW9uKTogT2JzZXJ2YWJsZTxWR3Vlc3RXaXRoQmF0Y2hEdG9IdHRwUmVzcG9uc2VEYXRhPiB7XG4gICAgY29uc3QgbWVzc2FnZUJhclBheWxvYWQ6IE1lc3NhZ2VCYXJQYXlsb2FkID0ge1xuICAgICAgZW50aXR5OiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KExvY2FsaXphdGlvbi5ndWVzdCksXG4gICAgICBlbnRpdHlOYW1lOiBgJHthY3Rpb24uZ3Vlc3QuZmlyc3ROYW1lfSAke2FjdGlvbi5ndWVzdC5sYXN0TmFtZX1gLFxuICAgICAgYWN0aW9uOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KExvY2FsaXphdGlvbi51cGRhdGVkKSxcbiAgICB9O1xuICAgIHRoaXMubWVzc2FnZUJhclNlcnZpY2UuaW5mbyhMb2NhbGl6YXRpb24uZW50aXR5X2luX3Byb2dyZXNzLCBjcmVhdGVNZXNzYWdlVGV4dChtZXNzYWdlQmFyUGF5bG9hZCkpO1xuICAgIHJldHVybiB0aGlzLmd1ZXN0U2VydmljZVByb3h5LnVwZGF0ZUJhc2ljR3Vlc3QoYWN0aW9uLmd1aWQsIGFjdGlvbi5ndWVzdCkucGlwZSh0YXAoe1xuICAgICAgbmV4dDogKGhhbmRsZWQ6IFZHdWVzdFdpdGhCYXRjaER0b0h0dHBSZXNwb25zZURhdGEpID0+IHRoaXMub25VcGRhdGVCYXNpY0d1ZXN0TmV4dChjdHgsIGFjdGlvbiwgaGFuZGxlZCwgbWVzc2FnZUJhclBheWxvYWQpLFxuICAgICAgZXJyb3I6ICgpID0+IHRoaXMub25VcGRhdGVCYXNpY0d1ZXN0RXJyb3IobWVzc2FnZUJhclBheWxvYWQpXG4gICAgfSkpO1xuICB9XG5cbiAgQEFjdGlvbihVcGRhdGVCYXNpY0d1ZXN0VGVtcEFjdGlvbilcbiAgb25VcGRhdGVCYXNpY0d1ZXN0VGVtcEFjdGlvbihjdHg6IFN0YXRlQ29udGV4dDxHdWVzdFN0YXRlTW9kZWw+LCBhY3Rpb246IFVwZGF0ZUJhc2ljR3Vlc3RBY3Rpb24pOiBPYnNlcnZhYmxlPFZHdWVzdFdpdGhCYXRjaER0b0h0dHBSZXNwb25zZURhdGE+IHtcbiAgICBjb25zdCBtZXNzYWdlQmFyUGF5bG9hZDogTWVzc2FnZUJhclBheWxvYWQgPSB7XG4gICAgICBlbnRpdHk6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoTG9jYWxpemF0aW9uLmd1ZXN0KSxcbiAgICAgIGVudGl0eU5hbWU6IGAke2FjdGlvbi5ndWVzdC5maXJzdE5hbWV9ICR7YWN0aW9uLmd1ZXN0Lmxhc3ROYW1lfWAsXG4gICAgICBhY3Rpb246IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoTG9jYWxpemF0aW9uLnVwZGF0ZWQpLFxuICAgIH07XG4gICAgdGhpcy5tZXNzYWdlQmFyU2VydmljZS5pbmZvKExvY2FsaXphdGlvbi5lbnRpdHlfaW5fcHJvZ3Jlc3MsIGNyZWF0ZU1lc3NhZ2VUZXh0KG1lc3NhZ2VCYXJQYXlsb2FkKSk7XG4gICAgcmV0dXJuIHRoaXMuZ3Vlc3RTZXJ2aWNlUHJveHkudXBkYXRlQmFzaWNHdWVzdFRlbXAoYWN0aW9uLmd1aWQsIGFjdGlvbi5ndWVzdCkucGlwZSh0YXAoe1xuICAgICAgbmV4dDogKGhhbmRsZWQ6IFZHdWVzdFdpdGhCYXRjaER0b0h0dHBSZXNwb25zZURhdGEpID0+IHRoaXMub25VcGRhdGVCYXNpY0d1ZXN0TmV4dChjdHgsIGFjdGlvbiwgaGFuZGxlZCwgbWVzc2FnZUJhclBheWxvYWQpLFxuICAgICAgZXJyb3I6ICgpID0+IHRoaXMub25VcGRhdGVCYXNpY0d1ZXN0RXJyb3IobWVzc2FnZUJhclBheWxvYWQpXG4gICAgfSkpO1xuICB9XG5cbiAgQEFjdGlvbihTZW5kRW1haWxUb0d1ZXN0KVxuICBvblNlbmRFbWFpbFRvR3Vlc3RBY3Rpb24oY3R4OiBTdGF0ZUNvbnRleHQ8R3Vlc3RTdGF0ZU1vZGVsPiwgYWN0aW9uOiBTZW5kRW1haWxUb0d1ZXN0KTogT2JzZXJ2YWJsZTxJbnQzMkh0dHBSZXNwb25zZURhdGE+IHtcbiAgICByZXR1cm4gdGhpcy5ndWVzdFNlcnZpY2VQcm94eS5zZW5kR3Vlc3RFbWFpbChhY3Rpb24uZ3VpZCwgYWN0aW9uLnNlbmRFbWFpbENvbW1hbmQpLnBpcGUodGFwKHtcbiAgICAgIG5leHQ6ICgpID0+IHRoaXMubWVzc2FnZUJhclNlcnZpY2Uuc3VjY2VzcyhMb2NhbGl6YXRpb24uZW1haWxfc2VudF9zdWNjZXNzZnVsbHkpLFxuICAgICAgZXJyb3I6ICgpID0+IHRoaXMubWVzc2FnZUJhclNlcnZpY2UuZXJyb3IoTG9jYWxpemF0aW9uLmVtYWlsX3NlbmRpbmdfZmFpbGVkKSxcbiAgICB9KSk7XG4gIH1cblxuICBAQWN0aW9uKExvYWRHdWVzdHNCeUJhdGNoSWRBY3Rpb24sIHsgY2FuY2VsVW5jb21wbGV0ZWQ6IHRydWUgfSlcbiAgb25Mb2FkR3Vlc3RzQnlCYXRjaElkKGN0eDogU3RhdGVDb250ZXh0PEd1ZXN0U3RhdGVNb2RlbD4sIGFjdGlvbjogTG9hZEd1ZXN0c0J5QmF0Y2hJZEFjdGlvbik6IE9ic2VydmFibGU8Vkd1ZXN0V2l0aEJhdGNoRHRvSUVudW1lcmFibGVIdHRwUmVzcG9uc2VEYXRhPiB7XG4gICAgY29uc3QgcmVzdWx0cyQgPSB0aGlzLmd1ZXN0U2VydmljZVByb3h5LmdldEd1ZXN0c0J5QmF0Y2hJRChhY3Rpb24ucGFya0lkLCBhY3Rpb24uYmF0Y2hJRCwgYWN0aW9uLmd1aWQsIGFjdGlvbi5ndWVzdHNGaWx0ZXJEdG8pO1xuICAgIHJldHVybiByZXN1bHRzJC5waXBlKHRhcCgoZ3Vlc3RzOiBWR3Vlc3RXaXRoQmF0Y2hEdG9JRW51bWVyYWJsZUh0dHBSZXNwb25zZURhdGEpID0+IHtcbiAgICAgIHRoaXMuYWRkR3Vlc3RzQnlCYXRjaElkVG9TdG9yZShjdHgsIGFjdGlvbi5iYXRjaElELCBndWVzdHMuZGF0YSk7XG4gICAgfSkpO1xuICB9XG5cbiAgQEFjdGlvbihMb2FkR3Vlc3RzQnlCYXRjaElkQ2FuY2VsbGVkQWN0aW9uLCB7IGNhbmNlbFVuY29tcGxldGVkOiBmYWxzZSB9KVxuICBvbkxvYWRHdWVzdHNCeUJhdGNoSWRDYW5jZWxsZWRBY3Rpb24oY3R4OiBTdGF0ZUNvbnRleHQ8R3Vlc3RTdGF0ZU1vZGVsPiwgYWN0aW9uOiBMb2FkR3Vlc3RzQnlCYXRjaElkQ2FuY2VsbGVkQWN0aW9uKSB7XG4gICAgY29uc3QgZGlzcGxheWVkR3Vlc3RzQmF0Y2hlcyA9IGN0eC5nZXRTdGF0ZSgpLmRpc3BsYXllZDtcbiAgICBjb25zdCBndWVzdEJhdGNoSW5kZXggPSBkaXNwbGF5ZWRHdWVzdHNCYXRjaGVzLmZpbmRJbmRleChndWVzdCA9PiBndWVzdCBpbnN0YW5jZW9mIFZHdWVzdFdpdGhCYXRjaER0byAmJiBndWVzdC5iYXRjaElEID09PSBhY3Rpb24uYmF0Y2hJZCk7XG5cbiAgICBpZiAoZ3Vlc3RCYXRjaEluZGV4ICE9PSAtMSkge1xuICAgICAgY29uc3QgZ3Vlc3RCYXRjaCA9IG1hcmtFbnRpdHlBc1VuY2hhbmdlZChkaXNwbGF5ZWRHdWVzdHNCYXRjaGVzW2d1ZXN0QmF0Y2hJbmRleF0pO1xuXG4gICAgICBkaXNwbGF5ZWRHdWVzdHNCYXRjaGVzW2d1ZXN0QmF0Y2hJbmRleF0gPSBPYmplY3QuYXNzaWduKG5ldyBWR3Vlc3RXaXRoQmF0Y2hEdG8oKSwgZ3Vlc3RCYXRjaCk7XG5cbiAgICAgIGN0eC5wYXRjaFN0YXRlKHtcbiAgICAgICAgZGlzcGxheWVkOiBbLi4uZGlzcGxheWVkR3Vlc3RzQmF0Y2hlc11cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIEBBY3Rpb24oRXhwYW5kR3Vlc3RzQnlCYXRjaElkQWN0aW9uKVxuICBvbkV4cGFuZEd1ZXN0c0J5QmF0Y2hJZEFjdGlvbihjdHg6IFN0YXRlQ29udGV4dDxHdWVzdFN0YXRlTW9kZWw+LCBhY3Rpb246IEV4cGFuZEd1ZXN0c0J5QmF0Y2hJZEFjdGlvbik6IHZvaWQge1xuICAgIHRoaXMuYWRkR3Vlc3RzQnlCYXRjaElkVG9TdG9yZShjdHgsIGFjdGlvbi5iYXRjaElELCBhY3Rpb24uZ3Vlc3RzKTtcbiAgfVxuXG4gIEBBY3Rpb24oQ29sbGFwc2VkR3Vlc3RzQnlCYXRjaElkQWN0aW9uKVxuICBvbkNvbGxhcHNlZEd1ZXN0c0J5QmF0Y2hJZEFjdGlvbihjdHg6IFN0YXRlQ29udGV4dDxHdWVzdFN0YXRlTW9kZWw+LCBhY3Rpb246IENvbGxhcHNlZEd1ZXN0c0J5QmF0Y2hJZEFjdGlvbik6IHZvaWQge1xuICAgIGxldCBkaXNwbGF5ZWRHdXNldEJhdGNoZXMgPSBjdHguZ2V0U3RhdGUoKS5kaXNwbGF5ZWQ7XG4gICAgY29uc3QgZ3Vlc3RCYXRjaEluZGV4ID0gZGlzcGxheWVkR3VzZXRCYXRjaGVzLmZpbmRJbmRleChnYiA9PiBnYi5iYXRjaElEID09PSBhY3Rpb24uYmF0Y2hJRCk7XG4gICAgaWYgKGd1ZXN0QmF0Y2hJbmRleCAhPT0gLTEpIHtcbiAgICAgIGRpc3BsYXllZEd1c2V0QmF0Y2hlcyA9IGRpc3BsYXllZEd1c2V0QmF0Y2hlcy5maWx0ZXIoZW50aXR5ID0+IGVudGl0eS5iYXRjaElEICE9PSBhY3Rpb24uYmF0Y2hJRCB8fCAhZW50aXR5Lmd1ZXN0SUQpO1xuICAgICAgY3R4LnBhdGNoU3RhdGUoe1xuICAgICAgICBkaXNwbGF5ZWQ6IFsuLi5kaXNwbGF5ZWRHdXNldEJhdGNoZXNdLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgQEFjdGlvbihMb2FkR3Vlc3RQcm9maWxlc0FjdGlvbiwgeyBjYW5jZWxVbmNvbXBsZXRlZDogdHJ1ZSB9KVxuICBvbkxvYWRHdWVzdFByb2ZpbGVzQWN0aW9uKGN0eDogU3RhdGVDb250ZXh0PEd1ZXN0U3RhdGVNb2RlbD4sIGFjdGlvbjogTG9hZEd1ZXN0UHJvZmlsZXNBY3Rpb24pIHtcbiAgICBjb25zdCBndWVzdFByb2ZpbGVzJCA9IHRoaXMuZ3Vlc3RTZXJ2aWNlUHJveHkuZ2V0UHJvZmlsZXMoYWN0aW9uLnBhcmtJZCwgYWN0aW9uLnNlYXJjaFBhcmFtc0R0bz8ubWF4UmVzdWx0cyxcbiAgICAgIGFjdGlvbi5zZWFyY2hQYXJhbXNEdG8/LnNlYXJjaFRlcm0sIGFjdGlvbi5zZWFyY2hQYXJhbXNEdG8/Lm9yZGVyQnkuY29sdW1uLFxuICAgICAgYWN0aW9uLnNlYXJjaFBhcmFtc0R0bz8ub3JkZXJCeS5vcmRlckRpcmVjdGlvbiwgYWN0aW9uLmd1aWQpO1xuICAgIHJldHVybiBndWVzdFByb2ZpbGVzJC5waXBlKHRhcChwcm9maWxlcyA9PiB7XG4gICAgICBjdHgucGF0Y2hTdGF0ZSh7XG4gICAgICAgIHByb2ZpbGVzOiBwcm9maWxlcy5kYXRhLFxuICAgICAgfSk7XG4gICAgfSkpO1xuICB9XG5cbiAgQEFjdGlvbihDbGVhckd1ZXN0UHJvZmlsZXNBY3Rpb24pXG4gIG9uQ2xlYXJHdWVzdFByb2ZpbGVzQWN0aW9uKGN0eDogU3RhdGVDb250ZXh0PEd1ZXN0U3RhdGVNb2RlbD4pIHtcbiAgICBjdHgucGF0Y2hTdGF0ZSh7XG4gICAgICBwcm9maWxlczogW10sXG4gICAgfSk7XG4gIH1cblxuICBAQWN0aW9uKFNlbmRHdWVzdFBhc3Nlc1RvRW1haWxBY3Rpb24pXG4gIGFzeW5jIG9uU2VuZEd1ZXN0UGFzc2VzVG9FbWFpbChjdHg6IFN0YXRlQ29udGV4dDxHdWVzdFN0YXRlTW9kZWw+LCBhY3Rpb246IFNlbmRHdWVzdFBhc3Nlc1RvRW1haWxBY3Rpb24pIHtcbiAgICBjb25zdCBkYXRhOiBhbnkgPSB7XG4gICAgICBtb2RhbFRpdGxlOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KExvY2FsaXphdGlvbi5zZW5kX3N0aWNrZXJzX3RvX2VtYWlsKSxcbiAgICAgIHNlbmRFbWFpbDogZmFsc2UsXG4gICAgICBzZW5kRW1haWxSZXFldXN0OiBhd2FpdCB0aGlzLnBvcHVsYXRlU2VuZEVtYWlsUmVxdWVzdChhY3Rpb24pICAvLyBvbmx5IHZlcnNpb24gPj0gOC4xIHN1cHBvcnQgdGhpcyBmZWF0dXJlXG4gICAgfTtcbiAgICBkYXRhLnNlbmRFbWFpbFJlcWV1c3QudG8gPSBhY3Rpb24uZW1haWw7XG4gICAgY3R4LmRpc3BhdGNoKG5ldyBTZW5kRW1haWxGcm9tRW50aXR5QWN0aW9uKGRhdGEuc2VuZEVtYWlsUmVxZXVzdCkpO1xuICB9XG5cbiAgQEFjdGlvbihFeHBvcnRHdWVzdHNBY3Rpb24sIHsgY2FuY2VsVW5jb21wbGV0ZWQ6IHRydWUgfSlcbiAgb25FeHBvcnRHdWVzdHNBY3Rpb24oY3R4OiBTdGF0ZUNvbnRleHQ8R3Vlc3RTdGF0ZU1vZGVsPiwgYWN0aW9uOiBFeHBvcnRHdWVzdHNBY3Rpb24pOiBPYnNlcnZhYmxlPFZHdWVzdFdpdGhCYXRjaER0b0VudGl0eVdyYXBwZXJEdG9IdHRwUmVzcG9uc2VEYXRhPiB7XG4gICAgY29uc3QgZ2V0R3Vlc3RzJCA9IHRoaXMuZ3Vlc3RTZXJ2aWNlUHJveHkuZ2V0R3Vlc3RzKGFjdGlvbi5wYXJrSWQsIGFjdGlvbi5ndWlkLCBhY3Rpb24uZ3Vlc3RzRmlsdGVyRHRvKTtcbiAgICByZXR1cm4gZ2V0R3Vlc3RzJC5waXBlKHRhcCh7XG4gICAgICBuZXh0OiAoZ3Vlc3RzV3JhcHBlcjogVkd1ZXN0V2l0aEJhdGNoRHRvRW50aXR5V3JhcHBlckR0b0h0dHBSZXNwb25zZURhdGEpID0+IHtcbiAgICAgICAgY29uc3QgdGFibGVSb3dzOiBhbnlbXVtdID0gW107XG4gICAgICAgIGNvbnN0IGd1ZXN0V2l0aEJhdGNoRHRvTGlzdDogVkd1ZXN0V2l0aEJhdGNoRHRvW10gPSBndWVzdHNXcmFwcGVyLmRhdGEuZW50aXRpZXM7XG4gICAgICAgIGd1ZXN0V2l0aEJhdGNoRHRvTGlzdC5mb3JFYWNoKChndWVzdCkgPT4ge1xuICAgICAgICAgIHRhYmxlUm93cy5wdXNoKFtndWVzdC5uYW1lLFxuICAgICAgICAgIHRoaXMudHJhbnNsYXRlLmluc3RhbnQoUHJvZmlsZVR5cGVUZXh0W1Byb2ZpbGVUeXBlW2d1ZXN0Lm1UeXBlXV0pLFxuICAgICAgICAgIGd1ZXN0Lm1vYmlsZSxcbiAgICAgICAgICBndWVzdC5jYXJQbGF0ZSxcbiAgICAgICAgICB0aGlzLmV4cG9ydEZpbGVTZXJ2aWNlLmdldERhdGVGaWVsZFZhbHVlKGFjdGlvbi5maWxlVHlwZSwgZ3Vlc3QsICd2YWxpZEZyb21EYXRlJyksXG4gICAgICAgICAgdGhpcy5leHBvcnRGaWxlU2VydmljZS5nZXREYXRlRmllbGRWYWx1ZShhY3Rpb24uZmlsZVR5cGUsIGd1ZXN0LCAndmFsaWRUb0RhdGUnKSxcbiAgICAgICAgICBndWVzdC5jb21wYW55TmFtZSxcbiAgICAgICAgICBndWVzdC5zdWJDb21wYW55TmFtZSxcbiAgICAgICAgICB0aGlzLnBhcmtlclNlcnZpY2UuZ2V0SGlzdG9yeUl0ZW1BY3Rpb24oZ3Vlc3QubG9jYXRpb24sIG51bGwpLFxuICAgICAgICAgIHRoaXMuZXhwb3J0RmlsZVNlcnZpY2UuZ2V0RGF0ZUZpZWxkVmFsdWUoYWN0aW9uLmZpbGVUeXBlLCBndWVzdCwgJ3Byb2R1Y2VkRGF0ZScpXSlcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZXhwb3J0RmlsZVNlcnZpY2UuZXhwb3J0KGFjdGlvbi5maWxlVHlwZSwgdGFibGVSb3dzLCBhY3Rpb24uY29sdW1uc0hlYWRlciwgTG9jYWxpemF0aW9uLmd1ZXN0cyk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgdGhpcy5tZXNzYWdlQmFyU2VydmljZS5lcnJvcih0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCh0aGlzLkwuZmFpbGVkX2V4cG9ydF9maWxlKSk7XG4gICAgICB9XG4gICAgfSkpO1xuICB9XG5cbiAgdG9EYXRlU3RyaW5nID0gKHZhbHVlOiBNb21lbnQpID0+IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKHZhbHVlLnRvRGF0ZSgpLCB0aGlzLnRlbmFudFNlcnZpY2Uuc2Vjb25kYXJ5RGF0ZVRpbWVGb3JtYXQpIHx8ICctJztcblxuICBwcml2YXRlIGFkZEd1ZXN0c0J5QmF0Y2hJZFRvU3RvcmUoY3R4OiBTdGF0ZUNvbnRleHQ8R3Vlc3RTdGF0ZU1vZGVsPiwgYmF0Y2hJRDogbnVtYmVyLCBndWVzdHM6IFZHdWVzdFdpdGhCYXRjaER0b1tdKSB7XG4gICAgY29uc3QgZGlzcGxheWVkR3VzZXRCYXRjaGVzID0gY3R4LmdldFN0YXRlKCkuZGlzcGxheWVkO1xuICAgIGNvbnN0IGd1ZXN0QmF0Y2hJbmRleCA9IGRpc3BsYXllZEd1c2V0QmF0Y2hlcy5maW5kSW5kZXgoZ2IgPT4gZ2IuYmF0Y2hJRCA9PT0gYmF0Y2hJRCk7XG4gICAgaWYgKGd1ZXN0QmF0Y2hJbmRleCAhPT0gLTEpIHtcbiAgICAgIGRpc3BsYXllZEd1c2V0QmF0Y2hlc1tndWVzdEJhdGNoSW5kZXhdLmVudGl0aWVzID0gZ3Vlc3RzO1xuICAgICAgZGlzcGxheWVkR3VzZXRCYXRjaGVzLnNwbGljZShndWVzdEJhdGNoSW5kZXggKyAxLCAwLCAuLi5ndWVzdHMpO1xuXG4gICAgICBjdHgucGF0Y2hTdGF0ZSh7XG4gICAgICAgIGRpc3BsYXllZDogWy4uLmRpc3BsYXllZEd1c2V0QmF0Y2hlc10sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRHdWVzdHNUb1RhYmxlRGF0YShndWVzdHM6IFZHdWVzdFdpdGhCYXRjaER0b1tdKTogVkd1ZXN0V2l0aEJhdGNoVGFibGVEYXRhIHtcbiAgICBjb25zdCBiYXRjaDogVkd1ZXN0V2l0aEJhdGNoVGFibGVEYXRhID0gZ3Vlc3RzLmZpbmQoZyA9PiBnLmJhdGNoSUQgPiAwICYmIGcuZ3Vlc3RJRCA9PT0gbnVsbCkgYXMgYW55O1xuICAgIGJhdGNoLmlzUm93RXhwYW5kYWJsZSA9IHRydWU7XG4gICAgYmF0Y2guZW50aXRpZXMgPSBndWVzdHMuZmlsdGVyKGcgPT4gZy5iYXRjaElEICE9PSBudWxsICYmIGcuZ3Vlc3RJRCAhPT0gbnVsbCk7XG4gICAgcmV0dXJuIGJhdGNoO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRHdWVzdFRvU3RvcmUoY3R4OiBTdGF0ZUNvbnRleHQ8R3Vlc3RTdGF0ZU1vZGVsPiwgZ3Vlc3Q6IFZHdWVzdFdpdGhCYXRjaER0bywgZGlzcGxheU5ld0d1ZXN0SW5UYWJsZTogYm9vbGVhbikge1xuICAgIGlmIChkaXNwbGF5TmV3R3Vlc3RJblRhYmxlKSB7XG4gICAgICBjb25zdCBkaXNwbGF5ZWRHdWVzdHMgPSBjdHguZ2V0U3RhdGUoKS5kaXNwbGF5ZWQ7XG4gICAgICBtYXJrRW50aXRpZXNBc0NoYW5nZWQoW2d1ZXN0XSwgUm93T3BlcmF0aW9uLkluc2VydCk7XG4gICAgICBkaXNwbGF5ZWRHdWVzdHMudW5zaGlmdChndWVzdCk7XG4gICAgICBjdHgucGF0Y2hTdGF0ZSh7XG4gICAgICAgIGRpc3BsYXllZDogWy4uLmRpc3BsYXllZEd1ZXN0c10sXG4gICAgICAgIGNvdW50ZXI6IGN0eC5nZXRTdGF0ZSgpLmNvdW50ZXIgKyAxLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc0d1ZXN0Q3JlYXRlZEZyb21TZWxlY3RlZEZhY2lsaXR5KGd1ZXN0OiBWR3Vlc3RXaXRoQmF0Y2hEdG8sIGd1aWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHNlbGVjdGVkUGFya0lEID0gdGhpcy5zdG9yZS5zZWxlY3RTbmFwc2hvdChGYWNpbGl0eVN0YXRlLnBhcmtJZCk7XG4gICAgY29uc3Qgc2VsZWN0ZWRHdWlkID0gdGhpcy5zdG9yZS5zZWxlY3RTbmFwc2hvdChGYWNpbGl0eVN0YXRlLmd1aWQpO1xuICAgIHJldHVybiBzZWxlY3RlZFBhcmtJRCA9PT0gZ3Vlc3QucGFya0lEICYmIHNlbGVjdGVkR3VpZCA9PT0gZ3VpZDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGFyYW50QW5kQ2hpbGRJbmRleChjdHg6IFN0YXRlQ29udGV4dDxHdWVzdFN0YXRlTW9kZWw+LCBndWVzdER0bzogVkd1ZXN0V2l0aEJhdGNoRHRvKTogeyBwYXJlbnQ6IG51bWJlciwgY2hpbGQ6IG51bWJlciB9IHtcbiAgICBjb25zdCBkaXNwbGF5ZWRHdWVzdHMgPSBjdHguZ2V0U3RhdGUoKS5kaXNwbGF5ZWQ7XG4gICAgLy8gaWYgSSBhbSBjaGlsZHJlbiBmaW5kIG15IHBhcmVudCwgYWZ0ZXIgdGhhdCBmaW5kIG1lXG4gICAgY29uc3QgcGFyZW50ID0gZGlzcGxheWVkR3Vlc3RzLmZpbmRJbmRleChndWVzdCA9PiBndWVzdC5iYXRjaElEID09PSBndWVzdER0by5iYXRjaElEICYmIGd1ZXN0Lmd1ZXN0SUQgPT09IG51bGwpO1xuICAgIGNvbnN0IGNoaWxkID0gKGRpc3BsYXllZEd1ZXN0c1twYXJlbnRdLmVudGl0aWVzIHx8IFtdKS5maW5kSW5kZXgoZ3Vlc3QgPT4gZ3Vlc3QuZ3Vlc3RJRCA9PT0gZ3Vlc3REdG8uZ3Vlc3RJRCk7XG4gICAgcmV0dXJuIHsgcGFyZW50LCBjaGlsZCB9O1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVHdWVzdEluU3RvcmUoY3R4OiBTdGF0ZUNvbnRleHQ8R3Vlc3RTdGF0ZU1vZGVsPiwgZ3Vlc3Q6IFZHdWVzdFdpdGhCYXRjaER0bywgZ3VpZDogc3RyaW5nKSB7XG4gICAgY29uc3QgZGlzcGxheWVkR3Vlc3RzID0gY3R4LmdldFN0YXRlKCkuZGlzcGxheWVkO1xuICAgIGNvbnN0IGd1ZXN0SW5kZXggPSB0aGlzLmdldEd1ZXN0SW5kZXgoZGlzcGxheWVkR3Vlc3RzLCBndWVzdC5ndWVzdElEKTtcblxuICAgIGlmIChndWVzdEluZGV4ICE9PSAtMSkge1xuICAgICAgZGlzcGxheWVkR3Vlc3RzW2d1ZXN0SW5kZXhdID0gZ3Vlc3Q7XG4gICAgICBtYXJrRW50aXRpZXNBc0NoYW5nZWQoW2d1ZXN0XSwgUm93T3BlcmF0aW9uLlVwZGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNHdWVzdENoaWxkKGd1ZXN0KSkge1xuICAgICAgY29uc3QgeyBjaGlsZCwgcGFyZW50IH0gPSB0aGlzLmdldFBhcmFudEFuZENoaWxkSW5kZXgoY3R4LCBndWVzdCk7XG4gICAgICBpZiAocGFyZW50ICE9PSAtMSkge1xuICAgICAgICBpZiAoY2hpbGQgIT09IC0xKSB7XG4gICAgICAgICAgZGlzcGxheWVkR3Vlc3RzW3BhcmVudF0uZW50aXRpZXNbY2hpbGRdID0gZ3Vlc3Q7XG4gICAgICAgIH1cbiAgICAgICAgbWFya0VudGl0aWVzQXNDaGFuZ2VkKFtkaXNwbGF5ZWRHdWVzdHNbcGFyZW50XV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGN0eC5wYXRjaFN0YXRlKHtcbiAgICAgIGRpc3BsYXllZDogWy4uLmRpc3BsYXllZEd1ZXN0c10sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGRlbGV0ZUd1ZXN0RnJvbVN0b3JlKGN0eDogU3RhdGVDb250ZXh0PEd1ZXN0U3RhdGVNb2RlbD4sIGd1ZXN0OiBWR3Vlc3RXaXRoQmF0Y2hEdG8sIGd1aWQ6IHN0cmluZykge1xuICAgIGxldCBjb3VudGVyID0gY3R4LmdldFN0YXRlKCkuY291bnRlcjtcblxuICAgIGNvbnN0IGRpc3BsYXllZEd1ZXN0cyA9IGN0eC5nZXRTdGF0ZSgpLmRpc3BsYXllZDtcbiAgICBjb25zdCBndWVzdEluZGV4ID0gdGhpcy5nZXRHdWVzdEluZGV4KGRpc3BsYXllZEd1ZXN0cywgZ3Vlc3QuZ3Vlc3RJRCk7XG5cbiAgICBpZiAoZ3Vlc3RJbmRleCAhPT0gLTEpIHtcbiAgICAgIGRpc3BsYXllZEd1ZXN0cy5zcGxpY2UoZ3Vlc3RJbmRleCwgMSk7XG4gICAgICBtYXJrRW50aXRpZXNBc0NoYW5nZWQoW2d1ZXN0XSwgUm93T3BlcmF0aW9uLkRlbGV0ZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNHdWVzdENoaWxkKGd1ZXN0KSkge1xuICAgICAgY29uc3QgeyBjaGlsZCwgcGFyZW50IH0gPSB0aGlzLmdldFBhcmFudEFuZENoaWxkSW5kZXgoY3R4LCBndWVzdCk7XG4gICAgICBpZiAocGFyZW50ICE9PSAtMSkge1xuICAgICAgICBpZiAoY2hpbGQgIT09IC0xKSB7XG4gICAgICAgICAgZGlzcGxheWVkR3Vlc3RzW3BhcmVudF0uZW50aXRpZXMuc3BsaWNlKGNoaWxkLCAxKTtcbiAgICAgICAgfVxuICAgICAgICBtYXJrRW50aXRpZXNBc0NoYW5nZWQoW2Rpc3BsYXllZEd1ZXN0c1twYXJlbnRdXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvdW50ZXItLTtcbiAgICB9XG5cbiAgICBjdHgucGF0Y2hTdGF0ZSh7XG4gICAgICBkaXNwbGF5ZWQ6IFsuLi5kaXNwbGF5ZWRHdWVzdHNdLFxuICAgICAgY291bnRlcjogY291bnRlcixcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcG9wdWxhdGVTZW5kRW1haWxSZXF1ZXN0KGFjdGlvbjogU2VuZEd1ZXN0UGFzc2VzVG9FbWFpbEFjdGlvbikge1xuICAgIGxldCBwZGZQYWdlc1BhcmFtZXRlcnNMaXN0OiB7IFtrZXk6IHN0cmluZ106IGFueTsgfVtdID0gW107XG4gICAgbGV0IGd1ZXN0RW1haWxUZW1wbGF0ZSA9ICcnO1xuICAgIGlmIChhY3Rpb24uZ3Vlc3QuZW50aXRpZXMgJiYgYWN0aW9uLmd1ZXN0LmVudGl0aWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHBkZlBhZ2VzUGFyYW1ldGVyc0xpc3QgPSBbXTtcbiAgICAgIGFjdGlvbi5ndWVzdC5lbnRpdGllcy5mb3JFYWNoKGd1ZXN0ID0+IHtcbiAgICAgICAgY29uc3QgcGFyYW1MaXN0ID0gdGhpcy5nZXRQYXJhbWV0ZXJzKGd1ZXN0LCBhY3Rpb24uZmFjaWxpdHkpO1xuICAgICAgICBwZGZQYWdlc1BhcmFtZXRlcnNMaXN0LnB1c2gocGFyYW1MaXN0KTtcbiAgICAgIH0pO1xuICAgICAgZ3Vlc3RFbWFpbFRlbXBsYXRlID0gYWN0aW9uLmd1ZXN0LmJhdGNoTmFtZTtcblxuICAgIH0gZWxzZSB7XG4gICAgICBwZGZQYWdlc1BhcmFtZXRlcnNMaXN0LnB1c2godGhpcy5nZXRQYXJhbWV0ZXJzKGFjdGlvbi5ndWVzdCwgYWN0aW9uLmZhY2lsaXR5KSk7XG4gICAgICBndWVzdEVtYWlsVGVtcGxhdGUgPSBhY3Rpb24uZ3Vlc3QubmFtZTtcbiAgICB9XG5cbiAgICBjb25zdCBzZW5kRW1haWxSZXF1ZXN0ID0gbmV3IFNlbmRFbWFpbFJlcXVlc3REdG8oe1xuICAgICAgZW50aXR5OiBuZXcgR3Vlc3RFbnRpdHlQYXJhbXMoe1xuICAgICAgICBxclBsYWluVGV4dDogYWN0aW9uLmd1ZXN0LnFyUGxhaW5UZXh0LFxuICAgICAgICBpZDogYWN0aW9uLmd1ZXN0Lmd1ZXN0SUQgfHwgYWN0aW9uLmd1ZXN0LmJhdGNoSUQsXG4gICAgICAgIHFyQ29kZTogYWN0aW9uLmd1ZXN0LnFyQ29kZVxuICAgICAgfSksXG4gICAgICB0bzogYWN0aW9uLmVtYWlsLFxuICAgICAgdGVtcGxhdGVUeXBlOiBUZW1wbGF0ZVR5cGUuR3Vlc3QsXG4gICAgICBwZGZQYWdlc1BhcmFtZXRlcnNMaXN0LFxuICAgICAgcGRmUGFnZXNQYXJhbWV0ZXJzOiBudWxsLCAvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB2ZXJzaW9uIDguMlxuICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICBndWVzdEVtYWlsVGVtcGxhdGUsXG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHNlbmRFbWFpbFJlcXVlc3Q7XG4gIH1cblxuICBwcml2YXRlIGdldFBhcmFtZXRlcnMoZ3Vlc3Q6IFZHdWVzdFdpdGhCYXRjaER0bywgZmFjaWxpdHk6IEZhY2lsaXR5V2l0aEd1aWQpOiB7IFtrZXk6IHN0cmluZ106IGFueTsgfSB7XG4gICAgY29uc3QgcGFyYW1ldGVycyA9IHtcbiAgICAgIHZhbGlkRnJvbURhdGVUaW1lOiB0aGlzLnRvRGF0ZVN0cmluZyhndWVzdC52YWxpZEZyb21EYXRlKSxcbiAgICAgIHZhbGlkVG9EYXRlVGltZTogdGhpcy50b0RhdGVTdHJpbmcoZ3Vlc3QudmFsaWRUb0RhdGUpLFxuICAgICAgY29tcGFueU5hbWU6IGd1ZXN0LmNvbXBhbnlOYW1lLFxuICAgICAgc3ViQ29tcGFueU5hbWU6IGd1ZXN0LnN1YkNvbXBhbnlOYW1lLFxuICAgICAgcGFya05hbWU6IGZhY2lsaXR5Py5kYXRhPy5uYW1lLFxuICAgICAgcHJvZHVjZWREYXRlVGltZTogdGhpcy50b0RhdGVTdHJpbmcoZ3Vlc3QucHJvZHVjZWREYXRlKSxcbiAgICAgIGlkOiBndWVzdC5ndWVzdElELFxuICAgICAgZmlyc3ROYW1lOiBndWVzdC5maXJzdE5hbWUsXG4gICAgICBsYXN0TmFtZTogZ3Vlc3QubGFzdE5hbWUsXG4gICAgICBwbGF0ZUlkOiBndWVzdC5jYXJQbGF0ZSxcbiAgICAgIG5hbWU6IGd1ZXN0Lm5hbWUsXG4gICAgICBjYXJkOiBndWVzdC5jcmVkaXQsXG4gICAgICBhZGRyZXNzOiBnZXRBZGRyZXNzKGd1ZXN0LmNpdHksIGd1ZXN0LnN0cmVldCksXG4gICAgICBxckNvZGU6IGd1ZXN0LnFyQ29kZSxcbiAgICAgIGd1aWQ6IGZhY2lsaXR5Lmd1aWQsXG4gICAgICBwYXJrSWQ6IGZhY2lsaXR5LmRhdGEuaWQsXG4gICAgICBxclBsYWluVGV4dDogZ3Vlc3QucXJQbGFpblRleHRcbiAgICB9O1xuXG4gICAgcmV0dXJuIHBhcmFtZXRlcnM7XG4gIH1cblxuICBwcml2YXRlIGlzR3Vlc3RDaGlsZCA9IChndWVzdDogVkd1ZXN0V2l0aEJhdGNoRHRvKSA9PiBndWVzdC5ndWVzdElEICE9PSBudWxsICYmIGd1ZXN0LmJhdGNoSUQgPiAwO1xuXG4gIHByaXZhdGUgZ2V0R3Vlc3RJbmRleChkaXNwbGF5ZWRHdWVzdHM6IFZHdWVzdFdpdGhCYXRjaER0b1tdLCBndWVzdElkOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBkaXNwbGF5ZWRHdWVzdHMuZmluZEluZGV4KGd1ZXN0ID0+IGd1ZXN0Lmd1ZXN0SUQgPT09IGd1ZXN0SWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBvblVwZGF0ZUJhc2ljR3Vlc3ROZXh0KGN0eDogU3RhdGVDb250ZXh0PEd1ZXN0U3RhdGVNb2RlbD4sIGFjdGlvbjogVXBkYXRlQmFzaWNHdWVzdEFjdGlvbiwgaGFuZGxlZDogVkd1ZXN0V2l0aEJhdGNoRHRvSHR0cFJlc3BvbnNlRGF0YSwgbWVzc2FnZUJhclBheWxvYWQ6IE1lc3NhZ2VCYXJQYXlsb2FkKSB7XG4gICAgdGhpcy51cGRhdGVHdWVzdEluU3RvcmUoY3R4LCBoYW5kbGVkLmRhdGEsIGFjdGlvbi5ndWlkKTtcbiAgICB0aGlzLm1lc3NhZ2VCYXJTZXJ2aWNlLnN1Y2Nlc3MoXG4gICAgICBMb2NhbGl6YXRpb24uZW50aXR5X3N1Y2Nlc3MsXG4gICAgICBjcmVhdGVNZXNzYWdlVGV4dChtZXNzYWdlQmFyUGF5bG9hZClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBvblVwZGF0ZUJhc2ljR3Vlc3RFcnJvcihtZXNzYWdlQmFyUGF5bG9hZDogTWVzc2FnZUJhclBheWxvYWQpIHtcbiAgICBtZXNzYWdlQmFyUGF5bG9hZC5lbnRpdHkgPSBsb3dlckNhc2VGaXJzdExldHRlcihcbiAgICAgIG1lc3NhZ2VCYXJQYXlsb2FkLmVudGl0eVxuICAgICk7XG4gICAgbWVzc2FnZUJhclBheWxvYWQuYWN0aW9uID0gbG93ZXJDYXNlRmlyc3RMZXR0ZXIoXG4gICAgICB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KExvY2FsaXphdGlvbi51cGRhdGUpXG4gICAgKTtcbiAgICB0aGlzLm1lc3NhZ2VCYXJTZXJ2aWNlLmVycm9yKFxuICAgICAgTG9jYWxpemF0aW9uLmVudGl0eV9mYWlsZWQsXG4gICAgICBjcmVhdGVNZXNzYWdlVGV4dChtZXNzYWdlQmFyUGF5bG9hZClcbiAgICApO1xuICB9XG59XG4iXX0=
|