@eqproject/eqp-attachments 3.0.0 → 3.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/{esm2020 → esm2022}/eqproject-eqp-attachments.mjs +4 -4
  2. package/esm2022/lib/directives/eqp-common/dynamic-loader/dynamic-loader.directive.mjs +53 -0
  3. package/esm2022/lib/directives/eqp-common/eqp-common.service.mjs +78 -0
  4. package/esm2022/lib/directives/eqp-common/index.mjs +10 -0
  5. package/esm2022/lib/directives/eqp-common/models/base-field.model.mjs +57 -0
  6. package/esm2022/lib/directives/eqp-common/models/common-enum.model.mjs +8 -0
  7. package/esm2022/lib/directives/eqp-common/models/config-column.model.mjs +116 -0
  8. package/esm2022/lib/directives/eqp-common/models/filterConfig.model.mjs +318 -0
  9. package/esm2022/lib/directives/eqp-common/models/filterField.model.mjs +254 -0
  10. package/esm2022/lib/directives/eqp-common/models/form.model.mjs +168 -0
  11. package/esm2022/lib/directives/eqp-common/models/linqFilterResult.model.mjs +73 -0
  12. package/esm2022/lib/directives/eqp-common/models/tableColumn-field.model.mjs +107 -0
  13. package/esm2022/lib/eqp-attachments.component.mjs +1096 -0
  14. package/{esm2020 → esm2022}/lib/eqp-attachments.module.mjs +43 -43
  15. package/esm2022/lib/helpers/attachment.helper.mjs +66 -0
  16. package/{esm2020 → esm2022}/lib/interfaces/IAttachment.mjs +11 -11
  17. package/{esm2020 → esm2022}/lib/interfaces/IOptions.mjs +1 -1
  18. package/{esm2020 → esm2022}/lib/modules/material.module.mjs +231 -231
  19. package/{esm2020 → esm2022}/lib/services/eqp-attachment-dialog.service.mjs +103 -103
  20. package/{esm2020 → esm2022}/lib/services/eqp-attachment.service.mjs +23 -23
  21. package/{esm2020 → esm2022}/public-api.mjs +9 -9
  22. package/fesm2022/eqproject-eqp-attachments.mjs +2730 -0
  23. package/fesm2022/eqproject-eqp-attachments.mjs.map +1 -0
  24. package/index.d.ts +5 -5
  25. package/lib/directives/eqp-common/dynamic-loader/dynamic-loader.directive.d.ts +17 -0
  26. package/lib/directives/eqp-common/eqp-common.service.d.ts +21 -0
  27. package/lib/directives/eqp-common/index.d.ts +9 -0
  28. package/lib/directives/eqp-common/models/base-field.model.d.ts +52 -0
  29. package/lib/directives/eqp-common/models/common-enum.model.d.ts +6 -0
  30. package/lib/directives/eqp-common/models/config-column.model.d.ts +113 -0
  31. package/lib/directives/eqp-common/models/filterConfig.model.d.ts +264 -0
  32. package/lib/directives/eqp-common/models/filterField.model.d.ts +144 -0
  33. package/lib/directives/eqp-common/models/form.model.d.ts +129 -0
  34. package/lib/directives/eqp-common/models/linqFilterResult.model.d.ts +58 -0
  35. package/lib/directives/eqp-common/models/tableColumn-field.model.d.ts +31 -0
  36. package/lib/eqp-attachments.component.d.ts +319 -318
  37. package/lib/eqp-attachments.module.d.ts +13 -13
  38. package/lib/helpers/attachment.helper.d.ts +20 -20
  39. package/lib/interfaces/IAttachment.d.ts +21 -21
  40. package/lib/interfaces/IOptions.d.ts +11 -11
  41. package/lib/modules/material.module.d.ts +37 -37
  42. package/lib/services/eqp-attachment-dialog.service.d.ts +31 -31
  43. package/lib/services/eqp-attachment.service.d.ts +7 -7
  44. package/package.json +5 -11
  45. package/public-api.d.ts +6 -6
  46. package/esm2020/lib/eqp-attachments.component.mjs +0 -1064
  47. package/esm2020/lib/helpers/attachment.helper.mjs +0 -66
  48. package/fesm2015/eqproject-eqp-attachments.mjs +0 -1535
  49. package/fesm2015/eqproject-eqp-attachments.mjs.map +0 -1
  50. package/fesm2020/eqproject-eqp-attachments.mjs +0 -1532
  51. package/fesm2020/eqproject-eqp-attachments.mjs.map +0 -1
