@huntsman-cancer-institute/input 17.3.4 → 17.4.0
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/date/date-date.component.d.ts +3 -1
- package/date/date-validator.d.ts +3 -0
- package/esm2022/date/date-date-range.component.mjs +1 -1
- package/esm2022/date/date-date.component.mjs +47 -94
- package/esm2022/date/date-validator.mjs +12 -4
- package/esm2022/select/custom-combobox.component.mjs +3 -3
- package/fesm2022/huntsman-cancer-institute-input.mjs +61 -100
- package/fesm2022/huntsman-cancer-institute-input.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -22,6 +22,7 @@ export declare class DateComponent extends DateBase implements OnInit, DoCheck,
|
|
|
22
22
|
inputData: Object;
|
|
23
23
|
modifiedData: Object;
|
|
24
24
|
inputDataChange: EventEmitter<any>;
|
|
25
|
+
dateValid: EventEmitter<boolean>;
|
|
25
26
|
dateForm: UntypedFormGroup;
|
|
26
27
|
dateInput: UntypedFormControl;
|
|
27
28
|
validate: boolean;
|
|
@@ -48,6 +49,7 @@ export declare class DateComponent extends DateBase implements OnInit, DoCheck,
|
|
|
48
49
|
* @returns {any}
|
|
49
50
|
*/
|
|
50
51
|
private ngbDateToString;
|
|
52
|
+
getDateValid(): boolean;
|
|
51
53
|
static ɵfac: i0.ɵɵFactoryDeclaration<DateComponent, never>;
|
|
52
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<DateComponent, "hci-date", never, { "dateFormat": { "alias": "dateFormat"; "required": false; }; "minDate": { "alias": "minDate"; "required": false; }; "maxDate": { "alias": "maxDate"; "required": false; }; "label": { "alias": "label"; "required": false; }; "inputData": { "alias": "inputData"; "required": false; }; "modifiedData": { "alias": "modifiedData"; "required": false; }; }, { "inputDataChange": "inputDataChange"; }, never, never, false, never>;
|
|
54
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<DateComponent, "hci-date", never, { "dateFormat": { "alias": "dateFormat"; "required": false; }; "minDate": { "alias": "minDate"; "required": false; }; "maxDate": { "alias": "maxDate"; "required": false; }; "label": { "alias": "label"; "required": false; }; "inputData": { "alias": "inputData"; "required": false; }; "modifiedData": { "alias": "modifiedData"; "required": false; }; }, { "inputDataChange": "inputDataChange"; "dateValid": "dateValid"; }, never, never, false, never>;
|
|
53
55
|
}
|
package/date/date-validator.d.ts
CHANGED
|
@@ -8,6 +8,9 @@ export declare class DateValidator {
|
|
|
8
8
|
static dateRangeValidator(ac: AbstractControl): {
|
|
9
9
|
dateRangeValidator: boolean;
|
|
10
10
|
};
|
|
11
|
+
static dateInvalidValidator(ac: AbstractControl): {
|
|
12
|
+
dateInvalidValidator: boolean;
|
|
13
|
+
};
|
|
11
14
|
static convertNgbStructToDate(struct: any): {
|
|
12
15
|
year: any;
|
|
13
16
|
month: number;
|
|
@@ -80,7 +80,7 @@ export class DateRangeComponent {
|
|
|
80
80
|
[maxDate]="maxEndDate">
|
|
81
81
|
</hci-date>
|
|
82
82
|
</div>
|
|
83
|
-
`, isInline: true, dependencies: [{ kind: "component", type: i1.DateComponent, selector: "hci-date", inputs: ["dateFormat", "minDate", "maxDate", "label", "inputData", "modifiedData"], outputs: ["inputDataChange"] }] }); }
|
|
83
|
+
`, isInline: true, dependencies: [{ kind: "component", type: i1.DateComponent, selector: "hci-date", inputs: ["dateFormat", "minDate", "maxDate", "label", "inputData", "modifiedData"], outputs: ["inputDataChange", "dateValid"] }] }); }
|
|
84
84
|
}
|
|
85
85
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: DateRangeComponent, decorators: [{
|
|
86
86
|
type: Component,
|
|
@@ -21,6 +21,7 @@ export class DateComponent extends DateBase {
|
|
|
21
21
|
// Binded data from the parent component.
|
|
22
22
|
this.dateFormat = "shortDate";
|
|
23
23
|
this.inputDataChange = new EventEmitter();
|
|
24
|
+
this.dateValid = new EventEmitter();
|
|
24
25
|
// only validate if user is typing
|
|
25
26
|
this.validate = false;
|
|
26
27
|
this.focused = false;
|
|
@@ -30,7 +31,7 @@ export class DateComponent extends DateBase {
|
|
|
30
31
|
*/
|
|
31
32
|
ngOnInit() {
|
|
32
33
|
this.dateForm = this.formBuilder.group({
|
|
33
|
-
dateInput: new UntypedFormControl("", [DateValidator.dateFormatValidator, DateValidator.dateRangeValidator])
|
|
34
|
+
dateInput: new UntypedFormControl("", [DateValidator.dateFormatValidator, DateValidator.dateRangeValidator, DateValidator.dateInvalidValidator])
|
|
34
35
|
});
|
|
35
36
|
this.onChanges();
|
|
36
37
|
this.updateInternalDataFromModel();
|
|
@@ -104,45 +105,35 @@ export class DateComponent extends DateBase {
|
|
|
104
105
|
this.state = 0;
|
|
105
106
|
this.dateForm.controls["dateInput"].setValue("");
|
|
106
107
|
this.inputDataChange.emit(this.inputData);
|
|
108
|
+
this.dateValid.emit(true);
|
|
107
109
|
}
|
|
108
110
|
onKeyUpInput(event) {
|
|
109
111
|
// Check for when the input is deleted before being saved
|
|
110
|
-
if (event.key === "Delete" || event.key === "Backspace") {
|
|
111
|
-
|
|
112
|
-
this.clear();
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
// update range so that the date range validator can run accurately
|
|
116
|
-
DateValidator.minValue = this.minDate;
|
|
117
|
-
DateValidator.maxValue = this.maxDate;
|
|
118
|
-
// Get the updated dateForm value
|
|
119
|
-
let eventTarget = event.target;
|
|
120
|
-
let inputValue = eventTarget.value;
|
|
121
|
-
this.dateForm.controls["dateInput"].patchValue(inputValue);
|
|
122
|
-
// if we have a good date and is within the range update the picker
|
|
123
|
-
if (DateValidator.inRange(this.dateForm.controls["dateInput"])) {
|
|
124
|
-
this.validate = false;
|
|
125
|
-
this.inputData = this.datePipe.transform(this.dateForm.controls["dateInput"].value, this.dateFormat);
|
|
126
|
-
this.updateInternalDataFromModel();
|
|
127
|
-
this.dateForm.controls["dateInput"].setValue(this.inputData);
|
|
128
|
-
this.inputDataChange.emit(this.inputData);
|
|
112
|
+
if ((event.key === "Delete" || event.key === "Backspace") && this.dateForm.controls["dateInput"].value.length === 0) {
|
|
113
|
+
this.clear();
|
|
129
114
|
}
|
|
130
115
|
else {
|
|
131
|
-
|
|
116
|
+
// update range so that the date range validator can run accurately
|
|
117
|
+
DateValidator.minValue = this.minDate;
|
|
118
|
+
DateValidator.maxValue = this.maxDate;
|
|
119
|
+
// Get the updated dateForm value
|
|
120
|
+
let eventTarget = event.target;
|
|
121
|
+
let inputValue = eventTarget.value;
|
|
122
|
+
this.dateForm.controls["dateInput"].patchValue(inputValue);
|
|
123
|
+
// if we have a good date and is within the range update the picker
|
|
124
|
+
if (DateValidator.inRange(this.dateForm.controls["dateInput"])) {
|
|
125
|
+
this.validate = false;
|
|
126
|
+
this.getDateValid();
|
|
127
|
+
this.inputData = this.datePipe.transform(this.dateForm.controls["dateInput"].value, this.dateFormat);
|
|
128
|
+
this.updateInternalDataFromModel();
|
|
129
|
+
this.dateForm.controls["dateInput"].setValue(this.inputData);
|
|
130
|
+
this.inputDataChange.emit(this.inputData);
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
this.validate = true;
|
|
134
|
+
this.getDateValid();
|
|
135
|
+
}
|
|
132
136
|
}
|
|
133
|
-
// // only validate if user is typing
|
|
134
|
-
// if (!this.validate) {
|
|
135
|
-
// this.validate = true;
|
|
136
|
-
// this.dateForm.controls["dateInput"].setValue("");
|
|
137
|
-
//
|
|
138
|
-
// // clear the date picker
|
|
139
|
-
// this.modifiedData = null;
|
|
140
|
-
// this.inputData = null;
|
|
141
|
-
// let today: Date = new Date();
|
|
142
|
-
// this.startDate = {year: today.getFullYear(), month: today.getMonth() + 1, day: today.getDate()};
|
|
143
|
-
// this.state = 0;
|
|
144
|
-
// this.inputDataChange.emit(this.inputData);
|
|
145
|
-
// }
|
|
146
137
|
}
|
|
147
138
|
/**
|
|
148
139
|
* NgbDateStruct stores day, month and year. Convert this to ISO8601.
|
|
@@ -159,8 +150,20 @@ export class DateComponent extends DateBase {
|
|
|
159
150
|
}
|
|
160
151
|
return date.year + "-" + ((date.month < 10) ? "0" : "") + date.month + "-" + ((date.day < 10) ? "0" : "") + date.day + "T12:00-06:00";
|
|
161
152
|
}
|
|
153
|
+
getDateValid() {
|
|
154
|
+
if (this.dateForm.get("dateInput").hasError("dateFormatValidator")
|
|
155
|
+
|| this.dateForm.get("dateInput").hasError("dateRangeValidator")
|
|
156
|
+
|| this.dateForm.get("dateInput").hasError("dateInvalidValidator")) {
|
|
157
|
+
this.dateValid.emit(false);
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
this.dateValid.emit(true);
|
|
162
|
+
return true;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
162
165
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: DateComponent, deps: [{ token: i0.ElementRef }, { token: i1.UntypedFormBuilder }, { token: i2.DatePipe }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
163
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.2", type: DateComponent, selector: "hci-date", inputs: { dateFormat: "dateFormat", minDate: "minDate", maxDate: "maxDate", label: "label", inputData: "inputData", modifiedData: "modifiedData" }, outputs: { inputDataChange: "inputDataChange" }, host: { listeners: { "document:click": "handleOutsideEvent($event)" } }, providers: [DatePipe, DateValidator], viewQueries: [{ propertyName: "dp", first: true, predicate: ["dp"], descendants: true }], usesInheritance: true, ngImport: i0, template: `
|
|
166
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.2", type: DateComponent, selector: "hci-date", inputs: { dateFormat: "dateFormat", minDate: "minDate", maxDate: "maxDate", label: "label", inputData: "inputData", modifiedData: "modifiedData" }, outputs: { inputDataChange: "inputDataChange", dateValid: "dateValid" }, host: { listeners: { "document:click": "handleOutsideEvent($event)" } }, providers: [DatePipe, DateValidator], viewQueries: [{ propertyName: "dp", first: true, predicate: ["dp"], descendants: true }], usesInheritance: true, ngImport: i0, template: `
|
|
164
167
|
<div class="form-group">
|
|
165
168
|
<div class="input-group d-flex">
|
|
166
169
|
<form [formGroup]="dateForm" class="flex-grow-1">
|
|
@@ -181,43 +184,17 @@ export class DateComponent extends DateBase {
|
|
|
181
184
|
class="invalid-date">Enter date as M/D/YYYY or MM/DD/YYYY</div>
|
|
182
185
|
<div *ngIf="validate && dateForm.get('dateInput').hasError('dateRangeValidator')"
|
|
183
186
|
class="invalid-date">Invalid Date Range</div>
|
|
187
|
+
<div *ngIf="validate && dateForm.get('dateInput').hasError('dateInvalidValidator')"
|
|
188
|
+
class="invalid-date">Not a real date</div>
|
|
184
189
|
</div>
|
|
185
190
|
</form>
|
|
186
|
-
<!--
|
|
187
|
-
We will replace the nbg date picker with material date picker
|
|
188
|
-
-->
|
|
189
|
-
<!-- <form [formGroup]="dateForm" class="flex-grow-1">-->
|
|
190
|
-
<!-- <div class="date-wrapper">-->
|
|
191
|
-
<!-- <div class="input-group-append">-->
|
|
192
|
-
<!-- <mat-form-field appearance="outline" [style.padding-top.em]="0.5"-->
|
|
193
|
-
<!-- [style.padding-bottom.em]="0.5">-->
|
|
194
|
-
<!-- <input matInput (keypress)="onKeyPressInput($event)"-->
|
|
195
|
-
<!-- [min]="minDate" [max]="maxDate" [matDatepicker]="datePicker"-->
|
|
196
|
-
<!-- formControlName="dateInput" placeholder="{{label}}" aria-label="date"-->
|
|
197
|
-
<!-- aria-describedby="basic-addon2">-->
|
|
198
|
-
<!-- <mat-datepicker-toggle matSuffix [for]="datePicker"></mat-datepicker-toggle>-->
|
|
199
|
-
<!-- <mat-datepicker #datePicker></mat-datepicker>-->
|
|
200
|
-
<!-- <mat-error *ngIf="validate && dateForm.get('dateInput').hasError('dateFormatValidator')"-->
|
|
201
|
-
<!-- class="invalid-date">-->
|
|
202
|
-
<!-- Enter date as M/D/YYYY or MM/DD/YYYY-->
|
|
203
|
-
<!-- </mat-error>-->
|
|
204
|
-
<!-- <mat-error *ngIf="validate && dateForm.get('dateInput').hasError('dateRangeValidator')"-->
|
|
205
|
-
<!-- class="invalid-date">-->
|
|
206
|
-
<!-- Invalid Date Range-->
|
|
207
|
-
<!-- </mat-error>-->
|
|
208
|
-
<!-- </mat-form-field>-->
|
|
209
|
-
<!-- </div>-->
|
|
210
|
-
<!-- </div>-->
|
|
211
|
-
<!-- </form>-->
|
|
212
191
|
</div>
|
|
213
192
|
</div>
|
|
214
193
|
<div *ngIf="state === 1" class="inline-editing">
|
|
215
194
|
<ngb-datepicker [ngModel]="modifiedData" #dp [startDate]="startDate" [minDate]="minDate"
|
|
216
195
|
[maxDate]="maxDate" (keydown)="onKeyDown($event)"
|
|
217
|
-
(ngModelChange)="onChange($event)" (
|
|
196
|
+
(ngModelChange)="onChange($event)" (dateSelect)="save()"></ngb-datepicker>
|
|
218
197
|
<div class="inline-hover-save-options">
|
|
219
|
-
<!-- <a class="btn ii-so-btn save" (click)="save()"><i class="fas fa-check"></i></a>-->
|
|
220
|
-
<!-- <a class="btn ii-so-btn cancel" (click)="cancel()"><i class="fas fa-times"></i></a>-->
|
|
221
198
|
</div>
|
|
222
199
|
</div>
|
|
223
200
|
|
|
@@ -246,43 +223,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImpor
|
|
|
246
223
|
class="invalid-date">Enter date as M/D/YYYY or MM/DD/YYYY</div>
|
|
247
224
|
<div *ngIf="validate && dateForm.get('dateInput').hasError('dateRangeValidator')"
|
|
248
225
|
class="invalid-date">Invalid Date Range</div>
|
|
226
|
+
<div *ngIf="validate && dateForm.get('dateInput').hasError('dateInvalidValidator')"
|
|
227
|
+
class="invalid-date">Not a real date</div>
|
|
249
228
|
</div>
|
|
250
229
|
</form>
|
|
251
|
-
<!--
|
|
252
|
-
We will replace the nbg date picker with material date picker
|
|
253
|
-
-->
|
|
254
|
-
<!-- <form [formGroup]="dateForm" class="flex-grow-1">-->
|
|
255
|
-
<!-- <div class="date-wrapper">-->
|
|
256
|
-
<!-- <div class="input-group-append">-->
|
|
257
|
-
<!-- <mat-form-field appearance="outline" [style.padding-top.em]="0.5"-->
|
|
258
|
-
<!-- [style.padding-bottom.em]="0.5">-->
|
|
259
|
-
<!-- <input matInput (keypress)="onKeyPressInput($event)"-->
|
|
260
|
-
<!-- [min]="minDate" [max]="maxDate" [matDatepicker]="datePicker"-->
|
|
261
|
-
<!-- formControlName="dateInput" placeholder="{{label}}" aria-label="date"-->
|
|
262
|
-
<!-- aria-describedby="basic-addon2">-->
|
|
263
|
-
<!-- <mat-datepicker-toggle matSuffix [for]="datePicker"></mat-datepicker-toggle>-->
|
|
264
|
-
<!-- <mat-datepicker #datePicker></mat-datepicker>-->
|
|
265
|
-
<!-- <mat-error *ngIf="validate && dateForm.get('dateInput').hasError('dateFormatValidator')"-->
|
|
266
|
-
<!-- class="invalid-date">-->
|
|
267
|
-
<!-- Enter date as M/D/YYYY or MM/DD/YYYY-->
|
|
268
|
-
<!-- </mat-error>-->
|
|
269
|
-
<!-- <mat-error *ngIf="validate && dateForm.get('dateInput').hasError('dateRangeValidator')"-->
|
|
270
|
-
<!-- class="invalid-date">-->
|
|
271
|
-
<!-- Invalid Date Range-->
|
|
272
|
-
<!-- </mat-error>-->
|
|
273
|
-
<!-- </mat-form-field>-->
|
|
274
|
-
<!-- </div>-->
|
|
275
|
-
<!-- </div>-->
|
|
276
|
-
<!-- </form>-->
|
|
277
230
|
</div>
|
|
278
231
|
</div>
|
|
279
232
|
<div *ngIf="state === 1" class="inline-editing">
|
|
280
233
|
<ngb-datepicker [ngModel]="modifiedData" #dp [startDate]="startDate" [minDate]="minDate"
|
|
281
234
|
[maxDate]="maxDate" (keydown)="onKeyDown($event)"
|
|
282
|
-
(ngModelChange)="onChange($event)" (
|
|
235
|
+
(ngModelChange)="onChange($event)" (dateSelect)="save()"></ngb-datepicker>
|
|
283
236
|
<div class="inline-hover-save-options">
|
|
284
|
-
<!-- <a class="btn ii-so-btn save" (click)="save()"><i class="fas fa-check"></i></a>-->
|
|
285
|
-
<!-- <a class="btn ii-so-btn cancel" (click)="cancel()"><i class="fas fa-times"></i></a>-->
|
|
286
237
|
</div>
|
|
287
238
|
</div>
|
|
288
239
|
|
|
@@ -306,5 +257,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImpor
|
|
|
306
257
|
type: Input
|
|
307
258
|
}], inputDataChange: [{
|
|
308
259
|
type: Output
|
|
260
|
+
}], dateValid: [{
|
|
261
|
+
type: Output
|
|
309
262
|
}] } });
|
|
310
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1kYXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2lucHV0L3NyYy9kYXRlL2RhdGUtZGF0ZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBa0MsU0FBUyxFQUFFLE1BQU0sRUFDN0YsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUMsa0JBQWtCLEVBQW9CLGtCQUFrQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFJeEYsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQy9DLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxhQUFhLENBQUM7Ozs7O0FBSXJDOzs7O0dBSUc7QUE0RUgsTUFBTSxPQUFPLGFBQWMsU0FBUSxRQUFRO0lBeUJ6QyxZQUFZLFVBQXNCLEVBQVUsV0FBK0IsRUFBVSxRQUFrQixFQUFVLGlCQUFvQztRQUNuSixLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFEd0IsZ0JBQVcsR0FBWCxXQUFXLENBQW9CO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUFVLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFyQnJKLHlDQUF5QztRQUNoQyxlQUFVLEdBQVcsV0FBVyxDQUFDO1FBV2hDLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUlwRCxrQ0FBa0M7UUFDbEMsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUVsQixZQUFPLEdBQVksS0FBSyxDQUFDO0lBSWpDLENBQUM7SUFFRDs7T0FFRztJQUNILFFBQVE7UUFDTixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO1lBQ3BDLFNB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LEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxjQUFjLENBQUM7SUFDeEksQ0FBQzs4R0EvS1UsYUFBYTtrR0FBYixhQUFhLGlUQXpFYixDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsMklBQzFCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkRUOzsyRkFXVSxhQUFhO2tCQTNFekIsU0FBUzsrQkFDRSxVQUFVLGFBQ1QsQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLFlBQzFCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkRULFFBTUs7d0JBQ0osa0JBQWtCLEVBQUUsNEJBQTRCO3FCQUNqRDt1S0FLaUMsRUFBRTtzQkFBbkMsU0FBUzt1QkFBQyxJQUFJLEVBQUUsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFDO2dCQUd2QixVQUFVO3NCQUFsQixLQUFLO2dCQUdHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUVHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsWUFBWTtzQkFBcEIsS0FBSztnQkFFSSxlQUFlO3NCQUF4QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgRG9DaGVjaywgQWZ0ZXJWaWV3SW5pdCwgVmlld0NoaWxkLCBPdXRwdXQsXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWZcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge0RhdGVQaXBlfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XHJcbmltcG9ydCB7VW50eXBlZEZvcm1CdWlsZGVyLCBVbnR5cGVkRm9ybUdyb3VwLCBVbnR5cGVkRm9ybUNvbnRyb2x9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5cclxuaW1wb3J0IHtOZ2JEYXRlU3RydWN0fSBmcm9tIFwiQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXBcIjtcclxuXHJcbmltcG9ydCB7RGF0ZVZhbGlkYXRvcn0gZnJvbSBcIi4vZGF0ZS12YWxpZGF0b3JcIjtcclxuaW1wb3J0IHtEYXRlQmFzZX0gZnJvbSBcIi4vZGF0ZS1iYXNlXCI7XHJcblxyXG5pbXBvcnQgKiBhcyBtb21lbnQgZnJvbSBcIm1vbWVudFwiO1xyXG5cclxuLyoqXHJcbiAqIFRPRE86IENvbmZpcm0gdGltZXpvbmUgYmVoYXZpb3IuXHJcbiAqXHJcbiAqIEBzaW5jZSA0LjAuMFxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwiaGNpLWRhdGVcIixcclxuICBwcm92aWRlcnM6IFtEYXRlUGlwZSwgRGF0ZVZhbGlkYXRvcl0sXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIGQtZmxleFwiPlxyXG4gICAgICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZGF0ZUZvcm1cIiBjbGFzcz1cImZsZXgtZ3Jvdy0xXCI+XHJcbiAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC1hcHBlbmRcIj5cclxuICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiAoa2V5dXApPVwib25LZXlVcElucHV0KCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkNoYW5nZSgkZXZlbnQpXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJkYXRlSW5wdXRcIiBwbGFjZWhvbGRlcj1cInt7bGFiZWx9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJkYXRlXCIgYXJpYS1kZXNjcmliZWRieT1cImJhc2ljLWFkZG9uMlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnB1dC1ncm91cC10ZXh0XCIgaWQ9XCJiYXNpYy1hZGRvbjJcIiAoY2xpY2spPVwiY2xlYXIoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtdGltZXNcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJzdGFydEVkaXQoKTtcIj5cclxuICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWNhbGVuZGFyLWFsdFwiPjwvaT5cclxuICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ2YWxpZGF0ZSAmJiBkYXRlRm9ybS5nZXQoJ2RhdGVJbnB1dCcpLmhhc0Vycm9yKCdkYXRlRm9ybWF0VmFsaWRhdG9yJylcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW52YWxpZC1kYXRlXCI+RW50ZXIgZGF0ZSBhcyBNL0QvWVlZWSBvciBNTS9ERC9ZWVlZPC9kaXY+XHJcbiAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ2YWxpZGF0ZSAmJiBkYXRlRm9ybS5nZXQoJ2RhdGVJbnB1dCcpLmhhc0Vycm9yKCdkYXRlUmFuZ2VWYWxpZGF0b3InKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbnZhbGlkLWRhdGVcIj5JbnZhbGlkIERhdGUgUmFuZ2U8L2Rpdj5cclxuICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgIDwvZm9ybT5cclxuICAgICAgICAgICA8IS0tXHJcbiAgICAgICAgICAgICBXZSB3aWxsIHJlcGxhY2UgdGhlIG5iZyBkYXRlIHBpY2tlciB3aXRoIG1hdGVyaWFsIGRhdGUgcGlja2VyXHJcbiAgICAgICAgICAgLS0+XHJcbjwhLS0gICAgICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZGF0ZUZvcm1cIiBjbGFzcz1cImZsZXgtZ3Jvdy0xXCI+LS0+XHJcbjwhLS0gICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtd3JhcHBlclwiPi0tPlxyXG48IS0tICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLWFwcGVuZFwiPi0tPlxyXG48IS0tICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgW3N0eWxlLnBhZGRpbmctdG9wLmVtXT1cIjAuNVwiLS0+XHJcbjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLnBhZGRpbmctYm90dG9tLmVtXT1cIjAuNVwiPi0tPlxyXG48IS0tICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgKGtleXByZXNzKT1cIm9uS2V5UHJlc3NJbnB1dCgkZXZlbnQpXCItLT5cclxuPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFttaW5dPVwibWluRGF0ZVwiIFttYXhdPVwibWF4RGF0ZVwiIFttYXREYXRlcGlja2VyXT1cImRhdGVQaWNrZXJcIi0tPlxyXG48IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZGF0ZUlucHV0XCIgcGxhY2Vob2xkZXI9XCJ7e2xhYmVsfX1cIiBhcmlhLWxhYmVsPVwiZGF0ZVwiLS0+XHJcbjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWRlc2NyaWJlZGJ5PVwiYmFzaWMtYWRkb24yXCI+LS0+XHJcbjwhLS0gICAgICAgICAgICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlci10b2dnbGUgbWF0U3VmZml4IFtmb3JdPVwiZGF0ZVBpY2tlclwiPjwvbWF0LWRhdGVwaWNrZXItdG9nZ2xlPi0tPlxyXG48IS0tICAgICAgICAgICAgICAgICAgICA8bWF0LWRhdGVwaWNrZXIgI2RhdGVQaWNrZXI+PC9tYXQtZGF0ZXBpY2tlcj4tLT5cclxuPCEtLSAgICAgICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInZhbGlkYXRlICYmIGRhdGVGb3JtLmdldCgnZGF0ZUlucHV0JykuaGFzRXJyb3IoJ2RhdGVGb3JtYXRWYWxpZGF0b3InKVwiLS0+XHJcbjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbnZhbGlkLWRhdGVcIj4tLT5cclxuPCEtLSAgICAgICAgICAgICAgICAgICAgICBFbnRlciBkYXRlIGFzIE0vRC9ZWVlZIG9yIE1NL0REL1lZWVktLT5cclxuPCEtLSAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+LS0+XHJcbjwhLS0gICAgICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJ2YWxpZGF0ZSAmJiBkYXRlRm9ybS5nZXQoJ2RhdGVJbnB1dCcpLmhhc0Vycm9yKCdkYXRlUmFuZ2VWYWxpZGF0b3InKVwiLS0+XHJcbjwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbnZhbGlkLWRhdGVcIj4tLT5cclxuPCEtLSAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkIERhdGUgUmFuZ2UtLT5cclxuPCEtLSAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+LS0+XHJcbjwhLS0gICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPi0tPlxyXG48IS0tICAgICAgICAgICAgICAgPC9kaXY+LS0+XHJcbjwhLS0gICAgICAgICAgICAgPC9kaXY+LS0+XHJcbjwhLS0gICAgICAgICAgPC9mb3JtPi0tPlxyXG4gICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCJzdGF0ZSA9PT0gMVwiIGNsYXNzPVwiaW5saW5lLWVkaXRpbmdcIj5cclxuICAgICAgICA8bmdiLWRhdGVwaWNrZXIgW25nTW9kZWxdPVwibW9kaWZpZWREYXRhXCIgI2RwIFtzdGFydERhdGVdPVwic3RhcnREYXRlXCIgW21pbkRhdGVdPVwibWluRGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttYXhEYXRlXT1cIm1heERhdGVcIiAoa2V5ZG93bik9XCJvbktleURvd24oJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ2hhbmdlKCRldmVudClcIiAoc2VsZWN0KT1cInNhdmUoKVwiPjwvbmdiLWRhdGVwaWNrZXI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImlubGluZS1ob3Zlci1zYXZlLW9wdGlvbnNcIj5cclxuPCEtLSAgICAgICAgICA8YSBjbGFzcz1cImJ0biBpaS1zby1idG4gc2F2ZVwiIChjbGljayk9XCJzYXZlKClcIj48aSBjbGFzcz1cImZhcyBmYS1jaGVja1wiPjwvaT48L2E+LS0+XHJcbjwhLS0gICAgICAgICAgPGEgY2xhc3M9XCJidG4gaWktc28tYnRuIGNhbmNlbFwiIChjbGljayk9XCJjYW5jZWwoKVwiPjxpIGNsYXNzPVwiZmFzIGZhLXRpbWVzXCI+PC9pPjwvYT4tLT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gIGAsXHJcbiAgc3R5bGVzOiBbYFxyXG4gICAgLyo6Om5nLWRlZXAgbWF0LWZvcm0tZmllbGQgLm1hdC1mb3JtLWZpZWxkLWZsZXggPiAubWF0LWZvcm0tZmllbGQtaW5maXh7Ki9cclxuICAgIC8qICBwYWRkaW5nOiAwLjI1ZW0gMCAwLjVlbSAwOyovXHJcbiAgICAvKn0qL1xyXG4gIGBdLFxyXG4gIGhvc3Q6IHtcclxuICAgIFwiKGRvY3VtZW50OmNsaWNrKVwiOiBcImhhbmRsZU91dHNpZGVFdmVudCgkZXZlbnQpXCJcclxuICB9XHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgRGF0ZUNvbXBvbmVudCBleHRlbmRzIERhdGVCYXNlIGltcGxlbWVudHMgT25Jbml0LCBEb0NoZWNrLCBBZnRlclZpZXdJbml0IHtcclxuXHJcbiAgQFZpZXdDaGlsZChcImRwXCIsIHtzdGF0aWM6IGZhbHNlfSkgZHA6IGFueTtcclxuXHJcbiAgLy8gQmluZGVkIGRhdGEgZnJvbSB0aGUgcGFyZW50IGNvbXBvbmVudC5cclxuICBASW5wdXQoKSBkYXRlRm9ybWF0OiBzdHJpbmcgPSBcInNob3J0RGF0ZVwiO1xyXG4gIC8vIEBJbnB1dCgpIGRhdGVGb3JtYXQ6IHN0cmluZyA9IFwiTU0vZC95eXl5XCI7IC8vRm9yIHRlc3Rpbmcgb25seVxyXG4gIHN0YXJ0RGF0ZTtcclxuICBASW5wdXQoKSBtaW5EYXRlO1xyXG4gIEBJbnB1dCgpIG1heERhdGU7XHJcbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZztcclxuICBsYWJlbERhdGU6IHN0cmluZztcclxuICBASW5wdXQoKSBpbnB1dERhdGE6IE9iamVjdDtcclxuICAvLyBUaGUgZGF0YSB1c2VkIGluIG91ciBpbnB1dC4gIFdlIHN0b3JlZCB0aGlzIGFzIHdlbGwgYXMgdGhlIGlucHV0RGF0YSBzbyB3ZSBjYW4gY2FuY2VsIHRoZSBlZGl0IGFuZCBwcmVzZXJ2ZSB0aGUgb3JpZ2luYWwgZGF0YS5cclxuICBASW5wdXQoKSBtb2RpZmllZERhdGE6IE9iamVjdDtcclxuXHJcbiAgQE91dHB1dCgpIGlucHV0RGF0YUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBkYXRlRm9ybTogVW50eXBlZEZvcm1Hcm91cDtcclxuICBkYXRlSW5wdXQ6IFVudHlwZWRGb3JtQ29udHJvbDtcclxuICAvLyBvbmx5IHZhbGlkYXRlIGlmIHVzZXIgaXMgdHlwaW5nXHJcbiAgdmFsaWRhdGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBmb2N1c2VkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIHByaXZhdGUgZm9ybUJ1aWxkZXI6IFVudHlwZWRGb3JtQnVpbGRlciwgcHJpdmF0ZSBkYXRlUGlwZTogRGF0ZVBpcGUsIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmKSB7XHJcbiAgICBzdXBlcihlbGVtZW50UmVmKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqXHJcbiAgICovXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmRhdGVGb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgICBkYXRlSW5wdXQgOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKFwiXCIsIFtEYXRlVmFsaWRhdG9yLmRhdGVGb3JtYXRWYWxpZGF0b3IsIERhdGVWYWxpZGF0b3IuZGF0ZVJhbmdlVmFsaWRhdG9yXSlcclxuICAgIH0pO1xyXG4gICAgdGhpcy5vbkNoYW5nZXMoKTtcclxuXHJcbiAgICB0aGlzLnVwZGF0ZUludGVybmFsRGF0YUZyb21Nb2RlbCgpO1xyXG4gICAgLy8gc2V0IHRoZSBtaW5EYXRlIHRvIDIwIHllYXJzIGluIHRoZSBwYXN0IGJ5IGRlZmF1bHRcclxuICAgIGxldCB0b2RheSA9IG5ldyBEYXRlKCk7XHJcbiAgICBpZiAoIXRoaXMubWluRGF0ZSkge1xyXG4gICAgICAgIHRoaXMubWluRGF0ZSA9IHt5ZWFyOiB0b2RheS5nZXRGdWxsWWVhcigpIC0gMjAsIG1vbnRoOiB0b2RheS5nZXRNb250aCgpICsgMSwgZGF5OiB0b2RheS5nZXREYXRlKCl9O1xyXG4gICAgfVxyXG4gICAgLy8gc2V0IG1heCBkYXRlIHRvIHRvZGF5IGJ5IGRlZmF1bHRcclxuICAgIGlmICghdGhpcy5tYXhEYXRlKSB7XHJcbiAgICAgICAgdGhpcy5tYXhEYXRlID0ge3llYXI6IHRvZGF5LmdldEZ1bGxZZWFyKCksIG1vbnRoOiB0b2RheS5nZXRNb250aCgpICsgMSwgZGF5OiB0b2RheS5nZXREYXRlKCl9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgLy8gRmlsbCB0aGUgaW5wdXQgd2l0aCB0aGUgYm91bmQgZGF0YSBzZXQgaW4gdGhlIHBhcmVudCBjb21wb25lbnQuXHJcbiAgICBpZiAodGhpcy5pbnB1dERhdGEpIHtcclxuICAgICAgbGV0IGZvcm1hdHRlZERhdGUgPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybSg8c3RyaW5nPnRoaXMuaW5wdXREYXRhLCB0aGlzLmRhdGVGb3JtYXQpO1xyXG4gICAgICB0aGlzLmRhdGVGb3JtLmNvbnRyb2xzW1wiZGF0ZUlucHV0XCJdLnNldFZhbHVlKGZvcm1hdHRlZERhdGUpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBvbkNoYW5nZXMoKTogdm9pZCB7fVxyXG5cclxuXHJcbiAgbmdEb0NoZWNrKCkge1xyXG4gICAgLy8gdGhpcyBpcyB0aGUgb25seSB3YXkgSSBmb3VuZCB0byBoYXZlIHRoZSBmb2N1cyBvbiB0aGUgc3RhcnREYXRlIGRheSB3aGVuIHRoZSB1c2VyIG9wZW5zXHJcbiAgICAvLyB0aGUgcG9wdXAuIFdlIG9ubHkgd2FudCB0byBmb2N1cyBvbmNlIG90aGVyd2lzZSB1c2VyIGNhbiBub3QgY2xpY2sgYW55d2hlcmUgZWxzZSBpbiB0aGUgcG9wdXBcclxuICAgIGlmICh0aGlzLmRwICYmICF0aGlzLmZvY3VzZWQpIHtcclxuICAgICAgICB0aGlzLmRwLmZvY3VzKCk7XHJcbiAgICAgICAgdGhpcy5mb2N1c2VkID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIC8vIG1hcmsgcGlja2VyIGZvciBmb2N1c2luZyBuZXh0IHRpbWUgaXQgaXMgb3BlblxyXG4gICAgaWYgKHRoaXMuc3RhdGUgPT09IDApIHtcclxuICAgICAgICB0aGlzLmZvY3VzZWQgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVJbnRlcm5hbERhdGFGcm9tTW9kZWwoKSB7XHJcbiAgICAgaWYgKHRoaXMuaW5wdXREYXRhKSB7XHJcbiAgICAgICAgIHRoaXMubW9kaWZpZWREYXRhID0gbmV3IERhdGUoPHN0cmluZz50aGlzLmlucHV0RGF0YSk7XHJcbiAgICAgICAgIGxldCBtZDogRGF0ZSA9IG5ldyBEYXRlKDxzdHJpbmc+dGhpcy5pbnB1dERhdGEpO1xyXG4gICAgICAgICB0aGlzLnN0YXJ0RGF0ZSA9IHt5ZWFyOiBtZC5nZXRGdWxsWWVhcigpLCBtb250aDogbWQuZ2V0TW9udGgoKSArIDEsIGRheTogbWQuZ2V0RGF0ZSgpfTtcclxuICAgICB9IGVsc2Uge1xyXG4gICAgICAgICBsZXQgdG9kYXk6IERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgICB0aGlzLnN0YXJ0RGF0ZSA9IHt5ZWFyOiB0b2RheS5nZXRGdWxsWWVhcigpLCBtb250aDogdG9kYXkuZ2V0TW9udGgoKSArIDEsIGRheTogdG9kYXkuZ2V0RGF0ZSgpfTtcclxuICAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGVzIHRoZSBib3VuZCBkYXRhIHdpdGggdGhlIHdvcmtpbmcgZGF0YS5cclxuICAgKi9cclxuICBwdWJsaWMgdXBkYXRlTW9kZWxGcm9tSW50ZXJuYWxEYXRhKCkge1xyXG4gICAgIGlmICh0aGlzLm1vZGlmaWVkRGF0YSkge1xyXG4gICAgICAgICBsZXQgZHNEYXRlID0gdGhpcy5uZ2JEYXRlVG9TdHJpbmcoPE5nYkRhdGVTdHJ1Y3Q+dGhpcy5tb2RpZmllZERhdGEpO1xyXG4gICAgICAgICBpZiAoZHNEYXRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5wdXREYXRhID0gZHNEYXRlO1xyXG4gICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmlucHV0RGF0YSA9IHRoaXMubW9kaWZpZWREYXRhO1xyXG4gICAgICAgICB9XHJcblxyXG4gICAgICAgICBjb25zdCBmb3JtYXR0ZWRNb2RpZmllZERhdGUgPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybSg8c3RyaW5nPnRoaXMuaW5wdXREYXRhLCB0aGlzLmRhdGVGb3JtYXQpO1xyXG4gICAgICAgICB0aGlzLmRhdGVGb3JtLmNvbnRyb2xzW1wiZGF0ZUlucHV0XCJdLnNldFZhbHVlKGZvcm1hdHRlZE1vZGlmaWVkRGF0ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlfSk7XHJcblxyXG4gICAgIH1cclxuICAgICB0aGlzLmlucHV0RGF0YUNoYW5nZS5lbWl0KHRoaXMuaW5wdXREYXRhKTtcclxuICAgICB0aGlzLnVwZGF0ZUludGVybmFsRGF0YUZyb21Nb2RlbCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsZWFyKCkge1xyXG4gICAgICB0aGlzLm1vZGlmaWVkRGF0YSA9IG51bGw7XHJcbiAgICAgIHRoaXMuaW5wdXREYXRhID0gbnVsbDtcclxuICAgICAgdGhpcy5kYXRlRm9ybS5jb250cm9sc1tcImRhdGVJbnB1dFwiXS5zZXRWYWx1ZShcIlwiKTtcclxuICAgICAgdGhpcy52YWxpZGF0ZSA9IGZhbHNlO1xyXG4gICAgICBsZXQgdG9kYXk6IERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICB0aGlzLnN0YXJ0RGF0ZSA9IHt5ZWFyOiB0b2RheS5nZXRGdWxsWWVhcigpLCBtb250aDogdG9kYXkuZ2V0TW9udGgoKSArIDEsIGRheTogdG9kYXkuZ2V0RGF0ZSgpfTtcclxuICAgICAgdGhpcy5zdGF0ZSA9IDA7XHJcbiAgICAgIHRoaXMuZGF0ZUZvcm0uY29udHJvbHNbXCJkYXRlSW5wdXRcIl0uc2V0VmFsdWUoXCJcIik7XHJcbiAgICAgIHRoaXMuaW5wdXREYXRhQ2hhbmdlLmVtaXQodGhpcy5pbnB1dERhdGEpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uS2V5VXBJbnB1dChldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgLy8gQ2hlY2sgZm9yIHdoZW4gdGhlIGlucHV0IGlzIGRlbGV0ZWQgYmVmb3JlIGJlaW5nIHNhdmVkXHJcbiAgICBpZihldmVudC5rZXkgPT09IFwiRGVsZXRlXCIgfHwgZXZlbnQua2V5ID09PSBcIkJhY2tzcGFjZVwiKSB7XHJcbiAgICAgIGlmKHRoaXMuZGF0ZUZvcm0uY29udHJvbHNbXCJkYXRhSW5wdXRcIl0udmFsdWUubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgdGhpcy5jbGVhcigpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgIC8vIHVwZGF0ZSByYW5nZSBzbyB0aGF0IHRoZSBkYXRlIHJhbmdlIHZhbGlkYXRvciBjYW4gcnVuIGFjY3VyYXRlbHlcclxuICAgICBEYXRlVmFsaWRhdG9yLm1pblZhbHVlID0gdGhpcy5taW5EYXRlO1xyXG4gICAgIERhdGVWYWxpZGF0b3IubWF4VmFsdWUgPSB0aGlzLm1heERhdGU7XHJcblxyXG4gICAgLy8gR2V0IHRoZSB1cGRhdGVkIGRhdGVGb3JtIHZhbHVlXHJcbiAgICAgbGV0IGV2ZW50VGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICAgbGV0IGlucHV0VmFsdWUgPSBldmVudFRhcmdldC52YWx1ZTtcclxuICAgICB0aGlzLmRhdGVGb3JtLmNvbnRyb2xzW1wiZGF0ZUlucHV0XCJdLnBhdGNoVmFsdWUoaW5wdXRWYWx1ZSk7XHJcblxyXG4gICAgIC8vIGlmIHdlIGhhdmUgYSBnb29kIGRhdGUgYW5kIGlzIHdpdGhpbiB0aGUgcmFuZ2UgdXBkYXRlIHRoZSBwaWNrZXJcclxuICAgICBpZiAoRGF0ZVZhbGlkYXRvci5pblJhbmdlKHRoaXMuZGF0ZUZvcm0uY29udHJvbHNbXCJkYXRlSW5wdXRcIl0pKSB7XHJcbiAgICAgICAgIHRoaXMudmFsaWRhdGUgPSBmYWxzZTtcclxuICAgICAgICAgdGhpcy5pbnB1dERhdGEgPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybSh0aGlzLmRhdGVGb3JtLmNvbnRyb2xzW1wiZGF0ZUlucHV0XCJdLnZhbHVlLCB0aGlzLmRhdGVGb3JtYXQpO1xyXG4gICAgICAgICB0aGlzLnVwZGF0ZUludGVybmFsRGF0YUZyb21Nb2RlbCgpO1xyXG4gICAgICAgICB0aGlzLmRhdGVGb3JtLmNvbnRyb2xzW1wiZGF0ZUlucHV0XCJdLnNldFZhbHVlKHRoaXMuaW5wdXREYXRhKTtcclxuICAgICAgICAgdGhpcy5pbnB1dERhdGFDaGFuZ2UuZW1pdCh0aGlzLmlucHV0RGF0YSk7XHJcbiAgICAgfSBlbHNlIHtcclxuICAgICAgIHRoaXMudmFsaWRhdGUgPSB0cnVlO1xyXG4gICAgIH1cclxuXHJcbiAgICAgIC8vIC8vIG9ubHkgdmFsaWRhdGUgaWYgdXNlciBpcyB0eXBpbmdcclxuICAgICAgLy8gaWYgKCF0aGlzLnZhbGlkYXRlKSB7XHJcbiAgICAgIC8vICAgdGhpcy52YWxpZGF0ZSA9IHRydWU7XHJcbiAgICAgIC8vICAgdGhpcy5kYXRlRm9ybS5jb250cm9sc1tcImRhdGVJbnB1dFwiXS5zZXRWYWx1ZShcIlwiKTtcclxuICAgICAgLy9cclxuICAgICAgLy8gICAvLyBjbGVhciB0aGUgZGF0ZSBwaWNrZXJcclxuICAgICAgLy8gICB0aGlzLm1vZGlmaWVkRGF0YSA9IG51bGw7XHJcbiAgICAgIC8vICAgdGhpcy5pbnB1dERhdGEgPSBudWxsO1xyXG4gICAgICAvLyAgIGxldCB0b2RheTogRGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgIC8vICAgdGhpcy5zdGFydERhdGUgPSB7eWVhcjogdG9kYXkuZ2V0RnVsbFllYXIoKSwgbW9udGg6IHRvZGF5LmdldE1vbnRoKCkgKyAxLCBkYXk6IHRvZGF5LmdldERhdGUoKX07XHJcbiAgICAgIC8vICAgdGhpcy5zdGF0ZSA9IDA7XHJcbiAgICAgIC8vICAgdGhpcy5pbnB1dERhdGFDaGFuZ2UuZW1pdCh0aGlzLmlucHV0RGF0YSk7XHJcbiAgICAgIC8vIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE5nYkRhdGVTdHJ1Y3Qgc3RvcmVzIGRheSwgbW9udGggYW5kIHllYXIuICBDb252ZXJ0IHRoaXMgdG8gSVNPODYwMS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSBkYXRlXHJcbiAgICogQHJldHVybnMge2FueX1cclxuICAgKi9cclxuICBwcml2YXRlIG5nYkRhdGVUb1N0cmluZyhkYXRlOiBOZ2JEYXRlU3RydWN0KTogc3RyaW5nIHtcclxuICAgIGlmIChkYXRlID09PSB1bmRlZmluZWQgfHwgZGF0ZSA9PT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH0gZWxzZSBpZiAoZGF0ZS55ZWFyID09PSB1bmRlZmluZWQgfHwgZGF0ZS5tb250aCA9PT0gdW5kZWZpbmVkIHx8IGRhdGUuZGF5ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGRhdGUueWVhciArIFwiLVwiICsgKChkYXRlLm1vbnRoIDwgMTApID8gXCIwXCIgOiBcIlwiKSArIGRhdGUubW9udGggKyBcIi1cIiArICgoZGF0ZS5kYXkgPCAxMCkgPyBcIjBcIiA6IFwiXCIpICsgZGF0ZS5kYXkgKyBcIlQxMjowMC0wNjowMFwiO1xyXG4gIH1cclxuXHJcbn1cclxuIl19
|
|
263
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1kYXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2lucHV0L3NyYy9kYXRlL2RhdGUtZGF0ZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBa0MsU0FBUyxFQUFFLE1BQU0sRUFDN0YsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUMsa0JBQWtCLEVBQW9CLGtCQUFrQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFJeEYsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQy9DLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxhQUFhLENBQUM7Ozs7O0FBSXJDOzs7O0dBSUc7QUErQ0gsTUFBTSxPQUFPLGFBQWMsU0FBUSxRQUFRO0lBMEJ6QyxZQUFZLFVBQXNCLEVBQVUsV0FBK0IsRUFBVSxRQUFrQixFQUFVLGlCQUFvQztRQUNuSixLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFEd0IsZ0JBQVcsR0FBWCxXQUFXLENBQW9CO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUFVLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUF0QnJKLHlDQUF5QztRQUNoQyxlQUFVLEdBQVcsV0FBVyxDQUFDO1FBVWhDLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUMxQyxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUtsRCxrQ0FBa0M7UUFDbEMsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUVsQixZQUFPLEdBQVksS0FBSyxDQUFDO0lBSWpDLENBQUM7SUFFRDs7T0FFRztJQUNILFFBQVE7UUFDTixJQUFJLENBQUMsUUFBUSxHQUFHLElB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Ozs7Ozs7Ozs7Ozs7R0FtQ1QsUUFHSzt3QkFDSixrQkFBa0IsRUFBRSw0QkFBNEI7cUJBQ2pEO3VLQUtpQyxFQUFFO3NCQUFuQyxTQUFTO3VCQUFDLElBQUksRUFBRSxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUM7Z0JBR3ZCLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSztnQkFFRyxZQUFZO3NCQUFwQixLQUFLO2dCQUVJLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIERvQ2hlY2ssIEFmdGVyVmlld0luaXQsIFZpZXdDaGlsZCwgT3V0cHV0LFxyXG4gIENoYW5nZURldGVjdG9yUmVmXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtEYXRlUGlwZX0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5pbXBvcnQge1VudHlwZWRGb3JtQnVpbGRlciwgVW50eXBlZEZvcm1Hcm91cCwgVW50eXBlZEZvcm1Db250cm9sfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuXHJcbmltcG9ydCB7TmdiRGF0ZVN0cnVjdH0gZnJvbSBcIkBuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXCI7XHJcblxyXG5pbXBvcnQge0RhdGVWYWxpZGF0b3J9IGZyb20gXCIuL2RhdGUtdmFsaWRhdG9yXCI7XHJcbmltcG9ydCB7RGF0ZUJhc2V9IGZyb20gXCIuL2RhdGUtYmFzZVwiO1xyXG5cclxuaW1wb3J0ICogYXMgbW9tZW50IGZyb20gXCJtb21lbnRcIjtcclxuXHJcbi8qKlxyXG4gKiBUT0RPOiBDb25maXJtIHRpbWV6b25lIGJlaGF2aW9yLlxyXG4gKlxyXG4gKiBAc2luY2UgNC4wLjBcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImhjaS1kYXRlXCIsXHJcbiAgcHJvdmlkZXJzOiBbRGF0ZVBpcGUsIERhdGVWYWxpZGF0b3JdLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XHJcbiAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBkLWZsZXhcIj5cclxuICAgICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImRhdGVGb3JtXCIgY2xhc3M9XCJmbGV4LWdyb3ctMVwiPlxyXG4gICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtd3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtYXBwZW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgKGtleXVwKT1cIm9uS2V5VXBJbnB1dCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25DaGFuZ2UoJGV2ZW50KVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZGF0ZUlucHV0XCIgcGxhY2Vob2xkZXI9XCJ7e2xhYmVsfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiZGF0ZVwiIGFyaWEtZGVzY3JpYmVkYnk9XCJiYXNpYy1hZGRvbjJcIiAvPlxyXG4gICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5wdXQtZ3JvdXAtdGV4dFwiIGlkPVwiYmFzaWMtYWRkb24yXCIgKGNsaWNrKT1cImNsZWFyKClcIj5cclxuICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXRpbWVzXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwic3RhcnRFZGl0KCk7XCI+XHJcbiAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1jYWxlbmRhci1hbHRcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidmFsaWRhdGUgJiYgZGF0ZUZvcm0uZ2V0KCdkYXRlSW5wdXQnKS5oYXNFcnJvcignZGF0ZUZvcm1hdFZhbGlkYXRvcicpXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImludmFsaWQtZGF0ZVwiPkVudGVyIGRhdGUgYXMgTS9EL1lZWVkgb3IgTU0vREQvWVlZWTwvZGl2PlxyXG4gICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidmFsaWRhdGUgJiYgZGF0ZUZvcm0uZ2V0KCdkYXRlSW5wdXQnKS5oYXNFcnJvcignZGF0ZVJhbmdlVmFsaWRhdG9yJylcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW52YWxpZC1kYXRlXCI+SW52YWxpZCBEYXRlIFJhbmdlPC9kaXY+XHJcbiAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ2YWxpZGF0ZSAmJiBkYXRlRm9ybS5nZXQoJ2RhdGVJbnB1dCcpLmhhc0Vycm9yKCdkYXRlSW52YWxpZFZhbGlkYXRvcicpXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImludmFsaWQtZGF0ZVwiPk5vdCBhIHJlYWwgZGF0ZTwvZGl2PlxyXG4gICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgPC9mb3JtPlxyXG4gICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCJzdGF0ZSA9PT0gMVwiIGNsYXNzPVwiaW5saW5lLWVkaXRpbmdcIj5cclxuICAgICAgICA8bmdiLWRhdGVwaWNrZXIgW25nTW9kZWxdPVwibW9kaWZpZWREYXRhXCIgI2RwIFtzdGFydERhdGVdPVwic3RhcnREYXRlXCIgW21pbkRhdGVdPVwibWluRGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttYXhEYXRlXT1cIm1heERhdGVcIiAoa2V5ZG93bik9XCJvbktleURvd24oJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ2hhbmdlKCRldmVudClcIiAoZGF0ZVNlbGVjdCk9XCJzYXZlKClcIj48L25nYi1kYXRlcGlja2VyPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbmxpbmUtaG92ZXItc2F2ZS1vcHRpb25zXCI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICBgLFxyXG4gIHN0eWxlczogW2BcclxuICBgXSxcclxuICBob3N0OiB7XHJcbiAgICBcIihkb2N1bWVudDpjbGljaylcIjogXCJoYW5kbGVPdXRzaWRlRXZlbnQoJGV2ZW50KVwiXHJcbiAgfVxyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIERhdGVDb21wb25lbnQgZXh0ZW5kcyBEYXRlQmFzZSBpbXBsZW1lbnRzIE9uSW5pdCwgRG9DaGVjaywgQWZ0ZXJWaWV3SW5pdCB7XHJcblxyXG4gIEBWaWV3Q2hpbGQoXCJkcFwiLCB7c3RhdGljOiBmYWxzZX0pIGRwOiBhbnk7XHJcblxyXG4gIC8vIEJpbmRlZCBkYXRhIGZyb20gdGhlIHBhcmVudCBjb21wb25lbnQuXHJcbiAgQElucHV0KCkgZGF0ZUZvcm1hdDogc3RyaW5nID0gXCJzaG9ydERhdGVcIjtcclxuICBzdGFydERhdGU7XHJcbiAgQElucHV0KCkgbWluRGF0ZTtcclxuICBASW5wdXQoKSBtYXhEYXRlO1xyXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmc7XHJcbiAgbGFiZWxEYXRlOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgaW5wdXREYXRhOiBPYmplY3Q7XHJcbiAgLy8gVGhlIGRhdGEgdXNlZCBpbiBvdXIgaW5wdXQuICBXZSBzdG9yZWQgdGhpcyBhcyB3ZWxsIGFzIHRoZSBpbnB1dERhdGEgc28gd2UgY2FuIGNhbmNlbCB0aGUgZWRpdCBhbmQgcHJlc2VydmUgdGhlIG9yaWdpbmFsIGRhdGEuXHJcbiAgQElucHV0KCkgbW9kaWZpZWREYXRhOiBPYmplY3Q7XHJcblxyXG4gIEBPdXRwdXQoKSBpbnB1dERhdGFDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgZGF0ZVZhbGlkID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xyXG5cclxuICBkYXRlRm9ybTogVW50eXBlZEZvcm1Hcm91cDtcclxuICBkYXRlSW5wdXQ6IFVudHlwZWRGb3JtQ29udHJvbDtcclxuXHJcbiAgLy8gb25seSB2YWxpZGF0ZSBpZiB1c2VyIGlzIHR5cGluZ1xyXG4gIHZhbGlkYXRlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgZm9jdXNlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihlbGVtZW50UmVmOiBFbGVtZW50UmVmLCBwcml2YXRlIGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXIsIHByaXZhdGUgZGF0ZVBpcGU6IERhdGVQaXBlLCBwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZikge1xyXG4gICAgc3VwZXIoZWxlbWVudFJlZik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqL1xyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5kYXRlRm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xyXG4gICAgICAgZGF0ZUlucHV0IDogbmV3IFVudHlwZWRGb3JtQ29udHJvbChcIlwiLCBbRGF0ZVZhbGlkYXRvci5kYXRlRm9ybWF0VmFsaWRhdG9yLCBEYXRlVmFsaWRhdG9yLmRhdGVSYW5nZVZhbGlkYXRvciwgRGF0ZVZhbGlkYXRvci5kYXRlSW52YWxpZFZhbGlkYXRvcl0pXHJcbiAgICB9KTtcclxuICAgIHRoaXMub25DaGFuZ2VzKCk7XHJcblxyXG4gICAgdGhpcy51cGRhdGVJbnRlcm5hbERhdGFGcm9tTW9kZWwoKTtcclxuICAgIC8vIHNldCB0aGUgbWluRGF0ZSB0byAyMCB5ZWFycyBpbiB0aGUgcGFzdCBieSBkZWZhdWx0XHJcbiAgICBsZXQgdG9kYXkgPSBuZXcgRGF0ZSgpO1xyXG4gICAgaWYgKCF0aGlzLm1pbkRhdGUpIHtcclxuICAgICAgICB0aGlzLm1pbkRhdGUgPSB7eWVhcjogdG9kYXkuZ2V0RnVsbFllYXIoKSAtIDIwLCBtb250aDogdG9kYXkuZ2V0TW9udGgoKSArIDEsIGRheTogdG9kYXkuZ2V0RGF0ZSgpfTtcclxuICAgIH1cclxuICAgIC8vIHNldCBtYXggZGF0ZSB0byB0b2RheSBieSBkZWZhdWx0XHJcbiAgICBpZiAoIXRoaXMubWF4RGF0ZSkge1xyXG4gICAgICAgIHRoaXMubWF4RGF0ZSA9IHt5ZWFyOiB0b2RheS5nZXRGdWxsWWVhcigpLCBtb250aDogdG9kYXkuZ2V0TW9udGgoKSArIDEsIGRheTogdG9kYXkuZ2V0RGF0ZSgpfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIC8vIEZpbGwgdGhlIGlucHV0IHdpdGggdGhlIGJvdW5kIGRhdGEgc2V0IGluIHRoZSBwYXJlbnQgY29tcG9uZW50LlxyXG4gICAgaWYgKHRoaXMuaW5wdXREYXRhKSB7XHJcbiAgICAgIGxldCBmb3JtYXR0ZWREYXRlID0gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oPHN0cmluZz50aGlzLmlucHV0RGF0YSwgdGhpcy5kYXRlRm9ybWF0KTtcclxuICAgICAgdGhpcy5kYXRlRm9ybS5jb250cm9sc1tcImRhdGVJbnB1dFwiXS5zZXRWYWx1ZShmb3JtYXR0ZWREYXRlKTtcclxuICAgIH1cclxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgb25DaGFuZ2VzKCk6IHZvaWQge31cclxuXHJcblxyXG4gIG5nRG9DaGVjaygpIHtcclxuICAgIC8vIHRoaXMgaXMgdGhlIG9ubHkgd2F5IEkgZm91bmQgdG8gaGF2ZSB0aGUgZm9jdXMgb24gdGhlIHN0YXJ0RGF0ZSBkYXkgd2hlbiB0aGUgdXNlciBvcGVuc1xyXG4gICAgLy8gdGhlIHBvcHVwLiBXZSBvbmx5IHdhbnQgdG8gZm9jdXMgb25jZSBvdGhlcndpc2UgdXNlciBjYW4gbm90IGNsaWNrIGFueXdoZXJlIGVsc2UgaW4gdGhlIHBvcHVwXHJcbiAgICBpZiAodGhpcy5kcCAmJiAhdGhpcy5mb2N1c2VkKSB7XHJcbiAgICAgICAgdGhpcy5kcC5mb2N1cygpO1xyXG4gICAgICAgIHRoaXMuZm9jdXNlZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICAvLyBtYXJrIHBpY2tlciBmb3IgZm9jdXNpbmcgbmV4dCB0aW1lIGl0IGlzIG9wZW5cclxuICAgIGlmICh0aGlzLnN0YXRlID09PSAwKSB7XHJcbiAgICAgICAgdGhpcy5mb2N1c2VkID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdXBkYXRlSW50ZXJuYWxEYXRhRnJvbU1vZGVsKCkge1xyXG4gICAgIGlmICh0aGlzLmlucHV0RGF0YSkge1xyXG4gICAgICAgICB0aGlzLm1vZGlmaWVkRGF0YSA9IG5ldyBEYXRlKDxzdHJpbmc+dGhpcy5pbnB1dERhdGEpO1xyXG4gICAgICAgICBsZXQgbWQ6IERhdGUgPSBuZXcgRGF0ZSg8c3RyaW5nPnRoaXMuaW5wdXREYXRhKTtcclxuICAgICAgICAgdGhpcy5zdGFydERhdGUgPSB7eWVhcjogbWQuZ2V0RnVsbFllYXIoKSwgbW9udGg6IG1kLmdldE1vbnRoKCkgKyAxLCBkYXk6IG1kLmdldERhdGUoKX07XHJcbiAgICAgfSBlbHNlIHtcclxuICAgICAgICAgbGV0IHRvZGF5OiBEYXRlID0gbmV3IERhdGUoKTtcclxuICAgICAgICAgdGhpcy5zdGFydERhdGUgPSB7eWVhcjogdG9kYXkuZ2V0RnVsbFllYXIoKSwgbW9udGg6IHRvZGF5LmdldE1vbnRoKCkgKyAxLCBkYXk6IHRvZGF5LmdldERhdGUoKX07XHJcbiAgICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlcyB0aGUgYm91bmQgZGF0YSB3aXRoIHRoZSB3b3JraW5nIGRhdGEuXHJcbiAgICovXHJcbiAgcHVibGljIHVwZGF0ZU1vZGVsRnJvbUludGVybmFsRGF0YSgpIHtcclxuICAgICBpZiAodGhpcy5tb2RpZmllZERhdGEpIHtcclxuICAgICAgICAgbGV0IGRzRGF0ZSA9IHRoaXMubmdiRGF0ZVRvU3RyaW5nKDxOZ2JEYXRlU3RydWN0PnRoaXMubW9kaWZpZWREYXRhKTtcclxuICAgICAgICAgaWYgKGRzRGF0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmlucHV0RGF0YSA9IGRzRGF0ZTtcclxuICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5pbnB1dERhdGEgPSB0aGlzLm1vZGlmaWVkRGF0YTtcclxuICAgICAgICAgfVxyXG5cclxuICAgICAgICAgY29uc3QgZm9ybWF0dGVkTW9kaWZpZWREYXRlID0gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oPHN0cmluZz50aGlzLmlucHV0RGF0YSwgdGhpcy5kYXRlRm9ybWF0KTtcclxuICAgICAgICAgdGhpcy5kYXRlRm9ybS5jb250cm9sc1tcImRhdGVJbnB1dFwiXS5zZXRWYWx1ZShmb3JtYXR0ZWRNb2RpZmllZERhdGUsIHsgZW1pdEV2ZW50OiBmYWxzZX0pO1xyXG5cclxuICAgICB9XHJcbiAgICAgdGhpcy5pbnB1dERhdGFDaGFuZ2UuZW1pdCh0aGlzLmlucHV0RGF0YSk7XHJcbiAgICAgdGhpcy51cGRhdGVJbnRlcm5hbERhdGFGcm9tTW9kZWwoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbGVhcigpIHtcclxuICAgICAgdGhpcy5tb2RpZmllZERhdGEgPSBudWxsO1xyXG4gICAgICB0aGlzLmlucHV0RGF0YSA9IG51bGw7XHJcbiAgICAgIHRoaXMuZGF0ZUZvcm0uY29udHJvbHNbXCJkYXRlSW5wdXRcIl0uc2V0VmFsdWUoXCJcIik7XHJcbiAgICAgIHRoaXMudmFsaWRhdGUgPSBmYWxzZTtcclxuICAgICAgbGV0IHRvZGF5OiBEYXRlID0gbmV3IERhdGUoKTtcclxuICAgICAgdGhpcy5zdGFydERhdGUgPSB7eWVhcjogdG9kYXkuZ2V0RnVsbFllYXIoKSwgbW9udGg6IHRvZGF5LmdldE1vbnRoKCkgKyAxLCBkYXk6IHRvZGF5LmdldERhdGUoKX07XHJcbiAgICAgIHRoaXMuc3RhdGUgPSAwO1xyXG4gICAgICB0aGlzLmRhdGVGb3JtLmNvbnRyb2xzW1wiZGF0ZUlucHV0XCJdLnNldFZhbHVlKFwiXCIpO1xyXG4gICAgICB0aGlzLmlucHV0RGF0YUNoYW5nZS5lbWl0KHRoaXMuaW5wdXREYXRhKTtcclxuICAgICAgdGhpcy5kYXRlVmFsaWQuZW1pdCh0cnVlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbktleVVwSW5wdXQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgIC8vIENoZWNrIGZvciB3aGVuIHRoZSBpbnB1dCBpcyBkZWxldGVkIGJlZm9yZSBiZWluZyBzYXZlZFxyXG4gICAgaWYgKChldmVudC5rZXkgPT09IFwiRGVsZXRlXCIgfHwgZXZlbnQua2V5ID09PSBcIkJhY2tzcGFjZVwiKSAmJiB0aGlzLmRhdGVGb3JtLmNvbnRyb2xzW1wiZGF0ZUlucHV0XCJdLnZhbHVlLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLmNsZWFyKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyB1cGRhdGUgcmFuZ2Ugc28gdGhhdCB0aGUgZGF0ZSByYW5nZSB2YWxpZGF0b3IgY2FuIHJ1biBhY2N1cmF0ZWx5XHJcbiAgICAgIERhdGVWYWxpZGF0b3IubWluVmFsdWUgPSB0aGlzLm1pbkRhdGU7XHJcbiAgICAgIERhdGVWYWxpZGF0b3IubWF4VmFsdWUgPSB0aGlzLm1heERhdGU7XHJcblxyXG4gICAgICAvLyBHZXQgdGhlIHVwZGF0ZWQgZGF0ZUZvcm0gdmFsdWVcclxuICAgICAgbGV0IGV2ZW50VGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICAgIGxldCBpbnB1dFZhbHVlID0gZXZlbnRUYXJnZXQudmFsdWU7XHJcbiAgICAgIHRoaXMuZGF0ZUZvcm0uY29udHJvbHNbXCJkYXRlSW5wdXRcIl0ucGF0Y2hWYWx1ZShpbnB1dFZhbHVlKTtcclxuXHJcbiAgICAgIC8vIGlmIHdlIGhhdmUgYSBnb29kIGRhdGUgYW5kIGlzIHdpdGhpbiB0aGUgcmFuZ2UgdXBkYXRlIHRoZSBwaWNrZXJcclxuICAgICAgaWYgKERhdGVWYWxpZGF0b3IuaW5SYW5nZSh0aGlzLmRhdGVGb3JtLmNvbnRyb2xzW1wiZGF0ZUlucHV0XCJdKSkge1xyXG4gICAgICAgIHRoaXMudmFsaWRhdGUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmdldERhdGVWYWxpZCgpO1xyXG4gICAgICAgIHRoaXMuaW5wdXREYXRhID0gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0odGhpcy5kYXRlRm9ybS5jb250cm9sc1tcImRhdGVJbnB1dFwiXS52YWx1ZSwgdGhpcy5kYXRlRm9ybWF0KTtcclxuICAgICAgICB0aGlzLnVwZGF0ZUludGVybmFsRGF0YUZyb21Nb2RlbCgpO1xyXG4gICAgICAgIHRoaXMuZGF0ZUZvcm0uY29udHJvbHNbXCJkYXRlSW5wdXRcIl0uc2V0VmFsdWUodGhpcy5pbnB1dERhdGEpO1xyXG4gICAgICAgIHRoaXMuaW5wdXREYXRhQ2hhbmdlLmVtaXQodGhpcy5pbnB1dERhdGEpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMudmFsaWRhdGUgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuZ2V0RGF0ZVZhbGlkKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE5nYkRhdGVTdHJ1Y3Qgc3RvcmVzIGRheSwgbW9udGggYW5kIHllYXIuICBDb252ZXJ0IHRoaXMgdG8gSVNPODYwMS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSBkYXRlXHJcbiAgICogQHJldHVybnMge2FueX1cclxuICAgKi9cclxuICBwcml2YXRlIG5nYkRhdGVUb1N0cmluZyhkYXRlOiBOZ2JEYXRlU3RydWN0KTogc3RyaW5nIHtcclxuICAgIGlmIChkYXRlID09PSB1bmRlZmluZWQgfHwgZGF0ZSA9PT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH0gZWxzZSBpZiAoZGF0ZS55ZWFyID09PSB1bmRlZmluZWQgfHwgZGF0ZS5tb250aCA9PT0gdW5kZWZpbmVkIHx8IGRhdGUuZGF5ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGRhdGUueWVhciArIFwiLVwiICsgKChkYXRlLm1vbnRoIDwgMTApID8gXCIwXCIgOiBcIlwiKSArIGRhdGUubW9udGggKyBcIi1cIiArICgoZGF0ZS5kYXkgPCAxMCkgPyBcIjBcIiA6IFwiXCIpICsgZGF0ZS5kYXkgKyBcIlQxMjowMC0wNjowMFwiO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldERhdGVWYWxpZCgpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmRhdGVGb3JtLmdldChcImRhdGVJbnB1dFwiKS5oYXNFcnJvcihcImRhdGVGb3JtYXRWYWxpZGF0b3JcIilcclxuICAgICAgfHwgdGhpcy5kYXRlRm9ybS5nZXQoXCJkYXRlSW5wdXRcIikuaGFzRXJyb3IoXCJkYXRlUmFuZ2VWYWxpZGF0b3JcIilcclxuICAgICAgfHwgdGhpcy5kYXRlRm9ybS5nZXQoXCJkYXRlSW5wdXRcIikuaGFzRXJyb3IoXCJkYXRlSW52YWxpZFZhbGlkYXRvclwiKSkge1xyXG4gICAgICB0aGlzLmRhdGVWYWxpZC5lbWl0KGZhbHNlKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5kYXRlVmFsaWQuZW1pdCh0cnVlKTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxufVxyXG4iXX0=
|
|
@@ -3,13 +3,15 @@ export class DateValidator {
|
|
|
3
3
|
static { this.minValue = undefined; }
|
|
4
4
|
static { this.maxValue = undefined; }
|
|
5
5
|
static dateFormatValidator(ac) {
|
|
6
|
-
|
|
6
|
+
let dateArr = ac.value.split("/");
|
|
7
|
+
if (dateArr.length != 3 || dateArr[0].length > 3 || dateArr[0].length < 1 || dateArr[1].length > 3 ||
|
|
8
|
+
dateArr[1].length < 1 || dateArr[2].length !== 4) {
|
|
7
9
|
return { "dateFormatValidator": true };
|
|
8
10
|
}
|
|
9
11
|
return null;
|
|
10
12
|
}
|
|
11
13
|
static dateRangeValidator(ac) {
|
|
12
|
-
if (ac && ac.value && DateValidator.minValue && DateValidator.maxValue && moment(ac.value, "M/D/YYYY", true).isValid()) {
|
|
14
|
+
if (ac && ac.value && DateValidator.minValue && DateValidator.maxValue && (moment(ac.value, "M/D/YYYY", true).isValid() || moment(ac.value, "MM/DD/YYYY", true).isValid())) {
|
|
13
15
|
let dateValue = moment(ac.value);
|
|
14
16
|
let minDate = moment(DateValidator.convertNgbStructToDate(DateValidator.minValue));
|
|
15
17
|
let maxDate = moment(DateValidator.convertNgbStructToDate(DateValidator.maxValue));
|
|
@@ -19,11 +21,17 @@ export class DateValidator {
|
|
|
19
21
|
}
|
|
20
22
|
return null;
|
|
21
23
|
}
|
|
24
|
+
static dateInvalidValidator(ac) {
|
|
25
|
+
if (ac && ac.value && !moment(ac.value, "M/D/YYYY", true).isValid() && !moment(ac.value, "MM/DD/YYYY", true).isValid()) {
|
|
26
|
+
return { "dateInvalidValidator": true };
|
|
27
|
+
}
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
22
30
|
static convertNgbStructToDate(struct) {
|
|
23
31
|
return { year: struct.year, month: struct.month - 1, day: struct.day };
|
|
24
32
|
}
|
|
25
33
|
static inRange(ac) {
|
|
26
|
-
if (ac && ac.value && DateValidator.minValue && DateValidator.maxValue && moment(ac.value, "M/D/YYYY", true).isValid()) {
|
|
34
|
+
if (ac && ac.value && DateValidator.minValue && DateValidator.maxValue && (moment(ac.value, "M/D/YYYY", true).isValid() || moment(ac.value, "MM/DD/YYYY", true).isValid())) {
|
|
27
35
|
let dateValue = moment(ac.value);
|
|
28
36
|
let minDate = moment(DateValidator.convertNgbStructToDate(DateValidator.minValue));
|
|
29
37
|
let maxDate = moment(DateValidator.convertNgbStructToDate(DateValidator.maxValue));
|
|
@@ -37,4 +45,4 @@ export class DateValidator {
|
|
|
37
45
|
return false;
|
|
38
46
|
}
|
|
39
47
|
}
|
|
40
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS12YWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnB1dC9zcmMvZGF0ZS9kYXRlLXZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEtBQUssTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUVqQyxNQUFNLE9BQU8sYUFBYTthQUNqQixhQUFRLEdBQUcsU0FBUyxDQUFDO2FBQ3JCLGFBQVEsR0FBRyxTQUFTLENBQUM7SUFFNUIsTUFBTSxDQUFDLG1CQUFtQixDQUFDLEVBQW1CO1FBQzVDLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLElBQUksT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQ2hHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbkQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLElBQUksRUFBRSxDQUFDO1FBQ3pDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxNQUFNLENBQUMsa0JBQWtCLENBQUMsRUFBbUI7UUFDM0MsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLEtBQUssSUFBSSxhQUFhLENBQUMsUUFBUSxJQUFJLGFBQWEsQ0FBQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUMzSyxJQUFJLFNBQVMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2pDLElBQUksT0FBTyxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsc0JBQXNCLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDbkYsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUVuRixJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQzVFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUN4QyxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxFQUFtQjtRQUM3QyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDdkgsT0FBTyxFQUFFLHNCQUFzQixFQUFFLElBQUksRUFBRSxDQUFDO1FBQzFDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFQSxNQUFNLENBQUMsc0JBQXNCLENBQUMsTUFBTTtRQUNsQyxPQUFPLEVBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRyxFQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVELE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBbUI7UUFDaEMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLEtBQUssSUFBSSxhQUFhLENBQUMsUUFBUSxJQUFJLGFBQWEsQ0FBQyxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUMzSyxJQUFJLFNBQVMsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2pDLElBQUksT0FBTyxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsc0JBQXNCLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDbkYsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUVuRixJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQzNFLE9BQU8sS0FBSyxDQUFDO1lBQ2hCLENBQUM7aUJBQU0sQ0FBQztnQkFDTCxPQUFPLElBQUksQ0FBQztZQUNmLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBYnN0cmFjdENvbnRyb2x9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuXG5pbXBvcnQgKiBhcyBtb21lbnQgZnJvbSBcIm1vbWVudFwiO1xuXG5leHBvcnQgY2xhc3MgRGF0ZVZhbGlkYXRvciB7XG4gIHN0YXRpYyBtaW5WYWx1ZSA9IHVuZGVmaW5lZDtcbiAgc3RhdGljIG1heFZhbHVlID0gdW5kZWZpbmVkO1xuXG4gIHN0YXRpYyBkYXRlRm9ybWF0VmFsaWRhdG9yKGFjOiBBYnN0cmFjdENvbnRyb2wpIHtcbiAgICBsZXQgZGF0ZUFyciA9IGFjLnZhbHVlLnNwbGl0KFwiL1wiKTtcbiAgICBpZiAoZGF0ZUFyci5sZW5ndGggIT0gMyB8fCBkYXRlQXJyWzBdLmxlbmd0aCA+IDMgfHwgZGF0ZUFyclswXS5sZW5ndGggPCAxIHx8IGRhdGVBcnJbMV0ubGVuZ3RoID4gMyB8fFxuICAgICAgZGF0ZUFyclsxXS5sZW5ndGggPCAxIHx8IGRhdGVBcnJbMl0ubGVuZ3RoICE9PSA0KSB7XG4gICAgICByZXR1cm4geyBcImRhdGVGb3JtYXRWYWxpZGF0b3JcIjogdHJ1ZSB9O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHN0YXRpYyBkYXRlUmFuZ2VWYWxpZGF0b3IoYWM6IEFic3RyYWN0Q29udHJvbCkge1xuICAgIGlmIChhYyAmJiBhYy52YWx1ZSAmJiBEYXRlVmFsaWRhdG9yLm1pblZhbHVlICYmIERhdGVWYWxpZGF0b3IubWF4VmFsdWUgJiYgKG1vbWVudChhYy52YWx1ZSwgXCJNL0QvWVlZWVwiLCB0cnVlKS5pc1ZhbGlkKCkgfHwgbW9tZW50KGFjLnZhbHVlLCBcIk1NL0REL1lZWVlcIiwgdHJ1ZSkuaXNWYWxpZCgpKSkge1xuICAgICAgbGV0IGRhdGVWYWx1ZSA9IG1vbWVudChhYy52YWx1ZSk7XG4gICAgICBsZXQgbWluRGF0ZSA9IG1vbWVudChEYXRlVmFsaWRhdG9yLmNvbnZlcnROZ2JTdHJ1Y3RUb0RhdGUoRGF0ZVZhbGlkYXRvci5taW5WYWx1ZSkpO1xuICAgICAgbGV0IG1heERhdGUgPSBtb21lbnQoRGF0ZVZhbGlkYXRvci5jb252ZXJ0TmdiU3RydWN0VG9EYXRlKERhdGVWYWxpZGF0b3IubWF4VmFsdWUpKTtcblxuICAgICAgaWYgKGRhdGVWYWx1ZS5pc0JlZm9yZShtaW5EYXRlLCBcImRheVwiKSB8fCBkYXRlVmFsdWUuaXNBZnRlcihtYXhEYXRlLCBcImRheVwiKSkge1xuICAgICAgICByZXR1cm4geyBcImRhdGVSYW5nZVZhbGlkYXRvclwiOiB0cnVlIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBzdGF0aWMgZGF0ZUludmFsaWRWYWxpZGF0b3IoYWM6IEFic3RyYWN0Q29udHJvbCkge1xuICAgIGlmIChhYyAmJiBhYy52YWx1ZSAmJiAhbW9tZW50KGFjLnZhbHVlLCBcIk0vRC9ZWVlZXCIsIHRydWUpLmlzVmFsaWQoKSAmJiAhbW9tZW50KGFjLnZhbHVlLCBcIk1NL0REL1lZWVlcIiwgdHJ1ZSkuaXNWYWxpZCgpKSB7XG4gICAgICByZXR1cm4geyBcImRhdGVJbnZhbGlkVmFsaWRhdG9yXCI6IHRydWUgfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAgc3RhdGljIGNvbnZlcnROZ2JTdHJ1Y3RUb0RhdGUoc3RydWN0KSB7XG4gICAgIHJldHVybiB7eWVhcjogc3RydWN0LnllYXIsIG1vbnRoOiBzdHJ1Y3QubW9udGggLSAxLCBkYXk6IHN0cnVjdC5kYXl9O1xuICAgfVxuXG4gICBzdGF0aWMgaW5SYW5nZShhYzogQWJzdHJhY3RDb250cm9sKSB7XG4gICAgIGlmIChhYyAmJiBhYy52YWx1ZSAmJiBEYXRlVmFsaWRhdG9yLm1pblZhbHVlICYmIERhdGVWYWxpZGF0b3IubWF4VmFsdWUgJiYgKG1vbWVudChhYy52YWx1ZSwgXCJNL0QvWVlZWVwiLCB0cnVlKS5pc1ZhbGlkKCkgfHwgbW9tZW50KGFjLnZhbHVlLCBcIk1NL0REL1lZWVlcIiwgdHJ1ZSkuaXNWYWxpZCgpKSkge1xuICAgICAgIGxldCBkYXRlVmFsdWUgPSBtb21lbnQoYWMudmFsdWUpO1xuICAgICAgIGxldCBtaW5EYXRlID0gbW9tZW50KERhdGVWYWxpZGF0b3IuY29udmVydE5nYlN0cnVjdFRvRGF0ZShEYXRlVmFsaWRhdG9yLm1pblZhbHVlKSk7XG4gICAgICAgbGV0IG1heERhdGUgPSBtb21lbnQoRGF0ZVZhbGlkYXRvci5jb252ZXJ0TmdiU3RydWN0VG9EYXRlKERhdGVWYWxpZGF0b3IubWF4VmFsdWUpKTtcblxuICAgICAgIGlmIChkYXRlVmFsdWUuaXNCZWZvcmUobWluRGF0ZSwgXCJkYXlcIikgfHwgZGF0ZVZhbHVlLmlzQWZ0ZXIobWF4RGF0ZSwgXCJkYXlcIikpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICB9XG4gICAgIH1cbiAgICAgcmV0dXJuIGZhbHNlO1xuICAgfVxufVxuIl19
|