@ajf/material 13.0.0-next.9 → 13.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (235) hide show
  1. package/{report-builder/index.d.ts → barcode/barcode_public_index.d.ts} +1 -1
  2. package/barcode/index.d.ts +19 -1
  3. package/barcode/package.json +2 -2
  4. package/calendar/calendar_public_index.d.ts +4 -0
  5. package/calendar/index.d.ts +19 -1
  6. package/calendar/package.json +2 -2
  7. package/checkbox-group/checkbox-group_public_index.d.ts +4 -0
  8. package/checkbox-group/index.d.ts +19 -1
  9. package/checkbox-group/package.json +2 -2
  10. package/esm2020/barcode/barcode-module.mjs +7 -11
  11. package/esm2020/barcode/barcode.mjs +6 -6
  12. package/esm2020/barcode/barcode_public_index.mjs +5 -0
  13. package/esm2020/barcode/index.mjs +20 -2
  14. package/esm2020/calendar/calendar-module.mjs +8 -28
  15. package/esm2020/calendar/calendar.mjs +7 -11
  16. package/esm2020/calendar/calendar_public_index.mjs +5 -0
  17. package/esm2020/calendar/index.mjs +20 -2
  18. package/esm2020/checkbox-group/checkbox-group-item.mjs +6 -6
  19. package/esm2020/checkbox-group/checkbox-group-module.mjs +8 -27
  20. package/esm2020/checkbox-group/checkbox-group_public_index.mjs +5 -0
  21. package/esm2020/checkbox-group/index.mjs +20 -2
  22. package/esm2020/form-builder/branch-line.mjs +5 -5
  23. package/esm2020/form-builder/choices-origin-data-source.mjs +1 -1
  24. package/esm2020/form-builder/choices-origin-editor-dialog.mjs +10 -7
  25. package/esm2020/form-builder/choices-origin-editor.mjs +4 -4
  26. package/esm2020/form-builder/condition-editor-dialog.mjs +4 -4
  27. package/esm2020/form-builder/condition-editor.mjs +12 -11
  28. package/esm2020/form-builder/form-builder-module.mjs +85 -34
  29. package/esm2020/form-builder/form-builder-service.mjs +135 -128
  30. package/esm2020/form-builder/form-builder-utils.mjs +4 -3
  31. package/esm2020/form-builder/form-builder.mjs +33 -29
  32. package/esm2020/form-builder/form-builder_public_index.mjs +5 -0
  33. package/esm2020/form-builder/index.mjs +20 -2
  34. package/esm2020/form-builder/node-entry.mjs +10 -8
  35. package/esm2020/form-builder/node-properties.mjs +320 -315
  36. package/esm2020/form-builder/node-type-entry.mjs +5 -5
  37. package/esm2020/form-builder/string-identifier-dialog.mjs +8 -10
  38. package/esm2020/form-builder/validation-condition-editor-dialog.mjs +4 -4
  39. package/esm2020/form-builder/warning-condition-editor-dialog.mjs +4 -4
  40. package/esm2020/forms/barcode-field.mjs +6 -6
  41. package/esm2020/forms/boolean-field.mjs +6 -6
  42. package/esm2020/forms/date-field.mjs +5 -5
  43. package/esm2020/forms/date-input-field.mjs +6 -6
  44. package/esm2020/forms/empty-field.mjs +6 -6
  45. package/esm2020/forms/field-service.mjs +45 -45
  46. package/esm2020/forms/field-warning-dialog.mjs +4 -4
  47. package/esm2020/forms/field.mjs +5 -5
  48. package/esm2020/forms/form.mjs +5 -5
  49. package/esm2020/forms/forms-module.mjs +119 -43
  50. package/esm2020/forms/forms_public_index.mjs +5 -0
  51. package/esm2020/forms/index.mjs +20 -2
  52. package/esm2020/forms/input-field.mjs +5 -5
  53. package/esm2020/forms/multiple-choice-field.mjs +6 -6
  54. package/esm2020/forms/range-field.mjs +6 -6
  55. package/esm2020/forms/single-choice-field.mjs +6 -6
  56. package/esm2020/forms/table-field.mjs +6 -6
  57. package/esm2020/forms/text-field.mjs +5 -5
  58. package/esm2020/forms/time-field.mjs +6 -6
  59. package/esm2020/forms/video-url-field.mjs +5 -5
  60. package/esm2020/forms/warning-alert-service.mjs +4 -4
  61. package/esm2020/image/image-module.mjs +8 -19
  62. package/esm2020/image/image.mjs +5 -5
  63. package/esm2020/image/image_public_index.mjs +5 -0
  64. package/esm2020/image/index.mjs +20 -2
  65. package/esm2020/monaco-editor/autocomplete-singleton-model.mjs +3 -2
  66. package/esm2020/monaco-editor/editor-options-model.mjs +1 -1
  67. package/esm2020/monaco-editor/index.mjs +20 -2
  68. package/esm2020/monaco-editor/monaco-editor-module.mjs +7 -11
  69. package/esm2020/monaco-editor/monaco-editor.mjs +6 -6
  70. package/esm2020/monaco-editor/monaco-editor_public_index.mjs +5 -0
  71. package/esm2020/node-icon/index.mjs +20 -2
  72. package/esm2020/node-icon/node-icon-module.mjs +8 -19
  73. package/esm2020/node-icon/node-icon.mjs +4 -4
  74. package/esm2020/node-icon/node-icon_public_index.mjs +5 -0
  75. package/esm2020/page-slider/index.mjs +20 -2
  76. package/esm2020/page-slider/page-slider-module.mjs +8 -14
  77. package/esm2020/page-slider/page-slider.mjs +5 -5
  78. package/esm2020/page-slider/page-slider_public_index.mjs +5 -0
  79. package/esm2020/reports/chart-widget.mjs +5 -5
  80. package/esm2020/reports/filter-widget.mjs +71 -0
  81. package/esm2020/reports/formula-widget.mjs +5 -5
  82. package/esm2020/reports/image-container-widget.mjs +5 -5
  83. package/esm2020/reports/image-widget.mjs +5 -5
  84. package/esm2020/reports/index.mjs +20 -2
  85. package/esm2020/reports/map-widget.mjs +5 -5
  86. package/esm2020/reports/page-break-widget.mjs +5 -5
  87. package/esm2020/reports/public-api.mjs +2 -1
  88. package/esm2020/reports/report.mjs +5 -5
  89. package/esm2020/reports/reports-module.mjs +15 -12
  90. package/esm2020/reports/reports_public_index.mjs +5 -0
  91. package/esm2020/reports/table-widget.mjs +6 -6
  92. package/esm2020/reports/text-widget.mjs +5 -5
  93. package/esm2020/reports/widget.mjs +19 -16
  94. package/esm2020/time/index.mjs +20 -2
  95. package/esm2020/time/time-module.mjs +8 -22
  96. package/esm2020/time/time.mjs +6 -6
  97. package/esm2020/time/time_public_index.mjs +5 -0
  98. package/fesm2015/barcode.mjs +32 -14
  99. package/fesm2015/barcode.mjs.map +1 -1
  100. package/fesm2015/calendar.mjs +34 -36
  101. package/fesm2015/calendar.mjs.map +1 -1
  102. package/fesm2015/checkbox-group.mjs +33 -30
  103. package/fesm2015/checkbox-group.mjs.map +1 -1
  104. package/fesm2015/form-builder.mjs +638 -544
  105. package/fesm2015/form-builder.mjs.map +1 -1
  106. package/fesm2015/forms.mjs +235 -137
  107. package/fesm2015/forms.mjs.map +1 -1
  108. package/fesm2015/image.mjs +32 -21
  109. package/fesm2015/image.mjs.map +1 -1
  110. package/fesm2015/monaco-editor.mjs +34 -15
  111. package/fesm2015/monaco-editor.mjs.map +1 -1
  112. package/fesm2015/node-icon.mjs +32 -21
  113. package/fesm2015/node-icon.mjs.map +1 -1
  114. package/fesm2015/page-slider.mjs +32 -16
  115. package/fesm2015/page-slider.mjs.map +1 -1
  116. package/fesm2015/reports.mjs +156 -66
  117. package/fesm2015/reports.mjs.map +1 -1
  118. package/fesm2015/time.mjs +33 -25
  119. package/fesm2015/time.mjs.map +1 -1
  120. package/fesm2020/barcode.mjs +32 -14
  121. package/fesm2020/barcode.mjs.map +1 -1
  122. package/fesm2020/calendar.mjs +34 -36
  123. package/fesm2020/calendar.mjs.map +1 -1
  124. package/fesm2020/checkbox-group.mjs +33 -30
  125. package/fesm2020/checkbox-group.mjs.map +1 -1
  126. package/fesm2020/form-builder.mjs +638 -544
  127. package/fesm2020/form-builder.mjs.map +1 -1
  128. package/fesm2020/forms.mjs +235 -137
  129. package/fesm2020/forms.mjs.map +1 -1
  130. package/fesm2020/image.mjs +32 -21
  131. package/fesm2020/image.mjs.map +1 -1
  132. package/fesm2020/monaco-editor.mjs +34 -15
  133. package/fesm2020/monaco-editor.mjs.map +1 -1
  134. package/fesm2020/node-icon.mjs +32 -21
  135. package/fesm2020/node-icon.mjs.map +1 -1
  136. package/fesm2020/page-slider.mjs +32 -16
  137. package/fesm2020/page-slider.mjs.map +1 -1
  138. package/fesm2020/reports.mjs +156 -66
  139. package/fesm2020/reports.mjs.map +1 -1
  140. package/fesm2020/time.mjs +33 -25
  141. package/fesm2020/time.mjs.map +1 -1
  142. package/form-builder/form-builder_public_index.d.ts +4 -0
  143. package/form-builder/index.d.ts +19 -1
  144. package/form-builder/node-properties.d.ts +1 -0
  145. package/form-builder/package.json +2 -2
  146. package/forms/forms_public_index.d.ts +4 -0
  147. package/forms/index.d.ts +19 -1
  148. package/forms/package.json +2 -2
  149. package/image/image_public_index.d.ts +4 -0
  150. package/image/index.d.ts +19 -1
  151. package/image/package.json +2 -2
  152. package/monaco-editor/index.d.ts +19 -1
  153. package/monaco-editor/monaco-editor_public_index.d.ts +4 -0
  154. package/monaco-editor/package.json +2 -2
  155. package/node-icon/index.d.ts +19 -1
  156. package/node-icon/node-icon_public_index.d.ts +4 -0
  157. package/node-icon/package.json +2 -2
  158. package/package.json +26 -36
  159. package/page-slider/index.d.ts +19 -1
  160. package/page-slider/package.json +2 -2
  161. package/page-slider/page-slider_public_index.d.ts +4 -0
  162. package/reports/filter-widget.d.ts +37 -0
  163. package/reports/index.d.ts +19 -1
  164. package/reports/package.json +2 -2
  165. package/reports/public-api.d.ts +1 -0
  166. package/reports/reports-module.d.ts +21 -19
  167. package/reports/reports_public_index.d.ts +4 -0
  168. package/time/index.d.ts +19 -1
  169. package/time/package.json +2 -2
  170. package/time/time_public_index.d.ts +4 -0
  171. package/esm2020/report-builder/column.mjs +0 -76
  172. package/esm2020/report-builder/condition-editor.mjs +0 -162
  173. package/esm2020/report-builder/content.mjs +0 -256
  174. package/esm2020/report-builder/custom-widget-dialog.mjs +0 -50
  175. package/esm2020/report-builder/custom-widget-toolbar-button.mjs +0 -67
  176. package/esm2020/report-builder/custom-widgets-toolbar.mjs +0 -124
  177. package/esm2020/report-builder/forms-analyzer-dialog.mjs +0 -328
  178. package/esm2020/report-builder/forms-analyzer.mjs +0 -244
  179. package/esm2020/report-builder/image-filter.mjs +0 -38
  180. package/esm2020/report-builder/image-group.mjs +0 -112
  181. package/esm2020/report-builder/index.mjs +0 -5
  182. package/esm2020/report-builder/models.mjs +0 -23
  183. package/esm2020/report-builder/operations.mjs +0 -23
  184. package/esm2020/report-builder/properties.mjs +0 -761
  185. package/esm2020/report-builder/public-api.mjs +0 -26
  186. package/esm2020/report-builder/quill-editor.mjs +0 -307
  187. package/esm2020/report-builder/renderer-widget.mjs +0 -243
  188. package/esm2020/report-builder/report-builder-drag-data.mjs +0 -23
  189. package/esm2020/report-builder/report-builder-module.mjs +0 -155
  190. package/esm2020/report-builder/report-builder-service.mjs +0 -1690
  191. package/esm2020/report-builder/report-builder.mjs +0 -51
  192. package/esm2020/report-builder/theme-color-dialog.mjs +0 -67
  193. package/esm2020/report-builder/theme-color.mjs +0 -196
  194. package/esm2020/report-builder/tokens.mjs +0 -24
  195. package/esm2020/report-builder/toolbar-dialog.mjs +0 -54
  196. package/esm2020/report-builder/toolbar.mjs +0 -91
  197. package/esm2020/report-builder/utils.mjs +0 -48
  198. package/esm2020/report-builder/widget-toolbar-button.mjs +0 -46
  199. package/esm2020/report-builder/widgets-row-buttons.mjs +0 -136
  200. package/esm2020/report-builder/widgets-toolbar.mjs +0 -80
  201. package/fesm2015/report-builder.mjs +0 -5184
  202. package/fesm2015/report-builder.mjs.map +0 -1
  203. package/fesm2020/report-builder.mjs +0 -5182
  204. package/fesm2020/report-builder.mjs.map +0 -1
  205. package/report-builder/_report-builder.scss +0 -0
  206. package/report-builder/column.d.ts +0 -66
  207. package/report-builder/condition-editor.d.ts +0 -70
  208. package/report-builder/content.d.ts +0 -145
  209. package/report-builder/custom-widget-dialog.d.ts +0 -13
  210. package/report-builder/custom-widget-toolbar-button.d.ts +0 -48
  211. package/report-builder/custom-widgets-toolbar.d.ts +0 -74
  212. package/report-builder/forms-analyzer-dialog.d.ts +0 -94
  213. package/report-builder/forms-analyzer.d.ts +0 -105
  214. package/report-builder/image-filter.d.ts +0 -29
  215. package/report-builder/image-group.d.ts +0 -72
  216. package/report-builder/models.d.ts +0 -43
  217. package/report-builder/operations.d.ts +0 -45
  218. package/report-builder/package.json +0 -9
  219. package/report-builder/properties.d.ts +0 -368
  220. package/report-builder/public-api.d.ts +0 -26
  221. package/report-builder/quill-editor.d.ts +0 -116
  222. package/report-builder/renderer-widget.d.ts +0 -83
  223. package/report-builder/report-builder-drag-data.d.ts +0 -32
  224. package/report-builder/report-builder-module.d.ts +0 -52
  225. package/report-builder/report-builder-service.d.ts +0 -725
  226. package/report-builder/report-builder.d.ts +0 -39
  227. package/report-builder/theme-color-dialog.d.ts +0 -45
  228. package/report-builder/theme-color.d.ts +0 -111
  229. package/report-builder/tokens.d.ts +0 -24
  230. package/report-builder/toolbar-dialog.d.ts +0 -12
  231. package/report-builder/toolbar.d.ts +0 -30
  232. package/report-builder/utils.d.ts +0 -29
  233. package/report-builder/widget-toolbar-button.d.ts +0 -31
  234. package/report-builder/widgets-row-buttons.d.ts +0 -60
  235. package/report-builder/widgets-toolbar.d.ts +0 -26
