@csmart/ngc-smart-victim 1.14.44 → 1.14.45

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. package/README.md +25 -25
  2. package/esm2020/lib/caseNote/caseNote.component.mjs +194 -0
  3. package/esm2020/lib/common-dialog/common-dialog.component.mjs +23 -0
  4. package/esm2020/lib/common-dialog/common-dialog.module.mjs +34 -0
  5. package/esm2020/lib/common-dialog/common-dialog.service.mjs +33 -0
  6. package/esm2020/lib/contact/contact.component.mjs +140 -0
  7. package/esm2020/lib/email.services.mjs +42 -0
  8. package/esm2020/lib/intake.service.mjs +57 -0
  9. package/esm2020/lib/safetyPlan/serviceProvider.component.mjs +99 -0
  10. package/esm2020/lib/safetyPlan/victimSafetyPlan.component.mjs +116 -0
  11. package/esm2020/lib/safetyPlan/victimSafetyPlanDetail.component.mjs +340 -0
  12. package/esm2020/lib/shared/app.shared.module.mjs +215 -0
  13. package/esm2020/lib/shared/validators/date.validator.mjs +59 -0
  14. package/esm2020/lib/smart-victim-delete-confirm.component.mjs +44 -0
  15. package/esm2020/lib/smart-victim-detail/smart-victim-detail.component.mjs +1104 -0
  16. package/esm2020/lib/smart-victim.component.mjs +314 -0
  17. package/esm2020/lib/smart-victim.model.mjs +133 -0
  18. package/esm2020/lib/smart-victim.module.mjs +128 -0
  19. package/esm2020/lib/smart-victim.service.mjs +352 -0
  20. package/{esm2022 → esm2020}/lib/victim-routing.module.mjs +5 -5
  21. package/esm2020/lib/victimSearch/VictimSearchFilter.mjs +3 -0
  22. package/esm2020/lib/victimSearch/victimSearchForm.component.mjs +38 -0
  23. package/{esm2022 → esm2020}/public-api.mjs +1 -1
  24. package/fesm2015/csmart-ngc-smart-victim.mjs +3273 -0
  25. package/fesm2015/csmart-ngc-smart-victim.mjs.map +1 -0
  26. package/fesm2020/csmart-ngc-smart-victim.mjs +3261 -0
  27. package/fesm2020/csmart-ngc-smart-victim.mjs.map +1 -0
  28. package/lib/caseNote/caseNote.component.d.ts +2 -2
  29. package/lib/common-dialog/common-dialog.component.d.ts +1 -1
  30. package/lib/contact/contact.component.d.ts +1 -1
  31. package/lib/safetyPlan/serviceProvider.component.d.ts +1 -1
  32. package/lib/safetyPlan/victimSafetyPlan.component.d.ts +2 -2
  33. package/lib/safetyPlan/victimSafetyPlanDetail.component.d.ts +2 -2
  34. package/lib/smart-victim-delete-confirm.component.d.ts +1 -1
  35. package/lib/smart-victim-detail/smart-victim-detail.component.d.ts +2 -2
  36. package/lib/smart-victim.component.d.ts +2 -2
  37. package/lib/victimSearch/victimSearchForm.component.d.ts +1 -1
  38. package/package.json +11 -5
  39. package/esm2022/lib/caseNote/caseNote.component.mjs +0 -219
  40. package/esm2022/lib/common-dialog/common-dialog.component.mjs +0 -26
  41. package/esm2022/lib/common-dialog/common-dialog.module.mjs +0 -34
  42. package/esm2022/lib/common-dialog/common-dialog.service.mjs +0 -34
  43. package/esm2022/lib/contact/contact.component.mjs +0 -158
  44. package/esm2022/lib/email.services.mjs +0 -43
  45. package/esm2022/lib/intake.service.mjs +0 -59
  46. package/esm2022/lib/safetyPlan/serviceProvider.component.mjs +0 -105
  47. package/esm2022/lib/safetyPlan/victimSafetyPlan.component.mjs +0 -146
  48. package/esm2022/lib/safetyPlan/victimSafetyPlanDetail.component.mjs +0 -372
  49. package/esm2022/lib/shared/app.shared.module.mjs +0 -215
  50. package/esm2022/lib/shared/validators/date.validator.mjs +0 -59
  51. package/esm2022/lib/smart-victim-delete-confirm.component.mjs +0 -46
  52. package/esm2022/lib/smart-victim-detail/smart-victim-detail.component.mjs +0 -1141
  53. package/esm2022/lib/smart-victim.component.mjs +0 -343
  54. package/esm2022/lib/smart-victim.model.mjs +0 -233
  55. package/esm2022/lib/smart-victim.module.mjs +0 -128
  56. package/esm2022/lib/smart-victim.service.mjs +0 -357
  57. package/esm2022/lib/victimSearch/VictimSearchFilter.mjs +0 -8
  58. package/esm2022/lib/victimSearch/victimSearchForm.component.mjs +0 -37
  59. package/fesm2022/csmart-ngc-smart-victim.mjs +0 -3556
  60. package/fesm2022/csmart-ngc-smart-victim.mjs.map +0 -1
  61. /package/{esm2022 → esm2020}/csmart-ngc-smart-victim.mjs +0 -0
  62. /package/{esm2022 → esm2020}/lib/shared/validators/index.mjs +0 -0
