@gnwebsoft/ui 3.0.1 → 3.0.2

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.
Files changed (66) hide show
  1. package/README.md +688 -0
  2. package/dist/chunk-4H3AFH7A.js +505 -0
  3. package/dist/chunk-DE62KYFK.js +122 -0
  4. package/dist/chunk-DEPJRTVT.js +1 -0
  5. package/dist/chunk-EBRUE2WR.cjs +493 -0
  6. package/dist/chunk-FD57PCAC.cjs +1 -0
  7. package/dist/chunk-H3GQLELL.js +2025 -0
  8. package/dist/chunk-MVPLBJRK.cjs +1 -0
  9. package/dist/chunk-OJF67RNM.js +1 -0
  10. package/dist/chunk-OT7COE7R.cjs +2025 -0
  11. package/dist/chunk-R2YK4LTT.cjs +122 -0
  12. package/dist/chunk-U6SDYCWF.js +493 -0
  13. package/dist/chunk-ZC7FGYL2.cjs +505 -0
  14. package/dist/components/index.cjs +25 -0
  15. package/dist/components/index.d.cts +752 -0
  16. package/dist/components/index.d.ts +664 -15
  17. package/dist/components/index.js +25 -24
  18. package/dist/enhanced-z-I7EHVS.d.cts +134 -0
  19. package/dist/enhanced-z-I7EHVS.d.ts +134 -0
  20. package/dist/hooks/index.cjs +12 -0
  21. package/dist/hooks/index.d.cts +95 -0
  22. package/dist/hooks/index.d.ts +82 -4
  23. package/dist/hooks/index.js +12 -7
  24. package/dist/index.cjs +127 -0
  25. package/dist/index.d.cts +14 -0
  26. package/dist/index.d.ts +4 -6
  27. package/dist/index.js +127 -54
  28. package/dist/types/index.cjs +2 -0
  29. package/dist/types/index.d.cts +241 -0
  30. package/dist/types/index.d.ts +205 -20
  31. package/dist/types/index.js +2 -1
  32. package/dist/utils/index.cjs +45 -0
  33. package/dist/utils/index.d.cts +366 -0
  34. package/dist/utils/index.d.ts +317 -9
  35. package/dist/utils/index.js +45 -22
  36. package/dist/wrappers/index.cjs +54 -0
  37. package/dist/wrappers/index.d.cts +1684 -0
  38. package/dist/wrappers/index.d.ts +1601 -118
  39. package/dist/wrappers/index.js +54 -8
  40. package/package.json +139 -88
  41. package/dist/AsyncSelectPayload-Cz4bgak0.d.mts +0 -10
  42. package/dist/AsyncSelectPayload-Cz4bgak0.d.ts +0 -10
  43. package/dist/chunk-2JFL7TS5.mjs +0 -0
  44. package/dist/chunk-6BGQA4BQ.js +0 -1
  45. package/dist/chunk-6JZ35VQJ.js +0 -19
  46. package/dist/chunk-7M2VOCYN.js +0 -1
  47. package/dist/chunk-BWQUYXUW.mjs +0 -1634
  48. package/dist/chunk-D3J7MWAU.js +0 -1634
  49. package/dist/chunk-EVPUCTZA.mjs +0 -0
  50. package/dist/chunk-FSU3H777.mjs +0 -473
  51. package/dist/chunk-GFSTK7KN.mjs +0 -19
  52. package/dist/chunk-I7EIUZKK.js +0 -332
  53. package/dist/chunk-JKUOV3MN.js +0 -473
  54. package/dist/chunk-RQS44YC7.mjs +0 -332
  55. package/dist/components/index.d.mts +0 -103
  56. package/dist/components/index.mjs +0 -24
  57. package/dist/hooks/index.d.mts +0 -17
  58. package/dist/hooks/index.mjs +0 -7
  59. package/dist/index.d.mts +0 -16
  60. package/dist/index.mjs +0 -54
  61. package/dist/types/index.d.mts +0 -56
  62. package/dist/types/index.mjs +0 -1
  63. package/dist/utils/index.d.mts +0 -58
  64. package/dist/utils/index.mjs +0 -22
  65. package/dist/wrappers/index.d.mts +0 -201
  66. package/dist/wrappers/index.mjs +0 -8
