tango-app-ui-analyse-trax 3.9.82 → 3.9.84

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.
@@ -0,0 +1,612 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import { Validators } from '@angular/forms';
3
+ import { Subject, takeUntil } from 'rxjs';
4
+ import { noWhitespaceValidator } from '../../create-task/validators/whitespace-validator';
5
+ import { uniqueStringValidator } from '../../create-task/validators/unique-string-validator';
6
+ import { rangeValidator } from '../../create-task/validators/ascending-validator';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@ng-bootstrap/ng-bootstrap";
9
+ import * as i2 from "@angular/forms";
10
+ import * as i3 from "../../../services/trax.service";
11
+ import * as i4 from "tango-app-ui-global";
12
+ import * as i5 from "tango-app-ui-shared";
13
+ import * as i6 from "@angular/common";
14
+ import * as i7 from "../counter/counter.component";
15
+ function AutoTaskPopupComponent_p_13_Template(rf, ctx) { if (rf & 1) {
16
+ i0.ɵɵelementStart(0, "p", 38);
17
+ i0.ɵɵtext(1, " Task name is required.");
18
+ i0.ɵɵelementEnd();
19
+ } }
20
+ function AutoTaskPopupComponent_option_22_Template(rf, ctx) { if (rf & 1) {
21
+ i0.ɵɵelementStart(0, "option", 39);
22
+ i0.ɵɵtext(1);
23
+ i0.ɵɵelementEnd();
24
+ } if (rf & 2) {
25
+ const opt_r2 = ctx.$implicit;
26
+ i0.ɵɵproperty("value", opt_r2.value);
27
+ i0.ɵɵadvance();
28
+ i0.ɵɵtextInterpolate(opt_r2.label);
29
+ } }
30
+ function AutoTaskPopupComponent_div_23_div_3_Template(rf, ctx) { if (rf & 1) {
31
+ i0.ɵɵelementStart(0, "div", 44);
32
+ i0.ɵɵelement(1, "input", 45);
33
+ i0.ɵɵelementStart(2, "label", 46);
34
+ i0.ɵɵtext(3, "Allow Multiple Response");
35
+ i0.ɵɵelementEnd()();
36
+ } }
37
+ function AutoTaskPopupComponent_div_23_div_4_Template(rf, ctx) { if (rf & 1) {
38
+ i0.ɵɵelementStart(0, "div", 47)(1, "div", 48);
39
+ i0.ɵɵelement(2, "input", 49);
40
+ i0.ɵɵelementStart(3, "label", 50);
41
+ i0.ɵɵtext(4, "Text");
42
+ i0.ɵɵelementEnd()();
43
+ i0.ɵɵelementStart(5, "div", 51);
44
+ i0.ɵɵelement(6, "input", 52);
45
+ i0.ɵɵelementStart(7, "label", 53);
46
+ i0.ɵɵtext(8, "Number");
47
+ i0.ɵɵelementEnd()()();
48
+ } }
49
+ function AutoTaskPopupComponent_div_23_ng_container_6_div_1_div_2_Template(rf, ctx) { if (rf & 1) {
50
+ i0.ɵɵelementStart(0, "div", 58);
51
+ i0.ɵɵtext(1, "* Answer is required");
52
+ i0.ɵɵelementEnd();
53
+ } }
54
+ function AutoTaskPopupComponent_div_23_ng_container_6_div_1_Template(rf, ctx) { if (rf & 1) {
55
+ i0.ɵɵelementStart(0, "div", 55);
56
+ i0.ɵɵelement(1, "input", 56);
57
+ i0.ɵɵtemplate(2, AutoTaskPopupComponent_div_23_ng_container_6_div_1_div_2_Template, 2, 0, "div", 57);
58
+ i0.ɵɵelementEnd();
59
+ } if (rf & 2) {
60
+ let tmp_7_0;
61
+ const answer_r3 = ctx.$implicit;
62
+ const k_r4 = ctx.index;
63
+ i0.ɵɵproperty("formGroupName", k_r4);
64
+ i0.ɵɵadvance(2);
65
+ i0.ɵɵproperty("ngIf", ((tmp_7_0 = answer_r3.get("answer")) == null ? null : tmp_7_0.touched) && ((tmp_7_0 = answer_r3.get("answer")) == null ? null : tmp_7_0.invalid));
66
+ } }
67
+ function AutoTaskPopupComponent_div_23_ng_container_6_Template(rf, ctx) { if (rf & 1) {
68
+ i0.ɵɵelementContainerStart(0);
69
+ i0.ɵɵtemplate(1, AutoTaskPopupComponent_div_23_ng_container_6_div_1_Template, 3, 2, "div", 54);
70
+ i0.ɵɵelementContainerEnd();
71
+ } if (rf & 2) {
72
+ const ctx_r4 = i0.ɵɵnextContext(2);
73
+ i0.ɵɵadvance();
74
+ i0.ɵɵproperty("ngForOf", ctx_r4.answersFA.controls);
75
+ } }
76
+ function AutoTaskPopupComponent_div_23_ng_container_7_div_1_span_3_Template(rf, ctx) { if (rf & 1) {
77
+ const _r6 = i0.ɵɵgetCurrentView();
78
+ i0.ɵɵelementStart(0, "span", 62);
79
+ i0.ɵɵlistener("click", function AutoTaskPopupComponent_div_23_ng_container_7_div_1_span_3_Template_span_click_0_listener() { i0.ɵɵrestoreView(_r6); const k_r7 = i0.ɵɵnextContext().index; const ctx_r4 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r4.removeOption(k_r7)); });
80
+ i0.ɵɵtext(1, "\u00D7");
81
+ i0.ɵɵelementEnd();
82
+ } }
83
+ function AutoTaskPopupComponent_div_23_ng_container_7_div_1_div_4_Template(rf, ctx) { if (rf & 1) {
84
+ i0.ɵɵelementStart(0, "div", 58);
85
+ i0.ɵɵtext(1, "* Answer is required");
86
+ i0.ɵɵelementEnd();
87
+ } }
88
+ function AutoTaskPopupComponent_div_23_ng_container_7_div_1_Template(rf, ctx) { if (rf & 1) {
89
+ i0.ɵɵelementStart(0, "div", 55)(1, "div", 30);
90
+ i0.ɵɵelement(2, "input", 56);
91
+ i0.ɵɵtemplate(3, AutoTaskPopupComponent_div_23_ng_container_7_div_1_span_3_Template, 2, 0, "span", 61);
92
+ i0.ɵɵelementEnd();
93
+ i0.ɵɵtemplate(4, AutoTaskPopupComponent_div_23_ng_container_7_div_1_div_4_Template, 2, 0, "div", 57);
94
+ i0.ɵɵelementEnd();
95
+ } if (rf & 2) {
96
+ let tmp_8_0;
97
+ const answer_r8 = ctx.$implicit;
98
+ const k_r7 = ctx.index;
99
+ const ctx_r4 = i0.ɵɵnextContext(3);
100
+ i0.ɵɵproperty("formGroupName", k_r7);
101
+ i0.ɵɵadvance(3);
102
+ i0.ɵɵproperty("ngIf", ctx_r4.canRemoveOption());
103
+ i0.ɵɵadvance();
104
+ i0.ɵɵproperty("ngIf", ((tmp_8_0 = answer_r8.get("answer")) == null ? null : tmp_8_0.touched) && ((tmp_8_0 = answer_r8.get("answer")) == null ? null : tmp_8_0.invalid));
105
+ } }
106
+ function AutoTaskPopupComponent_div_23_ng_container_7_div_2_Template(rf, ctx) { if (rf & 1) {
107
+ i0.ɵɵelementStart(0, "div", 63);
108
+ i0.ɵɵtext(1, "Options must be unique.");
109
+ i0.ɵɵelementEnd();
110
+ } }
111
+ function AutoTaskPopupComponent_div_23_ng_container_7_div_3_Template(rf, ctx) { if (rf & 1) {
112
+ const _r9 = i0.ɵɵgetCurrentView();
113
+ i0.ɵɵelementStart(0, "div", 64);
114
+ i0.ɵɵlistener("click", function AutoTaskPopupComponent_div_23_ng_container_7_div_3_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r9); const ctx_r4 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r4.addOption()); });
115
+ i0.ɵɵtext(1, "+ Add More Answer");
116
+ i0.ɵɵelementEnd();
117
+ } }
118
+ function AutoTaskPopupComponent_div_23_ng_container_7_Template(rf, ctx) { if (rf & 1) {
119
+ i0.ɵɵelementContainerStart(0);
120
+ i0.ɵɵtemplate(1, AutoTaskPopupComponent_div_23_ng_container_7_div_1_Template, 5, 3, "div", 54)(2, AutoTaskPopupComponent_div_23_ng_container_7_div_2_Template, 2, 0, "div", 59)(3, AutoTaskPopupComponent_div_23_ng_container_7_div_3_Template, 2, 0, "div", 60);
121
+ i0.ɵɵelementContainerEnd();
122
+ } if (rf & 2) {
123
+ const ctx_r4 = i0.ɵɵnextContext(2);
124
+ i0.ɵɵadvance();
125
+ i0.ɵɵproperty("ngForOf", ctx_r4.answersFA.controls);
126
+ i0.ɵɵadvance();
127
+ i0.ɵɵproperty("ngIf", ctx_r4.answersFA.errors);
128
+ i0.ɵɵadvance();
129
+ i0.ɵɵproperty("ngIf", ctx_r4.currentType === "multiplechoicesingle" || ctx_r4.currentType === "multiplechoicemultiple");
130
+ } }
131
+ function AutoTaskPopupComponent_div_23_ng_container_8_Template(rf, ctx) { if (rf & 1) {
132
+ i0.ɵɵelementContainerStart(0);
133
+ i0.ɵɵelementStart(1, "div", 65);
134
+ i0.ɵɵelement(2, "input", 66);
135
+ i0.ɵɵelementStart(3, "label", 67);
136
+ i0.ɵɵtext(4, "Allow Historic Dates on Date Picker");
137
+ i0.ɵɵelementEnd()();
138
+ i0.ɵɵelementContainerEnd();
139
+ } if (rf & 2) {
140
+ i0.ɵɵadvance();
141
+ i0.ɵɵproperty("formGroupName", 0);
142
+ } }
143
+ function AutoTaskPopupComponent_div_23_ng_container_9_div_20_Template(rf, ctx) { if (rf & 1) {
144
+ i0.ɵɵelementStart(0, "div", 78);
145
+ i0.ɵɵtext(1, "* Min value must be less than max value.");
146
+ i0.ɵɵelementEnd();
147
+ } }
148
+ function AutoTaskPopupComponent_div_23_ng_container_9_Template(rf, ctx) { if (rf & 1) {
149
+ const _r10 = i0.ɵɵgetCurrentView();
150
+ i0.ɵɵelementContainerStart(0);
151
+ i0.ɵɵelementStart(1, "div", 68)(2, "div", 69)(3, "label", 70);
152
+ i0.ɵɵtext(4, "Select Type");
153
+ i0.ɵɵelementEnd();
154
+ i0.ɵɵelementStart(5, "select", 71);
155
+ i0.ɵɵlistener("change", function AutoTaskPopupComponent_div_23_ng_container_9_Template_select_change_5_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r4 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r4.updateLinearTypeRange($event)); });
156
+ i0.ɵɵelementStart(6, "option", 72);
157
+ i0.ɵɵtext(7, "Whole Number");
158
+ i0.ɵɵelementEnd();
159
+ i0.ɵɵelementStart(8, "option", 73);
160
+ i0.ɵɵtext(9, "Degree \u00B0C");
161
+ i0.ɵɵelementEnd();
162
+ i0.ɵɵelementStart(10, "option", 74);
163
+ i0.ɵɵtext(11, "Percentage");
164
+ i0.ɵɵelementEnd()()();
165
+ i0.ɵɵelementStart(12, "div", 69)(13, "label", 70);
166
+ i0.ɵɵtext(14, "Min Value");
167
+ i0.ɵɵelementEnd();
168
+ i0.ɵɵelement(15, "lib-counter", 75);
169
+ i0.ɵɵelementEnd();
170
+ i0.ɵɵelementStart(16, "div", 69)(17, "label", 70);
171
+ i0.ɵɵtext(18, "Max Value");
172
+ i0.ɵɵelementEnd();
173
+ i0.ɵɵelement(19, "lib-counter", 76);
174
+ i0.ɵɵelementEnd();
175
+ i0.ɵɵtemplate(20, AutoTaskPopupComponent_div_23_ng_container_9_div_20_Template, 2, 0, "div", 77);
176
+ i0.ɵɵelementEnd();
177
+ i0.ɵɵelementContainerEnd();
178
+ } if (rf & 2) {
179
+ let tmp_5_0;
180
+ let tmp_7_0;
181
+ let tmp_8_0;
182
+ const ctx_r4 = i0.ɵɵnextContext(2);
183
+ i0.ɵɵadvance();
184
+ i0.ɵɵproperty("formGroupName", 0);
185
+ i0.ɵɵadvance(14);
186
+ i0.ɵɵproperty("step", 1)("type", (tmp_5_0 = (tmp_5_0 = ctx_r4.answersFA.at(0)) == null ? null : (tmp_5_0 = tmp_5_0.get("linearType")) == null ? null : tmp_5_0.value) !== null && tmp_5_0 !== undefined ? tmp_5_0 : "number");
187
+ i0.ɵɵadvance(4);
188
+ i0.ɵɵproperty("step", 1)("type", (tmp_7_0 = (tmp_7_0 = ctx_r4.answersFA.at(0)) == null ? null : (tmp_7_0 = tmp_7_0.get("linearType")) == null ? null : tmp_7_0.value) !== null && tmp_7_0 !== undefined ? tmp_7_0 : "number");
189
+ i0.ɵɵadvance();
190
+ i0.ɵɵproperty("ngIf", (tmp_8_0 = ctx_r4.answersFA.at(0)) == null ? null : tmp_8_0.hasError("invalidRange"));
191
+ } }
192
+ function AutoTaskPopupComponent_div_23_ng_container_10_div_6_Template(rf, ctx) { if (rf & 1) {
193
+ i0.ɵɵelementStart(0, "div", 69)(1, "label", 70);
194
+ i0.ɵɵtext(2, "Image limit");
195
+ i0.ɵɵelementEnd();
196
+ i0.ɵɵelement(3, "input", 84);
197
+ i0.ɵɵelementEnd();
198
+ } }
199
+ function AutoTaskPopupComponent_div_23_ng_container_10_div_7_Template(rf, ctx) { if (rf & 1) {
200
+ i0.ɵɵelementStart(0, "div", 69)(1, "label", 70);
201
+ i0.ɵɵtext(2, "Video limit");
202
+ i0.ɵɵelementEnd();
203
+ i0.ɵɵelement(3, "input", 85);
204
+ i0.ɵɵelementEnd();
205
+ } }
206
+ function AutoTaskPopupComponent_div_23_ng_container_10_Template(rf, ctx) { if (rf & 1) {
207
+ i0.ɵɵelementContainerStart(0);
208
+ i0.ɵɵelementStart(1, "div", 79)(2, "div", 80);
209
+ i0.ɵɵelement(3, "input", 81);
210
+ i0.ɵɵelementStart(4, "label", 82);
211
+ i0.ɵɵtext(5, "Set upload limits");
212
+ i0.ɵɵelementEnd()();
213
+ i0.ɵɵtemplate(6, AutoTaskPopupComponent_div_23_ng_container_10_div_6_Template, 4, 0, "div", 83)(7, AutoTaskPopupComponent_div_23_ng_container_10_div_7_Template, 4, 0, "div", 83);
214
+ i0.ɵɵelementEnd();
215
+ i0.ɵɵelementContainerEnd();
216
+ } if (rf & 2) {
217
+ let tmp_4_0;
218
+ let tmp_5_0;
219
+ const ctx_r4 = i0.ɵɵnextContext(2);
220
+ i0.ɵɵadvance();
221
+ i0.ɵɵproperty("formGroupName", 0);
222
+ i0.ɵɵadvance(5);
223
+ i0.ɵɵproperty("ngIf", (tmp_4_0 = ctx_r4.answersFA.at(0)) == null ? null : (tmp_4_0 = tmp_4_0.get("limit")) == null ? null : tmp_4_0.value);
224
+ i0.ɵɵadvance();
225
+ i0.ɵɵproperty("ngIf", (tmp_5_0 = ctx_r4.answersFA.at(0)) == null ? null : (tmp_5_0 = tmp_5_0.get("limit")) == null ? null : tmp_5_0.value);
226
+ } }
227
+ function AutoTaskPopupComponent_div_23_Template(rf, ctx) { if (rf & 1) {
228
+ i0.ɵɵelementStart(0, "div", 9)(1, "label", 10);
229
+ i0.ɵɵtext(2, "Answer Options");
230
+ i0.ɵɵelementEnd();
231
+ i0.ɵɵtemplate(3, AutoTaskPopupComponent_div_23_div_3_Template, 4, 0, "div", 40)(4, AutoTaskPopupComponent_div_23_div_4_Template, 9, 0, "div", 41);
232
+ i0.ɵɵelementStart(5, "div", 42);
233
+ i0.ɵɵtemplate(6, AutoTaskPopupComponent_div_23_ng_container_6_Template, 2, 1, "ng-container", 43)(7, AutoTaskPopupComponent_div_23_ng_container_7_Template, 4, 3, "ng-container", 43)(8, AutoTaskPopupComponent_div_23_ng_container_8_Template, 5, 1, "ng-container", 43)(9, AutoTaskPopupComponent_div_23_ng_container_9_Template, 21, 6, "ng-container", 43)(10, AutoTaskPopupComponent_div_23_ng_container_10_Template, 8, 3, "ng-container", 43);
234
+ i0.ɵɵelementEnd()();
235
+ } if (rf & 2) {
236
+ const ctx_r4 = i0.ɵɵnextContext();
237
+ i0.ɵɵadvance(3);
238
+ i0.ɵɵproperty("ngIf", ctx_r4.currentType === "dropdown");
239
+ i0.ɵɵadvance();
240
+ i0.ɵɵproperty("ngIf", ctx_r4.currentType === "descriptive" || ctx_r4.currentType === "multipleImage");
241
+ i0.ɵɵadvance(2);
242
+ i0.ɵɵproperty("ngIf", ctx_r4.currentType === "yes/no");
243
+ i0.ɵɵadvance();
244
+ i0.ɵɵproperty("ngIf", ctx_r4.currentType === "multiplechoicesingle" || ctx_r4.currentType === "multiplechoicemultiple" || ctx_r4.currentType === "dropdown");
245
+ i0.ɵɵadvance();
246
+ i0.ɵɵproperty("ngIf", ctx_r4.currentType === "date" && ctx_r4.answersFA.length);
247
+ i0.ɵɵadvance();
248
+ i0.ɵɵproperty("ngIf", ctx_r4.currentType === "linearscale" && ctx_r4.answersFA.length);
249
+ i0.ɵɵadvance();
250
+ i0.ɵɵproperty("ngIf", ctx_r4.currentType === "image/video" && ctx_r4.answersFA.length);
251
+ } }
252
+ function AutoTaskPopupComponent_div_27_Template(rf, ctx) { if (rf & 1) {
253
+ const _r11 = i0.ɵɵgetCurrentView();
254
+ i0.ɵɵelementStart(0, "div", 86);
255
+ i0.ɵɵlistener("click", function AutoTaskPopupComponent_div_27_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r11); i0.ɵɵnextContext(); const refImgInput_r12 = i0.ɵɵreference(30); return i0.ɵɵresetView(refImgInput_r12.click()); });
256
+ i0.ɵɵelementStart(1, "span", 87);
257
+ i0.ɵɵtext(2);
258
+ i0.ɵɵelementEnd()();
259
+ } if (rf & 2) {
260
+ const ctx_r4 = i0.ɵɵnextContext();
261
+ i0.ɵɵadvance(2);
262
+ i0.ɵɵtextInterpolate(ctx_r4.uploading ? "Uploading..." : "Click to Upload Image");
263
+ } }
264
+ function AutoTaskPopupComponent_div_28_Template(rf, ctx) { if (rf & 1) {
265
+ const _r13 = i0.ɵɵgetCurrentView();
266
+ i0.ɵɵelementStart(0, "div", 88);
267
+ i0.ɵɵelement(1, "img", 89);
268
+ i0.ɵɵelementStart(2, "span", 90);
269
+ i0.ɵɵlistener("click", function AutoTaskPopupComponent_div_28_Template_span_click_2_listener() { i0.ɵɵrestoreView(_r13); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.removeReferenceImage()); });
270
+ i0.ɵɵtext(3, "\u00D7");
271
+ i0.ɵɵelementEnd()();
272
+ } if (rf & 2) {
273
+ let tmp_2_0;
274
+ const ctx_r4 = i0.ɵɵnextContext();
275
+ i0.ɵɵadvance();
276
+ i0.ɵɵproperty("src", (ctx_r4.environment == null ? null : ctx_r4.environment.TraxAnswerCDN) + ((tmp_2_0 = ctx_r4.autoTaskForm.get("referenceImage")) == null ? null : tmp_2_0.value), i0.ɵɵsanitizeUrl);
277
+ } }
278
+ function AutoTaskPopupComponent_div_50_Template(rf, ctx) { if (rf & 1) {
279
+ i0.ɵɵelementStart(0, "div", 91);
280
+ i0.ɵɵtext(1, " Assignee is set from the first auto task and applies to all questions. ");
281
+ i0.ɵɵelementEnd();
282
+ } }
283
+ function AutoTaskPopupComponent_option_60_Template(rf, ctx) { if (rf & 1) {
284
+ i0.ɵɵelementStart(0, "option", 92);
285
+ i0.ɵɵtext(1);
286
+ i0.ɵɵelementEnd();
287
+ } if (rf & 2) {
288
+ const d_r14 = ctx.$implicit;
289
+ i0.ɵɵproperty("ngValue", d_r14);
290
+ i0.ɵɵadvance();
291
+ i0.ɵɵtextInterpolate(d_r14);
292
+ } }
293
+ function AutoTaskPopupComponent_div_63_Template(rf, ctx) { if (rf & 1) {
294
+ i0.ɵɵelementStart(0, "div", 91);
295
+ i0.ɵɵtext(1, " Validity is set from the first auto task and applies to all questions. ");
296
+ i0.ɵɵelementEnd();
297
+ } }
298
+ /**
299
+ * Details dialog for the per-answer "Create Auto Task" flow in add-checklist.
300
+ * Opened from AddChecklistComponent after the user confirms "Yes" on the
301
+ * "Create Auto Task?" prompt. When `data.isFirstAutoTask` is false the Task
302
+ * Assignee + Task Validity controls are disabled/read-only (locked to the
303
+ * choice made on the first auto task). Closes with the captured payload, or
304
+ * dismisses on cancel/backdrop.
305
+ */
306
+ export class AutoTaskPopupComponent {
307
+ dialogRef;
308
+ fb;
309
+ sopService;
310
+ gs;
311
+ toast;
312
+ data = {};
313
+ autoTaskForm;
314
+ environment = {};
315
+ uploading = false;
316
+ validityOptions = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 20, 25, 30];
317
+ answerTypeOptions = [
318
+ { label: 'Descriptive Answer', value: 'descriptive' },
319
+ { label: 'A/B Question', value: 'yes/no' },
320
+ { label: 'Multiple Choice Question - Single Answer', value: 'multiplechoicesingle' },
321
+ { label: 'Multiple Choice Question - Multiple Answer', value: 'multiplechoicemultiple' },
322
+ { label: 'Capture Image with Description', value: 'descriptiveImage' },
323
+ { label: 'Capture Image as answer', value: 'image' },
324
+ { label: 'Capture video as answer', value: 'video' },
325
+ { label: 'Capture Multiple Image', value: 'multipleImage' },
326
+ { label: 'Date - DD/MM/YYYY', value: 'date' },
327
+ { label: 'Linear Scale', value: 'linearscale' },
328
+ { label: 'Time', value: 'time' },
329
+ { label: 'Dropdown', value: 'dropdown' },
330
+ { label: 'Image/Video', value: 'image/video' },
331
+ ];
332
+ detach = new Subject();
333
+ constructor(dialogRef, fb, sopService, gs, toast) {
334
+ this.dialogRef = dialogRef;
335
+ this.fb = fb;
336
+ this.sopService = sopService;
337
+ this.gs = gs;
338
+ this.toast = toast;
339
+ }
340
+ ngOnInit() {
341
+ this.gs.environment.pipe(takeUntil(this.detach)).subscribe((env) => {
342
+ if (env)
343
+ this.environment = env;
344
+ });
345
+ this.autoTaskForm = this.fb.group({
346
+ taskName: this.fb.control(this.data?.taskName || '', [Validators.required]),
347
+ taskDescription: this.fb.control(this.data?.taskDescription || ''),
348
+ answerType: this.fb.control(this.data?.answerType || 'image'),
349
+ referenceImage: this.fb.control(this.data?.referenceImage || ''),
350
+ taskAssignee: this.fb.control(this.data?.taskAssignee || 'submitter'),
351
+ taskValidity: this.fb.control(this.data?.taskValidity ?? 10),
352
+ answers: this.fb.array([]),
353
+ allowMultiple: this.fb.control(this.data?.allowMultiple ?? false),
354
+ descriptivetype: this.fb.control(this.data?.descriptivetype ?? 'text'),
355
+ });
356
+ // Task name is derived from the question (and answer option) and is read-only.
357
+ this.autoTaskForm.get('taskName')?.disable();
358
+ // Assignee + validity are set once on the first auto task and locked for all others.
359
+ if (!this.data?.isFirstAutoTask) {
360
+ this.autoTaskForm.get('taskAssignee')?.disable();
361
+ this.autoTaskForm.get('taskValidity')?.disable();
362
+ }
363
+ // Seed the per-answer-type option builder (from saved data on edit, else type defaults).
364
+ this.buildAnswers(this.autoTaskForm.get('answerType')?.value, this.data?.answers);
365
+ }
366
+ get isFirst() {
367
+ return !!this.data?.isFirstAutoTask;
368
+ }
369
+ // ===== Answer-options builder (mirrors the gallery create-task per-type UI) =====
370
+ get answersFA() {
371
+ return this.autoTaskForm.get('answers');
372
+ }
373
+ get currentType() {
374
+ return this.autoTaskForm.get('answerType')?.value;
375
+ }
376
+ onAnswerTypeChange(event) {
377
+ const type = event?.target?.value;
378
+ while (this.answersFA.length) {
379
+ this.answersFA.removeAt(0);
380
+ }
381
+ this.autoTaskForm.get('descriptivetype')?.setValue('text');
382
+ this.autoTaskForm.get('allowMultiple')?.setValue(false);
383
+ this.buildAnswers(type);
384
+ }
385
+ // Seed the answers FormArray for a type: from saved data (edit) or type defaults (create).
386
+ buildAnswers(type, saved) {
387
+ const optionTypes = ['yes/no', 'multiplechoicesingle', 'multiplechoicemultiple', 'dropdown'];
388
+ if (saved && saved.length) {
389
+ saved.forEach((a) => this.addAnswerGroup(type, a));
390
+ }
391
+ else if (type === 'yes/no') {
392
+ this.addAnswerGroup(type, { answer: 'Yes' });
393
+ this.addAnswerGroup(type, { answer: 'No' });
394
+ }
395
+ else if (['multiplechoicesingle', 'multiplechoicemultiple', 'dropdown'].includes(type)) {
396
+ this.addAnswerGroup(type);
397
+ this.addAnswerGroup(type);
398
+ }
399
+ else if (['descriptive', 'time'].includes(type)) {
400
+ // no option rows: descriptive uses the text/number radios; time has none
401
+ }
402
+ else {
403
+ // linearscale, date, image/video, image, descriptiveImage, video, multipleImage
404
+ this.addAnswerGroup(type);
405
+ }
406
+ if (optionTypes.includes(type)) {
407
+ this.answersFA.setValidators(uniqueStringValidator());
408
+ }
409
+ else {
410
+ this.answersFA.clearValidators();
411
+ }
412
+ this.answersFA.updateValueAndValidity();
413
+ }
414
+ addAnswerGroup(type, a) {
415
+ const n = this.answersFA.length + 1;
416
+ const isOption = ['yes/no', 'multiplechoicesingle', 'multiplechoicemultiple', 'dropdown'].includes(type);
417
+ const group = {
418
+ answer: this.fb.control(a?.answer ?? '', isOption ? [Validators.required, noWhitespaceValidator()] : []),
419
+ answeroptionNumber: this.fb.control(n, [Validators.required]),
420
+ index: this.fb.control(n - 1),
421
+ };
422
+ if (type === 'linearscale') {
423
+ group.rangeStart = this.fb.control(a?.rangeStart ?? 0);
424
+ group.rangeEnd = this.fb.control(a?.rangeEnd ?? 100);
425
+ group.linearType = this.fb.control(a?.linearType ?? 'number');
426
+ }
427
+ if (type === 'date') {
428
+ group.historicDate = this.fb.control(a?.historicDate ?? false);
429
+ }
430
+ if (type === 'image/video') {
431
+ group.limit = this.fb.control(a?.limit ?? false);
432
+ group.imageLimit = this.fb.control(a?.imageLimit ?? 1);
433
+ group.videoLimit = this.fb.control(a?.videoLimit ?? 1);
434
+ }
435
+ const fg = this.fb.group(group, type === 'linearscale' ? { validators: [rangeValidator()] } : {});
436
+ this.answersFA.push(fg);
437
+ }
438
+ canRemoveOption() {
439
+ return this.answersFA.length > 2;
440
+ }
441
+ addOption() {
442
+ if (!['multiplechoicesingle', 'multiplechoicemultiple'].includes(this.currentType))
443
+ return;
444
+ this.addAnswerGroup(this.currentType);
445
+ }
446
+ removeOption(k) {
447
+ if (!this.canRemoveOption())
448
+ return;
449
+ this.answersFA.removeAt(k);
450
+ }
451
+ updateLinearTypeRange(_event) {
452
+ this.answersFA.at(0)?.patchValue({ rangeStart: 0, rangeEnd: 100 });
453
+ }
454
+ uploadReferenceImage(event) {
455
+ const input = event.target;
456
+ if (!input?.files?.length)
457
+ return;
458
+ const file = input.files[0];
459
+ const formData = new FormData();
460
+ formData.append('file', file, file.name);
461
+ formData.append('clientId', this.data?.clientId);
462
+ this.uploading = true;
463
+ this.sopService.imageupload(formData).pipe(takeUntil(this.detach)).subscribe((res) => {
464
+ this.uploading = false;
465
+ input.value = '';
466
+ if (res?.data?.imgUrl) {
467
+ this.autoTaskForm.get('referenceImage')?.setValue(res.data.imgUrl);
468
+ }
469
+ }, () => {
470
+ this.uploading = false;
471
+ input.value = '';
472
+ this.toast.getErrorToast('Image upload failed. Please try again.');
473
+ });
474
+ }
475
+ removeReferenceImage() {
476
+ this.autoTaskForm.get('referenceImage')?.setValue('');
477
+ }
478
+ submit() {
479
+ if (this.autoTaskForm.invalid) {
480
+ this.autoTaskForm.markAllAsTouched();
481
+ return;
482
+ }
483
+ // getRawValue so the locked (disabled) assignee/validity are still returned.
484
+ this.dialogRef.close(this.autoTaskForm.getRawValue());
485
+ }
486
+ cancel() {
487
+ this.dialogRef.dismiss();
488
+ }
489
+ ngOnDestroy() {
490
+ this.detach.next('');
491
+ this.detach.complete();
492
+ }
493
+ static ɵfac = function AutoTaskPopupComponent_Factory(t) { return new (t || AutoTaskPopupComponent)(i0.ɵɵdirectiveInject(i1.NgbActiveModal), i0.ɵɵdirectiveInject(i2.FormBuilder), i0.ɵɵdirectiveInject(i3.TraxService), i0.ɵɵdirectiveInject(i4.GlobalStateService), i0.ɵɵdirectiveInject(i5.ToastService)); };
494
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AutoTaskPopupComponent, selectors: [["lib-auto-task-popup"]], inputs: { data: "data" }, decls: 69, vars: 9, consts: [["refImgInput", ""], [1, "auto-task-popup", "d-flex", "flex-column"], [1, "atp-header", "d-flex", "align-items-center", "justify-content-between", "px-8", "pt-8", "pb-4"], [1, "fw-bold", "fs-3", "mb-0"], [1, "cursor-pointer", 3, "click"], ["xmlns", "http://www.w3.org/2000/svg", "width", "24", "height", "24", "viewBox", "0 0 24 24", "fill", "none"], ["d", "M18 6L6 18M6 6L18 18", "stroke", "#667085", "stroke-width", "2", "stroke-linecap", "round", "stroke-linejoin", "round"], [1, "d-flex", "flex-column", "atp-form", 3, "formGroup"], [1, "atp-body", "px-8"], [1, "mb-5"], [1, "fw-semibold", "d-block", "mb-2"], ["type", "text", "placeholder", "Enter task name", "formControlName", "taskName", 1, "form-control", "form-control-solid"], ["class", "text-danger mt-1 mb-0", 4, "ngIf"], ["rows", "3", "placeholder", "Enter task description", "formControlName", "taskDescription", 1, "form-control", "form-control-solid"], ["formControlName", "answerType", 1, "form-select", "form-select-solid", 3, "change"], [3, "value", 4, "ngFor", "ngForOf"], ["class", "mb-5", 4, "ngIf"], ["class", "upload-box text-center cursor-pointer", 3, "click", 4, "ngIf"], ["class", "position-relative d-inline-block", 4, "ngIf"], ["type", "file", "accept", "image/png, image/jpeg", "hidden", "", 3, "change"], [1, "fw-semibold"], [1, "text-muted", "mb-3"], [1, "d-flex", "mb-3"], ["type", "radio", "value", "submitter", "formControlName", "taskAssignee", "id", "assigneeSubmitter", 1, "form-check-input", "mt-1", "cursor-pointer"], ["for", "assigneeSubmitter", 1, "ms-3", "cursor-pointer"], [1, "text-muted"], [1, "d-flex"], ["type", "radio", "value", "storeuser", "formControlName", "taskAssignee", "id", "assigneeStore", 1, "form-check-input", "mt-1", "cursor-pointer"], ["for", "assigneeStore", 1, "ms-3", "cursor-pointer"], ["class", "locked-note mt-2", 4, "ngIf"], [1, "d-flex", "align-items-center"], [1, "me-3"], ["formControlName", "taskValidity", 1, "form-select", "form-select-solid", "w-80px"], [3, "ngValue", 4, "ngFor", "ngForOf"], [1, "ms-3"], [1, "atp-footer", "d-flex", "px-8", "pt-4", "pb-8"], ["type", "button", 1, "btn", "btn-outline", "px-8", "me-4", 3, "click"], ["type", "button", 1, "btn", "btn-primary", "px-10", 3, "click"], [1, "text-danger", "mt-1", "mb-0"], [3, "value"], ["class", "form-check form-switch mb-3", 4, "ngIf"], ["class", "d-flex mb-2", 4, "ngIf"], ["formArrayName", "answers"], [4, "ngIf"], [1, "form-check", "form-switch", "mb-3"], ["type", "checkbox", "id", "atpAllowMultiple", "formControlName", "allowMultiple", 1, "form-check-input", "cursor-pointer"], ["for", "atpAllowMultiple", 1, "form-check-label", "ms-2", "cursor-pointer"], [1, "d-flex", "mb-2"], [1, "form-check", "me-5"], ["type", "radio", "value", "text", "formControlName", "descriptivetype", "id", "atpDtText", 1, "form-check-input", "cursor-pointer"], ["for", "atpDtText", 1, "form-check-label", "cursor-pointer"], [1, "form-check"], ["type", "radio", "value", "number", "formControlName", "descriptivetype", "id", "atpDtNumber", 1, "form-check-input", "cursor-pointer"], ["for", "atpDtNumber", 1, "form-check-label", "cursor-pointer"], ["class", "mb-3", 3, "formGroupName", 4, "ngFor", "ngForOf"], [1, "mb-3", 3, "formGroupName"], ["formControlName", "answer", "type", "text", "placeholder", "Enter answer here", 1, "form-control", "form-control-solid"], ["class", "text-danger mt-1", 4, "ngIf"], [1, "text-danger", "mt-1"], ["class", "text-danger mb-2", 4, "ngIf"], ["class", "text-primary fw-semibold cursor-pointer", 3, "click", 4, "ngIf"], ["class", "ms-3 cursor-pointer text-danger fs-3", "title", "Remove option", 3, "click", 4, "ngIf"], ["title", "Remove option", 1, "ms-3", "cursor-pointer", "text-danger", "fs-3", 3, "click"], [1, "text-danger", "mb-2"], [1, "text-primary", "fw-semibold", "cursor-pointer", 3, "click"], [1, "form-check", 3, "formGroupName"], ["type", "checkbox", "id", "atpHistoricDate", "formControlName", "historicDate", 1, "form-check-input", "cursor-pointer"], ["for", "atpHistoricDate", 1, "form-check-label", "ms-2", "cursor-pointer"], [1, "row", 3, "formGroupName"], [1, "col-md-4", "mb-3"], [1, "mb-1"], ["formControlName", "linearType", 1, "form-select", "form-select-solid", 3, "change"], ["value", "number"], ["value", "degree"], ["value", "percentage"], ["formControlName", "rangeStart", "placeholder", "0", 3, "step", "type"], ["formControlName", "rangeEnd", "placeholder", "100", 3, "step", "type"], ["class", "text-danger", 4, "ngIf"], [1, "text-danger"], [1, "row", "align-items-end", 3, "formGroupName"], [1, "col-md-4", "form-check", "form-switch", "mb-3"], ["type", "checkbox", "id", "atpLimit", "formControlName", "limit", 1, "form-check-input", "cursor-pointer"], ["for", "atpLimit", 1, "form-check-label", "ms-2", "cursor-pointer"], ["class", "col-md-4 mb-3", 4, "ngIf"], ["type", "number", "min", "1", "formControlName", "imageLimit", 1, "form-control", "form-control-solid"], ["type", "number", "min", "1", "formControlName", "videoLimit", 1, "form-control", "form-control-solid"], [1, "upload-box", "text-center", "cursor-pointer", 3, "click"], [1, "text-primary", "fw-semibold"], [1, "position-relative", "d-inline-block"], ["alt", "Reference", 1, "ref-img", "rounded", 3, "src"], [1, "remove-img", "cursor-pointer", 3, "click"], [1, "locked-note", "mt-2"], [3, "ngValue"]], template: function AutoTaskPopupComponent_Template(rf, ctx) { if (rf & 1) {
495
+ const _r1 = i0.ɵɵgetCurrentView();
496
+ i0.ɵɵelementStart(0, "div", 1)(1, "div", 2)(2, "h2", 3);
497
+ i0.ɵɵtext(3, "Create Auto Task");
498
+ i0.ɵɵelementEnd();
499
+ i0.ɵɵelementStart(4, "span", 4);
500
+ i0.ɵɵlistener("click", function AutoTaskPopupComponent_Template_span_click_4_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.cancel()); });
501
+ i0.ɵɵnamespaceSVG();
502
+ i0.ɵɵelementStart(5, "svg", 5);
503
+ i0.ɵɵelement(6, "path", 6);
504
+ i0.ɵɵelementEnd()()();
505
+ i0.ɵɵnamespaceHTML();
506
+ i0.ɵɵelementStart(7, "form", 7)(8, "div", 8)(9, "div", 9)(10, "label", 10);
507
+ i0.ɵɵtext(11, "Task Name");
508
+ i0.ɵɵelementEnd();
509
+ i0.ɵɵelement(12, "input", 11);
510
+ i0.ɵɵtemplate(13, AutoTaskPopupComponent_p_13_Template, 2, 0, "p", 12);
511
+ i0.ɵɵelementEnd();
512
+ i0.ɵɵelementStart(14, "div", 9)(15, "label", 10);
513
+ i0.ɵɵtext(16, "Description");
514
+ i0.ɵɵelementEnd();
515
+ i0.ɵɵelement(17, "textarea", 13);
516
+ i0.ɵɵelementEnd();
517
+ i0.ɵɵelementStart(18, "div", 9)(19, "label", 10);
518
+ i0.ɵɵtext(20, "Answer Type");
519
+ i0.ɵɵelementEnd();
520
+ i0.ɵɵelementStart(21, "select", 14);
521
+ i0.ɵɵlistener("change", function AutoTaskPopupComponent_Template_select_change_21_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onAnswerTypeChange($event)); });
522
+ i0.ɵɵtemplate(22, AutoTaskPopupComponent_option_22_Template, 2, 2, "option", 15);
523
+ i0.ɵɵelementEnd()();
524
+ i0.ɵɵtemplate(23, AutoTaskPopupComponent_div_23_Template, 11, 7, "div", 16);
525
+ i0.ɵɵelementStart(24, "div", 9)(25, "label", 10);
526
+ i0.ɵɵtext(26, "Reference Image");
527
+ i0.ɵɵelementEnd();
528
+ i0.ɵɵtemplate(27, AutoTaskPopupComponent_div_27_Template, 3, 1, "div", 17)(28, AutoTaskPopupComponent_div_28_Template, 4, 1, "div", 18);
529
+ i0.ɵɵelementStart(29, "input", 19, 0);
530
+ i0.ɵɵlistener("change", function AutoTaskPopupComponent_Template_input_change_29_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.uploadReferenceImage($event)); });
531
+ i0.ɵɵelementEnd()();
532
+ i0.ɵɵelementStart(31, "div", 9)(32, "div", 20);
533
+ i0.ɵɵtext(33, "Task Assignee");
534
+ i0.ɵɵelementEnd();
535
+ i0.ɵɵelementStart(34, "div", 21);
536
+ i0.ɵɵtext(35, "Choose who the flagged task is assigned to");
537
+ i0.ɵɵelementEnd();
538
+ i0.ɵɵelementStart(36, "div", 22);
539
+ i0.ɵɵelement(37, "input", 23);
540
+ i0.ɵɵelementStart(38, "label", 24)(39, "div", 20);
541
+ i0.ɵɵtext(40, "Checklist Submitter");
542
+ i0.ɵɵelementEnd();
543
+ i0.ɵɵelementStart(41, "div", 25);
544
+ i0.ɵɵtext(42, "Task is assigned to the user who filled the checklist");
545
+ i0.ɵɵelementEnd()()();
546
+ i0.ɵɵelementStart(43, "div", 26);
547
+ i0.ɵɵelement(44, "input", 27);
548
+ i0.ɵɵelementStart(45, "label", 28)(46, "div", 20);
549
+ i0.ɵɵtext(47, "Store User");
550
+ i0.ɵɵelementEnd();
551
+ i0.ɵɵelementStart(48, "div", 25);
552
+ i0.ɵɵtext(49, "Task is assigned to the user mapped to the flagged store");
553
+ i0.ɵɵelementEnd()()();
554
+ i0.ɵɵtemplate(50, AutoTaskPopupComponent_div_50_Template, 2, 0, "div", 29);
555
+ i0.ɵɵelementEnd();
556
+ i0.ɵɵelementStart(51, "div", 9)(52, "div", 20);
557
+ i0.ɵɵtext(53, "Task Validity");
558
+ i0.ɵɵelementEnd();
559
+ i0.ɵɵelementStart(54, "div", 21);
560
+ i0.ɵɵtext(55, "Set how long the auto task stays valid to complete");
561
+ i0.ɵɵelementEnd();
562
+ i0.ɵɵelementStart(56, "div", 30)(57, "span", 31);
563
+ i0.ɵɵtext(58, "Task valid for");
564
+ i0.ɵɵelementEnd();
565
+ i0.ɵɵelementStart(59, "select", 32);
566
+ i0.ɵɵtemplate(60, AutoTaskPopupComponent_option_60_Template, 2, 2, "option", 33);
567
+ i0.ɵɵelementEnd();
568
+ i0.ɵɵelementStart(61, "span", 34);
569
+ i0.ɵɵtext(62, "Days from task creation");
570
+ i0.ɵɵelementEnd()();
571
+ i0.ɵɵtemplate(63, AutoTaskPopupComponent_div_63_Template, 2, 0, "div", 29);
572
+ i0.ɵɵelementEnd()();
573
+ i0.ɵɵelementStart(64, "div", 35)(65, "button", 36);
574
+ i0.ɵɵlistener("click", function AutoTaskPopupComponent_Template_button_click_65_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.cancel()); });
575
+ i0.ɵɵtext(66, "Cancel");
576
+ i0.ɵɵelementEnd();
577
+ i0.ɵɵelementStart(67, "button", 37);
578
+ i0.ɵɵlistener("click", function AutoTaskPopupComponent_Template_button_click_67_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.submit()); });
579
+ i0.ɵɵtext(68, "Create Task");
580
+ i0.ɵɵelementEnd()()()();
581
+ } if (rf & 2) {
582
+ let tmp_2_0;
583
+ let tmp_5_0;
584
+ let tmp_6_0;
585
+ i0.ɵɵadvance(7);
586
+ i0.ɵɵproperty("formGroup", ctx.autoTaskForm);
587
+ i0.ɵɵadvance(6);
588
+ i0.ɵɵproperty("ngIf", ((tmp_2_0 = ctx.autoTaskForm.get("taskName")) == null ? null : tmp_2_0.touched) && ((tmp_2_0 = ctx.autoTaskForm.get("taskName")) == null ? null : tmp_2_0.invalid));
589
+ i0.ɵɵadvance(9);
590
+ i0.ɵɵproperty("ngForOf", ctx.answerTypeOptions);
591
+ i0.ɵɵadvance();
592
+ i0.ɵɵproperty("ngIf", ctx.currentType !== "time");
593
+ i0.ɵɵadvance(4);
594
+ i0.ɵɵproperty("ngIf", !((tmp_5_0 = ctx.autoTaskForm.get("referenceImage")) == null ? null : tmp_5_0.value));
595
+ i0.ɵɵadvance();
596
+ i0.ɵɵproperty("ngIf", (tmp_6_0 = ctx.autoTaskForm.get("referenceImage")) == null ? null : tmp_6_0.value);
597
+ i0.ɵɵadvance(22);
598
+ i0.ɵɵproperty("ngIf", !ctx.isFirst);
599
+ i0.ɵɵadvance(10);
600
+ i0.ɵɵproperty("ngForOf", ctx.validityOptions);
601
+ i0.ɵɵadvance(3);
602
+ i0.ɵɵproperty("ngIf", !ctx.isFirst);
603
+ } }, dependencies: [i6.NgForOf, i6.NgIf, i2.ɵNgNoValidate, i2.NgSelectOption, i2.ɵNgSelectMultipleOption, i2.DefaultValueAccessor, i2.NumberValueAccessor, i2.CheckboxControlValueAccessor, i2.SelectControlValueAccessor, i2.RadioControlValueAccessor, i2.NgControlStatus, i2.NgControlStatusGroup, i2.MinValidator, i2.FormGroupDirective, i2.FormControlName, i2.FormGroupName, i2.FormArrayName, i7.CounterComponent], styles: [".auto-task-popup[_ngcontent-%COMP%]{font-family:Inter;max-height:85vh}.auto-task-popup[_ngcontent-%COMP%] .atp-form[_ngcontent-%COMP%]{flex:1 1 auto;min-height:0}.auto-task-popup[_ngcontent-%COMP%] .atp-body[_ngcontent-%COMP%]{flex:1 1 auto;min-height:0;overflow-y:auto}.auto-task-popup[_ngcontent-%COMP%] .atp-header[_ngcontent-%COMP%], .auto-task-popup[_ngcontent-%COMP%] .atp-footer[_ngcontent-%COMP%]{flex:0 0 auto}.auto-task-popup[_ngcontent-%COMP%] .upload-box[_ngcontent-%COMP%]{border:1px dashed #99c3ff;border-radius:8px;padding:28px;background:#f8fbff}.auto-task-popup[_ngcontent-%COMP%] .ref-img[_ngcontent-%COMP%]{max-width:220px;max-height:160px;object-fit:cover}.auto-task-popup[_ngcontent-%COMP%] .remove-img[_ngcontent-%COMP%]{position:absolute;top:-8px;right:-8px;background:#fff;border:1px solid #e4e6ef;border-radius:50%;width:22px;height:22px;line-height:20px;text-align:center;font-size:16px;color:#667085}.auto-task-popup[_ngcontent-%COMP%] .w-80px[_ngcontent-%COMP%]{width:80px}.auto-task-popup[_ngcontent-%COMP%] .text-muted[_ngcontent-%COMP%]{color:#667085!important;font-size:13px}.auto-task-popup[_ngcontent-%COMP%] .locked-note[_ngcontent-%COMP%]{color:#667085;font-size:12px;font-style:italic}.auto-task-popup[_ngcontent-%COMP%] .btn-outline[_ngcontent-%COMP%]{border:1px solid #d0d5dd}"] });
604
+ }
605
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AutoTaskPopupComponent, [{
606
+ type: Component,
607
+ args: [{ selector: 'lib-auto-task-popup', template: "<div class=\"auto-task-popup d-flex flex-column\">\n <div class=\"atp-header d-flex align-items-center justify-content-between px-8 pt-8 pb-4\">\n <h2 class=\"fw-bold fs-3 mb-0\">Create Auto Task</h2>\n <span class=\"cursor-pointer\" (click)=\"cancel()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M18 6L6 18M6 6L18 18\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </span>\n </div>\n\n <form [formGroup]=\"autoTaskForm\" class=\"d-flex flex-column atp-form\">\n <div class=\"atp-body px-8\">\n <div class=\"mb-5\">\n <label class=\"fw-semibold d-block mb-2\">Task Name</label>\n <input type=\"text\" class=\"form-control form-control-solid\" placeholder=\"Enter task name\"\n formControlName=\"taskName\">\n <p class=\"text-danger mt-1 mb-0\"\n *ngIf=\"autoTaskForm.get('taskName')?.touched && autoTaskForm.get('taskName')?.invalid\">\n Task name is required.</p>\n </div>\n\n <div class=\"mb-5\">\n <label class=\"fw-semibold d-block mb-2\">Description</label>\n <textarea rows=\"3\" class=\"form-control form-control-solid\" placeholder=\"Enter task description\"\n formControlName=\"taskDescription\"></textarea>\n </div>\n\n <div class=\"mb-5\">\n <label class=\"fw-semibold d-block mb-2\">Answer Type</label>\n <select class=\"form-select form-select-solid\" formControlName=\"answerType\"\n (change)=\"onAnswerTypeChange($event)\">\n <option *ngFor=\"let opt of answerTypeOptions\" [value]=\"opt.value\">{{ opt.label }}</option>\n </select>\n </div>\n\n <div class=\"mb-5\" *ngIf=\"currentType !== 'time'\">\n <label class=\"fw-semibold d-block mb-2\">Answer Options</label>\n\n <!-- dropdown: Allow Multiple -->\n <div class=\"form-check form-switch mb-3\" *ngIf=\"currentType === 'dropdown'\">\n <input class=\"form-check-input cursor-pointer\" type=\"checkbox\" id=\"atpAllowMultiple\"\n formControlName=\"allowMultiple\">\n <label class=\"form-check-label ms-2 cursor-pointer\" for=\"atpAllowMultiple\">Allow Multiple\n Response</label>\n </div>\n\n <!-- descriptive / multipleImage: text vs number -->\n <div class=\"d-flex mb-2\"\n *ngIf=\"currentType === 'descriptive' || currentType === 'multipleImage'\">\n <div class=\"form-check me-5\">\n <input class=\"form-check-input cursor-pointer\" type=\"radio\" value=\"text\"\n formControlName=\"descriptivetype\" id=\"atpDtText\">\n <label class=\"form-check-label cursor-pointer\" for=\"atpDtText\">Text</label>\n </div>\n <div class=\"form-check\">\n <input class=\"form-check-input cursor-pointer\" type=\"radio\" value=\"number\"\n formControlName=\"descriptivetype\" id=\"atpDtNumber\">\n <label class=\"form-check-label cursor-pointer\" for=\"atpDtNumber\">Number</label>\n </div>\n </div>\n\n <div formArrayName=\"answers\">\n <!-- yes/no -->\n <ng-container *ngIf=\"currentType === 'yes/no'\">\n <div class=\"mb-3\" *ngFor=\"let answer of answersFA.controls; let k = index\" [formGroupName]=\"k\">\n <input formControlName=\"answer\" type=\"text\" class=\"form-control form-control-solid\"\n placeholder=\"Enter answer here\">\n <div class=\"text-danger mt-1\"\n *ngIf=\"answer.get('answer')?.touched && answer.get('answer')?.invalid\">* Answer is\n required</div>\n </div>\n </ng-container>\n\n <!-- multiple choice (single / multiple) + dropdown -->\n <ng-container\n *ngIf=\"currentType === 'multiplechoicesingle' || currentType === 'multiplechoicemultiple' || currentType === 'dropdown'\">\n <div class=\"mb-3\" *ngFor=\"let answer of answersFA.controls; let k = index\" [formGroupName]=\"k\">\n <div class=\"d-flex align-items-center\">\n <input formControlName=\"answer\" type=\"text\" class=\"form-control form-control-solid\"\n placeholder=\"Enter answer here\">\n <span class=\"ms-3 cursor-pointer text-danger fs-3\" *ngIf=\"canRemoveOption()\"\n (click)=\"removeOption(k)\" title=\"Remove option\">&times;</span>\n </div>\n <div class=\"text-danger mt-1\"\n *ngIf=\"answer.get('answer')?.touched && answer.get('answer')?.invalid\">* Answer is\n required</div>\n </div>\n <div class=\"text-danger mb-2\" *ngIf=\"answersFA.errors\">Options must be unique.</div>\n <div class=\"text-primary fw-semibold cursor-pointer\"\n *ngIf=\"currentType === 'multiplechoicesingle' || currentType === 'multiplechoicemultiple'\"\n (click)=\"addOption()\">+ Add More Answer</div>\n </ng-container>\n\n <!-- date -->\n <ng-container *ngIf=\"currentType === 'date' && answersFA.length\">\n <div [formGroupName]=\"0\" class=\"form-check\">\n <input class=\"form-check-input cursor-pointer\" type=\"checkbox\" id=\"atpHistoricDate\"\n formControlName=\"historicDate\">\n <label class=\"form-check-label ms-2 cursor-pointer\" for=\"atpHistoricDate\">Allow Historic\n Dates on Date Picker</label>\n </div>\n </ng-container>\n\n <!-- linear scale -->\n <ng-container *ngIf=\"currentType === 'linearscale' && answersFA.length\">\n <div [formGroupName]=\"0\" class=\"row\">\n <div class=\"col-md-4 mb-3\">\n <label class=\"mb-1\">Select Type</label>\n <select class=\"form-select form-select-solid\" formControlName=\"linearType\"\n (change)=\"updateLinearTypeRange($event)\">\n <option value=\"number\">Whole Number</option>\n <option value=\"degree\">Degree \u00B0C</option>\n <option value=\"percentage\">Percentage</option>\n </select>\n </div>\n <div class=\"col-md-4 mb-3\">\n <label class=\"mb-1\">Min Value</label>\n <lib-counter formControlName=\"rangeStart\" [step]=\"1\" placeholder=\"0\"\n [type]=\"answersFA.at(0)?.get('linearType')?.value ?? 'number'\"></lib-counter>\n </div>\n <div class=\"col-md-4 mb-3\">\n <label class=\"mb-1\">Max Value</label>\n <lib-counter formControlName=\"rangeEnd\" [step]=\"1\" placeholder=\"100\"\n [type]=\"answersFA.at(0)?.get('linearType')?.value ?? 'number'\"></lib-counter>\n </div>\n <div class=\"text-danger\" *ngIf=\"answersFA.at(0)?.hasError('invalidRange')\">* Min value must\n be less than max value.</div>\n </div>\n </ng-container>\n\n <!-- image / video: upload limits -->\n <ng-container *ngIf=\"currentType === 'image/video' && answersFA.length\">\n <div [formGroupName]=\"0\" class=\"row align-items-end\">\n <div class=\"col-md-4 form-check form-switch mb-3\">\n <input class=\"form-check-input cursor-pointer\" type=\"checkbox\" id=\"atpLimit\"\n formControlName=\"limit\">\n <label class=\"form-check-label ms-2 cursor-pointer\" for=\"atpLimit\">Set upload\n limits</label>\n </div>\n <div class=\"col-md-4 mb-3\" *ngIf=\"answersFA.at(0)?.get('limit')?.value\">\n <label class=\"mb-1\">Image limit</label>\n <input type=\"number\" min=\"1\" class=\"form-control form-control-solid\"\n formControlName=\"imageLimit\">\n </div>\n <div class=\"col-md-4 mb-3\" *ngIf=\"answersFA.at(0)?.get('limit')?.value\">\n <label class=\"mb-1\">Video limit</label>\n <input type=\"number\" min=\"1\" class=\"form-control form-control-solid\"\n formControlName=\"videoLimit\">\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n\n <div class=\"mb-5\">\n <label class=\"fw-semibold d-block mb-2\">Reference Image</label>\n <div class=\"upload-box text-center cursor-pointer\"\n *ngIf=\"!autoTaskForm.get('referenceImage')?.value\" (click)=\"refImgInput.click()\">\n <span class=\"text-primary fw-semibold\">{{ uploading ? 'Uploading...' : 'Click to Upload Image' }}</span>\n </div>\n <div class=\"position-relative d-inline-block\" *ngIf=\"autoTaskForm.get('referenceImage')?.value\">\n <img class=\"ref-img rounded\"\n [src]=\"environment?.TraxAnswerCDN + autoTaskForm.get('referenceImage')?.value\" alt=\"Reference\">\n <span class=\"remove-img cursor-pointer\" (click)=\"removeReferenceImage()\">&times;</span>\n </div>\n <input #refImgInput type=\"file\" accept=\"image/png, image/jpeg\" hidden\n (change)=\"uploadReferenceImage($event)\">\n </div>\n\n <div class=\"mb-5\">\n <div class=\"fw-semibold\">Task Assignee</div>\n <div class=\"text-muted mb-3\">Choose who the flagged task is assigned to</div>\n <div class=\"d-flex mb-3\">\n <input class=\"form-check-input mt-1 cursor-pointer\" type=\"radio\" value=\"submitter\"\n formControlName=\"taskAssignee\" id=\"assigneeSubmitter\">\n <label class=\"ms-3 cursor-pointer\" for=\"assigneeSubmitter\">\n <div class=\"fw-semibold\">Checklist Submitter</div>\n <div class=\"text-muted\">Task is assigned to the user who filled the checklist</div>\n </label>\n </div>\n <div class=\"d-flex\">\n <input class=\"form-check-input mt-1 cursor-pointer\" type=\"radio\" value=\"storeuser\"\n formControlName=\"taskAssignee\" id=\"assigneeStore\">\n <label class=\"ms-3 cursor-pointer\" for=\"assigneeStore\">\n <div class=\"fw-semibold\">Store User</div>\n <div class=\"text-muted\">Task is assigned to the user mapped to the flagged store</div>\n </label>\n </div>\n <div class=\"locked-note mt-2\" *ngIf=\"!isFirst\">\n Assignee is set from the first auto task and applies to all questions.\n </div>\n </div>\n\n <div class=\"mb-5\">\n <div class=\"fw-semibold\">Task Validity</div>\n <div class=\"text-muted mb-3\">Set how long the auto task stays valid to complete</div>\n <div class=\"d-flex align-items-center\">\n <span class=\"me-3\">Task valid for</span>\n <select class=\"form-select form-select-solid w-80px\" formControlName=\"taskValidity\">\n <option *ngFor=\"let d of validityOptions\" [ngValue]=\"d\">{{ d }}</option>\n </select>\n <span class=\"ms-3\">Days from task creation</span>\n </div>\n <div class=\"locked-note mt-2\" *ngIf=\"!isFirst\">\n Validity is set from the first auto task and applies to all questions.\n </div>\n </div>\n </div>\n\n <div class=\"atp-footer d-flex px-8 pt-4 pb-8\">\n <button type=\"button\" class=\"btn btn-outline px-8 me-4\" (click)=\"cancel()\">Cancel</button>\n <button type=\"button\" class=\"btn btn-primary px-10\" (click)=\"submit()\">Create Task</button>\n </div>\n </form>\n</div>\n", styles: [".auto-task-popup{font-family:Inter;max-height:85vh}.auto-task-popup .atp-form{flex:1 1 auto;min-height:0}.auto-task-popup .atp-body{flex:1 1 auto;min-height:0;overflow-y:auto}.auto-task-popup .atp-header,.auto-task-popup .atp-footer{flex:0 0 auto}.auto-task-popup .upload-box{border:1px dashed #99c3ff;border-radius:8px;padding:28px;background:#f8fbff}.auto-task-popup .ref-img{max-width:220px;max-height:160px;object-fit:cover}.auto-task-popup .remove-img{position:absolute;top:-8px;right:-8px;background:#fff;border:1px solid #e4e6ef;border-radius:50%;width:22px;height:22px;line-height:20px;text-align:center;font-size:16px;color:#667085}.auto-task-popup .w-80px{width:80px}.auto-task-popup .text-muted{color:#667085!important;font-size:13px}.auto-task-popup .locked-note{color:#667085;font-size:12px;font-style:italic}.auto-task-popup .btn-outline{border:1px solid #d0d5dd}\n"] }]
608
+ }], () => [{ type: i1.NgbActiveModal }, { type: i2.FormBuilder }, { type: i3.TraxService }, { type: i4.GlobalStateService }, { type: i5.ToastService }], { data: [{
609
+ type: Input
610
+ }] }); })();
611
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AutoTaskPopupComponent, { className: "AutoTaskPopupComponent", filePath: "lib\\components\\add-checklist\\auto-task-popup\\auto-task-popup.component.ts", lineNumber: 25 }); })();
612
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0by10YXNrLXBvcHVwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLWFuYWx5c2UtdHJheC9zcmMvbGliL2NvbXBvbmVudHMvYWRkLWNoZWNrbGlzdC9hdXRvLXRhc2stcG9wdXAvYXV0by10YXNrLXBvcHVwLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLWFuYWx5c2UtdHJheC9zcmMvbGliL2NvbXBvbmVudHMvYWRkLWNoZWNrbGlzdC9hdXRvLXRhc2stcG9wdXAvYXV0by10YXNrLXBvcHVwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUNwRSxPQUFPLEVBQXFDLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRS9FLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSTFDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBQzFGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNEQUFzRCxDQUFDO0FBQzdGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrREFBa0QsQ0FBQzs7Ozs7Ozs7OztJQ1FsRSw2QkFDMkY7SUFDdkYsdUNBQXNCO0lBQUEsaUJBQUk7OztJQWExQixrQ0FBa0U7SUFBQSxZQUFlO0lBQUEsaUJBQVM7OztJQUE1QyxvQ0FBbUI7SUFBQyxjQUFlO0lBQWYsa0NBQWU7OztJQVFyRiwrQkFBNEU7SUFDeEUsNEJBQ29DO0lBQ3BDLGlDQUEyRTtJQUFBLHVDQUMvRDtJQUNoQixBQURnQixpQkFBUSxFQUNsQjs7O0lBS0YsQUFGSiwrQkFDNkUsY0FDNUM7SUFDekIsNEJBQ3FEO0lBQ3JELGlDQUErRDtJQUFBLG9CQUFJO0lB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QURzRixpQkFBUyxFQUN6RixFQUNILEVBQ0w7Ozs7O1lBNU1JLGVBQTBCO1lBQTFCLDRDQUEwQjtZQU9mLGVBQW9GO1lBQXBGLHlMQUFvRjtZQWM3RCxlQUFvQjtZQUFwQiwrQ0FBb0I7WUFJakMsY0FBNEI7WUFBNUIsaURBQTRCO1lBMEh0QyxlQUFnRDtZQUFoRCwyR0FBZ0Q7WUFHTixjQUErQztZQUEvQyx3R0FBK0M7WUE0Qi9ELGdCQUFjO1lBQWQsbUNBQWM7WUFXZixnQkFBa0I7WUFBbEIsNkNBQWtCO1lBSWpCLGVBQWM7WUFBZCxtQ0FBYzs7O2lGRHBMaEQsc0JBQXNCO2NBTGxDLFNBQVM7MkJBQ0UscUJBQXFCOytKQUt0QixJQUFJO2tCQUFaLEtBQUs7O2tGQURLLHNCQUFzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBGb3JtQXJyYXksIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBOZ2JBY3RpdmVNb2RhbCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgR2xvYmFsU3RhdGVTZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLWdsb2JhbCc7XG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICd0YW5nby1hcHAtdWktc2hhcmVkJztcbmltcG9ydCB7IFRyYXhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdHJheC5zZXJ2aWNlJztcbmltcG9ydCB7IG5vV2hpdGVzcGFjZVZhbGlkYXRvciB9IGZyb20gJy4uLy4uL2NyZWF0ZS10YXNrL3ZhbGlkYXRvcnMvd2hpdGVzcGFjZS12YWxpZGF0b3InO1xuaW1wb3J0IHsgdW5pcXVlU3RyaW5nVmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vY3JlYXRlLXRhc2svdmFsaWRhdG9ycy91bmlxdWUtc3RyaW5nLXZhbGlkYXRvcic7XG5pbXBvcnQgeyByYW5nZVZhbGlkYXRvciB9IGZyb20gJy4uLy4uL2NyZWF0ZS10YXNrL3ZhbGlkYXRvcnMvYXNjZW5kaW5nLXZhbGlkYXRvcic7XG5cbi8qKlxuICogRGV0YWlscyBkaWFsb2cgZm9yIHRoZSBwZXItYW5zd2VyIFwiQ3JlYXRlIEF1dG8gVGFza1wiIGZsb3cgaW4gYWRkLWNoZWNrbGlzdC5cbiAqIE9wZW5lZCBmcm9tIEFkZENoZWNrbGlzdENvbXBvbmVudCBhZnRlciB0aGUgdXNlciBjb25maXJtcyBcIlllc1wiIG9uIHRoZVxuICogXCJDcmVhdGUgQXV0byBUYXNrP1wiIHByb21wdC4gV2hlbiBgZGF0YS5pc0ZpcnN0QXV0b1Rhc2tgIGlzIGZhbHNlIHRoZSBUYXNrXG4gKiBBc3NpZ25lZSArIFRhc2sgVmFsaWRpdHkgY29udHJvbHMgYXJlIGRpc2FibGVkL3JlYWQtb25seSAobG9ja2VkIHRvIHRoZVxuICogY2hvaWNlIG1hZGUgb24gdGhlIGZpcnN0IGF1dG8gdGFzaykuIENsb3NlcyB3aXRoIHRoZSBjYXB0dXJlZCBwYXlsb2FkLCBvclxuICogZGlzbWlzc2VzIG9uIGNhbmNlbC9iYWNrZHJvcC5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLWF1dG8tdGFzay1wb3B1cCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9hdXRvLXRhc2stcG9wdXAuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vYXV0by10YXNrLXBvcHVwLmNvbXBvbmVudC5zY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgQXV0b1Rhc2tQb3B1cENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQElucHV0KCkgZGF0YTogYW55ID0ge307XG4gIGF1dG9UYXNrRm9ybSE6IEZvcm1Hcm91cDtcbiAgZW52aXJvbm1lbnQ6IGFueSA9IHt9O1xuICB1cGxvYWRpbmcgPSBmYWxzZTtcbiAgdmFsaWRpdHlPcHRpb25zOiBudW1iZXJbXSA9IFsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTUsIDIwLCAyNSwgMzBdO1xuICBhbnN3ZXJUeXBlT3B0aW9uczogeyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH1bXSA9IFtcbiAgICB7IGxhYmVsOiAnRGVzY3JpcHRpdmUgQW5zd2VyJywgdmFsdWU6ICdkZXNjcmlwdGl2ZScgfSxcbiAgICB7IGxhYmVsOiAnQS9CIFF1ZXN0aW9uJywgdmFsdWU6ICd5ZXMvbm8nIH0sXG4gICAgeyBsYWJlbDogJ011bHRpcGxlIENob2ljZSBRdWVzdGlvbiAtIFNpbmdsZSBBbnN3ZXInLCB2YWx1ZTogJ211bHRpcGxlY2hvaWNlc2luZ2xlJyB9LFxuICAgIHsgbGFiZWw6ICdNdWx0aXBsZSBDaG9pY2UgUXVlc3Rpb24gLSBNdWx0aXBsZSBBbnN3ZXInLCB2YWx1ZTogJ211bHRpcGxlY2hvaWNlbXVsdGlwbGUnIH0sXG4gICAgeyBsYWJlbDogJ0NhcHR1cmUgSW1hZ2Ugd2l0aCBEZXNjcmlwdGlvbicsIHZhbHVlOiAnZGVzY3JpcHRpdmVJbWFnZScgfSxcbiAgICB7IGxhYmVsOiAnQ2FwdHVyZSBJbWFnZSBhcyBhbnN3ZXInLCB2YWx1ZTogJ2ltYWdlJyB9LFxuICAgIHsgbGFiZWw6ICdDYXB0dXJlIHZpZGVvIGFzIGFuc3dlcicsIHZhbHVlOiAndmlkZW8nIH0sXG4gICAgeyBsYWJlbDogJ0NhcHR1cmUgTXVsdGlwbGUgSW1hZ2UnLCB2YWx1ZTogJ211bHRpcGxlSW1hZ2UnIH0sXG4gICAgeyBsYWJlbDogJ0RhdGUgLSBERC9NTS9ZWVlZJywgdmFsdWU6ICdkYXRlJyB9LFxuICAgIHsgbGFiZWw6ICdMaW5lYXIgU2NhbGUnLCB2YWx1ZTogJ2xpbmVhcnNjYWxlJyB9LFxuICAgIHsgbGFiZWw6ICdUaW1lJywgdmFsdWU6ICd0aW1lJyB9LFxuICAgIHsgbGFiZWw6ICdEcm9wZG93bicsIHZhbHVlOiAnZHJvcGRvd24nIH0sXG4gICAgeyBsYWJlbDogJ0ltYWdlL1ZpZGVvJywgdmFsdWU6ICdpbWFnZS92aWRlbycgfSxcbiAgXTtcbiAgcHJpdmF0ZSBkZXRhY2ggPSBuZXcgU3ViamVjdCgpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBkaWFsb2dSZWY6IE5nYkFjdGl2ZU1vZGFsLFxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgc29wU2VydmljZTogVHJheFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBnczogR2xvYmFsU3RhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgdG9hc3Q6IFRvYXN0U2VydmljZSxcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZ3MuZW52aXJvbm1lbnQucGlwZSh0YWtlVW50aWwodGhpcy5kZXRhY2gpKS5zdWJzY3JpYmUoKGVudjogYW55KSA9PiB7XG4gICAgICBpZiAoZW52KSB0aGlzLmVudmlyb25tZW50ID0gZW52O1xuICAgIH0pO1xuXG4gICAgdGhpcy5hdXRvVGFza0Zvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIHRhc2tOYW1lOiB0aGlzLmZiLmNvbnRyb2wodGhpcy5kYXRhPy50YXNrTmFtZSB8fCAnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSxcbiAgICAgIHRhc2tEZXNjcmlwdGlvbjogdGhpcy5mYi5jb250cm9sKHRoaXMuZGF0YT8udGFza0Rlc2NyaXB0aW9uIHx8ICcnKSxcbiAgICAgIGFuc3dlclR5cGU6IHRoaXMuZmIuY29udHJvbCh0aGlzLmRhdGE/LmFuc3dlclR5cGUgfHwgJ2ltYWdlJyksXG4gICAgICByZWZlcmVuY2VJbWFnZTogdGhpcy5mYi5jb250cm9sKHRoaXMuZGF0YT8ucmVmZXJlbmNlSW1hZ2UgfHwgJycpLFxuICAgICAgdGFza0Fzc2lnbmVlOiB0aGlzLmZiLmNvbnRyb2wodGhpcy5kYXRhPy50YXNrQXNzaWduZWUgfHwgJ3N1Ym1pdHRlcicpLFxuICAgICAgdGFza1ZhbGlkaXR5OiB0aGlzLmZiLmNvbnRyb2wodGhpcy5kYXRhPy50YXNrVmFsaWRpdHkgPz8gMTApLFxuICAgICAgYW5zd2VyczogdGhpcy5mYi5hcnJheShbXSksXG4gICAgICBhbGxvd011bHRpcGxlOiB0aGlzLmZiLmNvbnRyb2wodGhpcy5kYXRhPy5hbGxvd011bHRpcGxlID8/IGZhbHNlKSxcbiAgICAgIGRlc2NyaXB0aXZldHlwZTogdGhpcy5mYi5jb250cm9sKHRoaXMuZGF0YT8uZGVzY3JpcHRpdmV0eXBlID8/ICd0ZXh0JyksXG4gICAgfSk7XG5cbiAgICAvLyBUYXNrIG5hbWUgaXMgZGVyaXZlZCBmcm9tIHRoZSBxdWVzdGlvbiAoYW5kIGFuc3dlciBvcHRpb24pIGFuZCBpcyByZWFkLW9ubHkuXG4gICAgdGhpcy5hdXRvVGFza0Zvcm0uZ2V0KCd0YXNrTmFtZScpPy5kaXNhYmxlKCk7XG5cbiAgICAvLyBBc3NpZ25lZSArIHZhbGlkaXR5IGFyZSBzZXQgb25jZSBvbiB0aGUgZmlyc3QgYXV0byB0YXNrIGFuZCBsb2NrZWQgZm9yIGFsbCBvdGhlcnMuXG4gICAgaWYgKCF0aGlzLmRhdGE/LmlzRmlyc3RBdXRvVGFzaykge1xuICAgICAgdGhpcy5hdXRvVGFza0Zvcm0uZ2V0KCd0YXNrQXNzaWduZWUnKT8uZGlzYWJsZSgpO1xuICAgICAgdGhpcy5hdXRvVGFza0Zvcm0uZ2V0KCd0YXNrVmFsaWRpdHknKT8uZGlzYWJsZSgpO1xuICAgIH1cblxuICAgIC8vIFNlZWQgdGhlIHBlci1hbnN3ZXItdHlwZSBvcHRpb24gYnVpbGRlciAoZnJvbSBzYXZlZCBkYXRhIG9uIGVkaXQsIGVsc2UgdHlwZSBkZWZhdWx0cykuXG4gICAgdGhpcy5idWlsZEFuc3dlcnModGhpcy5hdXRvVGFza0Zvcm0uZ2V0KCdhbnN3ZXJUeXBlJyk/LnZhbHVlLCB0aGlzLmRhdGE/LmFuc3dlcnMpO1xuICB9XG5cbiAgZ2V0IGlzRmlyc3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5kYXRhPy5pc0ZpcnN0QXV0b1Rhc2s7XG4gIH1cblxuICAvLyA9PT09PSBBbnN3ZXItb3B0aW9ucyBidWlsZGVyIChtaXJyb3JzIHRoZSBnYWxsZXJ5IGNyZWF0ZS10YXNrIHBlci10eXBlIFVJKSA9PT09PVxuICBnZXQgYW5zd2Vyc0ZBKCk6IEZvcm1BcnJheSB7XG4gICAgcmV0dXJuIHRoaXMuYXV0b1Rhc2tGb3JtLmdldCgnYW5zd2VycycpIGFzIEZvcm1BcnJheTtcbiAgfVxuXG4gIGdldCBjdXJyZW50VHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmF1dG9UYXNrRm9ybS5nZXQoJ2Fuc3dlclR5cGUnKT8udmFsdWU7XG4gIH1cblxuICBvbkFuc3dlclR5cGVDaGFuZ2UoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IHR5cGUgPSBldmVudD8udGFyZ2V0Py52YWx1ZTtcbiAgICB3aGlsZSAodGhpcy5hbnN3ZXJzRkEubGVuZ3RoKSB7XG4gICAgICB0aGlzLmFuc3dlcnNGQS5yZW1vdmVBdCgwKTtcbiAgICB9XG4gICAgdGhpcy5hdXRvVGFza0Zvcm0uZ2V0KCdkZXNjcmlwdGl2ZXR5cGUnKT8uc2V0VmFsdWUoJ3RleHQnKTtcbiAgICB0aGlzLmF1dG9UYXNrRm9ybS5nZXQoJ2FsbG93TXVsdGlwbGUnKT8uc2V0VmFsdWUoZmFsc2UpO1xuICAgIHRoaXMuYnVpbGRBbnN3ZXJzKHR5cGUpO1xuICB9XG5cbiAgLy8gU2VlZCB0aGUgYW5zd2VycyBGb3JtQXJyYXkgZm9yIGEgdHlwZTogZnJvbSBzYXZlZCBkYXRhIChlZGl0KSBvciB0eXBlIGRlZmF1bHRzIChjcmVhdGUpLlxuICBwcml2YXRlIGJ1aWxkQW5zd2Vycyh0eXBlOiBzdHJpbmcsIHNhdmVkPzogYW55W10pOiB2b2lkIHtcbiAgICBjb25zdCBvcHRpb25UeXBlcyA9IFsneWVzL25vJywgJ211bHRpcGxlY2hvaWNlc2luZ2xlJywgJ211bHRpcGxlY2hvaWNlbXVsdGlwbGUnLCAnZHJvcGRvd24nXTtcbiAgICBpZiAoc2F2ZWQgJiYgc2F2ZWQubGVuZ3RoKSB7XG4gICAgICBzYXZlZC5mb3JFYWNoKChhKSA9PiB0aGlzLmFkZEFuc3dlckdyb3VwKHR5cGUsIGEpKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICd5ZXMvbm8nKSB7XG4gICAgICB0aGlzLmFkZEFuc3dlckdyb3VwKHR5cGUsIHsgYW5zd2VyOiAnWWVzJyB9KTtcbiAgICAgIHRoaXMuYWRkQW5zd2VyR3JvdXAodHlwZSwgeyBhbnN3ZXI6ICdObycgfSk7XG4gICAgfSBlbHNlIGlmIChbJ211bHRpcGxlY2hvaWNlc2luZ2xlJywgJ211bHRpcGxlY2hvaWNlbXVsdGlwbGUnLCAnZHJvcGRvd24nXS5pbmNsdWRlcyh0eXBlKSkge1xuICAgICAgdGhpcy5hZGRBbnN3ZXJHcm91cCh0eXBlKTtcbiAgICAgIHRoaXMuYWRkQW5zd2VyR3JvdXAodHlwZSk7XG4gICAgfSBlbHNlIGlmIChbJ2Rlc2NyaXB0aXZlJywgJ3RpbWUnXS5pbmNsdWRlcyh0eXBlKSkge1xuICAgICAgLy8gbm8gb3B0aW9uIHJvd3M6IGRlc2NyaXB0aXZlIHVzZXMgdGhlIHRleHQvbnVtYmVyIHJhZGlvczsgdGltZSBoYXMgbm9uZVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBsaW5lYXJzY2FsZSwgZGF0ZSwgaW1hZ2UvdmlkZW8sIGltYWdlLCBkZXNjcmlwdGl2ZUltYWdlLCB2aWRlbywgbXVsdGlwbGVJbWFnZVxuICAgICAgdGhpcy5hZGRBbnN3ZXJHcm91cCh0eXBlKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvblR5cGVzLmluY2x1ZGVzKHR5cGUpKSB7XG4gICAgICB0aGlzLmFuc3dlcnNGQS5zZXRWYWxpZGF0b3JzKHVuaXF1ZVN0cmluZ1ZhbGlkYXRvcigpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hbnN3ZXJzRkEuY2xlYXJWYWxpZGF0b3JzKCk7XG4gICAgfVxuICAgIHRoaXMuYW5zd2Vyc0ZBLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkQW5zd2VyR3JvdXAodHlwZTogc3RyaW5nLCBhPzogYW55KTogdm9pZCB7XG4gICAgY29uc3QgbiA9IHRoaXMuYW5zd2Vyc0ZBLmxlbmd0aCArIDE7XG4gICAgY29uc3QgaXNPcHRpb24gPSBbJ3llcy9ubycsICdtdWx0aXBsZWNob2ljZXNpbmdsZScsICdtdWx0aXBsZWNob2ljZW11bHRpcGxlJywgJ2Ryb3Bkb3duJ10uaW5jbHVkZXModHlwZSk7XG4gICAgY29uc3QgZ3JvdXA6IGFueSA9IHtcbiAgICAgIGFuc3dlcjogdGhpcy5mYi5jb250cm9sKGE/LmFuc3dlciA/PyAnJywgaXNPcHRpb24gPyBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgbm9XaGl0ZXNwYWNlVmFsaWRhdG9yKCldIDogW10pLFxuICAgICAgYW5zd2Vyb3B0aW9uTnVtYmVyOiB0aGlzLmZiLmNvbnRyb2wobiwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSxcbiAgICAgIGluZGV4OiB0aGlzLmZiLmNvbnRyb2wobiAtIDEpLFxuICAgIH07XG4gICAgaWYgKHR5cGUgPT09ICdsaW5lYXJzY2FsZScpIHtcbiAgICAgIGdyb3VwLnJhbmdlU3RhcnQgPSB0aGlzLmZiLmNvbnRyb2woYT8ucmFuZ2VTdGFydCA/PyAwKTtcbiAgICAgIGdyb3VwLnJhbmdlRW5kID0gdGhpcy5mYi5jb250cm9sKGE/LnJhbmdlRW5kID8/IDEwMCk7XG4gICAgICBncm91cC5saW5lYXJUeXBlID0gdGhpcy5mYi5jb250cm9sKGE/LmxpbmVhclR5cGUgPz8gJ251bWJlcicpO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gJ2RhdGUnKSB7XG4gICAgICBncm91cC5oaXN0b3JpY0RhdGUgPSB0aGlzLmZiLmNvbnRyb2woYT8uaGlzdG9yaWNEYXRlID8/IGZhbHNlKTtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09ICdpbWFnZS92aWRlbycpIHtcbiAgICAgIGdyb3VwLmxpbWl0ID0gdGhpcy5mYi5jb250cm9sKGE/LmxpbWl0ID8/IGZhbHNlKTtcbiAgICAgIGdyb3VwLmltYWdlTGltaXQgPSB0aGlzLmZiLmNvbnRyb2woYT8uaW1hZ2VMaW1pdCA/PyAxKTtcbiAgICAgIGdyb3VwLnZpZGVvTGltaXQgPSB0aGlzLmZiLmNvbnRyb2woYT8udmlkZW9MaW1pdCA/PyAxKTtcbiAgICB9XG4gICAgY29uc3QgZmcgPSB0aGlzLmZiLmdyb3VwKGdyb3VwLCB0eXBlID09PSAnbGluZWFyc2NhbGUnID8geyB2YWxpZGF0b3JzOiBbcmFuZ2VWYWxpZGF0b3IoKV0gfSA6IHt9KTtcbiAgICB0aGlzLmFuc3dlcnNGQS5wdXNoKGZnKTtcbiAgfVxuXG4gIGNhblJlbW92ZU9wdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hbnN3ZXJzRkEubGVuZ3RoID4gMjtcbiAgfVxuXG4gIGFkZE9wdGlvbigpOiB2b2lkIHtcbiAgICBpZiAoIVsnbXVsdGlwbGVjaG9pY2VzaW5nbGUnLCAnbXVsdGlwbGVjaG9pY2VtdWx0aXBsZSddLmluY2x1ZGVzKHRoaXMuY3VycmVudFR5cGUpKSByZXR1cm47XG4gICAgdGhpcy5hZGRBbnN3ZXJHcm91cCh0aGlzLmN1cnJlbnRUeXBlKTtcbiAgfVxuXG4gIHJlbW92ZU9wdGlvbihrOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2FuUmVtb3ZlT3B0aW9uKCkpIHJldHVybjtcbiAgICB0aGlzLmFuc3dlcnNGQS5yZW1vdmVBdChrKTtcbiAgfVxuXG4gIHVwZGF0ZUxpbmVhclR5cGVSYW5nZShfZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuYW5zd2Vyc0ZBLmF0KDApPy5wYXRjaFZhbHVlKHsgcmFuZ2VTdGFydDogMCwgcmFuZ2VFbmQ6IDEwMCB9KTtcbiAgfVxuXG4gIHVwbG9hZFJlZmVyZW5jZUltYWdlKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGlmICghaW5wdXQ/LmZpbGVzPy5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBmaWxlID0gaW5wdXQuZmlsZXNbMF07XG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCBmaWxlLCBmaWxlLm5hbWUpO1xuICAgIGZvcm1EYXRhLmFwcGVuZCgnY2xpZW50SWQnLCB0aGlzLmRhdGE/LmNsaWVudElkKTtcbiAgICB0aGlzLnVwbG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5zb3BTZXJ2aWNlLmltYWdldXBsb2FkKGZvcm1EYXRhKS5waXBlKHRha2VVbnRpbCh0aGlzLmRldGFjaCkpLnN1YnNjcmliZShcbiAgICAgIChyZXM6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnVwbG9hZGluZyA9IGZhbHNlO1xuICAgICAgICBpbnB1dC52YWx1ZSA9ICcnO1xuICAgICAgICBpZiAocmVzPy5kYXRhPy5pbWdVcmwpIHtcbiAgICAgICAgICB0aGlzLmF1dG9UYXNrRm9ybS5nZXQoJ3JlZmVyZW5jZUltYWdlJyk/LnNldFZhbHVlKHJlcy5kYXRhLmltZ1VybCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMudXBsb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIGlucHV0LnZhbHVlID0gJyc7XG4gICAgICAgIHRoaXMudG9hc3QuZ2V0RXJyb3JUb2FzdCgnSW1hZ2UgdXBsb2FkIGZhaWxlZC4gUGxlYXNlIHRyeSBhZ2Fpbi4nKTtcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHJlbW92ZVJlZmVyZW5jZUltYWdlKCk6IHZvaWQge1xuICAgIHRoaXMuYXV0b1Rhc2tGb3JtLmdldCgncmVmZXJlbmNlSW1hZ2UnKT8uc2V0VmFsdWUoJycpO1xuICB9XG5cbiAgc3VibWl0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmF1dG9UYXNrRm9ybS5pbnZhbGlkKSB7XG4gICAgICB0aGlzLmF1dG9UYXNrRm9ybS5tYXJrQWxsQXNUb3VjaGVkKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIGdldFJhd1ZhbHVlIHNvIHRoZSBsb2NrZWQgKGRpc2FibGVkKSBhc3NpZ25lZS92YWxpZGl0eSBhcmUgc3RpbGwgcmV0dXJuZWQuXG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UodGhpcy5hdXRvVGFza0Zvcm0uZ2V0UmF3VmFsdWUoKSk7XG4gIH1cblxuICBjYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5kaWFsb2dSZWYuZGlzbWlzcygpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXRhY2gubmV4dCgnJyk7XG4gICAgdGhpcy5kZXRhY2guY29tcGxldGUoKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImF1dG8tdGFzay1wb3B1cCBkLWZsZXggZmxleC1jb2x1bW5cIj5cbiAgICA8ZGl2IGNsYXNzPVwiYXRwLWhlYWRlciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIHB4LTggcHQtOCBwYi00XCI+XG4gICAgICAgIDxoMiBjbGFzcz1cImZ3LWJvbGQgZnMtMyBtYi0wXCI+Q3JlYXRlIEF1dG8gVGFzazwvaDI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiY2FuY2VsKClcIj5cbiAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTggNkw2IDE4TTYgNkwxOCAxOFwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L3NwYW4+XG4gICAgPC9kaXY+XG5cbiAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImF1dG9UYXNrRm9ybVwiIGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGF0cC1mb3JtXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhdHAtYm9keSBweC04XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItNVwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZ3LXNlbWlib2xkIGQtYmxvY2sgbWItMlwiPlRhc2sgTmFtZTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNvbGlkXCIgcGxhY2Vob2xkZXI9XCJFbnRlciB0YXNrIG5hbWVcIlxuICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ0YXNrTmFtZVwiPlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1kYW5nZXIgbXQtMSBtYi0wXCJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJhdXRvVGFza0Zvcm0uZ2V0KCd0YXNrTmFtZScpPy50b3VjaGVkICYmIGF1dG9UYXNrRm9ybS5nZXQoJ3Rhc2tOYW1lJyk/LmludmFsaWRcIj5cbiAgICAgICAgICAgICAgICAgICAgVGFzayBuYW1lIGlzIHJlcXVpcmVkLjwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItNVwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZ3LXNlbWlib2xkIGQtYmxvY2sgbWItMlwiPkRlc2NyaXB0aW9uPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8dGV4dGFyZWEgcm93cz1cIjNcIiBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc29saWRcIiBwbGFjZWhvbGRlcj1cIkVudGVyIHRhc2sgZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ0YXNrRGVzY3JpcHRpb25cIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi01XCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZnctc2VtaWJvbGQgZC1ibG9jayBtYi0yXCI+QW5zd2VyIFR5cGU8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdCBmb3JtLXNlbGVjdC1zb2xpZFwiIGZvcm1Db250cm9sTmFtZT1cImFuc3dlclR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uQW5zd2VyVHlwZUNoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG9wdCBvZiBhbnN3ZXJUeXBlT3B0aW9uc1wiIFt2YWx1ZV09XCJvcHQudmFsdWVcIj57eyBvcHQubGFiZWwgfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItNVwiICpuZ0lmPVwiY3VycmVudFR5cGUgIT09ICd0aW1lJ1wiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZ3LXNlbWlib2xkIGQtYmxvY2sgbWItMlwiPkFuc3dlciBPcHRpb25zPC9sYWJlbD5cblxuICAgICAgICAgICAgICAgIDwhLS0gZHJvcGRvd246IEFsbG93IE11bHRpcGxlIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIGZvcm0tc3dpdGNoIG1iLTNcIiAqbmdJZj1cImN1cnJlbnRUeXBlID09PSAnZHJvcGRvd24nXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgY3Vyc29yLXBvaW50ZXJcIiB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImF0cEFsbG93TXVsdGlwbGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiYWxsb3dNdWx0aXBsZVwiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsIG1zLTIgY3Vyc29yLXBvaW50ZXJcIiBmb3I9XCJhdHBBbGxvd011bHRpcGxlXCI+QWxsb3cgTXVsdGlwbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwhLS0gZGVzY3JpcHRpdmUgLyBtdWx0aXBsZUltYWdlOiB0ZXh0IHZzIG51bWJlciAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IG1iLTJcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImN1cnJlbnRUeXBlID09PSAnZGVzY3JpcHRpdmUnIHx8IGN1cnJlbnRUeXBlID09PSAnbXVsdGlwbGVJbWFnZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgbWUtNVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBjdXJzb3ItcG9pbnRlclwiIHR5cGU9XCJyYWRpb1wiIHZhbHVlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZGVzY3JpcHRpdmV0eXBlXCIgaWQ9XCJhdHBEdFRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgY3Vyc29yLXBvaW50ZXJcIiBmb3I9XCJhdHBEdFRleHRcIj5UZXh0PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IGN1cnNvci1wb2ludGVyXCIgdHlwZT1cInJhZGlvXCIgdmFsdWU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImRlc2NyaXB0aXZldHlwZVwiIGlkPVwiYXRwRHROdW1iZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgY3Vyc29yLXBvaW50ZXJcIiBmb3I9XCJhdHBEdE51bWJlclwiPk51bWJlcjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBmb3JtQXJyYXlOYW1lPVwiYW5zd2Vyc1wiPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIHllcy9ubyAtLT5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImN1cnJlbnRUeXBlID09PSAneWVzL25vJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIiAqbmdGb3I9XCJsZXQgYW5zd2VyIG9mIGFuc3dlcnNGQS5jb250cm9sczsgbGV0IGsgPSBpbmRleFwiIFtmb3JtR3JvdXBOYW1lXT1cImtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiYW5zd2VyXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc29saWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIGFuc3dlciBoZXJlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZGFuZ2VyIG10LTFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImFuc3dlci5nZXQoJ2Fuc3dlcicpPy50b3VjaGVkICYmIGFuc3dlci5nZXQoJ2Fuc3dlcicpPy5pbnZhbGlkXCI+KiBBbnN3ZXIgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIG11bHRpcGxlIGNob2ljZSAoc2luZ2xlIC8gbXVsdGlwbGUpICsgZHJvcGRvd24gLS0+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY3VycmVudFR5cGUgPT09ICdtdWx0aXBsZWNob2ljZXNpbmdsZScgfHwgY3VycmVudFR5cGUgPT09ICdtdWx0aXBsZWNob2ljZW11bHRpcGxlJyB8fCBjdXJyZW50VHlwZSA9PT0gJ2Ryb3Bkb3duJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIiAqbmdGb3I9XCJsZXQgYW5zd2VyIG9mIGFuc3dlcnNGQS5jb250cm9sczsgbGV0IGsgPSBpbmRleFwiIFtmb3JtR3JvdXBOYW1lXT1cImtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiYW5zd2VyXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc29saWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBhbnN3ZXIgaGVyZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1zLTMgY3Vyc29yLXBvaW50ZXIgdGV4dC1kYW5nZXIgZnMtM1wiICpuZ0lmPVwiY2FuUmVtb3ZlT3B0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZU9wdGlvbihrKVwiIHRpdGxlPVwiUmVtb3ZlIG9wdGlvblwiPiZ0aW1lczs8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZGFuZ2VyIG10LTFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImFuc3dlci5nZXQoJ2Fuc3dlcicpPy50b3VjaGVkICYmIGFuc3dlci5nZXQoJ2Fuc3dlcicpPy5pbnZhbGlkXCI+KiBBbnN3ZXIgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZGFuZ2VyIG1iLTJcIiAqbmdJZj1cImFuc3dlcnNGQS5lcnJvcnNcIj5PcHRpb25zIG11c3QgYmUgdW5pcXVlLjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtcHJpbWFyeSBmdy1zZW1pYm9sZCBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjdXJyZW50VHlwZSA9PT0gJ211bHRpcGxlY2hvaWNlc2luZ2xlJyB8fCBjdXJyZW50VHlwZSA9PT0gJ211bHRpcGxlY2hvaWNlbXVsdGlwbGUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkT3B0aW9uKClcIj4rIEFkZCBNb3JlIEFuc3dlcjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIGRhdGUgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjdXJyZW50VHlwZSA9PT0gJ2RhdGUnICYmIGFuc3dlcnNGQS5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW2Zvcm1Hcm91cE5hbWVdPVwiMFwiIGNsYXNzPVwiZm9ybS1jaGVja1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgY3Vyc29yLXBvaW50ZXJcIiB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImF0cEhpc3RvcmljRGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImhpc3RvcmljRGF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWwgbXMtMiBjdXJzb3ItcG9pbnRlclwiIGZvcj1cImF0cEhpc3RvcmljRGF0ZVwiPkFsbG93IEhpc3RvcmljXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGVzIG9uIERhdGUgUGlja2VyPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIGxpbmVhciBzY2FsZSAtLT5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImN1cnJlbnRUeXBlID09PSAnbGluZWFyc2NhbGUnICYmIGFuc3dlcnNGQS5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW2Zvcm1Hcm91cE5hbWVdPVwiMFwiIGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00IG1iLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibWItMVwiPlNlbGVjdCBUeXBlPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0IGZvcm0tc2VsZWN0LXNvbGlkXCIgZm9ybUNvbnRyb2xOYW1lPVwibGluZWFyVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInVwZGF0ZUxpbmVhclR5cGVSYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibnVtYmVyXCI+V2hvbGUgTnVtYmVyPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiZGVncmVlXCI+RGVncmVlIMKwQzwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInBlcmNlbnRhZ2VcIj5QZXJjZW50YWdlPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNCBtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cIm1iLTFcIj5NaW4gVmFsdWU8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLWNvdW50ZXIgZm9ybUNvbnRyb2xOYW1lPVwicmFuZ2VTdGFydFwiIFtzdGVwXT1cIjFcIiBwbGFjZWhvbGRlcj1cIjBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3R5cGVdPVwiYW5zd2Vyc0ZBLmF0KDApPy5nZXQoJ2xpbmVhclR5cGUnKT8udmFsdWUgPz8gJ251bWJlcidcIj48L2xpYi1jb3VudGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNCBtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cIm1iLTFcIj5NYXggVmFsdWU8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGliLWNvdW50ZXIgZm9ybUNvbnRyb2xOYW1lPVwicmFuZ2VFbmRcIiBbc3RlcF09XCIxXCIgcGxhY2Vob2xkZXI9XCIxMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3R5cGVdPVwiYW5zd2Vyc0ZBLmF0KDApPy5nZXQoJ2xpbmVhclR5cGUnKT8udmFsdWUgPz8gJ251bWJlcidcIj48L2xpYi1jb3VudGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwiYW5zd2Vyc0ZBLmF0KDApPy5oYXNFcnJvcignaW52YWxpZFJhbmdlJylcIj4qIE1pbiB2YWx1ZSBtdXN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGxlc3MgdGhhbiBtYXggdmFsdWUuPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBpbWFnZSAvIHZpZGVvOiB1cGxvYWQgbGltaXRzIC0tPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3VycmVudFR5cGUgPT09ICdpbWFnZS92aWRlbycgJiYgYW5zd2Vyc0ZBLmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbZm9ybUdyb3VwTmFtZV09XCIwXCIgY2xhc3M9XCJyb3cgYWxpZ24taXRlbXMtZW5kXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00IGZvcm0tY2hlY2sgZm9ybS1zd2l0Y2ggbWItM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IGN1cnNvci1wb2ludGVyXCIgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJhdHBMaW1pdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJsaW1pdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsIG1zLTIgY3Vyc29yLXBvaW50ZXJcIiBmb3I9XCJhdHBMaW1pdFwiPlNldCB1cGxvYWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0czwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00IG1iLTNcIiAqbmdJZj1cImFuc3dlcnNGQS5hdCgwKT8uZ2V0KCdsaW1pdCcpPy52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJtYi0xXCI+SW1hZ2UgbGltaXQ8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIG1pbj1cIjFcIiBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc29saWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiaW1hZ2VMaW1pdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNCBtYi0zXCIgKm5nSWY9XCJhbnN3ZXJzRkEuYXQoMCk/LmdldCgnbGltaXQnKT8udmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibWItMVwiPlZpZGVvIGxpbWl0PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBtaW49XCIxXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNvbGlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInZpZGVvTGltaXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItNVwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZ3LXNlbWlib2xkIGQtYmxvY2sgbWItMlwiPlJlZmVyZW5jZSBJbWFnZTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVwbG9hZC1ib3ggdGV4dC1jZW50ZXIgY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFhdXRvVGFza0Zvcm0uZ2V0KCdyZWZlcmVuY2VJbWFnZScpPy52YWx1ZVwiIChjbGljayk9XCJyZWZJbWdJbnB1dC5jbGljaygpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1wcmltYXJ5IGZ3LXNlbWlib2xkXCI+e3sgdXBsb2FkaW5nID8gJ1VwbG9hZGluZy4uLicgOiAnQ2xpY2sgdG8gVXBsb2FkIEltYWdlJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmUgZC1pbmxpbmUtYmxvY2tcIiAqbmdJZj1cImF1dG9UYXNrRm9ybS5nZXQoJ3JlZmVyZW5jZUltYWdlJyk/LnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJyZWYtaW1nIHJvdW5kZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3NyY109XCJlbnZpcm9ubWVudD8uVHJheEFuc3dlckNETiArIGF1dG9UYXNrRm9ybS5nZXQoJ3JlZmVyZW5jZUltYWdlJyk/LnZhbHVlXCIgYWx0PVwiUmVmZXJlbmNlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVtb3ZlLWltZyBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJyZW1vdmVSZWZlcmVuY2VJbWFnZSgpXCI+JnRpbWVzOzwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgI3JlZkltZ0lucHV0IHR5cGU9XCJmaWxlXCIgYWNjZXB0PVwiaW1hZ2UvcG5nLCBpbWFnZS9qcGVnXCIgaGlkZGVuXG4gICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwidXBsb2FkUmVmZXJlbmNlSW1hZ2UoJGV2ZW50KVwiPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi01XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LXNlbWlib2xkXCI+VGFzayBBc3NpZ25lZTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkIG1iLTNcIj5DaG9vc2Ugd2hvIHRoZSBmbGFnZ2VkIHRhc2sgaXMgYXNzaWduZWQgdG88L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IG1iLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtdC0xIGN1cnNvci1wb2ludGVyXCIgdHlwZT1cInJhZGlvXCIgdmFsdWU9XCJzdWJtaXR0ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidGFza0Fzc2lnbmVlXCIgaWQ9XCJhc3NpZ25lZVN1Ym1pdHRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJtcy0zIGN1cnNvci1wb2ludGVyXCIgZm9yPVwiYXNzaWduZWVTdWJtaXR0ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdy1zZW1pYm9sZFwiPkNoZWNrbGlzdCBTdWJtaXR0ZXI8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+VGFzayBpcyBhc3NpZ25lZCB0byB0aGUgdXNlciB3aG8gZmlsbGVkIHRoZSBjaGVja2xpc3Q8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXQgbXQtMSBjdXJzb3ItcG9pbnRlclwiIHR5cGU9XCJyYWRpb1wiIHZhbHVlPVwic3RvcmV1c2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInRhc2tBc3NpZ25lZVwiIGlkPVwiYXNzaWduZWVTdG9yZVwiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJtcy0zIGN1cnNvci1wb2ludGVyXCIgZm9yPVwiYXNzaWduZWVTdG9yZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LXNlbWlib2xkXCI+U3RvcmUgVXNlcjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbXV0ZWRcIj5UYXNrIGlzIGFzc2lnbmVkIHRvIHRoZSB1c2VyIG1hcHBlZCB0byB0aGUgZmxhZ2dlZCBzdG9yZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2NrZWQtbm90ZSBtdC0yXCIgKm5nSWY9XCIhaXNGaXJzdFwiPlxuICAgICAgICAgICAgICAgICAgICBBc3NpZ25lZSBpcyBzZXQgZnJvbSB0aGUgZmlyc3QgYXV0byB0YXNrIGFuZCBhcHBsaWVzIHRvIGFsbCBxdWVzdGlvbnMuXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTVcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnctc2VtaWJvbGRcIj5UYXNrIFZhbGlkaXR5PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbXV0ZWQgbWItM1wiPlNldCBob3cgbG9uZyB0aGUgYXV0byB0YXNrIHN0YXlzIHZhbGlkIHRvIGNvbXBsZXRlPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZS0zXCI+VGFzayB2YWxpZCBmb3I8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdCBmb3JtLXNlbGVjdC1zb2xpZCB3LTgwcHhcIiBmb3JtQ29udHJvbE5hbWU9XCJ0YXNrVmFsaWRpdHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGQgb2YgdmFsaWRpdHlPcHRpb25zXCIgW25nVmFsdWVdPVwiZFwiPnt7IGQgfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXMtM1wiPkRheXMgZnJvbSB0YXNrIGNyZWF0aW9uPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2NrZWQtbm90ZSBtdC0yXCIgKm5nSWY9XCIhaXNGaXJzdFwiPlxuICAgICAgICAgICAgICAgICAgICBWYWxpZGl0eSBpcyBzZXQgZnJvbSB0aGUgZmlyc3QgYXV0byB0YXNrIGFuZCBhcHBsaWVzIHRvIGFsbCBxdWVzdGlvbnMuXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImF0cC1mb290ZXIgZC1mbGV4IHB4LTggcHQtNCBwYi04XCI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBweC04IG1lLTRcIiAoY2xpY2spPVwiY2FuY2VsKClcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHB4LTEwXCIgKGNsaWNrKT1cInN1Ym1pdCgpXCI+Q3JlYXRlIFRhc2s8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9mb3JtPlxuPC9kaXY+XG4iXX0=