tui-image-editor-angular3 14.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. package/README.md +155 -0
  2. package/esm2020/lib/consts.mjs +170 -0
  3. package/esm2020/lib/i18n/en.mjs +129 -0
  4. package/esm2020/lib/i18n/nl.mjs +128 -0
  5. package/esm2020/lib/i18n/translation.service.mjs +40 -0
  6. package/esm2020/lib/interfaces/command.mjs +2 -0
  7. package/esm2020/lib/interfaces/history-item.mjs +343 -0
  8. package/esm2020/lib/interfaces/image-size.mjs +2 -0
  9. package/esm2020/lib/interfaces/tools-config.mjs +2 -0
  10. package/esm2020/lib/menus/buttons/crop/crop.component.mjs +22 -0
  11. package/esm2020/lib/menus/buttons/delete/delete.component.mjs +40 -0
  12. package/esm2020/lib/menus/buttons/delete-all/delete-all.component.mjs +27 -0
  13. package/esm2020/lib/menus/buttons/download/download.component.mjs +40 -0
  14. package/esm2020/lib/menus/buttons/drag/drag.component.mjs +41 -0
  15. package/esm2020/lib/menus/buttons/draw/draw.component.mjs +22 -0
  16. package/esm2020/lib/menus/buttons/filter/filter.component.mjs +22 -0
  17. package/esm2020/lib/menus/buttons/flip/flip.component.mjs +22 -0
  18. package/esm2020/lib/menus/buttons/history/history.component.mjs +41 -0
  19. package/esm2020/lib/menus/buttons/icon/icon.component.mjs +22 -0
  20. package/esm2020/lib/menus/buttons/load/load.component.mjs +23 -0
  21. package/esm2020/lib/menus/buttons/mask/mask.component.mjs +22 -0
  22. package/esm2020/lib/menus/buttons/redo/redo.component.mjs +36 -0
  23. package/esm2020/lib/menus/buttons/reset/reset.component.mjs +28 -0
  24. package/esm2020/lib/menus/buttons/rotate/rotate.component.mjs +22 -0
  25. package/esm2020/lib/menus/buttons/shape/shape.component.mjs +22 -0
  26. package/esm2020/lib/menus/buttons/text/text.component.mjs +22 -0
  27. package/esm2020/lib/menus/buttons/undo/undo.component.mjs +36 -0
  28. package/esm2020/lib/menus/buttons/zoom-in/zoom-in.component.mjs +45 -0
  29. package/esm2020/lib/menus/buttons/zoom-out/zoom-out.component.mjs +20 -0
  30. package/esm2020/lib/services/history.service.mjs +86 -0
  31. package/esm2020/lib/services/tools.config-manager.service.mjs +45 -0
  32. package/esm2020/lib/submenus/crop/crop.component.mjs +76 -0
  33. package/esm2020/lib/submenus/draw/draw.component.mjs +149 -0
  34. package/esm2020/lib/submenus/filter/filter.component.mjs +345 -0
  35. package/esm2020/lib/submenus/flip/flip.component.mjs +39 -0
  36. package/esm2020/lib/submenus/icon/icon.component.mjs +119 -0
  37. package/esm2020/lib/submenus/mask/mask.component.mjs +69 -0
  38. package/esm2020/lib/submenus/rotate/rotate.component.mjs +57 -0
  39. package/esm2020/lib/submenus/shape/shape.component.mjs +163 -0
  40. package/esm2020/lib/submenus/text/text.component.mjs +175 -0
  41. package/esm2020/lib/svg-definitions/svg-definitions.component.mjs +12 -0
  42. package/esm2020/lib/tui-image-editor.component.mjs +294 -0
  43. package/esm2020/lib/tui-image-editor.module.mjs +136 -0
  44. package/esm2020/lib/utils.mjs +173 -0
  45. package/esm2020/public-api.mjs +8 -0
  46. package/esm2020/tui-image-editor-angular2.mjs +5 -0
  47. package/esm2020/tui-image-editor-angular3.mjs +5 -0
  48. package/fesm2015/tui-image-editor-angular2.mjs +3166 -0
  49. package/fesm2015/tui-image-editor-angular2.mjs.map +1 -0
  50. package/fesm2015/tui-image-editor-angular3.mjs +3166 -0
  51. package/fesm2015/tui-image-editor-angular3.mjs.map +1 -0
  52. package/fesm2020/tui-image-editor-angular2.mjs +3126 -0
  53. package/fesm2020/tui-image-editor-angular2.mjs.map +1 -0
  54. package/fesm2020/tui-image-editor-angular3.mjs +3126 -0
  55. package/fesm2020/tui-image-editor-angular3.mjs.map +1 -0
  56. package/index.d.ts +5 -0
  57. package/lib/consts.d.ts +144 -0
  58. package/lib/consts.d.ts.map +1 -0
  59. package/lib/i18n/en.d.ts +128 -0
  60. package/lib/i18n/en.d.ts.map +1 -0
  61. package/lib/i18n/nl.d.ts +127 -0
  62. package/lib/i18n/nl.d.ts.map +1 -0
  63. package/lib/i18n/translation.service.d.ts +14 -0
  64. package/lib/i18n/translation.service.d.ts.map +1 -0
  65. package/lib/interfaces/command.d.ts +4 -0
  66. package/lib/interfaces/command.d.ts.map +1 -0
  67. package/lib/interfaces/history-item.d.ts +26 -0
  68. package/lib/interfaces/history-item.d.ts.map +1 -0
  69. package/lib/interfaces/image-size.d.ts +6 -0
  70. package/lib/interfaces/image-size.d.ts.map +1 -0
  71. package/lib/interfaces/tools-config.d.ts +14 -0
  72. package/lib/interfaces/tools-config.d.ts.map +1 -0
  73. package/lib/menus/buttons/crop/crop.component.d.ts +10 -0
  74. package/lib/menus/buttons/crop/crop.component.d.ts.map +1 -0
  75. package/lib/menus/buttons/delete/delete.component.d.ts +13 -0
  76. package/lib/menus/buttons/delete/delete.component.d.ts.map +1 -0
  77. package/lib/menus/buttons/delete-all/delete-all.component.d.ts +11 -0
  78. package/lib/menus/buttons/delete-all/delete-all.component.d.ts.map +1 -0
  79. package/lib/menus/buttons/download/download.component.d.ts +9 -0
  80. package/lib/menus/buttons/download/download.component.d.ts.map +1 -0
  81. package/lib/menus/buttons/drag/drag.component.d.ts +11 -0
  82. package/lib/menus/buttons/drag/drag.component.d.ts.map +1 -0
  83. package/lib/menus/buttons/draw/draw.component.d.ts +10 -0
  84. package/lib/menus/buttons/draw/draw.component.d.ts.map +1 -0
  85. package/lib/menus/buttons/filter/filter.component.d.ts +10 -0
  86. package/lib/menus/buttons/filter/filter.component.d.ts.map +1 -0
  87. package/lib/menus/buttons/flip/flip.component.d.ts +10 -0
  88. package/lib/menus/buttons/flip/flip.component.d.ts.map +1 -0
  89. package/lib/menus/buttons/history/history.component.d.ts +13 -0
  90. package/lib/menus/buttons/history/history.component.d.ts.map +1 -0
  91. package/lib/menus/buttons/icon/icon.component.d.ts +10 -0
  92. package/lib/menus/buttons/icon/icon.component.d.ts.map +1 -0
  93. package/lib/menus/buttons/load/load.component.d.ts +9 -0
  94. package/lib/menus/buttons/load/load.component.d.ts.map +1 -0
  95. package/lib/menus/buttons/mask/mask.component.d.ts +10 -0
  96. package/lib/menus/buttons/mask/mask.component.d.ts.map +1 -0
  97. package/lib/menus/buttons/redo/redo.component.d.ts +12 -0
  98. package/lib/menus/buttons/redo/redo.component.d.ts.map +1 -0
  99. package/lib/menus/buttons/reset/reset.component.d.ts +12 -0
  100. package/lib/menus/buttons/reset/reset.component.d.ts.map +1 -0
  101. package/lib/menus/buttons/rotate/rotate.component.d.ts +10 -0
  102. package/lib/menus/buttons/rotate/rotate.component.d.ts.map +1 -0
  103. package/lib/menus/buttons/shape/shape.component.d.ts +10 -0
  104. package/lib/menus/buttons/shape/shape.component.d.ts.map +1 -0
  105. package/lib/menus/buttons/text/text.component.d.ts +10 -0
  106. package/lib/menus/buttons/text/text.component.d.ts.map +1 -0
  107. package/lib/menus/buttons/undo/undo.component.d.ts +12 -0
  108. package/lib/menus/buttons/undo/undo.component.d.ts.map +1 -0
  109. package/lib/menus/buttons/zoom-in/zoom-in.component.d.ts +12 -0
  110. package/lib/menus/buttons/zoom-in/zoom-in.component.d.ts.map +1 -0
  111. package/lib/menus/buttons/zoom-out/zoom-out.component.d.ts +9 -0
  112. package/lib/menus/buttons/zoom-out/zoom-out.component.d.ts.map +1 -0
  113. package/lib/services/history.service.d.ts +45 -0
  114. package/lib/services/history.service.d.ts.map +1 -0
  115. package/lib/services/tools.config-manager.service.d.ts +12 -0
  116. package/lib/services/tools.config-manager.service.d.ts.map +1 -0
  117. package/lib/submenus/crop/crop.component.d.ts +23 -0
  118. package/lib/submenus/crop/crop.component.d.ts.map +1 -0
  119. package/lib/submenus/draw/draw.component.d.ts +32 -0
  120. package/lib/submenus/draw/draw.component.d.ts.map +1 -0
  121. package/lib/submenus/filter/filter.component.d.ts +70 -0
  122. package/lib/submenus/filter/filter.component.d.ts.map +1 -0
  123. package/lib/submenus/flip/flip.component.d.ts +10 -0
  124. package/lib/submenus/flip/flip.component.d.ts.map +1 -0
  125. package/lib/submenus/icon/icon.component.d.ts +24 -0
  126. package/lib/submenus/icon/icon.component.d.ts.map +1 -0
  127. package/lib/submenus/mask/mask.component.d.ts +16 -0
  128. package/lib/submenus/mask/mask.component.d.ts.map +1 -0
  129. package/lib/submenus/rotate/rotate.component.d.ts +12 -0
  130. package/lib/submenus/rotate/rotate.component.d.ts.map +1 -0
  131. package/lib/submenus/shape/shape.component.d.ts +31 -0
  132. package/lib/submenus/shape/shape.component.d.ts.map +1 -0
  133. package/lib/submenus/text/text.component.d.ts +31 -0
  134. package/lib/submenus/text/text.component.d.ts.map +1 -0
  135. package/lib/svg-definitions/svg-definitions.component.d.ts +6 -0
  136. package/lib/svg-definitions/svg-definitions.component.d.ts.map +1 -0
  137. package/lib/tui-image-editor.component.d.ts +71 -0
  138. package/lib/tui-image-editor.component.d.ts.map +1 -0
  139. package/lib/tui-image-editor.module.d.ts +48 -0
  140. package/lib/tui-image-editor.module.d.ts.map +1 -0
  141. package/lib/utils.d.ts +45 -0
  142. package/lib/utils.d.ts.map +1 -0
  143. package/package.json +43 -0
  144. package/public-api.d.ts +4 -0
  145. package/public-api.d.ts.map +1 -0
  146. package/src/checkboxes.scss +95 -0
  147. package/src/theme.scss +936 -0
  148. package/tui-image-editor-angular2.d.ts.map +1 -0
