mis-crystal-design-system 18.0.24 → 18.1.0-signal-test
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/action-list/action-list.component.d.ts +17 -15
- package/async-search-dropdown/async-dropdown.component.d.ts +43 -61
- package/button/button.component.d.ts +35 -13
- package/button/button.directive.d.ts +10 -8
- package/checkbox/checkbox.component.d.ts +15 -12
- package/chip/chip.component.d.ts +9 -11
- package/datepicker_v2/models/dp-config.model.d.ts +1 -0
- package/datepicker_v2/tz-datepicker.directive.d.ts +15 -18
- package/datepicker_v2/tz-dp-container/tz-dp-container.component.d.ts +42 -21
- package/daterangepicker_v2/tz-daterangepicker.directive.d.ts +12 -14
- package/daterangepicker_v2/tz-drp-container/tz-drp-container.component.d.ts +46 -23
- package/drawer/drawer-body/drawer-body.component.d.ts +2 -2
- package/dropdown/calculate-container-height.directive.d.ts +7 -8
- package/dropdown/dropdown.component.d.ts +41 -49
- package/dynamic-form/dynamic-form.component.d.ts +20 -16
- package/esm2022/action-list/action-list.component.mjs +112 -89
- package/esm2022/async-search-dropdown/async-dropdown.component.mjs +256 -326
- package/esm2022/button/button.component.mjs +55 -48
- package/esm2022/button/button.directive.mjs +36 -40
- package/esm2022/checkbox/checkbox.component.mjs +75 -70
- package/esm2022/chip/chip.component.mjs +20 -33
- package/esm2022/datepicker_v2/models/dp-config.model.mjs +1 -1
- package/esm2022/datepicker_v2/tz-datepicker.directive.mjs +42 -71
- package/esm2022/datepicker_v2/tz-dp-container/tz-dp-container.component.mjs +202 -172
- package/esm2022/datepicker_v2/utils/index.mjs +2 -1
- package/esm2022/daterangepicker_v2/tz-daterangepicker.directive.mjs +26 -51
- package/esm2022/daterangepicker_v2/tz-drp-container/tz-drp-container.component.mjs +282 -235
- package/esm2022/drawer/drawer-body/drawer-body.component.mjs +8 -7
- package/esm2022/dropdown/calculate-container-height.directive.mjs +25 -22
- package/esm2022/dropdown/dropdown.component.mjs +162 -186
- package/esm2022/dynamic-form/dynamic-form.component.mjs +118 -72
- package/esm2022/fab/fab.component.mjs +29 -33
- package/esm2022/filter/filter-panel/filter-panel.component.mjs +60 -58
- package/esm2022/input/directives/input/input.directive.mjs +22 -26
- package/esm2022/input/mis-input.component.mjs +41 -45
- package/esm2022/input-stepper/input-stepper/input-stepper.component.mjs +40 -50
- package/esm2022/loader/loader.component.mjs +8 -11
- package/esm2022/mobile-filter/mobile-filter.component.mjs +61 -61
- package/esm2022/modal/module-wrapper/module-wrapper.component.mjs +11 -9
- package/esm2022/multi-select-dropdown/multi-select-dropdown.component.mjs +235 -281
- package/esm2022/nested-multi-select-dropdown/nested-multi-select-dropdown.component.mjs +250 -287
- package/esm2022/phone-input/phone-input.component.mjs +21 -43
- package/esm2022/radio-button/radio-button.component.mjs +15 -27
- package/esm2022/ske-loader/ske-loader.component.mjs +15 -29
- package/esm2022/slider/slider.component.mjs +23 -33
- package/esm2022/slider/slider.module.mjs +4 -11
- package/esm2022/snackbar/snackbar/snackbar.component.mjs +21 -15
- package/esm2022/snackbar/snackbar.service.mjs +3 -2
- package/esm2022/specificdatepicker/tz-sdp-container/tz-sdp-container.component.mjs +230 -343
- package/esm2022/specificdatepicker/tz-specificdatepicker.directive.mjs +77 -105
- package/esm2022/star-rating/star-rating.component.mjs +57 -71
- package/esm2022/switch/switch.component.mjs +34 -36
- package/esm2022/table/actions-cell/actions-cell.component.mjs +55 -54
- package/esm2022/table/custom-table-cell.directive.mjs +22 -18
- package/esm2022/table/filter/filter.component.mjs +60 -42
- package/esm2022/table/sort-icons.directive.mjs +16 -8
- package/esm2022/table/sub-table/sub-table.component.mjs +41 -44
- package/esm2022/table/table.component.mjs +181 -165
- package/esm2022/timepicker/timepicker.component.mjs +244 -159
- package/esm2022/timepicker/timepicker.directive.mjs +3 -2
- package/esm2022/timerangepicker/timerangepicker.component.mjs +200 -159
- package/esm2022/toast/toast.component.mjs +6 -7
- package/esm2022/toast/toast.data.service.mjs +15 -9
- package/esm2022/tooltip/tooltip-container/tooltip.component.mjs +12 -12
- package/esm2022/tooltip/tooltip.directive.mjs +4 -4
- package/esm2022/virtual-scroll/virtual-scroll.component.mjs +57 -59
- package/fab/fab.component.d.ts +12 -8
- package/fesm2022/mis-crystal-design-system-action-list.mjs +111 -88
- package/fesm2022/mis-crystal-design-system-action-list.mjs.map +1 -1
- package/fesm2022/mis-crystal-design-system-async-search-dropdown.mjs +253 -324
- package/fesm2022/mis-crystal-design-system-async-search-dropdown.mjs.map +1 -1
- package/fesm2022/mis-crystal-design-system-button.mjs +88 -85
- package/fesm2022/mis-crystal-design-system-button.mjs.map +1 -1
- package/fesm2022/mis-crystal-design-system-checkbox.mjs +74 -69
- package/fesm2022/mis-crystal-design-system-checkbox.mjs.map +1 -1
- package/fesm2022/mis-crystal-design-system-chip.mjs +19 -32
- package/fesm2022/mis-crystal-design-system-chip.mjs.map +1 -1
- package/fesm2022/mis-crystal-design-system-datepicker_v2.mjs +242 -240
- package/fesm2022/mis-crystal-design-system-datepicker_v2.mjs.map +1 -1
- package/fesm2022/mis-crystal-design-system-daterangepicker_v2.mjs +305 -283
- package/fesm2022/mis-crystal-design-system-daterangepicker_v2.mjs.map +1 -1
- package/fesm2022/mis-crystal-design-system-drawer.mjs +7 -6
- package/fesm2022/mis-crystal-design-system-drawer.mjs.map +1 -1
- package/fesm2022/mis-crystal-design-system-dropdown.mjs +183 -204
- package/fesm2022/mis-crystal-design-system-dropdown.mjs.map +1 -1
- package/fesm2022/mis-crystal-design-system-dynamic-form.mjs +118 -72
- package/fesm2022/mis-crystal-design-system-dynamic-form.mjs.map +1 -1
- package/fesm2022/mis-crystal-design-system-fab.mjs +28 -32
- package/fesm2022/mis-crystal-design-system-fab.mjs.map +1 -1
- package/fesm2022/mis-crystal-design-system-filter.mjs +59 -57
- package/fesm2022/mis-crystal-design-system-filter.mjs.map +1 -1
- package/fesm2022/mis-crystal-design-system-input-stepper.mjs +39 -49
- package/fesm2022/mis-crystal-design-system-input-stepper.mjs.map +1 -1
- package/fesm2022/mis-crystal-design-system-input.mjs +62 -71
- package/fesm2022/mis-crystal-design-system-input.mjs.map +1 -1
- package/fesm2022/mis-crystal-design-system-loader.mjs +7 -10
- package/fesm2022/mis-crystal-design-system-loader.mjs.map +1 -1
- package/fesm2022/mis-crystal-design-system-mobile-filter.mjs +60 -60
- package/fesm2022/mis-crystal-design-system-mobile-filter.mjs.map +1 -1
- package/fesm2022/mis-crystal-design-system-modal.mjs +10 -8
- package/fesm2022/mis-crystal-design-system-modal.mjs.map +1 -1
- package/fesm2022/mis-crystal-design-system-multi-select-dropdown.mjs +233 -279
- package/fesm2022/mis-crystal-design-system-multi-select-dropdown.mjs.map +1 -1
- package/fesm2022/mis-crystal-design-system-nested-multi-select-dropdown.mjs +249 -286
- package/fesm2022/mis-crystal-design-system-nested-multi-select-dropdown.mjs.map +1 -1
- package/fesm2022/mis-crystal-design-system-phone-input.mjs +20 -42
- package/fesm2022/mis-crystal-design-system-phone-input.mjs.map +1 -1
- package/fesm2022/mis-crystal-design-system-radio-button.mjs +14 -26
- package/fesm2022/mis-crystal-design-system-radio-button.mjs.map +1 -1
- package/fesm2022/mis-crystal-design-system-ske-loader.mjs +14 -28
- package/fesm2022/mis-crystal-design-system-ske-loader.mjs.map +1 -1
- package/fesm2022/mis-crystal-design-system-slider.mjs +25 -42
- package/fesm2022/mis-crystal-design-system-slider.mjs.map +1 -1
- package/fesm2022/mis-crystal-design-system-snackbar.mjs +22 -15
- package/fesm2022/mis-crystal-design-system-snackbar.mjs.map +1 -1
- package/fesm2022/mis-crystal-design-system-specificdatepicker.mjs +304 -445
- package/fesm2022/mis-crystal-design-system-specificdatepicker.mjs.map +1 -1
- package/fesm2022/mis-crystal-design-system-star-rating.mjs +56 -70
- package/fesm2022/mis-crystal-design-system-star-rating.mjs.map +1 -1
- package/fesm2022/mis-crystal-design-system-switch.mjs +33 -35
- package/fesm2022/mis-crystal-design-system-switch.mjs.map +1 -1
- package/fesm2022/mis-crystal-design-system-table.mjs +365 -321
- package/fesm2022/mis-crystal-design-system-table.mjs.map +1 -1
- package/fesm2022/mis-crystal-design-system-timepicker.mjs +245 -159
- package/fesm2022/mis-crystal-design-system-timepicker.mjs.map +1 -1
- package/fesm2022/mis-crystal-design-system-timerangepicker.mjs +199 -158
- package/fesm2022/mis-crystal-design-system-timerangepicker.mjs.map +1 -1
- package/fesm2022/mis-crystal-design-system-toast.mjs +18 -13
- package/fesm2022/mis-crystal-design-system-toast.mjs.map +1 -1
- package/fesm2022/mis-crystal-design-system-tooltip.mjs +14 -14
- package/fesm2022/mis-crystal-design-system-tooltip.mjs.map +1 -1
- package/fesm2022/mis-crystal-design-system-virtual-scroll.mjs +57 -59
- package/fesm2022/mis-crystal-design-system-virtual-scroll.mjs.map +1 -1
- package/filter/filter-panel/filter-panel.component.d.ts +14 -14
- package/input/directives/input/input.directive.d.ts +6 -10
- package/input/mis-input.component.d.ts +12 -13
- package/input-stepper/input-stepper/input-stepper.component.d.ts +8 -7
- package/loader/loader.component.d.ts +3 -6
- package/mobile-filter/mobile-filter.component.d.ts +15 -15
- package/modal/module-wrapper/module-wrapper.component.d.ts +2 -3
- package/multi-select-dropdown/multi-select-dropdown.component.d.ts +89 -51
- package/nested-multi-select-dropdown/nested-multi-select-dropdown.component.d.ts +99 -56
- package/package.json +17 -17
- package/phone-input/phone-input.component.d.ts +16 -18
- package/radio-button/radio-button.component.d.ts +9 -11
- package/ske-loader/ske-loader.component.d.ts +8 -11
- package/slider/slider.component.d.ts +8 -11
- package/slider/slider.module.d.ts +1 -2
- package/snackbar/snackbar/snackbar.component.d.ts +3 -3
- package/specificdatepicker/tz-sdp-container/tz-sdp-container.component.d.ts +35 -35
- package/specificdatepicker/tz-specificdatepicker.directive.d.ts +24 -28
- package/star-rating/star-rating.component.d.ts +18 -18
- package/switch/switch.component.d.ts +8 -10
- package/table/actions-cell/actions-cell.component.d.ts +14 -14
- package/table/custom-table-cell.directive.d.ts +3 -3
- package/table/filter/filter.component.d.ts +9 -9
- package/table/sub-table/sub-table.component.d.ts +5 -5
- package/table/table.component.d.ts +38 -35
- package/timepicker/timepicker.component.d.ts +29 -28
- package/timerangepicker/timerangepicker.component.d.ts +36 -33
- package/toast/toast.data.service.d.ts +1 -1
- package/tooltip/tooltip-container/tooltip.component.d.ts +4 -4
- package/virtual-scroll/virtual-scroll.component.d.ts +8 -9
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import { Component, ContentChild,
|
|
1
|
+
import { Component, ContentChild, input, output, signal, computed, effect, untracked } from "@angular/core";
|
|
2
2
|
import { UntypedFormArray, UntypedFormControl, UntypedFormGroup, Validators } from "@angular/forms";
|
|
3
3
|
import dayjs from 'dayjs';
|
|
4
4
|
import timezone from 'dayjs/plugin/timezone';
|
|
5
|
-
import utc from 'dayjs/plugin/utc';
|
|
6
5
|
import customParseFormat from 'dayjs/plugin/customParseFormat';
|
|
7
6
|
import * as i0 from "@angular/core";
|
|
8
7
|
import * as i1 from "@angular/common";
|
|
@@ -41,7 +40,7 @@ function DynamicFormComponent_ng_container_2_div_2_ng_container_1_Template(rf, c
|
|
|
41
40
|
const ctx_r5 = i0.ɵɵnextContext();
|
|
42
41
|
const dynamicField_r7 = i0.ɵɵreference(4);
|
|
43
42
|
i0.ɵɵadvance();
|
|
44
|
-
i0.ɵɵproperty("ngTemplateOutlet", dynamicField_r7)("ngTemplateOutletContext", i0.ɵɵpureFunction2(2, _c9, ctx_r5.findSelectedSubFieldConfig(ctx_r5.
|
|
43
|
+
i0.ɵɵproperty("ngTemplateOutlet", dynamicField_r7)("ngTemplateOutletContext", i0.ɵɵpureFunction2(2, _c9, ctx_r5.findSelectedSubFieldConfig(ctx_r5.formFieldsArray == null ? null : ctx_r5.formFieldsArray[i_r5] == null ? null : ctx_r5.formFieldsArray[i_r5].subFields, fieldControl_r4.controls.value.value.value, j_r2), subFieldControl_r1));
|
|
45
44
|
} }
|
|
46
45
|
function DynamicFormComponent_ng_container_2_div_2_Template(rf, ctx) { if (rf & 1) {
|
|
47
46
|
i0.ɵɵelementStart(0, "div", 17);
|
|
@@ -64,9 +63,9 @@ function DynamicFormComponent_ng_container_2_Template(rf, ctx) { if (rf & 1) {
|
|
|
64
63
|
const dynamicField_r7 = i0.ɵɵreference(4);
|
|
65
64
|
i0.ɵɵproperty("formGroupName", i_r5);
|
|
66
65
|
i0.ɵɵadvance();
|
|
67
|
-
i0.ɵɵproperty("ngTemplateOutlet", dynamicField_r7)("ngTemplateOutletContext", i0.ɵɵpureFunction3(4, _c8, ctx_r5.
|
|
66
|
+
i0.ɵɵproperty("ngTemplateOutlet", dynamicField_r7)("ngTemplateOutletContext", i0.ɵɵpureFunction3(4, _c8, ctx_r5.formFieldsArray == null ? null : ctx_r5.formFieldsArray[i_r5], fieldControl_r4, fieldControl_r4.controls.value));
|
|
68
67
|
i0.ɵɵadvance();
|
|
69
|
-
i0.ɵɵproperty("ngIf", (fieldControl_r4 == null ? null : fieldControl_r4.value) && (!!(ctx_r5.
|
|
68
|
+
i0.ɵɵproperty("ngIf", (fieldControl_r4 == null ? null : fieldControl_r4.value) && (!!(ctx_r5.formFieldsArray == null ? null : ctx_r5.formFieldsArray[i_r5] == null ? null : ctx_r5.formFieldsArray[i_r5].subFields) && (ctx_r5.formFieldsArray == null ? null : ctx_r5.formFieldsArray[i_r5] == null ? null : ctx_r5.formFieldsArray[i_r5].subFields == null ? null : ctx_r5.formFieldsArray[i_r5].subFields.length) > 0 && ctx_r5.matchParentConfig(ctx_r5.formFieldsArray == null ? null : ctx_r5.formFieldsArray[i_r5] == null ? null : ctx_r5.formFieldsArray[i_r5].subFields, fieldControl_r4 == null ? null : fieldControl_r4.controls == null ? null : fieldControl_r4.controls.value == null ? null : fieldControl_r4.controls.value.value == null ? null : fieldControl_r4.controls.value.value.value)));
|
|
70
69
|
} }
|
|
71
70
|
function DynamicFormComponent_ng_template_3_ng_container_0_ng_container_1_ng_template_1_Template(rf, ctx) { }
|
|
72
71
|
function DynamicFormComponent_ng_template_3_ng_container_0_ng_container_1_Template(rf, ctx) { if (rf & 1) {
|
|
@@ -224,7 +223,7 @@ function DynamicFormComponent_ng_template_3_ng_container_2_ng_template_2_div_0_i
|
|
|
224
223
|
i0.ɵɵelementEnd();
|
|
225
224
|
} if (rf & 2) {
|
|
226
225
|
const ctx_r5 = i0.ɵɵnextContext(5);
|
|
227
|
-
i0.ɵɵproperty("src", ctx_r5.calendarIconUrl, i0.ɵɵsanitizeUrl);
|
|
226
|
+
i0.ɵɵproperty("src", ctx_r5.calendarIconUrl(), i0.ɵɵsanitizeUrl);
|
|
228
227
|
} }
|
|
229
228
|
function DynamicFormComponent_ng_template_3_ng_container_2_ng_template_2_div_0_ng_container_8_Template(rf, ctx) { if (rf & 1) {
|
|
230
229
|
i0.ɵɵelementContainer(0, 15);
|
|
@@ -261,7 +260,7 @@ function DynamicFormComponent_ng_template_3_ng_container_2_ng_template_2_div_0_T
|
|
|
261
260
|
i0.ɵɵadvance(2);
|
|
262
261
|
i0.ɵɵproperty("dpConfig", field_r9.fieldConfig)("selectedDate", control_r10.value)("offsetY", 0)("value", control_r10.value);
|
|
263
262
|
i0.ɵɵadvance(2);
|
|
264
|
-
i0.ɵɵproperty("ngIf", ctx_r5.calendarIconUrl);
|
|
263
|
+
i0.ɵɵproperty("ngIf", ctx_r5.calendarIconUrl());
|
|
265
264
|
i0.ɵɵadvance();
|
|
266
265
|
i0.ɵɵproperty("ngIf", control_r10.touched && control_r10.errors);
|
|
267
266
|
} }
|
|
@@ -371,7 +370,7 @@ function DynamicFormComponent_ng_template_3_ng_container_4_ng_template_2_img_6_T
|
|
|
371
370
|
i0.ɵɵelementEnd();
|
|
372
371
|
} if (rf & 2) {
|
|
373
372
|
const ctx_r5 = i0.ɵɵnextContext(4);
|
|
374
|
-
i0.ɵɵproperty("src", ctx_r5.removeIconUrl, i0.ɵɵsanitizeUrl);
|
|
373
|
+
i0.ɵɵproperty("src", ctx_r5.removeIconUrl(), i0.ɵɵsanitizeUrl);
|
|
375
374
|
} }
|
|
376
375
|
function DynamicFormComponent_ng_template_3_ng_container_4_ng_template_2_ng_container_7_Template(rf, ctx) { if (rf & 1) {
|
|
377
376
|
i0.ɵɵelementContainer(0, 15);
|
|
@@ -410,7 +409,7 @@ function DynamicFormComponent_ng_template_3_ng_container_4_ng_template_2_Templat
|
|
|
410
409
|
i0.ɵɵadvance();
|
|
411
410
|
i0.ɵɵproperty("searchEnabled", false)("width", "140px")("data", field_r9.itemsList)("selectedItem", control_r10.value);
|
|
412
411
|
i0.ɵɵadvance();
|
|
413
|
-
i0.ɵɵproperty("ngIf", field_r9.isRemoveable && ctx_r5.removeIconUrl);
|
|
412
|
+
i0.ɵɵproperty("ngIf", field_r9.isRemoveable && ctx_r5.removeIconUrl());
|
|
414
413
|
i0.ɵɵadvance();
|
|
415
414
|
i0.ɵɵproperty("ngIf", control_r10.touched && control_r10.errors);
|
|
416
415
|
} }
|
|
@@ -447,7 +446,7 @@ function DynamicFormComponent_ng_template_3_ng_container_5_ng_template_2_div_6_i
|
|
|
447
446
|
i0.ɵɵelement(0, "img", 43);
|
|
448
447
|
} if (rf & 2) {
|
|
449
448
|
const ctx_r5 = i0.ɵɵnextContext(5);
|
|
450
|
-
i0.ɵɵproperty("src", ctx_r5.activeBtnIconUrl, i0.ɵɵsanitizeUrl);
|
|
449
|
+
i0.ɵɵproperty("src", ctx_r5.activeBtnIconUrl(), i0.ɵɵsanitizeUrl);
|
|
451
450
|
} }
|
|
452
451
|
function DynamicFormComponent_ng_template_3_ng_container_5_ng_template_2_div_6_Template(rf, ctx) { if (rf & 1) {
|
|
453
452
|
const _r26 = i0.ɵɵgetCurrentView();
|
|
@@ -463,7 +462,7 @@ function DynamicFormComponent_ng_template_3_ng_container_5_ng_template_2_div_6_T
|
|
|
463
462
|
const ctx_r5 = i0.ɵɵnextContext();
|
|
464
463
|
i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(3, _c15, item_r27.label === (control_r10.value == null ? null : control_r10.value.label)));
|
|
465
464
|
i0.ɵɵadvance();
|
|
466
|
-
i0.ɵɵproperty("ngIf", item_r27.label === (control_r10.value == null ? null : control_r10.value.label) && ctx_r5.activeBtnIconUrl);
|
|
465
|
+
i0.ɵɵproperty("ngIf", item_r27.label === (control_r10.value == null ? null : control_r10.value.label) && ctx_r5.activeBtnIconUrl());
|
|
467
466
|
i0.ɵɵadvance(2);
|
|
468
467
|
i0.ɵɵtextInterpolate(item_r27.label);
|
|
469
468
|
} }
|
|
@@ -535,7 +534,7 @@ function DynamicFormComponent_ng_template_3_ng_container_6_ng_template_2_div_6_i
|
|
|
535
534
|
i0.ɵɵelement(0, "img", 43);
|
|
536
535
|
} if (rf & 2) {
|
|
537
536
|
const ctx_r5 = i0.ɵɵnextContext(5);
|
|
538
|
-
i0.ɵɵproperty("src", ctx_r5.activeBtnIconUrl, i0.ɵɵsanitizeUrl);
|
|
537
|
+
i0.ɵɵproperty("src", ctx_r5.activeBtnIconUrl(), i0.ɵɵsanitizeUrl);
|
|
539
538
|
} }
|
|
540
539
|
function DynamicFormComponent_ng_template_3_ng_container_6_ng_template_2_div_6_Template(rf, ctx) { if (rf & 1) {
|
|
541
540
|
const _r29 = i0.ɵɵgetCurrentView();
|
|
@@ -551,7 +550,7 @@ function DynamicFormComponent_ng_template_3_ng_container_6_ng_template_2_div_6_T
|
|
|
551
550
|
const ctx_r5 = i0.ɵɵnextContext();
|
|
552
551
|
i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(3, _c15, ctx_r5.isCheckBoxSelected(item_r30.label, control_r10.value)));
|
|
553
552
|
i0.ɵɵadvance();
|
|
554
|
-
i0.ɵɵproperty("ngIf", ctx_r5.isCheckBoxSelected(item_r30.label, control_r10.value) && ctx_r5.activeBtnIconUrl);
|
|
553
|
+
i0.ɵɵproperty("ngIf", ctx_r5.isCheckBoxSelected(item_r30.label, control_r10.value) && ctx_r5.activeBtnIconUrl());
|
|
555
554
|
i0.ɵɵadvance(2);
|
|
556
555
|
i0.ɵɵtextInterpolate(item_r30.label);
|
|
557
556
|
} }
|
|
@@ -708,59 +707,115 @@ function DynamicFormComponent_ng_template_5_Template(rf, ctx) { if (rf & 1) {
|
|
|
708
707
|
i0.ɵɵadvance();
|
|
709
708
|
i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind1(2, 1, errors_r35));
|
|
710
709
|
} }
|
|
711
|
-
dayjs.extend(utc);
|
|
712
710
|
dayjs.extend(timezone);
|
|
713
711
|
dayjs.extend(customParseFormat);
|
|
714
712
|
export class DynamicFormComponent {
|
|
713
|
+
// Backward compatibility: handle both signal and property access
|
|
714
|
+
get formFieldsArray() {
|
|
715
|
+
return this.formFields();
|
|
716
|
+
}
|
|
715
717
|
constructor() {
|
|
716
718
|
/**
|
|
717
719
|
* formFields: Dynamic fields recieved from the API metadata to build a dynamic form
|
|
718
720
|
* formValues: Holds the value of the dynamic form with "key" being dynamic field "title"
|
|
719
721
|
* and value being the user input.
|
|
720
722
|
*/
|
|
721
|
-
this.formFields = [];
|
|
722
|
-
this.formValues = {};
|
|
723
|
+
this.formFields = input([]);
|
|
724
|
+
this.formValues = input({});
|
|
723
725
|
// Need to deprecate these inputs and use constants.
|
|
724
|
-
this.activeBtnIconUrl = "";
|
|
725
|
-
this.calendarIconUrl = "";
|
|
726
|
-
this.removeIconUrl = "";
|
|
727
|
-
this.removeSepratorForSubFields = false;
|
|
726
|
+
this.activeBtnIconUrl = input("");
|
|
727
|
+
this.calendarIconUrl = input("");
|
|
728
|
+
this.removeIconUrl = input("");
|
|
729
|
+
this.removeSepratorForSubFields = input(false);
|
|
730
|
+
/**
|
|
731
|
+
* dynamicForm: Constructed using formFields and formValues(in case of edit)
|
|
732
|
+
*/
|
|
728
733
|
/**
|
|
729
734
|
* formUpdated: Emits formValues Object whenever there is a change in the dynamic form.
|
|
730
735
|
*/
|
|
731
|
-
this.formUpdated =
|
|
736
|
+
this.formUpdated = output();
|
|
732
737
|
/**
|
|
733
738
|
* formValid: Emits boolean depending on validity of the form
|
|
734
739
|
*/
|
|
735
|
-
this.formValid =
|
|
740
|
+
this.formValid = output();
|
|
736
741
|
/**
|
|
737
742
|
* formInitialized: Emits dynamic form API on form initilization
|
|
738
743
|
*/
|
|
739
|
-
this.formInitialized =
|
|
740
|
-
this.fieldRemoved =
|
|
744
|
+
this.formInitialized = output();
|
|
745
|
+
this.fieldRemoved = output();
|
|
746
|
+
// Signal-based state management
|
|
747
|
+
this.dynamicFormSignal = signal(null);
|
|
748
|
+
this.dynamicFormAPISignal = signal(null);
|
|
749
|
+
this.valueChangesSubscriptionSignal = signal(null);
|
|
750
|
+
// Computed properties for template access
|
|
751
|
+
this.dynamicForm = computed(() => this.dynamicFormSignal());
|
|
752
|
+
this.dynamicFormAPI = computed(() => this.dynamicFormAPISignal());
|
|
753
|
+
this.valueChangesSubscription$ = computed(() => this.valueChangesSubscriptionSignal());
|
|
754
|
+
// Watch for changes in input signals and update the form accordingly
|
|
755
|
+
effect(() => {
|
|
756
|
+
const formFields = this.formFields();
|
|
757
|
+
const formValues = this.formValues();
|
|
758
|
+
// Only update if we have form fields (formValues can be empty)
|
|
759
|
+
if (formFields) {
|
|
760
|
+
// Use untracked to prevent infinite loops when setting signals
|
|
761
|
+
untracked(() => {
|
|
762
|
+
const form = this.generateDynamicForm(formFields, formValues);
|
|
763
|
+
this.dynamicFormSignal.set(form);
|
|
764
|
+
// Re-subscribe to form changes
|
|
765
|
+
this.valueChangesSubscriptionSignal()?.unsubscribe();
|
|
766
|
+
this.valueChangesSubscriptionSignal.set(form.valueChanges.subscribe(formValue => {
|
|
767
|
+
this.onFormValueChanges();
|
|
768
|
+
}));
|
|
769
|
+
// Emit form validity status
|
|
770
|
+
this.formValid.emit(form.valid);
|
|
771
|
+
// Update the API with the new form
|
|
772
|
+
this.dynamicFormAPISignal.set({
|
|
773
|
+
defaultFormValues: () => {
|
|
774
|
+
return this.generateDynamicFieldsValueObject(form.value.dynamicFields);
|
|
775
|
+
}
|
|
776
|
+
});
|
|
777
|
+
});
|
|
778
|
+
}
|
|
779
|
+
});
|
|
741
780
|
}
|
|
742
781
|
ngOnInit() {
|
|
743
|
-
// Building the form
|
|
744
|
-
|
|
782
|
+
// Building the form with proper null checks
|
|
783
|
+
const formFields = this.formFields() || [];
|
|
784
|
+
const formValues = this.formValues() || {};
|
|
785
|
+
// Only create form if we have form fields
|
|
786
|
+
if (formFields.length > 0) {
|
|
787
|
+
const form = this.generateDynamicForm(formFields, formValues);
|
|
788
|
+
this.dynamicFormSignal.set(form);
|
|
789
|
+
}
|
|
790
|
+
else {
|
|
791
|
+
// Create an empty form as fallback
|
|
792
|
+
const emptyForm = new UntypedFormGroup({
|
|
793
|
+
dynamicFields: new UntypedFormArray([])
|
|
794
|
+
});
|
|
795
|
+
this.dynamicFormSignal.set(emptyForm);
|
|
796
|
+
}
|
|
745
797
|
// Subscribing to form changes and emiting values.
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
798
|
+
const currentForm = this.dynamicFormSignal();
|
|
799
|
+
if (currentForm) {
|
|
800
|
+
this.valueChangesSubscriptionSignal.set(currentForm.valueChanges.subscribe(formValue => {
|
|
801
|
+
this.onFormValueChanges();
|
|
802
|
+
}));
|
|
803
|
+
}
|
|
749
804
|
//api to expose functions
|
|
750
|
-
this.
|
|
805
|
+
this.dynamicFormAPISignal.set({
|
|
751
806
|
defaultFormValues: () => {
|
|
752
|
-
return this.generateDynamicFieldsValueObject(this.dynamicForm.value.dynamicFields);
|
|
807
|
+
return this.generateDynamicFieldsValueObject(this.dynamicForm().value.dynamicFields);
|
|
753
808
|
}
|
|
754
|
-
};
|
|
755
|
-
this.formInitialized.emit(this.dynamicFormAPI);
|
|
756
|
-
this.formValid.emit(this.dynamicForm.valid);
|
|
809
|
+
});
|
|
810
|
+
this.formInitialized.emit(this.dynamicFormAPI());
|
|
811
|
+
this.formValid.emit(this.dynamicForm().valid);
|
|
757
812
|
}
|
|
758
813
|
ngOnDestroy() {
|
|
759
|
-
this.valueChangesSubscription
|
|
814
|
+
this.valueChangesSubscription$()?.unsubscribe();
|
|
760
815
|
}
|
|
761
816
|
onFormValueChanges() {
|
|
762
|
-
let formValues = this.generateDynamicFieldsValueObject(this.dynamicForm.value.dynamicFields);
|
|
763
|
-
this.formValid.emit(this.dynamicForm.valid);
|
|
817
|
+
let formValues = this.generateDynamicFieldsValueObject(this.dynamicForm().value.dynamicFields);
|
|
818
|
+
this.formValid.emit(this.dynamicForm().valid);
|
|
764
819
|
this.formUpdated.emit(formValues);
|
|
765
820
|
console.log(formValues);
|
|
766
821
|
}
|
|
@@ -769,11 +824,11 @@ export class DynamicFormComponent {
|
|
|
769
824
|
formValues.forEach((fieldValue, index) => {
|
|
770
825
|
if (typeof fieldValue?.value === 'string')
|
|
771
826
|
fieldValue.value = fieldValue?.value?.trim();
|
|
772
|
-
let formattedValue = this.mapFormFieldToFormValue(this.formFields[index], fieldValue.value);
|
|
827
|
+
let formattedValue = this.mapFormFieldToFormValue(this.formFields()[index], fieldValue.value);
|
|
773
828
|
if (fieldValue.subFields?.length > 0) {
|
|
774
829
|
let formattedSubFieldsValues = {};
|
|
775
|
-
let subField = this.formFields[index].subFields;
|
|
776
|
-
if (this.formFields[index].fieldType === 'singleSelect' || this.formFields[index].fieldType === 'multiSelect') {
|
|
830
|
+
let subField = this.formFields()[index].subFields;
|
|
831
|
+
if (this.formFields()[index].fieldType === 'singleSelect' || this.formFields()[index].fieldType === 'multiSelect') {
|
|
777
832
|
subField = subField.filter((subField) => subField.parentConfigValue === fieldValue.value.value);
|
|
778
833
|
}
|
|
779
834
|
fieldValue.subFields.forEach((subFieldValue, subIndex) => {
|
|
@@ -782,13 +837,13 @@ export class DynamicFormComponent {
|
|
|
782
837
|
subFieldValue.value = subFieldValue?.value?.trim();
|
|
783
838
|
formattedSubFieldsValues[subFormField.configName] = this.mapFormFieldToFormValue(subFormField, subFieldValue);
|
|
784
839
|
});
|
|
785
|
-
dynamicFieldsValue[this.formFields[index].configName] = {
|
|
840
|
+
dynamicFieldsValue[this.formFields()[index].configName] = {
|
|
786
841
|
value: formattedValue,
|
|
787
842
|
subFields: formattedSubFieldsValues
|
|
788
843
|
};
|
|
789
844
|
}
|
|
790
845
|
else {
|
|
791
|
-
dynamicFieldsValue[this.formFields[index].configName] = formattedValue;
|
|
846
|
+
dynamicFieldsValue[this.formFields()[index].configName] = formattedValue;
|
|
792
847
|
}
|
|
793
848
|
});
|
|
794
849
|
return dynamicFieldsValue;
|
|
@@ -796,7 +851,7 @@ export class DynamicFormComponent {
|
|
|
796
851
|
generateDynamicForm(formFields, formValues) {
|
|
797
852
|
let formArray = new UntypedFormArray([]);
|
|
798
853
|
for (let field of formFields) {
|
|
799
|
-
let fieldValue = formValues[field.configName]
|
|
854
|
+
let fieldValue = formValues[field.configName];
|
|
800
855
|
let fieldControl = this.mapFormValueToFormField(field, fieldValue);
|
|
801
856
|
let subFieldsControls = this.generateSubDynamicFields(formValues, field, fieldControl.value);
|
|
802
857
|
formArray.push(new UntypedFormGroup({
|
|
@@ -809,7 +864,7 @@ export class DynamicFormComponent {
|
|
|
809
864
|
});
|
|
810
865
|
}
|
|
811
866
|
getDynamicFieldsControls() {
|
|
812
|
-
return this.dynamicForm.get("dynamicFields");
|
|
867
|
+
return this.dynamicForm().get("dynamicFields");
|
|
813
868
|
}
|
|
814
869
|
updateSubDynamicFields(field, formGroup, value) {
|
|
815
870
|
if (field.subFields?.length > 0) {
|
|
@@ -890,10 +945,19 @@ export class DynamicFormComponent {
|
|
|
890
945
|
control.setValue(formValue ? formValue : 0);
|
|
891
946
|
else if (formField.fieldInputType === "date") {
|
|
892
947
|
if (formValue && typeof formValue === "number") {
|
|
893
|
-
|
|
948
|
+
const timezone = (formField.fieldConfig && formField.fieldConfig.timezone) || 'Asia/Kolkata';
|
|
949
|
+
const format = (formField.fieldConfig && formField.fieldConfig.format) || 'DD/MM/YYYY';
|
|
950
|
+
control.setValue(dayjs(formValue).tz(timezone).format(format));
|
|
951
|
+
}
|
|
952
|
+
else if (formValue && typeof formValue === "string") {
|
|
953
|
+
const timezone = (formField.fieldConfig && formField.fieldConfig.timezone) || 'Asia/Kolkata';
|
|
954
|
+
const format = (formField.fieldConfig && formField.fieldConfig.format) || 'DD/MM/YYYY';
|
|
955
|
+
control.setValue(dayjs.tz(formValue, format, timezone).format(format));
|
|
894
956
|
}
|
|
895
957
|
else {
|
|
896
|
-
|
|
958
|
+
const timezone = (formField.fieldConfig && formField.fieldConfig.timezone) || 'Asia/Kolkata';
|
|
959
|
+
const format = (formField.fieldConfig && formField.fieldConfig.format) || 'DD/MM/YYYY';
|
|
960
|
+
control.setValue(dayjs().tz(timezone).format(format));
|
|
897
961
|
}
|
|
898
962
|
}
|
|
899
963
|
}
|
|
@@ -940,7 +1004,9 @@ export class DynamicFormComponent {
|
|
|
940
1004
|
else if (formField.fieldInputType === "number")
|
|
941
1005
|
return +formValue;
|
|
942
1006
|
else if (formField.fieldInputType === "date") {
|
|
943
|
-
|
|
1007
|
+
const format = (formField.fieldConfig && formField.fieldConfig.format) || 'DD/MM/YYYY';
|
|
1008
|
+
const timezone = (formField.fieldConfig && formField.fieldConfig.timezone) || 'Asia/Kolkata';
|
|
1009
|
+
return dayjs.tz(formValue, format, timezone).valueOf();
|
|
944
1010
|
}
|
|
945
1011
|
}
|
|
946
1012
|
else if (formField.fieldType === "singleSelect") {
|
|
@@ -975,7 +1041,7 @@ export class DynamicFormComponent {
|
|
|
975
1041
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.customSingleSelectRadio = _t.first);
|
|
976
1042
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.customMultiSelectCheckbox = _t.first);
|
|
977
1043
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.customMultiSelectDropdown = _t.first);
|
|
978
|
-
} }, inputs: { formFields: "formFields", formValues: "formValues", activeBtnIconUrl: "activeBtnIconUrl", calendarIconUrl: "calendarIconUrl", removeIconUrl: "removeIconUrl", removeSepratorForSubFields: "removeSepratorForSubFields" }, outputs: { formUpdated: "formUpdated", formValid: "formValid", formInitialized: "formInitialized", fieldRemoved: "fieldRemoved" }, decls: 7, vars: 2, consts: [["dynamicField", ""], ["dynamicFieldErrors", ""], ["defaultInputTextNumber", ""], ["defaultInputTextarea", ""], ["defaultInputDate", ""], ["dp", ""], ["defaultBooleanToggle", ""], ["defaultSingleSelectDropdown", ""], ["defaultSingleSelectRadio", ""], ["defaultMultiSelectCheckbox", ""], ["defaultMultiSelectDropdown", ""], [3, "formGroup"], ["formArrayName", "dynamicFields"], [3, "formGroupName", 4, "ngFor", "ngForOf"], [3, "formGroupName"], [3, "ngTemplateOutlet", "ngTemplateOutletContext"], ["class", "sub-dynamic-form", 4, "ngIf"], [1, "sub-dynamic-form"], [4, "ngFor", "ngForOf"], [4, "ngIf"], [4, "ngIf", "ngIfElse"], [1, "dynamic-field", "multi-line-field-container", 3, "ngStyle"], [1, "h7", "field-title-sm"], [2, "flex-basis", "100%"], [1, "input-field", "ip-text", 3, "ngModelChange", "type", "formControl", "ngStyle", "placeholder", "min"], [3, "ngTemplateOutlet", "ngTemplateOutletContext", 4, "ngIf"], ["type", "text", 1, "input-field", "ip-textarea", 3, "ngModelChange", "ngStyle", "placeholder", "formControl"], ["class", "dynamic-field single-line-field-container", 3, "ngStyle", 4, "ngIf"], [1, "dynamic-field", "single-line-field-container", 3, "ngStyle"], [1, "h6"], [1, "date-picker-container"], ["readonly", "", "misTzDp", "", 1, "date-picker", 3, "dateChange", "dpConfig", "selectedDate", "offsetY", "value"], ["alt", "data-picker", "class", "date-picker-icon", 3, "src", "click", 4, "ngIf"], ["alt", "data-picker", 1, "date-picker-icon", 3, "click", "src"], [3, "valueChanged", "control"], [3, "ngClass"], [3, "onChange", "searchEnabled", "width", "data", "selectedItem"], ["class", "remove-icon", 3, "src", "click", 4, "ngIf"], [1, "remove-icon", 3, "click", "src"], ["id", "checkboxes-container"], ["class", "radio-checkbox-common", 3, "ngClass", "click", 4, "ngFor", "ngForOf"], [1, "radio-checkbox-common", 3, "click", "ngClass"], ["alt", "", 3, "src", 4, "ngIf"], ["alt", "", 3, "src"], [3, "onChange", "width", "showSelectedCount", "dropdownListWidth", "searchEnabled", "hideApplyButton", "data", "selectedItems"], ["id", "error-messages-container"], [1, "h8"], [3, "ngStyle"]], template: function DynamicFormComponent_Template(rf, ctx) { if (rf & 1) {
|
|
1044
|
+
} }, inputs: { formFields: [1, "formFields"], formValues: [1, "formValues"], activeBtnIconUrl: [1, "activeBtnIconUrl"], calendarIconUrl: [1, "calendarIconUrl"], removeIconUrl: [1, "removeIconUrl"], removeSepratorForSubFields: [1, "removeSepratorForSubFields"] }, outputs: { formUpdated: "formUpdated", formValid: "formValid", formInitialized: "formInitialized", fieldRemoved: "fieldRemoved" }, decls: 7, vars: 2, consts: [["dynamicField", ""], ["dynamicFieldErrors", ""], ["defaultInputTextNumber", ""], ["defaultInputTextarea", ""], ["defaultInputDate", ""], ["dp", ""], ["defaultBooleanToggle", ""], ["defaultSingleSelectDropdown", ""], ["defaultSingleSelectRadio", ""], ["defaultMultiSelectCheckbox", ""], ["defaultMultiSelectDropdown", ""], [3, "formGroup"], ["formArrayName", "dynamicFields"], [3, "formGroupName", 4, "ngFor", "ngForOf"], [3, "formGroupName"], [3, "ngTemplateOutlet", "ngTemplateOutletContext"], ["class", "sub-dynamic-form", 4, "ngIf"], [1, "sub-dynamic-form"], [4, "ngFor", "ngForOf"], [4, "ngIf"], [4, "ngIf", "ngIfElse"], [1, "dynamic-field", "multi-line-field-container", 3, "ngStyle"], [1, "h7", "field-title-sm"], [2, "flex-basis", "100%"], [1, "input-field", "ip-text", 3, "ngModelChange", "type", "formControl", "ngStyle", "placeholder", "min"], [3, "ngTemplateOutlet", "ngTemplateOutletContext", 4, "ngIf"], ["type", "text", 1, "input-field", "ip-textarea", 3, "ngModelChange", "ngStyle", "placeholder", "formControl"], ["class", "dynamic-field single-line-field-container", 3, "ngStyle", 4, "ngIf"], [1, "dynamic-field", "single-line-field-container", 3, "ngStyle"], [1, "h6"], [1, "date-picker-container"], ["readonly", "", "misTzDp", "", 1, "date-picker", 3, "dateChange", "dpConfig", "selectedDate", "offsetY", "value"], ["alt", "data-picker", "class", "date-picker-icon", 3, "src", "click", 4, "ngIf"], ["alt", "data-picker", 1, "date-picker-icon", 3, "click", "src"], [3, "valueChanged", "control"], [3, "ngClass"], [3, "onChange", "searchEnabled", "width", "data", "selectedItem"], ["class", "remove-icon", 3, "src", "click", 4, "ngIf"], [1, "remove-icon", 3, "click", "src"], ["id", "checkboxes-container"], ["class", "radio-checkbox-common", 3, "ngClass", "click", 4, "ngFor", "ngForOf"], [1, "radio-checkbox-common", 3, "click", "ngClass"], ["alt", "", 3, "src", 4, "ngIf"], ["alt", "", 3, "src"], [3, "onChange", "width", "showSelectedCount", "dropdownListWidth", "searchEnabled", "hideApplyButton", "data", "selectedItems"], ["id", "error-messages-container"], [1, "h8"], [3, "ngStyle"]], template: function DynamicFormComponent_Template(rf, ctx) { if (rf & 1) {
|
|
979
1045
|
i0.ɵɵelementStart(0, "form", 11);
|
|
980
1046
|
i0.ɵɵelementContainerStart(1, 12);
|
|
981
1047
|
i0.ɵɵtemplate(2, DynamicFormComponent_ng_container_2_Template, 3, 8, "ng-container", 13);
|
|
@@ -983,35 +1049,15 @@ export class DynamicFormComponent {
|
|
|
983
1049
|
i0.ɵɵelementEnd();
|
|
984
1050
|
i0.ɵɵtemplate(3, DynamicFormComponent_ng_template_3_Template, 8, 8, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor)(5, DynamicFormComponent_ng_template_5_Template, 3, 3, "ng-template", null, 1, i0.ɵɵtemplateRefExtractor);
|
|
985
1051
|
} if (rf & 2) {
|
|
986
|
-
i0.ɵɵproperty("formGroup", ctx.dynamicForm);
|
|
1052
|
+
i0.ɵɵproperty("formGroup", ctx.dynamicForm());
|
|
987
1053
|
i0.ɵɵadvance(2);
|
|
988
1054
|
i0.ɵɵproperty("ngForOf", ctx.getDynamicFieldsControls().controls);
|
|
989
1055
|
} }, dependencies: [i1.NgClass, i1.NgForOf, i1.NgIf, i1.NgTemplateOutlet, i1.NgStyle, i2.ɵNgNoValidate, i2.DefaultValueAccessor, i2.NgControlStatus, i2.NgControlStatusGroup, i2.FormControlDirective, i2.FormGroupDirective, i2.FormGroupName, i2.FormArrayName, i3.DropdownComponent, i4.SwitchComponent, i5.MultiSelectDropdownComponent, i6.TzDatepickerDirective, i1.KeyValuePipe], styles: ["p[_ngcontent-%COMP%]{margin:0;cursor:default} .main-container{margin:0;max-width:100%}.sub-dynamic-form[_ngcontent-%COMP%]{padding-left:24px;border-bottom:1px solid var(--grey-seperators)}.dynamic-field[_ngcontent-%COMP%] .container{height:32px!important}.single-line-field-container[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;padding:28px 16px;border-bottom:1px solid var(--grey-seperators)}.multi-line-field-container[_ngcontent-%COMP%]{display:flex;justify-content:flex-start;align-items:flex-start;padding:28px 16px;flex-wrap:wrap;border-bottom:1px solid var(--grey-seperators)}.field-title-sm[_ngcontent-%COMP%]{margin-bottom:8px;cursor:default}.input-field[_ngcontent-%COMP%]{width:100%;background-color:var(--grey-bg-1);border:1px solid var(--grey-seperators);border-radius:6px}.ip-text[_ngcontent-%COMP%]{height:44px;padding:8px 12px}.ip-textarea[_ngcontent-%COMP%]{max-height:94px;padding:8px}input[_ngcontent-%COMP%]:focus{outline:none}input[_ngcontent-%COMP%]::placeholder{color:var(--grey-seperators)}textarea[_ngcontent-%COMP%]:focus{outline:none}.date-picker-container[_ngcontent-%COMP%]{position:relative;width:140px}.date-picker-container[_ngcontent-%COMP%] .date-picker[_ngcontent-%COMP%]{cursor:pointer;height:32px;width:100%;font-size:14px;border-radius:6px;padding:0 12px;border:1px solid var(--grey-seperators);inset:10px auto auto 80px;background-color:var(--text-white)}.date-picker-container[_ngcontent-%COMP%] .date-picker[_ngcontent-%COMP%]:hover{background-color:var(--grey-hover)}.date-picker-container[_ngcontent-%COMP%] .date-picker-icon[_ngcontent-%COMP%]{position:absolute;top:50%;right:12px;transform:translateY(-50%);cursor:pointer}form[_ngcontent-%COMP%] .dynamic-field[_ngcontent-%COMP%]:last-child{border-bottom:none!important}#checkboxes-container[_ngcontent-%COMP%]{display:flex;justify-content:flex-start;align-items:center;flex-wrap:wrap}.radio-checkbox-common[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center;cursor:pointer;margin-right:8px;margin-bottom:8px;background-color:var(--text-white);padding:12px 16px;border:1px solid var(--text-muted);border-radius:8px}.radio-checkbox-common[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:var(--text-muted);cursor:pointer}.radio-checkbox-common[_ngcontent-%COMP%] img[_ngcontent-%COMP%]{margin-right:8px}.checkbox-active[_ngcontent-%COMP%]{background-color:var(--pmry-500)}.checkbox-active[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:var(--text-white)}#error-messages-container[_ngcontent-%COMP%]{margin-top:4px;width:100%;display:flex;justify-content:flex-start;align-items:center;flex-wrap:wrap}#error-messages-container[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:var(--sem-error)}.removeable-container[_ngcontent-%COMP%]{display:flex;justify-content:center;align-items:center}.removeable-container[_ngcontent-%COMP%] .remove-icon[_ngcontent-%COMP%]{cursor:pointer;margin-left:8px;max-width:24px}span[_ngcontent-%COMP%]{color:var(--sem-error)}"] }); }
|
|
990
1056
|
}
|
|
991
1057
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DynamicFormComponent, [{
|
|
992
1058
|
type: Component,
|
|
993
|
-
args: [{ selector: "mis-dynamic-form", template: "<form [formGroup]=\"dynamicForm\">\n <ng-container formArrayName=\"dynamicFields\">\n <ng-container [formGroupName]=\"i\" *ngFor=\"let fieldControl of getDynamicFieldsControls().controls; let i = index\">\n <ng-container\n [ngTemplateOutlet]=\"dynamicField\"\n [ngTemplateOutletContext]=\"{\n $implicit: formFields[i],\n formGroup: fieldControl,\n control: fieldControl.controls.value\n }\"\n >\n </ng-container>\n <div class=\"sub-dynamic-form\" *ngIf=\"fieldControl?.value && (!!formFields[i]?.subFields && formFields[i]?.subFields?.length > 0 && matchParentConfig(formFields[i]?.subFields, fieldControl?.controls?.value?.value?.value))\">\n <ng-container *ngFor=\"let subFieldControl of fieldControl.controls.subFields.controls; let j = index\">\n <ng-container\n [ngTemplateOutlet]=\"dynamicField\"\n [ngTemplateOutletContext]=\"{\n $implicit: findSelectedSubFieldConfig(formFields[i]?.subFields, fieldControl.controls.value.value.value,j),\n control: subFieldControl\n }\">\n </ng-container>\n </ng-container>\n </div>\n </ng-container>\n </ng-container>\n</form>\n\n\n<ng-template #dynamicField let-field let-control=\"control\" let-formgroup=\"formGroup\">\n\n <!-- fieldType: 'input' fieldInputType: 'text' | 'number' -->\n <ng-container *ngIf=\"field.fieldType === 'input' && (field.fieldInputType === 'text' || field.fieldInputType === 'number')\">\n <ng-container *ngIf=\"customInputTextNumber; else defaultInputTextNumber\">\n <ng-template\n [ngTemplateOutlet]=\"customInputTextNumber\"\n [ngTemplateOutletContext]=\"{ field: field, control: control, formgroup: formgroup }\"\n ></ng-template>\n </ng-container>\n <ng-template #defaultInputTextNumber>\n <div class=\"dynamic-field multi-line-field-container\"\n [ngStyle]=\"{'border-bottom': (formgroup?.controls?.subFields?.controls?.length && removeSepratorForSubFields) ? 'none':''}\">\n <p class=\"h7 field-title-sm\">\n {{ field?.title }} <span *ngIf=\"field.validators && field.validators.length > 0\"> *</span>\n </p>\n <div style=\"flex-basis: 100%\"></div>\n <input class=\"input-field ip-text\" [type]=\"field.fieldInputType\" [formControl]=\"control\"\n (ngModelChange)=\"updateSubDynamicFields(field, formgroup, $event)\" \n [ngStyle]=\"{'border': control.touched && control.errors ? '1px solid #B00020': ''}\"\n [placeholder]=\"field.placeholderText ? field.placeholderText : 'Input Text'\" \n [min]=\"field.fieldInputType === 'number' ? 0 : '' \"/>\n <ng-container *ngIf=\"control.touched && control.errors\"\n [ngTemplateOutlet]=\"dynamicFieldErrors\" \n [ngTemplateOutletContext]=\"{ $implicit: control.errors }\"\n >\n </ng-container>\n </div>\n </ng-template>\n </ng-container>\n \n <!-- fieldType: 'input' fieldInputType: 'textarea' -->\n <ng-container *ngIf=\"field.fieldType === 'input' && field.fieldInputType === 'textarea'\">\n <ng-container *ngIf=\"customInputTextarea; else defaultInputTextarea\">\n <ng-template\n [ngTemplateOutlet]=\"customInputTextarea\"\n [ngTemplateOutletContext]=\"{ field: field, control: control, formgroup: formgroup }\"\n ></ng-template>\n </ng-container>\n <ng-template #defaultInputTextarea>\n <div class=\"dynamic-field multi-line-field-container\"\n [ngStyle]=\"{'border-bottom': (formgroup?.controls?.subFields?.controls?.length && removeSepratorForSubFields) ? 'none':''}\">\n <p class=\"h7 field-title-sm\">\n {{ field.title }}<span *ngIf=\"field.validators && field.validators.length > 0\"> *</span>\n </p>\n <div style=\"flex-basis: 100%\"></div>\n <textarea class=\"input-field ip-textarea\" type=\"text\"\n [ngStyle]=\"{'border': control.touched && control.errors ? '1px solid #B00020': ''}\"\n [placeholder]=\"field.placeholderText ? field.placeholderText : 'Input Text'\" [formControl]=\"control\" (ngModelChange)=\"updateSubDynamicFields(field, formgroup, $event)\"></textarea>\n <ng-container *ngIf=\"control.touched && control.errors\" [ngTemplateOutlet]=\"dynamicFieldErrors\"\n [ngTemplateOutletContext]=\"{ $implicit: control.errors }\">\n </ng-container>\n </div>\n </ng-template>\n </ng-container>\n \n <!-- fieldType: 'input' fieldInputType: 'date' -->\n <ng-container *ngIf=\"field.fieldType === 'input' && field.fieldInputType === 'date'\">\n <ng-container *ngIf=\"customInputDate; else defaultInputDate\">\n <ng-template\n [ngTemplateOutlet]=\"customInputDate\"\n [ngTemplateOutletContext]=\"{ field: field, control: control, formgroup: formgroup }\"\n ></ng-template>\n </ng-container>\n <ng-template #defaultInputDate>\n <div class=\"dynamic-field single-line-field-container\"\n [ngStyle]=\"{'border-bottom': (formgroup?.controls?.subFields?.controls?.length && removeSepratorForSubFields) ? 'none':''}\"\n *ngIf=\"field.fieldType === 'input' && field.fieldInputType === 'date'\">\n <p class=\"h6\">\n {{ field.title }} <span *ngIf=\"field.validators && field.validators.length > 0\"> *</span>\n </p>\n <div class=\"date-picker-container\">\n <input class=\"date-picker\" readonly misTzDp [dpConfig]=\"field.fieldConfig\"\n (dateChange)=\"control.setValue($event)\" [selectedDate]=\"control.value\" [offsetY]=\"0\"\n [value]=\"control.value\" #dp />\n <img alt=\"data-picker\" *ngIf=\"calendarIconUrl\" class=\"date-picker-icon\" [src]=\"calendarIconUrl\"\n (click)=\"dp.click()\" />\n </div>\n <ng-container *ngIf=\"control.touched && control.errors\" [ngTemplateOutlet]=\"dynamicFieldErrors\"\n [ngTemplateOutletContext]=\"{ $implicit: control.errors }\">\n </ng-container>\n </div>\n </ng-template>\n </ng-container>\n\n <!-- fieldType: 'boolean' fieldInputType: 'toggle' -->\n <ng-container *ngIf=\"field.fieldType === 'boolean' && field.fieldInputType === 'toggle'\">\n <ng-container *ngIf=\"customBooleanToggle; else defaultBooleanToggle\">\n <ng-template\n [ngTemplateOutlet]=\"customBooleanToggle\"\n [ngTemplateOutletContext]=\"{ field: field, control: control, formgroup: formgroup }\"\n ></ng-template>\n </ng-container>\n <ng-template #defaultBooleanToggle>\n <div class=\"dynamic-field single-line-field-container\"\n [ngStyle]=\"{'border-bottom': (formgroup?.controls?.subFields?.controls?.length && removeSepratorForSubFields) ? 'none':''}\">\n <p class=\"h6\">\n {{ field.title }}<span *ngIf=\"field.validators && field.validators.length > 0\"> *</span>\n </p>\n <mis-switch [control]=\"control\" (valueChanged)=\"updateSubDynamicFields(field, formgroup, $event)\"></mis-switch>\n <ng-container *ngIf=\"control.touched && control.errors\" [ngTemplateOutlet]=\"dynamicFieldErrors\"\n [ngTemplateOutletContext]=\"{ $implicit: control.errors }\">\n </ng-container>\n </div> \n </ng-template>\n </ng-container>\n\n <!-- fieldType: 'singleSelect' fieldInputType: 'dropdown' -->\n <ng-container *ngIf=\"field.fieldType === 'singleSelect' && field.fieldInputType === 'dropdown'\">\n <ng-container *ngIf=\"customSingleSelectDropdown; else defaultSingleSelectDropdown\">\n <ng-template\n [ngTemplateOutlet]=\"customSingleSelectDropdown\"\n [ngTemplateOutletContext]=\"{ field: field, control: control, formgroup: formgroup }\"\n ></ng-template>\n </ng-container>\n <ng-template #defaultSingleSelectDropdown>\n <div class=\"dynamic-field single-line-field-container\"\n [ngStyle]=\"{'border-bottom': (formgroup?.controls?.subFields?.controls?.length && removeSepratorForSubFields) ? 'none':''}\">\n <p class=\"h6\">\n {{ field.title }}<span *ngIf=\"field.validators && field.validators.length > 0\"> *</span>\n </p>\n <div [ngClass]=\"{'removeable-container' : field?.isRemoveable}\">\n <mis-dropdown [searchEnabled]=\"false\" [width]=\"'140px'\" [data]=\"field.itemsList\" [selectedItem]=\"control.value\"\n (onChange)=\"updateSelectedValueForSingleSelect(field, control, formgroup, $event);\">\n </mis-dropdown>\n <img *ngIf=\"field.isRemoveable && removeIconUrl\" class=\"remove-icon\" [src]=\"removeIconUrl\" (click)=\"fieldRemoved.emit(field)\">\n </div>\n <ng-container *ngIf=\"control.touched && control.errors\" [ngTemplateOutlet]=\"dynamicFieldErrors\"\n [ngTemplateOutletContext]=\"{ $implicit: control.errors }\">\n </ng-container>\n </div>\n </ng-template>\n </ng-container >\n \n\n <!-- fieldType: 'singleSelect' fieldInputType: 'radio' -->\n <ng-container *ngIf=\"field.fieldType === 'singleSelect' && field.fieldInputType === 'radio'\">\n <ng-container *ngIf=\"customSingleSelectRadio; else defaultSingleSelectRadio\">\n <ng-template\n [ngTemplateOutlet]=\"customSingleSelectRadio\"\n [ngTemplateOutletContext]=\"{ field: field, control: control, formgroup: formgroup }\"\n ></ng-template>\n </ng-container>\n <ng-template #defaultSingleSelectRadio>\n <div class=\"dynamic-field multi-line-field-container\"\n [ngStyle]=\"{'border-bottom': (formgroup?.controls?.subFields?.controls?.length && removeSepratorForSubFields) ? 'none':''}\">\n <p class=\"h7 field-title-sm\">\n {{ field.title }}<span *ngIf=\"field.validators && field.validators.length > 0\"> *</span>\n </p>\n <div style=\"flex-basis: 100%\"></div>\n <div id=\"checkboxes-container\">\n <div class=\"radio-checkbox-common\" *ngFor=\"let item of field.itemsList\"\n [ngClass]=\"{ 'checkbox-active': item.label === control.value?.label }\"\n (click)=\"updateSelectedValueForSingleSelect(field, control, formgroup, item);\">\n <img *ngIf=\"(item.label === control.value?.label) && activeBtnIconUrl\" [src]=\"activeBtnIconUrl\" alt=\"\" />\n <p class=\"h6\">{{ item.label }}</p>\n </div>\n </div>\n <ng-container *ngIf=\"control.touched && control.errors\" [ngTemplateOutlet]=\"dynamicFieldErrors\"\n [ngTemplateOutletContext]=\"{ $implicit: control.errors }\">\n </ng-container>\n </div>\n </ng-template>\n </ng-container>\n \n\n <!-- fieldType: 'multiSelect' fieldInputType: 'checkbox' -->\n <ng-container *ngIf=\"field.fieldType === 'multiSelect' && field.fieldInputType === 'checkbox'\">\n <ng-container *ngIf=\"customMultiSelectCheckbox; else defaultMultiSelectCheckbox\">\n <ng-template\n [ngTemplateOutlet]=\"customMultiSelectCheckbox\"\n [ngTemplateOutletContext]=\"{ field: field, control: control, formgroup: formgroup }\"\n ></ng-template>\n </ng-container>\n <ng-template #defaultMultiSelectCheckbox>\n <div class=\"dynamic-field multi-line-field-container\"\n [ngStyle]=\"{'border-bottom': (formgroup?.controls?.subFields?.controls?.length && removeSepratorForSubFields) ? 'none':''}\">\n <p class=\"h7 field-title-sm\">\n {{ field.title }}<span *ngIf=\"field.validators && field.validators.length > 0\"> *</span>\n </p>\n <div style=\"flex-basis: 100%\"></div>\n <div id=\"checkboxes-container\">\n <div class=\"radio-checkbox-common\" *ngFor=\"let item of field.itemsList\"\n [ngClass]=\"{ 'checkbox-active': isCheckBoxSelected(item.label, control.value) }\"\n (click)=\"updateSelectedValueForMultiSelect(field, control, formgroup, [item])\">\n <img *ngIf=\"isCheckBoxSelected(item.label, control.value) && activeBtnIconUrl\" [src]=\"activeBtnIconUrl\"\n alt=\"\" />\n <p class=\"h6\">{{ item.label }}</p>\n </div>\n </div>\n <ng-container *ngIf=\"control.touched && control.errors\" [ngTemplateOutlet]=\"dynamicFieldErrors\"\n [ngTemplateOutletContext]=\"{ $implicit: control.errors }\">\n </ng-container>\n </div>\n </ng-template>\n </ng-container>\n\n\n <!-- fieldType: 'multiSelect' fieldInputType: 'dropdown' -->\n <ng-container *ngIf=\"field.fieldType === 'multiSelect' && field.fieldInputType === 'dropdown'\">\n <ng-container *ngIf=\"customMultiSelectDropdown; else defaultMultiSelectDropdown\">\n <ng-template\n [ngTemplateOutlet]=\"customMultiSelectDropdown\"\n [ngTemplateOutletContext]=\"{ field: field, control: control, formgroup: formgroup }\"\n ></ng-template>\n </ng-container>\n <ng-template #defaultMultiSelectDropdown>\n <div class=\"dynamic-field single-line-field-container\"\n [ngStyle]=\"{'border-bottom': (formgroup?.controls?.subFields?.controls?.length && removeSepratorForSubFields) ? 'none':''}\">\n <p class=\"h6\">\n {{ field.title }}<span *ngIf=\"field.validators && field.validators.length > 0\"> *</span>\n </p>\n <mis-multi-select-dropdown [width]=\"'140px'\" [showSelectedCount]=\"true\" [dropdownListWidth]=\"'256px'\"\n [searchEnabled]=\"false\" [hideApplyButton]=\"true\" [data]=\"field.itemsList\"\n [selectedItems]=\"control.value\" (onChange)=\"updateSelectedValueForMultiSelect(field, control, formgroup, $event);\"></mis-multi-select-dropdown>\n <ng-container *ngIf=\"control.touched && control.errors\" [ngTemplateOutlet]=\"dynamicFieldErrors\"\n [ngTemplateOutletContext]=\"{ $implicit: control.errors }\">\n </ng-container>\n </div>\n </ng-template>\n </ng-container>\n\n</ng-template>\n\n<ng-template #dynamicFieldErrors let-errors>\n <div id=\"error-messages-container\">\n <ng-container *ngFor=\"let error of errors | keyvalue\">\n <p class=\"h8\">\n {{\" \u2022 \" + error.value}}\n </p>\n <div [ngStyle]=\"{ 'flex-basis': '100%', 'height': '0' }\"></div>\n </ng-container>\n </div>\n</ng-template>", styles: ["p{margin:0;cursor:default}::ng-deep .main-container{margin:0;max-width:100%}.sub-dynamic-form{padding-left:24px;border-bottom:1px solid var(--grey-seperators)}.dynamic-field ::ng-deep .container{height:32px!important}.single-line-field-container{display:flex;justify-content:space-between;align-items:center;padding:28px 16px;border-bottom:1px solid var(--grey-seperators)}.multi-line-field-container{display:flex;justify-content:flex-start;align-items:flex-start;padding:28px 16px;flex-wrap:wrap;border-bottom:1px solid var(--grey-seperators)}.field-title-sm{margin-bottom:8px;cursor:default}.input-field{width:100%;background-color:var(--grey-bg-1);border:1px solid var(--grey-seperators);border-radius:6px}.ip-text{height:44px;padding:8px 12px}.ip-textarea{max-height:94px;padding:8px}input:focus{outline:none}input::placeholder{color:var(--grey-seperators)}textarea:focus{outline:none}.date-picker-container{position:relative;width:140px}.date-picker-container .date-picker{cursor:pointer;height:32px;width:100%;font-size:14px;border-radius:6px;padding:0 12px;border:1px solid var(--grey-seperators);inset:10px auto auto 80px;background-color:var(--text-white)}.date-picker-container .date-picker:hover{background-color:var(--grey-hover)}.date-picker-container .date-picker-icon{position:absolute;top:50%;right:12px;transform:translateY(-50%);cursor:pointer}form .dynamic-field:last-child{border-bottom:none!important}#checkboxes-container{display:flex;justify-content:flex-start;align-items:center;flex-wrap:wrap}.radio-checkbox-common{display:flex;justify-content:center;align-items:center;cursor:pointer;margin-right:8px;margin-bottom:8px;background-color:var(--text-white);padding:12px 16px;border:1px solid var(--text-muted);border-radius:8px}.radio-checkbox-common p{color:var(--text-muted);cursor:pointer}.radio-checkbox-common img{margin-right:8px}.checkbox-active{background-color:var(--pmry-500)}.checkbox-active p{color:var(--text-white)}#error-messages-container{margin-top:4px;width:100%;display:flex;justify-content:flex-start;align-items:center;flex-wrap:wrap}#error-messages-container p{color:var(--sem-error)}.removeable-container{display:flex;justify-content:center;align-items:center}.removeable-container .remove-icon{cursor:pointer;margin-left:8px;max-width:24px}span{color:var(--sem-error)}\n"] }]
|
|
994
|
-
}], () => [], {
|
|
995
|
-
type: Input
|
|
996
|
-
}], formValues: [{
|
|
997
|
-
type: Input
|
|
998
|
-
}], activeBtnIconUrl: [{
|
|
999
|
-
type: Input
|
|
1000
|
-
}], calendarIconUrl: [{
|
|
1001
|
-
type: Input
|
|
1002
|
-
}], removeIconUrl: [{
|
|
1003
|
-
type: Input
|
|
1004
|
-
}], removeSepratorForSubFields: [{
|
|
1005
|
-
type: Input
|
|
1006
|
-
}], formUpdated: [{
|
|
1007
|
-
type: Output
|
|
1008
|
-
}], formValid: [{
|
|
1009
|
-
type: Output
|
|
1010
|
-
}], formInitialized: [{
|
|
1011
|
-
type: Output
|
|
1012
|
-
}], fieldRemoved: [{
|
|
1013
|
-
type: Output
|
|
1014
|
-
}], customInputTextNumber: [{
|
|
1059
|
+
args: [{ selector: "mis-dynamic-form", template: "<form [formGroup]=\"dynamicForm()\">\n <ng-container formArrayName=\"dynamicFields\">\n <ng-container [formGroupName]=\"i\" *ngFor=\"let fieldControl of getDynamicFieldsControls().controls; let i = index\">\n <ng-container\n [ngTemplateOutlet]=\"dynamicField\"\n [ngTemplateOutletContext]=\"{\n $implicit: formFieldsArray?.[i],\n formGroup: fieldControl,\n control: fieldControl.controls.value\n }\"\n >\n </ng-container>\n <div class=\"sub-dynamic-form\" *ngIf=\"fieldControl?.value && (!!formFieldsArray?.[i]?.subFields && formFieldsArray?.[i]?.subFields?.length > 0 && matchParentConfig(formFieldsArray?.[i]?.subFields, fieldControl?.controls?.value?.value?.value))\">\n <ng-container *ngFor=\"let subFieldControl of fieldControl.controls.subFields.controls; let j = index\">\n <ng-container\n [ngTemplateOutlet]=\"dynamicField\"\n [ngTemplateOutletContext]=\"{\n $implicit: findSelectedSubFieldConfig(formFieldsArray?.[i]?.subFields, fieldControl.controls.value.value.value,j),\n control: subFieldControl\n }\">\n </ng-container>\n </ng-container>\n </div>\n </ng-container>\n </ng-container>\n</form>\n\n\n<ng-template #dynamicField let-field let-control=\"control\" let-formgroup=\"formGroup\">\n\n <!-- fieldType: 'input' fieldInputType: 'text' | 'number' -->\n <ng-container *ngIf=\"field.fieldType === 'input' && (field.fieldInputType === 'text' || field.fieldInputType === 'number')\">\n <ng-container *ngIf=\"customInputTextNumber; else defaultInputTextNumber\">\n <ng-template\n [ngTemplateOutlet]=\"customInputTextNumber\"\n [ngTemplateOutletContext]=\"{ field: field, control: control, formgroup: formgroup }\"\n ></ng-template>\n </ng-container>\n <ng-template #defaultInputTextNumber>\n <div class=\"dynamic-field multi-line-field-container\"\n [ngStyle]=\"{'border-bottom': (formgroup?.controls?.subFields?.controls?.length && removeSepratorForSubFields) ? 'none':''}\">\n <p class=\"h7 field-title-sm\">\n {{ field?.title }} <span *ngIf=\"field.validators && field.validators.length > 0\"> *</span>\n </p>\n <div style=\"flex-basis: 100%\"></div>\n <input class=\"input-field ip-text\" [type]=\"field.fieldInputType\" [formControl]=\"control\"\n (ngModelChange)=\"updateSubDynamicFields(field, formgroup, $event)\" \n [ngStyle]=\"{'border': control.touched && control.errors ? '1px solid #B00020': ''}\"\n [placeholder]=\"field.placeholderText ? field.placeholderText : 'Input Text'\" \n [min]=\"field.fieldInputType === 'number' ? 0 : '' \"/>\n <ng-container *ngIf=\"control.touched && control.errors\"\n [ngTemplateOutlet]=\"dynamicFieldErrors\" \n [ngTemplateOutletContext]=\"{ $implicit: control.errors }\"\n >\n </ng-container>\n </div>\n </ng-template>\n </ng-container>\n \n <!-- fieldType: 'input' fieldInputType: 'textarea' -->\n <ng-container *ngIf=\"field.fieldType === 'input' && field.fieldInputType === 'textarea'\">\n <ng-container *ngIf=\"customInputTextarea; else defaultInputTextarea\">\n <ng-template\n [ngTemplateOutlet]=\"customInputTextarea\"\n [ngTemplateOutletContext]=\"{ field: field, control: control, formgroup: formgroup }\"\n ></ng-template>\n </ng-container>\n <ng-template #defaultInputTextarea>\n <div class=\"dynamic-field multi-line-field-container\"\n [ngStyle]=\"{'border-bottom': (formgroup?.controls?.subFields?.controls?.length && removeSepratorForSubFields) ? 'none':''}\">\n <p class=\"h7 field-title-sm\">\n {{ field.title }}<span *ngIf=\"field.validators && field.validators.length > 0\"> *</span>\n </p>\n <div style=\"flex-basis: 100%\"></div>\n <textarea class=\"input-field ip-textarea\" type=\"text\"\n [ngStyle]=\"{'border': control.touched && control.errors ? '1px solid #B00020': ''}\"\n [placeholder]=\"field.placeholderText ? field.placeholderText : 'Input Text'\" [formControl]=\"control\" (ngModelChange)=\"updateSubDynamicFields(field, formgroup, $event)\"></textarea>\n <ng-container *ngIf=\"control.touched && control.errors\" [ngTemplateOutlet]=\"dynamicFieldErrors\"\n [ngTemplateOutletContext]=\"{ $implicit: control.errors }\">\n </ng-container>\n </div>\n </ng-template>\n </ng-container>\n \n <!-- fieldType: 'input' fieldInputType: 'date' -->\n <ng-container *ngIf=\"field.fieldType === 'input' && field.fieldInputType === 'date'\">\n <ng-container *ngIf=\"customInputDate; else defaultInputDate\">\n <ng-template\n [ngTemplateOutlet]=\"customInputDate\"\n [ngTemplateOutletContext]=\"{ field: field, control: control, formgroup: formgroup }\"\n ></ng-template>\n </ng-container>\n <ng-template #defaultInputDate>\n <div class=\"dynamic-field single-line-field-container\"\n [ngStyle]=\"{'border-bottom': (formgroup?.controls?.subFields?.controls?.length && removeSepratorForSubFields) ? 'none':''}\"\n *ngIf=\"field.fieldType === 'input' && field.fieldInputType === 'date'\">\n <p class=\"h6\">\n {{ field.title }} <span *ngIf=\"field.validators && field.validators.length > 0\"> *</span>\n </p>\n <div class=\"date-picker-container\">\n <input class=\"date-picker\" readonly misTzDp [dpConfig]=\"field.fieldConfig\"\n (dateChange)=\"control.setValue($event)\" [selectedDate]=\"control.value\" [offsetY]=\"0\"\n [value]=\"control.value\" #dp />\n <img alt=\"data-picker\" *ngIf=\"calendarIconUrl()\" class=\"date-picker-icon\" [src]=\"calendarIconUrl()\"\n (click)=\"dp.click()\" />\n </div>\n <ng-container *ngIf=\"control.touched && control.errors\" [ngTemplateOutlet]=\"dynamicFieldErrors\"\n [ngTemplateOutletContext]=\"{ $implicit: control.errors }\">\n </ng-container>\n </div>\n </ng-template>\n </ng-container>\n\n <!-- fieldType: 'boolean' fieldInputType: 'toggle' -->\n <ng-container *ngIf=\"field.fieldType === 'boolean' && field.fieldInputType === 'toggle'\">\n <ng-container *ngIf=\"customBooleanToggle; else defaultBooleanToggle\">\n <ng-template\n [ngTemplateOutlet]=\"customBooleanToggle\"\n [ngTemplateOutletContext]=\"{ field: field, control: control, formgroup: formgroup }\"\n ></ng-template>\n </ng-container>\n <ng-template #defaultBooleanToggle>\n <div class=\"dynamic-field single-line-field-container\"\n [ngStyle]=\"{'border-bottom': (formgroup?.controls?.subFields?.controls?.length && removeSepratorForSubFields) ? 'none':''}\">\n <p class=\"h6\">\n {{ field.title }}<span *ngIf=\"field.validators && field.validators.length > 0\"> *</span>\n </p>\n <mis-switch [control]=\"control\" (valueChanged)=\"updateSubDynamicFields(field, formgroup, $event)\"></mis-switch>\n <ng-container *ngIf=\"control.touched && control.errors\" [ngTemplateOutlet]=\"dynamicFieldErrors\"\n [ngTemplateOutletContext]=\"{ $implicit: control.errors }\">\n </ng-container>\n </div> \n </ng-template>\n </ng-container>\n\n <!-- fieldType: 'singleSelect' fieldInputType: 'dropdown' -->\n <ng-container *ngIf=\"field.fieldType === 'singleSelect' && field.fieldInputType === 'dropdown'\">\n <ng-container *ngIf=\"customSingleSelectDropdown; else defaultSingleSelectDropdown\">\n <ng-template\n [ngTemplateOutlet]=\"customSingleSelectDropdown\"\n [ngTemplateOutletContext]=\"{ field: field, control: control, formgroup: formgroup }\"\n ></ng-template>\n </ng-container>\n <ng-template #defaultSingleSelectDropdown>\n <div class=\"dynamic-field single-line-field-container\"\n [ngStyle]=\"{'border-bottom': (formgroup?.controls?.subFields?.controls?.length && removeSepratorForSubFields) ? 'none':''}\">\n <p class=\"h6\">\n {{ field.title }}<span *ngIf=\"field.validators && field.validators.length > 0\"> *</span>\n </p>\n <div [ngClass]=\"{'removeable-container' : field?.isRemoveable}\">\n <mis-dropdown [searchEnabled]=\"false\" [width]=\"'140px'\" [data]=\"field.itemsList\" [selectedItem]=\"control.value\"\n (onChange)=\"updateSelectedValueForSingleSelect(field, control, formgroup, $event);\">\n </mis-dropdown>\n <img *ngIf=\"field.isRemoveable && removeIconUrl()\" class=\"remove-icon\" [src]=\"removeIconUrl()\" (click)=\"fieldRemoved.emit(field)\">\n </div>\n <ng-container *ngIf=\"control.touched && control.errors\" [ngTemplateOutlet]=\"dynamicFieldErrors\"\n [ngTemplateOutletContext]=\"{ $implicit: control.errors }\">\n </ng-container>\n </div>\n </ng-template>\n </ng-container >\n \n\n <!-- fieldType: 'singleSelect' fieldInputType: 'radio' -->\n <ng-container *ngIf=\"field.fieldType === 'singleSelect' && field.fieldInputType === 'radio'\">\n <ng-container *ngIf=\"customSingleSelectRadio; else defaultSingleSelectRadio\">\n <ng-template\n [ngTemplateOutlet]=\"customSingleSelectRadio\"\n [ngTemplateOutletContext]=\"{ field: field, control: control, formgroup: formgroup }\"\n ></ng-template>\n </ng-container>\n <ng-template #defaultSingleSelectRadio>\n <div class=\"dynamic-field multi-line-field-container\"\n [ngStyle]=\"{'border-bottom': (formgroup?.controls?.subFields?.controls?.length && removeSepratorForSubFields) ? 'none':''}\">\n <p class=\"h7 field-title-sm\">\n {{ field.title }}<span *ngIf=\"field.validators && field.validators.length > 0\"> *</span>\n </p>\n <div style=\"flex-basis: 100%\"></div>\n <div id=\"checkboxes-container\">\n <div class=\"radio-checkbox-common\" *ngFor=\"let item of field.itemsList\"\n [ngClass]=\"{ 'checkbox-active': item.label === control.value?.label }\"\n (click)=\"updateSelectedValueForSingleSelect(field, control, formgroup, item);\">\n <img *ngIf=\"(item.label === control.value?.label) && activeBtnIconUrl()\" [src]=\"activeBtnIconUrl()\" alt=\"\" />\n <p class=\"h6\">{{ item.label }}</p>\n </div>\n </div>\n <ng-container *ngIf=\"control.touched && control.errors\" [ngTemplateOutlet]=\"dynamicFieldErrors\"\n [ngTemplateOutletContext]=\"{ $implicit: control.errors }\">\n </ng-container>\n </div>\n </ng-template>\n </ng-container>\n \n\n <!-- fieldType: 'multiSelect' fieldInputType: 'checkbox' -->\n <ng-container *ngIf=\"field.fieldType === 'multiSelect' && field.fieldInputType === 'checkbox'\">\n <ng-container *ngIf=\"customMultiSelectCheckbox; else defaultMultiSelectCheckbox\">\n <ng-template\n [ngTemplateOutlet]=\"customMultiSelectCheckbox\"\n [ngTemplateOutletContext]=\"{ field: field, control: control, formgroup: formgroup }\"\n ></ng-template>\n </ng-container>\n <ng-template #defaultMultiSelectCheckbox>\n <div class=\"dynamic-field multi-line-field-container\"\n [ngStyle]=\"{'border-bottom': (formgroup?.controls?.subFields?.controls?.length && removeSepratorForSubFields) ? 'none':''}\">\n <p class=\"h7 field-title-sm\">\n {{ field.title }}<span *ngIf=\"field.validators && field.validators.length > 0\"> *</span>\n </p>\n <div style=\"flex-basis: 100%\"></div>\n <div id=\"checkboxes-container\">\n <div class=\"radio-checkbox-common\" *ngFor=\"let item of field.itemsList\"\n [ngClass]=\"{ 'checkbox-active': isCheckBoxSelected(item.label, control.value) }\"\n (click)=\"updateSelectedValueForMultiSelect(field, control, formgroup, [item])\">\n <img *ngIf=\"isCheckBoxSelected(item.label, control.value) && activeBtnIconUrl()\" [src]=\"activeBtnIconUrl()\"\n alt=\"\" />\n <p class=\"h6\">{{ item.label }}</p>\n </div>\n </div>\n <ng-container *ngIf=\"control.touched && control.errors\" [ngTemplateOutlet]=\"dynamicFieldErrors\"\n [ngTemplateOutletContext]=\"{ $implicit: control.errors }\">\n </ng-container>\n </div>\n </ng-template>\n </ng-container>\n\n\n <!-- fieldType: 'multiSelect' fieldInputType: 'dropdown' -->\n <ng-container *ngIf=\"field.fieldType === 'multiSelect' && field.fieldInputType === 'dropdown'\">\n <ng-container *ngIf=\"customMultiSelectDropdown; else defaultMultiSelectDropdown\">\n <ng-template\n [ngTemplateOutlet]=\"customMultiSelectDropdown\"\n [ngTemplateOutletContext]=\"{ field: field, control: control, formgroup: formgroup }\"\n ></ng-template>\n </ng-container>\n <ng-template #defaultMultiSelectDropdown>\n <div class=\"dynamic-field single-line-field-container\"\n [ngStyle]=\"{'border-bottom': (formgroup?.controls?.subFields?.controls?.length && removeSepratorForSubFields) ? 'none':''}\">\n <p class=\"h6\">\n {{ field.title }}<span *ngIf=\"field.validators && field.validators.length > 0\"> *</span>\n </p>\n <mis-multi-select-dropdown [width]=\"'140px'\" [showSelectedCount]=\"true\" [dropdownListWidth]=\"'256px'\"\n [searchEnabled]=\"false\" [hideApplyButton]=\"true\" [data]=\"field.itemsList\"\n [selectedItems]=\"control.value\" (onChange)=\"updateSelectedValueForMultiSelect(field, control, formgroup, $event);\"></mis-multi-select-dropdown>\n <ng-container *ngIf=\"control.touched && control.errors\" [ngTemplateOutlet]=\"dynamicFieldErrors\"\n [ngTemplateOutletContext]=\"{ $implicit: control.errors }\">\n </ng-container>\n </div>\n </ng-template>\n </ng-container>\n\n</ng-template>\n\n<ng-template #dynamicFieldErrors let-errors>\n <div id=\"error-messages-container\">\n <ng-container *ngFor=\"let error of errors | keyvalue\">\n <p class=\"h8\">\n {{\" \u2022 \" + error.value}}\n </p>\n <div [ngStyle]=\"{ 'flex-basis': '100%', 'height': '0' }\"></div>\n </ng-container>\n </div>\n</ng-template>", styles: ["p{margin:0;cursor:default}::ng-deep .main-container{margin:0;max-width:100%}.sub-dynamic-form{padding-left:24px;border-bottom:1px solid var(--grey-seperators)}.dynamic-field ::ng-deep .container{height:32px!important}.single-line-field-container{display:flex;justify-content:space-between;align-items:center;padding:28px 16px;border-bottom:1px solid var(--grey-seperators)}.multi-line-field-container{display:flex;justify-content:flex-start;align-items:flex-start;padding:28px 16px;flex-wrap:wrap;border-bottom:1px solid var(--grey-seperators)}.field-title-sm{margin-bottom:8px;cursor:default}.input-field{width:100%;background-color:var(--grey-bg-1);border:1px solid var(--grey-seperators);border-radius:6px}.ip-text{height:44px;padding:8px 12px}.ip-textarea{max-height:94px;padding:8px}input:focus{outline:none}input::placeholder{color:var(--grey-seperators)}textarea:focus{outline:none}.date-picker-container{position:relative;width:140px}.date-picker-container .date-picker{cursor:pointer;height:32px;width:100%;font-size:14px;border-radius:6px;padding:0 12px;border:1px solid var(--grey-seperators);inset:10px auto auto 80px;background-color:var(--text-white)}.date-picker-container .date-picker:hover{background-color:var(--grey-hover)}.date-picker-container .date-picker-icon{position:absolute;top:50%;right:12px;transform:translateY(-50%);cursor:pointer}form .dynamic-field:last-child{border-bottom:none!important}#checkboxes-container{display:flex;justify-content:flex-start;align-items:center;flex-wrap:wrap}.radio-checkbox-common{display:flex;justify-content:center;align-items:center;cursor:pointer;margin-right:8px;margin-bottom:8px;background-color:var(--text-white);padding:12px 16px;border:1px solid var(--text-muted);border-radius:8px}.radio-checkbox-common p{color:var(--text-muted);cursor:pointer}.radio-checkbox-common img{margin-right:8px}.checkbox-active{background-color:var(--pmry-500)}.checkbox-active p{color:var(--text-white)}#error-messages-container{margin-top:4px;width:100%;display:flex;justify-content:flex-start;align-items:center;flex-wrap:wrap}#error-messages-container p{color:var(--sem-error)}.removeable-container{display:flex;justify-content:center;align-items:center}.removeable-container .remove-icon{cursor:pointer;margin-left:8px;max-width:24px}span{color:var(--sem-error)}\n"] }]
|
|
1060
|
+
}], () => [], { customInputTextNumber: [{
|
|
1015
1061
|
type: ContentChild,
|
|
1016
1062
|
args: ["customInputTextNumber", { static: false }]
|
|
1017
1063
|
}], customInputTextarea: [{
|
|
@@ -1090,4 +1136,4 @@ export const dynamicFieldValidator = (validators) => {
|
|
|
1090
1136
|
return errors;
|
|
1091
1137
|
};
|
|
1092
1138
|
};
|
|
1093
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL21pcy1jb21wb25lbnRzL2R5bmFtaWMtZm9ybS9keW5hbWljLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvbWlzLWNvbXBvbmVudHMvZHluYW1pYy1mb3JtL2R5bmFtaWMtZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQWdCLEtBQUssRUFBcUIsTUFBTSxFQUFlLE1BQU0sZUFBZSxDQUFDO0FBRW5JLE9BQU8sRUFBbUIsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQWlDLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXBKLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLFFBQVEsTUFBTSx1QkFBdUIsQ0FBQztBQUM3QyxPQUFPLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQztBQUNuQyxPQUFPLGlCQUFpQixNQUFNLGdDQUFnQyxDQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQ010RCw2QkFBc0c7SUFDcEcsNEJBTWU7Ozs7Ozs7Ozs7SUFMYixjQUFpQztJQUNqQyxBQURBLGtEQUFpQyw0T0FJL0I7OztJQVBSLCtCQUE4TjtJQUM1Tiw2R0FBc0c7SUFTeEcsaUJBQU07OztJQVRzQyxjQUE2QztJQUE3QyxxRUFBNkM7OztJQVgzRixpQ0FBa0g7SUFDOUcsNEJBUWE7SUFDZixxRkFBOE47Ozs7Ozs7SUFWbE4sb0NBQW1CO0lBRTdCLGNBQWlDO0lBQ2pDLEFBREEsa0RBQWlDLGlJQUsvQjtJQUcyQixjQUE2TDtJQUE3TCxzbkJBQTZMOzs7O0lBb0I5Tiw2QkFBeUU7SUFDdkUsa0lBR0M7Ozs7Ozs7O0lBRkMsY0FBMEM7SUFDMUMsQUFEQSwrREFBMEMsOEZB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QyxJQUFHLEtBQUs7d0JBQUUsS0FBSyxHQUFHLEVBQUMsS0FBSyxFQUFFLE9BQU8sRUFBQyxDQUFBO29CQUNsQyxNQUFNO2dCQUNSLEtBQUssUUFBUTtvQkFDWCxLQUFLLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFBO29CQUN6RCxJQUFHLEtBQUs7d0JBQUUsS0FBSyxHQUFHLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxDQUFBO29CQUNuQyxNQUFNO2dCQUNSO29CQUNFLE1BQU07WUFDVixDQUFDO1lBQ0QsSUFBSSxLQUFLO2dCQUFFLE1BQU0sR0FBRyxFQUFFLEdBQUcsTUFBTSxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUE7UUFDN0MsQ0FBQyxDQUFDLENBQUE7UUFDRixPQUFPLE1BQU0sQ0FBQTtJQUNmLENBQUMsQ0FBQTtBQUNILENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgQ29udGVudENoaWxkLCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFRlbXBsYXRlUmVmIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IE5zRHluYW1pY0Zvcm0gfSBmcm9tIFwiLi9keW5hbWljLWZvcm0ubmFtZXNwYWNlXCI7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIFVudHlwZWRGb3JtQXJyYXksIFVudHlwZWRGb3JtQ29udHJvbCwgVW50eXBlZEZvcm1Hcm91cCwgVmFsaWRhdGlvbkVycm9ycywgVmFsaWRhdG9yRm4sIFZhbGlkYXRvcnMgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcblxuaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJztcbmltcG9ydCB0aW1lem9uZSBmcm9tICdkYXlqcy9wbHVnaW4vdGltZXpvbmUnO1xuaW1wb3J0IHV0YyBmcm9tICdkYXlqcy9wbHVnaW4vdXRjJztcbmltcG9ydCBjdXN0b21QYXJzZUZvcm1hdCBmcm9tICdkYXlqcy9wbHVnaW4vY3VzdG9tUGFyc2VGb3JtYXQnXG5cbmRheWpzLmV4dGVuZCh1dGMpO1xuZGF5anMuZXh0ZW5kKHRpbWV6b25lKTtcbmRheWpzLmV4dGVuZChjdXN0b21QYXJzZUZvcm1hdCk7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwibWlzLWR5bmFtaWMtZm9ybVwiLFxuICB0ZW1wbGF0ZVVybDogXCIuL2R5bmFtaWMtZm9ybS5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vZHluYW1pYy1mb3JtLmNvbXBvbmVudC5zY3NzXCJdXG59KVxuZXhwb3J0IGNsYXNzIER5bmFtaWNGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvKipcbiAgICogZm9ybUZpZWxkczogIER5bmFtaWMgZmllbGRzIHJlY2lldmVkIGZyb20gdGhlIEFQSSBtZXRhZGF0YSB0byBidWlsZCBhIGR5bmFtaWMgZm9ybVxuICAgKiBmb3JtVmFsdWVzOiAgSG9sZHMgdGhlIHZhbHVlIG9mIHRoZSBkeW5hbWljIGZvcm0gd2l0aCBcImtleVwiIGJlaW5nIGR5bmFtaWMgZmllbGQgXCJ0aXRsZVwiXG4gICAqICAgICAgICAgICAgICBhbmQgdmFsdWUgYmVpbmcgdGhlIHVzZXIgaW5wdXQuXG4gICAqL1xuICBASW5wdXQoKSBmb3JtRmllbGRzOiBBcnJheTxOc0R5bmFtaWNGb3JtLklEeW5hbWljRmllbGQ+ID0gW107XG4gIEBJbnB1dCgpIGZvcm1WYWx1ZXM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgLy8gTmVlZCB0byBkZXByZWNhdGUgdGhlc2UgaW5wdXRzIGFuZCB1c2UgY29uc3RhbnRzLlxuICBASW5wdXQoKSBhY3RpdmVCdG5JY29uVXJsID0gXCJcIjtcbiAgQElucHV0KCkgY2FsZW5kYXJJY29uVXJsID0gXCJcIjtcbiAgQElucHV0KCkgcmVtb3ZlSWNvblVybCA9IFwiXCI7XG4gIEBJbnB1dCgpIHJlbW92ZVNlcHJhdG9yRm9yU3ViRmllbGRzID0gZmFsc2U7XG4gIC8qKlxuICAgKiBkeW5hbWljRm9ybTogQ29uc3RydWN0ZWQgdXNpbmcgZm9ybUZpZWxkcyBhbmQgZm9ybVZhbHVlcyhpbiBjYXNlIG9mIGVkaXQpXG4gICAqL1xuICBkeW5hbWljRm9ybTogVW50eXBlZEZvcm1Hcm91cDtcblxuICAvKipcbiAgICogZm9ybVVwZGF0ZWQ6IEVtaXRzIGZvcm1WYWx1ZXMgT2JqZWN0IHdoZW5ldmVyIHRoZXJlIGlzIGEgY2hhbmdlIGluIHRoZSBkeW5hbWljIGZvcm0uXG4gICAqL1xuICBAT3V0cHV0KCkgZm9ybVVwZGF0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgW2tleTogc3RyaW5nXTogYW55IH0+KCk7XG4gIC8qKlxuICAgKiBmb3JtVmFsaWQ6IEVtaXRzIGJvb2xlYW4gZGVwZW5kaW5nIG9uIHZhbGlkaXR5IG9mIHRoZSBmb3JtXG4gICAqL1xuICBAT3V0cHV0KCkgZm9ybVZhbGlkID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICAvKipcbiAgICogZm9ybUluaXRpYWxpemVkOiBFbWl0cyBkeW5hbWljIGZvcm0gQVBJIG9uIGZvcm0gaW5pdGlsaXphdGlvblxuICAgKi9cbiAgQE91dHB1dCgpIGZvcm1Jbml0aWFsaXplZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgZmllbGRSZW1vdmVkID0gbmV3IEV2ZW50RW1pdHRlcjxOc0R5bmFtaWNGb3JtLklEeW5hbWljRmllbGQ+KCk7XG5cbiAgQENvbnRlbnRDaGlsZChcImN1c3RvbUlucHV0VGV4dE51bWJlclwiLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgY3VzdG9tSW5wdXRUZXh0TnVtYmVyOiBUZW1wbGF0ZVJlZjxFbGVtZW50PjtcbiAgXG4gIEBDb250ZW50Q2hpbGQoXCJjdXN0b21JbnB1dFRleHRhcmVhXCIsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBjdXN0b21JbnB1dFRleHRhcmVhOiBUZW1wbGF0ZVJlZjxFbGVtZW50PjtcblxuICBAQ29udGVudENoaWxkKFwiY3VzdG9tSW5wdXREYXRlXCIsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBjdXN0b21JbnB1dERhdGU6IFRlbXBsYXRlUmVmPEVsZW1lbnQ+O1xuXG4gIEBDb250ZW50Q2hpbGQoXCJjdXN0b21Cb29sZWFuVG9nZ2xlXCIsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBjdXN0b21Cb29sZWFuVG9nZ2xlOiBUZW1wbGF0ZVJlZjxFbGVtZW50PjtcblxuICBAQ29udGVudENoaWxkKFwiY3VzdG9tU2luZ2xlU2VsZWN0RHJvcGRvd25cIiwgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGN1c3RvbVNpbmdsZVNlbGVjdERyb3Bkb3duOiBUZW1wbGF0ZVJlZjxFbGVtZW50PjtcblxuICBAQ29udGVudENoaWxkKFwiY3VzdG9tU2luZ2xlU2VsZWN0UmFkaW9cIiwgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGN1c3RvbVNpbmdsZVNlbGVjdFJhZGlvOiBUZW1wbGF0ZVJlZjxFbGVtZW50PjtcblxuICBAQ29udGVudENoaWxkKFwiY3VzdG9tTXVsdGlTZWxlY3RDaGVja2JveFwiLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgY3VzdG9tTXVsdGlTZWxlY3RDaGVja2JveDogVGVtcGxhdGVSZWY8RWxlbWVudD47XG5cbiAgQENvbnRlbnRDaGlsZChcImN1c3RvbU11bHRpU2VsZWN0RHJvcGRvd25cIiwgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGN1c3RvbU11bHRpU2VsZWN0RHJvcGRvd246IFRlbXBsYXRlUmVmPEVsZW1lbnQ+O1xuXG4gIGR5bmFtaWNGb3JtQVBJOiBOc0R5bmFtaWNGb3JtLklEeW5hbWljRm9ybUFQSTtcbiAgdmFsdWVDaGFuZ2VzU3Vic2NyaXB0aW9uJDogU3Vic2NyaXB0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBCdWlsZGluZyB0aGUgZm9ybVxuICAgIHRoaXMuZHluYW1pY0Zvcm0gPSB0aGlzLmdlbmVyYXRlRHluYW1pY0Zvcm0odGhpcy5mb3JtRmllbGRzLCB0aGlzLmZvcm1WYWx1ZXMpO1xuXG4gICAgLy8gU3Vic2NyaWJpbmcgdG8gZm9ybSBjaGFuZ2VzIGFuZCBlbWl0aW5nIHZhbHVlcy5cbiAgICB0aGlzLnZhbHVlQ2hhbmdlc1N1YnNjcmlwdGlvbiQgPSB0aGlzLmR5bmFtaWNGb3JtLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoZm9ybVZhbHVlID0+IHtcbiAgICAgIHRoaXMub25Gb3JtVmFsdWVDaGFuZ2VzKCk7XG4gICAgfSk7XG5cbiAgICAvL2FwaSB0byBleHBvc2UgZnVuY3Rpb25zXG4gICAgdGhpcy5keW5hbWljRm9ybUFQSSA9IHtcbiAgICAgIGRlZmF1bHRGb3JtVmFsdWVzOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlRHluYW1pY0ZpZWxkc1ZhbHVlT2JqZWN0KHRoaXMuZHluYW1pY0Zvcm0udmFsdWUuZHluYW1pY0ZpZWxkcyk7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLmZvcm1Jbml0aWFsaXplZC5lbWl0KHRoaXMuZHluYW1pY0Zvcm1BUEkpO1xuICAgIHRoaXMuZm9ybVZhbGlkLmVtaXQodGhpcy5keW5hbWljRm9ybS52YWxpZCk7XG4gIH1cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZUNoYW5nZXNTdWJzY3JpcHRpb24kPy51bnN1YnNjcmliZSgpO1xuICB9XG4gIG9uRm9ybVZhbHVlQ2hhbmdlcygpOiB2b2lkIHtcbiAgICBsZXQgZm9ybVZhbHVlcyA9IHRoaXMuZ2VuZXJhdGVEeW5hbWljRmllbGRzVmFsdWVPYmplY3QodGhpcy5keW5hbWljRm9ybS52YWx1ZS5keW5hbWljRmllbGRzKTtcbiAgICB0aGlzLmZvcm1WYWxpZC5lbWl0KHRoaXMuZHluYW1pY0Zvcm0udmFsaWQpO1xuICAgIHRoaXMuZm9ybVVwZGF0ZWQuZW1pdChmb3JtVmFsdWVzKTtcbiAgICBjb25zb2xlLmxvZyhmb3JtVmFsdWVzKVxuICB9XG4gIGdlbmVyYXRlRHluYW1pY0ZpZWxkc1ZhbHVlT2JqZWN0KGZvcm1WYWx1ZXM6IEFycmF5PGFueT4pOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHtcbiAgICBsZXQgZHluYW1pY0ZpZWxkc1ZhbHVlID0ge307XG4gICAgZm9ybVZhbHVlcy5mb3JFYWNoKChmaWVsZFZhbHVlLCBpbmRleCkgPT4ge1xuICAgICAgaWYodHlwZW9mIGZpZWxkVmFsdWU/LnZhbHVlID09PSAnc3RyaW5nJykgZmllbGRWYWx1ZS52YWx1ZSA9IGZpZWxkVmFsdWU/LnZhbHVlPy50cmltKClcbiAgICAgIGxldCBmb3JtYXR0ZWRWYWx1ZSA9IHRoaXMubWFwRm9ybUZpZWxkVG9Gb3JtVmFsdWUodGhpcy5mb3JtRmllbGRzW2luZGV4XSwgZmllbGRWYWx1ZS52YWx1ZSk7XG4gICAgICBpZiAoZmllbGRWYWx1ZS5zdWJGaWVsZHM/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgbGV0IGZvcm1hdHRlZFN1YkZpZWxkc1ZhbHVlcyA9IHt9XG4gICAgICAgIGxldCBzdWJGaWVsZCA9IHRoaXMuZm9ybUZpZWxkc1tpbmRleF0uc3ViRmllbGRzXG4gICAgICAgIGlmKHRoaXMuZm9ybUZpZWxkc1tpbmRleF0uZmllbGRUeXBlID09PSAnc2luZ2xlU2VsZWN0JyB8fCB0aGlzLmZvcm1GaWVsZHNbaW5kZXhdLmZpZWxkVHlwZSA9PT0gJ211bHRpU2VsZWN0Jykge1xuICAgICAgICAgIHN1YkZpZWxkID0gc3ViRmllbGQuZmlsdGVyKChzdWJGaWVsZCkgPT4gc3ViRmllbGQucGFyZW50Q29uZmlnVmFsdWUgPT09IGZpZWxkVmFsdWUudmFsdWUudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGZpZWxkVmFsdWUuc3ViRmllbGRzLmZvckVhY2goKHN1YkZpZWxkVmFsdWUsIHN1YkluZGV4KSA9PiB7XG4gICAgICAgICAgbGV0IHN1YkZvcm1GaWVsZCA9IHN1YkZpZWxkW3N1YkluZGV4XVxuICAgICAgICAgIGlmKHR5cGVvZiBzdWJGaWVsZFZhbHVlPy52YWx1ZSA9PT0gJ3N0cmluZycpIHN1YkZpZWxkVmFsdWUudmFsdWUgPSBzdWJGaWVsZFZhbHVlPy52YWx1ZT8udHJpbSgpXG4gICAgICAgICAgZm9ybWF0dGVkU3ViRmllbGRzVmFsdWVzW3N1YkZvcm1GaWVsZC5jb25maWdOYW1lXSA9IHRoaXMubWFwRm9ybUZpZWxkVG9Gb3JtVmFsdWUoc3ViRm9ybUZpZWxkLCBzdWJGaWVsZFZhbHVlKVxuICAgICAgICB9KVxuICAgICAgICBkeW5hbWljRmllbGRzVmFsdWVbdGhpcy5mb3JtRmllbGRzW2luZGV4XS5jb25maWdOYW1lXSA9IHtcbiAgICAgICAgICB2YWx1ZTogZm9ybWF0dGVkVmFsdWUsXG4gICAgICAgICAgc3ViRmllbGRzOiBmb3JtYXR0ZWRTdWJGaWVsZHNWYWx1ZXNcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGR5bmFtaWNGaWVsZHNWYWx1ZVt0aGlzLmZvcm1GaWVsZHNbaW5kZXhdLmNvbmZpZ05hbWVdID0gZm9ybWF0dGVkVmFsdWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGR5bmFtaWNGaWVsZHNWYWx1ZTtcbiAgfVxuICBnZW5lcmF0ZUR5bmFtaWNGb3JtKFxuICAgIGZvcm1GaWVsZHM6IEFycmF5PE5zRHluYW1pY0Zvcm0uSUR5bmFtaWNGaWVsZD4sXG4gICAgZm9ybVZhbHVlczogeyBba2V5OiBzdHJpbmddOiBhbnkgfVxuICApOiBVbnR5cGVkRm9ybUdyb3VwIHtcbiAgICBsZXQgZm9ybUFycmF5ID0gbmV3IFVudHlwZWRGb3JtQXJyYXkoW10pXG5cbiAgICBmb3IgKGxldCBmaWVsZCBvZiBmb3JtRmllbGRzKSB7XG4gICAgICBsZXQgZmllbGRWYWx1ZSA9IGZvcm1WYWx1ZXNbZmllbGQuY29uZmlnTmFtZV0/LnZhbHVlID8gZm9ybVZhbHVlc1tmaWVsZC5jb25maWdOYW1lXS52YWx1ZSA6IGZvcm1WYWx1ZXNbZmllbGQuY29uZmlnTmFtZV1cbiAgICAgIGxldCBmaWVsZENvbnRyb2wgPSB0aGlzLm1hcEZvcm1WYWx1ZVRvRm9ybUZpZWxkKGZpZWxkLCBmaWVsZFZhbHVlKTtcbiAgICAgIGxldCBzdWJGaWVsZHNDb250cm9scyA9IHRoaXMuZ2VuZXJhdGVTdWJEeW5hbWljRmllbGRzKGZvcm1WYWx1ZXMsIGZpZWxkLCBmaWVsZENvbnRyb2wudmFsdWUpO1xuICAgICAgZm9ybUFycmF5LnB1c2gobmV3IFVudHlwZWRGb3JtR3JvdXAoe1xuICAgICAgICB2YWx1ZTogZmllbGRDb250cm9sLFxuICAgICAgICBzdWJGaWVsZHM6IHN1YkZpZWxkc0NvbnRyb2xzXG4gICAgICB9KSlcbiAgICB9ICBcbiAgICByZXR1cm4gbmV3IFVudHlwZWRGb3JtR3JvdXAoe1xuICAgICAgZHluYW1pY0ZpZWxkczogZm9ybUFycmF5XG4gICAgfSlcbiAgfVxuICBcbiAgZ2V0RHluYW1pY0ZpZWxkc0NvbnRyb2xzKCk6IFVudHlwZWRGb3JtQXJyYXkge1xuICAgIHJldHVybiB0aGlzLmR5bmFtaWNGb3JtLmdldChcImR5bmFtaWNGaWVsZHNcIikgYXMgVW50eXBlZEZvcm1BcnJheTtcbiAgfVxuICB1cGRhdGVTdWJEeW5hbWljRmllbGRzKFxuICAgIGZpZWxkOiBOc0R5bmFtaWNGb3JtLklEeW5hbWljRmllbGQsXG4gICAgZm9ybUdyb3VwOiBVbnR5cGVkRm9ybUdyb3VwLFxuICAgIHZhbHVlOiBhbnlcbiAgKTogdm9pZCB7XG4gICAgaWYgKGZpZWxkLnN1YkZpZWxkcz8ubGVuZ3RoID4gMCkge1xuICAgICAgbGV0IHN1YkZpZWxkc0NvbnRyb2xzID0gdGhpcy5nZW5lcmF0ZVN1YkR5bmFtaWNGaWVsZHModGhpcy5mb3JtVmFsdWVzLCBmaWVsZCwgdmFsdWUpO1xuICAgICAgZm9ybUdyb3VwLnJlbW92ZUNvbnRyb2woJ3N1YkZpZWxkcycpXG4gICAgICBmb3JtR3JvdXAuYWRkQ29udHJvbCgnc3ViRmllbGRzJywgc3ViRmllbGRzQ29udHJvbHMpXG4gICAgfVxuICB9XG4gIHVwZGF0ZVNlbGVjdGVkVmFsdWVGb3JTaW5nbGVTZWxlY3QoXG4gICAgZmllbGQ6IE5zRHluYW1pY0Zvcm0uSUR5bmFtaWNGaWVsZCxcbiAgICBjb250cm9sOiBVbnR5cGVkRm9ybUNvbnRyb2wsXG4gICAgZm9ybUdyb3VwOiBVbnR5cGVkRm9ybUdyb3VwLFxuICAgIHZhbHVlOiBhbnlcbiAgKTogdm9pZCB7XG4gICAgaWYgKGNvbnRyb2wudmFsdWU/LnZhbHVlICE9PSB2YWx1ZS52YWx1ZSkge1xuICAgICAgY29udHJvbC5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuICAgIGVsc2UgY29udHJvbC5zZXRWYWx1ZSgnJyk7XG4gICAgdGhpcy51cGRhdGVTdWJEeW5hbWljRmllbGRzKGZpZWxkLCBmb3JtR3JvdXAsIHZhbHVlKTtcbiAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcbiAgfVxuICB1cGRhdGVTZWxlY3RlZFZhbHVlRm9yTXVsdGlTZWxlY3QoXG4gICAgZmllbGQ6IE5zRHluYW1pY0Zvcm0uSUR5bmFtaWNGaWVsZCxcbiAgICBjb250cm9sOiBVbnR5cGVkRm9ybUNvbnRyb2wsXG4gICAgZm9ybUdyb3VwOiBVbnR5cGVkRm9ybUdyb3VwLFxuICAgIHZhbHVlczogQXJyYXk8YW55PlxuICApOiB2b2lkIHtcbiAgICBsZXQgc2VsZWN0ZWRWYWx1ZXM6IEFycmF5PHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IGFueSB9PiA9IGNvbnRyb2wudmFsdWU7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBsZXQgaXRlbUluZGV4ID0gc2VsZWN0ZWRWYWx1ZXMuZmluZEluZGV4KGl0ZW0gPT4gaXRlbS5sYWJlbCA9PT0gdmFsdWUubGFiZWwpO1xuICAgICAgaWYgKGl0ZW1JbmRleCA+IC0xKSB7XG4gICAgICAgIHNlbGVjdGVkVmFsdWVzLnNwbGljZShpdGVtSW5kZXgsIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZWN0ZWRWYWx1ZXMucHVzaCh7IC4uLnZhbHVlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBjb250cm9sLnNldFZhbHVlKHNlbGVjdGVkVmFsdWVzKTtcbiAgICB0aGlzLnVwZGF0ZVN1YkR5bmFtaWNGaWVsZHMoZmllbGQsIGZvcm1Hcm91cCwgdmFsdWVzKTtcbiAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcbiAgfVxuICBpc0NoZWNrQm94U2VsZWN0ZWQodmFsdWU6IHN0cmluZywgc2VsZWN0ZWRWYWx1ZXM6IEFycmF5PHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9Pik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzZWxlY3RlZFZhbHVlcy5maW5kSW5kZXgoaXRlbSA9PiBpdGVtLmxhYmVsID09PSB2YWx1ZSkgPiAtMTtcbiAgfVxuXG4gIGZpbmRTZWxlY3RlZFN1YkZpZWxkQ29uZmlnKHN1YmZpZWxkcywgdmFsdWUsIHN1YkZpZWxkSW5kZXgpIHtcbiAgICB0cnl7XG4gICAgICBjb25zdCBzZWxlY3RlZFN1YkZpZWxkQ29uZmlnID0gc3ViZmllbGRzLmZpbHRlcihpdGVtID0+IGl0ZW0ucGFyZW50Q29uZmlnVmFsdWUgPT09IHZhbHVlKVtzdWJGaWVsZEluZGV4XTtcbiAgICAgIHJldHVybiBzZWxlY3RlZFN1YkZpZWxkQ29uZmlnO1xuICAgIH1cbiAgICBjYXRjaChlKXtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU3ViZmllbGQgaW5kZXggbm90IGZvdW5kJyk7XG4gICAgfVxuICB9XG5cbiAgbWF0Y2hQYXJlbnRDb25maWcoc3ViZmllbGRzLCB2YWx1ZSkge1xuICAgIGlmICghc3ViZmllbGRzIHx8IHN1YmZpZWxkcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHN1YmZpZWxkcy5zb21lKGl0ZW0gPT4gaXRlbS5wYXJlbnRDb25maWdWYWx1ZSA9PT0gdmFsdWUpO1xuICB9XG5cbiAgZ2VuZXJhdGVTdWJEeW5hbWljRmllbGRzKFxuICAgIGZvcm1WYWx1ZXM6IGFueSxcbiAgICBwYXJlbnRGaWVsZDogTnNEeW5hbWljRm9ybS5JRHluYW1pY0ZpZWxkLFxuICAgIHBhcmVudFZhbHVlOiBBcnJheTx7IGxhYmVsOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfT4gfCB7bGFiZWw6IHN0cmluZywgdmFsdWU6IHN0cmluZyB9IHwgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhblxuICApOiBVbnR5cGVkRm9ybUFycmF5IHtcbiAgICBsZXQgY29udHJvbHMgPSBuZXcgVW50eXBlZEZvcm1BcnJheShbXSlcbiAgICBsZXQgc3ViRmllbGRzID0gcGFyZW50RmllbGQuc3ViRmllbGRzXG4gICAgbGV0IHN1YkZpZWxkc1ZhbHVlcyA9IGZvcm1WYWx1ZXNbcGFyZW50RmllbGQuY29uZmlnTmFtZV0/LnN1YkZpZWxkcyA/IGZvcm1WYWx1ZXNbcGFyZW50RmllbGQuY29uZmlnTmFtZV0uc3ViRmllbGRzIDoge31cbiAgICBpZighc3ViRmllbGRzKSByZXR1cm4gY29udHJvbHM7XG4gICAgaWYgKHBhcmVudEZpZWxkLmZpZWxkVHlwZSA9PT0gJ3NpbmdsZVNlbGVjdCcpIHtcbiAgICAgIHN1YkZpZWxkcyA9IHN1YkZpZWxkcy5maWx0ZXIoKHN1YkZpZWxkKSA9PiBzdWJGaWVsZC5wYXJlbnRDb25maWdWYWx1ZSA9PT0gKDx7bGFiZWw6IHN0cmluZywgdmFsdWU6IHN0cmluZyB9PnBhcmVudFZhbHVlKT8udmFsdWUpO1xuICAgIH1cbiAgICBlbHNlIGlmIChwYXJlbnRGaWVsZC5maWVsZFR5cGUgPT09ICdtdWx0aVNlbGVjdCcpIHtcbiAgICAgIGxldCBwYXJlbnRWYWx1ZXMgPSBuZXcgU2V0KCg8QXJyYXk8eyBsYWJlbDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIH0+PnBhcmVudFZhbHVlKS5tYXAoKHZhbHVlKSA9PiB2YWx1ZS52YWx1ZSkpO1xuICAgICAgc3ViRmllbGRzID0gc3ViRmllbGRzLmZpbHRlcigoc3ViRmllbGQpID0+IHBhcmVudFZhbHVlcy5oYXMoc3ViRmllbGQucGFyZW50Q29uZmlnVmFsdWUpKTtcbiAgICB9XG5cbiAgICBpZiAoc3ViRmllbGRzPy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAobGV0IHN1YkZpZWxkIG9mIHN1YkZpZWxkcykge1xuICAgICAgICAgIGNvbnRyb2xzLnB1c2godGhpcy5tYXBGb3JtVmFsdWVUb0Zvcm1GaWVsZChzdWJGaWVsZCwgc3ViRmllbGRzVmFsdWVzW3N1YkZpZWxkLmNvbmZpZ05hbWVdKSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIHJldHVybiBjb250cm9scztcbiAgfVxuICBtYXBGb3JtVmFsdWVUb0Zvcm1GaWVsZChmb3JtRmllbGQ6IE5zRHluYW1pY0Zvcm0uSUR5bmFtaWNGaWVsZCwgZm9ybVZhbHVlOiBhbnkpOiBhbnkge1xuICAgIGxldCB2YWxpZGF0b3JzID0gZm9ybUZpZWxkLnZhbGlkYXRvcnMgPyBbZHluYW1pY0ZpZWxkVmFsaWRhdG9yKGZvcm1GaWVsZC52YWxpZGF0b3JzKV06IFtdXG4gICAgbGV0IGNvbnRyb2wgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKG51bGwsIHZhbGlkYXRvcnMpO1xuXG4gICAgaWYgKGZvcm1GaWVsZC5maWVsZFR5cGUgPT09IFwiaW5wdXRcIikge1xuICAgICAgaWYgKGZvcm1GaWVsZC5maWVsZElucHV0VHlwZSA9PT0gXCJ0ZXh0XCIgfHwgZm9ybUZpZWxkLmZpZWxkSW5wdXRUeXBlID09PSBcInRleHRhcmVhXCIpIGNvbnRyb2wuc2V0VmFsdWUoZm9ybVZhbHVlID8gZm9ybVZhbHVlIDogXCJcIik7XG4gICAgICBlbHNlIGlmIChmb3JtRmllbGQuZmllbGRJbnB1dFR5cGUgPT09IFwibnVtYmVyXCIpIGNvbnRyb2wuc2V0VmFsdWUoZm9ybVZhbHVlID8gZm9ybVZhbHVlIDogMCk7XG4gICAgICBlbHNlIGlmIChmb3JtRmllbGQuZmllbGRJbnB1dFR5cGUgPT09IFwiZGF0ZVwiKSB7XG4gICAgICAgIGlmIChmb3JtVmFsdWUgJiYgdHlwZW9mIGZvcm1WYWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIGNvbnRyb2wuc2V0VmFsdWUoZGF5anMoZm9ybVZhbHVlKS50eihmb3JtRmllbGQuZmllbGRDb25maWcudGltZXpvbmUpLmZvcm1hdChmb3JtRmllbGQuZmllbGRDb25maWcuZm9ybWF0KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udHJvbC5zZXRWYWx1ZShkYXlqcygpLnR6KGZvcm1GaWVsZC5maWVsZENvbmZpZy50aW1lem9uZSkuZm9ybWF0KGZvcm1GaWVsZC5maWVsZENvbmZpZy5mb3JtYXQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZm9ybUZpZWxkLmZpZWxkVHlwZSA9PT0gXCJzaW5nbGVTZWxlY3RcIikge1xuICAgICAgY29uc3QgZmluZFNlbGVjdGVkVmFsdWUgPSAoKSA9PiB7XG4gICAgICAgIGxldCBpbmRleCA9IGZvcm1GaWVsZC5pdGVtc0xpc3QuZmluZEluZGV4KGl0ZW0gPT4gaXRlbS52YWx1ZSA9PT0gZm9ybVZhbHVlKVxuICAgICAgICByZXR1cm4gaW5kZXggPj0gMCA/IGZvcm1GaWVsZC5pdGVtc0xpc3RbaW5kZXhdOiBcIlwiO1xuICAgICAgfVxuICAgICAgaWYgKGZvcm1GaWVsZC5maWVsZElucHV0VHlwZSA9PT0gXCJkcm9wZG93blwiKSB7XG4gICAgICAgIGlmICghZm9ybVZhbHVlKSBjb250cm9sLnNldFZhbHVlKGZvcm1GaWVsZC5pdGVtc0xpc3RbMF0pO1xuICAgICAgICBlbHNlIGNvbnRyb2wuc2V0VmFsdWUoZmluZFNlbGVjdGVkVmFsdWUoKSlcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGZvcm1GaWVsZC5maWVsZElucHV0VHlwZSA9PT0gXCJyYWRpb1wiKSB7XG4gICAgICAgIGNvbnRyb2wuc2V0VmFsdWUoZmluZFNlbGVjdGVkVmFsdWUoKSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZvcm1GaWVsZC5maWVsZFR5cGUgPT09IFwibXVsdGlTZWxlY3RcIikge1xuICAgICAgaWYgKGZvcm1WYWx1ZSAmJiBBcnJheS5pc0FycmF5KGZvcm1WYWx1ZSkpIHtcbiAgICAgICAgbGV0IHNlbGVjdGVkVmFsdWVzID0gW107XG4gICAgICAgIGZvciAobGV0IHZhbHVlIG9mIGZvcm1WYWx1ZSkge1xuICAgICAgICAgIGxldCBpbmRleCA9IGZvcm1GaWVsZC5pdGVtc0xpc3QuZmluZEluZGV4KGl0ZW0gPT4gaXRlbS52YWx1ZSA9PT0gdmFsdWUpO1xuICAgICAgICAgIGlmIChpbmRleCA+IC0xKSBzZWxlY3RlZFZhbHVlcy5wdXNoKHsgLi4uZm9ybUZpZWxkLml0ZW1zTGlzdFtpbmRleF0gfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29udHJvbC5zZXRWYWx1ZShzZWxlY3RlZFZhbHVlcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250cm9sLnNldFZhbHVlKFtdKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZvcm1GaWVsZC5maWVsZFR5cGUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBjb250cm9sLnNldFZhbHVlKCEhZm9ybVZhbHVlKTtcbiAgICB9IGVsc2UgY29udHJvbC5zZXRWYWx1ZShudWxsKTtcbiAgICByZXR1cm4gY29udHJvbDtcbiAgfVxuICBtYXBGb3JtRmllbGRUb0Zvcm1WYWx1ZShmb3JtRmllbGQ6IE5zRHluYW1pY0Zvcm0uSUR5bmFtaWNGaWVsZCwgZm9ybVZhbHVlOiBhbnkpOiBhbnkge1xuICAgIGlmIChmb3JtRmllbGQuZmllbGRUeXBlID09PSBcImlucHV0XCIpIHtcbiAgICAgIGlmIChmb3JtRmllbGQuZmllbGRJbnB1dFR5cGUgPT09IFwidGV4dFwiIHx8IGZvcm1GaWVsZC5maWVsZElucHV0VHlwZSA9PT0gXCJ0ZXh0YXJlYVwiKSByZXR1cm4gZm9ybVZhbHVlO1xuICAgICAgZWxzZSBpZiAoZm9ybUZpZWxkLmZpZWxkSW5wdXRUeXBlID09PSBcIm51bWJlclwiKSByZXR1cm4gK2Zvcm1WYWx1ZTtcbiAgICAgIGVsc2UgaWYgKGZvcm1GaWVsZC5maWVsZElucHV0VHlwZSA9PT0gXCJkYXRlXCIpIHtcbiAgICAgICAgcmV0dXJuIGRheWpzLnR6KGZvcm1WYWx1ZSwgZm9ybUZpZWxkLmZpZWxkQ29uZmlnLmZvcm1hdCwgZm9ybUZpZWxkLmZpZWxkQ29uZmlnLnRpbWV6b25lKS52YWx1ZU9mKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmb3JtRmllbGQuZmllbGRUeXBlID09PSBcInNpbmdsZVNlbGVjdFwiKSB7XG4gICAgICByZXR1cm4gZm9ybVZhbHVlPy52YWx1ZSA/PyAnJztcbiAgICB9IGVsc2UgaWYgKGZvcm1GaWVsZC5maWVsZFR5cGUgPT09IFwibXVsdGlTZWxlY3RcIikge1xuICAgICAgcmV0dXJuIGZvcm1WYWx1ZT8ubWFwKGl0ZW0gPT4gaXRlbS52YWx1ZSk7XG4gICAgfSBlbHNlIGlmIChmb3JtRmllbGQuZmllbGRUeXBlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgcmV0dXJuIGZvcm1WYWx1ZTtcbiAgICB9IGVsc2UgcmV0dXJuIGZvcm1WYWx1ZTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZHluYW1pY0ZpZWxkVmFsaWRhdG9yID0gKHZhbGlkYXRvcnM6IEFycmF5PE5zRHluYW1pY0Zvcm0uSUR5bmFtaWNGaWVsZFZhbGlkYXRvcj4pOiBWYWxpZGF0b3JGbiA9PiB7XG4gIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgIGxldCB2YWx1ZSA9IGNvbnRyb2wudmFsdWVcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlPy52YWx1ZSA/IHZhbHVlLnZhbHVlIDogJydcbiAgICB9XG4gICAgbGV0IGVycm9ycyA9IG51bGxcblxuICAgIHZhbGlkYXRvcnMuZm9yRWFjaCgodmFsaWRhdG9yKSA9PiB7XG4gICAgICBsZXQgZXJyb3IgPSBudWxsXG4gICAgICBsZXQgbWVzc2FnZSA9IHZhbGlkYXRvci5tZXNzYWdlXG4gICAgICBzd2l0Y2ggKHZhbGlkYXRvci50eXBlKSB7XG4gICAgICAgIGNhc2UgXCJSZXF1aXJlZFwiOlxuICAgICAgICAgIGVycm9yID0gVmFsaWRhdG9ycy5yZXF1aXJlZChjb250cm9sKTtcbiAgICAgICAgICBpZiAoIWVycm9yICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUudHJpbSgpID09PSAnJykge1xuICAgICAgICAgICAgZXJyb3IgPSB7IFJlcXVpcmVkOiBtZXNzYWdlIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKGVycm9yKSBlcnJvciA9IHtSZXF1aXJlZDogbWVzc2FnZX1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIk1pbkxlbmd0aFwiOlxuICAgICAgICAgIGVycm9yID0gVmFsaWRhdG9ycy5taW5MZW5ndGgoK3ZhbGlkYXRvci52YWx1ZSkoY29udHJvbClcbiAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKCckezB9JywgZXJyb3I/Lm1pbmxlbmd0aC5yZXF1aXJlZExlbmd0aClcbiAgICAgICAgICBpZihlcnJvcikgZXJyb3IgPSB7IE1pbkxlbmd0aDogbWVzc2FnZSB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJNYXhMZW5ndGhcIjpcbiAgICAgICAgICBlcnJvciA9IFZhbGlkYXRvcnMubWF4TGVuZ3RoKCt2YWxpZGF0b3IudmFsdWUpKGNvbnRyb2wpXG4gICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZSgnJHswfScsIGVycm9yPy5hY3R1YWxMZW5ndGgpXG4gICAgICAgICAgaWYoZXJyb3IpIGVycm9yID0geyBNYXhMZW5ndGg6IG1lc3NhZ2UgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiRW1haWxcIjpcbiAgICAgICAgICBlcnJvciA9IFZhbGlkYXRvcnMuZW1haWwoY29udHJvbClcbiAgICAgICAgICBpZihlcnJvcikgZXJyb3IgPSB7RW1haWw6IG1lc3NhZ2V9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJDdXN0b21cIjpcbiAgICAgICAgICBlcnJvciA9IFZhbGlkYXRvcnMucGF0dGVybihgJHt2YWxpZGF0b3IudmFsdWV9YCkoY29udHJvbClcbiAgICAgICAgICBpZihlcnJvcikgZXJyb3IgPSB7Q3VzdG9tOiBtZXNzYWdlfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGVycm9yKSBlcnJvcnMgPSB7IC4uLmVycm9ycywgLi4uZXJyb3IgfVxuICAgIH0pXG4gICAgcmV0dXJuIGVycm9yc1xuICB9XG59IiwiPGZvcm0gW2Zvcm1Hcm91cF09XCJkeW5hbWljRm9ybVwiPlxuICA8bmctY29udGFpbmVyIGZvcm1BcnJheU5hbWU9XCJkeW5hbWljRmllbGRzXCI+XG4gICAgPG5nLWNvbnRhaW5lciBbZm9ybUdyb3VwTmFtZV09XCJpXCIgKm5nRm9yPVwibGV0IGZpZWxkQ29udHJvbCBvZiBnZXREeW5hbWljRmllbGRzQ29udHJvbHMoKS5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImR5bmFtaWNGaWVsZFwiXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgJGltcGxpY2l0OiBmb3JtRmllbGRzW2ldLFxuICAgICAgICAgIGZvcm1Hcm91cDogZmllbGRDb250cm9sLFxuICAgICAgICAgIGNvbnRyb2w6IGZpZWxkQ29udHJvbC5jb250cm9scy52YWx1ZVxuICAgICAgICB9XCJcbiAgICAgID5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPGRpdiBjbGFzcz1cInN1Yi1keW5hbWljLWZvcm1cIiAqbmdJZj1cImZpZWxkQ29udHJvbD8udmFsdWUgJiYgKCEhZm9ybUZpZWxkc1tpXT8uc3ViRmllbGRzICYmIGZvcm1GaWVsZHNbaV0/LnN1YkZpZWxkcz8ubGVuZ3RoID4gMCAmJiBtYXRjaFBhcmVudENvbmZpZyhmb3JtRmllbGRzW2ldPy5zdWJGaWVsZHMsIGZpZWxkQ29udHJvbD8uY29udHJvbHM/LnZhbHVlPy52YWx1ZT8udmFsdWUpKVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzdWJGaWVsZENvbnRyb2wgb2YgZmllbGRDb250cm9sLmNvbnRyb2xzLnN1YkZpZWxkcy5jb250cm9sczsgbGV0IGogPSBpbmRleFwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImR5bmFtaWNGaWVsZFwiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICAgICAgICAkaW1wbGljaXQ6IGZpbmRTZWxlY3RlZFN1YkZpZWxkQ29uZmlnKGZvcm1GaWVsZHNbaV0/LnN1YkZpZWxkcywgZmllbGRDb250cm9sLmNvbnRyb2xzLnZhbHVlLnZhbHVlLnZhbHVlLGopLFxuICAgICAgICAgICAgICBjb250cm9sOiBzdWJGaWVsZENvbnRyb2xcbiAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG48L2Zvcm0+XG5cblxuPG5nLXRlbXBsYXRlICNkeW5hbWljRmllbGQgbGV0LWZpZWxkIGxldC1jb250cm9sPVwiY29udHJvbFwiIGxldC1mb3JtZ3JvdXA9XCJmb3JtR3JvdXBcIj5cblxuICA8IS0tIGZpZWxkVHlwZTogJ2lucHV0JyBmaWVsZElucHV0VHlwZTogJ3RleHQnIHwgJ251bWJlcicgLS0+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWVsZC5maWVsZFR5cGUgPT09ICdpbnB1dCcgJiYgKGZpZWxkLmZpZWxkSW5wdXRUeXBlID09PSAndGV4dCcgfHwgZmllbGQuZmllbGRJbnB1dFR5cGUgPT09ICdudW1iZXInKVwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjdXN0b21JbnB1dFRleHROdW1iZXI7IGVsc2UgZGVmYXVsdElucHV0VGV4dE51bWJlclwiPlxuICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImN1c3RvbUlucHV0VGV4dE51bWJlclwiXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGZpZWxkOiBmaWVsZCwgY29udHJvbDogY29udHJvbCwgZm9ybWdyb3VwOiBmb3JtZ3JvdXAgfVwiXG4gICAgICA+PC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRJbnB1dFRleHROdW1iZXI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy1maWVsZCBtdWx0aS1saW5lLWZpZWxkLWNvbnRhaW5lclwiXG4gICAgICAgIFtuZ1N0eWxlXT1cInsnYm9yZGVyLWJvdHRvbSc6IChmb3JtZ3JvdXA/LmNvbnRyb2xzPy5zdWJGaWVsZHM/LmNvbnRyb2xzPy5sZW5ndGggJiYgcmVtb3ZlU2VwcmF0b3JGb3JTdWJGaWVsZHMpID8gICdub25lJzonJ31cIj5cbiAgICAgICAgPHAgY2xhc3M9XCJoNyBmaWVsZC10aXRsZS1zbVwiPlxuICAgICAgICAgIHt7IGZpZWxkPy50aXRsZSB9fSA8c3BhbiAqbmdJZj1cImZpZWxkLnZhbGlkYXRvcnMgJiYgZmllbGQudmFsaWRhdG9ycy5sZW5ndGggPiAwXCI+ICo8L3NwYW4+XG4gICAgICAgIDwvcD5cbiAgICAgICAgPGRpdiBzdHlsZT1cImZsZXgtYmFzaXM6IDEwMCVcIj48L2Rpdj5cbiAgICAgICAgPGlucHV0IGNsYXNzPVwiaW5wdXQtZmllbGQgaXAtdGV4dFwiIFt0eXBlXT1cImZpZWxkLmZpZWxkSW5wdXRUeXBlXCIgW2Zvcm1Db250cm9sXT1cImNvbnRyb2xcIlxuICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZVN1YkR5bmFtaWNGaWVsZHMoZmllbGQsIGZvcm1ncm91cCwgJGV2ZW50KVwiIFxuICAgICAgICAgIFtuZ1N0eWxlXT1cInsnYm9yZGVyJzogY29udHJvbC50b3VjaGVkICYmIGNvbnRyb2wuZXJyb3JzID8gJzFweCBzb2xpZCAjQjAwMDIwJzogJyd9XCJcbiAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmllbGQucGxhY2Vob2xkZXJUZXh0ID8gZmllbGQucGxhY2Vob2xkZXJUZXh0IDogJ0lucHV0IFRleHQnXCIgXG4gICAgICAgICAgW21pbl09XCJmaWVsZC5maWVsZElucHV0VHlwZSA9PT0gJ251bWJlcicgPyAwIDogJycgXCIvPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udHJvbC50b3VjaGVkICYmIGNvbnRyb2wuZXJyb3JzXCJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJkeW5hbWljRmllbGRFcnJvcnNcIiBcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGNvbnRyb2wuZXJyb3JzIH1cIlxuICAgICAgICA+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9uZy1jb250YWluZXI+XG4gIFxuICA8IS0tIGZpZWxkVHlwZTogJ2lucHV0JyBmaWVsZElucHV0VHlwZTogJ3RleHRhcmVhJyAtLT5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpZWxkLmZpZWxkVHlwZSA9PT0gJ2lucHV0JyAmJiBmaWVsZC5maWVsZElucHV0VHlwZSA9PT0gJ3RleHRhcmVhJ1wiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjdXN0b21JbnB1dFRleHRhcmVhOyBlbHNlIGRlZmF1bHRJbnB1dFRleHRhcmVhXCI+XG4gICAgICA8bmctdGVtcGxhdGVcbiAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImN1c3RvbUlucHV0VGV4dGFyZWFcIlxuICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZmllbGQ6IGZpZWxkLCBjb250cm9sOiBjb250cm9sLCBmb3JtZ3JvdXA6IGZvcm1ncm91cCB9XCJcbiAgICA+PC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRJbnB1dFRleHRhcmVhPlxuICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtZmllbGQgbXVsdGktbGluZS1maWVsZC1jb250YWluZXJcIlxuICAgICAgW25nU3R5bGVdPVwieydib3JkZXItYm90dG9tJzogKGZvcm1ncm91cD8uY29udHJvbHM/LnN1YkZpZWxkcz8uY29udHJvbHM/Lmxlbmd0aCAmJiByZW1vdmVTZXByYXRvckZvclN1YkZpZWxkcykgPyAgJ25vbmUnOicnfVwiPlxuICAgICAgICA8cCBjbGFzcz1cImg3IGZpZWxkLXRpdGxlLXNtXCI+XG4gICAgICAgICAge3sgZmllbGQudGl0bGUgfX08c3BhbiAqbmdJZj1cImZpZWxkLnZhbGlkYXRvcnMgJiYgZmllbGQudmFsaWRhdG9ycy5sZW5ndGggPiAwXCI+ICo8L3NwYW4+XG4gICAgICAgIDwvcD5cbiAgICAgICAgPGRpdiBzdHlsZT1cImZsZXgtYmFzaXM6IDEwMCVcIj48L2Rpdj5cbiAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwiaW5wdXQtZmllbGQgaXAtdGV4dGFyZWFcIiB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgW25nU3R5bGVdPVwieydib3JkZXInOiBjb250cm9sLnRvdWNoZWQgJiYgY29udHJvbC5lcnJvcnMgPyAnMXB4IHNvbGlkICNCMDAwMjAnOiAnJ31cIlxuICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJmaWVsZC5wbGFjZWhvbGRlclRleHQgPyBmaWVsZC5wbGFjZWhvbGRlclRleHQgOiAnSW5wdXQgVGV4dCdcIiBbZm9ybUNvbnRyb2xdPVwiY29udHJvbFwiIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZVN1YkR5bmFtaWNGaWVsZHMoZmllbGQsIGZvcm1ncm91cCwgJGV2ZW50KVwiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRyb2wudG91Y2hlZCAmJiBjb250cm9sLmVycm9yc1wiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImR5bmFtaWNGaWVsZEVycm9yc1wiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGNvbnRyb2wuZXJyb3JzIH1cIj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvbmctY29udGFpbmVyPlxuICBcbiAgPCEtLSBmaWVsZFR5cGU6ICdpbnB1dCcgZmllbGRJbnB1dFR5cGU6ICdkYXRlJyAtLT5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpZWxkLmZpZWxkVHlwZSA9PT0gJ2lucHV0JyAmJiBmaWVsZC5maWVsZElucHV0VHlwZSA9PT0gJ2RhdGUnXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImN1c3RvbUlucHV0RGF0ZTsgZWxzZSBkZWZhdWx0SW5wdXREYXRlXCI+XG4gICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY3VzdG9tSW5wdXREYXRlXCJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZmllbGQ6IGZpZWxkLCBjb250cm9sOiBjb250cm9sLCBmb3JtZ3JvdXA6IGZvcm1ncm91cCB9XCJcbiAgICAgID48L25nLXRlbXBsYXRlPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdElucHV0RGF0ZT5cbiAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLWZpZWxkIHNpbmdsZS1saW5lLWZpZWxkLWNvbnRhaW5lclwiXG4gICAgICBbbmdTdHlsZV09XCJ7J2JvcmRlci1ib3R0b20nOiAoZm9ybWdyb3VwPy5jb250cm9scz8uc3ViRmllbGRzPy5jb250cm9scz8ubGVuZ3RoICYmIHJlbW92ZVNlcHJhdG9yRm9yU3ViRmllbGRzKSA/ICAnbm9uZSc6Jyd9XCJcbiAgICAgICAgKm5nSWY9XCJmaWVsZC5maWVsZFR5cGUgPT09ICdpbnB1dCcgJiYgZmllbGQuZmllbGRJbnB1dFR5cGUgPT09ICdkYXRlJ1wiPlxuICAgICAgICA8cCBjbGFzcz1cImg2XCI+XG4gICAgICAgICAge3sgZmllbGQudGl0bGUgfX0gPHNwYW4gKm5nSWY9XCJmaWVsZC52YWxpZGF0b3JzICYmIGZpZWxkLnZhbGlkYXRvcnMubGVuZ3RoID4gMFwiPiAqPC9zcGFuPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLXBpY2tlci1jb250YWluZXJcIj5cbiAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJkYXRlLXBpY2tlclwiIHJlYWRvbmx5IG1pc1R6RHAgW2RwQ29uZmlnXT1cImZpZWxkLmZpZWxkQ29uZmlnXCJcbiAgICAgICAgICAgIChkYXRlQ2hhbmdlKT1cImNvbnRyb2wuc2V0VmFsdWUoJGV2ZW50KVwiIFtzZWxlY3RlZERhdGVdPVwiY29udHJvbC52YWx1ZVwiIFtvZmZzZXRZXT1cIjBcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cImNvbnRyb2wudmFsdWVcIiAjZHAgLz5cbiAgICAgICAgICA8aW1nIGFsdD1cImRhdGEtcGlja2VyXCIgKm5nSWY9XCJjYWxlbmRhckljb25VcmxcIiBjbGFzcz1cImRhdGUtcGlja2VyLWljb25cIiBbc3JjXT1cImNhbGVuZGFySWNvblVybFwiXG4gICAgICAgICAgICAoY2xpY2spPVwiZHAuY2xpY2soKVwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udHJvbC50b3VjaGVkICYmIGNvbnRyb2wuZXJyb3JzXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiZHluYW1pY0ZpZWxkRXJyb3JzXCJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGNvbnRyb2wuZXJyb3JzIH1cIj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8IS0tIGZpZWxkVHlwZTogJ2Jvb2xlYW4nIGZpZWxkSW5wdXRUeXBlOiAndG9nZ2xlJyAtLT5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpZWxkLmZpZWxkVHlwZSA9PT0gJ2Jvb2xlYW4nICYmIGZpZWxkLmZpZWxkSW5wdXRUeXBlID09PSAndG9nZ2xlJ1wiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjdXN0b21Cb29sZWFuVG9nZ2xlOyBlbHNlIGRlZmF1bHRCb29sZWFuVG9nZ2xlXCI+XG4gICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY3VzdG9tQm9vbGVhblRvZ2dsZVwiXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGZpZWxkOiBmaWVsZCwgY29udHJvbDogY29udHJvbCwgZm9ybWdyb3VwOiBmb3JtZ3JvdXAgfVwiXG4gICAgICA+PC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRCb29sZWFuVG9nZ2xlPlxuICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtZmllbGQgc2luZ2xlLWxpbmUtZmllbGQtY29udGFpbmVyXCJcbiAgICAgIFtuZ1N0eWxlXT1cInsnYm9yZGVyLWJvdHRvbSc6IChmb3JtZ3JvdXA/LmNvbnRyb2xzPy5zdWJGaWVsZHM/LmNvbnRyb2xzPy5sZW5ndGggJiYgcmVtb3ZlU2VwcmF0b3JGb3JTdWJGaWVsZHMpID8gICdub25lJzonJ31cIj5cbiAgICAgICAgPHAgY2xhc3M9XCJoNlwiPlxuICAgICAgICAgIHt7IGZpZWxkLnRpdGxlIH19PHNwYW4gKm5nSWY9XCJmaWVsZC52YWxpZGF0b3JzICYmIGZpZWxkLnZhbGlkYXRvcnMubGVuZ3RoID4gMFwiPiAqPC9zcGFuPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxtaXMtc3dpdGNoIFtjb250cm9sXT1cImNvbnRyb2xcIiAodmFsdWVDaGFuZ2VkKT1cInVwZGF0ZVN1YkR5bmFtaWNGaWVsZHMoZmllbGQsIGZvcm1ncm91cCwgJGV2ZW50KVwiPjwvbWlzLXN3aXRjaD5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRyb2wudG91Y2hlZCAmJiBjb250cm9sLmVycm9yc1wiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImR5bmFtaWNGaWVsZEVycm9yc1wiXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBjb250cm9sLmVycm9ycyB9XCI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+ICAgIFxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDwhLS0gZmllbGRUeXBlOiAnc2luZ2xlU2VsZWN0JyBmaWVsZElucHV0VHlwZTogJ2Ryb3Bkb3duJyAtLT5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpZWxkLmZpZWxkVHlwZSA9PT0gJ3NpbmdsZVNlbGVjdCcgJiYgZmllbGQuZmllbGRJbnB1dFR5cGUgPT09ICdkcm9wZG93bidcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3VzdG9tU2luZ2xlU2VsZWN0RHJvcGRvd247IGVsc2UgZGVmYXVsdFNpbmdsZVNlbGVjdERyb3Bkb3duXCI+XG4gICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY3VzdG9tU2luZ2xlU2VsZWN0RHJvcGRvd25cIlxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBmaWVsZDogZmllbGQsIGNvbnRyb2w6IGNvbnRyb2wsIGZvcm1ncm91cDogZm9ybWdyb3VwIH1cIlxuICAgICAgPjwvbmctdGVtcGxhdGU+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0U2luZ2xlU2VsZWN0RHJvcGRvd24+XG4gICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy1maWVsZCBzaW5nbGUtbGluZS1maWVsZC1jb250YWluZXJcIlxuICAgICAgICBbbmdTdHlsZV09XCJ7J2JvcmRlci1ib3R0b20nOiAoZm9ybWdyb3VwPy5jb250cm9scz8uc3ViRmllbGRzPy5jb250cm9scz8ubGVuZ3RoICYmIHJlbW92ZVNlcHJhdG9yRm9yU3ViRmllbGRzKSA/ICAnbm9uZSc6Jyd9XCI+XG4gICAgICAgIDxwIGNsYXNzPVwiaDZcIj5cbiAgICAgICAgICB7eyBmaWVsZC50aXRsZSB9fTxzcGFuICpuZ0lmPVwiZmllbGQudmFsaWRhdG9ycyAmJiBmaWVsZC52YWxpZGF0b3JzLmxlbmd0aCA+IDBcIj4gKjwvc3Bhbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cInsncmVtb3ZlYWJsZS1jb250YWluZXInIDogZmllbGQ/LmlzUmVtb3ZlYWJsZX1cIj5cbiAgICAgICAgICA8bWlzLWRyb3Bkb3duIFtzZWFyY2hFbmFibGVkXT1cImZhbHNlXCIgW3dpZHRoXT1cIicxNDBweCdcIiBbZGF0YV09XCJmaWVsZC5pdGVtc0xpc3RcIiBbc2VsZWN0ZWRJdGVtXT1cImNvbnRyb2wudmFsdWVcIlxuICAgICAgICAgIChvbkNoYW5nZSk9XCJ1cGRhdGVTZWxlY3RlZFZhbHVlRm9yU2luZ2xlU2VsZWN0KGZpZWxkLCBjb250cm9sLCBmb3JtZ3JvdXAsICRldmVudCk7XCI+XG4gICAgICAgICAgPC9taXMtZHJvcGRvd24+XG4gICAgICAgICAgPGltZyAqbmdJZj1cImZpZWxkLmlzUmVtb3ZlYWJsZSAmJiByZW1vdmVJY29uVXJsXCIgY2xhc3M9XCJyZW1vdmUtaWNvblwiIFtzcmNdPVwicmVtb3ZlSWNvblVybFwiIChjbGljayk9XCJmaWVsZFJlbW92ZWQuZW1pdChmaWVsZClcIj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250cm9sLnRvdWNoZWQgJiYgY29udHJvbC5lcnJvcnNcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJkeW5hbWljRmllbGRFcnJvcnNcIlxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogY29udHJvbC5lcnJvcnMgfVwiPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvbmctY29udGFpbmVyID5cbiAgXG5cbiAgPCEtLSBmaWVsZFR5cGU6ICdzaW5nbGVTZWxlY3QnIGZpZWxkSW5wdXRUeXBlOiAncmFkaW8nIC0tPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmllbGQuZmllbGRUeXBlID09PSAnc2luZ2xlU2VsZWN0JyAmJiBmaWVsZC5maWVsZElucHV0VHlwZSA9PT0gJ3JhZGlvJ1wiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjdXN0b21TaW5nbGVTZWxlY3RSYWRpbzsgZWxzZSBkZWZhdWx0U2luZ2xlU2VsZWN0UmFkaW9cIj5cbiAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjdXN0b21TaW5nbGVTZWxlY3RSYWRpb1wiXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGZpZWxkOiBmaWVsZCwgY29udHJvbDogY29udHJvbCwgZm9ybWdyb3VwOiBmb3JtZ3JvdXAgfVwiXG4gICAgICA+PC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRTaW5nbGVTZWxlY3RSYWRpbz5cbiAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLWZpZWxkIG11bHRpLWxpbmUtZmllbGQtY29udGFpbmVyXCJcbiAgICAgIFtuZ1N0eWxlXT1cInsnYm9yZGVyLWJvdHRvbSc6IChmb3JtZ3JvdXA/LmNvbnRyb2xzPy5zdWJGaWVsZHM/LmNvbnRyb2xzPy5sZW5ndGggJiYgcmVtb3ZlU2VwcmF0b3JGb3JTdWJGaWVsZHMpID8gICdub25lJzonJ31cIj5cbiAgICAgICAgPHAgY2xhc3M9XCJoNyBmaWVsZC10aXRsZS1zbVwiPlxuICAgICAgICAgIHt7IGZpZWxkLnRpdGxlIH19PHNwYW4gKm5nSWY9XCJmaWVsZC52YWxpZGF0b3JzICYmIGZpZWxkLnZhbGlkYXRvcnMubGVuZ3RoID4gMFwiPiAqPC9zcGFuPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4LWJhc2lzOiAxMDAlXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJjaGVja2JveGVzLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyYWRpby1jaGVja2JveC1jb21tb25cIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmaWVsZC5pdGVtc0xpc3RcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnY2hlY2tib3gtYWN0aXZlJzogaXRlbS5sYWJlbCA9PT0gY29udHJvbC52YWx1ZT8ubGFiZWwgfVwiXG4gICAgICAgICAgICAoY2xpY2spPVwidXBkYXRlU2VsZWN0ZWRWYWx1ZUZvclNpbmdsZVNlbGVjdChmaWVsZCwgY29udHJvbCwgZm9ybWdyb3VwLCBpdGVtKTtcIj5cbiAgICAgICAgICAgIDxpbWcgKm5nSWY9XCIoaXRlbS5sYWJlbCA9PT0gY29udHJvbC52YWx1ZT8ubGFiZWwpICYmIGFjdGl2ZUJ0bkljb25VcmxcIiBbc3JjXT1cImFjdGl2ZUJ0bkljb25VcmxcIiBhbHQ9XCJcIiAvPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJoNlwiPnt7IGl0ZW0ubGFiZWwgfX08L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udHJvbC50b3VjaGVkICYmIGNvbnRyb2wuZXJyb3JzXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiZHluYW1pY0ZpZWxkRXJyb3JzXCJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGNvbnRyb2wuZXJyb3JzIH1cIj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L25nLWNvbnRhaW5lcj5cbiAgXG5cbiAgPCEtLSBmaWVsZFR5cGU6ICdtdWx0aVNlbGVjdCcgZmllbGRJbnB1dFR5cGU6ICdjaGVja2JveCcgLS0+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWVsZC5maWVsZFR5cGUgPT09ICdtdWx0aVNlbGVjdCcgJiYgZmllbGQuZmllbGRJbnB1dFR5cGUgPT09ICdjaGVja2JveCdcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3VzdG9tTXVsdGlTZWxlY3RDaGVja2JveDsgZWxzZSBkZWZhdWx0TXVsdGlTZWxlY3RDaGVja2JveFwiPlxuICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImN1c3RvbU11bHRpU2VsZWN0Q2hlY2tib3hcIlxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBmaWVsZDogZmllbGQsIGNvbnRyb2w6IGNvbnRyb2wsIGZvcm1ncm91cDogZm9ybWdyb3VwIH1cIlxuICAgICAgPjwvbmctdGVtcGxhdGU+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0TXVsdGlTZWxlY3RDaGVja2JveD5cbiAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLWZpZWxkIG11bHRpLWxpbmUtZmllbGQtY29udGFpbmVyXCJcbiAgICAgIFtuZ1N0eWxlXT1cInsnYm9yZGVyLWJvdHRvbSc6IChmb3JtZ3JvdXA/LmNvbnRyb2xzPy5zdWJGaWVsZHM/LmNvbnRyb2xzPy5sZW5ndGggJiYgcmVtb3ZlU2VwcmF0b3JGb3JTdWJGaWVsZHMpID8gICdub25lJzonJ31cIj5cbiAgICAgICAgPHAgY2xhc3M9XCJoNyBmaWVsZC10aXRsZS1zbVwiPlxuICAgICAgICAgIHt7IGZpZWxkLnRpdGxlIH19PHNwYW4gKm5nSWY9XCJmaWVsZC52YWxpZGF0b3JzICYmIGZpZWxkLnZhbGlkYXRvcnMubGVuZ3RoID4gMFwiPiAqPC9zcGFuPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4LWJhc2lzOiAxMDAlXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJjaGVja2JveGVzLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyYWRpby1jaGVja2JveC1jb21tb25cIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmaWVsZC5pdGVtc0xpc3RcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnY2hlY2tib3gtYWN0aXZlJzogaXNDaGVja0JveFNlbGVjdGVkKGl0ZW0ubGFiZWwsIGNvbnRyb2wudmFsdWUpIH1cIlxuICAgICAgICAgICAgKGNsaWNrKT1cInVwZGF0ZVNlbGVjdGVkVmFsdWVGb3JNdWx0aVNlbGVjdChmaWVsZCwgY29udHJvbCwgZm9ybWdyb3VwLCBbaXRlbV0pXCI+XG4gICAgICAgICAgICA8aW1nICpuZ0lmPVwiaXNDaGVja0JveFNlbGVjdGVkKGl0ZW0ubGFiZWwsIGNvbnRyb2wudmFsdWUpICYmIGFjdGl2ZUJ0bkljb25VcmxcIiBbc3JjXT1cImFjdGl2ZUJ0bkljb25VcmxcIlxuICAgICAgICAgICAgICBhbHQ9XCJcIiAvPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJoNlwiPnt7IGl0ZW0ubGFiZWwgfX08L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udHJvbC50b3VjaGVkICYmIGNvbnRyb2wuZXJyb3JzXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiZHluYW1pY0ZpZWxkRXJyb3JzXCJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGNvbnRyb2wuZXJyb3JzIH1cIj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L25nLWNvbnRhaW5lcj5cblxuXG4gIDwhLS0gZmllbGRUeXBlOiAnbXVsdGlTZWxlY3QnIGZpZWxkSW5wdXRUeXBlOiAnZHJvcGRvd24nIC0tPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmllbGQuZmllbGRUeXBlID09PSAnbXVsdGlTZWxlY3QnICYmIGZpZWxkLmZpZWxkSW5wdXRUeXBlID09PSAnZHJvcGRvd24nXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImN1c3RvbU11bHRpU2VsZWN0RHJvcGRvd247IGVsc2UgZGVmYXVsdE11bHRpU2VsZWN0RHJvcGRvd25cIj5cbiAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjdXN0b21NdWx0aVNlbGVjdERyb3Bkb3duXCJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZmllbGQ6IGZpZWxkLCBjb250cm9sOiBjb250cm9sLCBmb3JtZ3JvdXA6IGZvcm1ncm91cCB9XCJcbiAgICAgID48L25nLXRlbXBsYXRlPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdE11bHRpU2VsZWN0RHJvcGRvd24+XG4gICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy1maWVsZCBzaW5nbGUtbGluZS1maWVsZC1jb250YWluZXJcIlxuICAgICAgW25nU3R5bGVdPVwieydib3JkZXItYm90dG9tJzogKGZvcm1ncm91cD8uY29udHJvbHM/LnN1YkZpZWxkcz8uY29udHJvbHM/Lmxlbmd0aCAmJiByZW1vdmVTZXByYXRvckZvclN1YkZpZWxkcykgPyAgJ25vbmUnOicnfVwiPlxuICAgICAgICA8cCBjbGFzcz1cImg2XCI+XG4gICAgICAgICAge3sgZmllbGQudGl0bGUgfX08c3BhbiAqbmdJZj1cImZpZWxkLnZhbGlkYXRvcnMgJiYgZmllbGQudmFsaWRhdG9ycy5sZW5ndGggPiAwXCI+ICo8L3NwYW4+XG4gICAgICAgIDwvcD5cbiAgICAgICAgPG1pcy1tdWx0aS1zZWxlY3QtZHJvcGRvd24gW3dpZHRoXT1cIicxNDBweCdcIiBbc2hvd1NlbGVjdGVkQ291bnRdPVwidHJ1ZVwiIFtkcm9wZG93bkxpc3RXaWR0aF09XCInMjU2cHgnXCJcbiAgICAgICAgICBbc2VhcmNoRW5hYmxlZF09XCJmYWxzZVwiIFtoaWRlQXBwbHlCdXR0b25dPVwidHJ1ZVwiIFtkYXRhXT1cImZpZWxkLml0ZW1zTGlzdFwiXG4gICAgICAgICAgW3NlbGVjdGVkSXRlbXNdPVwiY29udHJvbC52YWx1ZVwiIChvbkNoYW5nZSk9XCJ1cGRhdGVTZWxlY3RlZFZhbHVlRm9yTXVsdGlTZWxlY3QoZmllbGQsIGNvbnRyb2wsIGZvcm1ncm91cCwgJGV2ZW50KTtcIj48L21pcy1tdWx0aS1zZWxlY3QtZHJvcGRvd24+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250cm9sLnRvdWNoZWQgJiYgY29udHJvbC5lcnJvcnNcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJkeW5hbWljRmllbGRFcnJvcnNcIlxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogY29udHJvbC5lcnJvcnMgfVwiPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvbmctY29udGFpbmVyPlxuXG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2R5bmFtaWNGaWVsZEVycm9ycyBsZXQtZXJyb3JzPlxuICA8ZGl2IGlkPVwiZXJyb3ItbWVzc2FnZXMtY29udGFpbmVyXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZXJyb3Igb2YgZXJyb3JzIHwga2V5dmFsdWVcIj5cbiAgICAgIDxwIGNsYXNzPVwiaDhcIj5cbiAgICAgICAge3tcIiDigKIgJm5ic3A7XCIgKyBlcnJvci52YWx1ZX19XG4gICAgICA8L3A+XG4gICAgICA8ZGl2IFtuZ1N0eWxlXT1cInsgJ2ZsZXgtYmFzaXMnOiAnMTAwJScsICdoZWlnaHQnOiAnMCcgfVwiPjwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+Il19
|
|
1139
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL21pcy1jb21wb25lbnRzL2R5bmFtaWMtZm9ybS9keW5hbWljLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvbWlzLWNvbXBvbmVudHMvZHluYW1pYy1mb3JtL2R5bmFtaWMtZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBZ0QsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFMUosT0FBTyxFQUFtQixnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsRUFBaUMsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFcEosT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sUUFBUSxNQUFNLHVCQUF1QixDQUFDO0FBQzdDLE9BQU8saUJBQWlCLE1BQU0sZ0NBQWdDLENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lDT3RELDZCQUFzRztJQUNwRyw0QkFNZTs7Ozs7Ozs7OztJQUxiLGNBQWlDO0lBQ2pDLEFBREEsa0RBQWlDLDhSQUkvQjs7O0lBUFIsK0JBQW1QO0lBQ2pQLDZHQUFzRztJQVN4RyxpQkFBTTs7O0lBVHNDLGNBQTZDO0lBQTdDLHFFQUE2Qzs7O0lBWDNGLGlDQUFrSDtJQUM5Ryw0QkFRYTtJQUNmLHFGQUFtUDs7Ozs7OztJQVZ2TyxvQ0FBbUI7SUFFN0IsY0FBaUM7SUFDakMsQUFEQSxrREFBaUMsOEtBSy9CO0lBRzJCLGNBQWtOO0lBQWxOLGl4QkFBa047Ozs7SUFvQm5QLDZCQUF5RTtJQUN2RSxrSUFHQzs7Ozs7Ozs7SUFGQyxjQUEwQztJQUMxQyxBQURBLCtEQUEwQyw4RkFDMEM7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QUM3QyxDQUFDLENBQUMsQ0FBQTtRQUNGLE9BQU8sTUFBTSxDQUFBO0lBQ2YsQ0FBQyxDQUFBO0FBQ0gsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBDb250ZW50Q2hpbGQsIEhvc3RMaXN0ZW5lciwgT25EZXN0cm95LCBPbkluaXQsIFRlbXBsYXRlUmVmLCBpbnB1dCwgb3V0cHV0LCBzaWduYWwsIGNvbXB1dGVkLCBlZmZlY3QsIHVudHJhY2tlZCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBOc0R5bmFtaWNGb3JtIH0gZnJvbSBcIi4vZHluYW1pYy1mb3JtLm5hbWVzcGFjZVwiO1xuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBVbnR5cGVkRm9ybUFycmF5LCBVbnR5cGVkRm9ybUNvbnRyb2wsIFVudHlwZWRGb3JtR3JvdXAsIFZhbGlkYXRpb25FcnJvcnMsIFZhbGlkYXRvckZuLCBWYWxpZGF0b3JzIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5cbmltcG9ydCBkYXlqcyBmcm9tICdkYXlqcyc7XG5pbXBvcnQgdGltZXpvbmUgZnJvbSAnZGF5anMvcGx1Z2luL3RpbWV6b25lJztcbmltcG9ydCBjdXN0b21QYXJzZUZvcm1hdCBmcm9tICdkYXlqcy9wbHVnaW4vY3VzdG9tUGFyc2VGb3JtYXQnXG5cbmRheWpzLmV4dGVuZCh0aW1lem9uZSk7XG5kYXlqcy5leHRlbmQoY3VzdG9tUGFyc2VGb3JtYXQpO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSBcInJ4anNcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcIm1pcy1keW5hbWljLWZvcm1cIixcbiAgdGVtcGxhdGVVcmw6IFwiLi9keW5hbWljLWZvcm0uY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmxzOiBbXCIuL2R5bmFtaWMtZm9ybS5jb21wb25lbnQuc2Nzc1wiXVxufSlcbmV4cG9ydCBjbGFzcyBEeW5hbWljRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgLyoqXG4gICAqIGZvcm1GaWVsZHM6ICBEeW5hbWljIGZpZWxkcyByZWNpZXZlZCBmcm9tIHRoZSBBUEkgbWV0YWRhdGEgdG8gYnVpbGQgYSBkeW5hbWljIGZvcm1cbiAgICogZm9ybVZhbHVlczogIEhvbGRzIHRoZSB2YWx1ZSBvZiB0aGUgZHluYW1pYyBmb3JtIHdpdGggXCJrZXlcIiBiZWluZyBkeW5hbWljIGZpZWxkIFwidGl0bGVcIlxuICAgKiAgICAgICAgICAgICAgYW5kIHZhbHVlIGJlaW5nIHRoZSB1c2VyIGlucHV0LlxuICAgKi9cbiAgZm9ybUZpZWxkcyA9IGlucHV0PEFycmF5PE5zRHluYW1pY0Zvcm0uSUR5bmFtaWNGaWVsZD4+KFtdKTtcbiAgZm9ybVZhbHVlcyA9IGlucHV0PHsgW2tleTogc3RyaW5nXTogYW55IH0+KHt9KTtcbiAgLy8gTmVlZCB0byBkZXByZWNhdGUgdGhlc2UgaW5wdXRzIGFuZCB1c2UgY29uc3RhbnRzLlxuICBhY3RpdmVCdG5JY29uVXJsID0gaW5wdXQ8c3RyaW5nPihcIlwiKTtcbiAgY2FsZW5kYXJJY29uVXJsID0gaW5wdXQ8c3RyaW5nPihcIlwiKTtcbiAgcmVtb3ZlSWNvblVybCA9IGlucHV0PHN0cmluZz4oXCJcIik7XG4gIHJlbW92ZVNlcHJhdG9yRm9yU3ViRmllbGRzID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuICAvKipcbiAgICogZHluYW1pY0Zvcm06IENvbnN0cnVjdGVkIHVzaW5nIGZvcm1GaWVsZHMgYW5kIGZvcm1WYWx1ZXMoaW4gY2FzZSBvZiBlZGl0KVxuICAgKi9cblxuICAvKipcbiAgICogZm9ybVVwZGF0ZWQ6IEVtaXRzIGZvcm1WYWx1ZXMgT2JqZWN0IHdoZW5ldmVyIHRoZXJlIGlzIGEgY2hhbmdlIGluIHRoZSBkeW5hbWljIGZvcm0uXG4gICAqL1xuICBmb3JtVXBkYXRlZCA9IG91dHB1dDx7IFtrZXk6IHN0cmluZ106IGFueSB9PigpO1xuICAvKipcbiAgICogZm9ybVZhbGlkOiBFbWl0cyBib29sZWFuIGRlcGVuZGluZyBvbiB2YWxpZGl0eSBvZiB0aGUgZm9ybVxuICAgKi9cbiAgZm9ybVZhbGlkID0gb3V0cHV0PGJvb2xlYW4+KCk7XG4gIC8qKlxuICAgKiBmb3JtSW5pdGlhbGl6ZWQ6IEVtaXRzIGR5bmFtaWMgZm9ybSBBUEkgb24gZm9ybSBpbml0aWxpemF0aW9uXG4gICAqL1xuICBmb3JtSW5pdGlhbGl6ZWQgPSBvdXRwdXQ8YW55PigpO1xuICBmaWVsZFJlbW92ZWQgPSBvdXRwdXQ8TnNEeW5hbWljRm9ybS5JRHluYW1pY0ZpZWxkPigpO1xuXG4gIEBDb250ZW50Q2hpbGQoXCJjdXN0b21JbnB1dFRleHROdW1iZXJcIiwgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGN1c3RvbUlucHV0VGV4dE51bWJlcjogVGVtcGxhdGVSZWY8RWxlbWVudD47XG4gIFxuICBAQ29udGVudENoaWxkKFwiY3VzdG9tSW5wdXRUZXh0YXJlYVwiLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgY3VzdG9tSW5wdXRUZXh0YXJlYTogVGVtcGxhdGVSZWY8RWxlbWVudD47XG5cbiAgQENvbnRlbnRDaGlsZChcImN1c3RvbUlucHV0RGF0ZVwiLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgY3VzdG9tSW5wdXREYXRlOiBUZW1wbGF0ZVJlZjxFbGVtZW50PjtcblxuICBAQ29udGVudENoaWxkKFwiY3VzdG9tQm9vbGVhblRvZ2dsZVwiLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgY3VzdG9tQm9vbGVhblRvZ2dsZTogVGVtcGxhdGVSZWY8RWxlbWVudD47XG5cbiAgQENvbnRlbnRDaGlsZChcImN1c3RvbVNpbmdsZVNlbGVjdERyb3Bkb3duXCIsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBjdXN0b21TaW5nbGVTZWxlY3REcm9wZG93bjogVGVtcGxhdGVSZWY8RWxlbWVudD47XG5cbiAgQENvbnRlbnRDaGlsZChcImN1c3RvbVNpbmdsZVNlbGVjdFJhZGlvXCIsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBjdXN0b21TaW5nbGVTZWxlY3RSYWRpbzogVGVtcGxhdGVSZWY8RWxlbWVudD47XG5cbiAgQENvbnRlbnRDaGlsZChcImN1c3RvbU11bHRpU2VsZWN0Q2hlY2tib3hcIiwgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIGN1c3RvbU11bHRpU2VsZWN0Q2hlY2tib3g6IFRlbXBsYXRlUmVmPEVsZW1lbnQ+O1xuXG4gIEBDb250ZW50Q2hpbGQoXCJjdXN0b21NdWx0aVNlbGVjdERyb3Bkb3duXCIsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBjdXN0b21NdWx0aVNlbGVjdERyb3Bkb3duOiBUZW1wbGF0ZVJlZjxFbGVtZW50PjtcblxuICAvLyBTaWduYWwtYmFzZWQgc3RhdGUgbWFuYWdlbWVudFxuICBwcml2YXRlIHJlYWRvbmx5IGR5bmFtaWNGb3JtU2lnbmFsID0gc2lnbmFsPFVudHlwZWRGb3JtR3JvdXAgfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkeW5hbWljRm9ybUFQSVNpZ25hbCA9IHNpZ25hbDxOc0R5bmFtaWNGb3JtLklEeW5hbWljRm9ybUFQSSB8IG51bGw+KG51bGwpO1xuICBwcml2YXRlIHJlYWRvbmx5IHZhbHVlQ2hhbmdlc1N1YnNjcmlwdGlvblNpZ25hbCA9IHNpZ25hbDxTdWJzY3JpcHRpb24gfCBudWxsPihudWxsKTtcbiAgXG4gIC8vIENvbXB1dGVkIHByb3BlcnRpZXMgZm9yIHRlbXBsYXRlIGFjY2Vzc1xuICBkeW5hbWljRm9ybSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuZHluYW1pY0Zvcm1TaWduYWwoKSk7XG4gIGR5bmFtaWNGb3JtQVBJID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5keW5hbWljRm9ybUFQSVNpZ25hbCgpKTtcbiAgdmFsdWVDaGFuZ2VzU3Vic2NyaXB0aW9uJCA9IGNvbXB1dGVkKCgpID0+IHRoaXMudmFsdWVDaGFuZ2VzU3Vic2NyaXB0aW9uU2lnbmFsKCkpO1xuICBcbiAgLy8gQmFja3dhcmQgY29tcGF0aWJpbGl0eTogaGFuZGxlIGJvdGggc2lnbmFsIGFuZCBwcm9wZXJ0eSBhY2Nlc3NcbiAgZ2V0IGZvcm1GaWVsZHNBcnJheSgpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtRmllbGRzKCk7XG4gIH1cbiAgXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gV2F0Y2ggZm9yIGNoYW5nZXMgaW4gaW5wdXQgc2lnbmFscyBhbmQgdXBkYXRlIHRoZSBmb3JtIGFjY29yZGluZ2x5XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGZvcm1GaWVsZHMgPSB0aGlzLmZvcm1GaWVsZHMoKTtcbiAgICAgIGNvbnN0IGZvcm1WYWx1ZXMgPSB0aGlzLmZvcm1WYWx1ZXMoKTtcbiAgICAgIFxuICAgICAgLy8gT25seSB1cGRhdGUgaWYgd2UgaGF2ZSBmb3JtIGZpZWxkcyAoZm9ybVZhbHVlcyBjYW4gYmUgZW1wdHkpXG4gICAgICBpZiAoZm9ybUZpZWxkcykge1xuICAgICAgICAvLyBVc2UgdW50cmFja2VkIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcHMgd2hlbiBzZXR0aW5nIHNpZ25hbHNcbiAgICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBmb3JtID0gdGhpcy5nZW5lcmF0ZUR5bmFtaWNGb3JtKGZvcm1GaWVsZHMsIGZvcm1WYWx1ZXMpO1xuICAgICAgICAgIHRoaXMuZHluYW1pY0Zvcm1TaWduYWwuc2V0KGZvcm0pO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIFJlLXN1YnNjcmliZSB0byBmb3JtIGNoYW5nZXNcbiAgICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlc1N1YnNjcmlwdGlvblNpZ25hbCgpPy51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIHRoaXMudmFsdWVDaGFuZ2VzU3Vic2NyaXB0aW9uU2lnbmFsLnNldChmb3JtLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoZm9ybVZhbHVlID0+IHtcbiAgICAgICAgICAgIHRoaXMub25Gb3JtVmFsdWVDaGFuZ2VzKCk7XG4gICAgICAgICAgfSkpO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIEVtaXQgZm9ybSB2YWxpZGl0eSBzdGF0dXNcbiAgICAgICAgICB0aGlzLmZvcm1WYWxpZC5lbWl0KGZvcm0udmFsaWQpO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgQVBJIHdpdGggdGhlIG5ldyBmb3JtXG4gICAgICAgICAgdGhpcy5keW5hbWljRm9ybUFQSVNpZ25hbC5zZXQoe1xuICAgICAgICAgICAgZGVmYXVsdEZvcm1WYWx1ZXM6ICgpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVEeW5hbWljRmllbGRzVmFsdWVPYmplY3QoZm9ybS52YWx1ZS5keW5hbWljRmllbGRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBCdWlsZGluZyB0aGUgZm9ybSB3aXRoIHByb3BlciBudWxsIGNoZWNrc1xuICAgIGNvbnN0IGZvcm1GaWVsZHMgPSB0aGlzLmZvcm1GaWVsZHMoKSB8fCBbXTtcbiAgICBjb25zdCBmb3JtVmFsdWVzID0gdGhpcy5mb3JtVmFsdWVzKCkgfHwge307XG4gICAgXG4gICAgLy8gT25seSBjcmVhdGUgZm9ybSBpZiB3ZSBoYXZlIGZvcm0gZmllbGRzXG4gICAgaWYgKGZvcm1GaWVsZHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZm9ybSA9IHRoaXMuZ2VuZXJhdGVEeW5hbWljRm9ybShmb3JtRmllbGRzLCBmb3JtVmFsdWVzKTtcbiAgICAgIHRoaXMuZHluYW1pY0Zvcm1TaWduYWwuc2V0KGZvcm0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDcmVhdGUgYW4gZW1wdHkgZm9ybSBhcyBmYWxsYmFja1xuICAgICAgY29uc3QgZW1wdHlGb3JtID0gbmV3IFVudHlwZWRGb3JtR3JvdXAoe1xuICAgICAgICBkeW5hbWljRmllbGRzOiBuZXcgVW50eXBlZEZvcm1BcnJheShbXSlcbiAgICAgIH0pO1xuICAgICAgdGhpcy5keW5hbWljRm9ybVNpZ25hbC5zZXQoZW1wdHlGb3JtKTtcbiAgICB9XG5cbiAgICAvLyBTdWJzY3JpYmluZyB0byBmb3JtIGNoYW5nZXMgYW5kIGVtaXRpbmcgdmFsdWVzLlxuICAgIGNvbnN0IGN1cnJlbnRGb3JtID0gdGhpcy5keW5hbWljRm9ybVNpZ25hbCgpO1xuICAgIGlmIChjdXJyZW50Rm9ybSkge1xuICAgICAgdGhpcy52YWx1ZUNoYW5nZXNTdWJzY3JpcHRpb25TaWduYWwuc2V0KGN1cnJlbnRGb3JtLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoZm9ybVZhbHVlID0+IHtcbiAgICAgICAgdGhpcy5vbkZvcm1WYWx1ZUNoYW5nZXMoKTtcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICAvL2FwaSB0byBleHBvc2UgZnVuY3Rpb25zXG4gICAgdGhpcy5keW5hbWljRm9ybUFQSVNpZ25hbC5zZXQoe1xuICAgICAgZGVmYXVsdEZvcm1WYWx1ZXM6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVEeW5hbWljRmllbGRzVmFsdWVPYmplY3QodGhpcy5keW5hbWljRm9ybSgpLnZhbHVlLmR5bmFtaWNGaWVsZHMpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuZm9ybUluaXRpYWxpemVkLmVtaXQodGhpcy5keW5hbWljRm9ybUFQSSgpKTtcbiAgICB0aGlzLmZvcm1WYWxpZC5lbWl0KHRoaXMuZHluYW1pY0Zvcm0oKS52YWxpZCk7XG4gIH1cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZUNoYW5nZXNTdWJzY3JpcHRpb24kKCk/LnVuc3Vic2NyaWJlKCk7XG4gIH1cbiAgb25Gb3JtVmFsdWVDaGFuZ2VzKCk6IHZvaWQge1xuICAgIGxldCBmb3JtVmFsdWVzID0gdGhpcy5nZW5lcmF0ZUR5bmFtaWNGaWVsZHNWYWx1ZU9iamVjdCh0aGlzLmR5bmFtaWNGb3JtKCkudmFsdWUuZHluYW1pY0ZpZWxkcyk7XG4gICAgdGhpcy5mb3JtVmFsaWQuZW1pdCh0aGlzLmR5bmFtaWNGb3JtKCkudmFsaWQpO1xuICAgIHRoaXMuZm9ybVVwZGF0ZWQuZW1pdChmb3JtVmFsdWVzKTtcbiAgICBjb25zb2xlLmxvZyhmb3JtVmFsdWVzKVxuICB9XG4gIGdlbmVyYXRlRHluYW1pY0ZpZWxkc1ZhbHVlT2JqZWN0KGZvcm1WYWx1ZXM6IEFycmF5PGFueT4pOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHtcbiAgICBsZXQgZHluYW1pY0ZpZWxkc1ZhbHVlID0ge307XG4gICAgZm9ybVZhbHVlcy5mb3JFYWNoKChmaWVsZFZhbHVlLCBpbmRleCkgPT4ge1xuICAgICAgaWYodHlwZW9mIGZpZWxkVmFsdWU/LnZhbHVlID09PSAnc3RyaW5nJykgZmllbGRWYWx1ZS52YWx1ZSA9IGZpZWxkVmFsdWU/LnZhbHVlPy50cmltKClcbiAgICAgIGxldCBmb3JtYXR0ZWRWYWx1ZSA9IHRoaXMubWFwRm9ybUZpZWxkVG9Gb3JtVmFsdWUodGhpcy5mb3JtRmllbGRzKClbaW5kZXhdLCBmaWVsZFZhbHVlLnZhbHVlKTtcbiAgICAgIGlmIChmaWVsZFZhbHVlLnN1YkZpZWxkcz8ubGVuZ3RoID4gMCkge1xuICAgICAgICBsZXQgZm9ybWF0dGVkU3ViRmllbGRzVmFsdWVzID0ge31cbiAgICAgICAgbGV0IHN1YkZpZWxkID0gdGhpcy5mb3JtRmllbGRzKClbaW5kZXhdLnN1YkZpZWxkc1xuICAgICAgICBpZih0aGlzLmZvcm1GaWVsZHMoKVtpbmRleF0uZmllbGRUeXBlID09PSAnc2luZ2xlU2VsZWN0JyB8fCB0aGlzLmZvcm1GaWVsZHMoKVtpbmRleF0uZmllbGRUeXBlID09PSAnbXVsdGlTZWxlY3QnKSB7XG4gICAgICAgICAgc3ViRmllbGQgPSBzdWJGaWVsZC5maWx0ZXIoKHN1YkZpZWxkKSA9PiBzdWJGaWVsZC5wYXJlbnRDb25maWdWYWx1ZSA9PT0gZmllbGRWYWx1ZS52YWx1ZS52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZmllbGRWYWx1ZS5zdWJGaWVsZHMuZm9yRWFjaCgoc3ViRmllbGRWYWx1ZSwgc3ViSW5kZXgpID0+IHtcbiAgICAgICAgICBsZXQgc3ViRm9ybUZpZWxkID0gc3ViRmllbGRbc3ViSW5kZXhdXG4gICAgICAgICAgaWYodHlwZW9mIHN1YkZpZWxkVmFsdWU/LnZhbHVlID09PSAnc3RyaW5nJykgc3ViRmllbGRWYWx1ZS52YWx1ZSA9IHN1YkZpZWxkVmFsdWU/LnZhbHVlPy50cmltKClcbiAgICAgICAgICBmb3JtYXR0ZWRTdWJGaWVsZHNWYWx1ZXNbc3ViRm9ybUZpZWxkLmNvbmZpZ05hbWVdID0gdGhpcy5tYXBGb3JtRmllbGRUb0Zvcm1WYWx1ZShzdWJGb3JtRmllbGQsIHN1YkZpZWxkVmFsdWUpXG4gICAgICAgIH0pXG4gICAgICAgIGR5bmFtaWNGaWVsZHNWYWx1ZVt0aGlzLmZvcm1GaWVsZHMoKVtpbmRleF0uY29uZmlnTmFtZV0gPSB7XG4gICAgICAgICAgdmFsdWU6IGZvcm1hdHRlZFZhbHVlLFxuICAgICAgICAgIHN1YkZpZWxkczogZm9ybWF0dGVkU3ViRmllbGRzVmFsdWVzXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBkeW5hbWljRmllbGRzVmFsdWVbdGhpcy5mb3JtRmllbGRzKClbaW5kZXhdLmNvbmZpZ05hbWVdID0gZm9ybWF0dGVkVmFsdWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGR5bmFtaWNGaWVsZHNWYWx1ZTtcbiAgfVxuICBnZW5lcmF0ZUR5bmFtaWNGb3JtKFxuICAgIGZvcm1GaWVsZHM6IEFycmF5PE5zRHluYW1pY0Zvcm0uSUR5bmFtaWNGaWVsZD4sXG4gICAgZm9ybVZhbHVlczogeyBba2V5OiBzdHJpbmddOiBhbnkgfVxuICApOiBVbnR5cGVkRm9ybUdyb3VwIHtcbiAgICBsZXQgZm9ybUFycmF5ID0gbmV3IFVudHlwZWRGb3JtQXJyYXkoW10pXG5cbiAgICBmb3IgKGxldCBmaWVsZCBvZiBmb3JtRmllbGRzKSB7XG4gICAgICBsZXQgZmllbGRWYWx1ZSA9IGZvcm1WYWx1ZXNbZmllbGQuY29uZmlnTmFtZV07XG4gICAgICBsZXQgZmllbGRDb250cm9sID0gdGhpcy5tYXBGb3JtVmFsdWVUb0Zvcm1GaWVsZChmaWVsZCwgZmllbGRWYWx1ZSk7XG4gICAgICBsZXQgc3ViRmllbGRzQ29udHJvbHMgPSB0aGlzLmdlbmVyYXRlU3ViRHluYW1pY0ZpZWxkcyhmb3JtVmFsdWVzLCBmaWVsZCwgZmllbGRDb250cm9sLnZhbHVlKTtcbiAgICAgIGZvcm1BcnJheS5wdXNoKG5ldyBVbnR5cGVkRm9ybUdyb3VwKHtcbiAgICAgICAgdmFsdWU6IGZpZWxkQ29udHJvbCxcbiAgICAgICAgc3ViRmllbGRzOiBzdWJGaWVsZHNDb250cm9sc1xuICAgICAgfSkpXG4gICAgfSAgXG4gICAgcmV0dXJuIG5ldyBVbnR5cGVkRm9ybUdyb3VwKHtcbiAgICAgIGR5bmFtaWNGaWVsZHM6IGZvcm1BcnJheVxuICAgIH0pXG4gIH1cbiAgXG4gIGdldER5bmFtaWNGaWVsZHNDb250cm9scygpOiBVbnR5cGVkRm9ybUFycmF5IHtcbiAgICByZXR1cm4gdGhpcy5keW5hbWljRm9ybSgpLmdldChcImR5bmFtaWNGaWVsZHNcIikgYXMgVW50eXBlZEZvcm1BcnJheTtcbiAgfVxuICB1cGRhdGVTdWJEeW5hbWljRmllbGRzKFxuICAgIGZpZWxkOiBOc0R5bmFtaWNGb3JtLklEeW5hbWljRmllbGQsXG4gICAgZm9ybUdyb3VwOiBVbnR5cGVkRm9ybUdyb3VwLFxuICAgIHZhbHVlOiBhbnlcbiAgKTogdm9pZCB7XG4gICAgaWYgKGZpZWxkLnN1YkZpZWxkcz8ubGVuZ3RoID4gMCkge1xuICAgICAgbGV0IHN1YkZpZWxkc0NvbnRyb2xzID0gdGhpcy5nZW5lcmF0ZVN1YkR5bmFtaWNGaWVsZHModGhpcy5mb3JtVmFsdWVzLCBmaWVsZCwgdmFsdWUpO1xuICAgICAgZm9ybUdyb3VwLnJlbW92ZUNvbnRyb2woJ3N1YkZpZWxkcycpXG4gICAgICBmb3JtR3JvdXAuYWRkQ29udHJvbCgnc3ViRmllbGRzJywgc3ViRmllbGRzQ29udHJvbHMpXG4gICAgfVxuICB9XG4gIHVwZGF0ZVNlbGVjdGVkVmFsdWVGb3JTaW5nbGVTZWxlY3QoXG4gICAgZmllbGQ6IE5zRHluYW1pY0Zvcm0uSUR5bmFtaWNGaWVsZCxcbiAgICBjb250cm9sOiBVbnR5cGVkRm9ybUNvbnRyb2wsXG4gICAgZm9ybUdyb3VwOiBVbnR5cGVkRm9ybUdyb3VwLFxuICAgIHZhbHVlOiBhbnlcbiAgKTogdm9pZCB7XG4gICAgaWYgKGNvbnRyb2wudmFsdWU/LnZhbHVlICE9PSB2YWx1ZS52YWx1ZSkge1xuICAgICAgY29udHJvbC5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuICAgIGVsc2UgY29udHJvbC5zZXRWYWx1ZSgnJyk7XG4gICAgdGhpcy51cGRhdGVTdWJEeW5hbWljRmllbGRzKGZpZWxkLCBmb3JtR3JvdXAsIHZhbHVlKTtcbiAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcbiAgfVxuICB1cGRhdGVTZWxlY3RlZFZhbHVlRm9yTXVsdGlTZWxlY3QoXG4gICAgZmllbGQ6IE5zRHluYW1pY0Zvcm0uSUR5bmFtaWNGaWVsZCxcbiAgICBjb250cm9sOiBVbnR5cGVkRm9ybUNvbnRyb2wsXG4gICAgZm9ybUdyb3VwOiBVbnR5cGVkRm9ybUdyb3VwLFxuICAgIHZhbHVlczogQXJyYXk8YW55PlxuICApOiB2b2lkIHtcbiAgICBsZXQgc2VsZWN0ZWRWYWx1ZXM6IEFycmF5PHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IGFueSB9PiA9IGNvbnRyb2wudmFsdWU7XG4gICAgZm9yIChsZXQgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICBsZXQgaXRlbUluZGV4ID0gc2VsZWN0ZWRWYWx1ZXMuZmluZEluZGV4KGl0ZW0gPT4gaXRlbS5sYWJlbCA9PT0gdmFsdWUubGFiZWwpO1xuICAgICAgaWYgKGl0ZW1JbmRleCA+IC0xKSB7XG4gICAgICAgIHNlbGVjdGVkVmFsdWVzLnNwbGljZShpdGVtSW5kZXgsIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZWN0ZWRWYWx1ZXMucHVzaCh7IC4uLnZhbHVlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBjb250cm9sLnNldFZhbHVlKHNlbGVjdGVkVmFsdWVzKTtcbiAgICB0aGlzLnVwZGF0ZVN1YkR5bmFtaWNGaWVsZHMoZmllbGQsIGZvcm1Hcm91cCwgdmFsdWVzKTtcbiAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcbiAgfVxuICBpc0NoZWNrQm94U2VsZWN0ZWQodmFsdWU6IHN0cmluZywgc2VsZWN0ZWRWYWx1ZXM6IEFycmF5PHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9Pik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzZWxlY3RlZFZhbHVlcy5maW5kSW5kZXgoaXRlbSA9PiBpdGVtLmxhYmVsID09PSB2YWx1ZSkgPiAtMTtcbiAgfVxuXG4gIGZpbmRTZWxlY3RlZFN1YkZpZWxkQ29uZmlnKHN1YmZpZWxkcywgdmFsdWUsIHN1YkZpZWxkSW5kZXgpIHtcbiAgICB0cnl7XG4gICAgICBjb25zdCBzZWxlY3RlZFN1YkZpZWxkQ29uZmlnID0gc3ViZmllbGRzLmZpbHRlcihpdGVtID0+IGl0ZW0ucGFyZW50Q29uZmlnVmFsdWUgPT09IHZhbHVlKVtzdWJGaWVsZEluZGV4XTtcbiAgICAgIHJldHVybiBzZWxlY3RlZFN1YkZpZWxkQ29uZmlnO1xuICAgIH1cbiAgICBjYXRjaChlKXtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU3ViZmllbGQgaW5kZXggbm90IGZvdW5kJyk7XG4gICAgfVxuICB9XG5cbiAgbWF0Y2hQYXJlbnRDb25maWcoc3ViZmllbGRzLCB2YWx1ZSkge1xuICAgIGlmICghc3ViZmllbGRzIHx8IHN1YmZpZWxkcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHN1YmZpZWxkcy5zb21lKGl0ZW0gPT4gaXRlbS5wYXJlbnRDb25maWdWYWx1ZSA9PT0gdmFsdWUpO1xuICB9XG5cbiAgZ2VuZXJhdGVTdWJEeW5hbWljRmllbGRzKFxuICAgIGZvcm1WYWx1ZXM6IGFueSxcbiAgICBwYXJlbnRGaWVsZDogTnNEeW5hbWljRm9ybS5JRHluYW1pY0ZpZWxkLFxuICAgIHBhcmVudFZhbHVlOiBBcnJheTx7IGxhYmVsOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfT4gfCB7bGFiZWw6IHN0cmluZywgdmFsdWU6IHN0cmluZyB9IHwgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhblxuICApOiBVbnR5cGVkRm9ybUFycmF5IHtcbiAgICBsZXQgY29udHJvbHMgPSBuZXcgVW50eXBlZEZvcm1BcnJheShbXSlcbiAgICBsZXQgc3ViRmllbGRzID0gcGFyZW50RmllbGQuc3ViRmllbGRzXG4gICAgbGV0IHN1YkZpZWxkc1ZhbHVlcyA9IGZvcm1WYWx1ZXNbcGFyZW50RmllbGQuY29uZmlnTmFtZV0/LnN1YkZpZWxkcyA/IGZvcm1WYWx1ZXNbcGFyZW50RmllbGQuY29uZmlnTmFtZV0uc3ViRmllbGRzIDoge31cbiAgICBpZighc3ViRmllbGRzKSByZXR1cm4gY29udHJvbHM7XG4gICAgaWYgKHBhcmVudEZpZWxkLmZpZWxkVHlwZSA9PT0gJ3NpbmdsZVNlbGVjdCcpIHtcbiAgICAgIHN1YkZpZWxkcyA9IHN1YkZpZWxkcy5maWx0ZXIoKHN1YkZpZWxkKSA9PiBzdWJGaWVsZC5wYXJlbnRDb25maWdWYWx1ZSA9PT0gKDx7bGFiZWw6IHN0cmluZywgdmFsdWU6IHN0cmluZyB9PnBhcmVudFZhbHVlKT8udmFsdWUpO1xuICAgIH1cbiAgICBlbHNlIGlmIChwYXJlbnRGaWVsZC5maWVsZFR5cGUgPT09ICdtdWx0aVNlbGVjdCcpIHtcbiAgICAgIGxldCBwYXJlbnRWYWx1ZXMgPSBuZXcgU2V0KCg8QXJyYXk8eyBsYWJlbDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIH0+PnBhcmVudFZhbHVlKS5tYXAoKHZhbHVlKSA9PiB2YWx1ZS52YWx1ZSkpO1xuICAgICAgc3ViRmllbGRzID0gc3ViRmllbGRzLmZpbHRlcigoc3ViRmllbGQpID0+IHBhcmVudFZhbHVlcy5oYXMoc3ViRmllbGQucGFyZW50Q29uZmlnVmFsdWUpKTtcbiAgICB9XG5cbiAgICBpZiAoc3ViRmllbGRzPy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAobGV0IHN1YkZpZWxkIG9mIHN1YkZpZWxkcykge1xuICAgICAgICAgIGNvbnRyb2xzLnB1c2godGhpcy5tYXBGb3JtVmFsdWVUb0Zvcm1GaWVsZChzdWJGaWVsZCwgc3ViRmllbGRzVmFsdWVzW3N1YkZpZWxkLmNvbmZpZ05hbWVdKSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIHJldHVybiBjb250cm9scztcbiAgfVxuICBtYXBGb3JtVmFsdWVUb0Zvcm1GaWVsZChmb3JtRmllbGQ6IE5zRHluYW1pY0Zvcm0uSUR5bmFtaWNGaWVsZCwgZm9ybVZhbHVlOiBhbnkpOiBhbnkge1xuICAgIGxldCB2YWxpZGF0b3JzID0gZm9ybUZpZWxkLnZhbGlkYXRvcnMgPyBbZHluYW1pY0ZpZWxkVmFsaWRhdG9yKGZvcm1GaWVsZC52YWxpZGF0b3JzKV06IFtdXG4gICAgbGV0IGNvbnRyb2wgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKG51bGwsIHZhbGlkYXRvcnMpO1xuXG4gICAgaWYgKGZvcm1GaWVsZC5maWVsZFR5cGUgPT09IFwiaW5wdXRcIikge1xuICAgICAgaWYgKGZvcm1GaWVsZC5maWVsZElucHV0VHlwZSA9PT0gXCJ0ZXh0XCIgfHwgZm9ybUZpZWxkLmZpZWxkSW5wdXRUeXBlID09PSBcInRleHRhcmVhXCIpIGNvbnRyb2wuc2V0VmFsdWUoZm9ybVZhbHVlID8gZm9ybVZhbHVlIDogXCJcIik7XG4gICAgICBlbHNlIGlmIChmb3JtRmllbGQuZmllbGRJbnB1dFR5cGUgPT09IFwibnVtYmVyXCIpIGNvbnRyb2wuc2V0VmFsdWUoZm9ybVZhbHVlID8gZm9ybVZhbHVlIDogMCk7XG4gICAgICBlbHNlIGlmIChmb3JtRmllbGQuZmllbGRJbnB1dFR5cGUgPT09IFwiZGF0ZVwiKSB7XG4gICAgICAgIGlmIChmb3JtVmFsdWUgJiYgdHlwZW9mIGZvcm1WYWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIGNvbnN0IHRpbWV6b25lID0gKGZvcm1GaWVsZC5maWVsZENvbmZpZyAmJiBmb3JtRmllbGQuZmllbGRDb25maWcudGltZXpvbmUpIHx8ICdBc2lhL0tvbGthdGEnO1xuICAgICAgICAgIGNvbnN0IGZvcm1hdCA9IChmb3JtRmllbGQuZmllbGRDb25maWcgJiYgZm9ybUZpZWxkLmZpZWxkQ29uZmlnLmZvcm1hdCkgfHwgJ0REL01NL1lZWVknO1xuICAgICAgICAgIGNvbnRyb2wuc2V0VmFsdWUoZGF5anMoZm9ybVZhbHVlKS50eih0aW1lem9uZSkuZm9ybWF0KGZvcm1hdCkpO1xuICAgICAgICB9IGVsc2UgaWYgKGZvcm1WYWx1ZSAmJiB0eXBlb2YgZm9ybVZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgY29uc3QgdGltZXpvbmUgPSAoZm9ybUZpZWxkLmZpZWxkQ29uZmlnICYmIGZvcm1GaWVsZC5maWVsZENvbmZpZy50aW1lem9uZSkgfHwgJ0FzaWEvS29sa2F0YSc7XG4gICAgICAgICAgY29uc3QgZm9ybWF0ID0gKGZvcm1GaWVsZC5maWVsZENvbmZpZyAmJiBmb3JtRmllbGQuZmllbGRDb25maWcuZm9ybWF0KSB8fCAnREQvTU0vWVlZWSc7XG4gICAgICAgICAgY29udHJvbC5zZXRWYWx1ZShkYXlqcy50eihmb3JtVmFsdWUsIGZvcm1hdCwgdGltZXpvbmUpLmZvcm1hdChmb3JtYXQpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCB0aW1lem9uZSA9IChmb3JtRmllbGQuZmllbGRDb25maWcgJiYgZm9ybUZpZWxkLmZpZWxkQ29uZmlnLnRpbWV6b25lKSB8fCAnQXNpYS9Lb2xrYXRhJztcbiAgICAgICAgICBjb25zdCBmb3JtYXQgPSAoZm9ybUZpZWxkLmZpZWxkQ29uZmlnICYmIGZvcm1GaWVsZC5maWVsZENvbmZpZy5mb3JtYXQpIHx8ICdERC9NTS9ZWVlZJztcbiAgICAgICAgICBjb250cm9sLnNldFZhbHVlKGRheWpzKCkudHoodGltZXpvbmUpLmZvcm1hdChmb3JtYXQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZm9ybUZpZWxkLmZpZWxkVHlwZSA9PT0gXCJzaW5nbGVTZWxlY3RcIikge1xuICAgICAgY29uc3QgZmluZFNlbGVjdGVkVmFsdWUgPSAoKSA9PiB7XG4gICAgICAgIGxldCBpbmRleCA9IGZvcm1GaWVsZC5pdGVtc0xpc3QuZmluZEluZGV4KGl0ZW0gPT4gaXRlbS52YWx1ZSA9PT0gZm9ybVZhbHVlKVxuICAgICAgICByZXR1cm4gaW5kZXggPj0gMCA/IGZvcm1GaWVsZC5pdGVtc0xpc3RbaW5kZXhdOiBcIlwiO1xuICAgICAgfVxuICAgICAgaWYgKGZvcm1GaWVsZC5maWVsZElucHV0VHlwZSA9PT0gXCJkcm9wZG93blwiKSB7XG4gICAgICAgIGlmICghZm9ybVZhbHVlKSBjb250cm9sLnNldFZhbHVlKGZvcm1GaWVsZC5pdGVtc0xpc3RbMF0pO1xuICAgICAgICBlbHNlIGNvbnRyb2wuc2V0VmFsdWUoZmluZFNlbGVjdGVkVmFsdWUoKSlcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGZvcm1GaWVsZC5maWVsZElucHV0VHlwZSA9PT0gXCJyYWRpb1wiKSB7XG4gICAgICAgIGNvbnRyb2wuc2V0VmFsdWUoZmluZFNlbGVjdGVkVmFsdWUoKSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZvcm1GaWVsZC5maWVsZFR5cGUgPT09IFwibXVsdGlTZWxlY3RcIikge1xuICAgICAgaWYgKGZvcm1WYWx1ZSAmJiBBcnJheS5pc0FycmF5KGZvcm1WYWx1ZSkpIHtcbiAgICAgICAgbGV0IHNlbGVjdGVkVmFsdWVzID0gW107XG4gICAgICAgIGZvciAobGV0IHZhbHVlIG9mIGZvcm1WYWx1ZSkge1xuICAgICAgICAgIGxldCBpbmRleCA9IGZvcm1GaWVsZC5pdGVtc0xpc3QuZmluZEluZGV4KGl0ZW0gPT4gaXRlbS52YWx1ZSA9PT0gdmFsdWUpO1xuICAgICAgICAgIGlmIChpbmRleCA+IC0xKSBzZWxlY3RlZFZhbHVlcy5wdXNoKHsgLi4uZm9ybUZpZWxkLml0ZW1zTGlzdFtpbmRleF0gfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29udHJvbC5zZXRWYWx1ZShzZWxlY3RlZFZhbHVlcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250cm9sLnNldFZhbHVlKFtdKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZvcm1GaWVsZC5maWVsZFR5cGUgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBjb250cm9sLnNldFZhbHVlKCEhZm9ybVZhbHVlKTtcbiAgICB9IGVsc2UgY29udHJvbC5zZXRWYWx1ZShudWxsKTtcbiAgICByZXR1cm4gY29udHJvbDtcbiAgfVxuICBtYXBGb3JtRmllbGRUb0Zvcm1WYWx1ZShmb3JtRmllbGQ6IE5zRHluYW1pY0Zvcm0uSUR5bmFtaWNGaWVsZCwgZm9ybVZhbHVlOiBhbnkpOiBhbnkge1xuICAgIGlmIChmb3JtRmllbGQuZmllbGRUeXBlID09PSBcImlucHV0XCIpIHtcbiAgICAgIGlmIChmb3JtRmllbGQuZmllbGRJbnB1dFR5cGUgPT09IFwidGV4dFwiIHx8IGZvcm1GaWVsZC5maWVsZElucHV0VHlwZSA9PT0gXCJ0ZXh0YXJlYVwiKSByZXR1cm4gZm9ybVZhbHVlO1xuICAgICAgZWxzZSBpZiAoZm9ybUZpZWxkLmZpZWxkSW5wdXRUeXBlID09PSBcIm51bWJlclwiKSByZXR1cm4gK2Zvcm1WYWx1ZTtcbiAgICAgIGVsc2UgaWYgKGZvcm1GaWVsZC5maWVsZElucHV0VHlwZSA9PT0gXCJkYXRlXCIpIHtcbiAgICAgICAgY29uc3QgZm9ybWF0ID0gKGZvcm1GaWVsZC5maWVsZENvbmZpZyAmJiBmb3JtRmllbGQuZmllbGRDb25maWcuZm9ybWF0KSB8fCAnREQvTU0vWVlZWSc7XG4gICAgICAgIGNvbnN0IHRpbWV6b25lID0gKGZvcm1GaWVsZC5maWVsZENvbmZpZyAmJiBmb3JtRmllbGQuZmllbGRDb25maWcudGltZXpvbmUpIHx8ICdBc2lhL0tvbGthdGEnO1xuICAgICAgICByZXR1cm4gZGF5anMudHooZm9ybVZhbHVlLCBmb3JtYXQsIHRpbWV6b25lKS52YWx1ZU9mKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmb3JtRmllbGQuZmllbGRUeXBlID09PSBcInNpbmdsZVNlbGVjdFwiKSB7XG4gICAgICByZXR1cm4gZm9ybVZhbHVlPy52YWx1ZSA/PyAnJztcbiAgICB9IGVsc2UgaWYgKGZvcm1GaWVsZC5maWVsZFR5cGUgPT09IFwibXVsdGlTZWxlY3RcIikge1xuICAgICAgcmV0dXJuIGZvcm1WYWx1ZT8ubWFwKGl0ZW0gPT4gaXRlbS52YWx1ZSk7XG4gICAgfSBlbHNlIGlmIChmb3JtRmllbGQuZmllbGRUeXBlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgcmV0dXJuIGZvcm1WYWx1ZTtcbiAgICB9IGVsc2UgcmV0dXJuIGZvcm1WYWx1ZTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZHluYW1pY0ZpZWxkVmFsaWRhdG9yID0gKHZhbGlkYXRvcnM6IEFycmF5PE5zRHluYW1pY0Zvcm0uSUR5bmFtaWNGaWVsZFZhbGlkYXRvcj4pOiBWYWxpZGF0b3JGbiA9PiB7XG4gIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgIGxldCB2YWx1ZSA9IGNvbnRyb2wudmFsdWVcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlPy52YWx1ZSA/IHZhbHVlLnZhbHVlIDogJydcbiAgICB9XG4gICAgbGV0IGVycm9ycyA9IG51bGxcblxuICAgIHZhbGlkYXRvcnMuZm9yRWFjaCgodmFsaWRhdG9yKSA9PiB7XG4gICAgICBsZXQgZXJyb3IgPSBudWxsXG4gICAgICBsZXQgbWVzc2FnZSA9IHZhbGlkYXRvci5tZXNzYWdlXG4gICAgICBzd2l0Y2ggKHZhbGlkYXRvci50eXBlKSB7XG4gICAgICAgIGNhc2UgXCJSZXF1aXJlZFwiOlxuICAgICAgICAgIGVycm9yID0gVmFsaWRhdG9ycy5yZXF1aXJlZChjb250cm9sKTtcbiAgICAgICAgICBpZiAoIWVycm9yICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUudHJpbSgpID09PSAnJykge1xuICAgICAgICAgICAgZXJyb3IgPSB7IFJlcXVpcmVkOiBtZXNzYWdlIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKGVycm9yKSBlcnJvciA9IHtSZXF1aXJlZDogbWVzc2FnZX1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIk1pbkxlbmd0aFwiOlxuICAgICAgICAgIGVycm9yID0gVmFsaWRhdG9ycy5taW5MZW5ndGgoK3ZhbGlkYXRvci52YWx1ZSkoY29udHJvbClcbiAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKCckezB9JywgZXJyb3I/Lm1pbmxlbmd0aC5yZXF1aXJlZExlbmd0aClcbiAgICAgICAgICBpZihlcnJvcikgZXJyb3IgPSB7IE1pbkxlbmd0aDogbWVzc2FnZSB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJNYXhMZW5ndGhcIjpcbiAgICAgICAgICBlcnJvciA9IFZhbGlkYXRvcnMubWF4TGVuZ3RoKCt2YWxpZGF0b3IudmFsdWUpKGNvbnRyb2wpXG4gICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZSgnJHswfScsIGVycm9yPy5hY3R1YWxMZW5ndGgpXG4gICAgICAgICAgaWYoZXJyb3IpIGVycm9yID0geyBNYXhMZW5ndGg6IG1lc3NhZ2UgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiRW1haWxcIjpcbiAgICAgICAgICBlcnJvciA9IFZhbGlkYXRvcnMuZW1haWwoY29udHJvbClcbiAgICAgICAgICBpZihlcnJvcikgZXJyb3IgPSB7RW1haWw6IG1lc3NhZ2V9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJDdXN0b21cIjpcbiAgICAgICAgICBlcnJvciA9IFZhbGlkYXRvcnMucGF0dGVybihgJHt2YWxpZGF0b3IudmFsdWV9YCkoY29udHJvbClcbiAgICAgICAgICBpZihlcnJvcikgZXJyb3IgPSB7Q3VzdG9tOiBtZXNzYWdlfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGVycm9yKSBlcnJvcnMgPSB7IC4uLmVycm9ycywgLi4uZXJyb3IgfVxuICAgIH0pXG4gICAgcmV0dXJuIGVycm9yc1xuICB9XG59IiwiPGZvcm0gW2Zvcm1Hcm91cF09XCJkeW5hbWljRm9ybSgpXCI+XG4gIDxuZy1jb250YWluZXIgZm9ybUFycmF5TmFtZT1cImR5bmFtaWNGaWVsZHNcIj5cbiAgICA8bmctY29udGFpbmVyIFtmb3JtR3JvdXBOYW1lXT1cImlcIiAqbmdGb3I9XCJsZXQgZmllbGRDb250cm9sIG9mIGdldER5bmFtaWNGaWVsZHNDb250cm9scygpLmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZHluYW1pY0ZpZWxkXCJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAkaW1wbGljaXQ6IGZvcm1GaWVsZHNBcnJheT8uW2ldLFxuICAgICAgICAgIGZvcm1Hcm91cDogZmllbGRDb250cm9sLFxuICAgICAgICAgIGNvbnRyb2w6IGZpZWxkQ29udHJvbC5jb250cm9scy52YWx1ZVxuICAgICAgICB9XCJcbiAgICAgID5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPGRpdiBjbGFzcz1cInN1Yi1keW5hbWljLWZvcm1cIiAqbmdJZj1cImZpZWxkQ29udHJvbD8udmFsdWUgJiYgKCEhZm9ybUZpZWxkc0FycmF5Py5baV0/LnN1YkZpZWxkcyAmJiBmb3JtRmllbGRzQXJyYXk/LltpXT8uc3ViRmllbGRzPy5sZW5ndGggPiAwICYmIG1hdGNoUGFyZW50Q29uZmlnKGZvcm1GaWVsZHNBcnJheT8uW2ldPy5zdWJGaWVsZHMsIGZpZWxkQ29udHJvbD8uY29udHJvbHM/LnZhbHVlPy52YWx1ZT8udmFsdWUpKVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzdWJGaWVsZENvbnRyb2wgb2YgZmllbGRDb250cm9sLmNvbnRyb2xzLnN1YkZpZWxkcy5jb250cm9sczsgbGV0IGogPSBpbmRleFwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImR5bmFtaWNGaWVsZFwiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICAgICAgICAkaW1wbGljaXQ6IGZpbmRTZWxlY3RlZFN1YkZpZWxkQ29uZmlnKGZvcm1GaWVsZHNBcnJheT8uW2ldPy5zdWJGaWVsZHMsIGZpZWxkQ29udHJvbC5jb250cm9scy52YWx1ZS52YWx1ZS52YWx1ZSxqKSxcbiAgICAgICAgICAgICAgY29udHJvbDogc3ViRmllbGRDb250cm9sXG4gICAgICAgICAgICB9XCI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvbmctY29udGFpbmVyPlxuPC9mb3JtPlxuXG5cbjxuZy10ZW1wbGF0ZSAjZHluYW1pY0ZpZWxkIGxldC1maWVsZCBsZXQtY29udHJvbD1cImNvbnRyb2xcIiBsZXQtZm9ybWdyb3VwPVwiZm9ybUdyb3VwXCI+XG5cbiAgPCEtLSBmaWVsZFR5cGU6ICdpbnB1dCcgZmllbGRJbnB1dFR5cGU6ICd0ZXh0JyB8ICdudW1iZXInIC0tPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmllbGQuZmllbGRUeXBlID09PSAnaW5wdXQnICYmIChmaWVsZC5maWVsZElucHV0VHlwZSA9PT0gJ3RleHQnIHx8IGZpZWxkLmZpZWxkSW5wdXRUeXBlID09PSAnbnVtYmVyJylcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3VzdG9tSW5wdXRUZXh0TnVtYmVyOyBlbHNlIGRlZmF1bHRJbnB1dFRleHROdW1iZXJcIj5cbiAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjdXN0b21JbnB1dFRleHROdW1iZXJcIlxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBmaWVsZDogZmllbGQsIGNvbnRyb2w6IGNvbnRyb2wsIGZvcm1ncm91cDogZm9ybWdyb3VwIH1cIlxuICAgICAgPjwvbmctdGVtcGxhdGU+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0SW5wdXRUZXh0TnVtYmVyPlxuICAgICAgPGRpdiBjbGFzcz1cImR5bmFtaWMtZmllbGQgbXVsdGktbGluZS1maWVsZC1jb250YWluZXJcIlxuICAgICAgICBbbmdTdHlsZV09XCJ7J2JvcmRlci1ib3R0b20nOiAoZm9ybWdyb3VwPy5jb250cm9scz8uc3ViRmllbGRzPy5jb250cm9scz8ubGVuZ3RoICYmIHJlbW92ZVNlcHJhdG9yRm9yU3ViRmllbGRzKSA/ICAnbm9uZSc6Jyd9XCI+XG4gICAgICAgIDxwIGNsYXNzPVwiaDcgZmllbGQtdGl0bGUtc21cIj5cbiAgICAgICAgICB7eyBmaWVsZD8udGl0bGUgfX0gPHNwYW4gKm5nSWY9XCJmaWVsZC52YWxpZGF0b3JzICYmIGZpZWxkLnZhbGlkYXRvcnMubGVuZ3RoID4gMFwiPiAqPC9zcGFuPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4LWJhc2lzOiAxMDAlXCI+PC9kaXY+XG4gICAgICAgIDxpbnB1dCBjbGFzcz1cImlucHV0LWZpZWxkIGlwLXRleHRcIiBbdHlwZV09XCJmaWVsZC5maWVsZElucHV0VHlwZVwiIFtmb3JtQ29udHJvbF09XCJjb250cm9sXCJcbiAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVTdWJEeW5hbWljRmllbGRzKGZpZWxkLCBmb3JtZ3JvdXAsICRldmVudClcIiBcbiAgICAgICAgICBbbmdTdHlsZV09XCJ7J2JvcmRlcic6IGNvbnRyb2wudG91Y2hlZCAmJiBjb250cm9sLmVycm9ycyA/ICcxcHggc29saWQgI0IwMDAyMCc6ICcnfVwiXG4gICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpZWxkLnBsYWNlaG9sZGVyVGV4dCA/IGZpZWxkLnBsYWNlaG9sZGVyVGV4dCA6ICdJbnB1dCBUZXh0J1wiIFxuICAgICAgICAgIFttaW5dPVwiZmllbGQuZmllbGRJbnB1dFR5cGUgPT09ICdudW1iZXInID8gMCA6ICcnIFwiLz5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRyb2wudG91Y2hlZCAmJiBjb250cm9sLmVycm9yc1wiXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZHluYW1pY0ZpZWxkRXJyb3JzXCIgXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBjb250cm9sLmVycm9ycyB9XCJcbiAgICAgICAgPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvbmctY29udGFpbmVyPlxuICBcbiAgPCEtLSBmaWVsZFR5cGU6ICdpbnB1dCcgZmllbGRJbnB1dFR5cGU6ICd0ZXh0YXJlYScgLS0+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWVsZC5maWVsZFR5cGUgPT09ICdpbnB1dCcgJiYgZmllbGQuZmllbGRJbnB1dFR5cGUgPT09ICd0ZXh0YXJlYSdcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3VzdG9tSW5wdXRUZXh0YXJlYTsgZWxzZSBkZWZhdWx0SW5wdXRUZXh0YXJlYVwiPlxuICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjdXN0b21JbnB1dFRleHRhcmVhXCJcbiAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGZpZWxkOiBmaWVsZCwgY29udHJvbDogY29udHJvbCwgZm9ybWdyb3VwOiBmb3JtZ3JvdXAgfVwiXG4gICAgPjwvbmctdGVtcGxhdGU+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0SW5wdXRUZXh0YXJlYT5cbiAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLWZpZWxkIG11bHRpLWxpbmUtZmllbGQtY29udGFpbmVyXCJcbiAgICAgIFtuZ1N0eWxlXT1cInsnYm9yZGVyLWJvdHRvbSc6IChmb3JtZ3JvdXA/LmNvbnRyb2xzPy5zdWJGaWVsZHM/LmNvbnRyb2xzPy5sZW5ndGggJiYgcmVtb3ZlU2VwcmF0b3JGb3JTdWJGaWVsZHMpID8gICdub25lJzonJ31cIj5cbiAgICAgICAgPHAgY2xhc3M9XCJoNyBmaWVsZC10aXRsZS1zbVwiPlxuICAgICAgICAgIHt7IGZpZWxkLnRpdGxlIH19PHNwYW4gKm5nSWY9XCJmaWVsZC52YWxpZGF0b3JzICYmIGZpZWxkLnZhbGlkYXRvcnMubGVuZ3RoID4gMFwiPiAqPC9zcGFuPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4LWJhc2lzOiAxMDAlXCI+PC9kaXY+XG4gICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cImlucHV0LWZpZWxkIGlwLXRleHRhcmVhXCIgdHlwZT1cInRleHRcIlxuICAgICAgICAgIFtuZ1N0eWxlXT1cInsnYm9yZGVyJzogY29udHJvbC50b3VjaGVkICYmIGNvbnRyb2wuZXJyb3JzID8gJzFweCBzb2xpZCAjQjAwMDIwJzogJyd9XCJcbiAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiZmllbGQucGxhY2Vob2xkZXJUZXh0ID8gZmllbGQucGxhY2Vob2xkZXJUZXh0IDogJ0lucHV0IFRleHQnXCIgW2Zvcm1Db250cm9sXT1cImNvbnRyb2xcIiAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVTdWJEeW5hbWljRmllbGRzKGZpZWxkLCBmb3JtZ3JvdXAsICRldmVudClcIj48L3RleHRhcmVhPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250cm9sLnRvdWNoZWQgJiYgY29udHJvbC5lcnJvcnNcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJkeW5hbWljRmllbGRFcnJvcnNcIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBjb250cm9sLmVycm9ycyB9XCI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICA8L25nLWNvbnRhaW5lcj5cbiAgXG4gIDwhLS0gZmllbGRUeXBlOiAnaW5wdXQnIGZpZWxkSW5wdXRUeXBlOiAnZGF0ZScgLS0+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWVsZC5maWVsZFR5cGUgPT09ICdpbnB1dCcgJiYgZmllbGQuZmllbGRJbnB1dFR5cGUgPT09ICdkYXRlJ1wiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjdXN0b21JbnB1dERhdGU7IGVsc2UgZGVmYXVsdElucHV0RGF0ZVwiPlxuICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImN1c3RvbUlucHV0RGF0ZVwiXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGZpZWxkOiBmaWVsZCwgY29udHJvbDogY29udHJvbCwgZm9ybWdyb3VwOiBmb3JtZ3JvdXAgfVwiXG4gICAgICA+PC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRJbnB1dERhdGU+XG4gICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy1maWVsZCBzaW5nbGUtbGluZS1maWVsZC1jb250YWluZXJcIlxuICAgICAgW25nU3R5bGVdPVwieydib3JkZXItYm90dG9tJzogKGZvcm1ncm91cD8uY29udHJvbHM/LnN1YkZpZWxkcz8uY29udHJvbHM/Lmxlbmd0aCAmJiByZW1vdmVTZXByYXRvckZvclN1YkZpZWxkcykgPyAgJ25vbmUnOicnfVwiXG4gICAgICAgICpuZ0lmPVwiZmllbGQuZmllbGRUeXBlID09PSAnaW5wdXQnICYmIGZpZWxkLmZpZWxkSW5wdXRUeXBlID09PSAnZGF0ZSdcIj5cbiAgICAgICAgPHAgY2xhc3M9XCJoNlwiPlxuICAgICAgICAgIHt7IGZpZWxkLnRpdGxlIH19IDxzcGFuICpuZ0lmPVwiZmllbGQudmFsaWRhdG9ycyAmJiBmaWVsZC52YWxpZGF0b3JzLmxlbmd0aCA+IDBcIj4gKjwvc3Bhbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1waWNrZXItY29udGFpbmVyXCI+XG4gICAgICAgICAgPGlucHV0IGNsYXNzPVwiZGF0ZS1waWNrZXJcIiByZWFkb25seSBtaXNUekRwIFtkcENvbmZpZ109XCJmaWVsZC5maWVsZENvbmZpZ1wiXG4gICAgICAgICAgICAoZGF0ZUNoYW5nZSk9XCJjb250cm9sLnNldFZhbHVlKCRldmVudClcIiBbc2VsZWN0ZWREYXRlXT1cImNvbnRyb2wudmFsdWVcIiBbb2Zmc2V0WV09XCIwXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJjb250cm9sLnZhbHVlXCIgI2RwIC8+XG4gICAgICAgICAgPGltZyBhbHQ9XCJkYXRhLXBpY2tlclwiICpuZ0lmPVwiY2FsZW5kYXJJY29uVXJsKClcIiBjbGFzcz1cImRhdGUtcGlja2VyLWljb25cIiBbc3JjXT1cImNhbGVuZGFySWNvblVybCgpXCJcbiAgICAgICAgICAgIChjbGljayk9XCJkcC5jbGljaygpXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250cm9sLnRvdWNoZWQgJiYgY29udHJvbC5lcnJvcnNcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJkeW5hbWljRmllbGRFcnJvcnNcIlxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogY29udHJvbC5lcnJvcnMgfVwiPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDwhLS0gZmllbGRUeXBlOiAnYm9vbGVhbicgZmllbGRJbnB1dFR5cGU6ICd0b2dnbGUnIC0tPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmllbGQuZmllbGRUeXBlID09PSAnYm9vbGVhbicgJiYgZmllbGQuZmllbGRJbnB1dFR5cGUgPT09ICd0b2dnbGUnXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImN1c3RvbUJvb2xlYW5Ub2dnbGU7IGVsc2UgZGVmYXVsdEJvb2xlYW5Ub2dnbGVcIj5cbiAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjdXN0b21Cb29sZWFuVG9nZ2xlXCJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZmllbGQ6IGZpZWxkLCBjb250cm9sOiBjb250cm9sLCBmb3JtZ3JvdXA6IGZvcm1ncm91cCB9XCJcbiAgICAgID48L25nLXRlbXBsYXRlPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdEJvb2xlYW5Ub2dnbGU+XG4gICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy1maWVsZCBzaW5nbGUtbGluZS1maWVsZC1jb250YWluZXJcIlxuICAgICAgW25nU3R5bGVdPVwieydib3JkZXItYm90dG9tJzogKGZvcm1ncm91cD8uY29udHJvbHM/LnN1YkZpZWxkcz8uY29udHJvbHM/Lmxlbmd0aCAmJiByZW1vdmVTZXByYXRvckZvclN1YkZpZWxkcykgPyAgJ25vbmUnOicnfVwiPlxuICAgICAgICA8cCBjbGFzcz1cImg2XCI+XG4gICAgICAgICAge3sgZmllbGQudGl0bGUgfX08c3BhbiAqbmdJZj1cImZpZWxkLnZhbGlkYXRvcnMgJiYgZmllbGQudmFsaWRhdG9ycy5sZW5ndGggPiAwXCI+ICo8L3NwYW4+XG4gICAgICAgIDwvcD5cbiAgICAgICAgPG1pcy1zd2l0Y2ggW2NvbnRyb2xdPVwiY29udHJvbFwiICh2YWx1ZUNoYW5nZWQpPVwidXBkYXRlU3ViRHluYW1pY0ZpZWxkcyhmaWVsZCwgZm9ybWdyb3VwLCAkZXZlbnQpXCI+PC9taXMtc3dpdGNoPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udHJvbC50b3VjaGVkICYmIGNvbnRyb2wuZXJyb3JzXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiZHluYW1pY0ZpZWxkRXJyb3JzXCJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IGNvbnRyb2wuZXJyb3JzIH1cIj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj4gICAgXG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPCEtLSBmaWVsZFR5cGU6ICdzaW5nbGVTZWxlY3QnIGZpZWxkSW5wdXRUeXBlOiAnZHJvcGRvd24nIC0tPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmllbGQuZmllbGRUeXBlID09PSAnc2luZ2xlU2VsZWN0JyAmJiBmaWVsZC5maWVsZElucHV0VHlwZSA9PT0gJ2Ryb3Bkb3duJ1wiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjdXN0b21TaW5nbGVTZWxlY3REcm9wZG93bjsgZWxzZSBkZWZhdWx0U2luZ2xlU2VsZWN0RHJvcGRvd25cIj5cbiAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjdXN0b21TaW5nbGVTZWxlY3REcm9wZG93blwiXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGZpZWxkOiBmaWVsZCwgY29udHJvbDogY29udHJvbCwgZm9ybWdyb3VwOiBmb3JtZ3JvdXAgfVwiXG4gICAgICA+PC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRTaW5nbGVTZWxlY3REcm9wZG93bj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLWZpZWxkIHNpbmdsZS1saW5lLWZpZWxkLWNvbnRhaW5lclwiXG4gICAgICAgIFtuZ1N0eWxlXT1cInsnYm9yZGVyLWJvdHRvbSc6IChmb3JtZ3JvdXA/LmNvbnRyb2xzPy5zdWJGaWVsZHM/LmNvbnRyb2xzPy5sZW5ndGggJiYgcmVtb3ZlU2VwcmF0b3JGb3JTdWJGaWVsZHMpID8gICdub25lJzonJ31cIj5cbiAgICAgICAgPHAgY2xhc3M9XCJoNlwiPlxuICAgICAgICAgIHt7IGZpZWxkLnRpdGxlIH19PHNwYW4gKm5nSWY9XCJmaWVsZC52YWxpZGF0b3JzICYmIGZpZWxkLnZhbGlkYXRvcnMubGVuZ3RoID4gMFwiPiAqPC9zcGFuPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxkaXYgW25nQ2xhc3NdPVwieydyZW1vdmVhYmxlLWNvbnRhaW5lcicgOiBmaWVsZD8uaXNSZW1vdmVhYmxlfVwiPlxuICAgICAgICAgIDxtaXMtZHJvcGRvd24gW3NlYXJjaEVuYWJsZWRdPVwiZmFsc2VcIiBbd2lkdGhdPVwiJzE0MHB4J1wiIFtkYXRhXT1cImZpZWxkLml0ZW1zTGlzdFwiIFtzZWxlY3RlZEl0ZW1dPVwiY29udHJvbC52YWx1ZVwiXG4gICAgICAgICAgKG9uQ2hhbmdlKT1cInVwZGF0ZVNlbGVjdGVkVmFsdWVGb3JTaW5nbGVTZWxlY3QoZmllbGQsIGNvbnRyb2wsIGZvcm1ncm91cCwgJGV2ZW50KTtcIj5cbiAgICAgICAgICA8L21pcy1kcm9wZG93bj5cbiAgICAgICAgICA8aW1nICpuZ0lmPVwiZmllbGQuaXNSZW1vdmVhYmxlICYmIHJlbW92ZUljb25VcmwoKVwiIGNsYXNzPVwicmVtb3ZlLWljb25cIiBbc3JjXT1cInJlbW92ZUljb25VcmwoKVwiIChjbGljayk9XCJmaWVsZFJlbW92ZWQuZW1pdChmaWVsZClcIj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250cm9sLnRvdWNoZWQgJiYgY29udHJvbC5lcnJvcnNcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJkeW5hbWljRmllbGRFcnJvcnNcIlxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogY29udHJvbC5lcnJvcnMgfVwiPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvbmctY29udGFpbmVyID5cbiAgXG5cbiAgPCEtLSBmaWVsZFR5cGU6ICdzaW5nbGVTZWxlY3QnIGZpZWxkSW5wdXRUeXBlOiAncmFkaW8nIC0tPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmllbGQuZmllbGRUeXBlID09PSAnc2luZ2xlU2VsZWN0JyAmJiBmaWVsZC5maWVsZElucHV0VHlwZSA9PT0gJ3JhZGlvJ1wiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjdXN0b21TaW5nbGVTZWxlY3RSYWRpbzsgZWxzZSBkZWZhdWx0U2luZ2xlU2VsZWN0UmFkaW9cIj5cbiAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjdXN0b21TaW5nbGVTZWxlY3RSYWRpb1wiXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGZpZWxkOiBmaWVsZCwgY29udHJvbDogY29udHJvbCwgZm9ybWdyb3VwOiBmb3JtZ3JvdXAgfVwiXG4gICAgICA+PC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRTaW5nbGVTZWxlY3RSYWRpbz5cbiAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLWZpZWxkIG11bHRpLWxpbmUtZmllbGQtY29udGFpbmVyXCJcbiAgICAgIFtuZ1N0eWxlXT1cInsnYm9yZGVyLWJvdHRvbSc6IChmb3JtZ3JvdXA/LmNvbnRyb2xzPy5zdWJGaWVsZHM/LmNvbnRyb2xzPy5sZW5ndGggJiYgcmVtb3ZlU2VwcmF0b3JGb3JTdWJGaWVsZHMpID8gICdub25lJzonJ31cIj5cbiAgICAgICAgPHAgY2xhc3M9XCJoNyBmaWVsZC10aXRsZS1zbVwiPlxuICAgICAgICAgIHt7IGZpZWxkLnRpdGxlIH19PHNwYW4gKm5nSWY9XCJmaWVsZC52YWxpZGF0b3JzICYmIGZpZWxkLnZhbGlkYXRvcnMubGVuZ3RoID4gMFwiPiAqPC9zcGFuPlxuICAgICAgICA8L3A+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4LWJhc2lzOiAxMDAlXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJjaGVja2JveGVzLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyYWRpby1jaGVja2JveC1jb21tb25cIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmaWVsZC5pdGVtc0xpc3RcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnY2hlY2tib3gtYWN0aXZlJzogaXRlbS5sYWJlbCA9PT0gY29udHJvbC52YWx1ZT8ubGFiZWwgfVwiXG4gICAgICAgICAgICAoY2xpY2spPVwidXBkYXRlU2VsZWN0ZWRWYWx1ZUZvclNpbmdsZVNlbGVjdChmaWVsZCwgY29udHJvbCwgZm9ybWdyb3VwLCBpdGVtKTtcIj5cbiAgICAgICAgICAgIDxpbWcgKm5nSWY9XCIoaXRlbS5sYWJlbCA9PT0gY29udHJvbC52YWx1ZT8ubGFiZWwpICYmIGFjdGl2ZUJ0bkljb25VcmwoKVwiIFtzcmNdPVwiYWN0aXZlQnRuSWNvblVybCgpXCIgYWx0PVwiXCIgLz5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwiaDZcIj57eyBpdGVtLmxhYmVsIH19PC9wPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRyb2wudG91Y2hlZCAmJiBjb250cm9sLmVycm9yc1wiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImR5bmFtaWNGaWVsZEVycm9yc1wiXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBjb250cm9sLmVycm9ycyB9XCI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9uZy1jb250YWluZXI+XG4gIFxuXG4gIDwhLS0gZmllbGRUeXBlOiAnbXVsdGlTZWxlY3QnIGZpZWxkSW5wdXRUeXBlOiAnY2hlY2tib3gnIC0tPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmllbGQuZmllbGRUeXBlID09PSAnbXVsdGlTZWxlY3QnICYmIGZpZWxkLmZpZWxkSW5wdXRUeXBlID09PSAnY2hlY2tib3gnXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImN1c3RvbU11bHRpU2VsZWN0Q2hlY2tib3g7IGVsc2UgZGVmYXVsdE11bHRpU2VsZWN0Q2hlY2tib3hcIj5cbiAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjdXN0b21NdWx0aVNlbGVjdENoZWNrYm94XCJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZmllbGQ6IGZpZWxkLCBjb250cm9sOiBjb250cm9sLCBmb3JtZ3JvdXA6IGZvcm1ncm91cCB9XCJcbiAgICAgID48L25nLXRlbXBsYXRlPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdE11bHRpU2VsZWN0Q2hlY2tib3g+XG4gICAgICA8ZGl2IGNsYXNzPVwiZHluYW1pYy1maWVsZCBtdWx0aS1saW5lLWZpZWxkLWNvbnRhaW5lclwiXG4gICAgICBbbmdTdHlsZV09XCJ7J2JvcmRlci1ib3R0b20nOiAoZm9ybWdyb3VwPy5jb250cm9scz8uc3ViRmllbGRzPy5jb250cm9scz8ubGVuZ3RoICYmIHJlbW92ZVNlcHJhdG9yRm9yU3ViRmllbGRzKSA/ICAnbm9uZSc6Jyd9XCI+XG4gICAgICAgIDxwIGNsYXNzPVwiaDcgZmllbGQtdGl0bGUtc21cIj5cbiAgICAgICAgICB7eyBmaWVsZC50aXRsZSB9fTxzcGFuICpuZ0lmPVwiZmllbGQudmFsaWRhdG9ycyAmJiBmaWVsZC52YWxpZGF0b3JzLmxlbmd0aCA+IDBcIj4gKjwvc3Bhbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleC1iYXNpczogMTAwJVwiPjwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwiY2hlY2tib3hlcy1jb250YWluZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicmFkaW8tY2hlY2tib3gtY29tbW9uXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZmllbGQuaXRlbXNMaXN0XCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2NoZWNrYm94LWFjdGl2ZSc6IGlzQ2hlY2tCb3hTZWxlY3RlZChpdGVtLmxhYmVsLCBjb250cm9sLnZhbHVlKSB9XCJcbiAgICAgICAgICAgIChjbGljayk9XCJ1cGRhdGVTZWxlY3RlZFZhbHVlRm9yTXVsdGlTZWxlY3QoZmllbGQsIGNvbnRyb2wsIGZvcm1ncm91cCwgW2l0ZW1dKVwiPlxuICAgICAgICAgICAgPGltZyAqbmdJZj1cImlzQ2hlY2tCb3hTZWxlY3RlZChpdGVtLmxhYmVsLCBjb250cm9sLnZhbHVlKSAmJiBhY3RpdmVCdG5JY29uVXJsKClcIiBbc3JjXT1cImFjdGl2ZUJ0bkljb25VcmwoKVwiXG4gICAgICAgICAgICAgIGFsdD1cIlwiIC8+XG4gICAgICAgICAgICA8cCBjbGFzcz1cImg2XCI+e3sgaXRlbS5sYWJlbCB9fTwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250cm9sLnRvdWNoZWQgJiYgY29udHJvbC5lcnJvcnNcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJkeW5hbWljRmllbGRFcnJvcnNcIlxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogY29udHJvbC5lcnJvcnMgfVwiPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvbmctY29udGFpbmVyPlxuXG5cbiAgPCEtLSBmaWVsZFR5cGU6ICdtdWx0aVNlbGVjdCcgZmllbGRJbnB1dFR5cGU6ICdkcm9wZG93bicgLS0+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWVsZC5maWVsZFR5cGUgPT09ICdtdWx0aVNlbGVjdCcgJiYgZmllbGQuZmllbGRJbnB1dFR5cGUgPT09ICdkcm9wZG93bidcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3VzdG9tTXVsdGlTZWxlY3REcm9wZG93bjsgZWxzZSBkZWZhdWx0TXVsdGlTZWxlY3REcm9wZG93blwiPlxuICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImN1c3RvbU11bHRpU2VsZWN0RHJvcGRvd25cIlxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBmaWVsZDogZmllbGQsIGNvbnRyb2w6IGNvbnRyb2wsIGZvcm1ncm91cDogZm9ybWdyb3VwIH1cIlxuICAgICAgPjwvbmctdGVtcGxhdGU+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0TXVsdGlTZWxlY3REcm9wZG93bj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkeW5hbWljLWZpZWxkIHNpbmdsZS1saW5lLWZpZWxkLWNvbnRhaW5lclwiXG4gICAgICBbbmdTdHlsZV09XCJ7J2JvcmRlci1ib3R0b20nOiAoZm9ybWdyb3VwPy5jb250cm9scz8uc3ViRmllbGRzPy5jb250cm9scz8ubGVuZ3RoICYmIHJlbW92ZVNlcHJhdG9yRm9yU3ViRmllbGRzKSA/ICAnbm9uZSc6Jyd9XCI+XG4gICAgICAgIDxwIGNsYXNzPVwiaDZcIj5cbiAgICAgICAgICB7eyBmaWVsZC50aXRsZSB9fTxzcGFuICpuZ0lmPVwiZmllbGQudmFsaWRhdG9ycyAmJiBmaWVsZC52YWxpZGF0b3JzLmxlbmd0aCA+IDBcIj4gKjwvc3Bhbj5cbiAgICAgICAgPC9wPlxuICAgICAgICA8bWlzLW11bHRpLXNlbGVjdC1kcm9wZG93biBbd2lkdGhdPVwiJzE0MHB4J1wiIFtzaG93U2VsZWN0ZWRDb3VudF09XCJ0cnVlXCIgW2Ryb3Bkb3duTGlzdFdpZHRoXT1cIicyNTZweCdcIlxuICAgICAgICAgIFtzZWFyY2hFbmFibGVkXT1cImZhbHNlXCIgW2hpZGVBcHBseUJ1dHRvbl09XCJ0cnVlXCIgW2RhdGFdPVwiZmllbGQuaXRlbXNMaXN0XCJcbiAgICAgICAgICBbc2VsZWN0ZWRJdGVtc109XCJjb250cm9sLnZhbHVlXCIgKG9uQ2hhbmdlKT1cInVwZGF0ZVNlbGVjdGVkVmFsdWVGb3JNdWx0aVNlbGVjdChmaWVsZCwgY29udHJvbCwgZm9ybWdyb3VwLCAkZXZlbnQpO1wiPjwvbWlzLW11bHRpLXNlbGVjdC1kcm9wZG93bj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRyb2wudG91Y2hlZCAmJiBjb250cm9sLmVycm9yc1wiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImR5bmFtaWNGaWVsZEVycm9yc1wiXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBjb250cm9sLmVycm9ycyB9XCI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9uZy1jb250YWluZXI+XG5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZHluYW1pY0ZpZWxkRXJyb3JzIGxldC1lcnJvcnM+XG4gIDxkaXYgaWQ9XCJlcnJvci1tZXNzYWdlcy1jb250YWluZXJcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBlcnJvciBvZiBlcnJvcnMgfCBrZXl2YWx1ZVwiPlxuICAgICAgPHAgY2xhc3M9XCJoOFwiPlxuICAgICAgICB7e1wiIOKAoiAmbmJzcDtcIiArIGVycm9yLnZhbHVlfX1cbiAgICAgIDwvcD5cbiAgICAgIDxkaXYgW25nU3R5bGVdPVwieyAnZmxleC1iYXNpcyc6ICcxMDAlJywgJ2hlaWdodCc6ICcwJyB9XCI+PC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT4iXX0=
|