@@ -1,761 +0,0 @@
1
- import { AjfAggregationType, AjfWidgetType } from '@ajf/core/reports';
2
- import { deepCopy } from '@ajf/core/utils';
3
- import { ChangeDetectionStrategy, Component, EventEmitter, ViewEncapsulation } from '@angular/core';
4
- import { MatDialog } from '@angular/material/dialog';
5
- import { Subscription } from 'rxjs';
6
- import { distinctUntilChanged, filter, map, startWith, withLatestFrom } from 'rxjs/operators';
7
- import { AjfReportBuilderFormsAnalyzerDialog } from './forms-analyzer-dialog';
8
- import { AjfReportBuilderService } from './report-builder-service';
9
- import * as i0 from "@angular/core";
10
- import * as i1 from "@angular/material/dialog";
11
- import * as i2 from "./report-builder-service";
12
- import * as i3 from "@angular/material/button";
13
- import * as i4 from "@angular/material/icon";
14
- import * as i5 from "@angular/material/button-toggle";
15
- import * as i6 from "@angular/material/tabs";
16
- import * as i7 from "./theme-color";
17
- import * as i8 from "@angular/material/grid-list";
18
- import * as i9 from "@angular/material/slider";
19
- import * as i10 from "@angular/material/form-field";
20
- import * as i11 from "@angular/material/select";
21
- import * as i12 from "@angular/material/core";
22
- import * as i13 from "@angular/material/toolbar";
23
- import * as i14 from "./image-group";
24
- import * as i15 from "./forms-analyzer";
25
- import * as i16 from "./quill-editor";
26
- import * as i17 from "@angular/material/card";
27
- import * as i18 from "@angular/material/list";
28
- import * as i19 from "./condition-editor";
29
- import * as i20 from "@angular/common";
30
- import * as i21 from "@angular/material/tooltip";
31
- import * as i22 from "@angular/forms";
32
- import * as i23 from "@ngneat/transloco";
33
- export class AjfReportBuilderProperties {
34
- constructor(_dialog, _service) {
35
- this._dialog = _dialog;
36
- this._service = _service;
37
- /**
38
- * true when the first time chart type is setted
39
- *
40
- * @memberOf AjfReportBuilderProperties
41
- */
42
- this.initChartType = false;
43
- /**
44
- * the current widget
45
- *
46
- * @memberOf AjfReportBuilderProperties
47
- */
48
- this.currentWidget = null;
49
- /**
50
- * this array contains the forms exploited for generate data labels
51
- *
52
- * @memberOf AjfReportBuilderProperties
53
- */
54
- this.forms = [];
55
- this.colors = [];
56
- /**
57
- * FAKE DATA
58
- */
59
- this.formsJson = { forms: [] };
60
- /**
61
- * WIDGET
62
- */
63
- this.widgetName = '';
64
- this.marginExpanded = false;
65
- this.paddingExpanded = false;
66
- this.borderWidthExpanded = false;
67
- this.borderRadiusExpanded = false;
68
- this.backgroundColor = '#127bdc';
69
- this.styleBackgroundColor = 'rgb(255,255,255,0)';
70
- this.borderColor = '#127bdc';
71
- this.styleColor = 'rgb(0,0,0,0)';
72
- this.align = [false, 'center', 'right', 'justify'];
73
- this.fonts = [
74
- false, 'blackr', 'black-italic', 'bold', 'bold-condensed', 'bold-condensed-italic',
75
- 'bold-italic', 'condensed', 'condensed-italic', 'italic', 'light', 'light-italic', 'medium',
76
- 'medium-italic', 'thinr', 'thin-italic'
77
- ];
78
- this.currentModule = {};
79
- this.quillModules = {
80
- toolbar: [
81
- ['formula'], ['bold', 'italic', 'underline', 'strike'],
82
- // ['blockquote', 'code-block'],
83
- [{ 'header': 1 }, { 'header': 2 }],
84
- [{ 'list': 'ordered' }, { 'list': 'bullet' }],
85
- [{ 'script': 'sub' }, { 'script': 'super' }],
86
- // [{ 'indent': '-1'}, { 'indent': '+1' }], // outdent/indent
87
- // [{ 'direction': 'rtl' }], // text direction
88
- [{ 'size': ['small', false, 'large', 'huge'] }],
89
- [{ 'header': [1, 2, 3, 4, 5, 6, false] }],
90
- [{ 'color': this.colors }, { 'background': this.colors }],
91
- [{ 'font': this.fonts }], [{ 'align': this.align }],
92
- ['clean'], // remove formatting button
93
- // ['link', 'class', 'video'] // link and image, video
94
- ]
95
- };
96
- this.chartBorderColor = [];
97
- this.chartBorderWidth = 3;
98
- /**
99
- *
100
- * IMAGE
101
- */
102
- this.imageUrl = 'https://angular.io/resources/images/logos/angular2/angular.png';
103
- /**
104
- *
105
- * TEXT
106
- */
107
- this.htmlText = '';
108
- /**
109
- * these variables indicate that the user want to change section
110
- */
111
- this.reportStyles = false;
112
- this.sectionStyles = false;
113
- this.widgetStyles = true;
114
- this.sectionColor = false;
115
- this.widgetColor = false;
116
- this.visibilitySection = false;
117
- this.currentColor = '';
118
- this._icon = null;
119
- this.iconSet = { 'icon': 'true', 'title': 'report', 'data': null };
120
- this.flagSet = {
121
- 'icon': 'false',
122
- 'class': ['flag-icon'],
123
- 'prefixClass': 'flag-icon-',
124
- 'title': 'flags',
125
- 'data': [
126
- { 'class': 'dz', 'info': 'Algeria' },
127
- { 'class': 'ao', 'info': 'Angola' },
128
- { 'class': 'bj', 'info': 'Benin' },
129
- { 'class': 'bw', 'info': 'Botswana' },
130
- { 'class': 'bf', 'info': 'Burkina Faso' },
131
- { 'class': 'bi', 'info': 'Burundi' },
132
- { 'class': 'cm', 'info': 'Cameroon' },
133
- { 'class': 'cv', 'info': 'Cabo Verde' },
134
- { 'class': 'cf', 'info': 'The Central African Republic' },
135
- { 'class': 'td', 'info': 'Chad' },
136
- { 'class': 'km', 'info': 'The Comoros' },
137
- { 'class': 'ci', 'info': 'Cote D\'avoire' },
138
- { 'class': 'cd', 'info': 'The Democratic Republic of Congo' },
139
- { 'class': 'dj', 'info': 'Dijibouti' },
140
- { 'class': 'eg', 'info': 'Egypt' },
141
- { 'class': 'gq', 'info': 'Equatorial Guinea' },
142
- { 'class': 'er', 'info': 'Eritrea' },
143
- { 'class': 'et', 'info': 'Ethiopia' },
144
- { 'class': 'tf', 'info': 'French Southern Territories' },
145
- { 'class': 'ga', 'info': 'Gabon' },
146
- { 'class': 'gm', 'info': 'The Gambia' },
147
- { 'class': 'gh', 'info': 'Ghana' },
148
- { 'class': 'gn', 'info': 'Guinea' },
149
- { 'class': 'gw', 'info': 'Guinea-Bissau' },
150
- { 'class': 'ke', 'info': 'Kenya' },
151
- { 'class': 'ls', 'info': 'Leshotho' },
152
- { 'class': 'lr', 'info': 'Liberia' },
153
- { 'class': 'ly', 'info': 'Libya' },
154
- { 'class': 'mg', 'info': 'Madagascar' },
155
- { 'class': 'mw', 'info': 'Malawy' },
156
- { 'class': 'ml', 'info': 'Mali' },
157
- { 'class': 'mr', 'info': 'Mauritania' },
158
- { 'class': 'mu', 'info': 'Mauritius' },
159
- { 'class': 'yt', 'info': 'Mayotte' },
160
- { 'class': 'ma', 'info': 'Marocco' },
161
- { 'class': 'mz', 'info': 'Mozambique' },
162
- { 'class': 'na', 'info': 'Namibia' },
163
- { 'class': 'ne', 'info': 'Niger' },
164
- { 'class': 'ng', 'info': 'Nigeria' },
165
- { 'class': 'cg', 'info': 'Republic of the Congo' },
166
- { 'class': 'rw', 'info': 'Rwnda' },
167
- { 'class': 're', 'info': 'rèunion' },
168
- { 'class': 'sh', 'info': 'Saint Helena, Ascension and Tristan da Cunha' },
169
- { 'class': 'st', 'info': 'Sao Tome and Principe' },
170
- { 'class': 'sn', 'info': 'Senegal' },
171
- { 'class': 'sc', 'info': 'Seychelles' },
172
- { 'class': 'sl', 'info': 'Sierra Leone' },
173
- { 'class': 'so', 'info': 'Somalia' },
174
- { 'class': 'za', 'info': 'South Africa' },
175
- { 'class': 'ss', 'info': 'South Sudan' },
176
- { 'class': 'sd', 'info': 'Sudan' },
177
- { 'class': 'sz', 'info': 'Swaziland' },
178
- { 'class': 'tz', 'info': 'Tanzania' },
179
- { 'class': 'tg', 'info': 'Togo' },
180
- { 'class': 'tn', 'info': 'Tunisia' },
181
- { 'class': 'ug', 'info': 'Uganda' },
182
- { 'class': 'eh', 'info': 'Western Sahara' },
183
- { 'class': 'zm', 'info': 'Zambia' },
184
- { 'class': 'zw', 'info': 'Zimbawe' },
185
- { 'class': 'iq', 'info': 'Iraq' },
186
- { 'class': 'lb', 'info': 'Lebanon' },
187
- { 'class': 'bd', 'info': 'Bangladesh' },
188
- { 'class': 'ir', 'info': 'Iran (Islamic Republic of)' },
189
- { 'class': 'my', 'info': 'Malaysia' },
190
- { 'class': 'np', 'info': 'Nepal' },
191
- { 'class': 'pk', 'info': 'Pakistan' },
192
- { 'class': 'th', 'info': 'Thailand' },
193
- { 'class': 'jo', 'info': 'Jordan' },
194
- { 'class': 'ye', 'info': 'Yemen' }
195
- ]
196
- };
197
- this._currentWidgetSub = Subscription.EMPTY;
198
- this._formsSub = Subscription.EMPTY;
199
- this._colorSub = Subscription.EMPTY;
200
- this._headerStyleSub = Subscription.EMPTY;
201
- this._contentStylesSub = Subscription.EMPTY;
202
- this._footerStylesSub = Subscription.EMPTY;
203
- this._originSub = Subscription.EMPTY;
204
- this._stylesUpdatesSubs = Subscription.EMPTY;
205
- this._updateWidgetMarginEvt = new EventEmitter();
206
- this._updateWidgetPaddingEvt = new EventEmitter();
207
- this._updateWidgetBorderWidthEvt = new EventEmitter();
208
- this._updateWidgetBorderRadiusEvt = new EventEmitter();
209
- this.tabValue = 'backgroundColor';
210
- this.setForms();
211
- this.iconSet.data = Object.keys(_service.iconSets).filter(x => x != 'ajf-icon').map(i => {
212
- return { name: i, icons: _service.iconSets[i] };
213
- });
214
- this._headerStyleSub = this._service.headerStyles.subscribe(s => {
215
- if (s['background-color'] != null) {
216
- this.styleBackgroundColor = s['background-color'];
217
- }
218
- });
219
- this._contentStylesSub = this._service.contentStyles.subscribe(s => {
220
- if (s['background-color'] != null) {
221
- this.styleBackgroundColor = s['background-color'];
222
- }
223
- });
224
- this._footerStylesSub = this._service.footerStyles.subscribe(s => {
225
- if (s['background-color'] != null) {
226
- this.styleBackgroundColor = s['background-color'];
227
- }
228
- });
229
- this._originSub = this._service.origin.subscribe(s => {
230
- this.origin = s;
231
- });
232
- }
233
- get currentLayoutWidget() {
234
- return this.currentWidget;
235
- }
236
- get currentTextWidget() {
237
- return this.currentWidget;
238
- }
239
- get icon() {
240
- return this._icon;
241
- }
242
- /**
243
- *
244
- * UTILS
245
- */
246
- /**
247
- * return a number value
248
- *
249
- * @param value
250
- *
251
- * @memberOf AjfReportBuilderProperties
252
- */
253
- toNumber(value) {
254
- let numberPattern = /^(-)?\d+/g;
255
- if (value == null) {
256
- return 0;
257
- }
258
- else {
259
- const matches = value.match(numberPattern);
260
- if (matches == null || matches.length == 0) {
261
- return 0;
262
- }
263
- return Number(matches[0]);
264
- }
265
- }
266
- toNumberArray(value) {
267
- if (value == null) {
268
- return [];
269
- }
270
- else {
271
- return (value || '')
272
- .replace('px', '')
273
- .split(' ')
274
- .filter(v => v !== '' && v != null)
275
- .map(v => this.toNumber(v));
276
- }
277
- }
278
- fillPxNumberArray(value) {
279
- const vl = value.length;
280
- switch (vl) {
281
- case 0:
282
- return [0, 0, 0, 0];
283
- case 1:
284
- const v = value[0];
285
- return [v, v, v, v];
286
- case 2:
287
- const v21 = value[0];
288
- const v22 = value[1];
289
- return [v21, v22, v21, v22];
290
- case 3:
291
- const v31 = value[0];
292
- const v32 = value[1];
293
- const v33 = value[2];
294
- return [v31, v32, v33, v32];
295
- default:
296
- return value;
297
- }
298
- }
299
- percent(value) {
300
- let temp = this.roundTo(value * 100, 3);
301
- return temp;
302
- }
303
- roundTo(value, decimalPositions) {
304
- let i = value * Math.pow(10, decimalPositions);
305
- i = Math.floor(i);
306
- return i / Math.pow(10, decimalPositions);
307
- }
308
- /**
309
- * call to service to set the forms
310
- *
311
- * @memberOf AjfReportBuilderProperties
312
- */
313
- setForms() {
314
- let forms = [];
315
- try {
316
- for (let i = 0; i < this.formsJson.forms.length; i++) {
317
- forms.push(deepCopy(this.formsJson.forms[i]));
318
- }
319
- this._service.setReportForms(forms);
320
- }
321
- catch (e) {
322
- }
323
- }
324
- /**
325
- * call to service to set the width of the idx column of layout widget
326
- *
327
- * @param col
328
- * @param idx
329
- *
330
- * @memberOf AjfReportBuilderProperties
331
- */
332
- instantColumnValue(col, idx) {
333
- if (col === null) {
334
- return;
335
- }
336
- this._service.instantColumnValue(col, idx);
337
- }
338
- /**
339
- * force copy of style
340
- *
341
- * @memberOf AjfReportBuilderProperties
342
- */
343
- // TODO delete this
344
- setStyle() {
345
- if (this.currentWidget == null) {
346
- return;
347
- }
348
- this.currentWidget.styles = deepCopy(this.currentWidget.styles);
349
- this._service.updateCurrentWidget(this.currentWidget);
350
- }
351
- /**
352
- * call to service to add new style to widget
353
- *
354
- * @param label
355
- * @param value
356
- *
357
- * @memberOf AjfReportBuilderProperties
358
- */
359
- setWidgetStyles(label, value) {
360
- this._service.setWidgetStyles(label, value);
361
- this.currentColor = value;
362
- this.setStyle();
363
- }
364
- setWidgetMargin(idx, value) {
365
- this._updateWidgetMarginEvt.emit({ idx, value });
366
- }
367
- setWidgetPadding(idx, value) {
368
- this._updateWidgetPaddingEvt.emit({ idx, value });
369
- }
370
- setWidgetBorderWidth(idx, value) {
371
- this._updateWidgetBorderWidthEvt.emit({ idx, value });
372
- }
373
- setWidgetBorderRadius(idx, value) {
374
- this._updateWidgetBorderRadiusEvt.emit({ idx, value });
375
- }
376
- /**
377
- * call to service to add new style to section
378
- *
379
- * @param label
380
- * @param value
381
- *
382
- * @memberOf AjfReportBuilderProperties
383
- */
384
- setSectionStyles(label, value) {
385
- this._service.setSectionStyles(this.origin, label, value);
386
- this.styleColor = value;
387
- }
388
- /**
389
- * call to service to add new style to report
390
- *
391
- * @param label
392
- * @param value
393
- *
394
- * @memberOf AjfReportBuilderProperties
395
- */
396
- setReportStyles(label, value) {
397
- this._service.setReportStyles(label, value);
398
- this.styleBackgroundColor = value;
399
- }
400
- /**
401
- * add custom color
402
- *
403
- *
404
- * @memberOf AjfReportBuilderProperties
405
- */
406
- addCustomColor() {
407
- this._service.addCustomColor(this.currentColor);
408
- this._service.updateCurrentWidget(this.currentWidget);
409
- }
410
- /**
411
- * get the module exploit to quill text editor
412
- *
413
- * @returns
414
- *
415
- * @memberOf AjfReportBuilderProperties
416
- */
417
- getModule() {
418
- return this.quillModules;
419
- }
420
- /**
421
- * true is the input type value is equal to current widget type
422
- *
423
- * @param value
424
- * @returns
425
- *
426
- * @memberOf AjfReportBuilderProperties
427
- */
428
- isChartTypeSelected(value) {
429
- if (this.initChartType == false) {
430
- return false;
431
- }
432
- const myObj = this.currentWidget;
433
- if (value === myObj.chartType) {
434
- return true;
435
- }
436
- else {
437
- return false;
438
- }
439
- }
440
- /* layout functions */
441
- /**
442
- * call to service to add a column to current layout widget
443
- *
444
- *
445
- * @memberOf AjfReportBuilderProperties
446
- */
447
- addColumn() {
448
- this._service.addColumn();
449
- }
450
- /**
451
- * call to service to add a obj to current layout widget
452
- *
453
- * @param idx
454
- *
455
- * @memberOf AjfReportBuilderProperties
456
- */
457
- fixedColumn(idx) {
458
- this._service.fixedColumn(idx);
459
- }
460
- /**
461
- * call to service to remove obj of current layout widget
462
- *
463
- * @param idx
464
- *
465
- * @memberOf AjfReportBuilderProperties
466
- */
467
- unfixedColumn(idx) {
468
- this._service.remove('unfixedColumn', idx);
469
- }
470
- /* image functions */
471
- /**
472
- * call to service to set image url
473
- *
474
- *
475
- * @memberOf AjfReportBuilderProperties
476
- */
477
- setImageUrl() {
478
- this._service.setImageUrl(this.imageUrl);
479
- }
480
- setIcon(icon) {
481
- this._icon = icon;
482
- this._service.setIcon(icon);
483
- }
484
- /* chart functions */
485
- /**
486
- * call to service to set the type of chart
487
- *
488
- * @param type
489
- *
490
- * @memberOf AjfReportBuilderProperties
491
- */
492
- setChartType(type) {
493
- this.initChartType = true;
494
- this._service.setChartType(type);
495
- }
496
- setChartBorderColor(value) {
497
- if (value == null) {
498
- return;
499
- }
500
- this._service.setChartBorderWidth(value);
501
- }
502
- setTab(event) {
503
- if (event.index === 0) {
504
- this.tabValue = 'backgroundColor';
505
- }
506
- else {
507
- this.tabValue = 'borderColor';
508
- }
509
- }
510
- /**
511
- * call to service to remove background color to current chart
512
- *
513
- * @param index
514
- *
515
- * @memberOf AjfReportBuilderProperties
516
- */
517
- removeChartBackgroundColor(index) {
518
- this._service.removeChartBackgroundColor(index);
519
- }
520
- /**
521
- * call to service to remove border color to current chart
522
- *
523
- * @param index
524
- *
525
- * @memberOf AjfReportBuilderProperties
526
- */
527
- removeChartBorderColor(index) {
528
- this._service.removeChartBorderColor(index);
529
- }
530
- hideMenu() {
531
- this._service.updateCurrentWidget(null);
532
- }
533
- openFormulaDialog(event) {
534
- this.dialogRef = this._dialog.open(AjfReportBuilderFormsAnalyzerDialog);
535
- this.dialogRef.componentInstance.aggregation = AjfAggregationType.None;
536
- this.dialogRef.componentInstance.isFormula = true;
537
- if (event != null && event.reference != null) {
538
- this.dialogRef.componentInstance.formula = event.formula;
539
- this.dialogRef.componentInstance.reference = event.reference;
540
- }
541
- }
542
- ngOnInit() {
543
- this._formsSub = this._service.reportForms.subscribe(x => {
544
- this.forms = x || [];
545
- });
546
- this._currentWidgetSub = this._service.currentWidget.subscribe(x => {
547
- if (x != null) {
548
- if (this.currentWidget !== x) {
549
- this.currentWidget = x;
550
- this.widgetName = AjfWidgetType[x.widgetType];
551
- this.reportStyles = false;
552
- this.sectionStyles = false;
553
- this.widgetStyles = false;
554
- this.sectionColor = false;
555
- this.widgetColor = false;
556
- this.visibilitySection = false;
557
- }
558
- }
559
- else {
560
- this.currentWidget = null;
561
- this.widgetName = '';
562
- }
563
- });
564
- this._colorSub = this._service.colors.subscribe(x => {
565
- if (x && x.length > 0) {
566
- this.colors = x;
567
- this.quillModules = {
568
- toolbar: [
569
- ['bold', 'italic', 'underline', 'strike'],
570
- // ['blockquote', 'code-block'],
571
- [{ 'header': 1 }, { 'header': 2 }],
572
- [{ 'list': 'ordered' }, { 'list': 'bullet' }],
573
- [{ 'script': 'sub' }, { 'script': 'super' }],
574
- // [{ 'indent': '-1'}, { 'indent': '+1' }], // outdent/indent
575
- // [{ 'direction': 'rtl' }], // text direction
576
- [{ 'size': ['small', false, 'large', 'huge'] }],
577
- [{ 'header': [1, 2, 3, 4, 5, 6, false] }],
578
- [
579
- { 'color': this.colors }, { 'background': this.colors }
580
- ],
581
- [{ 'font': this.fonts }], [{ 'align': this.align }], ['formula'],
582
- ['clean'], // remove formatting button
583
- // ['link', 'class', 'video'] // link and image, video
584
- ]
585
- };
586
- }
587
- });
588
- this.getHTML = this._service.currentWidget.pipe(map((widget) => {
589
- if (widget != null) {
590
- const myObj = this.currentWidget;
591
- return myObj.htmlText;
592
- }
593
- return '';
594
- }), distinctUntilChanged(), startWith('<p><br></p>'));
595
- this.getHeightWidget = this._service.currentWidget.pipe(filter(x => x != null), map((myObj) => {
596
- if (myObj != null) {
597
- let value = this.toNumber(myObj.styles['height']);
598
- if (value != null || value != null) {
599
- return value;
600
- }
601
- }
602
- return undefined;
603
- }), distinctUntilChanged());
604
- this.getFontSizeWidget = this._service.currentWidget.pipe(map((myObj) => {
605
- if (myObj != null) {
606
- return (this.toNumber(myObj.styles['font-size']) || 12);
607
- }
608
- return undefined;
609
- }), distinctUntilChanged());
610
- this.getFontAlignWidget = this._service.currentWidget.pipe(map((myObj) => {
611
- if (myObj != null) {
612
- return ((myObj.styles['text-align']) || 'center');
613
- }
614
- return undefined;
615
- }), distinctUntilChanged());
616
- this.getBorderWidthWidget = this._service.currentWidget.pipe(map((myObj) => {
617
- if (myObj != null) {
618
- return this.fillPxNumberArray(this.toNumberArray(myObj.styles['border-width']));
619
- }
620
- return undefined;
621
- }), distinctUntilChanged(), startWith([0, 0, 0, 0]));
622
- this.getBorderWidthWidgetTop =
623
- this.getBorderWidthWidget.pipe(filter(m => m != null), map(m => m[0]));
624
- this.getBorderWidthWidgetRight =
625
- this.getBorderWidthWidget.pipe(filter(m => m != null), map(m => m[1]));
626
- this.getBorderWidthWidgetBottom =
627
- this.getBorderWidthWidget.pipe(filter(m => m != null), map(m => m[2]));
628
- this.getBorderWidthWidgetLeft =
629
- this.getBorderWidthWidget.pipe(filter(m => m != null), map(m => m[3]));
630
- this.getBorderRadiusWidget = this._service.currentWidget.pipe(map((myObj) => {
631
- if (myObj != null) {
632
- return this.fillPxNumberArray(this.toNumberArray(myObj.styles['border-radius']));
633
- }
634
- return undefined;
635
- }), distinctUntilChanged(), startWith([0, 0, 0, 0]));
636
- this.getBorderRadiusWidgetTopLeft =
637
- this.getBorderRadiusWidget.pipe(filter(m => m != null), map(m => m[0]));
638
- this.getBorderRadiusWidgetTopRight =
639
- this.getBorderRadiusWidget.pipe(filter(m => m != null), map(m => m[1]));
640
- this.getBorderRadiusWidgetBottomRight =
641
- this.getBorderRadiusWidget.pipe(filter(m => m != null), map(m => m[2]));
642
- this.getBorderRadiusWidgetBottomLeft =
643
- this.getBorderRadiusWidget.pipe(filter(m => m != null), map(m => m[3]));
644
- this.getMarginWidget = this._service.currentWidget.pipe(map((myObj) => {
645
- if (myObj != null && myObj.styles != null && myObj.styles['margin'] != null) {
646
- return this.fillPxNumberArray(this.toNumberArray(myObj.styles['margin']));
647
- }
648
- return undefined;
649
- }), distinctUntilChanged(), startWith([0, 0, 0, 0]));
650
- this.getMarginWidgetTop = this.getMarginWidget.pipe(filter(m => m != null), map(m => m[0]));
651
- this.getMarginWidgetRight = this.getMarginWidget.pipe(filter(m => m != null), map(m => m[1]));
652
- this.getMarginWidgetBottom = this.getMarginWidget.pipe(filter(m => m != null), map(m => m[2]));
653
- this.getMarginWidgetLeft = this.getMarginWidget.pipe(filter(m => m != null), map(m => m[3]));
654
- this.getPaddingWidget = this._service.currentWidget.pipe(map((myObj) => {
655
- if (myObj != null && myObj.styles != null && myObj.styles['padding'] != null) {
656
- return this.fillPxNumberArray(this.toNumberArray(myObj.styles['padding']));
657
- }
658
- return undefined;
659
- }), distinctUntilChanged());
660
- this.getPaddingWidgetTop = this.getPaddingWidget.pipe(filter(m => m != null), map(m => m[0]));
661
- this.getPaddingWidgetRight =
662
- this.getPaddingWidget.pipe(filter(m => m != null), map(m => m[1]));
663
- this.getPaddingWidgetBottom =
664
- this.getPaddingWidget.pipe(filter(m => m != null), map(m => m[2]));
665
- this.getPaddingWidgetLeft = this.getPaddingWidget.pipe(filter(m => m != null), map(m => m[3]));
666
- this.getBackgroundColorWidget = this._service.currentWidget.pipe(map((myObj) => {
667
- if (myObj != null && myObj.styles != null) {
668
- return myObj.styles['backgroundColor'] || '';
669
- }
670
- }), distinctUntilChanged());
671
- this.getColorWidget = this._service.currentWidget.pipe(map((myObj) => {
672
- if (myObj != null && myObj.styles != null) {
673
- return myObj.styles['color'] || '';
674
- }
675
- }), distinctUntilChanged());
676
- this._stylesUpdatesSubs = this._updateWidgetMarginEvt
677
- .pipe(withLatestFrom(this.getMarginWidget))
678
- .subscribe(r => {
679
- if (r == null) {
680
- return;
681
- }
682
- const idx = r[0].idx;
683
- const value = r[0].value;
684
- const v = (r[1] || [0, 0, 0, 0]);
685
- if (v == null || v.length < idx) {
686
- return;
687
- }
688
- v[idx] = value;
689
- this.setWidgetStyles('margin', v);
690
- });
691
- this._stylesUpdatesSubs.add(this._updateWidgetPaddingEvt
692
- .pipe(withLatestFrom(this.getPaddingWidget))
693
- .subscribe(r => {
694
- if (r == null) {
695
- return;
696
- }
697
- const idx = r[0].idx;
698
- const value = r[0].value;
699
- const v = (r[1] || [0, 0, 0, 0]);
700
- if (v == null || v.length < idx) {
701
- return;
702
- }
703
- v[idx] = value;
704
- this.setWidgetStyles('padding', v);
705
- }));
706
- this._stylesUpdatesSubs.add(this._updateWidgetBorderWidthEvt
707
- .pipe(withLatestFrom(this.getBorderWidthWidget))
708
- .subscribe(r => {
709
- if (r == null) {
710
- return;
711
- }
712
- const idx = r[0].idx;
713
- const value = r[0].value;
714
- const v = (r[1] || [0, 0, 0, 0]);
715
- if (v == null || v.length < idx) {
716
- return;
717
- }
718
- v[idx] = value;
719
- this.setWidgetStyles('border-width', v);
720
- }));
721
- this._stylesUpdatesSubs.add(this._updateWidgetBorderRadiusEvt
722
- .pipe(withLatestFrom(this.getBorderRadiusWidget))
723
- .subscribe(r => {
724
- if (r == null) {
725
- return;
726
- }
727
- const idx = r[0].idx;
728
- const value = r[0].value;
729
- const v = (r[1] || [0, 0, 0, 0]);
730
- if (v == null || v.length < idx) {
731
- return;
732
- }
733
- v[idx] = value;
734
- this.setWidgetStyles('border-radius', v);
735
- }));
736
- }
737
- ngOnChanges(changes) {
738
- this.currentWidget = changes.widget.currentValue;
739
- if (this.currentWidget == null) {
740
- return;
741
- }
742
- this.widgetName = AjfWidgetType[this.currentWidget.widgetType];
743
- }
744
- ngOnDestroy() {
745
- this._currentWidgetSub.unsubscribe();
746
- this._formsSub.unsubscribe();
747
- this._colorSub.unsubscribe();
748
- this._headerStyleSub.unsubscribe();
749
- this._contentStylesSub.unsubscribe();
750
- this._footerStylesSub.unsubscribe();
751
- this._originSub.unsubscribe();
752
- this._stylesUpdatesSubs.unsubscribe();
753
- }
754
- }
755
- AjfReportBuilderProperties.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0-next.15", ngImport: i0, type: AjfReportBuilderProperties, deps: [{ token: i1.MatDialog }, { token: i2.AjfReportBuilderService }], target: i0.ɵɵFactoryTarget.Component });
756
- AjfReportBuilderProperties.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.0-next.15", type: AjfReportBuilderProperties, selector: "ajf-report-builder-properties", usesOnChanges: true, ngImport: i0, template: "<ng-template [ngIf]=\"currentWidget != null\">\n <div class=\"ajf-content\">\n <button\n mat-button\n class=\"ajf-hide-menu\"\n matTooltip=\"hide-menu\"\n (click)=\"hideMenu()\"\n [matTooltipPosition]=\"'above'\"\n >\n <mat-icon>remove_circle_outline</mat-icon>\n </button>\n <mat-button-toggle-group class=\"ajf-menu-css\">\n <mat-button-toggle\n (click)=\"reportStyles = !reportStyles; sectionStyles = false; widgetStyles = false\"\n value=\"left\"\n [ngClass]=\"{'ajf-selected': reportStyles}\"\n >\n report\n <ng-container>{{'CSS style'|transloco}}</ng-container>\n </mat-button-toggle>\n <mat-button-toggle\n (click)=\"sectionStyles = !sectionStyles; reportStyles = false; widgetStyles = false\"\n [ngClass]=\"{'ajf-selected': sectionStyles}\"\n >\n {{ origin }}\n <ng-container>{{'CSS style'|transloco}}</ng-container>\n </mat-button-toggle>\n <mat-button-toggle\n (click)=\"widgetStyles = !widgetStyles; sectionStyles = false; reportStyles = false\"\n [ngClass]=\"{'ajf-selected': widgetStyles}\"\n >\n {{ widgetName }}\n <ng-container>{{'CSS style'|transloco}}</ng-container>\n </mat-button-toggle>\n </mat-button-toggle-group>\n <div class=\"ajf-style-container\" *ngIf=\"(reportStyles) ? true : false \">\n <mat-tab-group>\n <mat-tab label=\"Background Color\">\n <div class=\"ajf-style-panel\">\n <ajf-theme-color\n [section]=\"'report'\"\n [label]=\"'color'\"\n ></ajf-theme-color>\n </div>\n </mat-tab>\n </mat-tab-group>\n </div>\n <div class=\"ajf-style-container\" *ngIf=\"(sectionStyles) ? true : false \">\n <mat-tab-group>\n <mat-tab label=\"Background Color\">\n <div class=\"ajf-style-panel\">\n <ajf-theme-color\n [section]=\"'section'\"\n [label]=\"'color'\"\n ></ajf-theme-color>\n </div>\n </mat-tab>\n </mat-tab-group>\n </div>\n <div class=\"ajf-style-container\" *ngIf=\"(widgetStyles) ? true : false \">\n <mat-tab-group *ngIf=\"(currentWidget.widgetType != 4)\">\n <mat-tab label=\"Color\">\n <div class=\"ajf-style-panel\">\n <ajf-theme-color\n [section]=\"'widget'\"\n [label]=\"'color'\"\n [init]=\"'icon'\"\n ></ajf-theme-color>\n </div>\n </mat-tab>\n <mat-tab label=\"Background Color\">\n <div class=\"ajf-style-panel\">\n <ajf-theme-color\n [section]=\"'widget'\"\n [label]=\"'background-color'\"\n ></ajf-theme-color>\n </div>\n </mat-tab>\n </mat-tab-group>\n <div\n class=\"properties-container\"\n *ngIf=\"(currentWidget.widgetType !== 8)\"\n >\n <div class=\"ajf-layout-preview\">\n <div class=\"ajf-vbottom\">\n <div>{{'height'|transloco}}</div>\n <div>{{ getHeightWidget|async }}</div>\n </div>\n <div class=\"ajf-margin-box\">\n <div class=\"ajf-top-label\">{{'margin'|transloco}}</div>\n <div class=\"ajf-vtop\">{{ getMarginWidgetTop|async }}</div>\n <div class=\"ajf-vright\">{{ getMarginWidgetRight|async }}</div>\n <div class=\"ajf-vbottom\">{{ getMarginWidgetBottom|async }}</div>\n <div class=\"ajf-vleft\">{{ getMarginWidgetLeft|async }}</div>\n <div class=\"ajf-border-box\">\n <div class=\"ajf-vtop\">{{ getBorderWidthWidgetTop|async }}</div>\n <div class=\"ajf-vright\">\n {{ getBorderWidthWidgetRight|async }}\n </div>\n <div class=\"ajf-vbottom\">\n {{ getBorderWidthWidgetBottom|async }}\n </div>\n <div class=\"ajf-vleft\">{{ getBorderWidthWidgetLeft|async }}</div>\n <div class=\"ajf-vtl\">\n {{ getBorderRadiusWidgetTopLeft|async }}\n </div>\n <div class=\"ajf-vtr\">\n {{ getBorderRadiusWidgetTopRight|async }}\n </div>\n <div class=\"ajf-vbr\">\n {{ getBorderRadiusWidgetBottomRight|async }}\n </div>\n <div class=\"ajf-vbl\">\n {{ getBorderRadiusWidgetBottomLeft|async }}\n </div>\n <div class=\"ajf-top-label\">{{'border'|transloco}}</div>\n <div class=\"ajf-padding-box\">\n <div class=\"ajf-top-label\">{{'padding'|transloco}}</div>\n <div class=\"ajf-vtop\">{{ getPaddingWidgetTop|async }}</div>\n <div class=\"ajf-vright\">{{ getPaddingWidgetRight|async }}</div>\n <div class=\"ajf-vbottom\">\n {{ getPaddingWidgetBottom|async }}\n </div>\n <div class=\"ajf-vleft\">{{ getPaddingWidgetLeft|async }}</div>\n <div class=\"ajf-content-box\">{{'content'|transloco}}</div>\n </div>\n </div>\n </div>\n </div>\n <mat-grid-list rowHeight=\"2em\" cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n <span>{{'height'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetStyles('height', $event.value)\"\n min=\"0\"\n max=\"200\"\n step=\"1\"\n [value]=\"getHeightWidget|async\"\n tickInterval=\"1\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile>\n <mat-icon\n *ngIf=\"!marginExpanded\"\n (click)=\"marginExpanded = !marginExpanded\"\n >keyboard_arrow_right</mat-icon\n >\n <mat-icon\n *ngIf=\"marginExpanded\"\n (click)=\"marginExpanded = !marginExpanded\"\n >keyboard_arrow_down</mat-icon\n >\n </mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n <span>{{'margin'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n [disabled]=\"marginExpanded\"\n (change)=\"setWidgetStyles('margin', $event.value)\"\n min=\"-50\"\n max=\"50\"\n step=\"1\"\n [value]=\"getMarginWidgetTop|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <ng-template [ngIf]=\"marginExpanded\">\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n &nbsp;&nbsp;<span>{{'margin top'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetMargin(0, $event.value)\"\n min=\"-50\"\n max=\"50\"\n step=\"1\"\n [value]=\"getMarginWidgetTop|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n &nbsp;&nbsp;<span>{{'margin right'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetMargin(1, $event.value)\"\n min=\"-50\"\n max=\"50\"\n step=\"1\"\n [value]=\"getMarginWidgetRight|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n &nbsp;&nbsp;<span>{{'margin bottom'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetMargin(2, $event.value)\"\n min=\"-50\"\n max=\"50\"\n step=\"1\"\n [value]=\"getMarginWidgetBottom|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n &nbsp;&nbsp;<span>{{'margin left'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetMargin(3, $event.value)\"\n min=\"-50\"\n max=\"50\"\n step=\"1\"\n [value]=\"getMarginWidgetLeft|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n </ng-template>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile>\n <mat-icon\n *ngIf=\"!paddingExpanded\"\n (click)=\"paddingExpanded = !paddingExpanded\"\n >keyboard_arrow_right</mat-icon\n >\n <mat-icon\n *ngIf=\"paddingExpanded\"\n (click)=\"paddingExpanded = !paddingExpanded\"\n >keyboard_arrow_down</mat-icon\n >\n </mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n <span>{{'padding'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetStyles('padding', $event.value)\"\n min=\"-50\"\n max=\"50\"\n step=\"1\"\n [value]=\"getPaddingWidgetTop|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <ng-template [ngIf]=\"paddingExpanded\">\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n &nbsp;&nbsp;<span>{{'padding top'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetPadding(0, $event.value)\"\n min=\"-50\"\n max=\"50\"\n step=\"1\"\n [value]=\"getPaddingWidgetTop|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n &nbsp;&nbsp;<span>{{'padding right'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetPadding(1, $event.value)\"\n min=\"-50\"\n max=\"50\"\n step=\"1\"\n [value]=\"getPaddingWidgetRight|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n &nbsp;&nbsp;<span>{{'padding bottom'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetPadding(2, $event.value)\"\n min=\"-50\"\n max=\"50\"\n step=\"1\"\n [value]=\"getPaddingWidgetBottom|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n &nbsp;&nbsp;<span>{{'padding left'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetPadding(3, $event.value)\"\n min=\"-50\"\n max=\"50\"\n step=\"1\"\n [value]=\"getPaddingWidgetLeft|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n </ng-template>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile>\n <mat-icon\n *ngIf=\"!borderWidthExpanded\"\n (click)=\"borderWidthExpanded = !borderWidthExpanded\"\n >keyboard_arrow_right</mat-icon\n >\n <mat-icon\n *ngIf=\"borderWidthExpanded\"\n (click)=\"borderWidthExpanded = !borderWidthExpanded\"\n >keyboard_arrow_down</mat-icon\n >\n </mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n <span>{{'border width'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetStyles('border-width', $event.value)\"\n min=\"0\"\n max=\"10\"\n step=\"1\"\n [value]=\"getBorderWidthWidgetTop|async\"\n tickInterval=\"1\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <ng-template [ngIf]=\"borderWidthExpanded\">\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n &nbsp;&nbsp;<span>{{'border width top'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetBorderWidth(0, $event.value)\"\n min=\"1\"\n max=\"10\"\n step=\"1\"\n [value]=\"getBorderWidthWidgetTop|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n &nbsp;&nbsp;<span>{{'border width right'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetBorderWidth(1, $event.value)\"\n min=\"1\"\n max=\"10\"\n step=\"1\"\n [value]=\"getBorderWidthWidgetRight|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n &nbsp;&nbsp;<span>{{'border width bottom'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetBorderWidth(2, $event.value)\"\n min=\"1\"\n max=\"10\"\n step=\"1\"\n [value]=\"getBorderWidthWidgetBottom|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n &nbsp;&nbsp;<span>{{'border width left'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetBorderWidth(3, $event.value)\"\n min=\"1\"\n max=\"10\"\n step=\"1\"\n [value]=\"getBorderWidthWidgetLeft|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n </ng-template>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile>\n <mat-icon\n *ngIf=\"!borderRadiusExpanded\"\n (click)=\"borderRadiusExpanded = !borderRadiusExpanded\"\n >keyboard_arrow_right</mat-icon\n >\n <mat-icon\n *ngIf=\"borderRadiusExpanded\"\n (click)=\"borderRadiusExpanded = !borderRadiusExpanded\"\n >keyboard_arrow_down</mat-icon\n >\n </mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n <span>{{'border radius'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetStyles('border-radius', $event.value)\"\n min=\"0\"\n max=\"100\"\n step=\"1\"\n tickInterval=\"10\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <ng-template [ngIf]=\"borderRadiusExpanded\">\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n &nbsp;&nbsp;<span>{{'border radius top left'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetBorderRadius(0, $event.value)\"\n min=\"1\"\n max=\"100\"\n step=\"1\"\n [value]=\"getBorderRadiusWidgetTopLeft|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n &nbsp;&nbsp;<span>{{'border radius top right'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetBorderRadius(1, $event.value)\"\n min=\"1\"\n max=\"100\"\n step=\"1\"\n [value]=\"getBorderRadiusWidgetTopRight|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n &nbsp;&nbsp;<span>{{'border radius bottom left'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetBorderRadius(2, $event.value)\"\n min=\"1\"\n max=\"100\"\n step=\"1\"\n [value]=\"getBorderRadiusWidgetBottomLeft|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n &nbsp;&nbsp;<span\n >{{'border radius bottom right'|transloco}}</span\n >\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetBorderRadius(3, $event.value)\"\n min=\"1\"\n max=\"100\"\n step=\"1\"\n [value]=\"getBorderRadiusWidgetBottomRight|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n </ng-template>\n </div>\n <div class=\"properties-container\" *ngIf=\"currentWidget.widgetType === 2\">\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"3\">\n <span>{{'font size'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetStyles('font-size', $event.value);\"\n min=\"1\"\n max=\"150\"\n step=\"1\"\n [value]=\"getFontSizeWidget|async\"\n tickInterval=\"1\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n </div>\n <ng-template [ngIf]=\"currentWidget.widgetType === 5\">\n <br />\n <form>\n <mat-form-field>\n <input\n matInput\n [placeholder]=\"'Font size' | transloco\"\n [value]=\"getFontSizeWidget|async\"\n [(ngModel)]=\"fontSize\"\n [ngModelOptions]=\"{standalone: true}\"\n (change)=\"setWidgetStyles('font-size', fontSize)\"\n />\n </mat-form-field>\n <mat-select\n (selectionChange)=\"setWidgetStyles('font-style', $event.value)\"\n [placeholder]=\"'Font style' | transloco\"\n >\n <mat-option value=\"normal\">{{'Normal'|transloco}}</mat-option>\n <mat-option value=\"italic\">{{'Italic'|transloco}}</mat-option>\n <mat-option value=\"oblique\">{{'Oblique'|transloco}}</mat-option>\n </mat-select>\n <mat-select\n (selectionChange)=\"setWidgetStyles('text-align', $event.value)\"\n [placeholder]=\"'Align' | transloco\"\n >\n <mat-option value=\"center\">{{'Center'|transloco}}</mat-option>\n <mat-option value=\"left\">{{'Left'|transloco}}</mat-option>\n <mat-option value=\"right\">{{'Right'|transloco}}</mat-option>\n </mat-select>\n </form>\n </ng-template>\n <h1>\n <ng-container>{{'properties of'|transloco}}</ng-container>\n {{ widgetName|transloco }}\n </h1>\n </div>\n <div [ngSwitch]=\"currentWidget.widgetType\">\n <ng-template [ngSwitchCase]=\"0\">\n <h1>{{'Column'|transloco}}</h1>\n <ng-template\n ngFor\n let-col\n [ngForOf]=\"currentLayoutWidget.columns\"\n let-idx=\"index\"\n >\n <mat-toolbar>\n <mat-toolbar-row *ngIf=\"col !== -1\">\n <mat-grid-list cols=\"12\">\n <mat-grid-tile colspan=\"1\"> {{idx + 1}} </mat-grid-tile>\n <mat-grid-tile colspan=\"9\">\n <mat-slider\n style=\"width: 90%\"\n min=\"0.1\"\n max=\"1\"\n step=\"0.01\"\n value=\"{{col}}\"\n thumb-label=\"true\"\n tick-interval=\"true\"\n (change)=\"instantColumnValue($event.value,idx)\"\n >\n </mat-slider>\n {{percent(col)}}%\n </mat-grid-tile>\n <mat-grid-tile colspan=\"2\">\n <button\n style=\"width: 5%\"\n mat-button\n (click)=\"fixedColumn(idx)\"\n >\n fixed\n </button>\n </mat-grid-tile>\n </mat-grid-list>\n </mat-toolbar-row>\n <mat-toolbar-row *ngIf=\"col == -1\">\n <mat-grid-list cols=\"12\">\n <mat-grid-tile colspan=\"1\"> {{idx + 1}} </mat-grid-tile>\n <mat-grid-tile colspan=\"11\">\n <button\n style=\"width: 90%\"\n mat-button\n (click)=\"unfixedColumn(idx)\"\n >\n percent\n </button>\n </mat-grid-tile>\n </mat-grid-list>\n </mat-toolbar-row>\n </mat-toolbar>\n </ng-template>\n <mat-toolbar>\n <mat-toolbar-row>\n <button\n mat-button\n (click)=\"addColumn()\"\n *ngIf=\"currentLayoutWidget.columns.length < 10\"\n >\n {{'Add column'|transloco}}\n </button>\n </mat-toolbar-row>\n </mat-toolbar>\n </ng-template>\n <ng-template [ngSwitchCase]=\"2\">\n <ajf-image-group\n (formulaClick)=\"openFormulaDialog($event)\"\n [data]=\"iconSet\"\n ></ajf-image-group>\n <ajf-image-group\n (formulaClick)=\"openFormulaDialog($event)\"\n [data]=\"flagSet\"\n ></ajf-image-group>\n <ajf-report-builder-forms-analyzer></ajf-report-builder-forms-analyzer>\n <input\n mat-input\n [placeholder]=\"'paste a link' | transloco\"\n style=\"width: 100%\"\n [(ngModel)]=\"imageUrl\"\n />\n <button mat-button (click)=\"setImageUrl()\">\n {{'Set image'|transloco}}\n </button>\n </ng-template>\n <ng-template [ngSwitchCase]=\"3\">\n <div style=\"width: 500px\">\n <ajf-quill-editor\n [(ngModel)]=\"currentTextWidget.htmlText\"\n [modules]=\"getModule()\"\n [maxLength]=\"200\"\n [theme]=\"bubble\"\n [initHTML]=\"(getHTML|async) || ''\"\n (formulaClick)=\"openFormulaDialog($event)\"\n >\n </ajf-quill-editor>\n </div>\n </ng-template>\n <ng-template [ngSwitchCase]=\"4\">\n <h3>{{'Choose type of Chart'|transloco}}</h3>\n <mat-button-toggle-group class=\"ajf-chart-buttons\">\n <div class=\"ajf-row\">\n <mat-button-toggle\n value=\"reportbuilder-linechart\"\n (click)=\"setChartType(0)\"\n >\n <mat-icon fontSet=\"ajf-icon\" fontIcon=\"reportbuilder-linechart\">\n </mat-icon>\n </mat-button-toggle>\n <mat-button-toggle\n value=\"reportbuilder-barchartvertical\"\n (click)=\"setChartType(1)\"\n >\n <mat-icon\n fontSet=\"ajf-icon\"\n fontIcon=\"reportbuilder-barchartvertical\"\n >\n </mat-icon>\n </mat-button-toggle>\n <mat-button-toggle\n value=\"reportbuilder-bubblechart\"\n (click)=\"setChartType(8)\"\n >\n <mat-icon fontSet=\"ajf-icon\" fontIcon=\"reportbuilder-bubblechart\">\n </mat-icon>\n </mat-button-toggle>\n </div>\n <div class=\"row\">\n <mat-button-toggle\n value=\"reportbuilder-barcharthorizontal\"\n (click)=\"setChartType(2)\"\n >\n <mat-icon\n fontSet=\"ajf-icon\"\n fontIcon=\"reportbuilder-barcharthorizontal\"\n >\n </mat-icon>\n </mat-button-toggle>\n <mat-button-toggle\n value=\"reportbuilder-radarchart\"\n (click)=\"setChartType(3)\"\n >\n <mat-icon fontSet=\"ajf-icon\" fontIcon=\"reportbuilder-radarchart\">\n </mat-icon>\n </mat-button-toggle>\n <mat-button-toggle\n value=\"reportbuilder-barchartvertical\"\n (click)=\"setChartType(1)\"\n >\n <mat-icon\n fontSet=\"ajf-icon\"\n fontIcon=\"reportbuilder-barchartvertical\"\n >\n </mat-icon>\n </mat-button-toggle>\n </div>\n <div class=\"ajf-row\">\n <mat-button-toggle\n value=\"reportbuilder-scatterchart\"\n (click)=\"setChartType(4)\"\n >\n <mat-icon\n fontSet=\"ajf-icon\"\n fontIcon=\"reportbuilder-scatterchart\"\n >\n </mat-icon>\n </mat-button-toggle>\n <mat-button-toggle\n value=\"reportbuilder-polarareachart\"\n (click)=\"setChartType(5)\"\n >\n <mat-icon\n fontSet=\"ajf-icon\"\n fontIcon=\"reportbuilder-polarareachart\"\n >\n </mat-icon>\n </mat-button-toggle>\n </div>\n <div class=\"ajf-row\">\n <mat-button-toggle\n value=\"reportbuilder-piechart\"\n (click)=\"setChartType(6)\"\n >\n <mat-icon fontSet=\"ajf-icon\" fontIcon=\"reportbuilder-piechart\">\n </mat-icon>\n </mat-button-toggle>\n <mat-button-toggle\n value=\"reportbuilder-donoughtchart\"\n (click)=\"setChartType(7)\"\n >\n <mat-icon\n fontSet=\"ajf-icon\"\n fontIcon=\"reportbuilder-donoughtchart\"\n >\n </mat-icon>\n </mat-button-toggle>\n </div>\n </mat-button-toggle-group>\n <h3>{{'Labels'|transloco}}</h3>\n <ajf-report-builder-forms-analyzer></ajf-report-builder-forms-analyzer>\n <ajf-theme-color\n [section]=\"'chart'\"\n [label]=\"tabValue\"\n ></ajf-theme-color>\n <mat-card>\n <mat-card-header>\n <mat-card-title>{{'Border width'|transloco}}</mat-card-title>\n </mat-card-header>\n <mat-card-content>\n <mat-slider\n min=\"1\"\n max=\"100\"\n style=\"width: 99%\"\n step=\"1\"\n (change)=\"setChartBorderColor($event.value)\"\n [value]=\"chartBorderWidth\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-card-content>\n </mat-card>\n <mat-tab-group (selectChange)=\"setTab($event)\">\n <mat-tab label=\"Background\">\n <mat-list>\n <ng-template\n ngFor\n let-color\n [ngForOf]=\"(getChartBackgroundColor|async)\"\n let-idx=\"index\"\n >\n <mat-list-item>\n <span [style.background]=\"color\"> {{ color }} </span>\n <button mat-button (click)=\"removeChartBackgroundColor(idx)\">\n {{'Remove'|transloco}}\n </button>\n </mat-list-item>\n </ng-template>\n </mat-list>\n </mat-tab>\n <mat-tab label=\"Border\">\n <mat-list>\n <ng-template\n ngFor\n let-color\n [ngForOf]=\"(getChartBorderColor|async)\"\n let-idx=\"index\"\n >\n <mat-list-item>\n <span [style.background]=\"color\"> {{ color }} </span>\n <button mat-button (click)=\"removeChartBorderColor(idx)\">\n remove\n </button>\n </mat-list-item>\n </ng-template>\n </mat-list>\n </mat-tab>\n </mat-tab-group>\n </ng-template>\n <ng-template [ngSwitchCase]=\"5\">\n <ajf-report-builder-forms-analyzer></ajf-report-builder-forms-analyzer>\n </ng-template>\n </div>\n <button\n mat-button\n (click)=\"visibilitySection = !visibilitySection\"\n [ngClass]=\"{'ajf-selected': visibilitySection}\"\n >\n {{ widgetName|transloco }}\n <ng-container>{{'Visibility'|transloco}}</ng-container>\n </button>\n <div [style.display]=\"visibilitySection ? 'block' : 'none'\">\n <ajf-report-builder-condition-editor\n [visibility]=\"currentWidget.visibility\"\n ></ajf-report-builder-condition-editor>\n </div>\n </div>\n</ng-template>\n", styles: ["ajf-report-builder-properties .ajf-selected{background-color:darkred;color:#fff}ajf-report-builder-properties .ajf-style-container{height:auto;width:100%;position:relative;margin-bottom:60px;text-align:center}ajf-report-builder-properties .ajf-style-container mat-tab-group .ajf-style-panel{min-height:350px}ajf-report-builder-properties .ajf-style-container .ajf-style-background,ajf-report-builder-properties .ajf-style-container .ajf-style-color{width:100%;height:350px;position:relative;margin:30px}ajf-report-builder-properties .ajf-style-container .mat-list-item-content{position:normal !important;display:block !important;height:350px !important}ajf-report-builder-properties .ajf-style-container mat-tab-group .mat-tab-body-wrapper,ajf-report-builder-properties .ajf-style-container mat-tab-group .mat-list-item-content{position:normal !important;display:block !important;height:350px !important}ajf-report-builder-properties .ajf-content{margin-top:10px;margin-right:15px;margin-bottom:290px;margin-left:15px}ajf-report-builder-properties .ajf-content .ajf-menu-css{width:100% !important;font-size:10px !important}ajf-report-builder-properties .ajf-content .ajf-menu-css mat-button-toggle{width:33% !important}ajf-report-builder-properties .ajf-content mat-button-toggle-group{width:100% !important}ajf-report-builder-properties .ajf-content mat-button-toggle-group mat-button-toggle{width:auto !important}ajf-report-builder-properties .ajf-content mat-button-toggle-group mat-button-toggle mat-icon{margin:15px}ajf-report-builder-properties button{width:100%;margin-bottom:30px}ajf-report-builder-properties .ajf-hide-menu{width:auto !important}ajf-report-builder-properties h1,ajf-report-builder-properties h3,ajf-report-builder-properties h5{text-align:center}ajf-report-builder-properties .ajf-row{display:flex;flex-direction:column;width:100%}ajf-report-builder-properties .mat-tab-body.mat-tab-active{min-height:600px}ajf-report-builder-properties mat-grid-list{width:100%}ajf-report-builder-properties mat-grid-tile{overflow:visible !important}ajf-report-builder-properties mat-grid-tile.ajf-lal{text-align:left}ajf-report-builder-properties .ajf-chart-buttons mat-icon{font-size:15px}ajf-report-builder-properties .ajf-layout-preview{background-color:#fff;width:100%;font-size:.9em;box-sizing:border-box;position:relative}ajf-report-builder-properties .ajf-layout-preview .ajf-top-label{position:absolute;top:1em;left:1em;text-align:left}ajf-report-builder-properties .ajf-layout-preview .ajf-vtop{position:absolute;top:1em;right:0;left:0}ajf-report-builder-properties .ajf-layout-preview .ajf-vbottom{position:absolute;bottom:0;right:0;left:0}ajf-report-builder-properties .ajf-layout-preview .ajf-vright{position:absolute;top:50%;right:1em;margin-top:.5em}ajf-report-builder-properties .ajf-layout-preview .ajf-vleft{position:absolute;top:50%;left:1em;margin-top:.5em}ajf-report-builder-properties .ajf-layout-preview .ajf-vtl{position:absolute;top:1em;left:1em}ajf-report-builder-properties .ajf-layout-preview .ajf-vtr{position:absolute;top:1em;right:1em}ajf-report-builder-properties .ajf-layout-preview .ajf-vbl{position:absolute;bottom:1em;left:1em}ajf-report-builder-properties .ajf-layout-preview .ajf-vbr{position:absolute;bottom:1em;right:1em}ajf-report-builder-properties .ajf-layout-preview .ajf-margin-box{background-color:#fff;padding:3em;position:relative;border:solid 1px #ccc}ajf-report-builder-properties .ajf-layout-preview .ajf-margin-box .ajf-border-box{background-color:#ddd;padding:3em;position:relative;box-sizing:border-box}ajf-report-builder-properties .ajf-layout-preview .ajf-margin-box .ajf-border-box>.ajf-top-label{left:4em}ajf-report-builder-properties .ajf-layout-preview .ajf-margin-box .ajf-border-box .ajf-padding-box{padding:3em;background-color:#aaa;position:relative;box-sizing:border-box}ajf-report-builder-properties .ajf-layout-preview .ajf-margin-box .ajf-border-box .ajf-padding-box .ajf-content-box{background-color:#888;padding:2em;text-align:center;box-sizing:border-box}\n"], components: [{ type: i3.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i5.MatButtonToggle, selector: "mat-button-toggle", inputs: ["disableRipple", "aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "appearance", "checked", "disabled"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { type: i6.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple"], exportAs: ["matTabGroup"] }, { type: i6.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby"], exportAs: ["matTab"] }, { type: i7.AjfReportBuilderThemeColor, selector: "ajf-theme-color", inputs: ["section", "label", "init"] }, { type: i8.MatGridList, selector: "mat-grid-list", inputs: ["cols", "gutterSize", "rowHeight"], exportAs: ["matGridList"] }, { type: i8.MatGridTile, selector: "mat-grid-tile", inputs: ["rowspan", "colspan"], exportAs: ["matGridTile"] }, { type: i9.MatSlider, selector: "mat-slider", inputs: ["disabled", "color", "tabIndex", "invert", "max", "min", "step", "thumbLabel", "tickInterval", "value", "displayWith", "valueText", "vertical"], outputs: ["change", "input", "valueChange"], exportAs: ["matSlider"] }, { type: i10.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: i11.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i12.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { type: i13.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { type: i14.AjfReportBuilderImageGroup, selector: "ajf-image-group", inputs: ["data"], outputs: ["formulaClick"] }, { type: i15.AjfReportBuilderFormsAnalyzer, selector: "ajf-report-builder-forms-analyzer" }, { type: i16.AjfQuillEditor, selector: "ajf-quill-editor", inputs: ["theme", "modules", "readOnly", "placeholder", "maxLength", "minLength", "formats", "initHTML"], outputs: ["editorCreated", "contentChanged", "selectionChanged", "formulaClick"] }, { type: i17.MatCard, selector: "mat-card", exportAs: ["matCard"] }, { type: i17.MatCardHeader, selector: "mat-card-header" }, { type: i18.MatList, selector: "mat-list, mat-action-list", inputs: ["disableRipple", "disabled"], exportAs: ["matList"] }, { type: i18.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["disableRipple", "disabled"], exportAs: ["matListItem"] }, { type: i19.AjfReportBuilderConditionEditor, selector: "ajf-report-builder-condition-editor", inputs: ["visibility"] }], directives: [{ type: i20.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i21.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { type: i5.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { type: i20.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i22.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i22.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i22.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i22.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i22.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i22.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i20.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i20.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i20.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i13.MatToolbarRow, selector: "mat-toolbar-row", exportAs: ["matToolbarRow"] }, { type: i17.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { type: i17.MatCardContent, selector: "mat-card-content, [mat-card-content], [matCardContent]" }], pipes: { "transloco": i23.TranslocoPipe, "async": i20.AsyncPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
757
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0-next.15", ngImport: i0, type: AjfReportBuilderProperties, decorators: [{
758
- type: Component,
759
- args: [{ selector: 'ajf-report-builder-properties', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-template [ngIf]=\"currentWidget != null\">\n <div class=\"ajf-content\">\n <button\n mat-button\n class=\"ajf-hide-menu\"\n matTooltip=\"hide-menu\"\n (click)=\"hideMenu()\"\n [matTooltipPosition]=\"'above'\"\n >\n <mat-icon>remove_circle_outline</mat-icon>\n </button>\n <mat-button-toggle-group class=\"ajf-menu-css\">\n <mat-button-toggle\n (click)=\"reportStyles = !reportStyles; sectionStyles = false; widgetStyles = false\"\n value=\"left\"\n [ngClass]=\"{'ajf-selected': reportStyles}\"\n >\n report\n <ng-container>{{'CSS style'|transloco}}</ng-container>\n </mat-button-toggle>\n <mat-button-toggle\n (click)=\"sectionStyles = !sectionStyles; reportStyles = false; widgetStyles = false\"\n [ngClass]=\"{'ajf-selected': sectionStyles}\"\n >\n {{ origin }}\n <ng-container>{{'CSS style'|transloco}}</ng-container>\n </mat-button-toggle>\n <mat-button-toggle\n (click)=\"widgetStyles = !widgetStyles; sectionStyles = false; reportStyles = false\"\n [ngClass]=\"{'ajf-selected': widgetStyles}\"\n >\n {{ widgetName }}\n <ng-container>{{'CSS style'|transloco}}</ng-container>\n </mat-button-toggle>\n </mat-button-toggle-group>\n <div class=\"ajf-style-container\" *ngIf=\"(reportStyles) ? true : false \">\n <mat-tab-group>\n <mat-tab label=\"Background Color\">\n <div class=\"ajf-style-panel\">\n <ajf-theme-color\n [section]=\"'report'\"\n [label]=\"'color'\"\n ></ajf-theme-color>\n </div>\n </mat-tab>\n </mat-tab-group>\n </div>\n <div class=\"ajf-style-container\" *ngIf=\"(sectionStyles) ? true : false \">\n <mat-tab-group>\n <mat-tab label=\"Background Color\">\n <div class=\"ajf-style-panel\">\n <ajf-theme-color\n [section]=\"'section'\"\n [label]=\"'color'\"\n ></ajf-theme-color>\n </div>\n </mat-tab>\n </mat-tab-group>\n </div>\n <div class=\"ajf-style-container\" *ngIf=\"(widgetStyles) ? true : false \">\n <mat-tab-group *ngIf=\"(currentWidget.widgetType != 4)\">\n <mat-tab label=\"Color\">\n <div class=\"ajf-style-panel\">\n <ajf-theme-color\n [section]=\"'widget'\"\n [label]=\"'color'\"\n [init]=\"'icon'\"\n ></ajf-theme-color>\n </div>\n </mat-tab>\n <mat-tab label=\"Background Color\">\n <div class=\"ajf-style-panel\">\n <ajf-theme-color\n [section]=\"'widget'\"\n [label]=\"'background-color'\"\n ></ajf-theme-color>\n </div>\n </mat-tab>\n </mat-tab-group>\n <div\n class=\"properties-container\"\n *ngIf=\"(currentWidget.widgetType !== 8)\"\n >\n <div class=\"ajf-layout-preview\">\n <div class=\"ajf-vbottom\">\n <div>{{'height'|transloco}}</div>\n <div>{{ getHeightWidget|async }}</div>\n </div>\n <div class=\"ajf-margin-box\">\n <div class=\"ajf-top-label\">{{'margin'|transloco}}</div>\n <div class=\"ajf-vtop\">{{ getMarginWidgetTop|async }}</div>\n <div class=\"ajf-vright\">{{ getMarginWidgetRight|async }}</div>\n <div class=\"ajf-vbottom\">{{ getMarginWidgetBottom|async }}</div>\n <div class=\"ajf-vleft\">{{ getMarginWidgetLeft|async }}</div>\n <div class=\"ajf-border-box\">\n <div class=\"ajf-vtop\">{{ getBorderWidthWidgetTop|async }}</div>\n <div class=\"ajf-vright\">\n {{ getBorderWidthWidgetRight|async }}\n </div>\n <div class=\"ajf-vbottom\">\n {{ getBorderWidthWidgetBottom|async }}\n </div>\n <div class=\"ajf-vleft\">{{ getBorderWidthWidgetLeft|async }}</div>\n <div class=\"ajf-vtl\">\n {{ getBorderRadiusWidgetTopLeft|async }}\n </div>\n <div class=\"ajf-vtr\">\n {{ getBorderRadiusWidgetTopRight|async }}\n </div>\n <div class=\"ajf-vbr\">\n {{ getBorderRadiusWidgetBottomRight|async }}\n </div>\n <div class=\"ajf-vbl\">\n {{ getBorderRadiusWidgetBottomLeft|async }}\n </div>\n <div class=\"ajf-top-label\">{{'border'|transloco}}</div>\n <div class=\"ajf-padding-box\">\n <div class=\"ajf-top-label\">{{'padding'|transloco}}</div>\n <div class=\"ajf-vtop\">{{ getPaddingWidgetTop|async }}</div>\n <div class=\"ajf-vright\">{{ getPaddingWidgetRight|async }}</div>\n <div class=\"ajf-vbottom\">\n {{ getPaddingWidgetBottom|async }}\n </div>\n <div class=\"ajf-vleft\">{{ getPaddingWidgetLeft|async }}</div>\n <div class=\"ajf-content-box\">{{'content'|transloco}}</div>\n </div>\n </div>\n </div>\n </div>\n <mat-grid-list rowHeight=\"2em\" cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n <span>{{'height'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetStyles('height', $event.value)\"\n min=\"0\"\n max=\"200\"\n step=\"1\"\n [value]=\"getHeightWidget|async\"\n tickInterval=\"1\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile>\n <mat-icon\n *ngIf=\"!marginExpanded\"\n (click)=\"marginExpanded = !marginExpanded\"\n >keyboard_arrow_right</mat-icon\n >\n <mat-icon\n *ngIf=\"marginExpanded\"\n (click)=\"marginExpanded = !marginExpanded\"\n >keyboard_arrow_down</mat-icon\n >\n </mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n <span>{{'margin'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n [disabled]=\"marginExpanded\"\n (change)=\"setWidgetStyles('margin', $event.value)\"\n min=\"-50\"\n max=\"50\"\n step=\"1\"\n [value]=\"getMarginWidgetTop|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <ng-template [ngIf]=\"marginExpanded\">\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n &nbsp;&nbsp;<span>{{'margin top'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetMargin(0, $event.value)\"\n min=\"-50\"\n max=\"50\"\n step=\"1\"\n [value]=\"getMarginWidgetTop|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n &nbsp;&nbsp;<span>{{'margin right'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetMargin(1, $event.value)\"\n min=\"-50\"\n max=\"50\"\n step=\"1\"\n [value]=\"getMarginWidgetRight|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n &nbsp;&nbsp;<span>{{'margin bottom'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetMargin(2, $event.value)\"\n min=\"-50\"\n max=\"50\"\n step=\"1\"\n [value]=\"getMarginWidgetBottom|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n &nbsp;&nbsp;<span>{{'margin left'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetMargin(3, $event.value)\"\n min=\"-50\"\n max=\"50\"\n step=\"1\"\n [value]=\"getMarginWidgetLeft|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n </ng-template>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile>\n <mat-icon\n *ngIf=\"!paddingExpanded\"\n (click)=\"paddingExpanded = !paddingExpanded\"\n >keyboard_arrow_right</mat-icon\n >\n <mat-icon\n *ngIf=\"paddingExpanded\"\n (click)=\"paddingExpanded = !paddingExpanded\"\n >keyboard_arrow_down</mat-icon\n >\n </mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n <span>{{'padding'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetStyles('padding', $event.value)\"\n min=\"-50\"\n max=\"50\"\n step=\"1\"\n [value]=\"getPaddingWidgetTop|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <ng-template [ngIf]=\"paddingExpanded\">\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n &nbsp;&nbsp;<span>{{'padding top'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetPadding(0, $event.value)\"\n min=\"-50\"\n max=\"50\"\n step=\"1\"\n [value]=\"getPaddingWidgetTop|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n &nbsp;&nbsp;<span>{{'padding right'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetPadding(1, $event.value)\"\n min=\"-50\"\n max=\"50\"\n step=\"1\"\n [value]=\"getPaddingWidgetRight|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n &nbsp;&nbsp;<span>{{'padding bottom'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetPadding(2, $event.value)\"\n min=\"-50\"\n max=\"50\"\n step=\"1\"\n [value]=\"getPaddingWidgetBottom|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n &nbsp;&nbsp;<span>{{'padding left'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetPadding(3, $event.value)\"\n min=\"-50\"\n max=\"50\"\n step=\"1\"\n [value]=\"getPaddingWidgetLeft|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n </ng-template>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile>\n <mat-icon\n *ngIf=\"!borderWidthExpanded\"\n (click)=\"borderWidthExpanded = !borderWidthExpanded\"\n >keyboard_arrow_right</mat-icon\n >\n <mat-icon\n *ngIf=\"borderWidthExpanded\"\n (click)=\"borderWidthExpanded = !borderWidthExpanded\"\n >keyboard_arrow_down</mat-icon\n >\n </mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n <span>{{'border width'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetStyles('border-width', $event.value)\"\n min=\"0\"\n max=\"10\"\n step=\"1\"\n [value]=\"getBorderWidthWidgetTop|async\"\n tickInterval=\"1\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <ng-template [ngIf]=\"borderWidthExpanded\">\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n &nbsp;&nbsp;<span>{{'border width top'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetBorderWidth(0, $event.value)\"\n min=\"1\"\n max=\"10\"\n step=\"1\"\n [value]=\"getBorderWidthWidgetTop|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n &nbsp;&nbsp;<span>{{'border width right'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetBorderWidth(1, $event.value)\"\n min=\"1\"\n max=\"10\"\n step=\"1\"\n [value]=\"getBorderWidthWidgetRight|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n &nbsp;&nbsp;<span>{{'border width bottom'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetBorderWidth(2, $event.value)\"\n min=\"1\"\n max=\"10\"\n step=\"1\"\n [value]=\"getBorderWidthWidgetBottom|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n &nbsp;&nbsp;<span>{{'border width left'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetBorderWidth(3, $event.value)\"\n min=\"1\"\n max=\"10\"\n step=\"1\"\n [value]=\"getBorderWidthWidgetLeft|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n </ng-template>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile>\n <mat-icon\n *ngIf=\"!borderRadiusExpanded\"\n (click)=\"borderRadiusExpanded = !borderRadiusExpanded\"\n >keyboard_arrow_right</mat-icon\n >\n <mat-icon\n *ngIf=\"borderRadiusExpanded\"\n (click)=\"borderRadiusExpanded = !borderRadiusExpanded\"\n >keyboard_arrow_down</mat-icon\n >\n </mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n <span>{{'border radius'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetStyles('border-radius', $event.value)\"\n min=\"0\"\n max=\"100\"\n step=\"1\"\n tickInterval=\"10\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <ng-template [ngIf]=\"borderRadiusExpanded\">\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n &nbsp;&nbsp;<span>{{'border radius top left'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetBorderRadius(0, $event.value)\"\n min=\"1\"\n max=\"100\"\n step=\"1\"\n [value]=\"getBorderRadiusWidgetTopLeft|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n &nbsp;&nbsp;<span>{{'border radius top right'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetBorderRadius(1, $event.value)\"\n min=\"1\"\n max=\"100\"\n step=\"1\"\n [value]=\"getBorderRadiusWidgetTopRight|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n &nbsp;&nbsp;<span>{{'border radius bottom left'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetBorderRadius(2, $event.value)\"\n min=\"1\"\n max=\"100\"\n step=\"1\"\n [value]=\"getBorderRadiusWidgetBottomLeft|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"4\">\n &nbsp;&nbsp;<span\n >{{'border radius bottom right'|transloco}}</span\n >\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetBorderRadius(3, $event.value)\"\n min=\"1\"\n max=\"100\"\n step=\"1\"\n [value]=\"getBorderRadiusWidgetBottomRight|async\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n </ng-template>\n </div>\n <div class=\"properties-container\" *ngIf=\"currentWidget.widgetType === 2\">\n <mat-grid-list cols=\"12\">\n <mat-grid-tile></mat-grid-tile>\n <mat-grid-tile class=\"ajf-lal\" colspan=\"3\">\n <span>{{'font size'|transloco}}</span>\n </mat-grid-tile>\n <mat-grid-tile colspan=\"7\">\n <mat-slider\n (change)=\"setWidgetStyles('font-size', $event.value);\"\n min=\"1\"\n max=\"150\"\n step=\"1\"\n [value]=\"getFontSizeWidget|async\"\n tickInterval=\"1\"\n thumbLabel\n >\n </mat-slider>\n </mat-grid-tile>\n </mat-grid-list>\n </div>\n <ng-template [ngIf]=\"currentWidget.widgetType === 5\">\n <br />\n <form>\n <mat-form-field>\n <input\n matInput\n [placeholder]=\"'Font size' | transloco\"\n [value]=\"getFontSizeWidget|async\"\n [(ngModel)]=\"fontSize\"\n [ngModelOptions]=\"{standalone: true}\"\n (change)=\"setWidgetStyles('font-size', fontSize)\"\n />\n </mat-form-field>\n <mat-select\n (selectionChange)=\"setWidgetStyles('font-style', $event.value)\"\n [placeholder]=\"'Font style' | transloco\"\n >\n <mat-option value=\"normal\">{{'Normal'|transloco}}</mat-option>\n <mat-option value=\"italic\">{{'Italic'|transloco}}</mat-option>\n <mat-option value=\"oblique\">{{'Oblique'|transloco}}</mat-option>\n </mat-select>\n <mat-select\n (selectionChange)=\"setWidgetStyles('text-align', $event.value)\"\n [placeholder]=\"'Align' | transloco\"\n >\n <mat-option value=\"center\">{{'Center'|transloco}}</mat-option>\n <mat-option value=\"left\">{{'Left'|transloco}}</mat-option>\n <mat-option value=\"right\">{{'Right'|transloco}}</mat-option>\n </mat-select>\n </form>\n </ng-template>\n <h1>\n <ng-container>{{'properties of'|transloco}}</ng-container>\n {{ widgetName|transloco }}\n </h1>\n </div>\n <div [ngSwitch]=\"currentWidget.widgetType\">\n <ng-template [ngSwitchCase]=\"0\">\n <h1>{{'Column'|transloco}}</h1>\n <ng-template\n ngFor\n let-col\n [ngForOf]=\"currentLayoutWidget.columns\"\n let-idx=\"index\"\n >\n <mat-toolbar>\n <mat-toolbar-row *ngIf=\"col !== -1\">\n <mat-grid-list cols=\"12\">\n <mat-grid-tile colspan=\"1\"> {{idx + 1}} </mat-grid-tile>\n <mat-grid-tile colspan=\"9\">\n <mat-slider\n style=\"width: 90%\"\n min=\"0.1\"\n max=\"1\"\n step=\"0.01\"\n value=\"{{col}}\"\n thumb-label=\"true\"\n tick-interval=\"true\"\n (change)=\"instantColumnValue($event.value,idx)\"\n >\n </mat-slider>\n {{percent(col)}}%\n </mat-grid-tile>\n <mat-grid-tile colspan=\"2\">\n <button\n style=\"width: 5%\"\n mat-button\n (click)=\"fixedColumn(idx)\"\n >\n fixed\n </button>\n </mat-grid-tile>\n </mat-grid-list>\n </mat-toolbar-row>\n <mat-toolbar-row *ngIf=\"col == -1\">\n <mat-grid-list cols=\"12\">\n <mat-grid-tile colspan=\"1\"> {{idx + 1}} </mat-grid-tile>\n <mat-grid-tile colspan=\"11\">\n <button\n style=\"width: 90%\"\n mat-button\n (click)=\"unfixedColumn(idx)\"\n >\n percent\n </button>\n </mat-grid-tile>\n </mat-grid-list>\n </mat-toolbar-row>\n </mat-toolbar>\n </ng-template>\n <mat-toolbar>\n <mat-toolbar-row>\n <button\n mat-button\n (click)=\"addColumn()\"\n *ngIf=\"currentLayoutWidget.columns.length < 10\"\n >\n {{'Add column'|transloco}}\n </button>\n </mat-toolbar-row>\n </mat-toolbar>\n </ng-template>\n <ng-template [ngSwitchCase]=\"2\">\n <ajf-image-group\n (formulaClick)=\"openFormulaDialog($event)\"\n [data]=\"iconSet\"\n ></ajf-image-group>\n <ajf-image-group\n (formulaClick)=\"openFormulaDialog($event)\"\n [data]=\"flagSet\"\n ></ajf-image-group>\n <ajf-report-builder-forms-analyzer></ajf-report-builder-forms-analyzer>\n <input\n mat-input\n [placeholder]=\"'paste a link' | transloco\"\n style=\"width: 100%\"\n [(ngModel)]=\"imageUrl\"\n />\n <button mat-button (click)=\"setImageUrl()\">\n {{'Set image'|transloco}}\n </button>\n </ng-template>\n <ng-template [ngSwitchCase]=\"3\">\n <div style=\"width: 500px\">\n <ajf-quill-editor\n [(ngModel)]=\"currentTextWidget.htmlText\"\n [modules]=\"getModule()\"\n [maxLength]=\"200\"\n [theme]=\"bubble\"\n [initHTML]=\"(getHTML|async) || ''\"\n (formulaClick)=\"openFormulaDialog($event)\"\n >\n </ajf-quill-editor>\n </div>\n </ng-template>\n <ng-template [ngSwitchCase]=\"4\">\n <h3>{{'Choose type of Chart'|transloco}}</h3>\n <mat-button-toggle-group class=\"ajf-chart-buttons\">\n <div class=\"ajf-row\">\n <mat-button-toggle\n value=\"reportbuilder-linechart\"\n (click)=\"setChartType(0)\"\n >\n <mat-icon fontSet=\"ajf-icon\" fontIcon=\"reportbuilder-linechart\">\n </mat-icon>\n </mat-button-toggle>\n <mat-button-toggle\n value=\"reportbuilder-barchartvertical\"\n (click)=\"setChartType(1)\"\n >\n <mat-icon\n fontSet=\"ajf-icon\"\n fontIcon=\"reportbuilder-barchartvertical\"\n >\n </mat-icon>\n </mat-button-toggle>\n <mat-button-toggle\n value=\"reportbuilder-bubblechart\"\n (click)=\"setChartType(8)\"\n >\n <mat-icon fontSet=\"ajf-icon\" fontIcon=\"reportbuilder-bubblechart\">\n </mat-icon>\n </mat-button-toggle>\n </div>\n <div class=\"row\">\n <mat-button-toggle\n value=\"reportbuilder-barcharthorizontal\"\n (click)=\"setChartType(2)\"\n >\n <mat-icon\n fontSet=\"ajf-icon\"\n fontIcon=\"reportbuilder-barcharthorizontal\"\n >\n </mat-icon>\n </mat-button-toggle>\n <mat-button-toggle\n value=\"reportbuilder-radarchart\"\n (click)=\"setChartType(3)\"\n >\n <mat-icon fontSet=\"ajf-icon\" fontIcon=\"reportbuilder-radarchart\">\n </mat-icon>\n </mat-button-toggle>\n <mat-button-toggle\n value=\"reportbuilder-barchartvertical\"\n (click)=\"setChartType(1)\"\n >\n <mat-icon\n fontSet=\"ajf-icon\"\n fontIcon=\"reportbuilder-barchartvertical\"\n >\n </mat-icon>\n </mat-button-toggle>\n </div>\n <div class=\"ajf-row\">\n <mat-button-toggle\n value=\"reportbuilder-scatterchart\"\n (click)=\"setChartType(4)\"\n >\n <mat-icon\n fontSet=\"ajf-icon\"\n fontIcon=\"reportbuilder-scatterchart\"\n >\n </mat-icon>\n </mat-button-toggle>\n <mat-button-toggle\n value=\"reportbuilder-polarareachart\"\n (click)=\"setChartType(5)\"\n >\n <mat-icon\n fontSet=\"ajf-icon\"\n fontIcon=\"reportbuilder-polarareachart\"\n >\n </mat-icon>\n </mat-button-toggle>\n </div>\n <div class=\"ajf-row\">\n <mat-button-toggle\n value=\"reportbuilder-piechart\"\n (click)=\"setChartType(6)\"\n >\n <mat-icon fontSet=\"ajf-icon\" fontIcon=\"reportbuilder-piechart\">\n </mat-icon>\n </mat-button-toggle>\n <mat-button-toggle\n value=\"reportbuilder-donoughtchart\"\n (click)=\"setChartType(7)\"\n >\n <mat-icon\n fontSet=\"ajf-icon\"\n fontIcon=\"reportbuilder-donoughtchart\"\n >\n </mat-icon>\n </mat-button-toggle>\n </div>\n </mat-button-toggle-group>\n <h3>{{'Labels'|transloco}}</h3>\n <ajf-report-builder-forms-analyzer></ajf-report-builder-forms-analyzer>\n <ajf-theme-color\n [section]=\"'chart'\"\n [label]=\"tabValue\"\n ></ajf-theme-color>\n <mat-card>\n <mat-card-header>\n <mat-card-title>{{'Border width'|transloco}}</mat-card-title>\n </mat-card-header>\n <mat-card-content>\n <mat-slider\n min=\"1\"\n max=\"100\"\n style=\"width: 99%\"\n step=\"1\"\n (change)=\"setChartBorderColor($event.value)\"\n [value]=\"chartBorderWidth\"\n tickInterval=\"auto\"\n thumbLabel\n >\n </mat-slider>\n </mat-card-content>\n </mat-card>\n <mat-tab-group (selectChange)=\"setTab($event)\">\n <mat-tab label=\"Background\">\n <mat-list>\n <ng-template\n ngFor\n let-color\n [ngForOf]=\"(getChartBackgroundColor|async)\"\n let-idx=\"index\"\n >\n <mat-list-item>\n <span [style.background]=\"color\"> {{ color }} </span>\n <button mat-button (click)=\"removeChartBackgroundColor(idx)\">\n {{'Remove'|transloco}}\n </button>\n </mat-list-item>\n </ng-template>\n </mat-list>\n </mat-tab>\n <mat-tab label=\"Border\">\n <mat-list>\n <ng-template\n ngFor\n let-color\n [ngForOf]=\"(getChartBorderColor|async)\"\n let-idx=\"index\"\n >\n <mat-list-item>\n <span [style.background]=\"color\"> {{ color }} </span>\n <button mat-button (click)=\"removeChartBorderColor(idx)\">\n remove\n </button>\n </mat-list-item>\n </ng-template>\n </mat-list>\n </mat-tab>\n </mat-tab-group>\n </ng-template>\n <ng-template [ngSwitchCase]=\"5\">\n <ajf-report-builder-forms-analyzer></ajf-report-builder-forms-analyzer>\n </ng-template>\n </div>\n <button\n mat-button\n (click)=\"visibilitySection = !visibilitySection\"\n [ngClass]=\"{'ajf-selected': visibilitySection}\"\n >\n {{ widgetName|transloco }}\n <ng-container>{{'Visibility'|transloco}}</ng-container>\n </button>\n <div [style.display]=\"visibilitySection ? 'block' : 'none'\">\n <ajf-report-builder-condition-editor\n [visibility]=\"currentWidget.visibility\"\n ></ajf-report-builder-condition-editor>\n </div>\n </div>\n</ng-template>\n", styles: ["ajf-report-builder-properties .ajf-selected{background-color:darkred;color:#fff}ajf-report-builder-properties .ajf-style-container{height:auto;width:100%;position:relative;margin-bottom:60px;text-align:center}ajf-report-builder-properties .ajf-style-container mat-tab-group .ajf-style-panel{min-height:350px}ajf-report-builder-properties .ajf-style-container .ajf-style-background,ajf-report-builder-properties .ajf-style-container .ajf-style-color{width:100%;height:350px;position:relative;margin:30px}ajf-report-builder-properties .ajf-style-container .mat-list-item-content{position:normal !important;display:block !important;height:350px !important}ajf-report-builder-properties .ajf-style-container mat-tab-group .mat-tab-body-wrapper,ajf-report-builder-properties .ajf-style-container mat-tab-group .mat-list-item-content{position:normal !important;display:block !important;height:350px !important}ajf-report-builder-properties .ajf-content{margin-top:10px;margin-right:15px;margin-bottom:290px;margin-left:15px}ajf-report-builder-properties .ajf-content .ajf-menu-css{width:100% !important;font-size:10px !important}ajf-report-builder-properties .ajf-content .ajf-menu-css mat-button-toggle{width:33% !important}ajf-report-builder-properties .ajf-content mat-button-toggle-group{width:100% !important}ajf-report-builder-properties .ajf-content mat-button-toggle-group mat-button-toggle{width:auto !important}ajf-report-builder-properties .ajf-content mat-button-toggle-group mat-button-toggle mat-icon{margin:15px}ajf-report-builder-properties button{width:100%;margin-bottom:30px}ajf-report-builder-properties .ajf-hide-menu{width:auto !important}ajf-report-builder-properties h1,ajf-report-builder-properties h3,ajf-report-builder-properties h5{text-align:center}ajf-report-builder-properties .ajf-row{display:flex;flex-direction:column;width:100%}ajf-report-builder-properties .mat-tab-body.mat-tab-active{min-height:600px}ajf-report-builder-properties mat-grid-list{width:100%}ajf-report-builder-properties mat-grid-tile{overflow:visible !important}ajf-report-builder-properties mat-grid-tile.ajf-lal{text-align:left}ajf-report-builder-properties .ajf-chart-buttons mat-icon{font-size:15px}ajf-report-builder-properties .ajf-layout-preview{background-color:#fff;width:100%;font-size:.9em;box-sizing:border-box;position:relative}ajf-report-builder-properties .ajf-layout-preview .ajf-top-label{position:absolute;top:1em;left:1em;text-align:left}ajf-report-builder-properties .ajf-layout-preview .ajf-vtop{position:absolute;top:1em;right:0;left:0}ajf-report-builder-properties .ajf-layout-preview .ajf-vbottom{position:absolute;bottom:0;right:0;left:0}ajf-report-builder-properties .ajf-layout-preview .ajf-vright{position:absolute;top:50%;right:1em;margin-top:.5em}ajf-report-builder-properties .ajf-layout-preview .ajf-vleft{position:absolute;top:50%;left:1em;margin-top:.5em}ajf-report-builder-properties .ajf-layout-preview .ajf-vtl{position:absolute;top:1em;left:1em}ajf-report-builder-properties .ajf-layout-preview .ajf-vtr{position:absolute;top:1em;right:1em}ajf-report-builder-properties .ajf-layout-preview .ajf-vbl{position:absolute;bottom:1em;left:1em}ajf-report-builder-properties .ajf-layout-preview .ajf-vbr{position:absolute;bottom:1em;right:1em}ajf-report-builder-properties .ajf-layout-preview .ajf-margin-box{background-color:#fff;padding:3em;position:relative;border:solid 1px #ccc}ajf-report-builder-properties .ajf-layout-preview .ajf-margin-box .ajf-border-box{background-color:#ddd;padding:3em;position:relative;box-sizing:border-box}ajf-report-builder-properties .ajf-layout-preview .ajf-margin-box .ajf-border-box>.ajf-top-label{left:4em}ajf-report-builder-properties .ajf-layout-preview .ajf-margin-box .ajf-border-box .ajf-padding-box{padding:3em;background-color:#aaa;position:relative;box-sizing:border-box}ajf-report-builder-properties .ajf-layout-preview .ajf-margin-box .ajf-border-box .ajf-padding-box .ajf-content-box{background-color:#888;padding:2em;text-align:center;box-sizing:border-box}\n"] }]
760
- }], ctorParameters: function () { return [{ type: i1.MatDialog }, { type: i2.AjfReportBuilderService }]; } });
761
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydGllcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9tYXRlcmlhbC9yZXBvcnQtYnVpbGRlci9wcm9wZXJ0aWVzLnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21hdGVyaWFsL3JlcG9ydC1idWlsZGVyL3Byb3BlcnRpZXMuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUF3QkEsT0FBTyxFQUNMLGtCQUFrQixFQUtsQixhQUFhLEVBQ2QsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUlaLGlCQUFpQixFQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsU0FBUyxFQUFlLE1BQU0sMEJBQTBCLENBQUM7QUFDakUsT0FBTyxFQUFhLFlBQVksRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM5QyxPQUFPLEVBQUMsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFNUYsT0FBTyxFQUFDLG1DQUFtQyxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFFNUUsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0sMEJBQTBCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFTakUsTUFBTSxPQUFPLDBCQUEwQjtJQWdSckMsWUFBb0IsT0FBa0IsRUFBVSxRQUFpQztRQUE3RCxZQUFPLEdBQVAsT0FBTyxDQUFXO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBeUI7UUEvUWpGOzs7O1dBSUc7UUFDSCxrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUV0Qjs7OztXQUlHO1FBQ0gsa0JBQWEsR0FBbUIsSUFBSSxDQUFDO1FBUXJDOzs7O1dBSUc7UUFDSCxVQUFLLEdBQWMsRUFBRSxDQUFDO1FB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Q0FBQztRQUMzQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBWTtRQUN0QixJQUFJLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDO1FBQ2pELElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLEVBQUU7WUFDOUIsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLFVBQVUsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3hDLENBQUM7OytIQWo0QlUsMEJBQTBCO21IQUExQiwwQkFBMEIsMEZDekR2QywyamlDQWk0QkE7bUdEeDBCYSwwQkFBMEI7a0JBUHRDLFNBQVM7K0JBQ0UsK0JBQStCLGlCQUcxQixpQkFBaUIsQ0FBQyxJQUFJLG1CQUNwQix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IChDKSBHbnVjb29wIHNvYy4gY29vcC5cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQWR2YW5jZWQgSlNPTiBmb3JtcyAoYWpmKS5cbiAqXG4gKiBBZHZhbmNlZCBKU09OIGZvcm1zIChhamYpIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzXG4gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSxcbiAqIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4gKlxuICogQWR2YW5jZWQgSlNPTiBmb3JtcyAoYWpmKSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgQWZmZXJvXG4gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4gKiBhbG9uZyB3aXRoIEFkdmFuY2VkIEpTT04gZm9ybXMgKGFqZikuXG4gKiBJZiBub3QsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvLlxuICpcbiAqL1xuXG5pbXBvcnQge0FqZkZvcm19IGZyb20gJ0BhamYvY29yZS9mb3Jtcyc7XG5pbXBvcnQge0FqZkNvbmRpdGlvbn0gZnJvbSAnQGFqZi9jb3JlL21vZGVscyc7XG5pbXBvcnQge1xuICBBamZBZ2dyZWdhdGlvblR5cGUsXG4gIEFqZkNoYXJ0V2lkZ2V0LFxuICBBamZMYXlvdXRXaWRnZXQsXG4gIEFqZlRleHRXaWRnZXQsXG4gIEFqZldpZGdldCxcbiAgQWpmV2lkZ2V0VHlwZVxufSBmcm9tICdAYWpmL2NvcmUvcmVwb3J0cyc7XG5pbXBvcnQge2RlZXBDb3B5fSBmcm9tICdAYWpmL2NvcmUvdXRpbHMnO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBWaWV3RW5jYXBzdWxhdGlvblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7TWF0RGlhbG9nLCBNYXREaWFsb2dSZWZ9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQge09ic2VydmFibGUsIFN1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2Rpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIG1hcCwgc3RhcnRXaXRoLCB3aXRoTGF0ZXN0RnJvbX0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQge0FqZlJlcG9ydEJ1aWxkZXJGb3Jtc0FuYWx5emVyRGlhbG9nfSBmcm9tICcuL2Zvcm1zLWFuYWx5emVyLWRpYWxvZyc7XG5pbXBvcnQge0FqZkZvcm1WYXJpYWJsZXN9IGZyb20gJy4vbW9kZWxzJztcbmltcG9ydCB7QWpmUmVwb3J0QnVpbGRlclNlcnZpY2V9IGZyb20gJy4vcmVwb3J0LWJ1aWxkZXItc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FqZi1yZXBvcnQtYnVpbGRlci1wcm9wZXJ0aWVzJyxcbiAgdGVtcGxhdGVVcmw6ICdwcm9wZXJ0aWVzLmh0bWwnLFxuICBzdHlsZVVybHM6IFsncHJvcGVydGllcy5jc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgQWpmUmVwb3J0QnVpbGRlclByb3BlcnRpZXMgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgLyoqXG4gICAqICB0cnVlIHdoZW4gdGhlIGZpcnN0IHRpbWUgY2hhcnQgdHlwZSBpcyBzZXR0ZWRcbiAgICpcbiAgICogQG1lbWJlck9mIEFqZlJlcG9ydEJ1aWxkZXJQcm9wZXJ0aWVzXG4gICAqL1xuICBpbml0Q2hhcnRUeXBlID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIHRoZSBjdXJyZW50IHdpZGdldFxuICAgKlxuICAgKiBAbWVtYmVyT2YgQWpmUmVwb3J0QnVpbGRlclByb3BlcnRpZXNcbiAgICovXG4gIGN1cnJlbnRXaWRnZXQ6IEFqZldpZGdldHxudWxsID0gbnVsbDtcbiAgZ2V0IGN1cnJlbnRMYXlvdXRXaWRnZXQoKTogQWpmTGF5b3V0V2lkZ2V0IHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50V2lkZ2V0IGFzIEFqZkxheW91dFdpZGdldDtcbiAgfVxuICBnZXQgY3VycmVudFRleHRXaWRnZXQoKTogQWpmVGV4dFdpZGdldCB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFdpZGdldCBhcyBBamZUZXh0V2lkZ2V0O1xuICB9XG5cbiAgLyoqXG4gICAqIHRoaXMgYXJyYXkgY29udGFpbnMgdGhlIGZvcm1zIGV4cGxvaXRlZCBmb3IgZ2VuZXJhdGUgZGF0YSBsYWJlbHNcbiAgICpcbiAgICogQG1lbWJlck9mIEFqZlJlcG9ydEJ1aWxkZXJQcm9wZXJ0aWVzXG4gICAqL1xuICBmb3JtczogQWpmRm9ybVtdID0gW107XG5cblxuICBjb2xvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgLyoqXG4gICAqIHRoZSBuYW1lIG9mIHRoZSBzZWN0aW9uIHRoYXQgY29udGFpbnMgdGhlIGN1cnJlbnRXaWRnZXRcbiAgICpcbiAgICogQG1lbWJlck9mIEFqZlJlcG9ydEJ1aWxkZXJQcm9wZXJ0aWVzXG4gICAqL1xuICBvcmlnaW46IHN0cmluZztcblxuICAvKipcbiAgICogRkFLRSBEQVRBXG4gICAqL1xuXG4gIGZvcm1zSnNvbjogYW55ID0ge2Zvcm1zOiBbXX07XG5cbiAgLyoqXG4gICAqIFdJREdFVFxuICAgKi9cblxuICB3aWRnZXROYW1lID0gJyc7XG4gIGdldEhUTUw6IE9ic2VydmFibGU8c3RyaW5nfHVuZGVmaW5lZD47XG4gIGdldEhlaWdodFdpZGdldDogT2JzZXJ2YWJsZTxudW1iZXJ8dW5kZWZpbmVkPjtcbiAgZ2V0Rm9udFNpemVXaWRnZXQ6IE9ic2VydmFibGU8bnVtYmVyfHVuZGVmaW5lZD47XG4gIGdldEZvbnRBbGlnbldpZGdldDogT2JzZXJ2YWJsZTxudW1iZXJ8dW5kZWZpbmVkPjtcbiAgZ2V0QmFja2dyb3VuZENvbG9yV2lkZ2V0OiBPYnNlcnZhYmxlPHN0cmluZz47XG4gIGdldENvbG9yV2lkZ2V0OiBPYnNlcnZhYmxlPHN0cmluZz47XG4gIGdldFN0eWxlOiBPYnNlcnZhYmxlPGFueT47XG4gIGdldENoYXJ0QmFja2dyb3VuZENvbG9yOiBPYnNlcnZhYmxlPHN0cmluZ1tdPjtcbiAgZ2V0Q2hhcnRCb3JkZXJDb2xvcjogT2JzZXJ2YWJsZTxzdHJpbmdbXT47XG4gIGdldFZpc2liaWxpdHk6IE9ic2VydmFibGU8QWpmQ29uZGl0aW9uPjtcbiAgZ2V0Q29sb3I6IE9ic2VydmFibGU8U3RyaW5nW10+O1xuXG4gIG1hcmdpbkV4cGFuZGVkOiBib29sZWFuID0gZmFsc2U7XG4gIGdldE1hcmdpbldpZGdldDogT2JzZXJ2YWJsZTxudW1iZXJbXXx1bmRlZmluZWQ+O1xuICBnZXRNYXJnaW5XaWRnZXRUb3A6IE9ic2VydmFibGU8bnVtYmVyPjtcbiAgZ2V0TWFyZ2luV2lkZ2V0UmlnaHQ6IE9ic2VydmFibGU8bnVtYmVyPjtcbiAgZ2V0TWFyZ2luV2lkZ2V0Qm90dG9tOiBPYnNlcnZhYmxlPG51bWJlcj47XG4gIGdldE1hcmdpbldpZGdldExlZnQ6IE9ic2VydmFibGU8bnVtYmVyPjtcblxuICBwYWRkaW5nRXhwYW5kZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgZ2V0UGFkZGluZ1dpZGdldDogT2JzZXJ2YWJsZTxudW1iZXJbXXx1bmRlZmluZWQ+O1xuICBnZXRQYWRkaW5nV2lkZ2V0VG9wOiBPYnNlcnZhYmxlPG51bWJlcj47XG4gIGdldFBhZGRpbmdXaWRnZXRSaWdodDogT2JzZXJ2YWJsZTxudW1iZXI+O1xuICBnZXRQYWRkaW5nV2lkZ2V0Qm90dG9tOiBPYnNlcnZhYmxlPG51bWJlcj47XG4gIGdldFBhZGRpbmdXaWRnZXRMZWZ0OiBPYnNlcnZhYmxlPG51bWJlcj47XG5cbiAgYm9yZGVyV2lkdGhFeHBhbmRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBnZXRCb3JkZXJXaWR0aFdpZGdldDogT2JzZXJ2YWJsZTxudW1iZXJbXXx1bmRlZmluZWQ+O1xuICBnZXRCb3JkZXJXaWR0aFdpZGdldFRvcDogT2JzZXJ2YWJsZTxudW1iZXI+O1xuICBnZXRCb3JkZXJXaWR0aFdpZGdldFJpZ2h0OiBPYnNlcnZhYmxlPG51bWJlcj47XG4gIGdldEJvcmRlcldpZHRoV2lkZ2V0Qm90dG9tOiBPYnNlcnZhYmxlPG51bWJlcj47XG4gIGdldEJvcmRlcldpZHRoV2lkZ2V0TGVmdDogT2JzZXJ2YWJsZTxudW1iZXI+O1xuXG4gIGJvcmRlclJhZGl1c0V4cGFuZGVkOiBib29sZWFuID0gZmFsc2U7XG4gIGdldEJvcmRlclJhZGl1c1dpZGdldDogT2JzZXJ2YWJsZTxudW1iZXJbXXx1bmRlZmluZWQ+O1xuICBnZXRCb3JkZXJSYWRpdXNXaWRnZXRUb3BMZWZ0OiBPYnNlcnZhYmxlPG51bWJlcj47XG4gIGdldEJvcmRlclJhZGl1c1dpZGdldFRvcFJpZ2h0OiBPYnNlcnZhYmxlPG51bWJlcj47XG4gIGdldEJvcmRlclJhZGl1c1dpZGdldEJvdHRvbVJpZ2h0OiBPYnNlcnZhYmxlPG51bWJlcj47XG4gIGdldEJvcmRlclJhZGl1c1dpZGdldEJvdHRvbUxlZnQ6IE9ic2VydmFibGU8bnVtYmVyPjtcblxuICBiYWNrZ3JvdW5kQ29sb3IgPSAnIzEyN2JkYyc7XG4gIHN0eWxlQmFja2dyb3VuZENvbG9yID0gJ3JnYigyNTUsMjU1LDI1NSwwKSc7XG4gIGJvcmRlckNvbG9yID0gJyMxMjdiZGMnO1xuICBzdHlsZUNvbG9yID0gJ3JnYigwLDAsMCwwKSc7XG4gIHdiYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcbiAgZm9udFNpemU6IHN0cmluZztcbiAgYnViYmxlOiBzdHJpbmc7XG5cbiAgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8QWpmUmVwb3J0QnVpbGRlckZvcm1zQW5hbHl6ZXJEaWFsb2c+O1xuICBjb250YWluZXI6IEFqZkZvcm1WYXJpYWJsZXM7XG5cblxuICBhbGlnbiA9IFtmYWxzZSwgJ2NlbnRlcicsICdyaWdodCcsICdqdXN0aWZ5J107XG5cbiAgZm9udHMgPSBbXG4gICAgZmFsc2UsICdibGFja3InLCAnYmxhY2staXRhbGljJywgJ2JvbGQnLCAnYm9sZC1jb25kZW5zZWQnLCAnYm9sZC1jb25kZW5zZWQtaXRhbGljJyxcbiAgICAnYm9sZC1pdGFsaWMnLCAnY29uZGVuc2VkJywgJ2NvbmRlbnNlZC1pdGFsaWMnLCAnaXRhbGljJywgJ2xpZ2h0JywgJ2xpZ2h0LWl0YWxpYycsICdtZWRpdW0nLFxuICAgICdtZWRpdW0taXRhbGljJywgJ3RoaW5yJywgJ3RoaW4taXRhbGljJ1xuICBdO1xuICBjdXJyZW50TW9kdWxlOiBhbnkgPSB7fTtcbiAgcXVpbGxNb2R1bGVzID0ge1xuICAgIHRvb2xiYXI6IFtcbiAgICAgIFsnZm9ybXVsYSddLCBbJ2JvbGQnLCAnaXRhbGljJywgJ3VuZGVybGluZScsICdzdHJpa2UnXSwgIC8vIHRvZ2dsZWQgYnV0dG9uc1xuICAgICAgLy8gWydibG9ja3F1b3RlJywgJ2NvZGUtYmxvY2snXSxcblxuICAgICAgW3snaGVhZGVyJzogMX0sIHsnaGVhZGVyJzogMn1dLCAgLy8gY3VzdG9tIGJ1dHRvbiB2YWx1ZXNcbiAgICAgIFt7J2xpc3QnOiAnb3JkZXJlZCd9LCB7J2xpc3QnOiAnYnVsbGV0J31dLFxuICAgICAgW3snc2NyaXB0JzogJ3N1Yid9LCB7J3NjcmlwdCc6ICdzdXBlcid9XSwgIC8vIHN1cGVyc2NyaXB0L3N1YnNjcmlwdFxuICAgICAgLy8gW3sgJ2luZGVudCc6ICctMSd9LCB7ICdpbmRlbnQnOiAnKzEnIH1dLCAgICAgICAgICAvLyBvdXRkZW50L2luZGVudFxuICAgICAgLy8gW3sgJ2RpcmVjdGlvbic6ICdydGwnIH1dLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXh0IGRpcmVjdGlvblxuXG4gICAgICBbeydzaXplJzogWydzbWFsbCcsIGZhbHNlLCAnbGFyZ2UnLCAnaHVnZSddfV0sICAvLyBjdXN0b20gZHJvcGRvd25cbiAgICAgIFt7J2hlYWRlcic6IFsxLCAyLCAzLCA0LCA1LCA2LCBmYWxzZV19XSxcblxuICAgICAgW3snY29sb3InOiB0aGlzLmNvbG9yc30sIHsnYmFja2dyb3VuZCc6IHRoaXMuY29sb3JzfV0sICAvLyBkcm9wZG93biB3aXRoIGRlZmF1bHRzIGZyb20gdGhlbWVcbiAgICAgIFt7J2ZvbnQnOiB0aGlzLmZvbnRzfV0sIFt7J2FsaWduJzogdGhpcy5hbGlnbn1dLFxuXG4gICAgICBbJ2NsZWFuJ10sICAvLyByZW1vdmUgZm9ybWF0dGluZyBidXR0b25cblxuICAgICAgLy8gWydsaW5rJywgJ2NsYXNzJywgJ3ZpZGVvJ10gICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGluayBhbmQgaW1hZ2UsIHZpZGVvXG4gICAgXVxuICB9O1xuXG4gIC8qKlxuICAgKiBDSEFSVFxuICAgKi9cblxuXG4gIGdldENoYXJ0WUxhYmVsczogT2JzZXJ2YWJsZTxzdHJpbmdbXT47XG5cbiAgY2hhcnRCb3JkZXJDb2xvcjogc3RyaW5nW10gPSBbXTtcbiAgY2hhcnRCb3JkZXJXaWR0aCA9IDM7XG5cbiAgLyoqXG4gICAqXG4gICAqIElNQUdFXG4gICAqL1xuXG4gIGltYWdlVXJsID0gJ2h0dHBzOi8vYW5ndWxhci5pby9yZXNvdXJjZXMvaW1hZ2VzL2xvZ29zL2FuZ3VsYXIyL2FuZ3VsYXIucG5nJztcblxuICAvKipcbiAgICpcbiAgICogVEVYVFxuICAgKi9cblxuICBodG1sVGV4dCA9ICcnO1xuXG5cbiAgLyoqXG4gICAqIHRoZXNlIHZhcmlhYmxlcyBpbmRpY2F0ZSB0aGF0IHRoZSB1c2VyIHdhbnQgdG8gY2hhbmdlIHNlY3Rpb25cbiAgICovXG4gIHJlcG9ydFN0eWxlcyA9IGZhbHNlO1xuICBzZWN0aW9uU3R5bGVzID0gZmFsc2U7XG4gIHdpZGdldFN0eWxlcyA9IHRydWU7XG4gIHNlY3Rpb25Db2xvciA9IGZhbHNlO1xuICB3aWRnZXRDb2xvciA9IGZhbHNlO1xuICB2aXNpYmlsaXR5U2VjdGlvbiA9IGZhbHNlO1xuICBjdXJyZW50Q29sb3IgPSAnJztcblxuICBwcml2YXRlIF9pY29uOiB7Zm9udFNldDogc3RyaW5nLCBmb250SWNvbjogc3RyaW5nfXxudWxsID0gbnVsbDtcbiAgZ2V0IGljb24oKToge2ZvbnRTZXQ6IHN0cmluZywgZm9udEljb246IHN0cmluZ318bnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2ljb247XG4gIH1cblxuICBpY29uU2V0OiBhbnkgPSB7J2ljb24nOiAndHJ1ZScsICd0aXRsZSc6ICdyZXBvcnQnLCAnZGF0YSc6IG51bGx9O1xuXG4gIGZsYWdTZXQ6IGFueSA9IHtcbiAgICAnaWNvbic6ICdmYWxzZScsXG4gICAgJ2NsYXNzJzogWydmbGFnLWljb24nXSxcbiAgICAncHJlZml4Q2xhc3MnOiAnZmxhZy1pY29uLScsXG4gICAgJ3RpdGxlJzogJ2ZsYWdzJyxcbiAgICAnZGF0YSc6XG4gICAgICAgIFtcbiAgICAgICAgICB7J2NsYXNzJzogJ2R6JywgJ2luZm8nOiAnQWxnZXJpYSd9LFxuICAgICAgICAgIHsnY2xhc3MnOiAnYW8nLCAnaW5mbyc6ICdBbmdvbGEnfSxcbiAgICAgICAgICB7J2NsYXNzJzogJ2JqJywgJ2luZm8nOiAnQmVuaW4nfSxcbiAgICAgICAgICB7J2NsYXNzJzogJ2J3JywgJ2luZm8nOiAnQm90c3dhbmEnfSxcbiAgICAgICAgICB7J2NsYXNzJzogJ2JmJywgJ2luZm8nOiAnQnVya2luYSBGYXNvJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICdiaScsICdpbmZvJzogJ0J1cnVuZGknfSxcbiAgICAgICAgICB7J2NsYXNzJzogJ2NtJywgJ2luZm8nOiAnQ2FtZXJvb24nfSxcbiAgICAgICAgICB7J2NsYXNzJzogJ2N2JywgJ2luZm8nOiAnQ2FibyBWZXJkZSd9LFxuICAgICAgICAgIHsnY2xhc3MnOiAnY2YnLCAnaW5mbyc6ICdUaGUgQ2VudHJhbCBBZnJpY2FuIFJlcHVibGljJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICd0ZCcsICdpbmZvJzogJ0NoYWQnfSxcbiAgICAgICAgICB7J2NsYXNzJzogJ2ttJywgJ2luZm8nOiAnVGhlIENvbW9yb3MnfSxcbiAgICAgICAgICB7J2NsYXNzJzogJ2NpJywgJ2luZm8nOiAnQ290ZSBEXFwnYXZvaXJlJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICdjZCcsICdpbmZvJzogJ1RoZSBEZW1vY3JhdGljIFJlcHVibGljIG9mIENvbmdvJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICdkaicsICdpbmZvJzogJ0Rpamlib3V0aSd9LFxuICAgICAgICAgIHsnY2xhc3MnOiAnZWcnLCAnaW5mbyc6ICdFZ3lwdCd9LFxuICAgICAgICAgIHsnY2xhc3MnOiAnZ3EnLCAnaW5mbyc6ICdFcXVhdG9yaWFsIEd1aW5lYSd9LFxuICAgICAgICAgIHsnY2xhc3MnOiAnZXInLCAnaW5mbyc6ICdFcml0cmVhJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICdldCcsICdpbmZvJzogJ0V0aGlvcGlhJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICd0ZicsICdpbmZvJzogJ0ZyZW5jaCBTb3V0aGVybiBUZXJyaXRvcmllcyd9LFxuICAgICAgICAgIHsnY2xhc3MnOiAnZ2EnLCAnaW5mbyc6ICdHYWJvbid9LFxuICAgICAgICAgIHsnY2xhc3MnOiAnZ20nLCAnaW5mbyc6ICdUaGUgR2FtYmlhJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICdnaCcsICdpbmZvJzogJ0doYW5hJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICdnbicsICdpbmZvJzogJ0d1aW5lYSd9LFxuICAgICAgICAgIHsnY2xhc3MnOiAnZ3cnLCAnaW5mbyc6ICdHdWluZWEtQmlzc2F1J30sXG4gICAgICAgICAgeydjbGFzcyc6ICdrZScsICdpbmZvJzogJ0tlbnlhJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICdscycsICdpbmZvJzogJ0xlc2hvdGhvJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICdscicsICdpbmZvJzogJ0xpYmVyaWEnfSxcbiAgICAgICAgICB7J2NsYXNzJzogJ2x5JywgJ2luZm8nOiAnTGlieWEnfSxcbiAgICAgICAgICB7J2NsYXNzJzogJ21nJywgJ2luZm8nOiAnTWFkYWdhc2Nhcid9LFxuICAgICAgICAgIHsnY2xhc3MnOiAnbXcnLCAnaW5mbyc6ICdNYWxhd3knfSxcbiAgICAgICAgICB7J2NsYXNzJzogJ21sJywgJ2luZm8nOiAnTWFsaSd9LFxuICAgICAgICAgIHsnY2xhc3MnOiAnbXInLCAnaW5mbyc6ICdNYXVyaXRhbmlhJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICdtdScsICdpbmZvJzogJ01hdXJpdGl1cyd9LFxuICAgICAgICAgIHsnY2xhc3MnOiAneXQnLCAnaW5mbyc6ICdNYXlvdHRlJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICdtYScsICdpbmZvJzogJ01hcm9jY28nfSxcbiAgICAgICAgICB7J2NsYXNzJzogJ216JywgJ2luZm8nOiAnTW96YW1iaXF1ZSd9LFxuICAgICAgICAgIHsnY2xhc3MnOiAnbmEnLCAnaW5mbyc6ICdOYW1pYmlhJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICduZScsICdpbmZvJzogJ05pZ2VyJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICduZycsICdpbmZvJzogJ05pZ2VyaWEnfSxcbiAgICAgICAgICB7J2NsYXNzJzogJ2NnJywgJ2luZm8nOiAnUmVwdWJsaWMgb2YgdGhlIENvbmdvJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICdydycsICdpbmZvJzogJ1J3bmRhJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICdyZScsICdpbmZvJzogJ3LDqHVuaW9uJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICdzaCcsICdpbmZvJzogJ1NhaW50IEhlbGVuYSwgQXNjZW5zaW9uIGFuZCBUcmlzdGFuIGRhIEN1bmhhJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICdzdCcsICdpbmZvJzogJ1NhbyBUb21lIGFuZCBQcmluY2lwZSd9LFxuICAgICAgICAgIHsnY2xhc3MnOiAnc24nLCAnaW5mbyc6ICdTZW5lZ2FsJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICdzYycsICdpbmZvJzogJ1NleWNoZWxsZXMnfSxcbiAgICAgICAgICB7J2NsYXNzJzogJ3NsJywgJ2luZm8nOiAnU2llcnJhIExlb25lJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICdzbycsICdpbmZvJzogJ1NvbWFsaWEnfSxcbiAgICAgICAgICB7J2NsYXNzJzogJ3phJywgJ2luZm8nOiAnU291dGggQWZyaWNhJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICdzcycsICdpbmZvJzogJ1NvdXRoIFN1ZGFuJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICdzZCcsICdpbmZvJzogJ1N1ZGFuJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICdzeicsICdpbmZvJzogJ1N3YXppbGFuZCd9LFxuICAgICAgICAgIHsnY2xhc3MnOiAndHonLCAnaW5mbyc6ICdUYW56YW5pYSd9LFxuICAgICAgICAgIHsnY2xhc3MnOiAndGcnLCAnaW5mbyc6ICdUb2dvJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICd0bicsICdpbmZvJzogJ1R1bmlzaWEnfSxcbiAgICAgICAgICB7J2NsYXNzJzogJ3VnJywgJ2luZm8nOiAnVWdhbmRhJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICdlaCcsICdpbmZvJzogJ1dlc3Rlcm4gU2FoYXJhJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICd6bScsICdpbmZvJzogJ1phbWJpYSd9LFxuICAgICAgICAgIHsnY2xhc3MnOiAnencnLCAnaW5mbyc6ICdaaW1iYXdlJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICdpcScsICdpbmZvJzogJ0lyYXEnfSxcbiAgICAgICAgICB7J2NsYXNzJzogJ2xiJywgJ2luZm8nOiAnTGViYW5vbid9LFxuICAgICAgICAgIHsnY2xhc3MnOiAnYmQnLCAnaW5mbyc6ICdCYW5nbGFkZXNoJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICdpcicsICdpbmZvJzogJ0lyYW4gKElzbGFtaWMgUmVwdWJsaWMgb2YpJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICdteScsICdpbmZvJzogJ01hbGF5c2lhJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICducCcsICdpbmZvJzogJ05lcGFsJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICdwaycsICdpbmZvJzogJ1Bha2lzdGFuJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICd0aCcsICdpbmZvJzogJ1RoYWlsYW5kJ30sXG4gICAgICAgICAgeydjbGFzcyc6ICdqbycsICdpbmZvJzogJ0pvcmRhbid9LFxuICAgICAgICAgIHsnY2xhc3MnOiAneWUnLCAnaW5mbyc6ICdZZW1lbid9XG4gICAgICAgIF1cbiAgfTtcblxuICBwcml2YXRlIF9jdXJyZW50V2lkZ2V0U3ViOiBTdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb24uRU1QVFk7XG4gIHByaXZhdGUgX2Zvcm1zU3ViOiBTdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb24uRU1QVFk7XG4gIHByaXZhdGUgX2NvbG9yU3ViOiBTdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb24uRU1QVFk7XG4gIHByaXZhdGUgX2hlYWRlclN0eWxlU3ViOiBTdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb24uRU1QVFk7XG4gIHByaXZhdGUgX2NvbnRlbnRTdHlsZXNTdWI6IFN1YnNjcmlwdGlvbiA9IFN1YnNjcmlwdGlvbi5FTVBUWTtcbiAgcHJpdmF0ZSBfZm9vdGVyU3R5bGVzU3ViOiBTdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb24uRU1QVFk7XG4gIHByaXZhdGUgX29yaWdpblN1YjogU3Vic2NyaXB0aW9uID0gU3Vic2NyaXB0aW9uLkVNUFRZO1xuICBwcml2YXRlIF9zdHlsZXNVcGRhdGVzU3ViczogU3Vic2NyaXB0aW9uID0gU3Vic2NyaXB0aW9uLkVNUFRZO1xuXG4gIHByaXZhdGUgX3VwZGF0ZVdpZGdldE1hcmdpbkV2dDogRXZlbnRFbWl0dGVyPHtpZHg6IG51bWJlciwgdmFsdWU6IGFueX0+ID1cbiAgICAgIG5ldyBFdmVudEVtaXR0ZXI8e2lkeDogbnVtYmVyLCB2YWx1ZTogYW55fT4oKTtcbiAgcHJpdmF0ZSBfdXBkYXRlV2lkZ2V0UGFkZGluZ0V2dDogRXZlbnRFbWl0dGVyPHtpZHg6IG51bWJlciwgdmFsdWU6IGFueX0+ID1cbiAgICAgIG5ldyBFdmVudEVtaXR0ZXI8e2lkeDogbnVtYmVyLCB2YWx1ZTogYW55fT4oKTtcbiAgcHJpdmF0ZSBfdXBkYXRlV2lkZ2V0Qm9yZGVyV2lkdGhFdnQ6IEV2ZW50RW1pdHRlcjx7aWR4OiBudW1iZXIsIHZhbHVlOiBhbnl9PiA9XG4gICAgICBuZXcgRXZlbnRFbWl0dGVyPHtpZHg6IG51bWJlciwgdmFsdWU6IGFueX0+KCk7XG4gIHByaXZhdGUgX3VwZGF0ZVdpZGdldEJvcmRlclJhZGl1c0V2dDogRXZlbnRFbWl0dGVyPHtpZHg6IG51bWJlciwgdmFsdWU6IGFueX0+ID1cbiAgICAgIG5ldyBFdmVudEVtaXR0ZXI8e2lkeDogbnVtYmVyLCB2YWx1ZTogYW55fT4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kaWFsb2c6IE1hdERpYWxvZywgcHJpdmF0ZSBfc2VydmljZTogQWpmUmVwb3J0QnVpbGRlclNlcnZpY2UpIHtcbiAgICB0aGlzLnNldEZvcm1zKCk7XG5cbiAgICB0aGlzLmljb25TZXQuZGF0YSA9IE9iamVjdC5rZXlzKF9zZXJ2aWNlLmljb25TZXRzKS5maWx0ZXIoeCA9PiB4ICE9ICdhamYtaWNvbicpLm1hcChpID0+IHtcbiAgICAgIHJldHVybiB7bmFtZTogaSwgaWNvbnM6IF9zZXJ2aWNlLmljb25TZXRzW2ldfTtcbiAgICB9KTtcblxuICAgIHRoaXMuX2hlYWRlclN0eWxlU3ViID0gdGhpcy5fc2VydmljZS5oZWFkZXJTdHlsZXMuc3Vic2NyaWJlKHMgPT4ge1xuICAgICAgaWYgKHNbJ2JhY2tncm91bmQtY29sb3InXSAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuc3R5bGVCYWNrZ3JvdW5kQ29sb3IgPSBzWydiYWNrZ3JvdW5kLWNvbG9yJ107XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5fY29udGVudFN0eWxlc1N1YiA9IHRoaXMuX3NlcnZpY2UuY29udGVudFN0eWxlcy5zdWJzY3JpYmUocyA9PiB7XG4gICAgICBpZiAoc1snYmFja2dyb3VuZC1jb2xvciddICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5zdHlsZUJhY2tncm91bmRDb2xvciA9IHNbJ2JhY2tncm91bmQtY29sb3InXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLl9mb290ZXJTdHlsZXNTdWIgPSB0aGlzLl9zZXJ2aWNlLmZvb3RlclN0eWxlcy5zdWJzY3JpYmUocyA9PiB7XG4gICAgICBpZiAoc1snYmFja2dyb3VuZC1jb2xvciddICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5zdHlsZUJhY2tncm91bmRDb2xvciA9IHNbJ2JhY2tncm91bmQtY29sb3InXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLl9vcmlnaW5TdWIgPSB0aGlzLl9zZXJ2aWNlLm9yaWdpbi5zdWJzY3JpYmUocyA9PiB7XG4gICAgICB0aGlzLm9yaWdpbiA9IHM7XG4gICAgfSk7XG4gIH1cblxuXG4gIC8qKlxuICAgKlxuICAgKiBVVElMU1xuICAgKi9cblxuXG4gIC8qKlxuICAgKiByZXR1cm4gYSBudW1iZXIgdmFsdWVcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqXG4gICAqIEBtZW1iZXJPZiBBamZSZXBvcnRCdWlsZGVyUHJvcGVydGllc1xuICAgKi9cbiAgdG9OdW1iZXIodmFsdWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgbGV0IG51bWJlclBhdHRlcm4gPSAvXigtKT9cXGQrL2c7XG5cbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG1hdGNoZXMgPSB2YWx1ZS5tYXRjaChudW1iZXJQYXR0ZXJuKTtcbiAgICAgIGlmIChtYXRjaGVzID09IG51bGwgfHwgbWF0Y2hlcy5sZW5ndGggPT0gMCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBOdW1iZXIobWF0Y2hlc1swXSk7XG4gICAgfVxuICB9XG5cbiAgdG9OdW1iZXJBcnJheSh2YWx1ZTogc3RyaW5nKTogbnVtYmVyW10ge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAodmFsdWUgfHwgJycpXG4gICAgICAgICAgLnJlcGxhY2UoJ3B4JywgJycpXG4gICAgICAgICAgLnNwbGl0KCcgJylcbiAgICAgICAgICAuZmlsdGVyKHYgPT4gdiAhPT0gJycgJiYgdiAhPSBudWxsKVxuICAgICAgICAgIC5tYXAodiA9PiB0aGlzLnRvTnVtYmVyKHYpKTtcbiAgICB9XG4gIH1cblxuICBmaWxsUHhOdW1iZXJBcnJheSh2YWx1ZTogbnVtYmVyW10pIHtcbiAgICBjb25zdCB2bCA9IHZhbHVlLmxlbmd0aDtcbiAgICBzd2l0Y2ggKHZsKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIHJldHVybiBbMCwgMCwgMCwgMF07XG4gICAgICBjYXNlIDE6XG4gICAgICAgIGNvbnN0IHYgPSB2YWx1ZVswXTtcbiAgICAgICAgcmV0dXJuIFt2LCB2LCB2LCB2XTtcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgY29uc3QgdjIxID0gdmFsdWVbMF07XG4gICAgICAgIGNvbnN0IHYyMiA9IHZhbHVlWzFdO1xuICAgICAgICByZXR1cm4gW3YyMSwgdjIyLCB2MjEsIHYyMl07XG4gICAgICBjYXNlIDM6XG4gICAgICAgIGNvbnN0IHYzMSA9IHZhbHVlWzBdO1xuICAgICAgICBjb25zdCB2MzIgPSB2YWx1ZVsxXTtcbiAgICAgICAgY29uc3QgdjMzID0gdmFsdWVbMl07XG4gICAgICAgIHJldHVybiBbdjMxLCB2MzIsIHYzMywgdjMyXTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICBwZXJjZW50KHZhbHVlOiBudW1iZXIpIHtcbiAgICBsZXQgdGVtcCA9IHRoaXMucm91bmRUbyh2YWx1ZSAqIDEwMCwgMyk7XG4gICAgcmV0dXJuIHRlbXA7XG4gIH1cblxuICByb3VuZFRvKHZhbHVlOiBudW1iZXIsIGRlY2ltYWxQb3NpdGlvbnM6IG51bWJlcikge1xuICAgIGxldCBpID0gdmFsdWUgKiBNYXRoLnBvdygxMCwgZGVjaW1hbFBvc2l0aW9ucyk7XG5cbiAgICBpID0gTWF0aC5mbG9vcihpKTtcblxuICAgIHJldHVybiBpIC8gTWF0aC5wb3coMTAsIGRlY2ltYWxQb3NpdGlvbnMpO1xuICB9XG4gIC8qKlxuICAgKiBjYWxsIHRvIHNlcnZpY2UgdG8gc2V0IHRoZSBmb3Jtc1xuICAgKlxuICAgKiBAbWVtYmVyT2YgQWpmUmVwb3J0QnVpbGRlclByb3BlcnRpZXNcbiAgICovXG5cbiAgc2V0Rm9ybXMoKTogdm9pZCB7XG4gICAgbGV0IGZvcm1zOiBBamZGb3JtW10gPSBbXTtcbiAgICB0cnkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmZvcm1zSnNvbi5mb3Jtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBmb3Jtcy5wdXNoKGRlZXBDb3B5KHRoaXMuZm9ybXNKc29uLmZvcm1zW2ldKSk7XG4gICAgICB9XG4gICAgICB0aGlzLl9zZXJ2aWNlLnNldFJlcG9ydEZvcm1zKGZvcm1zKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGNhbGwgdG8gc2VydmljZSB0byBzZXQgdGhlIHdpZHRoIG9mIHRoZSBpZHggY29sdW1uIG9mIGxheW91dCB3aWRnZXRcbiAgICpcbiAgICogQHBhcmFtIGNvbFxuICAgKiBAcGFyYW0gaWR4XG4gICAqXG4gICAqIEBtZW1iZXJPZiBBamZSZXBvcnRCdWlsZGVyUHJvcGVydGllc1xuICAgKi9cbiAgaW5zdGFudENvbHVtblZhbHVlKGNvbDogbnVtYmVyfG51bGwsIGlkeDogbnVtYmVyKSB7XG4gICAgaWYgKGNvbCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9zZXJ2aWNlLmluc3RhbnRDb2x1bW5WYWx1ZShjb2wsIGlkeCk7XG4gIH1cblxuICAvKipcbiAgICogIGZvcmNlIGNvcHkgb2Ygc3R5bGVcbiAgICpcbiAgICogQG1lbWJlck9mIEFqZlJlcG9ydEJ1aWxkZXJQcm9wZXJ0aWVzXG4gICAqL1xuICAvLyBUT0RPIGRlbGV0ZSB0aGlzXG4gIHNldFN0eWxlKCkge1xuICAgIGlmICh0aGlzLmN1cnJlbnRXaWRnZXQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnRXaWRnZXQuc3R5bGVzID0gZGVlcENvcHkodGhpcy5jdXJyZW50V2lkZ2V0LnN0eWxlcyk7XG4gICAgdGhpcy5fc2VydmljZS51cGRhdGVDdXJyZW50V2lkZ2V0KHRoaXMuY3VycmVudFdpZGdldCk7XG4gIH1cblxuICAvKipcbiAgICogY2FsbCB0byBzZXJ2aWNlIHRvIGFkZCBuZXcgc3R5bGUgdG8gd2lkZ2V0XG4gICAqXG4gICAqIEBwYXJhbSBsYWJlbFxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICpcbiAgICogQG1lbWJlck9mIEFqZlJlcG9ydEJ1aWxkZXJQcm9wZXJ0aWVzXG4gICAqL1xuICBzZXRXaWRnZXRTdHlsZXMobGFiZWw6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIHRoaXMuX3NlcnZpY2Uuc2V0V2lkZ2V0U3R5bGVzKGxhYmVsLCB2YWx1ZSk7XG4gICAgdGhpcy5jdXJyZW50Q29sb3IgPSB2YWx1ZTtcbiAgICB0aGlzLnNldFN0eWxlKCk7XG4gIH1cblxuICBzZXRXaWRnZXRNYXJnaW4oaWR4OiBudW1iZXIsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLl91cGRhdGVXaWRnZXRNYXJnaW5FdnQuZW1pdCh7aWR4LCB2YWx1ZX0pO1xuICB9XG5cbiAgc2V0V2lkZ2V0UGFkZGluZyhpZHg6IG51bWJlciwgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuX3VwZGF0ZVdpZGdldFBhZGRpbmdFdnQuZW1pdCh7aWR4LCB2YWx1ZX0pO1xuICB9XG5cbiAgc2V0V2lkZ2V0Qm9yZGVyV2lkdGgoaWR4OiBudW1iZXIsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLl91cGRhdGVXaWRnZXRCb3JkZXJXaWR0aEV2dC5lbWl0KHtpZHgsIHZhbHVlfSk7XG4gIH1cblxuICBzZXRXaWRnZXRCb3JkZXJSYWRpdXMoaWR4OiBudW1iZXIsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLl91cGRhdGVXaWRnZXRCb3JkZXJSYWRpdXNFdnQuZW1pdCh7aWR4LCB2YWx1ZX0pO1xuICB9XG5cbiAgLyoqXG4gICAqIGNhbGwgdG8gc2VydmljZSB0byBhZGQgbmV3IHN0eWxlIHRvIHNlY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIGxhYmVsXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKlxuICAgKiBAbWVtYmVyT2YgQWpmUmVwb3J0QnVpbGRlclByb3BlcnRpZXNcbiAgICovXG4gIHNldFNlY3Rpb25TdHlsZXMobGFiZWw6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIHRoaXMuX3NlcnZpY2Uuc2V0U2VjdGlvblN0eWxlcyh0aGlzLm9yaWdpbiwgbGFiZWwsIHZhbHVlKTtcbiAgICB0aGlzLnN0eWxlQ29sb3IgPSB2YWx1ZTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIGNhbGwgdG8gc2VydmljZSB0byBhZGQgbmV3IHN0eWxlIHRvIHJlcG9ydFxuICAgKlxuICAgKiBAcGFyYW0gbGFiZWxcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqXG4gICAqIEBtZW1iZXJPZiBBamZSZXBvcnRCdWlsZGVyUHJvcGVydGllc1xuICAgKi9cbiAgc2V0UmVwb3J0U3R5bGVzKGxhYmVsOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLl9zZXJ2aWNlLnNldFJlcG9ydFN0eWxlcyhsYWJlbCwgdmFsdWUpO1xuICAgIHRoaXMuc3R5bGVCYWNrZ3JvdW5kQ29sb3IgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBhZGQgY3VzdG9tIGNvbG9yXG4gICAqXG4gICAqXG4gICAqIEBtZW1iZXJPZiBBamZSZXBvcnRCdWlsZGVyUHJvcGVydGllc1xuICAgKi9cbiAgYWRkQ3VzdG9tQ29sb3IoKSB7XG4gICAgdGhpcy5fc2VydmljZS5hZGRDdXN0b21Db2xvcih0aGlzLmN1cnJlbnRDb2xvcik7XG4gICAgdGhpcy5fc2VydmljZS51cGRhdGVDdXJyZW50V2lkZ2V0KHRoaXMuY3VycmVudFdpZGdldCk7XG4gIH1cblxuICAvKipcbiAgICogZ2V0IHRoZSBtb2R1bGUgZXhwbG9pdCB0byBxdWlsbCB0ZXh0IGVkaXRvclxuICAgKlxuICAgKiBAcmV0dXJuc1xuICAgKlxuICAgKiBAbWVtYmVyT2YgQWpmUmVwb3J0QnVpbGRlclByb3BlcnRpZXNcbiAgICovXG4gIGdldE1vZHVsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5xdWlsbE1vZHVsZXM7XG4gIH1cblxuICAvKipcbiAgICogdHJ1ZSBpcyB0aGUgaW5wdXQgdHlwZSB2YWx1ZSBpcyBlcXVhbCB0byBjdXJyZW50IHdpZGdldCB0eXBlXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKiBAcmV0dXJuc1xuICAgKlxuICAgKiBAbWVtYmVyT2YgQWpmUmVwb3J0QnVpbGRlclByb3BlcnRpZXNcbiAgICovXG4gIGlzQ2hhcnRUeXBlU2VsZWN0ZWQodmFsdWU6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmluaXRDaGFydFR5cGUgPT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgbXlPYmogPSA8QWpmQ2hhcnRXaWRnZXQ+dGhpcy5jdXJyZW50V2lkZ2V0O1xuICAgIGlmICh2YWx1ZSA9PT0gbXlPYmouY2hhcnRUeXBlKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG5cbiAgLyogbGF5b3V0IGZ1bmN0aW9ucyAqL1xuXG4gIC8qKlxuICAgKiBjYWxsIHRvIHNlcnZpY2UgdG8gYWRkIGEgY29sdW1uIHRvIGN1cnJlbnQgbGF5b3V0IHdpZGdldFxuICAgKlxuICAgKlxuICAgKiBAbWVtYmVyT2YgQWpmUmVwb3J0QnVpbGRlclByb3BlcnRpZXNcbiAgICovXG4gIGFkZENvbHVtbigpIHtcbiAgICB0aGlzLl9zZXJ2aWNlLmFkZENvbHVtbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIGNhbGwgdG8gc2VydmljZSB0byBhZGQgYSBvYmogdG8gY3VycmVudCBsYXlvdXQgd2lkZ2V0XG4gICAqXG4gICAqIEBwYXJhbSBpZHhcbiAgICpcbiAgICogQG1lbWJlck9mIEFqZlJlcG9ydEJ1aWxkZXJQcm9wZXJ0aWVzXG4gICAqL1xuICBmaXhlZENvbHVtbihpZHg6IG51bWJlcikge1xuICAgIHRoaXMuX3NlcnZpY2UuZml4ZWRDb2x1bW4oaWR4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBjYWxsIHRvIHNlcnZpY2UgdG8gcmVtb3ZlIG9iaiBvZiBjdXJyZW50IGxheW91dCB3aWRnZXRcbiAgICpcbiAgICogQHBhcmFtIGlkeFxuICAgKlxuICAgKiBAbWVtYmVyT2YgQWpmUmVwb3J0QnVpbGRlclByb3BlcnRpZXNcbiAgICovXG4gIHVuZml4ZWRDb2x1bW4oaWR4OiBudW1iZXIpIHtcbiAgICB0aGlzLl9zZXJ2aWNlLnJlbW92ZSgndW5maXhlZENvbHVtbicsIGlkeCk7XG4gIH1cblxuICAvKiBpbWFnZSBmdW5jdGlvbnMgKi9cblxuICAvKipcbiAgICogY2FsbCB0byBzZXJ2aWNlIHRvIHNldCBpbWFnZSB1cmxcbiAgICpcbiAgICpcbiAgICogQG1lbWJlck9mIEFqZlJlcG9ydEJ1aWxkZXJQcm9wZXJ0aWVzXG4gICAqL1xuICBzZXRJbWFnZVVybCgpIHtcbiAgICB0aGlzLl9zZXJ2aWNlLnNldEltYWdlVXJsKHRoaXMuaW1hZ2VVcmwpO1xuICB9XG5cbiAgc2V0SWNvbihpY29uOiB7Zm9udFNldDogc3RyaW5nLCBmb250SWNvbjogc3RyaW5nfSkge1xuICAgIHRoaXMuX2ljb24gPSBpY29uO1xuICAgIHRoaXMuX3NlcnZpY2Uuc2V0SWNvbihpY29uKTtcbiAgfVxuXG4gIC8qIGNoYXJ0IGZ1bmN0aW9ucyAqL1xuXG4gIC8qKlxuICAgKiBjYWxsIHRvIHNlcnZpY2UgdG8gc2V0IHRoZSB0eXBlIG9mIGNoYXJ0XG4gICAqXG4gICAqIEBwYXJhbSB0eXBlXG4gICAqXG4gICAqIEBtZW1iZXJPZiBBamZSZXBvcnRCdWlsZGVyUHJvcGVydGllc1xuICAgKi9cbiAgc2V0Q2hhcnRUeXBlKHR5cGU6IG51bWJlcikge1xuICAgIHRoaXMuaW5pdENoYXJ0VHlwZSA9IHRydWU7XG4gICAgdGhpcy5fc2VydmljZS5zZXRDaGFydFR5cGUodHlwZSk7XG4gIH1cblxuICBzZXRDaGFydEJvcmRlckNvbG9yKHZhbHVlOiBudW1iZXJ8bnVsbCkge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3NlcnZpY2Uuc2V0Q2hhcnRCb3JkZXJXaWR0aCh2YWx1ZSk7XG4gIH1cblxuICB0YWJWYWx1ZTogc3RyaW5nID0gJ2JhY2tncm91bmRDb2xvcic7XG4gIHNldFRhYihldmVudDogYW55KSB7XG4gICAgaWYgKGV2ZW50LmluZGV4ID09PSAwKSB7XG4gICAgICB0aGlzLnRhYlZhbHVlID0gJ2JhY2tncm91bmRDb2xvcic7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudGFiVmFsdWUgPSAnYm9yZGVyQ29sb3InO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBjYWxsIHRvIHNlcnZpY2UgdG8gcmVtb3ZlIGJhY2tncm91bmQgY29sb3IgdG8gY3VycmVudCBjaGFydFxuICAgKlxuICAgKiBAcGFyYW0gaW5kZXhcbiAgICpcbiAgICogQG1lbWJlck9mIEFqZlJlcG9ydEJ1aWxkZXJQcm9wZXJ0aWVzXG4gICAqL1xuICByZW1vdmVDaGFydEJhY2tncm91bmRDb2xvcihpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5fc2VydmljZS5yZW1vdmVDaGFydEJhY2tncm91bmRDb2xvcihpbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogY2FsbCB0byBzZXJ2aWNlIHRvIHJlbW92ZSBib3JkZXIgY29sb3IgdG8gY3VycmVudCBjaGFydFxuICAgKlxuICAgKiBAcGFyYW0gaW5kZXhcbiAgICpcbiAgICogQG1lbWJlck9mIEFqZlJlcG9ydEJ1aWxkZXJQcm9wZXJ0aWVzXG4gICAqL1xuICByZW1vdmVDaGFydEJvcmRlckNvbG9yKGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLl9zZXJ2aWNlLnJlbW92ZUNoYXJ0Qm9yZGVyQ29sb3IoaW5kZXgpO1xuICB9XG5cbiAgaGlkZU1lbnUoKSB7XG4gICAgdGhpcy5fc2VydmljZS51cGRhdGVDdXJyZW50V2lkZ2V0KG51bGwpO1xuICB9XG5cbiAgb3BlbkZvcm11bGFEaWFsb2coZXZlbnQ6IGFueSkge1xuICAgIHRoaXMuZGlhbG9nUmVmID0gdGhpcy5fZGlhbG9nLm9wZW4oQWpmUmVwb3J0QnVpbGRlckZvcm1zQW5hbHl6ZXJEaWFsb2cpO1xuICAgIHRoaXMuZGlhbG9nUmVmLmNvbXBvbmVudEluc3RhbmNlLmFnZ3JlZ2F0aW9uID0gQWpmQWdncmVnYXRpb25UeXBlLk5vbmU7XG4gICAgdGhpcy5kaWFsb2dSZWYuY29tcG9uZW50SW5zdGFuY2UuaXNGb3JtdWxhID0gdHJ1ZTtcbiAgICBpZiAoZXZlbnQgIT0gbnVsbCAmJiBldmVudC5yZWZlcmVuY2UgIT0gbnVsbCkge1xuICAgICAgdGhpcy5kaWFsb2dSZWYuY29tcG9uZW50SW5zdGFuY2UuZm9ybXVsYSA9IGV2ZW50LmZvcm11bGE7XG4gICAgICB0aGlzLmRpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZS5yZWZlcmVuY2UgPSBldmVudC5yZWZlcmVuY2U7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fZm9ybXNTdWIgPSB0aGlzLl9zZXJ2aWNlLnJlcG9ydEZvcm1zLnN1YnNjcmliZSh4ID0+IHtcbiAgICAgIHRoaXMuZm9ybXMgPSB4IHx8IFtdO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fY3VycmVudFdpZGdldFN1YiA9IHRoaXMuX3NlcnZpY2UuY3VycmVudFdpZGdldC5zdWJzY3JpYmUoeCA9PiB7XG4gICAgICBpZiAoeCAhPSBudWxsKSB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRXaWRnZXQgIT09IHgpIHtcbiAgICAgICAgICB0aGlzLmN1cnJlbnRXaWRnZXQgPSB4O1xuICAgICAgICAgIHRoaXMud2lkZ2V0TmFtZSA9IEFqZldpZGdldFR5cGVbeC53aWRnZXRUeXBlXTtcbiAgICAgICAgICB0aGlzLnJlcG9ydFN0eWxlcyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuc2VjdGlvblN0eWxlcyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMud2lkZ2V0U3R5bGVzID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5zZWN0aW9uQ29sb3IgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLndpZGdldENvbG9yID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy52aXNpYmlsaXR5U2VjdGlvbiA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmN1cnJlbnRXaWRnZXQgPSBudWxsO1xuICAgICAgICB0aGlzLndpZGdldE5hbWUgPSAnJztcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLl9jb2xvclN1YiA9IHRoaXMuX3NlcnZpY2UuY29sb3JzLnN1YnNjcmliZSh4ID0+IHtcbiAgICAgIGlmICh4ICYmIHgubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmNvbG9ycyA9IHg7XG5cbiAgICAgICAgdGhpcy5xdWlsbE1vZHVsZXMgPSB7XG4gICAgICAgICAgdG9vbGJhcjogW1xuICAgICAgICAgICAgWydib2xkJywgJ2l0YWxpYycsICd1bmRlcmxpbmUnLCAnc3RyaWtlJ10sICAvLyB0b2dnbGVkIGJ1dHRvbnNcbiAgICAgICAgICAgIC8vIFsnYmxvY2txdW90ZScsICdjb2RlLWJsb2NrJ10sXG4gICAgICAgICAgICBbeydoZWFkZXInOiAxfSwgeydoZWFkZXInOiAyfV0sICAvLyBjdXN0b20gYnV0dG9uIHZhbHVlc1xuICAgICAgICAgICAgW3snbGlzdCc6ICdvcmRlcmVkJ30sIHsnbGlzdCc6ICdidWxsZXQnfV0sXG4gICAgICAgICAgICBbeydzY3JpcHQnOiAnc3ViJ30sIHsnc2NyaXB0JzogJ3N1cGVyJ31dLCAgLy8gc3VwZXJzY3JpcHQvc3Vic2NyaXB0XG4gICAgICAgICAgICAvLyBbeyAnaW5kZW50JzogJy0xJ30sIHsgJ2luZGVudCc6ICcrMScgfV0sICAgICAgICAgIC8vIG91dGRlbnQvaW5kZW50XG4gICAgICAgICAgICAvLyBbeyAnZGlyZWN0aW9uJzogJ3J0bCcgfV0sICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRleHQgZGlyZWN0aW9uXG5cbiAgICAgICAgICAgIFt7J3NpemUnOiBbJ3NtYWxsJywgZmFsc2UsICdsYXJnZScsICdodWdlJ119XSwgIC8vIGN1c3RvbSBkcm9wZG93blxuICAgICAgICAgICAgW3snaGVhZGVyJzogWzEsIDIsIDMsIDQsIDUsIDYsIGZhbHNlXX1dLFxuXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIHsnY29sb3InOiB0aGlzLmNvbG9yc30sIHsnYmFja2dyb3VuZCc6IHRoaXMuY29sb3JzfVxuICAgICAgICAgICAgXSwgIC8vIGRyb3Bkb3duIHdpdGggZGVmYXVsdHMgZnJvbSB0aGVtZVxuICAgICAgICAgICAgW3snZm9udCc6IHRoaXMuZm9udHN9XSwgW3snYWxpZ24nOiB0aGlzLmFsaWdufV0sIFsnZm9ybXVsYSddLFxuICAgICAgICAgICAgWydjbGVhbiddLCAgLy8gcmVtb3ZlIGZvcm1hdHRpbmcgYnV0dG9uXG5cbiAgICAgICAgICAgIC8vIFsnbGluaycsICdjbGFzcycsICd2aWRlbyddICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpbmsgYW5kIGltYWdlLCB2aWRlb1xuICAgICAgICAgIF1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9KTtcblxuXG4gICAgdGhpcy5nZXRIVE1MID0gdGhpcy5fc2VydmljZS5jdXJyZW50V2lkZ2V0LnBpcGUoXG4gICAgICAgIG1hcCgod2lkZ2V0OiBBamZXaWRnZXR8bnVsbCkgPT4ge1xuICAgICAgICAgIGlmICh3aWRnZXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgbXlPYmogPSA8QWpmVGV4dFdpZGdldD50aGlzLmN1cnJlbnRXaWRnZXQ7XG4gICAgICAgICAgICByZXR1cm4gbXlPYmouaHRtbFRleHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfSksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIHN0YXJ0V2l0aCgnPHA+PGJyPjwvcD4nKSk7XG5cblxuICAgIHRoaXMuZ2V0SGVpZ2h0V2lkZ2V0ID0gdGhpcy5fc2VydmljZS5jdXJyZW50V2lkZ2V0LnBpcGUoXG4gICAgICAgIGZpbHRlcih4ID0+IHggIT0gbnVsbCksIG1hcCgobXlPYmo6IEFqZldpZGdldHxudWxsKSA9PiB7XG4gICAgICAgICAgaWYgKG15T2JqICE9IG51bGwpIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHRoaXMudG9OdW1iZXIobXlPYmouc3R5bGVzWydoZWlnaHQnXSk7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCB8fCB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xuXG4gICAgdGhpcy5nZXRGb250U2l6ZVdpZGdldCA9IHRoaXMuX3NlcnZpY2UuY3VycmVudFdpZGdldC5waXBlKFxuICAgICAgICBtYXAoKG15T2JqOiBBamZXaWRnZXR8bnVsbCkgPT4ge1xuICAgICAgICAgIGlmIChteU9iaiAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gKHRoaXMudG9OdW1iZXIobXlPYmouc3R5bGVzWydmb250LXNpemUnXSkgfHwgMTIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9KSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG5cbiAgICB0aGlzLmdldEZvbnRBbGlnbldpZGdldCA9IHRoaXMuX3NlcnZpY2UuY3VycmVudFdpZGdldC5waXBlKFxuICAgICAgICBtYXAoKG15T2JqOiBBamZXaWRnZXR8bnVsbCkgPT4ge1xuICAgICAgICAgIGlmIChteU9iaiAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gKChteU9iai5zdHlsZXNbJ3RleHQtYWxpZ24nXSkgfHwgJ2NlbnRlcicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9KSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG5cbiAgICB0aGlzLmdldEJvcmRlcldpZHRoV2lkZ2V0ID0gdGhpcy5fc2VydmljZS5jdXJyZW50V2lkZ2V0LnBpcGUoXG4gICAgICAgIG1hcCgobXlPYmo6IEFqZldpZGdldHxudWxsKSA9PiB7XG4gICAgICAgICAgaWYgKG15T2JqICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbGxQeE51bWJlckFycmF5KHRoaXMudG9OdW1iZXJBcnJheShteU9iai5zdHlsZXNbJ2JvcmRlci13aWR0aCddKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH0pLFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLCBzdGFydFdpdGgoWzAsIDAsIDAsIDBdKSk7XG4gICAgdGhpcy5nZXRCb3JkZXJXaWR0aFdpZGdldFRvcCA9XG4gICAgICAgIHRoaXMuZ2V0Qm9yZGVyV2lkdGhXaWRnZXQucGlwZShmaWx0ZXIobSA9PiBtICE9IG51bGwpLCBtYXAobSA9PiBtIVswXSkpO1xuICAgIHRoaXMuZ2V0Qm9yZGVyV2lkdGhXaWRnZXRSaWdodCA9XG4gICAgICAgIHRoaXMuZ2V0Qm9yZGVyV2lkdGhXaWRnZXQucGlwZShmaWx0ZXIobSA9PiBtICE9IG51bGwpLCBtYXAobSA9PiBtIVsxXSkpO1xuICAgIHRoaXMuZ2V0Qm9yZGVyV2lkdGhXaWRnZXRCb3R0b20gPVxuICAgICAgICB0aGlzLmdldEJvcmRlcldpZHRoV2lkZ2V0LnBpcGUoZmlsdGVyKG0gPT4gbSAhPSBudWxsKSwgbWFwKG0gPT4gbSFbMl0pKTtcbiAgICB0aGlzLmdldEJvcmRlcldpZHRoV2lkZ2V0TGVmdCA9XG4gICAgICAgIHRoaXMuZ2V0Qm9yZGVyV2lkdGhXaWRnZXQucGlwZShmaWx0ZXIobSA9PiBtICE9IG51bGwpLCBtYXAobSA9PiBtIVszXSkpO1xuXG4gICAgdGhpcy5nZXRCb3JkZXJSYWRpdXNXaWRnZXQgPSB0aGlzLl9zZXJ2aWNlLmN1cnJlbnRXaWRnZXQucGlwZShcbiAgICAgICAgbWFwKChteU9iajogQWpmV2lkZ2V0fG51bGwpID0+IHtcbiAgICAgICAgICBpZiAobXlPYmogIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsbFB4TnVtYmVyQXJyYXkodGhpcy50b051bWJlckFycmF5KG15T2JqLnN0eWxlc1snYm9yZGVyLXJhZGl1cyddKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH0pLFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLCBzdGFydFdpdGgoWzAsIDAsIDAsIDBdKSk7XG4gICAgdGhpcy5nZXRCb3JkZXJSYWRpdXNXaWRnZXRUb3BMZWZ0ID1cbiAgICAgICAgdGhpcy5nZXRCb3JkZXJSYWRpdXNXaWRnZXQucGlwZShmaWx0ZXIobSA9PiBtICE9IG51bGwpLCBtYXAobSA9PiBtIVswXSkpO1xuICAgIHRoaXMuZ2V0Qm9yZGVyUmFkaXVzV2lkZ2V0VG9wUmlnaHQgPVxuICAgICAgICB0aGlzLmdldEJvcmRlclJhZGl1c1dpZGdldC5waXBlKGZpbHRlcihtID0+IG0gIT0gbnVsbCksIG1hcChtID0+IG0hWzFdKSk7XG4gICAgdGhpcy5nZXRCb3JkZXJSYWRpdXNXaWRnZXRCb3R0b21SaWdodCA9XG4gICAgICAgIHRoaXMuZ2V0Qm9yZGVyUmFkaXVzV2lkZ2V0LnBpcGUoZmlsdGVyKG0gPT4gbSAhPSBudWxsKSwgbWFwKG0gPT4gbSFbMl0pKTtcbiAgICB0aGlzLmdldEJvcmRlclJhZGl1c1dpZGdldEJvdHRvbUxlZnQgPVxuICAgICAgICB0aGlzLmdldEJvcmRlclJhZGl1c1dpZGdldC5waXBlKGZpbHRlcihtID0+IG0gIT0gbnVsbCksIG1hcChtID0+IG0hWzNdKSk7XG5cbiAgICB0aGlzLmdldE1hcmdpbldpZGdldCA9IHRoaXMuX3NlcnZpY2UuY3VycmVudFdpZGdldC5waXBlKFxuICAgICAgICBtYXAoKG15T2JqOiBBamZXaWRnZXR8bnVsbCkgPT4ge1xuICAgICAgICAgIGlmIChteU9iaiAhPSBudWxsICYmIG15T2JqLnN0eWxlcyAhPSBudWxsICYmIG15T2JqLnN0eWxlc1snbWFyZ2luJ10gIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsbFB4TnVtYmVyQXJyYXkodGhpcy50b051bWJlckFycmF5KG15T2JqLnN0eWxlc1snbWFyZ2luJ10pKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIHN0YXJ0V2l0aChbMCwgMCwgMCwgMF0pKTtcbiAgICB0aGlzLmdldE1hcmdpbldpZGdldFRvcCA9IHRoaXMuZ2V0TWFyZ2luV2lkZ2V0LnBpcGUoZmlsdGVyKG0gPT4gbSAhPSBudWxsKSwgbWFwKG0gPT4gbSFbMF0pKTtcbiAgICB0aGlzLmdldE1hcmdpbldpZGdldFJpZ2h0ID0gdGhpcy5nZXRNYXJnaW5XaWRnZXQucGlwZShmaWx0ZXIobSA9PiBtICE9IG51bGwpLCBtYXAobSA9PiBtIVsxXSkpO1xuICAgIHRoaXMuZ2V0TWFyZ2luV2lkZ2V0Qm90dG9tID0gdGhpcy5nZXRNYXJnaW5XaWRnZXQucGlwZShmaWx0ZXIobSA9PiBtICE9IG51bGwpLCBtYXAobSA9PiBtIVsyXSkpO1xuICAgIHRoaXMuZ2V0TWFyZ2luV2lkZ2V0TGVmdCA9IHRoaXMuZ2V0TWFyZ2luV2lkZ2V0LnBpcGUoZmlsdGVyKG0gPT4gbSAhPSBudWxsKSwgbWFwKG0gPT4gbSFbM10pKTtcblxuICAgIHRoaXMuZ2V0UGFkZGluZ1dpZGdldCA9IHRoaXMuX3NlcnZpY2UuY3VycmVudFdpZGdldC5waXBlKFxuICAgICAgICBtYXAoKG15T2JqOiBBamZXaWRnZXR8bnVsbCkgPT4ge1xuICAgICAgICAgIGlmIChteU9iaiAhPSBudWxsICYmIG15T2JqLnN0eWxlcyAhPSBudWxsICYmIG15T2JqLnN0eWxlc1sncGFkZGluZyddICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbGxQeE51bWJlckFycmF5KHRoaXMudG9OdW1iZXJBcnJheShteU9iai5zdHlsZXNbJ3BhZGRpbmcnXSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9KSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG4gICAgdGhpcy5nZXRQYWRkaW5nV2lkZ2V0VG9wID0gdGhpcy5nZXRQYWRkaW5nV2lkZ2V0LnBpcGUoZmlsdGVyKG0gPT4gbSAhPSBudWxsKSwgbWFwKG0gPT4gbSFbMF0pKTtcbiAgICB0aGlzLmdldFBhZGRpbmdXaWRnZXRSaWdodCA9XG4gICAgICAgIHRoaXMuZ2V0UGFkZGluZ1dpZGdldC5waXBlKGZpbHRlcihtID0+IG0gIT0gbnVsbCksIG1hcChtID0+IG0hWzFdKSk7XG4gICAgdGhpcy5nZXRQYWRkaW5nV2lkZ2V0Qm90dG9tID1cbiAgICAgICAgdGhpcy5nZXRQYWRkaW5nV2lkZ2V0LnBpcGUoZmlsdGVyKG0gPT4gbSAhPSBudWxsKSwgbWFwKG0gPT4gbSFbMl0pKTtcbiAgICB0aGlzLmdldFBhZGRpbmdXaWRnZXRMZWZ0ID0gdGhpcy5nZXRQYWRkaW5nV2lkZ2V0LnBpcGUoZmlsdGVyKG0gPT4gbSAhPSBudWxsKSwgbWFwKG0gPT4gbSFbM10pKTtcblxuICAgIHRoaXMuZ2V0QmFja2dyb3VuZENvbG9yV2lkZ2V0ID0gdGhpcy5fc2VydmljZS5jdXJyZW50V2lkZ2V0LnBpcGUoXG4gICAgICAgIG1hcCgobXlPYmo6IEFqZldpZGdldHxudWxsKSA9PiB7XG4gICAgICAgICAgaWYgKG15T2JqICE9IG51bGwgJiYgbXlPYmouc3R5bGVzICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBteU9iai5zdHlsZXNbJ2JhY2tncm91bmRDb2xvciddIHx8ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xuXG4gICAgdGhpcy5nZXRDb2xvcldpZGdldCA9IHRoaXMuX3NlcnZpY2UuY3VycmVudFdpZGdldC5waXBlKFxuICAgICAgICBtYXAoKG15T2JqOiBBamZXaWRnZXR8bnVsbCkgPT4ge1xuICAgICAgICAgIGlmIChteU9iaiAhPSBudWxsICYmIG15T2JqLnN0eWxlcyAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbXlPYmouc3R5bGVzWydjb2xvciddIHx8ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xuXG4gICAgdGhpcy5fc3R5bGVzVXBkYXRlc1N1YnMgPSB0aGlzLl91cGRhdGVXaWRnZXRNYXJnaW5FdnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aExhdGVzdEZyb20odGhpcy5nZXRNYXJnaW5XaWRnZXQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZShyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaWR4ID0gclswXS5pZHg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJbMF0udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ID0gKHJbMV0gfHwgWzAsIDAsIDAsIDBdKSBhcyBudW1iZXJbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ID09IG51bGwgfHwgdi5sZW5ndGggPCBpZHgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdltpZHhdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFdpZGdldFN0eWxlcygnbWFyZ2luJywgdik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICB0aGlzLl9zdHlsZXNVcGRhdGVzU3Vicy5hZGQodGhpcy5fdXBkYXRlV2lkZ2V0UGFkZGluZ0V2dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aExhdGVzdEZyb20odGhpcy5nZXRQYWRkaW5nV2lkZ2V0KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKHIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAociA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkeCA9IHJbMF0uaWR4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJbMF0udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHYgPSAoclsxXSB8fCBbMCwgMCwgMCwgMF0pIGFzIG51bWJlcltdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodiA9PSBudWxsIHx8IHYubGVuZ3RoIDwgaWR4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZbaWR4XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFdpZGdldFN0eWxlcygncGFkZGluZycsIHYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuXG4gICAgdGhpcy5fc3R5bGVzVXBkYXRlc1N1YnMuYWRkKHRoaXMuX3VwZGF0ZVdpZGdldEJvcmRlcldpZHRoRXZ0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoTGF0ZXN0RnJvbSh0aGlzLmdldEJvcmRlcldpZHRoV2lkZ2V0KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKHIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAociA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkeCA9IHJbMF0uaWR4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJbMF0udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHYgPSAoclsxXSB8fCBbMCwgMCwgMCwgMF0pIGFzIG51bWJlcltdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodiA9PSBudWxsIHx8IHYubGVuZ3RoIDwgaWR4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZbaWR4XSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFdpZGdldFN0eWxlcygnYm9yZGVyLXdpZHRoJywgdik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICB0aGlzLl9zdHlsZXNVcGRhdGVzU3Vicy5hZGQodGhpcy5fdXBkYXRlV2lkZ2V0Qm9yZGVyUmFkaXVzRXZ0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoTGF0ZXN0RnJvbSh0aGlzLmdldEJvcmRlclJhZGl1c1dpZGdldCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZShyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpZHggPSByWzBdLmlkeDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSByWzBdLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ID0gKHJbMV0gfHwgWzAsIDAsIDAsIDBdKSBhcyBudW1iZXJbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgPT0gbnVsbCB8fCB2Lmxlbmd0aCA8IGlkeCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2W2lkeF0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRXaWRnZXRTdHlsZXMoJ2JvcmRlci1yYWRpdXMnLCB2KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IGFueSkge1xuICAgIHRoaXMuY3VycmVudFdpZGdldCA9IGNoYW5nZXMud2lkZ2V0LmN1cnJlbnRWYWx1ZTtcbiAgICBpZiAodGhpcy5jdXJyZW50V2lkZ2V0ID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy53aWRnZXROYW1lID0gQWpmV2lkZ2V0VHlwZVt0aGlzLmN1cnJlbnRXaWRnZXQud2lkZ2V0VHlwZV07XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9jdXJyZW50V2lkZ2V0U3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5fZm9ybXNTdWIudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9jb2xvclN1Yi51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX2hlYWRlclN0eWxlU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5fY29udGVudFN0eWxlc1N1Yi51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX2Zvb3RlclN0eWxlc1N1Yi51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX29yaWdpblN1Yi51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX3N0eWxlc1VwZGF0ZXNTdWJzLnVuc3Vic2NyaWJlKCk7XG4gIH1cbn1cbiIsIjxuZy10ZW1wbGF0ZSBbbmdJZl09XCJjdXJyZW50V2lkZ2V0ICE9IG51bGxcIj5cbiAgPGRpdiBjbGFzcz1cImFqZi1jb250ZW50XCI+XG4gICAgPGJ1dHRvblxuICAgICAgbWF0LWJ1dHRvblxuICAgICAgY2xhc3M9XCJhamYtaGlkZS1tZW51XCJcbiAgICAgIG1hdFRvb2x0aXA9XCJoaWRlLW1lbnVcIlxuICAgICAgKGNsaWNrKT1cImhpZGVNZW51KClcIlxuICAgICAgW21hdFRvb2x0aXBQb3NpdGlvbl09XCInYWJvdmUnXCJcbiAgICA+XG4gICAgICA8bWF0LWljb24+cmVtb3ZlX2NpcmNsZV9vdXRsaW5lPC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgICA8bWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAgY2xhc3M9XCJhamYtbWVudS1jc3NcIj5cbiAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZVxuICAgICAgICAoY2xpY2spPVwicmVwb3J0U3R5bGVzID0gIXJlcG9ydFN0eWxlczsgc2VjdGlvblN0eWxlcyA9IGZhbHNlOyB3aWRnZXRTdHlsZXMgPSBmYWxzZVwiXG4gICAgICAgIHZhbHVlPVwibGVmdFwiXG4gICAgICAgIFtuZ0NsYXNzXT1cInsnYWpmLXNlbGVjdGVkJzogcmVwb3J0U3R5bGVzfVwiXG4gICAgICA+XG4gICAgICAgIHJlcG9ydFxuICAgICAgICA8bmctY29udGFpbmVyPnt7J0NTUyBzdHlsZSd8dHJhbnNsb2NvfX08L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XG4gICAgICA8bWF0LWJ1dHRvbi10b2dnbGVcbiAgICAgICAgKGNsaWNrKT1cInNlY3Rpb25TdHlsZXMgPSAhc2VjdGlvblN0eWxlczsgcmVwb3J0U3R5bGVzID0gZmFsc2U7IHdpZGdldFN0eWxlcyA9IGZhbHNlXCJcbiAgICAgICAgW25nQ2xhc3NdPVwieydhamYtc2VsZWN0ZWQnOiBzZWN0aW9uU3R5bGVzfVwiXG4gICAgICA+XG4gICAgICAgIHt7IG9yaWdpbiB9fVxuICAgICAgICA8bmctY29udGFpbmVyPnt7J0NTUyBzdHlsZSd8dHJhbnNsb2NvfX08L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XG4gICAgICA8bWF0LWJ1dHRvbi10b2dnbGVcbiAgICAgICAgKGNsaWNrKT1cIndpZGdldFN0eWxlcyA9ICF3aWRnZXRTdHlsZXM7IHNlY3Rpb25TdHlsZXMgPSBmYWxzZTsgcmVwb3J0U3R5bGVzID0gZmFsc2VcIlxuICAgICAgICBbbmdDbGFzc109XCJ7J2FqZi1zZWxlY3RlZCc6IHdpZGdldFN0eWxlc31cIlxuICAgICAgPlxuICAgICAgICB7eyB3aWRnZXROYW1lIH19XG4gICAgICAgIDxuZy1jb250YWluZXI+e3snQ1NTIHN0eWxlJ3x0cmFuc2xvY299fTwvbmctY29udGFpbmVyPlxuICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cbiAgICA8L21hdC1idXR0b24tdG9nZ2xlLWdyb3VwPlxuICAgIDxkaXYgY2xhc3M9XCJhamYtc3R5bGUtY29udGFpbmVyXCIgKm5nSWY9XCIocmVwb3J0U3R5bGVzKSA/IHRydWUgOiBmYWxzZSBcIj5cbiAgICAgIDxtYXQtdGFiLWdyb3VwPlxuICAgICAgICA8bWF0LXRhYiBsYWJlbD1cIkJhY2tncm91bmQgQ29sb3JcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWpmLXN0eWxlLXBhbmVsXCI+XG4gICAgICAgICAgICA8YWpmLXRoZW1lLWNvbG9yXG4gICAgICAgICAgICAgIFtzZWN0aW9uXT1cIidyZXBvcnQnXCJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cIidjb2xvcidcIlxuICAgICAgICAgICAgPjwvYWpmLXRoZW1lLWNvbG9yPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L21hdC10YWI+XG4gICAgICA8L21hdC10YWItZ3JvdXA+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImFqZi1zdHlsZS1jb250YWluZXJcIiAqbmdJZj1cIihzZWN0aW9uU3R5bGVzKSA/IHRydWUgOiBmYWxzZSBcIj5cbiAgICAgIDxtYXQtdGFiLWdyb3VwPlxuICAgICAgICA8bWF0LXRhYiBsYWJlbD1cIkJhY2tncm91bmQgQ29sb3JcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWpmLXN0eWxlLXBhbmVsXCI+XG4gICAgICAgICAgICA8YWpmLXRoZW1lLWNvbG9yXG4gICAgICAgICAgICAgIFtzZWN0aW9uXT1cIidzZWN0aW9uJ1wiXG4gICAgICAgICAgICAgIFtsYWJlbF09XCInY29sb3InXCJcbiAgICAgICAgICAgID48L2FqZi10aGVtZS1jb2xvcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9tYXQtdGFiPlxuICAgICAgPC9tYXQtdGFiLWdyb3VwPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJhamYtc3R5bGUtY29udGFpbmVyXCIgKm5nSWY9XCIod2lkZ2V0U3R5bGVzKSA/IHRydWUgOiBmYWxzZSBcIj5cbiAgICAgIDxtYXQtdGFiLWdyb3VwICpuZ0lmPVwiKGN1cnJlbnRXaWRnZXQud2lkZ2V0VHlwZSAhPSA0KVwiPlxuICAgICAgICA8bWF0LXRhYiBsYWJlbD1cIkNvbG9yXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFqZi1zdHlsZS1wYW5lbFwiPlxuICAgICAgICAgICAgPGFqZi10aGVtZS1jb2xvclxuICAgICAgICAgICAgICBbc2VjdGlvbl09XCInd2lkZ2V0J1wiXG4gICAgICAgICAgICAgIFtsYWJlbF09XCInY29sb3InXCJcbiAgICAgICAgICAgICAgW2luaXRdPVwiJ2ljb24nXCJcbiAgICAgICAgICAgID48L2FqZi10aGVtZS1jb2xvcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9tYXQtdGFiPlxuICAgICAgICA8bWF0LXRhYiBsYWJlbD1cIkJhY2tncm91bmQgQ29sb3JcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWpmLXN0eWxlLXBhbmVsXCI+XG4gICAgICAgICAgICA8YWpmLXRoZW1lLWNvbG9yXG4gICAgICAgICAgICAgIFtzZWN0aW9uXT1cIid3aWRnZXQnXCJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cIidiYWNrZ3JvdW5kLWNvbG9yJ1wiXG4gICAgICAgICAgICA+PC9hamYtdGhlbWUtY29sb3I+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbWF0LXRhYj5cbiAgICAgIDwvbWF0LXRhYi1ncm91cD5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJwcm9wZXJ0aWVzLWNvbnRhaW5lclwiXG4gICAgICAgICpuZ0lmPVwiKGN1cnJlbnRXaWRnZXQud2lkZ2V0VHlwZSAhPT0gOClcIlxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYWpmLWxheW91dC1wcmV2aWV3XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFqZi12Ym90dG9tXCI+XG4gICAgICAgICAgICA8ZGl2Pnt7J2hlaWdodCd8dHJhbnNsb2NvfX08L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+e3sgZ2V0SGVpZ2h0V2lkZ2V0fGFzeW5jIH19PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFqZi1tYXJnaW4tYm94XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWpmLXRvcC1sYWJlbFwiPnt7J21hcmdpbid8dHJhbnNsb2NvfX08L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhamYtdnRvcFwiPnt7IGdldE1hcmdpbldpZGdldFRvcHxhc3luYyB9fTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFqZi12cmlnaHRcIj57eyBnZXRNYXJnaW5XaWRnZXRSaWdodHxhc3luYyB9fTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFqZi12Ym90dG9tXCI+e3sgZ2V0TWFyZ2luV2lkZ2V0Qm90dG9tfGFzeW5jIH19PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWpmLXZsZWZ0XCI+e3sgZ2V0TWFyZ2luV2lkZ2V0TGVmdHxhc3luYyB9fTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFqZi1ib3JkZXItYm94XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhamYtdnRvcFwiPnt7IGdldEJvcmRlcldpZHRoV2lkZ2V0VG9wfGFzeW5jIH19PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhamYtdnJpZ2h0XCI+XG4gICAgICAgICAgICAgICAge3sgZ2V0Qm9yZGVyV2lkdGhXaWRnZXRSaWdodHxhc3luYyB9fVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFqZi12Ym90dG9tXCI+XG4gICAgICAgICAgICAgICAge3sgZ2V0Qm9yZGVyV2lkdGhXaWRnZXRCb3R0b218YXN5bmMgfX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhamYtdmxlZnRcIj57eyBnZXRCb3JkZXJXaWR0aFdpZGdldExlZnR8YXN5bmMgfX08L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFqZi12dGxcIj5cbiAgICAgICAgICAgICAgICB7eyBnZXRCb3JkZXJSYWRpdXNXaWRnZXRUb3BMZWZ0fGFzeW5jIH19XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWpmLXZ0clwiPlxuICAgICAgICAgICAgICAgIHt7IGdldEJvcmRlclJhZGl1c1dpZGdldFRvcFJpZ2h0fGFzeW5jIH19XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWpmLXZiclwiPlxuICAgICAgICAgICAgICAgIHt7IGdldEJvcmRlclJhZGl1c1dpZGdldEJvdHRvbVJpZ2h0fGFzeW5jIH19XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWpmLXZibFwiPlxuICAgICAgICAgICAgICAgIHt7IGdldEJvcmRlclJhZGl1c1dpZGdldEJvdHRvbUxlZnR8YXN5bmMgfX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhamYtdG9wLWxhYmVsXCI+e3snYm9yZGVyJ3x0cmFuc2xvY299fTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWpmLXBhZGRpbmctYm94XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFqZi10b3AtbGFiZWxcIj57eydwYWRkaW5nJ3x0cmFuc2xvY299fTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhamYtdnRvcFwiPnt7IGdldFBhZGRpbmdXaWRnZXRUb3B8YXN5bmMgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWpmLXZyaWdodFwiPnt7IGdldFBhZGRpbmdXaWRnZXRSaWdodHxhc3luYyB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhamYtdmJvdHRvbVwiPlxuICAgICAgICAgICAgICAgICAge3sgZ2V0UGFkZGluZ1dpZGdldEJvdHRvbXxhc3luYyB9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhamYtdmxlZnRcIj57eyBnZXRQYWRkaW5nV2lkZ2V0TGVmdHxhc3luYyB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhamYtY29udGVudC1ib3hcIj57eydjb250ZW50J3x0cmFuc2xvY299fTwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPG1hdC1ncmlkLWxpc3Qgcm93SGVpZ2h0PVwiMmVtXCIgY29scz1cIjEyXCI+XG4gICAgICAgICAgPG1hdC1ncmlkLXRpbGU+PC9tYXQtZ3JpZC10aWxlPlxuICAgICAgICAgIDxtYXQtZ3JpZC10aWxlIGNsYXNzPVwiYWpmLWxhbFwiIGNvbHNwYW49XCI0XCI+XG4gICAgICAgICAgICA8c3Bhbj57eydoZWlnaHQnfHRyYW5zbG9jb319PC9zcGFuPlxuICAgICAgICAgIDwvbWF0LWdyaWQtdGlsZT5cbiAgICAgICAgICA8bWF0LWdyaWQtdGlsZSBjb2xzcGFuPVwiN1wiPlxuICAgICAgICAgICAgPG1hdC1zbGlkZXJcbiAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzZXRXaWRnZXRTdHlsZXMoJ2hlaWdodCcsICRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICAgICBtaW49XCIwXCJcbiAgICAgICAgICAgICAgbWF4PVwiMjAwXCJcbiAgICAgICAgICAgICAgc3RlcD1cIjFcIlxuICAgICAgICAgICAgICBbdmFsdWVdPVwiZ2V0SGVpZ2h0V2lkZ2V0fGFzeW5jXCJcbiAgICAgICAgICAgICAgdGlja0ludGVydmFsPVwiMVwiXG4gICAgICAgICAgICAgIHRodW1iTGFiZWxcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvbWF0LXNsaWRlcj5cbiAgICAgICAgICA8L21hdC1ncmlkLXRpbGU+XG4gICAgICAgIDwvbWF0LWdyaWQtbGlzdD5cbiAgICAgICAgPG1hdC1ncmlkLWxpc3QgY29scz1cIjEyXCI+XG4gICAgICAgICAgPG1hdC1ncmlkLXRpbGU+XG4gICAgICAgICAgICA8bWF0LWljb25cbiAgICAgICAgICAgICAgKm5nSWY9XCIhbWFyZ2luRXhwYW5kZWRcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwibWFyZ2luRXhwYW5kZWQgPSAhbWFyZ2luRXhwYW5kZWRcIlxuICAgICAgICAgICAgICA+a2V5Ym9hcmRfYXJyb3dfcmlnaHQ8L21hdC1pY29uXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8bWF0LWljb25cbiAgICAgICAgICAgICAgKm5nSWY9XCJtYXJnaW5FeHBhbmRlZFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJtYXJnaW5FeHBhbmRlZCA9ICFtYXJnaW5FeHBhbmRlZFwiXG4gICAgICAgICAgICAgID5rZXlib2FyZF9hcnJvd19kb3duPC9tYXQtaWNvblxuICAgICAgICAgICAgPlxuICAgICAgICAgIDwvbWF0LWdyaWQtdGlsZT5cbiAgICAgICAgICA8bWF0LWdyaWQtdGlsZSBjbGFzcz1cImFqZi1sYWxcIiBjb2xzcGFuPVwiNFwiPlxuICAgICAgICAgICAgPHNwYW4+e3snbWFyZ2luJ3x0cmFuc2xvY299fTwvc3Bhbj5cbiAgICAgICAgICA8L21hdC1ncmlkLXRpbGU+XG4gICAgICAgICAgPG1hdC1ncmlkLXRpbGUgY29sc3Bhbj1cIjdcIj5cbiAgICAgICAgICAgIDxtYXQtc2xpZGVyXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtYXJnaW5FeHBhbmRlZFwiXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0V2lkZ2V0U3R5bGVzKCdtYXJnaW4nLCAkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgICAgICAgbWluPVwiLTUwXCJcbiAgICAgICAgICAgICAgbWF4PVwiNTBcIlxuICAgICAgICAgICAgICBzdGVwPVwiMVwiXG4gICAgICAgICAgICAgIFt2YWx1ZV09XCJnZXRNYXJnaW5XaWRnZXRUb3B8YXN5bmNcIlxuICAgICAgICAgICAgICB0aWNrSW50ZXJ2YWw9XCJhdXRvXCJcbiAgICAgICAgICAgICAgdGh1bWJMYWJlbFxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9tYXQtc2xpZGVyPlxuICAgICAgICAgIDwvbWF0LWdyaWQtdGlsZT5cbiAgICAgICAgPC9tYXQtZ3JpZC1saXN0PlxuICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwibWFyZ2luRXhwYW5kZWRcIj5cbiAgICAgICAgICA8bWF0LWdyaWQtbGlzdCBjb2xzPVwiMTJcIj5cbiAgICAgICAgICAgIDxtYXQtZ3JpZC10aWxlPjwvbWF0LWdyaWQtdGlsZT5cbiAgICAgICAgICAgIDxtYXQtZ3JpZC10aWxlIGNsYXNzPVwiYWpmLWxhbFwiIGNvbHNwYW49XCI0XCI+XG4gICAgICAgICAgICAgICZuYnNwOyZuYnNwOzxzcGFuPnt7J21hcmdpbiB0b3AnfHRyYW5zbG9jb319PC9zcGFuPlxuICAgICAgICAgICAgPC9tYXQtZ3JpZC10aWxlPlxuICAgICAgICAgICAgPG1hdC1ncmlkLXRpbGUgY29sc3Bhbj1cIjdcIj5cbiAgICAgICAgICAgICAgPG1hdC1zbGlkZXJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldFdpZGdldE1hcmdpbigwLCAkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgICAgICAgICBtaW49XCItNTBcIlxuICAgICAgICAgICAgICAgIG1heD1cIjUwXCJcbiAgICAgICAgICAgICAgICBzdGVwPVwiMVwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImdldE1hcmdpbldpZGdldFRvcHxhc3luY1wiXG4gICAgICAgICAgICAgICAgdGlja0ludGVydmFsPVwiYXV0b1wiXG4gICAgICAgICAgICAgICAgdGh1bWJMYWJlbFxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDwvbWF0LXNsaWRlcj5cbiAgICAgICAgICAgIDwvbWF0LWdyaWQtdGlsZT5cbiAgICAgICAgICA8L21hdC1ncmlkLWxpc3Q+XG4gICAgICAgICAgPG1hdC1ncmlkLWxpc3QgY29scz1cIjEyXCI+XG4gICAgICAgICAgICA8bWF0LWdyaWQtdGlsZT48L21hdC1ncmlkLXRpbGU+XG4gICAgICAgICAgICA8bWF0LWdyaWQtdGlsZSBjbGFzcz1cImFqZi1sYWxcIiBjb2xzcGFuPVwiNFwiPlxuICAgICAgICAgICAgICAmbmJzcDsmbmJzcDs8c3Bhbj57eydtYXJnaW4gcmlnaHQnfHRyYW5zbG9jb319PC9zcGFuPlxuICAgICAgICAgICAgPC9tYXQtZ3JpZC10aWxlPlxuICAgICAgICAgICAgPG1hdC1ncmlkLXRpbGUgY29sc3Bhbj1cIjdcIj5cbiAgICAgICAgICAgICAgPG1hdC1zbGlkZXJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldFdpZGdldE1hcmdpbigxLCAkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgICAgICAgICBtaW49XCItNTBcIlxuICAgICAgICAgICAgICAgIG1heD1cIjUwXCJcbiAgICAgICAgICAgICAgICBzdGVwPVwiMVwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImdldE1hcmdpbldpZGdldFJpZ2h0fGFzeW5jXCJcbiAgICAgICAgICAgICAgICB0aWNrSW50ZXJ2YWw9XCJhdXRvXCJcbiAgICAgICAgICAgICAgICB0aHVtYkxhYmVsXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPC9tYXQtc2xpZGVyPlxuICAgICAgICAgICAgPC9tYXQtZ3JpZC10aWxlPlxuICAgICAgICAgIDwvbWF0LWdyaWQtbGlzdD5cbiAgICAgICAgICA8bWF0LWdyaWQtbGlzdCBjb2xzPVwiMTJcIj5cbiAgICAgICAgICAgIDxtYXQtZ3JpZC10aWxlPjwvbWF0LWdyaWQtdGlsZT5cbiAgICAgICAgICAgIDxtYXQtZ3JpZC10aWxlIGNsYXNzPVwiYWpmLWxhbFwiIGNvbHNwYW49XCI0XCI+XG4gICAgICAgICAgICAgICZuYnNwOyZuYnNwOzxzcGFuPnt7J21hcmdpbiBib3R0b20nfHRyYW5zbG9jb319PC9zcGFuPlxuICAgICAgICAgICAgPC9tYXQtZ3JpZC10aWxlPlxuICAgICAgICAgICAgPG1hdC1ncmlkLXRpbGUgY29sc3Bhbj1cIjdcIj5cbiAgICAgICAgICAgICAgPG1hdC1zbGlkZXJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldFdpZGdldE1hcmdpbigyLCAkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgICAgICAgICBtaW49XCItNTBcIlxuICAgICAgICAgICAgICAgIG1heD1cIjUwXCJcbiAgICAgICAgICAgICAgICBzdGVwPVwiMVwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImdldE1hcmdpbldpZGdldEJvdHRvbXxhc3luY1wiXG4gICAgICAgICAgICAgICAgdGlja0ludGVydmFsPVwiYXV0b1wiXG4gICAgICAgICAgICAgICAgdGh1bWJMYWJlbFxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDwvbWF0LXNsaWRlcj5cbiAgICAgICAgICAgIDwvbWF0LWdyaWQtdGlsZT5cbiAgICAgICAgICA8L21hdC1ncmlkLWxpc3Q+XG4gICAgICAgICAgPG1hdC1ncmlkLWxpc3QgY29scz1cIjEyXCI+XG4gICAgICAgICAgICA8bWF0LWdyaWQtdGlsZT48L21hdC1ncmlkLXRpbGU+XG4gICAgICAgICAgICA8bWF0LWdyaWQtdGlsZSBjbGFzcz1cImFqZi1sYWxcIiBjb2xzcGFuPVwiNFwiPlxuICAgICAgICAgICAgICAmbmJzcDsmbmJzcDs8c3Bhbj57eydtYXJnaW4gbGVmdCd8dHJhbnNsb2NvfX08L3NwYW4+XG4gICAgICAgICAgICA8L21hdC1ncmlkLXRpbGU+XG4gICAgICAgICAgICA8bWF0LWdyaWQtdGlsZSBjb2xzcGFuPVwiN1wiPlxuICAgICAgICAgICAgICA8bWF0LXNsaWRlclxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0V2lkZ2V0TWFyZ2luKDMsICRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICAgICAgIG1pbj1cIi01MFwiXG4gICAgICAgICAgICAgICAgbWF4PVwiNTBcIlxuICAgICAgICAgICAgICAgIHN0ZXA9XCIxXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZ2V0TWFyZ2luV2lkZ2V0TGVmdHxhc3luY1wiXG4gICAgICAgICAgICAgICAgdGlja0ludGVydmFsPVwiYXV0b1wiXG4gICAgICAgICAgICAgICAgdGh1bWJMYWJlbFxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDwvbWF0LXNsaWRlcj5cbiAgICAgICAgICAgIDwvbWF0LWdyaWQtdGlsZT5cbiAgICAgICAgICA8L21hdC1ncmlkLWxpc3Q+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxtYXQtZ3JpZC1saXN0IGNvbHM9XCIxMlwiPlxuICAgICAgICAgIDxtYXQtZ3JpZC10aWxlPlxuICAgICAgICAgICAgPG1hdC1pY29uXG4gICAgICAgICAgICAgICpuZ0lmPVwiIXBhZGRpbmdFeHBhbmRlZFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJwYWRkaW5nRXhwYW5kZWQgPSAhcGFkZGluZ0V4cGFuZGVkXCJcbiAgICAgICAgICAgICAgPmtleWJvYXJkX2Fycm93X3JpZ2h0PC9tYXQtaWNvblxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPG1hdC1pY29uXG4gICAgICAgICAgICAgICpuZ0lmPVwicGFkZGluZ0V4cGFuZGVkXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInBhZGRpbmdFeHBhbmRlZCA9ICFwYWRkaW5nRXhwYW5kZWRcIlxuICAgICAgICAgICAgICA+a2V5Ym9hcmRfYXJyb3dfZG93bjwvbWF0LWljb25cbiAgICAgICAgICAgID5cbiAgICAgICAgICA8L21hdC1ncmlkLXRpbGU+XG4gICAgICAgICAgPG1hdC1ncmlkLXRpbGUgY2xhc3M9XCJhamYtbGFsXCIgY29sc3Bhbj1cIjRcIj5cbiAgICAgICAgICAgIDxzcGFuPnt7J3BhZGRpbmcnfHRyYW5zbG9jb319PC9zcGFuPlxuICAgICAgICAgIDwvbWF0LWdyaWQtdGlsZT5cbiAgICAgICAgICA8bWF0LWdyaWQtdGlsZSBjb2xzcGFuPVwiN1wiPlxuICAgICAgICAgICAgPG1hdC1zbGlkZXJcbiAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzZXRXaWRnZXRTdHlsZXMoJ3BhZGRpbmcnLCAkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgICAgICAgbWluPVwiLTUwXCJcbiAgICAgICAgICAgICAgbWF4PVwiNTBcIlxuICAgICAgICAgICAgICBzdGVwPVwiMVwiXG4gICAgICAgICAgICAgIFt2YWx1ZV09XCJnZXRQYWRkaW5nV2lkZ2V0VG9wfGFzeW5jXCJcbiAgICAgICAgICAgICAgdGlja0ludGVydmFsPVwiYXV0b1wiXG4gICAgICAgICAgICAgIHRodW1iTGFiZWxcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvbWF0LXNsaWRlcj5cbiAgICAgICAgICA8L21hdC1ncmlkLXRpbGU+XG4gICAgICAgIDwvbWF0LWdyaWQtbGlzdD5cbiAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cInBhZGRpbmdFeHBhbmRlZFwiPlxuICAgICAgICAgIDxtYXQtZ3JpZC1saXN0IGNvbHM9XCIxMlwiPlxuICAgICAgICAgICAgPG1hdC1ncmlkLXRpbGU+PC9tYXQtZ3JpZC10aWxlPlxuICAgICAgICAgICAgPG1hdC1ncmlkLXRpbGUgY2xhc3M9XCJhamYtbGFsXCIgY29sc3Bhbj1cIjRcIj5cbiAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7PHNwYW4+e3sncGFkZGluZyB0b3AnfHRyYW5zbG9jb319PC9zcGFuPlxuICAgICAgICAgICAgPC9tYXQtZ3JpZC10aWxlPlxuICAgICAgICAgICAgPG1hdC1ncmlkLXRpbGUgY29sc3Bhbj1cIjdcIj5cbiAgICAgICAgICAgICAgPG1hdC1zbGlkZXJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldFdpZGdldFBhZGRpbmcoMCwgJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgbWluPVwiLTUwXCJcbiAgICAgICAgICAgICAgICBtYXg9XCI1MFwiXG4gICAgICAgICAgICAgICAgc3RlcD1cIjFcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJnZXRQYWRkaW5nV2lkZ2V0VG9wfGFzeW5jXCJcbiAgICAgICAgICAgICAgICB0aWNrSW50ZXJ2YWw9XCJhdXRvXCJcbiAgICAgICAgICAgICAgICB0aHVtYkxhYmVsXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPC9tYXQtc2xpZGVyPlxuICAgICAgICAgICAgPC9tYXQtZ3JpZC10aWxlPlxuICAgICAgICAgIDwvbWF0LWdyaWQtbGlzdD5cbiAgICAgICAgICA8bWF0LWdyaWQtbGlzdCBjb2xzPVwiMTJcIj5cbiAgICAgICAgICAgIDxtYXQtZ3JpZC10aWxlPjwvbWF0LWdyaWQtdGlsZT5cbiAgICAgICAgICAgIDxtYXQtZ3JpZC10aWxlIGNsYXNzPVwiYWpmLWxhbFwiIGNvbHNwYW49XCI0XCI+XG4gICAgICAgICAgICAgICZuYnNwOyZuYnNwOzxzcGFuPnt7J3BhZGRpbmcgcmlnaHQnfHRyYW5zbG9jb319PC9zcGFuPlxuICAgICAgICAgICAgPC9tYXQtZ3JpZC10aWxlPlxuICAgICAgICAgICAgPG1hdC1ncmlkLXRpbGUgY29sc3Bhbj1cIjdcIj5cbiAgICAgICAgICAgICAgPG1hdC1zbGlkZXJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldFdpZGdldFBhZGRpbmcoMSwgJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgbWluPVwiLTUwXCJcbiAgICAgICAgICAgICAgICBtYXg9XCI1MFwiXG4gICAgICAgICAgICAgICAgc3RlcD1cIjFcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJnZXRQYWRkaW5nV2lkZ2V0UmlnaHR8YXN5bmNcIlxuICAgICAgICAgICAgICAgIHRpY2tJbnRlcnZhbD1cImF1dG9cIlxuICAgICAgICAgICAgICAgIHRodW1iTGFiZWxcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8L21hdC1zbGlkZXI+XG4gICAgICAgICAgICA8L21hdC1ncmlkLXRpbGU+XG4gICAgICAgICAgPC9tYXQtZ3JpZC1saXN0PlxuICAgICAgICAgIDxtYXQtZ3JpZC1saXN0IGNvbHM9XCIxMlwiPlxuICAgICAgICAgICAgPG1hdC1ncmlkLXRpbGU+PC9tYXQtZ3JpZC10aWxlPlxuICAgICAgICAgICAgPG1hdC1ncmlkLXRpbGUgY2xhc3M9XCJhamYtbGFsXCIgY29sc3Bhbj1cIjRcIj5cbiAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7PHNwYW4+e3sncGFkZGluZyBib3R0b20nfHRyYW5zbG9jb319PC9zcGFuPlxuICAgICAgICAgICAgPC9tYXQtZ3JpZC10aWxlPlxuICAgICAgICAgICAgPG1hdC1ncmlkLXRpbGUgY29sc3Bhbj1cIjdcIj5cbiAgICAgICAgICAgICAgPG1hdC1zbGlkZXJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldFdpZGdldFBhZGRpbmcoMiwgJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgbWluPVwiLTUwXCJcbiAgICAgICAgICAgICAgICBtYXg9XCI1MFwiXG4gICAgICAgICAgICAgICAgc3RlcD1cIjFcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJnZXRQYWRkaW5nV2lkZ2V0Qm90dG9tfGFzeW5jXCJcbiAgICAgICAgICAgICAgICB0aWNrSW50ZXJ2YWw9XCJhdXRvXCJcbiAgICAgICAgICAgICAgICB0aHVtYkxhYmVsXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPC9tYXQtc2xpZGVyPlxuICAgICAgICAgICAgPC9tYXQtZ3JpZC10aWxlPlxuICAgICAgICAgIDwvbWF0LWdyaWQtbGlzdD5cbiAgICAgICAgICA8bWF0LWdyaWQtbGlzdCBjb2xzPVwiMTJcIj5cbiAgICAgICAgICAgIDxtYXQtZ3JpZC10aWxlPjwvbWF0LWdyaWQtdGlsZT5cbiAgICAgICAgICAgIDxtYXQtZ3JpZC10aWxlIGNsYXNzPVwiYWpmLWxhbFwiIGNvbHNwYW49XCI0XCI+XG4gICAgICAgICAgICAgICZuYnNwOyZuYnNwOzxzcGFuPnt7J3BhZGRpbmcgbGVmdCd8dHJhbnNsb2NvfX08L3NwYW4+XG4gICAgICAgICAgICA8L21hdC1ncmlkLXRpbGU+XG4gICAgICAgICAgICA8bWF0LWdyaWQtdGlsZSBjb2xzcGFuPVwiN1wiPlxuICAgICAgICAgICAgICA8bWF0LXNsaWRlclxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0V2lkZ2V0UGFkZGluZygzLCAkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgICAgICAgICBtaW49XCItNTBcIlxuICAgICAgICAgICAgICAgIG1heD1cIjUwXCJcbiAgICAgICAgICAgICAgICBzdGVwPVwiMVwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImdldFBhZGRpbmdXaWRnZXRMZWZ0fGFzeW5jXCJcbiAgICAgICAgICAgICAgICB0aWNrSW50ZXJ2YWw9XCJhdXRvXCJcbiAgICAgICAgICAgICAgICB0aHVtYkxhYmVsXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPC9tYXQtc2xpZGVyPlxuICAgICAgICAgICAgPC9tYXQtZ3JpZC10aWxlPlxuICAgICAgICAgIDwvbWF0LWdyaWQtbGlzdD5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPG1hdC1ncmlkLWxpc3QgY29scz1cIjEyXCI+XG4gICAgICAgICAgPG1hdC1ncmlkLXRpbGU+XG4gICAgICAgICAgICA8bWF0LWljb25cbiAgICAgICAgICAgICAgKm5nSWY9XCIhYm9yZGVyV2lkdGhFeHBhbmRlZFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJib3JkZXJXaWR0aEV4cGFuZGVkID0gIWJvcmRlcldpZHRoRXhwYW5kZWRcIlxuICAgICAgICAgICAgICA+a2V5Ym9hcmRfYXJyb3dfcmlnaHQ8L21hdC1pY29uXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8bWF0LWljb25cbiAgICAgICAgICAgICAgKm5nSWY9XCJib3JkZXJXaWR0aEV4cGFuZGVkXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImJvcmRlcldpZHRoRXhwYW5kZWQgPSAhYm9yZGVyV2lkdGhFeHBhbmRlZFwiXG4gICAgICAgICAgICAgID5rZXlib2FyZF9hcnJvd19kb3duPC9tYXQtaWNvblxuICAgICAgICAgICAgPlxuICAgICAgICAgIDwvbWF0LWdyaWQtdGlsZT5cbiAgICAgICAgICA8bWF0LWdyaWQtdGlsZSBjbGFzcz1cImFqZi1sYWxcIiBjb2xzcGFuPVwiNFwiPlxuICAgICAgICAgICAgPHNwYW4+e3snYm9yZGVyIHdpZHRoJ3x0cmFuc2xvY299fTwvc3Bhbj5cbiAgICAgICAgICA8L21hdC1ncmlkLXRpbGU+XG4gICAgICAgICAgPG1hdC1ncmlkLXRpbGUgY29sc3Bhbj1cIjdcIj5cbiAgICAgICAgICAgIDxtYXQtc2xpZGVyXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0V2lkZ2V0U3R5bGVzKCdib3JkZXItd2lkdGgnLCAkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgICAgICAgbWluPVwiMFwiXG4gICAgICAgICAgICAgIG1heD1cIjEwXCJcbiAgICAgICAgICAgICAgc3RlcD1cIjFcIlxuICAgICAgICAgICAgICBbdmFsdWVdPVwiZ2V0Qm9yZGVyV2lkdGhXaWRnZXRUb3B8YXN5bmNcIlxuICAgICAgICAgICAgICB0aWNrSW50ZXJ2YWw9XCIxXCJcbiAgICAgICAgICAgICAgdGh1bWJMYWJlbFxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9tYXQtc2xpZGVyPlxuICAgICAgICAgIDwvbWF0LWdyaWQtdGlsZT5cbiAgICAgICAgPC9tYXQtZ3JpZC1saXN0PlxuICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiYm9yZGVyV2lkdGhFeHBhbmRlZFwiPlxuICAgICAgICAgIDxtYXQtZ3JpZC1saXN0IGNvbHM9XCIxMlwiPlxuICAgICAgICAgICAgPG1hdC1ncmlkLXRpbGU+PC9tYXQtZ3JpZC10aWxlPlxuICAgICAgICAgICAgPG1hdC1ncmlkLXRpbGUgY2xhc3M9XCJhamYtbGFsXCIgY29sc3Bhbj1cIjRcIj5cbiAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7PHNwYW4+e3snYm9yZGVyIHdpZHRoIHRvcCd8dHJhbnNsb2NvfX08L3NwYW4+XG4gICAgICAgICAgICA8L21hdC1ncmlkLXRpbGU+XG4gICAgICAgICAgICA8bWF0LWdyaWQtdGlsZSBjb2xzcGFuPVwiN1wiPlxuICAgICAgICAgICAgICA8bWF0LXNsaWRlclxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0V2lkZ2V0Qm9yZGVyV2lkdGgoMCwgJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgbWluPVwiMVwiXG4gICAgICAgICAgICAgICAgbWF4PVwiMTBcIlxuICAgICAgICAgICAgICAgIHN0ZXA9XCIxXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZ2V0Qm9yZGVyV2lkdGhXaWRnZXRUb3B8YXN5bmNcIlxuICAgICAgICAgICAgICAgIHRpY2tJbnRlcnZhbD1cImF1dG9cIlxuICAgICAgICAgICAgICAgIHRodW1iTGFiZWxcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8L21hdC1zbGlkZXI+XG4gICAgICAgICAgICA8L21hdC1ncmlkLXRpbGU+XG4gICAgICAgICAgPC9tYXQtZ3JpZC1saXN0PlxuICAgICAgICAgIDxtYXQtZ3JpZC1saXN0IGNvbHM9XCIxMlwiPlxuICAgICAgICAgICAgPG1hdC1ncmlkLXRpbGU+PC9tYXQtZ3JpZC10aWxlPlxuICAgICAgICAgICAgPG1hdC1ncmlkLXRpbGUgY2xhc3M9XCJhamYtbGFsXCIgY29sc3Bhbj1cIjRcIj5cbiAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7PHNwYW4+e3snYm9yZGVyIHdpZHRoIHJpZ2h0J3x0cmFuc2xvY299fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvbWF0LWdyaWQtdGlsZT5cbiAgICAgICAgICAgIDxtYXQtZ3JpZC10aWxlIGNvbHNwYW49XCI3XCI+XG4gICAgICAgICAgICAgIDxtYXQtc2xpZGVyXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzZXRXaWRnZXRCb3JkZXJXaWR0aCgxLCAkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgICAgICAgICBtaW49XCIxXCJcbiAgICAgICAgICAgICAgICBtYXg9XCIxMFwiXG4gICAgICAgICAgICAgICAgc3RlcD1cIjFcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJnZXRCb3JkZXJXaWR0aFdpZGdldFJpZ2h0fGFzeW5jXCJcbiAgICAgICAgICAgICAgICB0aWNrSW50ZXJ2YWw9XCJhdXRvXCJcbiAgICAgICAgICAgICAgICB0aHVtYkxhYmVsXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPC9tYXQtc2xpZGVyPlxuICAgICAgICAgICAgPC9tYXQtZ3JpZC10aWxlPlxuICAgICAgICAgIDwvbWF0LWdyaWQtbGlzdD5cbiAgICAgICAgICA8bWF0LWdyaWQtbGlzdCBjb2xzPVwiMTJcIj5cbiAgICAgICAgICAgIDxtYXQtZ3JpZC10aWxlPjwvbWF0LWdyaWQtdGlsZT5cbiAgICAgICAgICAgIDxtYXQtZ3JpZC10aWxlIGNsYXNzPVwiYWpmLWxhbFwiIGNvbHNwYW49XCI0XCI+XG4gICAgICAgICAgICAgICZuYnNwOyZuYnNwOzxzcGFuPnt7J2JvcmRlciB3aWR0aCBib3R0b20nfHRyYW5zbG9jb319PC9zcGFuPlxuICAgICAgICAgICAgPC9tYXQtZ3JpZC10aWxlPlxuICAgICAgICAgICAgPG1hdC1ncmlkLXRpbGUgY29sc3Bhbj1cIjdcIj5cbiAgICAgICAgICAgICAgPG1hdC1zbGlkZXJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldFdpZGdldEJvcmRlcldpZHRoKDIsICRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICAgICAgIG1pbj1cIjFcIlxuICAgICAgICAgICAgICAgIG1heD1cIjEwXCJcbiAgICAgICAgICAgICAgICBzdGVwPVwiMVwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImdldEJvcmRlcldpZHRoV2lkZ2V0Qm90dG9tfGFzeW5jXCJcbiAgICAgICAgICAgICAgICB0aWNrSW50ZXJ2YWw9XCJhdXRvXCJcbiAgICAgICAgICAgICAgICB0aHVtYkxhYmVsXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPC9tYXQtc2xpZGVyPlxuICAgICAgICAgICAgPC9tYXQtZ3JpZC10aWxlPlxuICAgICAgICAgIDwvbWF0LWdyaWQtbGlzdD5cbiAgICAgICAgICA8bWF0LWdyaWQtbGlzdCBjb2xzPVwiMTJcIj5cbiAgICAgICAgICAgIDxtYXQtZ3JpZC10aWxlPjwvbWF0LWdyaWQtdGlsZT5cbiAgICAgICAgICAgIDxtYXQtZ3JpZC10aWxlIGNsYXNzPVwiYWpmLWxhbFwiIGNvbHNwYW49XCI0XCI+XG4gICAgICAgICAgICAgICZuYnNwOyZuYnNwOzxzcGFuPnt7J2JvcmRlciB3aWR0aCBsZWZ0J3x0cmFuc2xvY299fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvbWF0LWdyaWQtdGlsZT5cbiAgICAgICAgICAgIDxtYXQtZ3JpZC10aWxlIGNvbHNwYW49XCI3XCI+XG4gICAgICAgICAgICAgIDxtYXQtc2xpZGVyXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzZXRXaWRnZXRCb3JkZXJXaWR0aCgzLCAkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgICAgICAgICBtaW49XCIxXCJcbiAgICAgICAgICAgICAgICBtYXg9XCIxMFwiXG4gICAgICAgICAgICAgICAgc3RlcD1cIjFcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJnZXRCb3JkZXJXaWR0aFdpZGdldExlZnR8YXN5bmNcIlxuICAgICAgICAgICAgICAgIHRpY2tJbnRlcnZhbD1cImF1dG9cIlxuICAgICAgICAgICAgICAgIHRodW1iTGFiZWxcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8L21hdC1zbGlkZXI+XG4gICAgICAgICAgICA8L21hdC1ncmlkLXRpbGU+XG4gICAgICAgICAgPC9tYXQtZ3JpZC1saXN0PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8bWF0LWdyaWQtbGlzdCBjb2xzPVwiMTJcIj5cbiAgICAgICAgICA8bWF0LWdyaWQtdGlsZT5cbiAgICAgICAgICAgIDxtYXQtaWNvblxuICAgICAgICAgICAgICAqbmdJZj1cIiFib3JkZXJSYWRpdXNFeHBhbmRlZFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJib3JkZXJSYWRpdXNFeHBhbmRlZCA9ICFib3JkZXJSYWRpdXNFeHBhbmRlZFwiXG4gICAgICAgICAgICAgID5rZXlib2FyZF9hcnJvd19yaWdodDwvbWF0LWljb25cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDxtYXQtaWNvblxuICAgICAgICAgICAgICAqbmdJZj1cImJvcmRlclJhZGl1c0V4cGFuZGVkXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImJvcmRlclJhZGl1c0V4cGFuZGVkID0gIWJvcmRlclJhZGl1c0V4cGFuZGVkXCJcbiAgICAgICAgICAgICAgPmtleWJvYXJkX2Fycm93X2Rvd248L21hdC1pY29uXG4gICAgICAgICAgICA+XG4gICAgICAgICAgPC9tYXQtZ3JpZC10aWxlPlxuICAgICAgICAgIDxtYXQtZ3JpZC10aWxlIGNsYXNzPVwiYWpmLWxhbFwiIGNvbHNwYW49XCI0XCI+XG4gICAgICAgICAgICA8c3Bhbj57eydib3JkZXIgcmFkaXVzJ3x0cmFuc2xvY299fTwvc3Bhbj5cbiAgICAgICAgICA8L21hdC1ncmlkLXRpbGU+XG4gICAgICAgICAgPG1hdC1ncmlkLXRpbGUgY29sc3Bhbj1cIjdcIj5cbiAgICAgICAgICAgIDxtYXQtc2xpZGVyXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0V2lkZ2V0U3R5bGVzKCdib3JkZXItcmFkaXVzJywgJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICAgIG1pbj1cIjBcIlxuICAgICAgICAgICAgICBtYXg9XCIxMDBcIlxuICAgICAgICAgICAgICBzdGVwPVwiMVwiXG4gICAgICAgICAgICAgIHRpY2tJbnRlcnZhbD1cIjEwXCJcbiAgICAgICAgICAgICAgdGh1bWJMYWJlbFxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9tYXQtc2xpZGVyPlxuICAgICAgICAgIDwvbWF0LWdyaWQtdGlsZT5cbiAgICAgICAgPC9tYXQtZ3JpZC1saXN0PlxuICAgICAgICA8bmctdGVtcGxhdGUgW25nSWZdPVwiYm9yZGVyUmFkaXVzRXhwYW5kZWRcIj5cbiAgICAgICAgICA8bWF0LWdyaWQtbGlzdCBjb2xzPVwiMTJcIj5cbiAgICAgICAgICAgIDxtYXQtZ3JpZC10aWxlPjwvbWF0LWdyaWQtdGlsZT5cbiAgICAgICAgICAgIDxtYXQtZ3JpZC10aWxlIGNsYXNzPVwiYWpmLWxhbFwiIGNvbHNwYW49XCI0XCI+XG4gICAgICAgICAgICAgICZuYnNwOyZuYnNwOzxzcGFuPnt7J2JvcmRlciByYWRpdXMgdG9wIGxlZnQnfHRyYW5zbG9jb319PC9zcGFuPlxuICAgICAgICAgICAgPC9tYXQtZ3JpZC10aWxlPlxuICAgICAgICAgICAgPG1hdC1ncmlkLXRpbGUgY29sc3Bhbj1cIjdcIj5cbiAgICAgICAgICAgICAgPG1hdC1zbGlkZXJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInNldFdpZGdldEJvcmRlclJhZGl1cygwLCAkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgICAgICAgICBtaW49XCIxXCJcbiAgICAgICAgICAgICAgICBtYXg9XCIxMDBcIlxuICAgICAgICAgICAgICAgIHN0ZXA9XCIxXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZ2V0Qm9yZGVyUmFkaXVzV2lkZ2V0VG9wTGVmdHxhc3luY1wiXG4gICAgICAgICAgICAgICAgdGlja0ludGVydmFsPVwiYXV0b1wiXG4gICAgICAgICAgICAgICAgdGh1bWJMYWJlbFxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDwvbWF0LXNsaWRlcj5cbiAgICAgICAgICAgIDwvbWF0LWdyaWQtdGlsZT5cbiAgICAgICAgICA8L21hdC1ncmlkLWxpc3Q+XG4gICAgICAgICAgPG1hdC1ncmlkLWxpc3QgY29scz1cIjEyXCI+XG4gICAgICAgICAgICA8bWF0LWdyaWQtdGlsZT48L21hdC1ncmlkLXRpbGU+XG4gICAgICAgICAgICA8bWF0LWdyaWQtdGlsZSBjbGFzcz1cImFqZi1sYWxcIiBjb2xzcGFuPVwiNFwiPlxuICAgICAgICAgICAgICAmbmJzcDsmbmJzcDs8c3Bhbj57eydib3JkZXIgcmFkaXVzIHRvcCByaWdodCd8dHJhbnNsb2NvfX08L3NwYW4+XG4gICAgICAgICAgICA8L21hdC1ncmlkLXRpbGU+XG4gICAgICAgICAgICA8bWF0LWdyaWQtdGlsZSBjb2xzcGFuPVwiN1wiPlxuICAgICAgICAgICAgICA8bWF0LXNsaWRlclxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic2V0V2lkZ2V0Qm9yZGVyUmFkaXVzKDEsICRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICAgICAgIG1pbj1cIjFcIlxuICAgICAgICAgICAgICAgIG1heD1cIjEwMFwiXG4gICAgICAgICAgICAgICAgc3RlcD1cIjFcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJnZXRCb3JkZXJSYWRpdXNXaWRnZXRUb3BSaWdodHxhc3luY1wiXG4gICAgICAgICAgICAgICAgdGlja0ludGVydmFsPVwiYXV0b1wiXG4gICAgICAgICAgICAgICAgdGh1bWJMYWJlbFxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDwvbWF0LXNsaWRlcj5cbiAgICAgICAgICAgIDwvbWF0LWdyaWQtdGlsZT5cbiAgICAgICAgICA8L21hdC1ncmlkLWxpc3Q+XG4gICAgICAgICAgPG1hdC1ncmlkLWxpc3QgY29scz1cIjEyXCI+XG4gICAgICAgICAgICA8bWF0LWdyaWQtdGlsZT48L21hdC1ncmlkLXRpbGU+XG4gICAgICAgICAgICA8bWF0LWdyaWQtdGlsZSBjbGFzcz1cImFqZi1sYWxcIiBjb2xzcGFuPVwiNFwiPlxuICAgICAgICAgICAgICAmbmJzcDsmbmJzcDs8c3Bhbj57eydib3JkZXIgcmFkaXVzIGJvdHRvbSBsZWZ0J3x0cmFuc2xvY299fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvbWF0LWdyaWQtdGlsZT5cbiAgICAgICAgICAgIDxtYXQtZ3JpZC10aWxlIGNvbHNwYW49XCI3XCI+XG4gICAgICAgICAgICAgIDxtYXQtc2xpZGVyXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzZXRXaWRnZXRCb3JkZXJSYWRpdXMoMiwgJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgbWluPVwiMVwiXG4gICAgICAgICAgICAgICAgbWF4PVwiMTAwXCJcbiAgICAgICAgICAgICAgICBzdGVwPVwiMVwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImdldEJvcmRlclJhZGl1c1dpZGdldEJvdHRvbUxlZnR8YXN5bmNcIlxuICAgICAgICAgICAgICAgIHRpY2tJbnRlcnZhbD1cImF1dG9cIlxuICAgICAgICAgICAgICAgIHRodW1iTGFiZWxcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8L21hdC1zbGlkZXI+XG4gICAgICAgICAgICA8L21hdC1ncmlkLXRpbGU+XG4gICAgICAgICAgPC9tYXQtZ3JpZC1saXN0PlxuICAgICAgICAgIDxtYXQtZ3JpZC1saXN0IGNvbHM9XCIxMlwiPlxuICAgICAgICAgICAgPG1hdC1ncmlkLXRpbGU+PC9tYXQtZ3JpZC10aWxlPlxuICAgICAgICAgICAgPG1hdC1ncmlkLXRpbGUgY2xhc3M9XCJhamYtbGFsXCIgY29sc3Bhbj1cIjRcIj5cbiAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7PHNwYW5cbiAgICAgICAgICAgICAgICA+e3snYm9yZGVyIHJhZGl1cyBib3R0b20gcmlnaHQnfHRyYW5zbG9jb319PC9zcGFuXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvbWF0LWdyaWQtdGlsZT5cbiAgICAgICAgICAgIDxtYXQtZ3JpZC10aWxlIGNvbHNwYW49XCI3XCI+XG4gICAgICAgICAgICAgIDxtYXQtc2xpZGVyXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzZXRXaWRnZXRCb3JkZXJSYWRpdXMoMywgJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgbWluPVwiMVwiXG4gICAgICAgICAgICAgICAgbWF4PVwiMTAwXCJcbiAgICAgICAgICAgICAgICBzdGVwPVwiMVwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cImdldEJvcmRlclJhZGl1c1dpZGdldEJvdHRvbVJpZ2h0fGFzeW5jXCJcbiAgICAgICAgICAgICAgICB0aWNrSW50ZXJ2YWw9XCJhdXRvXCJcbiAgICAgICAgICAgICAgICB0aHVtYkxhYmVsXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPC9tYXQtc2xpZGVyPlxuICAgICAgICAgICAgPC9tYXQtZ3JpZC10aWxlPlxuICAgICAgICAgIDwvbWF0LWdyaWQtbGlzdD5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInByb3BlcnRpZXMtY29udGFpbmVyXCIgKm5nSWY9XCJjdXJyZW50V2lkZ2V0LndpZGdldFR5cGUgPT09IDJcIj5cbiAgICAgICAgPG1hdC1ncmlkLWxpc3QgY29scz1cIjEyXCI+XG4gICAgICAgICAgPG1hdC1ncmlkLXRpbGU+PC9tYXQtZ3JpZC10aWxlPlxuICAgICAgICAgIDxtYXQtZ3JpZC10aWxlIGNsYXNzPVwiYWpmLWxhbFwiIGNvbHNwYW49XCIzXCI+XG4gICAgICAgICAgICA8c3Bhbj57eydmb250IHNpemUnfHRyYW5zbG9jb319PC9zcGFuPlxuICAgICAgICAgIDwvbWF0LWdyaWQtdGlsZT5cbiAgICAgICAgICA8bWF0LWdyaWQtdGlsZSBjb2xzcGFuPVwiN1wiPlxuICAgICAgICAgICAgPG1hdC1zbGlkZXJcbiAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzZXRXaWRnZXRTdHlsZXMoJ2ZvbnQtc2l6ZScsICRldmVudC52YWx1ZSk7XCJcbiAgICAgICAgICAgICAgbWluPVwiMVwiXG4gICAgICAgICAgICAgIG1heD1cIjE1MFwiXG4gICAgICAgICAgICAgIHN0ZXA9XCIxXCJcbiAgICAgICAgICAgICAgW3ZhbHVlXT1cImdldEZvbnRTaXplV2lkZ2V0fGFzeW5jXCJcbiAgICAgICAgICAgICAgdGlja0ludGVydmFsPVwiMVwiXG4gICAgICAgICAgICAgIHRodW1iTGFiZWxcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvbWF0LXNsaWRlcj5cbiAgICAgICAgICA8L21hdC1ncmlkLXRpbGU+XG4gICAgICAgIDwvbWF0LWdyaWQtbGlzdD5cbiAgICAgIDwvZGl2PlxuICAgICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cImN1cnJlbnRXaWRnZXQud2lkZ2V0VHlwZSA9PT0gNVwiPlxuICAgICAgICA8YnIgLz5cbiAgICAgICAgPGZvcm0+XG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInRm9udCBzaXplJyB8IHRyYW5zbG9jb1wiXG4gICAgICAgICAgICAgIFt2YWx1ZV09XCJnZXRGb250U2l6ZVdpZGdldHxhc3luY1wiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZm9udFNpemVcIlxuICAgICAgICAgICAgICBbbmdNb2RlbE9wdGlvbnNdPVwie3N0YW5kYWxvbmU6IHRydWV9XCJcbiAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzZXRXaWRnZXRTdHlsZXMoJ2ZvbnQtc2l6ZScsIGZvbnRTaXplKVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPG1hdC1zZWxlY3RcbiAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwic2V0V2lkZ2V0U3R5bGVzKCdmb250LXN0eWxlJywgJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ0ZvbnQgc3R5bGUnIHwgdHJhbnNsb2NvXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIm5vcm1hbFwiPnt7J05vcm1hbCd8dHJhbnNsb2NvfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIml0YWxpY1wiPnt7J0l0YWxpYyd8dHJhbnNsb2NvfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIm9ibGlxdWVcIj57eydPYmxpcXVlJ3x0cmFuc2xvY299fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgPG1hdC1zZWxlY3RcbiAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwic2V0V2lkZ2V0U3R5bGVzKCd0ZXh0LWFsaWduJywgJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ0FsaWduJyB8IHRyYW5zbG9jb1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJjZW50ZXJcIj57eydDZW50ZXInfHRyYW5zbG9jb319PC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJsZWZ0XCI+e3snTGVmdCd8dHJhbnNsb2NvfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cInJpZ2h0XCI+e3snUmlnaHQnfHRyYW5zbG9jb319PC9tYXQtb3B0aW9uPlxuICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgPC9mb3JtPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDxoMT5cbiAgICAgICAgPG5nLWNvbnRhaW5lcj57eydwcm9wZXJ0aWVzIG9mJ3x0cmFuc2xvY299fTwvbmctY29udGFpbmVyPlxuICAgICAgICB7eyB3aWRnZXROYW1lfHRyYW5zbG9jbyB9fVxuICAgICAgPC9oMT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IFtuZ1N3aXRjaF09XCJjdXJyZW50V2lkZ2V0LndpZGdldFR5cGVcIj5cbiAgICAgIDxuZy10ZW1wbGF0ZSBbbmdTd2l0Y2hDYXNlXT1cIjBcIj5cbiAgICAgICAgPGgxPnt7J0NvbHVtbid8dHJhbnNsb2NvfX08L2gxPlxuICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICBuZ0ZvclxuICAgICAgICAgIGxldC1jb2xcbiAgICAgICAgICBbbmdGb3JPZl09XCJjdXJyZW50TGF5b3V0V2lkZ2V0LmNvbHVtbnNcIlxuICAgICAgICAgIGxldC1pZHg9XCJpbmRleFwiXG4gICAgICAgID5cbiAgICAgICAgICA8bWF0LXRvb2xiYXI+XG4gICAgICAgICAgICA8bWF0LXRvb2xiYXItcm93ICpuZ0lmPVwiY29sICE9PSAtMVwiPlxuICAgICAgICAgICAgICA8bWF0LWdyaWQtbGlzdCBjb2xzPVwiMTJcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWdyaWQtdGlsZSBjb2xzcGFuPVwiMVwiPiB7e2lkeCArIDF9fSA8L21hdC1ncmlkLXRpbGU+XG4gICAgICAgICAgICAgICAgPG1hdC1ncmlkLXRpbGUgY29sc3Bhbj1cIjlcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtc2xpZGVyXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDkwJVwiXG4gICAgICAgICAgICAgICAgICAgIG1pbj1cIjAuMVwiXG4gICAgICAgICAgICAgICAgICAgIG1heD1cIjFcIlxuICAgICAgICAgICAgICAgICAgICBzdGVwPVwiMC4wMVwiXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPVwie3tjb2x9fVwiXG4gICAgICAgICAgICAgICAgICAgIHRodW1iLWxhYmVsPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIHRpY2staW50ZXJ2YWw9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJpbnN0YW50Q29sdW1uVmFsdWUoJGV2ZW50LnZhbHVlLGlkeClcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPC9tYXQtc2xpZGVyPlxuICAgICAgICAgICAgICAgICAge3twZXJjZW50KGNvbCl9fSVcbiAgICAgICAgICAgICAgICA8L21hdC1ncmlkLXRpbGU+XG4gICAgICAgICAgICAgICAgPG1hdC1ncmlkLXRpbGUgY29sc3Bhbj1cIjJcIj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogNSVcIlxuICAgICAgICAgICAgICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJmaXhlZENvbHVtbihpZHgpXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgZml4ZWRcbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvbWF0LWdyaWQtdGlsZT5cbiAgICAgICAgICAgICAgPC9tYXQtZ3JpZC1saXN0PlxuICAgICAgICAgICAgPC9tYXQtdG9vbGJhci1yb3c+XG4gICAgICAgICAgICA8bWF0LXRvb2xiYXItcm93ICpuZ0lmPVwiY29sID09IC0xXCI+XG4gICAgICAgICAgICAgIDxtYXQtZ3JpZC1saXN0IGNvbHM9XCIxMlwiPlxuICAgICAgICAgICAgICAgIDxtYXQtZ3JpZC10aWxlIGNvbHNwYW49XCIxXCI+IHt7aWR4ICsgMX19IDwvbWF0LWdyaWQtdGlsZT5cbiAgICAgICAgICAgICAgICA8bWF0LWdyaWQtdGlsZSBjb2xzcGFuPVwiMTFcIj5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogOTAlXCJcbiAgICAgICAgICAgICAgICAgICAgbWF0LWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidW5maXhlZENvbHVtbihpZHgpXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgcGVyY2VudFxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9tYXQtZ3JpZC10aWxlPlxuICAgICAgICAgICAgICA8L21hdC1ncmlkLWxpc3Q+XG4gICAgICAgICAgICA8L21hdC10b29sYmFyLXJvdz5cbiAgICAgICAgICA8L21hdC10b29sYmFyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8bWF0LXRvb2xiYXI+XG4gICAgICAgICAgPG1hdC10b29sYmFyLXJvdz5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgbWF0LWJ1dHRvblxuICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkQ29sdW1uKClcIlxuICAgICAgICAgICAgICAqbmdJZj1cImN1cnJlbnRMYXlvdXRXaWRnZXQuY29sdW1ucy5sZW5ndGggPCAxMFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7J0FkZCBjb2x1bW4nfHRyYW5zbG9jb319XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L21hdC10b29sYmFyLXJvdz5cbiAgICAgICAgPC9tYXQtdG9vbGJhcj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8bmctdGVtcGxhdGUgW25nU3dpdGNoQ2FzZV09XCIyXCI+XG4gICAgICAgIDxhamYtaW1hZ2UtZ3JvdXBcbiAgICAgICAgICAoZm9ybXVsYUNsaWNrKT1cIm9wZW5Gb3JtdWxhRGlhbG9nKCRldmVudClcIlxuICAgICAgICAgIFtkYXRhXT1cImljb25TZXRcIlxuICAgICAgICA+PC9hamYtaW1hZ2UtZ3JvdXA+XG4gICAgICAgIDxhamYtaW1hZ2UtZ3JvdXBcbiAgICAgICAgICAoZm9ybXVsYUNsaWNrKT1cIm9wZW5Gb3JtdWxhRGlhbG9nKCRldmVudClcIlxuICAgICAgICAgIFtkYXRhXT1cImZsYWdTZXRcIlxuICAgICAgICA+PC9hamYtaW1hZ2UtZ3JvdXA+XG4gICAgICAgIDxhamYtcmVwb3J0LWJ1aWxkZXItZm9ybXMtYW5hbHl6ZXI+PC9hamYtcmVwb3J0LWJ1aWxkZXItZm9ybXMtYW5hbHl6ZXI+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIG1hdC1pbnB1dFxuICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCIncGFzdGUgYSBsaW5rJyB8IHRyYW5zbG9jb1wiXG4gICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJVwiXG4gICAgICAgICAgWyhuZ01vZGVsKV09XCJpbWFnZVVybFwiXG4gICAgICAgIC8+XG4gICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiAoY2xpY2spPVwic2V0SW1hZ2VVcmwoKVwiPlxuICAgICAgICAgIHt7J1NldCBpbWFnZSd8dHJhbnNsb2NvfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPG5nLXRlbXBsYXRlIFtuZ1N3aXRjaENhc2VdPVwiM1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwid2lkdGg6IDUwMHB4XCI+XG4gICAgICAgICAgPGFqZi1xdWlsbC1lZGl0b3JcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwiY3VycmVudFRleHRXaWRnZXQuaHRtbFRleHRcIlxuICAgICAgICAgICAgW21vZHVsZXNdPVwiZ2V0TW9kdWxlKClcIlxuICAgICAgICAgICAgW21heExlbmd0aF09XCIyMDBcIlxuICAgICAgICAgICAgW3RoZW1lXT1cImJ1YmJsZVwiXG4gICAgICAgICAgICBbaW5pdEhUTUxdPVwiKGdldEhUTUx8YXN5bmMpIHx8ICcnXCJcbiAgICAgICAgICAgIChmb3JtdWxhQ2xpY2spPVwib3BlbkZvcm11bGFEaWFsb2coJGV2ZW50KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgIDwvYWpmLXF1aWxsLWVkaXRvcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPG5nLXRlbXBsYXRlIFtuZ1N3aXRjaENhc2VdPVwiNFwiPlxuICAgICAgICA8aDM+e3snQ2hvb3NlIHR5cGUgb2YgQ2hhcnQnfHRyYW5zbG9jb319PC9oMz5cbiAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlLWdyb3VwIGNsYXNzPVwiYWpmLWNoYXJ0LWJ1dHRvbnNcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWpmLXJvd1wiPlxuICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlXG4gICAgICAgICAgICAgIHZhbHVlPVwicmVwb3J0YnVpbGRlci1saW5lY2hhcnRcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2V0Q2hhcnRUeXBlKDApXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG1hdC1pY29uIGZvbnRTZXQ9XCJhamYtaWNvblwiIGZvbnRJY29uPVwicmVwb3J0YnVpbGRlci1saW5lY2hhcnRcIj5cbiAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XG4gICAgICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGVcbiAgICAgICAgICAgICAgdmFsdWU9XCJyZXBvcnRidWlsZGVyLWJhcmNoYXJ0dmVydGljYWxcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2V0Q2hhcnRUeXBlKDEpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG1hdC1pY29uXG4gICAgICAgICAgICAgICAgZm9udFNldD1cImFqZi1pY29uXCJcbiAgICAgICAgICAgICAgICBmb250SWNvbj1cInJlcG9ydGJ1aWxkZXItYmFyY2hhcnR2ZXJ0aWNhbFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XG4gICAgICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGVcbiAgICAgICAgICAgICAgdmFsdWU9XCJyZXBvcnRidWlsZGVyLWJ1YmJsZWNoYXJ0XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNldENoYXJ0VHlwZSg4KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBmb250U2V0PVwiYWpmLWljb25cIiBmb250SWNvbj1cInJlcG9ydGJ1aWxkZXItYnViYmxlY2hhcnRcIj5cbiAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlXG4gICAgICAgICAgICAgIHZhbHVlPVwicmVwb3J0YnVpbGRlci1iYXJjaGFydGhvcml6b250YWxcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2V0Q2hhcnRUeXBlKDIpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG1hdC1pY29uXG4gICAgICAgICAgICAgICAgZm9udFNldD1cImFqZi1pY29uXCJcbiAgICAgICAgICAgICAgICBmb250SWNvbj1cInJlcG9ydGJ1aWxkZXItYmFyY2hhcnRob3Jpem9udGFsXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cbiAgICAgICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZVxuICAgICAgICAgICAgICB2YWx1ZT1cInJlcG9ydGJ1aWxkZXItcmFkYXJjaGFydFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZXRDaGFydFR5cGUoMylcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LWljb24gZm9udFNldD1cImFqZi1pY29uXCIgZm9udEljb249XCJyZXBvcnRidWlsZGVyLXJhZGFyY2hhcnRcIj5cbiAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XG4gICAgICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGVcbiAgICAgICAgICAgICAgdmFsdWU9XCJyZXBvcnRidWlsZGVyLWJhcmNoYXJ0dmVydGljYWxcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2V0Q2hhcnRUeXBlKDEpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG1hdC1pY29uXG4gICAgICAgICAgICAgICAgZm9udFNldD1cImFqZi1pY29uXCJcbiAgICAgICAgICAgICAgICBmb250SWNvbj1cInJlcG9ydGJ1aWxkZXItYmFyY2hhcnR2ZXJ0aWNhbFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFqZi1yb3dcIj5cbiAgICAgICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZVxuICAgICAgICAgICAgICB2YWx1ZT1cInJlcG9ydGJ1aWxkZXItc2NhdHRlcmNoYXJ0XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNldENoYXJ0VHlwZSg0KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxtYXQtaWNvblxuICAgICAgICAgICAgICAgIGZvbnRTZXQ9XCJhamYtaWNvblwiXG4gICAgICAgICAgICAgICAgZm9udEljb249XCJyZXBvcnRidWlsZGVyLXNjYXR0ZXJjaGFydFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XG4gICAgICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGVcbiAgICAgICAgICAgICAgdmFsdWU9XCJyZXBvcnRidWlsZGVyLXBvbGFyYXJlYWNoYXJ0XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNldENoYXJ0VHlwZSg1KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxtYXQtaWNvblxuICAgICAgICAgICAgICAgIGZvbnRTZXQ9XCJhamYtaWNvblwiXG4gICAgICAgICAgICAgICAgZm9udEljb249XCJyZXBvcnRidWlsZGVyLXBvbGFyYXJlYWNoYXJ0XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWpmLXJvd1wiPlxuICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlXG4gICAgICAgICAgICAgIHZhbHVlPVwicmVwb3J0YnVpbGRlci1waWVjaGFydFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZXRDaGFydFR5cGUoNilcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LWljb24gZm9udFNldD1cImFqZi1pY29uXCIgZm9udEljb249XCJyZXBvcnRidWlsZGVyLXBpZWNoYXJ0XCI+XG4gICAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxuICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlXG4gICAgICAgICAgICAgIHZhbHVlPVwicmVwb3J0YnVpbGRlci1kb25vdWdodGNoYXJ0XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNldENoYXJ0VHlwZSg3KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxtYXQtaWNvblxuICAgICAgICAgICAgICAgIGZvbnRTZXQ9XCJhamYtaWNvblwiXG4gICAgICAgICAgICAgICAgZm9udEljb249XCJyZXBvcnRidWlsZGVyLWRvbm91Z2h0Y2hhcnRcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlLWdyb3VwPlxuICAgICAgICA8aDM+e3snTGFiZWxzJ3x0cmFuc2xvY299fTwvaDM+XG4gICAgICAgIDxhamYtcmVwb3J0LWJ1aWxkZXItZm9ybXMtYW5hbHl6ZXI+PC9hamYtcmVwb3J0LWJ1aWxkZXItZm9ybXMtYW5hbHl6ZXI+XG4gICAgICAgIDxhamYtdGhlbWUtY29sb3JcbiAgICAgICAgICBbc2VjdGlvbl09XCInY2hhcnQnXCJcbiAgICAgICAgICBbbGFiZWxdPVwidGFiVmFsdWVcIlxuICAgICAgICA+PC9hamYtdGhlbWUtY29sb3I+XG4gICAgICAgIDxtYXQtY2FyZD5cbiAgICAgICAgICA8bWF0LWNhcmQtaGVhZGVyPlxuICAgICAgICAgICAgPG1hdC1jYXJkLXRpdGxlPnt7J0JvcmRlciB3aWR0aCd8dHJhbnNsb2NvfX08L21hdC1jYXJkLXRpdGxlPlxuICAgICAgICAgIDwvbWF0LWNhcmQtaGVhZGVyPlxuICAgICAgICAgIDxtYXQtY2FyZC1jb250ZW50PlxuICAgICAgICAgICAgPG1hdC1zbGlkZXJcbiAgICAgICAgICAgICAgbWluPVwiMVwiXG4gICAgICAgICAgICAgIG1heD1cIjEwMFwiXG4gICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDk5JVwiXG4gICAgICAgICAgICAgIHN0ZXA9XCIxXCJcbiAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzZXRDaGFydEJvcmRlckNvbG9yKCRldmVudC52YWx1ZSlcIlxuICAgICAgICAgICAgICBbdmFsdWVdPVwiY2hhcnRCb3JkZXJXaWR0aFwiXG4gICAgICAgICAgICAgIHRpY2tJbnRlcnZhbD1cImF1dG9cIlxuICAgICAgICAgICAgICB0aHVtYkxhYmVsXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L21hdC1zbGlkZXI+XG4gICAgICAgICAgPC9tYXQtY2FyZC1jb250ZW50PlxuICAgICAgICA8L21hdC1jYXJkPlxuICAgICAgICA8bWF0LXRhYi1ncm91cCAoc2VsZWN0Q2hhbmdlKT1cInNldFRhYigkZXZlbnQpXCI+XG4gICAgICAgICAgPG1hdC10YWIgbGFiZWw9XCJCYWNrZ3JvdW5kXCI+XG4gICAgICAgICAgICA8bWF0LWxpc3Q+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgIG5nRm9yXG4gICAgICAgICAgICAgICAgbGV0LWNvbG9yXG4gICAgICAgICAgICAgICAgW25nRm9yT2ZdPVwiKGdldENoYXJ0QmFja2dyb3VuZENvbG9yfGFzeW5jKVwiXG4gICAgICAgICAgICAgICAgbGV0LWlkeD1cImluZGV4XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxtYXQtbGlzdC1pdGVtPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gW3N0eWxlLmJhY2tncm91bmRdPVwiY29sb3JcIj4ge3sgY29sb3IgfX0gPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIChjbGljayk9XCJyZW1vdmVDaGFydEJhY2tncm91bmRDb2xvcihpZHgpXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7J1JlbW92ZSd8dHJhbnNsb2NvfX1cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvbWF0LWxpc3QtaXRlbT5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvbWF0LWxpc3Q+XG4gICAgICAgICAgPC9tYXQtdGFiPlxuICAgICAgICAgIDxtYXQtdGFiIGxhYmVsPVwiQm9yZGVyXCI+XG4gICAgICAgICAgICA8bWF0LWxpc3Q+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgIG5nRm9yXG4gICAgICAgICAgICAgICAgbGV0LWNvbG9yXG4gICAgICAgICAgICAgICAgW25nRm9yT2ZdPVwiKGdldENoYXJ0Qm9yZGVyQ29sb3J8YXN5bmMpXCJcbiAgICAgICAgICAgICAgICBsZXQtaWR4PVwiaW5kZXhcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG1hdC1saXN0LWl0ZW0+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBbc3R5bGUuYmFja2dyb3VuZF09XCJjb2xvclwiPiB7eyBjb2xvciB9fSA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gKGNsaWNrKT1cInJlbW92ZUNoYXJ0Qm9yZGVyQ29sb3IoaWR4KVwiPlxuICAgICAgICAgICAgICAgICAgICByZW1vdmVcbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvbWF0LWxpc3QtaXRlbT5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvbWF0LWxpc3Q+XG4gICAgICAgICAgPC9tYXQtdGFiPlxuICAgICAgICA8L21hdC10YWItZ3JvdXA+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPG5nLXRlbXBsYXRlIFtuZ1N3aXRjaENhc2VdPVwiNVwiPlxuICAgICAgICA8YWpmLXJlcG9ydC1idWlsZGVyLWZvcm1zLWFuYWx5emVyPjwvYWpmLXJlcG9ydC1idWlsZGVyLWZvcm1zLWFuYWx5emVyPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cbiAgICA8YnV0dG9uXG4gICAgICBtYXQtYnV0dG9uXG4gICAgICAoY2xpY2spPVwidmlzaWJpbGl0eVNlY3Rpb24gPSAhdmlzaWJpbGl0eVNlY3Rpb25cIlxuICAgICAgW25nQ2xhc3NdPVwieydhamYtc2VsZWN0ZWQnOiB2aXNpYmlsaXR5U2VjdGlvbn1cIlxuICAgID5cbiAgICAgIHt7IHdpZGdldE5hbWV8dHJhbnNsb2NvIH19XG4gICAgICA8bmctY29udGFpbmVyPnt7J1Zpc2liaWxpdHknfHRyYW5zbG9jb319PC9uZy1jb250YWluZXI+XG4gICAgPC9idXR0b24+XG4gICAgPGRpdiBbc3R5bGUuZGlzcGxheV09XCJ2aXNpYmlsaXR5U2VjdGlvbiA/ICdibG9jaycgOiAnbm9uZSdcIj5cbiAgICAgIDxhamYtcmVwb3J0LWJ1aWxkZXItY29uZGl0aW9uLWVkaXRvclxuICAgICAgICBbdmlzaWJpbGl0eV09XCJjdXJyZW50V2lkZ2V0LnZpc2liaWxpdHlcIlxuICAgICAgPjwvYWpmLXJlcG9ydC1idWlsZGVyLWNvbmRpdGlvbi1lZGl0b3I+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==