@@ -0,0 +1,345 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import { defaultColors, filterType } from '../../consts';
3
+ import { HistoryItemType } from '../../interfaces/history-item';
4
+ import { removeFilter, rgbaToObject } from '../../utils';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "../../services/history.service";
7
+ import * as i2 from "@angular/forms";
8
+ import * as i3 from "ngx-color-picker";
9
+ import * as i4 from "@ngx-translate/core";
10
+ export class FilterComponent {
11
+ constructor(historyService) {
12
+ this.historyService = historyService;
13
+ this.filterBlurChecked = false;
14
+ this.filterBlurValue = 0.1;
15
+ this.filterGrayscaleChecked = false;
16
+ this.filterSepiaChecked = false;
17
+ this.filterEmbossChecked = false;
18
+ this.filterInvertChecked = false;
19
+ this.filterVintageChecked = false;
20
+ this.filterSharpenChecked = false;
21
+ this.filterWhiteRemovalChecked = false;
22
+ this.filterWhiteRemovalDistance = 0.5;
23
+ this.filterBrightnessChecked = false;
24
+ this.filterBrightnessValue = 0;
25
+ this.filterNoiseChecked = false;
26
+ this.filterNoiseValue = 100;
27
+ this.filterPixelateChecked = false;
28
+ this.filterPixelateValue = 15;
29
+ this.filterColorFilterChecked = false;
30
+ this.filterColorFilterThreshold = 0;
31
+ this.defaultFilterTintColors = defaultColors;
32
+ this.filterTintChecked = false;
33
+ this.filterTintColor = 'rgba(3, 189, 158, 0.7)';
34
+ this.defaultFilterMultiplyColors = defaultColors;
35
+ this.filterMultiplyChecked = false;
36
+ this.filterMultiplyColor = 'rgb(81, 92, 230)';
37
+ this.defaultFilterBlendColors = defaultColors;
38
+ this.filterBlendChecked = false;
39
+ this.filterBlendColor = 'rgba(255, 187, 59, 1)';
40
+ }
41
+ ngOnInit() {
42
+ this.historyServiceSubscription = this.historyService.onChangeEmitter.subscribe((items) => items != null && items.length != 0
43
+ ? this.rebindFields(items)
44
+ : this.rebindFields(this.historyService.items));
45
+ }
46
+ ngOnDestroy() {
47
+ this.historyServiceSubscription?.unsubscribe();
48
+ }
49
+ rebindFields(items) {
50
+ console.debug(items);
51
+ if (this.imageEditor != null) {
52
+ this.filterBlurChecked = this.imageEditor.hasFilter('blur');
53
+ this.filterBrightnessChecked = this.imageEditor.hasFilter('brightness');
54
+ if (this.filterBrightnessChecked) {
55
+ this.filterBrightnessValue = this.getAppliedFilterArgument(items, filterType.BRIGHTNESS, 0);
56
+ }
57
+ this.filterColorFilterChecked =
58
+ this.imageEditor.hasFilter('removeColor') &&
59
+ this.hasAppliedFilter(items, filterType.REMOVE_COLOR);
60
+ if (this.filterColorFilterChecked) {
61
+ this.filterColorFilterThreshold = this.getAppliedFilterArgument(items, filterType.REMOVE_COLOR, 0);
62
+ }
63
+ this.filterEmbossChecked = this.imageEditor.hasFilter('emboss');
64
+ this.filterGrayscaleChecked = this.imageEditor.hasFilter('grayscale');
65
+ this.filterInvertChecked = this.imageEditor.hasFilter('invert');
66
+ this.filterNoiseChecked = this.imageEditor.hasFilter('noise');
67
+ if (this.filterNoiseChecked) {
68
+ this.filterNoiseValue = this.getAppliedFilterArgument(items, filterType.NOISE, 0);
69
+ }
70
+ this.filterPixelateChecked = this.imageEditor.hasFilter('pixelate');
71
+ if (this.filterPixelateChecked) {
72
+ this.filterPixelateValue = this.getAppliedFilterArgument(items, filterType.PIXELATE, 0);
73
+ }
74
+ this.filterSepiaChecked = this.imageEditor.hasFilter('sepia');
75
+ this.filterSharpenChecked = this.imageEditor.hasFilter('sharpen');
76
+ this.filterVintageChecked = this.imageEditor.hasFilter('vintage');
77
+ this.filterWhiteRemovalChecked =
78
+ this.imageEditor.hasFilter('removeColor') &&
79
+ this.hasAppliedFilter(items, filterType.REMOVE_WHITE);
80
+ if (this.filterWhiteRemovalChecked) {
81
+ this.filterWhiteRemovalDistance = this.getAppliedFilterArgument(items, filterType.REMOVE_WHITE, 0);
82
+ }
83
+ this.filterMultiplyChecked =
84
+ this.imageEditor.hasFilter('blendColor') &&
85
+ this.hasAppliedFilter(items, filterType.MULTIPLY);
86
+ if (this.filterMultiplyChecked) {
87
+ this.filterMultiplyColor = this.getAppliedFilterArgument(items, filterType.MULTIPLY, 0);
88
+ }
89
+ this.filterTintChecked =
90
+ this.imageEditor.hasFilter('blendColor') &&
91
+ this.hasAppliedFilter(items, filterType.TINT);
92
+ if (this.filterTintChecked) {
93
+ this.filterTintColor = this.getAppliedFilterArgument(items, filterType.TINT, 0);
94
+ }
95
+ this.filterBlendChecked =
96
+ this.imageEditor.hasFilter('blendColor') &&
97
+ this.hasAppliedFilter(items, filterType.BLEND);
98
+ if (this.filterBlendChecked) {
99
+ this.filterBlendColor = this.getAppliedFilterArgument(items, filterType.BLEND, 0);
100
+ }
101
+ }
102
+ }
103
+ getAppliedFilterArgument(items, type, index) {
104
+ let validItems = items.filter((f) => f.filterType === type && f.type === HistoryItemType.ApplyFilter);
105
+ return validItems[validItems.length - 1].args[index];
106
+ }
107
+ hasAppliedFilter(historyItems, type) {
108
+ let hasFilter = false;
109
+ for (let i = 0; i < historyItems.length; i++) {
110
+ let item = historyItems[i];
111
+ if (item.type === HistoryItemType.ApplyFilter &&
112
+ item.filterType === type) {
113
+ hasFilter = true;
114
+ }
115
+ else if (hasFilter == true &&
116
+ [filterType.TINT, filterType.BLEND, filterType.MULTIPLY].some((t) => t === type) &&
117
+ item.type === HistoryItemType.RemoveFilter &&
118
+ item.filterType === filterType.BLEND_OR_TINT_OR_MULTIPLY) {
119
+ hasFilter = false;
120
+ }
121
+ else if (hasFilter == true &&
122
+ [filterType.REMOVE_COLOR, filterType.REMOVE_WHITE].some((t) => t === type) &&
123
+ item.type === HistoryItemType.RemoveFilter &&
124
+ item.filterType === filterType.REMOVE_COLOR_OR_WHITE) {
125
+ hasFilter = false;
126
+ }
127
+ }
128
+ return hasFilter;
129
+ }
130
+ filterWhiteRemovalCheckedChanged(newValue) {
131
+ this.filterApply('white-removal');
132
+ }
133
+ filterWhiteRemovalDistanceChanged(newValue, isSilent) {
134
+ this.filterApply('white-removal', isSilent);
135
+ }
136
+ filterBrightnessCheckedChanged(newValue) {
137
+ this.filterApply('brightness');
138
+ }
139
+ filterBrightnessValueChanged(newValue, isSilent) {
140
+ this.filterApply('brightness', isSilent);
141
+ }
142
+ filterNoiseCheckedChanged(newValue) {
143
+ this.filterApply('noise');
144
+ }
145
+ filterNoiseValueChanged(newValue, isSilent) {
146
+ this.filterApply('noise', isSilent);
147
+ }
148
+ filterPixelateCheckedChanged(newValue) {
149
+ this.filterApply('pixelate');
150
+ }
151
+ filterPixelateValueChanged(newValue, isSilent) {
152
+ this.filterApply('pixelate', isSilent);
153
+ }
154
+ filterColorFilterCheckedChanged(newValue) {
155
+ this.filterApply('removeColor');
156
+ }
157
+ filterColorFilterThresholdChanged(newValue, isSilent) {
158
+ this.filterApply('removeColor', isSilent);
159
+ }
160
+ filterTintColorChanged(newColor) {
161
+ this.filterApply('tint');
162
+ }
163
+ filterTintCheckedChanged(newValue) {
164
+ this.filterApply('tint');
165
+ if (this.filterTintChecked) {
166
+ this.filterMultiplyChecked = false;
167
+ this.filterBlendChecked = false;
168
+ }
169
+ }
170
+ filterMultiplyColorChanged(newColor) {
171
+ this.filterApply('multiply');
172
+ }
173
+ filterMultiplyCheckedChanged(newValue) {
174
+ this.filterApply('multiply');
175
+ if (this.filterMultiplyChecked) {
176
+ this.filterTintChecked = false;
177
+ this.filterBlendChecked = false;
178
+ }
179
+ }
180
+ filterBlendColorChanged(newColor) {
181
+ this.filterApply('blend');
182
+ }
183
+ filterBlendCheckedChanged(newValue) {
184
+ this.filterApply('blend');
185
+ if (this.filterBlendChecked) {
186
+ this.filterMultiplyChecked = false;
187
+ this.filterTintChecked = false;
188
+ }
189
+ }
190
+ filterBlurCheckedChanged(newValue) {
191
+ this.filterApply('blur');
192
+ }
193
+ filterGrayscaleCheckedChanged(newValue) {
194
+ this.filterApply('grayscale');
195
+ }
196
+ filterSepiaCheckedChanged(newValue) {
197
+ this.filterApply('sepia');
198
+ }
199
+ filterEmbossCheckedChanged(newValue) {
200
+ this.filterApply('emboss');
201
+ }
202
+ filterInvertCheckedChanged(newValue) {
203
+ this.filterApply('invert');
204
+ }
205
+ filterVintageCheckedChanged(newValue) {
206
+ this.filterApply('vintage');
207
+ }
208
+ filterSharpenCheckedChanged(newValue) {
209
+ this.filterApply('sharpen');
210
+ }
211
+ filterApply(type, isSilent = false) {
212
+ switch (type) {
213
+ case 'white-removal':
214
+ this.filterApplyConfirmed(this.filterWhiteRemovalChecked, 'removeColor', {
215
+ color: '#FFFFFF',
216
+ useAlpha: false,
217
+ distance: this.filterWhiteRemovalDistance,
218
+ }, isSilent);
219
+ break;
220
+ case 'brightness':
221
+ this.filterApplyConfirmed(this.filterBrightnessChecked, 'brightness', {
222
+ brightness: this.filterBrightnessValue,
223
+ }, isSilent);
224
+ break;
225
+ case 'noise':
226
+ this.filterApplyConfirmed(this.filterNoiseChecked, 'noise', {
227
+ noise: this.filterNoiseValue,
228
+ }, isSilent);
229
+ break;
230
+ case 'pixelate':
231
+ this.filterApplyConfirmed(this.filterPixelateChecked, 'pixelate', {
232
+ blocksize: this.filterPixelateValue,
233
+ }, isSilent);
234
+ break;
235
+ case 'removeColor':
236
+ this.filterApplyConfirmed(this.filterColorFilterChecked, 'removeColor', {
237
+ color: '#FFFFFF',
238
+ distance: this.filterColorFilterThreshold,
239
+ }, isSilent);
240
+ break;
241
+ case 'blur':
242
+ this.filterApplyConfirmed(this.filterBlurChecked, 'blur', {
243
+ blur: this.filterBlurValue,
244
+ }, isSilent);
245
+ break;
246
+ case 'blend':
247
+ this.filterApplyConfirmed(this.filterBlendChecked, 'blendColor', {
248
+ mode: 'add',
249
+ color: this.filterBlendColor,
250
+ }, isSilent);
251
+ break;
252
+ case 'multiply':
253
+ this.filterApplyConfirmed(this.filterMultiplyChecked, 'blendColor', {
254
+ mode: 'multiply',
255
+ color: this.filterMultiplyColor,
256
+ }, isSilent);
257
+ break;
258
+ case 'tint':
259
+ let rgbTint = rgbaToObject(this.filterTintColor);
260
+ this.filterApplyConfirmed(this.filterTintChecked, 'blendColor', {
261
+ mode: 'tint',
262
+ color: rgbTint.hexString,
263
+ alpha: rgbTint.alpha,
264
+ }, isSilent);
265
+ break;
266
+ case 'grayscale':
267
+ this.filterApplyConfirmed(this.filterGrayscaleChecked, type, {}, isSilent);
268
+ break;
269
+ case 'sepia':
270
+ this.filterApplyConfirmed(this.filterSepiaChecked, type, {}, isSilent);
271
+ break;
272
+ case 'emboss':
273
+ this.filterApplyConfirmed(this.filterEmbossChecked, type, {}, isSilent);
274
+ break;
275
+ case 'invert':
276
+ this.filterApplyConfirmed(this.filterInvertChecked, type, {}, isSilent);
277
+ break;
278
+ case 'vintage':
279
+ this.filterApplyConfirmed(this.filterVintageChecked, type, {}, isSilent);
280
+ break;
281
+ case 'sharpen':
282
+ this.filterApplyConfirmed(this.filterSharpenChecked, type, {}, isSilent);
283
+ break;
284
+ }
285
+ }
286
+ async filterApplyConfirmed(applying, type, options, isSilent = false) {
287
+ let functionToExecute = async () => {
288
+ if (applying) {
289
+ if (type === 'blendColor' && this.imageEditor.hasFilter('blendColor')) {
290
+ switch (options.mode) {
291
+ case 'add':
292
+ this.filterTintChecked = false;
293
+ this.filterMultiplyChecked = false;
294
+ break;
295
+ case 'multiply':
296
+ this.filterTintChecked = false;
297
+ this.filterBlendChecked = false;
298
+ break;
299
+ case 'tint':
300
+ this.filterBlendChecked = false;
301
+ this.filterMultiplyChecked = false;
302
+ break;
303
+ }
304
+ await removeFilter(this.imageEditor, type, isSilent);
305
+ }
306
+ else if (type === 'removeColor' &&
307
+ this.imageEditor.hasFilter('removeColor')) {
308
+ if (options.useAlpha != null) {
309
+ this.filterColorFilterChecked = false;
310
+ }
311
+ else {
312
+ this.filterWhiteRemovalChecked = false;
313
+ }
314
+ await removeFilter(this.imageEditor, type, isSilent);
315
+ }
316
+ await this.imageEditor.applyFilter(type, options, isSilent);
317
+ }
318
+ else if (this.imageEditor.hasFilter(type)) {
319
+ await removeFilter(this.imageEditor, type, isSilent);
320
+ if (type == 'blendColor') {
321
+ this.filterTintChecked = false;
322
+ this.filterMultiplyChecked = false;
323
+ this.filterBlendChecked = false;
324
+ }
325
+ }
326
+ };
327
+ if (isSilent) {
328
+ await functionToExecute();
329
+ }
330
+ else {
331
+ setTimeout(async () => {
332
+ await functionToExecute();
333
+ });
334
+ }
335
+ }
336
+ }
337
+ FilterComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: FilterComponent, deps: [{ token: i1.HistoryService }], target: i0.ɵɵFactoryTarget.Component });
338
+ FilterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.0", type: FilterComponent, selector: "tui-image-editor-submenus-filter", inputs: { imageEditor: "imageEditor" }, ngImport: i0, template: "<div\r\n class=\"tui-image-editor-menu-filter tui-image-editor-d-flex tui-image-editor-justify-content-center\"\r\n>\r\n <div\r\n class=\"tui-image-editor-submenu-item tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-overflowable-x tui-image-editor-py-3\"\r\n >\r\n <div class=\"tui-image-editor-submenu-align\">\r\n <div\r\n class=\"tui-image-editor-checkbox-wrap fixed-width tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-flex-wrap tui-image-editor-justify-content-center\"\r\n >\r\n <div class=\"tui-image-editor-checkbox tui-image-editor-align-self-center\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-grayscale\"\r\n [(ngModel)]=\"filterGrayscaleChecked\"\r\n (ngModelChange)=\"filterGrayscaleCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-grayscale\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n <div class=\"tui-image-editor-checkbox tui-image-editor-align-self-center\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-invert\"\r\n [(ngModel)]=\"filterInvertChecked\"\r\n (ngModelChange)=\"filterInvertCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-invert\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n <div class=\"tui-image-editor-checkbox tui-image-editor-align-self-center\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-sepia\"\r\n [(ngModel)]=\"filterSepiaChecked\"\r\n (ngModelChange)=\"filterSepiaCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-sepia\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n <div class=\"tui-image-editor-checkbox tui-image-editor-align-self-center\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-vintage\"\r\n [(ngModel)]=\"filterVintageChecked\"\r\n (ngModelChange)=\"filterVintageCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-sepia2\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n <div class=\"tui-image-editor-checkbox tui-image-editor-align-self-center\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-blur\"\r\n [(ngModel)]=\"filterBlurChecked\"\r\n (ngModelChange)=\"filterBlurCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-blur\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n <div class=\"tui-image-editor-checkbox tui-image-editor-align-self-center\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-sharpen\"\r\n [(ngModel)]=\"filterSharpenChecked\"\r\n (ngModelChange)=\"filterSharpenCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-sharpen\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n <div class=\"tui-image-editor-checkbox tui-image-editor-align-self-center\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-emboss\"\r\n [(ngModel)]=\"filterEmbossChecked\"\r\n (ngModelChange)=\"filterEmbossCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-emboss\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"tui-image-editor-partition\">\r\n <div></div>\r\n </div>\r\n <div class=\"tui-image-editor-submenu-align\">\r\n <div\r\n class=\"tui-image-editor-checkbox-group tui-image-editor-disabled\"\r\n style=\"margin-bottom: 7px\"\r\n >\r\n <div class=\"tui-image-editor-checkbox-wrap\">\r\n <div class=\"tui-image-editor-checkbox\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-remove-white\"\r\n [(ngModel)]=\"filterWhiteRemovalChecked\"\r\n (ngModelChange)=\"filterWhiteRemovalCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-removeWhite\"\r\n | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n </div>\r\n <div\r\n class=\"tui-image-editor-newline tui-image-editor-range-wrap short tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-flex-nowrap tui-image-editor-align-items-center\"\r\n >\r\n <label>{{\r\n \"tui-image-editor-angular-submenus-filter-removeWhite-distance\"\r\n | translate\r\n }}</label>\r\n <input\r\n type=\"range\"\r\n [(ngModel)]=\"filterWhiteRemovalDistance\"\r\n (ngModelChange)=\"filterWhiteRemovalDistanceChanged($event, true)\"\r\n (change)=\"filterWhiteRemovalDistanceChanged($event, false)\"\r\n min=\"0\"\r\n max=\"1\"\r\n step=\"0.001\"\r\n [disabled]=\"filterWhiteRemovalChecked == false\"\r\n />\r\n </div>\r\n </div>\r\n <div class=\"tui-image-editor-checkbox-group tui-image-editor-disabled\">\r\n <div class=\"tui-image-editor-checkbox\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-brightness\"\r\n [(ngModel)]=\"filterBrightnessChecked\"\r\n (ngModelChange)=\"filterBrightnessCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-brightness\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n <div class=\"tui-image-editor-range-wrap short tui-image-editor-d-flex tui-image-editor-flex-row align-items-center tui-image-editor-my-2\">\r\n <input\r\n type=\"range\"\r\n [(ngModel)]=\"filterBrightnessValue\"\r\n (ngModelChange)=\"filterBrightnessValueChanged($event, true)\"\r\n (change)=\"filterBrightnessValueChanged($event, false)\"\r\n min=\"-1\"\r\n max=\"1\"\r\n step=\"0.03\"\r\n [disabled]=\"filterBrightnessChecked == false\"\r\n />\r\n </div>\r\n </div>\r\n <div class=\"tui-image-editor-checkbox-group tui-image-editor-disabled\">\r\n <div class=\"tui-image-editor-checkbox\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-noise\"\r\n [(ngModel)]=\"filterNoiseChecked\"\r\n (ngModelChange)=\"filterNoiseCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-noise\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n <div class=\"tui-image-editor-range-wrap short tui-image-editor-d-flex tui-image-editor-flex-row align-items-center tui-image-editor-my-2\">\r\n <input\r\n type=\"range\"\r\n [(ngModel)]=\"filterNoiseValue\"\r\n (ngModelChange)=\"filterNoiseValueChanged($event, true)\"\r\n (change)=\"filterNoiseValueChanged($event, false)\"\r\n min=\"0\"\r\n max=\"1000\"\r\n step=\"10\"\r\n [disabled]=\"filterNoiseChecked == false\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"tui-image-editor-partition only-left-right\">\r\n <div></div>\r\n </div>\r\n <div class=\"tui-image-editor-submenu-align\">\r\n <div class=\"tui-image-editor-checkbox-group tui-image-editor-disabled\">\r\n <div class=\"tui-image-editor-checkbox\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-pixelate\"\r\n [(ngModel)]=\"filterPixelateChecked\"\r\n (ngModelChange)=\"filterPixelateCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-pixelate\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n <div class=\"tui-image-editor-range-wrap short tui-image-editor-d-flex tui-image-editor-flex-row align-items-center tui-image-editor-my-2\">\r\n <input\r\n type=\"range\"\r\n [(ngModel)]=\"filterPixelateValue\"\r\n (ngModelChange)=\"filterPixelateValueChanged($event, true)\"\r\n (change)=\"filterPixelateValueChanged($event, false)\"\r\n min=\"2\"\r\n max=\"20\"\r\n step=\"1\"\r\n [disabled]=\"filterPixelateChecked == false\"\r\n />\r\n </div>\r\n </div>\r\n <div class=\"tui-image-editor-checkbox-group tui-image-editor-disabled\">\r\n <div class=\"tui-image-editor-newline tui-image-editor-checkbox-wrap\">\r\n <div class=\"tui-image-editor-checkbox\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-color-filter\"\r\n [(ngModel)]=\"filterColorFilterChecked\"\r\n (ngModelChange)=\"filterColorFilterCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-colorFilter\"\r\n | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n </div>\r\n <div class=\"tui-image-editor-newline tui-image-editor-range-wrap short\">\r\n <label>{{\r\n \"tui-image-editor-angular-submenus-filter-colorFilter-threshold\"\r\n | translate\r\n }}</label>\r\n <div class=\"tie-colorfilter-threshold-range tui-image-editor-range tui-image-editor-d-flex tui-image-editor-flex-row align-items-center tui-image-editor-my-2\">\r\n <input\r\n type=\"range\"\r\n [(ngModel)]=\"filterColorFilterThreshold\"\r\n (ngModelChange)=\"filterColorFilterThresholdChanged($event, true)\"\r\n (change)=\"filterColorFilterThresholdChanged($event, false)\"\r\n min=\"0\"\r\n max=\"1\"\r\n step=\"0.02\"\r\n [disabled]=\"filterColorFilterChecked == false\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"tui-image-editor-partition\">\r\n <div></div>\r\n </div>\r\n <div\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center\"\r\n >\r\n <div class=\"filter-color-item\">\r\n <div\r\n [class]=\"\r\n 'tie-filter-tint-color tui-image-editor-button tui-image-editor-button-color-picker tui-image-editor-d-flex tui-image-editor-flex-column tui-image-editor-align-items-center ' +\r\n (filterTintChecked ? 'active' : '')\r\n \"\r\n [title]=\"'tui-image-editor-angular-submenus-filter-tint' | translate\"\r\n >\r\n <input\r\n readonly\r\n class=\"tie-filter-tint-color-picker tui-image-editor-mb-2\"\r\n [(colorPicker)]=\"filterTintColor\"\r\n [style.background]=\"filterTintColor\"\r\n [cpOutputFormat]=\"'rgba'\"\r\n [cpPresetColors]=\"defaultFilterTintColors\"\r\n (colorPickerChange)=\"filterTintColorChanged($event)\"\r\n [cpUseRootViewContainer]=\"true\"\r\n />\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-tint\"\r\n [(ngModel)]=\"filterTintChecked\"\r\n (ngModelChange)=\"filterTintCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-tint\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n </div>\r\n <div class=\"filter-color-item\">\r\n <div\r\n [class]=\"\r\n 'tie-filter-multiply-color tui-image-editor-button tui-image-editor-button-color-picker tui-image-editor-d-flex tui-image-editor-flex-column tui-image-editor-align-items-center ' +\r\n (filterMultiplyChecked ? 'active' : '')\r\n \"\r\n [title]=\"\r\n 'tui-image-editor-angular-submenus-filter-multiply' | translate\r\n \"\r\n >\r\n <input\r\n readonly\r\n class=\"tie-filter-multiply-color-picker tui-image-editor-mb-2\"\r\n [(colorPicker)]=\"filterMultiplyColor\"\r\n [style.background]=\"filterMultiplyColor\"\r\n [cpOutputFormat]=\"'hex'\"\r\n [cpPresetColors]=\"defaultFilterMultiplyColors\"\r\n (colorPickerChange)=\"filterMultiplyColorChanged($event)\"\r\n [cpUseRootViewContainer]=\"true\"\r\n />\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-multiply\"\r\n [(ngModel)]=\"filterMultiplyChecked\"\r\n (ngModelChange)=\"filterMultiplyCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-multiply\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n </div>\r\n <div class=\"filter-color-item\">\r\n <div\r\n [class]=\"\r\n 'tie-filter-blend-color tui-image-editor-button tui-image-editor-button-color-picker tui-image-editor-d-flex tui-image-editor-flex-column tui-image-editor-align-items-center ' +\r\n (filterBlendChecked ? 'active' : '')\r\n \"\r\n [title]=\"'tui-image-editor-angular-submenus-filter-blend' | translate\"\r\n >\r\n <input\r\n readonly\r\n class=\"tie-filter-blend-color-picker tui-image-editor-mb-2\"\r\n [(colorPicker)]=\"filterBlendColor\"\r\n [style.background]=\"filterBlendColor\"\r\n [cpOutputFormat]=\"'rgba'\"\r\n [cpPresetColors]=\"defaultFilterBlendColors\"\r\n (colorPickerChange)=\"filterBlendColorChanged($event)\"\r\n [cpUseRootViewContainer]=\"true\"\r\n />\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-blend\"\r\n [(ngModel)]=\"filterBlendChecked\"\r\n (ngModelChange)=\"filterBlendCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-blend\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [""], dependencies: [{ kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.RangeValueAccessor, selector: "input[type=range][formControlName],input[type=range][formControl],input[type=range][ngModel]" }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.ColorPickerDirective, selector: "[colorPicker]", inputs: ["colorPicker", "cpWidth", "cpHeight", "cpToggle", "cpDisabled", "cpIgnoredElements", "cpFallbackColor", "cpColorMode", "cpCmykEnabled", "cpOutputFormat", "cpAlphaChannel", "cpDisableInput", "cpDialogDisplay", "cpSaveClickOutside", "cpCloseClickOutside", "cpUseRootViewContainer", "cpPosition", "cpPositionOffset", "cpPositionRelativeToArrow", "cpOKButton", "cpOKButtonText", "cpOKButtonClass", "cpCancelButton", "cpCancelButtonText", "cpCancelButtonClass", "cpEyeDropper", "cpPresetLabel", "cpPresetColors", "cpPresetColorsClass", "cpMaxPresetColorsLength", "cpPresetEmptyMessage", "cpPresetEmptyMessageClass", "cpAddColorButton", "cpAddColorButtonText", "cpAddColorButtonClass", "cpRemoveColorButtonClass", "cpExtraTemplate"], outputs: ["cpInputChange", "cpToggleChange", "cpSliderChange", "cpSliderDragEnd", "cpSliderDragStart", "colorPickerOpen", "colorPickerClose", "colorPickerCancel", "colorPickerSelect", "colorPickerChange", "cpCmykColorChange", "cpPresetColorsChange"], exportAs: ["ngxColorPicker"] }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }] });
339
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: FilterComponent, decorators: [{
340
+ type: Component,
341
+ args: [{ selector: 'tui-image-editor-submenus-filter', template: "<div\r\n class=\"tui-image-editor-menu-filter tui-image-editor-d-flex tui-image-editor-justify-content-center\"\r\n>\r\n <div\r\n class=\"tui-image-editor-submenu-item tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-overflowable-x tui-image-editor-py-3\"\r\n >\r\n <div class=\"tui-image-editor-submenu-align\">\r\n <div\r\n class=\"tui-image-editor-checkbox-wrap fixed-width tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-flex-wrap tui-image-editor-justify-content-center\"\r\n >\r\n <div class=\"tui-image-editor-checkbox tui-image-editor-align-self-center\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-grayscale\"\r\n [(ngModel)]=\"filterGrayscaleChecked\"\r\n (ngModelChange)=\"filterGrayscaleCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-grayscale\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n <div class=\"tui-image-editor-checkbox tui-image-editor-align-self-center\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-invert\"\r\n [(ngModel)]=\"filterInvertChecked\"\r\n (ngModelChange)=\"filterInvertCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-invert\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n <div class=\"tui-image-editor-checkbox tui-image-editor-align-self-center\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-sepia\"\r\n [(ngModel)]=\"filterSepiaChecked\"\r\n (ngModelChange)=\"filterSepiaCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-sepia\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n <div class=\"tui-image-editor-checkbox tui-image-editor-align-self-center\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-vintage\"\r\n [(ngModel)]=\"filterVintageChecked\"\r\n (ngModelChange)=\"filterVintageCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-sepia2\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n <div class=\"tui-image-editor-checkbox tui-image-editor-align-self-center\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-blur\"\r\n [(ngModel)]=\"filterBlurChecked\"\r\n (ngModelChange)=\"filterBlurCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-blur\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n <div class=\"tui-image-editor-checkbox tui-image-editor-align-self-center\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-sharpen\"\r\n [(ngModel)]=\"filterSharpenChecked\"\r\n (ngModelChange)=\"filterSharpenCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-sharpen\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n <div class=\"tui-image-editor-checkbox tui-image-editor-align-self-center\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-emboss\"\r\n [(ngModel)]=\"filterEmbossChecked\"\r\n (ngModelChange)=\"filterEmbossCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-emboss\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"tui-image-editor-partition\">\r\n <div></div>\r\n </div>\r\n <div class=\"tui-image-editor-submenu-align\">\r\n <div\r\n class=\"tui-image-editor-checkbox-group tui-image-editor-disabled\"\r\n style=\"margin-bottom: 7px\"\r\n >\r\n <div class=\"tui-image-editor-checkbox-wrap\">\r\n <div class=\"tui-image-editor-checkbox\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-remove-white\"\r\n [(ngModel)]=\"filterWhiteRemovalChecked\"\r\n (ngModelChange)=\"filterWhiteRemovalCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-removeWhite\"\r\n | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n </div>\r\n <div\r\n class=\"tui-image-editor-newline tui-image-editor-range-wrap short tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-flex-nowrap tui-image-editor-align-items-center\"\r\n >\r\n <label>{{\r\n \"tui-image-editor-angular-submenus-filter-removeWhite-distance\"\r\n | translate\r\n }}</label>\r\n <input\r\n type=\"range\"\r\n [(ngModel)]=\"filterWhiteRemovalDistance\"\r\n (ngModelChange)=\"filterWhiteRemovalDistanceChanged($event, true)\"\r\n (change)=\"filterWhiteRemovalDistanceChanged($event, false)\"\r\n min=\"0\"\r\n max=\"1\"\r\n step=\"0.001\"\r\n [disabled]=\"filterWhiteRemovalChecked == false\"\r\n />\r\n </div>\r\n </div>\r\n <div class=\"tui-image-editor-checkbox-group tui-image-editor-disabled\">\r\n <div class=\"tui-image-editor-checkbox\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-brightness\"\r\n [(ngModel)]=\"filterBrightnessChecked\"\r\n (ngModelChange)=\"filterBrightnessCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-brightness\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n <div class=\"tui-image-editor-range-wrap short tui-image-editor-d-flex tui-image-editor-flex-row align-items-center tui-image-editor-my-2\">\r\n <input\r\n type=\"range\"\r\n [(ngModel)]=\"filterBrightnessValue\"\r\n (ngModelChange)=\"filterBrightnessValueChanged($event, true)\"\r\n (change)=\"filterBrightnessValueChanged($event, false)\"\r\n min=\"-1\"\r\n max=\"1\"\r\n step=\"0.03\"\r\n [disabled]=\"filterBrightnessChecked == false\"\r\n />\r\n </div>\r\n </div>\r\n <div class=\"tui-image-editor-checkbox-group tui-image-editor-disabled\">\r\n <div class=\"tui-image-editor-checkbox\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-noise\"\r\n [(ngModel)]=\"filterNoiseChecked\"\r\n (ngModelChange)=\"filterNoiseCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-noise\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n <div class=\"tui-image-editor-range-wrap short tui-image-editor-d-flex tui-image-editor-flex-row align-items-center tui-image-editor-my-2\">\r\n <input\r\n type=\"range\"\r\n [(ngModel)]=\"filterNoiseValue\"\r\n (ngModelChange)=\"filterNoiseValueChanged($event, true)\"\r\n (change)=\"filterNoiseValueChanged($event, false)\"\r\n min=\"0\"\r\n max=\"1000\"\r\n step=\"10\"\r\n [disabled]=\"filterNoiseChecked == false\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"tui-image-editor-partition only-left-right\">\r\n <div></div>\r\n </div>\r\n <div class=\"tui-image-editor-submenu-align\">\r\n <div class=\"tui-image-editor-checkbox-group tui-image-editor-disabled\">\r\n <div class=\"tui-image-editor-checkbox\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-pixelate\"\r\n [(ngModel)]=\"filterPixelateChecked\"\r\n (ngModelChange)=\"filterPixelateCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-pixelate\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n <div class=\"tui-image-editor-range-wrap short tui-image-editor-d-flex tui-image-editor-flex-row align-items-center tui-image-editor-my-2\">\r\n <input\r\n type=\"range\"\r\n [(ngModel)]=\"filterPixelateValue\"\r\n (ngModelChange)=\"filterPixelateValueChanged($event, true)\"\r\n (change)=\"filterPixelateValueChanged($event, false)\"\r\n min=\"2\"\r\n max=\"20\"\r\n step=\"1\"\r\n [disabled]=\"filterPixelateChecked == false\"\r\n />\r\n </div>\r\n </div>\r\n <div class=\"tui-image-editor-checkbox-group tui-image-editor-disabled\">\r\n <div class=\"tui-image-editor-newline tui-image-editor-checkbox-wrap\">\r\n <div class=\"tui-image-editor-checkbox\">\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-color-filter\"\r\n [(ngModel)]=\"filterColorFilterChecked\"\r\n (ngModelChange)=\"filterColorFilterCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-colorFilter\"\r\n | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n </div>\r\n <div class=\"tui-image-editor-newline tui-image-editor-range-wrap short\">\r\n <label>{{\r\n \"tui-image-editor-angular-submenus-filter-colorFilter-threshold\"\r\n | translate\r\n }}</label>\r\n <div class=\"tie-colorfilter-threshold-range tui-image-editor-range tui-image-editor-d-flex tui-image-editor-flex-row align-items-center tui-image-editor-my-2\">\r\n <input\r\n type=\"range\"\r\n [(ngModel)]=\"filterColorFilterThreshold\"\r\n (ngModelChange)=\"filterColorFilterThresholdChanged($event, true)\"\r\n (change)=\"filterColorFilterThresholdChanged($event, false)\"\r\n min=\"0\"\r\n max=\"1\"\r\n step=\"0.02\"\r\n [disabled]=\"filterColorFilterChecked == false\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"tui-image-editor-partition\">\r\n <div></div>\r\n </div>\r\n <div\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center\"\r\n >\r\n <div class=\"filter-color-item\">\r\n <div\r\n [class]=\"\r\n 'tie-filter-tint-color tui-image-editor-button tui-image-editor-button-color-picker tui-image-editor-d-flex tui-image-editor-flex-column tui-image-editor-align-items-center ' +\r\n (filterTintChecked ? 'active' : '')\r\n \"\r\n [title]=\"'tui-image-editor-angular-submenus-filter-tint' | translate\"\r\n >\r\n <input\r\n readonly\r\n class=\"tie-filter-tint-color-picker tui-image-editor-mb-2\"\r\n [(colorPicker)]=\"filterTintColor\"\r\n [style.background]=\"filterTintColor\"\r\n [cpOutputFormat]=\"'rgba'\"\r\n [cpPresetColors]=\"defaultFilterTintColors\"\r\n (colorPickerChange)=\"filterTintColorChanged($event)\"\r\n [cpUseRootViewContainer]=\"true\"\r\n />\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-tint\"\r\n [(ngModel)]=\"filterTintChecked\"\r\n (ngModelChange)=\"filterTintCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-tint\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n </div>\r\n <div class=\"filter-color-item\">\r\n <div\r\n [class]=\"\r\n 'tie-filter-multiply-color tui-image-editor-button tui-image-editor-button-color-picker tui-image-editor-d-flex tui-image-editor-flex-column tui-image-editor-align-items-center ' +\r\n (filterMultiplyChecked ? 'active' : '')\r\n \"\r\n [title]=\"\r\n 'tui-image-editor-angular-submenus-filter-multiply' | translate\r\n \"\r\n >\r\n <input\r\n readonly\r\n class=\"tie-filter-multiply-color-picker tui-image-editor-mb-2\"\r\n [(colorPicker)]=\"filterMultiplyColor\"\r\n [style.background]=\"filterMultiplyColor\"\r\n [cpOutputFormat]=\"'hex'\"\r\n [cpPresetColors]=\"defaultFilterMultiplyColors\"\r\n (colorPickerChange)=\"filterMultiplyColorChanged($event)\"\r\n [cpUseRootViewContainer]=\"true\"\r\n />\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-multiply\"\r\n [(ngModel)]=\"filterMultiplyChecked\"\r\n (ngModelChange)=\"filterMultiplyCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-multiply\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n </div>\r\n <div class=\"filter-color-item\">\r\n <div\r\n [class]=\"\r\n 'tie-filter-blend-color tui-image-editor-button tui-image-editor-button-color-picker tui-image-editor-d-flex tui-image-editor-flex-column tui-image-editor-align-items-center ' +\r\n (filterBlendChecked ? 'active' : '')\r\n \"\r\n [title]=\"'tui-image-editor-angular-submenus-filter-blend' | translate\"\r\n >\r\n <input\r\n readonly\r\n class=\"tie-filter-blend-color-picker tui-image-editor-mb-2\"\r\n [(colorPicker)]=\"filterBlendColor\"\r\n [style.background]=\"filterBlendColor\"\r\n [cpOutputFormat]=\"'rgba'\"\r\n [cpPresetColors]=\"defaultFilterBlendColors\"\r\n (colorPickerChange)=\"filterBlendColorChanged($event)\"\r\n [cpUseRootViewContainer]=\"true\"\r\n />\r\n <label\r\n class=\"tui-image-editor-d-flex tui-image-editor-flex-row tui-image-editor-align-items-center tui-image-editor-flex-nowrap\"\r\n >\r\n <input\r\n type=\"checkbox\"\r\n class=\"tie-blend\"\r\n [(ngModel)]=\"filterBlendChecked\"\r\n (ngModelChange)=\"filterBlendCheckedChanged($event)\"\r\n />\r\n <span>{{\r\n \"tui-image-editor-angular-submenus-filter-blend\" | translate\r\n }}</span>\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n" }]
342
+ }], ctorParameters: function () { return [{ type: i1.HistoryService }]; }, propDecorators: { imageEditor: [{
343
+ type: Input
344
+ }] } });
345
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1aS1pbWFnZS1lZGl0b3ItYW5ndWxhcjIvc3JjL2xpYi9zdWJtZW51cy9maWx0ZXIvZmlsdGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1aS1pbWFnZS1lZGl0b3ItYW5ndWxhcjIvc3JjL2xpYi9zdWJtZW51cy9maWx0ZXIvZmlsdGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUVwRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBZ0IsTUFBTSxjQUFjLENBQUM7QUFDdkUsT0FBTyxFQUFlLGVBQWUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRTdFLE9BQU8sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDOzs7Ozs7QUFPekQsTUFBTSxPQUFPLGVBQWU7SUEyQzFCLFlBQW9CLGNBQThCO1FBQTlCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQXZDM0Msc0JBQWlCLEdBQVksS0FBSyxDQUFDO1FBQ25DLG9CQUFlLEdBQVcsR0FBRyxDQUFDO1FBRTlCLDJCQUFzQixHQUFZLEtBQUssQ0FBQztRQUN4Qyx1QkFBa0IsR0FBWSxLQUFLLENBQUM7UUFDcEMsd0JBQW1CLEdBQVksS0FBSyxDQUFDO1FBQ3JDLHdCQUFtQixHQUFZLEtBQUssQ0FBQztRQUNyQyx5QkFBb0IsR0FBWSxLQUFLLENBQUM7UUFDdEMseUJBQW9CLEdBQVksS0FBSyxDQUFDO1FBRXRDLDhCQUF5QixHQUFZLEtBQUssQ0FBQztRQUMzQywrQkFBMEIsR0FBVyxHQUFHLENBQUM7UUFFekMsNEJBQXVCLEdBQVksS0FBSyxDQUFDO1FBQ3pDLDBCQUFxQixHQUFXLENBQUMsQ0FBQztR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RUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7aUJBQ3REO2dCQUNELE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQzthQUM3RDtpQkFBTSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUMzQyxNQUFNLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDckQsSUFBSSxJQUFJLElBQUksWUFBWSxFQUFFO29CQUN4QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO29CQUMvQixJQUFJLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDO29CQUNuQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO2lCQUNqQzthQUNGO1FBQ0gsQ0FBQyxDQUFDO1FBQ0YsSUFBSSxRQUFRLEVBQUU7WUFDWixNQUFNLGlCQUFpQixFQUFFLENBQUM7U0FDM0I7YUFBTTtZQUNMLFVBQVUsQ0FBQyxLQUFLLElBQUksRUFBRTtnQkFDcEIsTUFBTSxpQkFBaUIsRUFBRSxDQUFDO1lBQzVCLENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDOzs0R0FuZ0JVLGVBQWU7Z0dBQWYsZUFBZSxnSENaNUIscWtqQkFtWkE7MkZEdllhLGVBQWU7a0JBTDNCLFNBQVM7K0JBQ0Usa0NBQWtDO3FHQUtuQyxXQUFXO3NCQUFuQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZGVmYXVsdENvbG9ycywgZmlsdGVyVHlwZSwgaGlzdG9yeU5hbWVzIH0gZnJvbSAnLi4vLi4vY29uc3RzJztcclxuaW1wb3J0IHsgSGlzdG9yeUl0ZW0sIEhpc3RvcnlJdGVtVHlwZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvaGlzdG9yeS1pdGVtJztcclxuaW1wb3J0IHsgSGlzdG9yeVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9oaXN0b3J5LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyByZW1vdmVGaWx0ZXIsIHJnYmFUb09iamVjdCB9IGZyb20gJy4uLy4uL3V0aWxzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndHVpLWltYWdlLWVkaXRvci1zdWJtZW51cy1maWx0ZXInLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9maWx0ZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2ZpbHRlci5jb21wb25lbnQuY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBGaWx0ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgQElucHV0KCkgaW1hZ2VFZGl0b3I6IGFueTtcclxuICBwdWJsaWMgYWN0aXZlT2JqZWN0SWQ6IG51bWJlcjtcclxuXHJcbiAgcHVibGljIGZpbHRlckJsdXJDaGVja2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGZpbHRlckJsdXJWYWx1ZTogbnVtYmVyID0gMC4xO1xyXG5cclxuICBwdWJsaWMgZmlsdGVyR3JheXNjYWxlQ2hlY2tlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBmaWx0ZXJTZXBpYUNoZWNrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgZmlsdGVyRW1ib3NzQ2hlY2tlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBmaWx0ZXJJbnZlcnRDaGVja2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGZpbHRlclZpbnRhZ2VDaGVja2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGZpbHRlclNoYXJwZW5DaGVja2VkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHB1YmxpYyBmaWx0ZXJXaGl0ZVJlbW92YWxDaGVja2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGZpbHRlcldoaXRlUmVtb3ZhbERpc3RhbmNlOiBudW1iZXIgPSAwLjU7XHJcblxyXG4gIHB1YmxpYyBmaWx0ZXJCcmlnaHRuZXNzQ2hlY2tlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBmaWx0ZXJCcmlnaHRuZXNzVmFsdWU6IG51bWJlciA9IDA7XHJcblxyXG4gIHB1YmxpYyBmaWx0ZXJOb2lzZUNoZWNrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgZmlsdGVyTm9pc2VWYWx1ZTogbnVtYmVyID0gMTAwO1xyXG5cclxuICBwdWJsaWMgZmlsdGVyUGl4ZWxhdGVDaGVja2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGZpbHRlclBpeGVsYXRlVmFsdWU6IG51bWJlciA9IDE1O1xyXG5cclxuICBwdWJsaWMgZmlsdGVyQ29sb3JGaWx0ZXJDaGVja2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGZpbHRlckNvbG9yRmlsdGVyVGhyZXNob2xkOiBudW1iZXIgPSAwO1xyXG5cclxuICBwdWJsaWMgZGVmYXVsdEZpbHRlclRpbnRDb2xvcnM6IHN0cmluZ1tdID0gZGVmYXVsdENvbG9ycztcclxuICBwdWJsaWMgZmlsdGVyVGludENoZWNrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgZmlsdGVyVGludENvbG9yOiBzdHJpbmcgPSAncmdiYSgzLCAxODksIDE1OCwgMC43KSc7XHJcblxyXG4gIHB1YmxpYyBkZWZhdWx0RmlsdGVyTXVsdGlwbHlDb2xvcnM6IHN0cmluZ1tdID0gZGVmYXVsdENvbG9ycztcclxuICBwdWJsaWMgZmlsdGVyTXVsdGlwbHlDaGVja2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGZpbHRlck11bHRpcGx5Q29sb3I6IHN0cmluZyA9ICdyZ2IoODEsIDkyLCAyMzApJztcclxuXHJcbiAgcHVibGljIGRlZmF1bHRGaWx0ZXJCbGVuZENvbG9yczogc3RyaW5nW10gPSBkZWZhdWx0Q29sb3JzO1xyXG4gIHB1YmxpYyBmaWx0ZXJCbGVuZENoZWNrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgZmlsdGVyQmxlbmRDb2xvcjogc3RyaW5nID0gJ3JnYmEoMjU1LCAxODcsIDU5LCAxKSc7XHJcblxyXG4gIHByaXZhdGUgaGlzdG9yeVNlcnZpY2VTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBoaXN0b3J5U2VydmljZTogSGlzdG9yeVNlcnZpY2UpIHt9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5oaXN0b3J5U2VydmljZVN1YnNjcmlwdGlvbiA9IHRoaXMuaGlzdG9yeVNlcnZpY2Uub25DaGFuZ2VFbWl0dGVyLnN1YnNjcmliZShcclxuICAgICAgKGl0ZW1zKSA9PlxyXG4gICAgICAgIGl0ZW1zICE9IG51bGwgJiYgaXRlbXMubGVuZ3RoICE9IDBcclxuICAgICAgICAgID8gdGhpcy5yZWJpbmRGaWVsZHMoaXRlbXMpXHJcbiAgICAgICAgICA6IHRoaXMucmViaW5kRmllbGRzKHRoaXMuaGlzdG9yeVNlcnZpY2UuaXRlbXMpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmhpc3RvcnlTZXJ2aWNlU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlYmluZEZpZWxkcyhpdGVtczogSGlzdG9yeUl0ZW1bXSkge1xyXG4gICAgY29uc29sZS5kZWJ1ZyhpdGVtcyk7XHJcbiAgICBpZiAodGhpcy5pbWFnZUVkaXRvciAhPSBudWxsKSB7XHJcbiAgICAgIHRoaXMuZmlsdGVyQmx1ckNoZWNrZWQgPSB0aGlzLmltYWdlRWRpdG9yLmhhc0ZpbHRlcignYmx1cicpO1xyXG4gICAgICB0aGlzLmZpbHRlckJyaWdodG5lc3NDaGVja2VkID0gdGhpcy5pbWFnZUVkaXRvci5oYXNGaWx0ZXIoJ2JyaWdodG5lc3MnKTtcclxuICAgICAgaWYgKHRoaXMuZmlsdGVyQnJpZ2h0bmVzc0NoZWNrZWQpIHtcclxuICAgICAgICB0aGlzLmZpbHRlckJyaWdodG5lc3NWYWx1ZSA9IHRoaXMuZ2V0QXBwbGllZEZpbHRlckFyZ3VtZW50KFxyXG4gICAgICAgICAgaXRlbXMsXHJcbiAgICAgICAgICBmaWx0ZXJUeXBlLkJSSUdIVE5FU1MsXHJcbiAgICAgICAgICAwXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmZpbHRlckNvbG9yRmlsdGVyQ2hlY2tlZCA9XHJcbiAgICAgICAgdGhpcy5pbWFnZUVkaXRvci5oYXNGaWx0ZXIoJ3JlbW92ZUNvbG9yJykgJiZcclxuICAgICAgICB0aGlzLmhhc0FwcGxpZWRGaWx0ZXIoaXRlbXMsIGZpbHRlclR5cGUuUkVNT1ZFX0NPTE9SKTtcclxuICAgICAgaWYgKHRoaXMuZmlsdGVyQ29sb3JGaWx0ZXJDaGVja2VkKSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJDb2xvckZpbHRlclRocmVzaG9sZCA9IHRoaXMuZ2V0QXBwbGllZEZpbHRlckFyZ3VtZW50KFxyXG4gICAgICAgICAgaXRlbXMsXHJcbiAgICAgICAgICBmaWx0ZXJUeXBlLlJFTU9WRV9DT0xPUixcclxuICAgICAgICAgIDBcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZmlsdGVyRW1ib3NzQ2hlY2tlZCA9IHRoaXMuaW1hZ2VFZGl0b3IuaGFzRmlsdGVyKCdlbWJvc3MnKTtcclxuICAgICAgdGhpcy5maWx0ZXJHcmF5c2NhbGVDaGVja2VkID0gdGhpcy5pbWFnZUVkaXRvci5oYXNGaWx0ZXIoJ2dyYXlzY2FsZScpO1xyXG4gICAgICB0aGlzLmZpbHRlckludmVydENoZWNrZWQgPSB0aGlzLmltYWdlRWRpdG9yLmhhc0ZpbHRlcignaW52ZXJ0Jyk7XHJcbiAgICAgIHRoaXMuZmlsdGVyTm9pc2VDaGVja2VkID0gdGhpcy5pbWFnZUVkaXRvci5oYXNGaWx0ZXIoJ25vaXNlJyk7XHJcbiAgICAgIGlmICh0aGlzLmZpbHRlck5vaXNlQ2hlY2tlZCkge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyTm9pc2VWYWx1ZSA9IHRoaXMuZ2V0QXBwbGllZEZpbHRlckFyZ3VtZW50KFxyXG4gICAgICAgICAgaXRlbXMsXHJcbiAgICAgICAgICBmaWx0ZXJUeXBlLk5PSVNFLFxyXG4gICAgICAgICAgMFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5maWx0ZXJQaXhlbGF0ZUNoZWNrZWQgPSB0aGlzLmltYWdlRWRpdG9yLmhhc0ZpbHRlcigncGl4ZWxhdGUnKTtcclxuICAgICAgaWYgKHRoaXMuZmlsdGVyUGl4ZWxhdGVDaGVja2VkKSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJQaXhlbGF0ZVZhbHVlID0gdGhpcy5nZXRBcHBsaWVkRmlsdGVyQXJndW1lbnQoXHJcbiAgICAgICAgICBpdGVtcyxcclxuICAgICAgICAgIGZpbHRlclR5cGUuUElYRUxBVEUsXHJcbiAgICAgICAgICAwXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmZpbHRlclNlcGlhQ2hlY2tlZCA9IHRoaXMuaW1hZ2VFZGl0b3IuaGFzRmlsdGVyKCdzZXBpYScpO1xyXG4gICAgICB0aGlzLmZpbHRlclNoYXJwZW5DaGVja2VkID0gdGhpcy5pbWFnZUVkaXRvci5oYXNGaWx0ZXIoJ3NoYXJwZW4nKTtcclxuICAgICAgdGhpcy5maWx0ZXJWaW50YWdlQ2hlY2tlZCA9IHRoaXMuaW1hZ2VFZGl0b3IuaGFzRmlsdGVyKCd2aW50YWdlJyk7XHJcbiAgICAgIHRoaXMuZmlsdGVyV2hpdGVSZW1vdmFsQ2hlY2tlZCA9XHJcbiAgICAgICAgdGhpcy5pbWFnZUVkaXRvci5oYXNGaWx0ZXIoJ3JlbW92ZUNvbG9yJykgJiZcclxuICAgICAgICB0aGlzLmhhc0FwcGxpZWRGaWx0ZXIoaXRlbXMsIGZpbHRlclR5cGUuUkVNT1ZFX1dISVRFKTtcclxuICAgICAgaWYgKHRoaXMuZmlsdGVyV2hpdGVSZW1vdmFsQ2hlY2tlZCkge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyV2hpdGVSZW1vdmFsRGlzdGFuY2UgPSB0aGlzLmdldEFwcGxpZWRGaWx0ZXJBcmd1bWVudChcclxuICAgICAgICAgIGl0ZW1zLFxyXG4gICAgICAgICAgZmlsdGVyVHlwZS5SRU1PVkVfV0hJVEUsXHJcbiAgICAgICAgICAwXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5maWx0ZXJNdWx0aXBseUNoZWNrZWQgPVxyXG4gICAgICAgIHRoaXMuaW1hZ2VFZGl0b3IuaGFzRmlsdGVyKCdibGVuZENvbG9yJykgJiZcclxuICAgICAgICB0aGlzLmhhc0FwcGxpZWRGaWx0ZXIoaXRlbXMsIGZpbHRlclR5cGUuTVVMVElQTFkpO1xyXG4gICAgICBpZiAodGhpcy5maWx0ZXJNdWx0aXBseUNoZWNrZWQpIHtcclxuICAgICAgICB0aGlzLmZpbHRlck11bHRpcGx5Q29sb3IgPSB0aGlzLmdldEFwcGxpZWRGaWx0ZXJBcmd1bWVudChcclxuICAgICAgICAgIGl0ZW1zLFxyXG4gICAgICAgICAgZmlsdGVyVHlwZS5NVUxUSVBMWSxcclxuICAgICAgICAgIDBcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZmlsdGVyVGludENoZWNrZWQgPVxyXG4gICAgICAgIHRoaXMuaW1hZ2VFZGl0b3IuaGFzRmlsdGVyKCdibGVuZENvbG9yJykgJiZcclxuICAgICAgICB0aGlzLmhhc0FwcGxpZWRGaWx0ZXIoaXRlbXMsIGZpbHRlclR5cGUuVElOVCk7XHJcbiAgICAgIGlmICh0aGlzLmZpbHRlclRpbnRDaGVja2VkKSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJUaW50Q29sb3IgPSB0aGlzLmdldEFwcGxpZWRGaWx0ZXJBcmd1bWVudChcclxuICAgICAgICAgIGl0ZW1zLFxyXG4gICAgICAgICAgZmlsdGVyVHlwZS5USU5ULFxyXG4gICAgICAgICAgMFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5maWx0ZXJCbGVuZENoZWNrZWQgPVxyXG4gICAgICAgIHRoaXMuaW1hZ2VFZGl0b3IuaGFzRmlsdGVyKCdibGVuZENvbG9yJykgJiZcclxuICAgICAgICB0aGlzLmhhc0FwcGxpZWRGaWx0ZXIoaXRlbXMsIGZpbHRlclR5cGUuQkxFTkQpO1xyXG4gICAgICBpZiAodGhpcy5maWx0ZXJCbGVuZENoZWNrZWQpIHtcclxuICAgICAgICB0aGlzLmZpbHRlckJsZW5kQ29sb3IgPSB0aGlzLmdldEFwcGxpZWRGaWx0ZXJBcmd1bWVudChcclxuICAgICAgICAgIGl0ZW1zLFxyXG4gICAgICAgICAgZmlsdGVyVHlwZS5CTEVORCxcclxuICAgICAgICAgIDBcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEFwcGxpZWRGaWx0ZXJBcmd1bWVudChcclxuICAgIGl0ZW1zOiBIaXN0b3J5SXRlbVtdLFxyXG4gICAgdHlwZTogZmlsdGVyVHlwZSxcclxuICAgIGluZGV4OiBudW1iZXJcclxuICApOiBhbnkge1xyXG4gICAgbGV0IHZhbGlkSXRlbXMgPSBpdGVtcy5maWx0ZXIoXHJcbiAgICAgIChmKSA9PiBmLmZpbHRlclR5cGUgPT09IHR5cGUgJiYgZi50eXBlID09PSBIaXN0b3J5SXRlbVR5cGUuQXBwbHlGaWx0ZXJcclxuICAgICk7XHJcbiAgICByZXR1cm4gdmFsaWRJdGVtc1t2YWxpZEl0ZW1zLmxlbmd0aCAtIDFdLmFyZ3NbaW5kZXhdO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYXNBcHBsaWVkRmlsdGVyKFxyXG4gICAgaGlzdG9yeUl0ZW1zOiBIaXN0b3J5SXRlbVtdLFxyXG4gICAgdHlwZTogZmlsdGVyVHlwZVxyXG4gICk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IGhhc0ZpbHRlciA9IGZhbHNlO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoaXN0b3J5SXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGl0ZW0gPSBoaXN0b3J5SXRlbXNbaV07XHJcbiAgICAgIGlmIChcclxuICAgICAgICBpdGVtLnR5cGUgPT09IEhpc3RvcnlJdGVtVHlwZS5BcHBseUZpbHRlciAmJlxyXG4gICAgICAgIGl0ZW0uZmlsdGVyVHlwZSA9PT0gdHlwZVxyXG4gICAgICApIHtcclxuICAgICAgICBoYXNGaWx0ZXIgPSB0cnVlO1xyXG4gICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgIGhhc0ZpbHRlciA9PSB0cnVlICYmXHJcbiAgICAgICAgW2ZpbHRlclR5cGUuVElOVCwgZmlsdGVyVHlwZS5CTEVORCwgZmlsdGVyVHlwZS5NVUxUSVBMWV0uc29tZShcclxuICAgICAgICAgICh0KSA9PiB0ID09PSB0eXBlXHJcbiAgICAgICAgKSAmJlxyXG4gICAgICAgIGl0ZW0udHlwZSA9PT0gSGlzdG9yeUl0ZW1UeXBlLlJlbW92ZUZpbHRlciAmJlxyXG4gICAgICAgIGl0ZW0uZmlsdGVyVHlwZSA9PT0gZmlsdGVyVHlwZS5CTEVORF9PUl9USU5UX09SX01VTFRJUExZXHJcbiAgICAgICkge1xyXG4gICAgICAgIGhhc0ZpbHRlciA9IGZhbHNlO1xyXG4gICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgIGhhc0ZpbHRlciA9PSB0cnVlICYmXHJcbiAgICAgICAgW2ZpbHRlclR5cGUuUkVNT1ZFX0NPTE9SLCBmaWx0ZXJUeXBlLlJFTU9WRV9XSElURV0uc29tZShcclxuICAgICAgICAgICh0KSA9PiB0ID09PSB0eXBlXHJcbiAgICAgICAgKSAmJlxyXG4gICAgICAgIGl0ZW0udHlwZSA9PT0gSGlzdG9yeUl0ZW1UeXBlLlJlbW92ZUZpbHRlciAmJlxyXG4gICAgICAgIGl0ZW0uZmlsdGVyVHlwZSA9PT0gZmlsdGVyVHlwZS5SRU1PVkVfQ09MT1JfT1JfV0hJVEVcclxuICAgICAgKSB7XHJcbiAgICAgICAgaGFzRmlsdGVyID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBoYXNGaWx0ZXI7XHJcbiAgfVxyXG5cclxuICBmaWx0ZXJXaGl0ZVJlbW92YWxDaGVja2VkQ2hhbmdlZChuZXdWYWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5maWx0ZXJBcHBseSgnd2hpdGUtcmVtb3ZhbCcpO1xyXG4gIH1cclxuXHJcbiAgZmlsdGVyV2hpdGVSZW1vdmFsRGlzdGFuY2VDaGFuZ2VkKG5ld1ZhbHVlOiBudW1iZXIsIGlzU2lsZW50OiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmZpbHRlckFwcGx5KCd3aGl0ZS1yZW1vdmFsJywgaXNTaWxlbnQpO1xyXG4gIH1cclxuXHJcbiAgZmlsdGVyQnJpZ2h0bmVzc0NoZWNrZWRDaGFuZ2VkKG5ld1ZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmZpbHRlckFwcGx5KCdicmlnaHRuZXNzJyk7XHJcbiAgfVxyXG5cclxuICBmaWx0ZXJCcmlnaHRuZXNzVmFsdWVDaGFuZ2VkKG5ld1ZhbHVlOiBudW1iZXIsIGlzU2lsZW50OiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmZpbHRlckFwcGx5KCdicmlnaHRuZXNzJywgaXNTaWxlbnQpO1xyXG4gIH1cclxuXHJcbiAgZmlsdGVyTm9pc2VDaGVja2VkQ2hhbmdlZChuZXdWYWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5maWx0ZXJBcHBseSgnbm9pc2UnKTtcclxuICB9XHJcblxyXG4gIGZpbHRlck5vaXNlVmFsdWVDaGFuZ2VkKG5ld1ZhbHVlOiBudW1iZXIsIGlzU2lsZW50OiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmZpbHRlckFwcGx5KCdub2lzZScsIGlzU2lsZW50KTtcclxuICB9XHJcblxyXG4gIGZpbHRlclBpeGVsYXRlQ2hlY2tlZENoYW5nZWQobmV3VmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuZmlsdGVyQXBwbHkoJ3BpeGVsYXRlJyk7XHJcbiAgfVxyXG5cclxuICBmaWx0ZXJQaXhlbGF0ZVZhbHVlQ2hhbmdlZChuZXdWYWx1ZTogbnVtYmVyLCBpc1NpbGVudDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5maWx0ZXJBcHBseSgncGl4ZWxhdGUnLCBpc1NpbGVudCk7XHJcbiAgfVxyXG5cclxuICBmaWx0ZXJDb2xvckZpbHRlckNoZWNrZWRDaGFuZ2VkKG5ld1ZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmZpbHRlckFwcGx5KCdyZW1vdmVDb2xvcicpO1xyXG4gIH1cclxuXHJcbiAgZmlsdGVyQ29sb3JGaWx0ZXJUaHJlc2hvbGRDaGFuZ2VkKG5ld1ZhbHVlOiBudW1iZXIsIGlzU2lsZW50OiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmZpbHRlckFwcGx5KCdyZW1vdmVDb2xvcicsIGlzU2lsZW50KTtcclxuICB9XHJcblxyXG4gIGZpbHRlclRpbnRDb2xvckNoYW5nZWQobmV3Q29sb3I6IHN0cmluZykge1xyXG4gICAgdGhpcy5maWx0ZXJBcHBseSgndGludCcpO1xyXG4gIH1cclxuXHJcbiAgZmlsdGVyVGludENoZWNrZWRDaGFuZ2VkKG5ld1ZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmZpbHRlckFwcGx5KCd0aW50Jyk7XHJcbiAgICBpZiAodGhpcy5maWx0ZXJUaW50Q2hlY2tlZCkge1xyXG4gICAgICB0aGlzLmZpbHRlck11bHRpcGx5Q2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmZpbHRlckJsZW5kQ2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZmlsdGVyTXVsdGlwbHlDb2xvckNoYW5nZWQobmV3Q29sb3I6IHN0cmluZykge1xyXG4gICAgdGhpcy5maWx0ZXJBcHBseSgnbXVsdGlwbHknKTtcclxuICB9XHJcblxyXG4gIGZpbHRlck11bHRpcGx5Q2hlY2tlZENoYW5nZWQobmV3VmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuZmlsdGVyQXBwbHkoJ211bHRpcGx5Jyk7XHJcbiAgICBpZiAodGhpcy5maWx0ZXJNdWx0aXBseUNoZWNrZWQpIHtcclxuICAgICAgdGhpcy5maWx0ZXJUaW50Q2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmZpbHRlckJsZW5kQ2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZmlsdGVyQmxlbmRDb2xvckNoYW5nZWQobmV3Q29sb3I6IHN0cmluZykge1xyXG4gICAgdGhpcy5maWx0ZXJBcHBseSgnYmxlbmQnKTtcclxuICB9XHJcblxyXG4gIGZpbHRlckJsZW5kQ2hlY2tlZENoYW5nZWQobmV3VmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuZmlsdGVyQXBwbHkoJ2JsZW5kJyk7XHJcbiAgICBpZiAodGhpcy5maWx0ZXJCbGVuZENoZWNrZWQpIHtcclxuICAgICAgdGhpcy5maWx0ZXJNdWx0aXBseUNoZWNrZWQgPSBmYWxzZTtcclxuICAgICAgdGhpcy5maWx0ZXJUaW50Q2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZmlsdGVyQmx1ckNoZWNrZWRDaGFuZ2VkKG5ld1ZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmZpbHRlckFwcGx5KCdibHVyJyk7XHJcbiAgfVxyXG5cclxuICBmaWx0ZXJHcmF5c2NhbGVDaGVja2VkQ2hhbmdlZChuZXdWYWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5maWx0ZXJBcHBseSgnZ3JheXNjYWxlJyk7XHJcbiAgfVxyXG5cclxuICBmaWx0ZXJTZXBpYUNoZWNrZWRDaGFuZ2VkKG5ld1ZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmZpbHRlckFwcGx5KCdzZXBpYScpO1xyXG4gIH1cclxuXHJcbiAgZmlsdGVyRW1ib3NzQ2hlY2tlZENoYW5nZWQobmV3VmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuZmlsdGVyQXBwbHkoJ2VtYm9zcycpO1xyXG4gIH1cclxuXHJcbiAgZmlsdGVySW52ZXJ0Q2hlY2tlZENoYW5nZWQobmV3VmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuZmlsdGVyQXBwbHkoJ2ludmVydCcpO1xyXG4gIH1cclxuXHJcbiAgZmlsdGVyVmludGFnZUNoZWNrZWRDaGFuZ2VkKG5ld1ZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmZpbHRlckFwcGx5KCd2aW50YWdlJyk7XHJcbiAgfVxyXG5cclxuICBmaWx0ZXJTaGFycGVuQ2hlY2tlZENoYW5nZWQobmV3VmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuZmlsdGVyQXBwbHkoJ3NoYXJwZW4nKTtcclxuICB9XHJcblxyXG4gIGZpbHRlckFwcGx5KFxyXG4gICAgdHlwZTpcclxuICAgICAgfCAnd2hpdGUtcmVtb3ZhbCdcclxuICAgICAgfCAnYnJpZ2h0bmVzcydcclxuICAgICAgfCAnbm9pc2UnXHJcbiAgICAgIHwgJ3BpeGVsYXRlJ1xyXG4gICAgICB8ICdyZW1vdmVDb2xvcidcclxuICAgICAgfCAnYmx1cidcclxuICAgICAgfCAnYmxlbmQnXHJcbiAgICAgIHwgJ211bHRpcGx5J1xyXG4gICAgICB8ICd0aW50J1xyXG4gICAgICB8ICdncmF5c2NhbGUnXHJcbiAgICAgIHwgJ3NlcGlhJ1xyXG4gICAgICB8ICdlbWJvc3MnXHJcbiAgICAgIHwgJ2ludmVydCdcclxuICAgICAgfCAndmludGFnZSdcclxuICAgICAgfCAnc2hhcnBlbicsXHJcbiAgICBpc1NpbGVudDogYm9vbGVhbiA9IGZhbHNlXHJcbiAgKSB7XHJcbiAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgY2FzZSAnd2hpdGUtcmVtb3ZhbCc6XHJcbiAgICAgICAgdGhpcy5maWx0ZXJBcHBseUNvbmZpcm1lZChcclxuICAgICAgICAgIHRoaXMuZmlsdGVyV2hpdGVSZW1vdmFsQ2hlY2tlZCxcclxuICAgICAgICAgICdyZW1vdmVDb2xvcicsXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbG9yOiAnI0ZGRkZGRicsXHJcbiAgICAgICAgICAgIHVzZUFscGhhOiBmYWxzZSxcclxuICAgICAgICAgICAgZGlzdGFuY2U6IHRoaXMuZmlsdGVyV2hpdGVSZW1vdmFsRGlzdGFuY2UsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgaXNTaWxlbnRcclxuICAgICAgICApO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdicmlnaHRuZXNzJzpcclxuICAgICAgICB0aGlzLmZpbHRlckFwcGx5Q29uZmlybWVkKFxyXG4gICAgICAgICAgdGhpcy5maWx0ZXJCcmlnaHRuZXNzQ2hlY2tlZCxcclxuICAgICAgICAgICdicmlnaHRuZXNzJyxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgYnJpZ2h0bmVzczogdGhpcy5maWx0ZXJCcmlnaHRuZXNzVmFsdWUsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgaXNTaWxlbnRcclxuICAgICAgICApO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdub2lzZSc6XHJcbiAgICAgICAgdGhpcy5maWx0ZXJBcHBseUNvbmZpcm1lZChcclxuICAgICAgICAgIHRoaXMuZmlsdGVyTm9pc2VDaGVja2VkLFxyXG4gICAgICAgICAgJ25vaXNlJyxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbm9pc2U6IHRoaXMuZmlsdGVyTm9pc2VWYWx1ZSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBpc1NpbGVudFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3BpeGVsYXRlJzpcclxuICAgICAgICB0aGlzLmZpbHRlckFwcGx5Q29uZmlybWVkKFxyXG4gICAgICAgICAgdGhpcy5maWx0ZXJQaXhlbGF0ZUNoZWNrZWQsXHJcbiAgICAgICAgICAncGl4ZWxhdGUnLFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBibG9ja3NpemU6IHRoaXMuZmlsdGVyUGl4ZWxhdGVWYWx1ZSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBpc1NpbGVudFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3JlbW92ZUNvbG9yJzpcclxuICAgICAgICB0aGlzLmZpbHRlckFwcGx5Q29uZmlybWVkKFxyXG4gICAgICAgICAgdGhpcy5maWx0ZXJDb2xvckZpbHRlckNoZWNrZWQsXHJcbiAgICAgICAgICAncmVtb3ZlQ29sb3InLFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBjb2xvcjogJyNGRkZGRkYnLFxyXG4gICAgICAgICAgICBkaXN0YW5jZTogdGhpcy5maWx0ZXJDb2xvckZpbHRlclRocmVzaG9sZCxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBpc1NpbGVudFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2JsdXInOlxyXG4gICAgICAgIHRoaXMuZmlsdGVyQXBwbHlDb25maXJtZWQoXHJcbiAgICAgICAgICB0aGlzLmZpbHRlckJsdXJDaGVja2VkLFxyXG4gICAgICAgICAgJ2JsdXInLFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBibHVyOiB0aGlzLmZpbHRlckJsdXJWYWx1ZSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBpc1NpbGVudFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2JsZW5kJzpcclxuICAgICAgICB0aGlzLmZpbHRlckFwcGx5Q29uZmlybWVkKFxyXG4gICAgICAgICAgdGhpcy5maWx0ZXJCbGVuZENoZWNrZWQsXHJcbiAgICAgICAgICAnYmxlbmRDb2xvcicsXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG1vZGU6ICdhZGQnLFxyXG4gICAgICAgICAgICBjb2xvcjogdGhpcy5maWx0ZXJCbGVuZENvbG9yLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGlzU2lsZW50XHJcbiAgICAgICAgKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnbXVsdGlwbHknOlxyXG4gICAgICAgIHRoaXMuZmlsdGVyQXBwbHlDb25maXJtZWQoXHJcbiAgICAgICAgICB0aGlzLmZpbHRlck11bHRpcGx5Q2hlY2tlZCxcclxuICAgICAgICAgICdibGVuZENvbG9yJyxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbW9kZTogJ211bHRpcGx5JyxcclxuICAgICAgICAgICAgY29sb3I6IHRoaXMuZmlsdGVyTXVsdGlwbHlDb2xvcixcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBpc1NpbGVudFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3RpbnQnOlxyXG4gICAgICAgIGxldCByZ2JUaW50ID0gcmdiYVRvT2JqZWN0KHRoaXMuZmlsdGVyVGludENvbG9yKTtcclxuXHJcbiAgICAgICAgdGhpcy5maWx0ZXJBcHBseUNvbmZpcm1lZChcclxuICAgICAgICAgIHRoaXMuZmlsdGVyVGludENoZWNrZWQsXHJcbiAgICAgICAgICAnYmxlbmRDb2xvcicsXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG1vZGU6ICd0aW50JyxcclxuICAgICAgICAgICAgY29sb3I6IHJnYlRpbnQuaGV4U3RyaW5nLFxyXG4gICAgICAgICAgICBhbHBoYTogcmdiVGludC5hbHBoYSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBpc1NpbGVudFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2dyYXlzY2FsZSc6XHJcbiAgICAgICAgdGhpcy5maWx0ZXJBcHBseUNvbmZpcm1lZChcclxuICAgICAgICAgIHRoaXMuZmlsdGVyR3JheXNjYWxlQ2hlY2tlZCxcclxuICAgICAgICAgIHR5cGUsXHJcbiAgICAgICAgICB7fSxcclxuICAgICAgICAgIGlzU2lsZW50XHJcbiAgICAgICAgKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnc2VwaWEnOlxyXG4gICAgICAgIHRoaXMuZmlsdGVyQXBwbHlDb25maXJtZWQodGhpcy5maWx0ZXJTZXBpYUNoZWNrZWQsIHR5cGUsIHt9LCBpc1NpbGVudCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2VtYm9zcyc6XHJcbiAgICAgICAgdGhpcy5maWx0ZXJBcHBseUNvbmZpcm1lZCh0aGlzLmZpbHRlckVtYm9zc0NoZWNrZWQsIHR5cGUsIHt9LCBpc1NpbGVudCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2ludmVydCc6XHJcbiAgICAgICAgdGhpcy5maWx0ZXJBcHBseUNvbmZpcm1lZCh0aGlzLmZpbHRlckludmVydENoZWNrZWQsIHR5cGUsIHt9LCBpc1NpbGVudCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3ZpbnRhZ2UnOlxyXG4gICAgICAgIHRoaXMuZmlsdGVyQXBwbHlDb25maXJtZWQoXHJcbiAgICAgICAgICB0aGlzLmZpbHRlclZpbnRhZ2VDaGVja2VkLFxyXG4gICAgICAgICAgdHlwZSxcclxuICAgICAgICAgIHt9LFxyXG4gICAgICAgICAgaXNTaWxlbnRcclxuICAgICAgICApO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdzaGFycGVuJzpcclxuICAgICAgICB0aGlzLmZpbHRlckFwcGx5Q29uZmlybWVkKFxyXG4gICAgICAgICAgdGhpcy5maWx0ZXJTaGFycGVuQ2hlY2tlZCxcclxuICAgICAgICAgIHR5cGUsXHJcbiAgICAgICAgICB7fSxcclxuICAgICAgICAgIGlzU2lsZW50XHJcbiAgICAgICAgKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGZpbHRlckFwcGx5Q29uZmlybWVkKFxyXG4gICAgYXBwbHlpbmc6IGJvb2xlYW4sXHJcbiAgICB0eXBlOlxyXG4gICAgICB8ICdyZW1vdmVDb2xvcidcclxuICAgICAgfCAnYnJpZ2h0bmVzcydcclxuICAgICAgfCAnbm9pc2UnXHJcbiAgICAgIHwgJ3BpeGVsYXRlJ1xyXG4gICAgICB8ICdibHVyJ1xyXG4gICAgICB8ICdibGVuZENvbG9yJ1xyXG4gICAgICB8ICdncmF5c2NhbGUnXHJcbiAgICAgIHwgJ3NlcGlhJ1xyXG4gICAgICB8ICdlbWJvc3MnXHJcbiAgICAgIHwgJ2ludmVydCdcclxuICAgICAgfCAndmludGFnZSdcclxuICAgICAgfCAnc2hhcnBlbicsXHJcbiAgICBvcHRpb25zOiBhbnksXHJcbiAgICBpc1NpbGVudDogYm9vbGVhbiA9IGZhbHNlXHJcbiAgKSB7XHJcbiAgICBsZXQgZnVuY3Rpb25Ub0V4ZWN1dGUgPSBhc3luYyAoKSA9PiB7XHJcbiAgICAgIGlmIChhcHBseWluZykge1xyXG4gICAgICAgIGlmICh0eXBlID09PSAnYmxlbmRDb2xvcicgJiYgdGhpcy5pbWFnZUVkaXRvci5oYXNGaWx0ZXIoJ2JsZW5kQ29sb3InKSkge1xyXG4gICAgICAgICAgc3dpdGNoIChvcHRpb25zLm1vZGUpIHtcclxuICAgICAgICAgICAgY2FzZSAnYWRkJzpcclxuICAgICAgICAgICAgICB0aGlzLmZpbHRlclRpbnRDaGVja2VkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgdGhpcy5maWx0ZXJNdWx0aXBseUNoZWNrZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSAnbXVsdGlwbHknOlxyXG4gICAgICAgICAgICAgIHRoaXMuZmlsdGVyVGludENoZWNrZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICB0aGlzLmZpbHRlckJsZW5kQ2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlICd0aW50JzpcclxuICAgICAgICAgICAgICB0aGlzLmZpbHRlckJsZW5kQ2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIHRoaXMuZmlsdGVyTXVsdGlwbHlDaGVja2VkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBhd2FpdCByZW1vdmVGaWx0ZXIodGhpcy5pbWFnZUVkaXRvciwgdHlwZSwgaXNTaWxlbnQpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgICB0eXBlID09PSAncmVtb3ZlQ29sb3InICYmXHJcbiAgICAgICAgICB0aGlzLmltYWdlRWRpdG9yLmhhc0ZpbHRlcigncmVtb3ZlQ29sb3InKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgaWYgKG9wdGlvbnMudXNlQWxwaGEgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlckNvbG9yRmlsdGVyQ2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXJXaGl0ZVJlbW92YWxDaGVja2VkID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBhd2FpdCByZW1vdmVGaWx0ZXIodGhpcy5pbWFnZUVkaXRvciwgdHlwZSwgaXNTaWxlbnQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBhd2FpdCB0aGlzLmltYWdlRWRpdG9yLmFwcGx5RmlsdGVyKHR5cGUsIG9wdGlvbnMsIGlzU2lsZW50KTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLmltYWdlRWRpdG9yLmhhc0ZpbHRlcih0eXBlKSkge1xyXG4gICAgICAgIGF3YWl0IHJlbW92ZUZpbHRlcih0aGlzLmltYWdlRWRpdG9yLCB0eXBlLCBpc1NpbGVudCk7XHJcbiAgICAgICAgaWYgKHR5cGUgPT0gJ2JsZW5kQ29sb3InKSB7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlclRpbnRDaGVja2VkID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmZpbHRlck11bHRpcGx5Q2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5maWx0ZXJCbGVuZENoZWNrZWQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICBpZiAoaXNTaWxlbnQpIHtcclxuICAgICAgYXdhaXQgZnVuY3Rpb25Ub0V4ZWN1dGUoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIGF3YWl0IGZ1bmN0aW9uVG9FeGVjdXRlKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCI8ZGl2XHJcbiAgY2xhc3M9XCJ0dWktaW1hZ2UtZWRpdG9yLW1lbnUtZmlsdGVyIHR1aS1pbWFnZS1lZGl0b3ItZC1mbGV4IHR1aS1pbWFnZS1lZGl0b3ItanVzdGlmeS1jb250ZW50LWNlbnRlclwiXHJcbj5cclxuICA8ZGl2XHJcbiAgICBjbGFzcz1cInR1aS1pbWFnZS1lZGl0b3Itc3VibWVudS1pdGVtIHR1aS1pbWFnZS1lZGl0b3ItZC1mbGV4IHR1aS1pbWFnZS1lZGl0b3ItZmxleC1yb3cgdHVpLWltYWdlLWVkaXRvci1hbGlnbi1pdGVtcy1jZW50ZXIgdHVpLWltYWdlLWVkaXRvci1vdmVyZmxvd2FibGUteCB0dWktaW1hZ2UtZWRpdG9yLXB5LTNcIlxyXG4gID5cclxuICAgIDxkaXYgY2xhc3M9XCJ0dWktaW1hZ2UtZWRpdG9yLXN1Ym1lbnUtYWxpZ25cIj5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIGNsYXNzPVwidHVpLWltYWdlLWVkaXRvci1jaGVja2JveC13cmFwIGZpeGVkLXdpZHRoIHR1aS1pbWFnZS1lZGl0b3ItZC1mbGV4IHR1aS1pbWFnZS1lZGl0b3ItZmxleC1yb3cgdHVpLWltYWdlLWVkaXRvci1mbGV4LXdyYXAgdHVpLWltYWdlLWVkaXRvci1qdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0dWktaW1hZ2UtZWRpdG9yLWNoZWNrYm94IHR1aS1pbWFnZS1lZGl0b3ItYWxpZ24tc2VsZi1jZW50ZXJcIj5cclxuICAgICAgICAgIDxsYWJlbFxyXG4gICAgICAgICAgICBjbGFzcz1cInR1aS1pbWFnZS1lZGl0b3ItZC1mbGV4IHR1aS1pbWFnZS1lZGl0b3ItZmxleC1yb3cgdHVpLWltYWdlLWVkaXRvci1hbGlnbi1pdGVtcy1jZW50ZXIgdHVpLWltYWdlLWVkaXRvci1mbGV4LW5vd3JhcFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0aWUtZ3JheXNjYWxlXCJcclxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZpbHRlckdyYXlzY2FsZUNoZWNrZWRcIlxyXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImZpbHRlckdyYXlzY2FsZUNoZWNrZWRDaGFuZ2VkKCRldmVudClcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8c3Bhbj57e1xyXG4gICAgICAgICAgICAgIFwidHVpLWltYWdlLWVkaXRvci1hbmd1bGFyLXN1Ym1lbnVzLWZpbHRlci1ncmF5c2NhbGVcIiB8IHRyYW5zbGF0ZVxyXG4gICAgICAgICAgICB9fTwvc3Bhbj5cclxuICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInR1aS1pbWFnZS1lZGl0b3ItY2hlY2tib3ggdHVpLWltYWdlLWVkaXRvci1hbGlnbi1zZWxmLWNlbnRlclwiPlxyXG4gICAgICAgICAgPGxhYmVsXHJcbiAgICAgICAgICAgIGNsYXNzPVwidHVpLWltYWdlLWVkaXRvci1kLWZsZXggdHVpLWltYWdlLWVkaXRvci1mbGV4LXJvdyB0dWktaW1hZ2UtZWRpdG9yLWFsaWduLWl0ZW1zLWNlbnRlciB0dWktaW1hZ2UtZWRpdG9yLWZsZXgtbm93cmFwXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInRpZS1pbnZlcnRcIlxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZmlsdGVySW52ZXJ0Q2hlY2tlZFwiXHJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiZmlsdGVySW52ZXJ0Q2hlY2tlZENoYW5nZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDxzcGFuPnt7XHJcbiAgICAgICAgICAgICAgXCJ0dWktaW1hZ2UtZWRpdG9yLWFuZ3VsYXItc3VibWVudXMtZmlsdGVyLWludmVydFwiIHwgdHJhbnNsYXRlXHJcbiAgICAgICAgICAgIH19PC9zcGFuPlxyXG4gICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidHVpLWltYWdlLWVkaXRvci1jaGVja2JveCB0dWktaW1hZ2UtZWRpdG9yLWFsaWduLXNlbGYtY2VudGVyXCI+XHJcbiAgICAgICAgICA8bGFiZWxcclxuICAgICAgICAgICAgY2xhc3M9XCJ0dWktaW1hZ2UtZWRpdG9yLWQtZmxleCB0dWktaW1hZ2UtZWRpdG9yLWZsZXgtcm93IHR1aS1pbWFnZS1lZGl0b3ItYWxpZ24taXRlbXMtY2VudGVyIHR1aS1pbWFnZS1lZGl0b3ItZmxleC1ub3dyYXBcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwidGllLXNlcGlhXCJcclxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZpbHRlclNlcGlhQ2hlY2tlZFwiXHJcbiAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiZmlsdGVyU2VwaWFDaGVja2VkQ2hhbmdlZCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPHNwYW4+e3tcclxuICAgICAgICAgICAgICBcInR1aS1pbWFnZS1lZGl0b3ItYW5ndWxhci1zdWJtZW51cy1maWx0ZXItc2VwaWFcIiB8IHRyYW5zbGF0ZVxyXG4gICAgICAgICAgICB9fTwvc3Bhbj5cclxuICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInR1aS1pbWFnZS1lZGl0b3ItY2hlY2tib3ggdHVpLWltYWdlLWVkaXRvci1hbGlnbi1zZWxmLWNlbnRlclwiPlxyXG4gICAgICAgICAgPGxhYmVsXHJcbiAgICAgICAgICAgIGNsYXNzPVwidHVpLWltYWdlLWVkaXRvci1kLWZsZXggdHVpLWltYWdlLWVkaXRvci1mbGV4LXJvdyB0dWktaW1hZ2UtZWRpdG9yLWFsaWduLWl0ZW1zLWNlbnRlciB0dWktaW1hZ2UtZWRpdG9yLWZsZXgtbm93cmFwXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInRpZS12aW50YWdlXCJcclxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZpbHRlclZpbnRhZ2VDaGVja2VkXCJcclxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJWaW50YWdlQ2hlY2tlZENoYW5nZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDxzcGFuPnt7XHJcbiAgICAgICAgICAgICAgXCJ0dWktaW1hZ2UtZWRpdG9yLWFuZ3VsYXItc3VibWVudXMtZmlsdGVyLXNlcGlhMlwiIHwgdHJhbnNsYXRlXHJcbiAgICAgICAgICAgIH19PC9zcGFuPlxyXG4gICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidHVpLWltYWdlLWVkaXRvci1jaGVja2JveCB0dWktaW1hZ2UtZWRpdG9yLWFsaWduLXNlbGYtY2VudGVyXCI+XHJcbiAgICAgICAgICA8bGFiZWxcclxuICAgICAgICAgICAgY2xhc3M9XCJ0dWktaW1hZ2UtZWRpdG9yLWQtZmxleCB0dWktaW1hZ2UtZWRpdG9yLWZsZXgtcm93IHR1aS1pbWFnZS1lZGl0b3ItYWxpZ24taXRlbXMtY2VudGVyIHR1aS1pbWFnZS1lZGl0b3ItZmxleC1ub3dyYXBcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwidGllLWJsdXJcIlxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZmlsdGVyQmx1ckNoZWNrZWRcIlxyXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImZpbHRlckJsdXJDaGVja2VkQ2hhbmdlZCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPHNwYW4+e3tcclxuICAgICAgICAgICAgICBcInR1aS1pbWFnZS1lZGl0b3ItYW5ndWxhci1zdWJtZW51cy1maWx0ZXItYmx1clwiIHwgdHJhbnNsYXRlXHJcbiAgICAgICAgICAgIH19PC9zcGFuPlxyXG4gICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidHVpLWltYWdlLWVkaXRvci1jaGVja2JveCB0dWktaW1hZ2UtZWRpdG9yLWFsaWduLXNlbGYtY2VudGVyXCI+XHJcbiAgICAgICAgICA8bGFiZWxcclxuICAgICAgICAgICAgY2xhc3M9XCJ0dWktaW1hZ2UtZWRpdG9yLWQtZmxleCB0dWktaW1hZ2UtZWRpdG9yLWZsZXgtcm93IHR1aS1pbWFnZS1lZGl0b3ItYWxpZ24taXRlbXMtY2VudGVyIHR1aS1pbWFnZS1lZGl0b3ItZmxleC1ub3dyYXBcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwidGllLXNoYXJwZW5cIlxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZmlsdGVyU2hhcnBlbkNoZWNrZWRcIlxyXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImZpbHRlclNoYXJwZW5DaGVja2VkQ2hhbmdlZCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPHNwYW4+e3tcclxuICAgICAgICAgICAgICBcInR1aS1pbWFnZS1lZGl0b3ItYW5ndWxhci1zdWJtZW51cy1maWx0ZXItc2hhcnBlblwiIHwgdHJhbnNsYXRlXHJcbiAgICAgICAgICAgIH19PC9zcGFuPlxyXG4gICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidHVpLWltYWdlLWVkaXRvci1jaGVja2JveCB0dWktaW1hZ2UtZWRpdG9yLWFsaWduLXNlbGYtY2VudGVyXCI+XHJcbiAgICAgICAgICA8bGFiZWxcclxuICAgICAgICAgICAgY2xhc3M9XCJ0dWktaW1hZ2UtZWRpdG9yLWQtZmxleCB0dWktaW1hZ2UtZWRpdG9yLWZsZXgtcm93IHR1aS1pbWFnZS1lZGl0b3ItYWxpZ24taXRlbXMtY2VudGVyIHR1aS1pbWFnZS1lZGl0b3ItZmxleC1ub3dyYXBcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwidGllLWVtYm9zc1wiXHJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmaWx0ZXJFbWJvc3NDaGVja2VkXCJcclxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJFbWJvc3NDaGVja2VkQ2hhbmdlZCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPHNwYW4+e3tcclxuICAgICAgICAgICAgICBcInR1aS1pbWFnZS1lZGl0b3ItYW5ndWxhci1zdWJtZW51cy1maWx0ZXItZW1ib3NzXCIgfCB0cmFuc2xhdGVcclxuICAgICAgICAgICAgfX08L3NwYW4+XHJcbiAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInR1aS1pbWFnZS1lZGl0b3ItcGFydGl0aW9uXCI+XHJcbiAgICAgIDxkaXY+PC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJ0dWktaW1hZ2UtZWRpdG9yLXN1Ym1lbnUtYWxpZ25cIj5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIGNsYXNzPVwidHVpLWltYWdlLWVkaXRvci1jaGVja2JveC1ncm91cCB0dWktaW1hZ2UtZWRpdG9yLWRpc2FibGVkXCJcclxuICAgICAgICBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDdweFwiXHJcbiAgICAgID5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidHVpLWltYWdlLWVkaXRvci1jaGVja2JveC13cmFwXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidHVpLWltYWdlLWVkaXRvci1jaGVja2JveFwiPlxyXG4gICAgICAgICAgICA8bGFiZWxcclxuICAgICAgICAgICAgICBjbGFzcz1cInR1aS1pbWFnZS1lZGl0b3ItZC1mbGV4IHR1aS1pbWFnZS1lZGl0b3ItZmxleC1yb3cgdHVpLWltYWdlLWVkaXRvci1hbGlnbi1pdGVtcy1jZW50ZXIgdHVpLWltYWdlLWVkaXRvci1mbGV4LW5vd3JhcFwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInRpZS1yZW1vdmUtd2hpdGVcIlxyXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmaWx0ZXJXaGl0ZVJlbW92YWxDaGVja2VkXCJcclxuICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImZpbHRlcldoaXRlUmVtb3ZhbENoZWNrZWRDaGFuZ2VkKCRldmVudClcIlxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgPHNwYW4+e3tcclxuICAgICAgICAgICAgICAgIFwidHVpLWltYWdlLWVkaXRvci1hbmd1bGFyLXN1Ym1lbnVzLWZpbHRlci1yZW1vdmVXaGl0ZVwiXHJcbiAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlXHJcbiAgICAgICAgICAgICAgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBjbGFzcz1cInR1aS1pbWFnZS1lZGl0b3ItbmV3bGluZSB0dWktaW1hZ2UtZWRpdG9yLXJhbmdlLXdyYXAgc2hvcnQgdHVpLWltYWdlLWVkaXRvci1kLWZsZXggdHVpLWltYWdlLWVkaXRvci1mbGV4LXJvdyB0dWktaW1hZ2UtZWRpdG9yLWZsZXgtbm93cmFwIHR1aS1pbWFnZS1lZGl0b3ItYWxpZ24taXRlbXMtY2VudGVyXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8bGFiZWw+e3tcclxuICAgICAgICAgICAgXCJ0dWktaW1hZ2UtZWRpdG9yLWFuZ3VsYXItc3VibWVudXMtZmlsdGVyLXJlbW92ZVdoaXRlLWRpc3RhbmNlXCJcclxuICAgICAgICAgICAgICB8IHRyYW5zbGF0ZVxyXG4gICAgICAgICAgfX08L2xhYmVsPlxyXG4gICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgIHR5cGU9XCJyYW5nZVwiXHJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZmlsdGVyV2hpdGVSZW1vdmFsRGlzdGFuY2VcIlxyXG4gICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJXaGl0ZVJlbW92YWxEaXN0YW5jZUNoYW5nZWQoJGV2ZW50LCB0cnVlKVwiXHJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwiZmlsdGVyV2hpdGVSZW1vdmFsRGlzdGFuY2VDaGFuZ2VkKCRldmVudCwgZmFsc2UpXCJcclxuICAgICAgICAgICAgbWluPVwiMFwiXHJcbiAgICAgICAgICAgIG1heD1cIjFcIlxyXG4gICAgICAgICAgICBzdGVwPVwiMC4wMDFcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmlsdGVyV2hpdGVSZW1vdmFsQ2hlY2tlZCA9PSBmYWxzZVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cInR1aS1pbWFnZS1lZGl0b3ItY2hlY2tib3gtZ3JvdXAgdHVpLWltYWdlLWVkaXRvci1kaXNhYmxlZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0dWktaW1hZ2UtZWRpdG9yLWNoZWNrYm94XCI+XHJcbiAgICAgICAgICA8bGFiZWxcclxuICAgICAgICAgICAgY2xhc3M9XCJ0dWktaW1hZ2UtZWRpdG9yLWQtZmxleCB0dWktaW1hZ2UtZWRpdG9yLWZsZXgtcm93IHR1aS1pbWFnZS1lZGl0b3ItYWxpZ24taXRlbXMtY2VudGVyIHR1aS1pbWFnZS1lZGl0b3ItZmxleC1ub3dyYXBcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwidGllLWJyaWdodG5lc3NcIlxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZmlsdGVyQnJpZ2h0bmVzc0NoZWNrZWRcIlxyXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImZpbHRlckJyaWdodG5lc3NDaGVja2VkQ2hhbmdlZCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPHNwYW4+e3tcclxuICAgICAgICAgICAgICBcInR1aS1pbWFnZS1lZGl0b3ItYW5ndWxhci1zdWJtZW51cy1maWx0ZXItYnJpZ2h0bmVzc1wiIHwgdHJhbnNsYXRlXHJcbiAgICAgICAgICAgIH19PC9zcGFuPlxyXG4gICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidHVpLWltYWdlLWVkaXRvci1yYW5nZS13cmFwIHNob3J0IHR1aS1pbWFnZS1lZGl0b3ItZC1mbGV4IHR1aS1pbWFnZS1lZGl0b3ItZmxleC1yb3cgYWxpZ24taXRlbXMtY2VudGVyIHR1aS1pbWFnZS1lZGl0b3ItbXktMlwiPlxyXG4gICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgIHR5cGU9XCJyYW5nZVwiXHJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZmlsdGVyQnJpZ2h0bmVzc1ZhbHVlXCJcclxuICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiZmlsdGVyQnJpZ2h0bmVzc1ZhbHVlQ2hhbmdlZCgkZXZlbnQsIHRydWUpXCJcclxuICAgICAgICAgICAgKGNoYW5nZSk9XCJmaWx0ZXJCcmlnaHRuZXNzVmFsdWVDaGFuZ2VkKCRldmVudCwgZmFsc2UpXCJcclxuICAgICAgICAgICAgbWluPVwiLTFcIlxyXG4gICAgICAgICAgICBtYXg9XCIxXCJcclxuICAgICAgICAgICAgc3RlcD1cIjAuMDNcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmlsdGVyQnJpZ2h0bmVzc0NoZWNrZWQgPT0gZmFsc2VcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0dWktaW1hZ2UtZWRpdG9yLWNoZWNrYm94LWdyb3VwIHR1aS1pbWFnZS1lZGl0b3ItZGlzYWJsZWRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidHVpLWltYWdlLWVkaXRvci1jaGVja2JveFwiPlxyXG4gICAgICAgICAgPGxhYmVsXHJcbiAgICAgICAgICAgIGNsYXNzPVwidHVpLWltYWdlLWVkaXRvci1kLWZsZXggdHVpLWltYWdlLWVkaXRvci1mbGV4LXJvdyB0dWktaW1hZ2UtZWRpdG9yLWFsaWduLWl0ZW1zLWNlbnRlciB0dWktaW1hZ2UtZWRpdG9yLWZsZXgtbm93cmFwXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInRpZS1ub2lzZVwiXHJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmaWx0ZXJOb2lzZUNoZWNrZWRcIlxyXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImZpbHRlck5vaXNlQ2hlY2tlZENoYW5nZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDxzcGFuPnt7XHJcbiAgICAgICAgICAgICAgXCJ0dWktaW1hZ2UtZWRpdG9yLWFuZ3VsYXItc3VibWVudXMtZmlsdGVyLW5vaXNlXCIgfCB0cmFuc2xhdGVcclxuICAgICAgICAgICAgfX08L3NwYW4+XHJcbiAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0dWktaW1hZ2UtZWRpdG9yLXJhbmdlLXdyYXAgc2hvcnQgdHVpLWltYWdlLWVkaXRvci1kLWZsZXggdHVpLWltYWdlLWVkaXRvci1mbGV4LXJvdyBhbGlnbi1pdGVtcy1jZW50ZXIgdHVpLWltYWdlLWVkaXRvci1teS0yXCI+XHJcbiAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgdHlwZT1cInJhbmdlXCJcclxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmaWx0ZXJOb2lzZVZhbHVlXCJcclxuICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiZmlsdGVyTm9pc2VWYWx1ZUNoYW5nZWQoJGV2ZW50LCB0cnVlKVwiXHJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwiZmlsdGVyTm9pc2VWYWx1ZUNoYW5nZWQoJGV2ZW50LCBmYWxzZSlcIlxyXG4gICAgICAgICAgICBtaW49XCIwXCJcclxuICAgICAgICAgICAgbWF4PVwiMTAwMFwiXHJcbiAgICAgICAgICAgIHN0ZXA9XCIxMFwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWx0ZXJOb2lzZUNoZWNrZWQgPT0gZmFsc2VcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJ0dWktaW1hZ2UtZWRpdG9yLXBhcnRpdGlvbiBvbmx5LWxlZnQtcmlnaHRcIj5cclxuICAgICAgPGRpdj48L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInR1aS1pbWFnZS1lZGl0b3Itc3VibWVudS1hbGlnblwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwidHVpLWltYWdlLWVkaXRvci1jaGVja2JveC1ncm91cCB0dWktaW1hZ2UtZWRpdG9yLWRpc2FibGVkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInR1aS1pbWFnZS1lZGl0b3ItY2hlY2tib3hcIj5cclxuICAgICAgICAgIDxsYWJlbFxyXG4gICAgICAgICAgICBjbGFzcz1cInR1aS1pbWFnZS1lZGl0b3ItZC1mbGV4IHR1aS1pbWFnZS1lZGl0b3ItZmxleC1yb3cgdHVpLWltYWdlLWVkaXRvci1hbGlnbi1pdGVtcy1jZW50ZXIgdHVpLWltYWdlLWVkaXRvci1mbGV4LW5vd3JhcFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0aWUtcGl4ZWxhdGVcIlxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZmlsdGVyUGl4ZWxhdGVDaGVja2VkXCJcclxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJQaXhlbGF0ZUNoZWNrZWRDaGFuZ2VkKCRldmVudClcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8c3Bhbj57e1xyXG4gICAgICAgICAgICAgIFwidHVpLWltYWdlLWVkaXRvci1hbmd1bGFyLXN1Ym1lbnVzLWZpbHRlci1waXhlbGF0ZVwiIHwgdHJhbnNsYXRlXHJcbiAgICAgICAgICAgIH19PC9zcGFuPlxyXG4gICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidHVpLWltYWdlLWVkaXRvci1yYW5nZS13cmFwIHNob3J0IHR1aS1pbWFnZS1lZGl0b3ItZC1mbGV4IHR1aS1pbWFnZS1lZGl0b3ItZmxleC1yb3cgYWxpZ24taXRlbXMtY2VudGVyIHR1aS1pbWFnZS1lZGl0b3ItbXktMlwiPlxyXG4gICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgIHR5cGU9XCJyYW5nZVwiXHJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZmlsdGVyUGl4ZWxhdGVWYWx1ZVwiXHJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImZpbHRlclBpeGVsYXRlVmFsdWVDaGFuZ2VkKCRldmVudCwgdHJ1ZSlcIlxyXG4gICAgICAgICAgICAoY2hhbmdlKT1cImZpbHRlclBpeGVsYXRlVmFsdWVDaGFuZ2VkKCRldmVudCwgZmFsc2UpXCJcclxuICAgICAgICAgICAgbWluPVwiMlwiXHJcbiAgICAgICAgICAgIG1heD1cIjIwXCJcclxuICAgICAgICAgICAgc3RlcD1cIjFcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmlsdGVyUGl4ZWxhdGVDaGVja2VkID09IGZhbHNlXCJcclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwidHVpLWltYWdlLWVkaXRvci1jaGVja2JveC1ncm91cCB0dWktaW1hZ2UtZWRpdG9yLWRpc2FibGVkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInR1aS1pbWFnZS1lZGl0b3ItbmV3bGluZSB0dWktaW1hZ2UtZWRpdG9yLWNoZWNrYm94LXdyYXBcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0dWktaW1hZ2UtZWRpdG9yLWNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgIDxsYWJlbFxyXG4gICAgICAgICAgICAgIGNsYXNzPVwidHVpLWltYWdlLWVkaXRvci1kLWZsZXggdHVpLWltYWdlLWVkaXRvci1mbGV4LXJvdyB0dWktaW1hZ2UtZWRpdG9yLWFsaWduLWl0ZW1zLWNlbnRlciB0dWktaW1hZ2UtZWRpdG9yLWZsZXgtbm93cmFwXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidGllLWNvbG9yLWZpbHRlclwiXHJcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZpbHRlckNvbG9yRmlsdGVyQ2hlY2tlZFwiXHJcbiAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJDb2xvckZpbHRlckNoZWNrZWRDaGFuZ2VkKCRldmVudClcIlxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgPHNwYW4+e3tcclxuICAgICAgICAgICAgICAgIFwidHVpLWltYWdlLWVkaXRvci1hbmd1bGFyLXN1Ym1lbnVzLWZpbHRlci1jb2xvckZpbHRlclwiXHJcbiAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlXHJcbiAgICAgICAgICAgICAgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidHVpLWltYWdlLWVkaXRvci1uZXdsaW5lIHR1aS1pbWFnZS1lZGl0b3ItcmFuZ2Utd3JhcCBzaG9ydFwiPlxyXG4gICAgICAgICAgPGxhYmVsPnt7XHJcbiAgICAgICAgICAgIFwidHVpLWltYWdlLWVkaXRvci1hbmd1bGFyLXN1Ym1lbnVzLWZpbHRlci1jb2xvckZpbHRlci10aHJlc2hvbGRcIlxyXG4gICAgICAgICAgICAgIHwgdHJhbnNsYXRlXHJcbiAgICAgICAgICB9fTwvbGFiZWw+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGllLWNvbG9yZmlsdGVyLXRocmVzaG9sZC1yYW5nZSB0dWktaW1hZ2UtZWRpdG9yLXJhbmdlIHR1aS1pbWFnZS1lZGl0b3ItZC1mbGV4IHR1aS1pbWFnZS1lZGl0b3ItZmxleC1yb3cgYWxpZ24taXRlbXMtY2VudGVyIHR1aS1pbWFnZS1lZGl0b3ItbXktMlwiPlxyXG4gICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICB0eXBlPVwicmFuZ2VcIlxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZmlsdGVyQ29sb3JGaWx0ZXJUaHJlc2hvbGRcIlxyXG4gICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImZpbHRlckNvbG9yRmlsdGVyVGhyZXNob2xkQ2hhbmdlZCgkZXZlbnQsIHRydWUpXCJcclxuICAgICAgICAgICAgICAoY2hhbmdlKT1cImZpbHRlckNvbG9yRmlsdGVyVGhyZXNob2xkQ2hhbmdlZCgkZXZlbnQsIGZhbHNlKVwiXHJcbiAgICAgICAgICAgICAgbWluPVwiMFwiXHJcbiAgICAgICAgICAgICAgbWF4PVwiMVwiXHJcbiAgICAgICAgICAgICAgc3RlcD1cIjAuMDJcIlxyXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmaWx0ZXJDb2xvckZpbHRlckNoZWNrZWQgPT0gZmFsc2VcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwidHVpLWltYWdlLWVkaXRvci1wYXJ0aXRpb25cIj5cclxuICAgICAgPGRpdj48L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdlxyXG4gICAgICBjbGFzcz1cInR1aS1pbWFnZS1lZGl0b3ItZC1mbGV4IHR1aS1pbWFnZS1lZGl0b3ItZmxleC1yb3cgdHVpLWltYWdlLWVkaXRvci1hbGlnbi1pdGVtcy1jZW50ZXJcIlxyXG4gICAgPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLWNvbG9yLWl0ZW1cIj5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBbY2xhc3NdPVwiXHJcbiAgICAgICAgICAgICd0aWUtZmlsdGVyLXRpbnQtY29sb3IgdHVpLWltYWdlLWVkaXRvci1idXR0b24gdHVpLWltYWdlLWVkaXRvci1idXR0b24tY29sb3ItcGlja2VyIHR1aS1pbWFnZS1lZGl0b3ItZC1mbGV4IHR1aS1pbWFnZS1lZGl0b3ItZmxleC1jb2x1bW4gdHVpLWltYWdlLWVkaXRvci1hbGlnbi1pdGVtcy1jZW50ZXIgJyArXHJcbiAgICAgICAgICAgIChmaWx0ZXJUaW50Q2hlY2tlZCA/ICdhY3RpdmUnIDogJycpXHJcbiAgICAgICAgICBcIlxyXG4gICAgICAgICAgW3RpdGxlXT1cIid0dWktaW1hZ2UtZWRpdG9yLWFuZ3VsYXItc3VibWVudXMtZmlsdGVyLXRpbnQnIHwgdHJhbnNsYXRlXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgcmVhZG9ubHlcclxuICAgICAgICAgICAgY2xhc3M9XCJ0aWUtZmlsdGVyLXRpbnQtY29sb3ItcGlja2VyIHR1aS1pbWFnZS1lZGl0b3ItbWItMlwiXHJcbiAgICAgICAgICAgIFsoY29sb3JQaWNrZXIpXT1cImZpbHRlclRpbnRDb2xvclwiXHJcbiAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImZpbHRlclRpbnRDb2xvclwiXHJcbiAgICAgICAgICAgIFtjcE91dHB1dEZvcm1hdF09XCIncmdiYSdcIlxyXG4gICAgICAgICAgICBbY3BQcmVzZXRDb2xvcnNdPVwiZGVmYXVsdEZpbHRlclRpbnRDb2xvcnNcIlxyXG4gICAgICAgICAgICAoY29sb3JQaWNrZXJDaGFuZ2UpPVwiZmlsdGVyVGludENvbG9yQ2hhbmdlZCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgW2NwVXNlUm9vdFZpZXdDb250YWluZXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAvPlxyXG4gICAgICAgICAgPGxhYmVsXHJcbiAgICAgICAgICAgIGNsYXNzPVwidHVpLWltYWdlLWVkaXRvci1kLWZsZXggdHVpLWltYWdlLWVkaXRvci1mbGV4LXJvdyB0dWktaW1hZ2UtZWRpdG9yLWFsaWduLWl0ZW1zLWNlbnRlciB0dWktaW1hZ2UtZWRpdG9yLWZsZXgtbm93cmFwXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInRpZS10aW50XCJcclxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZpbHRlclRpbnRDaGVja2VkXCJcclxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJUaW50Q2hlY2tlZENoYW5nZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDxzcGFuPnt7XHJcbiAgICAgICAgICAgICAgXCJ0dWktaW1hZ2UtZWRpdG9yLWFuZ3VsYXItc3VibWVudXMtZmlsdGVyLXRpbnRcIiB8IHRyYW5zbGF0ZVxyXG4gICAgICAgICAgICB9fTwvc3Bhbj5cclxuICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLWNvbG9yLWl0ZW1cIj5cclxuICAgICAgICA8ZGl2XHJcbiAgICAgICAgICBbY2xhc3NdPVwiXHJcbiAgICAgICAgICAgICd0aWUtZmlsdGVyLW11bHRpcGx5LWNvbG9yIHR1aS1pbWFnZS1lZGl0b3ItYnV0dG9uIHR1aS1pbWFnZS1lZGl0b3ItYnV0dG9uLWNvbG9yLXBpY2tlciB0dWktaW1hZ2UtZWRpdG9yLWQtZmxleCB0dWktaW1hZ2UtZWRpdG9yLWZsZXgtY29sdW1uIHR1aS1pbWFnZS1lZGl0b3ItYWxpZ24taXRlbXMtY2VudGVyICcgK1xyXG4gICAgICAgICAgICAoZmlsdGVyTXVsdGlwbHlDaGVja2VkID8gJ2FjdGl2ZScgOiAnJylcclxuICAgICAgICAgIFwiXHJcbiAgICAgICAgICBbdGl0bGVdPVwiXHJcbiAgICAgICAgICAgICd0dWktaW1hZ2UtZWRpdG9yLWFuZ3VsYXItc3VibWVudXMtZmlsdGVyLW11bHRpcGx5JyB8IHRyYW5zbGF0ZVxyXG4gICAgICAgICAgXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgcmVhZG9ubHlcclxuICAgICAgICAgICAgY2xhc3M9XCJ0aWUtZmlsdGVyLW11bHRpcGx5LWNvbG9yLXBpY2tlciB0dWktaW1hZ2UtZWRpdG9yLW1iLTJcIlxyXG4gICAgICAgICAgICBbKGNvbG9yUGlja2VyKV09XCJmaWx0ZXJNdWx0aXBseUNvbG9yXCJcclxuICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwiZmlsdGVyTXVsdGlwbHlDb2xvclwiXHJcbiAgICAgICAgICAgIFtjcE91dHB1dEZvcm1hdF09XCInaGV4J1wiXHJcbiAgICAgICAgICAgIFtjcFByZXNldENvbG9yc109XCJkZWZhdWx0RmlsdGVyTXVsdGlwbHlDb2xvcnNcIlxyXG4gICAgICAgICAgICAoY29sb3JQaWNrZXJDaGFuZ2UpPVwiZmlsdGVyTXVsdGlwbHlDb2xvckNoYW5nZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIFtjcFVzZVJvb3RWaWV3Q29udGFpbmVyXT1cInRydWVcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICAgIDxsYWJlbFxyXG4gICAgICAgICAgICBjbGFzcz1cInR1aS1pbWFnZS1lZGl0b3ItZC1mbGV4IHR1aS1pbWFnZS1lZGl0b3ItZmxleC1yb3cgdHVpLWltYWdlLWVkaXRvci1hbGlnbi1pdGVtcy1jZW50ZXIgdHVpLWltYWdlLWVkaXRvci1mbGV4LW5vd3JhcFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0aWUtbXVsdGlwbHlcIlxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZmlsdGVyTXVsdGlwbHlDaGVja2VkXCJcclxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJNdWx0aXBseUNoZWNrZWRDaGFuZ2VkKCRldmVudClcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8c3Bhbj57e1xyXG4gICAgICAgICAgICAgIFwidHVpLWltYWdlLWVkaXRvci1hbmd1bGFyLXN1Ym1lbnVzLWZpbHRlci1tdWx0aXBseVwiIHwgdHJhbnNsYXRlXHJcbiAgICAgICAgICAgIH19PC9zcGFuPlxyXG4gICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItY29sb3ItaXRlbVwiPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIFtjbGFzc109XCJcclxuICAgICAgICAgICAgJ3RpZS1maWx0ZXItYmxlbmQtY29sb3IgdHVpLWltYWdlLWVkaXRvci1idXR0b24gdHVpLWltYWdlLWVkaXRvci1idXR0b24tY29sb3ItcGlja2VyIHR1aS1pbWFnZS1lZGl0b3ItZC1mbGV4IHR1aS1pbWFnZS1lZGl0b3ItZmxleC1jb2x1bW4gdHVpLWltYWdlLWVkaXRvci1hbGlnbi1pdGVtcy1jZW50ZXIgJyArXHJcbiAgICAgICAgICAgIChmaWx0ZXJCbGVuZENoZWNrZWQgPyAnYWN0aXZlJyA6ICcnKVxyXG4gICAgICAgICAgXCJcclxuICAgICAgICAgIFt0aXRsZV09XCIndHVpLWltYWdlLWVkaXRvci1hbmd1bGFyLXN1Ym1lbnVzLWZpbHRlci1ibGVuZCcgfCB0cmFuc2xhdGVcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICByZWFkb25seVxyXG4gICAgICAgICAgICBjbGFzcz1cInRpZS1maWx0ZXItYmxlbmQtY29sb3ItcGlja2VyIHR1aS1pbWFnZS1lZGl0b3ItbWItMlwiXHJcbiAgICAgICAgICAgIFsoY29sb3JQaWNrZXIpXT1cImZpbHRlckJsZW5kQ29sb3JcIlxyXG4gICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJmaWx0ZXJCbGVuZENvbG9yXCJcclxuICAgICAgICAgICAgW2NwT3V0cHV0Rm9ybWF0XT1cIidyZ2JhJ1wiXHJcbiAgICAgICAgICAgIFtjcFByZXNldENvbG9yc109XCJkZWZhdWx0RmlsdGVyQmxlbmRDb2xvcnNcIlxyXG4gICAgICAgICAgICAoY29sb3JQaWNrZXJDaGFuZ2UpPVwiZmlsdGVyQmxlbmRDb2xvckNoYW5nZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIFtjcFVzZVJvb3RWaWV3Q29udGFpbmVyXT1cInRydWVcIlxyXG4gICAgICAgICAgLz5cclxuICAgICAgICAgIDxsYWJlbFxyXG4gICAgICAgICAgICBjbGFzcz1cInR1aS1pbWFnZS1lZGl0b3ItZC1mbGV4IHR1aS1pbWFnZS1lZGl0b3ItZmxleC1yb3cgdHVpLWltYWdlLWVkaXRvci1hbGlnbi1pdGVtcy1jZW50ZXIgdHVpLWltYWdlLWVkaXRvci1mbGV4LW5vd3JhcFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0aWUtYmxlbmRcIlxyXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZmlsdGVyQmxlbmRDaGVja2VkXCJcclxuICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJCbGVuZENoZWNrZWRDaGFuZ2VkKCRldmVudClcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8c3Bhbj57e1xyXG4gICAgICAgICAgICAgIFwidHVpLWltYWdlLWVkaXRvci1hbmd1bGFyLXN1Ym1lbnVzLWZpbHRlci1ibGVuZFwiIHwgdHJhbnNsYXRlXHJcbiAgICAgICAgICAgIH19PC9zcGFuPlxyXG4gICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==