@@ -0,0 +1,318 @@
1
+ /**
2
+ * Classe utilizzata per la configurazione di filtri custom
3
+ */
4
+ export class FilterConfig {
5
+ constructor(filterID, filterClass, label, propertyName, propertyValue, inputType, wherePartType, cvlConfig, preventRemoval) {
6
+ this.FilterID = filterID;
7
+ if (filterClass)
8
+ this.FilterClass = filterClass;
9
+ this.Label = label;
10
+ this.PropertyName = propertyName;
11
+ this.PropertyObject = propertyValue;
12
+ this.InputType = inputType;
13
+ this.WherePartType = wherePartType;
14
+ this.PreventRemoval = preventRemoval;
15
+ this.EnumData = cvlConfig?.EnumData;
16
+ this.ArrayData = cvlConfig?.ArrayData;
17
+ this.ArrayKeyProperty = cvlConfig?.ArrayKeyProperty;
18
+ this.ArrayValueProperty = cvlConfig?.ArrayValueProperty;
19
+ this.IsEnumSearchable = cvlConfig?.IsSearchable;
20
+ this.ShowEnumCancelButton = cvlConfig?.ShowCancelButton;
21
+ this.EnumSearchText = cvlConfig?.SearchText;
22
+ this.IsEnumMultiSelect = cvlConfig?.IsMultiSelect;
23
+ this.BindLookupFullObject = cvlConfig?.BindFullObject;
24
+ }
25
+ /**
26
+ * Identificativo univoco del filtro
27
+ */
28
+ FilterID;
29
+ /**
30
+ * Permette di definire la classe css da applicare
31
+ * al filtro
32
+ */
33
+ FilterClass = FilterSizeClass.SMALL;
34
+ /**
35
+ *
36
+ */
37
+ CustomFilterClasses;
38
+ /**
39
+ * Etichetta da mostrare per il filtro
40
+ */
41
+ Label;
42
+ /**
43
+ * Valore della proprietà dell'oggetto su cui andrà applicato il filtro
44
+ */
45
+ PropertyName;
46
+ /**
47
+ * Valore da usare per il filtro.
48
+ */
49
+ PropertyObject;
50
+ /**
51
+ * Definisce il tipo di filtro da applicare (valori ammessi in base all'enumeratore InputType)
52
+ */
53
+ InputType;
54
+ /**
55
+ * Definisce il tipo di operatore logico da utilizzare per la where part
56
+ */
57
+ WherePartType;
58
+ /**
59
+ * Se il filtro è di tipo CVL o CVLEnum allora in questa proprietà ci va definita la configurazione della cvl.
60
+ * La cvl verrà renderizzata con una eqp-select
61
+ */
62
+ CvlConfig;
63
+ /**
64
+ * Permette di definire il template esterno da renderizzare come filtro.
65
+ */
66
+ Externaltemplate;
67
+ /**
68
+ * Permette di disabilitare la cancellazione del filtro all'utente.
69
+ * Di default assume il valore FALSE (se true allora nel riepilogo dei filtri applicati non sarà mostrato il pulsante X)
70
+ */
71
+ PreventRemoval = false;
72
+ /**
73
+ * Permette di definire una funzione custom esterna da richiamare per il filtro corrente quando vengono premuti i pulsanti APPLICA FILTRI
74
+ * o RESET
75
+ */
76
+ CustomWherePartFunction;
77
+ /**
78
+ * Permette di definire la funzione custom per restituire il valore del filtro applicato, da mostrare nell'header della card
79
+ *
80
+ */
81
+ CustomAppliedFilterInfoFunction;
82
+ /**
83
+ * Per i filtri di tipo ContainsElement e NotContainsElement che si basano sull'applicazione di una where part con l'operatore
84
+ * Linq ANY allora questa proprietà permette di definire il nome della proprietà degli oggetti figli su cui applicare la where part.
85
+ * In questo caso dentro PropertyName ci andrà il nome della proprietà contenente la lista di child.
86
+ *
87
+ * (Es: PropertyName = 'Users' e ChildElementPropertyName = 'Role' per filtrare i record che contengono una lista di utenti con uno specifico)
88
+ */
89
+ ChildElementPropertyName;
90
+ static CreateStandardFilterConfig(filterID, label, propertyName, type, wherePartType, filterClass, filterCvlConfig, externaltemplate, customWherePartFunction, childElementPropertyName, filterValue, preventRemoval) {
91
+ let filter = new FilterConfig(filterID, filterClass, label, propertyName, null, type, wherePartType, filterCvlConfig, preventRemoval);
92
+ if (externaltemplate)
93
+ filter.Externaltemplate = externaltemplate;
94
+ if (customWherePartFunction)
95
+ filter.CustomWherePartFunction = customWherePartFunction;
96
+ if (childElementPropertyName)
97
+ filter.ChildElementPropertyName = childElementPropertyName;
98
+ if (filterValue)
99
+ filter.PropertyObject = filterValue;
100
+ return filter;
101
+ }
102
+ /**
103
+ * Se la CVL si basa su un enumeratore allora in questa proprietà va definito il type dell'enumeratore da usare.
104
+ * In questo modo la sorgente dati della CVL sarà l'insieme dei valori definiti per l'enumeratore
105
+ */
106
+ EnumData;
107
+ /**
108
+ * Se la CVL si basa su un array allora in questa proprietà va definito l'array da mostrare come sorgente dati della CVL
109
+ */
110
+ ArrayData;
111
+ /**
112
+ * Nel caso di ArrayData definito permette di indicare la proprietà degli oggetti dell'array da bindare al filtro
113
+ */
114
+ ArrayKeyProperty;
115
+ /**
116
+ * Nel caso di ArrayData definito permette di indicare la proprietà degli oggetti da visualizzare nel filtro
117
+ */
118
+ ArrayValueProperty;
119
+ /**
120
+ * Se TRUE allora mostra il campo di ricerca all'interno della CVL (default: TRUE)
121
+ */
122
+ IsEnumSearchable = false;
123
+ /**
124
+ * Se TRUE allora mostra il pulsante per pulire la selezione della CVL (default: TRUE)
125
+ */
126
+ ShowEnumCancelButton = true;
127
+ /**
128
+ * Permette di definire l'etichetta per il campo di ricerca della CVL (default: 'Cerca')
129
+ */
130
+ EnumSearchText = "Cerca";
131
+ /**
132
+ * Permette di definire la multi selezione dei valori della CVL (default: false)
133
+ */
134
+ IsEnumMultiSelect = false;
135
+ /**
136
+ * Se TRUE allora mostra il campo di ricerca all'interno della lookup (default: TRUE)
137
+ */
138
+ IsLookupSearchable = false;
139
+ /**
140
+ * Se TRUE allora mostra il pulsante per pulire la selezione della lookup (default: TRUE)
141
+ */
142
+ ShowLookupCancelButton = true;
143
+ /**
144
+ * Permette di definire l'etichetta per il campo di ricerca della Lookup (default: 'Cerca')
145
+ */
146
+ LookupSearchText = "Cerca";
147
+ /**
148
+ * Permette di definire la multi selezione dei valori della lookup (default: false)
149
+ */
150
+ IsLookupMultiple = false;
151
+ /**
152
+ * Permette di definire se nella lookup il binding deve considerare tutto l'oggetto
153
+ * (default: true)
154
+ */
155
+ BindLookupFullObject = true;
156
+ /**
157
+ * Permette di definire l'entità della lookup
158
+ */
159
+ LookupEntityType = null;
160
+ /**
161
+ * Permette di definire l'url per effettuare la chiamata che popola la lookup
162
+ */
163
+ LookupFullUrlHttpCall = null;
164
+ /**
165
+ * Permette di definire (in maniera opzionale) gli eventuali predicati standard da applicare nel recuperare gli item per la lookup
166
+ */
167
+ DataFilter = null;
168
+ /**
169
+ * Permette di definire un oggetto contenente la funzione di validazione e la label del suggerimento per validare il campo del filtro
170
+ */
171
+ ValidationProperties;
172
+ }
173
+ /**
174
+ * Classe che permette di configurare una eqp-select (CVL) per uno specifico filtro
175
+ */
176
+ export class FilterCvlConfig {
177
+ /**
178
+ * Se la CVL si basa su un enumeratore allora in questa proprietà va definito il type dell'enumeratore da usare.
179
+ * In questo modo la sorgente dati della CVL sarà l'insieme dei valori definiti per l'enumeratore
180
+ */
181
+ EnumData;
182
+ /**
183
+ * Se la CVL si basa su un array allora in questa proprietà va definito l'array da mostrare come sorgente dati della CVL
184
+ */
185
+ ArrayData;
186
+ /**
187
+ * Nel caso di ArrayData definito permette di indicare la proprietà degli oggetti dell'array da bindare al filtro
188
+ */
189
+ ArrayKeyProperty;
190
+ /**
191
+ * Nel caso di ArrayData definito permette di indicare la proprietà degli oggetti da visualizzare nel filtro
192
+ */
193
+ ArrayValueProperty;
194
+ /**
195
+ * Se TRUE allora mostra il campo di ricerca all'interno della CVL (default: TRUE)
196
+ */
197
+ IsSearchable = false;
198
+ /**
199
+ * Se TRUE allora mostra il pulsante per pulire la selezione della CVL (default: TRUE)
200
+ */
201
+ ShowCancelButton = true;
202
+ /**
203
+ * Permette di definire l'etichetta per il campo di ricerca (default: 'Cerca')
204
+ */
205
+ SearchText = "Cerca";
206
+ /**
207
+ * Permette di definire la multi selezione dei valori della CVL (default: false)
208
+ */
209
+ IsMultiSelect = false;
210
+ /**
211
+ * Permette di definire se nella CVL il binding deve considera tutto l'oggetto o solo la proprietà
212
+ * definita dentro ArrayKeyProperty
213
+ * (default: true)
214
+ */
215
+ BindFullObject = true;
216
+ /**
217
+ * Dati gli opportuni parametri restituisce un oggetto FilterCvlConfig pronto all'uso.
218
+ * @param enumData Type dell'enumeratore da usare nella cvl (opzionale)
219
+ * @param arrayData Array da usare nella cvl (opzionale)
220
+ * @param arrayKeyProperty Nome della proprietà da usare come binding (opzionale)
221
+ * @param arrayValueProperty Nome della proprietà da mostrare nella CVL (opzionale)
222
+ * @param isMultiSelect Attiva o disattiva la multiselezione (opzionale)
223
+ * @param isSearchable Attiva o disattiva la ricerca nella CVL (opzionale)
224
+ * @param showCancelButton Attiva o disattiva il pulsante per pulire la selezione nella CVL (opzionale)
225
+ * @param searchText Definisce l'etichetta del campo di ricerca (opzionale)
226
+ * @returns Valida i parametri e restituisce un oggetto di tipo FilterCvlConfig
227
+ */
228
+ static CreateFilterCVLConfig(enumData, arrayData, arrayKeyProperty, arrayValueProperty, isMultiSelect, isSearchable, showCancelButton, searchText, bindFullObject) {
229
+ let cvlConfig = new FilterCvlConfig();
230
+ if ((enumData == null || enumData == undefined) && (arrayData == null || arrayData == undefined)) {
231
+ throw new Error("It's mandatory to define one of the enumData or enumArray properties");
232
+ }
233
+ cvlConfig.ArrayData = arrayData;
234
+ cvlConfig.EnumData = enumData;
235
+ cvlConfig.ArrayKeyProperty = arrayKeyProperty;
236
+ cvlConfig.ArrayValueProperty = arrayValueProperty;
237
+ if (isMultiSelect != null)
238
+ cvlConfig.IsMultiSelect = isMultiSelect;
239
+ if (isSearchable != null)
240
+ cvlConfig.IsSearchable = isSearchable;
241
+ if (showCancelButton != null)
242
+ cvlConfig.ShowCancelButton = showCancelButton;
243
+ if (searchText)
244
+ cvlConfig.SearchText = searchText;
245
+ if (bindFullObject != null)
246
+ cvlConfig.BindFullObject = bindFullObject;
247
+ return cvlConfig;
248
+ }
249
+ }
250
+ /**
251
+ * Classe utilizzata per memorizzare le informazioni sui filtri salvati nel local storage.
252
+ * Utilizzata solo se per la direttiva eqp-filters è stato richiesto il salvataggio dei filtri
253
+ */
254
+ export class SavedFilterItem {
255
+ FilterName;
256
+ PreventRemoval;
257
+ }
258
+ export var InputType;
259
+ (function (InputType) {
260
+ InputType[InputType["Text"] = 1] = "Text";
261
+ InputType[InputType["Number"] = 2] = "Number";
262
+ InputType[InputType["Date"] = 3] = "Date";
263
+ InputType[InputType["Datetime"] = 4] = "Datetime";
264
+ InputType[InputType["CvlEnum"] = 5] = "CvlEnum";
265
+ InputType[InputType["Cvl"] = 6] = "Cvl";
266
+ InputType[InputType["Boolean"] = 7] = "Boolean";
267
+ InputType[InputType["BooleanCvl"] = 8] = "BooleanCvl";
268
+ InputType[InputType["CustomTemplate"] = 9] = "CustomTemplate";
269
+ InputType[InputType["DateRange"] = 10] = "DateRange";
270
+ InputType[InputType["Lookup"] = 11] = "Lookup";
271
+ })(InputType || (InputType = {}));
272
+ export var WherePartType;
273
+ (function (WherePartType) {
274
+ WherePartType[WherePartType["Equal"] = 1] = "Equal";
275
+ WherePartType[WherePartType["NotEqual"] = 2] = "NotEqual";
276
+ WherePartType[WherePartType["StringContains"] = 3] = "StringContains";
277
+ WherePartType[WherePartType["StringNotContains"] = 4] = "StringNotContains";
278
+ WherePartType[WherePartType["GreaterThan"] = 5] = "GreaterThan";
279
+ WherePartType[WherePartType["GreaterThanOrEqual"] = 6] = "GreaterThanOrEqual";
280
+ WherePartType[WherePartType["LessThan"] = 7] = "LessThan";
281
+ WherePartType[WherePartType["LessThanOrEqual"] = 8] = "LessThanOrEqual";
282
+ WherePartType[WherePartType["ContainsElement"] = 9] = "ContainsElement";
283
+ WherePartType[WherePartType["NotContainsElement"] = 10] = "NotContainsElement";
284
+ })(WherePartType || (WherePartType = {}));
285
+ export var FilterSizeClass;
286
+ (function (FilterSizeClass) {
287
+ FilterSizeClass[FilterSizeClass["SMALL"] = 1] = "SMALL";
288
+ FilterSizeClass[FilterSizeClass["MEDIUM"] = 2] = "MEDIUM";
289
+ FilterSizeClass[FilterSizeClass["LARGE"] = 3] = "LARGE";
290
+ FilterSizeClass[FilterSizeClass["CUSTOM"] = 4] = "CUSTOM";
291
+ })(FilterSizeClass || (FilterSizeClass = {}));
292
+ /**
293
+ * Enumeratore usato come input del componente eqp-filter.
294
+ * Permette di indicare la complessità dell'oggetto da restituire quando viene premuto
295
+ * il pulsante Applica FIltri.
296
+ * La documentazione delle due tipologie è stata riportata nel metodo createFilterValue del componente
297
+ * eqp-filters.component.ts
298
+ */
299
+ export var FilterResultType;
300
+ (function (FilterResultType) {
301
+ FilterResultType[FilterResultType["BASIC"] = 1] = "BASIC";
302
+ FilterResultType[FilterResultType["ADVANCED"] = 2] = "ADVANCED";
303
+ })(FilterResultType || (FilterResultType = {}));
304
+ /**
305
+ * Utilizzato per battezzare il comportamento e l'aspetto grafico della direttiva eqp-filters.
306
+ * WITH_CARD: viene renderizzata una card espandibile e i filtri sono visualizzati nel mat-card-content. Quando si applicano i filtri nel card-header vengono riepilogati i filtri applicati
307
+ * WITH_BUTTON: viene renderizzato un pulsante (con lo stesso stile del card-header precedente). Alla pressione del pulsante si apre una modale contenente tutti i filtri. Quando si applicano o resettano i filtri la modale si chiude e nel pulsante vengono riepilogati i filtri applicati
308
+ */
309
+ export var FilterMode;
310
+ (function (FilterMode) {
311
+ FilterMode[FilterMode["WITH_CARD"] = 1] = "WITH_CARD";
312
+ FilterMode[FilterMode["WITH_BUTTON"] = 2] = "WITH_BUTTON";
313
+ })(FilterMode || (FilterMode = {}));
314
+ export class ValidationObject {
315
+ Valid;
316
+ HintLabel;
317
+ }
318
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyQ29uZmlnLm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXFwLWF0dGFjaG1lbnRzL3NyYy9saWIvZGlyZWN0aXZlcy9lcXAtY29tbW9uL21vZGVscy9maWx0ZXJDb25maWcubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0E7O0dBRUc7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQUN2QixZQUFZLFFBQWlCLEVBQzNCLFdBQTZCLEVBQzdCLEtBQWMsRUFDZCxZQUFxQixFQUNyQixhQUFtQixFQUNuQixTQUFxQixFQUNyQixhQUE2QixFQUM3QixTQUEyQixFQUMzQixjQUF3QjtRQUV4QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLFdBQVc7WUFBRSxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUVoRCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztRQUNqQyxJQUFJLENBQUMsY0FBYyxHQUFHLGFBQWEsQ0FBQztRQUNwQyxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUNuQyxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztRQUNyQyxJQUFJLENBQUMsUUFBUSxHQUFHLFNBQVMsRUFBRSxRQUFRLENBQUM7UUFDcEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLEVBQUUsU0FBUyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxTQUFTLEVBQUUsZ0JBQWdCLENBQUM7UUFDcEQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFNBQVMsRUFBRSxrQkFBa0IsQ0FBQztRQUN4RCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsU0FBUyxFQUFFLFlBQVksQ0FBQztRQUNoRCxJQUFJLENB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QVUsQ0FBQTtJQUNWLHVEQUFTLENBQUE7SUFDVCx5REFBVSxDQUFBO0FBQ1osQ0FBQyxFQUxXLGVBQWUsS0FBZixlQUFlLFFBSzFCO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFOLElBQVksZ0JBR1g7QUFIRCxXQUFZLGdCQUFnQjtJQUMxQix5REFBUyxDQUFBO0lBQ1QsK0RBQVksQ0FBQTtBQUNkLENBQUMsRUFIVyxnQkFBZ0IsS0FBaEIsZ0JBQWdCLFFBRzNCO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBTixJQUFZLFVBR1g7QUFIRCxXQUFZLFVBQVU7SUFDcEIscURBQWEsQ0FBQTtJQUNiLHlEQUFlLENBQUE7QUFDakIsQ0FBQyxFQUhXLFVBQVUsS0FBVixVQUFVLFFBR3JCO0FBRUQsTUFBTSxPQUFPLGdCQUFnQjtJQUNwQixLQUFLLENBQVk7SUFDakIsU0FBUyxDQUFVO0NBQzNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGVtcGxhdGVSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBMaW5xUHJlZGljYXRlRFRPIH0gZnJvbSAnLi9saW5xRmlsdGVyUmVzdWx0Lm1vZGVsJztcclxuXHJcbi8qKlxyXG4gKiBDbGFzc2UgdXRpbGl6emF0YSBwZXIgbGEgY29uZmlndXJhemlvbmUgZGkgZmlsdHJpIGN1c3RvbVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEZpbHRlckNvbmZpZyB7XHJcbiAgY29uc3RydWN0b3IoZmlsdGVySUQ/OiBzdHJpbmcsXHJcbiAgICBmaWx0ZXJDbGFzcz86IEZpbHRlclNpemVDbGFzcyxcclxuICAgIGxhYmVsPzogc3RyaW5nLFxyXG4gICAgcHJvcGVydHlOYW1lPzogc3RyaW5nLFxyXG4gICAgcHJvcGVydHlWYWx1ZT86IGFueSxcclxuICAgIGlucHV0VHlwZT86IElucHV0VHlwZSxcclxuICAgIHdoZXJlUGFydFR5cGU/OiBXaGVyZVBhcnRUeXBlLFxyXG4gICAgY3ZsQ29uZmlnPzogRmlsdGVyQ3ZsQ29uZmlnLFxyXG4gICAgcHJldmVudFJlbW92YWw/OiBib29sZWFuKSB7XHJcblxyXG4gICAgdGhpcy5GaWx0ZXJJRCA9IGZpbHRlcklEO1xyXG4gICAgaWYgKGZpbHRlckNsYXNzKSB0aGlzLkZpbHRlckNsYXNzID0gZmlsdGVyQ2xhc3M7XHJcblxyXG4gICAgdGhpcy5MYWJlbCA9IGxhYmVsO1xyXG4gICAgdGhpcy5Qcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7XHJcbiAgICB0aGlzLlByb3BlcnR5T2JqZWN0ID0gcHJvcGVydHlWYWx1ZTtcclxuICAgIHRoaXMuSW5wdXRUeXBlID0gaW5wdXRUeXBlO1xyXG4gICAgdGhpcy5XaGVyZVBhcnRUeXBlID0gd2hlcmVQYXJ0VHlwZTtcclxuICAgIHRoaXMuUHJldmVudFJlbW92YWwgPSBwcmV2ZW50UmVtb3ZhbDtcclxuICAgIHRoaXMuRW51bURhdGEgPSBjdmxDb25maWc/LkVudW1EYXRhO1xyXG4gICAgdGhpcy5BcnJheURhdGEgPSBjdmxDb25maWc/LkFycmF5RGF0YTtcclxuICAgIHRoaXMuQXJyYXlLZXlQcm9wZXJ0eSA9IGN2bENvbmZpZz8uQXJyYXlLZXlQcm9wZXJ0eTtcclxuICAgIHRoaXMuQXJyYXlWYWx1ZVByb3BlcnR5ID0gY3ZsQ29uZmlnPy5BcnJheVZhbHVlUHJvcGVydHk7XHJcbiAgICB0aGlzLklzRW51bVNlYXJjaGFibGUgPSBjdmxDb25maWc/LklzU2VhcmNoYWJsZTtcclxuICAgIHRoaXMuU2hvd0VudW1DYW5jZWxCdXR0b24gPSBjdmxDb25maWc/LlNob3dDYW5jZWxCdXR0b247XHJcbiAgICB0aGlzLkVudW1TZWFyY2hUZXh0ID0gY3ZsQ29uZmlnPy5TZWFyY2hUZXh0O1xyXG4gICAgdGhpcy5Jc0VudW1NdWx0aVNlbGVjdCA9IGN2bENvbmZpZz8uSXNNdWx0aVNlbGVjdDtcclxuICAgIHRoaXMuQmluZExvb2t1cEZ1bGxPYmplY3QgPSBjdmxDb25maWc/LkJpbmRGdWxsT2JqZWN0O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSWRlbnRpZmljYXRpdm8gdW5pdm9jbyBkZWwgZmlsdHJvXHJcbiAgICovXHJcbiAgcHVibGljIEZpbHRlcklEOiBzdHJpbmc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1ldHRlIGRpIGRlZmluaXJlIGxhIGNsYXNzZSBjc3MgZGEgYXBwbGljYXJlXHJcbiAgICogYWwgZmlsdHJvXHJcbiAgICovXHJcbiAgcHVibGljIEZpbHRlckNsYXNzPzogRmlsdGVyU2l6ZUNsYXNzID0gRmlsdGVyU2l6ZUNsYXNzLlNNQUxMO1xyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqL1xyXG4gIHB1YmxpYyBDdXN0b21GaWx0ZXJDbGFzc2VzPzogc3RyaW5nO1xyXG5cclxuICAvKipcclxuICAgKiBFdGljaGV0dGEgZGEgbW9zdHJhcmUgcGVyIGlsIGZpbHRyb1xyXG4gICAqL1xyXG4gIHB1YmxpYyBMYWJlbDogc3RyaW5nO1xyXG5cclxuICAvKipcclxuICAgKiBWYWxvcmUgZGVsbGEgcHJvcHJpZXTDoCBkZWxsJ29nZ2V0dG8gc3UgY3VpIGFuZHLDoCBhcHBsaWNhdG8gaWwgZmlsdHJvXHJcbiAgICovXHJcbiAgcHVibGljIFByb3BlcnR5TmFtZT86IHN0cmluZztcclxuXHJcbiAgLyoqXHJcbiAgICogVmFsb3JlIGRhIHVzYXJlIHBlciBpbCBmaWx0cm8uXHJcbiAgICovXHJcbiAgcHVibGljIFByb3BlcnR5T2JqZWN0PzogYW55O1xyXG5cclxuICAvKipcclxuICAgKiBEZWZpbmlzY2UgaWwgdGlwbyBkaSBmaWx0cm8gZGEgYXBwbGljYXJlICh2YWxvcmkgYW1tZXNzaSBpbiBiYXNlIGFsbCdlbnVtZXJhdG9yZSBJbnB1dFR5cGUpXHJcbiAgICovXHJcbiAgcHVibGljIElucHV0VHlwZTogSW5wdXRUeXBlO1xyXG5cclxuICAvKipcclxuICAgKiBEZWZpbmlzY2UgaWwgdGlwbyBkaSBvcGVyYXRvcmUgbG9naWNvIGRhIHV0aWxpenphcmUgcGVyIGxhIHdoZXJlIHBhcnRcclxuICAgKi9cclxuICBwdWJsaWMgV2hlcmVQYXJ0VHlwZT86IFdoZXJlUGFydFR5cGU7XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlIGlsIGZpbHRybyDDqCBkaSB0aXBvIENWTCBvIENWTEVudW0gYWxsb3JhIGluIHF1ZXN0YSBwcm9wcmlldMOgIGNpIHZhIGRlZmluaXRhIGxhIGNvbmZpZ3VyYXppb25lIGRlbGxhIGN2bC5cclxuICAgKiBMYSBjdmwgdmVycsOgIHJlbmRlcml6emF0YSBjb24gdW5hIGVxcC1zZWxlY3RcclxuICAgKi9cclxuICBwdWJsaWMgQ3ZsQ29uZmlnPzogRmlsdGVyQ3ZsQ29uZmlnO1xyXG5cclxuICAvKipcclxuICAgKiBQZXJtZXR0ZSBkaSBkZWZpbmlyZSBpbCB0ZW1wbGF0ZSBlc3Rlcm5vIGRhIHJlbmRlcml6emFyZSBjb21lIGZpbHRyby5cclxuICAgKi9cclxuICBwdWJsaWMgRXh0ZXJuYWx0ZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcm1ldHRlIGRpIGRpc2FiaWxpdGFyZSBsYSBjYW5jZWxsYXppb25lIGRlbCBmaWx0cm8gYWxsJ3V0ZW50ZS5cclxuICAgKiBEaSBkZWZhdWx0IGFzc3VtZSBpbCB2YWxvcmUgRkFMU0UgKHNlIHRydWUgYWxsb3JhIG5lbCByaWVwaWxvZ28gZGVpIGZpbHRyaSBhcHBsaWNhdGkgbm9uIHNhcsOgIG1vc3RyYXRvIGlsIHB1bHNhbnRlIFgpXHJcbiAgICovXHJcbiAgcHVibGljIFByZXZlbnRSZW1vdmFsPzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBQZXJtZXR0ZSBkaSBkZWZpbmlyZSB1bmEgZnVuemlvbmUgY3VzdG9tIGVzdGVybmEgZGEgcmljaGlhbWFyZSBwZXIgaWwgZmlsdHJvIGNvcnJlbnRlIHF1YW5kbyB2ZW5nb25vIHByZW11dGkgaSBwdWxzYW50aSBBUFBMSUNBIEZJTFRSSVxyXG4gICAqIG8gUkVTRVRcclxuICAgKi9cclxuICBwdWJsaWMgQ3VzdG9tV2hlcmVQYXJ0RnVuY3Rpb24/OiAoZmlsdGVyQ29uZmlnOiBGaWx0ZXJDb25maWcsIGlzUmVzZXRBbGw/OiBib29sZWFuLCBpc1JlbW92ZUZpbHRlcj86IGJvb2xlYW4pID0+IGFueTtcclxuXHJcbiAgLyoqXHJcbiAgICogUGVybWV0dGUgZGkgZGVmaW5pcmUgbGEgZnVuemlvbmUgY3VzdG9tIHBlciByZXN0aXR1aXJlIGlsIHZhbG9yZSBkZWwgZmlsdHJvIGFwcGxpY2F0bywgZGEgbW9zdHJhcmUgbmVsbCdoZWFkZXIgZGVsbGEgY2FyZFxyXG4gICAqXHJcbiAgICovXHJcbiAgcHVibGljIEN1c3RvbUFwcGxpZWRGaWx0ZXJJbmZvRnVuY3Rpb24/OiAoXHJcbiAgICBmaWx0ZXJDb25maWc6IEZpbHRlckNvbmZpZyxcclxuICAgIGlzUmVzZXRBbGw/OiBib29sZWFuLFxyXG4gICAgaXNSZW1vdmVGaWx0ZXI/OiBib29sZWFuXHJcbiAgKSA9PiBhbnk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlciBpIGZpbHRyaSBkaSB0aXBvIENvbnRhaW5zRWxlbWVudCBlIE5vdENvbnRhaW5zRWxlbWVudCBjaGUgc2kgYmFzYW5vIHN1bGwnYXBwbGljYXppb25lIGRpIHVuYSB3aGVyZSBwYXJ0IGNvbiBsJ29wZXJhdG9yZVxyXG4gICAqIExpbnEgQU5ZIGFsbG9yYSBxdWVzdGEgcHJvcHJpZXTDoCBwZXJtZXR0ZSBkaSBkZWZpbmlyZSBpbCBub21lIGRlbGxhIHByb3ByaWV0w6AgZGVnbGkgb2dnZXR0aSBmaWdsaSBzdSBjdWkgYXBwbGljYXJlIGxhIHdoZXJlIHBhcnQuXHJcbiAgICogSW4gcXVlc3RvIGNhc28gZGVudHJvIFByb3BlcnR5TmFtZSBjaSBhbmRyw6AgaWwgbm9tZSBkZWxsYSBwcm9wcmlldMOgIGNvbnRlbmVudGUgbGEgbGlzdGEgZGkgY2hpbGQuXHJcbiAgICpcclxuICAgKiAoRXM6IFByb3BlcnR5TmFtZSA9ICdVc2VycycgZSBDaGlsZEVsZW1lbnRQcm9wZXJ0eU5hbWUgPSAnUm9sZScgcGVyIGZpbHRyYXJlIGkgcmVjb3JkIGNoZSBjb250ZW5nb25vIHVuYSBsaXN0YSBkaSB1dGVudGkgY29uIHVubyBzcGVjaWZpY28pXHJcbiAgICovXHJcbiAgcHVibGljIENoaWxkRWxlbWVudFByb3BlcnR5TmFtZT86IHN0cmluZztcclxuXHJcbiAgcHVibGljIHN0YXRpYyBDcmVhdGVTdGFuZGFyZEZpbHRlckNvbmZpZyhcclxuICAgIGZpbHRlcklEOiBzdHJpbmcsXHJcbiAgICBsYWJlbDogc3RyaW5nLFxyXG4gICAgcHJvcGVydHlOYW1lOiBzdHJpbmcsXHJcbiAgICB0eXBlOiBJbnB1dFR5cGUsXHJcbiAgICB3aGVyZVBhcnRUeXBlOiBXaGVyZVBhcnRUeXBlLFxyXG4gICAgZmlsdGVyQ2xhc3M/OiBGaWx0ZXJTaXplQ2xhc3MsXHJcbiAgICBmaWx0ZXJDdmxDb25maWc/OiBGaWx0ZXJDdmxDb25maWcsXHJcbiAgICBleHRlcm5hbHRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PixcclxuICAgIGN1c3RvbVdoZXJlUGFydEZ1bmN0aW9uPzogKGZpbHRlckNvbmZpZzogRmlsdGVyQ29uZmlnLCBpc1Jlc2V0QWxsPzogYm9vbGVhbiwgaXNSZW1vdmVGaWx0ZXI/OiBib29sZWFuKSA9PiBhbnksXHJcbiAgICBjaGlsZEVsZW1lbnRQcm9wZXJ0eU5hbWU/OiBzdHJpbmcsXHJcbiAgICBmaWx0ZXJWYWx1ZT86IGFueSxcclxuICAgIHByZXZlbnRSZW1vdmFsPzogYm9vbGVhblxyXG4gICk6IEZpbHRlckNvbmZpZyB7XHJcbiAgICBsZXQgZmlsdGVyOiBGaWx0ZXJDb25maWcgPSBuZXcgRmlsdGVyQ29uZmlnKFxyXG4gICAgICBmaWx0ZXJJRCxcclxuICAgICAgZmlsdGVyQ2xhc3MsXHJcbiAgICAgIGxhYmVsLFxyXG4gICAgICBwcm9wZXJ0eU5hbWUsXHJcbiAgICAgIG51bGwsXHJcbiAgICAgIHR5cGUsXHJcbiAgICAgIHdoZXJlUGFydFR5cGUsXHJcbiAgICAgIGZpbHRlckN2bENvbmZpZyxcclxuICAgICAgcHJldmVudFJlbW92YWxcclxuICAgICk7XHJcblxyXG4gICAgaWYgKGV4dGVybmFsdGVtcGxhdGUpIGZpbHRlci5FeHRlcm5hbHRlbXBsYXRlID0gZXh0ZXJuYWx0ZW1wbGF0ZTtcclxuXHJcbiAgICBpZiAoY3VzdG9tV2hlcmVQYXJ0RnVuY3Rpb24pIGZpbHRlci5DdXN0b21XaGVyZVBhcnRGdW5jdGlvbiA9IGN1c3RvbVdoZXJlUGFydEZ1bmN0aW9uO1xyXG5cclxuICAgIGlmIChjaGlsZEVsZW1lbnRQcm9wZXJ0eU5hbWUpIGZpbHRlci5DaGlsZEVsZW1lbnRQcm9wZXJ0eU5hbWUgPSBjaGlsZEVsZW1lbnRQcm9wZXJ0eU5hbWU7XHJcblxyXG4gICAgaWYgKGZpbHRlclZhbHVlKSBmaWx0ZXIuUHJvcGVydHlPYmplY3QgPSBmaWx0ZXJWYWx1ZTtcclxuXHJcbiAgICByZXR1cm4gZmlsdGVyO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2UgbGEgQ1ZMIHNpIGJhc2Egc3UgdW4gZW51bWVyYXRvcmUgYWxsb3JhIGluIHF1ZXN0YSBwcm9wcmlldMOgIHZhIGRlZmluaXRvIGlsIHR5cGUgZGVsbCdlbnVtZXJhdG9yZSBkYSB1c2FyZS5cclxuICAgKiBJbiBxdWVzdG8gbW9kbyBsYSBzb3JnZW50ZSBkYXRpIGRlbGxhIENWTCBzYXLDoCBsJ2luc2llbWUgZGVpIHZhbG9yaSBkZWZpbml0aSBwZXIgbCdlbnVtZXJhdG9yZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBFbnVtRGF0YT86IGFueTtcclxuXHJcbiAgLyoqXHJcbiAgICogU2UgbGEgQ1ZMIHNpIGJhc2Egc3UgdW4gYXJyYXkgYWxsb3JhIGluIHF1ZXN0YSBwcm9wcmlldMOgIHZhIGRlZmluaXRvIGwnYXJyYXkgZGEgbW9zdHJhcmUgY29tZSBzb3JnZW50ZSBkYXRpIGRlbGxhIENWTFxyXG4gICAqL1xyXG4gIHB1YmxpYyBBcnJheURhdGE/OiBhbnk7XHJcblxyXG4gIC8qKlxyXG4gICAqIE5lbCBjYXNvIGRpIEFycmF5RGF0YSBkZWZpbml0byBwZXJtZXR0ZSBkaSBpbmRpY2FyZSBsYSBwcm9wcmlldMOgIGRlZ2xpIG9nZ2V0dGkgZGVsbCdhcnJheSBkYSBiaW5kYXJlIGFsIGZpbHRyb1xyXG4gICAqL1xyXG4gIHB1YmxpYyBBcnJheUtleVByb3BlcnR5PzogYW55O1xyXG5cclxuICAvKipcclxuICAgKiBOZWwgY2FzbyBkaSBBcnJheURhdGEgZGVmaW5pdG8gcGVybWV0dGUgZGkgaW5kaWNhcmUgbGEgcHJvcHJpZXTDoCBkZWdsaSBvZ2dldHRpIGRhIHZpc3VhbGl6emFyZSBuZWwgZmlsdHJvXHJcbiAgICovXHJcbiAgcHVibGljIEFycmF5VmFsdWVQcm9wZXJ0eT86IGFueTtcclxuXHJcbiAgLyoqXHJcbiAgICogU2UgVFJVRSBhbGxvcmEgbW9zdHJhIGlsIGNhbXBvIGRpIHJpY2VyY2EgYWxsJ2ludGVybm8gZGVsbGEgQ1ZMIChkZWZhdWx0OiBUUlVFKVxyXG4gICAqL1xyXG4gIHB1YmxpYyBJc0VudW1TZWFyY2hhYmxlPzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBTZSBUUlVFIGFsbG9yYSBtb3N0cmEgaWwgcHVsc2FudGUgcGVyIHB1bGlyZSBsYSBzZWxlemlvbmUgZGVsbGEgQ1ZMIChkZWZhdWx0OiBUUlVFKVxyXG4gICAqL1xyXG4gIHB1YmxpYyBTaG93RW51bUNhbmNlbEJ1dHRvbj86IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAvKipcclxuICAgKiBQZXJtZXR0ZSBkaSBkZWZpbmlyZSBsJ2V0aWNoZXR0YSBwZXIgaWwgY2FtcG8gZGkgcmljZXJjYSBkZWxsYSBDVkwgKGRlZmF1bHQ6ICdDZXJjYScpXHJcbiAgICovXHJcbiAgcHVibGljIEVudW1TZWFyY2hUZXh0Pzogc3RyaW5nID0gXCJDZXJjYVwiO1xyXG5cclxuICAvKipcclxuICAgKiBQZXJtZXR0ZSBkaSBkZWZpbmlyZSBsYSBtdWx0aSBzZWxlemlvbmUgZGVpIHZhbG9yaSBkZWxsYSBDVkwgKGRlZmF1bHQ6IGZhbHNlKVxyXG4gICAqL1xyXG4gIHB1YmxpYyBJc0VudW1NdWx0aVNlbGVjdD86IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogU2UgVFJVRSBhbGxvcmEgbW9zdHJhIGlsIGNhbXBvIGRpIHJpY2VyY2EgYWxsJ2ludGVybm8gZGVsbGEgbG9va3VwIChkZWZhdWx0OiBUUlVFKVxyXG4gICAqL1xyXG4gIHB1YmxpYyBJc0xvb2t1cFNlYXJjaGFibGU/OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlIFRSVUUgYWxsb3JhIG1vc3RyYSBpbCBwdWxzYW50ZSBwZXIgcHVsaXJlIGxhIHNlbGV6aW9uZSBkZWxsYSBsb29rdXAgKGRlZmF1bHQ6IFRSVUUpXHJcbiAgICovXHJcbiAgcHVibGljIFNob3dMb29rdXBDYW5jZWxCdXR0b24/OiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLyoqXHJcbiAgICogUGVybWV0dGUgZGkgZGVmaW5pcmUgbCdldGljaGV0dGEgcGVyIGlsIGNhbXBvIGRpIHJpY2VyY2EgZGVsbGEgTG9va3VwIChkZWZhdWx0OiAnQ2VyY2EnKVxyXG4gICAqL1xyXG4gIHB1YmxpYyBMb29rdXBTZWFyY2hUZXh0Pzogc3RyaW5nID0gXCJDZXJjYVwiO1xyXG5cclxuICAvKipcclxuICAgKiBQZXJtZXR0ZSBkaSBkZWZpbmlyZSBsYSBtdWx0aSBzZWxlemlvbmUgZGVpIHZhbG9yaSBkZWxsYSBsb29rdXAgKGRlZmF1bHQ6IGZhbHNlKVxyXG4gICAqL1xyXG4gIHB1YmxpYyBJc0xvb2t1cE11bHRpcGxlPzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBQZXJtZXR0ZSBkaSBkZWZpbmlyZSBzZSBuZWxsYSBsb29rdXAgaWwgYmluZGluZyBkZXZlIGNvbnNpZGVyYXJlIHR1dHRvIGwnb2dnZXR0b1xyXG4gICAqIChkZWZhdWx0OiB0cnVlKVxyXG4gICAqL1xyXG4gIHB1YmxpYyBCaW5kTG9va3VwRnVsbE9iamVjdD86IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAvKipcclxuICAgKiBQZXJtZXR0ZSBkaSBkZWZpbmlyZSBsJ2VudGl0w6AgZGVsbGEgbG9va3VwXHJcbiAgICovXHJcbiAgcHVibGljIExvb2t1cEVudGl0eVR5cGU/OiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICAvKipcclxuICAgKiBQZXJtZXR0ZSBkaSBkZWZpbmlyZSBsJ3VybCBwZXIgZWZmZXR0dWFyZSBsYSBjaGlhbWF0YSBjaGUgcG9wb2xhIGxhIGxvb2t1cFxyXG4gICAqL1xyXG4gIHB1YmxpYyBMb29rdXBGdWxsVXJsSHR0cENhbGw/OiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICAvKipcclxuICAgKiBQZXJtZXR0ZSBkaSBkZWZpbmlyZSAoaW4gbWFuaWVyYSBvcHppb25hbGUpIGdsaSBldmVudHVhbGkgcHJlZGljYXRpIHN0YW5kYXJkIGRhIGFwcGxpY2FyZSBuZWwgcmVjdXBlcmFyZSBnbGkgaXRlbSBwZXIgbGEgbG9va3VwXHJcbiAgICovXHJcbiAgcHVibGljIERhdGFGaWx0ZXI/OiBBcnJheTxMaW5xUHJlZGljYXRlRFRPPiB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvKipcclxuICAgKiBQZXJtZXR0ZSBkaSBkZWZpbmlyZSB1biBvZ2dldHRvIGNvbnRlbmVudGUgbGEgZnVuemlvbmUgZGkgdmFsaWRhemlvbmUgZSBsYSBsYWJlbCBkZWwgc3VnZ2VyaW1lbnRvIHBlciB2YWxpZGFyZSBpbCBjYW1wbyBkZWwgZmlsdHJvXHJcbiAgICovXHJcbiAgcHVibGljIFZhbGlkYXRpb25Qcm9wZXJ0aWVzPzogVmFsaWRhdGlvbk9iamVjdDtcclxufVxyXG5cclxuLyoqXHJcbiAqIENsYXNzZSBjaGUgcGVybWV0dGUgZGkgY29uZmlndXJhcmUgdW5hIGVxcC1zZWxlY3QgKENWTCkgcGVyIHVubyBzcGVjaWZpY28gZmlsdHJvXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgRmlsdGVyQ3ZsQ29uZmlnIHtcclxuICAvKipcclxuICAgKiBTZSBsYSBDVkwgc2kgYmFzYSBzdSB1biBlbnVtZXJhdG9yZSBhbGxvcmEgaW4gcXVlc3RhIHByb3ByaWV0w6AgdmEgZGVmaW5pdG8gaWwgdHlwZSBkZWxsJ2VudW1lcmF0b3JlIGRhIHVzYXJlLlxyXG4gICAqIEluIHF1ZXN0byBtb2RvIGxhIHNvcmdlbnRlIGRhdGkgZGVsbGEgQ1ZMIHNhcsOgIGwnaW5zaWVtZSBkZWkgdmFsb3JpIGRlZmluaXRpIHBlciBsJ2VudW1lcmF0b3JlXHJcbiAgICovXHJcbiAgcHVibGljIEVudW1EYXRhPzogYW55O1xyXG5cclxuICAvKipcclxuICAgKiBTZSBsYSBDVkwgc2kgYmFzYSBzdSB1biBhcnJheSBhbGxvcmEgaW4gcXVlc3RhIHByb3ByaWV0w6AgdmEgZGVmaW5pdG8gbCdhcnJheSBkYSBtb3N0cmFyZSBjb21lIHNvcmdlbnRlIGRhdGkgZGVsbGEgQ1ZMXHJcbiAgICovXHJcbiAgcHVibGljIEFycmF5RGF0YT86IGFueTtcclxuXHJcbiAgLyoqXHJcbiAgICogTmVsIGNhc28gZGkgQXJyYXlEYXRhIGRlZmluaXRvIHBlcm1ldHRlIGRpIGluZGljYXJlIGxhIHByb3ByaWV0w6AgZGVnbGkgb2dnZXR0aSBkZWxsJ2FycmF5IGRhIGJpbmRhcmUgYWwgZmlsdHJvXHJcbiAgICovXHJcbiAgcHVibGljIEFycmF5S2V5UHJvcGVydHk/OiBhbnk7XHJcblxyXG4gIC8qKlxyXG4gICAqIE5lbCBjYXNvIGRpIEFycmF5RGF0YSBkZWZpbml0byBwZXJtZXR0ZSBkaSBpbmRpY2FyZSBsYSBwcm9wcmlldMOgIGRlZ2xpIG9nZ2V0dGkgZGEgdmlzdWFsaXp6YXJlIG5lbCBmaWx0cm9cclxuICAgKi9cclxuICBwdWJsaWMgQXJyYXlWYWx1ZVByb3BlcnR5PzogYW55O1xyXG5cclxuICAvKipcclxuICAgKiBTZSBUUlVFIGFsbG9yYSBtb3N0cmEgaWwgY2FtcG8gZGkgcmljZXJjYSBhbGwnaW50ZXJubyBkZWxsYSBDVkwgKGRlZmF1bHQ6IFRSVUUpXHJcbiAgICovXHJcbiAgcHVibGljIElzU2VhcmNoYWJsZT86IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogU2UgVFJVRSBhbGxvcmEgbW9zdHJhIGlsIHB1bHNhbnRlIHBlciBwdWxpcmUgbGEgc2VsZXppb25lIGRlbGxhIENWTCAoZGVmYXVsdDogVFJVRSlcclxuICAgKi9cclxuICBwdWJsaWMgU2hvd0NhbmNlbEJ1dHRvbj86IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAvKipcclxuICAgKiBQZXJtZXR0ZSBkaSBkZWZpbmlyZSBsJ2V0aWNoZXR0YSBwZXIgaWwgY2FtcG8gZGkgcmljZXJjYSAoZGVmYXVsdDogJ0NlcmNhJylcclxuICAgKi9cclxuICBwdWJsaWMgU2VhcmNoVGV4dD86IHN0cmluZyA9IFwiQ2VyY2FcIjtcclxuXHJcbiAgLyoqXHJcbiAgICogUGVybWV0dGUgZGkgZGVmaW5pcmUgbGEgbXVsdGkgc2VsZXppb25lIGRlaSB2YWxvcmkgZGVsbGEgQ1ZMIChkZWZhdWx0OiBmYWxzZSlcclxuICAgKi9cclxuICBwdWJsaWMgSXNNdWx0aVNlbGVjdD86IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogUGVybWV0dGUgZGkgZGVmaW5pcmUgc2UgbmVsbGEgQ1ZMIGlsIGJpbmRpbmcgZGV2ZSBjb25zaWRlcmEgdHV0dG8gbCdvZ2dldHRvIG8gc29sbyBsYSBwcm9wcmlldMOgXHJcbiAgICogZGVmaW5pdGEgZGVudHJvIEFycmF5S2V5UHJvcGVydHlcclxuICAgKiAoZGVmYXVsdDogdHJ1ZSlcclxuICAgKi9cclxuICBwdWJsaWMgQmluZEZ1bGxPYmplY3Q/OiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLyoqXHJcbiAgICogRGF0aSBnbGkgb3Bwb3J0dW5pIHBhcmFtZXRyaSByZXN0aXR1aXNjZSB1biBvZ2dldHRvIEZpbHRlckN2bENvbmZpZyBwcm9udG8gYWxsJ3Vzby5cclxuICAgKiBAcGFyYW0gZW51bURhdGEgVHlwZSBkZWxsJ2VudW1lcmF0b3JlIGRhIHVzYXJlIG5lbGxhIGN2bCAob3B6aW9uYWxlKVxyXG4gICAqIEBwYXJhbSBhcnJheURhdGEgQXJyYXkgZGEgdXNhcmUgbmVsbGEgY3ZsIChvcHppb25hbGUpXHJcbiAgICogQHBhcmFtIGFycmF5S2V5UHJvcGVydHkgTm9tZSBkZWxsYSBwcm9wcmlldMOgIGRhIHVzYXJlIGNvbWUgYmluZGluZyAob3B6aW9uYWxlKVxyXG4gICAqIEBwYXJhbSBhcnJheVZhbHVlUHJvcGVydHkgTm9tZSBkZWxsYSBwcm9wcmlldMOgIGRhIG1vc3RyYXJlIG5lbGxhIENWTCAob3B6aW9uYWxlKVxyXG4gICAqIEBwYXJhbSBpc011bHRpU2VsZWN0IEF0dGl2YSBvIGRpc2F0dGl2YSBsYSBtdWx0aXNlbGV6aW9uZSAob3B6aW9uYWxlKVxyXG4gICAqIEBwYXJhbSBpc1NlYXJjaGFibGUgQXR0aXZhIG8gZGlzYXR0aXZhIGxhIHJpY2VyY2EgbmVsbGEgQ1ZMIChvcHppb25hbGUpXHJcbiAgICogQHBhcmFtIHNob3dDYW5jZWxCdXR0b24gQXR0aXZhIG8gZGlzYXR0aXZhIGlsIHB1bHNhbnRlIHBlciBwdWxpcmUgbGEgc2VsZXppb25lIG5lbGxhIENWTCAob3B6aW9uYWxlKVxyXG4gICAqIEBwYXJhbSBzZWFyY2hUZXh0IERlZmluaXNjZSBsJ2V0aWNoZXR0YSBkZWwgY2FtcG8gZGkgcmljZXJjYSAob3B6aW9uYWxlKVxyXG4gICAqIEByZXR1cm5zIFZhbGlkYSBpIHBhcmFtZXRyaSBlIHJlc3RpdHVpc2NlIHVuIG9nZ2V0dG8gZGkgdGlwbyBGaWx0ZXJDdmxDb25maWdcclxuICAgKi9cclxuICBzdGF0aWMgQ3JlYXRlRmlsdGVyQ1ZMQ29uZmlnKFxyXG4gICAgZW51bURhdGE/OiBhbnksXHJcbiAgICBhcnJheURhdGE/OiBhbnksXHJcbiAgICBhcnJheUtleVByb3BlcnR5PzogYW55LFxyXG4gICAgYXJyYXlWYWx1ZVByb3BlcnR5PzogYW55LFxyXG4gICAgaXNNdWx0aVNlbGVjdD86IGJvb2xlYW4sXHJcbiAgICBpc1NlYXJjaGFibGU/OiBib29sZWFuLFxyXG4gICAgc2hvd0NhbmNlbEJ1dHRvbj86IGJvb2xlYW4sXHJcbiAgICBzZWFyY2hUZXh0Pzogc3RyaW5nLFxyXG4gICAgYmluZEZ1bGxPYmplY3Q/OiBib29sZWFuXHJcbiAgKTogRmlsdGVyQ3ZsQ29uZmlnIHtcclxuICAgIGxldCBjdmxDb25maWc6IEZpbHRlckN2bENvbmZpZyA9IG5ldyBGaWx0ZXJDdmxDb25maWcoKTtcclxuXHJcbiAgICBpZiAoKGVudW1EYXRhID09IG51bGwgfHwgZW51bURhdGEgPT0gdW5kZWZpbmVkKSAmJiAoYXJyYXlEYXRhID09IG51bGwgfHwgYXJyYXlEYXRhID09IHVuZGVmaW5lZCkpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSXQncyBtYW5kYXRvcnkgdG8gZGVmaW5lIG9uZSBvZiB0aGUgZW51bURhdGEgb3IgZW51bUFycmF5IHByb3BlcnRpZXNcIik7XHJcbiAgICB9XHJcblxyXG4gICAgY3ZsQ29uZmlnLkFycmF5RGF0YSA9IGFycmF5RGF0YTtcclxuICAgIGN2bENvbmZpZy5FbnVtRGF0YSA9IGVudW1EYXRhO1xyXG4gICAgY3ZsQ29uZmlnLkFycmF5S2V5UHJvcGVydHkgPSBhcnJheUtleVByb3BlcnR5O1xyXG4gICAgY3ZsQ29uZmlnLkFycmF5VmFsdWVQcm9wZXJ0eSA9IGFycmF5VmFsdWVQcm9wZXJ0eTtcclxuXHJcbiAgICBpZiAoaXNNdWx0aVNlbGVjdCAhPSBudWxsKSBjdmxDb25maWcuSXNNdWx0aVNlbGVjdCA9IGlzTXVsdGlTZWxlY3Q7XHJcblxyXG4gICAgaWYgKGlzU2VhcmNoYWJsZSAhPSBudWxsKSBjdmxDb25maWcuSXNTZWFyY2hhYmxlID0gaXNTZWFyY2hhYmxlO1xyXG5cclxuICAgIGlmIChzaG93Q2FuY2VsQnV0dG9uICE9IG51bGwpIGN2bENvbmZpZy5TaG93Q2FuY2VsQnV0dG9uID0gc2hvd0NhbmNlbEJ1dHRvbjtcclxuXHJcbiAgICBpZiAoc2VhcmNoVGV4dCkgY3ZsQ29uZmlnLlNlYXJjaFRleHQgPSBzZWFyY2hUZXh0O1xyXG5cclxuICAgIGlmIChiaW5kRnVsbE9iamVjdCAhPSBudWxsKSBjdmxDb25maWcuQmluZEZ1bGxPYmplY3QgPSBiaW5kRnVsbE9iamVjdDtcclxuXHJcbiAgICByZXR1cm4gY3ZsQ29uZmlnO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIENsYXNzZSB1dGlsaXp6YXRhIHBlciBtZW1vcml6emFyZSBsZSBpbmZvcm1hemlvbmkgc3VpIGZpbHRyaSBzYWx2YXRpIG5lbCBsb2NhbCBzdG9yYWdlLlxyXG4gKiBVdGlsaXp6YXRhIHNvbG8gc2UgcGVyIGxhIGRpcmV0dGl2YSBlcXAtZmlsdGVycyDDqCBzdGF0byByaWNoaWVzdG8gaWwgc2FsdmF0YWdnaW8gZGVpIGZpbHRyaVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFNhdmVkRmlsdGVySXRlbSB7XHJcbiAgcHVibGljIEZpbHRlck5hbWU6IHN0cmluZztcclxuICBwdWJsaWMgUHJldmVudFJlbW92YWw6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIElucHV0VHlwZSB7XHJcbiAgVGV4dCA9IDEsXHJcbiAgTnVtYmVyID0gMixcclxuICBEYXRlID0gMyxcclxuICBEYXRldGltZSA9IDQsXHJcbiAgQ3ZsRW51bSA9IDUsXHJcbiAgQ3ZsID0gNixcclxuICBCb29sZWFuID0gNyxcclxuICBCb29sZWFuQ3ZsID0gOCxcclxuICBDdXN0b21UZW1wbGF0ZSA9IDksXHJcbiAgRGF0ZVJhbmdlID0gMTAsXHJcbiAgTG9va3VwID0gMTFcclxufVxyXG5cclxuZXhwb3J0IGVudW0gV2hlcmVQYXJ0VHlwZSB7XHJcbiAgRXF1YWwgPSAxLFxyXG4gIE5vdEVxdWFsID0gMixcclxuICBTdHJpbmdDb250YWlucyA9IDMsXHJcbiAgU3RyaW5nTm90Q29udGFpbnMgPSA0LFxyXG4gIEdyZWF0ZXJUaGFuID0gNSxcclxuICBHcmVhdGVyVGhhbk9yRXF1YWwgPSA2LFxyXG4gIExlc3NUaGFuID0gNyxcclxuICBMZXNzVGhhbk9yRXF1YWwgPSA4LFxyXG4gIENvbnRhaW5zRWxlbWVudCA9IDksXHJcbiAgTm90Q29udGFpbnNFbGVtZW50ID0gMTBcclxufVxyXG5cclxuZXhwb3J0IGVudW0gRmlsdGVyU2l6ZUNsYXNzIHtcclxuICBTTUFMTCA9IDEsXHJcbiAgTUVESVVNID0gMixcclxuICBMQVJHRSA9IDMsXHJcbiAgQ1VTVE9NID0gNFxyXG59XHJcblxyXG4vKipcclxuICogRW51bWVyYXRvcmUgdXNhdG8gY29tZSBpbnB1dCBkZWwgY29tcG9uZW50ZSBlcXAtZmlsdGVyLlxyXG4gKiBQZXJtZXR0ZSBkaSBpbmRpY2FyZSBsYSBjb21wbGVzc2l0w6AgZGVsbCdvZ2dldHRvIGRhIHJlc3RpdHVpcmUgcXVhbmRvIHZpZW5lIHByZW11dG9cclxuICogaWwgcHVsc2FudGUgQXBwbGljYSBGSWx0cmkuXHJcbiAqIExhIGRvY3VtZW50YXppb25lIGRlbGxlIGR1ZSB0aXBvbG9naWUgw6ggc3RhdGEgcmlwb3J0YXRhIG5lbCBtZXRvZG8gY3JlYXRlRmlsdGVyVmFsdWUgZGVsIGNvbXBvbmVudGVcclxuICogZXFwLWZpbHRlcnMuY29tcG9uZW50LnRzXHJcbiAqL1xyXG5leHBvcnQgZW51bSBGaWx0ZXJSZXN1bHRUeXBlIHtcclxuICBCQVNJQyA9IDEsXHJcbiAgQURWQU5DRUQgPSAyXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBVdGlsaXp6YXRvIHBlciBiYXR0ZXp6YXJlIGlsIGNvbXBvcnRhbWVudG8gZSBsJ2FzcGV0dG8gZ3JhZmljbyBkZWxsYSBkaXJldHRpdmEgZXFwLWZpbHRlcnMuXHJcbiAqIFdJVEhfQ0FSRDogdmllbmUgcmVuZGVyaXp6YXRhIHVuYSBjYXJkIGVzcGFuZGliaWxlIGUgaSBmaWx0cmkgc29ubyB2aXN1YWxpenphdGkgbmVsIG1hdC1jYXJkLWNvbnRlbnQuIFF1YW5kbyBzaSBhcHBsaWNhbm8gaSBmaWx0cmkgbmVsIGNhcmQtaGVhZGVyIHZlbmdvbm8gcmllcGlsb2dhdGkgaSBmaWx0cmkgYXBwbGljYXRpXHJcbiAqIFdJVEhfQlVUVE9OOiB2aWVuZSByZW5kZXJpenphdG8gdW4gcHVsc2FudGUgKGNvbiBsbyBzdGVzc28gc3RpbGUgZGVsIGNhcmQtaGVhZGVyIHByZWNlZGVudGUpLiBBbGxhIHByZXNzaW9uZSBkZWwgcHVsc2FudGUgc2kgYXByZSB1bmEgbW9kYWxlIGNvbnRlbmVudGUgdHV0dGkgaSBmaWx0cmkuIFF1YW5kbyBzaSBhcHBsaWNhbm8gbyByZXNldHRhbm8gaSBmaWx0cmkgbGEgbW9kYWxlIHNpIGNoaXVkZSBlIG5lbCBwdWxzYW50ZSB2ZW5nb25vIHJpZXBpbG9nYXRpIGkgZmlsdHJpIGFwcGxpY2F0aVxyXG4gKi9cclxuZXhwb3J0IGVudW0gRmlsdGVyTW9kZSB7XHJcbiAgV0lUSF9DQVJEID0gMSxcclxuICBXSVRIX0JVVFRPTiA9IDJcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFZhbGlkYXRpb25PYmplY3Qge1xyXG4gIHB1YmxpYyBWYWxpZD86IEZ1bmN0aW9uO1xyXG4gIHB1YmxpYyBIaW50TGFiZWw/OiBzdHJpbmc7XHJcbn1cclxuXHJcbiJdfQ==