@@ -0,0 +1,340 @@
1
+ import { Component } from '@angular/core';
2
+ import { NgcSmartVictimService } from '../smart-victim.service';
3
+ import { UntypedFormControl, UntypedFormBuilder, Validators } from '@angular/forms';
4
+ import { MatDialog } from '@angular/material/dialog';
5
+ import { CommonDialogService } from '.././common-dialog/common-dialog.service';
6
+ import { HttpClient } from '@angular/common/http';
7
+ import { Router, ActivatedRoute } from '@angular/router';
8
+ import { dateValidator } from '../shared/validators';
9
+ import { SeriveProviderComponent } from '../safetyPlan/serviceProvider.component';
10
+ import { MatSnackBar } from '@angular/material/snack-bar';
11
+ import { MatTableDataSource } from '@angular/material/table';
12
+ import * as i0 from "@angular/core";
13
+ import * as i1 from "@angular/material/dialog";
14
+ import * as i2 from "../smart-victim.service";
15
+ import * as i3 from "@angular/common/http";
16
+ import * as i4 from "@angular/material/snack-bar";
17
+ import * as i5 from "@angular/router";
18
+ import * as i6 from ".././common-dialog/common-dialog.service";
19
+ import * as i7 from "@angular/forms";
20
+ import * as i8 from "@angular/common";
21
+ import * as i9 from "@angular/material/button";
22
+ import * as i10 from "@angular/material/checkbox";
23
+ import * as i11 from "@angular/material/card";
24
+ import * as i12 from "@angular/material/list";
25
+ import * as i13 from "@angular/material/toolbar";
26
+ import * as i14 from "@angular/cdk/text-field";
27
+ import * as i15 from "@angular/material/form-field";
28
+ import * as i16 from "@angular/material/input";
29
+ import * as i17 from "@angular/material/datepicker";
30
+ import * as i18 from "@angular/material/select";
31
+ import * as i19 from "@angular/material/core";
32
+ import * as i20 from "@angular/material/table";
33
+ export class VictimSafetyPlanDetailComponent {
34
+ constructor(dialog, _victimServicesComponent, http, snackBar, route, router, commonDialogService, formBuilder) {
35
+ this.dialog = dialog;
36
+ this._victimServicesComponent = _victimServicesComponent;
37
+ this.http = http;
38
+ this.snackBar = snackBar;
39
+ this.route = route;
40
+ this.router = router;
41
+ this.commonDialogService = commonDialogService;
42
+ this.formBuilder = formBuilder;
43
+ this.editSafetyPlan = {};
44
+ this.providerListCollection = [];
45
+ this.serviceCheck = [];
46
+ this.victimServiceStatusHistoriesDataSource = new MatTableDataSource();
47
+ this.initForm();
48
+ }
49
+ initForm() {
50
+ this.spForm = this.formBuilder.group({
51
+ serviceGoal: new UntypedFormControl('', Validators.compose([
52
+ Validators.required
53
+ ])),
54
+ goalStatus: new UntypedFormControl('', Validators.compose([
55
+ Validators.required
56
+ ])),
57
+ goalStatusDate: new UntypedFormControl('', Validators.compose([
58
+ Validators.required, dateValidator()
59
+ ])),
60
+ comment: new UntypedFormControl('', Validators.required)
61
+ });
62
+ this.spForm.markAsPristine();
63
+ this.spForm.markAsUntouched();
64
+ }
65
+ ngOnInit() {
66
+ var data = this.route.snapshot.data;
67
+ this.loginStaff = data.loginStaff;
68
+ this.staffId = this.loginStaff.staffId;
69
+ this.sub = this.route.params.subscribe(params => {
70
+ this.victimServiceId = params['victimServiceId'];
71
+ this.victimId = params['victimId'];
72
+ });
73
+ this.hiddenAddNewFlag = false;
74
+ this.isDisplay = false;
75
+ this._victimServicesComponent.getVictimServiceTypes().subscribe((items) => {
76
+ this.victimServiceTypes = items;
77
+ });
78
+ this._victimServicesComponent.getVictimServiceStatus().subscribe((items) => {
79
+ this.victimServiceStatus = items;
80
+ });
81
+ this._victimServicesComponent.getVictim(this.victimId).subscribe((items) => {
82
+ this.victimName = items.firstName + ', ' + items.lastName;
83
+ });
84
+ //---------------graphQL--------------------------------------
85
+ // this.getVictimServiceTypeProgramProviders().subscribe(result => {
86
+ // this.providerList = result;
87
+ // });
88
+ // console.log('this.victimServiceId');
89
+ // console.log(this.victimServiceId);
90
+ if (this.victimServiceId != 0) {
91
+ this._victimServicesComponent.getVictimServices(this.victimServiceId).subscribe(victimSafetyPlans => {
92
+ console.log('victimSafetyPlans');
93
+ console.log(victimSafetyPlans);
94
+ this.editSafetyPlan = victimSafetyPlans[0];
95
+ this.victimId = victimSafetyPlans[0].victimId;
96
+ console.log('this.editSafetyPlan');
97
+ console.log(this.editSafetyPlan);
98
+ // console.log('this.editSafetyPlan.goal');
99
+ // console.log(this.editSafetyPlan.goal);
100
+ // console.log('this.editSafetyPlan[0].goal');
101
+ // console.log(this.editSafetyPlan[0].goal);
102
+ });
103
+ this._victimServicesComponent.getServiceStatusHistories(this.victimServiceId).subscribe(victimServiceStatusHistories => {
104
+ // this.victimServiceStatusHistories = victimServiceStatusHistories;
105
+ this.victimServiceStatusHistoriesDataSource.data = victimServiceStatusHistories;
106
+ });
107
+ }
108
+ this.loadProvider();
109
+ }
110
+ //pass in id
111
+ isInArray(providerListCollectionKey, serviceTypeName, event) {
112
+ console.log('providerListCollectionKey');
113
+ console.log(providerListCollectionKey);
114
+ console.log('serviceTypeName');
115
+ console.log(serviceTypeName);
116
+ console.log('event.source.value');
117
+ console.log(event.checked);
118
+ if (event.checked == true) {
119
+ for (let j = 0; j < this.providerListCollection.length; j++) {
120
+ if (providerListCollectionKey == this.providerListCollection[j].groupId) {
121
+ this.providerListCollection[j].isDisplay = !this.providerListCollection[j].isDisplay;
122
+ const dialogRef = this.dialog.open(SeriveProviderComponent, {
123
+ width: '500px',
124
+ data: {
125
+ serviceType: serviceTypeName,
126
+ serviceTypeId: providerListCollectionKey,
127
+ providerCollections: [...this.providerListCollection],
128
+ },
129
+ panelClass: 'formFieldWidth480',
130
+ });
131
+ dialogRef.afterClosed().subscribe((result) => {
132
+ console.log('The dialog was closed');
133
+ console.log(result);
134
+ if (result) {
135
+ console.log('The dialog was closed, inside result');
136
+ this.savePlanProvider(providerListCollectionKey, result.voteeProviderId);
137
+ }
138
+ });
139
+ // return;
140
+ }
141
+ }
142
+ } //if event.checked == true
143
+ //this.router.navigate(['saftyPlanDetail', this.victimServiceId, this.victimId ]);
144
+ }
145
+ loadProvider() {
146
+ this.providerListCollection = [];
147
+ this._victimServicesComponent.getvVictimServiceTypeProgramProviders()
148
+ .subscribe((providerList) => {
149
+ if (providerList) {
150
+ let providers = Object.create(null);
151
+ for (let i = 0; i < providerList.length; i++) {
152
+ if (!providers[providerList[i].victimServiceTypeId]) {
153
+ providers[providerList[i].victimServiceTypeId] = [];
154
+ if (this.editSafetyPlan.vVictimServiceDetails != null) {
155
+ for (let j = 0; j < this.editSafetyPlan.vVictimServiceDetails.length; j++) {
156
+ if (providerList[i].victimServiceTypeId == this.editSafetyPlan.vVictimServiceDetails[j].victimServiceId.toString()) {
157
+ this.isDisplay = true;
158
+ }
159
+ }
160
+ }
161
+ this.providerListCollection.push({ groupId: providerList[i].victimServiceTypeId, isDisplay: this.isDisplay, collection: providers[providerList[i].victimServiceTypeId] });
162
+ }
163
+ providers[providerList[i].victimServiceTypeId].push(providerList[i]);
164
+ }
165
+ }
166
+ });
167
+ }
168
+ //---------------graphQL--------------------------------------
169
+ // getVictimServiceTypeProgramProviders(): Observable<VictimServiceTypeProgramProviderModel[]> {
170
+ // const queryString = `
171
+ // {
172
+ // findVictimServiceTypeProgramProviders {
173
+ // data {
174
+ // victimServiceTypeProgramProviderId
175
+ // victimServiceType
176
+ // victimProgramProvider
177
+ // }
178
+ // }
179
+ // }`;
180
+ // return this.http.post<any>(environment.smartApiUrl, { query: queryString })
181
+ // .map(result => {
182
+ // return result.data.findVictimServiceTypeProgramProviders.data;
183
+ // });
184
+ // }
185
+ evaluateSelection(victimServiceTypeId) {
186
+ if (this.editSafetyPlan.vVictimServiceDetails) {
187
+ return this.editSafetyPlan.vVictimServiceDetails.findIndex(r => r.victimServiceTypeId === victimServiceTypeId) >= 0;
188
+ }
189
+ }
190
+ savePlanProvider(victimServiceTypeId, victimProgramProviderId) {
191
+ console.log('savePlanProvider');
192
+ console.log(victimServiceTypeId);
193
+ console.log(victimProgramProviderId);
194
+ if (victimProgramProviderId === "" || victimProgramProviderId === null || victimProgramProviderId === undefined) {
195
+ this.snackBar.open('Please pick a program on the drop down list !', '', { duration: 120, });
196
+ // alert('Please pick a program on the drop down list !');
197
+ }
198
+ else {
199
+ if (this.victimServiceId == 0) {
200
+ //insert
201
+ console.log('insert new plan');
202
+ const safetyPlan = {
203
+ victimId: this.victimId,
204
+ fullName: null,
205
+ victimServiceId: 0,
206
+ goal: this.editSafetyPlan.goal,
207
+ comment: this.editSafetyPlan.comment,
208
+ modifiedBy: this.staffId,
209
+ victimServiceStatusId: null,
210
+ status: null,
211
+ startDate: null,
212
+ vVictimServiceDetails: null,
213
+ victimName: null
214
+ };
215
+ this._victimServicesComponent.addSafetyPlan(safetyPlan).subscribe((itms) => {
216
+ const victimServiceStatus = {
217
+ victimServiceStatusHistoryId: 0,
218
+ victimServiceId: itms.victimServiceId,
219
+ victimServiceStatusId: this.editSafetyPlan.victimServiceStatusId,
220
+ startDate: this.editSafetyPlan.startDate,
221
+ modifiedBy: this.staffId,
222
+ comment: 'test add safety plan'
223
+ };
224
+ this._victimServicesComponent.addVictimServiceStatus(victimServiceStatus).subscribe(() => {
225
+ console.log('check itms.victimServiceId iniside add victim serive status');
226
+ console.log(itms.victimServiceId);
227
+ const victimServiceDetail = {
228
+ victimServiceId: itms.victimServiceId,
229
+ victimServiceDetailId: 0,
230
+ victimServiceTypeId: victimServiceTypeId,
231
+ victimProgramProviderId: victimProgramProviderId,
232
+ modifiedBy: this.staffId,
233
+ victimProgramProvider: null
234
+ };
235
+ console.log('add plan provider here at insert');
236
+ this._victimServicesComponent.addPlanProvider(victimServiceDetail).subscribe(() => {
237
+ this.router.navigate(['saftyPlanDetail', itms.victimServiceId, this.victimId]);
238
+ });
239
+ });
240
+ });
241
+ }
242
+ else //update
243
+ {
244
+ const victimServiceDetail = {
245
+ victimServiceId: this.victimServiceId,
246
+ victimServiceDetailId: 0,
247
+ victimServiceTypeId: victimServiceTypeId,
248
+ victimProgramProviderId: victimProgramProviderId,
249
+ modifiedBy: this.staffId,
250
+ victimProgramProvider: null
251
+ };
252
+ console.log('add plan provider here at update');
253
+ this._victimServicesComponent.addPlanProvider(victimServiceDetail).subscribe(() => {
254
+ this.router.navigate(['saftyPlanDetail', this.victimServiceId, this.victimId]);
255
+ });
256
+ }
257
+ }
258
+ }
259
+ deleteProvider(victimProgramProviderId) {
260
+ this.commonDialogService
261
+ .confirm('', 'Do you want to delete this provider?', 'Yes', 'No')
262
+ .subscribe(res => {
263
+ this.result = res;
264
+ if (this.result) {
265
+ this._victimServicesComponent.deleteProvider(victimProgramProviderId, this.staffId)
266
+ .subscribe(result => {
267
+ this.snackBar.open('delete provider Successfully !', '', {
268
+ duration: 3000,
269
+ });
270
+ location.reload();
271
+ });
272
+ }
273
+ });
274
+ // location.reload();
275
+ }
276
+ saveSafetyPlan() {
277
+ if (this.editSafetyPlan.victimServiceId === undefined) {
278
+ const safetyPlan = {
279
+ victimId: this.victimId,
280
+ fullName: null,
281
+ victimServiceId: 0,
282
+ goal: this.editSafetyPlan.goal,
283
+ comment: this.editSafetyPlan.comment,
284
+ modifiedBy: this.staffId,
285
+ victimServiceStatusId: null,
286
+ status: null,
287
+ startDate: null,
288
+ vVictimServiceDetails: null,
289
+ victimName: null
290
+ };
291
+ this._victimServicesComponent.addSafetyPlan(safetyPlan).subscribe((itms) => {
292
+ const victimServiceStatus = {
293
+ victimServiceStatusHistoryId: 0,
294
+ victimServiceId: itms.victimServiceId,
295
+ victimServiceStatusId: this.editSafetyPlan.victimServiceStatusId,
296
+ startDate: this.editSafetyPlan.startDate,
297
+ modifiedBy: this.staffId,
298
+ comment: 'test add safety Plan'
299
+ };
300
+ this._victimServicesComponent.addVictimServiceStatus(victimServiceStatus).subscribe(resp => {
301
+ this.snackBar.open('Insert status successfully!', '', {
302
+ duration: 3000,
303
+ });
304
+ });
305
+ this.router.navigate(['saftyPlanDetail', itms.victimServiceId, this.victimId]);
306
+ });
307
+ }
308
+ else {
309
+ // this.editSafetyPlan.modifiedBy=this.loginStaff.staffId;
310
+ this.editSafetyPlan.modifiedBy = this.staffId;
311
+ this._victimServicesComponent.updateSafetyPlan(this.editSafetyPlan).subscribe(resp => {
312
+ // this.snackBar.open('update Successfully!', '', {
313
+ // duration: 3000,
314
+ // });
315
+ const victimServiceStatus = {
316
+ victimServiceStatusHistoryId: 0,
317
+ victimServiceId: this.editSafetyPlan.victimServiceId.toString(),
318
+ victimServiceStatusId: this.editSafetyPlan.victimServiceStatusId,
319
+ startDate: this.editSafetyPlan.startDate,
320
+ modifiedBy: this.staffId,
321
+ comment: 'test update safety Plan'
322
+ };
323
+ this._victimServicesComponent.addVictimServiceStatus(victimServiceStatus).subscribe();
324
+ this.router.navigate(['saftyPlanDetail', this.editSafetyPlan.victimServiceId, this.victimId]);
325
+ });
326
+ }
327
+ }
328
+ back() {
329
+ console.log('this.victimId');
330
+ console.log(this.victimId);
331
+ this.router.navigate(['saftyPlan', this.victimId]);
332
+ }
333
+ }
334
+ /** @nocollapse */ VictimSafetyPlanDetailComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: VictimSafetyPlanDetailComponent, deps: [{ token: i1.MatDialog }, { token: i2.NgcSmartVictimService }, { token: i3.HttpClient }, { token: i4.MatSnackBar }, { token: i5.ActivatedRoute }, { token: i5.Router }, { token: i6.CommonDialogService }, { token: i7.UntypedFormBuilder }], target: i0.ɵɵFactoryTarget.Component });
335
+ /** @nocollapse */ VictimSafetyPlanDetailComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: VictimSafetyPlanDetailComponent, selector: "ng-component", providers: [CommonDialogService], ngImport: i0, template: "<mat-card>\n <mat-card-header>\n \n </mat-card-header>\n <mat-card-content>\n <mat-toolbar color=\"primary\">\n <h4 class=\"card-header\" style=\"display: inline-block;\">Safety Plan</h4>\n </mat-toolbar>\n \n \n <div class='container'>\n <form [formGroup]=\"spForm\" #spDetailForm=\"ngForm\" >\n \n \n <div class=\"row\" ><b>Victim Name:</b> {{victimName}} </div>\n \n\n <div class=\"row\" > \n <mat-form-field >\n <mat-label>Goal:</mat-label>\n <input matInput formControlName=\"serviceGoal\" [(ngModel)]=\"editSafetyPlan.goal\" >\n </mat-form-field>\n \n </div>\n \n <div class=\"row\"> \n <mat-form-field>\n <mat-label>Goal Status:</mat-label>\n <mat-select formControlName=\"goalStatus\" [(ngModel)]=\"editSafetyPlan.victimServiceStatusId\" >\n <mat-option *ngFor=\" let victimServiceStatu of victimServiceStatus\" [value]=\"victimServiceStatu.victimServiceStatusId\" >{{victimServiceStatu.name}}</mat-option>\n </mat-select> \n </mat-form-field>\n </div>\n \n \n <div class=\"row\"> \n \n <mat-form-field>\n <mat-label>Goal Status Date:</mat-label>\n <input matInput \n formControlName=\"goalStatusDate\" \n [matDatepicker]=\"goalStatusDate\" \n placeholder=\"Choose a date\" [(ngModel)]=\"editSafetyPlan.startDate\" \n (click)=\"goalStatusDate.open()\" \n >\n \n <mat-datepicker-toggle matSuffix [for]=\"goalStatusDate\"></mat-datepicker-toggle>\n <mat-datepicker #goalStatusDate></mat-datepicker> \n </mat-form-field> \n\n\n <div class=\"help-block\" \n *ngIf=\"spForm.get('goalStatusDate').hasError('date') \n && (spForm.get('goalStatusDate').dirty || spForm.get('goalStatusDate').touched)\">\n <mat-error>Future Date is <strong>not allowed</strong> for goal status date</mat-error>\n </div>\n </div>\n\n \n <div class=\"row\" > \n <!-- <mat-form-field style=\"width: 200px;\"> -->\n <!-- <mat-label>Comment:</mat-label> \n <textarea mdInput \n class=\"textarea-content\"\n [(ngModel)]=\"editSafetyPlan.comment\"\n formControlName=\"comment\" \n cdkTextareaAutosize\n #autosize=\"cdkTextareaAutosize\"\n cdkAutosizeMinRows=\"8\"\n cdkAutosizeMaxRows=\"12\"\n >\n </textarea> -->\n <!-- </mat-form-field> -->\n\n\n\n <mat-form-field style=\"width: 400px;\">\n <mat-label>Comment:</mat-label>\n <textarea \n class=\"textarea-content\"\n matInput \n placeholder=\"\" \n formControlName=\"comment\" \n [(ngModel)]=\"editSafetyPlan.comment\"\n cdkTextareaAutosize\n #autosize=\"cdkTextareaAutosize\"\n cdkAutosizeMinRows=\"8\"\n cdkAutosizeMaxRows=\"12\">\n </textarea> \n\n \n </mat-form-field>\n\n </div>\n\n </form>\n </div><!--end form-->\n \n \n <br>\n\n <div class=\"row\"><b>Need and provider:</b><br> (click on a check box to select provider information)\n \n <mat-list>\n <mat-list-item *ngFor=\"let serviceType of victimServiceTypes; let i=index\" >\n <mat-checkbox class=\"example-margin\" name=\"victimService\" color =\"primary\" [checked]=\"evaluateSelection(serviceType.victimServiceTypeId)\" (change)=\"isInArray(serviceType.victimServiceTypeId,serviceType.name, $event);\" > {{serviceType.name}}</mat-checkbox>\n <div> &nbsp;&nbsp;</div>\n <div *ngFor=\"let provider of providerListCollection; let pi = index\" >\n <!-- <div *ngIf=\"provider.isDisplay && serviceType.victimServiceTypeId == provider.groupId \" class=\"Row\">\n \n <div class=\"serviceSelect\"> -->\n <!-- <mat-form-field> -->\n <!-- <mat-select name=\"provider\" id=\"provider.groupId\" [(ngModel)]=\"providerId\" > -->\n <!-- <mat-select name=\"provider\" id=\"provider.groupId\" [(value)]=\"providerId\" > \n <mat-option *ngFor=\" let providerOption of provider.collection\" [value]=\"providerOption.victimProgramProviderId\" >{{providerOption.victimProgramProvider}}</mat-option>\n </mat-select> -->\n <!-- </mat-form-field> -->\n \n <!-- </div>\n\n <div class=\"serviceButton\">\n <button mat-raised-button color=\"primary\" (click)=\"savePlanProvider(serviceType.victimServiceTypeId ,providerId)\">Add Provider</button>\n </div>\n </div> -->\n </div>\n <div *ngFor=\" let serviceprovider of editSafetyPlan.vVictimServiceDetails\" >\n \n <div *ngIf=\"serviceType.victimServiceTypeId===serviceprovider.victimServiceTypeId\" class=\"Row\" >\n <!-- . {{ serviceprovider.victimProgramProvider}}<button mat-raised-button color=\"primary\" (click)=\"deleteProvider(serviceprovider.victimServiceDetailId)\">Delete</button> <br> -->\n <div class=\"serviceSelect\" >\n . {{ serviceprovider.victimProgramProvider}}\n </div>\n <div class=\"serviceButton\">\n <button mat-raised-button color=\"primary\" (click)=\"deleteProvider(serviceprovider.victimServiceDetailId)\">Delete</button> \n </div>\n \n </div>\n \n </div>\n \n </mat-list-item> \n \n </mat-list>\n </div>\n \n \n \n \n\n\n\n\n\n\n \n \n <!-- <div class='row' >\n <div class='col-md-5 desc-label'><b>Victim Name:</b> {{victimName}} </div>\n <div class='col-md-7'> \n \n </div> \n </div> -->\n <!-- <div class='row' >\n <div class='col-md-5 desc-label'><b>Goal:<font color=\"red\">*</font></b></div>\n <div class='col-md-7'> \n <mat-form-field >\n <input matInput name=\"serviceGoal\" [(ngModel)]=\"editSafetyPlan.goal\" required placeholder=\"\">\n </mat-form-field>\n </div> \n </div>\n\n <div class='row' >\n <div class='col-md-5 desc-label'><b>Goal Status:<font color=\"red\">*</font></b></div>\n <div class='col-md-7'> \n <mat-select name=\"goalStatus\" [style.width]=\"'50%'\" [(ngModel)]=\"editSafetyPlan.victimServiceStatusId\" required>\n <mat-option *ngFor=\" let victimServiceStatu of victimServiceStatus\" [value]=\"victimServiceStatu.victimServiceStatusId\" >{{victimServiceStatu.name}}</mat-option>\n </mat-select>\n </div> \n </div>\n \n <div class='row' >\n <div class='col-md-5 desc-label'><b>Goal Status Date:<font color=\"red\">*</font></b></div>\n <div class='col-md-7'> \n <input matInput name=\"goalStatusDate\" [matDatepicker]=\"goalStatusDate\" placeholder=\"Choose a date\" [(ngModel)]=\"editSafetyPlan.startDate\" required>\n <mat-datepicker-toggle matSuffix [for]=\"goalStatusDate\"></mat-datepicker-toggle>\n <mat-datepicker #goalStatusDate></mat-datepicker> \n </div> \n </div>\n \n <div class='row' >\n <div class='col-md-5 desc-label'><b>Comment:</b></div>\n <div class='col-md-7'> \n <textarea mdInput placeholder=\"\" rows=\"10\" cols=\"50\" name=\"comment\" [(ngModel)]=\"editSafetyPlan.comment\"></textarea> \n </div> \n </div> -->\n\n \n <div class='row' >\n <div class='col-md-12 text-center'>\n <!-- <button type=\"button\" class=\"btn btn-default btn-small\" (click)=\"print()\">Print</button> -->\n <button mat-raised-button color=\"primary\" (click)=\"saveSafetyPlan()\" [disabled]=\"!spForm.valid\">Save</button>\n <!-- &nbsp;&nbsp;<button mat-raised-button color=\"primary\" (click)=\"commondialogRef.close()\">Cancel</button> -->\n &nbsp;&nbsp;<button mat-raised-button color=\"primary\" (click)=\"back()\">Back</button>\n </div> \n </div> \n\n <!--status hisotry-->\n \n <mat-table #table [dataSource]=\"victimServiceStatusHistoriesDataSource\" class=\"example-table\">\n <ng-container matColumnDef=\"startDate\">\n <mat-header-cell *matHeaderCellDef class=\"example-header-cell\">Start Date</mat-header-cell>\n <mat-cell *matCellDef=\"let row\" class=\"example-cell\"> {{row.startDate | date}} </mat-cell>\n </ng-container>\n\n\n <ng-container matColumnDef=\"victimServiceStatusId\">\n <mat-header-cell *matHeaderCellDef class=\"example-header-cell\">Status</mat-header-cell>\n <mat-cell *matCellDef=\"let row\" class=\"example-cell\"> {{row.victimServiceStatusId}} </mat-cell>\n </ng-container>\n \n \n <ng-container matColumnDef=\"comment\">\n <mat-header-cell *matHeaderCellDef class=\"example-header-cell\">Comment</mat-header-cell>\n <mat-cell *matCellDef=\"let row\" class=\"example-cell\"> {{row.comment}} </mat-cell>\n </ng-container>\n <mat-header-row *matHeaderRowDef=\"[ 'startDate', 'victimServiceStatusId', 'comment']\" class=\"example-header-row\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns:[ 'startDate', 'victimServiceStatusId', 'comment'];\" class=\"example-row\"></mat-row>\n </mat-table>\n\n \n \n\n</mat-card-content>\n</mat-card>", styles: ["div.serviceSelect{width:500px}div.serviceButton{width:20%}.container{margin:16px;display:grid;grid-template-columns:repeat(2,1fr);grid-gap:10px;grid-auto-rows:minmax(50px,auto);justify-items:stretch}.app-class .mat-list-item{height:auto}.textarea-content{width:500px}\n"], dependencies: [{ kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i7.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i7.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i9.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i10.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i11.MatCard, selector: "mat-card", exportAs: ["matCard"] }, { kind: "component", type: i11.MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: i11.MatCardContent, selector: "mat-card-content, [mat-card-content], [matCardContent]" }, { kind: "component", type: i12.MatList, selector: "mat-list, mat-action-list", inputs: ["disableRipple", "disabled"], exportAs: ["matList"] }, { kind: "component", type: i12.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["disableRipple", "disabled"], exportAs: ["matListItem"] }, { kind: "component", type: i13.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "directive", type: i14.CdkTextareaAutosize, selector: "textarea[cdkTextareaAutosize]", inputs: ["cdkAutosizeMinRows", "cdkAutosizeMaxRows", "cdkTextareaAutosize", "placeholder"], exportAs: ["cdkTextareaAutosize"] }, { kind: "directive", type: i15.MatError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i15.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i15.MatLabel, selector: "mat-label" }, { kind: "directive", type: i15.MatSuffix, selector: "[matSuffix]" }, { kind: "directive", type: i16.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i17.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i17.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i17.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: i18.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i19.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i20.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i20.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i20.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i20.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i20.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i20.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i20.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i20.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i20.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i20.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "pipe", type: i8.DatePipe, name: "date" }] });
336
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: VictimSafetyPlanDetailComponent, decorators: [{
337
+ type: Component,
338
+ args: [{ providers: [CommonDialogService], template: "<mat-card>\n <mat-card-header>\n \n </mat-card-header>\n <mat-card-content>\n <mat-toolbar color=\"primary\">\n <h4 class=\"card-header\" style=\"display: inline-block;\">Safety Plan</h4>\n </mat-toolbar>\n \n \n <div class='container'>\n <form [formGroup]=\"spForm\" #spDetailForm=\"ngForm\" >\n \n \n <div class=\"row\" ><b>Victim Name:</b> {{victimName}} </div>\n \n\n <div class=\"row\" > \n <mat-form-field >\n <mat-label>Goal:</mat-label>\n <input matInput formControlName=\"serviceGoal\" [(ngModel)]=\"editSafetyPlan.goal\" >\n </mat-form-field>\n \n </div>\n \n <div class=\"row\"> \n <mat-form-field>\n <mat-label>Goal Status:</mat-label>\n <mat-select formControlName=\"goalStatus\" [(ngModel)]=\"editSafetyPlan.victimServiceStatusId\" >\n <mat-option *ngFor=\" let victimServiceStatu of victimServiceStatus\" [value]=\"victimServiceStatu.victimServiceStatusId\" >{{victimServiceStatu.name}}</mat-option>\n </mat-select> \n </mat-form-field>\n </div>\n \n \n <div class=\"row\"> \n \n <mat-form-field>\n <mat-label>Goal Status Date:</mat-label>\n <input matInput \n formControlName=\"goalStatusDate\" \n [matDatepicker]=\"goalStatusDate\" \n placeholder=\"Choose a date\" [(ngModel)]=\"editSafetyPlan.startDate\" \n (click)=\"goalStatusDate.open()\" \n >\n \n <mat-datepicker-toggle matSuffix [for]=\"goalStatusDate\"></mat-datepicker-toggle>\n <mat-datepicker #goalStatusDate></mat-datepicker> \n </mat-form-field> \n\n\n <div class=\"help-block\" \n *ngIf=\"spForm.get('goalStatusDate').hasError('date') \n && (spForm.get('goalStatusDate').dirty || spForm.get('goalStatusDate').touched)\">\n <mat-error>Future Date is <strong>not allowed</strong> for goal status date</mat-error>\n </div>\n </div>\n\n \n <div class=\"row\" > \n <!-- <mat-form-field style=\"width: 200px;\"> -->\n <!-- <mat-label>Comment:</mat-label> \n <textarea mdInput \n class=\"textarea-content\"\n [(ngModel)]=\"editSafetyPlan.comment\"\n formControlName=\"comment\" \n cdkTextareaAutosize\n #autosize=\"cdkTextareaAutosize\"\n cdkAutosizeMinRows=\"8\"\n cdkAutosizeMaxRows=\"12\"\n >\n </textarea> -->\n <!-- </mat-form-field> -->\n\n\n\n <mat-form-field style=\"width: 400px;\">\n <mat-label>Comment:</mat-label>\n <textarea \n class=\"textarea-content\"\n matInput \n placeholder=\"\" \n formControlName=\"comment\" \n [(ngModel)]=\"editSafetyPlan.comment\"\n cdkTextareaAutosize\n #autosize=\"cdkTextareaAutosize\"\n cdkAutosizeMinRows=\"8\"\n cdkAutosizeMaxRows=\"12\">\n </textarea> \n\n \n </mat-form-field>\n\n </div>\n\n </form>\n </div><!--end form-->\n \n \n <br>\n\n <div class=\"row\"><b>Need and provider:</b><br> (click on a check box to select provider information)\n \n <mat-list>\n <mat-list-item *ngFor=\"let serviceType of victimServiceTypes; let i=index\" >\n <mat-checkbox class=\"example-margin\" name=\"victimService\" color =\"primary\" [checked]=\"evaluateSelection(serviceType.victimServiceTypeId)\" (change)=\"isInArray(serviceType.victimServiceTypeId,serviceType.name, $event);\" > {{serviceType.name}}</mat-checkbox>\n <div> &nbsp;&nbsp;</div>\n <div *ngFor=\"let provider of providerListCollection; let pi = index\" >\n <!-- <div *ngIf=\"provider.isDisplay && serviceType.victimServiceTypeId == provider.groupId \" class=\"Row\">\n \n <div class=\"serviceSelect\"> -->\n <!-- <mat-form-field> -->\n <!-- <mat-select name=\"provider\" id=\"provider.groupId\" [(ngModel)]=\"providerId\" > -->\n <!-- <mat-select name=\"provider\" id=\"provider.groupId\" [(value)]=\"providerId\" > \n <mat-option *ngFor=\" let providerOption of provider.collection\" [value]=\"providerOption.victimProgramProviderId\" >{{providerOption.victimProgramProvider}}</mat-option>\n </mat-select> -->\n <!-- </mat-form-field> -->\n \n <!-- </div>\n\n <div class=\"serviceButton\">\n <button mat-raised-button color=\"primary\" (click)=\"savePlanProvider(serviceType.victimServiceTypeId ,providerId)\">Add Provider</button>\n </div>\n </div> -->\n </div>\n <div *ngFor=\" let serviceprovider of editSafetyPlan.vVictimServiceDetails\" >\n \n <div *ngIf=\"serviceType.victimServiceTypeId===serviceprovider.victimServiceTypeId\" class=\"Row\" >\n <!-- . {{ serviceprovider.victimProgramProvider}}<button mat-raised-button color=\"primary\" (click)=\"deleteProvider(serviceprovider.victimServiceDetailId)\">Delete</button> <br> -->\n <div class=\"serviceSelect\" >\n . {{ serviceprovider.victimProgramProvider}}\n </div>\n <div class=\"serviceButton\">\n <button mat-raised-button color=\"primary\" (click)=\"deleteProvider(serviceprovider.victimServiceDetailId)\">Delete</button> \n </div>\n \n </div>\n \n </div>\n \n </mat-list-item> \n \n </mat-list>\n </div>\n \n \n \n \n\n\n\n\n\n\n \n \n <!-- <div class='row' >\n <div class='col-md-5 desc-label'><b>Victim Name:</b> {{victimName}} </div>\n <div class='col-md-7'> \n \n </div> \n </div> -->\n <!-- <div class='row' >\n <div class='col-md-5 desc-label'><b>Goal:<font color=\"red\">*</font></b></div>\n <div class='col-md-7'> \n <mat-form-field >\n <input matInput name=\"serviceGoal\" [(ngModel)]=\"editSafetyPlan.goal\" required placeholder=\"\">\n </mat-form-field>\n </div> \n </div>\n\n <div class='row' >\n <div class='col-md-5 desc-label'><b>Goal Status:<font color=\"red\">*</font></b></div>\n <div class='col-md-7'> \n <mat-select name=\"goalStatus\" [style.width]=\"'50%'\" [(ngModel)]=\"editSafetyPlan.victimServiceStatusId\" required>\n <mat-option *ngFor=\" let victimServiceStatu of victimServiceStatus\" [value]=\"victimServiceStatu.victimServiceStatusId\" >{{victimServiceStatu.name}}</mat-option>\n </mat-select>\n </div> \n </div>\n \n <div class='row' >\n <div class='col-md-5 desc-label'><b>Goal Status Date:<font color=\"red\">*</font></b></div>\n <div class='col-md-7'> \n <input matInput name=\"goalStatusDate\" [matDatepicker]=\"goalStatusDate\" placeholder=\"Choose a date\" [(ngModel)]=\"editSafetyPlan.startDate\" required>\n <mat-datepicker-toggle matSuffix [for]=\"goalStatusDate\"></mat-datepicker-toggle>\n <mat-datepicker #goalStatusDate></mat-datepicker> \n </div> \n </div>\n \n <div class='row' >\n <div class='col-md-5 desc-label'><b>Comment:</b></div>\n <div class='col-md-7'> \n <textarea mdInput placeholder=\"\" rows=\"10\" cols=\"50\" name=\"comment\" [(ngModel)]=\"editSafetyPlan.comment\"></textarea> \n </div> \n </div> -->\n\n \n <div class='row' >\n <div class='col-md-12 text-center'>\n <!-- <button type=\"button\" class=\"btn btn-default btn-small\" (click)=\"print()\">Print</button> -->\n <button mat-raised-button color=\"primary\" (click)=\"saveSafetyPlan()\" [disabled]=\"!spForm.valid\">Save</button>\n <!-- &nbsp;&nbsp;<button mat-raised-button color=\"primary\" (click)=\"commondialogRef.close()\">Cancel</button> -->\n &nbsp;&nbsp;<button mat-raised-button color=\"primary\" (click)=\"back()\">Back</button>\n </div> \n </div> \n\n <!--status hisotry-->\n \n <mat-table #table [dataSource]=\"victimServiceStatusHistoriesDataSource\" class=\"example-table\">\n <ng-container matColumnDef=\"startDate\">\n <mat-header-cell *matHeaderCellDef class=\"example-header-cell\">Start Date</mat-header-cell>\n <mat-cell *matCellDef=\"let row\" class=\"example-cell\"> {{row.startDate | date}} </mat-cell>\n </ng-container>\n\n\n <ng-container matColumnDef=\"victimServiceStatusId\">\n <mat-header-cell *matHeaderCellDef class=\"example-header-cell\">Status</mat-header-cell>\n <mat-cell *matCellDef=\"let row\" class=\"example-cell\"> {{row.victimServiceStatusId}} </mat-cell>\n </ng-container>\n \n \n <ng-container matColumnDef=\"comment\">\n <mat-header-cell *matHeaderCellDef class=\"example-header-cell\">Comment</mat-header-cell>\n <mat-cell *matCellDef=\"let row\" class=\"example-cell\"> {{row.comment}} </mat-cell>\n </ng-container>\n <mat-header-row *matHeaderRowDef=\"[ 'startDate', 'victimServiceStatusId', 'comment']\" class=\"example-header-row\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns:[ 'startDate', 'victimServiceStatusId', 'comment'];\" class=\"example-row\"></mat-row>\n </mat-table>\n\n \n \n\n</mat-card-content>\n</mat-card>", styles: ["div.serviceSelect{width:500px}div.serviceButton{width:20%}.container{margin:16px;display:grid;grid-template-columns:repeat(2,1fr);grid-gap:10px;grid-auto-rows:minmax(50px,auto);justify-items:stretch}.app-class .mat-list-item{height:auto}.textarea-content{width:500px}\n"] }]
339
+ }], ctorParameters: function () { return [{ type: i1.MatDialog }, { type: i2.NgcSmartVictimService }, { type: i3.HttpClient }, { type: i4.MatSnackBar }, { type: i5.ActivatedRoute }, { type: i5.Router }, { type: i6.CommonDialogService }, { type: i7.UntypedFormBuilder }]; } });
340
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmljdGltU2FmZXR5UGxhbkRldGFpbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ2Mtc21hcnQtdmljdGltL3NyYy9saWIvc2FmZXR5UGxhbi92aWN0aW1TYWZldHlQbGFuRGV0YWlsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nYy1zbWFydC12aWN0aW0vc3JjL2xpYi9zYWZldHlQbGFuL3ZpY3RpbVNhZmV0eVBsYW5EZXRhaWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGtCQUFrQixFQUFvQixrQkFBa0IsRUFBQyxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUlyRyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckQsT0FBTyxFQUFFLG1CQUFtQixFQUFDLE1BQU0sMENBQTBDLENBQUM7QUFDOUUsT0FBTyxFQUFFLFVBQVUsRUFBZSxNQUFNLHNCQUFzQixDQUFDO0FBRS9ELE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFekQsT0FBTyxFQUFFLGFBQWEsRUFBcUIsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUMsTUFBTSx5Q0FBeUMsQ0FBQTtBQUVoRixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFTN0QsTUFBTSxPQUFPLCtCQUErQjtJQWtDMUMsWUFDUyxNQUFpQixFQUNoQix3QkFBK0MsRUFD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RUFBRyxJQUFJLENBQUMsUUFBUSxDQUFFLENBQUMsQ0FBQztZQUU1RixDQUFDLENBQ1YsQ0FBQztTQUNIO0lBQ0gsQ0FBQztJQUVELElBQUk7UUFDRixPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzdCLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ3JELENBQUM7OytJQTljVSwrQkFBK0I7bUlBQS9CLCtCQUErQix1Q0FML0IsQ0FBQyxtQkFBbUIsQ0FBQywwQkNwQmxDLGdvaEJBeU9XOzJGRGhORSwrQkFBK0I7a0JBUDNDLFNBQVM7Z0NBRUcsQ0FBQyxtQkFBbUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdjU21hcnRWaWN0aW1TZXJ2aWNlIH0gZnJvbSAnLi4vc21hcnQtdmljdGltLnNlcnZpY2UnO1xuaW1wb3J0IHsgVW50eXBlZEZvcm1Db250cm9sLCBVbnR5cGVkRm9ybUdyb3VwLCBVbnR5cGVkRm9ybUJ1aWxkZXIsVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFZpY3RpbVNhZmV0eVBsYW4sVmljdGltU2VydmljZURldGFpbCxcbiAgVmljdGltU2VydmljZVN0YXR1c0hpc3RvcnksVmljdGltU2VydmljZVR5cGVQcm9ncmFtUHJvdmlkZXJNb2RlbCxcbiAgUHJvdmlkZXJMaXN0Q29sbGVjdGlvbk1vZGVsIH0gZnJvbSAnLi4vc21hcnQtdmljdGltLm1vZGVsJztcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBDb21tb25EaWFsb2dTZXJ2aWNlfSBmcm9tICcuLi8uL2NvbW1vbi1kaWFsb2cvY29tbW9uLWRpYWxvZy5zZXJ2aWNlJztcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgUm91dGVyLCBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBTZWxlY3RlZE9mZmVuZGVyLCBMb2dpblN0YWZmIH0gZnJvbSAnQGNzbWFydC9uZ2Mtc21hcnQtY29yZSc7XG5pbXBvcnQgeyBkYXRlVmFsaWRhdG9yLCBwYXNzRGF0ZVZhbGlkYXRvciB9IGZyb20gJy4uL3NoYXJlZC92YWxpZGF0b3JzJztcbmltcG9ydCB7IFNlcml2ZVByb3ZpZGVyQ29tcG9uZW50fSBmcm9tICcuLi9zYWZldHlQbGFuL3NlcnZpY2VQcm92aWRlci5jb21wb25lbnQnXG5pbXBvcnQgeyBQcm92aWRlcnNEaWFsb2dEYXRhfSBmcm9tICcuLi9zbWFydC12aWN0aW0ubW9kZWwnO1xuaW1wb3J0IHsgTWF0U25hY2tCYXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbmFjay1iYXInO1xuaW1wb3J0IHsgTWF0VGFibGVEYXRhU291cmNlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgdGVtcGxhdGVVcmw6ICcuL3ZpY3RpbVNhZmV0eVBsYW5EZXRhaWwuY29tcG9uZW50Lmh0bWwnLFxuICBwcm92aWRlcnM6IFtDb21tb25EaWFsb2dTZXJ2aWNlXSxcbiAgc3R5bGVVcmxzOiBbJy4vdmljdGltU2FmZXR5UGxhbi5jb21wb25lbnQuY3NzJ11cbiBcbn0pXG5cbmV4cG9ydCBjbGFzcyBWaWN0aW1TYWZldHlQbGFuRGV0YWlsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuXG4gIGhpZGRlbkFkZE5ld0ZsYWc6IGJvb2xlYW47XG4gIHNhZmV0eVBsYW5zOiBWaWN0aW1TYWZldHlQbGFuW107XG4gIHNhZmV0eVBsYW46IFZpY3RpbVNhZmV0eVBsYW47XG4gIGVkaXRTYWZldHlQbGFuOiBWaWN0aW1TYWZldHlQbGFuID0gPFZpY3RpbVNhZmV0eVBsYW4+e307XG4gIGVycm9yTWVzc2FnZTogc3RyaW5nO1xuICBjb250YWN0VHlwZXM6IGFueVtdO1xuICBjb250YWN0UHVycG9zZXM6IGFueVtdO1xuICB2aWN0aW1TZXJ2aWNlVHlwZXM6IGFueVtdO1xuICB2aWN0aW1TYWZldHlQbGFuczogVmljdGltU2FmZXR5UGxhbltdO1xuICB2aWN0aW1TZXJ2aWNlU3RhdHVzOiBhbnlbXTtcbiAgcHJvdmlkZXJMaXN0OiBWaWN0aW1TZXJ2aWNlVHlwZVByb2dyYW1Qcm92aWRlck1vZGVsW107XG4gIHByb3ZpZGVyTGlzdENvbGxlY3Rpb246UHJvdmlkZXJMaXN0Q29sbGVjdGlvbk1vZGVsW109W107XG4gIHZpY3RpbVNlcnZpY2VEZXRhaWw6IFZpY3RpbVNlcnZpY2VEZXRhaWxbXTtcbiAgaW5keDphbnk7XG4gIHNlcnZpY2VDaGVjayA9IFtdO1xuICB2aWN0aW1OYW1lOiBzdHJpbmc7XG4gIGlzRGlzcGxheTogYm9vbGVhbjtcbiAgc3RhZmZJZDogbnVtYmVyO1xuICB2aWN0aW1JZDogbnVtYmVyO1xuICB2aWN0aW1TZXJ2aWNlSWQ6IG51bWJlcjtcbiAgb2ZmZW5kZXJJZDogbnVtYmVyO1xuICBsb2dpblN0YWZmOiBMb2dpblN0YWZmO1xuICBwcml2YXRlIHN1YjogYW55O1xuICByZXN1bHQ6IGFueTtcbiAgdmljdGltU2VydmljZVN0YXR1c0hpc3Rvcmllc0RhdGFTb3VyY2U9IG5ldyAgTWF0VGFibGVEYXRhU291cmNlKCk7XG4gIHByb3ZpZGVySWQ6IHN0cmluZztcbiAgc2VsZWN0ZWQ6IHN0cmluZztcblxuXG4gIHNwRm9ybTogVW50eXBlZEZvcm1Hcm91cDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgZGlhbG9nOiBNYXREaWFsb2csXG4gICAgcHJpdmF0ZSBfdmljdGltU2VydmljZXNDb21wb25lbnQ6IE5nY1NtYXJ0VmljdGltU2VydmljZSxcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgcHVibGljIHNuYWNrQmFyOiBNYXRTbmFja0JhcixcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgY29tbW9uRGlhbG9nU2VydmljZTogQ29tbW9uRGlhbG9nU2VydmljZSxcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXIsXG4gICAgIFxuICApIHtcblxuICAgIHRoaXMuaW5pdEZvcm0oKTtcbiAgIH1cblxuICAgcHJpdmF0ZSBpbml0Rm9ybSgpIHtcblxuXHRcblx0XHRcdHRoaXMuc3BGb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICAgIHNlcnZpY2VHb2FsOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKCcnLCBWYWxpZGF0b3JzLmNvbXBvc2UoW1xuICAgICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWRcdFx0ICBdKSksXG4gICAgICAgICAgZ29hbFN0YXR1czogbmV3IFVudHlwZWRGb3JtQ29udHJvbCgnJywgVmFsaWRhdG9ycy5jb21wb3NlKFtcbiAgICAgICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWRcdFx0ICBdKSksXG4gICAgICAgICAgZ29hbFN0YXR1c0RhdGU6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woJycsIFZhbGlkYXRvcnMuY29tcG9zZShbXG4gICAgICAgICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLGRhdGVWYWxpZGF0b3IoKVx0XHQgIF0pKSxcbiAgICAgICAgICBjb21tZW50OiBuZXcgVW50eXBlZEZvcm1Db250cm9sKCcnLFZhbGlkYXRvcnMucmVxdWlyZWQpXG4gICAgICB9KTtcbiAgICAgIHRoaXMuc3BGb3JtLm1hcmtBc1ByaXN0aW5lKCk7XG4gICAgICB0aGlzLnNwRm9ybS5tYXJrQXNVbnRvdWNoZWQoKTtcbiAgICAgIFxuICAgIH1cbiBcbiAgbmdPbkluaXQoKSB7XG5cbiAgICBcblxuICAgIHZhciBkYXRhID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5kYXRhO1xuICAgIHRoaXMubG9naW5TdGFmZiA9IGRhdGEubG9naW5TdGFmZjtcbiAgICB0aGlzLnN0YWZmSWQgPSAgdGhpcy5sb2dpblN0YWZmLnN0YWZmSWQ7XG5cbiAgICB0aGlzLnN1YiA9IHRoaXMucm91dGUucGFyYW1zLnN1YnNjcmliZShwYXJhbXMgPT4ge1xuICAgICAgdGhpcy52aWN0aW1TZXJ2aWNlSWQgPSBwYXJhbXNbJ3ZpY3RpbVNlcnZpY2VJZCddO1xuICAgICAgdGhpcy52aWN0aW1JZCA9IHBhcmFtc1sndmljdGltSWQnXTtcbiBcbiAgICB9KTtcbiAgIFxuICAgIHRoaXMuaGlkZGVuQWRkTmV3RmxhZyA9IGZhbHNlO1xuICAgIHRoaXMuaXNEaXNwbGF5ID0gZmFsc2U7XG4gICBcbiBcblxuICAgICB0aGlzLl92aWN0aW1TZXJ2aWNlc0NvbXBvbmVudC5nZXRWaWN0aW1TZXJ2aWNlVHlwZXMoKS5zdWJzY3JpYmUoXG4gICAgICAoaXRlbXM6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnZpY3RpbVNlcnZpY2VUeXBlcyA9IGl0ZW1zO1xuICAgICAgfVxuICAgICk7XG5cbiAgICB0aGlzLl92aWN0aW1TZXJ2aWNlc0NvbXBvbmVudC5nZXRWaWN0aW1TZXJ2aWNlU3RhdHVzKCkuc3Vic2NyaWJlKFxuICAgICAgKGl0ZW1zOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy52aWN0aW1TZXJ2aWNlU3RhdHVzID0gaXRlbXM7XG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMuX3ZpY3RpbVNlcnZpY2VzQ29tcG9uZW50LmdldFZpY3RpbSh0aGlzLnZpY3RpbUlkKS5zdWJzY3JpYmUoXG4gICAgICAoaXRlbXM6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnZpY3RpbU5hbWUgPSBpdGVtcy5maXJzdE5hbWUgKyAnLCAnICsgaXRlbXMubGFzdE5hbWU7XG4gICAgICB9XG4gICAgKTtcblxuIFxuICAgICBcbiAgLy8tLS0tLS0tLS0tLS0tLS1ncmFwaFFMLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgIC8vIHRoaXMuZ2V0VmljdGltU2VydmljZVR5cGVQcm9ncmFtUHJvdmlkZXJzKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XG4gICAgICAvLyB0aGlzLnByb3ZpZGVyTGlzdCA9IHJlc3VsdDtcbiAgICAgIC8vIH0pO1xuICAgICAgLy8gY29uc29sZS5sb2coJ3RoaXMudmljdGltU2VydmljZUlkJyk7XG4gICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLnZpY3RpbVNlcnZpY2VJZCk7XG4gICAgIFxuICAgIGlmICh0aGlzLnZpY3RpbVNlcnZpY2VJZCE9MCl7XG4gICAgICB0aGlzLl92aWN0aW1TZXJ2aWNlc0NvbXBvbmVudC5nZXRWaWN0aW1TZXJ2aWNlcyh0aGlzLnZpY3RpbVNlcnZpY2VJZCkuc3Vic2NyaWJlKFxuICAgICAgICB2aWN0aW1TYWZldHlQbGFucyA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ3ZpY3RpbVNhZmV0eVBsYW5zJyk7XG4gICAgICAgICAgY29uc29sZS5sb2codmljdGltU2FmZXR5UGxhbnMpO1xuXG4gICAgICAgICAgdGhpcy5lZGl0U2FmZXR5UGxhbiA9IHZpY3RpbVNhZmV0eVBsYW5zWzBdO1xuICAgICAgICAgIHRoaXMudmljdGltSWQgPSAgdmljdGltU2FmZXR5UGxhbnNbMF0udmljdGltSWQ7XG4gICAgICAgIFxuICAgICAgICAgIGNvbnNvbGUubG9nKCd0aGlzLmVkaXRTYWZldHlQbGFuJyk7XG4gICAgICAgICAgY29uc29sZS5sb2codGhpcy5lZGl0U2FmZXR5UGxhbik7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coJ3RoaXMuZWRpdFNhZmV0eVBsYW4uZ29hbCcpO1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuZWRpdFNhZmV0eVBsYW4uZ29hbCk7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coJ3RoaXMuZWRpdFNhZmV0eVBsYW5bMF0uZ29hbCcpO1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuZWRpdFNhZmV0eVBsYW5bMF0uZ29hbCk7XG5cbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgICAgdGhpcy5fdmljdGltU2VydmljZXNDb21wb25lbnQuZ2V0U2VydmljZVN0YXR1c0hpc3Rvcmllcyh0aGlzLnZpY3RpbVNlcnZpY2VJZCkuc3Vic2NyaWJlKFxuICAgICAgICB2aWN0aW1TZXJ2aWNlU3RhdHVzSGlzdG9yaWVzID0+IHtcbiAgICAgICAgLy8gdGhpcy52aWN0aW1TZXJ2aWNlU3RhdHVzSGlzdG9yaWVzID0gdmljdGltU2VydmljZVN0YXR1c0hpc3RvcmllcztcbiAgICAgICAgdGhpcy52aWN0aW1TZXJ2aWNlU3RhdHVzSGlzdG9yaWVzRGF0YVNvdXJjZS5kYXRhID0gdmljdGltU2VydmljZVN0YXR1c0hpc3RvcmllcztcbiAgICAgICAgfVxuICAgICAgKTtcblxuICAgIH1cblxuICAgIHRoaXMubG9hZFByb3ZpZGVyKCk7XG4gXG4gIH1cbiAgLy9wYXNzIGluIGlkXG5pc0luQXJyYXkocHJvdmlkZXJMaXN0Q29sbGVjdGlvbktleTpzdHJpbmcsIHNlcnZpY2VUeXBlTmFtZTogc3RyaW5nLCBldmVudCl7XG5cbiAgICBjb25zb2xlLmxvZygncHJvdmlkZXJMaXN0Q29sbGVjdGlvbktleScpO1xuICAgIGNvbnNvbGUubG9nKHByb3ZpZGVyTGlzdENvbGxlY3Rpb25LZXkpO1xuXG5cbiAgICBjb25zb2xlLmxvZygnc2VydmljZVR5cGVOYW1lJyk7XG4gICAgY29uc29sZS5sb2coc2VydmljZVR5cGVOYW1lKTtcblxuICAgIGNvbnNvbGUubG9nKCdldmVudC5zb3VyY2UudmFsdWUnKTtcbiAgICBjb25zb2xlLmxvZyhldmVudC5jaGVja2VkKTtcblxuICAgIGlmIChldmVudC5jaGVja2VkID09IHRydWUpe1xuXG4gICAgICBmb3IobGV0IGo9MDtqPHRoaXMucHJvdmlkZXJMaXN0Q29sbGVjdGlvbi5sZW5ndGg7aisrKXtcbiAgICAgICAgaWYocHJvdmlkZXJMaXN0Q29sbGVjdGlvbktleT09dGhpcy5wcm92aWRlckxpc3RDb2xsZWN0aW9uW2pdLmdyb3VwSWQpe1xuICAgICAgICAgIHRoaXMucHJvdmlkZXJMaXN0Q29sbGVjdGlvbltqXS5pc0Rpc3BsYXk9IXRoaXMucHJvdmlkZXJMaXN0Q29sbGVjdGlvbltqXS5pc0Rpc3BsYXk7XG5cbiAgICAgXG5cbiAgICAgICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oU2VyaXZlUHJvdmlkZXJDb21wb25lbnQsIHtcbiAgICAgICAgICB3aWR0aDogJzUwMHB4JyxcbiAgICAgICAgICBkYXRhOiA8UHJvdmlkZXJzRGlhbG9nRGF0YT57XG4gICAgICAgICAgXG4gICAgICAgICAgIHNlcnZpY2VUeXBlOnNlcnZpY2VUeXBlTmFtZSxcbiAgICAgICAgICAgc2VydmljZVR5cGVJZDogcHJvdmlkZXJMaXN0Q29sbGVjdGlvbktleSxcbiAgICAgICAgICAgcHJvdmlkZXJDb2xsZWN0aW9uczogWy4uLnRoaXMucHJvdmlkZXJMaXN0Q29sbGVjdGlvbl0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwYW5lbENsYXNzOiAnZm9ybUZpZWxkV2lkdGg0ODAnLFxuICAgICAgICB9KTtcblxuXG5cbiAgICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdUaGUgZGlhbG9nIHdhcyBjbG9zZWQnKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhyZXN1bHQpO1xuICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdUaGUgZGlhbG9nIHdhcyBjbG9zZWQsIGluc2lkZSByZXN1bHQnKTtcbiAgICAgICAgICAgIHRoaXMuc2F2ZVBsYW5Qcm92aWRlcihwcm92aWRlckxpc3RDb2xsZWN0aW9uS2V5LHJlc3VsdC52b3RlZVByb3ZpZGVySWQpO1xuICAgICAgICAgICBcbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgIFxuICAgICAgICB9KTtcbiAgXG4gICAgICAgICAvLyByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIH0vL2lmIGV2ZW50LmNoZWNrZWQgPT0gdHJ1ZVxuICAgICAvL3RoaXMucm91dGVyLm5hdmlnYXRlKFsnc2FmdHlQbGFuRGV0YWlsJywgdGhpcy52aWN0aW1TZXJ2aWNlSWQsICB0aGlzLnZpY3RpbUlkIF0pOyBcbiAgICAgIFxuICB9XG5cbmxvYWRQcm92aWRlcigpeyBcblxuIHRoaXMucHJvdmlkZXJMaXN0Q29sbGVjdGlvbj1bXTtcbiAgICB0aGlzLl92aWN0aW1TZXJ2aWNlc0NvbXBvbmVudC5nZXR2VmljdGltU2VydmljZVR5cGVQcm9ncmFtUHJvdmlkZXJzKClcbiAgICAgLnN1YnNjcmliZShcbiAgICAgIChwcm92aWRlckxpc3Q6VmljdGltU2VydmljZVR5cGVQcm9ncmFtUHJvdmlkZXJNb2RlbFtdICk9PnsgXG4gICAgICAgIGlmKHByb3ZpZGVyTGlzdCl7XG4gICBcbiAgICAgICAgICBsZXQgcHJvdmlkZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICBmb3IobGV0IGk9MDtpPHByb3ZpZGVyTGlzdC5sZW5ndGg7aSsrKXtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKCFwcm92aWRlcnNbcHJvdmlkZXJMaXN0W2ldLnZpY3RpbVNlcnZpY2VUeXBlSWRdKSB7XG4gICAgICAgICAgICAgIHByb3ZpZGVyc1twcm92aWRlckxpc3RbaV0udmljdGltU2VydmljZVR5cGVJZF0gPSBbXTtcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgaWYgKCB0aGlzLmVkaXRTYWZldHlQbGFuLnZWaWN0aW1TZXJ2aWNlRGV0YWlscyAhPSBudWxsICl7XG4gICAgICAgICAgICAgIGZvciAobGV0IGo9MDsgajx0aGlzLmVkaXRTYWZldHlQbGFuLnZWaWN0aW1TZXJ2aWNlRGV0YWlscy5sZW5ndGg7IGorKyl7XG4gICAgICAgICAgICAgICAgaWYgKCBwcm92aWRlckxpc3RbaV0udmljdGltU2VydmljZVR5cGVJZCA9PSB0aGlzLmVkaXRTYWZldHlQbGFuLnZWaWN0aW1TZXJ2aWNlRGV0YWlsc1tqXS52aWN0aW1TZXJ2aWNlSWQudG9TdHJpbmcoKSApe1xuICAgICAgICAgICAgICAgICAgdGhpcy5pc0Rpc3BsYXkgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLnByb3ZpZGVyTGlzdENvbGxlY3Rpb24ucHVzaCh7IGdyb3VwSWQ6IHByb3ZpZGVyTGlzdFtpXS52aWN0aW1TZXJ2aWNlVHlwZUlkLGlzRGlzcGxheTp0aGlzLmlzRGlzcGxheSwgY29sbGVjdGlvbjogcHJvdmlkZXJzW3Byb3ZpZGVyTGlzdFtpXS52aWN0aW1TZXJ2aWNlVHlwZUlkXSB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcHJvdmlkZXJzW3Byb3ZpZGVyTGlzdFtpXS52aWN0aW1TZXJ2aWNlVHlwZUlkXS5wdXNoKHByb3ZpZGVyTGlzdFtpXSk7XG4gICAgICAgICAgIFxuICAgICAgICAgIH1cbiAgICAgICAgIFxuXG4gICAgICAgIH1cblxuICAgICAgfSk7XG5cbiAgfVxuLy8tLS0tLS0tLS0tLS0tLS1ncmFwaFFMLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vICAgZ2V0VmljdGltU2VydmljZVR5cGVQcm9ncmFtUHJvdmlkZXJzKCk6IE9ic2VydmFibGU8VmljdGltU2VydmljZVR5cGVQcm9ncmFtUHJvdmlkZXJNb2RlbFtdPiB7XG4vLyAgICAgY29uc3QgcXVlcnlTdHJpbmcgPSBgXG4vLyAgICAgICAgIHtcbi8vICAgICAgICAgICBmaW5kVmljdGltU2VydmljZVR5cGVQcm9ncmFtUHJvdmlkZXJzIHtcbi8vICAgICAgICAgICAgICAgICBkYXRhIHtcbi8vICAgICAgICAgICAgICAgICAgIHZpY3RpbVNlcnZpY2VUeXBlUHJvZ3JhbVByb3ZpZGVySWRcbi8vICAgICAgICAgICAgICAgICAgIHZpY3RpbVNlcnZpY2VUeXBlXG4vLyAgICAgICAgICAgICAgICAgICB2aWN0aW1Qcm9ncmFtUHJvdmlkZXJcbi8vICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgfWA7XG4gXG4vLyAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PGFueT4oZW52aXJvbm1lbnQuc21hcnRBcGlVcmwsIHsgcXVlcnk6IHF1ZXJ5U3RyaW5nIH0pXG4vLyAgICAgICAgIC5tYXAocmVzdWx0ID0+IHtcbi8vICAgICAgICAgcmV0dXJuIHJlc3VsdC5kYXRhLmZpbmRWaWN0aW1TZXJ2aWNlVHlwZVByb2dyYW1Qcm92aWRlcnMuZGF0YTtcbi8vICAgICB9KTtcbi8vIH1cblxuICBldmFsdWF0ZVNlbGVjdGlvbih2aWN0aW1TZXJ2aWNlVHlwZUlkOiBzdHJpbmcpIHtcbiAgIGlmICh0aGlzLmVkaXRTYWZldHlQbGFuLnZWaWN0aW1TZXJ2aWNlRGV0YWlscykge1xuICAgIHJldHVybiB0aGlzLmVkaXRTYWZldHlQbGFuLnZWaWN0aW1TZXJ2aWNlRGV0YWlscy5maW5kSW5kZXgociA9PiByLnZpY3RpbVNlcnZpY2VUeXBlSWQgPT09IHZpY3RpbVNlcnZpY2VUeXBlSWQpID49IDA7XG4gICB9XG4gIH1cblxuXG5zYXZlUGxhblByb3ZpZGVyKHZpY3RpbVNlcnZpY2VUeXBlSWQ6IHN0cmluZyx2aWN0aW1Qcm9ncmFtUHJvdmlkZXJJZDogc3RyaW5nKXtcblxuICBjb25zb2xlLmxvZygnc2F2ZVBsYW5Qcm92aWRlcicpO1xuICBjb25zb2xlLmxvZyh2aWN0aW1TZXJ2aWNlVHlwZUlkKTtcbiAgY29uc29sZS5sb2codmljdGltUHJvZ3JhbVByb3ZpZGVySWQpO1xuXG4gIGlmICh2aWN0aW1Qcm9ncmFtUHJvdmlkZXJJZCA9PT0gXCJcIiB8fCB2aWN0aW1Qcm9ncmFtUHJvdmlkZXJJZD09PSBudWxsIHx8IHZpY3RpbVByb2dyYW1Qcm92aWRlcklkID09PSB1bmRlZmluZWQpe1xuICBcbiAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ1BsZWFzZSBwaWNrIGEgcHJvZ3JhbSBvbiB0aGUgZHJvcCBkb3duIGxpc3QgIScsICcnLCB7IGR1cmF0aW9uOiAxMjAsfSk7XG4gICAvLyBhbGVydCgnUGxlYXNlIHBpY2sgYSBwcm9ncmFtIG9uIHRoZSBkcm9wIGRvd24gbGlzdCAhJyk7XG5cbiAgfWVsc2VcbiAge1xuICAgIFxuICBpZiAoIHRoaXMudmljdGltU2VydmljZUlkID09IDApe1xuICAgLy9pbnNlcnRcbiAgIGNvbnNvbGUubG9nKCdpbnNlcnQgbmV3IHBsYW4nKTtcbiAgIGNvbnN0IHNhZmV0eVBsYW46IFZpY3RpbVNhZmV0eVBsYW4gPSB7XG4gICAgdmljdGltSWQ6dGhpcy52aWN0aW1JZCxcbiAgICBmdWxsTmFtZTogbnVsbCxcbiAgICB2aWN0aW1TZXJ2aWNlSWQ6IDAsXG4gICAgZ29hbDp0aGlzLmVkaXRTYWZldHlQbGFuLmdvYWwsXG4gICAgY29tbWVudDogdGhpcy5lZGl0U2FmZXR5UGxhbi5jb21tZW50LFxuICAgIG1vZGlmaWVkQnk6dGhpcy5zdGFmZklkLFxuICAgIHZpY3RpbVNlcnZpY2VTdGF0dXNJZDogbnVsbCxcbiAgICBzdGF0dXM6IG51bGwsXG4gICAgc3RhcnREYXRlOiBudWxsLFxuICAgIHZWaWN0aW1TZXJ2aWNlRGV0YWlsczogbnVsbCxcbiAgICB2aWN0aW1OYW1lOiBudWxsXG59O1xudGhpcy5fdmljdGltU2VydmljZXNDb21wb25lbnQuYWRkU2FmZXR5UGxhbihzYWZldHlQbGFuKS5zdWJzY3JpYmUoXG4gIChpdG1zOmFueSk9PntcbiAgICBjb25zdCB2aWN0aW1TZXJ2aWNlU3RhdHVzOiBWaWN0aW1TZXJ2aWNlU3RhdHVzSGlzdG9yeT0ge1xuICAgICAgdmljdGltU2VydmljZVN0YXR1c0hpc3RvcnlJZDowLFxuICAgICAgdmljdGltU2VydmljZUlkOiBpdG1zLnZpY3RpbVNlcnZpY2VJZCxcbiAgICAgIHZpY3RpbVNlcnZpY2VTdGF0dXNJZDogdGhpcy5lZGl0U2FmZXR5UGxhbi52aWN0aW1TZXJ2aWNlU3RhdHVzSWQgLFxuICAgICAgc3RhcnREYXRlOiB0aGlzLmVkaXRTYWZldHlQbGFuLnN0YXJ0RGF0ZSxcbiAgICAgIG1vZGlmaWVkQnk6dGhpcy5zdGFmZklkLFxuICAgICAgY29tbWVudDondGVzdCBhZGQgc2FmZXR5IHBsYW4nXG4gICAgICB9O1xuXG4gICAgdGhpcy5fdmljdGltU2VydmljZXNDb21wb25lbnQuYWRkVmljdGltU2VydmljZVN0YXR1cyh2aWN0aW1TZXJ2aWNlU3RhdHVzKS5zdWJzY3JpYmUoXG4gXG4gICAgICAoKSA9PntcbiAgICAgICAgY29uc29sZS5sb2coJ2NoZWNrIGl0bXMudmljdGltU2VydmljZUlkIGluaXNpZGUgYWRkIHZpY3RpbSBzZXJpdmUgc3RhdHVzJyk7XG4gICAgICAgIGNvbnNvbGUubG9nKGl0bXMudmljdGltU2VydmljZUlkKTtcblxuICAgICAgICBjb25zdCB2aWN0aW1TZXJ2aWNlRGV0YWlsOiBWaWN0aW1TZXJ2aWNlRGV0YWlsID0ge1xuICAgICAgICAgIHZpY3RpbVNlcnZpY2VJZDogaXRtcy52aWN0aW1TZXJ2aWNlSWQsXG4gICAgICAgICAgdmljdGltU2VydmljZURldGFpbElkOiAwLFxuICAgICAgICAgIHZpY3RpbVNlcnZpY2VUeXBlSWQ6IHZpY3RpbVNlcnZpY2VUeXBlSWQsXG4gICAgICAgICAgdmljdGltUHJvZ3JhbVByb3ZpZGVySWQ6IHZpY3RpbVByb2dyYW1Qcm92aWRlcklkLFxuICAgICAgICAgIG1vZGlmaWVkQnk6IHRoaXMuc3RhZmZJZCxcbiAgICAgICAgICB2aWN0aW1Qcm9ncmFtUHJvdmlkZXI6IG51bGxcbiAgICAgICAgfTtcbiAgICBcbiAgICAgICAgY29uc29sZS5sb2coJ2FkZCBwbGFuIHByb3ZpZGVyIGhlcmUgYXQgaW5zZXJ0Jyk7XG4gICAgXG4gICAgICAgIHRoaXMuX3ZpY3RpbVNlcnZpY2VzQ29tcG9uZW50LmFkZFBsYW5Qcm92aWRlcih2aWN0aW1TZXJ2aWNlRGV0YWlsKS5zdWJzY3JpYmUoXG5cbiAgICAgICAgICAoKSA9PntcbiAgICAgICAgICBcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJ3NhZnR5UGxhbkRldGFpbCcsICBpdG1zLnZpY3RpbVNlcnZpY2VJZCwgIHRoaXMudmljdGltSWQgXSk7IFxuXG4gICAgICAgICAgfVxuICAgICAgICAgKTtcblxuICAgICAgfVxuICAgICApO1xuICAgXG4gIFxuICBcbiAgfVxuXG5cbik7XG4gIH1cbiAgZWxzZS8vdXBkYXRlXG4gICAge1xuICAgICAgY29uc3QgdmljdGltU2VydmljZURldGFpbDogVmljdGltU2VydmljZURldGFpbCA9IHtcbiAgICAgICAgdmljdGltU2VydmljZUlkOiB0aGlzLnZpY3RpbVNlcnZpY2VJZCxcbiAgICAgICAgdmljdGltU2VydmljZURldGFpbElkOiAwLFxuICAgICAgICB2aWN0aW1TZXJ2aWNlVHlwZUlkOiB2aWN0aW1TZXJ2aWNlVHlwZUlkLFxuICAgICAgICB2aWN0aW1Qcm9ncmFtUHJvdmlkZXJJZDogdmljdGltUHJvZ3JhbVByb3ZpZGVySWQsXG4gICAgICAgIG1vZGlmaWVkQnk6IHRoaXMuc3RhZmZJZCxcbiAgICAgICAgdmljdGltUHJvZ3JhbVByb3ZpZGVyOiBudWxsXG4gICAgICB9O1xuICAgICAgY29uc29sZS5sb2coJ2FkZCBwbGFuIHByb3ZpZGVyIGhlcmUgYXQgdXBkYXRlJyk7XG4gICAgICB0aGlzLl92aWN0aW1TZXJ2aWNlc0NvbXBvbmVudC5hZGRQbGFuUHJvdmlkZXIodmljdGltU2VydmljZURldGFpbCkuc3Vic2NyaWJlKFxuXG4gICAgICAgICgpID0+e1xuICAgICAgICAgIFxuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnc2FmdHlQbGFuRGV0YWlsJywgIHRoaXMudmljdGltU2VydmljZUlkLCAgdGhpcy52aWN0aW1JZCBdKTsgXG5cbiAgICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG5cbn1cblxuXG4gIGRlbGV0ZVByb3ZpZGVyKHZpY3RpbVByb2dyYW1Qcm92aWRlcklkOiBzdHJpbmcpe1xuXG4gICAgdGhpcy5jb21tb25EaWFsb2dTZXJ2aWNlXG4gICAgLmNvbmZpcm0oJycsICdEbyB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBwcm92aWRlcj8nLCAnWWVzJywgJ05vJylcbiAgICAuc3Vic2NyaWJlKHJlcyA9PiB7dGhpcy5yZXN1bHQgPSAgcmVzO1xuICAgICAgICBpZiAodGhpcy5yZXN1bHQpIHtcbiAgICAgICAgICB0aGlzLl92aWN0aW1TZXJ2aWNlc0NvbXBvbmVudC5kZWxldGVQcm92aWRlcih2aWN0aW1Qcm9ncmFtUHJvdmlkZXJJZCwgdGhpcy5zdGFmZklkKVxuICAgICAgICAgIC5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbignZGVsZXRlIHByb3ZpZGVyIFN1Y2Nlc3NmdWxseSAhJywgJycsIHtcbiAgICAgICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTtcbiAgICAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgIFxuICAgICAgICB9XG5cbiAgICAgfSk7XG4gXG4gICAgLy8gbG9jYXRpb24ucmVsb2FkKCk7XG5cbiAgfVxuc2F2ZVNhZmV0eVBsYW4oKSB7XG5cbiAgICAgICAgaWYgKHRoaXMuZWRpdFNhZmV0eVBsYW4udmljdGltU2VydmljZUlkID09PSB1bmRlZmluZWQgKSB7XG5cbiAgICAgICAgICBjb25zdCBzYWZldHlQbGFuOiBWaWN0aW1TYWZldHlQbGFuID0ge1xuICAgICAgICAgICAgdmljdGltSWQ6IHRoaXMudmljdGltSWQsXG4gICAgICAgICAgICBmdWxsTmFtZTogbnVsbCxcbiAgICAgICAgICAgIHZpY3RpbVNlcnZpY2VJZDogMCxcbiAgICAgICAgICAgIGdvYWw6dGhpcy5lZGl0U2FmZXR5UGxhbi5nb2FsLFxuICAgICAgICAgICAgY29tbWVudDogdGhpcy5lZGl0U2FmZXR5UGxhbi5jb21tZW50LFxuICAgICAgICAgICAgbW9kaWZpZWRCeTp0aGlzLnN0YWZmSWQsXG4gICAgICAgICAgICB2aWN0aW1TZXJ2aWNlU3RhdHVzSWQ6IG51bGwsXG4gICAgICAgICAgICBzdGF0dXM6IG51bGwsXG4gICAgICAgICAgICBzdGFydERhdGU6IG51bGwsXG4gICAgICAgICAgICB2VmljdGltU2VydmljZURldGFpbHM6IG51bGwsXG4gICAgICAgICAgICB2aWN0aW1OYW1lOiBudWxsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX3ZpY3RpbVNlcnZpY2VzQ29tcG9uZW50LmFkZFNhZmV0eVBsYW4oc2FmZXR5UGxhbikuc3Vic2NyaWJlKFxuICAgICAgICAgIChpdG1zOmFueSk9PntcbiAgICAgICAgICAgIGNvbnN0IHZpY3RpbVNlcnZpY2VTdGF0dXM6IFZpY3RpbVNlcnZpY2VTdGF0dXNIaXN0b3J5PSB7XG4gICAgICAgICAgICAgIHZpY3RpbVNlcnZpY2VTdGF0dXNIaXN0b3J5SWQ6MCxcbiAgICAgICAgICAgICAgdmljdGltU2VydmljZUlkOiBpdG1zLnZpY3RpbVNlcnZpY2VJZCxcbiAgICAgICAgICAgICAgdmljdGltU2VydmljZVN0YXR1c0lkOiB0aGlzLmVkaXRTYWZldHlQbGFuLnZpY3RpbVNlcnZpY2VTdGF0dXNJZCAsXG4gICAgICAgICAgICAgIHN0YXJ0RGF0ZTogdGhpcy5lZGl0U2FmZXR5UGxhbi5zdGFydERhdGUsXG4gICAgICAgICAgICAgIG1vZGlmaWVkQnk6dGhpcy5zdGFmZklkLFxuICAgICAgICAgICAgICBjb21tZW50Oid0ZXN0IGFkZCBzYWZldHkgUGxhbidcbiAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdGhpcy5fdmljdGltU2VydmljZXNDb21wb25lbnQuYWRkVmljdGltU2VydmljZVN0YXR1cyh2aWN0aW1TZXJ2aWNlU3RhdHVzKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgIHJlc3A9PntcbiAgICAgICAgICAgICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ0luc2VydCBzdGF0dXMgc3VjY2Vzc2Z1bGx5IScsICcnLCB7XG4gICAgICAgICAgICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgXG4gICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnc2FmdHlQbGFuRGV0YWlsJywgIGl0bXMudmljdGltU2VydmljZUlkLCAgdGhpcy52aWN0aW1JZCBdKTsgXG4gICAgICAgICAgfVxuXG5cbiAgICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdGhpcy5lZGl0U2FmZXR5UGxhbi5tb2RpZmllZEJ5PXRoaXMubG9naW5TdGFmZi5zdGFmZklkO1xuICAgICAgdGhpcy5lZGl0U2FmZXR5UGxhbi5tb2RpZmllZEJ5ID10aGlzLnN0YWZmSWQ7XG4gICAgICB0aGlzLl92aWN0aW1TZXJ2aWNlc0NvbXBvbmVudC51cGRhdGVTYWZldHlQbGFuKHRoaXMuZWRpdFNhZmV0eVBsYW4pLnN1YnNjcmliZShcbiAgICAgICAgcmVzcD0+e1xuICAgICAgICAgICAgLy8gIHRoaXMuc25hY2tCYXIub3BlbigndXBkYXRlIFN1Y2Nlc3NmdWxseSEnLCAnJywge1xuICAgICAgICAgICAgLy8gIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICAgICAgLy8gICAgICAgfSk7XG5cblxuXG4gICAgICAgICAgICBjb25zdCB2aWN0aW1TZXJ2aWNlU3RhdHVzOiBWaWN0aW1TZXJ2aWNlU3RhdHVzSGlzdG9yeT0ge1xuICAgICAgICAgICAgICB2aWN0aW1TZXJ2aWNlU3RhdHVzSGlzdG9yeUlkOjAsXG4gICAgICAgICAgICAgIHZpY3RpbVNlcnZpY2VJZDogdGhpcy5lZGl0U2FmZXR5UGxhbi52aWN0aW1TZXJ2aWNlSWQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgdmljdGltU2VydmljZVN0YXR1c0lkOiB0aGlzLmVkaXRTYWZldHlQbGFuLnZpY3RpbVNlcnZpY2VTdGF0dXNJZCAsXG4gICAgICAgICAgICAgIHN0YXJ0RGF0ZTogdGhpcy5lZGl0U2FmZXR5UGxhbi5zdGFydERhdGUsXG4gICAgICAgICAgICAgIG1vZGlmaWVkQnk6dGhpcy5zdGFmZklkLFxuICAgICAgICAgICAgICBjb21tZW50Oid0ZXN0IHVwZGF0ZSBzYWZldHkgUGxhbidcbiAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdGhpcy5fdmljdGltU2VydmljZXNDb21wb25lbnQuYWRkVmljdGltU2VydmljZVN0YXR1cyh2aWN0aW1TZXJ2aWNlU3RhdHVzKS5zdWJzY3JpYmUoKTtcblxuICAgICAgICAgXG4gICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnc2FmdHlQbGFuRGV0YWlsJywgIHRoaXMuZWRpdFNhZmV0eVBsYW4udmljdGltU2VydmljZUlkLCAgdGhpcy52aWN0aW1JZCBdKTsgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgfVxuICAgICAgKTtcbiAgICB9IFxuICB9XG5cbiAgYmFjaygpe1xuICAgIGNvbnNvbGUubG9nKCd0aGlzLnZpY3RpbUlkJyk7XG4gICAgY29uc29sZS5sb2codGhpcy52aWN0aW1JZCk7XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWydzYWZ0eVBsYW4nLCB0aGlzLnZpY3RpbUlkXSk7IFxuICB9XG4gXG5cbn1cblxuIiwiPG1hdC1jYXJkPlxuICAgICAgICA8bWF0LWNhcmQtaGVhZGVyPlxuICAgICAgICAgICAgXG4gICAgICAgIDwvbWF0LWNhcmQtaGVhZGVyPlxuICAgICAgICAgPG1hdC1jYXJkLWNvbnRlbnQ+XG4gICAgICAgIDxtYXQtdG9vbGJhciAgY29sb3I9XCJwcmltYXJ5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XCJjYXJkLWhlYWRlclwiIHN0eWxlPVwiZGlzcGxheTogaW5saW5lLWJsb2NrO1wiPlNhZmV0eSBQbGFuPC9oND5cbiAgICAgICAgPC9tYXQtdG9vbGJhcj5cbiBcbiAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdjb250YWluZXInPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cInNwRm9ybVwiICNzcERldGFpbEZvcm09XCJuZ0Zvcm1cIiA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiID48Yj5WaWN0aW0gTmFtZTo8L2I+IHt7dmljdGltTmFtZX19IDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgPiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPkdvYWw6PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0ICBmb3JtQ29udHJvbE5hbWU9XCJzZXJ2aWNlR29hbFwiIFsobmdNb2RlbCldPVwiZWRpdFNhZmV0eVBsYW4uZ29hbFwiID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPiAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+R29hbCBTdGF0dXM6PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0ICBmb3JtQ29udHJvbE5hbWU9XCJnb2FsU3RhdHVzXCIgIFsobmdNb2RlbCldPVwiZWRpdFNhZmV0eVBsYW4udmljdGltU2VydmljZVN0YXR1c0lkXCIgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCIgbGV0IHZpY3RpbVNlcnZpY2VTdGF0dSBvZiB2aWN0aW1TZXJ2aWNlU3RhdHVzXCIgW3ZhbHVlXT1cInZpY3RpbVNlcnZpY2VTdGF0dS52aWN0aW1TZXJ2aWNlU3RhdHVzSWRcIiA+e3t2aWN0aW1TZXJ2aWNlU3RhdHUubmFtZX19PC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj4gIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+R29hbCBTdGF0dXMgRGF0ZTo8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImdvYWxTdGF0dXNEYXRlXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF0RGF0ZXBpY2tlcl09XCJnb2FsU3RhdHVzRGF0ZVwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJDaG9vc2UgYSBkYXRlXCIgWyhuZ01vZGVsKV09XCJlZGl0U2FmZXR5UGxhbi5zdGFydERhdGVcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJnb2FsU3RhdHVzRGF0ZS5vcGVuKClcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZSBtYXRTdWZmaXggW2Zvcl09XCJnb2FsU3RhdHVzRGF0ZVwiPjwvbWF0LWRhdGVwaWNrZXItdG9nZ2xlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1kYXRlcGlja2VyICNnb2FsU3RhdHVzRGF0ZT48L21hdC1kYXRlcGlja2VyPiAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD4gXG5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlbHAtYmxvY2tcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic3BGb3JtLmdldCgnZ29hbFN0YXR1c0RhdGUnKS5oYXNFcnJvcignZGF0ZScpIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHNwRm9ybS5nZXQoJ2dvYWxTdGF0dXNEYXRlJykuZGlydHkgfHwgc3BGb3JtLmdldCgnZ29hbFN0YXR1c0RhdGUnKS50b3VjaGVkKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvcj5GdXR1cmUgRGF0ZSBpcyA8c3Ryb25nPm5vdCBhbGxvd2VkPC9zdHJvbmc+IGZvciBnb2FsIHN0YXR1cyBkYXRlPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiID4gIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bWF0LWZvcm0tZmllbGQgc3R5bGU9XCJ3aWR0aDogMjAwcHg7XCI+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bWF0LWxhYmVsPkNvbW1lbnQ6PC9tYXQtbGFiZWw+ICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbWRJbnB1dCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dGFyZWEtY29udGVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImVkaXRTYWZldHlQbGFuLmNvbW1lbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiY29tbWVudFwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2RrVGV4dGFyZWFBdXRvc2l6ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2F1dG9zaXplPVwiY2RrVGV4dGFyZWFBdXRvc2l6ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZGtBdXRvc2l6ZU1pblJvd3M9XCI4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNka0F1dG9zaXplTWF4Um93cz1cIjEyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGV4dGFyZWE+ICAgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDwvbWF0LWZvcm0tZmllbGQ+IC0tPlxuXG5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIHN0eWxlPVwid2lkdGg6IDQwMHB4O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPkNvbW1lbnQ6PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0YXJlYS1jb250ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXQgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImNvbW1lbnRcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJlZGl0U2FmZXR5UGxhbi5jb21tZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2RrVGV4dGFyZWFBdXRvc2l6ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjYXV0b3NpemU9XCJjZGtUZXh0YXJlYUF1dG9zaXplXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2RrQXV0b3NpemVNaW5Sb3dzPVwiOFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNka0F1dG9zaXplTWF4Um93cz1cIjEyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGV4dGFyZWE+IFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+PCEtLWVuZCBmb3JtLS0+XG4gICAgICAgICAgICAgICAgICAgICAgIFxuICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+PGI+TmVlZCBhbmQgcHJvdmlkZXI6PC9iPjxicj4gKGNsaWNrIG9uIGEgY2hlY2sgYm94IHRvIHNlbGVjdCBwcm92aWRlciBpbmZvcm1hdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxpc3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWxpc3QtaXRlbSAqbmdGb3I9XCJsZXQgc2VydmljZVR5cGUgb2YgdmljdGltU2VydmljZVR5cGVzOyBsZXQgaT1pbmRleFwiID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jaGVja2JveCBjbGFzcz1cImV4YW1wbGUtbWFyZ2luXCIgbmFtZT1cInZpY3RpbVNlcnZpY2VcIiAgY29sb3IgPVwicHJpbWFyeVwiIFtjaGVja2VkXT1cImV2YWx1YXRlU2VsZWN0aW9uKHNlcnZpY2VUeXBlLnZpY3RpbVNlcnZpY2VUeXBlSWQpXCIgIChjaGFuZ2UpPVwiaXNJbkFycmF5KHNlcnZpY2VUeXBlLnZpY3RpbVNlcnZpY2VUeXBlSWQsc2VydmljZVR5cGUubmFtZSwgJGV2ZW50KTtcIiA+IHt7c2VydmljZVR5cGUubmFtZX19PC9tYXQtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+ICZuYnNwOyZuYnNwOzwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcHJvdmlkZXIgb2YgcHJvdmlkZXJMaXN0Q29sbGVjdGlvbjsgbGV0IHBpID0gaW5kZXhcIiAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiAqbmdJZj1cInByb3ZpZGVyLmlzRGlzcGxheSAmJiBzZXJ2aWNlVHlwZS52aWN0aW1TZXJ2aWNlVHlwZUlkID09IHByb3ZpZGVyLmdyb3VwSWQgXCIgY2xhc3M9XCJSb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZVNlbGVjdFwiPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8bWF0LWZvcm0tZmllbGQ+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1zZWxlY3QgIG5hbWU9XCJwcm92aWRlclwiIGlkPVwicHJvdmlkZXIuZ3JvdXBJZFwiIFsobmdNb2RlbCldPVwicHJvdmlkZXJJZFwiID4gIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1zZWxlY3QgIG5hbWU9XCJwcm92aWRlclwiIGlkPVwicHJvdmlkZXIuZ3JvdXBJZFwiIFsodmFsdWUpXT1cInByb3ZpZGVySWRcIiA+IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwiIGxldCBwcm92aWRlck9wdGlvbiBvZiBwcm92aWRlci5jb2xsZWN0aW9uXCIgW3ZhbHVlXT1cInByb3ZpZGVyT3B0aW9uLnZpY3RpbVByb2dyYW1Qcm92aWRlcklkXCIgPnt7cHJvdmlkZXJPcHRpb24udmljdGltUHJvZ3JhbVByb3ZpZGVyfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8L21hdC1mb3JtLWZpZWxkPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2VCdXR0b25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cInNhdmVQbGFuUHJvdmlkZXIoc2VydmljZVR5cGUudmljdGltU2VydmljZVR5cGVJZCAscHJvdmlkZXJJZClcIj5BZGQgUHJvdmlkZXI8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cIiBsZXQgc2VydmljZXByb3ZpZGVyIG9mIGVkaXRTYWZldHlQbGFuLnZWaWN0aW1TZXJ2aWNlRGV0YWlsc1wiICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzZXJ2aWNlVHlwZS52aWN0aW1TZXJ2aWNlVHlwZUlkPT09c2VydmljZXByb3ZpZGVyLnZpY3RpbVNlcnZpY2VUeXBlSWRcIiAgY2xhc3M9XCJSb3dcIiA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gLiB7eyBzZXJ2aWNlcHJvdmlkZXIudmljdGltUHJvZ3JhbVByb3ZpZGVyfX08YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJkZWxldGVQcm92aWRlcihzZXJ2aWNlcHJvdmlkZXIudmljdGltU2VydmljZURldGFpbElkKVwiPkRlbGV0ZTwvYnV0dG9uPiA8YnI+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZVNlbGVjdFwiID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiB7eyBzZXJ2aWNlcHJvdmlkZXIudmljdGltUHJvZ3JhbVByb3ZpZGVyfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlQnV0dG9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiZGVsZXRlUHJvdmlkZXIoc2VydmljZXByb3ZpZGVyLnZpY3RpbVNlcnZpY2VEZXRhaWxJZClcIj5EZWxldGU8L2J1dHRvbj4gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtbGlzdC1pdGVtPiAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtbGlzdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgIFxuXG5cblxuXG5cblxuICAgICAgICAgXG4gIFxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPSdyb3cnID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nY29sLW1kLTUgZGVzYy1sYWJlbCc+PGI+VmljdGltIE5hbWU6PC9iPiB7e3ZpY3RpbU5hbWV9fSA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nY29sLW1kLTcnPiAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9J3JvdycgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdjb2wtbWQtNSBkZXNjLWxhYmVsJz48Yj5Hb2FsOjxmb250IGNvbG9yPVwicmVkXCI+KjwvZm9udD48L2I+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J2NvbC1tZC03Jz4gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBuYW1lPVwic2VydmljZUdvYWxcIiBbKG5nTW9kZWwpXT1cImVkaXRTYWZldHlQbGFuLmdvYWxcIiByZXF1aXJlZCBwbGFjZWhvbGRlcj1cIlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ncm93JyA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J2NvbC1tZC01IGRlc2MtbGFiZWwnPjxiPkdvYWwgU3RhdHVzOjxmb250IGNvbG9yPVwicmVkXCI+KjwvZm9udD48L2I+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J2NvbC1tZC03Jz4gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgIG5hbWU9XCJnb2FsU3RhdHVzXCIgIFtzdHlsZS53aWR0aF09XCInNTAlJ1wiICBbKG5nTW9kZWwpXT1cImVkaXRTYWZldHlQbGFuLnZpY3RpbVNlcnZpY2VTdGF0dXNJZFwiIHJlcXVpcmVkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwiIGxldCB2aWN0aW1TZXJ2aWNlU3RhdHUgb2YgdmljdGltU2VydmljZVN0YXR1c1wiIFt2YWx1ZV09XCJ2aWN0aW1TZXJ2aWNlU3RhdHUudmljdGltU2VydmljZVN0YXR1c0lkXCIgPnt7dmljdGltU2VydmljZVN0YXR1Lm5hbWV9fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J3JvdycgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdjb2wtbWQtNSBkZXNjLWxhYmVsJz48Yj5Hb2FsIFN0YXR1cyBEYXRlOjxmb250IGNvbG9yPVwicmVkXCI+KjwvZm9udD48L2I+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J2NvbC1tZC03Jz4gICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBuYW1lPVwiZ29hbFN0YXR1c0RhdGVcIiBbbWF0RGF0ZXBpY2tlcl09XCJnb2FsU3RhdHVzRGF0ZVwiIHBsYWNlaG9sZGVyPVwiQ2hvb3NlIGEgZGF0ZVwiIFsobmdNb2RlbCldPVwiZWRpdFNhZmV0eVBsYW4uc3RhcnREYXRlXCIgIHJlcXVpcmVkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlci10b2dnbGUgbWF0U3VmZml4IFtmb3JdPVwiZ29hbFN0YXR1c0RhdGVcIj48L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWRhdGVwaWNrZXIgI2dvYWxTdGF0dXNEYXRlPjwvbWF0LWRhdGVwaWNrZXI+ICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdyb3cnID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nY29sLW1kLTUgZGVzYy1sYWJlbCc+PGI+Q29tbWVudDo8L2I+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J2NvbC1tZC03Jz4gICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBtZElucHV0IHBsYWNlaG9sZGVyPVwiXCIgIHJvd3M9XCIxMFwiIGNvbHM9XCI1MFwiIG5hbWU9XCJjb21tZW50XCIgWyhuZ01vZGVsKV09XCJlZGl0U2FmZXR5UGxhbi5jb21tZW50XCI+PC90ZXh0YXJlYT4gIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuXG4gICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdyb3cnID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nY29sLW1kLTEyIHRleHQtY2VudGVyJz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBidG4tc21hbGxcIiAoY2xpY2spPVwicHJpbnQoKVwiPlByaW50PC9idXR0b24+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJzYXZlU2FmZXR5UGxhbigpXCIgW2Rpc2FibGVkXT1cIiFzcEZvcm0udmFsaWRcIj5TYXZlPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gJm5ic3A7Jm5ic3A7PGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAgKGNsaWNrKT1cImNvbW1vbmRpYWxvZ1JlZi5jbG9zZSgpXCI+Q2FuY2VsPC9idXR0b24+IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDsmbmJzcDs8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiICAoY2xpY2spPVwiYmFjaygpXCI+QmFjazwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IFxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tc3RhdHVzIGhpc290cnktLT5cbiAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC10YWJsZSAjdGFibGUgW2RhdGFTb3VyY2VdPVwidmljdGltU2VydmljZVN0YXR1c0hpc3Rvcmllc0RhdGFTb3VyY2VcIiBjbGFzcz1cImV4YW1wbGUtdGFibGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJzdGFydERhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJleGFtcGxlLWhlYWRlci1jZWxsXCI+U3RhcnQgRGF0ZTwvbWF0LWhlYWRlci1jZWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiIGNsYXNzPVwiZXhhbXBsZS1jZWxsXCI+IHt7cm93LnN0YXJ0RGF0ZSB8IGRhdGV9fSA8L21hdC1jZWxsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwidmljdGltU2VydmljZVN0YXR1c0lkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBjbGFzcz1cImV4YW1wbGUtaGVhZGVyLWNlbGxcIj5TdGF0dXM8L21hdC1oZWFkZXItY2VsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCIgY2xhc3M9XCJleGFtcGxlLWNlbGxcIj4ge3tyb3cudmljdGltU2VydmljZVN0YXR1c0lkfX0gPC9tYXQtY2VsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImNvbW1lbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwiZXhhbXBsZS1oZWFkZXItY2VsbFwiPkNvbW1lbnQ8L21hdC1oZWFkZXItY2VsbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCIgY2xhc3M9XCJleGFtcGxlLWNlbGxcIj4ge3tyb3cuY29tbWVudH19IDwvbWF0LWNlbGw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJbICdzdGFydERhdGUnLCAndmljdGltU2VydmljZVN0YXR1c0lkJywgJ2NvbW1lbnQnXVwiIGNsYXNzPVwiZXhhbXBsZS1oZWFkZXItcm93XCI+PC9tYXQtaGVhZGVyLXJvdz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6WyAnc3RhcnREYXRlJywgJ3ZpY3RpbVNlcnZpY2VTdGF0dXNJZCcsICdjb21tZW50J107XCIgY2xhc3M9XCJleGFtcGxlLXJvd1wiPjwvbWF0LXJvdz5cbiAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC10YWJsZT5cblxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgXG5cbjwvbWF0LWNhcmQtY29udGVudD5cbjwvbWF0LWNhcmQ+Il19