@@ -0,0 +1,493 @@
1
+ // src/components/ClearButton/ClearButton.tsx
2
+ import { Button } from "@mui/material";
3
+ import { jsx } from "react/jsx-runtime";
4
+ var ClearButton = ({
5
+ isSubmitting,
6
+ handleClear,
7
+ sx,
8
+ storeKey
9
+ }) => {
10
+ const onClick = () => {
11
+ handleClear();
12
+ if (storeKey != null) {
13
+ localStorage.removeItem(storeKey);
14
+ }
15
+ };
16
+ return /* @__PURE__ */ jsx(
17
+ Button,
18
+ {
19
+ variant: "outlined",
20
+ onClick,
21
+ disabled: isSubmitting,
22
+ sx,
23
+ children: "Clear"
24
+ }
25
+ );
26
+ };
27
+ var ClearButton_default = ClearButton;
28
+
29
+ // src/components/FilterButton/FilterButton.tsx
30
+ import FilterAltIcon from "@mui/icons-material/FilterAlt";
31
+ import { LoadingButton } from "@mui/lab";
32
+ import { Badge } from "@mui/material";
33
+ import { jsx as jsx2 } from "react/jsx-runtime";
34
+ var FilterButton = ({
35
+ isSubmitting,
36
+ show,
37
+ title,
38
+ icon,
39
+ sx,
40
+ iconSx
41
+ }) => {
42
+ return /* @__PURE__ */ jsx2(
43
+ LoadingButton,
44
+ {
45
+ type: "submit",
46
+ variant: "contained",
47
+ loading: isSubmitting,
48
+ disabled: !show,
49
+ disableRipple: true,
50
+ color: "primary",
51
+ sx: {
52
+ display: "flex",
53
+ alignItems: "center",
54
+ ...sx
55
+ },
56
+ startIcon: /* @__PURE__ */ jsx2(Badge, { color: "error", variant: "standard", children: icon ? icon : /* @__PURE__ */ jsx2(FilterAltIcon, { width: "20", height: "20", sx: iconSx }) }),
57
+ children: title?.trim() === "" || !title ? "Filter" : title
58
+ }
59
+ );
60
+ };
61
+ var FilterButton_default = FilterButton;
62
+
63
+ // src/components/FilterWrapper/FilterWrapper.tsx
64
+ import ManageSearchIcon from "@mui/icons-material/ManageSearch";
65
+ import {
66
+ Box,
67
+ Card,
68
+ CardContent,
69
+ CardHeader,
70
+ Divider,
71
+ Grid,
72
+ Typography,
73
+ useTheme as useTheme2
74
+ } from "@mui/material";
75
+ import { Fragment, jsx as jsx3, jsxs } from "react/jsx-runtime";
76
+ var FilterWrapper = ({
77
+ children,
78
+ title,
79
+ filterCount,
80
+ cardSx,
81
+ textSx,
82
+ icon,
83
+ iconSx,
84
+ showCount
85
+ }) => {
86
+ const theme = useTheme2();
87
+ return /* @__PURE__ */ jsxs(
88
+ Card,
89
+ {
90
+ sx: {
91
+ position: "relative",
92
+ borderRadius: "0px",
93
+ mb: 2,
94
+ ...cardSx
95
+ },
96
+ children: [
97
+ /* @__PURE__ */ jsx3(
98
+ CardHeader,
99
+ {
100
+ sx: {
101
+ display: "flex",
102
+ flexWrap: "wrap",
103
+ p: "1rem",
104
+ ".MuiCardHeader-action": {
105
+ margin: 0,
106
+ alignSelf: "center"
107
+ },
108
+ alignItems: "center"
109
+ },
110
+ title: /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", alignItems: "center", gap: 0.5 }, children: [
111
+ icon ? icon : /* @__PURE__ */ jsx3(
112
+ ManageSearchIcon,
113
+ {
114
+ sx: {
115
+ height: "2.5rem",
116
+ color: theme.palette.primary.main,
117
+ ...iconSx
118
+ }
119
+ }
120
+ ),
121
+ /* @__PURE__ */ jsxs(
122
+ Typography,
123
+ {
124
+ variant: "h5",
125
+ sx: {
126
+ fontWeight: "bold",
127
+ color: theme.palette.primary.main,
128
+ ...textSx
129
+ },
130
+ children: [
131
+ title ? title : "Filter",
132
+ " ",
133
+ showCount ? `(${filterCount ? filterCount : 0})` : /* @__PURE__ */ jsx3(Fragment, {})
134
+ ]
135
+ }
136
+ )
137
+ ] })
138
+ }
139
+ ),
140
+ /* @__PURE__ */ jsx3(Divider, {}),
141
+ /* @__PURE__ */ jsx3(CardContent, { sx: { py: 2 }, children: /* @__PURE__ */ jsx3(Grid, { container: true, spacing: 2, children }) })
142
+ ]
143
+ }
144
+ );
145
+ };
146
+ var FilterWrapper_default = FilterWrapper;
147
+
148
+ // src/components/FormWrapper/FormWrapper.tsx
149
+ import {
150
+ Box as Box2,
151
+ Card as Card2,
152
+ CardContent as CardContent2,
153
+ CardHeader as CardHeader2,
154
+ Divider as Divider2,
155
+ Grid as Grid2,
156
+ Typography as Typography2
157
+ } from "@mui/material";
158
+ import { jsx as jsx4, jsxs as jsxs2 } from "react/jsx-runtime";
159
+ var FormWrapper = ({
160
+ children,
161
+ title,
162
+ editMode,
163
+ cardSx,
164
+ textSx,
165
+ icon,
166
+ actionButton
167
+ }) => {
168
+ return /* @__PURE__ */ jsxs2(
169
+ Card2,
170
+ {
171
+ sx: {
172
+ position: "relative",
173
+ borderRadius: "0px",
174
+ ...cardSx
175
+ },
176
+ children: [
177
+ /* @__PURE__ */ jsx4(
178
+ CardHeader2,
179
+ {
180
+ sx: {
181
+ display: "flex",
182
+ flexWrap: "wrap",
183
+ p: "1rem",
184
+ ".MuiCardHeader-action": {
185
+ margin: 0,
186
+ alignSelf: "center"
187
+ }
188
+ },
189
+ title: /* @__PURE__ */ jsxs2(
190
+ Box2,
191
+ {
192
+ sx: {
193
+ display: "flex",
194
+ alignItems: "center",
195
+ justifyContent: "space-between"
196
+ },
197
+ children: [
198
+ /* @__PURE__ */ jsxs2(Box2, { sx: { display: "flex", alignItems: "center", gap: 0.5 }, children: [
199
+ icon ?? icon,
200
+ /* @__PURE__ */ jsx4(Typography2, { color: "primary", sx: textSx, children: title })
201
+ ] }),
202
+ actionButton
203
+ ]
204
+ }
205
+ )
206
+ }
207
+ ),
208
+ /* @__PURE__ */ jsx4(Divider2, { sx: { mt: 0 } }),
209
+ /* @__PURE__ */ jsx4(CardContent2, { children: /* @__PURE__ */ jsx4(Grid2, { container: true, spacing: 2, children }) })
210
+ ]
211
+ }
212
+ );
213
+ };
214
+ var FormWrapper_default = FormWrapper;
215
+
216
+ // src/components/LabelText/LabelText.tsx
217
+ import { Grid as Grid3, Tooltip, Typography as Typography3 } from "@mui/material";
218
+ import { jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
219
+ var LabelText = ({
220
+ label,
221
+ value,
222
+ gridSize,
223
+ containerSize,
224
+ labelSx,
225
+ valueSx
226
+ }) => {
227
+ const defaultGridSize = {
228
+ labelSize: { xs: 6, sm: 6, md: 6 },
229
+ valueSize: { xs: 12, sm: 6, md: 6 }
230
+ };
231
+ const defaultContainerSize = { xs: 12, sm: 6, md: 6 };
232
+ const size = gridSize || defaultGridSize;
233
+ const container = containerSize || defaultContainerSize;
234
+ return /* @__PURE__ */ jsxs3(
235
+ Grid3,
236
+ {
237
+ size: container,
238
+ sx: {
239
+ display: "flex",
240
+ flexDirection: { xs: "column", sm: "row", md: "row" },
241
+ "&:hover": { bgcolor: "#efefef", overflow: "hidden" }
242
+ },
243
+ children: [
244
+ /* @__PURE__ */ jsxs3(
245
+ Grid3,
246
+ {
247
+ size: size.labelSize,
248
+ sx: {
249
+ padding: "5px",
250
+ fontSize: "14px",
251
+ textAlign: { xs: "left", sm: "right", md: "right" },
252
+ ...labelSx
253
+ },
254
+ children: [
255
+ label,
256
+ " :"
257
+ ]
258
+ }
259
+ ),
260
+ /* @__PURE__ */ jsx5(
261
+ Grid3,
262
+ {
263
+ size: size.valueSize,
264
+ sx: { padding: "5px", display: "flex", flexWrap: "wrap" },
265
+ children: /* @__PURE__ */ jsx5(Tooltip, { title: value, arrow: true, children: /* @__PURE__ */ jsx5(
266
+ Typography3,
267
+ {
268
+ sx: {
269
+ fontSize: "14px",
270
+ wordBreak: "break-word",
271
+ overflow: "hidden",
272
+ display: "-webkit-box",
273
+ textOverflow: "ellipsis",
274
+ WebkitLineClamp: 2,
275
+ WebkitBoxOrient: "vertical",
276
+ ...valueSx,
277
+ color: "#078dee"
278
+ },
279
+ children: value ? value : "-"
280
+ }
281
+ ) })
282
+ }
283
+ )
284
+ ]
285
+ }
286
+ );
287
+ };
288
+ var LabelText_default = LabelText;
289
+
290
+ // src/components/ListWrapper/ListWrapper.tsx
291
+ import ManageSearchIcon2 from "@mui/icons-material/ManageSearch";
292
+ import {
293
+ Box as Box3,
294
+ Card as Card3,
295
+ CardContent as CardContent3,
296
+ CardHeader as CardHeader3,
297
+ Divider as Divider3,
298
+ Grid as Grid4,
299
+ Typography as Typography4,
300
+ useTheme as useTheme3
301
+ } from "@mui/material";
302
+ import { Fragment as Fragment2, jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
303
+ var ListWrapper = ({
304
+ children,
305
+ title,
306
+ count,
307
+ show = true,
308
+ actionButton,
309
+ cardSx,
310
+ textSx,
311
+ icon,
312
+ iconSx,
313
+ showCount = true
314
+ }) => {
315
+ const theme = useTheme3();
316
+ if (!show) return /* @__PURE__ */ jsx6(Fragment2, {});
317
+ return /* @__PURE__ */ jsxs4(
318
+ Card3,
319
+ {
320
+ sx: {
321
+ position: "relative",
322
+ borderRadius: "0px",
323
+ ...cardSx
324
+ },
325
+ children: [
326
+ /* @__PURE__ */ jsx6(
327
+ CardHeader3,
328
+ {
329
+ sx: {
330
+ display: "flex",
331
+ flexWrap: "wrap",
332
+ p: "1rem",
333
+ ".MuiCardHeader-action": {
334
+ margin: 0,
335
+ alignSelf: "center"
336
+ },
337
+ alignItems: "center"
338
+ },
339
+ title: /* @__PURE__ */ jsxs4(
340
+ Box3,
341
+ {
342
+ sx: {
343
+ display: "flex",
344
+ alignItems: "center",
345
+ justifyContent: "space-between"
346
+ },
347
+ children: [
348
+ /* @__PURE__ */ jsxs4(Box3, { sx: { display: "flex", alignItems: "center", gap: 0.5 }, children: [
349
+ icon ? icon : /* @__PURE__ */ jsx6(
350
+ ManageSearchIcon2,
351
+ {
352
+ sx: {
353
+ height: "2.5rem",
354
+ color: theme.palette.primary.main,
355
+ ...iconSx
356
+ }
357
+ }
358
+ ),
359
+ /* @__PURE__ */ jsxs4(
360
+ Typography4,
361
+ {
362
+ variant: "h5",
363
+ sx: {
364
+ fontWeight: "bold",
365
+ color: theme.palette.primary.main,
366
+ ...textSx
367
+ },
368
+ children: [
369
+ title ? title : "List",
370
+ showCount ? `(${count ? count : 0})` : /* @__PURE__ */ jsx6(Fragment2, {})
371
+ ]
372
+ }
373
+ )
374
+ ] }),
375
+ actionButton
376
+ ]
377
+ }
378
+ )
379
+ }
380
+ ),
381
+ /* @__PURE__ */ jsx6(Divider3, {}),
382
+ /* @__PURE__ */ jsx6(CardContent3, { sx: { pt: 0 }, children: /* @__PURE__ */ jsx6(Grid4, { container: true, spacing: 2, children }) })
383
+ ]
384
+ }
385
+ );
386
+ };
387
+ var ListWrapper_default = ListWrapper;
388
+
389
+ // src/components/SimpleToolbar/SimpleToolbar.tsx
390
+ import { Box as Box4 } from "@mui/material";
391
+ import {
392
+ GridToolbarContainer,
393
+ GridToolbarColumnsButton,
394
+ GridToolbarExport,
395
+ GridToolbarFilterButton,
396
+ GridToolbarQuickFilter
397
+ } from "@mui/x-data-grid";
398
+ import { jsx as jsx7, jsxs as jsxs5 } from "react/jsx-runtime";
399
+ var SimpleToolbar = () => /* @__PURE__ */ jsxs5(GridToolbarContainer, { children: [
400
+ /* @__PURE__ */ jsx7(
401
+ Box4,
402
+ {
403
+ sx: {
404
+ "& .MuiInputBase-root": {
405
+ borderRadius: "8px",
406
+ padding: "6px 10px"
407
+ },
408
+ "& input": {
409
+ fontSize: "14px",
410
+ color: "#333"
411
+ },
412
+ borderRadius: "8px"
413
+ },
414
+ children: /* @__PURE__ */ jsx7(GridToolbarQuickFilter, {})
415
+ }
416
+ ),
417
+ /* @__PURE__ */ jsx7(Box4, { sx: { flexGrow: 1 } }),
418
+ /* @__PURE__ */ jsx7(GridToolbarColumnsButton, {}),
419
+ /* @__PURE__ */ jsx7(GridToolbarFilterButton, {}),
420
+ /* @__PURE__ */ jsx7(GridToolbarExport, {})
421
+ ] });
422
+ var SimpleToolbar_default = SimpleToolbar;
423
+
424
+ // src/components/SimpleButton/SimpleButton.tsx
425
+ import { Button as Button2, CircularProgress } from "@mui/material";
426
+ import { forwardRef, memo } from "react";
427
+ import { Fragment as Fragment3, jsx as jsx8 } from "react/jsx-runtime";
428
+ var SimpleButton = memo(forwardRef(
429
+ ({
430
+ show = true,
431
+ loading = false,
432
+ loadingText,
433
+ children,
434
+ ...rest
435
+ }, ref) => {
436
+ if (!show) return null;
437
+ return /* @__PURE__ */ jsx8(Fragment3, { children: /* @__PURE__ */ jsx8(
438
+ Button2,
439
+ {
440
+ ref,
441
+ disabled: loading || rest.disabled,
442
+ startIcon: loading ? /* @__PURE__ */ jsx8(CircularProgress, { size: 16 }) : rest.startIcon,
443
+ ...rest,
444
+ children: loading && loadingText ? loadingText : children
445
+ }
446
+ ) });
447
+ }
448
+ ));
449
+ SimpleButton.displayName = "SimpleButton";
450
+ var SimpleButton_default = SimpleButton;
451
+
452
+ // src/components/AuthorizedView/AuthorizedView.tsx
453
+ import { Fragment as Fragment4, jsx as jsx9 } from "react/jsx-runtime";
454
+ var AuthorizedView = ({ children, show }) => {
455
+ if (!show) return /* @__PURE__ */ jsx9(Fragment4, {});
456
+ return /* @__PURE__ */ jsx9(Fragment4, { children });
457
+ };
458
+ var AuthorizedView_default = AuthorizedView;
459
+
460
+ // src/components/CancelButton/CancelButton.tsx
461
+ import { Button as Button3 } from "@mui/material";
462
+ import { jsx as jsx10 } from "react/jsx-runtime";
463
+ var CancelButton = ({
464
+ isSubmitting,
465
+ handleCancel,
466
+ sx
467
+ }) => {
468
+ return /* @__PURE__ */ jsx10(
469
+ Button3,
470
+ {
471
+ variant: "outlined",
472
+ onClick: handleCancel,
473
+ disabled: isSubmitting,
474
+ sx,
475
+ children: "Cancel"
476
+ }
477
+ );
478
+ };
479
+ var CancelButton_default = CancelButton;
480
+
481
+ export {
482
+ ClearButton_default,
483
+ FilterButton_default,
484
+ FilterWrapper_default,
485
+ FormWrapper_default,
486
+ LabelText_default,
487
+ ListWrapper_default,
488
+ SimpleToolbar_default,
489
+ SimpleButton_default,
490
+ AuthorizedView_default,
491
+ CancelButton_default
492
+ };
493
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2NvbXBvbmVudHMvQ2xlYXJCdXR0b24vQ2xlYXJCdXR0b24udHN4IiwgIi4uL3NyYy9jb21wb25lbnRzL0ZpbHRlckJ1dHRvbi9GaWx0ZXJCdXR0b24udHN4IiwgIi4uL3NyYy9jb21wb25lbnRzL0ZpbHRlcldyYXBwZXIvRmlsdGVyV3JhcHBlci50c3giLCAiLi4vc3JjL2NvbXBvbmVudHMvRm9ybVdyYXBwZXIvRm9ybVdyYXBwZXIudHN4IiwgIi4uL3NyYy9jb21wb25lbnRzL0xhYmVsVGV4dC9MYWJlbFRleHQudHN4IiwgIi4uL3NyYy9jb21wb25lbnRzL0xpc3RXcmFwcGVyL0xpc3RXcmFwcGVyLnRzeCIsICIuLi9zcmMvY29tcG9uZW50cy9TaW1wbGVUb29sYmFyL1NpbXBsZVRvb2xiYXIudHN4IiwgIi4uL3NyYy9jb21wb25lbnRzL1NpbXBsZUJ1dHRvbi9TaW1wbGVCdXR0b24udHN4IiwgIi4uL3NyYy9jb21wb25lbnRzL0F1dGhvcml6ZWRWaWV3L0F1dGhvcml6ZWRWaWV3LnRzeCIsICIuLi9zcmMvY29tcG9uZW50cy9DYW5jZWxCdXR0b24vQ2FuY2VsQnV0dG9uLnRzeCJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHR5cGUgeyBTeFByb3BzIH0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB7IEJ1dHRvbiB9IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5cbi8qKlxuICogUHJvcHMgZm9yIHRoZSBDbGVhckJ1dHRvbiBjb21wb25lbnQuXG4gKlxuICogQHB1YmxpY1xuICovXG5pbnRlcmZhY2UgQ2xlYXJCdXR0b25Qcm9wcyB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgYSBmb3JtIG9yIG9wZXJhdGlvbiBpcyBjdXJyZW50bHkgYmVpbmcgc3VibWl0dGVkLlxuICAgKiBXaGVuIHRydWUsIHRoZSBidXR0b24gaXMgZGlzYWJsZWQgdG8gcHJldmVudCBtdWx0aXBsZSBjbGVhciBhY3Rpb25zLlxuICAgKi9cbiAgaXNTdWJtaXR0aW5nOiBib29sZWFuO1xuICAvKipcbiAgICogQ2FsbGJhY2sgZnVuY3Rpb24gZXhlY3V0ZWQgd2hlbiB0aGUgY2xlYXIgYnV0dG9uIGlzIGNsaWNrZWQuXG4gICAqIFNob3VsZCBoYW5kbGUgdGhlIGNsZWFyaW5nIGxvZ2ljIChlLmcuLCBmb3JtIHJlc2V0LCBkYXRhIGNsZWFyaW5nKS5cbiAgICovXG4gIGhhbmRsZUNsZWFyOiAoKSA9PiB2b2lkO1xuICAvKipcbiAgICogT3B0aW9uYWwgTVVJIHN4IHByb3AgZm9yIGN1c3RvbSBzdHlsaW5nLlxuICAgKiBAZXhhbXBsZSB7IG10OiAyLCBjb2xvcjogJ3dhcm5pbmcubWFpbicgfVxuICAgKi9cbiAgc3g/OiBTeFByb3BzO1xuICAvKipcbiAgICogT3B0aW9uYWwgbG9jYWxTdG9yYWdlIGtleSB0byByZW1vdmUgd2hlbiBjbGVhcmluZy5cbiAgICogSWYgcHJvdmlkZWQsIHRoZSBjb3JyZXNwb25kaW5nIGxvY2FsU3RvcmFnZSBpdGVtIHdpbGwgYmUgcmVtb3ZlZCBvbiBjbGljay5cbiAgICogQGV4YW1wbGUgXCJ1c2VyLXByZWZlcmVuY2VzXCIgb3IgXCJmb3JtLWRhdGFcIlxuICAgKi9cbiAgc3RvcmVLZXk/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogU3RhbmRhcmRpemVkIGNsZWFyIGJ1dHRvbiBjb21wb25lbnQgd2l0aCBsb2NhbFN0b3JhZ2UgaW50ZWdyYXRpb24uXG4gKlxuICogVGhpcyBjb21wb25lbnQgcHJvdmlkZXMgYSBjb25zaXN0ZW50IGNsZWFyIGJ1dHRvbiBpbXBsZW1lbnRhdGlvbiB0aGF0IGhhbmRsZXNcbiAqIGJvdGggY2FsbGJhY2sgZXhlY3V0aW9uIGFuZCBvcHRpb25hbCBsb2NhbFN0b3JhZ2UgY2xlYW51cC4gSXQgYXV0b21hdGljYWxseVxuICogZGlzYWJsZXMgZHVyaW5nIGZvcm0gc3VibWlzc2lvbnMgYW5kIGNhbiBjbGVhciBzdG9yZWQgZGF0YSB3aGVuIG5lZWRlZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2U6XG4gKiBgYGB0c3hcbiAqIDxDbGVhckJ1dHRvblxuICogICBpc1N1Ym1pdHRpbmc9e2lzTG9hZGluZ31cbiAqICAgaGFuZGxlQ2xlYXI9eygpID0+IGZvcm0ucmVzZXQoKX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aCBsb2NhbFN0b3JhZ2UgY2xlYW51cDpcbiAqIGBgYHRzeFxuICogPENsZWFyQnV0dG9uXG4gKiAgIGlzU3VibWl0dGluZz17Zm9ybS5mb3JtU3RhdGUuaXNTdWJtaXR0aW5nfVxuICogICBoYW5kbGVDbGVhcj17KCkgPT4gc2V0RmlsdGVycyh7fSl9XG4gKiAgIHN0b3JlS2V5PVwidXNlci1maWx0ZXJzXCJcbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gcHJvcHMgLSBDb21wb25lbnQgcHJvcHMgZm9yIGNsZWFyIGJ1dHRvbiBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyBNVUkgQnV0dG9uIGNvbXBvbmVudCBjb25maWd1cmVkIGFzIGEgY2xlYXIgYnV0dG9uXG4gKlxuICogQHB1YmxpY1xuICovXG5jb25zdCBDbGVhckJ1dHRvbiA9ICh7XG4gIGlzU3VibWl0dGluZyxcbiAgaGFuZGxlQ2xlYXIsXG4gIHN4LFxuICBzdG9yZUtleSxcbn06IENsZWFyQnV0dG9uUHJvcHMpID0+IHtcbiAgY29uc3Qgb25DbGljayA9ICgpID0+IHtcbiAgICBoYW5kbGVDbGVhcigpO1xuICAgIGlmIChzdG9yZUtleSAhPSBudWxsKSB7XG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShzdG9yZUtleSk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiAoXG4gICAgPEJ1dHRvblxuICAgICAgdmFyaWFudD1cIm91dGxpbmVkXCJcbiAgICAgIG9uQ2xpY2s9e29uQ2xpY2t9XG4gICAgICBkaXNhYmxlZD17aXNTdWJtaXR0aW5nfVxuICAgICAgc3g9e3N4fVxuICAgID5cbiAgICAgIENsZWFyXG4gICAgPC9CdXR0b24+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBDbGVhckJ1dHRvbjtcbiIsICJpbXBvcnQgRmlsdGVyQWx0SWNvbiBmcm9tIFwiQG11aS9pY29ucy1tYXRlcmlhbC9GaWx0ZXJBbHRcIjtcbmltcG9ydCB7IExvYWRpbmdCdXR0b24gfSBmcm9tIFwiQG11aS9sYWJcIjtcbmltcG9ydCB0eXBlIHsgU3hQcm9wcyB9IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQgeyBCYWRnZSwgdXNlVGhlbWUgfSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuXG4vKipcbiAqIFByb3BzIGZvciB0aGUgRmlsdGVyQnV0dG9uIGNvbXBvbmVudC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmludGVyZmFjZSBGaWx0ZXJCdXR0b25Qcm9wcyB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgYSBmaWx0ZXIgb3BlcmF0aW9uIGlzIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQuXG4gICAqIFdoZW4gdHJ1ZSwgc2hvd3MgbG9hZGluZyBzcGlubmVyIGFuZCBkaXNhYmxlcyB0aGUgYnV0dG9uLlxuICAgKi9cbiAgaXNTdWJtaXR0aW5nOiBib29sZWFuO1xuICAvKipcbiAgICogQ29udHJvbHMgYnV0dG9uIHZpc2liaWxpdHkgYW5kIGVuYWJsZWQgc3RhdGUuXG4gICAqIFdoZW4gZmFsc2UsIHRoZSBidXR0b24gaXMgZGlzYWJsZWQuXG4gICAqIEBkZWZhdWx0VmFsdWUgdHJ1ZVxuICAgKi9cbiAgc2hvdz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBDdXN0b20gdGV4dCB0byBkaXNwbGF5IG9uIHRoZSBidXR0b24uXG4gICAqIEBkZWZhdWx0VmFsdWUgXCJGaWx0ZXJcIlxuICAgKiBAZXhhbXBsZSBcIkFwcGx5IEZpbHRlcnNcIiBvciBcIlNlYXJjaFwiXG4gICAqL1xuICB0aXRsZT86IHN0cmluZztcbiAgLyoqXG4gICAqIEN1c3RvbSBpY29uIHRvIGRpc3BsYXkgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBmaWx0ZXIgaWNvbi5cbiAgICogQGV4YW1wbGUgPFNlYXJjaEljb24gLz5cbiAgICovXG4gIGljb24/OiBSZWFjdC5SZWFjdE5vZGU7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBNVUkgc3ggcHJvcCBmb3IgY3VzdG9tIGJ1dHRvbiBzdHlsaW5nLlxuICAgKiBAZXhhbXBsZSB7IG10OiAyLCBtaW5XaWR0aDogMTIwIH1cbiAgICovXG4gIHN4PzogU3hQcm9wcztcbiAgLyoqXG4gICAqIE9wdGlvbmFsIE1VSSBzeCBwcm9wIGZvciBjdXN0b20gaWNvbiBzdHlsaW5nLlxuICAgKiBAZXhhbXBsZSB7IGNvbG9yOiAncHJpbWFyeS5tYWluJywgZm9udFNpemU6IDE4IH1cbiAgICovXG4gIGljb25TeD86IFN4UHJvcHM7XG59XG5cbi8qKlxuICogRmlsdGVyIGJ1dHRvbiBjb21wb25lbnQgd2l0aCBsb2FkaW5nIHN0YXRlcyBhbmQgY3VzdG9taXphYmxlIGFwcGVhcmFuY2UuXG4gKlxuICogVGhpcyBjb21wb25lbnQgcHJvdmlkZXMgYSBzdGFuZGFyZGl6ZWQgZmlsdGVyL3N1Ym1pdCBidXR0b24gd2l0aCBpbnRlZ3JhdGVkIGxvYWRpbmdcbiAqIHN0YXRlcywgaWNvbiBzdXBwb3J0LCBhbmQgYmFkZ2Ugc3R5bGluZy4gSXQncyBkZXNpZ25lZCBmb3IgdXNlIGluIGZpbHRlciBmb3Jtc1xuICogYW5kIHNlYXJjaCBpbnRlcmZhY2VzIHdoZXJlIHVzZXJzIG5lZWQgdG8gYXBwbHkgZmlsdGVyaW5nIGNyaXRlcmlhLlxuICpcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZTpcbiAqIGBgYHRzeFxuICogPEZpbHRlckJ1dHRvblxuICogICBpc1N1Ym1pdHRpbmc9e2lzTG9hZGluZ31cbiAqICAgc2hvdz17aGFzRmlsdGVyc31cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQ3VzdG9tIHRpdGxlIGFuZCBpY29uOlxuICogYGBgdHN4XG4gKiA8RmlsdGVyQnV0dG9uXG4gKiAgIGlzU3VibWl0dGluZz17Zm9ybS5mb3JtU3RhdGUuaXNTdWJtaXR0aW5nfVxuICogICB0aXRsZT1cIkFwcGx5IFNlYXJjaFwiXG4gKiAgIGljb249ezxTZWFyY2hJY29uIC8+fVxuICogICBzaG93PXt0cnVlfVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGN1c3RvbSBzdHlsaW5nOlxuICogYGBgdHN4XG4gKiA8RmlsdGVyQnV0dG9uXG4gKiAgIGlzU3VibWl0dGluZz17aXNQcm9jZXNzaW5nfVxuICogICB0aXRsZT1cIkZpbHRlciBSZXN1bHRzXCJcbiAqICAgc3g9e3sgbWluV2lkdGg6IDE1MCwgbXQ6IDIgfX1cbiAqICAgaWNvblN4PXt7IGZvbnRTaXplOiAyMCB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIENvbXBvbmVudCBwcm9wcyBmb3IgZmlsdGVyIGJ1dHRvbiBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyBNVUkgTG9hZGluZ0J1dHRvbiBjb21wb25lbnQgY29uZmlndXJlZCBhcyBhIGZpbHRlciBidXR0b25cbiAqXG4gKiBAcHVibGljXG4gKi9cbmNvbnN0IEZpbHRlckJ1dHRvbiA9ICh7XG4gIGlzU3VibWl0dGluZyxcbiAgc2hvdyxcbiAgdGl0bGUsXG4gIGljb24sXG4gIHN4LFxuICBpY29uU3gsXG59OiBGaWx0ZXJCdXR0b25Qcm9wcykgPT4ge1xuICByZXR1cm4gKFxuICAgIDxMb2FkaW5nQnV0dG9uXG4gICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgIHZhcmlhbnQ9XCJjb250YWluZWRcIlxuICAgICAgbG9hZGluZz17aXNTdWJtaXR0aW5nfVxuICAgICAgZGlzYWJsZWQ9eyFzaG93fVxuICAgICAgZGlzYWJsZVJpcHBsZVxuICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgIHN4PXt7XG4gICAgICAgIGRpc3BsYXk6IFwiZmxleFwiLFxuICAgICAgICBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLFxuICAgICAgICAuLi5zeCxcbiAgICAgIH19XG4gICAgICBzdGFydEljb249e1xuICAgICAgICA8QmFkZ2UgY29sb3I9XCJlcnJvclwiIHZhcmlhbnQ9XCJzdGFuZGFyZFwiPlxuICAgICAgICAgIHtpY29uID8gaWNvbiA6IDxGaWx0ZXJBbHRJY29uIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHN4PXtpY29uU3h9IC8+fVxuICAgICAgICA8L0JhZGdlPlxuICAgICAgfVxuICAgID5cbiAgICAgIHt0aXRsZT8udHJpbSgpID09PSBcIlwiIHx8ICF0aXRsZSA/IFwiRmlsdGVyXCIgOiB0aXRsZX1cbiAgICA8L0xvYWRpbmdCdXR0b24+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBGaWx0ZXJCdXR0b247XG4iLCAiaW1wb3J0IE1hbmFnZVNlYXJjaEljb24gZnJvbSBcIkBtdWkvaWNvbnMtbWF0ZXJpYWwvTWFuYWdlU2VhcmNoXCI7XG5pbXBvcnQgdHlwZSB7XG4gIFN4UHJvcHNcbn0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB7XG4gIEJveCxcbiAgQ2FyZCxcbiAgQ2FyZENvbnRlbnQsXG4gIENhcmRIZWFkZXIsXG4gIERpdmlkZXIsXG4gIEdyaWQsXG4gIFR5cG9ncmFwaHksXG4gIHVzZVRoZW1lLFxufSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHR5cGUgeyBQcm9wc1dpdGhDaGlsZHJlbiwgUmVhY3ROb2RlIH0gZnJvbSBcInJlYWN0XCI7XG5cbi8qKlxuICogUHJvcHMgZm9yIHRoZSBGaWx0ZXJXcmFwcGVyIGNvbXBvbmVudC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbnR5cGUgRmlsdGVyV3JhcHBlclByb3BzID0gUHJvcHNXaXRoQ2hpbGRyZW48e1xuICAvKipcbiAgICogVGl0bGUgdGV4dCBkaXNwbGF5ZWQgaW4gdGhlIGNhcmQgaGVhZGVyLlxuICAgKiBAZGVmYXVsdFZhbHVlIFwiRmlsdGVyXCJcbiAgICogQGV4YW1wbGUgXCJTZWFyY2ggQ3JpdGVyaWFcIiBvciBcIkFkdmFuY2VkIEZpbHRlcnNcIlxuICAgKi9cbiAgdGl0bGU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgYWN0aXZlIGZpbHRlcnMgdG8gZGlzcGxheSBpbiB0aGUgaGVhZGVyLlxuICAgKiBPbmx5IHNob3duIHdoZW4gc2hvd0NvdW50IGlzIHRydWUuXG4gICAqIEBleGFtcGxlIDMgZm9yIFwiRmlsdGVyICgzKVwiXG4gICAqL1xuICBmaWx0ZXJDb3VudD86IG51bWJlcjtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIE1VSSBzeCBwcm9wIGZvciBjdXN0b20gY2FyZCBzdHlsaW5nLlxuICAgKiBAZXhhbXBsZSB7IG10OiAyLCBib3hTaGFkb3c6IDIgfVxuICAgKi9cbiAgY2FyZFN4PzogU3hQcm9wcztcbiAgLyoqXG4gICAqIE9wdGlvbmFsIE1VSSBzeCBwcm9wIGZvciBjdXN0b20gdGl0bGUgdGV4dCBzdHlsaW5nLlxuICAgKiBAZXhhbXBsZSB7IGZvbnRTaXplOiAxOCwgZm9udFdlaWdodDogJ2JvbGQnIH1cbiAgICovXG4gIHRleHRTeD86IFN4UHJvcHM7XG4gIC8qKlxuICAgKiBDdXN0b20gaWNvbiB0byBkaXNwbGF5IGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgc2VhcmNoIGljb24uXG4gICAqIEBleGFtcGxlIDxGaWx0ZXJMaXN0SWNvbiAvPlxuICAgKi9cbiAgaWNvbj86IFJlYWN0Tm9kZTtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIE1VSSBzeCBwcm9wIGZvciBjdXN0b20gaWNvbiBzdHlsaW5nLlxuICAgKiBAZXhhbXBsZSB7IGNvbG9yOiAnc2Vjb25kYXJ5Lm1haW4nLCBmb250U2l6ZTogMjQgfVxuICAgKi9cbiAgaWNvblN4PzogU3hQcm9wcztcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZGlzcGxheSB0aGUgZmlsdGVyIGNvdW50IGluIHRoZSBoZWFkZXIuXG4gICAqIEBkZWZhdWx0VmFsdWUgZmFsc2VcbiAgICovXG4gIHNob3dDb3VudD86IGJvb2xlYW47XG59PjtcblxuLyoqXG4gKiBDYXJkLWJhc2VkIHdyYXBwZXIgY29tcG9uZW50IGZvciBvcmdhbml6aW5nIGZpbHRlciBjb250cm9scyBhbmQgZm9ybSBlbGVtZW50cy5cbiAqXG4gKiBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBhIGNvbnNpc3RlbnQgbGF5b3V0IGZvciBmaWx0ZXIgaW50ZXJmYWNlcyB3aXRoIGEgaGVhZGVyLFxuICogb3B0aW9uYWwgZmlsdGVyIGNvdW50IGRpc3BsYXksIGFuZCBhIGdyaWQtYmFzZWQgY29udGVudCBhcmVhLiBJdCdzIGRlc2lnbmVkIHRvXG4gKiBjb250YWluIGZvcm0gY29udHJvbHMgYW5kIGZpbHRlciBlbGVtZW50cyBpbiBhIHZpc3VhbGx5IG9yZ2FuaXplZCBtYW5uZXIuXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlOlxuICogYGBgdHN4XG4gKiA8RmlsdGVyV3JhcHBlcj5cbiAqICAgPEdyaWQgaXRlbSB4cz17MTJ9IG1kPXs2fT5cbiAqICAgICA8VGV4dEZpZWxkIGxhYmVsPVwiU2VhcmNoXCIgLz5cbiAqICAgPC9HcmlkPlxuICogICA8R3JpZCBpdGVtIHhzPXsxMn0gbWQ9ezZ9PlxuICogICAgIDxTZWxlY3QgbGFiZWw9XCJDYXRlZ29yeVwiIC8+XG4gKiAgIDwvR3JpZD5cbiAqIDwvRmlsdGVyV3JhcHBlcj5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGN1c3RvbSB0aXRsZSBhbmQgY291bnQ6XG4gKiBgYGB0c3hcbiAqIDxGaWx0ZXJXcmFwcGVyXG4gKiAgIHRpdGxlPVwiQWR2YW5jZWQgU2VhcmNoXCJcbiAqICAgZmlsdGVyQ291bnQ9e2FjdGl2ZUZpbHRlcnMubGVuZ3RofVxuICogICBzaG93Q291bnQ9e3RydWV9XG4gKiA+XG4gKiAgIHtmaWx0ZXJDb250cm9sc31cbiAqIDwvRmlsdGVyV3JhcHBlcj5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGN1c3RvbSBzdHlsaW5nOlxuICogYGBgdHN4XG4gKiA8RmlsdGVyV3JhcHBlclxuICogICB0aXRsZT1cIlByb2R1Y3QgRmlsdGVyc1wiXG4gKiAgIGljb249ezxGaWx0ZXJMaXN0SWNvbiAvPn1cbiAqICAgY2FyZFN4PXt7IG10OiAzLCBib3JkZXJSYWRpdXM6IDIgfX1cbiAqICAgdGV4dFN4PXt7IGNvbG9yOiAnc2Vjb25kYXJ5Lm1haW4nIH19XG4gKiA+XG4gKiAgIHtjaGlsZHJlbn1cbiAqIDwvRmlsdGVyV3JhcHBlcj5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIENvbXBvbmVudCBwcm9wcyBpbmNsdWRpbmcgY2hpbGRyZW4gYW5kIHN0eWxpbmcgb3B0aW9uc1xuICogQHJldHVybnMgTVVJIENhcmQgY29tcG9uZW50IHdpdGggc3RydWN0dXJlZCBmaWx0ZXIgbGF5b3V0XG4gKlxuICogQHB1YmxpY1xuICovXG5jb25zdCBGaWx0ZXJXcmFwcGVyID0gKHtcbiAgY2hpbGRyZW4sXG4gIHRpdGxlLFxuICBmaWx0ZXJDb3VudCxcbiAgY2FyZFN4LFxuICB0ZXh0U3gsXG4gIGljb24sXG4gIGljb25TeCxcbiAgc2hvd0NvdW50LFxufTogRmlsdGVyV3JhcHBlclByb3BzKSA9PiB7XG4gIGNvbnN0IHRoZW1lID0gdXNlVGhlbWUoKTtcblxuICByZXR1cm4gKFxuICAgIDxDYXJkXG4gICAgICBzeD17e1xuICAgICAgICBwb3NpdGlvbjogXCJyZWxhdGl2ZVwiLFxuICAgICAgICBib3JkZXJSYWRpdXM6IFwiMHB4XCIsXG4gICAgICAgIG1iOiAyLFxuICAgICAgICAuLi5jYXJkU3gsXG4gICAgICB9fVxuICAgID5cbiAgICAgIDxDYXJkSGVhZGVyXG4gICAgICAgIHN4PXt7XG4gICAgICAgICAgZGlzcGxheTogXCJmbGV4XCIsXG4gICAgICAgICAgZmxleFdyYXA6IFwid3JhcFwiLFxuICAgICAgICAgIHA6IFwiMXJlbVwiLFxuICAgICAgICAgIFwiLk11aUNhcmRIZWFkZXItYWN0aW9uXCI6IHtcbiAgICAgICAgICAgIG1hcmdpbjogMCxcbiAgICAgICAgICAgIGFsaWduU2VsZjogXCJjZW50ZXJcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFsaWduSXRlbXM6IFwiY2VudGVyXCIsXG4gICAgICAgIH19XG4gICAgICAgIHRpdGxlPXtcbiAgICAgICAgICA8Qm94IHN4PXt7IGRpc3BsYXk6IFwiZmxleFwiLCBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLCBnYXA6IDAuNSB9fT5cbiAgICAgICAgICAgIHtpY29uID8gKFxuICAgICAgICAgICAgICBpY29uXG4gICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICA8TWFuYWdlU2VhcmNoSWNvblxuICAgICAgICAgICAgICAgIHN4PXt7XG4gICAgICAgICAgICAgICAgICBoZWlnaHQ6IFwiMi41cmVtXCIsXG4gICAgICAgICAgICAgICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS5wcmltYXJ5Lm1haW4sXG4gICAgICAgICAgICAgICAgICAuLi5pY29uU3gsXG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8VHlwb2dyYXBoeVxuICAgICAgICAgICAgICB2YXJpYW50PVwiaDVcIlxuICAgICAgICAgICAgICBzeD17e1xuICAgICAgICAgICAgICAgIGZvbnRXZWlnaHQ6IFwiYm9sZFwiLFxuICAgICAgICAgICAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLnByaW1hcnkubWFpbixcbiAgICAgICAgICAgICAgICAuLi50ZXh0U3gsXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt0aXRsZSA/IHRpdGxlIDogXCJGaWx0ZXJcIn17XCIgXCJ9XG4gICAgICAgICAgICAgIHtzaG93Q291bnQgPyBgKCR7ZmlsdGVyQ291bnQgPyBmaWx0ZXJDb3VudCA6IDB9KWAgOiA8PjwvPn1cbiAgICAgICAgICAgIDwvVHlwb2dyYXBoeT5cbiAgICAgICAgICA8L0JveD5cbiAgICAgICAgfVxuICAgICAgPjwvQ2FyZEhlYWRlcj5cbiAgICAgIDxEaXZpZGVyIC8+XG4gICAgICA8Q2FyZENvbnRlbnQgc3g9e3sgcHk6IDIgfX0+XG4gICAgICAgIDxHcmlkIGNvbnRhaW5lciBzcGFjaW5nPXsyfT5cbiAgICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgIDwvR3JpZD5cbiAgICAgIDwvQ2FyZENvbnRlbnQ+XG4gICAgPC9DYXJkPlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgRmlsdGVyV3JhcHBlcjtcbiIsICJpbXBvcnQgdHlwZSB7XG4gIFN4UHJvcHNcbn0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB7XG4gIEJveCxcbiAgQ2FyZCxcbiAgQ2FyZENvbnRlbnQsXG4gIENhcmRIZWFkZXIsXG4gIERpdmlkZXIsXG4gIEdyaWQsXG4gIFR5cG9ncmFwaHksXG59IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQgdHlwZSB7IFByb3BzV2l0aENoaWxkcmVuLCBSZWFjdE5vZGUgfSBmcm9tIFwicmVhY3RcIjtcblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIEZvcm1XcmFwcGVyIGNvbXBvbmVudC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbnR5cGUgRm9ybVdyYXBwZXIgPSBQcm9wc1dpdGhDaGlsZHJlbjx7XG4gIC8qKlxuICAgKiBUaXRsZSB0ZXh0IGRpc3BsYXllZCBpbiB0aGUgZm9ybSBoZWFkZXIuXG4gICAqIEBleGFtcGxlIFwiQ3JlYXRlIFVzZXJcIiBvciBcIkVkaXQgUHJvZmlsZVwiXG4gICAqL1xuICB0aXRsZTogc3RyaW5nO1xuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBmb3JtIGlzIGluIGVkaXQgbW9kZSAoY3VycmVudGx5IHVudXNlZCBpbiBpbXBsZW1lbnRhdGlvbikuXG4gICAqIEBkZXByZWNhdGVkIFRoaXMgcHJvcCBpcyBkZWZpbmVkIGJ1dCBub3QgdXNlZCBpbiB0aGUgY29tcG9uZW50IGxvZ2ljXG4gICAqL1xuICBlZGl0TW9kZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBDdXN0b20gaWNvbiB0byBkaXNwbGF5IGluIHRoZSBoZWFkZXIgbmV4dCB0byB0aGUgdGl0bGUuXG4gICAqIEBleGFtcGxlIDxQZXJzb25JY29uIC8+IG9yIDxFZGl0SWNvbiAvPlxuICAgKi9cbiAgaWNvbj86IFJlYWN0Tm9kZTtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIE1VSSBzeCBwcm9wIGZvciBjdXN0b20gY2FyZCBzdHlsaW5nLlxuICAgKiBAZXhhbXBsZSB7IG10OiAyLCBtYXhXaWR0aDogNjAwIH1cbiAgICovXG4gIGNhcmRTeD86IFN4UHJvcHM7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBNVUkgc3ggcHJvcCBmb3IgY3VzdG9tIHRpdGxlIHRleHQgc3R5bGluZy5cbiAgICogQGV4YW1wbGUgeyBmb250U2l6ZTogMjAsIGZvbnRXZWlnaHQ6ICdib2xkJyB9XG4gICAqL1xuICB0ZXh0U3g/OiBTeFByb3BzO1xuICAvKipcbiAgICogQWN0aW9uIGJ1dHRvbiBvciBlbGVtZW50IHRvIGRpc3BsYXkgaW4gdGhlIGhlYWRlciAoZS5nLiwgc2F2ZSwgY2xvc2UpLlxuICAgKiBAZXhhbXBsZSA8QnV0dG9uPlNhdmU8L0J1dHRvbj4gb3IgPEljb25CdXR0b24+PENsb3NlSWNvbiAvPjwvSWNvbkJ1dHRvbj5cbiAgICovXG4gIGFjdGlvbkJ1dHRvbj86IFJlYWN0Tm9kZTtcbn0+O1xuXG4vKipcbiAqIENhcmQtYmFzZWQgd3JhcHBlciBjb21wb25lbnQgZm9yIG9yZ2FuaXppbmcgZm9ybSBlbGVtZW50cyB3aXRoIGhlYWRlciBhbmQgYWN0aW9ucy5cbiAqXG4gKiBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBhIHN0cnVjdHVyZWQgbGF5b3V0IGZvciBmb3JtcyB3aXRoIGEgdGl0bGUgaGVhZGVyLFxuICogb3B0aW9uYWwgaWNvbiwgYWN0aW9uIGJ1dHRvbnMsIGFuZCBhIGdyaWQtYmFzZWQgY29udGVudCBhcmVhLiBJdCBjcmVhdGVzXG4gKiBhIGNvbnNpc3RlbnQgdmlzdWFsIHN0cnVjdHVyZSBmb3IgZm9ybSBpbnRlcmZhY2VzIHRocm91Z2hvdXQgdGhlIGFwcGxpY2F0aW9uLlxuICpcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyBmb3JtIHdyYXBwZXI6XG4gKiBgYGB0c3hcbiAqIDxGb3JtV3JhcHBlciB0aXRsZT1cIlVzZXIgSW5mb3JtYXRpb25cIj5cbiAqICAgPEdyaWQgaXRlbSB4cz17MTJ9IG1kPXs2fT5cbiAqICAgICA8VGV4dEZpZWxkIGxhYmVsPVwiRmlyc3QgTmFtZVwiIC8+XG4gKiAgIDwvR3JpZD5cbiAqICAgPEdyaWQgaXRlbSB4cz17MTJ9IG1kPXs2fT5cbiAqICAgICA8VGV4dEZpZWxkIGxhYmVsPVwiTGFzdCBOYW1lXCIgLz5cbiAqICAgPC9HcmlkPlxuICogPC9Gb3JtV3JhcHBlcj5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIGljb24gYW5kIGFjdGlvbiBidXR0b246XG4gKiBgYGB0c3hcbiAqIDxGb3JtV3JhcHBlclxuICogICB0aXRsZT1cIkVkaXQgUHJvZmlsZVwiXG4gKiAgIGljb249ezxQZXJzb25JY29uIC8+fVxuICogICBhY3Rpb25CdXR0b249e1xuICogICAgIDxCdXR0b24gdmFyaWFudD1cImNvbnRhaW5lZFwiIHR5cGU9XCJzdWJtaXRcIj5cbiAqICAgICAgIFNhdmUgQ2hhbmdlc1xuICogICAgIDwvQnV0dG9uPlxuICogICB9XG4gKiA+XG4gKiAgIHtmb3JtRmllbGRzfVxuICogPC9Gb3JtV3JhcHBlcj5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIENvbXBvbmVudCBwcm9wcyBpbmNsdWRpbmcgY2hpbGRyZW4gYW5kIGxheW91dCBvcHRpb25zXG4gKiBAcmV0dXJucyBNVUkgQ2FyZCBjb21wb25lbnQgd2l0aCBzdHJ1Y3R1cmVkIGZvcm0gbGF5b3V0XG4gKlxuICogQHB1YmxpY1xuICovXG5jb25zdCBGb3JtV3JhcHBlciA9ICh7XG4gIGNoaWxkcmVuLFxuICB0aXRsZSxcbiAgZWRpdE1vZGUsXG4gIGNhcmRTeCxcbiAgdGV4dFN4LFxuICBpY29uLFxuICBhY3Rpb25CdXR0b24sXG59OiBGb3JtV3JhcHBlcikgPT4ge1xuICByZXR1cm4gKFxuICAgIDxDYXJkXG4gICAgICBzeD17e1xuICAgICAgICBwb3NpdGlvbjogXCJyZWxhdGl2ZVwiLFxuICAgICAgICBib3JkZXJSYWRpdXM6IFwiMHB4XCIsXG4gICAgICAgIC4uLmNhcmRTeCxcbiAgICAgIH19XG4gICAgPlxuICAgICAgPENhcmRIZWFkZXJcbiAgICAgICAgc3g9e3tcbiAgICAgICAgICBkaXNwbGF5OiBcImZsZXhcIixcbiAgICAgICAgICBmbGV4V3JhcDogXCJ3cmFwXCIsXG4gICAgICAgICAgcDogXCIxcmVtXCIsXG4gICAgICAgICAgXCIuTXVpQ2FyZEhlYWRlci1hY3Rpb25cIjoge1xuICAgICAgICAgICAgbWFyZ2luOiAwLFxuICAgICAgICAgICAgYWxpZ25TZWxmOiBcImNlbnRlclwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIH19XG4gICAgICAgIHRpdGxlPXtcbiAgICAgICAgICA8Qm94XG4gICAgICAgICAgICBzeD17e1xuICAgICAgICAgICAgICBkaXNwbGF5OiBcImZsZXhcIixcbiAgICAgICAgICAgICAgYWxpZ25JdGVtczogXCJjZW50ZXJcIixcbiAgICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6IFwic3BhY2UtYmV0d2VlblwiLFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8Qm94IHN4PXt7IGRpc3BsYXk6IFwiZmxleFwiLCBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLCBnYXA6IDAuNSB9fT5cbiAgICAgICAgICAgICAge2ljb24gPz8gaWNvbn1cbiAgICAgICAgICAgICAgPFR5cG9ncmFwaHkgY29sb3I9XCJwcmltYXJ5XCIgc3g9e3RleHRTeH0+XG4gICAgICAgICAgICAgICAge3RpdGxlfVxuICAgICAgICAgICAgICA8L1R5cG9ncmFwaHk+XG4gICAgICAgICAgICA8L0JveD5cbiAgICAgICAgICAgIHthY3Rpb25CdXR0b259XG4gICAgICAgICAgPC9Cb3g+XG4gICAgICAgIH1cbiAgICAgID48L0NhcmRIZWFkZXI+XG4gICAgICA8RGl2aWRlciBzeD17eyBtdDogMCB9fSAvPlxuICAgICAgPENhcmRDb250ZW50PlxuICAgICAgICA8R3JpZCBjb250YWluZXIgc3BhY2luZz17Mn0+XG4gICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICA8L0dyaWQ+XG4gICAgICA8L0NhcmRDb250ZW50PlxuICAgIDwvQ2FyZD5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEZvcm1XcmFwcGVyO1xuIiwgImltcG9ydCB0eXBlIHsgU3hQcm9wcyB9IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQgeyBHcmlkLCBUb29sdGlwLCBUeXBvZ3JhcGh5IH0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIExhYmVsVGV4dCBjb21wb25lbnQuXG4gKlxuICogQHB1YmxpY1xuICovXG5pbnRlcmZhY2UgTGFiZWxUZXh0UHJvcHMge1xuICAvKipcbiAgICogTGFiZWwgdGV4dCB0byBkaXNwbGF5IG9uIHRoZSBsZWZ0IHNpZGUuXG4gICAqIEBleGFtcGxlIFwiTmFtZVwiIG9yIFwiRW1haWwgQWRkcmVzc1wiXG4gICAqL1xuICBsYWJlbDogc3RyaW5nO1xuICAvKipcbiAgICogVmFsdWUgY29udGVudCB0byBkaXNwbGF5IG9uIHRoZSByaWdodCBzaWRlLlxuICAgKiBDYW4gYmUgdGV4dCwgbnVtYmVycywgb3IgUmVhY3QgZWxlbWVudHMuXG4gICAqIEBleGFtcGxlIFwiSm9obiBEb2VcIiBvciA8TGluaz5WaWV3IERldGFpbHM8L0xpbms+XG4gICAqL1xuICB2YWx1ZTogUmVhY3QuUmVhY3ROb2RlO1xuICAvKipcbiAgICogQ3VzdG9tIGdyaWQgc2l6aW5nIGZvciBsYWJlbCBhbmQgdmFsdWUgc2VjdGlvbnMuXG4gICAqIEBkZWZhdWx0VmFsdWUgeyBsYWJlbFNpemU6IHsgeHM6IDYsIHNtOiA2LCBtZDogNiB9LCB2YWx1ZVNpemU6IHsgeHM6IDEyLCBzbTogNiwgbWQ6IDYgfSB9XG4gICAqL1xuICBncmlkU2l6ZT86IHtcbiAgICAvKiogR3JpZCBzaXplIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBsYWJlbCBzZWN0aW9uICovXG4gICAgbGFiZWxTaXplOiB7IHhzOiBudW1iZXI7IHNtOiBudW1iZXI7IG1kOiBudW1iZXIgfTtcbiAgICAvKiogR3JpZCBzaXplIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSB2YWx1ZSBzZWN0aW9uICovXG4gICAgdmFsdWVTaXplOiB7IHhzOiBudW1iZXI7IHNtOiBudW1iZXI7IG1kOiBudW1iZXIgfTtcbiAgfTtcbiAgLyoqXG4gICAqIEdyaWQgc2l6ZSBjb25maWd1cmF0aW9uIGZvciB0aGUgZW50aXJlIGNvbnRhaW5lci5cbiAgICogQGRlZmF1bHRWYWx1ZSB7IHhzOiAxMiwgc206IDYsIG1kOiA2IH1cbiAgICovXG4gIGNvbnRhaW5lclNpemU/OiB7IHhzOiBudW1iZXI7IHNtOiBudW1iZXI7IG1kOiBudW1iZXIgfTtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIE1VSSBzeCBwcm9wIGZvciBjdXN0b20gbGFiZWwgc3R5bGluZy5cbiAgICogQGV4YW1wbGUgeyBmb250V2VpZ2h0OiAnYm9sZCcsIGNvbG9yOiAncHJpbWFyeS5tYWluJyB9XG4gICAqL1xuICBsYWJlbFN4PzogU3hQcm9wcztcbiAgLyoqXG4gICAqIE9wdGlvbmFsIE1VSSBzeCBwcm9wIGZvciBjdXN0b20gdmFsdWUgc3R5bGluZy5cbiAgICogQGV4YW1wbGUgeyBjb2xvcjogJ3RleHQuc2Vjb25kYXJ5JywgZm9udFN0eWxlOiAnaXRhbGljJyB9XG4gICAqL1xuICB2YWx1ZVN4PzogU3hQcm9wcztcbn1cblxuLyoqXG4gKiBSZXNwb25zaXZlIGxhYmVsLXZhbHVlIGRpc3BsYXkgY29tcG9uZW50IHdpdGggaG92ZXIgZWZmZWN0cyBhbmQgdGV4dCB0cnVuY2F0aW9uLlxuICpcbiAqIFRoaXMgY29tcG9uZW50IGNyZWF0ZXMgYSBjb25zaXN0ZW50IGxhYmVsLXZhbHVlIHBhaXIgbGF5b3V0IHRoYXQgYWRhcHRzIHRvIGRpZmZlcmVudFxuICogc2NyZWVuIHNpemVzLiBJdCBpbmNsdWRlcyBob3ZlciBlZmZlY3RzLCB0ZXh0IHRydW5jYXRpb24gd2l0aCB0b29sdGlwcywgYW5kXG4gKiBjdXN0b21pemFibGUgZ3JpZCBzaXppbmcgZm9yIGZsZXhpYmxlIGxheW91dHMuXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlOlxuICogYGBgdHN4XG4gKiA8TGFiZWxUZXh0XG4gKiAgIGxhYmVsPVwiRnVsbCBOYW1lXCJcbiAqICAgdmFsdWU9XCJKb2huIERvZVwiXG4gKiAvPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggUmVhY3QgZWxlbWVudCB2YWx1ZTpcbiAqIGBgYHRzeFxuICogPExhYmVsVGV4dFxuICogICBsYWJlbD1cIlByb2ZpbGVcIlxuICogICB2YWx1ZT17PExpbmsgaHJlZj1cIi9wcm9maWxlXCI+VmlldyBQcm9maWxlPC9MaW5rPn1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQ3VzdG9tIGdyaWQgc2l6aW5nOlxuICogYGBgdHN4XG4gKiA8TGFiZWxUZXh0XG4gKiAgIGxhYmVsPVwiRGVzY3JpcHRpb25cIlxuICogICB2YWx1ZT17bG9uZ0Rlc2NyaXB0aW9ufVxuICogICBncmlkU2l6ZT17e1xuICogICAgIGxhYmVsU2l6ZTogeyB4czogMTIsIHNtOiAzLCBtZDogMiB9LFxuICogICAgIHZhbHVlU2l6ZTogeyB4czogMTIsIHNtOiA5LCBtZDogMTAgfVxuICogICB9fVxuICogICBjb250YWluZXJTaXplPXt7IHhzOiAxMiwgc206IDEyLCBtZDogMTIgfX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gcHJvcHMgLSBDb21wb25lbnQgcHJvcHMgZm9yIGxhYmVsLXZhbHVlIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIEdyaWQtYmFzZWQgbGF5b3V0IHdpdGggbGFiZWwgYW5kIHZhbHVlIHNlY3Rpb25zXG4gKlxuICogQHB1YmxpY1xuICovXG5jb25zdCBMYWJlbFRleHQgPSAoe1xuICBsYWJlbCxcbiAgdmFsdWUsXG4gIGdyaWRTaXplLFxuICBjb250YWluZXJTaXplLFxuICBsYWJlbFN4LFxuICB2YWx1ZVN4LFxufTogTGFiZWxUZXh0UHJvcHMpID0+IHtcbiAgY29uc3QgZGVmYXVsdEdyaWRTaXplID0ge1xuICAgIGxhYmVsU2l6ZTogeyB4czogNiwgc206IDYsIG1kOiA2IH0sXG4gICAgdmFsdWVTaXplOiB7IHhzOiAxMiwgc206IDYsIG1kOiA2IH0sXG4gIH07XG4gIGNvbnN0IGRlZmF1bHRDb250YWluZXJTaXplID0geyB4czogMTIsIHNtOiA2LCBtZDogNiB9O1xuICBjb25zdCBzaXplID0gZ3JpZFNpemUgfHwgZGVmYXVsdEdyaWRTaXplO1xuICBjb25zdCBjb250YWluZXIgPSBjb250YWluZXJTaXplIHx8IGRlZmF1bHRDb250YWluZXJTaXplO1xuXG4gIHJldHVybiAoXG4gICAgPEdyaWRcbiAgICAgIHNpemU9e2NvbnRhaW5lcn1cbiAgICAgIHN4PXt7XG4gICAgICAgIGRpc3BsYXk6IFwiZmxleFwiLFxuICAgICAgICBmbGV4RGlyZWN0aW9uOiB7IHhzOiBcImNvbHVtblwiLCBzbTogXCJyb3dcIiwgbWQ6IFwicm93XCIgfSxcbiAgICAgICAgXCImOmhvdmVyXCI6IHsgYmdjb2xvcjogXCIjZWZlZmVmXCIsIG92ZXJmbG93OiBcImhpZGRlblwiIH0sXG4gICAgICB9fVxuICAgID5cbiAgICAgIDxHcmlkXG4gICAgICAgIHNpemU9e3NpemUubGFiZWxTaXplfVxuICAgICAgICBzeD17e1xuICAgICAgICAgIHBhZGRpbmc6IFwiNXB4XCIsXG4gICAgICAgICAgZm9udFNpemU6IFwiMTRweFwiLFxuICAgICAgICAgIHRleHRBbGlnbjogeyB4czogXCJsZWZ0XCIsIHNtOiBcInJpZ2h0XCIsIG1kOiBcInJpZ2h0XCIgfSxcbiAgICAgICAgICAuLi5sYWJlbFN4LFxuICAgICAgICB9fVxuICAgICAgPlxuICAgICAgICB7bGFiZWx9IDpcbiAgICAgIDwvR3JpZD5cbiAgICAgIDxHcmlkXG4gICAgICAgIHNpemU9e3NpemUudmFsdWVTaXplfVxuICAgICAgICBzeD17eyBwYWRkaW5nOiBcIjVweFwiLCBkaXNwbGF5OiBcImZsZXhcIiwgZmxleFdyYXA6IFwid3JhcFwiIH19XG4gICAgICA+XG4gICAgICAgIDxUb29sdGlwIHRpdGxlPXt2YWx1ZX0gYXJyb3c+XG4gICAgICAgICAgPFR5cG9ncmFwaHlcbiAgICAgICAgICAgIHN4PXt7XG4gICAgICAgICAgICAgIGZvbnRTaXplOiBcIjE0cHhcIixcbiAgICAgICAgICAgICAgd29yZEJyZWFrOiBcImJyZWFrLXdvcmRcIixcbiAgICAgICAgICAgICAgb3ZlcmZsb3c6IFwiaGlkZGVuXCIsXG4gICAgICAgICAgICAgIGRpc3BsYXk6IFwiLXdlYmtpdC1ib3hcIixcbiAgICAgICAgICAgICAgdGV4dE92ZXJmbG93OiBcImVsbGlwc2lzXCIsXG4gICAgICAgICAgICAgIFdlYmtpdExpbmVDbGFtcDogMixcbiAgICAgICAgICAgICAgV2Via2l0Qm94T3JpZW50OiBcInZlcnRpY2FsXCIsXG4gICAgICAgICAgICAgIC4uLnZhbHVlU3gsXG4gICAgICAgICAgICAgIGNvbG9yOiBcIiMwNzhkZWVcIixcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAge3ZhbHVlID8gdmFsdWUgOiBcIi1cIn1cbiAgICAgICAgICA8L1R5cG9ncmFwaHk+XG4gICAgICAgIDwvVG9vbHRpcD5cbiAgICAgIDwvR3JpZD5cbiAgICA8L0dyaWQ+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBMYWJlbFRleHQ7XG4iLCAiaW1wb3J0IE1hbmFnZVNlYXJjaEljb24gZnJvbSBcIkBtdWkvaWNvbnMtbWF0ZXJpYWwvTWFuYWdlU2VhcmNoXCI7XG5pbXBvcnQgdHlwZSB7XG4gIFN4UHJvcHNcbn0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB7XG4gIEJveCxcbiAgQ2FyZCxcbiAgQ2FyZENvbnRlbnQsXG4gIENhcmRIZWFkZXIsXG4gIERpdmlkZXIsXG4gIEdyaWQsXG4gIFR5cG9ncmFwaHksXG4gIHVzZVRoZW1lLFxufSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHR5cGUgeyBQcm9wc1dpdGhDaGlsZHJlbiwgUmVhY3ROb2RlIH0gZnJvbSBcInJlYWN0XCI7XG5cbi8qKlxuICogUHJvcHMgZm9yIHRoZSBMaXN0V3JhcHBlciBjb21wb25lbnQuXG4gKlxuICogQHB1YmxpY1xuICovXG50eXBlIExpc3RXcmFwcGVyUHJvcHMgPSBQcm9wc1dpdGhDaGlsZHJlbjx7XG4gIC8qKlxuICAgKiBUaXRsZSB0ZXh0IGRpc3BsYXllZCBpbiB0aGUgY2FyZCBoZWFkZXIuXG4gICAqIEBkZWZhdWx0VmFsdWUgXCJMaXN0XCJcbiAgICogQGV4YW1wbGUgXCJVc2VyIExpc3RcIiBvciBcIlByb2R1Y3QgQ2F0YWxvZ1wiXG4gICAqL1xuICB0aXRsZT86IHN0cmluZztcbiAgLyoqXG4gICAqIE51bWJlciBvZiBpdGVtcyB0byBkaXNwbGF5IGluIHRoZSBoZWFkZXIgY291bnQuXG4gICAqIE9ubHkgc2hvd24gd2hlbiBzaG93Q291bnQgaXMgdHJ1ZS5cbiAgICogQGV4YW1wbGUgMjUgZm9yIFwiTGlzdCAoMjUpXCJcbiAgICovXG4gIGNvdW50PzogbnVtYmVyO1xuICAvKipcbiAgICogQ29udHJvbHMgd2hldGhlciB0aGUgZW50aXJlIGNvbXBvbmVudCBpcyByZW5kZXJlZC5cbiAgICogV2hlbiBmYWxzZSwgcmV0dXJucyBhbiBlbXB0eSBmcmFnbWVudC5cbiAgICogQGRlZmF1bHRWYWx1ZSB0cnVlXG4gICAqL1xuICBzaG93PzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEFjdGlvbiBidXR0b24gb3IgZWxlbWVudCB0byBkaXNwbGF5IGluIHRoZSBoZWFkZXIgKGUuZy4sIGFkZCwgZXhwb3J0KS5cbiAgICogQGV4YW1wbGUgPEJ1dHRvbj5BZGQgTmV3PC9CdXR0b24+IG9yIDxJY29uQnV0dG9uPjxNb3JlVmVydEljb24gLz48L0ljb25CdXR0b24+XG4gICAqL1xuICBhY3Rpb25CdXR0b24/OiBSZWFjdE5vZGU7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBNVUkgc3ggcHJvcCBmb3IgY3VzdG9tIGNhcmQgc3R5bGluZy5cbiAgICogQGV4YW1wbGUgeyBtdDogMiwgYm94U2hhZG93OiAzIH1cbiAgICovXG4gIGNhcmRTeD86IFN4UHJvcHM7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBNVUkgc3ggcHJvcCBmb3IgY3VzdG9tIHRpdGxlIHRleHQgc3R5bGluZy5cbiAgICogQGV4YW1wbGUgeyBmb250U2l6ZTogMTgsIGNvbG9yOiAnc2Vjb25kYXJ5Lm1haW4nIH1cbiAgICovXG4gIHRleHRTeD86IFN4UHJvcHM7XG4gIC8qKlxuICAgKiBDdXN0b20gaWNvbiB0byBkaXNwbGF5IGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgc2VhcmNoIGljb24uXG4gICAqIEBleGFtcGxlIDxMaXN0SWNvbiAvPiBvciA8VGFibGVSb3dzSWNvbiAvPlxuICAgKi9cbiAgaWNvbj86IFJlYWN0Tm9kZTtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZGlzcGxheSB0aGUgY291bnQgaW4gdGhlIGhlYWRlci5cbiAgICogQGRlZmF1bHRWYWx1ZSB0cnVlXG4gICAqL1xuICBzaG93Q291bnQ/OiBib29sZWFuO1xuICAvKipcbiAgICogT3B0aW9uYWwgTVVJIHN4IHByb3AgZm9yIGN1c3RvbSBpY29uIHN0eWxpbmcuXG4gICAqIEBleGFtcGxlIHsgY29sb3I6ICdwcmltYXJ5Lm1haW4nLCBmb250U2l6ZTogMjggfVxuICAgKi9cbiAgaWNvblN4PzogU3hQcm9wcztcbn0+O1xuXG4vKipcbiAqIENhcmQtYmFzZWQgd3JhcHBlciBjb21wb25lbnQgZm9yIG9yZ2FuaXppbmcgbGlzdCBjb250ZW50IHdpdGggaGVhZGVyIGFuZCBhY3Rpb25zLlxuICpcbiAqIFRoaXMgY29tcG9uZW50IHByb3ZpZGVzIGEgc3RydWN0dXJlZCBsYXlvdXQgZm9yIGRpc3BsYXlpbmcgbGlzdHMgb2YgZGF0YSB3aXRoXG4gKiBhIHRpdGxlIGhlYWRlciwgb3B0aW9uYWwgaXRlbSBjb3VudCwgYWN0aW9uIGJ1dHRvbnMsIGFuZCBhIGdyaWQtYmFzZWQgY29udGVudCBhcmVhLlxuICogSXQgaW5jbHVkZXMgY29uZGl0aW9uYWwgcmVuZGVyaW5nIGFuZCBjb25zaXN0ZW50IHN0eWxpbmcgYWNyb3NzIGxpc3QgaW50ZXJmYWNlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgbGlzdCB3cmFwcGVyOlxuICogYGBgdHN4XG4gKiA8TGlzdFdyYXBwZXIgdGl0bGU9XCJVc2Vyc1wiIGNvdW50PXt1c2Vycy5sZW5ndGh9PlxuICogICA8R3JpZCBpdGVtIHhzPXsxMn0+XG4gKiAgICAgPERhdGFHcmlkIHJvd3M9e3VzZXJzfSBjb2x1bW5zPXtjb2x1bW5zfSAvPlxuICogICA8L0dyaWQ+XG4gKiA8L0xpc3RXcmFwcGVyPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggYWN0aW9uIGJ1dHRvbiBhbmQgY3VzdG9tIGljb246XG4gKiBgYGB0c3hcbiAqIDxMaXN0V3JhcHBlclxuICogICB0aXRsZT1cIlByb2R1Y3RzXCJcbiAqICAgY291bnQ9e3Byb2R1Y3RzLmxlbmd0aH1cbiAqICAgaWNvbj17PEludmVudG9yeUljb24gLz59XG4gKiAgIGFjdGlvbkJ1dHRvbj17XG4gKiAgICAgPEJ1dHRvbiB2YXJpYW50PVwiY29udGFpbmVkXCIgb25DbGljaz17YWRkUHJvZHVjdH0+XG4gKiAgICAgICBBZGQgUHJvZHVjdFxuICogICAgIDwvQnV0dG9uPlxuICogICB9XG4gKiA+XG4gKiAgIHtwcm9kdWN0TGlzdH1cbiAqIDwvTGlzdFdyYXBwZXI+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQ29uZGl0aW9uYWwgcmVuZGVyaW5nOlxuICogYGBgdHN4XG4gKiA8TGlzdFdyYXBwZXJcbiAqICAgdGl0bGU9XCJTZWFyY2ggUmVzdWx0c1wiXG4gKiAgIGNvdW50PXtzZWFyY2hSZXN1bHRzLmxlbmd0aH1cbiAqICAgc2hvdz17aGFzU2VhcmNoZWR9XG4gKiAgIHNob3dDb3VudD17c2VhcmNoUmVzdWx0cy5sZW5ndGggPiAwfVxuICogPlxuICogICB7c2VhcmNoUmVzdWx0SXRlbXN9XG4gKiA8L0xpc3RXcmFwcGVyPlxuICogYGBgXG4gKlxuICogQHBhcmFtIHByb3BzIC0gQ29tcG9uZW50IHByb3BzIGluY2x1ZGluZyBjaGlsZHJlbiBhbmQgbGF5b3V0IG9wdGlvbnNcbiAqIEByZXR1cm5zIE1VSSBDYXJkIGNvbXBvbmVudCB3aXRoIHN0cnVjdHVyZWQgbGlzdCBsYXlvdXQsIG9yIGVtcHR5IGZyYWdtZW50IGlmIHNob3cgaXMgZmFsc2VcbiAqXG4gKiBAcHVibGljXG4gKi9cbmNvbnN0IExpc3RXcmFwcGVyID0gKHtcbiAgY2hpbGRyZW4sXG4gIHRpdGxlLFxuICBjb3VudCxcbiAgc2hvdyA9IHRydWUsXG4gIGFjdGlvbkJ1dHRvbixcbiAgY2FyZFN4LFxuICB0ZXh0U3gsXG4gIGljb24sXG4gIGljb25TeCxcbiAgc2hvd0NvdW50ID0gdHJ1ZSxcbn06IExpc3RXcmFwcGVyUHJvcHMpID0+IHtcbiAgY29uc3QgdGhlbWUgPSB1c2VUaGVtZSgpO1xuXG4gIGlmICghc2hvdykgcmV0dXJuIDw+PC8+O1xuXG4gIHJldHVybiAoXG4gICAgPENhcmRcbiAgICAgIHN4PXt7XG4gICAgICAgIHBvc2l0aW9uOiBcInJlbGF0aXZlXCIsXG4gICAgICAgIGJvcmRlclJhZGl1czogXCIwcHhcIixcbiAgICAgICAgLi4uY2FyZFN4LFxuICAgICAgfX1cbiAgICA+XG4gICAgICA8Q2FyZEhlYWRlclxuICAgICAgICBzeD17e1xuICAgICAgICAgIGRpc3BsYXk6IFwiZmxleFwiLFxuICAgICAgICAgIGZsZXhXcmFwOiBcIndyYXBcIixcbiAgICAgICAgICBwOiBcIjFyZW1cIixcbiAgICAgICAgICBcIi5NdWlDYXJkSGVhZGVyLWFjdGlvblwiOiB7XG4gICAgICAgICAgICBtYXJnaW46IDAsXG4gICAgICAgICAgICBhbGlnblNlbGY6IFwiY2VudGVyXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLFxuICAgICAgICB9fVxuICAgICAgICB0aXRsZT17XG4gICAgICAgICAgPEJveFxuICAgICAgICAgICAgc3g9e3tcbiAgICAgICAgICAgICAgZGlzcGxheTogXCJmbGV4XCIsXG4gICAgICAgICAgICAgIGFsaWduSXRlbXM6IFwiY2VudGVyXCIsXG4gICAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiBcInNwYWNlLWJldHdlZW5cIixcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPEJveCBzeD17eyBkaXNwbGF5OiBcImZsZXhcIiwgYWxpZ25JdGVtczogXCJjZW50ZXJcIiwgZ2FwOiAwLjUgfX0+XG4gICAgICAgICAgICAgIHtpY29uID8gKFxuICAgICAgICAgICAgICAgIGljb25cbiAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICA8TWFuYWdlU2VhcmNoSWNvblxuICAgICAgICAgICAgICAgICAgc3g9e3tcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBcIjIuNXJlbVwiLFxuICAgICAgICAgICAgICAgICAgICBjb2xvcjogdGhlbWUucGFsZXR0ZS5wcmltYXJ5Lm1haW4sXG4gICAgICAgICAgICAgICAgICAgIC4uLmljb25TeCxcbiAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPFR5cG9ncmFwaHlcbiAgICAgICAgICAgICAgICB2YXJpYW50PVwiaDVcIlxuICAgICAgICAgICAgICAgIHN4PXt7XG4gICAgICAgICAgICAgICAgICBmb250V2VpZ2h0OiBcImJvbGRcIixcbiAgICAgICAgICAgICAgICAgIGNvbG9yOiB0aGVtZS5wYWxldHRlLnByaW1hcnkubWFpbixcbiAgICAgICAgICAgICAgICAgIC4uLnRleHRTeCxcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3RpdGxlID8gdGl0bGUgOiBcIkxpc3RcIn1cbiAgICAgICAgICAgICAgICB7c2hvd0NvdW50ID8gYCgke2NvdW50ID8gY291bnQgOiAwfSlgIDogPD48Lz59XG4gICAgICAgICAgICAgIDwvVHlwb2dyYXBoeT5cbiAgICAgICAgICAgIDwvQm94PlxuICAgICAgICAgICAge2FjdGlvbkJ1dHRvbn1cbiAgICAgICAgICA8L0JveD5cbiAgICAgICAgfVxuICAgICAgPjwvQ2FyZEhlYWRlcj5cbiAgICAgIDxEaXZpZGVyIC8+XG4gICAgICA8Q2FyZENvbnRlbnQgc3g9e3sgcHQ6IDAgfX0+XG4gICAgICAgIDxHcmlkIGNvbnRhaW5lciBzcGFjaW5nPXsyfT5cbiAgICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgIDwvR3JpZD5cbiAgICAgIDwvQ2FyZENvbnRlbnQ+XG4gICAgPC9DYXJkPlxuICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgTGlzdFdyYXBwZXI7XG4iLCAiaW1wb3J0IHsgQm94IH0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB7XG4gIEdyaWRUb29sYmFyQ29udGFpbmVyLFxuICBHcmlkVG9vbGJhckNvbHVtbnNCdXR0b24sXG4gIEdyaWRUb29sYmFyRXhwb3J0LFxuICBHcmlkVG9vbGJhckZpbHRlckJ1dHRvbixcbiAgR3JpZFRvb2xiYXJRdWlja0ZpbHRlcixcbn0gZnJvbSBcIkBtdWkveC1kYXRhLWdyaWRcIjtcblxuLyoqXG4gKiBQcmUtY29uZmlndXJlZCB0b29sYmFyIGNvbXBvbmVudCBmb3IgTVVJIERhdGFHcmlkIHdpdGggZXNzZW50aWFsIHRvb2xzLlxuICpcbiAqIFRoaXMgY29tcG9uZW50IHByb3ZpZGVzIGEgcmVhZHktdG8tdXNlIHRvb2xiYXIgZm9yIE1VSSBEYXRhR3JpZCBjb21wb25lbnRzXG4gKiB0aGF0IGluY2x1ZGVzIHF1aWNrIGZpbHRlcmluZywgY29sdW1uIG1hbmFnZW1lbnQsIGFkdmFuY2VkIGZpbHRlcmluZywgYW5kXG4gKiBkYXRhIGV4cG9ydCBjYXBhYmlsaXRpZXMuIFRoZSBxdWljayBmaWx0ZXIgaW5wdXQgaXMgc3R5bGVkIHdpdGggY3VzdG9tXG4gKiBib3JkZXIgcmFkaXVzIGFuZCBwYWRkaW5nIGZvciBhIHBvbGlzaGVkIGFwcGVhcmFuY2UuXG4gKlxuICogRmVhdHVyZXMgaW5jbHVkZWQ6XG4gKiAtIFF1aWNrIGZpbHRlciBzZWFyY2ggaW5wdXQgKGxlZnQtYWxpZ25lZClcbiAqIC0gQ29sdW1uIHZpc2liaWxpdHkgdG9nZ2xlIGJ1dHRvblxuICogLSBBZHZhbmNlZCBmaWx0ZXIgYnV0dG9uXG4gKiAtIERhdGEgZXhwb3J0IGJ1dHRvbiAoQ1NWLCBFeGNlbCwgZXRjLilcbiAqXG4gKiBAZXhhbXBsZVxuICogQmFzaWMgdXNhZ2Ugd2l0aCBEYXRhR3JpZDpcbiAqIGBgYHRzeFxuICogPERhdGFHcmlkXG4gKiAgIHJvd3M9e2RhdGF9XG4gKiAgIGNvbHVtbnM9e2NvbHVtbnN9XG4gKiAgIHNsb3RzPXt7XG4gKiAgICAgdG9vbGJhcjogU2ltcGxlVG9vbGJhclxuICogICB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBJbiBhIGN1c3RvbSBncmlkIHNldHVwOlxuICogYGBgdHN4XG4gKiA8Qm94PlxuICogICA8U2ltcGxlVG9vbGJhciAvPlxuICogICA8RGF0YUdyaWRcbiAqICAgICByb3dzPXtmaWx0ZXJlZERhdGF9XG4gKiAgICAgY29sdW1ucz17dmlzaWJsZUNvbHVtbnN9XG4gKiAgICAgaGlkZUZvb3RlclxuICogICAvPlxuICogPC9Cb3g+XG4gKiBgYGBcbiAqXG4gKiBAcmV0dXJucyBHcmlkVG9vbGJhckNvbnRhaW5lciB3aXRoIHByZS1jb25maWd1cmVkIHRvb2xiYXIgZWxlbWVudHNcbiAqXG4gKiBAcHVibGljXG4gKi9cbmNvbnN0IFNpbXBsZVRvb2xiYXIgPSAoKSA9PiAoXG4gIDxHcmlkVG9vbGJhckNvbnRhaW5lcj5cbiAgICA8Qm94XG4gICAgICBzeD17e1xuICAgICAgICBcIiYgLk11aUlucHV0QmFzZS1yb290XCI6IHtcbiAgICAgICAgICBib3JkZXJSYWRpdXM6IFwiOHB4XCIsXG4gICAgICAgICAgcGFkZGluZzogXCI2cHggMTBweFwiLFxuICAgICAgICB9LFxuICAgICAgICBcIiYgaW5wdXRcIjoge1xuICAgICAgICAgIGZvbnRTaXplOiBcIjE0cHhcIixcbiAgICAgICAgICBjb2xvcjogXCIjMzMzXCIsXG4gICAgICAgIH0sXG4gICAgICAgIGJvcmRlclJhZGl1czogXCI4cHhcIixcbiAgICAgIH19XG4gICAgPlxuICAgICAgPEdyaWRUb29sYmFyUXVpY2tGaWx0ZXIgLz5cbiAgICA8L0JveD5cbiAgICA8Qm94IHN4PXt7IGZsZXhHcm93OiAxIH19IC8+XG4gICAgPEdyaWRUb29sYmFyQ29sdW1uc0J1dHRvbiAvPlxuICAgIDxHcmlkVG9vbGJhckZpbHRlckJ1dHRvbiAvPlxuICAgIDxHcmlkVG9vbGJhckV4cG9ydCAvPlxuICA8L0dyaWRUb29sYmFyQ29udGFpbmVyPlxuKTtcblxuZXhwb3J0IGRlZmF1bHQgU2ltcGxlVG9vbGJhcjtcbiIsICJpbXBvcnQgdHlwZSB7IEJ1dHRvblByb3BzIH0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcbmltcG9ydCB7IEJ1dHRvbiwgQ2lyY3VsYXJQcm9ncmVzcyB9IGZyb20gXCJAbXVpL21hdGVyaWFsXCI7XG5pbXBvcnQgUmVhY3QsIHsgZm9yd2FyZFJlZiwgbWVtbyB9IGZyb20gXCJyZWFjdFwiO1xuXG4vKipcbiAqIFByb3BzIGZvciB0aGUgU2ltcGxlQnV0dG9uIGNvbXBvbmVudC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2ltcGxlQnV0dG9uUHJvcHMgZXh0ZW5kcyBCdXR0b25Qcm9wcyB7XG4gIC8qKlxuICAgKiBDb250cm9scyBidXR0b24gdmlzaWJpbGl0eS4gV2hlbiBmYWxzZSwgdGhlIGNvbXBvbmVudCByZXR1cm5zIG51bGwuXG4gICAqIEBkZWZhdWx0VmFsdWUgdHJ1ZVxuICAgKi9cbiAgc2hvdz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBMb2FkaW5nIHN0YXRlIHdpdGggc3Bpbm5lci4gV2hlbiB0cnVlLCBzaG93cyBhIGxvYWRpbmcgc3Bpbm5lciBhbmQgZGlzYWJsZXMgdGhlIGJ1dHRvbi5cbiAgICogQGRlZmF1bHRWYWx1ZSBmYWxzZVxuICAgKi9cbiAgbG9hZGluZz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUZXN0IGlkZW50aWZpZXIgZm9yIHRlc3RpbmcgZnJhbWV3b3Jrcy5cbiAgICogQGV4YW1wbGUgXCJzdWJtaXQtYnV0dG9uXCJcbiAgICovXG4gICdkYXRhLXRlc3RpZCc/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDdXN0b20gdGV4dCB0byBkaXNwbGF5IHdoZW4gbG9hZGluZyBpcyB0cnVlLiBJZiBub3QgcHJvdmlkZWQsIG9yaWdpbmFsIGNoaWxkcmVuIGFyZSBzaG93bi5cbiAgICogQGV4YW1wbGUgXCJTYXZpbmcuLi5cIlxuICAgKi9cbiAgbG9hZGluZ1RleHQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRW5oYW5jZWQgTVVJIEJ1dHRvbiBjb21wb25lbnQgd2l0aCBsb2FkaW5nIHN0YXRlcyBhbmQgY29uZGl0aW9uYWwgcmVuZGVyaW5nLlxuICpcbiAqIFRoaXMgY29tcG9uZW50IGV4dGVuZHMgdGhlIHN0YW5kYXJkIE1VSSBCdXR0b24gd2l0aCBhZGRpdGlvbmFsIGZlYXR1cmVzOlxuICogLSBMb2FkaW5nIHN0YXRlIHdpdGggc3Bpbm5lclxuICogLSBDb25kaXRpb25hbCByZW5kZXJpbmcgYmFzZWQgb24gc2hvdyBwcm9wXG4gKiAtIEF1dG9tYXRpYyBkaXNhYmxpbmcgZHVyaW5nIGxvYWRpbmdcbiAqIC0gQ3VzdG9tIGxvYWRpbmcgdGV4dCBzdXBwb3J0XG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlOlxuICogYGBgdHN4XG4gKiA8U2ltcGxlQnV0dG9uIHZhcmlhbnQ9XCJjb250YWluZWRcIiBjb2xvcj1cInByaW1hcnlcIj5cbiAqICAgQ2xpY2sgTWVcbiAqIDwvU2ltcGxlQnV0dG9uPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggbG9hZGluZyBzdGF0ZTpcbiAqIGBgYHRzeFxuICogPFNpbXBsZUJ1dHRvblxuICogICBsb2FkaW5nPXtpc1N1Ym1pdHRpbmd9XG4gKiAgIGxvYWRpbmdUZXh0PVwiU2F2aW5nLi4uXCJcbiAqICAgdmFyaWFudD1cImNvbnRhaW5lZFwiXG4gKiA+XG4gKiAgIFNhdmUgQ2hhbmdlc1xuICogPC9TaW1wbGVCdXR0b24+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQ29uZGl0aW9uYWwgcmVuZGVyaW5nOlxuICogYGBgdHN4XG4gKiA8U2ltcGxlQnV0dG9uXG4gKiAgIHNob3c9e2hhc1Blcm1pc3Npb259XG4gKiAgIHZhcmlhbnQ9XCJvdXRsaW5lZFwiXG4gKiA+XG4gKiAgIEFkbWluIEFjdGlvblxuICogPC9TaW1wbGVCdXR0b24+XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gcHJvcHMgLSBDb21wb25lbnQgcHJvcHMgZXh0ZW5kaW5nIE1VSSBCdXR0b25Qcm9wc1xuICogQHBhcmFtIHJlZiAtIEZvcndhcmRlZCByZWYgdG8gdGhlIHVuZGVybHlpbmcgYnV0dG9uIGVsZW1lbnRcbiAqIEByZXR1cm5zIEpTWCBlbGVtZW50IG9yIG51bGwgaWYgc2hvdyBpcyBmYWxzZVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuY29uc3QgU2ltcGxlQnV0dG9uID0gbWVtbyhmb3J3YXJkUmVmPEhUTUxCdXR0b25FbGVtZW50LCBTaW1wbGVCdXR0b25Qcm9wcz4oXG4gICh7XG4gICAgc2hvdyA9IHRydWUsXG4gICAgbG9hZGluZyA9IGZhbHNlLFxuICAgIGxvYWRpbmdUZXh0LFxuICAgIGNoaWxkcmVuLFxuICAgIC4uLnJlc3RcbiAgfSwgcmVmKSA9PiB7XG4gICAgaWYgKCFzaG93KSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiAoXG4gICAgICA8PlxuICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgcmVmPXtyZWZ9XG4gICAgICAgICAgZGlzYWJsZWQ9e2xvYWRpbmcgfHwgcmVzdC5kaXNhYmxlZH1cbiAgICAgICAgICBzdGFydEljb249e2xvYWRpbmcgPyA8Q2lyY3VsYXJQcm9ncmVzcyBzaXplPXsxNn0gLz4gOiByZXN0LnN0YXJ0SWNvbn1cbiAgICAgICAgICB7Li4ucmVzdH1cbiAgICAgICAgPlxuICAgICAgICAgIHtsb2FkaW5nICYmIGxvYWRpbmdUZXh0ID8gbG9hZGluZ1RleHQgOiBjaGlsZHJlbn1cbiAgICAgICAgPC9CdXR0b24+XG4gICAgICA8Lz5cbiAgICApO1xuICB9XG4pKTtcblxuU2ltcGxlQnV0dG9uLmRpc3BsYXlOYW1lID0gXCJTaW1wbGVCdXR0b25cIjtcblxuZXhwb3J0IGRlZmF1bHQgU2ltcGxlQnV0dG9uO1xuIiwgImltcG9ydCB0eXBlIHsgUHJvcHNXaXRoQ2hpbGRyZW4gfSBmcm9tIFwicmVhY3RcIjtcblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIEF1dGhvcml6ZWRWaWV3IGNvbXBvbmVudC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbnR5cGUgQXV0aG9yaXplZFZpZXdQcm9wcyA9IFByb3BzV2l0aENoaWxkcmVuICYge1xuICAvKipcbiAgICogQ29udHJvbHMgd2hldGhlciB0aGUgY2hpbGRyZW4gc2hvdWxkIGJlIHJlbmRlcmVkLiBXaGVuIGZhbHNlLCBub3RoaW5nIGlzIHJlbmRlcmVkLlxuICAgKiBAZXhhbXBsZSB0cnVlIC0gU2hvdyBjb250ZW50LCBmYWxzZSAtIEhpZGUgY29udGVudFxuICAgKi9cbiAgc2hvdzogYm9vbGVhbjtcbn07XG5cbi8qKlxuICogQ29uZGl0aW9uYWwgcmVuZGVyaW5nIGNvbXBvbmVudCB0aGF0IHNob3dzIG9yIGhpZGVzIGNvbnRlbnQgYmFzZWQgb24gYXV0aG9yaXphdGlvbiBzdGF0ZS5cbiAqXG4gKiBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBhIHNpbXBsZSB3YXkgdG8gY29uZGl0aW9uYWxseSByZW5kZXIgY2hpbGQgY29tcG9uZW50c1xuICogYmFzZWQgb24gYSBib29sZWFuIGZsYWcsIHR5cGljYWxseSB1c2VkIGZvciBhdXRob3JpemF0aW9uIG9yIHBlcm1pc3Npb24tYmFzZWQgcmVuZGVyaW5nLlxuICpcbiAqIEBleGFtcGxlXG4gKiBCYXNpYyB1c2FnZTpcbiAqIGBgYHRzeFxuICogPEF1dGhvcml6ZWRWaWV3IHNob3c9e2hhc1Blcm1pc3Npb259PlxuICogICA8QWRtaW5QYW5lbCAvPlxuICogPC9BdXRob3JpemVkVmlldz5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBXaXRoIHVzZXIgcm9sZXM6XG4gKiBgYGB0c3hcbiAqIDxBdXRob3JpemVkVmlldyBzaG93PXt1c2VyLnJvbGUgPT09ICdhZG1pbid9PlxuICogICA8RGVsZXRlQnV0dG9uIC8+XG4gKiA8L0F1dGhvcml6ZWRWaWV3PlxuICogYGBgXG4gKlxuICogQHBhcmFtIHByb3BzIC0gQ29tcG9uZW50IHByb3BzIGluY2x1ZGluZyBjaGlsZHJlbiBhbmQgc2hvdyBmbGFnXG4gKiBAcmV0dXJucyBKU1ggY2hpbGRyZW4gaWYgc2hvdyBpcyB0cnVlLCBlbXB0eSBmcmFnbWVudCBpZiBmYWxzZVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuY29uc3QgQXV0aG9yaXplZFZpZXcgPSAoeyBjaGlsZHJlbiwgc2hvdyB9OiBBdXRob3JpemVkVmlld1Byb3BzKSA9PiB7XG4gIGlmICghc2hvdykgcmV0dXJuIDw+PC8+O1xuXG4gIHJldHVybiA8PntjaGlsZHJlbn08Lz47XG59O1xuXG5leHBvcnQgZGVmYXVsdCBBdXRob3JpemVkVmlldztcbiIsICJpbXBvcnQgdHlwZSB7IFN4UHJvcHMgfSBmcm9tIFwiQG11aS9tYXRlcmlhbFwiO1xuaW1wb3J0IHsgQnV0dG9uIH0gZnJvbSBcIkBtdWkvbWF0ZXJpYWxcIjtcblxuLyoqXG4gKiBQcm9wcyBmb3IgdGhlIENhbmNlbEJ1dHRvbiBjb21wb25lbnQuXG4gKlxuICogQHB1YmxpY1xuICovXG5pbnRlcmZhY2UgQ2FuY2VsQnV0dG9uUHJvcHMge1xuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIGEgZm9ybSBvciBvcGVyYXRpb24gaXMgY3VycmVudGx5IGJlaW5nIHN1Ym1pdHRlZC5cbiAgICogV2hlbiB0cnVlLCB0aGUgYnV0dG9uIGlzIGRpc2FibGVkIHRvIHByZXZlbnQgbXVsdGlwbGUgY2FuY2VsIGFjdGlvbnMuXG4gICAqL1xuICBpc1N1Ym1pdHRpbmc6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBDYWxsYmFjayBmdW5jdGlvbiBleGVjdXRlZCB3aGVuIHRoZSBjYW5jZWwgYnV0dG9uIGlzIGNsaWNrZWQuXG4gICAqIFNob3VsZCBoYW5kbGUgdGhlIGNhbmNlbGxhdGlvbiBsb2dpYyAoZS5nLiwgZm9ybSByZXNldCwgbmF2aWdhdGlvbiwgZXRjLikuXG4gICAqL1xuICBoYW5kbGVDYW5jZWw6ICgpID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBNVUkgc3ggcHJvcCBmb3IgY3VzdG9tIHN0eWxpbmcuXG4gICAqIEBleGFtcGxlIHsgbXQ6IDIsIGJnY29sb3I6ICdlcnJvci5tYWluJyB9XG4gICAqL1xuICBzeD86IFN4UHJvcHM7XG59XG5cbi8qKlxuICogU3RhbmRhcmRpemVkIGNhbmNlbCBidXR0b24gY29tcG9uZW50IHdpdGggc3VibWlzc2lvbiBzdGF0ZSBoYW5kbGluZy5cbiAqXG4gKiBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBhIGNvbnNpc3RlbnQgY2FuY2VsIGJ1dHRvbiBpbXBsZW1lbnRhdGlvbiB0aGF0IGF1dG9tYXRpY2FsbHlcbiAqIGhhbmRsZXMgZGlzYWJsZWQgc3RhdGVzIGR1cmluZyBmb3JtIHN1Ym1pc3Npb25zLiBJdCdzIGRlc2lnbmVkIHRvIGJlIHVzZWQgaW4gZm9ybXNcbiAqIGFuZCBkaWFsb2dzIHdoZXJlIHVzZXJzIG5lZWQgdG8gY2FuY2VsIG9wZXJhdGlvbnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlIGluIGEgZm9ybTpcbiAqIGBgYHRzeFxuICogPENhbmNlbEJ1dHRvblxuICogICBpc1N1Ym1pdHRpbmc9e2lzTG9hZGluZ31cbiAqICAgaGFuZGxlQ2FuY2VsPXsoKSA9PiBuYXZpZ2F0ZSgnL3ByZXZpb3VzLXBhZ2UnKX1cbiAqIC8+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogV2l0aCBjdXN0b20gc3R5bGluZzpcbiAqIGBgYHRzeFxuICogPENhbmNlbEJ1dHRvblxuICogICBpc1N1Ym1pdHRpbmc9e2Zvcm0uZm9ybVN0YXRlLmlzU3VibWl0dGluZ31cbiAqICAgaGFuZGxlQ2FuY2VsPXtmb3JtLnJlc2V0fVxuICogICBzeD17eyBtdDogMiwgY29sb3I6ICdlcnJvci5tYWluJyB9fVxuICogLz5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIENvbXBvbmVudCBwcm9wcyBmb3IgY2FuY2VsIGJ1dHRvbiBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyBNVUkgQnV0dG9uIGNvbXBvbmVudCBjb25maWd1cmVkIGFzIGEgY2FuY2VsIGJ1dHRvblxuICpcbiAqIEBwdWJsaWNcbiAqL1xuY29uc3QgQ2FuY2VsQnV0dG9uID0gKHtcbiAgaXNTdWJtaXR0aW5nLFxuICBoYW5kbGVDYW5jZWwsXG4gIHN4LFxufTogQ2FuY2VsQnV0dG9uUHJvcHMpID0+IHtcbiAgcmV0dXJuIChcbiAgICA8QnV0dG9uXG4gICAgICB2YXJpYW50PVwib3V0bGluZWRcIlxuICAgICAgb25DbGljaz17aGFuZGxlQ2FuY2VsfVxuICAgICAgZGlzYWJsZWQ9e2lzU3VibWl0dGluZ31cbiAgICAgIHN4PXtzeH1cbiAgICA+XG4gICAgICBDYW5jZWxcbiAgICA8L0J1dHRvbj5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IENhbmNlbEJ1dHRvbjtcbiJdLAogICJtYXBwaW5ncyI6ICI7QUFDQSxTQUFTLGNBQWM7QUE0RW5CO0FBZEos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TyxnQkFBQUEsS0FBQUQsV0FBQSxFQUFFO0FBRXBCLFNBQU8sZ0JBQUFDLEtBQUFELFdBQUEsRUFBRyxVQUFTO0FBQ3JCO0FBRUEsSUFBTyx5QkFBUTs7O0FDL0NmLFNBQVMsVUFBQUUsZUFBYztBQThEbkIsZ0JBQUFDLGFBQUE7QUFOSixJQUFNLGVBQWUsQ0FBQztBQUFBLEVBQ3BCO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRixNQUF5QjtBQUN2QixTQUNFLGdCQUFBQTtBQUFBLElBQUNEO0FBQUEsSUFBQTtBQUFBLE1BQ0MsU0FBUTtBQUFBLE1BQ1IsU0FBUztBQUFBLE1BQ1QsVUFBVTtBQUFBLE1BQ1Y7QUFBQSxNQUNEO0FBQUE7QUFBQSxFQUVEO0FBRUo7QUFFQSxJQUFPLHVCQUFROyIsCiAgIm5hbWVzIjogWyJqc3giLCAidXNlVGhlbWUiLCAianN4IiwgIkJveCIsICJDYXJkIiwgIkNhcmRDb250ZW50IiwgIkNhcmRIZWFkZXIiLCAiRGl2aWRlciIsICJHcmlkIiwgIlR5cG9ncmFwaHkiLCAianN4IiwgImpzeHMiLCAiR3JpZCIsICJUeXBvZ3JhcGh5IiwgImpzeCIsICJqc3hzIiwgIk1hbmFnZVNlYXJjaEljb24iLCAiQm94IiwgIkNhcmQiLCAiQ2FyZENvbnRlbnQiLCAiQ2FyZEhlYWRlciIsICJEaXZpZGVyIiwgIkdyaWQiLCAiVHlwb2dyYXBoeSIsICJ1c2VUaGVtZSIsICJGcmFnbWVudCIsICJqc3giLCAianN4cyIsICJCb3giLCAianN4IiwgImpzeHMiLCAiQnV0dG9uIiwgIkZyYWdtZW50IiwgImpzeCIsICJGcmFnbWVudCIsICJqc3giLCAiQnV0dG9uIiwgImpzeCJdCn0K